From 5e978d6e4f4c78b0735a7520e36cb307d74e7914 Mon Sep 17 00:00:00 2001 From: Henintsoa Date: Fri, 16 Apr 2021 11:34:24 +0300 Subject: [PATCH] Aren new update --- .classpath | 49 + .gitignore | 19 + .idea/.gitignore | 2 + .idea/aren.iml | 114 + .idea/compiler.xml | 16 + .idea/encodings.xml | 7 + .idea/libraries/Maven__antlr_antlr_2_7_7.xml | 13 + .../Maven__com_fasterxml_classmate_1_3_4.xml | 13 + ...ackson_core_jackson_annotations_2_11_0.xml | 13 + ...erxml_jackson_core_jackson_core_2_11_0.xml | 13 + ...l_jackson_core_jackson_databind_2_11_0.xml | 13 + ...taformat_jackson_dataformat_xml_2_11_0.xml | 13 + ...aformat_jackson_dataformat_yaml_2_11_1.xml | 13 + ...ype_jackson_datatype_hibernate5_2_11_0.xml | 13 + ..._datatype_jackson_datatype_jdk8_2_11_0.xml | 13 + ...atatype_jackson_datatype_jsr310_2_11_0.xml | 13 + ...ackson_jaxrs_jackson_jaxrs_base_2_11_1.xml | 13 + ...xrs_jackson_jaxrs_json_provider_2_11_1.xml | 13 + ...jackson_module_jaxb_annotations_2_10_1.xml | 13 + ...odule_jackson_module_jsonSchema_2_11_0.xml | 13 + ..._jackson_module_parameter_names_2_11_0.xml | 13 + ...fasterxml_woodstox_woodstox_core_6_2_0.xml | 13 + .../Maven__com_mchange_c3p0_0_9_5_3.xml | 13 + ...om_mchange_mchange_commons_java_0_2_15.xml | 13 + ...un_activation_jakarta_activation_1_2_2.xml | 13 + ...un_istack_istack_commons_runtime_3_0_7.xml | 13 + .../Maven__com_sun_mail_javax_mail_1_6_2.xml | 13 + ...sun_xml_fastinfoset_FastInfoset_1_2_15.xml | 13 + ...aven__commons_codec_commons_codec_1_11.xml | 13 + ...n__commons_logging_commons_logging_1_2.xml | 13 + .../Maven__de_svenkubiak_jBCrypt_0_4_1.xml | 13 + ...io_github_classgraph_classgraph_4_8_65.xml | 13 + .../Maven__io_jsonwebtoken_jjwt_0_9_1.xml | 13 + ...gger_core_v3_swagger_annotations_2_1_4.xml | 13 + ..._io_swagger_core_v3_swagger_core_2_1_4.xml | 13 + ...gger_core_v3_swagger_integration_2_1_4.xml | 13 + ...o_swagger_core_v3_swagger_jaxrs2_2_1_4.xml | 13 + ...o_swagger_core_v3_swagger_models_2_1_4.xml | 13 + ...ctivation_jakarta_activation_api_1_2_2.xml | 13 + ...nnotation_jakarta_annotation_api_1_3_5.xml | 13 + ...alidation_jakarta_validation_api_2_0_2.xml | 13 + ..._jakarta_ws_rs_jakarta_ws_rs_api_2_1_6.xml | 13 + ...ta_xml_bind_jakarta_xml_bind_api_2_3_3.xml | 13 + ...Maven__javax_activation_activation_1_1.xml | 13 + ..._activation_javax_activation_api_1_2_0.xml | 13 + ...aven__javax_enterprise_cdi_api_2_0_SP1.xml | 13 + .../Maven__javax_inject_javax_inject_1.xml | 13 + .../Maven__javax_javaee_web_api_8_0_1.xml | 13 + ..._persistence_javax_persistence_api_2_2.xml | 13 + ..._transaction_javax_transaction_api_1_3.xml | 13 + ..._validation_validation_api_1_1_0_Final.xml | 13 + .../Maven__javax_xml_bind_jaxb_api_2_3_1.xml | 13 + ...Maven__net_bytebuddy_byte_buddy_1_9_10.xml | 13 + ...__org_apache_commons_commons_lang3_3_7.xml | 13 + ...apache_httpcomponents_httpclient_4_5_9.xml | 13 + ..._apache_httpcomponents_httpcore_4_4_13.xml | 13 + ...n__org_codehaus_woodstox_stax2_api_4_2.xml | 13 + .../Maven__org_dom4j_dom4j_2_1_1.xml | 13 + ..._external_aopalliance_repackaged_2_6_1.xml | 13 + ...fish_hk2_external_jakarta_inject_2_6_1.xml | 13 + ...Maven__org_glassfish_hk2_hk2_api_2_6_1.xml | 13 + ...n__org_glassfish_hk2_hk2_locator_2_6_1.xml | 13 + ...ven__org_glassfish_hk2_hk2_utils_2_6_1.xml | 13 + ...ssfish_hk2_osgi_resource_locator_1_0_3.xml | 13 + ..._org_glassfish_jaxb_jaxb_runtime_2_3_1.xml | 13 + .../Maven__org_glassfish_jaxb_txw2_2_3_1.xml | 13 + ...ntainers_jersey_container_servlet_2_31.xml | 13 + ...ers_jersey_container_servlet_core_2_31.xml | 13 + ...assfish_jersey_core_jersey_client_2_31.xml | 13 + ...assfish_jersey_core_jersey_common_2_31.xml | 13 + ...assfish_jersey_core_jersey_server_2_31.xml | 13 + ...sfish_jersey_ext_cdi_jersey_cdi1x_2_31.xml | 13 + ...ersey_ext_jersey_entity_filtering_2_31.xml | 13 + ...lassfish_jersey_inject_jersey_hk2_2_31.xml | 13 + ...sh_jersey_media_jersey_media_jaxb_2_31.xml | 13 + ...y_media_jersey_media_json_jackson_2_31.xml | 13 + ...rsey_media_jersey_media_multipart_2_31.xml | 13 + ...ish_jersey_media_jersey_media_sse_2_31.xml | 13 + ...ernate_commons_annotations_5_1_0_Final.xml | 13 + ...g_hibernate_hibernate_c3p0_5_4_3_Final.xml | 13 + ...g_hibernate_hibernate_core_5_4_3_Final.xml | 13 + ...ven__org_javassist_javassist_3_22_0_GA.xml | 13 + ...iter_jboss_classfilewriter_1_2_4_Final.xml | 13 + .../Maven__org_jboss_jandex_2_0_5_Final.xml | 13 + ...boss_logging_jboss_logging_3_2_1_Final.xml | 13 + ...s_annotations_api_1_3_spec_1_0_0_Final.xml | 13 + ..._el_jboss_el_api_3_0_spec_1_0_13_Final.xml | 13 + ..._interceptors_api_1_2_spec_1_0_0_Final.xml | 13 + ...s_transaction_api_1_2_spec_1_1_1_Final.xml | 13 + ...nt_weld_environment_common_3_1_1_Final.xml | 13 + ...jboss_weld_module_weld_jsf_3_1_1_Final.xml | 13 + ...jboss_weld_module_weld_web_3_1_1_Final.xml | 13 + ...weld_probe_weld_probe_core_3_1_1_Final.xml | 13 + ..._servlet_weld_servlet_core_3_1_1_Final.xml | 13 + ...ven__org_jboss_weld_weld_api_3_1_Final.xml | 13 + ..._jboss_weld_weld_core_impl_3_1_1_Final.xml | 13 + ...ven__org_jboss_weld_weld_spi_3_1_Final.xml | 13 + .../Maven__org_jsoup_jsoup_1_13_1.xml | 13 + ...en__org_jvnet_mimepull_mimepull_1_9_13.xml | 13 + .../Maven__org_jvnet_staxex_stax_ex_1_8.xml | 13 + ...aven__org_odftoolkit_odfdom_java_0_8_7.xml | 13 + ...aven__org_postgresql_postgresql_42_2_6.xml | 13 + .../Maven__org_slf4j_slf4j_api_1_7_25.xml | 13 + .../Maven__org_yaml_snakeyaml_1_26.xml | 13 + .../Maven__xerces_xercesImpl_2_9_1.xml | 13 + .../Maven__xml_apis_xml_apis_1_0_b2.xml | 13 + .idea/misc.xml | 11 + .idea/modules.xml | 8 + .idea/uiDesigner.xml | 124 + .idea/vcs.xml | 6 + .project | 40 + .settings/org.eclipse.core.resources.prefs | 4 + .settings/org.eclipse.jdt.apt.core.prefs | 2 + .settings/org.eclipse.jdt.core.prefs | 9 + .settings/org.eclipse.m2e.core.prefs | 4 + CONTRIBUTORS.md | 32 + LICENSE | 21 + README.md | 110 + nb-configuration.xml | 26 + pom.xml | 252 + .../aren/exception/AbstractException.java | 31 + .../aren/exception/AccessDeniedException.java | 56 + .../exception/AuthenticationException.java | 49 + .../aren/exception/InsertEntityException.java | 63 + .../InvalidAuthenticationTokenException.java | 68 + .../lirmm/aren/model/AbstractDatedEntity.java | 34 + .../lirmm/aren/model/AbstractEntEntity.java | 51 + .../fr/lirmm/aren/model/AbstractEntity.java | 178 + .../lirmm/aren/model/AbstractOwnedEntity.java | 37 + .../java/fr/lirmm/aren/model/Category.java | 162 + .../java/fr/lirmm/aren/model/Comment.java | 558 + src/main/java/fr/lirmm/aren/model/Debate.java | 358 + .../java/fr/lirmm/aren/model/Document.java | 176 + .../java/fr/lirmm/aren/model/Institution.java | 164 + .../fr/lirmm/aren/model/Notification.java | 198 + src/main/java/fr/lirmm/aren/model/TagSet.java | 205 + src/main/java/fr/lirmm/aren/model/Team.java | 199 + src/main/java/fr/lirmm/aren/model/User.java | 455 + .../lirmm/aren/model/aaf/AbstractRequest.java | 77 + .../fr/lirmm/aren/model/aaf/AddRequest.java | 41 + .../fr/lirmm/aren/model/aaf/Attribute.java | 110 + .../lirmm/aren/model/aaf/AttributeList.java | 173 + .../lirmm/aren/model/aaf/DeleteRequest.java | 13 + .../lirmm/aren/model/aaf/FicAlimMENESR.java | 155 + .../fr/lirmm/aren/model/aaf/Identifier.java | 35 + .../lirmm/aren/model/aaf/ModifyRequest.java | 40 + .../fr/lirmm/aren/model/agenda/ACalendar.java | 88 + .../lirmm/aren/model/framadate/FDChoice.java | 148 + .../lirmm/aren/model/framadate/FDTheme.java | 103 + .../fr/lirmm/aren/model/framadate/FDVote.java | 73 + .../lirmm/aren/model/ws/ApiErrorDetails.java | 69 + .../lirmm/aren/model/ws/ChangePassword.java | 50 + .../java/fr/lirmm/aren/model/ws/Message.java | 88 + .../java/fr/lirmm/aren/model/ws/Scrap.java | 229 + .../lirmm/aren/model/ws/UserCredentials.java | 68 + .../fr/lirmm/aren/producer/Configurable.java | 31 + .../aren/producer/ConfigurationProducer.java | 93 + .../aren/producer/EntityManagerProducer.java | 88 + .../java/fr/lirmm/aren/producer/Scope.java | 24 + .../security/AuthenticatedUserDetails.java | 49 + .../lirmm/aren/security/PasswordEncoder.java | 39 + .../security/TokenBasedSecurityContext.java | 77 + .../token/AuthenticationTokenDetails.java | 188 + .../token/AuthenticationTokenIssuer.java | 43 + .../token/AuthenticationTokenParser.java | 137 + .../token/AuthenticationTokenService.java | 87 + .../token/AuthenticationTokenSettings.java | 95 + .../lirmm/aren/service/AAFImportService.java | 411 + .../lirmm/aren/service/AbstractService.java | 231 + .../aren/service/AuthentificationService.java | 94 + .../aren/service/BroadcasterService.java | 117 + .../service/CasAuthentificationService.java | 130 + .../lirmm/aren/service/CategoryService.java | 88 + .../fr/lirmm/aren/service/CommentService.java | 184 + .../fr/lirmm/aren/service/DebateService.java | 212 + .../lirmm/aren/service/DocumentService.java | 98 + .../aren/service/HttpRequestService.java | 236 + .../aren/service/InstitutionService.java | 62 + .../fr/lirmm/aren/service/MailingService.java | 92 + .../aren/service/NotificationService.java | 91 + .../fr/lirmm/aren/service/ODFService.java | 423 + .../fr/lirmm/aren/service/TeamService.java | 83 + .../fr/lirmm/aren/service/UserService.java | 217 + .../aren/service/agenda/ACalendarService.java | 56 + .../service/framadate/FDChoiceService.java | 60 + .../service/framadate/FDThemeService.java | 48 + .../aren/service/framadate/FDVoteService.java | 52 + .../aren/servlet/BackgroundJobManager.java | 51 + .../java/fr/lirmm/aren/servlet/CasLogin.java | 107 + src/main/java/fr/lirmm/aren/servlet/Root.java | 58 + .../java/fr/lirmm/aren/ws/ApiDefinition.java | 52 + .../java/fr/lirmm/aren/ws/JerseyConfig.java | 39 + .../lirmm/aren/ws/ObjectMapperProvider.java | 64 + .../AbstractExceptionMapper.java | 53 + .../AccessDeniedExceptionMapper.java | 33 + .../AuthenticationExceptionMapper.java | 33 + .../InsertEntityExceptionMapper.java | 33 + ...lidAuthenticationTokenExceptionMapper.java | 33 + .../NotFoundExceptionMapper.java | 34 + .../aren/ws/filter/AuthenticationFilter.java | 112 + .../aren/ws/filter/AuthorizationFilter.java | 111 + .../aren/ws/rest/ACalendarRESTFacade.java | 50 + .../fr/lirmm/aren/ws/rest/AafRESTFacade.java | 117 + .../aren/ws/rest/AbstractRESTFacade.java | 203 + .../aren/ws/rest/BroadcasterRESTFacade.java | 92 + .../aren/ws/rest/CategoryRESTFacade.java | 83 + .../lirmm/aren/ws/rest/CommentRESTFacade.java | 130 + .../lirmm/aren/ws/rest/DebateRESTFacade.java | 501 + .../aren/ws/rest/DocumentRESTFacade.java | 84 + .../aren/ws/rest/FDChoiceRESTFacade.java | 63 + .../lirmm/aren/ws/rest/FDThemeRESTFacade.java | 68 + .../lirmm/aren/ws/rest/FDVoteRESTFacade.java | 54 + .../aren/ws/rest/InstitutionRESTFacade.java | 108 + .../aren/ws/rest/NotificationRESTFacade.java | 87 + .../fr/lirmm/aren/ws/rest/TeamRESTFacade.java | 146 + .../fr/lirmm/aren/ws/rest/UserRESTFacade.java | 377 + src/main/resources/META-INF/init.sql | 2 + src/main/resources/META-INF/persistence.xml | 47 + src/main/resources/application.properties | 59 + src/main/resources/logging.properties | 11 + src/main/resources/messages.properties | 25 + src/main/webapp/META-INF/context.xml | 2 + .../WEB-INF/AafImport/ficAlimMENESR.dtd | 16 + src/main/webapp/WEB-INF/beans.xml | 6 + src/main/webapp/WEB-INF/sass/_components.scss | 520 + .../webapp/WEB-INF/sass/_materialize.scss | 41 + src/main/webapp/WEB-INF/sass/_variables.scss | 66 + src/main/webapp/WEB-INF/sass/app.scss | 1500 ++ .../WEB-INF/sass/components/_badges.scss | 55 + .../WEB-INF/sass/components/_buttons.scss | 322 + .../WEB-INF/sass/components/_cards.scss | 195 + .../WEB-INF/sass/components/_carousel.scss | 90 + .../WEB-INF/sass/components/_chips.scss | 90 + .../WEB-INF/sass/components/_collapsible.scss | 91 + .../sass/components/_color-classes.scss | 32 + .../sass/components/_color-variables.scss | 370 + .../WEB-INF/sass/components/_datepicker.scss | 191 + .../WEB-INF/sass/components/_dropdown.scss | 85 + .../WEB-INF/sass/components/_global.scss | 769 + .../webapp/WEB-INF/sass/components/_grid.scss | 156 + .../components/_icons-material-design.scss | 5 + .../WEB-INF/sass/components/_materialbox.scss | 43 + .../WEB-INF/sass/components/_modal.scss | 94 + .../WEB-INF/sass/components/_navbar.scss | 208 + .../WEB-INF/sass/components/_normalize.scss | 447 + .../WEB-INF/sass/components/_preloader.scss | 334 + .../WEB-INF/sass/components/_pulse.scss | 34 + .../WEB-INF/sass/components/_sidenav.scss | 216 + .../WEB-INF/sass/components/_slider.scss | 92 + .../sass/components/_table_of_contents.scss | 33 + .../webapp/WEB-INF/sass/components/_tabs.scss | 99 + .../WEB-INF/sass/components/_tapTarget.scss | 103 + .../WEB-INF/sass/components/_timepicker.scss | 183 + .../WEB-INF/sass/components/_toast.scss | 58 + .../WEB-INF/sass/components/_tooltip.scss | 32 + .../WEB-INF/sass/components/_transitions.scss | 13 + .../WEB-INF/sass/components/_typography.scss | 60 + .../WEB-INF/sass/components/_variables.scss | 349 + .../WEB-INF/sass/components/_waves.scss | 114 + .../sass/components/forms/_checkboxes.scss | 200 + .../sass/components/forms/_file-input.scss | 44 + .../WEB-INF/sass/components/forms/_forms.scss | 22 + .../sass/components/forms/_input-fields.scss | 354 + .../sass/components/forms/_radio-buttons.scss | 115 + .../WEB-INF/sass/components/forms/_range.scss | 161 + .../sass/components/forms/_select.scss | 180 + .../sass/components/forms/_switches.scss | 89 + src/main/webapp/WEB-INF/web.xml | 15 + src/main/webapp/assets/css/app.css | 7949 ++++++ src/main/webapp/assets/css/app.css.map | 7 + src/main/webapp/assets/css/app.min.css | 8 + src/main/webapp/assets/css/quill.snow.css | 945 + src/main/webapp/assets/css/quill.snow.min.css | 6 + .../webapp/assets/font/material-icons.woff | Bin 0 -> 81008 bytes .../assets/font/seravek-bold-webfont.woff | Bin 0 -> 24244 bytes .../assets/font/seravek-light-webfont.woff | Bin 0 -> 23724 bytes .../assets/font/seravek-medium-webfont.woff | Bin 0 -> 60280 bytes .../assets/font/seravek-regular-webfont.woff | Bin 0 -> 143608 bytes .../webapp/assets/img/Aren-icones-clic-01.svg | 177 + .../webapp/assets/img/Aren-icones-clic-02.svg | 80 + .../webapp/assets/img/Aren-icones-clic-03.svg | 38 + .../assets/img/Aren-icones-dispo-01.svg | 177 + .../assets/img/Aren-icones-dispo-02.svg | 80 + .../assets/img/Aren-icones-dispo-03.svg | 38 + src/main/webapp/assets/img/Aren-logo.svg | 620 + src/main/webapp/assets/img/Aren-logold.svg | 358 + .../img/GitHub-Mark-Light-120px-plus.png | Bin 0 -> 4044 bytes .../assets/img/GitHub-Mark-Light-32px.png | Bin 0 -> 1571 bytes .../webapp/assets/img/GitHub_Logo_White.png | Bin 0 -> 3118 bytes src/main/webapp/assets/img/LIRMM_logo.png | Bin 0 -> 7107 bytes src/main/webapp/assets/img/against.png | Bin 0 -> 1516 bytes src/main/webapp/assets/img/favicon.ico | Bin 0 -> 695 bytes src/main/webapp/assets/img/for.png | Bin 0 -> 745 bytes src/main/webapp/assets/img/imageleves.png | Bin 0 -> 135649 bytes .../assets/img/investissement_avenir.png | Bin 0 -> 29377 bytes .../webapp/assets/img/logo-cartodebat.png | Bin 0 -> 20094 bytes .../webapp/assets/img/logo-cartodebat.svg | Bin 0 -> 20094 bytes src/main/webapp/assets/img/logo-cdc.jpg | Bin 0 -> 181793 bytes .../assets/img/logo-controversciences.png | Bin 0 -> 68465 bytes .../webapp/assets/img/logo-forum-debate.png | Bin 0 -> 6995 bytes src/main/webapp/assets/img/logo-intactile.svg | 1 + src/main/webapp/assets/img/logo-lirdef.png | Bin 0 -> 11780 bytes src/main/webapp/assets/img/logo-lirmm.png | Bin 0 -> 53680 bytes src/main/webapp/assets/img/logo-mezoa.png | Bin 0 -> 9102 bytes .../assets/img/logo_acad_montpellier.png | Bin 0 -> 60375 bytes src/main/webapp/assets/img/neutral.png | Bin 0 -> 720 bytes .../js/components/grids/debatesGrid.vue | 78 + .../js/components/grids/documentsGrid.vue | 51 + .../assets/js/components/grids/teamsGrid.vue | 43 + .../assets/js/components/grids/usersGrid.vue | 70 + .../js/components/modals/categoryModal.vue | 39 + .../js/components/modals/commentModal.vue | 184 + .../js/components/modals/contributorModal.vue | 73 + .../js/components/modals/createUserModal.vue | 123 + .../js/components/modals/loginModal.vue | 58 + .../js/components/modals/passwordModal.vue | 96 + .../components/modals/resetPasswordModal.vue | 43 + .../assets/js/components/modals/tagsModal.vue | 110 + .../assets/js/components/modals/teamModal.vue | 31 + .../js/components/modals/userInTeamModal.vue | 57 + .../js/components/singletons/confirm.vue | 57 + .../components/singletons/documentation.vue | 154 + .../js/components/singletons/toaster.vue | 43 + .../js/components/singletons/tooltip.vue | 40 + .../assets/js/components/widgets/D3Pie.vue | 194 + .../js/components/widgets/D3Sunburst.vue | 240 + .../assets/js/components/widgets/D3Tree.vue | 166 + .../js/components/widgets/actionButton.vue | 22 + .../components/widgets/bulletsContainer.vue | 108 + .../assets/js/components/widgets/comment.vue | 264 + .../js/components/widgets/contributors.vue | 65 + .../js/components/widgets/debatePrint.vue | 97 + .../js/components/widgets/documented.vue | 25 + .../components/widgets/institutionSelect.vue | 44 + .../components/widgets/notificationsPanel.vue | 74 + .../js/components/widgets/searchBox.vue | 13 + .../js/components/widgets/tagsRestitution.vue | 120 + .../js/components/widgets/textInput.vue | 78 + .../components/widgets/toggleActionButton.vue | 24 + .../js/components/widgets/tooltiped.vue | 28 + .../js/components/widgets/wysiwygEditor.vue | 48 + .../webapp/assets/js/layouts/baseLayout.vue | 28 + .../webapp/assets/js/layouts/gridLayout.vue | 152 + .../webapp/assets/js/layouts/modalLayout.vue | 67 + .../webapp/assets/js/layouts/tabsLayout.vue | 58 + src/main/webapp/assets/js/router.js | 24 + src/main/webapp/assets/js/router.min.js | 2 + src/main/webapp/assets/js/service/aren.js | 937 + src/main/webapp/assets/js/service/aren.min.js | 28 + src/main/webapp/assets/js/service/i18n.js | 330 + src/main/webapp/assets/js/service/i18n.min.js | 31 + src/main/webapp/assets/js/service/worker.js | 31 + .../webapp/assets/js/service/worker.min.js | 1 + src/main/webapp/assets/js/utils.js | 259 + src/main/webapp/assets/js/utils.min.js | 13 + src/main/webapp/assets/js/vendors/axios.js | 1756 ++ src/main/webapp/assets/js/vendors/d3.js | 20013 +++++++++++++++ src/main/webapp/assets/js/vendors/d3.min.js | 478 + .../webapp/assets/js/vendors/httpVueLoader.js | 480 + .../assets/js/vendors/httpVueLoader.min.js | 12 + src/main/webapp/assets/js/vendors/licenses/D3 | 27 + .../js/vendors/licenses/HTTP_VUE_LOADER | 21 + .../webapp/assets/js/vendors/licenses/QUILL | 31 + .../webapp/assets/js/vendors/licenses/VUE | 21 + .../assets/js/vendors/licenses/VUE_I18N | 20 + .../assets/js/vendors/licenses/VUE_ROUTER | 21 + src/main/webapp/assets/js/vendors/quill.js | 13975 +++++++++++ .../webapp/assets/js/vendors/quill.min.js | 408 + .../assets/js/vendors/v-calendar.umd.js | 20578 ++++++++++++++++ src/main/webapp/assets/js/vendors/vue-i18n.js | 2272 ++ .../webapp/assets/js/vendors/vue-i18n.min.js | 60 + .../webapp/assets/js/vendors/vue-router.js | 3111 +++ .../assets/js/vendors/vue-router.min.js | 63 + src/main/webapp/assets/js/vendors/vue.js | 12276 +++++++++ src/main/webapp/assets/js/vendors/vue.min.js | 228 + src/main/webapp/assets/js/views/404.vue | 7 + src/main/webapp/assets/js/views/aaf.vue | 84 + src/main/webapp/assets/js/views/agenda.vue | 79 + src/main/webapp/assets/js/views/agendas.vue | 204 + .../webapp/assets/js/views/createDebate.vue | 283 + src/main/webapp/assets/js/views/debate.vue | 615 + src/main/webapp/assets/js/views/debates.vue | 91 + src/main/webapp/assets/js/views/document.vue | 110 + src/main/webapp/assets/js/views/documents.vue | 140 + src/main/webapp/assets/js/views/home.vue | 154 + .../webapp/assets/js/views/restitution.vue | 97 + src/main/webapp/assets/js/views/sondage.vue | 285 + src/main/webapp/assets/js/views/sondages.vue | 472 + src/main/webapp/assets/js/views/team.vue | 79 + src/main/webapp/assets/js/views/teams.vue | 208 + .../webapp/assets/js/views/updateTags.vue | 63 + src/main/webapp/assets/js/vueCfg.js | 63 + src/main/webapp/assets/js/vueCfg.min.js | 4 + src/main/webapp/index.jsp | 350 + 394 files changed, 116752 insertions(+) create mode 100644 .classpath create mode 100644 .gitignore create mode 100644 .idea/.gitignore create mode 100644 .idea/aren.iml create mode 100644 .idea/compiler.xml create mode 100644 .idea/encodings.xml create mode 100644 .idea/libraries/Maven__antlr_antlr_2_7_7.xml create mode 100644 .idea/libraries/Maven__com_fasterxml_classmate_1_3_4.xml create mode 100644 .idea/libraries/Maven__com_fasterxml_jackson_core_jackson_annotations_2_11_0.xml create mode 100644 .idea/libraries/Maven__com_fasterxml_jackson_core_jackson_core_2_11_0.xml create mode 100644 .idea/libraries/Maven__com_fasterxml_jackson_core_jackson_databind_2_11_0.xml create mode 100644 .idea/libraries/Maven__com_fasterxml_jackson_dataformat_jackson_dataformat_xml_2_11_0.xml create mode 100644 .idea/libraries/Maven__com_fasterxml_jackson_dataformat_jackson_dataformat_yaml_2_11_1.xml create mode 100644 .idea/libraries/Maven__com_fasterxml_jackson_datatype_jackson_datatype_hibernate5_2_11_0.xml create mode 100644 .idea/libraries/Maven__com_fasterxml_jackson_datatype_jackson_datatype_jdk8_2_11_0.xml create mode 100644 .idea/libraries/Maven__com_fasterxml_jackson_datatype_jackson_datatype_jsr310_2_11_0.xml create mode 100644 .idea/libraries/Maven__com_fasterxml_jackson_jaxrs_jackson_jaxrs_base_2_11_1.xml create mode 100644 .idea/libraries/Maven__com_fasterxml_jackson_jaxrs_jackson_jaxrs_json_provider_2_11_1.xml create mode 100644 .idea/libraries/Maven__com_fasterxml_jackson_module_jackson_module_jaxb_annotations_2_10_1.xml create mode 100644 .idea/libraries/Maven__com_fasterxml_jackson_module_jackson_module_jsonSchema_2_11_0.xml create mode 100644 .idea/libraries/Maven__com_fasterxml_jackson_module_jackson_module_parameter_names_2_11_0.xml create mode 100644 .idea/libraries/Maven__com_fasterxml_woodstox_woodstox_core_6_2_0.xml create mode 100644 .idea/libraries/Maven__com_mchange_c3p0_0_9_5_3.xml create mode 100644 .idea/libraries/Maven__com_mchange_mchange_commons_java_0_2_15.xml create mode 100644 .idea/libraries/Maven__com_sun_activation_jakarta_activation_1_2_2.xml create mode 100644 .idea/libraries/Maven__com_sun_istack_istack_commons_runtime_3_0_7.xml create mode 100644 .idea/libraries/Maven__com_sun_mail_javax_mail_1_6_2.xml create mode 100644 .idea/libraries/Maven__com_sun_xml_fastinfoset_FastInfoset_1_2_15.xml create mode 100644 .idea/libraries/Maven__commons_codec_commons_codec_1_11.xml create mode 100644 .idea/libraries/Maven__commons_logging_commons_logging_1_2.xml create mode 100644 .idea/libraries/Maven__de_svenkubiak_jBCrypt_0_4_1.xml create mode 100644 .idea/libraries/Maven__io_github_classgraph_classgraph_4_8_65.xml create mode 100644 .idea/libraries/Maven__io_jsonwebtoken_jjwt_0_9_1.xml create mode 100644 .idea/libraries/Maven__io_swagger_core_v3_swagger_annotations_2_1_4.xml create mode 100644 .idea/libraries/Maven__io_swagger_core_v3_swagger_core_2_1_4.xml create mode 100644 .idea/libraries/Maven__io_swagger_core_v3_swagger_integration_2_1_4.xml create mode 100644 .idea/libraries/Maven__io_swagger_core_v3_swagger_jaxrs2_2_1_4.xml create mode 100644 .idea/libraries/Maven__io_swagger_core_v3_swagger_models_2_1_4.xml create mode 100644 .idea/libraries/Maven__jakarta_activation_jakarta_activation_api_1_2_2.xml create mode 100644 .idea/libraries/Maven__jakarta_annotation_jakarta_annotation_api_1_3_5.xml create mode 100644 .idea/libraries/Maven__jakarta_validation_jakarta_validation_api_2_0_2.xml create mode 100644 .idea/libraries/Maven__jakarta_ws_rs_jakarta_ws_rs_api_2_1_6.xml create mode 100644 .idea/libraries/Maven__jakarta_xml_bind_jakarta_xml_bind_api_2_3_3.xml create mode 100644 .idea/libraries/Maven__javax_activation_activation_1_1.xml create mode 100644 .idea/libraries/Maven__javax_activation_javax_activation_api_1_2_0.xml create mode 100644 .idea/libraries/Maven__javax_enterprise_cdi_api_2_0_SP1.xml create mode 100644 .idea/libraries/Maven__javax_inject_javax_inject_1.xml create mode 100644 .idea/libraries/Maven__javax_javaee_web_api_8_0_1.xml create mode 100644 .idea/libraries/Maven__javax_persistence_javax_persistence_api_2_2.xml create mode 100644 .idea/libraries/Maven__javax_transaction_javax_transaction_api_1_3.xml create mode 100644 .idea/libraries/Maven__javax_validation_validation_api_1_1_0_Final.xml create mode 100644 .idea/libraries/Maven__javax_xml_bind_jaxb_api_2_3_1.xml create mode 100644 .idea/libraries/Maven__net_bytebuddy_byte_buddy_1_9_10.xml create mode 100644 .idea/libraries/Maven__org_apache_commons_commons_lang3_3_7.xml create mode 100644 .idea/libraries/Maven__org_apache_httpcomponents_httpclient_4_5_9.xml create mode 100644 .idea/libraries/Maven__org_apache_httpcomponents_httpcore_4_4_13.xml create mode 100644 .idea/libraries/Maven__org_codehaus_woodstox_stax2_api_4_2.xml create mode 100644 .idea/libraries/Maven__org_dom4j_dom4j_2_1_1.xml create mode 100644 .idea/libraries/Maven__org_glassfish_hk2_external_aopalliance_repackaged_2_6_1.xml create mode 100644 .idea/libraries/Maven__org_glassfish_hk2_external_jakarta_inject_2_6_1.xml create mode 100644 .idea/libraries/Maven__org_glassfish_hk2_hk2_api_2_6_1.xml create mode 100644 .idea/libraries/Maven__org_glassfish_hk2_hk2_locator_2_6_1.xml create mode 100644 .idea/libraries/Maven__org_glassfish_hk2_hk2_utils_2_6_1.xml create mode 100644 .idea/libraries/Maven__org_glassfish_hk2_osgi_resource_locator_1_0_3.xml create mode 100644 .idea/libraries/Maven__org_glassfish_jaxb_jaxb_runtime_2_3_1.xml create mode 100644 .idea/libraries/Maven__org_glassfish_jaxb_txw2_2_3_1.xml create mode 100644 .idea/libraries/Maven__org_glassfish_jersey_containers_jersey_container_servlet_2_31.xml create mode 100644 .idea/libraries/Maven__org_glassfish_jersey_containers_jersey_container_servlet_core_2_31.xml create mode 100644 .idea/libraries/Maven__org_glassfish_jersey_core_jersey_client_2_31.xml create mode 100644 .idea/libraries/Maven__org_glassfish_jersey_core_jersey_common_2_31.xml create mode 100644 .idea/libraries/Maven__org_glassfish_jersey_core_jersey_server_2_31.xml create mode 100644 .idea/libraries/Maven__org_glassfish_jersey_ext_cdi_jersey_cdi1x_2_31.xml create mode 100644 .idea/libraries/Maven__org_glassfish_jersey_ext_jersey_entity_filtering_2_31.xml create mode 100644 .idea/libraries/Maven__org_glassfish_jersey_inject_jersey_hk2_2_31.xml create mode 100644 .idea/libraries/Maven__org_glassfish_jersey_media_jersey_media_jaxb_2_31.xml create mode 100644 .idea/libraries/Maven__org_glassfish_jersey_media_jersey_media_json_jackson_2_31.xml create mode 100644 .idea/libraries/Maven__org_glassfish_jersey_media_jersey_media_multipart_2_31.xml create mode 100644 .idea/libraries/Maven__org_glassfish_jersey_media_jersey_media_sse_2_31.xml create mode 100644 .idea/libraries/Maven__org_hibernate_common_hibernate_commons_annotations_5_1_0_Final.xml create mode 100644 .idea/libraries/Maven__org_hibernate_hibernate_c3p0_5_4_3_Final.xml create mode 100644 .idea/libraries/Maven__org_hibernate_hibernate_core_5_4_3_Final.xml create mode 100644 .idea/libraries/Maven__org_javassist_javassist_3_22_0_GA.xml create mode 100644 .idea/libraries/Maven__org_jboss_classfilewriter_jboss_classfilewriter_1_2_4_Final.xml create mode 100644 .idea/libraries/Maven__org_jboss_jandex_2_0_5_Final.xml create mode 100644 .idea/libraries/Maven__org_jboss_logging_jboss_logging_3_2_1_Final.xml create mode 100644 .idea/libraries/Maven__org_jboss_spec_javax_annotation_jboss_annotations_api_1_3_spec_1_0_0_Final.xml create mode 100644 .idea/libraries/Maven__org_jboss_spec_javax_el_jboss_el_api_3_0_spec_1_0_13_Final.xml create mode 100644 .idea/libraries/Maven__org_jboss_spec_javax_interceptor_jboss_interceptors_api_1_2_spec_1_0_0_Final.xml create mode 100644 .idea/libraries/Maven__org_jboss_spec_javax_transaction_jboss_transaction_api_1_2_spec_1_1_1_Final.xml create mode 100644 .idea/libraries/Maven__org_jboss_weld_environment_weld_environment_common_3_1_1_Final.xml create mode 100644 .idea/libraries/Maven__org_jboss_weld_module_weld_jsf_3_1_1_Final.xml create mode 100644 .idea/libraries/Maven__org_jboss_weld_module_weld_web_3_1_1_Final.xml create mode 100644 .idea/libraries/Maven__org_jboss_weld_probe_weld_probe_core_3_1_1_Final.xml create mode 100644 .idea/libraries/Maven__org_jboss_weld_servlet_weld_servlet_core_3_1_1_Final.xml create mode 100644 .idea/libraries/Maven__org_jboss_weld_weld_api_3_1_Final.xml create mode 100644 .idea/libraries/Maven__org_jboss_weld_weld_core_impl_3_1_1_Final.xml create mode 100644 .idea/libraries/Maven__org_jboss_weld_weld_spi_3_1_Final.xml create mode 100644 .idea/libraries/Maven__org_jsoup_jsoup_1_13_1.xml create mode 100644 .idea/libraries/Maven__org_jvnet_mimepull_mimepull_1_9_13.xml create mode 100644 .idea/libraries/Maven__org_jvnet_staxex_stax_ex_1_8.xml create mode 100644 .idea/libraries/Maven__org_odftoolkit_odfdom_java_0_8_7.xml create mode 100644 .idea/libraries/Maven__org_postgresql_postgresql_42_2_6.xml create mode 100644 .idea/libraries/Maven__org_slf4j_slf4j_api_1_7_25.xml create mode 100644 .idea/libraries/Maven__org_yaml_snakeyaml_1_26.xml create mode 100644 .idea/libraries/Maven__xerces_xercesImpl_2_9_1.xml create mode 100644 .idea/libraries/Maven__xml_apis_xml_apis_1_0_b2.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/uiDesigner.xml create mode 100644 .idea/vcs.xml create mode 100644 .project create mode 100644 .settings/org.eclipse.core.resources.prefs create mode 100644 .settings/org.eclipse.jdt.apt.core.prefs create mode 100644 .settings/org.eclipse.jdt.core.prefs create mode 100644 .settings/org.eclipse.m2e.core.prefs create mode 100644 CONTRIBUTORS.md create mode 100644 LICENSE create mode 100644 README.md create mode 100644 nb-configuration.xml create mode 100644 pom.xml create mode 100644 src/main/java/fr/lirmm/aren/exception/AbstractException.java create mode 100644 src/main/java/fr/lirmm/aren/exception/AccessDeniedException.java create mode 100644 src/main/java/fr/lirmm/aren/exception/AuthenticationException.java create mode 100644 src/main/java/fr/lirmm/aren/exception/InsertEntityException.java create mode 100644 src/main/java/fr/lirmm/aren/exception/InvalidAuthenticationTokenException.java create mode 100644 src/main/java/fr/lirmm/aren/model/AbstractDatedEntity.java create mode 100644 src/main/java/fr/lirmm/aren/model/AbstractEntEntity.java create mode 100644 src/main/java/fr/lirmm/aren/model/AbstractEntity.java create mode 100644 src/main/java/fr/lirmm/aren/model/AbstractOwnedEntity.java create mode 100644 src/main/java/fr/lirmm/aren/model/Category.java create mode 100644 src/main/java/fr/lirmm/aren/model/Comment.java create mode 100644 src/main/java/fr/lirmm/aren/model/Debate.java create mode 100644 src/main/java/fr/lirmm/aren/model/Document.java create mode 100644 src/main/java/fr/lirmm/aren/model/Institution.java create mode 100644 src/main/java/fr/lirmm/aren/model/Notification.java create mode 100644 src/main/java/fr/lirmm/aren/model/TagSet.java create mode 100644 src/main/java/fr/lirmm/aren/model/Team.java create mode 100644 src/main/java/fr/lirmm/aren/model/User.java create mode 100644 src/main/java/fr/lirmm/aren/model/aaf/AbstractRequest.java create mode 100644 src/main/java/fr/lirmm/aren/model/aaf/AddRequest.java create mode 100644 src/main/java/fr/lirmm/aren/model/aaf/Attribute.java create mode 100644 src/main/java/fr/lirmm/aren/model/aaf/AttributeList.java create mode 100644 src/main/java/fr/lirmm/aren/model/aaf/DeleteRequest.java create mode 100644 src/main/java/fr/lirmm/aren/model/aaf/FicAlimMENESR.java create mode 100644 src/main/java/fr/lirmm/aren/model/aaf/Identifier.java create mode 100644 src/main/java/fr/lirmm/aren/model/aaf/ModifyRequest.java create mode 100644 src/main/java/fr/lirmm/aren/model/agenda/ACalendar.java create mode 100644 src/main/java/fr/lirmm/aren/model/framadate/FDChoice.java create mode 100644 src/main/java/fr/lirmm/aren/model/framadate/FDTheme.java create mode 100644 src/main/java/fr/lirmm/aren/model/framadate/FDVote.java create mode 100644 src/main/java/fr/lirmm/aren/model/ws/ApiErrorDetails.java create mode 100644 src/main/java/fr/lirmm/aren/model/ws/ChangePassword.java create mode 100644 src/main/java/fr/lirmm/aren/model/ws/Message.java create mode 100644 src/main/java/fr/lirmm/aren/model/ws/Scrap.java create mode 100644 src/main/java/fr/lirmm/aren/model/ws/UserCredentials.java create mode 100644 src/main/java/fr/lirmm/aren/producer/Configurable.java create mode 100644 src/main/java/fr/lirmm/aren/producer/ConfigurationProducer.java create mode 100644 src/main/java/fr/lirmm/aren/producer/EntityManagerProducer.java create mode 100644 src/main/java/fr/lirmm/aren/producer/Scope.java create mode 100644 src/main/java/fr/lirmm/aren/security/AuthenticatedUserDetails.java create mode 100644 src/main/java/fr/lirmm/aren/security/PasswordEncoder.java create mode 100644 src/main/java/fr/lirmm/aren/security/TokenBasedSecurityContext.java create mode 100644 src/main/java/fr/lirmm/aren/security/token/AuthenticationTokenDetails.java create mode 100644 src/main/java/fr/lirmm/aren/security/token/AuthenticationTokenIssuer.java create mode 100644 src/main/java/fr/lirmm/aren/security/token/AuthenticationTokenParser.java create mode 100644 src/main/java/fr/lirmm/aren/security/token/AuthenticationTokenService.java create mode 100644 src/main/java/fr/lirmm/aren/security/token/AuthenticationTokenSettings.java create mode 100644 src/main/java/fr/lirmm/aren/service/AAFImportService.java create mode 100644 src/main/java/fr/lirmm/aren/service/AbstractService.java create mode 100644 src/main/java/fr/lirmm/aren/service/AuthentificationService.java create mode 100644 src/main/java/fr/lirmm/aren/service/BroadcasterService.java create mode 100644 src/main/java/fr/lirmm/aren/service/CasAuthentificationService.java create mode 100644 src/main/java/fr/lirmm/aren/service/CategoryService.java create mode 100644 src/main/java/fr/lirmm/aren/service/CommentService.java create mode 100644 src/main/java/fr/lirmm/aren/service/DebateService.java create mode 100644 src/main/java/fr/lirmm/aren/service/DocumentService.java create mode 100644 src/main/java/fr/lirmm/aren/service/HttpRequestService.java create mode 100644 src/main/java/fr/lirmm/aren/service/InstitutionService.java create mode 100644 src/main/java/fr/lirmm/aren/service/MailingService.java create mode 100644 src/main/java/fr/lirmm/aren/service/NotificationService.java create mode 100644 src/main/java/fr/lirmm/aren/service/ODFService.java create mode 100644 src/main/java/fr/lirmm/aren/service/TeamService.java create mode 100644 src/main/java/fr/lirmm/aren/service/UserService.java create mode 100644 src/main/java/fr/lirmm/aren/service/agenda/ACalendarService.java create mode 100644 src/main/java/fr/lirmm/aren/service/framadate/FDChoiceService.java create mode 100644 src/main/java/fr/lirmm/aren/service/framadate/FDThemeService.java create mode 100644 src/main/java/fr/lirmm/aren/service/framadate/FDVoteService.java create mode 100644 src/main/java/fr/lirmm/aren/servlet/BackgroundJobManager.java create mode 100644 src/main/java/fr/lirmm/aren/servlet/CasLogin.java create mode 100644 src/main/java/fr/lirmm/aren/servlet/Root.java create mode 100644 src/main/java/fr/lirmm/aren/ws/ApiDefinition.java create mode 100644 src/main/java/fr/lirmm/aren/ws/JerseyConfig.java create mode 100644 src/main/java/fr/lirmm/aren/ws/ObjectMapperProvider.java create mode 100644 src/main/java/fr/lirmm/aren/ws/exceptionmapper/AbstractExceptionMapper.java create mode 100644 src/main/java/fr/lirmm/aren/ws/exceptionmapper/AccessDeniedExceptionMapper.java create mode 100644 src/main/java/fr/lirmm/aren/ws/exceptionmapper/AuthenticationExceptionMapper.java create mode 100644 src/main/java/fr/lirmm/aren/ws/exceptionmapper/InsertEntityExceptionMapper.java create mode 100644 src/main/java/fr/lirmm/aren/ws/exceptionmapper/InvalidAuthenticationTokenExceptionMapper.java create mode 100644 src/main/java/fr/lirmm/aren/ws/exceptionmapper/NotFoundExceptionMapper.java create mode 100644 src/main/java/fr/lirmm/aren/ws/filter/AuthenticationFilter.java create mode 100644 src/main/java/fr/lirmm/aren/ws/filter/AuthorizationFilter.java create mode 100644 src/main/java/fr/lirmm/aren/ws/rest/ACalendarRESTFacade.java create mode 100644 src/main/java/fr/lirmm/aren/ws/rest/AafRESTFacade.java create mode 100644 src/main/java/fr/lirmm/aren/ws/rest/AbstractRESTFacade.java create mode 100644 src/main/java/fr/lirmm/aren/ws/rest/BroadcasterRESTFacade.java create mode 100644 src/main/java/fr/lirmm/aren/ws/rest/CategoryRESTFacade.java create mode 100644 src/main/java/fr/lirmm/aren/ws/rest/CommentRESTFacade.java create mode 100644 src/main/java/fr/lirmm/aren/ws/rest/DebateRESTFacade.java create mode 100644 src/main/java/fr/lirmm/aren/ws/rest/DocumentRESTFacade.java create mode 100644 src/main/java/fr/lirmm/aren/ws/rest/FDChoiceRESTFacade.java create mode 100644 src/main/java/fr/lirmm/aren/ws/rest/FDThemeRESTFacade.java create mode 100644 src/main/java/fr/lirmm/aren/ws/rest/FDVoteRESTFacade.java create mode 100644 src/main/java/fr/lirmm/aren/ws/rest/InstitutionRESTFacade.java create mode 100644 src/main/java/fr/lirmm/aren/ws/rest/NotificationRESTFacade.java create mode 100644 src/main/java/fr/lirmm/aren/ws/rest/TeamRESTFacade.java create mode 100644 src/main/java/fr/lirmm/aren/ws/rest/UserRESTFacade.java create mode 100644 src/main/resources/META-INF/init.sql create mode 100644 src/main/resources/META-INF/persistence.xml create mode 100644 src/main/resources/application.properties create mode 100644 src/main/resources/logging.properties create mode 100644 src/main/resources/messages.properties create mode 100644 src/main/webapp/META-INF/context.xml create mode 100644 src/main/webapp/WEB-INF/AafImport/ficAlimMENESR.dtd create mode 100644 src/main/webapp/WEB-INF/beans.xml create mode 100644 src/main/webapp/WEB-INF/sass/_components.scss create mode 100644 src/main/webapp/WEB-INF/sass/_materialize.scss create mode 100644 src/main/webapp/WEB-INF/sass/_variables.scss create mode 100644 src/main/webapp/WEB-INF/sass/app.scss create mode 100644 src/main/webapp/WEB-INF/sass/components/_badges.scss create mode 100644 src/main/webapp/WEB-INF/sass/components/_buttons.scss create mode 100644 src/main/webapp/WEB-INF/sass/components/_cards.scss create mode 100644 src/main/webapp/WEB-INF/sass/components/_carousel.scss create mode 100644 src/main/webapp/WEB-INF/sass/components/_chips.scss create mode 100644 src/main/webapp/WEB-INF/sass/components/_collapsible.scss create mode 100644 src/main/webapp/WEB-INF/sass/components/_color-classes.scss create mode 100644 src/main/webapp/WEB-INF/sass/components/_color-variables.scss create mode 100644 src/main/webapp/WEB-INF/sass/components/_datepicker.scss create mode 100644 src/main/webapp/WEB-INF/sass/components/_dropdown.scss create mode 100644 src/main/webapp/WEB-INF/sass/components/_global.scss create mode 100644 src/main/webapp/WEB-INF/sass/components/_grid.scss create mode 100644 src/main/webapp/WEB-INF/sass/components/_icons-material-design.scss create mode 100644 src/main/webapp/WEB-INF/sass/components/_materialbox.scss create mode 100644 src/main/webapp/WEB-INF/sass/components/_modal.scss create mode 100644 src/main/webapp/WEB-INF/sass/components/_navbar.scss create mode 100644 src/main/webapp/WEB-INF/sass/components/_normalize.scss create mode 100644 src/main/webapp/WEB-INF/sass/components/_preloader.scss create mode 100644 src/main/webapp/WEB-INF/sass/components/_pulse.scss create mode 100644 src/main/webapp/WEB-INF/sass/components/_sidenav.scss create mode 100644 src/main/webapp/WEB-INF/sass/components/_slider.scss create mode 100644 src/main/webapp/WEB-INF/sass/components/_table_of_contents.scss create mode 100644 src/main/webapp/WEB-INF/sass/components/_tabs.scss create mode 100644 src/main/webapp/WEB-INF/sass/components/_tapTarget.scss create mode 100644 src/main/webapp/WEB-INF/sass/components/_timepicker.scss create mode 100644 src/main/webapp/WEB-INF/sass/components/_toast.scss create mode 100644 src/main/webapp/WEB-INF/sass/components/_tooltip.scss create mode 100644 src/main/webapp/WEB-INF/sass/components/_transitions.scss create mode 100644 src/main/webapp/WEB-INF/sass/components/_typography.scss create mode 100644 src/main/webapp/WEB-INF/sass/components/_variables.scss create mode 100644 src/main/webapp/WEB-INF/sass/components/_waves.scss create mode 100644 src/main/webapp/WEB-INF/sass/components/forms/_checkboxes.scss create mode 100644 src/main/webapp/WEB-INF/sass/components/forms/_file-input.scss create mode 100644 src/main/webapp/WEB-INF/sass/components/forms/_forms.scss create mode 100644 src/main/webapp/WEB-INF/sass/components/forms/_input-fields.scss create mode 100644 src/main/webapp/WEB-INF/sass/components/forms/_radio-buttons.scss create mode 100644 src/main/webapp/WEB-INF/sass/components/forms/_range.scss create mode 100644 src/main/webapp/WEB-INF/sass/components/forms/_select.scss create mode 100644 src/main/webapp/WEB-INF/sass/components/forms/_switches.scss create mode 100644 src/main/webapp/WEB-INF/web.xml create mode 100644 src/main/webapp/assets/css/app.css create mode 100644 src/main/webapp/assets/css/app.css.map create mode 100644 src/main/webapp/assets/css/app.min.css create mode 100644 src/main/webapp/assets/css/quill.snow.css create mode 100644 src/main/webapp/assets/css/quill.snow.min.css create mode 100644 src/main/webapp/assets/font/material-icons.woff create mode 100644 src/main/webapp/assets/font/seravek-bold-webfont.woff create mode 100644 src/main/webapp/assets/font/seravek-light-webfont.woff create mode 100644 src/main/webapp/assets/font/seravek-medium-webfont.woff create mode 100644 src/main/webapp/assets/font/seravek-regular-webfont.woff create mode 100644 src/main/webapp/assets/img/Aren-icones-clic-01.svg create mode 100644 src/main/webapp/assets/img/Aren-icones-clic-02.svg create mode 100644 src/main/webapp/assets/img/Aren-icones-clic-03.svg create mode 100644 src/main/webapp/assets/img/Aren-icones-dispo-01.svg create mode 100644 src/main/webapp/assets/img/Aren-icones-dispo-02.svg create mode 100644 src/main/webapp/assets/img/Aren-icones-dispo-03.svg create mode 100644 src/main/webapp/assets/img/Aren-logo.svg create mode 100644 src/main/webapp/assets/img/Aren-logold.svg create mode 100644 src/main/webapp/assets/img/GitHub-Mark-Light-120px-plus.png create mode 100644 src/main/webapp/assets/img/GitHub-Mark-Light-32px.png create mode 100644 src/main/webapp/assets/img/GitHub_Logo_White.png create mode 100644 src/main/webapp/assets/img/LIRMM_logo.png create mode 100644 src/main/webapp/assets/img/against.png create mode 100644 src/main/webapp/assets/img/favicon.ico create mode 100644 src/main/webapp/assets/img/for.png create mode 100644 src/main/webapp/assets/img/imageleves.png create mode 100644 src/main/webapp/assets/img/investissement_avenir.png create mode 100644 src/main/webapp/assets/img/logo-cartodebat.png create mode 100644 src/main/webapp/assets/img/logo-cartodebat.svg create mode 100644 src/main/webapp/assets/img/logo-cdc.jpg create mode 100644 src/main/webapp/assets/img/logo-controversciences.png create mode 100644 src/main/webapp/assets/img/logo-forum-debate.png create mode 100644 src/main/webapp/assets/img/logo-intactile.svg create mode 100644 src/main/webapp/assets/img/logo-lirdef.png create mode 100644 src/main/webapp/assets/img/logo-lirmm.png create mode 100644 src/main/webapp/assets/img/logo-mezoa.png create mode 100644 src/main/webapp/assets/img/logo_acad_montpellier.png create mode 100644 src/main/webapp/assets/img/neutral.png create mode 100644 src/main/webapp/assets/js/components/grids/debatesGrid.vue create mode 100644 src/main/webapp/assets/js/components/grids/documentsGrid.vue create mode 100644 src/main/webapp/assets/js/components/grids/teamsGrid.vue create mode 100644 src/main/webapp/assets/js/components/grids/usersGrid.vue create mode 100644 src/main/webapp/assets/js/components/modals/categoryModal.vue create mode 100644 src/main/webapp/assets/js/components/modals/commentModal.vue create mode 100644 src/main/webapp/assets/js/components/modals/contributorModal.vue create mode 100644 src/main/webapp/assets/js/components/modals/createUserModal.vue create mode 100644 src/main/webapp/assets/js/components/modals/loginModal.vue create mode 100644 src/main/webapp/assets/js/components/modals/passwordModal.vue create mode 100644 src/main/webapp/assets/js/components/modals/resetPasswordModal.vue create mode 100644 src/main/webapp/assets/js/components/modals/tagsModal.vue create mode 100644 src/main/webapp/assets/js/components/modals/teamModal.vue create mode 100644 src/main/webapp/assets/js/components/modals/userInTeamModal.vue create mode 100644 src/main/webapp/assets/js/components/singletons/confirm.vue create mode 100644 src/main/webapp/assets/js/components/singletons/documentation.vue create mode 100644 src/main/webapp/assets/js/components/singletons/toaster.vue create mode 100644 src/main/webapp/assets/js/components/singletons/tooltip.vue create mode 100644 src/main/webapp/assets/js/components/widgets/D3Pie.vue create mode 100644 src/main/webapp/assets/js/components/widgets/D3Sunburst.vue create mode 100644 src/main/webapp/assets/js/components/widgets/D3Tree.vue create mode 100644 src/main/webapp/assets/js/components/widgets/actionButton.vue create mode 100644 src/main/webapp/assets/js/components/widgets/bulletsContainer.vue create mode 100644 src/main/webapp/assets/js/components/widgets/comment.vue create mode 100644 src/main/webapp/assets/js/components/widgets/contributors.vue create mode 100644 src/main/webapp/assets/js/components/widgets/debatePrint.vue create mode 100644 src/main/webapp/assets/js/components/widgets/documented.vue create mode 100644 src/main/webapp/assets/js/components/widgets/institutionSelect.vue create mode 100644 src/main/webapp/assets/js/components/widgets/notificationsPanel.vue create mode 100644 src/main/webapp/assets/js/components/widgets/searchBox.vue create mode 100644 src/main/webapp/assets/js/components/widgets/tagsRestitution.vue create mode 100644 src/main/webapp/assets/js/components/widgets/textInput.vue create mode 100644 src/main/webapp/assets/js/components/widgets/toggleActionButton.vue create mode 100644 src/main/webapp/assets/js/components/widgets/tooltiped.vue create mode 100644 src/main/webapp/assets/js/components/widgets/wysiwygEditor.vue create mode 100644 src/main/webapp/assets/js/layouts/baseLayout.vue create mode 100644 src/main/webapp/assets/js/layouts/gridLayout.vue create mode 100644 src/main/webapp/assets/js/layouts/modalLayout.vue create mode 100644 src/main/webapp/assets/js/layouts/tabsLayout.vue create mode 100644 src/main/webapp/assets/js/router.js create mode 100644 src/main/webapp/assets/js/router.min.js create mode 100644 src/main/webapp/assets/js/service/aren.js create mode 100644 src/main/webapp/assets/js/service/aren.min.js create mode 100644 src/main/webapp/assets/js/service/i18n.js create mode 100644 src/main/webapp/assets/js/service/i18n.min.js create mode 100644 src/main/webapp/assets/js/service/worker.js create mode 100644 src/main/webapp/assets/js/service/worker.min.js create mode 100644 src/main/webapp/assets/js/utils.js create mode 100644 src/main/webapp/assets/js/utils.min.js create mode 100644 src/main/webapp/assets/js/vendors/axios.js create mode 100644 src/main/webapp/assets/js/vendors/d3.js create mode 100644 src/main/webapp/assets/js/vendors/d3.min.js create mode 100644 src/main/webapp/assets/js/vendors/httpVueLoader.js create mode 100644 src/main/webapp/assets/js/vendors/httpVueLoader.min.js create mode 100644 src/main/webapp/assets/js/vendors/licenses/D3 create mode 100644 src/main/webapp/assets/js/vendors/licenses/HTTP_VUE_LOADER create mode 100644 src/main/webapp/assets/js/vendors/licenses/QUILL create mode 100644 src/main/webapp/assets/js/vendors/licenses/VUE create mode 100644 src/main/webapp/assets/js/vendors/licenses/VUE_I18N create mode 100644 src/main/webapp/assets/js/vendors/licenses/VUE_ROUTER create mode 100644 src/main/webapp/assets/js/vendors/quill.js create mode 100644 src/main/webapp/assets/js/vendors/quill.min.js create mode 100644 src/main/webapp/assets/js/vendors/v-calendar.umd.js create mode 100644 src/main/webapp/assets/js/vendors/vue-i18n.js create mode 100644 src/main/webapp/assets/js/vendors/vue-i18n.min.js create mode 100644 src/main/webapp/assets/js/vendors/vue-router.js create mode 100644 src/main/webapp/assets/js/vendors/vue-router.min.js create mode 100644 src/main/webapp/assets/js/vendors/vue.js create mode 100644 src/main/webapp/assets/js/vendors/vue.min.js create mode 100644 src/main/webapp/assets/js/views/404.vue create mode 100644 src/main/webapp/assets/js/views/aaf.vue create mode 100644 src/main/webapp/assets/js/views/agenda.vue create mode 100644 src/main/webapp/assets/js/views/agendas.vue create mode 100644 src/main/webapp/assets/js/views/createDebate.vue create mode 100644 src/main/webapp/assets/js/views/debate.vue create mode 100644 src/main/webapp/assets/js/views/debates.vue create mode 100644 src/main/webapp/assets/js/views/document.vue create mode 100644 src/main/webapp/assets/js/views/documents.vue create mode 100644 src/main/webapp/assets/js/views/home.vue create mode 100644 src/main/webapp/assets/js/views/restitution.vue create mode 100644 src/main/webapp/assets/js/views/sondage.vue create mode 100644 src/main/webapp/assets/js/views/sondages.vue create mode 100644 src/main/webapp/assets/js/views/team.vue create mode 100644 src/main/webapp/assets/js/views/teams.vue create mode 100644 src/main/webapp/assets/js/views/updateTags.vue create mode 100644 src/main/webapp/assets/js/vueCfg.js create mode 100644 src/main/webapp/assets/js/vueCfg.min.js create mode 100644 src/main/webapp/index.jsp diff --git a/.classpath b/.classpath new file mode 100644 index 0000000..0371133 --- /dev/null +++ b/.classpath @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4af02b5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,19 @@ +target/ +pom.xml.tag +pom.xml.releaseBackup +pom.xml.versionsBackup +pom.xml.next +release.properties +dependency-reduced-pom.xml +buildNumber.properties +.mvn/timing.properties +# https://github.com/takari/maven-wrapper#usage-without-binary-jar +.mvn/wrapper/maven-wrapper.jar + +.vscode/ + +# Configuration files +#src/main/resources/application.properties +#src/main/resources/META-INF/persistence.xml + +launch.json \ No newline at end of file diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..5c98b42 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,2 @@ +# Default ignored files +/workspace.xml \ No newline at end of file diff --git a/.idea/aren.iml b/.idea/aren.iml new file mode 100644 index 0000000..033870c --- /dev/null +++ b/.idea/aren.iml @@ -0,0 +1,114 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..154b848 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..aa00ffa --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__antlr_antlr_2_7_7.xml b/.idea/libraries/Maven__antlr_antlr_2_7_7.xml new file mode 100644 index 0000000..b8d93d8 --- /dev/null +++ b/.idea/libraries/Maven__antlr_antlr_2_7_7.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_fasterxml_classmate_1_3_4.xml b/.idea/libraries/Maven__com_fasterxml_classmate_1_3_4.xml new file mode 100644 index 0000000..33c30b4 --- /dev/null +++ b/.idea/libraries/Maven__com_fasterxml_classmate_1_3_4.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_annotations_2_11_0.xml b/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_annotations_2_11_0.xml new file mode 100644 index 0000000..32a9faa --- /dev/null +++ b/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_annotations_2_11_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_core_2_11_0.xml b/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_core_2_11_0.xml new file mode 100644 index 0000000..8c0738d --- /dev/null +++ b/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_core_2_11_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_databind_2_11_0.xml b/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_databind_2_11_0.xml new file mode 100644 index 0000000..0c83f99 --- /dev/null +++ b/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_databind_2_11_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_fasterxml_jackson_dataformat_jackson_dataformat_xml_2_11_0.xml b/.idea/libraries/Maven__com_fasterxml_jackson_dataformat_jackson_dataformat_xml_2_11_0.xml new file mode 100644 index 0000000..042804f --- /dev/null +++ b/.idea/libraries/Maven__com_fasterxml_jackson_dataformat_jackson_dataformat_xml_2_11_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_fasterxml_jackson_dataformat_jackson_dataformat_yaml_2_11_1.xml b/.idea/libraries/Maven__com_fasterxml_jackson_dataformat_jackson_dataformat_yaml_2_11_1.xml new file mode 100644 index 0000000..27241b7 --- /dev/null +++ b/.idea/libraries/Maven__com_fasterxml_jackson_dataformat_jackson_dataformat_yaml_2_11_1.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_fasterxml_jackson_datatype_jackson_datatype_hibernate5_2_11_0.xml b/.idea/libraries/Maven__com_fasterxml_jackson_datatype_jackson_datatype_hibernate5_2_11_0.xml new file mode 100644 index 0000000..d38ea19 --- /dev/null +++ b/.idea/libraries/Maven__com_fasterxml_jackson_datatype_jackson_datatype_hibernate5_2_11_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_fasterxml_jackson_datatype_jackson_datatype_jdk8_2_11_0.xml b/.idea/libraries/Maven__com_fasterxml_jackson_datatype_jackson_datatype_jdk8_2_11_0.xml new file mode 100644 index 0000000..6026270 --- /dev/null +++ b/.idea/libraries/Maven__com_fasterxml_jackson_datatype_jackson_datatype_jdk8_2_11_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_fasterxml_jackson_datatype_jackson_datatype_jsr310_2_11_0.xml b/.idea/libraries/Maven__com_fasterxml_jackson_datatype_jackson_datatype_jsr310_2_11_0.xml new file mode 100644 index 0000000..fa76777 --- /dev/null +++ b/.idea/libraries/Maven__com_fasterxml_jackson_datatype_jackson_datatype_jsr310_2_11_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_fasterxml_jackson_jaxrs_jackson_jaxrs_base_2_11_1.xml b/.idea/libraries/Maven__com_fasterxml_jackson_jaxrs_jackson_jaxrs_base_2_11_1.xml new file mode 100644 index 0000000..8c3c8f1 --- /dev/null +++ b/.idea/libraries/Maven__com_fasterxml_jackson_jaxrs_jackson_jaxrs_base_2_11_1.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_fasterxml_jackson_jaxrs_jackson_jaxrs_json_provider_2_11_1.xml b/.idea/libraries/Maven__com_fasterxml_jackson_jaxrs_jackson_jaxrs_json_provider_2_11_1.xml new file mode 100644 index 0000000..b7e2d99 --- /dev/null +++ b/.idea/libraries/Maven__com_fasterxml_jackson_jaxrs_jackson_jaxrs_json_provider_2_11_1.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_fasterxml_jackson_module_jackson_module_jaxb_annotations_2_10_1.xml b/.idea/libraries/Maven__com_fasterxml_jackson_module_jackson_module_jaxb_annotations_2_10_1.xml new file mode 100644 index 0000000..606e3b3 --- /dev/null +++ b/.idea/libraries/Maven__com_fasterxml_jackson_module_jackson_module_jaxb_annotations_2_10_1.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_fasterxml_jackson_module_jackson_module_jsonSchema_2_11_0.xml b/.idea/libraries/Maven__com_fasterxml_jackson_module_jackson_module_jsonSchema_2_11_0.xml new file mode 100644 index 0000000..36e3b62 --- /dev/null +++ b/.idea/libraries/Maven__com_fasterxml_jackson_module_jackson_module_jsonSchema_2_11_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_fasterxml_jackson_module_jackson_module_parameter_names_2_11_0.xml b/.idea/libraries/Maven__com_fasterxml_jackson_module_jackson_module_parameter_names_2_11_0.xml new file mode 100644 index 0000000..825f8a0 --- /dev/null +++ b/.idea/libraries/Maven__com_fasterxml_jackson_module_jackson_module_parameter_names_2_11_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_fasterxml_woodstox_woodstox_core_6_2_0.xml b/.idea/libraries/Maven__com_fasterxml_woodstox_woodstox_core_6_2_0.xml new file mode 100644 index 0000000..8b06024 --- /dev/null +++ b/.idea/libraries/Maven__com_fasterxml_woodstox_woodstox_core_6_2_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_mchange_c3p0_0_9_5_3.xml b/.idea/libraries/Maven__com_mchange_c3p0_0_9_5_3.xml new file mode 100644 index 0000000..ba45a9e --- /dev/null +++ b/.idea/libraries/Maven__com_mchange_c3p0_0_9_5_3.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_mchange_mchange_commons_java_0_2_15.xml b/.idea/libraries/Maven__com_mchange_mchange_commons_java_0_2_15.xml new file mode 100644 index 0000000..925ebab --- /dev/null +++ b/.idea/libraries/Maven__com_mchange_mchange_commons_java_0_2_15.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_sun_activation_jakarta_activation_1_2_2.xml b/.idea/libraries/Maven__com_sun_activation_jakarta_activation_1_2_2.xml new file mode 100644 index 0000000..fea99f0 --- /dev/null +++ b/.idea/libraries/Maven__com_sun_activation_jakarta_activation_1_2_2.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_sun_istack_istack_commons_runtime_3_0_7.xml b/.idea/libraries/Maven__com_sun_istack_istack_commons_runtime_3_0_7.xml new file mode 100644 index 0000000..4d7e82e --- /dev/null +++ b/.idea/libraries/Maven__com_sun_istack_istack_commons_runtime_3_0_7.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_sun_mail_javax_mail_1_6_2.xml b/.idea/libraries/Maven__com_sun_mail_javax_mail_1_6_2.xml new file mode 100644 index 0000000..f5980e4 --- /dev/null +++ b/.idea/libraries/Maven__com_sun_mail_javax_mail_1_6_2.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_sun_xml_fastinfoset_FastInfoset_1_2_15.xml b/.idea/libraries/Maven__com_sun_xml_fastinfoset_FastInfoset_1_2_15.xml new file mode 100644 index 0000000..de27a39 --- /dev/null +++ b/.idea/libraries/Maven__com_sun_xml_fastinfoset_FastInfoset_1_2_15.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__commons_codec_commons_codec_1_11.xml b/.idea/libraries/Maven__commons_codec_commons_codec_1_11.xml new file mode 100644 index 0000000..4c8ff54 --- /dev/null +++ b/.idea/libraries/Maven__commons_codec_commons_codec_1_11.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__commons_logging_commons_logging_1_2.xml b/.idea/libraries/Maven__commons_logging_commons_logging_1_2.xml new file mode 100644 index 0000000..eab40b3 --- /dev/null +++ b/.idea/libraries/Maven__commons_logging_commons_logging_1_2.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__de_svenkubiak_jBCrypt_0_4_1.xml b/.idea/libraries/Maven__de_svenkubiak_jBCrypt_0_4_1.xml new file mode 100644 index 0000000..c2fe437 --- /dev/null +++ b/.idea/libraries/Maven__de_svenkubiak_jBCrypt_0_4_1.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__io_github_classgraph_classgraph_4_8_65.xml b/.idea/libraries/Maven__io_github_classgraph_classgraph_4_8_65.xml new file mode 100644 index 0000000..556146d --- /dev/null +++ b/.idea/libraries/Maven__io_github_classgraph_classgraph_4_8_65.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__io_jsonwebtoken_jjwt_0_9_1.xml b/.idea/libraries/Maven__io_jsonwebtoken_jjwt_0_9_1.xml new file mode 100644 index 0000000..f25b99b --- /dev/null +++ b/.idea/libraries/Maven__io_jsonwebtoken_jjwt_0_9_1.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__io_swagger_core_v3_swagger_annotations_2_1_4.xml b/.idea/libraries/Maven__io_swagger_core_v3_swagger_annotations_2_1_4.xml new file mode 100644 index 0000000..4cb0546 --- /dev/null +++ b/.idea/libraries/Maven__io_swagger_core_v3_swagger_annotations_2_1_4.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__io_swagger_core_v3_swagger_core_2_1_4.xml b/.idea/libraries/Maven__io_swagger_core_v3_swagger_core_2_1_4.xml new file mode 100644 index 0000000..01bfb1a --- /dev/null +++ b/.idea/libraries/Maven__io_swagger_core_v3_swagger_core_2_1_4.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__io_swagger_core_v3_swagger_integration_2_1_4.xml b/.idea/libraries/Maven__io_swagger_core_v3_swagger_integration_2_1_4.xml new file mode 100644 index 0000000..5b98f47 --- /dev/null +++ b/.idea/libraries/Maven__io_swagger_core_v3_swagger_integration_2_1_4.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__io_swagger_core_v3_swagger_jaxrs2_2_1_4.xml b/.idea/libraries/Maven__io_swagger_core_v3_swagger_jaxrs2_2_1_4.xml new file mode 100644 index 0000000..f7eee93 --- /dev/null +++ b/.idea/libraries/Maven__io_swagger_core_v3_swagger_jaxrs2_2_1_4.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__io_swagger_core_v3_swagger_models_2_1_4.xml b/.idea/libraries/Maven__io_swagger_core_v3_swagger_models_2_1_4.xml new file mode 100644 index 0000000..d29e088 --- /dev/null +++ b/.idea/libraries/Maven__io_swagger_core_v3_swagger_models_2_1_4.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__jakarta_activation_jakarta_activation_api_1_2_2.xml b/.idea/libraries/Maven__jakarta_activation_jakarta_activation_api_1_2_2.xml new file mode 100644 index 0000000..be90656 --- /dev/null +++ b/.idea/libraries/Maven__jakarta_activation_jakarta_activation_api_1_2_2.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__jakarta_annotation_jakarta_annotation_api_1_3_5.xml b/.idea/libraries/Maven__jakarta_annotation_jakarta_annotation_api_1_3_5.xml new file mode 100644 index 0000000..cba9dd2 --- /dev/null +++ b/.idea/libraries/Maven__jakarta_annotation_jakarta_annotation_api_1_3_5.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__jakarta_validation_jakarta_validation_api_2_0_2.xml b/.idea/libraries/Maven__jakarta_validation_jakarta_validation_api_2_0_2.xml new file mode 100644 index 0000000..e66afb9 --- /dev/null +++ b/.idea/libraries/Maven__jakarta_validation_jakarta_validation_api_2_0_2.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__jakarta_ws_rs_jakarta_ws_rs_api_2_1_6.xml b/.idea/libraries/Maven__jakarta_ws_rs_jakarta_ws_rs_api_2_1_6.xml new file mode 100644 index 0000000..fb37acc --- /dev/null +++ b/.idea/libraries/Maven__jakarta_ws_rs_jakarta_ws_rs_api_2_1_6.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__jakarta_xml_bind_jakarta_xml_bind_api_2_3_3.xml b/.idea/libraries/Maven__jakarta_xml_bind_jakarta_xml_bind_api_2_3_3.xml new file mode 100644 index 0000000..04213f7 --- /dev/null +++ b/.idea/libraries/Maven__jakarta_xml_bind_jakarta_xml_bind_api_2_3_3.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__javax_activation_activation_1_1.xml b/.idea/libraries/Maven__javax_activation_activation_1_1.xml new file mode 100644 index 0000000..180d587 --- /dev/null +++ b/.idea/libraries/Maven__javax_activation_activation_1_1.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__javax_activation_javax_activation_api_1_2_0.xml b/.idea/libraries/Maven__javax_activation_javax_activation_api_1_2_0.xml new file mode 100644 index 0000000..ff49512 --- /dev/null +++ b/.idea/libraries/Maven__javax_activation_javax_activation_api_1_2_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__javax_enterprise_cdi_api_2_0_SP1.xml b/.idea/libraries/Maven__javax_enterprise_cdi_api_2_0_SP1.xml new file mode 100644 index 0000000..2323d04 --- /dev/null +++ b/.idea/libraries/Maven__javax_enterprise_cdi_api_2_0_SP1.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__javax_inject_javax_inject_1.xml b/.idea/libraries/Maven__javax_inject_javax_inject_1.xml new file mode 100644 index 0000000..93cf65a --- /dev/null +++ b/.idea/libraries/Maven__javax_inject_javax_inject_1.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__javax_javaee_web_api_8_0_1.xml b/.idea/libraries/Maven__javax_javaee_web_api_8_0_1.xml new file mode 100644 index 0000000..8182bf4 --- /dev/null +++ b/.idea/libraries/Maven__javax_javaee_web_api_8_0_1.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__javax_persistence_javax_persistence_api_2_2.xml b/.idea/libraries/Maven__javax_persistence_javax_persistence_api_2_2.xml new file mode 100644 index 0000000..b7d39c6 --- /dev/null +++ b/.idea/libraries/Maven__javax_persistence_javax_persistence_api_2_2.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__javax_transaction_javax_transaction_api_1_3.xml b/.idea/libraries/Maven__javax_transaction_javax_transaction_api_1_3.xml new file mode 100644 index 0000000..8f5f3c6 --- /dev/null +++ b/.idea/libraries/Maven__javax_transaction_javax_transaction_api_1_3.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__javax_validation_validation_api_1_1_0_Final.xml b/.idea/libraries/Maven__javax_validation_validation_api_1_1_0_Final.xml new file mode 100644 index 0000000..940ce73 --- /dev/null +++ b/.idea/libraries/Maven__javax_validation_validation_api_1_1_0_Final.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__javax_xml_bind_jaxb_api_2_3_1.xml b/.idea/libraries/Maven__javax_xml_bind_jaxb_api_2_3_1.xml new file mode 100644 index 0000000..059f88f --- /dev/null +++ b/.idea/libraries/Maven__javax_xml_bind_jaxb_api_2_3_1.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__net_bytebuddy_byte_buddy_1_9_10.xml b/.idea/libraries/Maven__net_bytebuddy_byte_buddy_1_9_10.xml new file mode 100644 index 0000000..9bddfcc --- /dev/null +++ b/.idea/libraries/Maven__net_bytebuddy_byte_buddy_1_9_10.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_apache_commons_commons_lang3_3_7.xml b/.idea/libraries/Maven__org_apache_commons_commons_lang3_3_7.xml new file mode 100644 index 0000000..28edf49 --- /dev/null +++ b/.idea/libraries/Maven__org_apache_commons_commons_lang3_3_7.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_apache_httpcomponents_httpclient_4_5_9.xml b/.idea/libraries/Maven__org_apache_httpcomponents_httpclient_4_5_9.xml new file mode 100644 index 0000000..c76dc2d --- /dev/null +++ b/.idea/libraries/Maven__org_apache_httpcomponents_httpclient_4_5_9.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_apache_httpcomponents_httpcore_4_4_13.xml b/.idea/libraries/Maven__org_apache_httpcomponents_httpcore_4_4_13.xml new file mode 100644 index 0000000..b475675 --- /dev/null +++ b/.idea/libraries/Maven__org_apache_httpcomponents_httpcore_4_4_13.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_codehaus_woodstox_stax2_api_4_2.xml b/.idea/libraries/Maven__org_codehaus_woodstox_stax2_api_4_2.xml new file mode 100644 index 0000000..30ed863 --- /dev/null +++ b/.idea/libraries/Maven__org_codehaus_woodstox_stax2_api_4_2.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_dom4j_dom4j_2_1_1.xml b/.idea/libraries/Maven__org_dom4j_dom4j_2_1_1.xml new file mode 100644 index 0000000..6c8b371 --- /dev/null +++ b/.idea/libraries/Maven__org_dom4j_dom4j_2_1_1.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_glassfish_hk2_external_aopalliance_repackaged_2_6_1.xml b/.idea/libraries/Maven__org_glassfish_hk2_external_aopalliance_repackaged_2_6_1.xml new file mode 100644 index 0000000..aa22cc1 --- /dev/null +++ b/.idea/libraries/Maven__org_glassfish_hk2_external_aopalliance_repackaged_2_6_1.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_glassfish_hk2_external_jakarta_inject_2_6_1.xml b/.idea/libraries/Maven__org_glassfish_hk2_external_jakarta_inject_2_6_1.xml new file mode 100644 index 0000000..98fbebf --- /dev/null +++ b/.idea/libraries/Maven__org_glassfish_hk2_external_jakarta_inject_2_6_1.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_glassfish_hk2_hk2_api_2_6_1.xml b/.idea/libraries/Maven__org_glassfish_hk2_hk2_api_2_6_1.xml new file mode 100644 index 0000000..963f506 --- /dev/null +++ b/.idea/libraries/Maven__org_glassfish_hk2_hk2_api_2_6_1.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_glassfish_hk2_hk2_locator_2_6_1.xml b/.idea/libraries/Maven__org_glassfish_hk2_hk2_locator_2_6_1.xml new file mode 100644 index 0000000..951e584 --- /dev/null +++ b/.idea/libraries/Maven__org_glassfish_hk2_hk2_locator_2_6_1.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_glassfish_hk2_hk2_utils_2_6_1.xml b/.idea/libraries/Maven__org_glassfish_hk2_hk2_utils_2_6_1.xml new file mode 100644 index 0000000..57730c4 --- /dev/null +++ b/.idea/libraries/Maven__org_glassfish_hk2_hk2_utils_2_6_1.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_glassfish_hk2_osgi_resource_locator_1_0_3.xml b/.idea/libraries/Maven__org_glassfish_hk2_osgi_resource_locator_1_0_3.xml new file mode 100644 index 0000000..18fdf9c --- /dev/null +++ b/.idea/libraries/Maven__org_glassfish_hk2_osgi_resource_locator_1_0_3.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_glassfish_jaxb_jaxb_runtime_2_3_1.xml b/.idea/libraries/Maven__org_glassfish_jaxb_jaxb_runtime_2_3_1.xml new file mode 100644 index 0000000..0c7a80a --- /dev/null +++ b/.idea/libraries/Maven__org_glassfish_jaxb_jaxb_runtime_2_3_1.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_glassfish_jaxb_txw2_2_3_1.xml b/.idea/libraries/Maven__org_glassfish_jaxb_txw2_2_3_1.xml new file mode 100644 index 0000000..638d937 --- /dev/null +++ b/.idea/libraries/Maven__org_glassfish_jaxb_txw2_2_3_1.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_glassfish_jersey_containers_jersey_container_servlet_2_31.xml b/.idea/libraries/Maven__org_glassfish_jersey_containers_jersey_container_servlet_2_31.xml new file mode 100644 index 0000000..a2053ba --- /dev/null +++ b/.idea/libraries/Maven__org_glassfish_jersey_containers_jersey_container_servlet_2_31.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_glassfish_jersey_containers_jersey_container_servlet_core_2_31.xml b/.idea/libraries/Maven__org_glassfish_jersey_containers_jersey_container_servlet_core_2_31.xml new file mode 100644 index 0000000..0ad7e14 --- /dev/null +++ b/.idea/libraries/Maven__org_glassfish_jersey_containers_jersey_container_servlet_core_2_31.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_glassfish_jersey_core_jersey_client_2_31.xml b/.idea/libraries/Maven__org_glassfish_jersey_core_jersey_client_2_31.xml new file mode 100644 index 0000000..f17f3df --- /dev/null +++ b/.idea/libraries/Maven__org_glassfish_jersey_core_jersey_client_2_31.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_glassfish_jersey_core_jersey_common_2_31.xml b/.idea/libraries/Maven__org_glassfish_jersey_core_jersey_common_2_31.xml new file mode 100644 index 0000000..f2eb409 --- /dev/null +++ b/.idea/libraries/Maven__org_glassfish_jersey_core_jersey_common_2_31.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_glassfish_jersey_core_jersey_server_2_31.xml b/.idea/libraries/Maven__org_glassfish_jersey_core_jersey_server_2_31.xml new file mode 100644 index 0000000..50d19a5 --- /dev/null +++ b/.idea/libraries/Maven__org_glassfish_jersey_core_jersey_server_2_31.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_glassfish_jersey_ext_cdi_jersey_cdi1x_2_31.xml b/.idea/libraries/Maven__org_glassfish_jersey_ext_cdi_jersey_cdi1x_2_31.xml new file mode 100644 index 0000000..7a9a7bf --- /dev/null +++ b/.idea/libraries/Maven__org_glassfish_jersey_ext_cdi_jersey_cdi1x_2_31.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_glassfish_jersey_ext_jersey_entity_filtering_2_31.xml b/.idea/libraries/Maven__org_glassfish_jersey_ext_jersey_entity_filtering_2_31.xml new file mode 100644 index 0000000..f654024 --- /dev/null +++ b/.idea/libraries/Maven__org_glassfish_jersey_ext_jersey_entity_filtering_2_31.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_glassfish_jersey_inject_jersey_hk2_2_31.xml b/.idea/libraries/Maven__org_glassfish_jersey_inject_jersey_hk2_2_31.xml new file mode 100644 index 0000000..20720ab --- /dev/null +++ b/.idea/libraries/Maven__org_glassfish_jersey_inject_jersey_hk2_2_31.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_glassfish_jersey_media_jersey_media_jaxb_2_31.xml b/.idea/libraries/Maven__org_glassfish_jersey_media_jersey_media_jaxb_2_31.xml new file mode 100644 index 0000000..a558635 --- /dev/null +++ b/.idea/libraries/Maven__org_glassfish_jersey_media_jersey_media_jaxb_2_31.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_glassfish_jersey_media_jersey_media_json_jackson_2_31.xml b/.idea/libraries/Maven__org_glassfish_jersey_media_jersey_media_json_jackson_2_31.xml new file mode 100644 index 0000000..eb34756 --- /dev/null +++ b/.idea/libraries/Maven__org_glassfish_jersey_media_jersey_media_json_jackson_2_31.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_glassfish_jersey_media_jersey_media_multipart_2_31.xml b/.idea/libraries/Maven__org_glassfish_jersey_media_jersey_media_multipart_2_31.xml new file mode 100644 index 0000000..21d00ec --- /dev/null +++ b/.idea/libraries/Maven__org_glassfish_jersey_media_jersey_media_multipart_2_31.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_glassfish_jersey_media_jersey_media_sse_2_31.xml b/.idea/libraries/Maven__org_glassfish_jersey_media_jersey_media_sse_2_31.xml new file mode 100644 index 0000000..acde912 --- /dev/null +++ b/.idea/libraries/Maven__org_glassfish_jersey_media_jersey_media_sse_2_31.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_hibernate_common_hibernate_commons_annotations_5_1_0_Final.xml b/.idea/libraries/Maven__org_hibernate_common_hibernate_commons_annotations_5_1_0_Final.xml new file mode 100644 index 0000000..1fd775b --- /dev/null +++ b/.idea/libraries/Maven__org_hibernate_common_hibernate_commons_annotations_5_1_0_Final.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_hibernate_hibernate_c3p0_5_4_3_Final.xml b/.idea/libraries/Maven__org_hibernate_hibernate_c3p0_5_4_3_Final.xml new file mode 100644 index 0000000..e97891f --- /dev/null +++ b/.idea/libraries/Maven__org_hibernate_hibernate_c3p0_5_4_3_Final.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_hibernate_hibernate_core_5_4_3_Final.xml b/.idea/libraries/Maven__org_hibernate_hibernate_core_5_4_3_Final.xml new file mode 100644 index 0000000..c4e3e46 --- /dev/null +++ b/.idea/libraries/Maven__org_hibernate_hibernate_core_5_4_3_Final.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_javassist_javassist_3_22_0_GA.xml b/.idea/libraries/Maven__org_javassist_javassist_3_22_0_GA.xml new file mode 100644 index 0000000..ad65915 --- /dev/null +++ b/.idea/libraries/Maven__org_javassist_javassist_3_22_0_GA.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_jboss_classfilewriter_jboss_classfilewriter_1_2_4_Final.xml b/.idea/libraries/Maven__org_jboss_classfilewriter_jboss_classfilewriter_1_2_4_Final.xml new file mode 100644 index 0000000..2074062 --- /dev/null +++ b/.idea/libraries/Maven__org_jboss_classfilewriter_jboss_classfilewriter_1_2_4_Final.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_jboss_jandex_2_0_5_Final.xml b/.idea/libraries/Maven__org_jboss_jandex_2_0_5_Final.xml new file mode 100644 index 0000000..34e9ada --- /dev/null +++ b/.idea/libraries/Maven__org_jboss_jandex_2_0_5_Final.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_jboss_logging_jboss_logging_3_2_1_Final.xml b/.idea/libraries/Maven__org_jboss_logging_jboss_logging_3_2_1_Final.xml new file mode 100644 index 0000000..ce63724 --- /dev/null +++ b/.idea/libraries/Maven__org_jboss_logging_jboss_logging_3_2_1_Final.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_jboss_spec_javax_annotation_jboss_annotations_api_1_3_spec_1_0_0_Final.xml b/.idea/libraries/Maven__org_jboss_spec_javax_annotation_jboss_annotations_api_1_3_spec_1_0_0_Final.xml new file mode 100644 index 0000000..17df4e7 --- /dev/null +++ b/.idea/libraries/Maven__org_jboss_spec_javax_annotation_jboss_annotations_api_1_3_spec_1_0_0_Final.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_jboss_spec_javax_el_jboss_el_api_3_0_spec_1_0_13_Final.xml b/.idea/libraries/Maven__org_jboss_spec_javax_el_jboss_el_api_3_0_spec_1_0_13_Final.xml new file mode 100644 index 0000000..8f7baba --- /dev/null +++ b/.idea/libraries/Maven__org_jboss_spec_javax_el_jboss_el_api_3_0_spec_1_0_13_Final.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_jboss_spec_javax_interceptor_jboss_interceptors_api_1_2_spec_1_0_0_Final.xml b/.idea/libraries/Maven__org_jboss_spec_javax_interceptor_jboss_interceptors_api_1_2_spec_1_0_0_Final.xml new file mode 100644 index 0000000..bbc5d7d --- /dev/null +++ b/.idea/libraries/Maven__org_jboss_spec_javax_interceptor_jboss_interceptors_api_1_2_spec_1_0_0_Final.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_jboss_spec_javax_transaction_jboss_transaction_api_1_2_spec_1_1_1_Final.xml b/.idea/libraries/Maven__org_jboss_spec_javax_transaction_jboss_transaction_api_1_2_spec_1_1_1_Final.xml new file mode 100644 index 0000000..ec03510 --- /dev/null +++ b/.idea/libraries/Maven__org_jboss_spec_javax_transaction_jboss_transaction_api_1_2_spec_1_1_1_Final.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_jboss_weld_environment_weld_environment_common_3_1_1_Final.xml b/.idea/libraries/Maven__org_jboss_weld_environment_weld_environment_common_3_1_1_Final.xml new file mode 100644 index 0000000..fb2c49f --- /dev/null +++ b/.idea/libraries/Maven__org_jboss_weld_environment_weld_environment_common_3_1_1_Final.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_jboss_weld_module_weld_jsf_3_1_1_Final.xml b/.idea/libraries/Maven__org_jboss_weld_module_weld_jsf_3_1_1_Final.xml new file mode 100644 index 0000000..edd67d7 --- /dev/null +++ b/.idea/libraries/Maven__org_jboss_weld_module_weld_jsf_3_1_1_Final.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_jboss_weld_module_weld_web_3_1_1_Final.xml b/.idea/libraries/Maven__org_jboss_weld_module_weld_web_3_1_1_Final.xml new file mode 100644 index 0000000..2784191 --- /dev/null +++ b/.idea/libraries/Maven__org_jboss_weld_module_weld_web_3_1_1_Final.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_jboss_weld_probe_weld_probe_core_3_1_1_Final.xml b/.idea/libraries/Maven__org_jboss_weld_probe_weld_probe_core_3_1_1_Final.xml new file mode 100644 index 0000000..ebd477a --- /dev/null +++ b/.idea/libraries/Maven__org_jboss_weld_probe_weld_probe_core_3_1_1_Final.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_jboss_weld_servlet_weld_servlet_core_3_1_1_Final.xml b/.idea/libraries/Maven__org_jboss_weld_servlet_weld_servlet_core_3_1_1_Final.xml new file mode 100644 index 0000000..e22ed06 --- /dev/null +++ b/.idea/libraries/Maven__org_jboss_weld_servlet_weld_servlet_core_3_1_1_Final.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_jboss_weld_weld_api_3_1_Final.xml b/.idea/libraries/Maven__org_jboss_weld_weld_api_3_1_Final.xml new file mode 100644 index 0000000..a73cf79 --- /dev/null +++ b/.idea/libraries/Maven__org_jboss_weld_weld_api_3_1_Final.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_jboss_weld_weld_core_impl_3_1_1_Final.xml b/.idea/libraries/Maven__org_jboss_weld_weld_core_impl_3_1_1_Final.xml new file mode 100644 index 0000000..5366f8e --- /dev/null +++ b/.idea/libraries/Maven__org_jboss_weld_weld_core_impl_3_1_1_Final.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_jboss_weld_weld_spi_3_1_Final.xml b/.idea/libraries/Maven__org_jboss_weld_weld_spi_3_1_Final.xml new file mode 100644 index 0000000..aa973c5 --- /dev/null +++ b/.idea/libraries/Maven__org_jboss_weld_weld_spi_3_1_Final.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_jsoup_jsoup_1_13_1.xml b/.idea/libraries/Maven__org_jsoup_jsoup_1_13_1.xml new file mode 100644 index 0000000..937e3c0 --- /dev/null +++ b/.idea/libraries/Maven__org_jsoup_jsoup_1_13_1.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_jvnet_mimepull_mimepull_1_9_13.xml b/.idea/libraries/Maven__org_jvnet_mimepull_mimepull_1_9_13.xml new file mode 100644 index 0000000..ec9caa2 --- /dev/null +++ b/.idea/libraries/Maven__org_jvnet_mimepull_mimepull_1_9_13.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_jvnet_staxex_stax_ex_1_8.xml b/.idea/libraries/Maven__org_jvnet_staxex_stax_ex_1_8.xml new file mode 100644 index 0000000..ee8e8ef --- /dev/null +++ b/.idea/libraries/Maven__org_jvnet_staxex_stax_ex_1_8.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_odftoolkit_odfdom_java_0_8_7.xml b/.idea/libraries/Maven__org_odftoolkit_odfdom_java_0_8_7.xml new file mode 100644 index 0000000..5e50755 --- /dev/null +++ b/.idea/libraries/Maven__org_odftoolkit_odfdom_java_0_8_7.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_postgresql_postgresql_42_2_6.xml b/.idea/libraries/Maven__org_postgresql_postgresql_42_2_6.xml new file mode 100644 index 0000000..97d7125 --- /dev/null +++ b/.idea/libraries/Maven__org_postgresql_postgresql_42_2_6.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_slf4j_slf4j_api_1_7_25.xml b/.idea/libraries/Maven__org_slf4j_slf4j_api_1_7_25.xml new file mode 100644 index 0000000..20e8163 --- /dev/null +++ b/.idea/libraries/Maven__org_slf4j_slf4j_api_1_7_25.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_yaml_snakeyaml_1_26.xml b/.idea/libraries/Maven__org_yaml_snakeyaml_1_26.xml new file mode 100644 index 0000000..e998675 --- /dev/null +++ b/.idea/libraries/Maven__org_yaml_snakeyaml_1_26.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__xerces_xercesImpl_2_9_1.xml b/.idea/libraries/Maven__xerces_xercesImpl_2_9_1.xml new file mode 100644 index 0000000..19d39db --- /dev/null +++ b/.idea/libraries/Maven__xerces_xercesImpl_2_9_1.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__xml_apis_xml_apis_1_0_b2.xml b/.idea/libraries/Maven__xml_apis_xml_apis_1_0_b2.xml new file mode 100644 index 0000000..c36e717 --- /dev/null +++ b/.idea/libraries/Maven__xml_apis_xml_apis_1_0_b2.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..dd6abf3 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,11 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..a331408 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml new file mode 100644 index 0000000..e96534f --- /dev/null +++ b/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.project b/.project new file mode 100644 index 0000000..e6d7786 --- /dev/null +++ b/.project @@ -0,0 +1,40 @@ + + + aren + + + + + + org.eclipse.wst.common.project.facet.core.builder + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.jdt.core.javanature + org.eclipse.m2e.core.maven2Nature + org.eclipse.wst.common.project.facet.core.nature + + + + 1610454680507 + + 30 + + org.eclipse.core.resources.regexFilterMatcher + node_modules|.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__ + + + + diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000..abdea9a --- /dev/null +++ b/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,4 @@ +eclipse.preferences.version=1 +encoding//src/main/java=UTF-8 +encoding//src/main/resources=UTF-8 +encoding/=UTF-8 diff --git a/.settings/org.eclipse.jdt.apt.core.prefs b/.settings/org.eclipse.jdt.apt.core.prefs new file mode 100644 index 0000000..d4313d4 --- /dev/null +++ b/.settings/org.eclipse.jdt.apt.core.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.apt.aptEnabled=false diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..1b6e1ef --- /dev/null +++ b/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,9 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=ignore +org.eclipse.jdt.core.compiler.processAnnotations=disabled +org.eclipse.jdt.core.compiler.release=disabled +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/.settings/org.eclipse.m2e.core.prefs b/.settings/org.eclipse.m2e.core.prefs new file mode 100644 index 0000000..f897a7f --- /dev/null +++ b/.settings/org.eclipse.m2e.core.prefs @@ -0,0 +1,4 @@ +activeProfiles= +eclipse.preferences.version=1 +resolveWorkspaceProjects=true +version=1 diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md new file mode 100644 index 0000000..6c4d534 --- /dev/null +++ b/CONTRIBUTORS.md @@ -0,0 +1,32 @@ +# Contributors + +## List and function of all the different contributors of the AREN platform + +### LIRMM +* **Mathieu Lafourcade** - *Project manager* and *Natural Language Processing* +* **Noémie-Fleur Sandillon-Rezer** - *IT developer* and *Natural Language Processing* +* **Florent Descroix** - *IT developer* and *Design* + +### LIRDEF +* **Manuel Bächtold** - *Pedagogy of the debate* and *Contact with teaching* +* **Valérie Munier** - *Pedagogy of the debate* and *Contact with teaching* +* **Gabriel Pallarès** - *PhD : Develop the argumentative skills of high school students through numerical debates on Socio-Scientific Questions Towards a didactics of argumentation and critical thinking* +* **Kevin de Checchi** - *PhD : The training of argumentation and the development of critical thinking: contributions of personal epistemology and reflexive activities* +* **Capucine Huet** - *PhD : Digital debate and learning disabilities: a new field of possibilities?* + +### Mezoa +* **Damien Hinsinger** - *Visualisation* + +### Cartodébat +* **Claire Ollagnon** - *UX Design* and *Participative conception of the uses* +* **Philippe Estival** - *IT developer of the seminal version Dialoguea* + +### Académie de Montpellier +* **Sébastien Méjean** - *Link with the Academy* + +### Forum des débats +* **Jean Sallantin** - *Formal foundations* +* **Véronique Pinet** - *Philosophical foundation* + +### Controversciences +* **Thibault Latrille** - *Texts founding* diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..01d98cf --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020 aren-consortium + +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. diff --git a/README.md b/README.md new file mode 100644 index 0000000..6738a3b --- /dev/null +++ b/README.md @@ -0,0 +1,110 @@ + + +# AREN (ARgumentation Et Numérique) + +The AREN project (in French, ARgumentation Et Numérique ; argumentation and digital) aims to develop a digital platform for online debates that promotes the development of people' argumentative skills and their critical thinking, through a citizenship education perspective. This platform allows the simultaneous participation of a large number of people in a debate, offers time to build arguments and allows to keep track of exchanges, support for reflective work. + +The project has two research components : +* A didactic component consists of experimenting with the platform in order to assess its impact and suggest changes. +* An artificial intelligence (AI) component focuses on the automatic processing of natural language and aims to develop and evaluate an AI service for thematic classification of student interventions, facilitating their analysis and the preparation of the reflective synthesis. + +## Getting Started + +These instructions will get you a copy of the project up and running on your local machine for development and testing purposes. See deployment for notes on how to deploy the project on a live system. + +### Prerequisites + +* Java Web server (Test and work on Apache-Tomcat 7.0.80+) +* Maven +* PostgreSQL + +## Installation +### Database +Install and configure PostgreSQL specificaly to your OS, check the documentation, to ensure having a secure and remote accessible database. + +Create the user that will manage your database. Repalce `[db_user]` and `[db_password]` by your own choices. +`CREATE USER [db_user] WITH PASSWORD '[db_password]';` +Create the database, Replace `[db_name]` by your own choice. +`CREATE DATABASE [db_name] OWNER [db_user];` + +### Configuration +Download and extracte the sources in the repository of your choice. + +**Copy** the `application.properties` file from the `config` folder to the `src/main/resources` folder. +Fill the empty properties, the documentation is in the file itself. + +**Copy** the `persistence.xml` file from the `config` forlder to the `src/main/resources/META-INF` folder. +Fill the following line with the `db_user`, `db_password` and `db_name` previously set. + + + + + + +## Build +Go to the source folder and run `mvn clean install`. +A `target` folder is then created with the `aren.war` file inside. + +## Deployement +Rename the `aren.war` file to `ROOT.war`then copy it into the Java WebSever of your choice [Tomcat 7 tested and functional]. + +If you do not want the software to run at the root of your serveur, you'll need to change the `path` variable of the `context.xml` file according to the name of your `war` file + +### First launch +Go in your webserver folder, in the application folder. +Edit the `persistence.xml` in the `WEB-INF/classes/META-INF` folder. +Uncomment the two following lines to allow the application to build the whole database. + + + +Restart your webserver. + +**! WARNING !** +**To avoid any data loss yous have to re-comment those previous lines. Otherwise the full database will be rebuilt at every restart of the application !** + +## API super-admin credentials +The default credentials for the super-admin are **admin:password** +Those can be easily change throught the web interface or with an API call. + +## Documentation +The web interface is shiped with an useful *help* button. Use it if you have any issues. +The REST API documentation can be found [here](https://app.swaggerhub.com/apis-docs/aren-consortium/aren-api/3.0.0). +You can access the openapi desc directly through the application with the url `/ws/openapi.[json|yaml]` + + + +## Running the tests + +@TODO + +## Built With + +* [Maven](https://maven.apache.org/) - Dependency Management +* [Vue.js](https://vuejs.org/) - Web framework used +* [Vue-i18n](https://kazupon.github.io/vue-i18n/) - Internationalization tool for Vue.js +* [Vue-router](https://router.vuejs.org/) - Single Page Website tool for Vue.js +* [http-vue-loader](https://github.com/FranckFreiburger/http-vue-loader) - Async .vue file loading for Vue.js +* [Materialize](https://materializecss.com/) - CSS framwork used +* [D3.js](https://d3js.org/) - Visualization tool + +## Contributing + +@TODO + +## Versioning + +We use [SemVer](http://semver.org/) for versioning. + +## Authors + +* **Noémie-Fleur Sandillon-Rezer** - *Initial work, full-stack of v1.0.0* - [noemie-fleur.sandillon-rezer@lirmm.fr](mailto:noemie-fleur.sandillon-rezer@lirmm.fr?subject=[AREN]%20) +* **Florent Descroix** - *Complete rework, full stack since v3.0.0* - [florent.descroix@lirmm.fr](mailto:florent.descroix@lirmm.fr?subject=[AREN]%20) + +See also the list of [CONTRIBUTORS](CONTRIBUTORS.md) who participated in this project. + +## License + +This project is licensed under the MIT License - see the [LICENSE.md](LICENSE.md) file for details + +## Acknowledgment +[Official website](http://www.lirmm.fr/aren) diff --git a/nb-configuration.xml b/nb-configuration.xml new file mode 100644 index 0000000..b6bf903 --- /dev/null +++ b/nb-configuration.xml @@ -0,0 +1,26 @@ + + + + + + ide + true + true + /WEB-INF/sass:/assets/css + /less:/css + false + + + Tomcat + + diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..60d38c7 --- /dev/null +++ b/pom.xml @@ -0,0 +1,252 @@ + + 4.0.0 + + fr.lirmm + aren + 3.8.0 + war + + aren + + + ${project.build.directory}/endorsed + UTF-8 + 1.8 + 1.8 + + 1.1 + 2.31 + 2.11.0 + 0.9.1 + 3.1.1.Final + 0.4.1 + 5.4.3.Final + 42.2.6 + + + + + + + io.swagger.core.v3 + swagger-jaxrs2 + 2.1.4 + + + io.swagger.core.v3 + swagger-annotations + 2.1.4 + jar + + + + + org.odftoolkit + odfdom-java + 0.8.7 + + + + + com.sun.mail + javax.mail + 1.6.2 + + + javax + javaee-web-api + 8.0.1 + provided + + + javax.xml.bind + jaxb-api + 2.3.1 + + + xml-apis + xml-apis + 1.0.b2 + + + + + org.apache.httpcomponents + httpcore + 4.4.13 + jar + + + org.apache.httpcomponents + httpclient + 4.5.9 + jar + + + + + org.glassfish.jersey.core + jersey-common + ${jersey.version} + + + org.glassfish.jersey.core + jersey-server + 2.31 + jar + + + org.glassfish.jersey.containers + jersey-container-servlet + ${jersey.version} + + + org.glassfish.jersey.ext.cdi + jersey-cdi1x + ${jersey.version} + + + org.glassfish.jersey.media + jersey-media-json-jackson + ${jersey.version} + + + org.glassfish.jersey.core + jersey-client + ${jersey.version} + + + org.glassfish.jersey.inject + jersey-hk2 + ${jersey.version} + + + org.glassfish.jersey.media + jersey-media-sse + ${jersey.version} + + + org.glassfish.jersey.media + jersey-media-multipart + ${jersey.version} + + + + + com.fasterxml.jackson.core + jackson-core + ${jackson.version} + + + com.fasterxml.jackson.module + jackson-module-parameter-names + ${jackson.version} + + + com.fasterxml.jackson.core + jackson-annotations + ${jackson.version} + + + com.fasterxml.jackson.core + jackson-databind + ${jackson.version} + + + com.fasterxml.jackson.datatype + jackson-datatype-jdk8 + ${jackson.version} + + + com.fasterxml.jackson.datatype + jackson-datatype-jsr310 + ${jackson.version} + + + com.fasterxml.jackson.datatype + jackson-datatype-hibernate5 + ${jackson.version} + + + com.fasterxml.jackson.module + jackson-module-jsonSchema + ${jackson.version} + + + com.fasterxml.jackson.dataformat + jackson-dataformat-xml + ${jackson.version} + + + + + io.jsonwebtoken + jjwt + ${jjwt.version} + + + + + org.jboss.weld.servlet + weld-servlet-core + ${weld.version} + + + + + de.svenkubiak + jBCrypt + ${jbcrypt.version} + + + + + org.hibernate + hibernate-core + ${hibernate.version} + + + org.hibernate + hibernate-c3p0 + ${hibernate.version} + + + + + org.postgresql + postgresql + ${postgresql.version} + + + + + org.jsoup + jsoup + 1.13.1 + + + + + aren + + + org.apache.maven.plugins + maven-war-plugin + 2.3 + + false + + + + org.apache.maven.plugins + maven-compiler-plugin + 2.3.2 + + true + + + + + + diff --git a/src/main/java/fr/lirmm/aren/exception/AbstractException.java b/src/main/java/fr/lirmm/aren/exception/AbstractException.java new file mode 100644 index 0000000..ac843cd --- /dev/null +++ b/src/main/java/fr/lirmm/aren/exception/AbstractException.java @@ -0,0 +1,31 @@ +package fr.lirmm.aren.exception; + +import java.util.HashMap; + +/** + * + * @author Florent Descroix {@literal } + */ +public class AbstractException extends RuntimeException { + + /** + * + */ + protected HashMap details = new HashMap(); + + /** + * + * @param string + */ + public AbstractException(String string) { + super(string); + } + + /** + * + * @return + */ + public HashMap getDetails() { + return details; + } +} diff --git a/src/main/java/fr/lirmm/aren/exception/AccessDeniedException.java b/src/main/java/fr/lirmm/aren/exception/AccessDeniedException.java new file mode 100644 index 0000000..3ebb5c3 --- /dev/null +++ b/src/main/java/fr/lirmm/aren/exception/AccessDeniedException.java @@ -0,0 +1,56 @@ +package fr.lirmm.aren.exception; + +/** + * Thrown if errors occur during the authorization process. + * + * @author Florent Descroix {@literal } + */ +public class AccessDeniedException extends AbstractException { + + /** + * + */ + private static final long serialVersionUID = -6029917646671248044L; + + /** + * + * @param klass + * @param id + * @return + */ + public final static AccessDeniedException UNMUTABLE_OBJECT(Class klass, Long id) { + AccessDeniedException ade = new AccessDeniedException("unmutable_object"); + ade.details.put("type", klass.getSimpleName()); + ade.details.put("id", id+""); + return ade; + } + + /** + * + * @param klass + * @param id + * @return + */ + public final static AccessDeniedException UNERASABLE_OBJECT(Class klass, Long id) { + AccessDeniedException ade = new AccessDeniedException("unerasable_object"); + ade.details.put("type", klass.getSimpleName()); + ade.details.put("id", id+""); + return ade; + } + + /** + * + * @return + */ + public final static AccessDeniedException PERMISSION_MISSING() { + return new AccessDeniedException("permission_missing"); + } + + /** + * + * @param string + */ + private AccessDeniedException(String string) { + super(string); + } +} diff --git a/src/main/java/fr/lirmm/aren/exception/AuthenticationException.java b/src/main/java/fr/lirmm/aren/exception/AuthenticationException.java new file mode 100644 index 0000000..e05317c --- /dev/null +++ b/src/main/java/fr/lirmm/aren/exception/AuthenticationException.java @@ -0,0 +1,49 @@ +package fr.lirmm.aren.exception; + +/** + * Thrown if errors occur during the authentication process. + * + * @author Florent Descroix {@literal } + */ +public class AuthenticationException extends AbstractException { + + /** + * + */ + private static final long serialVersionUID = -315540945651188131L; + + /** + * + * @return + */ + public final static AuthenticationException BAD_CREDENTIALS() { + return new AuthenticationException("bad_credentials"); + } + + /** + * + * @param username + * @return + */ + public final static AuthenticationException INACTIVE_USER(String username) { + AuthenticationException ae = new AuthenticationException("inactive_user:" + username); + ae.details.put("username", username); + return ae; + } + + /** + * + * @return + */ + public final static AuthenticationException AUTHENTIFICATION_REQUIRED() { + return new AuthenticationException("authentification_required"); + } + + /** + * + * @param string + */ + private AuthenticationException(String string) { + super(string); + } +} diff --git a/src/main/java/fr/lirmm/aren/exception/InsertEntityException.java b/src/main/java/fr/lirmm/aren/exception/InsertEntityException.java new file mode 100644 index 0000000..6ba2d50 --- /dev/null +++ b/src/main/java/fr/lirmm/aren/exception/InsertEntityException.java @@ -0,0 +1,63 @@ +package fr.lirmm.aren.exception; + +/** + * Thrown if an error occurs on entity insertion in DB + * + * @author Florent Descroix {@literal } + */ +public class InsertEntityException extends AbstractException { + + /** + * + */ + private static final long serialVersionUID = 8631881926079551080L; + + /** + * + * @param propertyName + * @return + */ + public static InsertEntityException MANDATORY_PROPERTY(String propertyName) { + InsertEntityException iee = new InsertEntityException("mandatory_property"); + iee.details.put("propertyName", propertyName); + return iee; + } + + /** + * + * @param keyName + * @param keyValue + * @return + */ + public static InsertEntityException DUPLICATE_KEY(String keyName, String keyValue) { + InsertEntityException iee = new InsertEntityException("duplicate_key"); + iee.details.put("keyName", keyName); + iee.details.put("keyValue", keyValue); + return iee; + } + + /** + * + * @return + */ + public static InsertEntityException INVALID_PARENT() { + return new InsertEntityException("invalid_parent"); + } + + /** + * + * @param details + * @return + */ + public static InsertEntityException OTHER(String details) { + return new InsertEntityException(details); + } + + /** + * + * @param string + */ + private InsertEntityException(String string) { + super(string); + } +} diff --git a/src/main/java/fr/lirmm/aren/exception/InvalidAuthenticationTokenException.java b/src/main/java/fr/lirmm/aren/exception/InvalidAuthenticationTokenException.java new file mode 100644 index 0000000..7e24b11 --- /dev/null +++ b/src/main/java/fr/lirmm/aren/exception/InvalidAuthenticationTokenException.java @@ -0,0 +1,68 @@ +package fr.lirmm.aren.exception; + +/** + * Thrown if an authentication token is invalid. + * + * @author Florent Descroix {@literal } + */ +public class InvalidAuthenticationTokenException extends AbstractException { + + /** + * + */ + private static final long serialVersionUID = -2394710689872197849L; + + /** + * + * @return + */ + public final static InvalidAuthenticationTokenException INVALID_CAS_TICKET() { + return new InvalidAuthenticationTokenException("invalid_cas_ticket"); + } + + /** + * + * @param code + * @return + */ + public final static InvalidAuthenticationTokenException INVALID_CAS_TICKET(String code) { + InvalidAuthenticationTokenException iate = InvalidAuthenticationTokenException.INVALID_CAS_TICKET(); + iate.details.put("code", code); + return iate; + } + + /** + * + * @return + */ + public final static InvalidAuthenticationTokenException INVALID_TOKEN() { + return new InvalidAuthenticationTokenException("invalid_token"); + } + + /** + * + * @return + */ + public final static InvalidAuthenticationTokenException EXPIRED_TOKEN() { + return new InvalidAuthenticationTokenException("expired_token"); + } + + /** + * + * @param claimName + * @return + */ + public final static InvalidAuthenticationTokenException INVALID_CLAIM(String claimName) { + InvalidAuthenticationTokenException iate = new InvalidAuthenticationTokenException("invalid_claim"); + iate.details.put("claimName", claimName); + return iate; + } + + /** + * + * @param string + */ + private InvalidAuthenticationTokenException(String string) { + super(string); + } +} diff --git a/src/main/java/fr/lirmm/aren/model/AbstractDatedEntity.java b/src/main/java/fr/lirmm/aren/model/AbstractDatedEntity.java new file mode 100644 index 0000000..6c4ab1a --- /dev/null +++ b/src/main/java/fr/lirmm/aren/model/AbstractDatedEntity.java @@ -0,0 +1,34 @@ +package fr.lirmm.aren.model; + +import java.time.ZonedDateTime; + +import javax.persistence.Column; +import javax.persistence.MappedSuperclass; + +/** + * Model that olds a creation date + * + * @author Florent Descroix {@literal } + */ +@MappedSuperclass +public abstract class AbstractDatedEntity extends AbstractEntity { + + @Column(name = "created", nullable = false, updatable = false) + private ZonedDateTime created = ZonedDateTime.now(); + + /** + * + * @return + */ + public ZonedDateTime getCreated() { + return created; + } + + /** + * + * @param created + */ + public void setCreated(ZonedDateTime created) { + this.created = created; + } +} diff --git a/src/main/java/fr/lirmm/aren/model/AbstractEntEntity.java b/src/main/java/fr/lirmm/aren/model/AbstractEntEntity.java new file mode 100644 index 0000000..2ab4791 --- /dev/null +++ b/src/main/java/fr/lirmm/aren/model/AbstractEntEntity.java @@ -0,0 +1,51 @@ +package fr.lirmm.aren.model; + +import javax.persistence.Column; +import javax.persistence.MappedSuperclass; + +/** + * Model that olds an ent id (part of the AAF) + * + * @author Florent Descroix {@literal } + */ +@MappedSuperclass +public abstract class AbstractEntEntity extends AbstractDatedEntity { + + @Column(name = "ent_id", updatable = false, unique = true) + private String entId; + + /** + * + * @return + */ + public String getEntId() { + return entId; + } + + /** + * + * @param entId + */ + public void setEntId(String entId) { + this.entId = entId; + } + + /** + * + * @param object + * @return + */ + @Override + public boolean equals(Object object) { + if (object.getClass() != this.getClass()) { + return false; + } + AbstractEntEntity other = (AbstractEntEntity) object; + if (this.getEntId() != null && other.getEntId() != null) { + return this.getEntId().equals(other.getEntId()); + } else if (this.getId() != null && other.getId() != null) { + return this.getId().equals(other.getId()); + } + return false; + } +} diff --git a/src/main/java/fr/lirmm/aren/model/AbstractEntity.java b/src/main/java/fr/lirmm/aren/model/AbstractEntity.java new file mode 100644 index 0000000..1183f97 --- /dev/null +++ b/src/main/java/fr/lirmm/aren/model/AbstractEntity.java @@ -0,0 +1,178 @@ +package fr.lirmm.aren.model; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + +import javax.persistence.Basic; +import javax.persistence.Column; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.MappedSuperclass; +import javax.xml.bind.annotation.XmlTransient; + +import com.fasterxml.jackson.annotation.JsonIgnore; + +/** + * + * Model that olds an id + * + * @author Florent Descroix {@literal } + */ +@MappedSuperclass +public abstract class AbstractEntity implements Comparable { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Basic(optional = false) + @Column(name = "id") + private Long id; + + /** + * + */ + public AbstractEntity() { + } + + /** + * + * @param l + */ + public AbstractEntity(Long id) { + this.id = id; + } + + /** + * + * @return + */ + @XmlTransient + @JsonIgnore + public boolean isEditable() { + return true; + } + + /** + * + * @return + */ + @XmlTransient + @JsonIgnore + public boolean isRemovable() { + return true; + } + + /** + * + * @return + */ + public Long getId() { + return id; + } + + /** + * + * @param id + */ + public void setId(Long id) { + this.id = id; + } + + /** + * Merges the non null values of an object into this Useful to populate / + * update a persisted object + * + * @param other + */ + public void merge(AbstractEntity other) { + + // Only apply on same class + if (!this.getClass().equals(other.getClass())) { + return; + } + + // Get all methods of the current object + Method[] methods = this.getClass().getMethods(); + + for (Method getter : methods) { + // Only proceed for getter functions + if (getter.getName().startsWith("get") || getter.getName().startsWith("is")) { + + // Deduce the setter name from the getter name + String setterName = getter.getName().replaceFirst("get|is", "set"); + + try { + // Get the actual setter method + Method setter = this.getClass().getMethod(setterName, getter.getReturnType()); + // Apply the getter on the object to merge and replace the value in the actual object if it's not null + Object value = getter.invoke(other); + + if (value != null) { + /*if (value instanceof Collection) { + Collection myValue = (Collection) getter.invoke(this); + for (Object obj : (Collection) myValue) { + ((Collection) value).add(obj); + } + } else if (value instanceof Map) { + Map myValue = (Map) getter.invoke(this); + for (Map.Entry obj : ((Map) myValue).entrySortedSet()) { + ((Map) value).put(obj.getKey(), obj.getValue()); + } + }*/ + //if (!(value instanceof AbstractEntity) || ((AbstractEntity) value).getId() != null) { + setter.invoke(this, value); + //} + } + } catch (IllegalAccessException | IllegalArgumentException | SecurityException | InvocationTargetException e) { + // Really unexpected ! + System.err.println(e.getMessage()); + } catch (NoSuchMethodException e) { + // The only suposetly possible error. + // It means the field is not suposed to be updated. + } + } + } + } + + /** + * + * @return + */ + @Override + public int hashCode() { + int hash = 0; + hash += (id != null ? id.hashCode() : 0); + return hash; + } + + /** + * + * @param object + * @return + */ + @Override + public boolean equals(Object object) { + if (object == null || this == null) { + return false; + } + if (object.getClass() != this.getClass()) { + return false; + } + AbstractEntity other = this.getClass().cast(object); + return !((this.id == null && other.getId() != null) || (this.id != null && !this.id.equals(other.getId()))); + } + + /** + * + * @return + */ + @Override + public String toString() { + return "fr.lirmm.aren.model." + this.getClass().getName() + " [ id=" + id + " ]"; + } + + @Override + public int compareTo(AbstractEntity t) { + return (int) (this.getId() - t.getId()); + } +} diff --git a/src/main/java/fr/lirmm/aren/model/AbstractOwnedEntity.java b/src/main/java/fr/lirmm/aren/model/AbstractOwnedEntity.java new file mode 100644 index 0000000..36a0a1a --- /dev/null +++ b/src/main/java/fr/lirmm/aren/model/AbstractOwnedEntity.java @@ -0,0 +1,37 @@ +package fr.lirmm.aren.model; + +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.MappedSuperclass; + +/** + * Model that olds a uniq specific User + * + * @author Florent Descroix {@literal } + */ +@MappedSuperclass +public abstract class AbstractOwnedEntity extends AbstractDatedEntity { + + /** + * + */ + @JoinColumn(name = "owner_id", referencedColumnName = "id", updatable = false) + @ManyToOne(optional = false) + protected User owner; + + /** + * + * @return + */ + public User getOwner() { + return owner; + } + + /** + * + * @param owner + */ + public void setOwner(User owner) { + this.owner = owner; + } +} diff --git a/src/main/java/fr/lirmm/aren/model/Category.java b/src/main/java/fr/lirmm/aren/model/Category.java new file mode 100644 index 0000000..e40c4ad --- /dev/null +++ b/src/main/java/fr/lirmm/aren/model/Category.java @@ -0,0 +1,162 @@ +package fr.lirmm.aren.model; + +import java.io.Serializable; +import java.util.Date; +import java.util.TreeSet; +import java.util.SortedSet; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.OneToMany; +import javax.persistence.Table; +import javax.validation.constraints.Size; +import javax.xml.bind.annotation.XmlTransient; + +import com.fasterxml.jackson.annotation.JsonIdentityInfo; +import com.fasterxml.jackson.annotation.ObjectIdGenerators; +import org.hibernate.annotations.SortNatural; + +/** + * Model for Categories with anotations for storage and serialization + * + * @author Florent Descroix {@literal } + */ +@Entity +@Table(name = "categories") + +@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id", scope = Category.class) +public class Category extends AbstractEntity implements Serializable { + + /** + * + */ + private static final long serialVersionUID = 4359639152649086413L; + + @Size(max = 255) + @Column(name = "name") + private String name; + + @Size(max = 2083) + @Column(name = "picture") + private String picture; + + @OneToMany(mappedBy = "category") + @SortNatural + private SortedSet documents = new TreeSet<>(); + + @Column(name = "debates_count") + private Integer debatesCount = 0; + + @Column(name = "documents_count") + private Integer documentsCount = 0; + + @Column(name = "last_comment_date") + private Date lastCommentDate; + + /** + * + * @return + */ + public String getName() { + return name; + } + + /** + * + * @param name + */ + public void setName(String name) { + this.name = name; + } + + /** + * + * @return + */ + public String getPicture() { + return picture; + } + + /** + * + * @param picture + */ + public void setPicture(String picture) { + this.picture = picture; + } + + /** + * + * @return + */ + @XmlTransient + public SortedSet getDocuments() { + return documents; + } + + /** + * + * @param documents + */ + public void setDocuments(SortedSet documents) { + this.documents = documents; + } + + /** + * + * @return + */ + public Integer getDebatesCount() { + return debatesCount; + } + + /** + * + * @param debatesCount + */ + public void setDebatesCount(Integer debatesCount) { + this.debatesCount = debatesCount; + } + + /** + * + * @return + */ + public Date getLastCommentDate() { + return lastCommentDate; + } + + /** + * + * @param lastCommentDate + */ + public void setLastCommentDate(Date lastCommentDate) { + this.lastCommentDate = lastCommentDate; + } + + /** + * + * @return + */ + public Integer getDocumentsCount() { + return documentsCount; + } + + /** + * + * @param documentsCount + */ + public void setDocumentsCount(Integer documentsCount) { + this.documentsCount = documentsCount; + } + + /** + * + * @return + */ + @Override + public boolean isRemovable() { + return documentsCount == 0; + } + +} diff --git a/src/main/java/fr/lirmm/aren/model/Comment.java b/src/main/java/fr/lirmm/aren/model/Comment.java new file mode 100644 index 0000000..b4f74f4 --- /dev/null +++ b/src/main/java/fr/lirmm/aren/model/Comment.java @@ -0,0 +1,558 @@ +package fr.lirmm.aren.model; + +import java.io.Serializable; +import java.util.TreeSet; +import java.util.SortedSet; + +import javax.persistence.Basic; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import javax.persistence.JoinColumn; +import javax.persistence.Lob; +import javax.persistence.ManyToOne; +import javax.persistence.OneToMany; +import javax.persistence.Table; +import javax.validation.constraints.NotNull; + +import com.fasterxml.jackson.annotation.JsonIdentityInfo; +import com.fasterxml.jackson.annotation.JsonIdentityReference; +import com.fasterxml.jackson.annotation.ObjectIdGenerators; +import fr.lirmm.aren.model.Comment.Hypostase; +import java.util.Arrays; +import java.util.stream.Collectors; +import javax.persistence.Convert; +import org.hibernate.annotations.SortNatural; + +import org.hibernate.annotations.Type; + +/** + * Model for Comments with anotations for storage and serialization + * + * @author Florent Descroix {@literal } + */ +@Entity +@Table(name = "comments") + +@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id", scope = Comment.class) +public class Comment extends AbstractOwnedEntity implements Serializable { + + /** + * + */ + private static final long serialVersionUID = 5278516622163143823L; + + /** + * + */ + public enum Opinion { + + /** + * + */ + FOR, + /** + * + */ + NEUTRAL, + /** + * + */ + AGAINST + } + + /** + * + */ + public enum Hypostase { + + /** + * + */ + EXPLANATION, + /** + * + */ + LAW, + /** + * + */ + PRINCIPLE, + /** + * + */ + THEORY, + /** + * + */ + BELIEF, + /** + * + */ + CONJECTURE, + /** + * + */ + HYPOTHESIS, + /** + * + */ + AXIOM, + /** + * + */ + DEFINITION, + /** + * + */ + QUALITATIVE, + /** + * + */ + VARIABLE, + /** + * + */ + OBJECT, + /** + * + */ + EVENT, + /** + * + */ + PHENOMENON, + /** + * + */ + DATA, + /** + * + */ + MODE, + /** + * + */ + DOMAIN, + /** + * + */ + QUANTITATIVE, + /** + * + */ + VARIATION, + /** + * + */ + VARIANCE, + /** + * + */ + APPROXIMATION, + /** + * + */ + VALUE, + /** + * + */ + CLUE, + /** + * + */ + INVARIANT, + /** + * + */ + DIMENSION, + /** + * + */ + STRUCTURAL, + /** + * + */ + STRUCTURE, + /** + * + */ + METHOD, + /** + * + */ + FORMALISM, + /** + * + */ + CLASSIFICATION, + /** + * + */ + PARADIGME, + /** + * + */ + DIFFICULTY, + /** + * + */ + APORIA, + /** + * + */ + PARADOXE, + /** + * + */ + PROBLEM; + } + + @Lob + @Type(type = "org.hibernate.type.TextType") + @Column(name = "reformulation") + private String reformulation; + + @Lob + @Type(type = "org.hibernate.type.TextType") + @Column(name = "argumentation") + private String argumentation; + + @Lob + @Type(type = "org.hibernate.type.TextType") + @Column(name = "selection") + private String selection; + + @Column(name = "start_container") + private String startContainer; + + @Column(name = "start_offset") + private Long startOffset; + + @Column(name = "end_container") + private String endContainer; + + @Column(name = "end_offset") + private Long endOffset; + + @Basic(optional = false) + @NotNull + @Column(name = "moderated") + private boolean moderated = false; + + @Basic(optional = false) + @NotNull + @Column(name = "signaled") + private boolean signaled = false; + + @OneToMany(mappedBy = "parent") + @SortNatural + private SortedSet comments = new TreeSet<>(); + + @JsonIdentityReference(alwaysAsId = true) + @JoinColumn(name = "parent_id", referencedColumnName = "id", updatable = false) + @ManyToOne + private Comment parent; + + @JsonIdentityReference(alwaysAsId = true) + @JoinColumn(name = "debate_id", referencedColumnName = "id", updatable = false) + @ManyToOne(optional = false) + private Debate debate; + + @Enumerated(EnumType.STRING) + @Column(name = "opinion", updatable = false) + private Opinion opinion; + + @Lob + @Type(type = "org.hibernate.type.TextType") + @Column(name = "hypostases") + private String hypostases; + + @Column(name = "tags", length = 1023) + @Convert(converter = TagSet.Converter.class) + private TagSet tags = new TagSet(); + + @Column(name = "proposed_tags", length = 1023) + @Convert(converter = TagSet.Converter.class) + private TagSet proposedTags = new TagSet(); + + /** + * + * @return + */ + public String getReformulation() { + return reformulation; + } + + /** + * + * @param reformulation + */ + public void setReformulation(String reformulation) { + this.reformulation = reformulation; + } + + /** + * + * @return + */ + public String getArgumentation() { + return argumentation; + } + + /** + * + * @param argumentation + */ + public void setArgumentation(String argumentation) { + this.argumentation = argumentation; + } + + /** + * + * @return + */ + public String getSelection() { + return selection; + } + + /** + * + * @param selection + */ + public void setSelection(String selection) { + this.selection = selection; + } + + /** + * + * @return + */ + public String getStartContainer() { + return startContainer; + } + + /** + * + * @param startContainer + */ + public void setStartContainer(String startContainer) { + this.startContainer = startContainer; + } + + /** + * + * @return + */ + public Long getStartOffset() { + return startOffset; + } + + /** + * + * @param startOffset + */ + public void setStartOffset(Long startOffset) { + this.startOffset = startOffset; + } + + /** + * + * @return + */ + public String getEndContainer() { + return endContainer; + } + + /** + * + * @param endContainer + */ + public void setEndContainer(String endContainer) { + this.endContainer = endContainer; + } + + /** + * + * @return + */ + public Long getEndOffset() { + return endOffset; + } + + /** + * + * @param endOffset + */ + public void setEndOffset(Long endOffset) { + this.endOffset = endOffset; + } + + /** + * + * @return + */ + public boolean isModerated() { + return moderated; + } + + /** + * + * @param moderated + */ + public void setModerated(boolean moderated) { + this.moderated = moderated; + } + + /** + * + * @return + */ + public boolean isSignaled() { + return signaled; + } + + /** + * + * @param signaled + */ + public void setSignaled(boolean signaled) { + this.signaled = signaled; + } + + /** + * + * @return + */ + public Opinion getOpinion() { + return opinion; + } + + /** + * + * @param opinion + */ + public void setOpinion(Opinion opinion) { + this.opinion = opinion; + } + + /** + * + * @return + */ + public SortedSet getComments() { + return comments; + } + + /** + * + * @param comments + */ + public void setComments(SortedSet comments) { + this.comments = comments; + } + + /** + * + * @return + */ + public Comment getParent() { + return parent; + } + + /** + * + * @param parent + */ + public void setParent(Comment parent) { + this.parent = parent; + } + + /** + * + * @return + */ + public Debate getDebate() { + return debate; + } + + /** + * + * @param debate + */ + public void setDebate(Debate debate) { + this.debate = debate; + } + + /** + * + * @return + */ + public SortedSet getHypostases() { + if (this.hypostases != null && this.hypostases.length() > 0) { + return Arrays.stream(this.hypostases.split(",")) + .map(Hypostase::valueOf) + .collect(Collectors.toCollection(() -> new TreeSet())); + } else { + return new TreeSet(); + } + + } + + /** + * + * @param hypostases + */ + public void setHypostases(SortedSet hypostases) { + this.hypostases = hypostases.stream() + .map(Hypostase::name) + .collect(Collectors.joining(",")); + } + + /** + * + * @return + */ + public TagSet getProposedTags() { + return proposedTags; + } + + /** + * + * @param proposedTags + */ + public void setProposedTags(TagSet proposedTags) { + this.proposedTags = proposedTags; + } + + /** + * + * @return + */ + public TagSet getTags() { + return tags; + } + + /** + * + * @param tags + */ + public void setTags(TagSet tags) { + this.tags = tags; + } + + /** + * + */ + public void removeUnusedTags() { + TagSet tagToRemove = new TagSet(); + for (TagSet.Tag tag : this.getProposedTags()) { + if (tag.isNegative() && !tags.contains(tag)) { + tagToRemove.add(tag); + } + } + this.getProposedTags().removeAll(tagToRemove); + } + +} diff --git a/src/main/java/fr/lirmm/aren/model/Debate.java b/src/main/java/fr/lirmm/aren/model/Debate.java new file mode 100644 index 0000000..2814bc4 --- /dev/null +++ b/src/main/java/fr/lirmm/aren/model/Debate.java @@ -0,0 +1,358 @@ +package fr.lirmm.aren.model; + +import java.io.Serializable; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.JoinColumn; +import javax.persistence.JoinTable; +import javax.persistence.ManyToMany; +import javax.persistence.ManyToOne; +import javax.persistence.OneToMany; +import javax.persistence.Table; +import javax.validation.constraints.Size; +import javax.xml.bind.annotation.XmlTransient; + +import com.fasterxml.jackson.annotation.JsonIdentityInfo; +import com.fasterxml.jackson.annotation.ObjectIdGenerators; +import java.time.ZonedDateTime; +import java.util.SortedSet; +import java.util.TreeSet; +import javax.persistence.FetchType; +import org.hibernate.annotations.SortNatural; +import org.hibernate.annotations.Where; + +/** + * Model for Debates with anotations for storage and serialization + * + * @author Florent Descroix {@literal } + */ +@Entity +@Table(name = "debates") + +@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id", scope = Debate.class) +public class Debate extends AbstractOwnedEntity implements Serializable { + + /** + * + */ + private static final long serialVersionUID = 1862506368700355733L; + + @Size(max = 255) + @Column(name = "name") + private String name; + + @Column(name = "closed") + private ZonedDateTime closed; + + @Column(name = "is_active") + private boolean active = true; + + @JoinTable(name = "debates_teams", + joinColumns = { + @JoinColumn(name = "debate_id", referencedColumnName = "id")}, + inverseJoinColumns = { + @JoinColumn(name = "team_id", referencedColumnName = "id")}) + @ManyToMany + @SortNatural + private SortedSet teams = new TreeSet<>(); + + @JoinTable(name = "debates_guests", + joinColumns = { + @JoinColumn(name = "debate_id", referencedColumnName = "id")}, + inverseJoinColumns = { + @JoinColumn(name = "user_id", referencedColumnName = "id")}) + @ManyToMany + @Where(clause = "is_active = true") + @SortNatural + private SortedSet guests = new TreeSet<>(); + + @OneToMany(mappedBy = "debate") + @SortNatural + private SortedSet comments = new TreeSet<>(); + + @JoinColumn(name = "document_id", referencedColumnName = "id", updatable = false) + @ManyToOne(optional = false, fetch = FetchType.LAZY) + private Document document; + + @Column(name = "comments_count") + private Integer commentsCount = 0; + + @Column(name = "comments_count_for") + private Integer commentsCountFor = 0; + + @Column(name = "comments_count_against") + private Integer commentsCountAgainst = 0; + + @Column(name = "last_comment_date") + private ZonedDateTime lastCommentDate; + + @Column(name = "with_hypostases") + private boolean withHypostases = false; + + @Column(name = "reformulation_check") + private boolean reformulationCheck = true; + + @Column(name = "idfix_link") + private boolean idfixLink = false; + + @Column(name = "open_public") + private boolean openPublic = false; + + /** + * + * @return + */ + public String getName() { + return name; + } + + /** + * + * @param name + */ + public void setName(String name) { + this.name = name; + } + + /** + * + * @return + */ + public ZonedDateTime getClosed() { + return closed; + } + + /** + * + * @param closed + */ + public void setClosed(ZonedDateTime closed) { + this.closed = closed; + } + + /** + * + * @return + */ + public boolean isActive() { + return active; + } + + /** + * + * @param active + */ + public void setActive(boolean active) { + this.active = active; + } + + /** + * + * @return + */ + @XmlTransient + public SortedSet getTeams() { + return teams; + } + + /** + * + * @param teams + */ + public void setTeams(SortedSet teams) { + this.teams = teams; + } + + /** + * + * @param team + */ + public void addTeam(Team team) { + this.teams.add(team); + team.getDebates().add(this); + } + + /** + * + * @param team + */ + public void removeTeam(Team team) { + this.teams.remove(team); + team.getDebates().remove(this); + } + + /** + * + * @return + */ + @XmlTransient + public SortedSet getGuests() { + return guests; + } + + /** + * + * @param guests + */ + public void setGuests(SortedSet guests) { + this.guests = guests; + } + + /** + * + * @param guest + */ + public void addGuest(User guest) { + this.guests.add(guest); + guest.getInvitedDebates().add(this); + } + + /** + * + * @param guest + */ + public void removeGuest(User guest) { + this.guests.remove(guest); + guest.getInvitedDebates().remove(this); + } + + /** + * + * @return + */ + @XmlTransient + public SortedSet getComments() { + return comments; + } + + /** + * + * @param comments + */ + public void setComments(SortedSet comments) { + this.comments = comments; + } + + /** + * + * @return + */ + public Document getDocument() { + return document; + } + + /** + * + * @param document + */ + public void setDocument(Document document) { + this.document = document; + } + + /** + * + * @return + */ + public Integer getCommentsCount() { + return commentsCount; + } + + /** + * + * @return + */ + public Integer getCommentsCountFor() { + return commentsCountFor; + } + + /** + * + * @return + */ + public Integer getCommentsCountAgainst() { + return commentsCountAgainst; + } + + /** + * + * @return + */ + public ZonedDateTime getLastCommentDate() { + return lastCommentDate; + } + + /** + * + * @return + */ + public boolean isWithHypostases() { + return withHypostases; + } + + /** + * + * @param withHypostases + */ + public void setWithHypostases(boolean withHypostases) { + this.withHypostases = withHypostases; + } + + /** + * + * @return + */ + public boolean isReformulationCheck() { + return reformulationCheck; + } + + /** + * + * @param reformulationCheck + */ + public void setReformulationCheck(boolean reformulationCheck) { + this.reformulationCheck = reformulationCheck; + } + + /** + * + * @return + */ + public boolean isIdfixLink() { + return idfixLink; + } + + /** + * + * @param idfixLink + */ + public void setIdfixLink(boolean idfixLink) { + this.idfixLink = idfixLink; + } + + /** + * + * @return + */ + public boolean isOpenPublic() { + return openPublic; + } + + /** + * + * @param openPublic + */ + public void setOpenPublic(boolean openPublic) { + this.openPublic = openPublic; + } + + /** + * + * @return + */ + @Override + public boolean isRemovable() { + return comments.isEmpty(); + } + +} diff --git a/src/main/java/fr/lirmm/aren/model/Document.java b/src/main/java/fr/lirmm/aren/model/Document.java new file mode 100644 index 0000000..319d45f --- /dev/null +++ b/src/main/java/fr/lirmm/aren/model/Document.java @@ -0,0 +1,176 @@ +package fr.lirmm.aren.model; + +import java.io.Serializable; +import java.util.TreeSet; +import java.util.SortedSet; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.JoinColumn; +import javax.persistence.Lob; +import javax.persistence.ManyToOne; +import javax.persistence.OneToMany; +import javax.persistence.Table; +import javax.validation.constraints.Size; +import javax.xml.bind.annotation.XmlTransient; + +import com.fasterxml.jackson.annotation.JsonIdentityInfo; +import com.fasterxml.jackson.annotation.ObjectIdGenerators; +import org.hibernate.annotations.SortNatural; +import org.hibernate.annotations.Type; + +/** + * Model for Documents with anotations for storage and serialization + * + * @author Florent Descroix {@literal } + */ +@Entity +@Table(name = "documents") + +@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id", scope = Document.class) +public class Document extends AbstractDatedEntity implements Serializable { + + /** + * + */ + private static final long serialVersionUID = 8507685898376675066L; + + @Size(max = 255) + @Column(name = "name") + private String name; + + @Size(max = 255) + @Column(name = "author") + private String author; + + @Lob + @Type(type = "org.hibernate.type.TextType") + @Column(name = "content") + private String content; + + @JoinColumn(name = "category_id", referencedColumnName = "id") + @ManyToOne(optional = false) + private Category category; + + @OneToMany(mappedBy = "document") + @SortNatural + private SortedSet debates = new TreeSet<>(); + + @Column(name = "debates_count") + private Integer debatesCount = 0; + + /** + * + * @return + */ + public String getName() { + return name; + } + + /** + * + * @param name + */ + public void setName(String name) { + this.name = name; + } + + /** + * + * @return + */ + public String getAuthor() { + return author; + } + + /** + * + * @param author + */ + public void setAuthor(String author) { + this.author = author; + } + + /** + * + * @return + */ + public String getContent() { + return content; + } + + /** + * + * @param content + */ + public void setContent(String content) { + this.content = content; + } + + /** + * + * @return + */ + public Category getCategory() { + return category; + } + + /** + * + * @param category + */ + public void setCategory(Category category) { + this.category = category; + } + + /** + * + * @return + */ + @XmlTransient + public SortedSet getDebates() { + return debates; + } + + /** + * + * @param debates + */ + public void setDebates(SortedSet debates) { + this.debates = debates; + } + + /** + * + * @return + */ + public Integer getDebatesCount() { + return debatesCount; + } + + /** + * + * @param debatesCount + */ + public void setDebatesCount(Integer debatesCount) { + this.debatesCount = debatesCount; + } + + /** + * + * @return + */ + @Override + public boolean isEditable() { + return debates.isEmpty(); + } + + /** + * + * @return + */ + @Override + public boolean isRemovable() { + return debates.isEmpty(); + } +} diff --git a/src/main/java/fr/lirmm/aren/model/Institution.java b/src/main/java/fr/lirmm/aren/model/Institution.java new file mode 100644 index 0000000..c6d5a07 --- /dev/null +++ b/src/main/java/fr/lirmm/aren/model/Institution.java @@ -0,0 +1,164 @@ +package fr.lirmm.aren.model; + +import java.io.Serializable; +import java.util.TreeSet; +import java.util.SortedSet; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.OneToMany; +import javax.persistence.Table; +import javax.validation.constraints.Size; +import javax.xml.bind.annotation.XmlTransient; + +import com.fasterxml.jackson.annotation.JsonIdentityInfo; +import com.fasterxml.jackson.annotation.ObjectIdGenerators; +import org.hibernate.annotations.SortNatural; +import org.hibernate.annotations.Where; + +/** + * Model for Institutions with anotations for storage and serialization + * + * @author Florent Descroix {@literal } + */ +@Entity +@Table(name = "institutions") +@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id", scope = Institution.class) +public class Institution extends AbstractEntEntity implements Serializable { + + /** + * + */ + private static final long serialVersionUID = 4125013973438656239L; + + @Size(max = 255) + @Column(name = "type") + private String type; + + @Size(max = 255) + @Column(name = "name") + private String name; + + @Size(max = 255) + @Column(name = "academy") + private String academy; + + @OneToMany(mappedBy = "institution") + @Where(clause = "is_active = true") + @SortNatural + private SortedSet users = new TreeSet(); + + @OneToMany(mappedBy = "institution") + @SortNatural + private SortedSet teams = new TreeSet(); + + /** + * + * @return + */ + public String getName() { + return name; + } + + /** + * + * @param name + */ + public void setName(String name) { + this.name = name; + } + + /** + * + * @return + */ + public String getType() { + return type; + } + + /** + * + * @param type + */ + public void setType(String type) { + this.type = type; + } + + /** + * + * @return + */ + public String getAcademy() { + return academy; + } + + /** + * + * @param academy + */ + public void setAcademy(String academy) { + this.academy = academy; + } + + /** + * + * @return + */ + @XmlTransient + public SortedSet getUsers() { + return users; + } + + /** + * + * @param users + */ + public void setUsers(SortedSet users) { + this.users = users; + } + + /** + * + * @return + */ + public SortedSet getTeams() { + return teams; + } + + /** + * + * @param teams + */ + public void setTeams(SortedSet teams) { + this.teams = teams; + } + + /** + * + * @param team + */ + public void addTeam(Team team) { + team.setInstitution(this); + this.teams.add(team); + + } + + /** + * + * @return + */ + @Override + public boolean isEditable() { + return true; + } + + /** + * + * @return + */ + @Override + public boolean isRemovable() { + return true; + } + +} diff --git a/src/main/java/fr/lirmm/aren/model/Notification.java b/src/main/java/fr/lirmm/aren/model/Notification.java new file mode 100644 index 0000000..df9b686 --- /dev/null +++ b/src/main/java/fr/lirmm/aren/model/Notification.java @@ -0,0 +1,198 @@ +package fr.lirmm.aren.model; + +import java.io.Serializable; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Table; + +import com.fasterxml.jackson.annotation.JsonIdentityInfo; +import com.fasterxml.jackson.annotation.JsonIdentityReference; +import com.fasterxml.jackson.annotation.ObjectIdGenerators; +import fr.lirmm.aren.model.ws.Message; +import javax.persistence.JoinColumn; +import javax.persistence.Lob; +import javax.persistence.ManyToOne; + +/** + * Model for Notifications with anotations for storage and serialization + * + * @author Florent Descroix {@literal } + */ +@Entity +@Table(name = "notifications") + +@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id", scope = Notification.class) +public class Notification extends AbstractOwnedEntity implements Serializable { + + /** + * + */ + private static final long serialVersionUID = 6593370506138662915L; + + @Lob + private Message content; + + @Column(name = "is_unread") + private boolean unread = true; + + @JsonIdentityReference(alwaysAsId = true) + @JoinColumn(name = "debate_id", referencedColumnName = "id", updatable = false) + @ManyToOne() + private Debate debate; + + @JsonIdentityReference(alwaysAsId = true) + @JoinColumn(name = "comment_id", referencedColumnName = "id", updatable = false) + @ManyToOne() + private Comment comment; + + /** + * + */ + public Notification() { + } + + private Notification(User owner, Debate debate, Comment comment) { + this.owner = owner; + this.debate = debate; + this.comment = comment; + } + + /** + * + * @param comment + * @return + */ + public static Notification COMMENT_MODERATED(Comment comment) { + Notification n = new Notification(comment.getOwner(), comment.getDebate(), comment); + n.content = new Message("comment_moderated"); + n.content.addDetail("debateName", comment.getDebate().getDocument().getName()); + return n; + } + + /** + * + * @param modo + * @param comment + * @return + */ + public static Notification COMMENT_SINGNALED(User modo, Comment comment) { + Notification n = new Notification(modo, comment.getDebate(), comment); + n.content = new Message("comment_signaled"); + n.content.addDetail("debateName", comment.getDebate().getDocument().getName()); + return n; + } + + /** + * + * @param owner + * @param comment + * @return + */ + public static Notification COMMENT_ANSWERED(User owner, Comment comment) { + Notification n = new Notification(owner, comment.getDebate(), comment); + n.content = new Message("comment_answered"); + n.content.addDetail("firstName", comment.getOwner().getFirstName()); + n.content.addDetail("lastName", comment.getOwner().getLastName()); + return n; + } + + /** + * + * @param owner + * @param debate + * @return + */ + public static Notification INVITED_TO_DEBATE(User owner, Debate debate) { + Notification n = new Notification(owner, debate, null); + n.content = new Message("invited_to_debate"); + n.content.addDetail("debateName", debate.getDocument().getName()); + return n; + } + + /** + * + * @param owner + * @param debate + * @param team + * @return + */ + public static Notification TEAM_ADDED_TO_DEBATE(User owner, Debate debate, Team team) { + Notification n = new Notification(owner, debate, null); + n.content = new Message("team_added_to_debate"); + n.content.addDetail("debateName", debate.getDocument().getName()); + n.content.addDetail("teamName", team.getName()); + return n; + } + + /** + * + * @return + */ + public Message getContent() { + return content; + } + + /** + * + * @param content + */ + public void setContent(Message content) { + this.content = content; + } + + /** + * + * @return + */ + public boolean isUnread() { + return unread; + } + + /** + * + * @param unread + */ + public void setUnread(boolean unread) { + this.unread = unread; + } + + /** + * + * @return + */ + public Debate getDebate() { + return debate; + } + + /** + * + * @param debate + */ + public void setDebate(Debate debate) { + this.debate = debate; + } + + /** + * + * @return + */ + public Comment getComment() { + return comment; + } + + /** + * + * @param comment + */ + public void setComment(Comment comment) { + this.comment = comment; + } + + @JsonIdentityReference(alwaysAsId = true) + @Override + public User getOwner() { + return super.getOwner(); + } + +} diff --git a/src/main/java/fr/lirmm/aren/model/TagSet.java b/src/main/java/fr/lirmm/aren/model/TagSet.java new file mode 100644 index 0000000..86d88b7 --- /dev/null +++ b/src/main/java/fr/lirmm/aren/model/TagSet.java @@ -0,0 +1,205 @@ +package fr.lirmm.aren.model; + +import java.io.Serializable; +import java.util.HashSet; +import java.util.stream.Collectors; +import javax.persistence.AttributeConverter; + +/** + * + * @author florent + */ +public class TagSet extends HashSet { + + /** + * + */ + public TagSet() { + super(); + } + + /** + * + * @param serial + */ + public TagSet(String serial) { + this(); + for (String tagSerial : serial.split("\\*")) { + if (tagSerial.length() > 0) { + this.add(new Tag(tagSerial)); + } + } + } + + /** + * + * @param tag + * @return + */ + @Override + public boolean add(Tag tag) { + this.remove(tag); + return super.add(tag); + } + + /** + * + * @return + */ + @Override + public String toString() { + java.util.List tagString = this.stream().map((Tag tag) -> { + return tag.toString(); + }).collect(Collectors.toList()); + return String.join("*", tagString); + } + + /** + * + */ + @javax.persistence.Converter(autoApply = true) + public static class Converter implements AttributeConverter { + + /** + * + * @param x + * @return + */ + @Override + public String convertToDatabaseColumn(TagSet x) { + if (x == null) { + return null; + } + return x.toString(); + } + + /** + * + * @param y + * @return + */ + @Override + public TagSet convertToEntityAttribute(String y) { + if (y == null) { + return null; + } + return new TagSet(y); + } + } + + /** + * + */ + public static class Tag implements Serializable { + + private String value; + private boolean negative = false; + private Float power = 0f; + + /** + * + */ + public Tag() { + } + + /** + * + * @param serial + */ + public Tag(String serial) { + String[] split = serial.split("\\|"); + if (split.length == 2) { + split[1] = split[1].trim(); + this.power = Float.parseFloat(split[1]); + } + split[0] = split[0].trim(); + if (split[0].startsWith("-")) { + this.negative = true; + this.value = split[0].substring(1).trim(); + } else { + this.negative = false; + this.value = split[0]; + } + } + + /** + * + * @return + */ + public String getValue() { + return value; + } + + /** + * + * @param value + */ + public void setValue(String value) { + this.value = value; + } + + /** + * + * @return + */ + public boolean isNegative() { + return negative; + } + + /** + * + * @param negative + */ + public void setNegative(boolean negative) { + this.negative = negative; + } + + /** + * + * @return + */ + public Float getPower() { + return power; + } + + /** + * + * @param power + */ + public void setPower(Float power) { + this.power = power; + } + + /** + * + * @return + */ + @Override + public String toString() { + return (this.negative ? "-" : "") + this.value + (this.power == 0f ? "" : "|" + Float.toString(this.power)); + } + + /** + * + * @param t + * @return + */ + @Override + public boolean equals(Object t) { + if (t instanceof Tag) { + return this.value.equals(((Tag) t).value); + } else { + throw new IllegalArgumentException("Compared object should be a Tag"); + } + } + + /** + * + * @return + */ + @Override + public int hashCode() { + return this.value.hashCode(); + } + } +} diff --git a/src/main/java/fr/lirmm/aren/model/Team.java b/src/main/java/fr/lirmm/aren/model/Team.java new file mode 100644 index 0000000..1c077dc --- /dev/null +++ b/src/main/java/fr/lirmm/aren/model/Team.java @@ -0,0 +1,199 @@ +package fr.lirmm.aren.model; + +import java.io.Serializable; +import java.util.TreeSet; +import java.util.SortedSet; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToMany; +import javax.persistence.ManyToOne; +import javax.persistence.Table; +import javax.validation.constraints.Size; +import javax.xml.bind.annotation.XmlTransient; + +import com.fasterxml.jackson.annotation.JsonIdentityInfo; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.ObjectIdGenerators; +import org.hibernate.annotations.SortNatural; +import org.hibernate.annotations.Where; + +/** + * Model for Teams with anotations for storage and serialization + * + * @author Florent Descroix {@literal } + */ +@Entity +@Table(name = "teams") +@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id", scope = Team.class) +public class Team extends AbstractEntEntity implements Serializable { + + /** + * + */ + private static final long serialVersionUID = -286738505010538851L; + + @Size(max = 255) + @Column(name = "name") + private String name; + + @Column(name = "is_community", updatable = false) + private boolean community = false; + + @JoinColumn(name = "institution_id", referencedColumnName = "id") + @ManyToOne(optional = false) + private Institution institution; + + @ManyToMany(mappedBy = "teams") + @SortNatural + private SortedSet debates = new TreeSet<>(); + + @ManyToMany(mappedBy = "teams") + @Where(clause = "is_active = true") + @SortNatural + private SortedSet users = new TreeSet<>(); + + @JsonProperty(access = JsonProperty.Access.READ_ONLY) + @Column(name = "debates_count") + private Integer debatesCount = 0; + + @JsonProperty(access = JsonProperty.Access.READ_ONLY) + @Column(name = "users_count") + private Integer usersCount = 0; + + /** + * + * @return + */ + public String getName() { + return name; + } + + /** + * + * @param name + */ + public void setName(String name) { + this.name = name; + } + + /** + * + * @return + */ + public boolean isCommunity() { + return community; + } + + /** + * + * @param community + */ + public void setCommunity(boolean community) { + this.community = community; + } + + /** + * + * @return + */ + public Institution getInstitution() { + return institution; + } + + /** + * + * @param institution + */ + public void setInstitution(Institution institution) { + this.institution = institution; + } + + /** + * + * @return + */ + @XmlTransient + public SortedSet getDebates() { + return debates; + } + + /** + * + * @param debates + */ + public void setDebates(SortedSet debates) { + this.debates = debates; + } + + /** + * + * @return + */ + @XmlTransient + public SortedSet getUsers() { + return users; + } + + /** + * + * @param users + */ + public void setUsers(SortedSet users) { + this.users = users; + } + + /** + * + * @param user + */ + public void addUser(User user) { + this.users.add(user); + user.getTeams().add(this); + } + + /** + * + * @param user + */ + public void removeUser(User user) { + this.users.remove(user); + user.getTeams().remove(this); + } + + /** + * + * @return + */ + public Integer getDebatesCount() { + return debatesCount; + } + + /** + * + * @return + */ + public Integer getUsersCount() { + return usersCount; + } + + /** + * + * @return + */ + @Override + public boolean isEditable() { + return getEntId() == null; + } + + /** + * + * @return + */ + @Override + public boolean isRemovable() { + return getEntId() == null; + } + +} diff --git a/src/main/java/fr/lirmm/aren/model/User.java b/src/main/java/fr/lirmm/aren/model/User.java new file mode 100644 index 0000000..9a7c960 --- /dev/null +++ b/src/main/java/fr/lirmm/aren/model/User.java @@ -0,0 +1,455 @@ +package fr.lirmm.aren.model; + +import java.io.Serializable; +import java.util.TreeSet; +import java.util.SortedSet; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToMany; +import javax.persistence.ManyToOne; +import javax.persistence.OneToMany; +import javax.persistence.Table; +import javax.validation.constraints.Pattern; +import javax.validation.constraints.Size; +import javax.xml.bind.annotation.XmlTransient; + +import com.fasterxml.jackson.annotation.JsonIdentityInfo; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.ObjectIdGenerators; +import java.time.ZonedDateTime; +import java.time.temporal.ChronoUnit; + +import javax.persistence.JoinTable; +import org.hibernate.annotations.Filter; +import org.hibernate.annotations.Filters; +import org.hibernate.annotations.SortNatural; + +/** + * Model for Users with anotations for storage and serialization + * + * @author Florent Descroix {@literal } + */ +@Entity +@Table(name = "users") +@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id", scope = User.class) +@Filters({ + @Filter(name = "isActive", condition = "active = true") +}) +public class User extends AbstractEntEntity implements Serializable { + + /** + * + */ + private static final long serialVersionUID = 9143251821521688592L; + + /** + * + */ + public enum Authority { + + /** + * + */ + DELETED, + /** + * + */ + GUEST, + /** + * + */ + USER, + /** + * + */ + MODO, + /** + * + */ + ADMIN, + /** + * + */ + SUPERADMIN + } + + @Size(max = 255) + @Column(name = "username", unique = true) + private String username; + + @Size(max = 255) + @Column(name = "first_name") + private String firstName; + + @Size(max = 255) + @Column(name = "last_name") + private String lastName; + + @Pattern(regexp = "[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?", message = "Invalid email")//if the field contains email address consider using this annotation to enforce field validation + @Size(max = 255) + @Column(name = "email", unique = true) + private String email; + + @Column(name = "last_login") + private ZonedDateTime lastLogin; + + @JsonIgnore + @Column(name = "token_validity") + private ZonedDateTime tokenValidity = ZonedDateTime.now().truncatedTo(ChronoUnit.SECONDS); + + @JsonProperty(access = JsonProperty.Access.WRITE_ONLY) + @Column(name = "password") + private String password; + + @JsonIgnore + @Column(name = "is_active") + private boolean active = true; + + @ManyToMany(mappedBy = "guests") + @SortNatural + private SortedSet invitedDebates = new TreeSet<>(); + + @OneToMany(mappedBy = "owner") + @SortNatural + private SortedSet comments = new TreeSet<>(); + + @OneToMany(mappedBy = "owner") + @SortNatural + private SortedSet createdDebates = new TreeSet<>(); + + @JoinColumn(name = "institution_id", referencedColumnName = "id") + @ManyToOne(optional = false) + private Institution institution; + + @JoinTable(name = "teams_users", + joinColumns = { + @JoinColumn(name = "user_id", referencedColumnName = "id")}, + inverseJoinColumns = { + @JoinColumn(name = "team_id", referencedColumnName = "id")}) + @ManyToMany + @SortNatural + private SortedSet teams = new TreeSet<>(); + + @OneToMany(mappedBy = "owner") + @SortNatural + private SortedSet notifications = new TreeSet<>(); + + @Enumerated(EnumType.STRING) + @Column(name = "authority", nullable = false) + private Authority authority = Authority.GUEST; + + /** + * + * @return + */ + public String getUsername() { + return username; + } + + /** + * + * @param username + */ + public void setUsername(String username) { + this.username = username; + } + + /** + * + * @return + */ + public String getFirstName() { + return firstName; + } + + /** + * + * @param firstName + */ + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + /** + * + * @return + */ + public String getLastName() { + return lastName; + } + + /** + * + * @param lastName + */ + public void setLastName(String lastName) { + this.lastName = lastName; + } + + /** + * + * @return + */ + public String getEmail() { + return email; + } + + /** + * + * @param email + */ + public void setEmail(String email) { + this.email = email; + } + + /** + * + * @return + */ + public ZonedDateTime getLastLogin() { + return lastLogin; + } + + /** + * + * @param lastLogin + */ + public void setLastLogin(ZonedDateTime lastLogin) { + this.lastLogin = lastLogin; + } + + /** + * + * @return + */ + public ZonedDateTime getTokenValidity() { + return tokenValidity; + } + + /** + * + * @param tokenValidity + */ + public void setTokenValidity(ZonedDateTime tokenValidity) { + this.tokenValidity = tokenValidity; + } + + /** + * + * @return + */ + public String getPassword() { + return password; + } + + /** + * + * @param password + */ + public void setPassword(String password) { + this.password = password; + } + + /** + * + * @return + */ + public boolean isActive() { + return active; + } + + /** + * + * @param active + */ + public void setActive(boolean active) { + this.active = active; + } + + /** + * + * @return + */ + @XmlTransient + public SortedSet getInvitedDebates() { + return invitedDebates; + } + + /** + * + * @param invitedDebates + */ + public void setInvitedDebates(SortedSet invitedDebates) { + this.invitedDebates = invitedDebates; + } + + /** + * + * @return + */ + @XmlTransient + public SortedSet getComments() { + return comments; + } + + /** + * + * @param comments + */ + public void setComments(SortedSet comments) { + this.comments = comments; + } + + /** + * + * @return + */ + @XmlTransient + public SortedSet getCreatedDebates() { + return createdDebates; + } + + /** + * + * @param createdDebates + */ + public void setCreatedDebates(SortedSet createdDebates) { + this.createdDebates = createdDebates; + } + + /** + * + * @return + */ + public Institution getInstitution() { + return institution; + } + + /** + * + * @param institution + */ + public void setInstitution(Institution institution) { + this.institution = institution; + } + + /** + * + * @return + */ + public SortedSet getTeams() { + return teams; + } + + /** + * + * @param teams + */ + public void setTeams(SortedSet teams) { + this.teams = teams; + } + + /** + * + * @param team + */ + public void addTeam(Team team) { + teams.add(team); + team.getUsers().add(this); + } + + /** + * + * @param team + */ + public void removeTeams(Team team) { + teams.remove(team); + team.getUsers().remove(this); + } + + /** + * + * @return + */ + @XmlTransient + public SortedSet getNotifications() { + return notifications; + } + + /** + * + * @param notifications + */ + public void setNotifications(SortedSet notifications) { + this.notifications = notifications; + } + + /** + * + * @return + */ + public Authority getAuthority() { + return authority; + } + + /** + * + * @param authority + */ + public void setAuthority(Authority authority) { + this.authority = authority; + } + + /** + * + * @param other + * @return + */ + public boolean hasSameOrMoreRightThan(User other) { + return authority.compareTo(other.getAuthority()) >= 0; + } + + /** + * + * @return + */ + @Override + public boolean isEditable() { + return institution == null; + } + + /** + * + * @return + */ + @Override + public boolean isRemovable() { + return this.getInstitution().getId() == 0L && this.getComments().size() == 0; + } + + /** + * + * @param auth + * @return + */ + public boolean is(Authority auth) { + if (this.getAuthority() == null) { + return Authority.GUEST.compareTo(auth) >= 0; + } + return this.getAuthority().compareTo(auth) >= 0; + } + + /** + * + * @param auth + * @return + */ + public boolean is(String auth) { + return this.is(Authority.valueOf(auth)); + } +} diff --git a/src/main/java/fr/lirmm/aren/model/aaf/AbstractRequest.java b/src/main/java/fr/lirmm/aren/model/aaf/AbstractRequest.java new file mode 100644 index 0000000..9906f60 --- /dev/null +++ b/src/main/java/fr/lirmm/aren/model/aaf/AbstractRequest.java @@ -0,0 +1,77 @@ +package fr.lirmm.aren.model.aaf; + +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlElementWrapper; +import javax.xml.bind.annotation.XmlElements; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlTransient; + +/** + * Part of ficAlimMENESR object, for XML serialization. + * + * @author Florent Descroix {@literal } + */ +@XmlRootElement +public class AbstractRequest { + + @XmlElementWrapper + @XmlElements({ + @XmlElement(name = "attr", type = Attribute.class) + }) + private AttributeList operationalAttributes; + + @XmlElement + private Identifier identifier; + + /** + * + * @return + */ + @XmlTransient + public AttributeList getOperationalAttributes() { + return operationalAttributes; + } + + /** + * + * @param operationalAttributes + */ + public void setOperationalAttributes(AttributeList operationalAttributes) { + this.operationalAttributes = operationalAttributes; + } + + /** + * + * @return + */ + @XmlTransient + public Identifier getIdentifier() { + return identifier; + } + + /** + * + * @param identifier + */ + public void setIdentifier(Identifier identifier) { + this.identifier = identifier; + } + + /** + * + * @return + */ + @XmlTransient + public String getId() { + return identifier.getId(); + } + + /** + * + * @return + */ + @XmlTransient + public AttributeList getAttributes() { + return new AttributeList(); + } +} diff --git a/src/main/java/fr/lirmm/aren/model/aaf/AddRequest.java b/src/main/java/fr/lirmm/aren/model/aaf/AddRequest.java new file mode 100644 index 0000000..d74e2a6 --- /dev/null +++ b/src/main/java/fr/lirmm/aren/model/aaf/AddRequest.java @@ -0,0 +1,41 @@ +package fr.lirmm.aren.model.aaf; + +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlElementWrapper; +import javax.xml.bind.annotation.XmlElements; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlTransient; + +/** + * Specialization of AbstractRequest for Addition. + * + * @author Florent Descroix {@literal } + */ +@XmlRootElement +public class AddRequest extends AbstractRequest { + + @XmlElementWrapper(name = "attributes") + @XmlElements({ + @XmlElement(name = "attr", type = Attribute.class) + }) + private AttributeList attributes; + + /** + * + * @return + */ + @XmlTransient + @Override + public AttributeList getAttributes() { + return attributes; + } + + /** + * + * @param attributes + */ + public void setAttributes(AttributeList attributes) { + this.attributes = attributes; + } + +} diff --git a/src/main/java/fr/lirmm/aren/model/aaf/Attribute.java b/src/main/java/fr/lirmm/aren/model/aaf/Attribute.java new file mode 100644 index 0000000..db364d9 --- /dev/null +++ b/src/main/java/fr/lirmm/aren/model/aaf/Attribute.java @@ -0,0 +1,110 @@ +package fr.lirmm.aren.model.aaf; + +import java.util.Objects; +import java.util.Set; + +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlTransient; + +/** + * Part of AttributeList. + * + * @author Florent Descroix {@literal } + */ +@XmlRootElement +public class Attribute { + + @XmlAttribute(name = "name") + private String name; + + @XmlAttribute(name = "operation") + private String operation; + + @XmlElement(name = "value") + private Set values; + + Attribute() { + } + + Attribute(String name) { + this.name = name; + } + + /** + * + * @return + */ + @XmlTransient + public String getName() { + return name; + } + + /** + * + * @param name + */ + public void setName(String name) { + this.name = name; + } + + /** + * + * @return + */ + @XmlTransient + public String getOperation() { + return operation; + } + + /** + * + * @param operation + */ + public void setOperation(String operation) { + this.operation = operation; + } + + /** + * + * @return + */ + @XmlTransient + public Set getValues() { + return values; + } + + /** + * + * @param values + */ + public void setValues(Set values) { + this.values = values; + } + + /** + * + * @return + */ + @Override + public int hashCode() { + int hash = 7; + hash = 97 * hash + Objects.hashCode(this.name); + return hash; + } + + /** + * + * @param object + * @return + */ + @Override + public boolean equals(Object object) { + if (object instanceof Attribute) { + return this.name.equals(((Attribute) object).getName()); + } else { + return false; + } + } +} diff --git a/src/main/java/fr/lirmm/aren/model/aaf/AttributeList.java b/src/main/java/fr/lirmm/aren/model/aaf/AttributeList.java new file mode 100644 index 0000000..bafc261 --- /dev/null +++ b/src/main/java/fr/lirmm/aren/model/aaf/AttributeList.java @@ -0,0 +1,173 @@ +package fr.lirmm.aren.model.aaf; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.Set; + +import javax.xml.bind.annotation.XmlRootElement; + +import fr.lirmm.aren.model.User.Authority; + +/** + * Part of a Request. + * + * @author Florent Descroix {@literal } + */ +@XmlRootElement +public class AttributeList extends ArrayList { + + /** + * + */ + private static final long serialVersionUID = -5945543842036181814L; + + /** + * + * @param name + * @return + */ + public Set getValuesOf(String name) { + + int i = indexOf(new Attribute(name)); + if (i == -1) { + return new HashSet<>(); + } + return get(i).getValues(); + } + + /** + * + * @param name + * @return + */ + public String getValueOf(String name) { + + int i = indexOf(new Attribute(name)); + if (i == -1) { + return null; + } + return get(i).getValues().iterator().next(); + } + + /** + * + * @return + */ + public String getFirstName() { + return getValueOf(FicAlimMENESR.PERSONNE.FIRST_NAME); + } + + /** + * + * @return + */ + public String getLastName() { + return getValueOf(FicAlimMENESR.PERSONNE.LAST_NAME); + } + + /** + * + * @return + */ + public String getEmail() { + return getValueOf(FicAlimMENESR.PERSONNE.EMAIL); + } + + /** + * + * @return + */ + public Set getClasses() { + if (!getValuesOf(FicAlimMENESR.PERSONNE.CLASSES).isEmpty()) { + return getValuesOf(FicAlimMENESR.PERSONNE.CLASSES); + } else { + return getValuesOf(FicAlimMENESR.STRUCTURE.CLASSES); + } + } + + /** + * + * @return + */ + public Set getGroups() { + if (!getValuesOf(FicAlimMENESR.PERSONNE.GROUPES).isEmpty()) { + return getValuesOf(FicAlimMENESR.PERSONNE.GROUPES); + } else { + return getValuesOf(FicAlimMENESR.STRUCTURE.GROUPES); + } + } + + /** + * + * @return + */ + public String getInstitutionId() { + return getValueOf(FicAlimMENESR.PERSONNE.INSTITUTION); + } + + /** + * + * @return + */ + public String getName() { + return getValueOf(FicAlimMENESR.STRUCTURE.NAME); + } + + /** + * + * @return + */ + public String getCategory() { + if (getValueOf(FicAlimMENESR.CATEGORY.PERSONNE) != null) { + return getValueOf(FicAlimMENESR.CATEGORY.PERSONNE); + } else if (getValueOf(FicAlimMENESR.CATEGORY.STRUCTURE) != null) { + return getValueOf(FicAlimMENESR.CATEGORY.STRUCTURE); + } + return null; + } + + /** + * + * @return + */ + public String getType() { + return getValueOf(FicAlimMENESR.STRUCTURE.TYPE); + } + + /** + * + * @return + */ + public String getAcademy() { + return getValueOf(FicAlimMENESR.STRUCTURE.ACADEMY); + } + + /** + * + * @return + */ + public Authority getAuthority() { + if (getCategory().equals(FicAlimMENESR.PERSONNE.ELEVE)) { + return Authority.USER; + } else if (getCategory().equals(FicAlimMENESR.PERSONNE.ENSEIGNANT) || getCategory().equals(FicAlimMENESR.PERSONNE.EDUC_NAT)) { + return Authority.MODO; + } + return null; + } + + /** + * + * @return + */ + public boolean isUser() { + return getValueOf(FicAlimMENESR.CATEGORY.PERSONNE) != null; + } + + /** + * + * @return + */ + public boolean isInstitution() { + return getValueOf(FicAlimMENESR.CATEGORY.STRUCTURE) != null; + } +} diff --git a/src/main/java/fr/lirmm/aren/model/aaf/DeleteRequest.java b/src/main/java/fr/lirmm/aren/model/aaf/DeleteRequest.java new file mode 100644 index 0000000..1edfe6d --- /dev/null +++ b/src/main/java/fr/lirmm/aren/model/aaf/DeleteRequest.java @@ -0,0 +1,13 @@ +package fr.lirmm.aren.model.aaf; + +import javax.xml.bind.annotation.XmlRootElement; + +/** + * Specialization of AbstractRequest for Deletion. + * + * @author Florent Descroix {@literal } + */ +@XmlRootElement +public class DeleteRequest extends AbstractRequest { + +} diff --git a/src/main/java/fr/lirmm/aren/model/aaf/FicAlimMENESR.java b/src/main/java/fr/lirmm/aren/model/aaf/FicAlimMENESR.java new file mode 100644 index 0000000..12c4e9d --- /dev/null +++ b/src/main/java/fr/lirmm/aren/model/aaf/FicAlimMENESR.java @@ -0,0 +1,155 @@ +package fr.lirmm.aren.model.aaf; + +import java.util.List; + +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlElements; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlTransient; + +/** + * Object to serialize XML AAF file. + * + * @author Florent Descroix {@literal } + */ +@XmlRootElement(name = "ficAlimMENESR") +public class FicAlimMENESR { + + /** + * + */ + public static class CATEGORY { + + /** + * + */ + public static String PERSONNE = "categoriePersonne"; + + /** + * + */ + public static String STRUCTURE = "categorieStructure"; + } + + /** + * + */ + public static class PERSONNE { + + /** + * + */ + public static String ELEVE = "Eleve"; + + /** + * + */ + public static String ENSEIGNANT = "PersRelEleve"; + + /** + * + */ + public static String EDUC_NAT = "PersEducNat"; + + /** + * + */ + public static String LAST_NAME = "sn"; + + /** + * + */ + public static String FIRST_NAME = "givenName"; + + /** + * + */ + public static String EMAIL = "mail"; + + /** + * + */ + public static String CLASSES = "ENTEleveClasses"; + + /** + * + */ + public static String GROUPES = "ENTEleveGroupes"; + + /** + * + */ + public static String INSTITUTION = "ENTPersonStructRattach"; + } + + /** + * + */ + public static class STRUCTURE { + + /** + * + */ + public static String NAME = "ENTStructureNomCourant"; + + /** + * + */ + public static String TYPE = "ENTStructureTypeStruct"; + + /** + * + */ + public static String ACADEMY = "ENTServAcAcademie"; + + /** + * + */ + public static String CLASSES = "ENTStructureClasses"; + + /** + * + */ + public static String GROUPES = "ENTStructureGroupes"; + } + + @XmlElements({ + @XmlElement(name = "addRequest", type = AddRequest.class), + @XmlElement(name = "modifyRequest", type = ModifyRequest.class), + @XmlElement(name = "deleteRequest", type = DeleteRequest.class),}) + private List requests; + + /** + * + * @return + */ + @XmlTransient + public List getRequest() { + return requests; + } + + /** + * + * @param requests + */ + public void setRequest(List requests) { + this.requests = requests; + } + + /** + * + * @return + */ + public int length() { + + int amount = requests.size(); + for (AbstractRequest req : requests) { + if (req.getOperationalAttributes().isInstitution()) { + amount += req.getAttributes().getClasses().size(); + amount += req.getAttributes().getGroups().size(); + } + } + return amount; + } + +} diff --git a/src/main/java/fr/lirmm/aren/model/aaf/Identifier.java b/src/main/java/fr/lirmm/aren/model/aaf/Identifier.java new file mode 100644 index 0000000..a659dfb --- /dev/null +++ b/src/main/java/fr/lirmm/aren/model/aaf/Identifier.java @@ -0,0 +1,35 @@ +package fr.lirmm.aren.model.aaf; + +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlTransient; + +/** + * Part of a Request. + * + * @author Florent Descroix {@literal } + */ +@XmlRootElement +public class Identifier { + + @XmlElement + private String id; + + /** + * + * @return + */ + @XmlTransient + public String getId() { + return id; + } + + /** + * + * @param id + */ + public void setId(String id) { + this.id = id; + } + +} diff --git a/src/main/java/fr/lirmm/aren/model/aaf/ModifyRequest.java b/src/main/java/fr/lirmm/aren/model/aaf/ModifyRequest.java new file mode 100644 index 0000000..f2d2f82 --- /dev/null +++ b/src/main/java/fr/lirmm/aren/model/aaf/ModifyRequest.java @@ -0,0 +1,40 @@ +package fr.lirmm.aren.model.aaf; + +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlElementWrapper; +import javax.xml.bind.annotation.XmlElements; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlTransient; + +/** + * Specialization of AbstractRequest for Modification. + * + * @author Florent Descroix {@literal } + */ +@XmlRootElement +public class ModifyRequest extends AbstractRequest { + + @XmlElementWrapper(name = "modifications") + @XmlElements({ + @XmlElement(name = "modification", type = Attribute.class) + }) + private AttributeList attributes; + + /** + * + * @return + */ + @XmlTransient + @Override + public AttributeList getAttributes() { + return attributes; + } + + /** + * + * @param attributes + */ + public void setAttributes(AttributeList attributes) { + this.attributes = attributes; + } +} diff --git a/src/main/java/fr/lirmm/aren/model/agenda/ACalendar.java b/src/main/java/fr/lirmm/aren/model/agenda/ACalendar.java new file mode 100644 index 0000000..0a65a20 --- /dev/null +++ b/src/main/java/fr/lirmm/aren/model/agenda/ACalendar.java @@ -0,0 +1,88 @@ +package fr.lirmm.aren.model.agenda; +import com.fasterxml.jackson.annotation.JsonIdentityInfo; +import com.fasterxml.jackson.annotation.ObjectIdGenerators; + +import fr.lirmm.aren.model.AbstractEntity; +import fr.lirmm.aren.model.framadate.FDVote; +import org.hibernate.annotations.SortNatural; + +import org.hibernate.annotations.Type; + +import javax.persistence.*; +import javax.validation.constraints.Size; +import java.io.Serializable; +import java.time.ZonedDateTime; +import java.util.SortedSet; +import java.util.TreeSet; +/** + * Model for Calendar with anotations for storage and serialization + * + * @author Havana Andriambolaharimihanta + */ +@Entity +@Table(name = "agenda_calendars") +@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id", scope = ACalendar.class) + +public class ACalendar extends AbstractEntity implements Serializable{ + + @Size(max = 255) + @Column(name = "title") + private String title; + + @Lob + @Type(type = "org.hibernate.type.TextType") + @Column(name = "description") + private String description; + + @Size(max = 1024) + @Column(name = "url") + private String url; + + @Lob + @Type(type = "org.hibernate.type.TextType") + @Column(name = "img") + private String img; + + @Column(name = "date") + private ZonedDateTime date ; + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getImg() { + return img; + } + + public void setImg(String img) { + this.img = img; + } + + public ZonedDateTime getDate() { + return date; + } + + public void setDate(ZonedDateTime date) { + this.date = date; + } +} diff --git a/src/main/java/fr/lirmm/aren/model/framadate/FDChoice.java b/src/main/java/fr/lirmm/aren/model/framadate/FDChoice.java new file mode 100644 index 0000000..a7b1723 --- /dev/null +++ b/src/main/java/fr/lirmm/aren/model/framadate/FDChoice.java @@ -0,0 +1,148 @@ +package fr.lirmm.aren.model.framadate; + +import com.fasterxml.jackson.annotation.JsonIdentityInfo; +import com.fasterxml.jackson.annotation.ObjectIdGenerators; + +import fr.lirmm.aren.model.AbstractEntity; +import org.hibernate.annotations.SortNatural; + +import org.hibernate.annotations.Type; + +import javax.persistence.*; +import javax.validation.constraints.Size; +import java.io.Serializable; +import java.time.ZonedDateTime; +import java.util.SortedSet; +import java.util.TreeSet; +/** + * Model for Choice with anotations for storage and serialization + * + * @author Havana Andriambolaharimihanta + */ +@Entity +@Table(name = "framadate_choices") +@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id", scope = FDChoice.class) +public class FDChoice extends AbstractEntity implements Serializable { + /** + * + */ + private static final long serialVersionUID = -8168612675806856159L; + + @JoinColumn(name = "themeId", referencedColumnName = "id") + @ManyToOne(optional = false) + private FDTheme themeId; + + @Size(max = 255) + @Column(name = "title") + private String title; + + @Lob + @Type(type = "org.hibernate.type.TextType") + @Column(name = "description") + private String description; + + @Size(max = 1024) + @Column(name = "url") + private String url; + + @Lob + @Type(type = "org.hibernate.type.TextType") + @Column(name = "img") + private String img; + + @Column(name = "_for") + private int _for=0; + + @Column(name = "neutral") + private int neutral=0; + + @Column(name = "against") + private int against=0; + + @Column(name = "createdAt") + private ZonedDateTime createdAt=ZonedDateTime.now(); + + @OneToMany(mappedBy = "subThemeId") + @SortNatural + private SortedSet votes = new TreeSet<>(); + + public FDTheme getThemeId() { + return themeId; + } + + public void setThemeId(FDTheme themeId) { + this.themeId = themeId; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getImg() { + return img; + } + + public void setImg(String img) { + this.img = img; + } + + public int getFor() { + return _for; + } + + public void setFor(int aFor) { + _for = aFor; + } + + public int getNeutral() { + return neutral; + } + + public void setNeutral(int neutral) { + this.neutral = neutral; + } + + public int getAgainst() { + return against; + } + + public void setAgainst(int against) { + this.against = against; + } + + public ZonedDateTime getCreatedAt() { + return createdAt; + } + + public void setCreatedAt(ZonedDateTime createdAt) { + this.createdAt = createdAt; + } + + public SortedSet getVotes() { + return votes; + } + + public void setVotes(SortedSet votes) { + this.votes = votes; + } +} \ No newline at end of file diff --git a/src/main/java/fr/lirmm/aren/model/framadate/FDTheme.java b/src/main/java/fr/lirmm/aren/model/framadate/FDTheme.java new file mode 100644 index 0000000..e99c385 --- /dev/null +++ b/src/main/java/fr/lirmm/aren/model/framadate/FDTheme.java @@ -0,0 +1,103 @@ +package fr.lirmm.aren.model.framadate; + +import com.fasterxml.jackson.annotation.JsonIdentityInfo; +import com.fasterxml.jackson.annotation.ObjectIdGenerators; + +import fr.lirmm.aren.model.AbstractEntity; +import fr.lirmm.aren.model.User; +import org.hibernate.annotations.SortNatural; + +import org.hibernate.annotations.Type; + +import javax.persistence.*; +import javax.validation.constraints.Size; +import java.io.Serializable; +import java.time.ZonedDateTime; +import java.util.SortedSet; +import java.util.TreeSet; + +/** + * Model for Theme with anotations for storage and serialization + * + * @author Havana Andriambolaharimihanta + */ +@Entity +@Table(name = "framadate_themes") +@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id", scope = FDTheme.class) +public class FDTheme extends AbstractEntity implements Serializable { + /** + * + */ + private static final long serialVersionUID = 7247587622965201146L; + + @JoinColumn(name = "author", referencedColumnName = "id") + @ManyToOne + private User author; + + @Size(max = 255) + @Column(name = "title") + private String title; + + @Lob + @Type(type = "org.hibernate.type.TextType") + @Column(name = "description") + private String description; + + @Column(name = "createdAt") + private ZonedDateTime createdAt=ZonedDateTime.now(); + + @Column(name = "expiracyDate") + private ZonedDateTime expiracyDate; + + @OneToMany(mappedBy = "themeId") + @SortNatural + private SortedSet choices = new TreeSet<>(); + + public User getAuthor() { + return author; + } + + public void setAuthor(User author) { + this.author = author; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public ZonedDateTime getCreatedAt() { + return createdAt; + } + + public void setCreatedAt(ZonedDateTime createdAt) { + this.createdAt = createdAt; + } + + public ZonedDateTime getExpiracyDate() { + return expiracyDate; + } + + public void setExpiracyDate(ZonedDateTime expiracyDate) { + this.expiracyDate = expiracyDate; + } + + public SortedSet getChoices() { + return choices; + } + + public void setChoices(SortedSet choices) { + this.choices = choices; + } +} \ No newline at end of file diff --git a/src/main/java/fr/lirmm/aren/model/framadate/FDVote.java b/src/main/java/fr/lirmm/aren/model/framadate/FDVote.java new file mode 100644 index 0000000..a91b63b --- /dev/null +++ b/src/main/java/fr/lirmm/aren/model/framadate/FDVote.java @@ -0,0 +1,73 @@ +package fr.lirmm.aren.model.framadate; +import com.fasterxml.jackson.annotation.JsonIdentityInfo; +import com.fasterxml.jackson.annotation.ObjectIdGenerators; + +import fr.lirmm.aren.model.AbstractEntity; +import fr.lirmm.aren.model.User; + +import javax.persistence.*; +import java.io.Serializable; +import java.time.ZonedDateTime; +/** + * Model for Vote with anotations for storage and serialization + * + * @author Havana Andriambolaharimihanta + */ +@Entity +@Table(name = "framadate_votes") +@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id", scope = FDVote.class) +public class FDVote extends AbstractEntity implements Serializable{ + + + @ManyToOne + @JoinColumn(name = "subThemeId") + private FDChoice subThemeId; + + + @ManyToOne + @JoinColumn(name = "authorId") + private User authorId ; + + @Column(name = "opinion") + private String opinion="NEUTRAL"; + + @Column(name = "createdAt") + private ZonedDateTime createdAt=ZonedDateTime.now(); + + public FDChoice getSubThemeId() { + return subThemeId; + } + + public void setSubThemeId(FDChoice subThemeId) { + this.subThemeId = subThemeId; + } + + public User getAuthorId() { + return authorId; + } + + public void setAuthorId(User authorId) { + this.authorId = authorId; + } + + public String getOpinion() { + return opinion; + } + + public void setOpinion(String opinion) { + this.opinion = opinion; + } + + public ZonedDateTime getCreatedAt() { + return createdAt; + } + + public void setCreatedAt(ZonedDateTime createdAt) { + this.createdAt = createdAt; + } + + @Override + public String toString(){ + return getId()+" == "+getOpinion() ; + } +} \ No newline at end of file diff --git a/src/main/java/fr/lirmm/aren/model/ws/ApiErrorDetails.java b/src/main/java/fr/lirmm/aren/model/ws/ApiErrorDetails.java new file mode 100644 index 0000000..1c0bd0f --- /dev/null +++ b/src/main/java/fr/lirmm/aren/model/ws/ApiErrorDetails.java @@ -0,0 +1,69 @@ +package fr.lirmm.aren.model.ws; + +/** + * Data transfer object that holds details about an API error. + * + * @author Florent Descroix {@literal } + */ + +public class ApiErrorDetails extends Message { + + private Integer status; + private String title; + private String path; + + /** + * + */ + public ApiErrorDetails() { + + } + + /** + * + * @return + */ + public Integer getStatus() { + return status; + } + + /** + * + * @param status + */ + public void setStatus(Integer status) { + this.status = status; + } + + /** + * + * @return + */ + public String getTitle() { + return title; + } + + /** + * + * @param title + */ + public void setTitle(String title) { + this.title = title; + } + + /** + * + * @return + */ + public String getPath() { + return path; + } + + /** + * + * @param path + */ + public void setPath(String path) { + this.path = path; + } +} diff --git a/src/main/java/fr/lirmm/aren/model/ws/ChangePassword.java b/src/main/java/fr/lirmm/aren/model/ws/ChangePassword.java new file mode 100644 index 0000000..6057701 --- /dev/null +++ b/src/main/java/fr/lirmm/aren/model/ws/ChangePassword.java @@ -0,0 +1,50 @@ +package fr.lirmm.aren.model.ws; + +/** + * + * @author florent + */ +public class ChangePassword { + + private String password; + private String newPassword; + + /** + * + */ + public ChangePassword() { + } + + /** + * + * @return + */ + public String getPassword() { + return password; + } + + /** + * + * @param password + */ + public void setPassword(String password) { + this.password = password; + } + + /** + * + * @return + */ + public String getNewPassword() { + return newPassword; + } + + /** + * + * @param newPassword + */ + public void setNewPassword(String newPassword) { + this.newPassword = newPassword; + } + +} diff --git a/src/main/java/fr/lirmm/aren/model/ws/Message.java b/src/main/java/fr/lirmm/aren/model/ws/Message.java new file mode 100644 index 0000000..b855dea --- /dev/null +++ b/src/main/java/fr/lirmm/aren/model/ws/Message.java @@ -0,0 +1,88 @@ +package fr.lirmm.aren.model.ws; + +import java.util.HashMap; + +import com.fasterxml.jackson.annotation.JsonInclude; +import javax.persistence.Embeddable; + +/** + * Data transfer object that holds details about an API error. + * + * @author Florent Descroix {@literal } + */ +@Embeddable +@JsonInclude(JsonInclude.Include.NON_NULL) +public class Message { + + private String message; + + private HashMap details = new HashMap(); + + /** + * + */ + public Message() { + + } + + /** + * + * @param string + */ + public Message(String message) { + this.message = message; + } + + /** + * + * @return + */ + public String paseMessage() { + String result = this.message; + details.forEach((String label, String value) -> { + result.replace("{"+label+"}", value); + }); + return result; + } + + /** + * + * @return + */ + public String getMessage() { + return message; + } + + /** + * + * @param message + */ + public void setMessage(String message) { + this.message = message; + } + + /** + * + * @return + */ + public HashMap getDetails() { + return details; + } + + /** + * + * @param details + */ + public void setDetails(HashMap details) { + this.details = details; + } + + /** + * + * @param name + * @param value + */ + public void addDetail(String name, String value) { + this.details.put(name, value); + } +} diff --git a/src/main/java/fr/lirmm/aren/model/ws/Scrap.java b/src/main/java/fr/lirmm/aren/model/ws/Scrap.java new file mode 100644 index 0000000..8a95506 --- /dev/null +++ b/src/main/java/fr/lirmm/aren/model/ws/Scrap.java @@ -0,0 +1,229 @@ +package fr.lirmm.aren.model.ws; + +import com.fasterxml.jackson.annotation.JsonIdentityReference; +import fr.lirmm.aren.model.Comment; +import java.util.HashSet; +import java.util.Set; + +/** + * + * @author florent + */ +public class Scrap implements Comparable { + + /** + * + */ + public static int ALL_BEFORE = -3; + + /** + * + */ + public static int OVER_BEFORE = -2; + + /** + * + */ + public static int COVERS = -1; + + /** + * + */ + public static int EQUALS = 0; + + /** + * + */ + public static int BELONGS = 1; + + /** + * + */ + public static int OVER_AFTER = 2; + + /** + * + */ + public static int ALL_AFTER = 3; + + private String startContainer; + + private Long startOffset; + + private String endContainer; + + private Long endOffset; + + @JsonIdentityReference(alwaysAsId = true) + private Set comments = new HashSet<>(); + + /** + * + */ + public Scrap() { + } + + /** + * + * @return + */ + public String getStartContainer() { + return startContainer; + } + + /** + * + * @param startContainer + */ + public void setStartContainer(String startContainer) { + this.startContainer = startContainer; + } + + /** + * + * @return + */ + public Long getStartOffset() { + return startOffset; + } + + /** + * + * @param startOffset + */ + public void setStartOffset(Long startOffset) { + this.startOffset = startOffset; + } + + /** + * + * @return + */ + public String getEndContainer() { + return endContainer; + } + + /** + * + * @param endContainer + */ + public void setEndContainer(String endContainer) { + this.endContainer = endContainer; + } + + /** + * + * @return + */ + public Long getEndOffset() { + return endOffset; + } + + /** + * + * @param endOffset + */ + public void setEndOffset(Long endOffset) { + this.endOffset = endOffset; + } + + /** + * + * @return + */ + public Set getComments() { + return comments; + } + + /** + * + * @param comments + */ + public void setComments(Set comments) { + this.comments = comments; + } + + private int comparePosition(String[] pos1, String[] pos2) { + if (pos1.equals(pos2)) { + return 0; + } + int len = Math.max(pos1.length, pos2.length); + for (int i = 0; i < len; i++) { + if (i >= pos1.length || i < pos2.length && Integer.parseInt(pos1[i]) < Integer.parseInt(pos2[i])) { + return -1; + } else if (i >= pos2.length || i < pos1.length && Integer.parseInt(pos1[i]) > Integer.parseInt(pos2[i])) { + return 1; + } + } + return 0; + } + + /** + * + * @param other + * @return + */ + public boolean equals(Scrap other) { + return this.startContainer.equals(other.startContainer) + && this.startOffset.equals(other.startOffset) + && this.endContainer.equals(other.endContainer) + && this.endOffset.equals(other.endOffset); + } + + /** + * + * @param t + * @return + */ + @Override + public int compareTo(Object t) { + if (!(t instanceof Scrap)) { + throw new IllegalArgumentException("Compared object should be a Scrap"); + } + Scrap other = (Scrap) t; + + int StS = comparePosition( + (this.startContainer + "/" + this.startOffset).split("/"), + (other.startContainer + "/" + other.startOffset).split("/")); + int StE = comparePosition( + (this.startContainer + "/" + this.startOffset).split("/"), + (other.endContainer + "/" + other.endOffset).split("/")); + int EtS = comparePosition( + (this.endContainer + "/" + this.endOffset).split("/"), + (other.startContainer + "/" + other.startOffset).split("/")); + int EtE = comparePosition( + (this.endContainer + "/" + this.endOffset).split("/"), + (other.endContainer + "/" + other.endOffset).split("/")); + + if (StS == 0 && EtE == 0) { + return Scrap.EQUALS; + } + if (EtS <= 0) { + return Scrap.ALL_BEFORE; + } + if (StE >= 0) { + return Scrap.ALL_AFTER; + } + if (StS <= 0 && EtE >= 0) { + return Scrap.COVERS; + } + if (StS >= 0 && EtE <= 0) { + return Scrap.BELONGS; + } + if (StS <= 0) { + return Scrap.OVER_BEFORE; + } + if (StS >= 0) { + return Scrap.OVER_AFTER; + } + throw new IllegalArgumentException("Imposible possitioning"); + } + + /** + * + * @return + */ + public String toString() { + return this.startContainer + "/" + this.startOffset + " > " + this.endContainer + "/" + this.endOffset; + } +} diff --git a/src/main/java/fr/lirmm/aren/model/ws/UserCredentials.java b/src/main/java/fr/lirmm/aren/model/ws/UserCredentials.java new file mode 100644 index 0000000..6cf4a9c --- /dev/null +++ b/src/main/java/fr/lirmm/aren/model/ws/UserCredentials.java @@ -0,0 +1,68 @@ +package fr.lirmm.aren.model.ws; + +/** + * API model for the user credentials. + * + * @author Florent Descroix {@literal } + */ +public class UserCredentials { + + private String username; + private String password; + private boolean rememberMe; + + /** + * + */ + public UserCredentials() { + + } + + /** + * + * @return + */ + public String getUsername() { + return username; + } + + /** + * + * @param username + */ + public void setUsername(String username) { + this.username = username; + } + + /** + * + * @return + */ + public String getPassword() { + return password; + } + + /** + * + * @param password + */ + public void setPassword(String password) { + this.password = password; + } + + /** + * + * @return + */ + public boolean isRememberMe() { + return rememberMe; + } + + /** + * + * @param rememberMe + */ + public void setRememberMe(boolean rememberMe) { + this.rememberMe = rememberMe; + } +} diff --git a/src/main/java/fr/lirmm/aren/producer/Configurable.java b/src/main/java/fr/lirmm/aren/producer/Configurable.java new file mode 100644 index 0000000..a471f50 --- /dev/null +++ b/src/main/java/fr/lirmm/aren/producer/Configurable.java @@ -0,0 +1,31 @@ +package fr.lirmm.aren.producer; + +import static java.lang.annotation.ElementType.FIELD; +import static java.lang.annotation.ElementType.METHOD; +import static java.lang.annotation.ElementType.PARAMETER; +import static java.lang.annotation.ElementType.TYPE; +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +import java.lang.annotation.Retention; +import java.lang.annotation.Target; + +import javax.enterprise.util.Nonbinding; +import javax.inject.Qualifier; + +/** + * CDI qualifier for injecting configurable values. + * + * @author Florent Descroix {@literal } + */ +@Qualifier +@Retention(RUNTIME) +@Target({TYPE, METHOD, FIELD, PARAMETER}) +public @interface Configurable { + + /** + * + * @return + */ + @Nonbinding + String value() default ""; +} diff --git a/src/main/java/fr/lirmm/aren/producer/ConfigurationProducer.java b/src/main/java/fr/lirmm/aren/producer/ConfigurationProducer.java new file mode 100644 index 0000000..7b01e19 --- /dev/null +++ b/src/main/java/fr/lirmm/aren/producer/ConfigurationProducer.java @@ -0,0 +1,93 @@ +package fr.lirmm.aren.producer; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Properties; + +import javax.annotation.PostConstruct; +import javax.enterprise.context.ApplicationScoped; +import javax.enterprise.inject.Produces; +import javax.enterprise.inject.spi.InjectionPoint; + +/** + * Read the application.properties file from the classpath and + * produce values that can be injected with @{@link Configurable}. + *

+ * It's a simple and lightweight alternative to the Apache DeltaSpike + * Configuration Mechanism. + * + * @author Florent Descroix {@literal } + */ +@ApplicationScoped +public class ConfigurationProducer { + + private Properties properties; + + /** + * + */ + @PostConstruct + public void init() { + + properties = new Properties(); + InputStream stream = ConfigurationProducer.class.getResourceAsStream("/application.properties"); + + if (stream == null) { + throw new RuntimeException("Cannot find application.properties configuration file."); + } + + try { + this.properties.load(stream); + } catch (final IOException e) { + throw new RuntimeException("Configuration file cannot be loaded."); + } + } + + /** + * + * @param ip + * @return + */ + @Produces + @Configurable + public String produceString(InjectionPoint ip) { + return properties.getProperty(getKey(ip)); + } + + /** + * + * @param ip + * @return + */ + @Produces + @Configurable + public Integer produceInteger(InjectionPoint ip) { + return Integer.valueOf(properties.getProperty(getKey(ip))); + } + + /** + * + * @param ip + * @return + */ + @Produces + @Configurable + public Long produceLong(InjectionPoint ip) { + return Long.valueOf(properties.getProperty(getKey(ip))); + } + + /** + * + * @param ip + * @return + */ + @Produces + @Configurable + public Boolean produceBoolean(InjectionPoint ip) { + return Boolean.valueOf(this.properties.getProperty(getKey(ip))); + } + + private String getKey(InjectionPoint ip) { + return ip.getAnnotated().getAnnotation(Configurable.class).value(); + } +} diff --git a/src/main/java/fr/lirmm/aren/producer/EntityManagerProducer.java b/src/main/java/fr/lirmm/aren/producer/EntityManagerProducer.java new file mode 100644 index 0000000..a3c8e52 --- /dev/null +++ b/src/main/java/fr/lirmm/aren/producer/EntityManagerProducer.java @@ -0,0 +1,88 @@ +package fr.lirmm.aren.producer; + +import static fr.lirmm.aren.producer.Scope.Type.APPLICATION; +import static fr.lirmm.aren.producer.Scope.Type.REQUEST; +import javax.annotation.PostConstruct; +import javax.annotation.PreDestroy; +import javax.enterprise.context.ApplicationScoped; +import javax.enterprise.context.Initialized; +import javax.enterprise.context.RequestScoped; +import javax.enterprise.event.Observes; +import javax.enterprise.inject.Default; +import javax.enterprise.inject.Disposes; +import javax.enterprise.inject.Produces; +import javax.persistence.EntityManager; +import javax.persistence.EntityManagerFactory; +import javax.persistence.Persistence; + +/** + * CDI producer for the JPA {@link EntityManager}. + * + * @author Florent Descroix {@literal } + */ +@ApplicationScoped +public class EntityManagerProducer { + + private EntityManagerFactory factory; + + /** + * + */ + @PostConstruct + public void init() { + factory = Persistence.createEntityManagerFactory("default"); + } + + /** + * + * @return + */ + @Produces + @Default + @Scope(REQUEST) + @RequestScoped + public EntityManager createRequestEntityManager() { + return factory.createEntityManager(); + } + + /** + * + * @return + */ + @Produces + @Scope(APPLICATION) + @ApplicationScoped + public EntityManager createApplicationEntityManager() { + return factory.createEntityManager(); + } + + /** + * + * @param entityManager + */ + public void closeEntityManager(@Disposes EntityManager entityManager) { + if (entityManager.isOpen()) { + entityManager.close(); + } + } + + /** + * + */ + @PreDestroy + public void destroy() { + if (factory.isOpen()) { + factory.close(); + } + } + + // Hack to force the EntityManager provider (Hibernate in this case) to create + // tables and populate the database when the application starts up + /** + * + * @param init + */ + public void init(@Observes @Initialized(ApplicationScoped.class) Object init) { + factory.createEntityManager().close(); + } +} diff --git a/src/main/java/fr/lirmm/aren/producer/Scope.java b/src/main/java/fr/lirmm/aren/producer/Scope.java new file mode 100644 index 0000000..338306a --- /dev/null +++ b/src/main/java/fr/lirmm/aren/producer/Scope.java @@ -0,0 +1,24 @@ +package fr.lirmm.aren.producer; + +import static java.lang.annotation.ElementType.FIELD; +import static java.lang.annotation.ElementType.METHOD; +import java.lang.annotation.Retention; +import static java.lang.annotation.RetentionPolicy.RUNTIME; +import java.lang.annotation.Target; +import javax.inject.Qualifier; + +/** + * + * @author florent + */ +@Qualifier +@Retention(RUNTIME) +@Target({FIELD, METHOD}) +public @interface Scope { + + Type value(); + + enum Type { + REQUEST, SESSION, APPLICATION + }; +} diff --git a/src/main/java/fr/lirmm/aren/security/AuthenticatedUserDetails.java b/src/main/java/fr/lirmm/aren/security/AuthenticatedUserDetails.java new file mode 100644 index 0000000..7331bc0 --- /dev/null +++ b/src/main/java/fr/lirmm/aren/security/AuthenticatedUserDetails.java @@ -0,0 +1,49 @@ +package fr.lirmm.aren.security; + +import java.security.Principal; + +import fr.lirmm.aren.model.User; +import fr.lirmm.aren.model.User.Authority; + +/** + * {@link Principal} implementation with a set of {@link Authority}. + * + * @author Florent Descroix {@literal } + */ +public final class AuthenticatedUserDetails implements Principal { + + private final User user; + + /** + * + * @param user + */ + public AuthenticatedUserDetails(User user) { + this.user = user; + } + + /** + * + * @return the user's authority + */ + public Authority getAuthority() { + return user.getAuthority(); + } + + /** + * + * @return the username + */ + @Override + public String getName() { + return user.getUsername(); + } + + /** + * + * @return the user object + */ + public User getUser() { + return user; + } +} diff --git a/src/main/java/fr/lirmm/aren/security/PasswordEncoder.java b/src/main/java/fr/lirmm/aren/security/PasswordEncoder.java new file mode 100644 index 0000000..4e94ac9 --- /dev/null +++ b/src/main/java/fr/lirmm/aren/security/PasswordEncoder.java @@ -0,0 +1,39 @@ +package fr.lirmm.aren.security; + +import javax.enterprise.context.ApplicationScoped; + +import org.mindrot.jbcrypt.BCrypt; + +/** + * bcrypt password encoder. + * + * @author Florent Descroix {@literal } + */ +@ApplicationScoped +public class PasswordEncoder { + + /** + * Hashes a password using BCrypt. + * + * @param plainTextPassword + * @return the has of the given string + */ + public String hashPassword(String plainTextPassword) { + return BCrypt.hashpw(plainTextPassword, BCrypt.gensalt()); + } + + /** + * Checks a password against a stored hash using BCrypt. + * + * @param plainTextPassword + * @param hashPassword + * @return true if the hash of the first parameter equals the the second + * parameter + */ + public boolean checkPassword(String plainTextPassword, String hashPassword) { + if (null == hashPassword || !hashPassword.startsWith("$2a$")) { + throw new RuntimeException("Hashed password is invalid"); + } + return BCrypt.checkpw(plainTextPassword, hashPassword); + } +} diff --git a/src/main/java/fr/lirmm/aren/security/TokenBasedSecurityContext.java b/src/main/java/fr/lirmm/aren/security/TokenBasedSecurityContext.java new file mode 100644 index 0000000..fe240ed --- /dev/null +++ b/src/main/java/fr/lirmm/aren/security/TokenBasedSecurityContext.java @@ -0,0 +1,77 @@ +package fr.lirmm.aren.security; + +import java.security.Principal; + +import javax.ws.rs.core.SecurityContext; + +import fr.lirmm.aren.model.User.Authority; +import fr.lirmm.aren.security.token.AuthenticationTokenDetails; + +/** + * {@link SecurityContext} implementation for token-based authentication. + * + * @author Florent Descroix {@literal } + */ +public class TokenBasedSecurityContext implements SecurityContext { + + private final AuthenticatedUserDetails authenticatedUserDetails; + private final AuthenticationTokenDetails authenticationTokenDetails; + private final boolean secure; + + /** + * + * @param authenticatedUserDetails + * @param authenticationTokenDetails + * @param secure + */ + public TokenBasedSecurityContext(AuthenticatedUserDetails authenticatedUserDetails, AuthenticationTokenDetails authenticationTokenDetails, boolean secure) { + this.authenticatedUserDetails = authenticatedUserDetails; + this.authenticationTokenDetails = authenticationTokenDetails; + this.secure = secure; + } + + /** + * + * @return + */ + @Override + public Principal getUserPrincipal() { + return authenticatedUserDetails; + } + + /** + * + * @param s + * @return + */ + @Override + public boolean isUserInRole(String s) { + return authenticatedUserDetails.getUser().is(Authority.valueOf(s)); + } + + /** + * + * @return + */ + @Override + public boolean isSecure() { + return secure; + } + + /** + * + * @return + */ + @Override + public String getAuthenticationScheme() { + return "Bearer"; + } + + /** + * + * @return + */ + public AuthenticationTokenDetails getAuthenticationTokenDetails() { + return authenticationTokenDetails; + } +} diff --git a/src/main/java/fr/lirmm/aren/security/token/AuthenticationTokenDetails.java b/src/main/java/fr/lirmm/aren/security/token/AuthenticationTokenDetails.java new file mode 100644 index 0000000..87c5103 --- /dev/null +++ b/src/main/java/fr/lirmm/aren/security/token/AuthenticationTokenDetails.java @@ -0,0 +1,188 @@ +package fr.lirmm.aren.security.token; + +import java.time.ZonedDateTime; + +import fr.lirmm.aren.model.User.Authority; + +/** + * Model that holds details about an authentication token. + * + * @author Florent Descroix {@literal } + */ +public final class AuthenticationTokenDetails { + + private final String id; + private final String username; + private final Authority authority; + private final ZonedDateTime issuedDate; + private final ZonedDateTime expirationDate; + private final int refreshCount; + private final int refreshLimit; + + private AuthenticationTokenDetails(String id, String username, Authority authority, ZonedDateTime issuedDate, ZonedDateTime expirationDate, int refreshCount, int refreshLimit) { + this.id = id; + this.username = username; + this.authority = authority; + this.issuedDate = issuedDate; + this.expirationDate = expirationDate; + this.refreshCount = refreshCount; + this.refreshLimit = refreshLimit; + } + + /** + * + * @return + */ + public String getId() { + return id; + } + + /** + * + * @return + */ + public String getUsername() { + return username; + } + + /** + * + * @return + */ + public Authority getAuthority() { + return authority; + } + + /** + * + * @return + */ + public ZonedDateTime getIssuedDate() { + return issuedDate; + } + + /** + * + * @return + */ + public ZonedDateTime getExpirationDate() { + return expirationDate; + } + + /** + * + * @return + */ + public int getRefreshCount() { + return refreshCount; + } + + /** + * + * @return + */ + public int getRefreshLimit() { + return refreshLimit; + } + + /** + * Check if the authentication token is eligible for refreshment. + * + * @return + */ + public boolean isEligibleForRefreshment() { + return refreshCount < refreshLimit; + } + + /** + * Builder for the {@link AuthenticationTokenDetails}. + */ + public static class Builder { + + private String id; + private String username; + private Authority authority; + private ZonedDateTime issuedDate; + private ZonedDateTime expirationDate; + private int refreshCount; + private int refreshLimit; + + /** + * + * @param id + * @return + */ + public Builder withId(String id) { + this.id = id; + return this; + } + + /** + * + * @param username + * @return + */ + public Builder withUsername(String username) { + this.username = username; + return this; + } + + /** + * + * @param authority + * @return + */ + public Builder withAuthority(Authority authority) { + this.authority = authority; + return this; + } + + /** + * + * @param issuedDate + * @return + */ + public Builder withIssuedDate(ZonedDateTime issuedDate) { + this.issuedDate = issuedDate; + return this; + } + + /** + * + * @param expirationDate + * @return + */ + public Builder withExpirationDate(ZonedDateTime expirationDate) { + this.expirationDate = expirationDate; + return this; + } + + /** + * + * @param refreshCount + * @return + */ + public Builder withRefreshCount(int refreshCount) { + this.refreshCount = refreshCount; + return this; + } + + /** + * + * @param refreshLimit + * @return + */ + public Builder withRefreshLimit(int refreshLimit) { + this.refreshLimit = refreshLimit; + return this; + } + + /** + * + * @return + */ + public AuthenticationTokenDetails build() { + return new AuthenticationTokenDetails(id, username, authority, issuedDate, expirationDate, refreshCount, refreshLimit); + } + } +} diff --git a/src/main/java/fr/lirmm/aren/security/token/AuthenticationTokenIssuer.java b/src/main/java/fr/lirmm/aren/security/token/AuthenticationTokenIssuer.java new file mode 100644 index 0000000..c641f83 --- /dev/null +++ b/src/main/java/fr/lirmm/aren/security/token/AuthenticationTokenIssuer.java @@ -0,0 +1,43 @@ +package fr.lirmm.aren.security.token; + +import java.util.Date; + +import javax.enterprise.context.Dependent; +import javax.inject.Inject; + +import io.jsonwebtoken.Jwts; +import io.jsonwebtoken.SignatureAlgorithm; + +/** + * Component which provides operations for issuing JWT tokens. + * + * @author Florent Descroix {@literal } + */ +@Dependent +class AuthenticationTokenIssuer { + + @Inject + private AuthenticationTokenSettings settings; + + /** + * Issue a JWT token + * + * @param authenticationTokenDetails + * @return + */ + public String issueToken(AuthenticationTokenDetails authenticationTokenDetails) { + + return Jwts.builder() + .setId(authenticationTokenDetails.getId()) + .setIssuer(settings.getIssuer()) + .setAudience(settings.getAudience()) + .setSubject(authenticationTokenDetails.getUsername()) + .setIssuedAt(Date.from(authenticationTokenDetails.getIssuedDate().toInstant())) + .setExpiration(Date.from(authenticationTokenDetails.getExpirationDate().toInstant())) + .claim(settings.getAuthorityClaimName(), authenticationTokenDetails.getAuthority()) + .claim(settings.getRefreshCountClaimName(), authenticationTokenDetails.getRefreshCount()) + .claim(settings.getRefreshLimitClaimName(), authenticationTokenDetails.getRefreshLimit()) + .signWith(SignatureAlgorithm.HS256, settings.getSecret()) + .compact(); + } +} diff --git a/src/main/java/fr/lirmm/aren/security/token/AuthenticationTokenParser.java b/src/main/java/fr/lirmm/aren/security/token/AuthenticationTokenParser.java new file mode 100644 index 0000000..1f5b559 --- /dev/null +++ b/src/main/java/fr/lirmm/aren/security/token/AuthenticationTokenParser.java @@ -0,0 +1,137 @@ +package fr.lirmm.aren.security.token; + +import java.time.ZoneId; +import java.time.ZonedDateTime; + +import javax.enterprise.context.Dependent; +import javax.inject.Inject; +import javax.validation.constraints.NotNull; + +import fr.lirmm.aren.exception.InvalidAuthenticationTokenException; +import fr.lirmm.aren.model.User.Authority; +import io.jsonwebtoken.Claims; +import io.jsonwebtoken.ExpiredJwtException; +import io.jsonwebtoken.InvalidClaimException; +import io.jsonwebtoken.Jwts; +import io.jsonwebtoken.MalformedJwtException; +import io.jsonwebtoken.SignatureException; +import io.jsonwebtoken.UnsupportedJwtException; + +/** + * Component which provides operations for parsing JWT tokens. + * + * @author Florent Descroix {@literal } + */ +@Dependent +public class AuthenticationTokenParser { + + @Inject + private AuthenticationTokenSettings settings; + + /** + * Parse a JWT token. + * + * @param token + * @return + */ + public AuthenticationTokenDetails parseToken(String token) { + + try { + + Claims claims = Jwts.parser() + .setSigningKey(settings.getSecret()) + .requireAudience(settings.getAudience()) + .setAllowedClockSkewSeconds(settings.getClockSkew()) + .parseClaimsJws(token) + .getBody(); + + return new AuthenticationTokenDetails.Builder() + .withId(extractTokenIdFromClaims(claims)) + .withUsername(extractUsernameFromClaims(claims)) + .withAuthority(extractAuthorityFromClaims(claims)) + .withIssuedDate(extractIssuedDateFromClaims(claims)) + .withExpirationDate(extractExpirationDateFromClaims(claims)) + .withRefreshCount(extractRefreshCountFromClaims(claims)) + .withRefreshLimit(extractRefreshLimitFromClaims(claims)) + .build(); + + } catch (UnsupportedJwtException | MalformedJwtException | IllegalArgumentException | SignatureException e) { + throw InvalidAuthenticationTokenException.INVALID_TOKEN(); + } catch (ExpiredJwtException e) { + throw InvalidAuthenticationTokenException.INVALID_TOKEN(); + } catch (InvalidClaimException e) { + throw InvalidAuthenticationTokenException.INVALID_CLAIM(e.getClaimName()); + } + } + + /** + * Extract the token identifier from the token claims. + * + * @param claims + * @return Identifier of the JWT token + */ + private String extractTokenIdFromClaims(@NotNull Claims claims) { + return (String) claims.get(Claims.ID); + } + + /** + * Extract the username from the token claims. + * + * @param claims + * @return Username from the JWT token + */ + private String extractUsernameFromClaims(@NotNull Claims claims) { + return claims.getSubject(); + } + + /** + * Extract the user authorities from the token claims. + * + * @param claims + * @return User authorities from the JWT token + */ + private Authority extractAuthorityFromClaims(@NotNull Claims claims) { + String rolesAsString = (String) claims.getOrDefault(settings.getAuthorityClaimName(), ""); + return Authority.valueOf(rolesAsString); + } + + /** + * Extract the issued date from the token claims. + * + * @param claims + * @return Issued date of the JWT token + */ + private ZonedDateTime extractIssuedDateFromClaims(@NotNull Claims claims) { + return ZonedDateTime.ofInstant(claims.getIssuedAt().toInstant(), ZoneId.systemDefault()); + } + + /** + * Extract the expiration date from the token claims. + * + * @param claims + * @return Expiration date of the JWT token + */ + private ZonedDateTime extractExpirationDateFromClaims(@NotNull Claims claims) { + return ZonedDateTime.ofInstant(claims.getExpiration().toInstant(), ZoneId.systemDefault()); + } + + /** + * Extract the refresh count from the token claims. + * + * @param claims + * @return Refresh count from the JWT token + */ + private int extractRefreshCountFromClaims(@NotNull Claims claims) { + return (int) claims.get(settings.getRefreshCountClaimName()); + } + + /** + * Extract the refresh limit from the token claims. + * + * @param claims + * @return Refresh limit from the JWT token + */ + private int extractRefreshLimitFromClaims(@NotNull Claims claims) { + return (int) claims.get(settings.getRefreshLimitClaimName()); + } +} diff --git a/src/main/java/fr/lirmm/aren/security/token/AuthenticationTokenService.java b/src/main/java/fr/lirmm/aren/security/token/AuthenticationTokenService.java new file mode 100644 index 0000000..311df9d --- /dev/null +++ b/src/main/java/fr/lirmm/aren/security/token/AuthenticationTokenService.java @@ -0,0 +1,87 @@ +package fr.lirmm.aren.security.token; + +import java.time.ZonedDateTime; +import java.util.UUID; + +import javax.enterprise.context.ApplicationScoped; +import javax.inject.Inject; + +import fr.lirmm.aren.producer.Configurable; +import fr.lirmm.aren.model.User; +import java.time.temporal.ChronoUnit; + +/** + * Service which provides operations for authentication tokens. + * + * @author Florent Descroix {@literal } + */ +@ApplicationScoped +public class AuthenticationTokenService { + + /** + * How long the token is valid for (in seconds). + */ + @Inject + @Configurable("authentication.jwt.validFor") + private Long validFor; + + @Inject + private AuthenticationTokenIssuer tokenIssuer; + + @Inject + private AuthenticationTokenParser tokenParser; + + /** + * Issue a token for a user with the given authorities. + * + * @param user + * @param validFor + * @return + */ + public String issueToken(User user, Long validFor) { + + String id = generateTokenIdentifier(); + ZonedDateTime issuedDate = ZonedDateTime.now().truncatedTo(ChronoUnit.SECONDS); + + AuthenticationTokenDetails authenticationTokenDetails = new AuthenticationTokenDetails.Builder() + .withId(id) + .withUsername(user.getUsername()) + .withAuthority(user.getAuthority()) + .withIssuedDate(issuedDate) + .withExpirationDate(issuedDate.plusSeconds(validFor)) + .withRefreshCount(0) + .build(); + + return tokenIssuer.issueToken(authenticationTokenDetails); + } + + /** + * Issue a token for a user with the given authorities. + * + * @param user + * @return + */ + public String issueToken(User user) { + + return issueToken(user, validFor); + } + + /** + * Parse and validate the token. + * + * @param token + * @return + */ + public AuthenticationTokenDetails parseToken(String token) { + return tokenParser.parseToken(token); + } + + /** + * Generate a token identifier. + * + * @return + */ + private String generateTokenIdentifier() { + return UUID.randomUUID().toString(); + } +} diff --git a/src/main/java/fr/lirmm/aren/security/token/AuthenticationTokenSettings.java b/src/main/java/fr/lirmm/aren/security/token/AuthenticationTokenSettings.java new file mode 100644 index 0000000..4d163ec --- /dev/null +++ b/src/main/java/fr/lirmm/aren/security/token/AuthenticationTokenSettings.java @@ -0,0 +1,95 @@ +package fr.lirmm.aren.security.token; + +import javax.enterprise.context.Dependent; +import javax.inject.Inject; + +import fr.lirmm.aren.producer.Configurable; + +/** + * Settings for signing and verifying JWT tokens. + * + * @author Florent Descroix {@literal } + */ +@Dependent +class AuthenticationTokenSettings { + + /** + * Secret for signing and verifying the token signature. + */ + @Inject + @Configurable("authentication.jwt.secret") + private String secret; + + /** + * Allowed clock skew for verifying the token signature (in seconds). + */ + @Inject + @Configurable("authentication.jwt.clockSkew") + private Long clockSkew; + + /** + * Identifies the recipients that the JWT token is intended for. + */ + @Inject + @Configurable("authentication.jwt.audience") + private String audience; + + /** + * Identifies the JWT token issuer. + */ + @Inject + @Configurable("authentication.jwt.issuer") + private String issuer; + /** + * JWT claim for the authorities. + */ + @Inject + @Configurable("authentication.jwt.claimNames.authorities") + private String authorityClaimName; + /** + * JWT claim for the token refreshment count. + */ + @Inject + @Configurable("authentication.jwt.claimNames.refreshCount") + private String refreshCountClaimName; + /** + * JWT claim for the maximum times that a token can be refreshed. + */ + @Inject + @Configurable("authentication.jwt.claimNames.refreshLimit") + private String refreshLimitClaimName; + + AuthenticationTokenSettings() { + this.authorityClaimName = "authorities"; + this.refreshCountClaimName = "refreshCount"; + this.refreshLimitClaimName = "refreshLimit"; + } + + public String getSecret() { + return secret; + } + + public Long getClockSkew() { + return clockSkew; + } + + public String getAudience() { + return audience; + } + + public String getIssuer() { + return issuer; + } + + public String getAuthorityClaimName() { + return authorityClaimName; + } + + public String getRefreshCountClaimName() { + return refreshCountClaimName; + } + + public String getRefreshLimitClaimName() { + return refreshLimitClaimName; + } +} diff --git a/src/main/java/fr/lirmm/aren/service/AAFImportService.java b/src/main/java/fr/lirmm/aren/service/AAFImportService.java new file mode 100644 index 0000000..3599f2f --- /dev/null +++ b/src/main/java/fr/lirmm/aren/service/AAFImportService.java @@ -0,0 +1,411 @@ +package fr.lirmm.aren.service; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.function.Consumer; +import java.util.logging.Level; +import java.util.logging.Logger; + +import javax.enterprise.context.ApplicationScoped; +import javax.inject.Inject; +import javax.persistence.EntityManager; +import javax.xml.bind.JAXBContext; +import javax.xml.bind.JAXBException; +import javax.xml.bind.Unmarshaller; + +import fr.lirmm.aren.model.AbstractEntEntity; +import fr.lirmm.aren.model.Institution; +import fr.lirmm.aren.model.Team; +import fr.lirmm.aren.model.User; +import fr.lirmm.aren.model.aaf.AbstractRequest; +import fr.lirmm.aren.model.aaf.AddRequest; +import fr.lirmm.aren.model.aaf.AttributeList; +import fr.lirmm.aren.model.aaf.DeleteRequest; +import fr.lirmm.aren.model.aaf.FicAlimMENESR; +import fr.lirmm.aren.model.aaf.ModifyRequest; +import fr.lirmm.aren.security.PasswordEncoder; +import java.io.File; +import java.util.HashSet; +import java.util.Set; + +/** + * Service that provides operations for AAF xml import + * + * @author Florent Descroix {@literal } + */ +@ApplicationScoped +public class AAFImportService { + + @Inject + private PasswordEncoder passwordEncoder; + + @Inject + private EntityManager em; + + /** + * Object storing the parsed AAF xml file + */ + private FicAlimMENESR alimAAF; + + /** + * HashMap that links local ids to ent aaf ids of already stored entities + */ + private final Map, Map> maps = new HashMap<>(); + + /** + * HashMap the stores all the entities before the actual database processing + * Useful to sort the in order of priority to avoid conflicts + */ + private final Map, Map>> toProcess = new HashMap, Map>>(); + + /** + * Variables to evaluate the progression of the importation + */ + private float amoutToProcess; + private float amoutProceed; + + /** + * Function triggered to notify the progression + */ + private Consumer dispatcher; + + /** + * Enum of possible requests + */ + private enum Method { + CREATE, UPDATE, DELETE; + } + + /** + * ArrayList that store the log of the import + */ + private volatile List log = new ArrayList<>(); + + /** + * + * @return + */ + protected EntityManager getEntityManager() { + return em; + } + + /** + * + * @return + */ + public List proceedImportation(File file) { + return proceedImportation(file, true, true); + } + + /** + * + * @param insertOnUpdate if true, insert elements that should be updated but + * don't exist in local storage + * @param updateOnInsert if true, update elements that should be inserted + * but already exist in local storage + * @return + */ + public List proceedImportation(File file, boolean insertOnUpdate, boolean updateOnInsert) { + // Removes the check of external DTD on XML files + System.setProperty("javax.xml.accessExternalDTD", "all"); + + // Parse XML + try { + JAXBContext jaxbContext; + jaxbContext = JAXBContext.newInstance(FicAlimMENESR.class); + Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); + alimAAF = (FicAlimMENESR) unmarshaller.unmarshal(file); + } catch (JAXBException ex) { + Logger.getLogger(AAFImportService.class.getName()).log(Level.SEVERE, null, ex); + } + + // Varialbe sinitialization + log.clear(); + + toProcess.clear(); + + for (Class klass : new Class[]{Institution.class, Team.class, User.class}) { + toProcess.put(klass, new HashMap>()); + for (Method method : Method.values()) { + toProcess.get(klass).put(method, new ArrayList<>()); + } + } + amoutToProcess = 0; + amoutProceed = 0; + + // Count amout to proceed + for (AbstractRequest request : alimAAF.getRequest()) { + AttributeList opAttr = request.getOperationalAttributes(); + if (opAttr.isInstitution()) { + AttributeList attrs = request.getAttributes(); + this.amoutToProcess += attrs.getClasses().size(); + this.amoutToProcess += attrs.getGroups().size(); + } + this.amoutToProcess++; + } + this.amoutToProcess = this.amoutToProcess * 2; + + loadIdsMaps(); + + // This populate the toProcess Map that will execute the real import + Set newUsersId = new HashSet(); + for (AbstractRequest request : alimAAF.getRequest()) { + AttributeList attrs = request.getAttributes(); + + if (!attrs.isEmpty()) { + String entId = request.getId(); + AttributeList opAttr = request.getOperationalAttributes(); + attrs.addAll(opAttr); + Method method = null; + if (request.getClass() == AddRequest.class) { + method = Method.CREATE; + } else if (request.getClass() == ModifyRequest.class) { + method = Method.UPDATE; + } else if (request.getClass() == DeleteRequest.class) { + method = Method.DELETE; + } + + if (opAttr.isInstitution()) { + Institution institution = parseInstitution(attrs, entId); + toProcess.get(Institution.class).get(method).add(institution); + for (Team team : ((Institution) institution).getTeams()) { + toProcess.get(Team.class).get(method).add(team); + this.dispatchProgression(); + } + } else if (opAttr.isUser()) { + User user = parseUser(attrs, entId); + toProcess.get(User.class).get(method).add(user); + } + this.dispatchProgression(); + } + } + + // This executes the real import + // The order is important to avoid foreign key error + getEntityManager().getTransaction().begin(); + for (Class klass : new Class[]{Institution.class, Team.class, User.class}) { + // The order is important too + for (Method method : new Method[]{Method.CREATE, Method.UPDATE, Method.DELETE}) { + for (AbstractEntEntity entity : toProcess.get(klass).get(method)) { + proceed(klass, method, entity, insertOnUpdate, updateOnInsert); + if (klass == User.class) { + newUsersId.add(entity.getId()); + } + this.dispatchProgression(); + } + } + } + if (!newUsersId.isEmpty()) { + getEntityManager().createQuery("UPDATE Team t SET " + + "t.usersCount = (SELECT COUNT(u) FROM t.users u) " + + "WHERE t IN (SELECT t1 FROM User u LEFT JOIN u.teams t1 WHERE u.id IN :ids)") + .setParameter("ids", newUsersId) + .executeUpdate(); + } + getEntityManager().getTransaction().commit(); + + return log; + } + + /** + * + * @param dispatcher + */ + public void setDispatcher(Consumer dispatcher) { + + this.dispatcher = dispatcher; + } + + /** + * + * @param message + * @param isTeam if true it increments the total amout to process, because + * team ar + */ + private void dispatchProgression() { + + this.amoutProceed++; + if (this.dispatcher != null) { + float progression = this.amoutProceed / this.amoutToProcess; + this.dispatcher.accept(progression); + } + } + + /** + * Populate the maps between ids and ent ids + */ + private void loadIdsMaps() { + + maps.put(User.class, getEntIdToIdMap(User.class)); + maps.put(Team.class, getEntIdToIdMap(Team.class)); + maps.put(Institution.class, getEntIdToIdMap(Institution.class)); + } + + /** + * Retreives all ids and ent ids of a certain type in one call + * + * @param klass + * @return + */ + private Map getEntIdToIdMap(Class klass) { + Map map = new HashMap(); + List result = getEntityManager().createQuery( + "SELECT t.entId, t.id " + + "FROM " + klass.getSimpleName() + " t " + + "WHERE t.entId IS NOT NULL", Object[].class) + .getResultList(); + if (result == null) { + return null; + } + + result.forEach(obj -> { + map.put((String) obj[0], (Long) obj[1]); + }); + + return map; + } + + /** + * + * This is the main logic It handles what needs to be done for Create, + * Update and Delete + * + * @param method + * @param entity + * @param entId + */ + private void proceed(Class entityClass, Method method, AbstractEntEntity entity, boolean insertOnUpdate, boolean updateOnInsert) { + + boolean alreadyExists = maps.get(entityClass).containsKey(entity.getEntId()); + + switch (method) { + case CREATE: + if (alreadyExists) { + if (updateOnInsert) { + // If the entity already exists and updateOnInsert is true, we update it + // And add a warning + log.add("WARNING : " + method.name() + " : " + entityClass.getSimpleName() + " : " + entity.getEntId() + " updated instead of created"); + proceed(entityClass, Method.UPDATE, entity, false, false); + } else { + // If the entity already exists it adds an error + log.add("ERROR : " + method.name() + " : " + entityClass.getSimpleName() + " : " + entity.getEntId() + " already exists"); + } + } else { + getEntityManager().persist(entity); + log.add("SUCCESS : " + method.name() + " : " + entityClass.getSimpleName() + " : " + entity.getEntId()); + } + break; + + case UPDATE: + if (!alreadyExists) { + if (insertOnUpdate) { + // If the entity is not found and insertOnUpdate is true, we insert it + // And add a warning + log.add("WARNING : " + method.name() + " : " + entityClass.getSimpleName() + " : " + entity.getEntId() + " created instead of updated."); + proceed(entityClass, Method.CREATE, entity, false, false); + } else { + // If the entity is not found it adds an error + log.add("ERROR : " + method.name() + " : " + entityClass.getSimpleName() + " : " + entity.getEntId() + " not found."); + } + } else { + getEntityManager().merge(entity); + log.add("SUCCESS : " + method.name() + " : " + entityClass.getSimpleName() + " : " + entity.getEntId()); + } + break; + + case DELETE: + if (!alreadyExists) { + log.add("ERROR : " + method.name() + " : " + entityClass.getSimpleName() + " : " + entity.getEntId() + " not found."); + } else { + getEntityManager().remove(entity); + log.add("SUCCESS : " + method.name() + " : " + entityClass.getSimpleName() + " : " + entity.getEntId()); + } + break; + + default: + break; + } + } + + private User parseUser(AttributeList attrs, String entId) { + + Long id = maps.get(User.class).get(entId); + User user = new User(); + if (id != null) { + user = getEntityManager().getReference(User.class, id); + } + user.setEntId(entId); + user.setLastName(attrs.getLastName()); + user.setFirstName(attrs.getFirstName()); + user.setEmail(attrs.getEmail()); + user.setAuthority(attrs.getAuthority()); + // TODO : Get the real username + user.setUsername(entId); + String hashedPassword = passwordEncoder.hashPassword("temporary"); + user.setPassword(hashedPassword); + + Long instId = maps.get(Institution.class).get(attrs.getInstitutionId()); + Institution inst = getEntityManager().getReference(Institution.class, instId); + user.setInstitution(inst); + + List classOrGroup = new ArrayList<>(); + classOrGroup.addAll(attrs.getClasses()); + classOrGroup.addAll(attrs.getGroups()); + + for (String teamEntId : classOrGroup) { + Long teamId = maps.get(Team.class).get(teamEntId); + if (teamId != null) { + Team team = getEntityManager().getReference(Team.class, teamId); + user.addTeam(team); + } + } + + return user; + } + + private Institution parseInstitution(AttributeList attrs, String entId) { + + Long id = maps.get(Institution.class).get(entId); + Institution inst = new Institution(); + if (id != null) { + inst = getEntityManager().getReference(Institution.class, id); + } + inst.setEntId(entId); + + inst.setAcademy(attrs.getAcademy()); + inst.setType(attrs.getType()); + inst.setName(attrs.getName().split("-")[1]); + + List classOrGroup = new ArrayList<>(); + classOrGroup.addAll(attrs.getClasses()); + classOrGroup.addAll(attrs.getGroups()); + + for (String teamDesc : classOrGroup) { + if (!teamDesc.isEmpty()) { + Team team = parseTeam(teamDesc, inst); + inst.addTeam(team); + } + } + + return inst; + } + + private Team parseTeam(String value, Institution inst) { + + String[] explodeName = value.split("\\$"); + String entId = inst.getEntId() + "$" + explodeName[0]; + String name = explodeName.length > 2 && explodeName[1].length() > 1 ? explodeName[1] : explodeName[0]; + + Long id = maps.get(Team.class).get(entId); + Team team = new Team(); + if (id != null) { + team = getEntityManager().getReference(Team.class, id); + } + team.setEntId(entId); + team.setName(name); + + return team; + } +} diff --git a/src/main/java/fr/lirmm/aren/service/AbstractService.java b/src/main/java/fr/lirmm/aren/service/AbstractService.java new file mode 100644 index 0000000..c52350d --- /dev/null +++ b/src/main/java/fr/lirmm/aren/service/AbstractService.java @@ -0,0 +1,231 @@ +package fr.lirmm.aren.service; + +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import javax.persistence.EntityManager; +import javax.persistence.PersistenceException; +import javax.persistence.criteria.CriteriaQuery; + +import org.hibernate.PropertyValueException; +import org.hibernate.exception.ConstraintViolationException; + +import fr.lirmm.aren.exception.InsertEntityException; +import fr.lirmm.aren.model.AbstractEntity; +import fr.lirmm.aren.producer.Scope; +import static fr.lirmm.aren.producer.Scope.Type.APPLICATION; +import static fr.lirmm.aren.producer.Scope.Type.REQUEST; +import java.util.Set; +import java.util.HashSet; +import javax.inject.Inject; + +/** + * Service that provides abstract operations for the models + * + * @author Florent Descroix {@literal } + * @param + */ +public abstract class AbstractService { + + @Inject + @Scope(REQUEST) + private EntityManager emr; + + @Inject + @Scope(APPLICATION) + private EntityManager ema; + + private final Class entityClass; + + /** + * + * @param type + */ + public AbstractService(Class entityClass) { + this.entityClass = entityClass; + } + + /** + * + * @return + */ + protected EntityManager getEntityManager() { + try { + this.emr.getTransaction(); + return emr; + } catch (Exception e) { + return this.ema; + } + } + + // Wrapper so if there is multiple nested requests + // they are all commited once + /** + * + */ + protected void transactionBegin() { + if (!getEntityManager().getTransaction().isActive()) { + getEntityManager().setProperty("activeTransactions", 0); + getEntityManager().getTransaction().begin(); + } + getEntityManager().setProperty("activeTransactions", + ((int) getEntityManager().getProperties().get("activeTransactions")) + 1); + } + + /** + * + */ + protected void commit() { + if ((int) getEntityManager() + .getProperties() + .get("activeTransactions") == 1) { + getEntityManager().getTransaction().commit(); + } + getEntityManager().setProperty("activeTransactions", + ((int) getEntityManager().getProperties().get("activeTransactions")) - 1); + } + + /** + * + * @return + */ + public Class getEntityClass() { + return entityClass; + } + + /** + * + * @param entities + */ + public void create(List entities) { + this.transactionBegin(); + entities.forEach(entity -> { + this.create(entity); + }); + this.commit(); + } + + /** + * + * @param entity + */ + protected void afterCreate(T entity) { + } + + /** + * + * @param entity + */ + public void create(T entity) { + // If ever the entity is attached, it needs to be detached + getEntityManager().detach(entity); + // If ever the id is set, it needs to be removed + entity.setId(null); + + try { + this.transactionBegin(); + getEntityManager().persist(entity); + getEntityManager().refresh(entity); + this.afterCreate(entity); + this.commit(); + } catch (PersistenceException e) { + if (e.getCause() instanceof PropertyValueException) { + PropertyValueException cause = (PropertyValueException) e.getCause(); + throw InsertEntityException.MANDATORY_PROPERTY(cause.getPropertyName()); + } else if (e.getCause() instanceof ConstraintViolationException) { + // Parse the error to a client readable one + Throwable cause = e.getCause().getCause(); + String details = cause.getMessage(); + Pattern pattern = Pattern.compile("\\((.*)\\)=\\((.*)\\)"); + Matcher matcher = pattern.matcher(details); + if (matcher.find()) { + String keyName = matcher.group(1); + String keyValue = matcher.group(2); + throw InsertEntityException.DUPLICATE_KEY(keyName, keyValue); + } else { + throw InsertEntityException.OTHER(details); + } + } else { + throw e; + } + } + } + + /** + * + * @param entity + */ + protected void afterEdit(T entity) { + } + + /** + * + * @param entity + */ + public void edit(T entity) { + this.transactionBegin(); + getEntityManager().merge(entity); + this.afterEdit(entity); + this.commit(); + getEntityManager().refresh(entity); + } + + /** + * + * @param entity + */ + protected void afterRemove(T entity) { + } + + /** + * + * @param entity + */ + public void remove(T entity) { + this.transactionBegin(); + getEntityManager().remove(getEntityManager().merge(entity)); + this.afterRemove(entity); + this.commit(); + } + + /** + * + * @param id + * @return + */ + public T find(Object id) { + return getEntityManager().find(entityClass, id); + } + + /** + * + * @param id + * @return + */ + public T getReference(Long id) { + return getEntityManager().getReference(entityClass, id); + } + + /** + * + * @return + */ + public Set findAll() { + CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery(entityClass); + cq.select(cq.from(entityClass)); + return new HashSet(getEntityManager().createQuery(cq).getResultList()); + } + + /** + * + * @return + */ + public int count() { + CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery(Long.class); + javax.persistence.criteria.Root rt = cq.from(entityClass); + cq.select(getEntityManager().getCriteriaBuilder().count(rt)); + javax.persistence.Query q = getEntityManager().createQuery(cq); + return ((Long) q.getSingleResult()).intValue(); + } +} diff --git a/src/main/java/fr/lirmm/aren/service/AuthentificationService.java b/src/main/java/fr/lirmm/aren/service/AuthentificationService.java new file mode 100644 index 0000000..863dd35 --- /dev/null +++ b/src/main/java/fr/lirmm/aren/service/AuthentificationService.java @@ -0,0 +1,94 @@ +package fr.lirmm.aren.service; + +import javax.enterprise.context.ApplicationScoped; +import javax.inject.Inject; +import javax.ws.rs.client.Client; +import javax.ws.rs.client.ClientBuilder; +import javax.ws.rs.client.Entity; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.MultivaluedHashMap; +import javax.ws.rs.core.MultivaluedMap; +import javax.ws.rs.core.Response; + +import org.glassfish.jersey.client.ClientProperties; + +import fr.lirmm.aren.producer.Configurable; +import fr.lirmm.aren.exception.AuthenticationException; +import fr.lirmm.aren.model.User; +import fr.lirmm.aren.security.PasswordEncoder; + +/** + * Component for validating user credentials. + * + * @author Florent Descroix {@literal } + */ +@ApplicationScoped +public class AuthentificationService { + + @Inject + private UserService userService; + + @Inject + private PasswordEncoder passwordEncoder; + + @Inject + @Configurable("cas.server-login-rest") + private String casUrl; + + /** + * Validate username and password. + * + * @param username + * @param password + * @return + */ + public User validateCredentials(String username, String password) { + + User user = userService.findByUsernameOrEmail(username); + if (user == null) { + throw AuthenticationException.BAD_CREDENTIALS(); + } + + if (!user.isActive()) { + // User is not active + throw AuthenticationException.INACTIVE_USER(username); + } + + if (!passwordEncoder.checkPassword(password, user.getPassword())) { + //&& !checkCasLogin(username, password)) { + // Invalid password + throw AuthenticationException.BAD_CREDENTIALS(); + } + + return user; + } + + /** + * + * @param username + * @param password + * @return + * + * This is a trick to check if the username:password exists in the CAS + * service It is then used to login the user, but doesn't log it to the + * whole CAS system + */ + private boolean checkCasLogin(String username, String password) { + String success = "A_KEY_TO_CHECK_IF_THE_RESPONSE_IS_GOOD"; + + Client client = ClientBuilder.newClient(); + + MultivaluedMap params = new MultivaluedHashMap(); + params.add("auth_mode", "BASIC"); + params.add("orig_url", success); + params.add("user", username); + params.add("password", password); + + Response response = client.target(casUrl) + .property(ClientProperties.FOLLOW_REDIRECTS, Boolean.FALSE) + .request(MediaType.APPLICATION_FORM_URLENCODED) + .post(Entity.form(params)); + + return response.getLocation().toString().equals(success); + } +} diff --git a/src/main/java/fr/lirmm/aren/service/BroadcasterService.java b/src/main/java/fr/lirmm/aren/service/BroadcasterService.java new file mode 100644 index 0000000..3e0c384 --- /dev/null +++ b/src/main/java/fr/lirmm/aren/service/BroadcasterService.java @@ -0,0 +1,117 @@ +package fr.lirmm.aren.service; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.enterprise.context.ApplicationScoped; +import javax.ws.rs.core.Context; +import javax.ws.rs.core.MediaType; + +import fr.lirmm.aren.model.AbstractEntity; +import fr.lirmm.aren.model.Comment; +import fr.lirmm.aren.model.Debate; +import fr.lirmm.aren.model.Notification; +import fr.lirmm.aren.security.AuthenticatedUserDetails; +import javax.ws.rs.core.SecurityContext; +import javax.ws.rs.sse.OutboundSseEvent; +import javax.ws.rs.sse.Sse; +import javax.ws.rs.sse.SseBroadcaster; +import javax.ws.rs.sse.SseEventSink; + +/** + * + * @author Florent Descroix {@literal } + */ +@ApplicationScoped +public class BroadcasterService { + + @Context + private Sse sse; + + /** + * + */ + @Context + protected SecurityContext securityContext; + + private OutboundSseEvent.Builder eventBuilder; + + private final Map, HashMap> broadcasters = new HashMap, HashMap>(); + + /** + * + * @param sse + */ + @Context + public void setSse(Sse sse) { + this.sse = sse; + this.eventBuilder = sse.newEventBuilder(); + } + + private void broadcast(Long id, AbstractEntity object, Class which) { + + if (broadcasters.containsKey(which)) { + + OutboundSseEvent sseEvent = this.eventBuilder + .comment(((AuthenticatedUserDetails) securityContext.getUserPrincipal()).getUser().getId() + "") + .name("message") + .mediaType(MediaType.APPLICATION_JSON_TYPE) + .data(which, object) + .reconnectDelay(5000) + .build(); + + if (broadcasters.get(which).containsKey(id)) { + broadcasters.get(which).get(id).broadcast(sseEvent); + } + if (broadcasters.get(which).containsKey(-1L)) { + broadcasters.get(which).get(-1L).broadcast(sseEvent); + } + } + } + + /** + * + * @param id + * @param which + * @param sink + */ + public void openListener(Long id, Class which, SseEventSink sink) { + + if (!broadcasters.containsKey(which)) { + broadcasters.put(which, new HashMap()); + } + + if (!broadcasters.get(which).containsKey(id)) { + broadcasters.get(which).put(id, sse.newBroadcaster()); + } + broadcasters.get(which).get(id).register(sink); + sink.send(sse.newEvent("registered", "true")); + } + + /** + * + * @param comment + */ + public void broadcastComment(Comment comment) { + broadcast(comment.getDebate().getId(), comment, Debate.class); + } + + /** + * + * @param notif + */ + public void broadcastNotification(Notification notif) { + broadcast(notif.getOwner().getId(), notif, Notification.class); + } + + /** + * + * @param notifs + */ + public void broadcastNotification(List notifs) { + notifs.forEach(notif -> { + broadcastNotification(notif); + }); + } +} diff --git a/src/main/java/fr/lirmm/aren/service/CasAuthentificationService.java b/src/main/java/fr/lirmm/aren/service/CasAuthentificationService.java new file mode 100644 index 0000000..e329fcd --- /dev/null +++ b/src/main/java/fr/lirmm/aren/service/CasAuthentificationService.java @@ -0,0 +1,130 @@ +package fr.lirmm.aren.service; + +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.MalformedURLException; +import java.net.URL; +import java.net.URLEncoder; +import java.util.logging.Level; +import java.util.logging.Logger; + +import javax.inject.Inject; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; + +import org.w3c.dom.Document; +import org.w3c.dom.NodeList; +import org.xml.sax.SAXException; + +import fr.lirmm.aren.producer.Configurable; +import fr.lirmm.aren.exception.InvalidAuthenticationTokenException; +import fr.lirmm.aren.model.User; +import javax.enterprise.context.ApplicationScoped; +import javax.servlet.http.HttpServletRequest; + +/** + * Service that provides operations for CAS authentification + * + * @author Florent Descroix {@literal } + */ +@ApplicationScoped +public class CasAuthentificationService { + + @Inject + private UserService userService; + + @Inject + private InstitutionService institutionService; + + @Inject + @Configurable("cas.url") + private String serverUrl; + + @Inject + @Configurable("reverse-proxy") + private String proxyUrl; + + @Inject + private HttpServletRequest request; + + private String encodeUrl(String url) { + String encodedUrl = null; + try { + encodedUrl = URLEncoder.encode(url, "UTF-8"); + } catch (UnsupportedEncodingException ex) { + Logger.getLogger(CasAuthentificationService.class.getName()).log(Level.SEVERE, null, ex); + } + return encodedUrl; + } + + private URL genURL(String url) { + URL result = null; + try { + result = new URL(url); + } catch (MalformedURLException ex) { + Logger.getLogger(CasAuthentificationService.class.getName()).log(Level.SEVERE, null, ex); + } + return result; + } + + private String getClientUrl() { + String clientUrl; + if (proxyUrl.length() == 0) { + clientUrl = request.getRequestURL().toString(); + } else { + clientUrl = proxyUrl + "/caslogin"; + } + return clientUrl; + } + + /** + * + * @return + */ + public String getRedirectionUrl() { + return (serverUrl + "/login?service=" + encodeUrl(getClientUrl())); + } + + /** + * + * @param ticket + * @return + * @throws InvalidAuthenticationTokenException + */ + public User getUserWithTicket(String ticket) throws InvalidAuthenticationTokenException { + URL casXml = genURL(serverUrl + "/p3/serviceValidate?service=" + encodeUrl(getClientUrl()) + "&ticket=" + ticket); + Document doc = null; + + try { + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + DocumentBuilder builder = factory.newDocumentBuilder(); + doc = builder.parse(casXml.openStream()); + doc.getDocumentElement().normalize(); + } catch (IOException | SAXException | ParserConfigurationException ex) { + throw InvalidAuthenticationTokenException.INVALID_CAS_TICKET(); + } + + NodeList success = doc.getElementsByTagName("cas:authenticationSuccess"); + + if (success.getLength() == 0) { + NodeList failure = doc.getElementsByTagName("cas:authenticationFailure"); + if (failure.getLength() > 0) { + String code = failure.item(0).getAttributes().getNamedItem("code").getTextContent(); + throw InvalidAuthenticationTokenException.INVALID_CAS_TICKET(code); + } + throw InvalidAuthenticationTokenException.INVALID_CAS_TICKET(); + } else { + String username = doc.getElementsByTagName("cas:user").item(0).getTextContent(); + User user = userService.findByUsernameOrEmail(username); + if (user == null) { + user = new User(); + user.setUsername(username); + user.setAuthority(User.Authority.USER); + user.setInstitution(institutionService.getReference(0L)); + userService.create(user); + } + return user; + } + } +} diff --git a/src/main/java/fr/lirmm/aren/service/CategoryService.java b/src/main/java/fr/lirmm/aren/service/CategoryService.java new file mode 100644 index 0000000..36696ea --- /dev/null +++ b/src/main/java/fr/lirmm/aren/service/CategoryService.java @@ -0,0 +1,88 @@ +package fr.lirmm.aren.service; + +import java.util.List; + +import javax.enterprise.context.ApplicationScoped; +import javax.persistence.TypedQuery; +import javax.ws.rs.NotFoundException; + +import fr.lirmm.aren.model.Category; +import fr.lirmm.aren.model.User; +import java.util.HashSet; + +/** + * Service that provides operations for {link Category}. + * + * @author Florent Descroix {@literal } + */ +@ApplicationScoped +public class CategoryService extends AbstractService { + + /** + * + */ + public CategoryService() { + super(Category.class); + } + + private TypedQuery generateQuery(Long categoryId, User user, boolean withDocuments) { + boolean isUser = user != null && user.is(User.Authority.USER) && !user.is(User.Authority.ADMIN); + boolean onlyPublic = user != null && user.getAuthority().equals(User.Authority.GUEST); + TypedQuery query = getEntityManager().createQuery("SELECT c " + + "FROM Category c " + + (withDocuments || isUser || onlyPublic + ? "LEFT JOIN " + (withDocuments ? "FETCH" : "") + " c.documents do " + : "") + + (isUser || onlyPublic + ? "LEFT JOIN do.debates d " + : "") + + (categoryId != null + ? "WHERE c.id = :categoryId " + : "WHERE c.id IS NOT NULL ") + + (isUser + ? "AND (d.openPublic IS TRUE " + + "OR :user = d.owner " + + "OR :user IN (SELECT u FROM d.guests u) " + + "OR :user IN (SELECT u FROM d.teams t LEFT JOIN t.users u)) " + : (onlyPublic + ? "AND d.openPublic IS TRUE " + : "")), + Category.class); + if (categoryId != null) { + query.setParameter("categoryId", categoryId); + } + if (isUser) { + query.setParameter("user", user); + } + return query; + } + + public Category findByUser(Long categoryId, User user, boolean withDocuments) { + List results = generateQuery(categoryId, user, withDocuments).getResultList(); + if (results.isEmpty()) { + throw new NotFoundException(); + } + return results.get(0); + } + + public HashSet findAllByUser(User user, boolean withDocuments) { + return new HashSet(generateQuery(null, user, withDocuments).getResultList()); + } + + /** + * + * @param categoryId + * @return + */ + public Category find(Long categoryId) { + return findByUser(categoryId, null, false); + } + + /** + * + * @return + */ + public HashSet findAll() { + return findAllByUser(null, false); + } +} diff --git a/src/main/java/fr/lirmm/aren/service/CommentService.java b/src/main/java/fr/lirmm/aren/service/CommentService.java new file mode 100644 index 0000000..84b14b3 --- /dev/null +++ b/src/main/java/fr/lirmm/aren/service/CommentService.java @@ -0,0 +1,184 @@ +package fr.lirmm.aren.service; + +import java.util.List; + +import javax.ws.rs.NotFoundException; + +import fr.lirmm.aren.model.Comment; +import fr.lirmm.aren.model.TagSet; +import java.util.Set; +import java.util.HashSet; +import java.util.Iterator; +import java.util.function.BiConsumer; +import javax.enterprise.context.ApplicationScoped; +import javax.inject.Inject; + +/** + * Service that provides operations for {link Comment}. + * + * @author Florent Descroix {@literal } + */ +@ApplicationScoped +public class CommentService extends AbstractService { + + @Inject + private HttpRequestService httpRequestService; + + /** + * + */ + public CommentService() { + super(Comment.class); + } + + /** + * + * @param entity + */ + @Override + protected void afterCreate(Comment entity) { + this.updateExternaleTables(entity); + } + + /** + * + * @param entity + */ + @Override + protected void afterRemove(Comment entity) { + this.updateExternaleTables(entity); + } + + /** + * + * @param commentId + * @return + */ + public Comment find(Long commentId) { + List results = getEntityManager().createQuery("SELECT c " + + "FROM Comment c " + + "WHERE c.id = :commentId ", Comment.class) + .setParameter("commentId", commentId) + .setMaxResults(1) + .getResultList(); + if (results.isEmpty()) { + throw new NotFoundException(); + } + return results.get(0); + } + + /** + * + * @return + */ + public Set findAll() { + return new HashSet(getEntityManager().createQuery("SELECT c " + + "FROM Comment c", Comment.class) + .getResultList()); + } + + /** + * + * @param ids + * @return + */ + public Set findAll(List ids) { + return new HashSet(getEntityManager().createQuery("SELECT c " + + "FROM Comment c " + + "WHERE id IN :ids", Comment.class) + .setParameter("ids", ids) + .getResultList()); + } + + /** + * + * @param comment + */ + public void updateExternaleTables(Comment comment) { + super.transactionBegin(); + getEntityManager().createQuery("UPDATE Debate d SET " + + "d.lastCommentDate = (SELECT MAX(c.created) FROM d.comments c), " + + "d.commentsCount = (SELECT COUNT(c) FROM d.comments c), " + + "d.commentsCountFor = (SELECT COUNT(c) FROM d.comments c WHERE c.opinion = :for), " + + "d.commentsCountAgainst = (SELECT COUNT(c) FROM d.comments c WHERE c.opinion = :against) " + + "WHERE d.id = :id") + .setParameter("for", Comment.Opinion.FOR) + .setParameter("against", Comment.Opinion.AGAINST) + .setParameter("id", comment.getDebate().getId()) + .executeUpdate(); + getEntityManager().createQuery("UPDATE Category cat SET " + + "cat.lastCommentDate = (SELECT MAX(c.created) FROM cat.documents doc LEFT JOIN doc.debates d LEFT JOIN d.comments c) " + + "WHERE cat.id = :id") + .setParameter("id", comment.getDebate().getDocument().getCategory().getId()) + .executeUpdate(); + super.commit(); + } + + private TagSet fetchNewTags(Comment comment, boolean fetchOnly) { + TagSet tags = new TagSet(); + if (comment.getReformulation() != null && !comment.getReformulation().isEmpty()) { + if (!fetchOnly && !comment.getProposedTags().isEmpty()) { + tags = httpRequestService.sendTag(comment.getProposedTags(), comment.getReformulation()); + } else { + tags = httpRequestService.retrieveTags(comment.getReformulation(), comment); + } + } + return tags; + } + + private TagSet fetchNewTags(Comment comment) { + return fetchNewTags(comment, false); + } + + /** + * + * @param comment + * @param fetchOnly + */ + public void updateTags(Comment comment, boolean fetchOnly) { + TagSet tags = fetchNewTags(comment); + getEntityManager().refresh(comment); + comment.setTags(tags); + comment.removeUnusedTags(); + this.edit(comment); + } + + /** + * + * @param comment + */ + public void updateTags(Comment comment) { + updateTags(comment, false); + } + + /** + * + * @param cms + */ + public void updateAllTags(BiConsumer callback) { + Set comments = this.findAll(); + System.out.println("Starting tags update on " + comments.size() + " comments"); + int cpt = 0; + Iterator it = comments.iterator(); + while (it.hasNext()) { + Comment comment = it.next(); + if (comment.getDebate().isIdfixLink()) { + this.updateTags(comment, true); + } + if (callback != null) { + callback.accept(comment, ((float) cpt / (float) comments.size())); + } + cpt++; + System.out.print("."); + } + System.out.println(); + System.out.println("Tags update done"); + } + + /** + * + */ + public void updateAllTags() { + this.updateAllTags(null); + } +} diff --git a/src/main/java/fr/lirmm/aren/service/DebateService.java b/src/main/java/fr/lirmm/aren/service/DebateService.java new file mode 100644 index 0000000..86956e0 --- /dev/null +++ b/src/main/java/fr/lirmm/aren/service/DebateService.java @@ -0,0 +1,212 @@ +package fr.lirmm.aren.service; + +import java.util.List; + +import javax.enterprise.context.ApplicationScoped; +import javax.persistence.TypedQuery; +import javax.ws.rs.NotFoundException; + +import fr.lirmm.aren.model.Debate; +import fr.lirmm.aren.model.User; +import fr.lirmm.aren.model.User.Authority; +import java.util.Set; +import java.util.HashSet; + +/** + * Service that provides operations for {link Debate}. + * + * @author Florent Descroix {@literal } + */ +@ApplicationScoped +public class DebateService extends AbstractService { + + /** + * + */ + public DebateService() { + super(Debate.class); + } + + /** + * + * @param entity + */ + @Override + protected void afterCreate(Debate entity) { + this.updateExternaleTables(entity); + } + + /** + * + * @param entity + */ + @Override + protected void afterRemove(Debate entity) { + this.updateExternaleTables(entity); + } + + /** + * + * @param entity + */ + @Override + protected void afterEdit(Debate entity) { + this.updateExternaleTables(entity); + } + + private TypedQuery generateQuery(Long debateId, User user, Long categoryId, boolean withDocument, boolean withComments, boolean withTeams, boolean withGuests, boolean withUsers) { + boolean isUser = user != null && user.is(Authority.USER) && !user.is(Authority.ADMIN); + boolean onlyPublic = user != null && user.getAuthority().equals(Authority.GUEST); + TypedQuery query = getEntityManager().createQuery("SELECT d " + + "FROM Debate d " + + (withComments + ? "LEFT JOIN FETCH d.comments c " + : "") + + (withTeams || withUsers || isUser + ? "LEFT JOIN " + (withTeams || withUsers ? "FETCH" : "") + " d.teams t " + : "") + + (withUsers || isUser + ? "LEFT JOIN " + (withUsers ? "FETCH" : "") + " t.users u " + : "") + + (withGuests || isUser + ? "LEFT JOIN " + (withGuests ? "FETCH" : "") + " d.guests g " + : "") + + (withDocument + ? "LEFT JOIN FETCH d.document do " + : "") + + (debateId != null + ? "WHERE d.id = :debateId " + : "WHERE d.id IS NOT NULL ") + + (categoryId != null + ? "AND d.document.category.id = :categoryId " + : "") + + (isUser + ? "AND (d.openPublic IS TRUE " + + "OR :user = d.owner " + + "OR :user IN g " + + "OR :user IN u) " + : (onlyPublic + ? "AND d.openPublic IS TRUE " + : "")), + Debate.class + ); + + if (debateId != null) { + query.setParameter("debateId", debateId); + } + if (isUser) { + query.setParameter("user", user); + } + if (categoryId != null) { + query.setParameter("categoryId", categoryId); + } + return query; + } + + /** + * + * @param debateId + * @param user + * @param withDocument + * @param withComments + * @param withTeams + * @param withGuests + * @param withUsers + * @return + */ + public Debate findByUser(Long debateId, User user, boolean withDocument, boolean withComments, boolean withTeams, boolean withGuests, boolean withUsers) { + List results = generateQuery(debateId, user, null, withDocument, withComments, withTeams, withGuests, withUsers).getResultList(); + if (results.isEmpty()) { + throw new NotFoundException(); + } + return results.get(0); + } + + /** + * + * @param user + * @param categoryId + * @param withDocument + * @param withComments + * @param withTeams + * @param withGuests + * @param withUsers + * @return + */ + public Set findAllByUser(User user, Long categoryId, boolean withDocument, boolean withComments, boolean withTeams, boolean withGuests, boolean withUsers) { + return new HashSet(generateQuery(null, user, categoryId, withDocument, withComments, withTeams, withGuests, withUsers).getResultList()); + } + + /** + * + * @param debateId + * @param withDocument + * @param withComments + * @param withTeams + * @param withGuests + * @param withUsers + * @return + */ + public Debate find(Long debateId, boolean withDocument, boolean withComments, boolean withTeams, boolean withGuests, boolean withUsers) { + return findByUser(debateId, null, withDocument, withComments, withTeams, withGuests, withUsers); + } + + /** + * + * @param categoryId + * @param withDocument + * @param withComments + * @param withTeams + * @param withGuests + * @param withUsers + * @return + */ + public Set findAll(Long categoryId, boolean withDocument, boolean withComments, boolean withTeams, boolean withGuests, boolean withUsers) { + return findAllByUser(null, categoryId, withDocument, withComments, withTeams, withGuests, withUsers); + } + + /** + * + * @param debateId + */ + public void clearComments(Long debateId) { + this.transactionBegin(); + getEntityManager().createQuery("DELETE FROM Comment c " + + "WHERE c.debate.id = :debateId") + .setParameter("debateId", debateId) + .executeUpdate(); + getEntityManager().createQuery("UPDATE Debate d SET " + + "d.commentsCount = 0, " + + "d.commentsCountFor = 0, " + + "d.commentsCountAgainst = 0, " + + "d.lastCommentDate = null " + + "WHERE d.id = :debateId") + .setParameter("debateId", debateId) + .executeUpdate(); + this.commit(); + } + + /** + * + * @param debate + */ + public void updateExternaleTables(Debate debate) { + super.transactionBegin(); + getEntityManager().createQuery("UPDATE Category c SET " + + "c.debatesCount = (SELECT COUNT(d) FROM c.documents doc LEFT JOIN doc.debates d) " + + "WHERE c.id = :id") + .setParameter("id", debate.getDocument().getCategory().getId()) + .executeUpdate(); + getEntityManager().createQuery("UPDATE Document doc SET " + + "doc.debatesCount = (SELECT COUNT(d) FROM doc.debates d) " + + "WHERE doc.id = :id") + .setParameter("id", debate.getDocument().getId()) + .executeUpdate(); + getEntityManager().createQuery("UPDATE Team t SET " + + "t.debatesCount = (SELECT COUNT(d) from t.debates d) " + + "WHERE t IN (SELECT t1 FROM Debate d LEFT JOIN d.teams t1 WHERE d.id = :id)") + .setParameter("id", debate.getId()) + .executeUpdate(); + super.commit(); + } +} diff --git a/src/main/java/fr/lirmm/aren/service/DocumentService.java b/src/main/java/fr/lirmm/aren/service/DocumentService.java new file mode 100644 index 0000000..48719b3 --- /dev/null +++ b/src/main/java/fr/lirmm/aren/service/DocumentService.java @@ -0,0 +1,98 @@ +package fr.lirmm.aren.service; + +import java.util.List; + +import javax.enterprise.context.ApplicationScoped; +import javax.persistence.TypedQuery; +import javax.ws.rs.NotFoundException; + +import fr.lirmm.aren.model.Document; +import java.util.Set; +import java.util.HashSet; + +/** + * Service that provides operations for {link Document}. + * + * @author Florent Descroix {@literal } + */ +@ApplicationScoped +public class DocumentService extends AbstractService { + + /** + * + */ + public DocumentService() { + super(Document.class); + } + + /** + * + * @param entity + */ + @Override + protected void afterCreate(Document entity) { + this.updateExternaleTables(entity); + } + + /** + * + * @param entity + */ + @Override + protected void afterRemove(Document entity) { + this.updateExternaleTables(entity); + } + + private TypedQuery generateQuery(Long documentId, boolean withDebates) { + TypedQuery query = getEntityManager().createQuery("SELECT do " + + "FROM Document do " + + (withDebates + ? "LEFT JOIN FETCH do.debates d " + : "") + + (documentId != null + ? "WHERE do.id = :documentId " + : ""), + Document.class); + if (documentId != null) { + query.setParameter("documentId", documentId); + } + return query; + } + + /** + * + * @param debateId + * @param withDebates + * @return + */ + public Document find(Long debateId, boolean withDebates) { + List results = generateQuery(debateId, withDebates).getResultList(); + if (results.isEmpty()) { + throw new NotFoundException(); + } + return results.get(0); + } + + /** + * + * @param withDebates + * @return + */ + public Set findAll(boolean withDebates) { + return new HashSet(generateQuery(null, withDebates).getResultList()); + } + + /** + * + * @param document + */ + public void updateExternaleTables(Document document) { + super.transactionBegin(); + getEntityManager().createQuery("UPDATE Category c SET " + + "c.documentsCount = (SELECT COUNT(doc) FROM c.documents doc) " + + "WHERE c.id = :id") + .setParameter("id", document.getCategory().getId()) + .executeUpdate(); + super.commit(); + } +} diff --git a/src/main/java/fr/lirmm/aren/service/HttpRequestService.java b/src/main/java/fr/lirmm/aren/service/HttpRequestService.java new file mode 100644 index 0000000..fe9806f --- /dev/null +++ b/src/main/java/fr/lirmm/aren/service/HttpRequestService.java @@ -0,0 +1,236 @@ +package fr.lirmm.aren.service; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.ArrayNode; +import com.fasterxml.jackson.databind.node.JsonNodeFactory; +import com.fasterxml.jackson.databind.node.ObjectNode; +import fr.lirmm.aren.model.Comment; +import fr.lirmm.aren.model.TagSet; +import fr.lirmm.aren.producer.Configurable; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.util.ArrayList; +import java.util.List; +import java.util.logging.Level; +import java.util.logging.Logger; +import javax.enterprise.context.ApplicationScoped; +import javax.inject.Inject; +import javax.xml.parsers.ParserConfigurationException; +import org.apache.http.NameValuePair; +import org.apache.http.client.config.RequestConfig; +import org.apache.http.client.entity.UrlEncodedFormEntity; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.message.BasicNameValuePair; +import org.apache.http.util.EntityUtils; +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; + +/** + * Service that provides operations for AAF xml import + * + * @author Florent Descroix {@literal } + */ +@ApplicationScoped +public class HttpRequestService { + + @Inject + @Configurable("idefix.url") + private String idefixUrl; + + @Inject + @Configurable("scalar.url") + private String scalarUrl; + + @Inject + @Configurable("plateform.id") + private String plateformId; + + @Inject + @Configurable("theme.url") + private String themeUrl; + + /** + * + * @throws ParserConfigurationException + */ + public HttpRequestService() throws ParserConfigurationException { + } + + /** + * + * @param comment + * @return + */ + public String getScalar(Comment comment) { + String result = ""; + try { + CloseableHttpClient httpClient = HttpClients.createSystem(); + HttpPost request = new HttpPost(scalarUrl); + RequestConfig requestConfig = RequestConfig.custom() + .setSocketTimeout(5000) + .setConnectTimeout(5000) + .setConnectionRequestTimeout(5000) + .build(); + + request.setConfig(requestConfig); + + List< NameValuePair> params = new ArrayList(3); + params.add(new BasicNameValuePair("ppl_name", "Complete")); + params.add(new BasicNameValuePair("fragment1", comment.getSelection() + "")); + params.add(new BasicNameValuePair("fragment2", comment.getReformulation())); + request.setEntity(new UrlEncodedFormEntity(params, "UTF-8")); + + CloseableHttpResponse response = httpClient.execute(request); + result = EntityUtils.toString(response.getEntity(), "UTF-8"); + + } catch (UnsupportedEncodingException ex) { + Logger.getLogger(HttpRequestService.class.getName()).log(Level.SEVERE, null, ex); + } catch (IOException ex) { + Logger.getLogger(HttpRequestService.class.getName()).log(Level.SEVERE, null, ex); + } + return result; + } + + /** + * + * @param debateId + * @param theme + * @return + */ + public String getTheme(Long debateId, String theme) { + String result = ""; + try { + CloseableHttpClient httpClient = HttpClients.createSystem(); + HttpPost request = new HttpPost(themeUrl); + RequestConfig requestConfig = RequestConfig.custom() + .setSocketTimeout(5000) + .setConnectTimeout(5000) + .setConnectionRequestTimeout(5000) + .build(); + + request.setConfig(requestConfig); + + List< NameValuePair> params = new ArrayList(3); + params.add(new BasicNameValuePair("ppl_name", "Complete")); + params.add(new BasicNameValuePair("debate_id", debateId + "")); + params.add(new BasicNameValuePair("platform_id", plateformId)); + params.add(new BasicNameValuePair("text", theme)); + request.setEntity(new UrlEncodedFormEntity(params, "UTF-8")); + + CloseableHttpResponse response = httpClient.execute(request); + JsonNode node = new ObjectMapper().readTree(response.getEntity().getContent()); + ObjectNode obj = JsonNodeFactory.instance.objectNode(); + ArrayNode arr = JsonNodeFactory.instance.arrayNode(); + node.get("arguments").fieldNames().forEachRemaining((String val) -> { + arr.add(Long.parseLong(val)); + }); + obj.set("comments", arr); + obj.set("theme", node.get("theme")); + result = obj.toString(); + + } catch (UnsupportedEncodingException ex) { + Logger.getLogger(HttpRequestService.class.getName()).log(Level.SEVERE, null, ex); + } catch (IOException ex) { + Logger.getLogger(HttpRequestService.class.getName()).log(Level.SEVERE, null, ex); + } + return result; + } + + /** + * + * @param text + * @param comment + * @return + */ + public TagSet retrieveTags(String text, Comment comment) { + TagSet tags = new TagSet(); + try { + CloseableHttpClient httpClient = HttpClients.createSystem(); + HttpPost httppost = new HttpPost(idefixUrl); + RequestConfig requestConfig = RequestConfig.custom() + .setSocketTimeout(1 * 60 * 1000) + .setConnectTimeout(1 * 60 * 1000) + .setConnectionRequestTimeout(1 * 60 * 1000) + .build(); + httppost.setConfig(requestConfig); + + List< NameValuePair> params = new ArrayList(3); + params.add(new BasicNameValuePair("extract_term_list", text)); + params.add(new BasicNameValuePair("extract_submit", "Extraire")); + params.add(new BasicNameValuePair("number", "20")); + httppost.setEntity(new UrlEncodedFormEntity(params, "windows-1252")); + + CloseableHttpResponse response = httpClient.execute(httppost); + String responseString = EntityUtils.toString(response.getEntity(), "windows-1252"); + + if (responseString.contains("Pas assez de termes, bye")) { + return null; + } + tags = this.parseTags(responseString); + + } catch (UnsupportedEncodingException ex) { + Logger.getLogger(HttpRequestService.class.getName()).log(Level.SEVERE, null, ex); + } catch (IOException ex) { + Logger.getLogger(HttpRequestService.class.getName()).log(Level.SEVERE, null, ex); + } + return tags; + } + + /** + * + * @param tags + * @param text + * @return + */ + public TagSet sendTag(TagSet tags, String text) { + TagSet newTags = new TagSet(); + try { + CloseableHttpClient httpClient = HttpClients.createSystem(); + HttpPost httppost = new HttpPost(idefixUrl); + RequestConfig requestConfig = RequestConfig.custom() + .setSocketTimeout(1 * 60 * 1000) + .setConnectTimeout(1 * 60 * 1000) + .setConnectionRequestTimeout(1 * 60 * 1000) + .build(); + httppost.setConfig(requestConfig); + + List< NameValuePair> params = new ArrayList(5); + params.add(new BasicNameValuePair("linkit_add", "Valider")); + params.add(new BasicNameValuePair("add_items", tags.toString())); + params.add(new BasicNameValuePair("extract_submit", "1")); + params.add(new BasicNameValuePair("extract_term_list", text)); + params.add(new BasicNameValuePair("extract_termid_list", "")); + httppost.setEntity(new UrlEncodedFormEntity(params, "windows-1252")); + + CloseableHttpResponse response = httpClient.execute(httppost); + String responseString = EntityUtils.toString(response.getEntity(), "windows-1252"); + if (responseString.contains("Pas assez de termes, bye")) { + return null; + } + newTags = this.parseTags(responseString); + } catch (UnsupportedEncodingException ex) { + Logger.getLogger(HttpRequestService.class + .getName()).log(Level.SEVERE, null, ex); + } catch (IOException ex) { + Logger.getLogger(HttpRequestService.class + .getName()).log(Level.SEVERE, null, ex); + } + return newTags; + } + + private TagSet parseTags(String string) throws IOException { + TagSet tags = new TagSet(); + Document doc = Jsoup.parse(string, "windows-1252"); + if (doc.getElementsByTag("result").size() > 0) { + String tagString = doc.getElementsByTag("result").get(0).text(); + if (tagString.length() > 0) { + tags = new TagSet(tagString); + } + } + return tags; + } +} diff --git a/src/main/java/fr/lirmm/aren/service/InstitutionService.java b/src/main/java/fr/lirmm/aren/service/InstitutionService.java new file mode 100644 index 0000000..ef4f66a --- /dev/null +++ b/src/main/java/fr/lirmm/aren/service/InstitutionService.java @@ -0,0 +1,62 @@ +package fr.lirmm.aren.service; + +import java.util.List; + +import javax.enterprise.context.ApplicationScoped; +import javax.ws.rs.NotFoundException; + +import fr.lirmm.aren.model.Institution; +import java.util.Set; +import java.util.HashSet; + +/** + * Service that provides operations for {link Institution}. + * + * @author Florent Descroix {@literal } + */ +@ApplicationScoped +public class InstitutionService extends AbstractService { + + /** + * + */ + public InstitutionService() { + super(Institution.class); + } + + /** + * + * @param entId + * @return + */ + public Institution findByEntId(String entId) { + List results = getEntityManager().createQuery("SELECT i " + + "FROM Institution i " + + "WHERE i.entId = :entId", Institution.class) + .setParameter("entId", entId) + .getResultList(); + + if (results.isEmpty()) { + throw new NotFoundException(); + } + return results.get(0); + } + + /** + * + * @param withTeam + * @param withUsers + * @return + */ + public Set findAll(boolean withTeam, boolean withUsers) { + return new HashSet(getEntityManager().createQuery("SELECT i " + + "FROM Institution i " + + (withTeam || withUsers + ? "LEFT JOIN FETCH i.users u " + : "") + + (withUsers + ? "LEFT JOIN FETCH i.teams t" + : ""), Institution.class) + .getResultList()); + } +} diff --git a/src/main/java/fr/lirmm/aren/service/MailingService.java b/src/main/java/fr/lirmm/aren/service/MailingService.java new file mode 100644 index 0000000..1720f22 --- /dev/null +++ b/src/main/java/fr/lirmm/aren/service/MailingService.java @@ -0,0 +1,92 @@ +package fr.lirmm.aren.service; + +import fr.lirmm.aren.producer.Configurable; + +import javax.mail.Message; +import javax.mail.MessagingException; +import javax.mail.Session; +import javax.mail.internet.InternetAddress; +import javax.mail.internet.MimeMessage; +import java.util.Properties; +import javax.enterprise.context.ApplicationScoped; +import javax.inject.Inject; +import javax.mail.PasswordAuthentication; +import javax.mail.Transport; +import javax.mail.internet.AddressException; + +/** + * + * @author florent + */ +@ApplicationScoped +public class MailingService { + + @Inject + @Configurable("smtp.server") + private String smtpServer; + + @Inject + @Configurable("smtp.username") + private String smtpUsername; + + @Inject + @Configurable("smtp.password") + private String smtpPassword; + + @Inject + @Configurable("smtp.port") + private String smtpPort; + + @Inject + @Configurable("smtp.tls") + private String smtpTls; + + @Inject + @Configurable("smtp.auth") + private String smtpAuth; + + /** + * + * @param from + * @param to + * @param subject + * @param content + */ + public void sendMail(String from, String to, String subject, String content) throws AddressException, MessagingException { + + Properties props = new Properties(); + props.put("mail.smtp.auth", smtpAuth); + props.put("mail.smtp.starttls.enable", smtpTls); + props.put("mail.smtp.host", smtpServer); + props.put("mail.smtp.port", smtpPort); + + // Get the Session object. + Session session = Session.getInstance(props, + new javax.mail.Authenticator() { + @Override + protected PasswordAuthentication getPasswordAuthentication() { + return new PasswordAuthentication(smtpUsername, smtpPassword); + } + }); + + // Create a default MimeMessage object. + Message message = new MimeMessage(session); + + // Set From: header field of the header. + message.setFrom(new InternetAddress(from)); + + // Set To: header field of the header. + message.setRecipients(Message.RecipientType.TO, + InternetAddress.parse(to)); + + // Set Subject: header field + message.setSubject(subject); + + // Send the actual HTML message, as big as you like + message.setContent(content, "text/html"); + + // Send message + Transport.send(message); + } + +} diff --git a/src/main/java/fr/lirmm/aren/service/NotificationService.java b/src/main/java/fr/lirmm/aren/service/NotificationService.java new file mode 100644 index 0000000..a6cc5c0 --- /dev/null +++ b/src/main/java/fr/lirmm/aren/service/NotificationService.java @@ -0,0 +1,91 @@ +package fr.lirmm.aren.service; + +import java.util.List; + +import javax.enterprise.context.ApplicationScoped; + +import fr.lirmm.aren.model.Notification; +import java.util.Set; +import java.util.HashSet; + +/** + * Service that provides operations for {link Notification}. + * + * @author Florent Descroix {@literal } + */ +@ApplicationScoped +public class NotificationService extends AbstractService { + + /** + * + */ + public NotificationService() { + super(Notification.class); + } + + /** + * + * @param userId + * @return + */ + public Set findAllByUser(Long userId) { + + List notifs = getEntityManager().createQuery("SELECT n " + + "FROM Notification n " + + "WHERE n.owner.id = :userId " + + "ORDER BY n.created DESC", Notification.class) + .setParameter("userId", userId) + .getResultList(); + if (notifs.isEmpty()) { + return null; + } + return new HashSet(notifs); + } + + /** + * + * @param userId + * @param readenLimit + * @return + */ + public Set findAllFirstsByUser(Long userId, int readenLimit) { + return new HashSet(getEntityManager().createQuery("SELECT n1 " + + "FROM Notification n1 " + + "WHERE n1.owner.id = :userId " + + "AND (n1.unread = true " + + "OR (SELECT COUNT(id) " + + " FROM Notification n2 " + + " WHERE n2.owner.id = :userId " + + " AND n2.created >= n1.created) <= :readenLimit)") + .setParameter("userId", userId) + .setParameter("readenLimit", Long.valueOf(readenLimit)) + .getResultList()); + } + + /** + * + * @param userId + */ + public void readAllByUser(Long userId) { + super.transactionBegin(); + getEntityManager().createQuery("UPDATE Notification n " + + "SET n.unread = false " + + "WHERE n.owner.id = :userId") + .setParameter("userId", userId) + .executeUpdate(); + super.commit(); + } + + /** + * + * @param userId + */ + public void removeAllByUser(Long userId) { + super.transactionBegin(); + getEntityManager().createQuery("DELETE Notification n " + + "WHERE n.owner.id = :userId") + .setParameter("userId", userId) + .executeUpdate(); + super.commit(); + } +} diff --git a/src/main/java/fr/lirmm/aren/service/ODFService.java b/src/main/java/fr/lirmm/aren/service/ODFService.java new file mode 100644 index 0000000..36e145f --- /dev/null +++ b/src/main/java/fr/lirmm/aren/service/ODFService.java @@ -0,0 +1,423 @@ +package fr.lirmm.aren.service; + +import fr.lirmm.aren.model.Comment; +import fr.lirmm.aren.model.Debate; +import java.io.File; +import java.time.format.DateTimeFormatter; +import java.util.logging.Level; +import java.util.logging.Logger; +import javax.enterprise.context.ApplicationScoped; +import org.jsoup.Jsoup; +import org.jsoup.helper.W3CDom; +import org.odftoolkit.odfdom.doc.OdfTextDocument; +import org.odftoolkit.odfdom.dom.element.style.StyleParagraphPropertiesElement; +import org.odftoolkit.odfdom.dom.element.office.OfficeTextElement; +import org.odftoolkit.odfdom.dom.element.style.StyleListLevelPropertiesElement; +import org.odftoolkit.odfdom.dom.element.style.StyleMasterPageElement; +import org.odftoolkit.odfdom.dom.element.style.StyleTextPropertiesElement; +import org.odftoolkit.odfdom.dom.element.table.TableTableCellElement; +import org.odftoolkit.odfdom.dom.element.table.TableTableElement; +import org.odftoolkit.odfdom.dom.element.table.TableTableRowElement; +import org.odftoolkit.odfdom.dom.element.text.TextListItemElement; +import org.odftoolkit.odfdom.dom.element.text.TextListLevelStyleNumberElement; +import org.odftoolkit.odfdom.dom.style.OdfStyleFamily; +import org.odftoolkit.odfdom.dom.style.OdfStylePropertySet; +import org.odftoolkit.odfdom.dom.style.props.OdfPageLayoutProperties; +import org.odftoolkit.odfdom.dom.style.props.OdfStyleProperty; +import org.odftoolkit.odfdom.incubator.doc.draw.OdfDrawImage; +import org.odftoolkit.odfdom.incubator.doc.office.OdfOfficeStyles; +import org.odftoolkit.odfdom.incubator.doc.style.OdfStylePageLayout; +import org.odftoolkit.odfdom.incubator.doc.text.OdfTextHeading; +import org.odftoolkit.odfdom.incubator.doc.text.OdfTextList; +import org.odftoolkit.odfdom.incubator.doc.text.OdfTextListStyle; +import org.odftoolkit.odfdom.incubator.doc.text.OdfTextParagraph; +import org.odftoolkit.odfdom.incubator.doc.text.OdfTextSpan; +import org.odftoolkit.odfdom.pkg.OdfFileDom; +import org.w3c.dom.Document; +import org.w3c.dom.Node; + +/** + * + * @author florent + */ +@ApplicationScoped +public class ODFService { + + private OdfTextDocument outputDocument; + private OdfFileDom contentDom; + private OdfOfficeStyles stylesOfficeStyles; + private OfficeTextElement officeText; + private DateTimeFormatter formater = DateTimeFormatter.ofPattern("dd/MM/yyyy - HH:mm:ss"); + + private OdfStyleProcessor styleProcessor = new OdfStyleProcessor(); + + /** + * + */ + public ODFService() { + try { + this.outputDocument = OdfTextDocument.newTextDocument(); + this.contentDom = outputDocument.getContentDom(); + this.stylesOfficeStyles = outputDocument.getOrCreateDocumentStyles(); + this.officeText = outputDocument.getContentRoot(); + } catch (Exception ex) { + Logger.getLogger(ODFService.class.getName()).log(Level.SEVERE, null, ex); + } + } + + /** + * + * @param debate + * @return + * @throws Exception + */ + public File parseDebate(Debate debate) throws Exception { + Document document = W3CDom.convert(Jsoup.parse(debate.getDocument().getContent())); + + cleanOutDocument(); + setOfficeStyles(); + + //Set main heading + OdfTextHeading heading = new OdfTextHeading(contentDom, "Heading", debate.getDocument().getName()); + OdfTextSpan span = new OdfTextSpan(contentDom, "Text_20_indice", ""); + span.appendChild(new OdfTextSpan(contentDom, "Text_20_grey", " par ")); + span.addContent(debate.getDocument().getAuthor()); + heading.appendChild(span); + officeText.appendChild(heading); + + TableTableElement table = new TableTableElement(contentDom); + table.newTableTableColumnElement().setTableNumberColumnsRepeatedAttribute(2); + TableTableRowElement row = table.newTableTableRowElement(); + officeText.appendChild(table); + + TableTableCellElement cell = new TableTableCellElement(contentDom); + htmlToOdf(document.getElementsByTagName("body").item(0), cell); + cell.setProperty(StyleParagraphPropertiesElement.MarginRight, "0.5cm"); + row.appendChild(cell); + + TableTableCellElement commentsList = new TableTableCellElement(contentDom); + debate.getComments().forEach((Comment comment) -> { + if (comment.getParent() == null) { + parseComment(comment, commentsList, 0); + } + }); + row.appendChild(commentsList); + + File file = new File("/tmp/aren_export_" + System.currentTimeMillis() + ".odt"); + this.outputDocument.save(file); + return file; + } + + /** + * + * @param comment + * @param root + * @param level + */ + public void parseComment(Comment comment, Node root, int level) { + OdfTextSpan span; + OdfTextParagraph paragraph; + String color; + + if (comment.getOpinion() == Comment.Opinion.AGAINST) { + color = "orange"; + } else if (comment.getOpinion() == Comment.Opinion.FOR) { + color = "blue"; + } else { + color = "grey"; + } + + paragraph = new OdfTextParagraph(contentDom, "Text_20_border_left_" + color); + paragraph.setProperty(StyleParagraphPropertiesElement.MarginLeft, level * 0.5 + "cm"); + paragraph.appendChild(new OdfTextSpan(contentDom, "Text_20_" + color, + comment.getOwner().getFirstName() + " " + comment.getOwner().getLastName() + " - " + comment.getCreated().format(formater))); + root.appendChild(paragraph); + + Document selection = W3CDom.convert(Jsoup.parse(comment.getSelection())); + paragraph = new OdfTextParagraph(contentDom, "Text_20_border_left_" + color, + selection.getElementsByTagName("body").item(0).getTextContent()); + paragraph.setProperty(StyleParagraphPropertiesElement.MarginLeft, level * 0.5 + "cm"); + styleProcessor.setStyle(paragraph).backgroundColor("#dddfe2"); + root.appendChild(paragraph); + + paragraph = new OdfTextParagraph(contentDom, "Text_20_border_left_" + color); + paragraph.setProperty(StyleParagraphPropertiesElement.MarginLeft, level * 0.5 + "cm"); + span = new OdfTextSpan(contentDom, "Text_20_italic", comment.getReformulation()); + paragraph.appendChild(span); + root.appendChild(paragraph); + + paragraph = new OdfTextParagraph(contentDom, "Text_20_border_left_" + color, comment.getArgumentation()); + paragraph.setProperty(StyleParagraphPropertiesElement.MarginLeft, level * 0.5 + "cm"); + root.appendChild(paragraph); + + paragraph = new OdfTextParagraph(contentDom); + styleProcessor.setStyle(paragraph).fontSize("9pt"); + root.appendChild(paragraph); + + comment.getComments().forEach((Comment child) -> { + parseComment(child, root, level + 1); + }); + } + + private void htmlToOdf(Node rootHtml, Node rootOdf) { + if (rootHtml.hasChildNodes()) { + for (int i = 0; i < rootHtml.getChildNodes().getLength(); i++) { + Node childHtml = rootHtml.getChildNodes().item(i); + Node childOdf; + switch (childHtml.getNodeName()) { + case "#text": + if (rootOdf instanceof TextListItemElement) { + childOdf = new OdfTextParagraph(contentDom, "", childHtml.getTextContent()); + } else { + childOdf = contentDom.createTextNode(childHtml.getTextContent()); + } + break; + case "span": + childOdf = new OdfTextSpan(contentDom); + break; + case "h1": + childOdf = new OdfTextHeading(contentDom, "Heading_20_1"); + break; + case "h2": + childOdf = new OdfTextHeading(contentDom, "Heading_20_2"); + break; + case "h3": + childOdf = new OdfTextHeading(contentDom, "Heading_20_3"); + break; + case "h4": + childOdf = new OdfTextHeading(contentDom, "Heading_20_4"); + break; + case "b": + case "strong": + childOdf = new OdfTextSpan(contentDom, "Text_20_bold"); + break; + case "i": + case "em": + childOdf = new OdfTextSpan(contentDom, "Text_20_italic"); + break; + case "u": + childOdf = new OdfTextSpan(contentDom, "Text_20_uderline"); + break; + case "ul": + childOdf = new OdfTextList(contentDom); + break; + case "li": + childOdf = new TextListItemElement(contentDom); + break; + case "img": + childOdf = new OdfDrawImage(contentDom); + break; + default: + childOdf = new OdfTextParagraph(contentDom); + } + + rootOdf.appendChild(childOdf); + htmlToOdf(childHtml, childOdf); + } + + } + } + + private void cleanOutDocument() { + org.w3c.dom.Node childNode = officeText.getFirstChild(); + while (childNode != null) { + officeText.removeChild(childNode); + childNode = officeText.getFirstChild(); + } + } + + private void setOfficeStyles() { + // Set landscape layout + StyleMasterPageElement defaultPage = outputDocument.getOfficeMasterStyles().getMasterPage("Standard"); + String pageLayoutName = defaultPage.getStylePageLayoutNameAttribute(); + OdfStylePageLayout pageLayoutStyle = defaultPage.getAutomaticStyles().getPageLayout(pageLayoutName); + pageLayoutStyle.setProperty(OdfPageLayoutProperties.PrintOrientation, "landscape"); + pageLayoutStyle.setProperty(OdfPageLayoutProperties.PageHeight, "21cm"); + pageLayoutStyle.setProperty(OdfPageLayoutProperties.PageWidth, "29.7cm"); + + // Set default font + styleProcessor.setStyle(stylesOfficeStyles.getDefaultStyle(OdfStyleFamily.Paragraph)) + .margins("0cm", "0cm", "0.1cm", "0cm") + .fontFamilly("Arial") + .fontSize("11pt") + .textAlign("justify"); + + // Main title + styleProcessor.setStyle(stylesOfficeStyles.getStyle("Heading", OdfStyleFamily.Paragraph)) + .textAlign("center") + .margins("0.4cm", "0cm", "0.2cm", "0cm") + .fontWeight("bold") + .fontSize("18pt") + .color("#b84000"); + + // Title 1 + styleProcessor.setStyle(stylesOfficeStyles.getStyle("Heading_20_1", OdfStyleFamily.Paragraph)) + .margins("0.35cm", "0cm", "0.2cm", "0cm") + .fontWeight("bold") + .fontSize("17pt") + .color("#b84000"); + + // Title 2 + styleProcessor.setStyle(stylesOfficeStyles.getStyle("Heading_20_2", OdfStyleFamily.Paragraph)) + .margins("0.3cm", "0cm", "0.2cm", "0cm") + .fontWeight("bold") + .fontSize("15pt") + .color("#b84000"); + + // Title 3 + styleProcessor.setStyle(stylesOfficeStyles.getStyle("Heading_20_3", OdfStyleFamily.Paragraph)) + .margins("0.25cm", "0cm", "0.2cm", "0cm") + .fontWeight("bold") + .fontSize("13pt"); + + // Title 4 + styleProcessor.setStyle(stylesOfficeStyles.getStyle("Heading_20_4", OdfStyleFamily.Paragraph)) + .margins("0.2cm", "0cm", "0.2cm", "0cm") + .fontWeight("bold") + .fontSize("11pt") + .color("#b84000"); + + // Bold + styleProcessor.setStyle(stylesOfficeStyles.newStyle("Text_20_bold", OdfStyleFamily.Text)) + .fontWeight("bold"); + + // Italic + styleProcessor.setStyle(stylesOfficeStyles.newStyle("Text_20_italic", OdfStyleFamily.Text)) + .fontStyle("italic"); + + // Underline + styleProcessor.setStyle(stylesOfficeStyles.newStyle("Text_20_underline", OdfStyleFamily.Text)) + .textUnderline("auto", "solid", "font-color"); + + // Orange + styleProcessor.setStyle(stylesOfficeStyles.newStyle("Text_20_orange", OdfStyleFamily.Text)) + .color("#b84000"); + + // Blue + styleProcessor.setStyle(stylesOfficeStyles.newStyle("Text_20_blue", OdfStyleFamily.Text)) + .color("#4d9999"); + + // Grey + styleProcessor.setStyle(stylesOfficeStyles.newStyle("Text_20_grey", OdfStyleFamily.Text)) + .color("#b2b2b2"); + + // Indice + styleProcessor.setStyle(stylesOfficeStyles.newStyle("Text_20_indice", OdfStyleFamily.Text)) + .textPosition("sub 50%"); + + // Comment List + TextListLevelStyleNumberElement level; + OdfTextListStyle listStyle = stylesOfficeStyles.getListStyle("Numbering_20_1"); + for (int i = 0; i < 10; i++) { + level = (TextListLevelStyleNumberElement) listStyle.getLevel(i + 1); + level.setStyleNumFormatAttribute(""); + level.setStyleNumSuffixAttribute(""); + level.setProperty(StyleListLevelPropertiesElement.SpaceBefore, (i * 0.5) + "cm"); + level.setProperty(StyleListLevelPropertiesElement.MinLabelWidth, 0 + "cm"); + } + + // Border Orange + styleProcessor.setStyle(stylesOfficeStyles.newStyle("Text_20_border_left_orange", OdfStyleFamily.Paragraph)) + .paddings("0cm", "0cm", "0cm", "0.2cm") + .setProperty(StyleParagraphPropertiesElement.BorderLeft, "3pt solid #b84000"); + + // Border Blue + styleProcessor.setStyle(stylesOfficeStyles.newStyle("Text_20_border_left_blue", OdfStyleFamily.Paragraph)) + .paddings("0cm", "0cm", "0cm", "0.2cm") + .setProperty(StyleParagraphPropertiesElement.BorderLeft, "3pt solid #4d9999"); + + // Border Grey + styleProcessor.setStyle(stylesOfficeStyles.newStyle("Text_20_border_left_grey", OdfStyleFamily.Paragraph)) + .paddings("0cm", "0cm", "0cm", "0.2cm") + .setProperty(StyleParagraphPropertiesElement.BorderLeft, "3pt solid #b2b2b2"); + } + + private class OdfStyleProcessor { + + private OdfStylePropertySet style; + + public OdfStyleProcessor() { + } + + public OdfStyleProcessor setStyle(OdfStylePropertySet style) { + this.style = style; + return this; + } + + public OdfStyleProcessor fontFamilly(String value) { + this.style.setProperty(StyleTextPropertiesElement.FontFamily, value); + this.style.setProperty(StyleTextPropertiesElement.FontName, value); + return this; + } + + public OdfStyleProcessor fontWeight(String value) { + this.style.setProperty(StyleTextPropertiesElement.FontWeight, value); + this.style.setProperty(StyleTextPropertiesElement.FontWeightAsian, value); + this.style.setProperty(StyleTextPropertiesElement.FontWeightComplex, value); + return this; + } + + public OdfStyleProcessor fontStyle(String value) { + this.style.setProperty(StyleTextPropertiesElement.FontStyle, value); + this.style.setProperty(StyleTextPropertiesElement.FontStyleAsian, value); + this.style.setProperty(StyleTextPropertiesElement.FontStyleComplex, value); + return this; + } + + public OdfStyleProcessor fontSize(String value) { + this.style.setProperty(StyleTextPropertiesElement.FontSize, value); + this.style.setProperty(StyleTextPropertiesElement.FontSizeAsian, value); + this.style.setProperty(StyleTextPropertiesElement.FontSizeComplex, value); + return this; + } + + public OdfStyleProcessor textUnderline(String width, String style, String color) { + this.style.setProperty(StyleTextPropertiesElement.TextUnderlineWidth, width); + this.style.setProperty(StyleTextPropertiesElement.TextUnderlineStyle, style); + this.style.setProperty(StyleTextPropertiesElement.TextUnderlineColor, color); + return this; + } + + public OdfStyleProcessor margins(String top, String right, String bottom, String left) { + this.style.setProperty(StyleParagraphPropertiesElement.MarginTop, top); + this.style.setProperty(StyleParagraphPropertiesElement.MarginRight, right); + this.style.setProperty(StyleParagraphPropertiesElement.MarginBottom, bottom); + this.style.setProperty(StyleParagraphPropertiesElement.MarginLeft, left); + return this; + } + + public OdfStyleProcessor paddings(String top, String right, String bottom, String left) { + this.style.setProperty(StyleParagraphPropertiesElement.PaddingTop, top); + this.style.setProperty(StyleParagraphPropertiesElement.PaddingRight, right); + this.style.setProperty(StyleParagraphPropertiesElement.PaddingBottom, bottom); + this.style.setProperty(StyleParagraphPropertiesElement.PaddingLeft, left); + return this; + } + + public OdfStyleProcessor color(String value) { + this.style.setProperty(StyleTextPropertiesElement.Color, value); + return this; + } + + public OdfStyleProcessor backgroundColor(String value) { + this.style.setProperty(StyleParagraphPropertiesElement.BackgroundColor, value); + return this; + } + + public OdfStyleProcessor textAlign(String value) { + this.style.setProperty(StyleParagraphPropertiesElement.TextAlign, value); + return this; + } + + public OdfStyleProcessor textPosition(String value) { + this.style.setProperty(StyleTextPropertiesElement.TextPosition, value); + return this; + } + + public OdfStyleProcessor setProperty(OdfStyleProperty prop, String value) { + this.style.setProperty(prop, value); + return this; + } + } + +} diff --git a/src/main/java/fr/lirmm/aren/service/TeamService.java b/src/main/java/fr/lirmm/aren/service/TeamService.java new file mode 100644 index 0000000..fe52d69 --- /dev/null +++ b/src/main/java/fr/lirmm/aren/service/TeamService.java @@ -0,0 +1,83 @@ +package fr.lirmm.aren.service; + +import java.util.List; + +import javax.enterprise.context.ApplicationScoped; +import javax.ws.rs.NotFoundException; + +import fr.lirmm.aren.model.Team; +import java.util.Set; +import java.util.HashSet; + +/** + * Service that provides operations for {link Team}. + * + * @author Florent Descroix {@literal } + */ +@ApplicationScoped +public class TeamService extends AbstractService { + + /** + * + */ + public TeamService() { + super(Team.class); + } + + /** + * + * @param entity + */ + @Override + protected void afterEdit(Team entity) { + this.updateExternaleTables(entity); + } + + /** + * + * @param standalone + * @return + */ + public Set findAll(boolean standalone) { + + return new HashSet(getEntityManager().createQuery("SELECT t " + + "FROM Team t " + + (standalone + ? "WHERE t.institution IS NULL" + : ""), Team.class) + .getResultList()); + } + + /** + * + * @param entId + * @return + */ + public Team findByEntId(String entId) { + List results = getEntityManager().createQuery("SELECT i " + + "FROM Team t " + + "WHERE t.entId = :entId", Team.class) + .setParameter("entId", entId) + .getResultList(); + + if (results.isEmpty()) { + throw new NotFoundException(); + } + return results.get(0); + } + + /** + * + * @param team + */ + public void updateExternaleTables(Team team) { + super.transactionBegin(); + getEntityManager().createQuery("UPDATE Team t SET " + + "t.usersCount = (SELECT COUNT(u) FROM t.users u), " + + "t.debatesCount = (SELECT COUNT(d) FROM t.debates d) " + + "WHERE t.id = :id") + .setParameter("id", team.getId()) + .executeUpdate(); + super.commit(); + } +} diff --git a/src/main/java/fr/lirmm/aren/service/UserService.java b/src/main/java/fr/lirmm/aren/service/UserService.java new file mode 100644 index 0000000..39d9d44 --- /dev/null +++ b/src/main/java/fr/lirmm/aren/service/UserService.java @@ -0,0 +1,217 @@ +package fr.lirmm.aren.service; + +import java.util.List; + +import javax.enterprise.context.ApplicationScoped; +import javax.inject.Inject; + +import fr.lirmm.aren.model.User; +import fr.lirmm.aren.security.PasswordEncoder; +import java.time.ZonedDateTime; +import java.time.temporal.ChronoUnit; +import java.util.Set; +import java.util.HashSet; + +/** + * Service that provides operations for {@link User}. + * + * @author Florent Descroix {@literal } + */ +@ApplicationScoped +public class UserService extends AbstractService { + + @Inject + private PasswordEncoder passwordEncoder; + + /** + * + */ + public UserService() { + super(User.class); + } + + /** + * + * @param entity + */ + @Override + protected void afterEdit(User entity) { + this.updateExternaleTables(entity); + } + + /** + * + * @param user + */ + @Override + public void create(User user) { + String hashedPassword = passwordEncoder.hashPassword(user.getPassword()); + user.setPassword(hashedPassword); + super.create(user); + } + + /** + * + * @param user + */ + @Override + public void edit(User user) { + super.edit(user); + } + + /** + * + * @param user + * @param newPassword + */ + public void changePassword(User user, String newPassword) { + String hashedPassword = passwordEncoder.hashPassword(newPassword); + user.setPassword(hashedPassword); + super.edit(user); + this.invalidateToken(user); + } + + /** + * Find a user by username or email. + * + * @param identifier + * @return + */ + public User findByUsernameOrEmail(String identifier) { + List results = getEntityManager().createQuery("SELECT u " + + "FROM User u " + + "WHERE (u.username = :identifier " + + "OR u.email = :identifier)", User.class) + .setParameter("identifier", identifier) + .getResultList(); + + if (results.isEmpty()) { + return null; + } + return results.get(0); + } + + /** + * + * @param entId + * @return + */ + public User findByEntId(String entId) { + List results = getEntityManager().createQuery("SELECT u " + + "FROM User u " + + "WHERE u.active = true " + + "AND u.entId = :entId", User.class) + .setParameter("entId", entId) + .getResultList(); + + if (results.isEmpty()) { + return null; + } + return results.get(0); + } + + /** + * + * @param standalone + * @return + */ + public Set findAll(boolean standalone) { + + return new HashSet(getEntityManager().createQuery("SELECT u " + + "FROM User u " + + "WHERE u.active = true " + + (standalone + ? "AND u.institution IS NULL " + : ""), User.class) + .getResultList()); + } + + /** + * + * @param debateId + * @return + */ + public List findByDebate(Long debateId) { + List users = getEntityManager().createQuery("SELECT u " + + "FROM User u " + + "LEFT JOIN u.teams t " + + "LEFT JOIN t.debates d " + + "WHERE u.active = true " + + "AND d.id = :debateId", User.class) + .setParameter("debateId", debateId) + .getResultList(); + + if (users.isEmpty()) { + return null; + } + return users; + } + + /** + * + * @param user + */ + public void updateLastLogin(User user) { + super.transactionBegin(); + getEntityManager().createQuery("UPDATE User u " + + "SET u.lastLogin = :now " + + "WHERE u.id = :userId") + .setParameter("now", ZonedDateTime.now().truncatedTo(ChronoUnit.SECONDS)) + .setParameter("userId", user.getId()) + .executeUpdate(); + super.commit(); + getEntityManager().refresh(user); + } + + /** + * + * @param user + */ + public void invalidateToken(User user) { + super.transactionBegin(); + getEntityManager().createQuery("UPDATE User u " + + "SET u.tokenValidity = :now " + + "WHERE u.id = :userId") + .setParameter("now", ZonedDateTime.now().truncatedTo(ChronoUnit.SECONDS)) + .setParameter("userId", user.getId()) + .executeUpdate(); + super.commit(); + getEntityManager().refresh(user); + } + + /** + * + * @param userId + */ + public void hide(Long userId) { + super.transactionBegin(); + getEntityManager().createQuery("UPDATE User u " + + "SET u.active = :active " + + ", u.password = NULL " + + ", u.username = NULL " + + ", u.firstName = NULL " + + ", u.lastName = NULL " + + ", u.email = NULL " + + ", u.authority = :authority " + + "WHERE u.id = :userId") + .setParameter("authority", User.Authority.DELETED) + .setParameter("active", false) + .setParameter("userId", userId) + .executeUpdate(); + super.commit(); + } + + /** + * + * @param user + */ + public void updateExternaleTables(User user) { + super.transactionBegin(); + getEntityManager().createQuery("UPDATE Team t SET " + + "t.usersCount = (SELECT COUNT(u) from t.users u) " + + "WHERE t IN (SELECT t1 FROM User u LEFT JOIN u.teams t1 WHERE u.id = :id)") + .setParameter("id", user.getId()) + .executeUpdate(); + super.commit(); + } +} diff --git a/src/main/java/fr/lirmm/aren/service/agenda/ACalendarService.java b/src/main/java/fr/lirmm/aren/service/agenda/ACalendarService.java new file mode 100644 index 0000000..6e65a7b --- /dev/null +++ b/src/main/java/fr/lirmm/aren/service/agenda/ACalendarService.java @@ -0,0 +1,56 @@ +package fr.lirmm.aren.service.agenda; + +import fr.lirmm.aren.model.agenda.ACalendar; +import fr.lirmm.aren.service.AbstractService; +import fr.lirmm.aren.service.HttpRequestService; + +import javax.enterprise.context.ApplicationScoped; +import javax.inject.Inject; +import javax.persistence.TypedQuery; +import javax.ws.rs.NotFoundException; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +/** + * @author Havana Andriambolaharimihanta + */ +@ApplicationScoped +public class ACalendarService extends AbstractService { + public ACalendarService() { + super(ACalendar.class); + } + + private TypedQuery generateQuery(Long aCalendarId) { + TypedQuery query = getEntityManager().createQuery("SELECT ac " + +"FROM ACalendar ac " + + (aCalendarId != null + ? "WHERE ac.id = :choiceId " + : "WHERE ac.id IS NOT NULL ") + ,ACalendar.class + ) ; + if (aCalendarId != null) { + query.setParameter("choiceId", aCalendarId); + } + return query ; + } + + public Set findAll() { + return new HashSet(generateQuery(null).getResultList()); + } + + @Override + public void edit(ACalendar aCalendar) { + super.edit(aCalendar); + } + + public ACalendar find(Long aCalendarId, boolean withVotes) { + List results = generateQuery(aCalendarId).getResultList(); + if (results.isEmpty()) { + throw new NotFoundException(); + } + return results.get(0); + } + + +} \ No newline at end of file diff --git a/src/main/java/fr/lirmm/aren/service/framadate/FDChoiceService.java b/src/main/java/fr/lirmm/aren/service/framadate/FDChoiceService.java new file mode 100644 index 0000000..12a1d4a --- /dev/null +++ b/src/main/java/fr/lirmm/aren/service/framadate/FDChoiceService.java @@ -0,0 +1,60 @@ +package fr.lirmm.aren.service.framadate; + +import fr.lirmm.aren.model.Category; +import fr.lirmm.aren.model.Document; +import fr.lirmm.aren.model.User; +import fr.lirmm.aren.model.framadate.FDChoice; +import fr.lirmm.aren.service.AbstractService; +import fr.lirmm.aren.service.HttpRequestService; + +import javax.enterprise.context.ApplicationScoped; +import javax.inject.Inject; +import javax.persistence.TypedQuery; +import javax.ws.rs.NotFoundException; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +/** + * @author Havana Andriambolaharimihanta + */ +@ApplicationScoped +public class FDChoiceService extends AbstractService { + public FDChoiceService() { + super(FDChoice.class); + } + + private TypedQuery generateQuery(Long choiceId, boolean withVotes) { + TypedQuery query = getEntityManager().createQuery("SELECT fdc " + +"FROM FDChoice fdc " + +(withVotes? "LEFT JOIN FETCH fdc.votes vo " : "") + + (choiceId != null + ? "WHERE fdc.id = :choiceId " + : "WHERE fdc.id IS NOT NULL ") + ,FDChoice.class + ) ; + if (choiceId != null) { + query.setParameter("choiceId", choiceId); + } + return query ; + } + + public Set findAll(boolean withVotes) { + return new HashSet(generateQuery(null, withVotes).getResultList()); + } + + @Override + public void edit(FDChoice fdChoice) { + super.edit(fdChoice); + } + + public FDChoice find(Long fdChoiceId, boolean withVotes) { + List results = generateQuery(fdChoiceId, withVotes).getResultList(); + if (results.isEmpty()) { + throw new NotFoundException(); + } + return results.get(0); + } + + +} \ No newline at end of file diff --git a/src/main/java/fr/lirmm/aren/service/framadate/FDThemeService.java b/src/main/java/fr/lirmm/aren/service/framadate/FDThemeService.java new file mode 100644 index 0000000..0c3df0a --- /dev/null +++ b/src/main/java/fr/lirmm/aren/service/framadate/FDThemeService.java @@ -0,0 +1,48 @@ +package fr.lirmm.aren.service.framadate; +import fr.lirmm.aren.model.framadate.FDTheme; +import fr.lirmm.aren.service.AbstractService; + +import javax.enterprise.context.ApplicationScoped; +import javax.persistence.TypedQuery; +import javax.ws.rs.NotFoundException; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +@ApplicationScoped +public class FDThemeService extends AbstractService { + public FDThemeService() { + super(FDTheme.class); + } + private TypedQuery generateQuery(Long themeId, boolean withChoices, boolean withVotes){ + TypedQuery query = getEntityManager().createQuery("SELECT ft " + +"FROM FDTheme ft " + +(withChoices? "LEFT JOIN FETCH ft.choices co " : "") + +(withVotes? "LEFT JOIN FETCH co.votes vo " : "") + + (themeId != null + ? "WHERE ft.id = :themeId " + : "WHERE ft.id IS NOT NULL ") + , FDTheme.class + ) ; + if (themeId != null) { + query.setParameter("themeId", themeId); + } + return query ; + } + + public Set findAll(boolean withChoices, boolean withVotes) { + return new HashSet(generateQuery(null, withChoices,withVotes).getResultList()); + } + + @Override + public void edit(FDTheme fdTheme) { + super.edit(fdTheme); + } + + public FDTheme find(Long fdPollId, boolean withChoices, boolean withVotes) { + List results = generateQuery(fdPollId, withChoices,withVotes).getResultList(); + if (results.isEmpty()) { + throw new NotFoundException(); + } + return results.get(0); + } +} diff --git a/src/main/java/fr/lirmm/aren/service/framadate/FDVoteService.java b/src/main/java/fr/lirmm/aren/service/framadate/FDVoteService.java new file mode 100644 index 0000000..ed9d034 --- /dev/null +++ b/src/main/java/fr/lirmm/aren/service/framadate/FDVoteService.java @@ -0,0 +1,52 @@ +package fr.lirmm.aren.service.framadate; + +import fr.lirmm.aren.model.framadate.FDChoice; +import fr.lirmm.aren.model.framadate.FDVote; +import fr.lirmm.aren.service.AbstractService; + +import javax.enterprise.context.ApplicationScoped; +import javax.ws.rs.NotFoundException; +import java.util.List; + +/** + * @author Havana Andriambolaharimihanta + */ +@ApplicationScoped +public class FDVoteService extends AbstractService { + public FDVoteService(){super(FDVote.class);} + + @Override + protected void afterCreate(FDVote entity){ + this.updateExternaleTables(entity); + } + + public void updateExternaleTables(FDVote vote){ + super.transactionBegin(); + List results = getEntityManager().createQuery("SELECT c " + + "FROM FDChoice c " + + "WHERE c.id = :id", FDChoice.class) + .setParameter("id", vote.getSubThemeId().getId()) + .getResultList(); + + if (results.isEmpty()) { + throw new NotFoundException(); + } + FDChoice choice=results.get(0) ; + if(vote.getOpinion().equals("FOR"))choice.setFor(choice.getFor()+1); + if(vote.getOpinion().equals("NEUTRAL"))choice.setNeutral(choice.getNeutral()+1); + if(vote.getOpinion().equals("AGAINST"))choice.setAgainst(choice.getAgainst()+1); + + getEntityManager().createQuery("UPDATE FDChoice c SET " + + "c._for = :for, " + + "c.against = :against, " + + "c.neutral = :neutral " + +"WHERE c.id=:id" + ) + .setParameter("for", choice.getFor()) + .setParameter("against", choice.getAgainst()) + .setParameter("neutral", choice.getNeutral()) + .setParameter("id", vote.getSubThemeId().getId()) + .executeUpdate(); + super.commit() ; + } +} \ No newline at end of file diff --git a/src/main/java/fr/lirmm/aren/servlet/BackgroundJobManager.java b/src/main/java/fr/lirmm/aren/servlet/BackgroundJobManager.java new file mode 100644 index 0000000..ed56f03 --- /dev/null +++ b/src/main/java/fr/lirmm/aren/servlet/BackgroundJobManager.java @@ -0,0 +1,51 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package fr.lirmm.aren.servlet; + +import fr.lirmm.aren.service.CommentService; +import java.util.Calendar; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; +import javax.inject.Inject; +import javax.servlet.ServletContextEvent; +import javax.servlet.ServletContextListener; +import javax.servlet.annotation.WebListener; + +/** + * + * @author florent + */ +@WebListener +public class BackgroundJobManager implements ServletContextListener { + + @Inject + private CommentService commentService; + + private ScheduledExecutorService scheduler; + + @Override + public void contextInitialized(ServletContextEvent event) { + Calendar c = Calendar.getInstance(); + c.add(Calendar.DAY_OF_MONTH, 1); + c.set(Calendar.HOUR_OF_DAY, 0); + c.set(Calendar.MINUTE, 0); + c.set(Calendar.SECOND, 0); + c.set(Calendar.MILLISECOND, 0); + long untilMidnight = (c.getTimeInMillis() - System.currentTimeMillis()); + long millisInDay = 24 * 60 * 60 * 1000; + + this.scheduler = Executors.newSingleThreadScheduledExecutor(); + this.scheduler.scheduleAtFixedRate(() -> { + this.commentService.updateAllTags(); + }, untilMidnight, millisInDay, TimeUnit.MILLISECONDS); + } + + @Override + public void contextDestroyed(ServletContextEvent event) { + this.scheduler.shutdownNow(); + } +} diff --git a/src/main/java/fr/lirmm/aren/servlet/CasLogin.java b/src/main/java/fr/lirmm/aren/servlet/CasLogin.java new file mode 100644 index 0000000..95155b3 --- /dev/null +++ b/src/main/java/fr/lirmm/aren/servlet/CasLogin.java @@ -0,0 +1,107 @@ +package fr.lirmm.aren.servlet; + +import java.io.IOException; + +import javax.inject.Inject; +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.ws.rs.core.HttpHeaders; + +import fr.lirmm.aren.model.User; +import fr.lirmm.aren.producer.Configurable; +import fr.lirmm.aren.security.token.AuthenticationTokenService; +import fr.lirmm.aren.service.CasAuthentificationService; +import java.net.MalformedURLException; +import java.net.URL; +import javax.servlet.http.Cookie; + +/** + * + * @author Florent Descroix {@literal } + */ +@WebServlet(name = "CasLogin", urlPatterns = {"/caslogin"}) +public class CasLogin extends HttpServlet { + + /** + * + */ + private static final long serialVersionUID = 1063853970050165333L; + + @Inject + private CasAuthentificationService casService; + + @Inject + private AuthenticationTokenService authenticationTokenService; + + @Inject + @Configurable("reverse-proxy") + private String proxyUrl; + + /** + * Handles the HTTP GET method. + * + * @param request servlet request + * @param response servlet response + * @throws java.io.IOException + * @throws javax.servlet.ServletException + */ + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { + + if (request.getParameter("ticket") != null) { + User user = null; + user = casService.getUserWithTicket(request.getParameter("ticket")); + String token = authenticationTokenService.issueToken(user); + + int maxAge = 360 * 24 * 60 * 60; + + String domain; + try { + domain = new URL(request.getRequestURL().toString()).getHost(); + Cookie cookie = new Cookie(HttpHeaders.AUTHORIZATION, token); + cookie.setComment("Authentification token for Aren platform"); + cookie.setDomain(domain); + cookie.setPath("/"); + cookie.setMaxAge(maxAge); + cookie.setSecure(false); + cookie.setHttpOnly(true); + response.addCookie(cookie); + } catch (MalformedURLException ex) { + } + if (proxyUrl.isEmpty()) { + response.sendRedirect("/"); + } else { + response.sendRedirect(proxyUrl); + } + } else { + response.sendRedirect(casService.getRedirectionUrl()); + } + } + + /** + * Handles the HTTP POST method. + * + * @param request servlet request + * @param response servlet response + * @throws ServletException if a servlet-specific error occurs + * @throws IOException if an I/O error occurs + */ + @Override + protected void doPost(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + } + + /** + * Returns a short description of the servlet. + * + * @return a String containing servlet description + */ + @Override + public String getServletInfo() { + return "Short description"; + } + +} diff --git a/src/main/java/fr/lirmm/aren/servlet/Root.java b/src/main/java/fr/lirmm/aren/servlet/Root.java new file mode 100644 index 0000000..99ecfd8 --- /dev/null +++ b/src/main/java/fr/lirmm/aren/servlet/Root.java @@ -0,0 +1,58 @@ +package fr.lirmm.aren.servlet; + +import java.io.IOException; +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; + +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.annotation.WebFilter; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * + * @author Florent Descroix {@literal } + */ +@WebFilter(asyncSupported = true, urlPatterns = {"/*"}) +public class Root implements Filter { + + /** + * + * @param filterConfig + * @throws ServletException + */ + @Override + public void init(FilterConfig filterConfig) throws ServletException { + } + + /** + * + * @param req + * @param res + * @param chain + * @throws IOException + * @throws ServletException + */ + @Override + public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { + HttpServletRequest request = (HttpServletRequest) req; + HttpServletResponse response = (HttpServletResponse) res; + String path = request.getRequestURI().substring(request.getContextPath().length()); + if (!path.startsWith("/caslogin") && !path.startsWith("/ws/") && !path.startsWith("/assets/")) { + request.getRequestDispatcher("/index.jsp").forward(request, response); + } else { + chain.doFilter(request, response); + } + } + + /** + * + */ + @Override + public void destroy() { + } + +} diff --git a/src/main/java/fr/lirmm/aren/ws/ApiDefinition.java b/src/main/java/fr/lirmm/aren/ws/ApiDefinition.java new file mode 100644 index 0000000..d0190e9 --- /dev/null +++ b/src/main/java/fr/lirmm/aren/ws/ApiDefinition.java @@ -0,0 +1,52 @@ +package fr.lirmm.aren.ws; + +import io.swagger.v3.oas.annotations.OpenAPIDefinition; +import io.swagger.v3.oas.annotations.enums.SecuritySchemeIn; +import io.swagger.v3.oas.annotations.security.SecurityScheme; +import io.swagger.v3.oas.annotations.info.Info; +import io.swagger.v3.oas.annotations.info.License; +import io.swagger.v3.oas.annotations.enums.SecuritySchemeType; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import io.swagger.v3.oas.annotations.security.SecuritySchemes; + +/** + * + * @author florent + */ +@OpenAPIDefinition( + info = @Info( + title = "AREN API", + description = "API for the ARgumentation Et Numérique project", + version = "3.8.0", + license = @License(name = "MIT License", url = "https://github.com/aren-consortium/AREN/blob/master/LICENSE") + ), + security = { + @SecurityRequirement(name = "CookieAuth"), + @SecurityRequirement(name = "BearerAuth"), + @SecurityRequirement(name = "QueryAuth") + } +) +@SecuritySchemes({ + @SecurityScheme( + name = "CookieAuth", + type = SecuritySchemeType.APIKEY, + in = SecuritySchemeIn.COOKIE, + paramName = "Authorization" + ), + @SecurityScheme( + name = "BearerAuth", + type = SecuritySchemeType.APIKEY, + in = SecuritySchemeIn.HEADER, + paramName = "Authorization", + description = "Bearer {key}" + ), + @SecurityScheme( + name = "QueryAuth", + type = SecuritySchemeType.APIKEY, + in = SecuritySchemeIn.QUERY, + paramName = "token" + )} +) +public interface ApiDefinition { + +} diff --git a/src/main/java/fr/lirmm/aren/ws/JerseyConfig.java b/src/main/java/fr/lirmm/aren/ws/JerseyConfig.java new file mode 100644 index 0000000..40927b0 --- /dev/null +++ b/src/main/java/fr/lirmm/aren/ws/JerseyConfig.java @@ -0,0 +1,39 @@ +package fr.lirmm.aren.ws; + +import io.swagger.v3.jaxrs2.SwaggerSerializers; +import io.swagger.v3.jaxrs2.integration.resources.AcceptHeaderOpenApiResource; +import io.swagger.v3.jaxrs2.integration.resources.OpenApiResource; +import javax.ws.rs.ApplicationPath; + +import org.glassfish.jersey.media.multipart.MultiPartFeature; +import org.glassfish.jersey.server.ResourceConfig; + +/** + * Jersey configuration class. + * + * @author Florent Descroix {@literal } + */ +@ApplicationPath("ws") +public class JerseyConfig extends ResourceConfig { + + /** + * + */ + public JerseyConfig() { + + packages("fr.lirmm.aren.ws.rest"); + + packages("fr.lirmm.aren.ws.filter"); + + packages("fr.lirmm.aren.ws.exceptionmapper"); + + register(ObjectMapperProvider.class); + + register(MultiPartFeature.class); + + register(AcceptHeaderOpenApiResource.class); + register(OpenApiResource.class); + register(SwaggerSerializers.class); + } + +} diff --git a/src/main/java/fr/lirmm/aren/ws/ObjectMapperProvider.java b/src/main/java/fr/lirmm/aren/ws/ObjectMapperProvider.java new file mode 100644 index 0000000..e4e08e7 --- /dev/null +++ b/src/main/java/fr/lirmm/aren/ws/ObjectMapperProvider.java @@ -0,0 +1,64 @@ +package fr.lirmm.aren.ws; + +import com.fasterxml.jackson.annotation.JsonInclude.Include; +import javax.ws.rs.ext.ContextResolver; +import javax.ws.rs.ext.Provider; + +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.datatype.hibernate5.Hibernate5Module; +import com.fasterxml.jackson.datatype.jdk8.Jdk8Module; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import com.fasterxml.jackson.module.paramnames.ParameterNamesModule; + +/** + * JAX-RS provider for {@link ObjectMapper}. + * + * @author Florent Descroix {@literal } + */ +@Provider +public class ObjectMapperProvider implements ContextResolver { + + private final ObjectMapper mapper; + + /** + * + */ + public ObjectMapperProvider() { + mapper = createObjectMapper(); + } + + /** + * + * @param type + * @return + */ + @Override + public ObjectMapper getContext(Class type) { + + return mapper; + } + + private static ObjectMapper createObjectMapper() { + + ObjectMapper mapper = new ObjectMapper(); + + mapper.registerModule(new Jdk8Module()); + mapper.registerModule(new JavaTimeModule()); + mapper.registerModule(new ParameterNamesModule()); + + mapper.registerModule(new Hibernate5Module()); + + mapper.enable(SerializationFeature.INDENT_OUTPUT); + mapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS); + mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); + + mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); + mapper.enable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT); + + mapper.setSerializationInclusion(Include.NON_NULL); + + return mapper; + } +} diff --git a/src/main/java/fr/lirmm/aren/ws/exceptionmapper/AbstractExceptionMapper.java b/src/main/java/fr/lirmm/aren/ws/exceptionmapper/AbstractExceptionMapper.java new file mode 100644 index 0000000..f54f93c --- /dev/null +++ b/src/main/java/fr/lirmm/aren/ws/exceptionmapper/AbstractExceptionMapper.java @@ -0,0 +1,53 @@ +package fr.lirmm.aren.ws.exceptionmapper; + +import fr.lirmm.aren.exception.AbstractException; +import javax.ws.rs.core.Context; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; +import javax.ws.rs.core.Response.Status; +import javax.ws.rs.core.UriInfo; +import javax.ws.rs.ext.ExceptionMapper; +import javax.ws.rs.ext.Provider; + +import fr.lirmm.aren.exception.AccessDeniedException; +import fr.lirmm.aren.model.ws.ApiErrorDetails; + +/** + * Exception mapper for {@link AccessDeniedException}s. + * + * @author Florent Descroix {@literal } + */ +@Provider +abstract class AbstractExceptionMapper implements ExceptionMapper { + + @Context + private UriInfo uriInfo; + + protected abstract Status getStatus(); + + protected abstract String getTitle(); + + /** + * + * @param exception + * @return + */ + @Override + public Response toResponse(T exception) { + + ApiErrorDetails errorDetails = new ApiErrorDetails(); + + errorDetails.setPath(uriInfo.getAbsolutePath().getPath()); + + errorDetails.setStatus(this.getStatus().getStatusCode()); + errorDetails.setTitle(this.getTitle()); + + errorDetails.setMessage(exception.getMessage()); + + if (exception instanceof AbstractException) { + errorDetails.setDetails(((AbstractException) exception).getDetails()); + } + + return Response.status(this.getStatus().getStatusCode()).entity(errorDetails).type(MediaType.APPLICATION_JSON).build(); + } +} diff --git a/src/main/java/fr/lirmm/aren/ws/exceptionmapper/AccessDeniedExceptionMapper.java b/src/main/java/fr/lirmm/aren/ws/exceptionmapper/AccessDeniedExceptionMapper.java new file mode 100644 index 0000000..4405795 --- /dev/null +++ b/src/main/java/fr/lirmm/aren/ws/exceptionmapper/AccessDeniedExceptionMapper.java @@ -0,0 +1,33 @@ +package fr.lirmm.aren.ws.exceptionmapper; + +import javax.ws.rs.core.Response.Status; +import javax.ws.rs.ext.Provider; + +import fr.lirmm.aren.exception.AccessDeniedException; + +/** + * Exception mapper for {@link AccessDeniedException}s. + * + * @author Florent Descroix {@literal } + */ +@Provider +public class AccessDeniedExceptionMapper extends AbstractExceptionMapper { + + /** + * + * @return + */ + @Override + protected Status getStatus() { + return Status.FORBIDDEN; + } + + /** + * + * @return + */ + @Override + protected String getTitle() { + return "Access denied"; + } +} diff --git a/src/main/java/fr/lirmm/aren/ws/exceptionmapper/AuthenticationExceptionMapper.java b/src/main/java/fr/lirmm/aren/ws/exceptionmapper/AuthenticationExceptionMapper.java new file mode 100644 index 0000000..6bd4d9c --- /dev/null +++ b/src/main/java/fr/lirmm/aren/ws/exceptionmapper/AuthenticationExceptionMapper.java @@ -0,0 +1,33 @@ +package fr.lirmm.aren.ws.exceptionmapper; + +import javax.ws.rs.core.Response.Status; +import javax.ws.rs.ext.Provider; + +import fr.lirmm.aren.exception.AuthenticationException; + +/** + * Exception mapper for {@link AuthenticationException}s. + * + * @author Florent Descroix {@literal } + */ +@Provider +public class AuthenticationExceptionMapper extends AbstractExceptionMapper { + + /** + * + * @return + */ + @Override + protected Status getStatus() { + return Status.UNAUTHORIZED; + } + + /** + * + * @return + */ + @Override + protected String getTitle() { + return "Authentication error"; + } +} diff --git a/src/main/java/fr/lirmm/aren/ws/exceptionmapper/InsertEntityExceptionMapper.java b/src/main/java/fr/lirmm/aren/ws/exceptionmapper/InsertEntityExceptionMapper.java new file mode 100644 index 0000000..c2a11d3 --- /dev/null +++ b/src/main/java/fr/lirmm/aren/ws/exceptionmapper/InsertEntityExceptionMapper.java @@ -0,0 +1,33 @@ +package fr.lirmm.aren.ws.exceptionmapper; + +import javax.ws.rs.core.Response.Status; +import javax.ws.rs.ext.Provider; + +import fr.lirmm.aren.exception.InsertEntityException; + +/** + * Exception mapper for {@link InsertEntityExceptionMapper}s. + * + * @author Florent Descroix {@literal } + */ +@Provider +public class InsertEntityExceptionMapper extends AbstractExceptionMapper { + + /** + * + * @return + */ + @Override + protected Status getStatus() { + return Status.BAD_REQUEST; + } + + /** + * + * @return + */ + @Override + protected String getTitle() { + return "Insertion error"; + } +} diff --git a/src/main/java/fr/lirmm/aren/ws/exceptionmapper/InvalidAuthenticationTokenExceptionMapper.java b/src/main/java/fr/lirmm/aren/ws/exceptionmapper/InvalidAuthenticationTokenExceptionMapper.java new file mode 100644 index 0000000..4424727 --- /dev/null +++ b/src/main/java/fr/lirmm/aren/ws/exceptionmapper/InvalidAuthenticationTokenExceptionMapper.java @@ -0,0 +1,33 @@ +package fr.lirmm.aren.ws.exceptionmapper; + +import javax.ws.rs.core.Response.Status; +import javax.ws.rs.ext.Provider; + +import fr.lirmm.aren.exception.InvalidAuthenticationTokenException; + +/** + * Exception mapper for {@link InvalidAuthenticationTokenExceptionMapper}s. + * + * @author Florent Descroix {@literal } + */ +@Provider +public class InvalidAuthenticationTokenExceptionMapper extends AbstractExceptionMapper { + + /** + * + * @return + */ + @Override + protected Status getStatus() { + return Status.UNAUTHORIZED; + } + + /** + * + * @return + */ + @Override + protected String getTitle() { + return "Invalid token"; + } +} diff --git a/src/main/java/fr/lirmm/aren/ws/exceptionmapper/NotFoundExceptionMapper.java b/src/main/java/fr/lirmm/aren/ws/exceptionmapper/NotFoundExceptionMapper.java new file mode 100644 index 0000000..029218c --- /dev/null +++ b/src/main/java/fr/lirmm/aren/ws/exceptionmapper/NotFoundExceptionMapper.java @@ -0,0 +1,34 @@ +package fr.lirmm.aren.ws.exceptionmapper; + +import javax.ws.rs.core.Response.Status; +import javax.ws.rs.ext.Provider; + +import fr.lirmm.aren.exception.AccessDeniedException; +import javax.ws.rs.NotFoundException; + +/** + * Exception mapper for {@link AccessDeniedException}s. + * + * @author Florent Descroix {@literal } + */ +@Provider +public class NotFoundExceptionMapper extends AbstractExceptionMapper { + + /** + * + * @return + */ + @Override + protected Status getStatus() { + return Status.NOT_FOUND; + } + + /** + * + * @return + */ + @Override + protected String getTitle() { + return "Resource not found"; + } +} diff --git a/src/main/java/fr/lirmm/aren/ws/filter/AuthenticationFilter.java b/src/main/java/fr/lirmm/aren/ws/filter/AuthenticationFilter.java new file mode 100644 index 0000000..e542952 --- /dev/null +++ b/src/main/java/fr/lirmm/aren/ws/filter/AuthenticationFilter.java @@ -0,0 +1,112 @@ +package fr.lirmm.aren.ws.filter; + +import java.io.IOException; +import java.util.List; + +import javax.annotation.Priority; +import javax.enterprise.context.Dependent; +import javax.inject.Inject; +import javax.ws.rs.Priorities; +import javax.ws.rs.container.ContainerRequestContext; +import javax.ws.rs.container.ContainerRequestFilter; +import javax.ws.rs.core.HttpHeaders; +import javax.ws.rs.core.SecurityContext; +import javax.ws.rs.ext.Provider; + +import fr.lirmm.aren.exception.InvalidAuthenticationTokenException; +import fr.lirmm.aren.model.User; +import fr.lirmm.aren.security.AuthenticatedUserDetails; +import fr.lirmm.aren.security.TokenBasedSecurityContext; +import fr.lirmm.aren.security.token.AuthenticationTokenDetails; +import fr.lirmm.aren.security.token.AuthenticationTokenService; +import fr.lirmm.aren.service.UserService; +import java.lang.reflect.Method; +import javax.annotation.security.PermitAll; +import javax.ws.rs.container.ResourceInfo; +import javax.ws.rs.core.Context; +import javax.ws.rs.core.Cookie; + +/** + * Authentication filter. Populate the Security Context with the right user + * + * @author Florent Descroix {@literal } + */ +@Provider +@Dependent +@Priority(Priorities.AUTHENTICATION) +public class AuthenticationFilter implements ContainerRequestFilter { + + @Inject + private UserService userService; + + @Inject + private AuthenticationTokenService authenticationTokenService; + + @Context + private ResourceInfo resourceInfo; + + /** + * + * @param requestContext + * @throws IOException + */ + @Override + public void filter(ContainerRequestContext requestContext) throws IOException { + + Method method = resourceInfo.getResourceMethod(); + if (!method.isAnnotationPresent(PermitAll.class)) { + + // Token parameter authentification + List authorizationPathParam = requestContext.getUriInfo().getQueryParameters().get("token"); + if (authorizationPathParam != null) { + String authenticationToken = authorizationPathParam.get(0); + handleTokenBasedAuthentication(authenticationToken, requestContext); + return; + } + + // Authorization header authentification + String authorizationHeader = requestContext.getHeaderString(HttpHeaders.AUTHORIZATION); + if (authorizationHeader != null && authorizationHeader.startsWith("Bearer ")) { + String authenticationToken = authorizationHeader.substring(7); + handleTokenBasedAuthentication(authenticationToken, requestContext); + return; + } + + // Authorization cookie authentification + for (Cookie c : requestContext.getCookies().values()) { + if (c.getName().equals("Authorization")) { + handleTokenBasedAuthentication(c.getValue(), requestContext); + return; + } + } + + // Authentificate as guest + AuthenticatedUserDetails authenticatedUserDetails = new AuthenticatedUserDetails(new User()); + boolean isSecure = requestContext.getSecurityContext().isSecure(); + SecurityContext securityContext = new TokenBasedSecurityContext(authenticatedUserDetails, null, isSecure); + requestContext.setSecurityContext(securityContext); + + // CAS authentification + // Other authentication schemes (such as Basic) could be supported + } + } + + private void handleTokenBasedAuthentication(String authenticationToken, ContainerRequestContext requestContext) { + + AuthenticationTokenDetails authenticationTokenDetails = authenticationTokenService.parseToken(authenticationToken); + User user = userService.findByUsernameOrEmail(authenticationTokenDetails.getUsername()); + if (user == null) { + throw InvalidAuthenticationTokenException.INVALID_TOKEN(); + } + if (user.getTokenValidity().isAfter(authenticationTokenDetails.getIssuedDate())) { + throw InvalidAuthenticationTokenException.EXPIRED_TOKEN(); + } + + // userService.updateLastLogin(user); + AuthenticatedUserDetails authenticatedUserDetails = new AuthenticatedUserDetails(user); + + boolean isSecure = requestContext.getSecurityContext().isSecure(); + SecurityContext securityContext = new TokenBasedSecurityContext(authenticatedUserDetails, authenticationTokenDetails, isSecure); + requestContext.setSecurityContext(securityContext); + } +} diff --git a/src/main/java/fr/lirmm/aren/ws/filter/AuthorizationFilter.java b/src/main/java/fr/lirmm/aren/ws/filter/AuthorizationFilter.java new file mode 100644 index 0000000..db2c23e --- /dev/null +++ b/src/main/java/fr/lirmm/aren/ws/filter/AuthorizationFilter.java @@ -0,0 +1,111 @@ +package fr.lirmm.aren.ws.filter; + +import java.io.IOException; +import java.lang.reflect.Method; + +import javax.annotation.Priority; +import javax.annotation.security.DenyAll; +import javax.annotation.security.PermitAll; +import javax.annotation.security.RolesAllowed; +import javax.enterprise.context.Dependent; +import javax.ws.rs.Priorities; +import javax.ws.rs.container.ContainerRequestContext; +import javax.ws.rs.container.ContainerRequestFilter; +import javax.ws.rs.container.ResourceInfo; +import javax.ws.rs.core.Context; +import javax.ws.rs.ext.Provider; + +import fr.lirmm.aren.exception.AccessDeniedException; +import fr.lirmm.aren.exception.AuthenticationException; + +/** + * Role authorization filter. Check if a function is accessible by User Role + * + * @author Florent Descroix {@literal } + */ +@Provider +@Dependent +@Priority(Priorities.AUTHORIZATION) +public class AuthorizationFilter implements ContainerRequestFilter { + + @Context + private ResourceInfo resourceInfo; + + /** + * + * @param requestContext + * @throws IOException + */ + @Override + public void filter(final ContainerRequestContext requestContext) throws IOException { + + Method method = resourceInfo.getResourceMethod(); + + // @DenyAll on the method takes precedence over @RolesAllowed and @PermitAll + if (method.isAnnotationPresent(DenyAll.class)) { + throw AccessDeniedException.PERMISSION_MISSING(); + } + + // @RolesAllowed on the method takes precedence over @PermitAll + RolesAllowed rolesAllowed = method.getAnnotation(RolesAllowed.class); + if (rolesAllowed != null) { + performAuthorization(rolesAllowed.value(), requestContext); + return; + } + + // @PermitAll on the method takes precedence over @RolesAllowed on the class + if (method.isAnnotationPresent(PermitAll.class)) { + // Do nothing + return; + } + + // @DenyAll can't be attached to classes + // @RolesAllowed on the class takes precedence over @PermitAll on the class + rolesAllowed = resourceInfo.getResourceClass().getAnnotation(RolesAllowed.class); + if (rolesAllowed != null) { + performAuthorization(rolesAllowed.value(), requestContext); + } + + // @PermitAll on the class + if (resourceInfo.getResourceClass().isAnnotationPresent(PermitAll.class)) { + // Do nothing + return; + } + + // Authentication is required for non-annotated methods + if (!isAuthenticated(requestContext)) { + throw AuthenticationException.AUTHENTIFICATION_REQUIRED(); + } + } + + /** + * Perform authorization based on roles. + * + * @param rolesAllowed + * @param requestContext + */ + private void performAuthorization(String[] rolesAllowed, ContainerRequestContext requestContext) { + + if (rolesAllowed.length > 0 && !isAuthenticated(requestContext)) { + throw AuthenticationException.AUTHENTIFICATION_REQUIRED(); + } + + for (final String role : rolesAllowed) { + if (requestContext.getSecurityContext().isUserInRole(role)) { + return; + } + } + + throw AccessDeniedException.PERMISSION_MISSING(); + } + + /** + * Check if the user is authenticated. + * + * @param requestContext + * @return + */ + private boolean isAuthenticated(final ContainerRequestContext requestContext) { + return requestContext.getSecurityContext().getUserPrincipal() != null; + } +} diff --git a/src/main/java/fr/lirmm/aren/ws/rest/ACalendarRESTFacade.java b/src/main/java/fr/lirmm/aren/ws/rest/ACalendarRESTFacade.java new file mode 100644 index 0000000..cf92b74 --- /dev/null +++ b/src/main/java/fr/lirmm/aren/ws/rest/ACalendarRESTFacade.java @@ -0,0 +1,50 @@ +package fr.lirmm.aren.ws.rest; + +import fr.lirmm.aren.model.agenda.ACalendar; +import fr.lirmm.aren.service.agenda.ACalendarService; + +import javax.annotation.security.PermitAll; +import javax.annotation.security.RolesAllowed; +import javax.enterprise.context.RequestScoped; +import javax.inject.Inject; +import javax.ws.rs.Path; +import java.util.Set; + +@RequestScoped +@Path("agenda/calendars") +public class ACalendarRESTFacade extends AbstractRESTFacade{ + @Inject + private ACalendarService aCalendarService ; + @Override + protected ACalendarService getService(){return aCalendarService ;} + + @Override + //@RolesAllowed({"ADMIN"}) + @PermitAll + public ACalendar create(ACalendar aCalendar){return super.create(aCalendar);} + + @Override + @RolesAllowed({"ADMIN"}) + public ACalendar edit(Long id,ACalendar aCalendar){return super.edit(id,aCalendar);} + + @Override + @RolesAllowed({"ADMIN"}) + public void remove(Long id) { + super.remove(id); + } + + @Override + @PermitAll + //@RolesAllowed({"MODO"}) + public Set findAll() { + return aCalendarService.findAll(); + } + + @Override + //@RolesAllowed({"MODO"}) + @PermitAll + public ACalendar find(Long id) { + ACalendar aCalendar = aCalendarService.find(id); + return aCalendar; + } +} \ No newline at end of file diff --git a/src/main/java/fr/lirmm/aren/ws/rest/AafRESTFacade.java b/src/main/java/fr/lirmm/aren/ws/rest/AafRESTFacade.java new file mode 100644 index 0000000..6557739 --- /dev/null +++ b/src/main/java/fr/lirmm/aren/ws/rest/AafRESTFacade.java @@ -0,0 +1,117 @@ +package fr.lirmm.aren.ws.rest; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.List; + +import javax.annotation.security.RolesAllowed; +import javax.enterprise.context.RequestScoped; +import javax.inject.Inject; +import javax.servlet.ServletContext; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.core.Context; +import javax.ws.rs.sse.Sse; +import javax.ws.rs.sse.SseEventSink; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; + +import org.glassfish.jersey.media.multipart.FormDataContentDisposition; +import org.glassfish.jersey.media.multipart.FormDataParam; + +import fr.lirmm.aren.service.AAFImportService; +import fr.lirmm.aren.ws.ObjectMapperProvider; +import javax.ws.rs.core.MediaType; + +/** + * JAX-RS resource class for AAF import + * + * @author Florent Descroix {@literal } + */ +@RequestScoped +@Path("aaf") +public class AafRESTFacade { + + @Inject + private AAFImportService aafService; + + @Context + private ServletContext servletContext; + + @Context + private ObjectMapperProvider mapperProvider; + + @Context + private Sse sse; + + /** + * Import datas from an AAF export file (FicAlimMENESR) Create Institutions, + * Teams and Users + * + * @param uploadedInputStream + * @param fileDetail + * @param eventSink + */ + @POST + @Path("import") + @RolesAllowed({"ADMIN"}) + @Produces(MediaType.SERVER_SENT_EVENTS) + public void importAaf( + @FormDataParam("file") InputStream uploadedInputStream, + @FormDataParam("file") FormDataContentDisposition fileDetail, + @Context SseEventSink eventSink) { + + String realPath = servletContext.getRealPath(""); + String uploadedFileLocation = realPath + "/WEB-INF/AafImport/" + fileDetail.getFileName(); + writeToFile(uploadedInputStream, uploadedFileLocation); + + aafService.setDispatcher((Float progress) -> { + eventSink.send(sse.newEvent(progress + "")); + }); + File file = new File(uploadedFileLocation); + List output = aafService.proceedImportation(file); + //eventSink.send(sse.newEvent(parseMessage(output))); + eventSink.send(sse.newEvent("1")); + eventSink.close(); + file.delete(); + } + + private String parseMessage(List arrayOfString) { + + ObjectMapper mapper = mapperProvider.getContext(null); + + String json = ""; + try { + json = mapper.writeValueAsString(arrayOfString); + } catch (JsonProcessingException ex) { + System.err.println("Message impossible to parse"); + } + return json; + } + + private void writeToFile(InputStream uploadedInputStream, + String uploadedFileLocation) { + + try { + OutputStream out = new FileOutputStream(new File(uploadedFileLocation)); + int read = 0; + byte[] bytes = new byte[1024]; + + out = new FileOutputStream(new File(uploadedFileLocation)); + while ((read = uploadedInputStream.read(bytes)) != -1) { + out.write(bytes, 0, read); + } + out.flush(); + out.close(); + } catch (IOException e) { + e.printStackTrace(); + } + + } + +} diff --git a/src/main/java/fr/lirmm/aren/ws/rest/AbstractRESTFacade.java b/src/main/java/fr/lirmm/aren/ws/rest/AbstractRESTFacade.java new file mode 100644 index 0000000..b77a4f9 --- /dev/null +++ b/src/main/java/fr/lirmm/aren/ws/rest/AbstractRESTFacade.java @@ -0,0 +1,203 @@ +package fr.lirmm.aren.ws.rest; + +import javax.annotation.security.RolesAllowed; +import javax.ws.rs.Consumes; +import javax.ws.rs.DELETE; +import javax.ws.rs.GET; +import javax.ws.rs.POST; +import javax.ws.rs.PUT; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.QueryParam; +import javax.ws.rs.core.Context; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.SecurityContext; + +import fr.lirmm.aren.service.AbstractService; +import fr.lirmm.aren.exception.AccessDeniedException; +import fr.lirmm.aren.model.AbstractDatedEntity; +import fr.lirmm.aren.model.AbstractEntEntity; +import fr.lirmm.aren.model.AbstractEntity; +import fr.lirmm.aren.model.AbstractOwnedEntity; +import fr.lirmm.aren.model.Notification; +import fr.lirmm.aren.model.User; +import fr.lirmm.aren.security.AuthenticatedUserDetails; + +import java.time.ZonedDateTime; +import java.util.Set; +import javax.servlet.http.HttpServletRequest; + +/** + * JAX-RS resource class for Abstract Model objects + * + * @author Florent Descroix {@literal } + * @param + */ + + +@Consumes(MediaType.APPLICATION_JSON) +@Produces(MediaType.APPLICATION_JSON) +public abstract class AbstractRESTFacade { + + /** + * + */ + @Context + protected SecurityContext securityContext; + + /** + * + */ + @Context + protected HttpServletRequest request; + + /** + * + */ + @QueryParam("overview") + protected String overview; + + /** + * + * @return + */ + protected abstract AbstractService getService(); + + /** + * + * @return the authentificated user + */ + protected User getUser() { + return ((AuthenticatedUserDetails) securityContext.getUserPrincipal()).getUser(); + } + + /** + * + * @param entity + */ + protected void safetyPreInsertion(T entity) { + if (entity instanceof AbstractOwnedEntity && !(entity instanceof Notification)) { + if (!getUser().is("SUPERADMIN") || ((AbstractOwnedEntity) entity).getOwner() == null) { + ((AbstractOwnedEntity) entity).setOwner(getUser()); + } + } + if (entity instanceof AbstractDatedEntity) { + if (!getUser().is("SUPERADMIN") || ((AbstractDatedEntity) entity).getCreated() == null) { + ((AbstractDatedEntity) entity).setCreated(ZonedDateTime.now()); + } + } + if (entity instanceof AbstractEntEntity) { + if (!getUser().is("SUPERADMIN") || ((AbstractEntEntity) entity).getEntId() == null) { + ((AbstractEntEntity) entity).setEntId(null); + } + } + } + + /** + * + * @param entity + * @param entityToEdit + */ + protected void safetyPreEdition(T entity, T entityToEdit) { + if (!getUser().is("SUPERADMIN")) { + if (!entityToEdit.isEditable()) { + throw AccessDeniedException.UNMUTABLE_OBJECT(entity.getClass(), entityToEdit.getId()); + } + if (entity instanceof AbstractOwnedEntity && !(entity instanceof Notification)) { + ((AbstractOwnedEntity) entity).setOwner(null); + } + if (entity instanceof AbstractDatedEntity) { + ((AbstractDatedEntity) entity).setCreated(null); + } + if (entity instanceof AbstractEntEntity) { + ((AbstractEntEntity) entity).setEntId(null); + } + } + } + + /** + * + * @param entity + */ + protected void safetyPreDeletion(T entity) { + if (!getUser().is("SUPERADMIN")) { + if (!entity.isRemovable()) { + throw AccessDeniedException.UNERASABLE_OBJECT(entity.getClass(), entity.getId()); + } + } + } + + /** + * Create a new Entity + * + * @param entity to create + * @return then create Entity + */ + @POST + @RolesAllowed({"SUPERADMIN"}) + public T create(T entity) { + safetyPreInsertion(entity); + getService().create(entity); + return entity; + } + + /** + * Edit the Entity fetch by the first parameter with the content of the + * second parameter. Null fields are ignored + * + * @param id of the Entity to update + * @param entity values to update + * @return the updated Entity + */ + @PUT + @Path("{id}") + @RolesAllowed({"SUPERADMIN"}) + public T edit(@PathParam("id") Long id, T entity) { + T entityToEdit = find(id); + safetyPreEdition(entity, entityToEdit); + entityToEdit.merge(entity); + getService().edit(entityToEdit); + return entityToEdit; + } + + /** + * Remove the Entity fetched by the first parameter + * + * @param id of the Entity to remove + */ + @DELETE + @Path("{id}") + @RolesAllowed({"SUPERADMIN"}) + public void remove(@PathParam("id") Long id) { + T entity = find(id); + safetyPreDeletion(entity); + getService().remove(entity); + } + + /** + * Fetch the Entity by id + * + * @param id of the Entity to fetch + * @return an Entity + */ + @GET + @Path("{id}") + @RolesAllowed({"SUPERADMIN"}) + public T find(@PathParam("id") Long id) { + + return getService().find(id); + } + + /** + * Fetch all the entity of the givent type + * + * @return a set of entity + */ + @GET + @RolesAllowed({"SUPERADMIN"}) + public Set findAll() { + + return getService().findAll(); + } +} diff --git a/src/main/java/fr/lirmm/aren/ws/rest/BroadcasterRESTFacade.java b/src/main/java/fr/lirmm/aren/ws/rest/BroadcasterRESTFacade.java new file mode 100644 index 0000000..1140a99 --- /dev/null +++ b/src/main/java/fr/lirmm/aren/ws/rest/BroadcasterRESTFacade.java @@ -0,0 +1,92 @@ +package fr.lirmm.aren.ws.rest; + +import javax.annotation.security.RolesAllowed; +import javax.enterprise.context.ApplicationScoped; +import javax.inject.Inject; +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.core.Context; +import javax.ws.rs.core.SecurityContext; + +import fr.lirmm.aren.service.BroadcasterService; +import fr.lirmm.aren.model.Debate; +import fr.lirmm.aren.model.Notification; +import fr.lirmm.aren.model.User; +import fr.lirmm.aren.security.AuthenticatedUserDetails; +import fr.lirmm.aren.service.DebateService; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.sse.SseEventSink; + +/** + * JAX-RS resource class for Server Sent Event + * + * @author Florent Descroix {@literal } + */ +@ApplicationScoped +@Path("events") +@Produces(MediaType.SERVER_SENT_EVENTS) +public class BroadcasterRESTFacade { + + @Inject + private DebateService debateService; + + @Inject + private BroadcasterService broadcasterService; + + /** + * + */ + @Context + protected SecurityContext securityContext; + + /** + * + * @return + */ + protected User getUser() { + return ((AuthenticatedUserDetails) securityContext.getUserPrincipal()).getUser(); + } + + /** + * Listen to all the new created Comments + * + * @param sseEventSink + */ + @GET + @Path("comments") + @RolesAllowed({"ADMIN"}) + public void openDebatesListener(@Context SseEventSink sseEventSink) { + + broadcasterService.openListener(-1L, Debate.class, sseEventSink); + } + + /** + * Listen to the new created Comments on a specific Debate + * + * @param debateId of the Debate to be listen to + * @param sseEventSink + */ + @GET + @Path("comments/{debateId}") + @RolesAllowed({"GUEST"}) + public void openDebateListener(@PathParam("debateId") Long debateId, @Context SseEventSink sseEventSink) { + + debateService.findByUser(debateId, getUser(), false, false, false, false, false); + broadcasterService.openListener(debateId, Debate.class, sseEventSink); + } + + /** + * Listen to the new created Notifications of the current User + * + * @param sseEventSink + */ + @GET + @Path("notifications") + @RolesAllowed({"USER"}) + public void openNotificationListener(@Context SseEventSink sseEventSink) { + + broadcasterService.openListener(getUser().getId(), Notification.class, sseEventSink); + } +} diff --git a/src/main/java/fr/lirmm/aren/ws/rest/CategoryRESTFacade.java b/src/main/java/fr/lirmm/aren/ws/rest/CategoryRESTFacade.java new file mode 100644 index 0000000..168fc81 --- /dev/null +++ b/src/main/java/fr/lirmm/aren/ws/rest/CategoryRESTFacade.java @@ -0,0 +1,83 @@ +package fr.lirmm.aren.ws.rest; + +import javax.annotation.security.RolesAllowed; +import javax.enterprise.context.RequestScoped; +import javax.inject.Inject; +import javax.ws.rs.Path; + +import fr.lirmm.aren.service.CategoryService; +import fr.lirmm.aren.model.Category; +import java.util.HashSet; + +/** + * JAX-RS resource class for Categories managment + * + * @author Florent Descroix {@literal } + */ +@RequestScoped +@Path("categories") +public class CategoryRESTFacade extends AbstractRESTFacade { + + @Inject + private CategoryService categoryService; + + /** + * + * @return + */ + @Override + protected CategoryService getService() { + return categoryService; + } + + /** + * + * @param category + * @return + */ + @Override + @RolesAllowed({"MODO"}) + public Category create(Category category) { + return super.create(category); + } + + /** + * + * @param category + * @return + */ + @Override + @RolesAllowed({"MODO"}) + public Category edit(Long id, Category category) { + return super.edit(id, category); + } + + /** + * + * @return + */ + @Override + @RolesAllowed({"GUEST"}) + public HashSet findAll() { + boolean withDocument = false; + if (getUser().is("MODO")) { + withDocument = this.overview == null; + } + return categoryService.findAllByUser(getUser(), withDocument); + } + + /** + * + * @param id + * @return + */ + @Override + @RolesAllowed({"GUEST"}) + public Category find(Long id) { + boolean withDocument = false; + if (getUser().is("MODO")) { + withDocument = this.overview == null; + } + return categoryService.findByUser(id, getUser(), withDocument); + } +} diff --git a/src/main/java/fr/lirmm/aren/ws/rest/CommentRESTFacade.java b/src/main/java/fr/lirmm/aren/ws/rest/CommentRESTFacade.java new file mode 100644 index 0000000..bffdcdc --- /dev/null +++ b/src/main/java/fr/lirmm/aren/ws/rest/CommentRESTFacade.java @@ -0,0 +1,130 @@ +package fr.lirmm.aren.ws.rest; + +import javax.annotation.security.RolesAllowed; +import javax.enterprise.context.RequestScoped; +import javax.inject.Inject; +import javax.ws.rs.POST; +import javax.ws.rs.Path; + +import fr.lirmm.aren.service.CommentService; +import fr.lirmm.aren.model.Comment; +import fr.lirmm.aren.model.TagSet; +import fr.lirmm.aren.service.BroadcasterService; +import fr.lirmm.aren.service.HttpRequestService; +import javax.ws.rs.PUT; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.core.Context; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.sse.Sse; +import javax.ws.rs.sse.SseEventSink; + +/** + * JAX-RS resource class for Comments managment + * + * @author Florent Descroix {@literal } + */ +@RequestScoped +@Path("comments") +public class CommentRESTFacade extends AbstractRESTFacade { + + @Inject + private CommentService commentService; + + @Inject + private BroadcasterService broadcasterService; + + @Inject + private HttpRequestService httpRequestService; + + /** + * + * @return + */ + @Override + protected CommentService getService() { + return commentService; + } + + /** + * + * @param id + * @param comment + * @return + */ + @Override + @RolesAllowed({"USER"}) + public Comment edit(Long id, Comment comment) { + Comment toEdit = find(id); + safetyPreEdition(comment, toEdit); + + boolean sameProposedTags = comment.getProposedTags().equals(toEdit.getProposedTags()); + boolean sameText = comment.getReformulation().equals(toEdit.getReformulation()); + + if (!getUser().is("SUPERADMIN") && !sameProposedTags) { + toEdit.setProposedTags(comment.getProposedTags()); + } else if (getUser().is("SUPERADMIN")) { + toEdit.merge(comment); + } + + if (!sameProposedTags || !sameText) { + // Reinit tags + toEdit.setTags(new TagSet()); + } + commentService.edit(toEdit); + + if (!sameProposedTags || !sameText) { + broadcasterService.broadcastComment(toEdit); + commentService.updateTags(toEdit); + } + broadcasterService.broadcastComment(toEdit); + return toEdit; + } + + /** + * Get the scalar corespondance weight between the Comment's selection and + * the Comment's argumentation Use a remote service + * + * @param comment to proceed + * @return + */ + @POST + @Path("scalar") + @RolesAllowed({"GUEST"}) + public String getScalar(Comment comment) { + return httpRequestService.getScalar(comment); + } + + /** + * Update tags of all comments Use a remote service + * + */ + @PUT + @Path("updateTags") + @RolesAllowed({"ADMIN"}) + @Produces(MediaType.SERVER_SENT_EVENTS) + public void updateAllTags(@Context SseEventSink eventSink, @Context Sse sse) { + commentService.updateAllTags((Comment comment, Float progress) -> { + eventSink.send(sse.newEvent(progress + "")); + broadcasterService.broadcastComment(comment); + }); + eventSink.send(sse.newEvent("1")); + eventSink.close(); + } + + /** + * Update Tags of a single Comment Use a remote servie + * + * @param id of the Comment to update the Tags + * @return + */ + @PUT + @Path("{id}/updateTags") + @RolesAllowed({"ADMIN"}) + public TagSet updateTag(@PathParam("id") Long id) { + Comment comment = commentService.find(id); + commentService.updateTags(comment); + broadcasterService.broadcastComment(comment); + return comment.getTags(); + } +} diff --git a/src/main/java/fr/lirmm/aren/ws/rest/DebateRESTFacade.java b/src/main/java/fr/lirmm/aren/ws/rest/DebateRESTFacade.java new file mode 100644 index 0000000..04d0987 --- /dev/null +++ b/src/main/java/fr/lirmm/aren/ws/rest/DebateRESTFacade.java @@ -0,0 +1,501 @@ +package fr.lirmm.aren.ws.rest; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.Set; + +import javax.annotation.security.RolesAllowed; +import javax.enterprise.context.RequestScoped; +import javax.inject.Inject; +import javax.ws.rs.DELETE; +import javax.ws.rs.POST; +import javax.ws.rs.PUT; +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.QueryParam; + +import fr.lirmm.aren.service.BroadcasterService; +import fr.lirmm.aren.service.CommentService; +import fr.lirmm.aren.service.DebateService; +import fr.lirmm.aren.service.NotificationService; +import fr.lirmm.aren.service.TeamService; +import fr.lirmm.aren.service.UserService; +import fr.lirmm.aren.exception.InsertEntityException; +import fr.lirmm.aren.model.Comment; +import fr.lirmm.aren.model.Debate; +import fr.lirmm.aren.model.Notification; +import fr.lirmm.aren.model.Team; +import fr.lirmm.aren.model.User; +import fr.lirmm.aren.model.ws.Scrap; +import fr.lirmm.aren.service.HttpRequestService; +import fr.lirmm.aren.service.ODFService; +import java.io.File; +import javax.ws.rs.Produces; +import javax.ws.rs.core.Response; + +/** + * JAX-RS resource class for Debates managment + * + * @author Florent Descroix {@literal } + */ +@RequestScoped +@Path("debates") +public class DebateRESTFacade extends AbstractRESTFacade { + + @Inject + private DebateService debateService; + + @Inject + private NotificationService notificationService; + + @Inject + private CommentService commentService; + + @Inject + private CommentRESTFacade commentFacade; + + @Inject + private BroadcasterService broadcasterService; + + @Inject + private TeamService teamService; + + @Inject + private UserService userService; + + @Inject + private ODFService odfService; + + @Inject + private HttpRequestService httpRequestService; + + /** + * + */ + @QueryParam("category") + protected Long category; + + /** + * + * @return + */ + @Override + protected DebateService getService() { + return debateService; + } + + /** + * + * @return + */ + @Override + @RolesAllowed({"GUEST"}) + public Set findAll() { + boolean withComments = (this.overview == null); + boolean isModo = getUser().is("MODO"); + return debateService.findAllByUser(getUser(), category, true, withComments, isModo, isModo, false); + } + + /** + * + * @param id + * @return + */ + @Override + @RolesAllowed({"GUEST"}) + public Debate find(Long id) { + + boolean withComments = (this.overview == null); + return debateService.findByUser(id, getUser(), true, withComments, true, true, false); + } + + /** + * + * @param debate + * @return + */ + @Override + @RolesAllowed({"MODO"}) + public Debate create(Debate debate) { + Set teams = debate.getTeams(); + Set guests = debate.getGuests(); + super.create(debate); + debate.getTeams().addAll(teams); + debate.getGuests().addAll(guests); + debateService.edit(debate); + + Debate newDebate = debateService.find(debate.getId(), false, false, true, true, true); + + List notifications = new ArrayList(); + + newDebate.getTeams().forEach((Team team) -> { + team.getUsers().forEach((User user) -> { + notifications.add(Notification.TEAM_ADDED_TO_DEBATE(user, newDebate, team)); + }); + }); + + newDebate.getGuests().forEach((User user) -> { + notifications.add(Notification.INVITED_TO_DEBATE(user, newDebate)); + }); + + notificationService.create(notifications); + broadcasterService.broadcastNotification(notifications); + + return newDebate; + } + + /** + * + * @param id + */ + @Override + @RolesAllowed({"MODO"}) + public void remove(Long id) { + super.remove(id); + } + + /** + * Creates a new Comment onto a Debate + * + * @param id of the debate + * @param comment to add + * @return + */ + @POST + @Path("{id}/comments") + @RolesAllowed({"USER"}) + public Comment addComment(@PathParam("id") Long id, Comment comment) { + + Debate debate = debateService.findByUser(id, getUser(), false, false, false, false, false); + Comment parent = null; + + if (comment.getParent() != null) { + parent = commentService.getReference(comment.getParent().getId()); + if (!Objects.equals(debate, parent.getDebate())) { + throw InsertEntityException.INVALID_PARENT(); + } + } + + commentFacade.create(comment); + + List notifications = new ArrayList(); + List users = new ArrayList(); + while (parent != null) { + // Only one notification per user + // And not notify oneself + if (!users.contains(parent.getOwner()) && parent.getOwner() != getUser()) { + notifications.add(Notification.COMMENT_ANSWERED(parent.getOwner(), comment)); + users.add(parent.getOwner()); + } + parent = parent.getParent(); + } + + notificationService.create(notifications); + broadcasterService.broadcastNotification(notifications); + broadcasterService.broadcastComment(comment); + + commentService.updateTags(comment); // It is long + broadcasterService.broadcastComment(comment); + + return comment; + } + + /** + * Remove all the comment of a debate + * + * @param id + */ + @DELETE + @Path("{id}/comments") + @RolesAllowed({"ADMIN"}) + public void clear(@PathParam("id") Long id) { + + debateService.clearComments(id); + } + + /** + * Mark a Comment in a Debate as being signaled + * + * @param id of the debate holding the comment + * @param commentId of the comment to be signaled + * @return + */ + @PUT + @Path("{id}/signal/{commentId}") + @RolesAllowed({"USER"}) + public Comment signal(@PathParam("id") Long id, @PathParam("commentId") Long commentId) { + + Debate debate = debateService.findByUser(id, getUser(), false, false, false, false, false); + Comment comment = commentService.find(commentId); + + if (comment.getDebate().equals(debate)) { + + comment.setSignaled(!comment.isSignaled()); + commentService.edit(comment); + + Set guests = debate.getGuests(); + guests.size(); + + List notifications = new ArrayList(); + + guests.forEach((User user) -> { + if (user.is("MODO")) { + notifications.add(Notification.COMMENT_SINGNALED(user, comment)); + } + }); + + notificationService.create(notifications); + broadcasterService.broadcastNotification(notifications); + } + return comment; + } + + /** + * Mark a Comment in a Debate as being moderated + * + * @param id of the debate holding the comment + * @param commentId of the comment to be moderated + * @return + */ + @PUT + @Path("{id}/moderate/{commentId}") + @RolesAllowed({"MODO"}) + public Comment moderate(@PathParam("id") Long id, @PathParam("commentId") Long commentId) { + + debateService.findByUser(id, getUser(), false, false, false, false, false); + + Comment comment = commentService.find(id); + comment.setModerated(!comment.isModerated()); + commentService.edit(comment); + + Notification notif = Notification.COMMENT_MODERATED(comment); + notificationService.create(notif); + broadcasterService.broadcastNotification(notif); + + return comment; + } + + /** + * Add a Team to participate in a Debate + * + * @param id of the debate + * @param teamId of the team + */ + @PUT + @Path("{id}/teams/{teamId}") + @RolesAllowed({"MODO"}) + public void addTeam(@PathParam("id") Long id, @PathParam("teamId") Long teamId) { + + Debate debate = debateService.findByUser(id, getUser(), false, false, true, false, false); + + Team team = teamService.find(teamId); + debate.addTeam(team); + debateService.edit(debate); + + List notifications = new ArrayList(); + + team.getUsers().forEach((User user) -> { + notifications.add(Notification.TEAM_ADDED_TO_DEBATE(user, debate, team)); + }); + + notificationService.create(notifications); + broadcasterService.broadcastNotification(notifications); + + } + + /** + * Remove a Team to participate in a Debate + * + * @param id of the debate + * @param teamId of the team + */ + @DELETE + @Path("{id}/teams/{teamId}") + @RolesAllowed({"MODO"}) + public void removeTeam(@PathParam("id") Long id, @PathParam("teamId") Long teamId) { + + Debate debate = debateService.findByUser(id, getUser(), false, false, true, false, false); + + Team team = teamService.find(teamId); + debate.removeTeam(team); + debateService.edit(debate); + + } + + /** + * Add a User to participate in a Debate + * + * @param id of the debate + * @param userId of the user + */ + @PUT + @Path("{id}/users/{userId}") + @RolesAllowed({"ADMIN", "MODO"}) + public void addGuest(@PathParam("id") Long id, @PathParam("userId") Long userId) { + + Debate debate = debateService.findByUser(id, getUser(), false, false, false, true, false); + + User user = userService.find(userId); + debate.addGuest(user); + debateService.edit(debate); + + Notification notif = Notification.INVITED_TO_DEBATE(user, debate); + notificationService.create(notif); + broadcasterService.broadcastNotification(notif); + } + + /** + * Remove a User to participate in a Debate + * + * @param id of the debate + * @param userId of the user + */ + @DELETE + @Path("{id}/users/{userId}") + @RolesAllowed({"MODO"}) + public void removeGuest(@PathParam("id") Long id, @PathParam("userId") Long userId) { + + Debate debate = debateService.findByUser(id, getUser(), false, false, false, true, false); + + User user = userService.find(userId); + debate.removeGuest(user); + debateService.edit(debate); + } + + /** + * Calculate the intersections of the selections of the Comment of a Debate + * + * @param id of the Debate + * @return a list of Strings + */ + @GET + @Path("{id}/scraps") + @RolesAllowed({"GUEST"}) + public List getScraps(@PathParam("id") Long id) { + Debate debate = this.find(id); + ArrayList scraps = new ArrayList(); + + for (Comment comment : debate.getComments()) { + if (comment.getParent() == null) { + Scrap scrap = new Scrap(); + scrap.setStartContainer(comment.getStartContainer()); + scrap.setStartOffset(comment.getStartOffset()); + scrap.setEndContainer(comment.getEndContainer()); + scrap.setEndOffset(comment.getEndOffset()); + scrap.getComments().add(comment); + scraps.add(scrap); + } + } + + int firstsLen = scraps.size(); + int checkingStart = 0; + int checkingEnd = firstsLen; + // While there are new scraps, test to find new overlaps + while (checkingStart != checkingEnd) { + // For all initial scraps + for (int i = 0; i < firstsLen; i++) { + Scrap s1 = scraps.get(i); + // For all new scraps + for (int j = (checkingStart == 0 ? i + 1 : checkingStart); j < checkingEnd; j++) { + Scrap s2 = scraps.get(j); + int comparison = s1.compareTo(s2); + if (comparison != Scrap.ALL_BEFORE && comparison != Scrap.ALL_AFTER) { + Scrap start = s1; + Scrap end = s1; + // The higest start is the start of the ovelap + if (comparison == Scrap.OVER_BEFORE || comparison == Scrap.COVERS) { + start = s2; + } + // The smalest end is the end of the ovelap + if (comparison == Scrap.OVER_AFTER || comparison == Scrap.COVERS) { + end = s2; + } + // Create the scrap + Scrap scrap = new Scrap(); + scrap.setStartContainer(start.getStartContainer()); + scrap.setStartOffset(start.getStartOffset()); + scrap.setEndContainer(end.getEndContainer()); + scrap.setEndOffset(end.getEndOffset()); + + // Check if the scrap already exists + int k = 0; + while (k < scraps.size() && !scrap.equals(scraps.get(k))) { + k++; + } + + if (k < scraps.size()) { + scrap = scraps.get(k); + } else { + scraps.add(scrap); + } + // Add comments to the new scrap + scrap.getComments().addAll(s1.getComments()); + scrap.getComments().addAll(s2.getComments()); + } + } + } + // Only check scraps inserted in the last loop + checkingStart = checkingEnd; + checkingEnd = scraps.size(); + } + + scraps.sort((Scrap c1, Scrap c2) -> c2.getComments().size() - c1.getComments().size()); + + return scraps; + } + + /** + * Find the Comments of a Debate that match a theme + * + * @param id of the debate + * @param theme + * @return + */ + @GET + @Path("{id}/theme") + @RolesAllowed({"GUEST"}) + public String getTheme(@PathParam("id") Long id, @QueryParam("theme") String theme) { + this.find(id); + return httpRequestService.getTheme(id, theme); + } + + /** + * Update the Tags of all the Comments of a Debate Use a remote service + * + * @param id + */ + @PUT + @Path("{id}/updateTags") + @RolesAllowed({"SUPERADMIN"}) + public void updateTags(@PathParam("id") Long id) { + Debate debate = debateService.findByUser(id, getUser(), false, true, false, false, false); + + debate.getComments().forEach((Comment comment) -> { + commentService.updateTags(comment, true); + broadcasterService.broadcastComment(comment); + }); + } + + /** + * Export a Debate to an ODF file + * + * @param id of the debate + * @return an ODF file + * @throws Exception + */ + @GET + @Path("{id}/export") + @RolesAllowed({"GUEST"}) + @Produces("application/odt") + public Response export(@PathParam("id") Long id) throws Exception { + Debate debate = debateService.findByUser(id, getUser(), true, true, false, false, false); + File export = odfService.parseDebate(debate); + String fileName = debate.getDocument().getName().replaceAll("[^a-zA-Z0-9\\s]", "") + ".odt"; + return Response.ok(export) + .header("Content-disposition", "attachment; filename=\"" + fileName + "\"") + .header("Content-length", export.length()) + .build(); + } +} diff --git a/src/main/java/fr/lirmm/aren/ws/rest/DocumentRESTFacade.java b/src/main/java/fr/lirmm/aren/ws/rest/DocumentRESTFacade.java new file mode 100644 index 0000000..505f095 --- /dev/null +++ b/src/main/java/fr/lirmm/aren/ws/rest/DocumentRESTFacade.java @@ -0,0 +1,84 @@ +package fr.lirmm.aren.ws.rest; + +import javax.annotation.security.RolesAllowed; +import javax.enterprise.context.RequestScoped; +import javax.inject.Inject; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; + +import fr.lirmm.aren.service.DocumentService; +import fr.lirmm.aren.model.Document; +import java.util.Set; + +/** + * JAX-RS resource class for Documents managment + * + * @author Florent Descroix {@literal } + */ +@RequestScoped +@Path("documents") +public class DocumentRESTFacade extends AbstractRESTFacade { + + @Inject + private DocumentService documentService; + + /** + * + * @return + */ + @Override + protected DocumentService getService() { + return documentService; + } + + /** + * + * @return + */ + @Override + @RolesAllowed({"MODO"}) + public Set findAll() { + boolean withDebates = this.overview == null; + return documentService.findAll(withDebates); + } + + /** + * + * @param id + * @return + */ + @Override + @RolesAllowed({"MODO"}) + public Document find(Long id) { + boolean withDebates = this.overview == null; + return documentService.find(id, withDebates); + } + + /** + * + * @param id + * @return + */ + @Override + @RolesAllowed({"MODO"}) + public Document create(Document doc) { + return super.create(doc); + } + + /** + * Ducplicate a Documents withe the the associaitons + * + * @param id of the Document to duplicate + * @return the duplicated Document + */ + @POST + @Path("{id}/duplicate") + @RolesAllowed({"MODO"}) + public Document duplicate(@PathParam("id") Long id) { + + Document document = find(id); + + return this.create(document); + } +} diff --git a/src/main/java/fr/lirmm/aren/ws/rest/FDChoiceRESTFacade.java b/src/main/java/fr/lirmm/aren/ws/rest/FDChoiceRESTFacade.java new file mode 100644 index 0000000..95e94c0 --- /dev/null +++ b/src/main/java/fr/lirmm/aren/ws/rest/FDChoiceRESTFacade.java @@ -0,0 +1,63 @@ +package fr.lirmm.aren.ws.rest; + + +import fr.lirmm.aren.model.Category; +import fr.lirmm.aren.model.Institution; +import fr.lirmm.aren.model.framadate.FDChoice; +import fr.lirmm.aren.model.framadate.FDVote; +import fr.lirmm.aren.service.AbstractService; +import fr.lirmm.aren.service.framadate.FDChoiceService; +import fr.lirmm.aren.service.framadate.FDVoteService; + +import javax.annotation.security.PermitAll; +import javax.annotation.security.RolesAllowed; +import javax.enterprise.context.RequestScoped; +import javax.inject.Inject; +import javax.ws.rs.Path; +import java.util.HashSet; +import java.util.Set; + +@RequestScoped +@Path("choices") +public class FDChoiceRESTFacade extends AbstractRESTFacade{ + @Inject + private FDChoiceService fdChoiceService ; + + @Inject + private FDVoteService fdVoteService ; + + @Override + protected FDChoiceService getService(){return fdChoiceService ;} + + @Override + //@RolesAllowed({"ADMIN"}) + @PermitAll + public FDChoice create(FDChoice fdChoice){return super.create(fdChoice);} + + @Override + //@RolesAllowed({"ADMIN"}) + public FDChoice edit(Long id,FDChoice fdChoice){return super.edit(id,fdChoice);} + + @Override + @RolesAllowed({"ADMIN"}) + public void remove(Long id) { + super.remove(id); + } + + @Override + @PermitAll + //@RolesAllowed({"MODO"}) + public Set findAll() { + boolean withVotes = this.overview == null; + return fdChoiceService.findAll(withVotes); + } + + @Override + //@RolesAllowed({"MODO"}) + @PermitAll + public FDChoice find(Long id) { + boolean withVotes = this.overview == null; + FDChoice fdChoice = fdChoiceService.find(id,withVotes); + return fdChoice; + } +} \ No newline at end of file diff --git a/src/main/java/fr/lirmm/aren/ws/rest/FDThemeRESTFacade.java b/src/main/java/fr/lirmm/aren/ws/rest/FDThemeRESTFacade.java new file mode 100644 index 0000000..f25dce3 --- /dev/null +++ b/src/main/java/fr/lirmm/aren/ws/rest/FDThemeRESTFacade.java @@ -0,0 +1,68 @@ +package fr.lirmm.aren.ws.rest; + +import fr.lirmm.aren.model.framadate.FDTheme; +import fr.lirmm.aren.service.framadate.FDChoiceService; +import fr.lirmm.aren.service.framadate.FDThemeService; +import fr.lirmm.aren.service.framadate.FDVoteService; + +import javax.annotation.security.PermitAll; +import javax.annotation.security.RolesAllowed; +import javax.enterprise.context.RequestScoped; +import javax.inject.Inject; +import javax.ws.rs.Path; +import java.util.Set; + +@RequestScoped +@Path("themes") +public class FDThemeRESTFacade extends AbstractRESTFacade{ + @Inject + FDThemeService fdThemeService; + + @Inject + private FDChoiceService fdChoiceService ; + + @Inject + private FDVoteService fdVoteService ; + + + @Override + protected FDThemeService getService() { + return fdThemeService; + } + + @Override + //@RolesAllowed({"ADMIN"}) + @PermitAll + public FDTheme create(FDTheme fdTheme){ + return super.create(fdTheme); + } + + @Override + //@RolesAllowed({"ADMIN"}) + public FDTheme edit(Long id, FDTheme fdTheme){return super.edit(id, fdTheme);} + + @Override + @PermitAll + //@RolesAllowed({"MODO"}) + public Set findAll() { + boolean withChoices = this.overview == null; + System.out.println("WITH CHOICES : "+withChoices) ; + //System.out.println("USER : "+getUser().getFirstName()+" "+getUser().getLastName()) ; + return fdThemeService.findAll(withChoices, true); + } + + @Override + @RolesAllowed({"ADMIN"}) + public void remove(Long id) { + super.remove(id); + } + + @Override + //@RolesAllowed({"MODO"}) + @PermitAll + public FDTheme find(Long id) { + boolean withChoices = this.overview == null; + FDTheme fdTheme = fdThemeService.find(id,withChoices,true); + return fdTheme; + } +} diff --git a/src/main/java/fr/lirmm/aren/ws/rest/FDVoteRESTFacade.java b/src/main/java/fr/lirmm/aren/ws/rest/FDVoteRESTFacade.java new file mode 100644 index 0000000..679f97b --- /dev/null +++ b/src/main/java/fr/lirmm/aren/ws/rest/FDVoteRESTFacade.java @@ -0,0 +1,54 @@ +package fr.lirmm.aren.ws.rest; + +import fr.lirmm.aren.model.Institution; +import fr.lirmm.aren.model.framadate.FDVote; +import fr.lirmm.aren.service.AbstractService; +import fr.lirmm.aren.service.framadate.FDVoteService; + +import javax.annotation.security.PermitAll; +import javax.annotation.security.RolesAllowed; +import javax.enterprise.context.RequestScoped; +import javax.inject.Inject; +import javax.ws.rs.Path; +import java.util.Set; + +@RequestScoped +@Path("votes") +public class FDVoteRESTFacade extends AbstractRESTFacade{ + @Inject + private FDVoteService fdVoteService ; + + @Override + protected AbstractService getService() { + return fdVoteService; + } + + @Override + //@RolesAllowed({"USER"}) + @PermitAll + public FDVote create(FDVote fdVote) { + System.out.println(fdVote.toString()); + return super.create(fdVote); + } + + @Override + //@RolesAllowed({"USER"}) + @PermitAll + public FDVote find(Long id) { + FDVote fdVote = super.find(id); + return fdVote; + } + + @Override + @RolesAllowed({"ADMIN"}) + public void remove(Long id) { + super.remove(id); + } + + //@RolesAllowed({"USER"}) + @PermitAll + @Override + public Set findAll() { + return super.findAll(); + } +} \ No newline at end of file diff --git a/src/main/java/fr/lirmm/aren/ws/rest/InstitutionRESTFacade.java b/src/main/java/fr/lirmm/aren/ws/rest/InstitutionRESTFacade.java new file mode 100644 index 0000000..efc172a --- /dev/null +++ b/src/main/java/fr/lirmm/aren/ws/rest/InstitutionRESTFacade.java @@ -0,0 +1,108 @@ +package fr.lirmm.aren.ws.rest; + +import java.util.List; + +import javax.annotation.security.RolesAllowed; +import javax.enterprise.context.RequestScoped; +import javax.inject.Inject; +import javax.ws.rs.GET; +import javax.ws.rs.Path; + +import fr.lirmm.aren.service.InstitutionService; +import fr.lirmm.aren.model.Institution; +import java.util.Set; + +/** + * JAX-RS resource class for Institutions managment + * + * @author Florent Descroix {@literal } + */ +@RequestScoped +@Path("institutions") +public class InstitutionRESTFacade extends AbstractRESTFacade { + + @Inject + private InstitutionService institutionService; + + /** + * + * @return + */ + @Override + protected InstitutionService getService() { + return institutionService; + } + + /** + * + * @param institution + * @return + */ + @Override + @RolesAllowed({"ADMIN"}) + public Institution create(Institution institution) { + + return super.create(institution); + } + + /** + * + * @param id + * @param institution + * @return + */ + @Override + @RolesAllowed({"ADMIN"}) + public Institution edit(Long id, Institution institution) { + + return super.edit(id, institution); + } + + /** + * + * @param id + */ + @Override + @RolesAllowed({"ADMIN"}) + public void remove(Long id) { + + super.remove(id); + } + + /** + * + * @return + */ + @Override + @RolesAllowed({"MODO"}) + public Institution find(Long id) { + Institution institution = super.find(id); + institution.getUsers().size(); + institution.getTeams().size(); + return institution; + } + + /** + * Find all Institution with associated Teams and associated Users + * + * @return + */ + @GET + @Path("/deep") + @RolesAllowed({"MODO"}) + public Set findAllDeep() { + return institutionService.findAll(true, true); + } + + /** + * Find all Institution with associated Teams and associated Users + * + * @return + */ + @RolesAllowed({"MODO"}) + @Override + public Set findAll() { + return super.findAll(); + } + +} diff --git a/src/main/java/fr/lirmm/aren/ws/rest/NotificationRESTFacade.java b/src/main/java/fr/lirmm/aren/ws/rest/NotificationRESTFacade.java new file mode 100644 index 0000000..6bf855c --- /dev/null +++ b/src/main/java/fr/lirmm/aren/ws/rest/NotificationRESTFacade.java @@ -0,0 +1,87 @@ +package fr.lirmm.aren.ws.rest; + +import javax.annotation.security.RolesAllowed; +import javax.enterprise.context.RequestScoped; +import javax.inject.Inject; +import javax.ws.rs.PUT; +import javax.ws.rs.Path; + +import fr.lirmm.aren.service.NotificationService; +import fr.lirmm.aren.model.Notification; +import java.util.Set; +import javax.ws.rs.QueryParam; + +/** + * JAX-RS resource class for Notifications managment + * + * @author Florent Descroix {@literal } + */ +@RequestScoped +@Path("notifications") +public class NotificationRESTFacade extends AbstractRESTFacade { + + @Inject + private NotificationService notificationService; + + /** + * + */ + @QueryParam("overview") + protected String overview; + + /** + * + * @return + */ + @Override + protected NotificationService getService() { + return notificationService; + } + + /** + * + * @return + */ + @Override + @RolesAllowed({"USER"}) + public Set findAll() { + if (overview == null) { + return notificationService.findAllByUser(this.getUser().getId()); + } else { + return notificationService.findAllFirstsByUser(this.getUser().getId(), 10); + } + } + + /** + * Mark all Notifications of the current User as read + * + * @return + */ + @PUT + @RolesAllowed({"USER"}) + public Set readAll() { + notificationService.readAllByUser(this.getUser().getId()); + return notificationService.findAllFirstsByUser(this.getUser().getId(), 10); + } + + /** + * + * @param id + * @param notification + */ + @Override + @RolesAllowed({"USER"}) + public Notification edit(Long id, Notification notification) { + Notification entityToUpdate; + if (this.getUser().is("SUPERADMIN")) { + notification.setContent(null); + entityToUpdate = super.edit(id, notification); + } else { + entityToUpdate = notificationService.find(id); + entityToUpdate.setUnread(notification.isUnread()); + notificationService.edit(entityToUpdate); + } + return entityToUpdate; + } + +} diff --git a/src/main/java/fr/lirmm/aren/ws/rest/TeamRESTFacade.java b/src/main/java/fr/lirmm/aren/ws/rest/TeamRESTFacade.java new file mode 100644 index 0000000..2bbb05b --- /dev/null +++ b/src/main/java/fr/lirmm/aren/ws/rest/TeamRESTFacade.java @@ -0,0 +1,146 @@ +package fr.lirmm.aren.ws.rest; + +import javax.annotation.security.RolesAllowed; +import javax.enterprise.context.RequestScoped; +import javax.inject.Inject; +import javax.ws.rs.DELETE; +import javax.ws.rs.PUT; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.QueryParam; + +import fr.lirmm.aren.service.InstitutionService; +import fr.lirmm.aren.service.TeamService; +import fr.lirmm.aren.service.UserService; +import fr.lirmm.aren.model.Team; +import java.util.Set; + +/** + * JAX-RS resource class for Teams managment + * + * @author Florent Descroix {@literal } + */ +@RequestScoped +@Path("teams") +public class TeamRESTFacade extends AbstractRESTFacade { + + @Inject + private TeamService teamService; + + @Inject + private UserService userService; + + @Inject + private InstitutionService institutionService; + + /** + * + */ + @QueryParam("standalone") + protected String standalone; + + /** + * + * @return + */ + @Override + protected TeamService getService() { + return teamService; + } + + /** + * + * @param team + * @return + */ + @Override + @RolesAllowed({"MODO"}) + public Team create(Team team) { + + if (team.getInstitution() == null) { + team.setInstitution(institutionService.getReference(0L)); + } + + return super.create(team); + } + + /** + * + * @param id + */ + @Override + @RolesAllowed({"MODO"}) + public void remove(Long id) { + + super.remove(id); + } + + /** + * + * @param team + * @param id + * @return + */ + @Override + @RolesAllowed({"MODO"}) + public Team edit(Long id, Team team) { + + return super.edit(id, team); + } + + /** + * + * @return + */ + @RolesAllowed({"MODO"}) + @Override + public Team find(Long id) { + Team team = super.find(id); + team.getUsers().size(); + return team; + } + + /** + * + * @return + */ + @RolesAllowed({"MODO"}) + @Override + public Set findAll() { + + boolean standalone = this.standalone != null; + return teamService.findAll(standalone); + } + + /** + * Add a User to a Team + * + * @param id of the Team + * @param userId of the User + */ + @PUT + @Path("{id}/users/{userId}") + @RolesAllowed({"MODO"}) + public void addUser(@PathParam("id") Long id, @PathParam("userId") Long userId) { + + Team team = this.find(id); + team.addUser(userService.getReference(userId)); + teamService.edit(team); + } + + /** + * Remove a user from a Team + * + * @param id of the Team + * @param userId of teh User + */ + @DELETE + @Path("{id}/users/{userId}") + @RolesAllowed({"MODO"}) + public void removeUser(@PathParam("id") Long id, @PathParam("userId") Long userId) { + + Team team = this.find(id); + team.removeUser(userService.getReference(userId)); + teamService.edit(team); + } +} diff --git a/src/main/java/fr/lirmm/aren/ws/rest/UserRESTFacade.java b/src/main/java/fr/lirmm/aren/ws/rest/UserRESTFacade.java new file mode 100644 index 0000000..e20981f --- /dev/null +++ b/src/main/java/fr/lirmm/aren/ws/rest/UserRESTFacade.java @@ -0,0 +1,377 @@ +package fr.lirmm.aren.ws.rest; + +import javax.annotation.security.RolesAllowed; +import javax.enterprise.context.RequestScoped; +import javax.inject.Inject; +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.QueryParam; + +import fr.lirmm.aren.service.InstitutionService; +import fr.lirmm.aren.service.UserService; +import fr.lirmm.aren.exception.AccessDeniedException; +import fr.lirmm.aren.model.User; +import fr.lirmm.aren.model.ws.ChangePassword; +import fr.lirmm.aren.model.ws.UserCredentials; +import fr.lirmm.aren.producer.Configurable; +import fr.lirmm.aren.security.token.AuthenticationTokenDetails; +import fr.lirmm.aren.security.token.AuthenticationTokenService; +import fr.lirmm.aren.service.AuthentificationService; +import fr.lirmm.aren.service.MailingService; +import fr.lirmm.aren.service.NotificationService; +import java.net.MalformedURLException; +import java.net.URL; +import java.text.MessageFormat; +import java.util.Locale; +import java.util.ResourceBundle; +import java.util.Set; +import javax.annotation.security.PermitAll; +import javax.mail.MessagingException; +import javax.ws.rs.BadRequestException; +import javax.ws.rs.DELETE; +import javax.ws.rs.POST; +import javax.ws.rs.PUT; +import javax.ws.rs.PathParam; +import javax.ws.rs.core.HttpHeaders; +import javax.ws.rs.core.NewCookie; +import javax.ws.rs.core.Response; + +/** + * JAX-RS resource class for Users managment + * + * @author Florent Descroix {@literal } + */ +@RequestScoped +@Path("users") +public class UserRESTFacade extends AbstractRESTFacade { + + @Inject + private UserService userService; + + @Inject + private InstitutionService institutionService; + + @Inject + private MailingService mailingService; + + @Inject + private AuthentificationService authentificationService; + + @Inject + private AuthenticationTokenService authenticationTokenService; + + @Inject + private NotificationService notificationService; + + @Inject + @Configurable("reverse-proxy") + private String reverseProxy; + + /** + * + */ + @QueryParam("standalone") + protected String standalone; + + /** + * + */ + @QueryParam("returnUrl") + protected String returnUrl; + + /** + * + * @return + */ + @Override + protected UserService getService() { + return userService; + } + + /** + * Create a token for the User matching the credentials + * + * @param credentials to fetch an User + * @return the token + */ + @POST + @PermitAll + @Path("auth") + public String authenticate(UserCredentials credentials) { + User user = authentificationService.validateCredentials(credentials.getUsername(), credentials.getPassword()); + return authenticationTokenService.issueToken(user); + } + + /** + * Create a token for the User matching the credentials and encapsulate it + * in a Cookie + * + * @param credentials to fetch an User + * @return a Cookie + */ + @POST + @PermitAll + @Path("login") + public Response login(UserCredentials credentials) { + if (credentials == null) { + throw new BadRequestException(); + } + + String token = authenticate(credentials); + + int maxAge = -1; + if (credentials.isRememberMe()) { + maxAge = 360 * 24 * 60 * 60; + } + + String domain; + Response response; + try { + domain = new URL(request.getRequestURL().toString()).getHost(); + NewCookie cookie = new NewCookie(HttpHeaders.AUTHORIZATION, token, "/", domain, "Authentification token for Aren platform", maxAge, false, true); + response = Response.ok(token).cookie(cookie).build(); + } catch (MalformedURLException ex) { + response = Response.ok(token).build(); + } + return response; + } + + /** + * Remove the Cookie that stored the previously created token + * + * @return + */ + @POST + @Path("logout") + @PermitAll + public Response logout() { + String domain; + Response response; + try { + domain = new URL(request.getRequestURL().toString()).getHost(); + NewCookie cookie = new NewCookie(HttpHeaders.AUTHORIZATION, "", "/", domain, "", 0, false, true); + response = Response.ok().cookie(cookie).build(); + } catch (MalformedURLException ex) { + response = Response.ok().build(); + } + return response; + } + + /** + * + * @param id + * @param entity + * @return + */ + @Override + @RolesAllowed({"USER"}) + public User edit(Long id, User entity) { + if (!(getUser().is("MODO") && getUser().hasSameOrMoreRightThan(entity) + || getUser().getId().equals(entity.getId()))) { + throw AccessDeniedException.PERMISSION_MISSING(); + } + + if (!getUser().is("SUPERADMIN")) { + User newUser = new User(); + // The only alterable fields in User + if (getUser().is("MODO") || getUser().getId().equals(entity.getId())) { + newUser.setFirstName(entity.getFirstName()); + newUser.setLastName(entity.getLastName()); + newUser.setEmail(entity.getEmail()); + } + if (getUser().is("MODO") && getUser().hasSameOrMoreRightThan(entity)) { + newUser.setAuthority(entity.getAuthority()); + } + entity = newUser; + } + return super.edit(id, entity); + } + + /** + * + * @param user + * @return + */ + @Override + @RolesAllowed({"GUEST"}) + public User create(User user) { + + if (user.getInstitution() == null || !getUser().is(User.Authority.SUPERADMIN)) { + user.setInstitution(institutionService.getReference(0L)); + } + if (getUser().getAuthority() == User.Authority.GUEST) { + user.setActive(false); + super.create(user); + try { + sendLink(user, "mail_new_user_subject", "mail_new_user_body"); + } catch (MessagingException ex) { + super.remove(user.getId()); + throw new RuntimeException(); + } + } else if (getUser().hasSameOrMoreRightThan(user)) { + super.create(user); + } else { + throw AccessDeniedException.PERMISSION_MISSING(); + } + return user; + } + + /** + * + * @param user + * @param subject + * @param body + * @param defautReturnUrl + */ + private void sendLink(User user, String subject, String body) throws MessagingException { + Locale currentLocale = request.getLocale(); + ResourceBundle messages = ResourceBundle.getBundle("messages", currentLocale); + + String token = authenticationTokenService.issueToken(user, 24L * 60 * 60); + System.out.println(authenticationTokenService.parseToken(token).getIssuedDate()); + String activationLink; + String localSubject; + String localBody; + + String serverRoot = this.reverseProxy; + if (serverRoot.length() == 0) { + serverRoot = request.getRequestURL().substring(0, request.getRequestURL().length() - "/ws/users".length()); + } + + if (returnUrl != null && !returnUrl.isEmpty()) { + activationLink = serverRoot + returnUrl.replace("{token}", token); + localSubject = messages.getString(subject); + localBody = MessageFormat.format(messages.getString(body), activationLink, activationLink); + } else { + localSubject = "AREN API token"; + localBody = token; + } + + mailingService.sendMail("noreply@aren.fr", user.getEmail(), localSubject, localBody); + } + + /** + * Mark a User as being activated after having clik in the mail link + * + */ + @GET + @Path("activate") + @RolesAllowed({"USER"}) + public void activateUser() { + getUser().setActive(true); + getService().edit(getUser()); + getService().invalidateToken(getUser()); + } + + /** + * Ask for a password reset for a User + * + * @param identifier of the User + */ + @POST + @Path("resetPasswd") + @RolesAllowed({"GUEST"}) + public void resetPasswd(String identifier) { + User user = getService().findByUsernameOrEmail(identifier); + if (user != null && user.isActive()) { + try { + sendLink(user, "mail_reset_password_subject", "mail_reset_password_body"); + } catch (MessagingException ex) { + throw new RuntimeException(); + } + } + // else nothing happend, it avoids someone to bruteforce user + } + + /** + * Mark a User as being removed without deleting its associated datas + * + * @param userId to remove + */ + @Override + public void remove(Long userId) { + User toDelete = getService().find(userId); + notificationService.removeAllByUser(userId); + getService().hide(userId); + super.edit(userId, toDelete); + } + + /** + * Remove an User with its associated datas + * + * @param userId to remove + */ + @DELETE + @Path("{id}/permanent") + @RolesAllowed({"SUPERADMIN"}) + public void permanentRemove(@PathParam("id") Long userId) { + User entity = find(userId); + safetyPreDeletion(entity); + notificationService.removeAllByUser(userId); + getService().remove(entity); + } + + /** + * Change User's password + * + * @param changePasswd + * @param token + */ + @PUT + @Path("passwd") + @RolesAllowed({"USER"}) + public void changePassword(ChangePassword changePasswd, @QueryParam("token") String token) { + // Mail token are 24h long, login token are 1 year long + // If this is a token from a mail, then it comes from a password reset requests + // so we do not check the old password + if (token != null && !token.isEmpty()) { + AuthenticationTokenDetails authToken = authenticationTokenService.parseToken(token); + if (authToken.getIssuedDate().plusSeconds(24 * 3600).isEqual(authToken.getExpirationDate())) { + userService.changePassword(getUser(), changePasswd.getNewPassword()); + getService().invalidateToken(getUser()); + return; + } + } + authentificationService.validateCredentials(getUser().getUsername(), changePasswd.getPassword()); + userService.changePassword(getUser(), changePasswd.getNewPassword()); + getService().invalidateToken(getUser()); + } + + /** + * + * @return + */ + @Override + @RolesAllowed({"ADMIN", "MODO"}) + public Set findAll() { + + boolean alone = this.standalone != null; + return getService().findAll(alone); + } + + /** + * Find the User the is currently authentificated + * + * @return + */ + @GET + @Path("me") + @RolesAllowed({"GUEST"}) + public User getAuthenticatedUser() { + + return getUser(); + } + + /** + * Check the existance of an User by its username or mail + * + * @param usernameOrMail + * @return + */ + @GET + @Path("test") + @RolesAllowed({"GUEST"}) + public boolean exists(@QueryParam("identifier") String usernameOrMail) { + return getService().findByUsernameOrEmail(usernameOrMail) != null; + } +} diff --git a/src/main/resources/META-INF/init.sql b/src/main/resources/META-INF/init.sql new file mode 100644 index 0000000..de52c3f --- /dev/null +++ b/src/main/resources/META-INF/init.sql @@ -0,0 +1,2 @@ +INSERT INTO institutions (id, created) VALUES (0, CURRENT_TIMESTAMP); +INSERT INTO users (id, first_name, last_name, email, username, password, is_active, last_login, token_validity, created, authority, institution_id) VALUES (0, 'Super', 'Admin', 'super.admin@lirmm.fr', 'admin', '$2a$10$sbbuW2wJ9FX.pgfsTRkZreFMAemTLwe6dXCPsxzZBnkd6P1dyY9kO', TRUE, NULL, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, 'SUPERADMIN', 0); \ No newline at end of file diff --git a/src/main/resources/META-INF/persistence.xml b/src/main/resources/META-INF/persistence.xml new file mode 100644 index 0000000..76807d4 --- /dev/null +++ b/src/main/resources/META-INF/persistence.xml @@ -0,0 +1,47 @@ + + + + org.hibernate.jpa.HibernatePersistenceProvider + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties new file mode 100644 index 0000000..41d96d0 --- /dev/null +++ b/src/main/resources/application.properties @@ -0,0 +1,59 @@ +# Change the production mode to alter some logging in the application +# On the client side, if set as true, the javascript and css loaded will be the minified ones +production = false + +# If you are behind a reverse proxy, write here the end user root url +# Example : http://aren.my_company.fr/app +reverse-proxy = + +# A unique identification of you web server. Used for remote requets +# Example : My_Institution +plateform.id = My_NewAren + +# Secret use for the creation of JWT token +authentication.jwt.secret = newarensecret + +# Issuer for the JWT token +# Example : my_domain.name +authentication.jwt.issuer = newaren.hn + +# Audience for the JWT token +# Example : my_domain.name +authentication.jwt.audience = newaren.hn + +# Validation time for the JWT tokens, in seconds +# Default is one year +authentication.jwt.validFor = 31536000 + +# Other configuration for JWT token, don't change if you don't know what you do +authentication.jwt.clockSkew = 10 +authentication.jwt.claimNames.authorities = authorities +authentication.jwt.claimNames.refreshCount = refreshCount +authentication.jwt.claimNames.refreshLimit = refreshLimit + +# SMTP configuration +# String +smtp.server = smtp.gmail.com +# Boolean +smtp.auth = true +# Int +smtp.port = 587 +# Boolean +smtp.tls = true +# String +smtp.username = dev.arenmg@gmail.com +# String +smtp.password = Aren123! + +# ENT conexion configuration +# Example : https://cas.mon-ent-occitanie.fr/login +cas.url = + +# AREN tools +# The Python scalar server +scalar.url = https://portail-aren.lirmm.fr/aren-vectors/scalar +# The python theme server +theme.url = https://portail-aren.lirmm.fr/aren-vectors/theme + +# Remote tool configuration +idefix.url = http://www.jeuxdemots.org/intern_extract.php diff --git a/src/main/resources/logging.properties b/src/main/resources/logging.properties new file mode 100644 index 0000000..15f59b8 --- /dev/null +++ b/src/main/resources/logging.properties @@ -0,0 +1,11 @@ +org.apache.catalina.startup.ContextConfig.level = FINE +org.apache.catalina.startup.HostConfig.level = FINE +org.apache.catalina.startup.TldConfig.level = WARNING +org.apache.catalina.core.StandardContext.level = WARNING +org.apache.catalina.core.ApplicationContext.level = WARNING +org.apache.catalina.level = WARNING +org.apache.coyote.AbstractProtocol = WARNING + +# c3p0 specific properties. +com.mchange.v2.log.FallbackMLog.DEFAULT_CUTOFF_LEVEL = WARNING +com.mchange.v2.log.MLog = com.mchange.v2.log.FallbackMLog \ No newline at end of file diff --git a/src/main/resources/messages.properties b/src/main/resources/messages.properties new file mode 100644 index 0000000..dc40f99 --- /dev/null +++ b/src/main/resources/messages.properties @@ -0,0 +1,25 @@ +inactive_user: inactive_user:{username} +bad_credentials: bad_credentials +mandatory_property: mandatory_property:{propertyName} +duplicate_key: duplicate_key:{keyName},{keyValue} +invalid_token: invalid_token +invalid_claim: invalid_claim:{claimName} +invalid_cas_ticket: invalid_cas_ticket +invalid_cas_ticket_detailed: invalid_cas_ticket:{code} +unmutable_object: unmutable_object:{className},{id} +permission_missing: permission_missing +invalid_parent: invalid_parent +cannot_refresh_token: cannot_refresh_token +authentification_required: authentification_required + +team_added_to_debate: team_added_to_debate:{teamName},{debateName} +invited_to_debate: invited_to_debate:{debateName} +comment_answered: comment_answered_by:{firstName},{lastName} +comment_moderated: comment_moderated:{debateName} +comment_signaled: comment_signaled:{debateName} + +mail_new_user_subject: Activation utilisateur +mail_new_user_body:

Bonjour,

Pour poursuivre l''activation de votre compte sur la plateforme AREN veuillez cliquer ici

Si le lien ne fonctionne pas, veuillez copier-coller l''url suivante dans la barre d''adresse de votre navigateur :
{0}


Attention ce lien n''est valable que pendant 24h.


PS : Veuillez ne pas répondre à ce mail qui est envoyé automatiquement par l''application de gestion de comptes informatiques.

+ +mail_reset_password_subject: Réinitialisation du mot de passe +mail_reset_password_body:

Bonjour,

Une demande de réinitialisation de mot de passe à été faite en votre nom pour la plateforme AREN.

Si vous êtes l''auteur\u22c5e de cette demande, pour réinitialiser votre mot de passe, cliquer ici

Si le lien ne fonctionne pas, veuillez copier-coller l''url suivante dans la barre d''adresse de votre navigateur :
{0}


Attention ce lien n''est valable que pendant 24h.


Si vous n''êtes pas l''auteur\u22c5e de cette demande, vous pouvez ignorer cet e-mail.


PS : Veuillez ne pas répondre à ce mail qui est envoyé automatiquement par l''application de gestion de comptes informatiques.

\ No newline at end of file diff --git a/src/main/webapp/META-INF/context.xml b/src/main/webapp/META-INF/context.xml new file mode 100644 index 0000000..a048525 --- /dev/null +++ b/src/main/webapp/META-INF/context.xml @@ -0,0 +1,2 @@ + + diff --git a/src/main/webapp/WEB-INF/AafImport/ficAlimMENESR.dtd b/src/main/webapp/WEB-INF/AafImport/ficAlimMENESR.dtd new file mode 100644 index 0000000..2107383 --- /dev/null +++ b/src/main/webapp/WEB-INF/AafImport/ficAlimMENESR.dtd @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + diff --git a/src/main/webapp/WEB-INF/beans.xml b/src/main/webapp/WEB-INF/beans.xml new file mode 100644 index 0000000..25825aa --- /dev/null +++ b/src/main/webapp/WEB-INF/beans.xml @@ -0,0 +1,6 @@ + + + diff --git a/src/main/webapp/WEB-INF/sass/_components.scss b/src/main/webapp/WEB-INF/sass/_components.scss new file mode 100644 index 0000000..f57cf77 --- /dev/null +++ b/src/main/webapp/WEB-INF/sass/_components.scss @@ -0,0 +1,520 @@ +.material-icons { + font-family: 'Material Icons'; + font-weight: normal; + font-style: normal; + font-size: 24px; + line-height: 1; + letter-spacing: normal; + text-transform: none; + display: inline-block; + white-space: nowrap; + word-wrap: normal; + direction: ltr; + -webkit-font-feature-settings: 'liga'; + -webkit-font-smoothing: antialiased; +} + +.btn.disabled { + pointer-events: auto; +} + +.grid { + grid-auto-rows: min-content; + display: inline-grid; + width: 100%; + .ghead, .gbody, .gfoot, .gr { + display: contents; + } + .gd, .gh { + display: grid; + grid-auto-columns: 1fr; + justify-content: center; + align-content: center; + text-align: center; + padding: 15px; + } + .gh { + align-content: baseline; + .card { + position: sticky; + top: 15px; + bottom: 15px; + } + } + .ghead { + color: $font-color-light; + .gh { + z-index: 8; + border-bottom: 1px solid $grey-color; + max-height: 40px; + line-height: 1em; + } + } + .gbody { + .gr.spacer { + grid-column: 1 / -1; + } + .separator { + grid-column: 1 / -1; + border-top: 1px solid $grey-color; + } + } + .pagination { + grid-column: 1 / -1; + } + + .gbody > .gr { + > .gd { + min-height: 70px; + } + } + + &.striped { + .gbody > .gr { + &:nth-child(odd) .gd { + background-color: $primary-color-light; + } + &:nth-child(odd):hover .gd { + background-color: mix($primary-color-light, $secondary-color-light); + } + &:nth-child(even):hover .gd { + background-color: $secondary-color-light; + } + } + } + + .gbody > .gr { + .gd.action { + grid-auto-flow: column; + grid-gap: 5px; + &.side { + .btn { + width: min-content; + } + } + } + + > .gr.extendable > .gd.action { + padding-top: 0; + padding-bottom: 0; + transition: padding .3s, max-height .3s; + .btn { + max-height: 0; + transition: max-height 0.3s; + } + } + + &:focus-within { + .gd { + background-color: $selection-color !important; + } + > .gr.extendable > .gd.action { + padding-bottom: 15px; + .btn { + max-height: 36px; + } + } + } + } +} + +#tooltip { + opacity: .75; + transition: opacity .3s, margin-top .3s; + &.v-enter, &.v-leave-to { + margin-top: 3px; + opacity: 0; + } + position: fixed; + pointer-events: none; + transform: translate(-50%, -100%); + max-width: 120px; + width: 120px; + background-color: black; + color: #fff; + text-align: center; + padding: 5px; + border-radius: 6px; + margin-top: -7px; + font-size: 11px; + line-height: 13px; + z-index: 1005; + &::after { + content: " "; + position: absolute; + left: 50%; + bottom: -10px; + margin-left: -5px; + border-width: 5px; + border-style: solid; + border-color: black transparent transparent transparent; + } +} + +#documentation { + position: fixed; + display: flex; + align-items: center; + justify-content: center; + z-index: 2000; + pointer-events: none; + opacity: 1; + transition: opacity .3s; + + &.v-enter, &.v-leave-to { + opacity: 0; + .overlay { + width: 0 !important; + height: 0 !important; + } + } + + .overlay { + position: fixed; + border-radius: 10050px; + border: 10000px solid rgba(0,0,0,0.66); + box-sizing: content-box; + transform: translate(-50%, -50%); + transition: all .3s; + } + &.first .overlay{ + transition: opacity .3s, height .3s, width .3s; + } + + .content { + position: absolute; + font-size: 1.5em; + color: white; + max-height: 75%; + max-width: 75%; + h1 { + text-align: center; + } + * { + color: white; + } + > *:first-child { + margin-top: 0; + } + > *:last-child { + margin-bottom: 0; + } + } + + svg { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + stroke-width: 5px; + fill: none; + stroke: white; + } + + .next, .close { + user-select: none; + pointer-events: all !important; + } + + .close { + top: 16px; + right: 6px; + padding-top: 0; + } +} + +.dropdown-button { + position: relative; + display: block; + overflow: visible; + margin: 12px 5px; + line-height: 1; + &:focus, &:focus-within { + .dropdown-content { + display: block; + opacity: 1; + } + } + .dropdown-content { + overflow: visible; + top: calc(100% + 12px); + left: auto; + right: 0; + min-width: 250px; + width: min-content; + &::before { + content: ""; + position: absolute; + top: -20px; + right: 10px; + border-width: 10px; + border-style: solid; + border-color: transparent transparent white transparent; + } + .dropdown-title { + margin: 0; + padding: 8px; + font-weight: bold; + border-bottom: 1px solid $grey-color-light; + .option { + position: absolute; + right: 8px; + font-weight: normal; + cursor: pointer; + &:hover { + text-decoration: underline; + } + } + } + li:hover { + background-color: initial; + } + } +} + +.tabs { + display: grid; + background: initial; + .tab:not(.disabled) a { + cursor: pointer; + position: relative; + &::after { + position: absolute; + content: ""; + background: $primary-color; + width: 0; + height: 2px; + bottom: 0; + left: 50%; + transform: translateX(-50%); + transition: width 0.3s; + } + &:hover, &.active { + &::after { + width: 100%; + } + } + } + .tab.disabled a { + pointer: default; + } +} + +.arrow { + border: solid black; + border-width: 0 2px 2px 0; + border-top-left-radius: 10px; + display: inline-block; + padding: 3px; + transition: transform .3s; + &.to-right { + transform: rotate(-45deg); + -webkit-transform: rotate(-45deg); + } + &.to-left { + transform: rotate(135deg); + -webkit-transform: rotate(135deg); + } + &.to-up { + transform: rotate(-135deg); + -webkit-transform: rotate(-135deg); + } + &.to-down { + transform: rotate(45deg); + -webkit-transform: rotate(45deg); + } +} + +.modal-wrapper { + &.v-enter-active, &.v-leave-active { + transition: all .3s; + } + &.v-enter, &.v-leave-to { + .modal { + opacity: 0; + transform: scale(0.5); + + .modal-overlay { + opacity: 0; + } + } + } + .modal { + opacity: 1; + transform: none; + display: block; + top: 10%; + z-index: 1003; + min-width: 900px; + max-height: 80vh; + transition: opacity .3s ease-in, transform .3s ease-out; + .dragger { + cursor: move; + position: absolute; + height: 24px; + width: 24px; + &:before { + content: '.'; + color: #aaa; + position: absolute; + left: 4.5px; + top: 1.5px; + font-size: 20px; + line-height: 0; + text-shadow: 0 5px, 0 10px, 5px 0, 5px 5px, 5px 10px, 10px 0, 10px 5px, 10px 10px; + } + } + &.modal-fixed-footer { + height: auto; + padding-bottom: 56px; + overflow: hidden; + .modal-content { + position: initial; + max-height: calc(80vh - 56px); + } + } + + .modal-overlay { + top: 0; + z-index: 1002; + display: block; + opacity: 0.5; + transition: opacity .3s ease-in; + } + } + &#confirmDialog .modal { + top: 15%; + z-index: 1005; + width: 50vw; + min-width: 500px; + + .modal-overlay { + z-index: 1004; + } + } +} + +.input-field:focus-within > label { + color: $secondary-color; + transform: translateY(-14px) scale(0.8); + transform-origin: 0 0; +} + +.input-field .helper-text.flash { + animation: blinker 1s linear infinite; +} + +@keyframes blinker { + 50% { + opacity: 0; + } +} + +.chips { + padding-top: 7px; + &:focus-within { + border-bottom: 1px solid $secondary-color; + box-shadow: 0 1px 0 0 $secondary-color; + } + &:empty ~ label { + font-size: inherit; + transform: none; + } + .input { + height: 32px; + vertical-align: middle; + &[disabled="disabled"] { + border: none; + } + } +} +.chip { + cursor: pointer; + user-select: none; + color: white; + background-color: $grey-color; + &.negative { + background-color: $primary-color; + } + &.positive { + background-color: $secondary-color; + } + &.valid { + background-color: $success-color; + } + .close { + height: 24px; + width: 24px; + margin: 4px -7px 4px 4px; + line-height: 24px !important; + border-radius: 20px; + text-align: center; + padding: 0; + transition: background .3s; + &:hover { + background: rgba(0,0,0,.3); + } + } +} + +.toast { + transition: margin-top .3s, opacity .3s; + &.v-enter { + margin-top: 58px; + opacity: 0 !important; + } + &.v-leave-to { + margin-top: -48px; + opacity: 0 !important; + } +} + +.materialize-textarea { + line-height: normal; + padding: .8rem 0 .8rem 0; + min-height: 3rem; + border-bottom: 1px solid $grey-color; + border-radius: 0; + outline: none; + width: 100%; + font-size: 16px; + transition: box-shadow .3s, border .3s; +} + +.materialize-textarea:focus { + outline: none; + border-bottom: 1px solid $secondary-color; + box-shadow: 0 1px 0 0 $secondary-color; +} + +/** alternative modals +.modal { + position: fixed; + top: 0; + left: 0; + background-color: rgba(0, 0, 0, 0.5); + height: 100vh; + width: 100vw; + overflow-y: scroll; +} + +.modal::before, .modal::after { + content: ""; + display: block; + height: 20px; + width: 100%; +} + + +.modal .modal-content { + background: #fafafa; + width: 60%; + margin: auto; +} + +.modal .modal-footer { + position: sticky; + bottom: 20px; + left: 0; + right: 0; + text-align: center; +} +**/ diff --git a/src/main/webapp/WEB-INF/sass/_materialize.scss b/src/main/webapp/WEB-INF/sass/_materialize.scss new file mode 100644 index 0000000..08fcf30 --- /dev/null +++ b/src/main/webapp/WEB-INF/sass/_materialize.scss @@ -0,0 +1,41 @@ +@charset "UTF-8"; + +// Color +@import "components/color-variables"; +@import "components/color-classes"; + +// Variables; +@import "components/variables"; + +// Reset +@import "components/normalize"; + +// components +@import "components/global"; +@import "components/badges"; +@import "components/icons-material-design"; +@import "components/grid"; +@import "components/navbar"; +@import "components/typography"; +@import "components/transitions"; +@import "components/cards"; +@import "components/toast"; +@import "components/tabs"; +@import "components/tooltip"; +@import "components/buttons"; +@import "components/dropdown"; +@import "components/waves"; +@import "components/modal"; +@import "components/collapsible"; +@import "components/chips"; +@import "components/materialbox"; +@import "components/forms/forms"; +@import "components/table_of_contents"; +@import "components/sidenav"; +@import "components/preloader"; +@import "components/slider"; +@import "components/carousel"; +@import "components/tapTarget"; +@import "components/pulse"; +@import "components/datepicker"; +@import "components/timepicker"; \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/sass/_variables.scss b/src/main/webapp/WEB-INF/sass/_variables.scss new file mode 100644 index 0000000..5c5a78e --- /dev/null +++ b/src/main/webapp/WEB-INF/sass/_variables.scss @@ -0,0 +1,66 @@ +// VARIBLES +@font-face { + font-family: "Seravek"; + src: url("../font/seravek-light-webfont.woff") format('woff'); + font-weight: 100; +} + +@font-face { + font-family: "Seravek"; + src: url("../font/seravek-regular-webfont.woff") format('woff'); + font-weight: 400; +} + +@font-face { + font-family: "Seravek"; + src: url("../font/seravek-medium-webfont.woff") format('woff'); + font-weight: 700; +} + +@font-face { + font-family: "Seravek"; + src: url("../font/seravek-bold-webfont.woff") format('woff'); + font-weight: 900; +} + +@font-face { + font-family: 'Material Icons'; + font-style: normal; + font-weight: 400; + src: url("../font/material-icons.woff") format('woff2'); +} + +$background-color: white; +$primary-color: #B84000 !default; +$secondary-color: #4D9999 !default; +$primary-color-light: change-color($primary-color, $lightness: 95%); +$secondary-color-light: change-color($secondary-color, $lightness: 95%); +$selection-color: change-color($secondary-color, $saturation: 60%, $lightness: 60%) !default; + +$text-select-color: #C6E4E3; + +$success-color: #26A96C !default; +/*$error-color: color("red", "base") !default;*/ +$link-color: #336362 !default; +$font-color-light: #B2B2B2 !default; +$font-stack: Seravek, Helvetica, Roboto, Arial, sans-serif; + +$h1-fontsize: 1.4em !default; +$h2-fontsize: 1.2em !default; +$h3-fontsize: 1em !default; +$h4-fontsize: 0.8em !default; +$h5-fontsize: 0.8em !default; + +$blue-color: #4D9999; +$red-color: #BA4100; +$green-color: #26A96C; +$grey-color: #B2B2B2; +$grey-color-light: #DDDFE2; +$grey-color-dark: #808080; + +:root { + --blue-color: #{$blue-color}; + --red-color: #{$red-color}; + --green-color: #{$green-color}; + --grey-color: #{$grey-color}; +} \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/sass/app.scss b/src/main/webapp/WEB-INF/sass/app.scss new file mode 100644 index 0000000..d92c284 --- /dev/null +++ b/src/main/webapp/WEB-INF/sass/app.scss @@ -0,0 +1,1500 @@ +@import "variables"; +@import "materialize"; +@import "components"; + +::-webkit-scrollbar { + width: 12px; + height: 12px; + border-radius: 3px; +} + +::-webkit-scrollbar-track { + background-color: #cecece; + border-left: 1px solid #cdc7c2; +} +::-webkit-scrollbar-thumb { + background-color: #7e8182; + border: 3px solid #cecece; + border-radius: 6px; + min-height: 40px; +} +::-webkit-scrollbar-thumb:hover { + background-color: #565b5c; +} +::-webkit-scrollbar-thumb:active { + background-color: #1b6acb; +} + +h1 { color: $primary-color } +h2 { color: $primary-color } +h3 { color: #000000 } +h4 { color: $primary-color } +h5 { color: #000000 } +td, th { border-radius: 0; } +strong { font-weight: bold; } +textarea { display: block; } +.btn { + text-overflow: ellipsis; + white-space: nowrap; + &.primary-color:hover { + background-color: $primary-color; + } +} +.container { + width: 85% !important; +} + +img { + overflow: hidden; + max-width: 100%; + max-height: 100%; +} +.clickable:hover { + cursor: pointer; + text-decoration: underline; +} +.input-field .materialize-textarea { + min-width: 50px; + font-size: inherit; + &:not([contenteditable]), &[contenteditable="false"] { + border-color: transparent; + } + &[placeholder]:empty::before { + content: attr(placeholder); + color: black; + opacity: 0.25; + } +} + +[tabindex] { + &:focus { + outline: none; + cursor: initial; + } +} + +[v-cloak] { + display: none; +} + +[unselectable="on"] { + -moz-user-select: -moz-none; + -khtml-user-select: none; + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.search-box { + > input { + margin-bottom: 0; + } +} + +$navigation-height: 64px; +$header-height: 60px; + +html { + body { + min-width: 900px; + overflow-y: scroll; + overflow-x: auto; + #app { + --primary-color-hover: var(--primary-color)10; + --secondary-color-hover: var(--secondary-color)10; + display: flex; + min-height: 100vh; + flex-direction: column; + #help { + margin: 0 10px; + cursor: pointer; + } + &.help { + cursor: help; + :not(.documented) { + pointer-events: none; + } + .documented { + pointer-events: all; + } + } + > nav { + height: $navigation-height; + position: sticky; + min-width: 900px; + width: 100%; + top: 0; + left: 0; + z-index: 10; + } + #loading { + position: fixed; + margin: auto; + top: $navigation-height; + border-radius: none; + z-index: 5; + } + .current-view-wrapper { + display: flex; + flex-direction: column; + min-height: calc(100vh - #{$navigation-height}); + padding-bottom: 30px; + .current-view { + display: flex; + flex-direction: column; + flex: 1; + > .container { + display: flex; + flex-direction: column; + flex: 1; + width: 85%; + > #header { + position: sticky; + padding: 0 17px; + top: $navigation-height; + background: $background-color; + display: grid; + grid-template-columns: 1fr max-content; + height: $header-height; + align-items: center; + z-index: 4; + > div { + display: grid; + grid-column-gap: 0.25em; + grid-template-columns: max-content 1fr max-content max-content; + align-items: center; + margin-right: 15px; + width: fit-content; + > h1 { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + margin: 0; + } + .author { + color: $primary-color; + font-size: 14px; + } + .details { + margin: 0; + line-height: 1em; + p { + margin: 0; + } + } + } + #backTo { + position: absolute; + top: 18px; + left: 0; + } + } + > .grid { + flex: 1; + > .ghead .gh { + position: sticky; + top: ($navigation-height + $header-height); + background: $background-color; + z-index: 8; + } + .gh > .card { + top: 179px; + } + } + } + } + } + .page-footer { + .contributors a { + display: flex; + height: 70px; + align-items: center; + justify-content: center; + float: left; + margin-right: 50px; + img { + max-width: 180px; + max-height: 100%; + } + } + } + } + } +} + +@media only print { + html body #app { + > nav { + display: none; + } + .current-view { + padding-top: 0; + > .container { + width: 100%; + > #header { + top: 0; + } + } + } + } +} + +.switch label { + position: relative; +} + +.card { + display: block; + @media #{$small-and-down} { + max-width: 120px; + } + @media #{$medium-and-up} { + max-width: 160px; + } + @media #{$large-and-up} { + max-width: 200px; + } + @media #{$extra-large-and-up} { + max-width: 240px; + } + h2 { + max-height: 43px; + min-height: 43px; + overflow-y: auto; + } +} + +.card-image { + @media #{$small-and-down} { + width: 120px; + height: calc(120px / 3 * 2); + } + @media #{$medium-and-up} { + width: 160px; + height: calc(160px / 3 * 2); + } + @media #{$large-and-up} { + width: 200px; + height: calc(200px / 3 * 2); + } + @media #{$extra-large-and-up} { + width: 240px; + height: calc(240px / 3 * 2); + } + width: 100%; + margin: auto; + img { + height: auto !important; + width:auto !important; + margin: auto; + } +} + +.light-color { + background: $secondary-color-light; +} + +.primary-color { + background: $primary-color; + color: white; +} + +nav { + #logoContainer { + z-index: 1; + float: left; + img { + vertical-align: middle; + margin-bottom: 5px; + } + } + + .menu { + a { + position: relative; + &::after { + position: absolute; + content: ""; + background: $background-color; + width: 0; + height: 2px; + bottom: 0; + left: 50%; + transform: translateX(-50%); + transition: width 0.3s; + } + &:hover, &.active { + &::after { + width: 100%; + } + } + } + } + + #userSettings { + .dropdown-content { + a.btn { + background: $grey-color; + color: white; + width: calc(100% - 30px); + margin: 10px 15px; + } + #changePasswd { + margin: 5px; + .input-field { + input:not(:focus) { + border-bottom: 1px solid; + } + } + } + } + } + + #notifications { + position: relative; + #notificationCount { + position: absolute; + cursor: pointer; + top: 15px; + right: 17px; + border-radius: 2px; + padding: 1px 3px; + line-height: 1.3; + min-height: 1.3em; + min-width: 0; + font-size: 10px; + background-color: $error-color; + } + .dropdown-button { + width: 40px; + height: 40px; + padding: 0; + border-radius: 100px; + i { + cursor: pointer; + text-align: center; + line-height: 40px; + height: 40px; + } + &:focus, &:focus-within { + background-color: rgba(0, 0, 0, 0.1); + } + } + .dropdown-content { + width: 460px; + ul { + height: calc(100vh - 112px); + max-height: 600px; + overflow: auto; + li { + position: relative; + margin-right: 25px; + border-bottom: 1px solid $grey-color-light; + &.unread { + background-color: $primary-color-light; + .read-toggle { + border-width: 3px; + } + &:hover { + background-color: mix($primary-color-light, $secondary-color-light); + } + } + &:hover { + background-color: $secondary-color-light; + .read-toggle { + opacity: 1; + } + } + a { + padding: 5px 16px; + font-size: 14px; + .arg { + font-weight: bold; + } + &:hover { + background-color: initial; + } + } + .read-toggle { + position: absolute; + opacity: 0; + right: 10px; + top: 10px; + width: 10px; + height: 10px; + padding: 0; + border: 5px solid $grey-color; + &:hover { + border-color: $grey-color-dark; + } + border-radius: 10px; + transition: opacity .3s; + } + } + } + } + } +} + +#login { + > div { + justify-content: center; + #loginForm { + width: 500px; + } + } +} + +#aafImport { + .progress { + width: 490px; + } +} + +#home { + #welcomeCallout { + margin: 0; + color: $primary-color; + img { + @media #{$large-and-up} { + margin-left: 50px; + } + @media #{$small-and-down} { + display: none; + } + max-height: 100px; + } + } + + #categoriesList { + .col { + display: inline-block; + float: none; + } + } +} + +#debates { + .opinion { + height: 16px; + width: 100%; + background-color: $grey-color; + .for { + height: 100%; + float: left; + background-color: $blue-color; + } + .against { + height: 100%; + float: right; + background-color: $red-color; + + } + } +} + +#debate, .comment { + .comment-mark { + display: inline; + } +} + +@media only print { + #debate { + height: auto !important; + .selection { + > div { + max-height: none !important; + } + &::before, &::after { + content: none; + } + } + #documentContainer, #commentsContainer { + height: auto !important; + } + } +} + +#debate { + .row { + margin: 0; + } + + #options { + position: sticky; + padding: 0 17px; + top: ($navigation-height + $header-height); + background: $background-color; + z-index: 2; + text-align: right; + .col { + padding: 0; + } + #sortCommentsBy, #leftDisplay { + position: absolute; + bottom: 0; + input { + + i { + font-style: normal; + } + &:checked + i { + font-weight: bold; + } + } + } + .search-box { + margin: 0; + > input { + margin-bottom: 5px; + margin-top: -5px; + } + } + } + + #mainContainer { + height: calc(100vh - #{($navigation-height + $header-height) + 46px}); + } + + #documentContainer, #commentsContainer { + width: 50%; + height: 100%; + float: left; + .scroll-area { + height: 100%; + overflow-y: scroll; + } + } + + #commentsContainer.loading { + position: relative; + overflow-x: hidden; + + &::before, &::after { + content: ""; + display: block; + top:0; + left:0; + width: 100%; + height: 100%; + position: absolute; + } + + &::before { + background: rgb(224, 224, 224); + z-index: 1; + } + + &::after { + background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.3), transparent); + transform: translateX(-100%); + animation: loading 1.5s infinite; + z-index: 1; + } + + @keyframes loading { + 100% { + transform: translateX(100%); + } + } + } + + // Display scrollabr on the left + #documentContainer { + .scroll-area { + direction: rtl; + > * { + direction: ltr; + } + } + } + + #documentContainer { + z-index: 1; + .scroll-area { + padding-left: 5px; + .wrap { + display: flex; + min-height: 100%; + #documentDisplay { + text-align: justify; + font-size: 13px; + line-height: 1.42; + width: calc(100% - 60px); + float: left; + &::selection, ::selection { + background-color: $text-select-color; + } + } + .bullets-container { + float: left; + } + } + } + } + .selection_popup { + position: absolute; + cursor: pointer; + background: $secondary-color; + color: white; + border-radius: 5px; + padding: 0 5px; + &::before { + content: ""; + position: absolute; + border-width: 8px 5px; + border-style: solid; + } + &.top { + margin-top: -7px; + margin-left: -15px; + transform: translateY(-100%); + &::before { + bottom: -16px; + left: 10px; + border-color: $secondary-color transparent transparent transparent; + } + } + &.bottom { + margin-top: 7px; + margin-left: 15px; + transform: translateX(-100%); + &::before { + top: -16px; + right: 10px; + border-color: transparent transparent $secondary-color transparent; + } + } + } + + .comment-container { + &.moderated::after { + content: ""; + position: absolute; + top: 0; + left: 0; + height: 100%; + width: 100%; + background-color: $error-color; + opacity: 50%; + } + } + .answers-container { + overflow: hidden; + .answers { + overflow-y: hidden; + padding: 0 5px 0 10px; + transition: margin-top .3s; + &.v-enter-active { + transition: all 0s; + } + } + } + .comment-body, .spaghetti-data { + .selection { + cursor: pointer; + &:hover, &.active { + background: lighten($grey-color-light, 5%); + border-left-color: $grey-color-dark; + border-right-color: $grey-color-dark; + &::before { + background-image: linear-gradient(#{lighten($grey-color-light, 5%)}, transparent); + } + &::after { + background-image: linear-gradient(transparent, #{lighten($grey-color-light, 5%)}); + } + } + } + } + + .bullets-container { + position: relative; + width: 50px; + margin: 0 5px; + .bullets-box { + position: absolute; + height: 1em; + width: 100%; + display: flex; + align-items: center; + justify-content: space-evenly; + .bullet { + height: 10px; + width: 10px; + &::before { + content: ""; + display: block; + width: 100%; + height: 100%; + box-sizing: border-box; + border-radius: 10px; + } + &.for::before { + background: $blue-color; + } + &.neutral::before { + background: $grey-color; + } + &.against::before { + background: $red-color; + } + &:hover { + cursor: pointer; + z-index: 2; + width: 8px; + height: 8px; + margin: 1px; + } + + } + .bullets-drop-down { + &.for { + background: $blue-color; + } + &.against { + background: $red-color; + } + &.neutral { + background: $grey-color; + } + min-width: 10px; + padding: 5px; + border-radius: 10px; + box-sizing: content-box; + line-height: 10px; + font-size: 10px; + text-align: center; + z-index: 1; + font-weight: bold; + color: white; + transition: box-shadow .3s; + > .label { + overflow: hidden; + height: 10px; + transition: height .3s; + } + > .body { + transition: height .3s; + overflow: hidden; + } + } + &:not(:hover) .bullets-drop-down { + box-shadow: 4px 0 0 -1px #ddd, 4px 0 1px -1px black, + 8px 0 0 -2px #bbb, 8px 0 1px -2px black, + 12px 0 0 -3px #aaa, 12px 0 1px -3px black; + > .body { + height: 0 !important; + } + + } + &:hover .bullets-drop-down { + z-index: 9999; + background: $background-color !important; + width: 10px; + > .label { + height: 0; + } + } + } + } + + .spaghetti-data { + width: 50%; + float: left; + > .theme { + display: grid; + grid-template-columns: min-content 1fr; + align-items: center; + .close { + cursor: pointer; + margin-bottom: 10px; + } + } + } + + svg.spaghettis { + position: fixed; + pointer-events: none; + top: 0; + left: 0; + width: 100%; + height: 100%; + stroke-width: 3px; + use { + fill: none; + stroke-width: 6px; + cursor: pointer; + pointer-events: initial; + } + path { + fill: none; + stroke-width: inherit; + pointer-events: initial; + &.trigger { + stroke-width: 20px; + } + } + > g { + transition: opacity .3s; + } + &.hover > g { + opacity: 0.25; + } + } + +} + +.comment { + position: relative; + font-size: 13px; + padding: 3px 5px; + margin-bottom: 5px; + box-sizing: border-box; + border-left: 3px solid; + outline-width: 3px; + outline-offset: -3px; + .close { + position: absolute; + cursor: pointer; + top: 0; + right: .5em; + } + &.for { + border-color: $blue-color; + outline-color: $blue-color; + .comment-header * { + color: $blue-color; + } + } + &.neutral { + border-color: $grey-color; + outline-color: $grey-color; + .comment-header * { + color: $grey-color; + } + } + &.against { + border-color: $red-color; + outline-color: $red-color; + .comment-header * { + color: $red-color; + } + } + &:focus-within { + outline-style: solid; + outline-width: 3px; + + } + .comment-header { + .username { + display: inline-block; + margin-right: 10px; + margin-top: 0; + } + .comment-count { + cursor: pointer; + } + } + .comment-body { + .reformulation-wrapper, .argumentation-wrapper { + display: grid; + grid-template-columns: 20px 1fr 60px; + > i, > .tags > i { + font-size: 18px; + margin-top: 1px; + } + } + .reformulation-wrapper { + .reformulation { + white-space: pre-wrap; + } + .tags { + margin: 0 20px; + i { + cursor: pointer; + text-shadow: 0 0 1px black, 0 0 1px black, 0 0 1px black, 0 0 1px black; + color: white; + } + &.disabled i { + cursor: default; + opacity: .5; + } + } + } + .argumentation-wrapper { + .argumentation { + white-space: pre-wrap; + &::selection { + background-color: $text-select-color; + } + } + } + } +} + +.selection { + overflow: hidden; + position: relative; + background: $grey-color-light; + border-left: 3px solid $grey-color; + border-right: 3px solid $grey-color; + border-radius: 5px; + transition: background .3s, border-color .3s; + text-align: justify; + font-size: 13px; + line-height: 1.42; + margin-bottom: 10px; + > div > *:nth-last-child(1) { + margin-bottom: 0; + } + &::after, &::before { + position: absolute; + content: ""; + width: 100%; + height: 10px; + background-image: linear-gradient(transparent, $grey-color-light); + left: 0; + bottom: 0; + } + &::before { + background-image: linear-gradient($grey-color-light, transparent); + top: 0; + } + > div { + max-height: 100px; + overflow: auto; + padding: 5px; + *:nth-child(1) { + margin-top: 0; + } + *:nth-last-child(1) { + margin-bottom: 0; + } + } +} + +#commentModal { + .modal { + resize: horizontal; + min-width: 500px; + } + #argumentation { + .materialize-textarea { + min-height: 6em; + } + } + .input-field:focus-within > #reformulationCheck { + svg .line { + stroke: $secondary-color; + stroke-width: 2px; + } + } + #reformulationCheck { + display: flex; + align-items: center; + background: #fafafa; + position: absolute; + right: 0; + bottom: -19px; + + &.loading { + @keyframes spin { + from { + transform: rotate(0deg) + translate(-3px) + rotate(0deg); + } + to { + transform: rotate(360deg) + translate(-3px) + rotate(-360deg); + } + } + svg .pupil { + animation: spin 2s linear infinite; + } + } + + svg { + fill: none; + stroke: none; + .eye { + stroke: #e5e5e5; + } + .eyelid { + fill: #e5e5e5; + } + .pupil { + fill: #666666; + } + .line, .mouth { + stroke: #9e9e9e; + transition: stroke .3s, stroke-width .3s; + } + + span { + font-size: 10px; + border: 1px solid #9e9e9e; + margin-left: 7px; + margin-bottom: 5px; + padding: 0 5px; + &::before { + content: ""; + position: absolute; + top: 10px; + left: 36px; + border: solid #9e9e9e; + border-width: 0 1px 1px 0; + padding: 3px; + background: #fafafa; + transform: rotate(135deg); + } + } + } + } + #opinion { + padding-bottom: 1rem; + input + span { + padding-left: 16px; + &::before { + display: none; + } + &::after { + display: none; + } + } + input:checked + span { + box-shadow: 0 3px 3px 0 rgba(0, 0, 0, 0.14) inset, + 0 1px 7px 0 rgba(0, 0, 0, 0.12) inset, + 0 3px 1px -1px rgba(0, 0, 0, 0.2) inset; + } + input:not(:checked) + span:not(:hover) { + opacity: 0.5; + } + label { + &> .against { + background-color: $red-color; + } + &> .neutral { + background-color: $grey-color; + } + &> .for { + background-color: $blue-color; + } + } + } + #hypostase { + .list{ + display: grid; + width: 100%; + grid-template-columns: 1fr 1fr 1fr 1fr 1fr; + transition: height .3s; + height: 27px; + &.expert { + height: 219px; + } + input[type="checkbox"] { + display: none; + } + > div { + > .btn { + display: block; + height: auto; + line-height: initial; + text-align: center; + padding: 0; + cursor: pointer; + margin: 3px; + padding: 2px 5px !important; + text-transform: none; + &:first-of-type { + font-weight: bold; + } + &:not(:hover) { + opacity: 0.75; + } + } + input:checked + .btn { + background: $secondary-color linear-gradient(0deg, $secondary-color 0%, $secondary-color 100%); + box-shadow: 0 3px 3px 0 rgba(0, 0, 0, 0.14) inset, 0 1px 7px 0 rgba(0, 0, 0, 0.12) inset, 0 3px 1px -1px rgba(0, 0, 0, 0.2) inset; + opacity: 1; + } + } + } + } +} + +#documents { + .grid { + .gr.header { + .gh:hover { + background-color: $secondary-color-light; + } + .card-action { + line-height: 0; + padding-top: 0; + padding-bottom: 0; + border: none; + transition: all .3s; + .btn { + max-height: 0; + } + } + &:focus-within { + .gh { + background-color: $selection-color !important; + } + .card-action { + padding-bottom: 15px; + .btn { + max-height: 36px; + } + } + } + } + } +} + +#document { + .input-field.inline { + margin: 0; + } + .input-field { + margin-bottom: 1px; + } + .ql-toolbar { + position: sticky; + top: ($navigation-height + $header-height); + background: $background-color; + z-index: 10; + height: 42px; + overflow: hidden; + transition: height .3s, padding .3s; + } + .ql-container { + margin-top: -1px; + background: $background-color; + border-top: 1px solid #ccc; + transition: margin-top .3s; + .ql-editor { + margin-bottom: 10px; + text-align: justify; + transition: height .3s; + } + } + #documentDisplay:not(.in-edition) { + .ql-toolbar { + height: 0; + padding-top: 0; + padding-bottom: 0; + border-bottom-width: 0; + } + } +} + +#createDebate { + .steps { + > .tabs { + position: sticky; + top: 75px; + z-index: 9; + display: block; + margin-top: -50px; + text-align: center; + border: none; + height: auto; + background: $background-color; + .tab { + height: auto; + a { + text-transform: capitalize; + line-height: 1em; + &::after { + content: none; + } + } + &:not(.disabled) a { + &.active, &:hover { + img { + border: 1px solid $selection-color; + border-radius: 200px; + margin: 0 -1px; + } + } + } + &.disabled a img { + filter: grayscale(100%); + } + } + } + .grid { + > .ghead .gh { + position: sticky; + top: 202px; + background: $background-color; + z-index: 8; + } + .gh { + .card { + top: 242px; + } + } + } + #contributors { + > div > .tabs { + position: sticky; + top: 202px; + background: $background-color; + z-index: 8; + } + .grid > .ghead .gh { + position: sticky; + top: 250px; + background: $background-color; + z-index: 8; + } + } + .collection-item { + > span { + display: inline-block; + max-width: calc(100% - 40px); + } + .close { + cursor: pointer; + } + } + } + #advancedOptions { + > li { + cursor: pointer; + .arrow { + right: 20px; + position: absolute; + } + } + #advancedOptionsBody { + overflow: hidden; + > ul { + transition: margin-top .3s; + } + } + } +} + +#contributors { + .search-box { + width: 20em; + margin: 0; + } +} + +#sort-options { + height: 46px; + select { + width: 50%; + float: left; + margin: 0; + } + .input-field { + width: 20em; + max-width: 50%; + float: right; + margin: 0; + } +} + +#teams { + #header > div > select { + text-overflow: ellipsis; + color: $primary-color; + } + .search-box { + margin: 0; + } +} + +#restitution { + .detail { + background: $background-color; + margin-right: 10px; + margin-bottom: 10px; + .document { + padding: 1px 10px; + text-align: justify; + font-size: 13px; + line-height: 1.42; + } + } + + .D3_tree { + width: 100%; + overflow: auto; + height: calc(100vh - 172px); + position: relative; + .detail { + background: $background-color; + position: sticky; + height: min-content; + width: 50%; + top: 10px; + left: calc(50% - 10px); + } + svg { + position: absolute; + pointer-events: all; + .nodes { + text { + font: 12px sans-serif; + } + .bullet { + cursor: pointer; + &:hover { + r: 4px; + } + } + .with-children { + text { + cursor: pointer; + } + .bullet { + &:hover { + r: 3px; + } + } + } + } + .links { + fill: none; + stroke: black; + stroke-width: 0.5px; + stroke-opacity: 0.5; + } + } + } + + .D3_pie { + width: 100%; + height: calc(100vh - 172px); + position: relative; + display: grid; + grid-template-rows: 40px 1fr; + grid-template-columns: 50% 50%; + svg { + pointer-events: all; + .detailsCircle { + fill-opacity: 0.35; + fill: none; + } + .detailsText { + text-anchor: middle; + } + } + } + + .D3_sunburst { + width: 100%; + height: calc(100vh - 172px); + overflow: auto; + display: grid; + grid-template-rows: 40px 1fr; + grid-template-columns: 50% 50%; + svg { + position: sticky; + top: 40px; + pointer-events: all; + .slices { + path { + stroke: none; + cursor: pointer; + } + } + } + } + + .D3_pie, .D3_sunburst { + .switch { + padding: 9px 0; + align-self: center; + background: $background-color; + position: sticky; + top: 0; + } + .legend { + height: 100%; + overflow: auto; + display: flex; + flex-flow: column wrap; + align-content: flex-start; + > div { + cursor: default; + padding-right: 10px; + height: 1.4em; + overflow: hidden; + transition: height .3s ease, opacity .3s ease; + &.v-enter, &.v-leave-to { + opacity: 0; + height: 0; + } + &:hover, &.active { + background: $secondary-color-light; + } + .square { + display: inline-block; + vertical-align: middle; + width: 1em; + height: 1em; + border: 1px solid black; + margin-right: 5px; + } + } + } + } + + #tagsRestitution { + margin: 0; + height: calc(100vh - 194px); + > .col { + height: 100%; + margin: 0; + padding: 15px 0; + overflow: auto; + .chip { + opacity: 0.5; + padding-left: 5px; + &.active { + opacity: 1; + } + transition: opacity 0.3s; + [type="checkbox"] { + display: none; + + span { + font-size: inherit; + padding-left: 25px; + &::before, &::after { + content: ''; + position: absolute; + left: 0; + top: 0; + margin: 4px; + width: 16px; + height: 16px; + z-index: 0; + -webkit-transition: .28s ease; + transition: .28s ease; + border-radius: 50%; + } + } + &:checked + span { + &::before { + border-color: white; + transform: none; + } + &::after { + transform: scale(0.5); + background-color: white; + } + } + } + } + } + } +} \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/sass/components/_badges.scss b/src/main/webapp/WEB-INF/sass/components/_badges.scss new file mode 100644 index 0000000..ffed87d --- /dev/null +++ b/src/main/webapp/WEB-INF/sass/components/_badges.scss @@ -0,0 +1,55 @@ +// Badges +span.badge { + min-width: 3rem; + padding: 0 6px; + margin-left: 14px; + text-align: center; + font-size: 1rem; + line-height: $badge-height; + height: $badge-height; + color: color('grey', 'darken-1'); + float: right; + box-sizing: border-box; + + &.new { + font-weight: 300; + font-size: 0.8rem; + color: #fff; + background-color: $badge-bg-color; + border-radius: 2px; + } + &.new:after { + content: " new"; + } + + &[data-badge-caption]::after { + content: " " attr(data-badge-caption); + } +} + +// Special cases +nav ul a span.badge { + display: inline-block; + float: none; + margin-left: 4px; + line-height: $badge-height; + height: $badge-height; + -webkit-font-smoothing: auto; +} + +// Line height centering +.collection-item span.badge { + margin-top: calc(#{$collection-line-height / 2} - #{$badge-height / 2}); +} +.collapsible span.badge { + margin-left: auto; +} +.sidenav span.badge { + margin-top: calc(#{$sidenav-line-height / 2} - #{$badge-height / 2}); +} + +table span.badge { + display: inline-block; + float: none; + margin-left: auto; +} diff --git a/src/main/webapp/WEB-INF/sass/components/_buttons.scss b/src/main/webapp/WEB-INF/sass/components/_buttons.scss new file mode 100644 index 0000000..44b80c8 --- /dev/null +++ b/src/main/webapp/WEB-INF/sass/components/_buttons.scss @@ -0,0 +1,322 @@ +// shared styles +.btn, +.btn-flat { + border: $button-border; + border-radius: $button-radius; + display: inline-block; + height: $button-height; + line-height: $button-height; + padding: $button-padding; + text-transform: uppercase; + vertical-align: middle; + -webkit-tap-highlight-color: transparent; // Gets rid of tap active state +} + +// Disabled shared style +.btn.disabled, +.btn-floating.disabled, +.btn-large.disabled, +.btn-small.disabled, +.btn-flat.disabled, +.btn:disabled, +.btn-floating:disabled, +.btn-large:disabled, +.btn-small:disabled, +.btn-flat:disabled, +.btn[disabled], +.btn-floating[disabled], +.btn-large[disabled], +.btn-small[disabled], +.btn-flat[disabled] { + pointer-events: none; + background-color: $button-disabled-background !important; + box-shadow: none; + color: $button-disabled-color !important; + cursor: default; + &:hover { + background-color: $button-disabled-background !important; + color: $button-disabled-color !important; + } +} + +// Shared icon styles +.btn, +.btn-floating, +.btn-large, +.btn-small, +.btn-flat { + font-size: $button-font-size; + outline: 0; + i { + font-size: $button-icon-font-size; + line-height: inherit; + } +} + +// Shared focus button style +.btn, +.btn-floating { + &:focus { + background-color: darken($button-raised-background, 10%); + } +} + +// Raised Button +.btn { + text-decoration: none; + color: $button-raised-color; + background-color: $button-raised-background; + text-align: center; + letter-spacing: .5px; + @extend .z-depth-1; + transition: background-color .2s ease-out; + cursor: pointer; + &:hover { + background-color: $button-raised-background-hover; + @extend .z-depth-1-half; + } +} + +// Floating button +.btn-floating { + &:hover { + background-color: $button-floating-background-hover; + @extend .z-depth-1-half; + } + &:before { + border-radius: 0; + } + &.btn-large { + &.halfway-fab { + bottom: -$button-floating-large-size / 2; + } + width: $button-floating-large-size; + height: $button-floating-large-size; + padding: 0; + i { + line-height: $button-floating-large-size; + } + } + + &.btn-small { + &.halfway-fab { + bottom: -$button-floating-small-size / 2; + } + width: $button-floating-small-size; + height: $button-floating-small-size; + i { + line-height: $button-floating-small-size; + } + } + + &.halfway-fab { + &.left { + right: auto; + left: 24px; + } + position: absolute; + right: 24px; + bottom: -$button-floating-size / 2; + } + display: inline-block; + color: $button-floating-color; + position: relative; + overflow: hidden; + z-index: 1; + width: $button-floating-size; + height: $button-floating-size; + line-height: $button-floating-size; + padding: 0; + background-color: $button-floating-background; + border-radius: $button-floating-radius; + @extend .z-depth-1; + transition: background-color .3s; + cursor: pointer; + vertical-align: middle; + i { + width: inherit; + display: inline-block; + text-align: center; + color: $button-floating-color; + font-size: $button-large-icon-font-size; + line-height: $button-floating-size; + } +} + +// button fix +button.btn-floating { + border: $button-border; +} + +// Fixed Action Button +.fixed-action-btn { + &.active { + ul { + visibility: visible; + } + } + + // Directions + &.direction-left, + &.direction-right { + padding: 0 0 0 15px; + ul { + text-align: right; + right: 64px; + top: 50%; + transform: translateY(-50%); + height: 100%; + left: auto; + /*width 100% only goes to width of button container */ + width: 500px; + li { + display: inline-block; + margin: 7.5px 15px 0 0; + } + } + } + &.direction-right { + padding: 0 15px 0 0; + ul { + text-align: left; + direction: rtl; + left: 64px; + right: auto; + li { + margin: 7.5px 0 0 15px; + } + } + } + &.direction-bottom { + padding: 0 0 15px 0; + ul { + top: 64px; + bottom: auto; + display: flex; + flex-direction: column-reverse; + li { + margin: 15px 0 0 0; + } + } + } + &.toolbar { + &.active { + &>a i { + opacity: 0; + } + } + padding: 0; + height: $button-floating-large-size; + ul { + display: flex; + top: 0; + bottom: 0; + z-index: 1; + li { + flex: 1; + display: inline-block; + margin: 0; + height: 100%; + transition: none; + a { + display: block; + overflow: hidden; + position: relative; + width: 100%; + height: 100%; + background-color: transparent; + box-shadow: none; + color: #fff; + line-height: $button-floating-large-size; + z-index: 1; + i { + line-height: inherit; + } + } + } + } + } + position: fixed; + right: 23px; + bottom: 23px; + padding-top: 15px; + margin-bottom: 0; + z-index: 997; + ul { + left: 0; + right: 0; + text-align: center; + position: absolute; + bottom: 64px; + margin: 0; + visibility: hidden; + li { + margin-bottom: 15px; + } + a.btn-floating { + opacity: 0; + } + } + .fab-backdrop { + position: absolute; + top: 0; + left: 0; + z-index: -1; + width: $button-floating-size; + height: $button-floating-size; + background-color: $button-floating-background; + border-radius: $button-floating-radius; + transform: scale(0); + } +} + +// Flat button +.btn-flat { + box-shadow: none; + background-color: transparent; + color: $button-flat-color; + cursor: pointer; + transition: background-color .2s; + &:focus, + &:hover { + box-shadow: none; + } + &:focus { + background-color: rgba(0, 0, 0, .1); + } + &.disabled, + &.btn-flat[disabled] { + background-color: transparent !important; + color: $button-flat-disabled-color !important; + cursor: default; + } +} + +// Large button +.btn-large { + @extend .btn; + height: $button-large-height; + line-height: $button-large-height; + font-size: $button-large-font-size; + padding: 0 28px; + + i { + font-size: $button-large-icon-font-size; + } +} + +// Small button +.btn-small { + @extend .btn; + height: $button-small-height; + line-height: $button-small-height; + font-size: $button-small-font-size; + i { + font-size: $button-small-icon-font-size; + } +} + +// Block button +.btn-block { + display: block; +} diff --git a/src/main/webapp/WEB-INF/sass/components/_cards.scss b/src/main/webapp/WEB-INF/sass/components/_cards.scss new file mode 100644 index 0000000..fcbf28e --- /dev/null +++ b/src/main/webapp/WEB-INF/sass/components/_cards.scss @@ -0,0 +1,195 @@ + + +.card-panel { + transition: box-shadow .25s; + padding: $card-padding; + margin: $element-top-margin 0 $element-bottom-margin 0; + border-radius: 2px; + @extend .z-depth-1; + background-color: $card-bg-color; +} + +.card { + position: relative; + margin: $element-top-margin 0 $element-bottom-margin 0; + background-color: $card-bg-color; + transition: box-shadow .25s; + border-radius: 2px; + @extend .z-depth-1; + + + .card-title { + font-size: 24px; + font-weight: 300; + &.activator { + cursor: pointer; + } + } + + // Card Sizes + &.small, &.medium, &.large { + position: relative; + + .card-image { + max-height: 60%; + overflow: hidden; + } + .card-image + .card-content { + max-height: 40%; + } + .card-content { + max-height: 100%; + overflow: hidden; + } + .card-action { + position: absolute; + bottom: 0; + left: 0; + right: 0; + } + } + + &.small { + height: 300px; + } + + &.medium { + height: 400px; + } + + &.large { + height: 500px; + } + + // Horizontal Cards + &.horizontal { + &.small, &.medium, &.large { + .card-image { + height: 100%; + max-height: none; + overflow: visible; + + img { + height: 100%; + } + } + } + + display: flex; + + .card-image { + max-width: 50%; + img { + border-radius: 2px 0 0 2px; + max-width: 100%; + width: auto; + } + } + + .card-stacked { + display: flex; + flex-direction: column; + flex: 1; + position: relative; + + .card-content { + flex-grow: 1; + } + } + } + + // Sticky Action Section + &.sticky-action { + .card-action { + z-index: 2; + } + + .card-reveal { + z-index: 1; + padding-bottom: 64px; + } + } + + + + + .card-image { + position: relative; + + // Image background for content + img { + display: block; + border-radius: 2px 2px 0 0; + position: relative; + left: 0; + right: 0; + top: 0; + bottom: 0; + width: 100%; + } + + .card-title { + color: $card-bg-color; + position: absolute; + bottom: 0; + left: 0; + max-width: 100%; + padding: $card-padding; + } + } + + .card-content { + padding: $card-padding; + border-radius: 0 0 2px 2px; + + p { + margin: 0; + } + .card-title { + display: block; + line-height: 32px; + margin-bottom: 8px; + + i { + line-height: 32px; + } + } + } + + .card-action { + &:last-child { + border-radius: 0 0 2px 2px; + } + background-color: inherit; // Use inherit to inherit color classes + border-top: 1px solid rgba(160,160,160,.2); + position: relative; + padding: 16px $card-padding; + + a:not(.btn):not(.btn-large):not(.btn-floating) { + color: $card-link-color; + margin-right: $card-padding; + transition: color .3s ease; + text-transform: uppercase; + + &:hover { color: $card-link-color-light; } + } + } + + .card-reveal { + padding: $card-padding; + position: absolute; + background-color: $card-bg-color; + width: 100%; + overflow-y: auto; + left: 0; + top: 100%; + height: 100%; + z-index: 3; + display: none; + + .card-title { + cursor: pointer; + display: block; + } + } +} diff --git a/src/main/webapp/WEB-INF/sass/components/_carousel.scss b/src/main/webapp/WEB-INF/sass/components/_carousel.scss new file mode 100644 index 0000000..cc36d4b --- /dev/null +++ b/src/main/webapp/WEB-INF/sass/components/_carousel.scss @@ -0,0 +1,90 @@ +.carousel { + &.carousel-slider { + top: 0; + left: 0; + + .carousel-fixed-item { + &.with-indicators { + bottom: 68px; + } + + position: absolute; + left: 0; + right: 0; + bottom: 20px; + z-index: 1; + } + + .carousel-item { + width: 100%; + height: 100%; + min-height: $carousel-height; + position: absolute; + top: 0; + left: 0; + + h2 { + font-size: 24px; + font-weight: 500; + line-height: 32px; + } + + p { + font-size: 15px; + } + } + } + + overflow: hidden; + position: relative; + width: 100%; + height: $carousel-height; + perspective: 500px; + transform-style: preserve-3d; + transform-origin: 0% 50%; + + .carousel-item { + visibility: hidden; + width: $carousel-item-width; + height: $carousel-item-height; + position: absolute; + top: 0; + left: 0; + + & > img { + width: 100%; + } + } + + .indicators { + position: absolute; + text-align: center; + left: 0; + right: 0; + bottom: 0; + margin: 0; + + .indicator-item { + &.active { + background-color: #fff; + } + + display: inline-block; + position: relative; + cursor: pointer; + height: 8px; + width: 8px; + margin: 24px 4px; + background-color: rgba(255,255,255,.5); + + transition: background-color .3s; + border-radius: 50%; + } + } + + // Materialbox compatibility + &.scrolling .carousel-item .materialboxed, + .carousel-item:not(.active) .materialboxed { + pointer-events: none; + } +} diff --git a/src/main/webapp/WEB-INF/sass/components/_chips.scss b/src/main/webapp/WEB-INF/sass/components/_chips.scss new file mode 100644 index 0000000..27744a8 --- /dev/null +++ b/src/main/webapp/WEB-INF/sass/components/_chips.scss @@ -0,0 +1,90 @@ +.chip { + &:focus { + outline: none; + background-color: $chip-selected-color; + color: #fff; + } + + display: inline-block; + height: 32px; + font-size: 13px; + font-weight: 500; + color: rgba(0,0,0,.6); + line-height: 32px; + padding: 0 12px; + border-radius: 16px; + background-color: $chip-bg-color; + margin-bottom: $chip-margin; + margin-right: $chip-margin; + + > img { + float: left; + margin: 0 8px 0 -12px; + height: 32px; + width: 32px; + border-radius: 50%; + } + + .close { + cursor: pointer; + float: right; + font-size: 16px; + line-height: 32px; + padding-left: 8px; + } +} + +.chips { + border: none; + border-bottom: 1px solid $chip-border-color; + box-shadow: none; + margin: $input-margin; + min-height: 45px; + outline: none; + transition: all .3s; + + &.focus { + border-bottom: 1px solid $chip-selected-color; + box-shadow: 0 1px 0 0 $chip-selected-color; + } + + &:hover { + cursor: text; + } + + .input { + background: none; + border: 0; + color: rgba(0,0,0,.6); + display: inline-block; + font-size: $input-font-size; + height: $input-height; + line-height: 32px; + outline: 0; + margin: 0; + padding: 0 !important; + width: 120px !important; + } + + .input:focus { + border: 0 !important; + box-shadow: none !important; + } + + // Autocomplete + .autocomplete-content { + margin-top: 0; + margin-bottom: 0; + } +} + +// Form prefix +.prefix ~ .chips { + margin-left: 3rem; + width: 92%; + width: calc(100% - 3rem); +} +.chips:empty ~ label { + font-size: 0.8rem; + transform: translateY(-140%); +} diff --git a/src/main/webapp/WEB-INF/sass/components/_collapsible.scss b/src/main/webapp/WEB-INF/sass/components/_collapsible.scss new file mode 100644 index 0000000..024324f --- /dev/null +++ b/src/main/webapp/WEB-INF/sass/components/_collapsible.scss @@ -0,0 +1,91 @@ +.collapsible { + border-top: 1px solid $collapsible-border-color; + border-right: 1px solid $collapsible-border-color; + border-left: 1px solid $collapsible-border-color; + margin: $element-top-margin 0 $element-bottom-margin 0; + @extend .z-depth-1; +} + +.collapsible-header { + &:focus { + outline: 0 + } + + display: flex; + cursor: pointer; + -webkit-tap-highlight-color: transparent; + line-height: 1.5; + padding: 1rem; + background-color: $collapsible-header-color; + border-bottom: 1px solid $collapsible-border-color; + + i { + width: 2rem; + font-size: 1.6rem; + display: inline-block; + text-align: center; + margin-right: 1rem; + } +} +.keyboard-focused .collapsible-header:focus { + background-color: #eee; +} + +.collapsible-body { + display: none; + border-bottom: 1px solid $collapsible-border-color; + box-sizing: border-box; + padding: 2rem; +} + +// Sidenav collapsible styling +.sidenav, +.sidenav.fixed { + + .collapsible { + border: none; + box-shadow: none; + + li { padding: 0; } + } + + .collapsible-header { + background-color: transparent; + border: none; + line-height: inherit; + height: inherit; + padding: 0 $sidenav-padding; + + &:hover { background-color: rgba(0,0,0,.05); } + i { line-height: inherit; } + } + + .collapsible-body { + border: 0; + background-color: $collapsible-header-color; + + li a { + padding: 0 (7.5px + $sidenav-padding) + 0 (15px + $sidenav-padding); + } + } + +} + +// Popout Collapsible + +.collapsible.popout { + border: none; + box-shadow: none; + > li { + box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.16), 0 2px 10px 0 rgba(0, 0, 0, 0.12); + // transform: scaleX(.92); + margin: 0 24px; + transition: margin .35s cubic-bezier(0.250, 0.460, 0.450, 0.940); + } + > li.active { + box-shadow: 0 5px 11px 0 rgba(0, 0, 0, 0.18), 0 4px 15px 0 rgba(0, 0, 0, 0.15); + margin: 16px 0; + // transform: scaleX(1); + } +} diff --git a/src/main/webapp/WEB-INF/sass/components/_color-classes.scss b/src/main/webapp/WEB-INF/sass/components/_color-classes.scss new file mode 100644 index 0000000..155cecd --- /dev/null +++ b/src/main/webapp/WEB-INF/sass/components/_color-classes.scss @@ -0,0 +1,32 @@ +// Color Classes + +@each $color_name, $color in $colors { + @each $color_type, $color_value in $color { + @if $color_type == "base" { + .#{$color_name} { + background-color: $color_value !important; + } + .#{$color_name}-text { + color: $color_value !important; + } + } + @else if $color_name != "shades" { + .#{$color_name}.#{$color_type} { + background-color: $color_value !important; + } + .#{$color_name}-text.text-#{$color_type} { + color: $color_value !important; + } + } + } +} + +// Shade classes +@each $color, $color_value in $shades { + .#{$color} { + background-color: $color_value !important; + } + .#{$color}-text { + color: $color_value !important; + } +} diff --git a/src/main/webapp/WEB-INF/sass/components/_color-variables.scss b/src/main/webapp/WEB-INF/sass/components/_color-variables.scss new file mode 100644 index 0000000..062f6a5 --- /dev/null +++ b/src/main/webapp/WEB-INF/sass/components/_color-variables.scss @@ -0,0 +1,370 @@ +// Google Color Palette defined: http://www.google.com/design/spec/style/color.html + +$materialize-red: ( + "base": #e51c23, + "lighten-5": #fdeaeb, + "lighten-4": #f8c1c3, + "lighten-3": #f3989b, + "lighten-2": #ee6e73, + "lighten-1": #ea454b, + "darken-1": #d0181e, + "darken-2": #b9151b, + "darken-3": #a21318, + "darken-4": #8b1014, +); + +$red: ( + "base": #F44336, + "lighten-5": #FFEBEE, + "lighten-4": #FFCDD2, + "lighten-3": #EF9A9A, + "lighten-2": #E57373, + "lighten-1": #EF5350, + "darken-1": #E53935, + "darken-2": #D32F2F, + "darken-3": #C62828, + "darken-4": #B71C1C, + "accent-1": #FF8A80, + "accent-2": #FF5252, + "accent-3": #FF1744, + "accent-4": #D50000 +); + +$pink: ( + "base": #e91e63, + "lighten-5": #fce4ec, + "lighten-4": #f8bbd0, + "lighten-3": #f48fb1, + "lighten-2": #f06292, + "lighten-1": #ec407a, + "darken-1": #d81b60, + "darken-2": #c2185b, + "darken-3": #ad1457, + "darken-4": #880e4f, + "accent-1": #ff80ab, + "accent-2": #ff4081, + "accent-3": #f50057, + "accent-4": #c51162 +); + +$purple: ( + "base": #9c27b0, + "lighten-5": #f3e5f5, + "lighten-4": #e1bee7, + "lighten-3": #ce93d8, + "lighten-2": #ba68c8, + "lighten-1": #ab47bc, + "darken-1": #8e24aa, + "darken-2": #7b1fa2, + "darken-3": #6a1b9a, + "darken-4": #4a148c, + "accent-1": #ea80fc, + "accent-2": #e040fb, + "accent-3": #d500f9, + "accent-4": #aa00ff +); + +$deep-purple: ( + "base": #673ab7, + "lighten-5": #ede7f6, + "lighten-4": #d1c4e9, + "lighten-3": #b39ddb, + "lighten-2": #9575cd, + "lighten-1": #7e57c2, + "darken-1": #5e35b1, + "darken-2": #512da8, + "darken-3": #4527a0, + "darken-4": #311b92, + "accent-1": #b388ff, + "accent-2": #7c4dff, + "accent-3": #651fff, + "accent-4": #6200ea +); + +$indigo: ( + "base": #3f51b5, + "lighten-5": #e8eaf6, + "lighten-4": #c5cae9, + "lighten-3": #9fa8da, + "lighten-2": #7986cb, + "lighten-1": #5c6bc0, + "darken-1": #3949ab, + "darken-2": #303f9f, + "darken-3": #283593, + "darken-4": #1a237e, + "accent-1": #8c9eff, + "accent-2": #536dfe, + "accent-3": #3d5afe, + "accent-4": #304ffe +); + +$blue: ( + "base": #2196F3, + "lighten-5": #E3F2FD, + "lighten-4": #BBDEFB, + "lighten-3": #90CAF9, + "lighten-2": #64B5F6, + "lighten-1": #42A5F5, + "darken-1": #1E88E5, + "darken-2": #1976D2, + "darken-3": #1565C0, + "darken-4": #0D47A1, + "accent-1": #82B1FF, + "accent-2": #448AFF, + "accent-3": #2979FF, + "accent-4": #2962FF +); + +$light-blue: ( + "base": #03a9f4, + "lighten-5": #e1f5fe, + "lighten-4": #b3e5fc, + "lighten-3": #81d4fa, + "lighten-2": #4fc3f7, + "lighten-1": #29b6f6, + "darken-1": #039be5, + "darken-2": #0288d1, + "darken-3": #0277bd, + "darken-4": #01579b, + "accent-1": #80d8ff, + "accent-2": #40c4ff, + "accent-3": #00b0ff, + "accent-4": #0091ea +); + +$cyan: ( + "base": #00bcd4, + "lighten-5": #e0f7fa, + "lighten-4": #b2ebf2, + "lighten-3": #80deea, + "lighten-2": #4dd0e1, + "lighten-1": #26c6da, + "darken-1": #00acc1, + "darken-2": #0097a7, + "darken-3": #00838f, + "darken-4": #006064, + "accent-1": #84ffff, + "accent-2": #18ffff, + "accent-3": #00e5ff, + "accent-4": #00b8d4 +); + +$teal: ( + "base": #009688, + "lighten-5": #e0f2f1, + "lighten-4": #b2dfdb, + "lighten-3": #80cbc4, + "lighten-2": #4db6ac, + "lighten-1": #26a69a, + "darken-1": #00897b, + "darken-2": #00796b, + "darken-3": #00695c, + "darken-4": #004d40, + "accent-1": #a7ffeb, + "accent-2": #64ffda, + "accent-3": #1de9b6, + "accent-4": #00bfa5 +); + +$green: ( + "base": #4CAF50, + "lighten-5": #E8F5E9, + "lighten-4": #C8E6C9, + "lighten-3": #A5D6A7, + "lighten-2": #81C784, + "lighten-1": #66BB6A, + "darken-1": #43A047, + "darken-2": #388E3C, + "darken-3": #2E7D32, + "darken-4": #1B5E20, + "accent-1": #B9F6CA, + "accent-2": #69F0AE, + "accent-3": #00E676, + "accent-4": #00C853 +); + +$light-green: ( + "base": #8bc34a, + "lighten-5": #f1f8e9, + "lighten-4": #dcedc8, + "lighten-3": #c5e1a5, + "lighten-2": #aed581, + "lighten-1": #9ccc65, + "darken-1": #7cb342, + "darken-2": #689f38, + "darken-3": #558b2f, + "darken-4": #33691e, + "accent-1": #ccff90, + "accent-2": #b2ff59, + "accent-3": #76ff03, + "accent-4": #64dd17 +); + +$lime: ( + "base": #cddc39, + "lighten-5": #f9fbe7, + "lighten-4": #f0f4c3, + "lighten-3": #e6ee9c, + "lighten-2": #dce775, + "lighten-1": #d4e157, + "darken-1": #c0ca33, + "darken-2": #afb42b, + "darken-3": #9e9d24, + "darken-4": #827717, + "accent-1": #f4ff81, + "accent-2": #eeff41, + "accent-3": #c6ff00, + "accent-4": #aeea00 +); + +$yellow: ( + "base": #ffeb3b, + "lighten-5": #fffde7, + "lighten-4": #fff9c4, + "lighten-3": #fff59d, + "lighten-2": #fff176, + "lighten-1": #ffee58, + "darken-1": #fdd835, + "darken-2": #fbc02d, + "darken-3": #f9a825, + "darken-4": #f57f17, + "accent-1": #ffff8d, + "accent-2": #ffff00, + "accent-3": #ffea00, + "accent-4": #ffd600 +); + +$amber: ( + "base": #ffc107, + "lighten-5": #fff8e1, + "lighten-4": #ffecb3, + "lighten-3": #ffe082, + "lighten-2": #ffd54f, + "lighten-1": #ffca28, + "darken-1": #ffb300, + "darken-2": #ffa000, + "darken-3": #ff8f00, + "darken-4": #ff6f00, + "accent-1": #ffe57f, + "accent-2": #ffd740, + "accent-3": #ffc400, + "accent-4": #ffab00 +); + +$orange: ( + "base": #ff9800, + "lighten-5": #fff3e0, + "lighten-4": #ffe0b2, + "lighten-3": #ffcc80, + "lighten-2": #ffb74d, + "lighten-1": #ffa726, + "darken-1": #fb8c00, + "darken-2": #f57c00, + "darken-3": #ef6c00, + "darken-4": #e65100, + "accent-1": #ffd180, + "accent-2": #ffab40, + "accent-3": #ff9100, + "accent-4": #ff6d00 +); + +$deep-orange: ( + "base": #ff5722, + "lighten-5": #fbe9e7, + "lighten-4": #ffccbc, + "lighten-3": #ffab91, + "lighten-2": #ff8a65, + "lighten-1": #ff7043, + "darken-1": #f4511e, + "darken-2": #e64a19, + "darken-3": #d84315, + "darken-4": #bf360c, + "accent-1": #ff9e80, + "accent-2": #ff6e40, + "accent-3": #ff3d00, + "accent-4": #dd2c00 +); + +$brown: ( + "base": #795548, + "lighten-5": #efebe9, + "lighten-4": #d7ccc8, + "lighten-3": #bcaaa4, + "lighten-2": #a1887f, + "lighten-1": #8d6e63, + "darken-1": #6d4c41, + "darken-2": #5d4037, + "darken-3": #4e342e, + "darken-4": #3e2723 +); + +$blue-grey: ( + "base": #607d8b, + "lighten-5": #eceff1, + "lighten-4": #cfd8dc, + "lighten-3": #b0bec5, + "lighten-2": #90a4ae, + "lighten-1": #78909c, + "darken-1": #546e7a, + "darken-2": #455a64, + "darken-3": #37474f, + "darken-4": #263238 +); + +$grey: ( + "base": #9e9e9e, + "lighten-5": #fafafa, + "lighten-4": #f5f5f5, + "lighten-3": #eeeeee, + "lighten-2": #e0e0e0, + "lighten-1": #bdbdbd, + "darken-1": #757575, + "darken-2": #616161, + "darken-3": #424242, + "darken-4": #212121 +); + +$shades: ( + "black": #000000, + "white": #FFFFFF, + "transparent": transparent +); + +$colors: ( + "materialize-red": $materialize-red, + "red": $red, + "pink": $pink, + "purple": $purple, + "deep-purple": $deep-purple, + "indigo": $indigo, + "blue": $blue, + "light-blue": $light-blue, + "cyan": $cyan, + "teal": $teal, + "green": $green, + "light-green": $light-green, + "lime": $lime, + "yellow": $yellow, + "amber": $amber, + "orange": $orange, + "deep-orange": $deep-orange, + "brown": $brown, + "blue-grey": $blue-grey, + "grey": $grey, + "shades": $shades +) !default; + + +// usage: color("name_of_color", "type_of_color") +// to avoid to repeating map-get($colors, ...) + +@function color($color, $type) { + @if map-has-key($colors, $color) { + $curr_color: map-get($colors, $color); + @if map-has-key($curr_color, $type) { + @return map-get($curr_color, $type); + } + } + @warn "Unknown `#{$color}` - `#{$type}` in $colors."; + @return null; +} diff --git a/src/main/webapp/WEB-INF/sass/components/_datepicker.scss b/src/main/webapp/WEB-INF/sass/components/_datepicker.scss new file mode 100644 index 0000000..d2c920b --- /dev/null +++ b/src/main/webapp/WEB-INF/sass/components/_datepicker.scss @@ -0,0 +1,191 @@ +/* Modal */ +.datepicker-modal { + max-width: 325px; + min-width: 300px; + max-height: none; +} + +.datepicker-container.modal-content { + display: flex; + flex-direction: column; + padding: 0; +} + +.datepicker-controls { + display: flex; + justify-content: space-between; + width: 280px; + margin: 0 auto; + + .selects-container { + display: flex; + } + + .select-wrapper { + input { + &:focus { + border-bottom: none; + } + border-bottom: none; + text-align: center; + margin: 0; + } + + .caret { + display: none; + } + } + + .select-year input { + width: 50px; + } + + .select-month input { + width: 70px; + } +} + +.month-prev, .month-next { + margin-top: 4px; + cursor: pointer; + background-color: transparent; + border: none; +} + + +/* Date Display */ +.datepicker-date-display { + flex: 1 auto; + background-color: $secondary-color; + color: #fff; + padding: 20px 22px; + font-weight: 500; + + .year-text { + display: block; + font-size: 1.5rem; + line-height: 25px; + color: $datepicker-year; + } + + .date-text { + display: block; + font-size: 2.8rem; + line-height: 47px; + font-weight: 500; + } +} + + +/* Calendar */ +.datepicker-calendar-container { + flex: 2.5 auto; +} + +.datepicker-table { + width: 280px; + font-size: 1rem; + margin: 0 auto; + + thead { + border-bottom: none; + } + + th { + padding: 10px 5px; + text-align: center; + } + + tr { + border: none; + } + + abbr { + text-decoration: none; + color: $datepicker-calendar-header-color; + } + + td { + &.is-today { + color: $secondary-color; + } + + &.is-selected { + background-color: $secondary-color; + color: #fff; + } + + &.is-outside-current-month, + &.is-disabled { + color: $datepicker-disabled-day-color; + pointer-events: none; + } + + border-radius: 50%; + padding: 0; + } +} + +.datepicker-day-button { + &:focus { + background-color: $datepicker-day-focus; + } + + background-color: transparent; + border: none; + line-height: 38px; + display: block; + width: 100%; + border-radius: 50%; + padding: 0 5px; + cursor: pointer; + color: inherit; +} + + +/* Footer */ +.datepicker-footer { + width: 280px; + margin: 0 auto; + padding-bottom: 5px; + display: flex; + justify-content: space-between; +} + +.datepicker-cancel, +.datepicker-clear, +.datepicker-today, +.datepicker-done { + color: $secondary-color; + padding: 0 1rem; +} + +.datepicker-clear { + color: $error-color; +} + + +/* Media Queries */ +@media #{$medium-and-up} { + .datepicker-modal { + max-width: 625px; + } + + .datepicker-container.modal-content { + flex-direction: row; + } + + .datepicker-date-display { + flex: 0 1 270px; + } + + .datepicker-controls, + .datepicker-table, + .datepicker-footer { + width: 320px; + } + + .datepicker-day-button { + line-height: 44px; + } +} diff --git a/src/main/webapp/WEB-INF/sass/components/_dropdown.scss b/src/main/webapp/WEB-INF/sass/components/_dropdown.scss new file mode 100644 index 0000000..0caae65 --- /dev/null +++ b/src/main/webapp/WEB-INF/sass/components/_dropdown.scss @@ -0,0 +1,85 @@ +.dropdown-content { + &:focus { + outline: 0; + } + + + @extend .z-depth-1; + background-color: $dropdown-bg-color; + margin: 0; + display: none; + min-width: 100px; + overflow-y: auto; + opacity: 0; + position: absolute; + left: 0; + top: 0; + z-index: 9999; // TODO: Check if this doesn't break other things + transform-origin: 0 0; + + + li { + &:hover, &.active { + background-color: $dropdown-hover-bg-color; + } + + &:focus { + outline: none; + } + + &.divider { + min-height: 0; + height: 1px; + } + + & > a, & > span { + font-size: 16px; + color: $dropdown-color; + display: block; + line-height: 22px; + padding: (($dropdown-item-height - 22) / 2) 16px; + } + + & > span > label { + top: 1px; + left: 0; + height: 18px; + } + + // Icon alignment override + & > a > i { + height: inherit; + line-height: inherit; + float: left; + margin: 0 24px 0 0; + width: 24px; + } + + + clear: both; + color: $off-black; + cursor: pointer; + min-height: $dropdown-item-height; + line-height: 1.5rem; + width: 100%; + text-align: left; + } +} + +body.keyboard-focused { + .dropdown-content li:focus { + background-color: darken($dropdown-hover-bg-color, 8%); + } +} + +// Input field specificity bugfix +.input-field.col .dropdown-content [type="checkbox"] + label { + top: 1px; + left: 0; + height: 18px; + transform: none; +} + +.dropdown-trigger { + cursor: pointer; +} \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/sass/components/_global.scss b/src/main/webapp/WEB-INF/sass/components/_global.scss new file mode 100644 index 0000000..39f33db --- /dev/null +++ b/src/main/webapp/WEB-INF/sass/components/_global.scss @@ -0,0 +1,769 @@ +//Default styles + +html { + box-sizing: border-box; +} +*, *:before, *:after { + box-sizing: inherit; +} + +body { + // display: flex; + // min-height: 100vh; + // flex-direction: column; +} + +main { + // flex: 1 0 auto; +} + +button, +input, +optgroup, +select, +textarea { + font-family: $font-stack; +} + +ul { + &:not(.browser-default) { + padding-left: 0; + list-style-type: none; + + & > li { + list-style-type: none; + } + } +} + +a { + color: $link-color; + text-decoration: none; + + // Gets rid of tap active state + -webkit-tap-highlight-color: transparent; +} + + +// Positioning +.valign-wrapper { + display: flex; + align-items: center; +} + + +// classic clearfix +.clearfix { + clear: both; +} + + +// Z-levels +.z-depth-0 { + box-shadow: none !important; +} + +/* 2dp elevation modified*/ +.z-depth-1 { + box-shadow: 0 2px 2px 0 rgba(0,0,0,0.14), + 0 3px 1px -2px rgba(0,0,0,0.12), + 0 1px 5px 0 rgba(0,0,0,0.2); +} +.z-depth-1-half { + box-shadow: 0 3px 3px 0 rgba(0, 0, 0, 0.14), 0 1px 7px 0 rgba(0, 0, 0, 0.12), 0 3px 1px -1px rgba(0, 0, 0, 0.2); +} + +/* 6dp elevation modified*/ +.z-depth-2 { + box-shadow: 0 4px 5px 0 rgba(0,0,0,0.14), + 0 1px 10px 0 rgba(0,0,0,0.12), + 0 2px 4px -1px rgba(0,0,0,0.3); +} + +/* 12dp elevation modified*/ +.z-depth-3 { + box-shadow: 0 8px 17px 2px rgba(0,0,0,0.14), + 0 3px 14px 2px rgba(0,0,0,0.12), + 0 5px 5px -3px rgba(0, 0, 0, 0.2); +} + +/* 16dp elevation */ +.z-depth-4 { + box-shadow: 0 16px 24px 2px rgba(0,0,0,0.14), + 0 6px 30px 5px rgba(0,0,0,0.12), + 0 8px 10px -7px rgba(0,0,0,0.2); +} + +/* 24dp elevation */ +.z-depth-5 { + box-shadow: 0 24px 38px 3px rgba(0,0,0,0.14), + 0 9px 46px 8px rgba(0,0,0,0.12), + 0 11px 15px -7px rgba(0,0,0,0.2); +} + +.hoverable { + transition: box-shadow .25s; + + &:hover { + box-shadow: 0 8px 17px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19); + } +} + +// Dividers + +.divider { + height: 1px; + overflow: hidden; + background-color: color("grey", "lighten-2"); +} + + +// Blockquote + +blockquote { + margin: 20px 0; + padding-left: 1.5rem; + border-left: 5px solid $primary-color; +} + +// Icon Styles + +i { + line-height: inherit; + + &.left { + float: left; + margin-right: 15px; + } + &.right { + float: right; + margin-left: 15px; + } + &.tiny { + font-size: 1rem; + } + &.small { + font-size: 2rem; + } + &.medium { + font-size: 4rem; + } + &.large { + font-size: 6rem; + } +} + +// Images +img.responsive-img, +video.responsive-video { + max-width: 100%; + height: auto; +} + + +// Pagination + +.pagination { + + li { + display: inline-block; + border-radius: 2px; + text-align: center; + vertical-align: top; + height: 30px; + + a { + color: #444; + display: inline-block; + font-size: 1.2rem; + padding: 0 10px; + line-height: 30px; + } + + &.active a { color: #fff; } + + &.active { background-color: $primary-color; } + + &.disabled a { + cursor: default; + color: #999; + } + + i { + font-size: 2rem; + } + } + + + li.pages ul li { + display: inline-block; + float: none; + } +} +@media #{$medium-and-down} { + .pagination { + width: 100%; + + li.prev, + li.next { + width: 10%; + } + + li.pages { + width: 80%; + overflow: hidden; + white-space: nowrap; + } + } +} + +// Breadcrumbs +.breadcrumb { + font-size: 18px; + color: rgba(255,255,255, .7); + + i, + [class^="mdi-"], [class*="mdi-"], + i.material-icons { + display: inline-block; + float: left; + font-size: 24px; + } + + &:before { + content: '\E5CC'; + color: rgba(255,255,255, .7); + vertical-align: top; + display: inline-block; + font-family: 'Material Icons'; + font-weight: normal; + font-style: normal; + font-size: 25px; + margin: 0 10px 0 8px; + -webkit-font-smoothing: antialiased; + } + + &:first-child:before { + display: none; + } + + &:last-child { + color: #fff; + } +} + +// Parallax +.parallax-container { + position: relative; + overflow: hidden; + height: 500px; + + .parallax { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + z-index: -1; + + img { + opacity: 0; + position: absolute; + left: 50%; + bottom: 0; + min-width: 100%; + min-height: 100%; + transform: translate3d(0,0,0); + transform: translateX(-50%); + } + } +} + +// Pushpin +.pin-top, .pin-bottom { + position: relative; +} +.pinned { + position: fixed !important; +} + +/********************* + Transition Classes +**********************/ + +ul.staggered-list li { + opacity: 0; +} + +.fade-in { + opacity: 0; + transform-origin: 0 50%; +} + + +/********************* + Media Query Classes +**********************/ +.hide-on-small-only, .hide-on-small-and-down { + @media #{$small-and-down} { + display: none !important; + } +} +.hide-on-med-and-down { + @media #{$medium-and-down} { + display: none !important; + } +} +.hide-on-med-and-up { + @media #{$medium-and-up} { + display: none !important; + } +} +.hide-on-med-only { + @media only screen and (min-width: $small-screen) and (max-width: $medium-screen) { + display: none !important; + } +} +.hide-on-large-only { + @media #{$large-and-up} { + display: none !important; + } +} +.hide-on-extra-large-only { + @media #{$extra-large-and-up} { + display: none !important; + } +} +.show-on-extra-large { + @media #{$extra-large-and-up} { + display: block !important; + } +} +.show-on-large { + @media #{$large-and-up} { + display: block !important; + } +} +.show-on-medium { + @media only screen and (min-width: $small-screen) and (max-width: $medium-screen) { + display: block !important; + } +} +.show-on-small { + @media #{$small-and-down} { + display: block !important; + } +} +.show-on-medium-and-up { + @media #{$medium-and-up} { + display: block !important; + } +} +.show-on-medium-and-down { + @media #{$medium-and-down} { + display: block !important; + } +} + + +// Center text on mobile +.center-on-small-only { + @media #{$small-and-down} { + text-align: center; + } +} + +// Footer +.page-footer { + padding-top: 20px; + color: $footer-font-color; + background-color: $footer-bg-color; + + .footer-copyright { + overflow: hidden; + min-height: 50px; + display: flex; + align-items: center; + justify-content: space-between; + padding: 10px 0px; + color: $footer-copyright-font-color; + background-color: $footer-copyright-bg-color; + } +} + +// Tables +table, th, td { + border: none; +} + +table { + width:100%; + display: table; + border-collapse: collapse; + border-spacing: 0; + + &.striped { + tr { + border-bottom: none; + } + + > tbody { + > tr:nth-child(odd) { + background-color: $table-striped-color; + } + + > tr > td { + border-radius: 0; + } + } + } + + &.highlight > tbody > tr { + transition: background-color .25s ease; + &:hover { + background-color: $table-striped-color; + } + } + + &.centered { + thead tr th, tbody tr td { + text-align: center; + } + } +} + +tr { + border-bottom: 1px solid $table-border-color; +} + +td, th{ + padding: 15px 5px; + display: table-cell; + text-align: left; + vertical-align: middle; + border-radius: 2px; +} + +// Responsive Table +@media #{$medium-and-down} { + + table.responsive-table { + width: 100%; + border-collapse: collapse; + border-spacing: 0; + display: block; + position: relative; + + td:empty:before { + content: '\00a0'; + } + + th, + td { + margin: 0; + vertical-align: top; + } + + th { text-align: left; } + thead { + display: block; + float: left; + + tr { + display: block; + padding: 0 10px 0 0; + + th::before { + content: "\00a0"; + } + } + } + tbody { + display: block; + width: auto; + position: relative; + overflow-x: auto; + white-space: nowrap; + + tr { + display: inline-block; + vertical-align: top; + } + } + th { + display: block; + text-align: right; + } + td { + display: block; + min-height: 1.25em; + text-align: left; + } + tr { + border-bottom: none; + padding: 0 10px; + } + + /* sort out borders */ + thead { + border: 0; + border-right: 1px solid $table-border-color; + } + } + +} + + +// Collections +.collection { + margin: $element-top-margin 0 $element-bottom-margin 0; + border: 1px solid $collection-border-color; + border-radius: 2px; + overflow: hidden; + position: relative; + + .collection-item { + background-color: $collection-bg-color; + line-height: $collection-line-height; + padding: 10px 20px; + margin: 0; + border-bottom: 1px solid $collection-border-color; + + // Avatar Collection + &.avatar { + min-height: 84px; + padding-left: 72px; + position: relative; + + // Don't style circles inside preloader classes. + &:not(.circle-clipper) > .circle, + :not(.circle-clipper) > .circle { + position: absolute; + width: 42px; + height: 42px; + overflow: hidden; + left: 15px; + display: inline-block; + vertical-align: middle; + } + i.circle { + font-size: 18px; + line-height: 42px; + color: #fff; + background-color: #999; + text-align: center; + } + + + .title { + font-size: 16px; + } + + p { + margin: 0; + } + + .secondary-content { + position: absolute; + top: 16px; + right: 16px; + } + + } + + + &:last-child { + border-bottom: none; + } + + &.active { + background-color: $collection-active-bg-color; + color: $collection-active-color; + + .secondary-content { + color: #fff; + } + } + } + a.collection-item{ + display: block; + transition: .25s; + color: $collection-link-color; + &:not(.active) { + &:hover { + background-color: $collection-hover-bg-color; + } + } + } + + &.with-header { + .collection-header { + background-color: $collection-bg-color; + border-bottom: 1px solid $collection-border-color; + padding: 10px 20px; + } + .collection-item { + padding-left: 30px; + } + .collection-item.avatar { + padding-left: 72px; + } + } + +} +// Made less specific to allow easier overriding +.secondary-content { + float: right; + color: $secondary-color; +} +.collapsible .collection { + margin: 0; + border: none; +} + + + +// Responsive Videos +.video-container { + position: relative; + padding-bottom: 56.25%; + height: 0; + overflow: hidden; + + iframe, object, embed { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + } +} + +// Progress Bar +.progress { + position: relative; + height: 4px; + display: block; + width: 100%; + background-color: lighten($progress-bar-color, 40%); + border-radius: 2px; + margin: $element-top-margin 0 $element-bottom-margin 0; + overflow: hidden; + .determinate { + position: absolute; + top: 0; + left: 0; + bottom: 0; + background-color: $progress-bar-color; + transition: width .3s linear; + } + .indeterminate { + background-color: $progress-bar-color; + &:before { + content: ''; + position: absolute; + background-color: inherit; + top: 0; + left:0; + bottom: 0; + will-change: left, right; + // Custom bezier + animation: indeterminate 2.1s cubic-bezier(0.650, 0.815, 0.735, 0.395) infinite; + + } + &:after { + content: ''; + position: absolute; + background-color: inherit; + top: 0; + left:0; + bottom: 0; + will-change: left, right; + // Custom bezier + animation: indeterminate-short 2.1s cubic-bezier(0.165, 0.840, 0.440, 1.000) infinite; + animation-delay: 1.15s; + } + } +} +@keyframes indeterminate { + 0% { + left: -35%; + right:100%; + } + 60% { + left: 100%; + right: -90%; + } + 100% { + left: 100%; + right: -90%; + } +} + +@keyframes indeterminate-short { + 0% { + left: -200%; + right: 100%; + } + 60% { + left: 107%; + right: -8%; + } + 100% { + left: 107%; + right: -8%; + } +} + + +/******************* + Utility Classes +*******************/ + +.hide { + display: none !important; +} + +// Text Align +.left-align { + text-align: left; +} +.right-align { + text-align: right +} +.center, .center-align { + text-align: center; +} + +.left { + float: left !important; +} +.right { + float: right !important; +} + +// No Text Select +.no-select { + user-select: none; +} + +.circle { + border-radius: 50%; +} + +.center-block { + display: block; + margin-left: auto; + margin-right: auto; +} + +.truncate { + display: block; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.no-padding { + padding: 0 !important; +} diff --git a/src/main/webapp/WEB-INF/sass/components/_grid.scss b/src/main/webapp/WEB-INF/sass/components/_grid.scss new file mode 100644 index 0000000..8892f05 --- /dev/null +++ b/src/main/webapp/WEB-INF/sass/components/_grid.scss @@ -0,0 +1,156 @@ +.container { + margin: 0 auto; + max-width: 1280px; + width: 90%; +} +@media #{$medium-and-up} { + .container { + width: 85%; + } +} +@media #{$large-and-up} { + .container { + width: 70%; + } +} +.col .row { + margin-left: (-1 * $gutter-width / 2); + margin-right: (-1 * $gutter-width / 2); +} + +.section { + padding-top: 1rem; + padding-bottom: 1rem; + + &.no-pad { + padding: 0; + } + &.no-pad-bot { + padding-bottom: 0; + } + &.no-pad-top { + padding-top: 0; + } +} + + +// Mixins to eliminate code repitition +@mixin reset-offset { + margin-left: auto; + left: auto; + right: auto; +} +@mixin grid-classes($size, $i, $perc) { + &.offset-#{$size}#{$i} { + margin-left: $perc; + } + &.pull-#{$size}#{$i} { + right: $perc; + } + &.push-#{$size}#{$i} { + left: $perc; + } +} + + +.row { + margin-left: auto; + margin-right: auto; + margin-bottom: 20px; + + // Clear floating children + &:after { + content: ""; + display: table; + clear: both; + } + + .col { + float: left; + box-sizing: border-box; + padding: 0 $gutter-width / 2; + min-height: 1px; + + &[class*="push-"], + &[class*="pull-"] { + position: relative; + } + + $i: 1; + @while $i <= $num-cols { + $perc: unquote((100 / ($num-cols / $i)) + "%"); + &.s#{$i} { + width: $perc; + @include reset-offset; + } + $i: $i + 1; + } + + $i: 1; + @while $i <= $num-cols { + $perc: unquote((100 / ($num-cols / $i)) + "%"); + @include grid-classes("s", $i, $perc); + $i: $i + 1; + } + + @media #{$medium-and-up} { + + $i: 1; + @while $i <= $num-cols { + $perc: unquote((100 / ($num-cols / $i)) + "%"); + &.m#{$i} { + width: $perc; + @include reset-offset; + } + $i: $i + 1 + } + + $i: 1; + @while $i <= $num-cols { + $perc: unquote((100 / ($num-cols / $i)) + "%"); + @include grid-classes("m", $i, $perc); + $i: $i + 1; + } + } + + @media #{$large-and-up} { + + $i: 1; + @while $i <= $num-cols { + $perc: unquote((100 / ($num-cols / $i)) + "%"); + &.l#{$i} { + width: $perc; + @include reset-offset; + } + $i: $i + 1; + } + + $i: 1; + @while $i <= $num-cols { + $perc: unquote((100 / ($num-cols / $i)) + "%"); + @include grid-classes("l", $i, $perc); + $i: $i + 1; + } + } + + @media #{$extra-large-and-up} { + + $i: 1; + @while $i <= $num-cols { + $perc: unquote((100 / ($num-cols / $i)) + "%"); + &.xl#{$i} { + width: $perc; + @include reset-offset; + } + $i: $i + 1; + } + + $i: 1; + @while $i <= $num-cols { + $perc: unquote((100 / ($num-cols / $i)) + "%"); + @include grid-classes("xl", $i, $perc); + $i: $i + 1; + } + } + } +} diff --git a/src/main/webapp/WEB-INF/sass/components/_icons-material-design.scss b/src/main/webapp/WEB-INF/sass/components/_icons-material-design.scss new file mode 100644 index 0000000..d8d91c1 --- /dev/null +++ b/src/main/webapp/WEB-INF/sass/components/_icons-material-design.scss @@ -0,0 +1,5 @@ +/* This is needed for some mobile phones to display the Google Icon font properly */ +.material-icons { + text-rendering: optimizeLegibility; + font-feature-settings: 'liga'; +} diff --git a/src/main/webapp/WEB-INF/sass/components/_materialbox.scss b/src/main/webapp/WEB-INF/sass/components/_materialbox.scss new file mode 100644 index 0000000..0ebd63f --- /dev/null +++ b/src/main/webapp/WEB-INF/sass/components/_materialbox.scss @@ -0,0 +1,43 @@ +.materialboxed { + &:hover { + &:not(.active) { + opacity: .8; + } + } + + display: block; + cursor: zoom-in; + position: relative; + transition: opacity .4s; + -webkit-backface-visibility: hidden; + + &.active { + cursor: zoom-out; + } +} + +#materialbox-overlay { + position:fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + background-color: #292929; + z-index: 1000; + will-change: opacity; +} + +.materialbox-caption { + position: fixed; + display: none; + color: #fff; + line-height: 50px; + bottom: 0; + left: 0; + width: 100%; + text-align: center; + padding: 0% 15%; + height: 50px; + z-index: 1000; + -webkit-font-smoothing: antialiased; +} \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/sass/components/_modal.scss b/src/main/webapp/WEB-INF/sass/components/_modal.scss new file mode 100644 index 0000000..38cf3ce --- /dev/null +++ b/src/main/webapp/WEB-INF/sass/components/_modal.scss @@ -0,0 +1,94 @@ +.modal { + &:focus { + outline: none; + } + + @extend .z-depth-5; + + display: none; + position: fixed; + left: 0; + right: 0; + background-color: #fafafa; + padding: 0; + max-height: 70%; + width: 55%; + margin: auto; + overflow-y: auto; + + border-radius: 2px; + will-change: top, opacity; + + @media #{$medium-and-down} { + width: 80%; + } + + h1,h2,h3,h4 { + margin-top: 0; + } + + .modal-content { + padding: 24px; + } + .modal-close { + cursor: pointer; + } + + .modal-footer { + border-radius: 0 0 2px 2px; + background-color: #fafafa; + padding: 4px 6px; + height: 56px; + width: 100%; + text-align: right; + + .btn, .btn-flat { + margin: 6px 0; + } + } +} +.modal-overlay { + position: fixed; + z-index: 999; + top: -25%; + left: 0; + bottom: 0; + right: 0; + height: 125%; + width: 100%; + background: #000; + display: none; + + will-change: opacity; +} + +// Modal with fixed action footer +.modal.modal-fixed-footer { + padding: 0; + height: 70%; + + .modal-content { + position: absolute; + height: calc(100% - 56px); + max-height: 100%; + width: 100%; + overflow-y: auto; + } + + .modal-footer { + border-top: 1px solid rgba(0,0,0,.1); + position: absolute; + bottom: 0; + } +} + +// Modal Bottom Sheet Style +.modal.bottom-sheet { + top: auto; + bottom: -100%; + margin: 0; + width: 100%; + max-height: 45%; + border-radius: 0; + will-change: bottom, opacity; +} diff --git a/src/main/webapp/WEB-INF/sass/components/_navbar.scss b/src/main/webapp/WEB-INF/sass/components/_navbar.scss new file mode 100644 index 0000000..0317bb2 --- /dev/null +++ b/src/main/webapp/WEB-INF/sass/components/_navbar.scss @@ -0,0 +1,208 @@ +nav { + &.nav-extended { + height: auto; + + .nav-wrapper { + min-height: $navbar-height-mobile; + height: auto; + } + + .nav-content { + position: relative; + line-height: normal; + } + } + + color: $navbar-font-color; + @extend .z-depth-1; + background-color: $primary-color; + width: 100%; + height: $navbar-height-mobile; + line-height: $navbar-line-height-mobile; + + a { color: $navbar-font-color; } + + i, + [class^="mdi-"], [class*="mdi-"], + i.material-icons { + display: block; + font-size: 24px; + height: $navbar-height-mobile; + line-height: $navbar-line-height-mobile; + } + + .nav-wrapper { + position: relative; + height: 100%; + } + + @media #{$large-and-up} { + a.sidenav-trigger { display: none; } + } + + + // Collapse button + .sidenav-trigger { + float: left; + position: relative; + z-index: 1; + height: $navbar-height-mobile; + margin: 0 18px; + + i { + height: $navbar-height-mobile; + line-height: $navbar-line-height-mobile; + } + } + + + // Logo + .brand-logo { + position: absolute; + color: $navbar-font-color; + display: inline-block; + font-size: $navbar-brand-font-size; + padding: 0; + + &.center { + left: 50%; + transform: translateX(-50%); + } + + @media #{$medium-and-down} { + left: 50%; + transform: translateX(-50%); + + &.left, &.right { + padding: 0; + transform: none; + } + + &.left { left: 0.5rem; } + &.right { + right: 0.5rem; + left: auto; + } + } + + &.right { + right: 0.5rem; + padding: 0; + } + + i, + [class^="mdi-"], [class*="mdi-"], + i.material-icons { + float: left; + margin-right: 15px; + } + } + + + // Title + .nav-title { + display: inline-block; + font-size: 32px; + padding: 28px 0; + } + + + // Navbar Links + ul { + margin: 0; + + li { + transition: background-color .3s; + float: left; + padding: 0; + + &.active { + background-color: rgba(0,0,0,.1); + } + } + a { + transition: background-color .3s; + font-size: $navbar-font-size; + color: $navbar-font-color; + display: block; + padding: 0 15px; + cursor: pointer; + + &.btn, &.btn-large, &.btn-flat, &.btn-floating { + margin-top: -2px; + margin-left: 15px; + margin-right: 15px; + + & > .material-icons { + height: inherit; + line-height: inherit; + } + } + + &:hover { + background-color: rgba(0,0,0,.1); + } + } + + &.left { + float: left; + } + } + + // Navbar Search Form + form { + height: 100%; + } + + .input-field { + margin: 0; + height: 100%; + + input { + height: 100%; + font-size: 1.2rem; + border: none; + padding-left: 2rem; + + &:focus, &[type=text]:valid, &[type=password]:valid, + &[type=email]:valid, &[type=url]:valid, &[type=date]:valid { + border: none; + box-shadow: none; + } + } + + label { + top: 0; + left: 0; + + i { + color: rgba(255,255,255,.7); + transition: color .3s; + } + &.active i { color: $navbar-font-color; } + } + } +} + +// Fixed Navbar +.navbar-fixed { + position: relative; + height: $navbar-height-mobile; + z-index: 997; + + nav { + position: fixed; + } +} +@media #{$medium-and-up} { + nav.nav-extended .nav-wrapper { + min-height: $navbar-height; + } + nav, nav .nav-wrapper i, nav a.sidenav-trigger, nav a.sidenav-trigger i { + height: $navbar-height; + line-height: $navbar-line-height; + } + .navbar-fixed { + height: $navbar-height; + } +} diff --git a/src/main/webapp/WEB-INF/sass/components/_normalize.scss b/src/main/webapp/WEB-INF/sass/components/_normalize.scss new file mode 100644 index 0000000..fa4e73d --- /dev/null +++ b/src/main/webapp/WEB-INF/sass/components/_normalize.scss @@ -0,0 +1,447 @@ +/*! normalize.css v7.0.0 | MIT License | github.com/necolas/normalize.css */ + +/* Document + ========================================================================== */ + +/** + * 1. Correct the line height in all browsers. + * 2. Prevent adjustments of font size after orientation changes in + * IE on Windows Phone and in iOS. + */ + +html { + line-height: 1.15; /* 1 */ + -ms-text-size-adjust: 100%; /* 2 */ + -webkit-text-size-adjust: 100%; /* 2 */ +} + +/* Sections + ========================================================================== */ + +/** + * Remove the margin in all browsers (opinionated). + */ + +body { + margin: 0; +} + +/** + * Add the correct display in IE 9-. + */ + +article, +aside, +footer, +header, +nav, +section { + display: block; +} + +/** + * Correct the font size and margin on `h1` elements within `section` and + * `article` contexts in Chrome, Firefox, and Safari. + */ + +h1 { + font-size: 2em; + margin: 0.67em 0; +} + +/* Grouping content + ========================================================================== */ + +/** + * Add the correct display in IE 9-. + * 1. Add the correct display in IE. + */ + +figcaption, +figure, +main { /* 1 */ + display: block; +} + +/** + * Add the correct margin in IE 8. + */ + +figure { + margin: 1em 40px; +} + +/** + * 1. Add the correct box sizing in Firefox. + * 2. Show the overflow in Edge and IE. + */ + +hr { + box-sizing: content-box; /* 1 */ + height: 0; /* 1 */ + overflow: visible; /* 2 */ +} + +/** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ + +pre { + font-family: monospace, monospace; /* 1 */ + font-size: 1em; /* 2 */ +} + +/* Text-level semantics + ========================================================================== */ + +/** + * 1. Remove the gray background on active links in IE 10. + * 2. Remove gaps in links underline in iOS 8+ and Safari 8+. + */ + +a { + background-color: transparent; /* 1 */ + -webkit-text-decoration-skip: objects; /* 2 */ +} + +/** + * 1. Remove the bottom border in Chrome 57- and Firefox 39-. + * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari. + */ + +abbr[title] { + border-bottom: none; /* 1 */ + text-decoration: underline; /* 2 */ + text-decoration: underline dotted; /* 2 */ +} + +/** + * Prevent the duplicate application of `bolder` by the next rule in Safari 6. + */ + +b, +strong { + font-weight: inherit; +} + +/** + * Add the correct font weight in Chrome, Edge, and Safari. + */ + +b, +strong { + font-weight: bolder; +} + +/** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ + +code, +kbd, +samp { + font-family: monospace, monospace; /* 1 */ + font-size: 1em; /* 2 */ +} + +/** + * Add the correct font style in Android 4.3-. + */ + +dfn { + font-style: italic; +} + +/** + * Add the correct background and color in IE 9-. + */ + +mark { + background-color: #ff0; + color: #000; +} + +/** + * Add the correct font size in all browsers. + */ + +small { + font-size: 80%; +} + +/** + * Prevent `sub` and `sup` elements from affecting the line height in + * all browsers. + */ + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sub { + bottom: -0.25em; +} + +sup { + top: -0.5em; +} + +/* Embedded content + ========================================================================== */ + +/** + * Add the correct display in IE 9-. + */ + +audio, +video { + display: inline-block; +} + +/** + * Add the correct display in iOS 4-7. + */ + +audio:not([controls]) { + display: none; + height: 0; +} + +/** + * Remove the border on images inside links in IE 10-. + */ + +img { + border-style: none; +} + +/** + * Hide the overflow in IE. + */ + +svg:not(:root) { + overflow: hidden; +} + +/* Forms + ========================================================================== */ + +/** + * 1. Change the font styles in all browsers (opinionated). + * 2. Remove the margin in Firefox and Safari. + */ + +button, +input, +optgroup, +select, +textarea { + font-family: sans-serif; /* 1 */ + font-size: 100%; /* 1 */ + line-height: 1.15; /* 1 */ + margin: 0; /* 2 */ +} + +/** + * Show the overflow in IE. + * 1. Show the overflow in Edge. + */ + +button, +input { /* 1 */ + overflow: visible; +} + +/** + * Remove the inheritance of text transform in Edge, Firefox, and IE. + * 1. Remove the inheritance of text transform in Firefox. + */ + +button, +select { /* 1 */ + text-transform: none; +} + +/** + * 1. Prevent a WebKit bug where (2) destroys native `audio` and `video` + * controls in Android 4. + * 2. Correct the inability to style clickable types in iOS and Safari. + */ + +button, +html [type="button"], /* 1 */ +[type="reset"], +[type="submit"] { + -webkit-appearance: button; /* 2 */ +} + +/** + * Remove the inner border and padding in Firefox. + */ + +button::-moz-focus-inner, +[type="button"]::-moz-focus-inner, +[type="reset"]::-moz-focus-inner, +[type="submit"]::-moz-focus-inner { + border-style: none; + padding: 0; +} + +/** + * Restore the focus styles unset by the previous rule. + */ + +button:-moz-focusring, +[type="button"]:-moz-focusring, +[type="reset"]:-moz-focusring, +[type="submit"]:-moz-focusring { + outline: 1px dotted ButtonText; +} + +/** + * Correct the padding in Firefox. + */ + +fieldset { + padding: 0.35em 0.75em 0.625em; +} + +/** + * 1. Correct the text wrapping in Edge and IE. + * 2. Correct the color inheritance from `fieldset` elements in IE. + * 3. Remove the padding so developers are not caught out when they zero out + * `fieldset` elements in all browsers. + */ + +legend { + box-sizing: border-box; /* 1 */ + color: inherit; /* 2 */ + display: table; /* 1 */ + max-width: 100%; /* 1 */ + padding: 0; /* 3 */ + white-space: normal; /* 1 */ +} + +/** + * 1. Add the correct display in IE 9-. + * 2. Add the correct vertical alignment in Chrome, Firefox, and Opera. + */ + +progress { + display: inline-block; /* 1 */ + vertical-align: baseline; /* 2 */ +} + +/** + * Remove the default vertical scrollbar in IE. + */ + +textarea { + overflow: auto; +} + +/** + * 1. Add the correct box sizing in IE 10-. + * 2. Remove the padding in IE 10-. + */ + +[type="checkbox"], +[type="radio"] { + box-sizing: border-box; /* 1 */ + padding: 0; /* 2 */ +} + +/** + * Correct the cursor style of increment and decrement buttons in Chrome. + */ + +[type="number"]::-webkit-inner-spin-button, +[type="number"]::-webkit-outer-spin-button { + height: auto; +} + +/** + * 1. Correct the odd appearance in Chrome and Safari. + * 2. Correct the outline style in Safari. + */ + +[type="search"] { + -webkit-appearance: textfield; /* 1 */ + outline-offset: -2px; /* 2 */ +} + +/** + * Remove the inner padding and cancel buttons in Chrome and Safari on macOS. + */ + +[type="search"]::-webkit-search-cancel-button, +[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +/** + * 1. Correct the inability to style clickable types in iOS and Safari. + * 2. Change font properties to `inherit` in Safari. + */ + +::-webkit-file-upload-button { + -webkit-appearance: button; /* 1 */ + font: inherit; /* 2 */ +} + +/* Interactive + ========================================================================== */ + +/* + * Add the correct display in IE 9-. + * 1. Add the correct display in Edge, IE, and Firefox. + */ + +details, /* 1 */ +menu { + display: block; +} + +/* + * Add the correct display in all browsers. + */ + +summary { + display: list-item; +} + +/* Scripting + ========================================================================== */ + +/** + * Add the correct display in IE 9-. + */ + +canvas { + display: inline-block; +} + +/** + * Add the correct display in IE. + */ + +template { + display: none; +} + +/* Hidden + ========================================================================== */ + +/** + * Add the correct display in IE 10-. + */ + +[hidden] { + display: none; +} diff --git a/src/main/webapp/WEB-INF/sass/components/_preloader.scss b/src/main/webapp/WEB-INF/sass/components/_preloader.scss new file mode 100644 index 0000000..fbe862d --- /dev/null +++ b/src/main/webapp/WEB-INF/sass/components/_preloader.scss @@ -0,0 +1,334 @@ +/* + @license + Copyright (c) 2014 The Polymer Project Authors. All rights reserved. + This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt + The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt + The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt + Code distributed by Google as part of the polymer project is also + subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt + */ + +/**************************/ +/* STYLES FOR THE SPINNER */ +/**************************/ + +/* + * Constants: + * STROKEWIDTH = 3px + * ARCSIZE = 270 degrees (amount of circle the arc takes up) + * ARCTIME = 1333ms (time it takes to expand and contract arc) + * ARCSTARTROT = 216 degrees (how much the start location of the arc + * should rotate each time, 216 gives us a + * 5 pointed star shape (it's 360/5 * 3). + * For a 7 pointed star, we might do + * 360/7 * 3 = 154.286) + * CONTAINERWIDTH = 28px + * SHRINK_TIME = 400ms + */ + + +.preloader-wrapper { + display: inline-block; + position: relative; + width: 50px; + height: 50px; + + &.small { + width: 36px; + height: 36px; + } + + &.big { + width: 64px; + height: 64px; + } + + &.active { + /* duration: 360 * ARCTIME / (ARCSTARTROT + (360-ARCSIZE)) */ + -webkit-animation: container-rotate 1568ms linear infinite; + animation: container-rotate 1568ms linear infinite; + } +} + +@-webkit-keyframes container-rotate { + to { -webkit-transform: rotate(360deg) } +} + +@keyframes container-rotate { + to { transform: rotate(360deg) } +} + +.spinner-layer { + position: absolute; + width: 100%; + height: 100%; + opacity: 0; + border-color: $spinner-default-color; +} + +.spinner-blue, +.spinner-blue-only { + border-color: #4285f4; +} + +.spinner-red, +.spinner-red-only { + border-color: #db4437; +} + +.spinner-yellow, +.spinner-yellow-only { + border-color: #f4b400; +} + +.spinner-green, +.spinner-green-only { + border-color: #0f9d58; +} + +/** + * IMPORTANT NOTE ABOUT CSS ANIMATION PROPERTIES (keanulee): + * + * iOS Safari (tested on iOS 8.1) does not handle animation-delay very well - it doesn't + * guarantee that the animation will start _exactly_ after that value. So we avoid using + * animation-delay and instead set custom keyframes for each color (as redundant as it + * seems). + * + * We write out each animation in full (instead of separating animation-name, + * animation-duration, etc.) because under the polyfill, Safari does not recognize those + * specific properties properly, treats them as -webkit-animation, and overrides the + * other animation rules. See https://github.com/Polymer/platform/issues/53. + */ +.active .spinner-layer.spinner-blue { + /* durations: 4 * ARCTIME */ + -webkit-animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0.0, 0.2, 1) infinite both, blue-fade-in-out 5332ms cubic-bezier(0.4, 0.0, 0.2, 1) infinite both; + animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0.0, 0.2, 1) infinite both, blue-fade-in-out 5332ms cubic-bezier(0.4, 0.0, 0.2, 1) infinite both; +} + +.active .spinner-layer.spinner-red { + /* durations: 4 * ARCTIME */ + -webkit-animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0.0, 0.2, 1) infinite both, red-fade-in-out 5332ms cubic-bezier(0.4, 0.0, 0.2, 1) infinite both; + animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0.0, 0.2, 1) infinite both, red-fade-in-out 5332ms cubic-bezier(0.4, 0.0, 0.2, 1) infinite both; +} + +.active .spinner-layer.spinner-yellow { + /* durations: 4 * ARCTIME */ + -webkit-animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0.0, 0.2, 1) infinite both, yellow-fade-in-out 5332ms cubic-bezier(0.4, 0.0, 0.2, 1) infinite both; + animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0.0, 0.2, 1) infinite both, yellow-fade-in-out 5332ms cubic-bezier(0.4, 0.0, 0.2, 1) infinite both; +} + +.active .spinner-layer.spinner-green { + /* durations: 4 * ARCTIME */ + -webkit-animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0.0, 0.2, 1) infinite both, green-fade-in-out 5332ms cubic-bezier(0.4, 0.0, 0.2, 1) infinite both; + animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0.0, 0.2, 1) infinite both, green-fade-in-out 5332ms cubic-bezier(0.4, 0.0, 0.2, 1) infinite both; +} + +.active .spinner-layer, +.active .spinner-layer.spinner-blue-only, +.active .spinner-layer.spinner-red-only, +.active .spinner-layer.spinner-yellow-only, +.active .spinner-layer.spinner-green-only { + /* durations: 4 * ARCTIME */ + opacity: 1; + -webkit-animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0.0, 0.2, 1) infinite both; + animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0.0, 0.2, 1) infinite both; +} + +@-webkit-keyframes fill-unfill-rotate { + 12.5% { -webkit-transform: rotate(135deg); } /* 0.5 * ARCSIZE */ + 25% { -webkit-transform: rotate(270deg); } /* 1 * ARCSIZE */ + 37.5% { -webkit-transform: rotate(405deg); } /* 1.5 * ARCSIZE */ + 50% { -webkit-transform: rotate(540deg); } /* 2 * ARCSIZE */ + 62.5% { -webkit-transform: rotate(675deg); } /* 2.5 * ARCSIZE */ + 75% { -webkit-transform: rotate(810deg); } /* 3 * ARCSIZE */ + 87.5% { -webkit-transform: rotate(945deg); } /* 3.5 * ARCSIZE */ + to { -webkit-transform: rotate(1080deg); } /* 4 * ARCSIZE */ +} + +@keyframes fill-unfill-rotate { + 12.5% { transform: rotate(135deg); } /* 0.5 * ARCSIZE */ + 25% { transform: rotate(270deg); } /* 1 * ARCSIZE */ + 37.5% { transform: rotate(405deg); } /* 1.5 * ARCSIZE */ + 50% { transform: rotate(540deg); } /* 2 * ARCSIZE */ + 62.5% { transform: rotate(675deg); } /* 2.5 * ARCSIZE */ + 75% { transform: rotate(810deg); } /* 3 * ARCSIZE */ + 87.5% { transform: rotate(945deg); } /* 3.5 * ARCSIZE */ + to { transform: rotate(1080deg); } /* 4 * ARCSIZE */ +} + +@-webkit-keyframes blue-fade-in-out { + from { opacity: 1; } + 25% { opacity: 1; } + 26% { opacity: 0; } + 89% { opacity: 0; } + 90% { opacity: 1; } + 100% { opacity: 1; } +} + +@keyframes blue-fade-in-out { + from { opacity: 1; } + 25% { opacity: 1; } + 26% { opacity: 0; } + 89% { opacity: 0; } + 90% { opacity: 1; } + 100% { opacity: 1; } +} + +@-webkit-keyframes red-fade-in-out { + from { opacity: 0; } + 15% { opacity: 0; } + 25% { opacity: 1; } + 50% { opacity: 1; } + 51% { opacity: 0; } +} + +@keyframes red-fade-in-out { + from { opacity: 0; } + 15% { opacity: 0; } + 25% { opacity: 1; } + 50% { opacity: 1; } + 51% { opacity: 0; } +} + +@-webkit-keyframes yellow-fade-in-out { + from { opacity: 0; } + 40% { opacity: 0; } + 50% { opacity: 1; } + 75% { opacity: 1; } + 76% { opacity: 0; } +} + +@keyframes yellow-fade-in-out { + from { opacity: 0; } + 40% { opacity: 0; } + 50% { opacity: 1; } + 75% { opacity: 1; } + 76% { opacity: 0; } +} + +@-webkit-keyframes green-fade-in-out { + from { opacity: 0; } + 65% { opacity: 0; } + 75% { opacity: 1; } + 90% { opacity: 1; } + 100% { opacity: 0; } +} + +@keyframes green-fade-in-out { + from { opacity: 0; } + 65% { opacity: 0; } + 75% { opacity: 1; } + 90% { opacity: 1; } + 100% { opacity: 0; } +} + +/** + * Patch the gap that appear between the two adjacent div.circle-clipper while the + * spinner is rotating (appears on Chrome 38, Safari 7.1, and IE 11). + */ +.gap-patch { + position: absolute; + top: 0; + left: 45%; + width: 10%; + height: 100%; + overflow: hidden; + border-color: inherit; +} + +.gap-patch .circle { + width: 1000%; + left: -450%; +} + +.circle-clipper { + display: inline-block; + position: relative; + width: 50%; + height: 100%; + overflow: hidden; + border-color: inherit; + + .circle { + width: 200%; + height: 100%; + border-width: 3px; /* STROKEWIDTH */ + border-style: solid; + border-color: inherit; + border-bottom-color: transparent !important; + border-radius: 50%; + -webkit-animation: none; + animation: none; + position: absolute; + top: 0; + right: 0; + bottom: 0; + } + + &.left .circle { + left: 0; + border-right-color: transparent !important; + -webkit-transform: rotate(129deg); + transform: rotate(129deg); + } + &.right .circle { + left: -100%; + border-left-color: transparent !important; + -webkit-transform: rotate(-129deg); + transform: rotate(-129deg); + } +} + + + +.active .circle-clipper.left .circle { + /* duration: ARCTIME */ + -webkit-animation: left-spin 1333ms cubic-bezier(0.4, 0.0, 0.2, 1) infinite both; + animation: left-spin 1333ms cubic-bezier(0.4, 0.0, 0.2, 1) infinite both; +} + +.active .circle-clipper.right .circle { + /* duration: ARCTIME */ + -webkit-animation: right-spin 1333ms cubic-bezier(0.4, 0.0, 0.2, 1) infinite both; + animation: right-spin 1333ms cubic-bezier(0.4, 0.0, 0.2, 1) infinite both; +} + +@-webkit-keyframes left-spin { + from { -webkit-transform: rotate(130deg); } + 50% { -webkit-transform: rotate(-5deg); } + to { -webkit-transform: rotate(130deg); } +} + +@keyframes left-spin { + from { transform: rotate(130deg); } + 50% { transform: rotate(-5deg); } + to { transform: rotate(130deg); } +} + +@-webkit-keyframes right-spin { + from { -webkit-transform: rotate(-130deg); } + 50% { -webkit-transform: rotate(5deg); } + to { -webkit-transform: rotate(-130deg); } +} + +@keyframes right-spin { + from { transform: rotate(-130deg); } + 50% { transform: rotate(5deg); } + to { transform: rotate(-130deg); } +} + +#spinnerContainer.cooldown { + /* duration: SHRINK_TIME */ + -webkit-animation: container-rotate 1568ms linear infinite, fade-out 400ms cubic-bezier(0.4, 0.0, 0.2, 1); + animation: container-rotate 1568ms linear infinite, fade-out 400ms cubic-bezier(0.4, 0.0, 0.2, 1); +} + +@-webkit-keyframes fade-out { + from { opacity: 1; } + to { opacity: 0; } +} + +@keyframes fade-out { + from { opacity: 1; } + to { opacity: 0; } +} diff --git a/src/main/webapp/WEB-INF/sass/components/_pulse.scss b/src/main/webapp/WEB-INF/sass/components/_pulse.scss new file mode 100644 index 0000000..a690f36 --- /dev/null +++ b/src/main/webapp/WEB-INF/sass/components/_pulse.scss @@ -0,0 +1,34 @@ +.pulse { + &::before { + content: ''; + display: block; + position: absolute; + width: 100%; + height: 100%; + top: 0; + left: 0; + background-color: inherit; + border-radius: inherit; + transition: opacity .3s, transform .3s; + animation: pulse-animation 1s cubic-bezier(0.24, 0, 0.38, 1) infinite; + z-index: -1; + } + + overflow: visible; + position: relative; +} + +@keyframes pulse-animation { + 0% { + opacity: 1; + transform: scale(1); + } + 50% { + opacity: 0; + transform: scale(1.5); + } + 100% { + opacity: 0; + transform: scale(1.5); + } +} diff --git a/src/main/webapp/WEB-INF/sass/components/_sidenav.scss b/src/main/webapp/WEB-INF/sass/components/_sidenav.scss new file mode 100644 index 0000000..98a71d8 --- /dev/null +++ b/src/main/webapp/WEB-INF/sass/components/_sidenav.scss @@ -0,0 +1,216 @@ +.sidenav { + position: fixed; + width: $sidenav-width; + left: 0; + top: 0; + margin: 0; + transform: translateX(-100%); + height: 100%; + height: calc(100% + 60px); + height: -moz-calc(100%); //Temporary Firefox Fix + padding-bottom: 60px; + background-color: $sidenav-bg-color; + z-index: 999; + overflow-y: auto; + will-change: transform; + backface-visibility: hidden; + transform: translateX(-105%); + + @extend .z-depth-1; + + // Right Align + &.right-aligned { + right: 0; + transform: translateX(105%); + left: auto; + transform: translateX(100%); + } + + .collapsible { + margin: 0; + } + + + li { + float: none; + line-height: $sidenav-line-height; + + &.active { background-color: rgba(0,0,0,.05); } + } + + li > a { + color: $sidenav-font-color; + display: block; + font-size: $sidenav-font-size; + font-weight: 500; + height: $sidenav-item-height; + line-height: $sidenav-line-height; + padding: 0 ($sidenav-padding * 2); + + &:hover { background-color: rgba(0,0,0,.05);} + + &.btn, &.btn-large, &.btn-flat, &.btn-floating { + margin: 10px 15px; + } + + &.btn, + &.btn-large, + &.btn-floating { color: $button-raised-color; } + &.btn-flat { color: $button-flat-color; } + + &.btn:hover, + &.btn-large:hover { background-color: lighten($button-raised-background, 5%); } + &.btn-floating:hover { background-color: $button-raised-background; } + + & > i, + & > [class^="mdi-"], li > a > [class*="mdi-"], + & > i.material-icons { + float: left; + height: $sidenav-item-height; + line-height: $sidenav-line-height; + margin: 0 ($sidenav-padding * 2) 0 0; + width: $sidenav-item-height / 2; + color: rgba(0,0,0,.54); + } + } + + + .divider { + margin: ($sidenav-padding / 2) 0 0 0; + } + + .subheader { + &:hover { + background-color: transparent; + } + + cursor: initial; + pointer-events: none; + color: rgba(0,0,0,.54); + font-size: $sidenav-font-size; + font-weight: 500; + line-height: $sidenav-line-height; + } + + .user-view { + position: relative; + padding: ($sidenav-padding * 2) ($sidenav-padding * 2) 0; + margin-bottom: $sidenav-padding / 2; + + & > a { + &:hover { background-color: transparent; } + height: auto; + padding: 0; + } + + .background { + overflow: hidden; + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: -1; + } + + .circle, .name, .email { + display: block; + } + + .circle { + height: 64px; + width: 64px; + } + + .name, + .email { + font-size: $sidenav-font-size; + line-height: $sidenav-line-height / 2; + } + + .name { + margin-top: 16px; + font-weight: 500; + } + + .email { + padding-bottom: 16px; + font-weight: 400; + } + } +} + + +// Touch interaction +.drag-target { + // Right Align + &.right-aligned { + right: 0; + } + + height: 100%; + width: 10px; + position: fixed; + top: 0; + z-index: 998; +} + + +// Fixed Sidenav shown +.sidenav.sidenav-fixed { + // Right Align + &.right-aligned { + right: 0; + left: auto; + } + + left: 0; + transform: translateX(0); + position: fixed; +} + +// Fixed Sidenav hide on smaller +@media #{$medium-and-down} { + .sidenav { + &.sidenav-fixed { + transform: translateX(-105%); + + &.right-aligned { + transform: translateX(105%); + } + } + + > a { + padding: 0 $sidenav-padding; + } + + .user-view { + padding: $sidenav-padding $sidenav-padding 0; + } + } +} + + +.sidenav .collapsible-body > ul:not(.collapsible) > li.active, +.sidenav.sidenav-fixed .collapsible-body > ul:not(.collapsible) > li.active { + background-color: $primary-color; + a { + color: $sidenav-bg-color; + } +} +.sidenav .collapsible-body { + padding: 0; +} + + +.sidenav-overlay { + position: fixed; + top: 0; + left: 0; + right: 0; + opacity: 0; + height: 120vh; + background-color: rgba(0,0,0,.5); + z-index: 997; + display: none; +} diff --git a/src/main/webapp/WEB-INF/sass/components/_slider.scss b/src/main/webapp/WEB-INF/sass/components/_slider.scss new file mode 100644 index 0000000..2265cdb --- /dev/null +++ b/src/main/webapp/WEB-INF/sass/components/_slider.scss @@ -0,0 +1,92 @@ +.slider { + position: relative; + height: 400px; + width: 100%; + + // Fullscreen slider + &.fullscreen { + height: 100%; + width: 100%; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + + ul.slides { + height: 100%; + } + + ul.indicators { + z-index: 2; + bottom: 30px; + } + } + + .slides { + background-color: $slider-bg-color; + margin: 0; + height: 400px; + + li { + opacity: 0; + position: absolute; + top: 0; + left: 0; + z-index: 1; + width: 100%; + height: inherit; + overflow: hidden; + + img { + height: 100%; + width: 100%; + background-size: cover; + background-position: center; + } + + .caption { + color: #fff; + position: absolute; + top: 15%; + left: 15%; + width: 70%; + opacity: 0; + + p { color: $slider-bg-color-light; } + } + + &.active { + z-index: 2; + } + } + } + + + .indicators { + position: absolute; + text-align: center; + left: 0; + right: 0; + bottom: 0; + margin: 0; + + .indicator-item { + display: inline-block; + position: relative; + cursor: pointer; + height: 16px; + width: 16px; + margin: 0 12px; + background-color: $slider-bg-color-light; + + transition: background-color .3s; + border-radius: 50%; + + &.active { + background-color: $slider-indicator-color; + } + } + } + +} \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/sass/components/_table_of_contents.scss b/src/main/webapp/WEB-INF/sass/components/_table_of_contents.scss new file mode 100644 index 0000000..638009d --- /dev/null +++ b/src/main/webapp/WEB-INF/sass/components/_table_of_contents.scss @@ -0,0 +1,33 @@ +/*************** + Nav List +***************/ +.table-of-contents { + &.fixed { + position: fixed; + } + + li { + padding: 2px 0; + } + a { + display: inline-block; + font-weight: 300; + color: #757575; + padding-left: 16px; + height: 1.5rem; + line-height: 1.5rem; + letter-spacing: .4; + display: inline-block; + + &:hover { + color: lighten(#757575, 20%); + padding-left: 15px; + border-left: 1px solid $primary-color; + } + &.active { + font-weight: 500; + padding-left: 14px; + border-left: 2px solid $primary-color; + } + } +} diff --git a/src/main/webapp/WEB-INF/sass/components/_tabs.scss b/src/main/webapp/WEB-INF/sass/components/_tabs.scss new file mode 100644 index 0000000..072d4b6 --- /dev/null +++ b/src/main/webapp/WEB-INF/sass/components/_tabs.scss @@ -0,0 +1,99 @@ +.tabs { + &.tabs-transparent { + background-color: transparent; + + .tab a, + .tab.disabled a, + .tab.disabled a:hover { + color: rgba(255,255,255,0.7); + } + + .tab a:hover, + .tab a.active { + color: #fff; + } + + .indicator { + background-color: #fff; + } + } + + &.tabs-fixed-width { + display: flex; + + .tab { + flex-grow: 1; + } + } + + position: relative; + overflow-x: auto; + overflow-y: hidden; + height: 48px; + width: 100%; + background-color: $tabs-bg-color; + margin: 0 auto; + white-space: nowrap; + + .tab { + display: inline-block; + text-align: center; + line-height: 48px; + height: 48px; + padding: 0; + margin: 0; + text-transform: uppercase; + + a { + &:focus, + &:focus.active { + background-color: transparentize($tabs-underline-color, .8); + outline: none; + } + + &:hover, + &.active { + background-color: transparent; + color: $tabs-text-color; + } + + color: rgba($tabs-text-color, .7); + display: block; + width: 100%; + height: 100%; + padding: 0 24px; + font-size: 14px; + text-overflow: ellipsis; + overflow: hidden; + transition: color .28s ease, background-color .28s ease; + } + + &.disabled a, + &.disabled a:hover { + color: rgba($tabs-text-color, .4); + cursor: default; + } + } + .indicator { + position: absolute; + bottom: 0; + height: 2px; + background-color: $tabs-underline-color; + will-change: left, right; + } +} + +// Fixed Sidenav hide on smaller +@media #{$medium-and-down} { + .tabs { + display: flex; + + .tab { + flex-grow: 1; + + a { + padding: 0 12px; + } + } + } +} diff --git a/src/main/webapp/WEB-INF/sass/components/_tapTarget.scss b/src/main/webapp/WEB-INF/sass/components/_tapTarget.scss new file mode 100644 index 0000000..c015f34 --- /dev/null +++ b/src/main/webapp/WEB-INF/sass/components/_tapTarget.scss @@ -0,0 +1,103 @@ +.tap-target-wrapper { + width: 800px; + height: 800px; + position: fixed; + z-index: 1000; + visibility: hidden; + transition: visibility 0s .3s; +} + +.tap-target-wrapper.open { + visibility: visible; + transition: visibility 0s; + + .tap-target { + transform: scale(1); + opacity: .95; + transition: + transform .3s cubic-bezier(.42,0,.58,1), + opacity .3s cubic-bezier(.42,0,.58,1); + } + + .tap-target-wave::before { + transform: scale(1); + } + .tap-target-wave::after { + visibility: visible; + animation: pulse-animation 1s cubic-bezier(0.24, 0, 0.38, 1) infinite; + transition: + opacity .3s, + transform .3s, + visibility 0s 1s; + } +} + +.tap-target { + position: absolute; + font-size: 1rem; + border-radius: 50%; + background-color: $primary-color; + box-shadow: 0 20px 20px 0 rgba(0,0,0,0.14), 0 10px 50px 0 rgba(0,0,0,0.12), 0 30px 10px -20px rgba(0,0,0,0.2); + width: 100%; + height: 100%; + opacity: 0; + transform: scale(0); + transition: + transform .3s cubic-bezier(.42,0,.58,1), + opacity .3s cubic-bezier(.42,0,.58,1); +} + +.tap-target-content { + position: relative; + display: table-cell; +} + +.tap-target-wave { + &::before, + &::after { + content: ''; + display: block; + position: absolute; + width: 100%; + height: 100%; + border-radius: 50%; + background-color: #ffffff; + } + &::before { + transform: scale(0); + transition: transform .3s; + } + &::after { + visibility: hidden; + transition: + opacity .3s, + transform .3s, + visibility 0s; + z-index: -1; + } + + position: absolute; + border-radius: 50%; + z-index: 10001; +} + +.tap-target-origin { + &:not(.btn), + &:not(.btn):hover { + background: none; + } + + top: 50%; + left: 50%; + transform: translate(-50%,-50%); + + z-index: 10002; + position: absolute !important; +} + +@media only screen and (max-width: 600px) { + .tap-target, .tap-target-wrapper { + width: 600px; + height: 600px; + } +} diff --git a/src/main/webapp/WEB-INF/sass/components/_timepicker.scss b/src/main/webapp/WEB-INF/sass/components/_timepicker.scss new file mode 100644 index 0000000..fa602fb --- /dev/null +++ b/src/main/webapp/WEB-INF/sass/components/_timepicker.scss @@ -0,0 +1,183 @@ +/* Timepicker Containers */ +.timepicker-modal { + max-width: 325px; + max-height: none; +} + +.timepicker-container.modal-content { + display: flex; + flex-direction: column; + padding: 0; +} + +.text-primary { + color: rgba(255, 255, 255, 1); +} + + +/* Clock Digital Display */ +.timepicker-digital-display { + flex: 1 auto; + background-color: $secondary-color; + padding: 10px; + font-weight: 300; +} + +.timepicker-text-container { + font-size: 4rem; + font-weight: bold; + text-align: center; + color: rgba(255, 255, 255, 0.6); + font-weight: 400; + position: relative; + user-select: none; +} + +.timepicker-span-hours, +.timepicker-span-minutes, +.timepicker-span-am-pm div { + cursor: pointer; +} + +.timepicker-span-hours { + margin-right: 3px; +} + +.timepicker-span-minutes { + margin-left: 3px; +} + +.timepicker-display-am-pm { + font-size: 1.3rem; + position: absolute; + right: 1rem; + bottom: 1rem; + font-weight: 400; +} + + +/* Analog Clock Display */ +.timepicker-analog-display { + flex: 2.5 auto; +} + +.timepicker-plate { + background-color: $timepicker-clock-plate-bg; + border-radius: 50%; + width: 270px; + height: 270px; + overflow: visible; + position: relative; + margin: auto; + margin-top: 25px; + margin-bottom: 5px; + user-select: none; +} + +.timepicker-canvas, +.timepicker-dial { + position: absolute; + left: 0; + right: 0; + top: 0; + bottom: 0; +} +.timepicker-minutes { + visibility: hidden; +} + +.timepicker-tick { + border-radius: 50%; + color: $timepicker-clock-color; + line-height: 40px; + text-align: center; + width: 40px; + height: 40px; + position: absolute; + cursor: pointer; + font-size: 15px; +} + +.timepicker-tick.active, +.timepicker-tick:hover { + background-color: transparentize($secondary-color, .75); +} +.timepicker-dial { + transition: transform 350ms, opacity 350ms; +} +.timepicker-dial-out { + &.timepicker-hours { + transform: scale(1.1, 1.1); + } + + &.timepicker-minutes { + transform: scale(.8, .8); + } + + opacity: 0; +} +.timepicker-canvas { + transition: opacity 175ms; + + line { + stroke: $secondary-color; + stroke-width: 4; + stroke-linecap: round; + } +} +.timepicker-canvas-out { + opacity: 0.25; +} +.timepicker-canvas-bearing { + stroke: none; + fill: $secondary-color; +} +.timepicker-canvas-bg { + stroke: none; + fill: $secondary-color; +} + + +/* Footer */ +.timepicker-footer { + margin: 0 auto; + padding: 5px 1rem; + display: flex; + justify-content: space-between; +} + +.timepicker-clear { + color: $error-color; +} + +.timepicker-close { + color: $secondary-color; +} + +.timepicker-clear, +.timepicker-close { + padding: 0 20px; +} + +/* Media Queries */ +@media #{$medium-and-up} { + .timepicker-modal { + max-width: 600px; + } + + .timepicker-container.modal-content { + flex-direction: row; + } + + .timepicker-text-container { + top: 32%; + } + + .timepicker-display-am-pm { + position: relative; + right: auto; + bottom: auto; + text-align: center; + margin-top: 1.2rem; + } +} diff --git a/src/main/webapp/WEB-INF/sass/components/_toast.scss b/src/main/webapp/WEB-INF/sass/components/_toast.scss new file mode 100644 index 0000000..412400f --- /dev/null +++ b/src/main/webapp/WEB-INF/sass/components/_toast.scss @@ -0,0 +1,58 @@ +#toast-container { + display:block; + position: fixed; + z-index: 10000; + + @media #{$small-and-down} { + min-width: 100%; + bottom: 0%; + } + @media #{$medium-only} { + left: 5%; + bottom: 7%; + max-width: 90%; + } + @media #{$large-and-up} { + top: 10%; + right: 7%; + max-width: 86%; + } +} + +.toast { + @extend .z-depth-1; + border-radius: 2px; + top: 35px; + width: auto; + margin-top: 10px; + position: relative; + max-width:100%; + height: auto; + min-height: $toast-height; + line-height: 1.5em; + background-color: $toast-color; + padding: 10px 25px; + font-size: 1.1rem; + font-weight: 300; + color: $toast-text-color; + display: flex; + align-items: center; + justify-content: space-between; + cursor: default; + + .toast-action { + color: $toast-action-color; + font-weight: 500; + margin-right: -25px; + margin-left: 3rem; + } + + &.rounded{ + border-radius: 24px; + } + + @media #{$small-and-down} { + width: 100%; + border-radius: 0; + } +} diff --git a/src/main/webapp/WEB-INF/sass/components/_tooltip.scss b/src/main/webapp/WEB-INF/sass/components/_tooltip.scss new file mode 100644 index 0000000..5ec4299 --- /dev/null +++ b/src/main/webapp/WEB-INF/sass/components/_tooltip.scss @@ -0,0 +1,32 @@ +.material-tooltip { + padding: 10px 8px; + font-size: 1rem; + z-index: 2000; + background-color: transparent; + border-radius: 2px; + color: #fff; + min-height: 36px; + line-height: 120%; + opacity: 0; + position: absolute; + text-align: center; + max-width: calc(100% - 4px); + overflow: hidden; + left: 0; + top: 0; + pointer-events: none; + visibility: hidden; + background-color: #323232; +} + +.backdrop { + position: absolute; + opacity: 0; + height: 7px; + width: 14px; + border-radius: 0 0 50% 50%; + background-color: #323232; + z-index: -1; + transform-origin: 50% 0%; + visibility: hidden; +} diff --git a/src/main/webapp/WEB-INF/sass/components/_transitions.scss b/src/main/webapp/WEB-INF/sass/components/_transitions.scss new file mode 100644 index 0000000..9c3660a --- /dev/null +++ b/src/main/webapp/WEB-INF/sass/components/_transitions.scss @@ -0,0 +1,13 @@ +// Scale transition +.scale-transition { + &.scale-out { + transform: scale(0); + transition: transform .2s !important; + } + + &.scale-in { + transform: scale(1); + } + + transition: transform .3s cubic-bezier(0.53, 0.01, 0.36, 1.63) !important; +} \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/sass/components/_typography.scss b/src/main/webapp/WEB-INF/sass/components/_typography.scss new file mode 100644 index 0000000..b9b93b3 --- /dev/null +++ b/src/main/webapp/WEB-INF/sass/components/_typography.scss @@ -0,0 +1,60 @@ + +a { + text-decoration: none; +} + +html{ + line-height: 1.5; + + @media only screen and (min-width: 0) { + font-size: 14px; + } + + @media only screen and (min-width: $medium-screen) { + font-size: 14.5px; + } + + @media only screen and (min-width: $large-screen) { + font-size: 15px; + } + + font-family: $font-stack; + font-weight: normal; + color: $off-black; +} +h1, h2, h3, h4, h5, h6 { + font-weight: 400; + line-height: 1.3; +} + +// Header Styles +h1 a, h2 a, h3 a, h4 a, h5 a, h6 a { font-weight: inherit; } +h1 { font-size: $h1-fontsize; line-height: 110%; margin: ($h1-fontsize / 1.5) 0 ($h1-fontsize / 2.5) 0;} +h2 { font-size: $h2-fontsize; line-height: 110%; margin: ($h2-fontsize / 1.5) 0 ($h2-fontsize / 2.5) 0;} +h3 { font-size: $h3-fontsize; line-height: 110%; margin: ($h3-fontsize / 1.5) 0 ($h3-fontsize / 2.5) 0;} +h4 { font-size: $h4-fontsize; line-height: 110%; margin: ($h4-fontsize / 1.5) 0 ($h4-fontsize / 2.5) 0;} +h5 { font-size: $h5-fontsize; line-height: 110%; margin: ($h5-fontsize / 1.5) 0 ($h5-fontsize / 2.5) 0;} +h6 { font-size: $h6-fontsize; line-height: 110%; margin: ($h6-fontsize / 1.5) 0 ($h6-fontsize / 2.5) 0;} + +// Text Styles +em { font-style: italic; } +strong { font-weight: 500; } +small { font-size: 75%; } +.light { font-weight: 300; } +.thin { font-weight: 200; } + + +.flow-text{ + $i: 0; + @while $i <= $intervals { + @media only screen and (min-width : 360 + ($i * $interval-size)) { + font-size: 1.2rem * (1 + (.02 * $i)); + } + $i: $i + 1; + } + + // Handle below 360px screen + @media only screen and (max-width: 360px) { + font-size: 1.2rem; + } +} diff --git a/src/main/webapp/WEB-INF/sass/components/_variables.scss b/src/main/webapp/WEB-INF/sass/components/_variables.scss new file mode 100644 index 0000000..4c59c12 --- /dev/null +++ b/src/main/webapp/WEB-INF/sass/components/_variables.scss @@ -0,0 +1,349 @@ +// ========================================================================== +// Materialize variables +// ========================================================================== +// +// Table of Contents: +// +// 1. Colors +// 2. Badges +// 3. Buttons +// 4. Cards +// 5. Carousel +// 6. Collapsible +// 7. Chips +// 8. Date + Time Picker +// 9. Dropdown +// 10. Forms +// 11. Global +// 12. Grid +// 13. Navigation Bar +// 14. Side Navigation +// 15. Photo Slider +// 16. Spinners | Loaders +// 17. Tabs +// 18. Tables +// 19. Toasts +// 20. Typography +// 21. Footer +// 22. Flow Text +// 23. Collections +// 24. Progress Bar + + + +// 1. Colors +// ========================================================================== + +$primary-color: color("materialize-red", "lighten-2") !default; +$primary-color-light: lighten($primary-color, 15%) !default; +$primary-color-dark: darken($primary-color, 15%) !default; + +$secondary-color: color("teal", "lighten-1") !default; +$success-color: color("green", "base") !default; +$error-color: color("red", "base") !default; +$link-color: color("light-blue", "darken-1") !default; + + +// 2. Badges +// ========================================================================== + +$badge-bg-color: $secondary-color !default; +$badge-height: 22px !default; + + +// 3. Buttons +// ========================================================================== + +// Shared styles +$button-border: none !default; +$button-background-focus: lighten($secondary-color, 4%) !default; +$button-font-size: 14px !default; +$button-icon-font-size: 1.3rem !default; +$button-height: 36px !default; +$button-padding: 0 16px !default; +$button-radius: 2px !default; + +// Disabled styles +$button-disabled-background: #DFDFDF !default; +$button-disabled-color: #9F9F9F !default; + +// Raised buttons +$button-raised-background: $secondary-color !default; +$button-raised-background-hover: lighten($button-raised-background, 5%) !default; +$button-raised-color: #fff !default; + +// Large buttons +$button-large-font-size: 15px !default; +$button-large-icon-font-size: 1.6rem !default; +$button-large-height: $button-height * 1.5 !default; +$button-floating-large-size: 56px !default; + +// Small buttons +$button-small-font-size: 13px !default; +$button-small-icon-font-size: 1.2rem !default; +$button-small-height: $button-height * .9 !default; +$button-floating-small-size: $button-height * .9 !default; + +// Flat buttons +$button-flat-color: #343434 !default; +$button-flat-disabled-color: lighten(#999, 10%) !default; + +// Floating buttons +$button-floating-background: $secondary-color !default; +$button-floating-background-hover: $button-floating-background !default; +$button-floating-color: #fff !default; +$button-floating-size: 40px !default; +$button-floating-radius: 50% !default; + + +// 4. Cards +// ========================================================================== + +$card-padding: 24px !default; +$card-bg-color: #fff !default; +$card-link-color: color("orange", "accent-2") !default; +$card-link-color-light: lighten($card-link-color, 20%) !default; + + +// 5. Carousel +// ========================================================================== + +$carousel-height: 400px !default; +$carousel-item-height: $carousel-height / 2 !default; +$carousel-item-width: $carousel-item-height !default; + + +// 6. Collapsible +// ========================================================================== + +$collapsible-height: 3rem !default; +$collapsible-line-height: $collapsible-height !default; +$collapsible-header-color: #fff !default; +$collapsible-border-color: #ddd !default; + + +// 7. Chips +// ========================================================================== + +$chip-bg-color: #e4e4e4 !default; +$chip-border-color: #9e9e9e !default; +$chip-selected-color: #26a69a !default; +$chip-margin: 5px !default; + + +// 8. Date + Time Picker +// ========================================================================== + +$datepicker-display-font-size: 2.8rem; +$datepicker-calendar-header-color: #999; +$datepicker-weekday-color: rgba(0, 0, 0, .87) !default; +$datepicker-weekday-bg: darken($secondary-color, 7%) !default; +$datepicker-date-bg: $secondary-color !default; +$datepicker-year: rgba(255, 255, 255, .7) !default; +$datepicker-focus: rgba(0,0,0, .05) !default; +$datepicker-selected: $secondary-color !default; +$datepicker-selected-outfocus: desaturate(lighten($secondary-color, 35%), 15%) !default; +$datepicker-day-focus: transparentize(desaturate($secondary-color, 5%), .75) !default; +$datepicker-disabled-day-color: rgba(0, 0, 0, .3) !default; + +$timepicker-clock-color: rgba(0, 0, 0, .87) !default; +$timepicker-clock-plate-bg: #eee !default; + + +// 9. Dropdown +// ========================================================================== + +$dropdown-bg-color: #fff !default; +$dropdown-hover-bg-color: #eee !default; +$dropdown-color: $secondary-color !default; +$dropdown-item-height: 50px !default; + + +// 10. Forms +// ========================================================================== + +// Text Inputs + Textarea +$input-height: 3rem !default; +$input-border-color: color("grey", "base") !default; +$input-border: 1px solid $input-border-color !default; +$input-background: #fff !default; +$input-error-color: $error-color !default; +$input-success-color: $success-color !default; +$input-focus-color: $secondary-color !default; +$input-font-size: 16px !default; +$input-margin-bottom: 8px; +$input-margin: 0 0 $input-margin-bottom 0 !default; +$input-padding: 0 !default; +$label-font-size: .8rem !default; +$input-disabled-color: rgba(0,0,0, .42) !default; +$input-disabled-solid-color: #949494 !default; +$input-disabled-border: 1px dotted $input-disabled-color !default; +$input-invalid-border: 1px solid $input-error-color !default; +$input-icon-size: 2rem; +$placeholder-text-color: lighten($input-border-color, 20%) !default; + +// Radio Buttons +$radio-fill-color: $secondary-color !default; +$radio-empty-color: #5a5a5a !default; +$radio-border: 2px solid $radio-fill-color !default; + +// Range +$range-height: 14px !default; +$range-width: 14px !default; +$track-height: 3px !default; + +// Select +$select-border: 1px solid #f2f2f2 !default; +$select-background: rgba(255, 255, 255, 0.90) !default; +$select-focus: 1px solid lighten($secondary-color, 47%) !default; +$select-option-hover: rgba(0,0,0,.08) !default; +$select-option-focus: rgba(0,0,0,.08) !default; +$select-option-selected: rgba(0,0,0,.03) !default; +$select-padding: 5px !default; +$select-radius: 2px !default; +$select-disabled-color: rgba(0,0,0,.3) !default; + +// Switches +$switch-bg-color: $secondary-color !default; +$switch-checked-lever-bg: desaturate(lighten($switch-bg-color, 25%), 25%) !default; +$switch-unchecked-bg: #F1F1F1 !default; +$switch-unchecked-lever-bg: rgba(0,0,0,.38) !default; +$switch-radius: 15px !default; + + +// 11. Global +// ========================================================================== + +// Media Query Ranges +$small-screen-up: 601px !default; +$medium-screen-up: 993px !default; +$large-screen-up: 1201px !default; +$small-screen: 600px !default; +$medium-screen: 992px !default; +$large-screen: 1200px !default; + +$medium-and-up: "only screen and (min-width : #{$small-screen-up})" !default; +$large-and-up: "only screen and (min-width : #{$medium-screen-up})" !default; +$extra-large-and-up: "only screen and (min-width : #{$large-screen-up})" !default; +$small-and-down: "only screen and (max-width : #{$small-screen})" !default; +$medium-and-down: "only screen and (max-width : #{$medium-screen})" !default; +$medium-only: "only screen and (min-width : #{$small-screen-up}) and (max-width : #{$medium-screen})" !default; + + +// 12. Grid +// ========================================================================== + +$num-cols: 12 !default; +$gutter-width: 1.5rem !default; +$element-top-margin: $gutter-width/3 !default; +$element-bottom-margin: ($gutter-width*2)/3 !default; + + +// 13. Navigation Bar +// ========================================================================== + +$navbar-height: 64px !default; +$navbar-line-height: $navbar-height !default; +$navbar-height-mobile: 56px !default; +$navbar-line-height-mobile: $navbar-height-mobile !default; +$navbar-font-size: 1rem !default; +$navbar-font-color: #fff !default; +$navbar-brand-font-size: 2.1rem !default; + +// 14. Side Navigation +// ========================================================================== + +$sidenav-width: 300px !default; +$sidenav-font-size: 14px !default; +$sidenav-font-color: rgba(0,0,0,.87) !default; +$sidenav-bg-color: #fff !default; +$sidenav-padding: 16px !default; +$sidenav-item-height: 48px !default; +$sidenav-line-height: $sidenav-item-height !default; + + +// 15. Photo Slider +// ========================================================================== + +$slider-bg-color: color('grey', 'base') !default; +$slider-bg-color-light: color('grey', 'lighten-2') !default; +$slider-indicator-color: color('green', 'base') !default; + + +// 16. Spinners | Loaders +// ========================================================================== + +$spinner-default-color: $secondary-color !default; + + +// 17. Tabs +// ========================================================================== + +$tabs-underline-color: $primary-color-light !default; +$tabs-text-color: $primary-color !default; +$tabs-bg-color: #fff !default; + + +// 18. Tables +// ========================================================================== + +$table-border-color: rgba(0,0,0,.12) !default; +$table-striped-color: rgba(242, 242, 242, 0.5) !default; + + +// 19. Toasts +// ========================================================================== + +$toast-height: 48px !default; +$toast-color: #323232 !default; +$toast-text-color: #fff !default; +$toast-action-color: #eeff41; + + +// 20. Typography +// ========================================================================== + +$font-stack: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif !default; +$off-black: rgba(0, 0, 0, 0.87) !default; +// Header Styles +$h1-fontsize: 4.2rem !default; +$h2-fontsize: 3.56rem !default; +$h3-fontsize: 2.92rem !default; +$h4-fontsize: 2.28rem !default; +$h5-fontsize: 1.64rem !default; +$h6-fontsize: 1.15rem !default; + + +// 21. Footer +// ========================================================================== + +$footer-font-color: #fff !default; +$footer-bg-color: $primary-color !default; +$footer-copyright-font-color: rgba(255,255,255,.8) !default; +$footer-copyright-bg-color: rgba(51,51,51,.08) !default; + + +// 22. Flow Text +// ========================================================================== + +$range : $large-screen - $small-screen !default; +$intervals: 20 !default; +$interval-size: $range / $intervals !default; + + +// 23. Collections +// ========================================================================== + +$collection-border-color: #e0e0e0 !default; +$collection-bg-color: #fff !default; +$collection-active-bg-color: $secondary-color !default; +$collection-active-color: lighten($secondary-color, 55%) !default; +$collection-hover-bg-color: #ddd !default; +$collection-link-color: $secondary-color !default; +$collection-line-height: 1.5rem !default; + + +// 24. Progress Bar +// ========================================================================== + +$progress-bar-color: $secondary-color !default; diff --git a/src/main/webapp/WEB-INF/sass/components/_waves.scss b/src/main/webapp/WEB-INF/sass/components/_waves.scss new file mode 100644 index 0000000..5a3229b --- /dev/null +++ b/src/main/webapp/WEB-INF/sass/components/_waves.scss @@ -0,0 +1,114 @@ + +/*! + * Waves v0.6.0 + * http://fian.my.id/Waves + * + * Copyright 2014 Alfiana E. Sibuea and other contributors + * Released under the MIT license + * https://github.com/fians/Waves/blob/master/LICENSE + */ + + +.waves-effect { + position: relative; + cursor: pointer; + display: inline-block; + overflow: hidden; + user-select: none; + -webkit-tap-highlight-color: transparent; + vertical-align: middle; + z-index: 1; + transition: .3s ease-out; + + .waves-ripple { + position: absolute; + border-radius: 50%; + width: 20px; + height: 20px; + margin-top:-10px; + margin-left:-10px; + opacity: 0; + + background: rgba(0,0,0,0.2); + transition: all 0.7s ease-out; + transition-property: transform, opacity; + transform: scale(0); + pointer-events: none; + } + + // Waves Colors + &.waves-light .waves-ripple { + background-color: rgba(255, 255, 255, 0.45); + } + &.waves-red .waves-ripple { + background-color: rgba(244, 67, 54, .70); + } + &.waves-yellow .waves-ripple { + background-color: rgba(255, 235, 59, .70); + } + &.waves-orange .waves-ripple { + background-color: rgba(255, 152, 0, .70); + } + &.waves-purple .waves-ripple { + background-color: rgba(156, 39, 176, 0.70); + } + &.waves-green .waves-ripple { + background-color: rgba(76, 175, 80, 0.70); + } + &.waves-teal .waves-ripple { + background-color: rgba(0, 150, 136, 0.70); + } + + // Style input button bug. + input[type="button"], input[type="reset"], input[type="submit"] { + border: 0; + font-style: normal; + font-size: inherit; + text-transform: inherit; + background: none; + } + + img { + position: relative; + z-index: -1; + } +} + +.waves-notransition { + transition: none #{"!important"}; +} + +.waves-circle { + transform: translateZ(0); + -webkit-mask-image: -webkit-radial-gradient(circle, white 100%, black 100%); +} + +.waves-input-wrapper { + border-radius: 0.2em; + vertical-align: bottom; + + .waves-button-input { + position: relative; + top: 0; + left: 0; + z-index: 1; + } +} + +.waves-circle { + text-align: center; + width: 2.5em; + height: 2.5em; + line-height: 2.5em; + border-radius: 50%; + -webkit-mask-image: none; +} + +.waves-block { + display: block; +} + +/* Firefox Bug: link not triggered */ +.waves-effect .waves-ripple { + z-index: -1; +} \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/sass/components/forms/_checkboxes.scss b/src/main/webapp/WEB-INF/sass/components/forms/_checkboxes.scss new file mode 100644 index 0000000..ddc7d96 --- /dev/null +++ b/src/main/webapp/WEB-INF/sass/components/forms/_checkboxes.scss @@ -0,0 +1,200 @@ +/* Checkboxes + ========================================================================== */ + +/* Remove default checkbox */ +[type="checkbox"]:not(:checked), +[type="checkbox"]:checked { + position: absolute; + opacity: 0; + pointer-events: none; +} + +// Checkbox Styles +[type="checkbox"] { + // Text Label Style + + span:not(.lever) { + position: relative; + padding-left: 35px; + cursor: pointer; + display: inline-block; + height: 25px; + line-height: 25px; + font-size: 1rem; + user-select: none; + } + + /* checkbox aspect */ + + span:not(.lever):before, + &:not(.filled-in) + span:not(.lever):after { + content: ''; + position: absolute; + top: 0; + left: 0; + width: 18px; + height: 18px; + z-index: 0; + border: 2px solid $radio-empty-color; + border-radius: 1px; + margin-top: 3px; + transition: .2s; + } + + &:not(.filled-in) + span:not(.lever):after { + border: 0; + transform: scale(0); + } + + &:not(:checked):disabled + span:not(.lever):before { + border: none; + background-color: $input-disabled-color; + } + + // Focused styles + &.tabbed:focus + span:not(.lever):after { + transform: scale(1); + border: 0; + border-radius: 50%; + box-shadow: 0 0 0 10px rgba(0,0,0,.1); + background-color: rgba(0,0,0,.1); + } +} + +[type="checkbox"]:checked { + + span:not(.lever):before { + top: -4px; + left: -5px; + width: 12px; + height: 22px; + border-top: 2px solid transparent; + border-left: 2px solid transparent; + border-right: $radio-border; + border-bottom: $radio-border; + transform: rotate(40deg); + backface-visibility: hidden; + transform-origin: 100% 100%; + } + + &:disabled + span:before { + border-right: 2px solid $input-disabled-color; + border-bottom: 2px solid $input-disabled-color; + } +} + +/* Indeterminate checkbox */ +[type="checkbox"]:indeterminate { + + span:not(.lever):before { + top: -11px; + left: -12px; + width: 10px; + height: 22px; + border-top: none; + border-left: none; + border-right: $radio-border; + border-bottom: none; + transform: rotate(90deg); + backface-visibility: hidden; + transform-origin: 100% 100%; + } + + // Disabled indeterminate + &:disabled + span:not(.lever):before { + border-right: 2px solid $input-disabled-color; + background-color: transparent; + } +} + +// Filled in Style +[type="checkbox"].filled-in { + // General + + span:not(.lever):after { + border-radius: 2px; + } + + + span:not(.lever):before, + + span:not(.lever):after { + content: ''; + left: 0; + position: absolute; + /* .1s delay is for check animation */ + transition: border .25s, background-color .25s, width .20s .1s, height .20s .1s, top .20s .1s, left .20s .1s; + z-index: 1; + } + + // Unchecked style + &:not(:checked) + span:not(.lever):before { + width: 0; + height: 0; + border: 3px solid transparent; + left: 6px; + top: 10px; + transform: rotateZ(37deg); + transform-origin: 100% 100%; + } + + &:not(:checked) + span:not(.lever):after { + height: 20px; + width: 20px; + background-color: transparent; + border: 2px solid $radio-empty-color; + top: 0px; + z-index: 0; + } + + // Checked style + &:checked { + + span:not(.lever):before { + top: 0; + left: 1px; + width: 8px; + height: 13px; + border-top: 2px solid transparent; + border-left: 2px solid transparent; + border-right: 2px solid $input-background; + border-bottom: 2px solid $input-background; + transform: rotateZ(37deg); + transform-origin: 100% 100%; + } + + + span:not(.lever):after { + top: 0; + width: 20px; + height: 20px; + border: 2px solid $secondary-color; + background-color: $secondary-color; + z-index: 0; + } + } + + // Focused styles + &.tabbed:focus + span:not(.lever):after { + border-radius: 2px; + border-color: $radio-empty-color; + background-color: rgba(0,0,0,.1); + } + + &.tabbed:checked:focus + span:not(.lever):after { + border-radius: 2px; + background-color: $secondary-color; + border-color: $secondary-color; + } + + // Disabled style + &:disabled:not(:checked) + span:not(.lever):before { + background-color: transparent; + border: 2px solid transparent; + } + + &:disabled:not(:checked) + span:not(.lever):after { + border-color: transparent; + background-color: $input-disabled-solid-color; + } + + &:disabled:checked + span:not(.lever):before { + background-color: transparent; + } + + &:disabled:checked + span:not(.lever):after { + background-color: $input-disabled-solid-color; + border-color: $input-disabled-solid-color; + } +} diff --git a/src/main/webapp/WEB-INF/sass/components/forms/_file-input.scss b/src/main/webapp/WEB-INF/sass/components/forms/_file-input.scss new file mode 100644 index 0000000..e2becc9 --- /dev/null +++ b/src/main/webapp/WEB-INF/sass/components/forms/_file-input.scss @@ -0,0 +1,44 @@ +/* File Input + ========================================================================== */ + +.file-field { + position: relative; + + .file-path-wrapper { + overflow: hidden; + padding-left: 10px; + } + + input.file-path { width: 100%; } + + .btn { + float: left; + height: $input-height; + line-height: $input-height; + } + + span { + cursor: pointer; + } + + input[type=file] { + + // Needed to override webkit button + &::-webkit-file-upload-button { + display: none; + } + + position: absolute; + top: 0; + right: 0; + left: 0; + bottom: 0; + width: 100%; + margin: 0; + padding: 0; + font-size: 20px; + cursor: pointer; + opacity: 0; + filter: alpha(opacity=0); + } +} diff --git a/src/main/webapp/WEB-INF/sass/components/forms/_forms.scss b/src/main/webapp/WEB-INF/sass/components/forms/_forms.scss new file mode 100644 index 0000000..e9b65b4 --- /dev/null +++ b/src/main/webapp/WEB-INF/sass/components/forms/_forms.scss @@ -0,0 +1,22 @@ +// Remove Focus Boxes +select:focus { + outline: $select-focus; +} + +button:focus { + outline: none; + background-color: $button-background-focus; +} + +label { + font-size: $label-font-size; + color: $input-border-color; +} + +@import 'input-fields'; +@import 'radio-buttons'; +@import 'checkboxes'; +@import 'switches'; +@import 'select'; +@import 'file-input'; +@import 'range'; diff --git a/src/main/webapp/WEB-INF/sass/components/forms/_input-fields.scss b/src/main/webapp/WEB-INF/sass/components/forms/_input-fields.scss new file mode 100644 index 0000000..f18c2f8 --- /dev/null +++ b/src/main/webapp/WEB-INF/sass/components/forms/_input-fields.scss @@ -0,0 +1,354 @@ +/* Text Inputs + Textarea + ========================================================================== */ + +/* Style Placeholders */ + +::placeholder { + color: $placeholder-text-color; +} + +/* Text inputs */ + +input:not([type]), +input[type=text]:not(.browser-default), +input[type=password]:not(.browser-default), +input[type=email]:not(.browser-default), +input[type=url]:not(.browser-default), +input[type=time]:not(.browser-default), +input[type=date]:not(.browser-default), +input[type=datetime]:not(.browser-default), +input[type=datetime-local]:not(.browser-default), +input[type=tel]:not(.browser-default), +input[type=number]:not(.browser-default), +input[type=search]:not(.browser-default), +textarea.materialize-textarea { + + // General Styles + background-color: transparent; + border: none; + border-bottom: $input-border; + border-radius: 0; + outline: none; + height: $input-height; + width: 100%; + font-size: $input-font-size; + margin: $input-margin; + padding: $input-padding; + box-shadow: none; + box-sizing: content-box; + transition: box-shadow .3s, border .3s; + + // Disabled input style + &:disabled, + &[readonly="readonly"] { + color: $input-disabled-color; + border-bottom: $input-disabled-border; + } + + // Disabled label style + &:disabled+label, + &[readonly="readonly"]+label { + color: $input-disabled-color; + } + + // Focused input style + &:focus:not([readonly]) { + border-bottom: 1px solid $input-focus-color; + box-shadow: 0 1px 0 0 $input-focus-color; + } + + // Focused label style + &:focus:not([readonly])+label { + color: $input-focus-color; + } + + // Hide helper text on data message + &.valid ~ .helper-text[data-success], + &:focus.valid ~ .helper-text[data-success], + &.invalid ~ .helper-text[data-error], + &:focus.invalid ~ .helper-text[data-error] { + @extend %hidden-text; + } + + // Valid Input Style + &.valid, + &:focus.valid { + @extend %valid-input-style; + } + + // Custom Success Message + &.valid ~ .helper-text:after, + &:focus.valid ~ .helper-text:after { + @extend %custom-success-message; + } + &:focus.valid ~ label { + color: $input-success-color; + } + + // Invalid Input Style + &.invalid, + &:focus.invalid { + @extend %invalid-input-style; + } + + // Custom Error message + &.invalid ~ .helper-text:after, + &:focus.invalid ~ .helper-text:after { + @extend %custom-error-message; + } + &:focus.invalid ~ label { + color: $input-error-color; + } + + // Full width label when using validate for error messages + &.validate + label { + width: 100%; + } + + // Form Message Shared Styles + & + label:after { + @extend %input-after-style; + } +} + + +/* Validation Sass Placeholders */ +%valid-input-style { + border-bottom: 1px solid $input-success-color; + box-shadow: 0 1px 0 0 $input-success-color; +} +%invalid-input-style { + border-bottom: $input-invalid-border; + box-shadow: 0 1px 0 0 $input-error-color; +} +%hidden-text { + color: transparent; + user-select: none; + pointer-events: none; +} +%custom-success-message { + content: attr(data-success); + color: $input-success-color; +} +%custom-error-message { + content: attr(data-error); + color: $input-error-color; +} +%input-after-style { + display: block; + content: ""; + position: absolute; + top: 100%; + left: 0; + opacity: 0; + transition: .2s opacity ease-out, .2s color ease-out; +} + + +// Styling for input field wrapper +.input-field { + // Inline styles + &.inline { + display: inline-block; + vertical-align: middle; + margin-left: 5px; + + input, + .select-dropdown { + margin-bottom: 1rem; + } + } + + // Gutter spacing + &.col { + label { + left: $gutter-width / 2; + } + + .prefix ~ label, + .prefix ~ .validate ~ label { + width: calc(100% - 3rem - #{$gutter-width}); + } + } + + position: relative; + margin-top: 1rem; + margin-bottom: 1rem; + + & > label { + color: $input-border-color; + position: absolute; + top: 0; + left: 0; + font-size: 1rem; + cursor: text; + transition: transform .2s ease-out, color .2s ease-out; + transform-origin: 0% 100%; + text-align: initial; + transform: translateY(12px); + + &:not(.label-icon).active { + transform: translateY(-14px) scale(.8); + transform-origin: 0 0; + } + } + + // Autofill + date + time inputs + & > input[type]:-webkit-autofill:not(.browser-default):not([type="search"]) + label, + & > input[type=date]:not(.browser-default) + label, + & > input[type=time]:not(.browser-default) + label { + transform: translateY(-14px) scale(.8); + transform-origin: 0 0; + } + + .helper-text { + &::after { + opacity: 1; + position: absolute; + top: 0; + left: 0; + } + + position: relative; + min-height: 18px; + display: block; + font-size: 12px; + color: rgba(0,0,0,.54); + } + + // Prefix Icons + .prefix { + position: absolute; + width: $input-height; + font-size: $input-icon-size; + transition: color .2s; + top: ($input-height - $input-icon-size) / 2; + + &.active { color: $input-focus-color; } + } + + .prefix ~ input, + .prefix ~ textarea, + .prefix ~ label, + .prefix ~ .validate ~ label, + .prefix ~ .helper-text, + .prefix ~ .autocomplete-content { + margin-left: 3rem; + width: 92%; + width: calc(100% - 3rem); + } + + .prefix ~ label { margin-left: 3rem; } + + @media #{$medium-and-down} { + .prefix ~ input { + width: 86%; + width: calc(100% - 3rem); + } + } + + @media #{$small-and-down} { + .prefix ~ input { + width: 80%; + width: calc(100% - 3rem); + } + } +} + + +/* Search Field */ + +.input-field input[type=search] { + display: block; + line-height: inherit; + transition: .3s background-color; + + .nav-wrapper & { + height: inherit; + padding-left: 4rem; + width: calc(100% - 4rem); + border: 0; + box-shadow: none; + } + + &:focus:not(.browser-default) { + background-color: $input-background; + border: 0; + box-shadow: none; + color: #444; + + & + label i, + & ~ .mdi-navigation-close, + & ~ .material-icons { + color: #444; + } + } + + & + .label-icon { + transform: none; + left: 1rem; + } + + & ~ .mdi-navigation-close, + & ~ .material-icons { + position: absolute; + top: 0; + right: 1rem; + color: transparent; + cursor: pointer; + font-size: $input-icon-size; + transition: .3s color; + } +} + + +/* Textarea */ + +// Default textarea +textarea { + width: 100%; + height: $input-height; + background-color: transparent; + + &.materialize-textarea { + line-height: normal; + overflow-y: hidden; /* prevents scroll bar flash */ + padding: .8rem 0 .8rem 0; /* prevents text jump on Enter keypress */ + resize: none; + min-height: $input-height; + box-sizing: border-box; + } +} + +// For textarea autoresize +.hiddendiv { + visibility: hidden; + white-space: pre-wrap; + word-wrap: break-word; + overflow-wrap: break-word; /* future version of deprecated 'word-wrap' */ + padding-top: 1.2rem; /* prevents text jump on Enter keypress */ + + // Reduces repaints + position: absolute; + top: 0; + z-index: -1; +} + + +/* Autocomplete */ +.autocomplete-content { + li { + .highlight { color: #444; } + + img { + height: $dropdown-item-height - 10; + width: $dropdown-item-height - 10; + margin: 5px 15px; + } + } +} + +/* Character Counter */ +.character-counter { + min-height: 18px; +} diff --git a/src/main/webapp/WEB-INF/sass/components/forms/_radio-buttons.scss b/src/main/webapp/WEB-INF/sass/components/forms/_radio-buttons.scss new file mode 100644 index 0000000..c9f7296 --- /dev/null +++ b/src/main/webapp/WEB-INF/sass/components/forms/_radio-buttons.scss @@ -0,0 +1,115 @@ +/* Radio Buttons + ========================================================================== */ + +// Remove default Radio Buttons +[type="radio"]:not(:checked), +[type="radio"]:checked { + position: absolute; + opacity: 0; + pointer-events: none; +} + +[type="radio"]:not(:checked) + span, +[type="radio"]:checked + span { + position: relative; + padding-left: 35px; + cursor: pointer; + display: inline-block; + height: 25px; + line-height: 25px; + font-size: 1rem; + transition: .28s ease; + user-select: none; +} + +[type="radio"] + span:before, +[type="radio"] + span:after { + content: ''; + position: absolute; + left: 0; + top: 0; + margin: 4px; + width: 16px; + height: 16px; + z-index: 0; + transition: .28s ease; +} + +/* Unchecked styles */ +[type="radio"]:not(:checked) + span:before, +[type="radio"]:not(:checked) + span:after, +[type="radio"]:checked + span:before, +[type="radio"]:checked + span:after, +[type="radio"].with-gap:checked + span:before, +[type="radio"].with-gap:checked + span:after { + border-radius: 50%; +} + +[type="radio"]:not(:checked) + span:before, +[type="radio"]:not(:checked) + span:after { + border: 2px solid $radio-empty-color; +} + +[type="radio"]:not(:checked) + span:after { + transform: scale(0); +} + +/* Checked styles */ +[type="radio"]:checked + span:before { + border: 2px solid transparent; +} + +[type="radio"]:checked + span:after, +[type="radio"].with-gap:checked + span:before, +[type="radio"].with-gap:checked + span:after { + border: $radio-border; +} + +[type="radio"]:checked + span:after, +[type="radio"].with-gap:checked + span:after { + background-color: $radio-fill-color; +} + +[type="radio"]:checked + span:after { + transform: scale(1.02); +} + +/* Radio With gap */ +[type="radio"].with-gap:checked + span:after { + transform: scale(.5); +} + +/* Focused styles */ +[type="radio"].tabbed:focus + span:before { + box-shadow: 0 0 0 10px rgba(0,0,0,.1); +} + +/* Disabled Radio With gap */ +[type="radio"].with-gap:disabled:checked + span:before { + border: 2px solid $input-disabled-color; +} + +[type="radio"].with-gap:disabled:checked + span:after { + border: none; + background-color: $input-disabled-color; +} + +/* Disabled style */ +[type="radio"]:disabled:not(:checked) + span:before, +[type="radio"]:disabled:checked + span:before { + background-color: transparent; + border-color: $input-disabled-color; +} + +[type="radio"]:disabled + span { + color: $input-disabled-color; +} + +[type="radio"]:disabled:not(:checked) + span:before { + border-color: $input-disabled-color; +} + +[type="radio"]:disabled:checked + span:after { + background-color: $input-disabled-color; + border-color: $input-disabled-solid-color; +} diff --git a/src/main/webapp/WEB-INF/sass/components/forms/_range.scss b/src/main/webapp/WEB-INF/sass/components/forms/_range.scss new file mode 100644 index 0000000..18607f5 --- /dev/null +++ b/src/main/webapp/WEB-INF/sass/components/forms/_range.scss @@ -0,0 +1,161 @@ +/* Range + ========================================================================== */ + +.range-field { + position: relative; +} + +input[type=range], +input[type=range] + .thumb { + @extend .no-select; + cursor: pointer; +} + +input[type=range] { + position: relative; + background-color: transparent; + border: none; + outline: none; + width: 100%; + margin: 15px 0; + padding: 0; + + &:focus { + outline: none; + } +} + +input[type=range] + .thumb { + position: absolute; + top: 10px; + left: 0; + border: none; + height: 0; + width: 0; + border-radius: 50%; + background-color: $radio-fill-color; + margin-left: 7px; + + transform-origin: 50% 50%; + transform: rotate(-45deg); + + .value { + display: block; + width: 30px; + text-align: center; + color: $radio-fill-color; + font-size: 0; + transform: rotate(45deg); + } + + &.active { + border-radius: 50% 50% 50% 0; + + .value { + color: $input-background; + margin-left: -1px; + margin-top: 8px; + font-size: 10px; + } + } +} + +// Shared +@mixin range-track { + height: $track-height; + background: #c2c0c2; + border: none; +} + +@mixin range-thumb { + border: none; + height: $range-height; + width: $range-width; + border-radius: 50%; + background: $radio-fill-color; + transition: box-shadow .3s; +} + +// WebKit +input[type=range] { + -webkit-appearance: none; +} + +input[type=range]::-webkit-slider-runnable-track { + @include range-track; +} + +input[type=range]::-webkit-slider-thumb { + @include range-thumb; + -webkit-appearance: none; + background-color: $radio-fill-color; + transform-origin: 50% 50%; + margin: -5px 0 0 0; + +} + +.keyboard-focused input[type=range]:focus:not(.active)::-webkit-slider-thumb { + box-shadow: 0 0 0 10px rgba($radio-fill-color, .26); +} + +// FireFox +input[type=range] { + /* fix for FF unable to apply focus style bug */ + border: 1px solid white; + + /*required for proper track sizing in FF*/ +} + +input[type=range]::-moz-range-track { + @include range-track; +} + +input[type=range]::-moz-focus-inner { + border: 0; +} + +input[type=range]::-moz-range-thumb { + @include range-thumb; + margin-top: -5px; +} + +// hide the outline behind the border +input[type=range]:-moz-focusring { + outline: 1px solid #fff; + outline-offset: -1px; +} + +.keyboard-focused input[type=range]:focus:not(.active)::-moz-range-thumb { + box-shadow: 0 0 0 10px rgba($radio-fill-color, .26); +} + +// IE 10+ +input[type=range]::-ms-track { + height: $track-height; + + // remove bg colour from the track, we'll use ms-fill-lower and ms-fill-upper instead + background: transparent; + + // leave room for the larger thumb to overflow with a transparent border */ + border-color: transparent; + border-width: 6px 0; + + /*remove default tick marks*/ + color: transparent; +} + +input[type=range]::-ms-fill-lower { + background: #777; +} + +input[type=range]::-ms-fill-upper { + background: #ddd; +} + +input[type=range]::-ms-thumb { + @include range-thumb; +} + +.keyboard-focused input[type=range]:focus:not(.active)::-ms-thumb { + box-shadow: 0 0 0 10px rgba($radio-fill-color, .26); +} diff --git a/src/main/webapp/WEB-INF/sass/components/forms/_select.scss b/src/main/webapp/WEB-INF/sass/components/forms/_select.scss new file mode 100644 index 0000000..2fd04d3 --- /dev/null +++ b/src/main/webapp/WEB-INF/sass/components/forms/_select.scss @@ -0,0 +1,180 @@ +/* Select Field + ========================================================================== */ + +select { display: none; } +select.browser-default { display: block; } + +select { + background-color: $select-background; + width: 100%; + padding: $select-padding; + border: $select-border; + border-radius: $select-radius; + height: $input-height; +} + +.select-label { + position: absolute; +} + +.select-wrapper { + &.valid .helper-text[data-success], + &.invalid ~ .helper-text[data-error] { + @extend %hidden-text; + } + + &.valid { + & > input.select-dropdown { + @extend %valid-input-style; + } + + & ~ .helper-text:after { + @extend %custom-success-message; + } + } + + &.invalid { + & > input.select-dropdown, + & > input.select-dropdown:focus { + @extend %invalid-input-style; + } + + & ~ .helper-text:after { + @extend %custom-error-message; + } + } + + &.valid + label, + &.invalid + label { + width: 100%; + pointer-events: none; + } + + & + label:after { + @extend %input-after-style; + } + + position: relative; + + input.select-dropdown { + &:focus { + border-bottom: 1px solid $input-focus-color; + } + position: relative; + cursor: pointer; + background-color: transparent; + border: none; + border-bottom: $input-border; + outline: none; + height: $input-height; + line-height: $input-height; + width: 100%; + font-size: $input-font-size; + margin: $input-margin; + padding: 0; + display: block; + user-select:none; + z-index: 1; + } + + .caret { + position: absolute; + right: 0; + top: 0; + bottom: 0; + margin: auto 0; + z-index: 0; + fill: rgba(0,0,0,.87); + } + + & + label { + position: absolute; + top: -26px; + font-size: $label-font-size; + } +} + +// Disabled styles +select:disabled { + color: $input-disabled-color; +} + +.select-wrapper.disabled { + + label { + color: $input-disabled-color; + } + .caret { + fill: $input-disabled-color; + } +} + +.select-wrapper input.select-dropdown:disabled { + color: $input-disabled-color; + cursor: default; + user-select: none; +} + +.select-wrapper i { + color: $select-disabled-color; +} + +.select-dropdown li.disabled, +.select-dropdown li.disabled > span, +.select-dropdown li.optgroup { + color: $select-disabled-color; + background-color: transparent; +} + +body.keyboard-focused { + .select-dropdown.dropdown-content li:focus { + background-color: $select-option-focus; + } +} + +.select-dropdown.dropdown-content { + li { + &:hover { + background-color: $select-option-hover; + } + + &.selected { + background-color: $select-option-selected; + } + } +} + +// Prefix Icons +.prefix ~ .select-wrapper { + margin-left: 3rem; + width: 92%; + width: calc(100% - 3rem); +} + +.prefix ~ label { margin-left: 3rem; } + +// Icons +.select-dropdown li { + img { + height: $dropdown-item-height - 10; + width: $dropdown-item-height - 10; + margin: 5px 15px; + float: right; + } +} + +// Optgroup styles +.select-dropdown li.optgroup { + border-top: 1px solid $dropdown-hover-bg-color; + + &.selected > span { + color: rgba(0, 0, 0, .7); + } + + & > span { + color: rgba(0, 0, 0, .4); + } + + & ~ li.optgroup-option { + padding-left: 1rem; + } +} diff --git a/src/main/webapp/WEB-INF/sass/components/forms/_switches.scss b/src/main/webapp/WEB-INF/sass/components/forms/_switches.scss new file mode 100644 index 0000000..5976779 --- /dev/null +++ b/src/main/webapp/WEB-INF/sass/components/forms/_switches.scss @@ -0,0 +1,89 @@ +/* Switch + ========================================================================== */ + +.switch, +.switch * { + -webkit-tap-highlight-color: transparent; + user-select: none; +} + +.switch label { + cursor: pointer; +} + +.switch label input[type=checkbox] { + opacity: 0; + width: 0; + height: 0; + + &:checked + .lever { + background-color: $switch-checked-lever-bg; + + &:before, &:after { + left: 18px; + } + + &:after { + background-color: $switch-bg-color; + } + } +} + +.switch label .lever { + content: ""; + display: inline-block; + position: relative; + width: 36px; + height: 14px; + background-color: $switch-unchecked-lever-bg; + border-radius: $switch-radius; + margin-right: 10px; + transition: background 0.3s ease; + vertical-align: middle; + margin: 0 16px; + + &:before, &:after { + content: ""; + position: absolute; + display: inline-block; + width: 20px; + height: 20px; + border-radius: 50%; + left: 0; + top: -3px; + transition: left 0.3s ease, background .3s ease, box-shadow 0.1s ease, transform .1s ease; + } + + &:before { + background-color: transparentize($switch-bg-color, .85); + } + + &:after { + background-color: $switch-unchecked-bg; + box-shadow: 0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12); + } +} + +// Switch active style +input[type=checkbox]:checked:not(:disabled) ~ .lever:active::before, +input[type=checkbox]:checked:not(:disabled).tabbed:focus ~ .lever::before { + transform: scale(2.4); + background-color: transparentize($switch-bg-color, .85); +} + +input[type=checkbox]:not(:disabled) ~ .lever:active:before, +input[type=checkbox]:not(:disabled).tabbed:focus ~ .lever::before { + transform: scale(2.4); + background-color: rgba(0,0,0,.08); +} + +// Disabled Styles +.switch input[type=checkbox][disabled] + .lever { + cursor: default; + background-color: rgba(0,0,0,.12); +} + +.switch label input[type=checkbox][disabled] + .lever:after, +.switch label input[type=checkbox][disabled]:checked + .lever:after { + background-color: $input-disabled-solid-color; +} diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 0000000..91fa9fc --- /dev/null +++ b/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,15 @@ + + + + AREN + + AREN is an application that handle online debate. + + + 60 + + diff --git a/src/main/webapp/assets/css/app.css b/src/main/webapp/assets/css/app.css new file mode 100644 index 0000000..e81e48d --- /dev/null +++ b/src/main/webapp/assets/css/app.css @@ -0,0 +1,7949 @@ +@font-face { + font-family: "Seravek"; + src: url("../font/seravek-light-webfont.woff") format("woff"); + font-weight: 100; } +@font-face { + font-family: "Seravek"; + src: url("../font/seravek-regular-webfont.woff") format("woff"); + font-weight: 400; } +@font-face { + font-family: "Seravek"; + src: url("../font/seravek-medium-webfont.woff") format("woff"); + font-weight: 700; } +@font-face { + font-family: "Seravek"; + src: url("../font/seravek-bold-webfont.woff") format("woff"); + font-weight: 900; } +@font-face { + font-family: 'Material Icons'; + font-style: normal; + font-weight: 400; + src: url("../font/material-icons.woff") format("woff2"); } +/*$error-color: color("red", "base") !default;*/ +:root { + --blue-color: #4D9999; + --red-color: #BA4100; + --green-color: #26A96C; + --grey-color: #B2B2B2; } + +.materialize-red { + background-color: #e51c23 !important; } + +.materialize-red-text { + color: #e51c23 !important; } + +.materialize-red.lighten-5 { + background-color: #fdeaeb !important; } + +.materialize-red-text.text-lighten-5 { + color: #fdeaeb !important; } + +.materialize-red.lighten-4 { + background-color: #f8c1c3 !important; } + +.materialize-red-text.text-lighten-4 { + color: #f8c1c3 !important; } + +.materialize-red.lighten-3 { + background-color: #f3989b !important; } + +.materialize-red-text.text-lighten-3 { + color: #f3989b !important; } + +.materialize-red.lighten-2 { + background-color: #ee6e73 !important; } + +.materialize-red-text.text-lighten-2 { + color: #ee6e73 !important; } + +.materialize-red.lighten-1 { + background-color: #ea454b !important; } + +.materialize-red-text.text-lighten-1 { + color: #ea454b !important; } + +.materialize-red.darken-1 { + background-color: #d0181e !important; } + +.materialize-red-text.text-darken-1 { + color: #d0181e !important; } + +.materialize-red.darken-2 { + background-color: #b9151b !important; } + +.materialize-red-text.text-darken-2 { + color: #b9151b !important; } + +.materialize-red.darken-3 { + background-color: #a21318 !important; } + +.materialize-red-text.text-darken-3 { + color: #a21318 !important; } + +.materialize-red.darken-4 { + background-color: #8b1014 !important; } + +.materialize-red-text.text-darken-4 { + color: #8b1014 !important; } + +.red { + background-color: #F44336 !important; } + +.red-text { + color: #F44336 !important; } + +.red.lighten-5 { + background-color: #FFEBEE !important; } + +.red-text.text-lighten-5 { + color: #FFEBEE !important; } + +.red.lighten-4 { + background-color: #FFCDD2 !important; } + +.red-text.text-lighten-4 { + color: #FFCDD2 !important; } + +.red.lighten-3 { + background-color: #EF9A9A !important; } + +.red-text.text-lighten-3 { + color: #EF9A9A !important; } + +.red.lighten-2 { + background-color: #E57373 !important; } + +.red-text.text-lighten-2 { + color: #E57373 !important; } + +.red.lighten-1 { + background-color: #EF5350 !important; } + +.red-text.text-lighten-1 { + color: #EF5350 !important; } + +.red.darken-1 { + background-color: #E53935 !important; } + +.red-text.text-darken-1 { + color: #E53935 !important; } + +.red.darken-2 { + background-color: #D32F2F !important; } + +.red-text.text-darken-2 { + color: #D32F2F !important; } + +.red.darken-3 { + background-color: #C62828 !important; } + +.red-text.text-darken-3 { + color: #C62828 !important; } + +.red.darken-4 { + background-color: #B71C1C !important; } + +.red-text.text-darken-4 { + color: #B71C1C !important; } + +.red.accent-1 { + background-color: #FF8A80 !important; } + +.red-text.text-accent-1 { + color: #FF8A80 !important; } + +.red.accent-2 { + background-color: #FF5252 !important; } + +.red-text.text-accent-2 { + color: #FF5252 !important; } + +.red.accent-3 { + background-color: #FF1744 !important; } + +.red-text.text-accent-3 { + color: #FF1744 !important; } + +.red.accent-4 { + background-color: #D50000 !important; } + +.red-text.text-accent-4 { + color: #D50000 !important; } + +.pink { + background-color: #e91e63 !important; } + +.pink-text { + color: #e91e63 !important; } + +.pink.lighten-5 { + background-color: #fce4ec !important; } + +.pink-text.text-lighten-5 { + color: #fce4ec !important; } + +.pink.lighten-4 { + background-color: #f8bbd0 !important; } + +.pink-text.text-lighten-4 { + color: #f8bbd0 !important; } + +.pink.lighten-3 { + background-color: #f48fb1 !important; } + +.pink-text.text-lighten-3 { + color: #f48fb1 !important; } + +.pink.lighten-2 { + background-color: #f06292 !important; } + +.pink-text.text-lighten-2 { + color: #f06292 !important; } + +.pink.lighten-1 { + background-color: #ec407a !important; } + +.pink-text.text-lighten-1 { + color: #ec407a !important; } + +.pink.darken-1 { + background-color: #d81b60 !important; } + +.pink-text.text-darken-1 { + color: #d81b60 !important; } + +.pink.darken-2 { + background-color: #c2185b !important; } + +.pink-text.text-darken-2 { + color: #c2185b !important; } + +.pink.darken-3 { + background-color: #ad1457 !important; } + +.pink-text.text-darken-3 { + color: #ad1457 !important; } + +.pink.darken-4 { + background-color: #880e4f !important; } + +.pink-text.text-darken-4 { + color: #880e4f !important; } + +.pink.accent-1 { + background-color: #ff80ab !important; } + +.pink-text.text-accent-1 { + color: #ff80ab !important; } + +.pink.accent-2 { + background-color: #ff4081 !important; } + +.pink-text.text-accent-2 { + color: #ff4081 !important; } + +.pink.accent-3 { + background-color: #f50057 !important; } + +.pink-text.text-accent-3 { + color: #f50057 !important; } + +.pink.accent-4 { + background-color: #c51162 !important; } + +.pink-text.text-accent-4 { + color: #c51162 !important; } + +.purple { + background-color: #9c27b0 !important; } + +.purple-text { + color: #9c27b0 !important; } + +.purple.lighten-5 { + background-color: #f3e5f5 !important; } + +.purple-text.text-lighten-5 { + color: #f3e5f5 !important; } + +.purple.lighten-4 { + background-color: #e1bee7 !important; } + +.purple-text.text-lighten-4 { + color: #e1bee7 !important; } + +.purple.lighten-3 { + background-color: #ce93d8 !important; } + +.purple-text.text-lighten-3 { + color: #ce93d8 !important; } + +.purple.lighten-2 { + background-color: #ba68c8 !important; } + +.purple-text.text-lighten-2 { + color: #ba68c8 !important; } + +.purple.lighten-1 { + background-color: #ab47bc !important; } + +.purple-text.text-lighten-1 { + color: #ab47bc !important; } + +.purple.darken-1 { + background-color: #8e24aa !important; } + +.purple-text.text-darken-1 { + color: #8e24aa !important; } + +.purple.darken-2 { + background-color: #7b1fa2 !important; } + +.purple-text.text-darken-2 { + color: #7b1fa2 !important; } + +.purple.darken-3 { + background-color: #6a1b9a !important; } + +.purple-text.text-darken-3 { + color: #6a1b9a !important; } + +.purple.darken-4 { + background-color: #4a148c !important; } + +.purple-text.text-darken-4 { + color: #4a148c !important; } + +.purple.accent-1 { + background-color: #ea80fc !important; } + +.purple-text.text-accent-1 { + color: #ea80fc !important; } + +.purple.accent-2 { + background-color: #e040fb !important; } + +.purple-text.text-accent-2 { + color: #e040fb !important; } + +.purple.accent-3 { + background-color: #d500f9 !important; } + +.purple-text.text-accent-3 { + color: #d500f9 !important; } + +.purple.accent-4 { + background-color: #aa00ff !important; } + +.purple-text.text-accent-4 { + color: #aa00ff !important; } + +.deep-purple { + background-color: #673ab7 !important; } + +.deep-purple-text { + color: #673ab7 !important; } + +.deep-purple.lighten-5 { + background-color: #ede7f6 !important; } + +.deep-purple-text.text-lighten-5 { + color: #ede7f6 !important; } + +.deep-purple.lighten-4 { + background-color: #d1c4e9 !important; } + +.deep-purple-text.text-lighten-4 { + color: #d1c4e9 !important; } + +.deep-purple.lighten-3 { + background-color: #b39ddb !important; } + +.deep-purple-text.text-lighten-3 { + color: #b39ddb !important; } + +.deep-purple.lighten-2 { + background-color: #9575cd !important; } + +.deep-purple-text.text-lighten-2 { + color: #9575cd !important; } + +.deep-purple.lighten-1 { + background-color: #7e57c2 !important; } + +.deep-purple-text.text-lighten-1 { + color: #7e57c2 !important; } + +.deep-purple.darken-1 { + background-color: #5e35b1 !important; } + +.deep-purple-text.text-darken-1 { + color: #5e35b1 !important; } + +.deep-purple.darken-2 { + background-color: #512da8 !important; } + +.deep-purple-text.text-darken-2 { + color: #512da8 !important; } + +.deep-purple.darken-3 { + background-color: #4527a0 !important; } + +.deep-purple-text.text-darken-3 { + color: #4527a0 !important; } + +.deep-purple.darken-4 { + background-color: #311b92 !important; } + +.deep-purple-text.text-darken-4 { + color: #311b92 !important; } + +.deep-purple.accent-1 { + background-color: #b388ff !important; } + +.deep-purple-text.text-accent-1 { + color: #b388ff !important; } + +.deep-purple.accent-2 { + background-color: #7c4dff !important; } + +.deep-purple-text.text-accent-2 { + color: #7c4dff !important; } + +.deep-purple.accent-3 { + background-color: #651fff !important; } + +.deep-purple-text.text-accent-3 { + color: #651fff !important; } + +.deep-purple.accent-4 { + background-color: #6200ea !important; } + +.deep-purple-text.text-accent-4 { + color: #6200ea !important; } + +.indigo { + background-color: #3f51b5 !important; } + +.indigo-text { + color: #3f51b5 !important; } + +.indigo.lighten-5 { + background-color: #e8eaf6 !important; } + +.indigo-text.text-lighten-5 { + color: #e8eaf6 !important; } + +.indigo.lighten-4 { + background-color: #c5cae9 !important; } + +.indigo-text.text-lighten-4 { + color: #c5cae9 !important; } + +.indigo.lighten-3 { + background-color: #9fa8da !important; } + +.indigo-text.text-lighten-3 { + color: #9fa8da !important; } + +.indigo.lighten-2 { + background-color: #7986cb !important; } + +.indigo-text.text-lighten-2 { + color: #7986cb !important; } + +.indigo.lighten-1 { + background-color: #5c6bc0 !important; } + +.indigo-text.text-lighten-1 { + color: #5c6bc0 !important; } + +.indigo.darken-1 { + background-color: #3949ab !important; } + +.indigo-text.text-darken-1 { + color: #3949ab !important; } + +.indigo.darken-2 { + background-color: #303f9f !important; } + +.indigo-text.text-darken-2 { + color: #303f9f !important; } + +.indigo.darken-3 { + background-color: #283593 !important; } + +.indigo-text.text-darken-3 { + color: #283593 !important; } + +.indigo.darken-4 { + background-color: #1a237e !important; } + +.indigo-text.text-darken-4 { + color: #1a237e !important; } + +.indigo.accent-1 { + background-color: #8c9eff !important; } + +.indigo-text.text-accent-1 { + color: #8c9eff !important; } + +.indigo.accent-2 { + background-color: #536dfe !important; } + +.indigo-text.text-accent-2 { + color: #536dfe !important; } + +.indigo.accent-3 { + background-color: #3d5afe !important; } + +.indigo-text.text-accent-3 { + color: #3d5afe !important; } + +.indigo.accent-4 { + background-color: #304ffe !important; } + +.indigo-text.text-accent-4 { + color: #304ffe !important; } + +.blue { + background-color: #2196F3 !important; } + +.blue-text { + color: #2196F3 !important; } + +.blue.lighten-5 { + background-color: #E3F2FD !important; } + +.blue-text.text-lighten-5 { + color: #E3F2FD !important; } + +.blue.lighten-4 { + background-color: #BBDEFB !important; } + +.blue-text.text-lighten-4 { + color: #BBDEFB !important; } + +.blue.lighten-3 { + background-color: #90CAF9 !important; } + +.blue-text.text-lighten-3 { + color: #90CAF9 !important; } + +.blue.lighten-2 { + background-color: #64B5F6 !important; } + +.blue-text.text-lighten-2 { + color: #64B5F6 !important; } + +.blue.lighten-1 { + background-color: #42A5F5 !important; } + +.blue-text.text-lighten-1 { + color: #42A5F5 !important; } + +.blue.darken-1 { + background-color: #1E88E5 !important; } + +.blue-text.text-darken-1 { + color: #1E88E5 !important; } + +.blue.darken-2 { + background-color: #1976D2 !important; } + +.blue-text.text-darken-2 { + color: #1976D2 !important; } + +.blue.darken-3 { + background-color: #1565C0 !important; } + +.blue-text.text-darken-3 { + color: #1565C0 !important; } + +.blue.darken-4 { + background-color: #0D47A1 !important; } + +.blue-text.text-darken-4 { + color: #0D47A1 !important; } + +.blue.accent-1 { + background-color: #82B1FF !important; } + +.blue-text.text-accent-1 { + color: #82B1FF !important; } + +.blue.accent-2 { + background-color: #448AFF !important; } + +.blue-text.text-accent-2 { + color: #448AFF !important; } + +.blue.accent-3 { + background-color: #2979FF !important; } + +.blue-text.text-accent-3 { + color: #2979FF !important; } + +.blue.accent-4 { + background-color: #2962FF !important; } + +.blue-text.text-accent-4 { + color: #2962FF !important; } + +.light-blue { + background-color: #03a9f4 !important; } + +.light-blue-text { + color: #03a9f4 !important; } + +.light-blue.lighten-5 { + background-color: #e1f5fe !important; } + +.light-blue-text.text-lighten-5 { + color: #e1f5fe !important; } + +.light-blue.lighten-4 { + background-color: #b3e5fc !important; } + +.light-blue-text.text-lighten-4 { + color: #b3e5fc !important; } + +.light-blue.lighten-3 { + background-color: #81d4fa !important; } + +.light-blue-text.text-lighten-3 { + color: #81d4fa !important; } + +.light-blue.lighten-2 { + background-color: #4fc3f7 !important; } + +.light-blue-text.text-lighten-2 { + color: #4fc3f7 !important; } + +.light-blue.lighten-1 { + background-color: #29b6f6 !important; } + +.light-blue-text.text-lighten-1 { + color: #29b6f6 !important; } + +.light-blue.darken-1 { + background-color: #039be5 !important; } + +.light-blue-text.text-darken-1 { + color: #039be5 !important; } + +.light-blue.darken-2 { + background-color: #0288d1 !important; } + +.light-blue-text.text-darken-2 { + color: #0288d1 !important; } + +.light-blue.darken-3 { + background-color: #0277bd !important; } + +.light-blue-text.text-darken-3 { + color: #0277bd !important; } + +.light-blue.darken-4 { + background-color: #01579b !important; } + +.light-blue-text.text-darken-4 { + color: #01579b !important; } + +.light-blue.accent-1 { + background-color: #80d8ff !important; } + +.light-blue-text.text-accent-1 { + color: #80d8ff !important; } + +.light-blue.accent-2 { + background-color: #40c4ff !important; } + +.light-blue-text.text-accent-2 { + color: #40c4ff !important; } + +.light-blue.accent-3 { + background-color: #00b0ff !important; } + +.light-blue-text.text-accent-3 { + color: #00b0ff !important; } + +.light-blue.accent-4 { + background-color: #0091ea !important; } + +.light-blue-text.text-accent-4 { + color: #0091ea !important; } + +.cyan { + background-color: #00bcd4 !important; } + +.cyan-text { + color: #00bcd4 !important; } + +.cyan.lighten-5 { + background-color: #e0f7fa !important; } + +.cyan-text.text-lighten-5 { + color: #e0f7fa !important; } + +.cyan.lighten-4 { + background-color: #b2ebf2 !important; } + +.cyan-text.text-lighten-4 { + color: #b2ebf2 !important; } + +.cyan.lighten-3 { + background-color: #80deea !important; } + +.cyan-text.text-lighten-3 { + color: #80deea !important; } + +.cyan.lighten-2 { + background-color: #4dd0e1 !important; } + +.cyan-text.text-lighten-2 { + color: #4dd0e1 !important; } + +.cyan.lighten-1 { + background-color: #26c6da !important; } + +.cyan-text.text-lighten-1 { + color: #26c6da !important; } + +.cyan.darken-1 { + background-color: #00acc1 !important; } + +.cyan-text.text-darken-1 { + color: #00acc1 !important; } + +.cyan.darken-2 { + background-color: #0097a7 !important; } + +.cyan-text.text-darken-2 { + color: #0097a7 !important; } + +.cyan.darken-3 { + background-color: #00838f !important; } + +.cyan-text.text-darken-3 { + color: #00838f !important; } + +.cyan.darken-4 { + background-color: #006064 !important; } + +.cyan-text.text-darken-4 { + color: #006064 !important; } + +.cyan.accent-1 { + background-color: #84ffff !important; } + +.cyan-text.text-accent-1 { + color: #84ffff !important; } + +.cyan.accent-2 { + background-color: #18ffff !important; } + +.cyan-text.text-accent-2 { + color: #18ffff !important; } + +.cyan.accent-3 { + background-color: #00e5ff !important; } + +.cyan-text.text-accent-3 { + color: #00e5ff !important; } + +.cyan.accent-4 { + background-color: #00b8d4 !important; } + +.cyan-text.text-accent-4 { + color: #00b8d4 !important; } + +.teal { + background-color: #009688 !important; } + +.teal-text { + color: #009688 !important; } + +.teal.lighten-5 { + background-color: #e0f2f1 !important; } + +.teal-text.text-lighten-5 { + color: #e0f2f1 !important; } + +.teal.lighten-4 { + background-color: #b2dfdb !important; } + +.teal-text.text-lighten-4 { + color: #b2dfdb !important; } + +.teal.lighten-3 { + background-color: #80cbc4 !important; } + +.teal-text.text-lighten-3 { + color: #80cbc4 !important; } + +.teal.lighten-2 { + background-color: #4db6ac !important; } + +.teal-text.text-lighten-2 { + color: #4db6ac !important; } + +.teal.lighten-1 { + background-color: #26a69a !important; } + +.teal-text.text-lighten-1 { + color: #26a69a !important; } + +.teal.darken-1 { + background-color: #00897b !important; } + +.teal-text.text-darken-1 { + color: #00897b !important; } + +.teal.darken-2 { + background-color: #00796b !important; } + +.teal-text.text-darken-2 { + color: #00796b !important; } + +.teal.darken-3 { + background-color: #00695c !important; } + +.teal-text.text-darken-3 { + color: #00695c !important; } + +.teal.darken-4 { + background-color: #004d40 !important; } + +.teal-text.text-darken-4 { + color: #004d40 !important; } + +.teal.accent-1 { + background-color: #a7ffeb !important; } + +.teal-text.text-accent-1 { + color: #a7ffeb !important; } + +.teal.accent-2 { + background-color: #64ffda !important; } + +.teal-text.text-accent-2 { + color: #64ffda !important; } + +.teal.accent-3 { + background-color: #1de9b6 !important; } + +.teal-text.text-accent-3 { + color: #1de9b6 !important; } + +.teal.accent-4 { + background-color: #00bfa5 !important; } + +.teal-text.text-accent-4 { + color: #00bfa5 !important; } + +.green { + background-color: #4CAF50 !important; } + +.green-text { + color: #4CAF50 !important; } + +.green.lighten-5 { + background-color: #E8F5E9 !important; } + +.green-text.text-lighten-5 { + color: #E8F5E9 !important; } + +.green.lighten-4 { + background-color: #C8E6C9 !important; } + +.green-text.text-lighten-4 { + color: #C8E6C9 !important; } + +.green.lighten-3 { + background-color: #A5D6A7 !important; } + +.green-text.text-lighten-3 { + color: #A5D6A7 !important; } + +.green.lighten-2 { + background-color: #81C784 !important; } + +.green-text.text-lighten-2 { + color: #81C784 !important; } + +.green.lighten-1 { + background-color: #66BB6A !important; } + +.green-text.text-lighten-1 { + color: #66BB6A !important; } + +.green.darken-1 { + background-color: #43A047 !important; } + +.green-text.text-darken-1 { + color: #43A047 !important; } + +.green.darken-2 { + background-color: #388E3C !important; } + +.green-text.text-darken-2 { + color: #388E3C !important; } + +.green.darken-3 { + background-color: #2E7D32 !important; } + +.green-text.text-darken-3 { + color: #2E7D32 !important; } + +.green.darken-4 { + background-color: #1B5E20 !important; } + +.green-text.text-darken-4 { + color: #1B5E20 !important; } + +.green.accent-1 { + background-color: #B9F6CA !important; } + +.green-text.text-accent-1 { + color: #B9F6CA !important; } + +.green.accent-2 { + background-color: #69F0AE !important; } + +.green-text.text-accent-2 { + color: #69F0AE !important; } + +.green.accent-3 { + background-color: #00E676 !important; } + +.green-text.text-accent-3 { + color: #00E676 !important; } + +.green.accent-4 { + background-color: #00C853 !important; } + +.green-text.text-accent-4 { + color: #00C853 !important; } + +.light-green { + background-color: #8bc34a !important; } + +.light-green-text { + color: #8bc34a !important; } + +.light-green.lighten-5 { + background-color: #f1f8e9 !important; } + +.light-green-text.text-lighten-5 { + color: #f1f8e9 !important; } + +.light-green.lighten-4 { + background-color: #dcedc8 !important; } + +.light-green-text.text-lighten-4 { + color: #dcedc8 !important; } + +.light-green.lighten-3 { + background-color: #c5e1a5 !important; } + +.light-green-text.text-lighten-3 { + color: #c5e1a5 !important; } + +.light-green.lighten-2 { + background-color: #aed581 !important; } + +.light-green-text.text-lighten-2 { + color: #aed581 !important; } + +.light-green.lighten-1 { + background-color: #9ccc65 !important; } + +.light-green-text.text-lighten-1 { + color: #9ccc65 !important; } + +.light-green.darken-1 { + background-color: #7cb342 !important; } + +.light-green-text.text-darken-1 { + color: #7cb342 !important; } + +.light-green.darken-2 { + background-color: #689f38 !important; } + +.light-green-text.text-darken-2 { + color: #689f38 !important; } + +.light-green.darken-3 { + background-color: #558b2f !important; } + +.light-green-text.text-darken-3 { + color: #558b2f !important; } + +.light-green.darken-4 { + background-color: #33691e !important; } + +.light-green-text.text-darken-4 { + color: #33691e !important; } + +.light-green.accent-1 { + background-color: #ccff90 !important; } + +.light-green-text.text-accent-1 { + color: #ccff90 !important; } + +.light-green.accent-2 { + background-color: #b2ff59 !important; } + +.light-green-text.text-accent-2 { + color: #b2ff59 !important; } + +.light-green.accent-3 { + background-color: #76ff03 !important; } + +.light-green-text.text-accent-3 { + color: #76ff03 !important; } + +.light-green.accent-4 { + background-color: #64dd17 !important; } + +.light-green-text.text-accent-4 { + color: #64dd17 !important; } + +.lime { + background-color: #cddc39 !important; } + +.lime-text { + color: #cddc39 !important; } + +.lime.lighten-5 { + background-color: #f9fbe7 !important; } + +.lime-text.text-lighten-5 { + color: #f9fbe7 !important; } + +.lime.lighten-4 { + background-color: #f0f4c3 !important; } + +.lime-text.text-lighten-4 { + color: #f0f4c3 !important; } + +.lime.lighten-3 { + background-color: #e6ee9c !important; } + +.lime-text.text-lighten-3 { + color: #e6ee9c !important; } + +.lime.lighten-2 { + background-color: #dce775 !important; } + +.lime-text.text-lighten-2 { + color: #dce775 !important; } + +.lime.lighten-1 { + background-color: #d4e157 !important; } + +.lime-text.text-lighten-1 { + color: #d4e157 !important; } + +.lime.darken-1 { + background-color: #c0ca33 !important; } + +.lime-text.text-darken-1 { + color: #c0ca33 !important; } + +.lime.darken-2 { + background-color: #afb42b !important; } + +.lime-text.text-darken-2 { + color: #afb42b !important; } + +.lime.darken-3 { + background-color: #9e9d24 !important; } + +.lime-text.text-darken-3 { + color: #9e9d24 !important; } + +.lime.darken-4 { + background-color: #827717 !important; } + +.lime-text.text-darken-4 { + color: #827717 !important; } + +.lime.accent-1 { + background-color: #f4ff81 !important; } + +.lime-text.text-accent-1 { + color: #f4ff81 !important; } + +.lime.accent-2 { + background-color: #eeff41 !important; } + +.lime-text.text-accent-2 { + color: #eeff41 !important; } + +.lime.accent-3 { + background-color: #c6ff00 !important; } + +.lime-text.text-accent-3 { + color: #c6ff00 !important; } + +.lime.accent-4 { + background-color: #aeea00 !important; } + +.lime-text.text-accent-4 { + color: #aeea00 !important; } + +.yellow { + background-color: #ffeb3b !important; } + +.yellow-text { + color: #ffeb3b !important; } + +.yellow.lighten-5 { + background-color: #fffde7 !important; } + +.yellow-text.text-lighten-5 { + color: #fffde7 !important; } + +.yellow.lighten-4 { + background-color: #fff9c4 !important; } + +.yellow-text.text-lighten-4 { + color: #fff9c4 !important; } + +.yellow.lighten-3 { + background-color: #fff59d !important; } + +.yellow-text.text-lighten-3 { + color: #fff59d !important; } + +.yellow.lighten-2 { + background-color: #fff176 !important; } + +.yellow-text.text-lighten-2 { + color: #fff176 !important; } + +.yellow.lighten-1 { + background-color: #ffee58 !important; } + +.yellow-text.text-lighten-1 { + color: #ffee58 !important; } + +.yellow.darken-1 { + background-color: #fdd835 !important; } + +.yellow-text.text-darken-1 { + color: #fdd835 !important; } + +.yellow.darken-2 { + background-color: #fbc02d !important; } + +.yellow-text.text-darken-2 { + color: #fbc02d !important; } + +.yellow.darken-3 { + background-color: #f9a825 !important; } + +.yellow-text.text-darken-3 { + color: #f9a825 !important; } + +.yellow.darken-4 { + background-color: #f57f17 !important; } + +.yellow-text.text-darken-4 { + color: #f57f17 !important; } + +.yellow.accent-1 { + background-color: #ffff8d !important; } + +.yellow-text.text-accent-1 { + color: #ffff8d !important; } + +.yellow.accent-2 { + background-color: #ffff00 !important; } + +.yellow-text.text-accent-2 { + color: #ffff00 !important; } + +.yellow.accent-3 { + background-color: #ffea00 !important; } + +.yellow-text.text-accent-3 { + color: #ffea00 !important; } + +.yellow.accent-4 { + background-color: #ffd600 !important; } + +.yellow-text.text-accent-4 { + color: #ffd600 !important; } + +.amber { + background-color: #ffc107 !important; } + +.amber-text { + color: #ffc107 !important; } + +.amber.lighten-5 { + background-color: #fff8e1 !important; } + +.amber-text.text-lighten-5 { + color: #fff8e1 !important; } + +.amber.lighten-4 { + background-color: #ffecb3 !important; } + +.amber-text.text-lighten-4 { + color: #ffecb3 !important; } + +.amber.lighten-3 { + background-color: #ffe082 !important; } + +.amber-text.text-lighten-3 { + color: #ffe082 !important; } + +.amber.lighten-2 { + background-color: #ffd54f !important; } + +.amber-text.text-lighten-2 { + color: #ffd54f !important; } + +.amber.lighten-1 { + background-color: #ffca28 !important; } + +.amber-text.text-lighten-1 { + color: #ffca28 !important; } + +.amber.darken-1 { + background-color: #ffb300 !important; } + +.amber-text.text-darken-1 { + color: #ffb300 !important; } + +.amber.darken-2 { + background-color: #ffa000 !important; } + +.amber-text.text-darken-2 { + color: #ffa000 !important; } + +.amber.darken-3 { + background-color: #ff8f00 !important; } + +.amber-text.text-darken-3 { + color: #ff8f00 !important; } + +.amber.darken-4 { + background-color: #ff6f00 !important; } + +.amber-text.text-darken-4 { + color: #ff6f00 !important; } + +.amber.accent-1 { + background-color: #ffe57f !important; } + +.amber-text.text-accent-1 { + color: #ffe57f !important; } + +.amber.accent-2 { + background-color: #ffd740 !important; } + +.amber-text.text-accent-2 { + color: #ffd740 !important; } + +.amber.accent-3 { + background-color: #ffc400 !important; } + +.amber-text.text-accent-3 { + color: #ffc400 !important; } + +.amber.accent-4 { + background-color: #ffab00 !important; } + +.amber-text.text-accent-4 { + color: #ffab00 !important; } + +.orange { + background-color: #ff9800 !important; } + +.orange-text { + color: #ff9800 !important; } + +.orange.lighten-5 { + background-color: #fff3e0 !important; } + +.orange-text.text-lighten-5 { + color: #fff3e0 !important; } + +.orange.lighten-4 { + background-color: #ffe0b2 !important; } + +.orange-text.text-lighten-4 { + color: #ffe0b2 !important; } + +.orange.lighten-3 { + background-color: #ffcc80 !important; } + +.orange-text.text-lighten-3 { + color: #ffcc80 !important; } + +.orange.lighten-2 { + background-color: #ffb74d !important; } + +.orange-text.text-lighten-2 { + color: #ffb74d !important; } + +.orange.lighten-1 { + background-color: #ffa726 !important; } + +.orange-text.text-lighten-1 { + color: #ffa726 !important; } + +.orange.darken-1 { + background-color: #fb8c00 !important; } + +.orange-text.text-darken-1 { + color: #fb8c00 !important; } + +.orange.darken-2 { + background-color: #f57c00 !important; } + +.orange-text.text-darken-2 { + color: #f57c00 !important; } + +.orange.darken-3 { + background-color: #ef6c00 !important; } + +.orange-text.text-darken-3 { + color: #ef6c00 !important; } + +.orange.darken-4 { + background-color: #e65100 !important; } + +.orange-text.text-darken-4 { + color: #e65100 !important; } + +.orange.accent-1 { + background-color: #ffd180 !important; } + +.orange-text.text-accent-1 { + color: #ffd180 !important; } + +.orange.accent-2 { + background-color: #ffab40 !important; } + +.orange-text.text-accent-2 { + color: #ffab40 !important; } + +.orange.accent-3 { + background-color: #ff9100 !important; } + +.orange-text.text-accent-3 { + color: #ff9100 !important; } + +.orange.accent-4 { + background-color: #ff6d00 !important; } + +.orange-text.text-accent-4 { + color: #ff6d00 !important; } + +.deep-orange { + background-color: #ff5722 !important; } + +.deep-orange-text { + color: #ff5722 !important; } + +.deep-orange.lighten-5 { + background-color: #fbe9e7 !important; } + +.deep-orange-text.text-lighten-5 { + color: #fbe9e7 !important; } + +.deep-orange.lighten-4 { + background-color: #ffccbc !important; } + +.deep-orange-text.text-lighten-4 { + color: #ffccbc !important; } + +.deep-orange.lighten-3 { + background-color: #ffab91 !important; } + +.deep-orange-text.text-lighten-3 { + color: #ffab91 !important; } + +.deep-orange.lighten-2 { + background-color: #ff8a65 !important; } + +.deep-orange-text.text-lighten-2 { + color: #ff8a65 !important; } + +.deep-orange.lighten-1 { + background-color: #ff7043 !important; } + +.deep-orange-text.text-lighten-1 { + color: #ff7043 !important; } + +.deep-orange.darken-1 { + background-color: #f4511e !important; } + +.deep-orange-text.text-darken-1 { + color: #f4511e !important; } + +.deep-orange.darken-2 { + background-color: #e64a19 !important; } + +.deep-orange-text.text-darken-2 { + color: #e64a19 !important; } + +.deep-orange.darken-3 { + background-color: #d84315 !important; } + +.deep-orange-text.text-darken-3 { + color: #d84315 !important; } + +.deep-orange.darken-4 { + background-color: #bf360c !important; } + +.deep-orange-text.text-darken-4 { + color: #bf360c !important; } + +.deep-orange.accent-1 { + background-color: #ff9e80 !important; } + +.deep-orange-text.text-accent-1 { + color: #ff9e80 !important; } + +.deep-orange.accent-2 { + background-color: #ff6e40 !important; } + +.deep-orange-text.text-accent-2 { + color: #ff6e40 !important; } + +.deep-orange.accent-3 { + background-color: #ff3d00 !important; } + +.deep-orange-text.text-accent-3 { + color: #ff3d00 !important; } + +.deep-orange.accent-4 { + background-color: #dd2c00 !important; } + +.deep-orange-text.text-accent-4 { + color: #dd2c00 !important; } + +.brown { + background-color: #795548 !important; } + +.brown-text { + color: #795548 !important; } + +.brown.lighten-5 { + background-color: #efebe9 !important; } + +.brown-text.text-lighten-5 { + color: #efebe9 !important; } + +.brown.lighten-4 { + background-color: #d7ccc8 !important; } + +.brown-text.text-lighten-4 { + color: #d7ccc8 !important; } + +.brown.lighten-3 { + background-color: #bcaaa4 !important; } + +.brown-text.text-lighten-3 { + color: #bcaaa4 !important; } + +.brown.lighten-2 { + background-color: #a1887f !important; } + +.brown-text.text-lighten-2 { + color: #a1887f !important; } + +.brown.lighten-1 { + background-color: #8d6e63 !important; } + +.brown-text.text-lighten-1 { + color: #8d6e63 !important; } + +.brown.darken-1 { + background-color: #6d4c41 !important; } + +.brown-text.text-darken-1 { + color: #6d4c41 !important; } + +.brown.darken-2 { + background-color: #5d4037 !important; } + +.brown-text.text-darken-2 { + color: #5d4037 !important; } + +.brown.darken-3 { + background-color: #4e342e !important; } + +.brown-text.text-darken-3 { + color: #4e342e !important; } + +.brown.darken-4 { + background-color: #3e2723 !important; } + +.brown-text.text-darken-4 { + color: #3e2723 !important; } + +.blue-grey { + background-color: #607d8b !important; } + +.blue-grey-text { + color: #607d8b !important; } + +.blue-grey.lighten-5 { + background-color: #eceff1 !important; } + +.blue-grey-text.text-lighten-5 { + color: #eceff1 !important; } + +.blue-grey.lighten-4 { + background-color: #cfd8dc !important; } + +.blue-grey-text.text-lighten-4 { + color: #cfd8dc !important; } + +.blue-grey.lighten-3 { + background-color: #b0bec5 !important; } + +.blue-grey-text.text-lighten-3 { + color: #b0bec5 !important; } + +.blue-grey.lighten-2 { + background-color: #90a4ae !important; } + +.blue-grey-text.text-lighten-2 { + color: #90a4ae !important; } + +.blue-grey.lighten-1 { + background-color: #78909c !important; } + +.blue-grey-text.text-lighten-1 { + color: #78909c !important; } + +.blue-grey.darken-1 { + background-color: #546e7a !important; } + +.blue-grey-text.text-darken-1 { + color: #546e7a !important; } + +.blue-grey.darken-2 { + background-color: #455a64 !important; } + +.blue-grey-text.text-darken-2 { + color: #455a64 !important; } + +.blue-grey.darken-3 { + background-color: #37474f !important; } + +.blue-grey-text.text-darken-3 { + color: #37474f !important; } + +.blue-grey.darken-4 { + background-color: #263238 !important; } + +.blue-grey-text.text-darken-4 { + color: #263238 !important; } + +.grey { + background-color: #9e9e9e !important; } + +.grey-text { + color: #9e9e9e !important; } + +.grey.lighten-5 { + background-color: #fafafa !important; } + +.grey-text.text-lighten-5 { + color: #fafafa !important; } + +.grey.lighten-4 { + background-color: #f5f5f5 !important; } + +.grey-text.text-lighten-4 { + color: #f5f5f5 !important; } + +.grey.lighten-3 { + background-color: #eeeeee !important; } + +.grey-text.text-lighten-3 { + color: #eeeeee !important; } + +.grey.lighten-2 { + background-color: #e0e0e0 !important; } + +.grey-text.text-lighten-2 { + color: #e0e0e0 !important; } + +.grey.lighten-1 { + background-color: #bdbdbd !important; } + +.grey-text.text-lighten-1 { + color: #bdbdbd !important; } + +.grey.darken-1 { + background-color: #757575 !important; } + +.grey-text.text-darken-1 { + color: #757575 !important; } + +.grey.darken-2 { + background-color: #616161 !important; } + +.grey-text.text-darken-2 { + color: #616161 !important; } + +.grey.darken-3 { + background-color: #424242 !important; } + +.grey-text.text-darken-3 { + color: #424242 !important; } + +.grey.darken-4 { + background-color: #212121 !important; } + +.grey-text.text-darken-4 { + color: #212121 !important; } + +.black { + background-color: #000000 !important; } + +.black-text { + color: #000000 !important; } + +.white { + background-color: #FFFFFF !important; } + +.white-text { + color: #FFFFFF !important; } + +.transparent { + background-color: transparent !important; } + +.transparent-text { + color: transparent !important; } + +/*! normalize.css v7.0.0 | MIT License | github.com/necolas/normalize.css */ +/* Document + ========================================================================== */ +/** + * 1. Correct the line height in all browsers. + * 2. Prevent adjustments of font size after orientation changes in + * IE on Windows Phone and in iOS. + */ +html { + line-height: 1.15; + /* 1 */ + -ms-text-size-adjust: 100%; + /* 2 */ + -webkit-text-size-adjust: 100%; + /* 2 */ } + +/* Sections + ========================================================================== */ +/** + * Remove the margin in all browsers (opinionated). + */ +body { + margin: 0; } + +/** + * Add the correct display in IE 9-. + */ +article, +aside, +footer, +header, +nav, +section { + display: block; } + +/** + * Correct the font size and margin on `h1` elements within `section` and + * `article` contexts in Chrome, Firefox, and Safari. + */ +h1 { + font-size: 2em; + margin: 0.67em 0; } + +/* Grouping content + ========================================================================== */ +/** + * Add the correct display in IE 9-. + * 1. Add the correct display in IE. + */ +figcaption, +figure, +main { + /* 1 */ + display: block; } + +/** + * Add the correct margin in IE 8. + */ +figure { + margin: 1em 40px; } + +/** + * 1. Add the correct box sizing in Firefox. + * 2. Show the overflow in Edge and IE. + */ +hr { + box-sizing: content-box; + /* 1 */ + height: 0; + /* 1 */ + overflow: visible; + /* 2 */ } + +/** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ +pre { + font-family: monospace, monospace; + /* 1 */ + font-size: 1em; + /* 2 */ } + +/* Text-level semantics + ========================================================================== */ +/** + * 1. Remove the gray background on active links in IE 10. + * 2. Remove gaps in links underline in iOS 8+ and Safari 8+. + */ +a { + background-color: transparent; + /* 1 */ + -webkit-text-decoration-skip: objects; + /* 2 */ } + +/** + * 1. Remove the bottom border in Chrome 57- and Firefox 39-. + * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari. + */ +abbr[title] { + border-bottom: none; + /* 1 */ + text-decoration: underline; + /* 2 */ + text-decoration: underline dotted; + /* 2 */ } + +/** + * Prevent the duplicate application of `bolder` by the next rule in Safari 6. + */ +b, +strong { + font-weight: inherit; } + +/** + * Add the correct font weight in Chrome, Edge, and Safari. + */ +b, +strong { + font-weight: bolder; } + +/** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ +code, +kbd, +samp { + font-family: monospace, monospace; + /* 1 */ + font-size: 1em; + /* 2 */ } + +/** + * Add the correct font style in Android 4.3-. + */ +dfn { + font-style: italic; } + +/** + * Add the correct background and color in IE 9-. + */ +mark { + background-color: #ff0; + color: #000; } + +/** + * Add the correct font size in all browsers. + */ +small { + font-size: 80%; } + +/** + * Prevent `sub` and `sup` elements from affecting the line height in + * all browsers. + */ +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; } + +sub { + bottom: -0.25em; } + +sup { + top: -0.5em; } + +/* Embedded content + ========================================================================== */ +/** + * Add the correct display in IE 9-. + */ +audio, +video { + display: inline-block; } + +/** + * Add the correct display in iOS 4-7. + */ +audio:not([controls]) { + display: none; + height: 0; } + +/** + * Remove the border on images inside links in IE 10-. + */ +img { + border-style: none; } + +/** + * Hide the overflow in IE. + */ +svg:not(:root) { + overflow: hidden; } + +/* Forms + ========================================================================== */ +/** + * 1. Change the font styles in all browsers (opinionated). + * 2. Remove the margin in Firefox and Safari. + */ +button, +input, +optgroup, +select, +textarea { + font-family: sans-serif; + /* 1 */ + font-size: 100%; + /* 1 */ + line-height: 1.15; + /* 1 */ + margin: 0; + /* 2 */ } + +/** + * Show the overflow in IE. + * 1. Show the overflow in Edge. + */ +button, +input { + /* 1 */ + overflow: visible; } + +/** + * Remove the inheritance of text transform in Edge, Firefox, and IE. + * 1. Remove the inheritance of text transform in Firefox. + */ +button, +select { + /* 1 */ + text-transform: none; } + +/** + * 1. Prevent a WebKit bug where (2) destroys native `audio` and `video` + * controls in Android 4. + * 2. Correct the inability to style clickable types in iOS and Safari. + */ +button, +html [type="button"], +[type="reset"], +[type="submit"] { + -webkit-appearance: button; + /* 2 */ } + +/** + * Remove the inner border and padding in Firefox. + */ +button::-moz-focus-inner, +[type="button"]::-moz-focus-inner, +[type="reset"]::-moz-focus-inner, +[type="submit"]::-moz-focus-inner { + border-style: none; + padding: 0; } + +/** + * Restore the focus styles unset by the previous rule. + */ +button:-moz-focusring, +[type="button"]:-moz-focusring, +[type="reset"]:-moz-focusring, +[type="submit"]:-moz-focusring { + outline: 1px dotted ButtonText; } + +/** + * Correct the padding in Firefox. + */ +fieldset { + padding: 0.35em 0.75em 0.625em; } + +/** + * 1. Correct the text wrapping in Edge and IE. + * 2. Correct the color inheritance from `fieldset` elements in IE. + * 3. Remove the padding so developers are not caught out when they zero out + * `fieldset` elements in all browsers. + */ +legend { + box-sizing: border-box; + /* 1 */ + color: inherit; + /* 2 */ + display: table; + /* 1 */ + max-width: 100%; + /* 1 */ + padding: 0; + /* 3 */ + white-space: normal; + /* 1 */ } + +/** + * 1. Add the correct display in IE 9-. + * 2. Add the correct vertical alignment in Chrome, Firefox, and Opera. + */ +progress { + display: inline-block; + /* 1 */ + vertical-align: baseline; + /* 2 */ } + +/** + * Remove the default vertical scrollbar in IE. + */ +textarea { + overflow: auto; } + +/** + * 1. Add the correct box sizing in IE 10-. + * 2. Remove the padding in IE 10-. + */ +[type="checkbox"], +[type="radio"] { + box-sizing: border-box; + /* 1 */ + padding: 0; + /* 2 */ } + +/** + * Correct the cursor style of increment and decrement buttons in Chrome. + */ +[type="number"]::-webkit-inner-spin-button, +[type="number"]::-webkit-outer-spin-button { + height: auto; } + +/** + * 1. Correct the odd appearance in Chrome and Safari. + * 2. Correct the outline style in Safari. + */ +[type="search"] { + -webkit-appearance: textfield; + /* 1 */ + outline-offset: -2px; + /* 2 */ } + +/** + * Remove the inner padding and cancel buttons in Chrome and Safari on macOS. + */ +[type="search"]::-webkit-search-cancel-button, +[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; } + +/** + * 1. Correct the inability to style clickable types in iOS and Safari. + * 2. Change font properties to `inherit` in Safari. + */ +::-webkit-file-upload-button { + -webkit-appearance: button; + /* 1 */ + font: inherit; + /* 2 */ } + +/* Interactive + ========================================================================== */ +/* + * Add the correct display in IE 9-. + * 1. Add the correct display in Edge, IE, and Firefox. + */ +details, +menu { + display: block; } + +/* + * Add the correct display in all browsers. + */ +summary { + display: list-item; } + +/* Scripting + ========================================================================== */ +/** + * Add the correct display in IE 9-. + */ +canvas { + display: inline-block; } + +/** + * Add the correct display in IE. + */ +template { + display: none; } + +/* Hidden + ========================================================================== */ +/** + * Add the correct display in IE 10-. + */ +[hidden] { + display: none; } + +html { + box-sizing: border-box; } + +*, *:before, *:after { + box-sizing: inherit; } + +button, +input, +optgroup, +select, +textarea { + font-family: Seravek, Helvetica, Roboto, Arial, sans-serif; } + +ul:not(.browser-default) { + padding-left: 0; + list-style-type: none; } + ul:not(.browser-default) > li { + list-style-type: none; } + +a { + color: #336362; + text-decoration: none; + -webkit-tap-highlight-color: transparent; } + +.valign-wrapper { + display: flex; + align-items: center; } + +.clearfix { + clear: both; } + +.z-depth-0 { + box-shadow: none !important; } + +/* 2dp elevation modified*/ +.z-depth-1, nav, .card-panel, .card, .toast, .btn, .btn-large, .btn-small, .btn-floating, .dropdown-content, .collapsible, .sidenav { + box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.12), 0 1px 5px 0 rgba(0, 0, 0, 0.2); } + +.z-depth-1-half, .btn:hover, .btn-large:hover, .btn-small:hover, .btn-floating:hover { + box-shadow: 0 3px 3px 0 rgba(0, 0, 0, 0.14), 0 1px 7px 0 rgba(0, 0, 0, 0.12), 0 3px 1px -1px rgba(0, 0, 0, 0.2); } + +/* 6dp elevation modified*/ +.z-depth-2 { + box-shadow: 0 4px 5px 0 rgba(0, 0, 0, 0.14), 0 1px 10px 0 rgba(0, 0, 0, 0.12), 0 2px 4px -1px rgba(0, 0, 0, 0.3); } + +/* 12dp elevation modified*/ +.z-depth-3 { + box-shadow: 0 8px 17px 2px rgba(0, 0, 0, 0.14), 0 3px 14px 2px rgba(0, 0, 0, 0.12), 0 5px 5px -3px rgba(0, 0, 0, 0.2); } + +/* 16dp elevation */ +.z-depth-4 { + box-shadow: 0 16px 24px 2px rgba(0, 0, 0, 0.14), 0 6px 30px 5px rgba(0, 0, 0, 0.12), 0 8px 10px -7px rgba(0, 0, 0, 0.2); } + +/* 24dp elevation */ +.z-depth-5, .modal { + box-shadow: 0 24px 38px 3px rgba(0, 0, 0, 0.14), 0 9px 46px 8px rgba(0, 0, 0, 0.12), 0 11px 15px -7px rgba(0, 0, 0, 0.2); } + +.hoverable { + transition: box-shadow .25s; } + .hoverable:hover { + box-shadow: 0 8px 17px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19); } + +.divider { + height: 1px; + overflow: hidden; + background-color: #e0e0e0; } + +blockquote { + margin: 20px 0; + padding-left: 1.5rem; + border-left: 5px solid #B84000; } + +i { + line-height: inherit; } + i.left { + float: left; + margin-right: 15px; } + i.right { + float: right; + margin-left: 15px; } + i.tiny { + font-size: 1rem; } + i.small { + font-size: 2rem; } + i.medium { + font-size: 4rem; } + i.large { + font-size: 6rem; } + +img.responsive-img, +video.responsive-video { + max-width: 100%; + height: auto; } + +.pagination li { + display: inline-block; + border-radius: 2px; + text-align: center; + vertical-align: top; + height: 30px; } + .pagination li a { + color: #444; + display: inline-block; + font-size: 1.2rem; + padding: 0 10px; + line-height: 30px; } + .pagination li.active a { + color: #fff; } + .pagination li.active { + background-color: #B84000; } + .pagination li.disabled a { + cursor: default; + color: #999; } + .pagination li i { + font-size: 2rem; } +.pagination li.pages ul li { + display: inline-block; + float: none; } + +@media only screen and (max-width: 992px) { + .pagination { + width: 100%; } + .pagination li.prev, + .pagination li.next { + width: 10%; } + .pagination li.pages { + width: 80%; + overflow: hidden; + white-space: nowrap; } } +.breadcrumb { + font-size: 18px; + color: rgba(255, 255, 255, 0.7); } + .breadcrumb i, + .breadcrumb [class^="mdi-"], .breadcrumb [class*="mdi-"], + .breadcrumb i.material-icons { + display: inline-block; + float: left; + font-size: 24px; } + .breadcrumb:before { + content: '\E5CC'; + color: rgba(255, 255, 255, 0.7); + vertical-align: top; + display: inline-block; + font-family: 'Material Icons'; + font-weight: normal; + font-style: normal; + font-size: 25px; + margin: 0 10px 0 8px; + -webkit-font-smoothing: antialiased; } + .breadcrumb:first-child:before { + display: none; } + .breadcrumb:last-child { + color: #fff; } + +.parallax-container { + position: relative; + overflow: hidden; + height: 500px; } + .parallax-container .parallax { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + z-index: -1; } + .parallax-container .parallax img { + opacity: 0; + position: absolute; + left: 50%; + bottom: 0; + min-width: 100%; + min-height: 100%; + transform: translate3d(0, 0, 0); + transform: translateX(-50%); } + +.pin-top, .pin-bottom { + position: relative; } + +.pinned { + position: fixed !important; } + +/********************* + Transition Classes +**********************/ +ul.staggered-list li { + opacity: 0; } + +.fade-in { + opacity: 0; + transform-origin: 0 50%; } + +/********************* + Media Query Classes +**********************/ +@media only screen and (max-width: 600px) { + .hide-on-small-only, .hide-on-small-and-down { + display: none !important; } } + +@media only screen and (max-width: 992px) { + .hide-on-med-and-down { + display: none !important; } } + +@media only screen and (min-width: 601px) { + .hide-on-med-and-up { + display: none !important; } } + +@media only screen and (min-width: 600px) and (max-width: 992px) { + .hide-on-med-only { + display: none !important; } } + +@media only screen and (min-width: 993px) { + .hide-on-large-only { + display: none !important; } } + +@media only screen and (min-width: 1201px) { + .hide-on-extra-large-only { + display: none !important; } } + +@media only screen and (min-width: 1201px) { + .show-on-extra-large { + display: block !important; } } + +@media only screen and (min-width: 993px) { + .show-on-large { + display: block !important; } } + +@media only screen and (min-width: 600px) and (max-width: 992px) { + .show-on-medium { + display: block !important; } } + +@media only screen and (max-width: 600px) { + .show-on-small { + display: block !important; } } + +@media only screen and (min-width: 601px) { + .show-on-medium-and-up { + display: block !important; } } + +@media only screen and (max-width: 992px) { + .show-on-medium-and-down { + display: block !important; } } + +@media only screen and (max-width: 600px) { + .center-on-small-only { + text-align: center; } } + +.page-footer { + padding-top: 20px; + color: #fff; + background-color: #B84000; } + .page-footer .footer-copyright { + overflow: hidden; + min-height: 50px; + display: flex; + align-items: center; + justify-content: space-between; + padding: 10px 0px; + color: rgba(255, 255, 255, 0.8); + background-color: rgba(51, 51, 51, 0.08); } + +table, th, td { + border: none; } + +table { + width: 100%; + display: table; + border-collapse: collapse; + border-spacing: 0; } + table.striped tr { + border-bottom: none; } + table.striped > tbody > tr:nth-child(odd) { + background-color: rgba(242, 242, 242, 0.5); } + table.striped > tbody > tr > td { + border-radius: 0; } + table.highlight > tbody > tr { + transition: background-color .25s ease; } + table.highlight > tbody > tr:hover { + background-color: rgba(242, 242, 242, 0.5); } + table.centered thead tr th, table.centered tbody tr td { + text-align: center; } + +tr { + border-bottom: 1px solid rgba(0, 0, 0, 0.12); } + +td, th { + padding: 15px 5px; + display: table-cell; + text-align: left; + vertical-align: middle; + border-radius: 2px; } + +@media only screen and (max-width: 992px) { + table.responsive-table { + width: 100%; + border-collapse: collapse; + border-spacing: 0; + display: block; + position: relative; + /* sort out borders */ } + table.responsive-table td:empty:before { + content: '\00a0'; } + table.responsive-table th, + table.responsive-table td { + margin: 0; + vertical-align: top; } + table.responsive-table th { + text-align: left; } + table.responsive-table thead { + display: block; + float: left; } + table.responsive-table thead tr { + display: block; + padding: 0 10px 0 0; } + table.responsive-table thead tr th::before { + content: "\00a0"; } + table.responsive-table tbody { + display: block; + width: auto; + position: relative; + overflow-x: auto; + white-space: nowrap; } + table.responsive-table tbody tr { + display: inline-block; + vertical-align: top; } + table.responsive-table th { + display: block; + text-align: right; } + table.responsive-table td { + display: block; + min-height: 1.25em; + text-align: left; } + table.responsive-table tr { + border-bottom: none; + padding: 0 10px; } + table.responsive-table thead { + border: 0; + border-right: 1px solid rgba(0, 0, 0, 0.12); } } +.collection { + margin: 0.5rem 0 1rem 0; + border: 1px solid #e0e0e0; + border-radius: 2px; + overflow: hidden; + position: relative; } + .collection .collection-item { + background-color: #fff; + line-height: 1.5rem; + padding: 10px 20px; + margin: 0; + border-bottom: 1px solid #e0e0e0; } + .collection .collection-item.avatar { + min-height: 84px; + padding-left: 72px; + position: relative; } + .collection .collection-item.avatar:not(.circle-clipper) > .circle, + .collection .collection-item.avatar :not(.circle-clipper) > .circle { + position: absolute; + width: 42px; + height: 42px; + overflow: hidden; + left: 15px; + display: inline-block; + vertical-align: middle; } + .collection .collection-item.avatar i.circle { + font-size: 18px; + line-height: 42px; + color: #fff; + background-color: #999; + text-align: center; } + .collection .collection-item.avatar .title { + font-size: 16px; } + .collection .collection-item.avatar p { + margin: 0; } + .collection .collection-item.avatar .secondary-content { + position: absolute; + top: 16px; + right: 16px; } + .collection .collection-item:last-child { + border-bottom: none; } + .collection .collection-item.active { + background-color: #4D9999; + color: white; } + .collection .collection-item.active .secondary-content { + color: #fff; } + .collection a.collection-item { + display: block; + transition: .25s; + color: #4D9999; } + .collection a.collection-item:not(.active):hover { + background-color: #ddd; } + .collection.with-header .collection-header { + background-color: #fff; + border-bottom: 1px solid #e0e0e0; + padding: 10px 20px; } + .collection.with-header .collection-item { + padding-left: 30px; } + .collection.with-header .collection-item.avatar { + padding-left: 72px; } + +.secondary-content { + float: right; + color: #4D9999; } + +.collapsible .collection { + margin: 0; + border: none; } + +.video-container { + position: relative; + padding-bottom: 56.25%; + height: 0; + overflow: hidden; } + .video-container iframe, .video-container object, .video-container embed { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; } + +.progress { + position: relative; + height: 4px; + display: block; + width: 100%; + background-color: #cce6e6; + border-radius: 2px; + margin: 0.5rem 0 1rem 0; + overflow: hidden; } + .progress .determinate { + position: absolute; + top: 0; + left: 0; + bottom: 0; + background-color: #4D9999; + transition: width .3s linear; } + .progress .indeterminate { + background-color: #4D9999; } + .progress .indeterminate:before { + content: ''; + position: absolute; + background-color: inherit; + top: 0; + left: 0; + bottom: 0; + will-change: left, right; + animation: indeterminate 2.1s cubic-bezier(0.65, 0.815, 0.735, 0.395) infinite; } + .progress .indeterminate:after { + content: ''; + position: absolute; + background-color: inherit; + top: 0; + left: 0; + bottom: 0; + will-change: left, right; + animation: indeterminate-short 2.1s cubic-bezier(0.165, 0.84, 0.44, 1) infinite; + animation-delay: 1.15s; } + +@keyframes indeterminate { + 0% { + left: -35%; + right: 100%; } + 60% { + left: 100%; + right: -90%; } + 100% { + left: 100%; + right: -90%; } } +@keyframes indeterminate-short { + 0% { + left: -200%; + right: 100%; } + 60% { + left: 107%; + right: -8%; } + 100% { + left: 107%; + right: -8%; } } +/******************* + Utility Classes +*******************/ +.hide { + display: none !important; } + +.left-align { + text-align: left; } + +.right-align { + text-align: right; } + +.center, .center-align { + text-align: center; } + +.left { + float: left !important; } + +.right { + float: right !important; } + +.no-select, input[type=range], +input[type=range] + .thumb { + user-select: none; } + +.circle { + border-radius: 50%; } + +.center-block { + display: block; + margin-left: auto; + margin-right: auto; } + +.truncate { + display: block; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; } + +.no-padding { + padding: 0 !important; } + +span.badge { + min-width: 3rem; + padding: 0 6px; + margin-left: 14px; + text-align: center; + font-size: 1rem; + line-height: 22px; + height: 22px; + color: #757575; + float: right; + box-sizing: border-box; } + span.badge.new { + font-weight: 300; + font-size: 0.8rem; + color: #fff; + background-color: #4D9999; + border-radius: 2px; } + span.badge.new:after { + content: " new"; } + span.badge[data-badge-caption]::after { + content: " " attr(data-badge-caption); } + +nav ul a span.badge { + display: inline-block; + float: none; + margin-left: 4px; + line-height: 22px; + height: 22px; + -webkit-font-smoothing: auto; } + +.collection-item span.badge { + margin-top: calc(0.75rem - 11px); } + +.collapsible span.badge { + margin-left: auto; } + +.sidenav span.badge { + margin-top: calc(24px - 11px); } + +table span.badge { + display: inline-block; + float: none; + margin-left: auto; } + +/* This is needed for some mobile phones to display the Google Icon font properly */ +.material-icons { + text-rendering: optimizeLegibility; + font-feature-settings: 'liga'; } + +.container { + margin: 0 auto; + max-width: 1280px; + width: 90%; } + +@media only screen and (min-width: 601px) { + .container { + width: 85%; } } +@media only screen and (min-width: 993px) { + .container { + width: 70%; } } +.col .row { + margin-left: -0.75rem; + margin-right: -0.75rem; } + +.section { + padding-top: 1rem; + padding-bottom: 1rem; } + .section.no-pad { + padding: 0; } + .section.no-pad-bot { + padding-bottom: 0; } + .section.no-pad-top { + padding-top: 0; } + +.row { + margin-left: auto; + margin-right: auto; + margin-bottom: 20px; } + .row:after { + content: ""; + display: table; + clear: both; } + .row .col { + float: left; + box-sizing: border-box; + padding: 0 0.75rem; + min-height: 1px; } + .row .col[class*="push-"], .row .col[class*="pull-"] { + position: relative; } + .row .col.s1 { + width: 8.3333333333%; + margin-left: auto; + left: auto; + right: auto; } + .row .col.s2 { + width: 16.6666666667%; + margin-left: auto; + left: auto; + right: auto; } + .row .col.s3 { + width: 25%; + margin-left: auto; + left: auto; + right: auto; } + .row .col.s4 { + width: 33.3333333333%; + margin-left: auto; + left: auto; + right: auto; } + .row .col.s5 { + width: 41.6666666667%; + margin-left: auto; + left: auto; + right: auto; } + .row .col.s6 { + width: 50%; + margin-left: auto; + left: auto; + right: auto; } + .row .col.s7 { + width: 58.3333333333%; + margin-left: auto; + left: auto; + right: auto; } + .row .col.s8 { + width: 66.6666666667%; + margin-left: auto; + left: auto; + right: auto; } + .row .col.s9 { + width: 75%; + margin-left: auto; + left: auto; + right: auto; } + .row .col.s10 { + width: 83.3333333333%; + margin-left: auto; + left: auto; + right: auto; } + .row .col.s11 { + width: 91.6666666667%; + margin-left: auto; + left: auto; + right: auto; } + .row .col.s12 { + width: 100%; + margin-left: auto; + left: auto; + right: auto; } + .row .col.offset-s1 { + margin-left: 8.3333333333%; } + .row .col.pull-s1 { + right: 8.3333333333%; } + .row .col.push-s1 { + left: 8.3333333333%; } + .row .col.offset-s2 { + margin-left: 16.6666666667%; } + .row .col.pull-s2 { + right: 16.6666666667%; } + .row .col.push-s2 { + left: 16.6666666667%; } + .row .col.offset-s3 { + margin-left: 25%; } + .row .col.pull-s3 { + right: 25%; } + .row .col.push-s3 { + left: 25%; } + .row .col.offset-s4 { + margin-left: 33.3333333333%; } + .row .col.pull-s4 { + right: 33.3333333333%; } + .row .col.push-s4 { + left: 33.3333333333%; } + .row .col.offset-s5 { + margin-left: 41.6666666667%; } + .row .col.pull-s5 { + right: 41.6666666667%; } + .row .col.push-s5 { + left: 41.6666666667%; } + .row .col.offset-s6 { + margin-left: 50%; } + .row .col.pull-s6 { + right: 50%; } + .row .col.push-s6 { + left: 50%; } + .row .col.offset-s7 { + margin-left: 58.3333333333%; } + .row .col.pull-s7 { + right: 58.3333333333%; } + .row .col.push-s7 { + left: 58.3333333333%; } + .row .col.offset-s8 { + margin-left: 66.6666666667%; } + .row .col.pull-s8 { + right: 66.6666666667%; } + .row .col.push-s8 { + left: 66.6666666667%; } + .row .col.offset-s9 { + margin-left: 75%; } + .row .col.pull-s9 { + right: 75%; } + .row .col.push-s9 { + left: 75%; } + .row .col.offset-s10 { + margin-left: 83.3333333333%; } + .row .col.pull-s10 { + right: 83.3333333333%; } + .row .col.push-s10 { + left: 83.3333333333%; } + .row .col.offset-s11 { + margin-left: 91.6666666667%; } + .row .col.pull-s11 { + right: 91.6666666667%; } + .row .col.push-s11 { + left: 91.6666666667%; } + .row .col.offset-s12 { + margin-left: 100%; } + .row .col.pull-s12 { + right: 100%; } + .row .col.push-s12 { + left: 100%; } + @media only screen and (min-width: 601px) { + .row .col.m1 { + width: 8.3333333333%; + margin-left: auto; + left: auto; + right: auto; } + .row .col.m2 { + width: 16.6666666667%; + margin-left: auto; + left: auto; + right: auto; } + .row .col.m3 { + width: 25%; + margin-left: auto; + left: auto; + right: auto; } + .row .col.m4 { + width: 33.3333333333%; + margin-left: auto; + left: auto; + right: auto; } + .row .col.m5 { + width: 41.6666666667%; + margin-left: auto; + left: auto; + right: auto; } + .row .col.m6 { + width: 50%; + margin-left: auto; + left: auto; + right: auto; } + .row .col.m7 { + width: 58.3333333333%; + margin-left: auto; + left: auto; + right: auto; } + .row .col.m8 { + width: 66.6666666667%; + margin-left: auto; + left: auto; + right: auto; } + .row .col.m9 { + width: 75%; + margin-left: auto; + left: auto; + right: auto; } + .row .col.m10 { + width: 83.3333333333%; + margin-left: auto; + left: auto; + right: auto; } + .row .col.m11 { + width: 91.6666666667%; + margin-left: auto; + left: auto; + right: auto; } + .row .col.m12 { + width: 100%; + margin-left: auto; + left: auto; + right: auto; } + .row .col.offset-m1 { + margin-left: 8.3333333333%; } + .row .col.pull-m1 { + right: 8.3333333333%; } + .row .col.push-m1 { + left: 8.3333333333%; } + .row .col.offset-m2 { + margin-left: 16.6666666667%; } + .row .col.pull-m2 { + right: 16.6666666667%; } + .row .col.push-m2 { + left: 16.6666666667%; } + .row .col.offset-m3 { + margin-left: 25%; } + .row .col.pull-m3 { + right: 25%; } + .row .col.push-m3 { + left: 25%; } + .row .col.offset-m4 { + margin-left: 33.3333333333%; } + .row .col.pull-m4 { + right: 33.3333333333%; } + .row .col.push-m4 { + left: 33.3333333333%; } + .row .col.offset-m5 { + margin-left: 41.6666666667%; } + .row .col.pull-m5 { + right: 41.6666666667%; } + .row .col.push-m5 { + left: 41.6666666667%; } + .row .col.offset-m6 { + margin-left: 50%; } + .row .col.pull-m6 { + right: 50%; } + .row .col.push-m6 { + left: 50%; } + .row .col.offset-m7 { + margin-left: 58.3333333333%; } + .row .col.pull-m7 { + right: 58.3333333333%; } + .row .col.push-m7 { + left: 58.3333333333%; } + .row .col.offset-m8 { + margin-left: 66.6666666667%; } + .row .col.pull-m8 { + right: 66.6666666667%; } + .row .col.push-m8 { + left: 66.6666666667%; } + .row .col.offset-m9 { + margin-left: 75%; } + .row .col.pull-m9 { + right: 75%; } + .row .col.push-m9 { + left: 75%; } + .row .col.offset-m10 { + margin-left: 83.3333333333%; } + .row .col.pull-m10 { + right: 83.3333333333%; } + .row .col.push-m10 { + left: 83.3333333333%; } + .row .col.offset-m11 { + margin-left: 91.6666666667%; } + .row .col.pull-m11 { + right: 91.6666666667%; } + .row .col.push-m11 { + left: 91.6666666667%; } + .row .col.offset-m12 { + margin-left: 100%; } + .row .col.pull-m12 { + right: 100%; } + .row .col.push-m12 { + left: 100%; } } + @media only screen and (min-width: 993px) { + .row .col.l1 { + width: 8.3333333333%; + margin-left: auto; + left: auto; + right: auto; } + .row .col.l2 { + width: 16.6666666667%; + margin-left: auto; + left: auto; + right: auto; } + .row .col.l3 { + width: 25%; + margin-left: auto; + left: auto; + right: auto; } + .row .col.l4 { + width: 33.3333333333%; + margin-left: auto; + left: auto; + right: auto; } + .row .col.l5 { + width: 41.6666666667%; + margin-left: auto; + left: auto; + right: auto; } + .row .col.l6 { + width: 50%; + margin-left: auto; + left: auto; + right: auto; } + .row .col.l7 { + width: 58.3333333333%; + margin-left: auto; + left: auto; + right: auto; } + .row .col.l8 { + width: 66.6666666667%; + margin-left: auto; + left: auto; + right: auto; } + .row .col.l9 { + width: 75%; + margin-left: auto; + left: auto; + right: auto; } + .row .col.l10 { + width: 83.3333333333%; + margin-left: auto; + left: auto; + right: auto; } + .row .col.l11 { + width: 91.6666666667%; + margin-left: auto; + left: auto; + right: auto; } + .row .col.l12 { + width: 100%; + margin-left: auto; + left: auto; + right: auto; } + .row .col.offset-l1 { + margin-left: 8.3333333333%; } + .row .col.pull-l1 { + right: 8.3333333333%; } + .row .col.push-l1 { + left: 8.3333333333%; } + .row .col.offset-l2 { + margin-left: 16.6666666667%; } + .row .col.pull-l2 { + right: 16.6666666667%; } + .row .col.push-l2 { + left: 16.6666666667%; } + .row .col.offset-l3 { + margin-left: 25%; } + .row .col.pull-l3 { + right: 25%; } + .row .col.push-l3 { + left: 25%; } + .row .col.offset-l4 { + margin-left: 33.3333333333%; } + .row .col.pull-l4 { + right: 33.3333333333%; } + .row .col.push-l4 { + left: 33.3333333333%; } + .row .col.offset-l5 { + margin-left: 41.6666666667%; } + .row .col.pull-l5 { + right: 41.6666666667%; } + .row .col.push-l5 { + left: 41.6666666667%; } + .row .col.offset-l6 { + margin-left: 50%; } + .row .col.pull-l6 { + right: 50%; } + .row .col.push-l6 { + left: 50%; } + .row .col.offset-l7 { + margin-left: 58.3333333333%; } + .row .col.pull-l7 { + right: 58.3333333333%; } + .row .col.push-l7 { + left: 58.3333333333%; } + .row .col.offset-l8 { + margin-left: 66.6666666667%; } + .row .col.pull-l8 { + right: 66.6666666667%; } + .row .col.push-l8 { + left: 66.6666666667%; } + .row .col.offset-l9 { + margin-left: 75%; } + .row .col.pull-l9 { + right: 75%; } + .row .col.push-l9 { + left: 75%; } + .row .col.offset-l10 { + margin-left: 83.3333333333%; } + .row .col.pull-l10 { + right: 83.3333333333%; } + .row .col.push-l10 { + left: 83.3333333333%; } + .row .col.offset-l11 { + margin-left: 91.6666666667%; } + .row .col.pull-l11 { + right: 91.6666666667%; } + .row .col.push-l11 { + left: 91.6666666667%; } + .row .col.offset-l12 { + margin-left: 100%; } + .row .col.pull-l12 { + right: 100%; } + .row .col.push-l12 { + left: 100%; } } + @media only screen and (min-width: 1201px) { + .row .col.xl1 { + width: 8.3333333333%; + margin-left: auto; + left: auto; + right: auto; } + .row .col.xl2 { + width: 16.6666666667%; + margin-left: auto; + left: auto; + right: auto; } + .row .col.xl3 { + width: 25%; + margin-left: auto; + left: auto; + right: auto; } + .row .col.xl4 { + width: 33.3333333333%; + margin-left: auto; + left: auto; + right: auto; } + .row .col.xl5 { + width: 41.6666666667%; + margin-left: auto; + left: auto; + right: auto; } + .row .col.xl6 { + width: 50%; + margin-left: auto; + left: auto; + right: auto; } + .row .col.xl7 { + width: 58.3333333333%; + margin-left: auto; + left: auto; + right: auto; } + .row .col.xl8 { + width: 66.6666666667%; + margin-left: auto; + left: auto; + right: auto; } + .row .col.xl9 { + width: 75%; + margin-left: auto; + left: auto; + right: auto; } + .row .col.xl10 { + width: 83.3333333333%; + margin-left: auto; + left: auto; + right: auto; } + .row .col.xl11 { + width: 91.6666666667%; + margin-left: auto; + left: auto; + right: auto; } + .row .col.xl12 { + width: 100%; + margin-left: auto; + left: auto; + right: auto; } + .row .col.offset-xl1 { + margin-left: 8.3333333333%; } + .row .col.pull-xl1 { + right: 8.3333333333%; } + .row .col.push-xl1 { + left: 8.3333333333%; } + .row .col.offset-xl2 { + margin-left: 16.6666666667%; } + .row .col.pull-xl2 { + right: 16.6666666667%; } + .row .col.push-xl2 { + left: 16.6666666667%; } + .row .col.offset-xl3 { + margin-left: 25%; } + .row .col.pull-xl3 { + right: 25%; } + .row .col.push-xl3 { + left: 25%; } + .row .col.offset-xl4 { + margin-left: 33.3333333333%; } + .row .col.pull-xl4 { + right: 33.3333333333%; } + .row .col.push-xl4 { + left: 33.3333333333%; } + .row .col.offset-xl5 { + margin-left: 41.6666666667%; } + .row .col.pull-xl5 { + right: 41.6666666667%; } + .row .col.push-xl5 { + left: 41.6666666667%; } + .row .col.offset-xl6 { + margin-left: 50%; } + .row .col.pull-xl6 { + right: 50%; } + .row .col.push-xl6 { + left: 50%; } + .row .col.offset-xl7 { + margin-left: 58.3333333333%; } + .row .col.pull-xl7 { + right: 58.3333333333%; } + .row .col.push-xl7 { + left: 58.3333333333%; } + .row .col.offset-xl8 { + margin-left: 66.6666666667%; } + .row .col.pull-xl8 { + right: 66.6666666667%; } + .row .col.push-xl8 { + left: 66.6666666667%; } + .row .col.offset-xl9 { + margin-left: 75%; } + .row .col.pull-xl9 { + right: 75%; } + .row .col.push-xl9 { + left: 75%; } + .row .col.offset-xl10 { + margin-left: 83.3333333333%; } + .row .col.pull-xl10 { + right: 83.3333333333%; } + .row .col.push-xl10 { + left: 83.3333333333%; } + .row .col.offset-xl11 { + margin-left: 91.6666666667%; } + .row .col.pull-xl11 { + right: 91.6666666667%; } + .row .col.push-xl11 { + left: 91.6666666667%; } + .row .col.offset-xl12 { + margin-left: 100%; } + .row .col.pull-xl12 { + right: 100%; } + .row .col.push-xl12 { + left: 100%; } } + +nav { + color: #fff; + background-color: #B84000; + width: 100%; + height: 56px; + line-height: 56px; } + nav.nav-extended { + height: auto; } + nav.nav-extended .nav-wrapper { + min-height: 56px; + height: auto; } + nav.nav-extended .nav-content { + position: relative; + line-height: normal; } + nav a { + color: #fff; } + nav i, + nav [class^="mdi-"], nav [class*="mdi-"], + nav i.material-icons { + display: block; + font-size: 24px; + height: 56px; + line-height: 56px; } + nav .nav-wrapper { + position: relative; + height: 100%; } + @media only screen and (min-width: 993px) { + nav a.sidenav-trigger { + display: none; } } + nav .sidenav-trigger { + float: left; + position: relative; + z-index: 1; + height: 56px; + margin: 0 18px; } + nav .sidenav-trigger i { + height: 56px; + line-height: 56px; } + nav .brand-logo { + position: absolute; + color: #fff; + display: inline-block; + font-size: 2.1rem; + padding: 0; } + nav .brand-logo.center { + left: 50%; + transform: translateX(-50%); } + @media only screen and (max-width: 992px) { + nav .brand-logo { + left: 50%; + transform: translateX(-50%); } + nav .brand-logo.left, nav .brand-logo.right { + padding: 0; + transform: none; } + nav .brand-logo.left { + left: 0.5rem; } + nav .brand-logo.right { + right: 0.5rem; + left: auto; } } + nav .brand-logo.right { + right: 0.5rem; + padding: 0; } + nav .brand-logo i, + nav .brand-logo [class^="mdi-"], nav .brand-logo [class*="mdi-"], + nav .brand-logo i.material-icons { + float: left; + margin-right: 15px; } + nav .nav-title { + display: inline-block; + font-size: 32px; + padding: 28px 0; } + nav ul { + margin: 0; } + nav ul li { + transition: background-color .3s; + float: left; + padding: 0; } + nav ul li.active { + background-color: rgba(0, 0, 0, 0.1); } + nav ul a { + transition: background-color .3s; + font-size: 1rem; + color: #fff; + display: block; + padding: 0 15px; + cursor: pointer; } + nav ul a.btn, nav ul a.btn-large, nav ul a.btn-small, nav ul a.btn-large, nav ul a.btn-flat, nav ul a.btn-floating { + margin-top: -2px; + margin-left: 15px; + margin-right: 15px; } + nav ul a.btn > .material-icons, nav ul a.btn-large > .material-icons, nav ul a.btn-small > .material-icons, nav ul a.btn-large > .material-icons, nav ul a.btn-flat > .material-icons, nav ul a.btn-floating > .material-icons { + height: inherit; + line-height: inherit; } + nav ul a:hover { + background-color: rgba(0, 0, 0, 0.1); } + nav ul.left { + float: left; } + nav form { + height: 100%; } + nav .input-field { + margin: 0; + height: 100%; } + nav .input-field input { + height: 100%; + font-size: 1.2rem; + border: none; + padding-left: 2rem; } + nav .input-field input:focus, nav .input-field input[type=text]:valid, nav .input-field input[type=password]:valid, nav .input-field input[type=email]:valid, nav .input-field input[type=url]:valid, nav .input-field input[type=date]:valid { + border: none; + box-shadow: none; } + nav .input-field label { + top: 0; + left: 0; } + nav .input-field label i { + color: rgba(255, 255, 255, 0.7); + transition: color .3s; } + nav .input-field label.active i { + color: #fff; } + +.navbar-fixed { + position: relative; + height: 56px; + z-index: 997; } + .navbar-fixed nav { + position: fixed; } + +@media only screen and (min-width: 601px) { + nav.nav-extended .nav-wrapper { + min-height: 64px; } + + nav, nav .nav-wrapper i, nav a.sidenav-trigger, nav a.sidenav-trigger i { + height: 64px; + line-height: 64px; } + + .navbar-fixed { + height: 64px; } } +a { + text-decoration: none; } + +html { + line-height: 1.5; + font-family: Seravek, Helvetica, Roboto, Arial, sans-serif; + font-weight: normal; + color: rgba(0, 0, 0, 0.87); } + @media only screen and (min-width: 0) { + html { + font-size: 14px; } } + @media only screen and (min-width: 992px) { + html { + font-size: 14.5px; } } + @media only screen and (min-width: 1200px) { + html { + font-size: 15px; } } + +h1, h2, h3, h4, h5, h6 { + font-weight: 400; + line-height: 1.3; } + +h1 a, h2 a, h3 a, h4 a, h5 a, h6 a { + font-weight: inherit; } + +h1 { + font-size: 1.4em; + line-height: 110%; + margin: 0.9333333333em 0 0.56em 0; } + +h2 { + font-size: 1.2em; + line-height: 110%; + margin: 0.8em 0 0.48em 0; } + +h3 { + font-size: 1em; + line-height: 110%; + margin: 0.6666666667em 0 0.4em 0; } + +h4 { + font-size: 0.8em; + line-height: 110%; + margin: 0.5333333333em 0 0.32em 0; } + +h5 { + font-size: 0.8em; + line-height: 110%; + margin: 0.5333333333em 0 0.32em 0; } + +h6 { + font-size: 1.15rem; + line-height: 110%; + margin: 0.7666666667rem 0 0.46rem 0; } + +em { + font-style: italic; } + +strong { + font-weight: 500; } + +small { + font-size: 75%; } + +.light { + font-weight: 300; } + +.thin { + font-weight: 200; } + +@media only screen and (min-width: 360px) { + .flow-text { + font-size: 1.2rem; } } +@media only screen and (min-width: 390px) { + .flow-text { + font-size: 1.224rem; } } +@media only screen and (min-width: 420px) { + .flow-text { + font-size: 1.248rem; } } +@media only screen and (min-width: 450px) { + .flow-text { + font-size: 1.272rem; } } +@media only screen and (min-width: 480px) { + .flow-text { + font-size: 1.296rem; } } +@media only screen and (min-width: 510px) { + .flow-text { + font-size: 1.32rem; } } +@media only screen and (min-width: 540px) { + .flow-text { + font-size: 1.344rem; } } +@media only screen and (min-width: 570px) { + .flow-text { + font-size: 1.368rem; } } +@media only screen and (min-width: 600px) { + .flow-text { + font-size: 1.392rem; } } +@media only screen and (min-width: 630px) { + .flow-text { + font-size: 1.416rem; } } +@media only screen and (min-width: 660px) { + .flow-text { + font-size: 1.44rem; } } +@media only screen and (min-width: 690px) { + .flow-text { + font-size: 1.464rem; } } +@media only screen and (min-width: 720px) { + .flow-text { + font-size: 1.488rem; } } +@media only screen and (min-width: 750px) { + .flow-text { + font-size: 1.512rem; } } +@media only screen and (min-width: 780px) { + .flow-text { + font-size: 1.536rem; } } +@media only screen and (min-width: 810px) { + .flow-text { + font-size: 1.56rem; } } +@media only screen and (min-width: 840px) { + .flow-text { + font-size: 1.584rem; } } +@media only screen and (min-width: 870px) { + .flow-text { + font-size: 1.608rem; } } +@media only screen and (min-width: 900px) { + .flow-text { + font-size: 1.632rem; } } +@media only screen and (min-width: 930px) { + .flow-text { + font-size: 1.656rem; } } +@media only screen and (min-width: 960px) { + .flow-text { + font-size: 1.68rem; } } +@media only screen and (max-width: 360px) { + .flow-text { + font-size: 1.2rem; } } + +.scale-transition { + transition: transform 0.3s cubic-bezier(0.53, 0.01, 0.36, 1.63) !important; } + .scale-transition.scale-out { + transform: scale(0); + transition: transform .2s !important; } + .scale-transition.scale-in { + transform: scale(1); } + +.card-panel { + transition: box-shadow .25s; + padding: 24px; + margin: 0.5rem 0 1rem 0; + border-radius: 2px; + background-color: #fff; } + +.card { + position: relative; + margin: 0.5rem 0 1rem 0; + background-color: #fff; + transition: box-shadow .25s; + border-radius: 2px; } + .card .card-title { + font-size: 24px; + font-weight: 300; } + .card .card-title.activator { + cursor: pointer; } + .card.small, .card.medium, .card.large { + position: relative; } + .card.small .card-image, .card.medium .card-image, .card.large .card-image { + max-height: 60%; + overflow: hidden; } + .card.small .card-image + .card-content, .card.medium .card-image + .card-content, .card.large .card-image + .card-content { + max-height: 40%; } + .card.small .card-content, .card.medium .card-content, .card.large .card-content { + max-height: 100%; + overflow: hidden; } + .card.small .card-action, .card.medium .card-action, .card.large .card-action { + position: absolute; + bottom: 0; + left: 0; + right: 0; } + .card.small { + height: 300px; } + .card.medium { + height: 400px; } + .card.large { + height: 500px; } + .card.horizontal { + display: flex; } + .card.horizontal.small .card-image, .card.horizontal.medium .card-image, .card.horizontal.large .card-image { + height: 100%; + max-height: none; + overflow: visible; } + .card.horizontal.small .card-image img, .card.horizontal.medium .card-image img, .card.horizontal.large .card-image img { + height: 100%; } + .card.horizontal .card-image { + max-width: 50%; } + .card.horizontal .card-image img { + border-radius: 2px 0 0 2px; + max-width: 100%; + width: auto; } + .card.horizontal .card-stacked { + display: flex; + flex-direction: column; + flex: 1; + position: relative; } + .card.horizontal .card-stacked .card-content { + flex-grow: 1; } + .card.sticky-action .card-action { + z-index: 2; } + .card.sticky-action .card-reveal { + z-index: 1; + padding-bottom: 64px; } + .card .card-image { + position: relative; } + .card .card-image img { + display: block; + border-radius: 2px 2px 0 0; + position: relative; + left: 0; + right: 0; + top: 0; + bottom: 0; + width: 100%; } + .card .card-image .card-title { + color: #fff; + position: absolute; + bottom: 0; + left: 0; + max-width: 100%; + padding: 24px; } + .card .card-content { + padding: 24px; + border-radius: 0 0 2px 2px; } + .card .card-content p { + margin: 0; } + .card .card-content .card-title { + display: block; + line-height: 32px; + margin-bottom: 8px; } + .card .card-content .card-title i { + line-height: 32px; } + .card .card-action { + background-color: inherit; + border-top: 1px solid rgba(160, 160, 160, 0.2); + position: relative; + padding: 16px 24px; } + .card .card-action:last-child { + border-radius: 0 0 2px 2px; } + .card .card-action a:not(.btn):not(.btn-large):not(.btn-small):not(.btn-large):not(.btn-floating) { + color: #ffab40; + margin-right: 24px; + transition: color .3s ease; + text-transform: uppercase; } + .card .card-action a:not(.btn):not(.btn-large):not(.btn-small):not(.btn-large):not(.btn-floating):hover { + color: #ffd8a6; } + .card .card-reveal { + padding: 24px; + position: absolute; + background-color: #fff; + width: 100%; + overflow-y: auto; + left: 0; + top: 100%; + height: 100%; + z-index: 3; + display: none; } + .card .card-reveal .card-title { + cursor: pointer; + display: block; } + +#toast-container { + display: block; + position: fixed; + z-index: 10000; } + @media only screen and (max-width: 600px) { + #toast-container { + min-width: 100%; + bottom: 0%; } } + @media only screen and (min-width: 601px) and (max-width: 992px) { + #toast-container { + left: 5%; + bottom: 7%; + max-width: 90%; } } + @media only screen and (min-width: 993px) { + #toast-container { + top: 10%; + right: 7%; + max-width: 86%; } } + +.toast { + border-radius: 2px; + top: 35px; + width: auto; + margin-top: 10px; + position: relative; + max-width: 100%; + height: auto; + min-height: 48px; + line-height: 1.5em; + background-color: #323232; + padding: 10px 25px; + font-size: 1.1rem; + font-weight: 300; + color: #fff; + display: flex; + align-items: center; + justify-content: space-between; + cursor: default; } + .toast .toast-action { + color: #eeff41; + font-weight: 500; + margin-right: -25px; + margin-left: 3rem; } + .toast.rounded { + border-radius: 24px; } + @media only screen and (max-width: 600px) { + .toast { + width: 100%; + border-radius: 0; } } + +.tabs { + position: relative; + overflow-x: auto; + overflow-y: hidden; + height: 48px; + width: 100%; + background-color: #fff; + margin: 0 auto; + white-space: nowrap; } + .tabs.tabs-transparent { + background-color: transparent; } + .tabs.tabs-transparent .tab a, + .tabs.tabs-transparent .tab.disabled a, + .tabs.tabs-transparent .tab.disabled a:hover { + color: rgba(255, 255, 255, 0.7); } + .tabs.tabs-transparent .tab a:hover, + .tabs.tabs-transparent .tab a.active { + color: #fff; } + .tabs.tabs-transparent .indicator { + background-color: #fff; } + .tabs.tabs-fixed-width { + display: flex; } + .tabs.tabs-fixed-width .tab { + flex-grow: 1; } + .tabs .tab { + display: inline-block; + text-align: center; + line-height: 48px; + height: 48px; + padding: 0; + margin: 0; + text-transform: uppercase; } + .tabs .tab a { + color: rgba(184, 64, 0, 0.7); + display: block; + width: 100%; + height: 100%; + padding: 0 24px; + font-size: 14px; + text-overflow: ellipsis; + overflow: hidden; + transition: color .28s ease, background-color .28s ease; } + .tabs .tab a:focus, .tabs .tab a:focus.active { + background-color: rgba(255, 238, 230, 0.2); + outline: none; } + .tabs .tab a:hover, .tabs .tab a.active { + background-color: transparent; + color: #B84000; } + .tabs .tab.disabled a, .tabs .tab.disabled a:hover { + color: rgba(184, 64, 0, 0.4); + cursor: default; } + .tabs .indicator { + position: absolute; + bottom: 0; + height: 2px; + background-color: #ffeee6; + will-change: left, right; } + +@media only screen and (max-width: 992px) { + .tabs { + display: flex; } + .tabs .tab { + flex-grow: 1; } + .tabs .tab a { + padding: 0 12px; } } +.material-tooltip { + padding: 10px 8px; + font-size: 1rem; + z-index: 2000; + background-color: transparent; + border-radius: 2px; + color: #fff; + min-height: 36px; + line-height: 120%; + opacity: 0; + position: absolute; + text-align: center; + max-width: calc(100% - 4px); + overflow: hidden; + left: 0; + top: 0; + pointer-events: none; + visibility: hidden; + background-color: #323232; } + +.backdrop { + position: absolute; + opacity: 0; + height: 7px; + width: 14px; + border-radius: 0 0 50% 50%; + background-color: #323232; + z-index: -1; + transform-origin: 50% 0%; + visibility: hidden; } + +.btn, .btn-large, .btn-small, +.btn-flat { + border: none; + border-radius: 2px; + display: inline-block; + height: 36px; + line-height: 36px; + padding: 0 16px; + text-transform: uppercase; + vertical-align: middle; + -webkit-tap-highlight-color: transparent; } + +.btn.disabled, .disabled.btn-large, .disabled.btn-small, +.btn-floating.disabled, +.btn-large.disabled, +.btn-small.disabled, +.btn-flat.disabled, +.btn:disabled, +.btn-large:disabled, +.btn-small:disabled, +.btn-floating:disabled, +.btn-large:disabled, +.btn-small:disabled, +.btn-flat:disabled, +.btn[disabled], +[disabled].btn-large, +[disabled].btn-small, +.btn-floating[disabled], +.btn-large[disabled], +.btn-small[disabled], +.btn-flat[disabled] { + pointer-events: none; + background-color: #DFDFDF !important; + box-shadow: none; + color: #9F9F9F !important; + cursor: default; } + .btn.disabled:hover, .disabled.btn-large:hover, .disabled.btn-small:hover, + .btn-floating.disabled:hover, + .btn-large.disabled:hover, + .btn-small.disabled:hover, + .btn-flat.disabled:hover, + .btn:disabled:hover, + .btn-large:disabled:hover, + .btn-small:disabled:hover, + .btn-floating:disabled:hover, + .btn-large:disabled:hover, + .btn-small:disabled:hover, + .btn-flat:disabled:hover, + .btn[disabled]:hover, + [disabled].btn-large:hover, + [disabled].btn-small:hover, + .btn-floating[disabled]:hover, + .btn-large[disabled]:hover, + .btn-small[disabled]:hover, + .btn-flat[disabled]:hover { + background-color: #DFDFDF !important; + color: #9F9F9F !important; } + +.btn, .btn-large, .btn-small, +.btn-floating, +.btn-large, +.btn-small, +.btn-flat { + font-size: 14px; + outline: 0; } + .btn i, .btn-large i, .btn-small i, + .btn-floating i, + .btn-large i, + .btn-small i, + .btn-flat i { + font-size: 1.3rem; + line-height: inherit; } + +.btn:focus, .btn-large:focus, .btn-small:focus, +.btn-floating:focus { + background-color: #3c7777; } + +.btn, .btn-large, .btn-small { + text-decoration: none; + color: #fff; + background-color: #4D9999; + text-align: center; + letter-spacing: .5px; + transition: background-color .2s ease-out; + cursor: pointer; } + .btn:hover, .btn-large:hover, .btn-small:hover { + background-color: #56aaaa; } + +.btn-floating { + display: inline-block; + color: #fff; + position: relative; + overflow: hidden; + z-index: 1; + width: 40px; + height: 40px; + line-height: 40px; + padding: 0; + background-color: #4D9999; + border-radius: 50%; + transition: background-color .3s; + cursor: pointer; + vertical-align: middle; } + .btn-floating:hover { + background-color: #4D9999; } + .btn-floating:before { + border-radius: 0; } + .btn-floating.btn-large { + width: 56px; + height: 56px; + padding: 0; } + .btn-floating.btn-large.halfway-fab { + bottom: -28px; } + .btn-floating.btn-large i { + line-height: 56px; } + .btn-floating.btn-small { + width: 32.4px; + height: 32.4px; } + .btn-floating.btn-small.halfway-fab { + bottom: -16.2px; } + .btn-floating.btn-small i { + line-height: 32.4px; } + .btn-floating.halfway-fab { + position: absolute; + right: 24px; + bottom: -20px; } + .btn-floating.halfway-fab.left { + right: auto; + left: 24px; } + .btn-floating i { + width: inherit; + display: inline-block; + text-align: center; + color: #fff; + font-size: 1.6rem; + line-height: 40px; } + +button.btn-floating { + border: none; } + +.fixed-action-btn { + position: fixed; + right: 23px; + bottom: 23px; + padding-top: 15px; + margin-bottom: 0; + z-index: 997; } + .fixed-action-btn.active ul { + visibility: visible; } + .fixed-action-btn.direction-left, .fixed-action-btn.direction-right { + padding: 0 0 0 15px; } + .fixed-action-btn.direction-left ul, .fixed-action-btn.direction-right ul { + text-align: right; + right: 64px; + top: 50%; + transform: translateY(-50%); + height: 100%; + left: auto; + /*width 100% only goes to width of button container */ + width: 500px; } + .fixed-action-btn.direction-left ul li, .fixed-action-btn.direction-right ul li { + display: inline-block; + margin: 7.5px 15px 0 0; } + .fixed-action-btn.direction-right { + padding: 0 15px 0 0; } + .fixed-action-btn.direction-right ul { + text-align: left; + direction: rtl; + left: 64px; + right: auto; } + .fixed-action-btn.direction-right ul li { + margin: 7.5px 0 0 15px; } + .fixed-action-btn.direction-bottom { + padding: 0 0 15px 0; } + .fixed-action-btn.direction-bottom ul { + top: 64px; + bottom: auto; + display: flex; + flex-direction: column-reverse; } + .fixed-action-btn.direction-bottom ul li { + margin: 15px 0 0 0; } + .fixed-action-btn.toolbar { + padding: 0; + height: 56px; } + .fixed-action-btn.toolbar.active > a i { + opacity: 0; } + .fixed-action-btn.toolbar ul { + display: flex; + top: 0; + bottom: 0; + z-index: 1; } + .fixed-action-btn.toolbar ul li { + flex: 1; + display: inline-block; + margin: 0; + height: 100%; + transition: none; } + .fixed-action-btn.toolbar ul li a { + display: block; + overflow: hidden; + position: relative; + width: 100%; + height: 100%; + background-color: transparent; + box-shadow: none; + color: #fff; + line-height: 56px; + z-index: 1; } + .fixed-action-btn.toolbar ul li a i { + line-height: inherit; } + .fixed-action-btn ul { + left: 0; + right: 0; + text-align: center; + position: absolute; + bottom: 64px; + margin: 0; + visibility: hidden; } + .fixed-action-btn ul li { + margin-bottom: 15px; } + .fixed-action-btn ul a.btn-floating { + opacity: 0; } + .fixed-action-btn .fab-backdrop { + position: absolute; + top: 0; + left: 0; + z-index: -1; + width: 40px; + height: 40px; + background-color: #4D9999; + border-radius: 50%; + transform: scale(0); } + +.btn-flat { + box-shadow: none; + background-color: transparent; + color: #343434; + cursor: pointer; + transition: background-color .2s; } + .btn-flat:focus, .btn-flat:hover { + box-shadow: none; } + .btn-flat:focus { + background-color: rgba(0, 0, 0, 0.1); } + .btn-flat.disabled, .btn-flat.btn-flat[disabled] { + background-color: transparent !important; + color: #b3b3b3 !important; + cursor: default; } + +.btn-large { + height: 54px; + line-height: 54px; + font-size: 15px; + padding: 0 28px; } + .btn-large i { + font-size: 1.6rem; } + +.btn-small { + height: 32.4px; + line-height: 32.4px; + font-size: 13px; } + .btn-small i { + font-size: 1.2rem; } + +.btn-block { + display: block; } + +.dropdown-content { + background-color: #fff; + margin: 0; + display: none; + min-width: 100px; + overflow-y: auto; + opacity: 0; + position: absolute; + left: 0; + top: 0; + z-index: 9999; + transform-origin: 0 0; } + .dropdown-content:focus { + outline: 0; } + .dropdown-content li { + clear: both; + color: rgba(0, 0, 0, 0.87); + cursor: pointer; + min-height: 50px; + line-height: 1.5rem; + width: 100%; + text-align: left; } + .dropdown-content li:hover, .dropdown-content li.active { + background-color: #eee; } + .dropdown-content li:focus { + outline: none; } + .dropdown-content li.divider { + min-height: 0; + height: 1px; } + .dropdown-content li > a, .dropdown-content li > span { + font-size: 16px; + color: #4D9999; + display: block; + line-height: 22px; + padding: 14px 16px; } + .dropdown-content li > span > label { + top: 1px; + left: 0; + height: 18px; } + .dropdown-content li > a > i { + height: inherit; + line-height: inherit; + float: left; + margin: 0 24px 0 0; + width: 24px; } + +body.keyboard-focused .dropdown-content li:focus { + background-color: #dadada; } + +.input-field.col .dropdown-content [type="checkbox"] + label { + top: 1px; + left: 0; + height: 18px; + transform: none; } + +.dropdown-trigger { + cursor: pointer; } + +/*! + * Waves v0.6.0 + * http://fian.my.id/Waves + * + * Copyright 2014 Alfiana E. Sibuea and other contributors + * Released under the MIT license + * https://github.com/fians/Waves/blob/master/LICENSE + */ +.waves-effect { + position: relative; + cursor: pointer; + display: inline-block; + overflow: hidden; + user-select: none; + -webkit-tap-highlight-color: transparent; + vertical-align: middle; + z-index: 1; + transition: .3s ease-out; } + .waves-effect .waves-ripple { + position: absolute; + border-radius: 50%; + width: 20px; + height: 20px; + margin-top: -10px; + margin-left: -10px; + opacity: 0; + background: rgba(0, 0, 0, 0.2); + transition: all 0.7s ease-out; + transition-property: transform, opacity; + transform: scale(0); + pointer-events: none; } + .waves-effect.waves-light .waves-ripple { + background-color: rgba(255, 255, 255, 0.45); } + .waves-effect.waves-red .waves-ripple { + background-color: rgba(244, 67, 54, 0.7); } + .waves-effect.waves-yellow .waves-ripple { + background-color: rgba(255, 235, 59, 0.7); } + .waves-effect.waves-orange .waves-ripple { + background-color: rgba(255, 152, 0, 0.7); } + .waves-effect.waves-purple .waves-ripple { + background-color: rgba(156, 39, 176, 0.7); } + .waves-effect.waves-green .waves-ripple { + background-color: rgba(76, 175, 80, 0.7); } + .waves-effect.waves-teal .waves-ripple { + background-color: rgba(0, 150, 136, 0.7); } + .waves-effect input[type="button"], .waves-effect input[type="reset"], .waves-effect input[type="submit"] { + border: 0; + font-style: normal; + font-size: inherit; + text-transform: inherit; + background: none; } + .waves-effect img { + position: relative; + z-index: -1; } + +.waves-notransition { + transition: none !important; } + +.waves-circle { + transform: translateZ(0); + -webkit-mask-image: -webkit-radial-gradient(circle, white 100%, black 100%); } + +.waves-input-wrapper { + border-radius: 0.2em; + vertical-align: bottom; } + .waves-input-wrapper .waves-button-input { + position: relative; + top: 0; + left: 0; + z-index: 1; } + +.waves-circle { + text-align: center; + width: 2.5em; + height: 2.5em; + line-height: 2.5em; + border-radius: 50%; + -webkit-mask-image: none; } + +.waves-block { + display: block; } + +/* Firefox Bug: link not triggered */ +.waves-effect .waves-ripple { + z-index: -1; } + +.modal { + display: none; + position: fixed; + left: 0; + right: 0; + background-color: #fafafa; + padding: 0; + max-height: 70%; + width: 55%; + margin: auto; + overflow-y: auto; + border-radius: 2px; + will-change: top, opacity; } + .modal:focus { + outline: none; } + @media only screen and (max-width: 992px) { + .modal { + width: 80%; } } + .modal h1, .modal h2, .modal h3, .modal h4 { + margin-top: 0; } + .modal .modal-content { + padding: 24px; } + .modal .modal-close { + cursor: pointer; } + .modal .modal-footer { + border-radius: 0 0 2px 2px; + background-color: #fafafa; + padding: 4px 6px; + height: 56px; + width: 100%; + text-align: right; } + .modal .modal-footer .btn, .modal .modal-footer .btn-large, .modal .modal-footer .btn-small, .modal .modal-footer .btn-flat { + margin: 6px 0; } + +.modal-overlay { + position: fixed; + z-index: 999; + top: -25%; + left: 0; + bottom: 0; + right: 0; + height: 125%; + width: 100%; + background: #000; + display: none; + will-change: opacity; } + +.modal.modal-fixed-footer { + padding: 0; + height: 70%; } + .modal.modal-fixed-footer .modal-content { + position: absolute; + height: calc(100% - 56px); + max-height: 100%; + width: 100%; + overflow-y: auto; } + .modal.modal-fixed-footer .modal-footer { + border-top: 1px solid rgba(0, 0, 0, 0.1); + position: absolute; + bottom: 0; } + +.modal.bottom-sheet { + top: auto; + bottom: -100%; + margin: 0; + width: 100%; + max-height: 45%; + border-radius: 0; + will-change: bottom, opacity; } + +.collapsible { + border-top: 1px solid #ddd; + border-right: 1px solid #ddd; + border-left: 1px solid #ddd; + margin: 0.5rem 0 1rem 0; } + +.collapsible-header { + display: flex; + cursor: pointer; + -webkit-tap-highlight-color: transparent; + line-height: 1.5; + padding: 1rem; + background-color: #fff; + border-bottom: 1px solid #ddd; } + .collapsible-header:focus { + outline: 0; } + .collapsible-header i { + width: 2rem; + font-size: 1.6rem; + display: inline-block; + text-align: center; + margin-right: 1rem; } + +.keyboard-focused .collapsible-header:focus { + background-color: #eee; } + +.collapsible-body { + display: none; + border-bottom: 1px solid #ddd; + box-sizing: border-box; + padding: 2rem; } + +.sidenav .collapsible, +.sidenav.fixed .collapsible { + border: none; + box-shadow: none; } + .sidenav .collapsible li, + .sidenav.fixed .collapsible li { + padding: 0; } +.sidenav .collapsible-header, +.sidenav.fixed .collapsible-header { + background-color: transparent; + border: none; + line-height: inherit; + height: inherit; + padding: 0 16px; } + .sidenav .collapsible-header:hover, + .sidenav.fixed .collapsible-header:hover { + background-color: rgba(0, 0, 0, 0.05); } + .sidenav .collapsible-header i, + .sidenav.fixed .collapsible-header i { + line-height: inherit; } +.sidenav .collapsible-body, +.sidenav.fixed .collapsible-body { + border: 0; + background-color: #fff; } + .sidenav .collapsible-body li a, + .sidenav.fixed .collapsible-body li a { + padding: 0 23.5px 0 31px; } + +.collapsible.popout { + border: none; + box-shadow: none; } + .collapsible.popout > li { + box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.16), 0 2px 10px 0 rgba(0, 0, 0, 0.12); + margin: 0 24px; + transition: margin 0.35s cubic-bezier(0.25, 0.46, 0.45, 0.94); } + .collapsible.popout > li.active { + box-shadow: 0 5px 11px 0 rgba(0, 0, 0, 0.18), 0 4px 15px 0 rgba(0, 0, 0, 0.15); + margin: 16px 0; } + +.chip { + display: inline-block; + height: 32px; + font-size: 13px; + font-weight: 500; + color: rgba(0, 0, 0, 0.6); + line-height: 32px; + padding: 0 12px; + border-radius: 16px; + background-color: #e4e4e4; + margin-bottom: 5px; + margin-right: 5px; } + .chip:focus { + outline: none; + background-color: #26a69a; + color: #fff; } + .chip > img { + float: left; + margin: 0 8px 0 -12px; + height: 32px; + width: 32px; + border-radius: 50%; } + .chip .close { + cursor: pointer; + float: right; + font-size: 16px; + line-height: 32px; + padding-left: 8px; } + +.chips { + border: none; + border-bottom: 1px solid #9e9e9e; + box-shadow: none; + margin: 0 0 8px 0; + min-height: 45px; + outline: none; + transition: all .3s; } + .chips.focus { + border-bottom: 1px solid #26a69a; + box-shadow: 0 1px 0 0 #26a69a; } + .chips:hover { + cursor: text; } + .chips .input { + background: none; + border: 0; + color: rgba(0, 0, 0, 0.6); + display: inline-block; + font-size: 16px; + height: 3rem; + line-height: 32px; + outline: 0; + margin: 0; + padding: 0 !important; + width: 120px !important; } + .chips .input:focus { + border: 0 !important; + box-shadow: none !important; } + .chips .autocomplete-content { + margin-top: 0; + margin-bottom: 0; } + +.prefix ~ .chips { + margin-left: 3rem; + width: 92%; + width: calc(100% - 3rem); } + +.chips:empty ~ label { + font-size: 0.8rem; + transform: translateY(-140%); } + +.materialboxed { + display: block; + cursor: zoom-in; + position: relative; + transition: opacity .4s; + -webkit-backface-visibility: hidden; } + .materialboxed:hover:not(.active) { + opacity: .8; } + .materialboxed.active { + cursor: zoom-out; } + +#materialbox-overlay { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + background-color: #292929; + z-index: 1000; + will-change: opacity; } + +.materialbox-caption { + position: fixed; + display: none; + color: #fff; + line-height: 50px; + bottom: 0; + left: 0; + width: 100%; + text-align: center; + padding: 0% 15%; + height: 50px; + z-index: 1000; + -webkit-font-smoothing: antialiased; } + +select:focus { + outline: 1px solid #e4f2f2; } + +button:focus { + outline: none; + background-color: #54a7a7; } + +label { + font-size: 0.8rem; + color: #9e9e9e; } + +/* Text Inputs + Textarea + ========================================================================== */ +/* Style Placeholders */ +::placeholder { + color: #d1d1d1; } + +/* Text inputs */ +input:not([type]), +input[type=text]:not(.browser-default), +input[type=password]:not(.browser-default), +input[type=email]:not(.browser-default), +input[type=url]:not(.browser-default), +input[type=time]:not(.browser-default), +input[type=date]:not(.browser-default), +input[type=datetime]:not(.browser-default), +input[type=datetime-local]:not(.browser-default), +input[type=tel]:not(.browser-default), +input[type=number]:not(.browser-default), +input[type=search]:not(.browser-default), +textarea.materialize-textarea { + background-color: transparent; + border: none; + border-bottom: 1px solid #9e9e9e; + border-radius: 0; + outline: none; + height: 3rem; + width: 100%; + font-size: 16px; + margin: 0 0 8px 0; + padding: 0; + box-shadow: none; + box-sizing: content-box; + transition: box-shadow .3s, border .3s; } + input:not([type]):disabled, input:not([type])[readonly="readonly"], + input[type=text]:not(.browser-default):disabled, + input[type=text]:not(.browser-default)[readonly="readonly"], + input[type=password]:not(.browser-default):disabled, + input[type=password]:not(.browser-default)[readonly="readonly"], + input[type=email]:not(.browser-default):disabled, + input[type=email]:not(.browser-default)[readonly="readonly"], + input[type=url]:not(.browser-default):disabled, + input[type=url]:not(.browser-default)[readonly="readonly"], + input[type=time]:not(.browser-default):disabled, + input[type=time]:not(.browser-default)[readonly="readonly"], + input[type=date]:not(.browser-default):disabled, + input[type=date]:not(.browser-default)[readonly="readonly"], + input[type=datetime]:not(.browser-default):disabled, + input[type=datetime]:not(.browser-default)[readonly="readonly"], + input[type=datetime-local]:not(.browser-default):disabled, + input[type=datetime-local]:not(.browser-default)[readonly="readonly"], + input[type=tel]:not(.browser-default):disabled, + input[type=tel]:not(.browser-default)[readonly="readonly"], + input[type=number]:not(.browser-default):disabled, + input[type=number]:not(.browser-default)[readonly="readonly"], + input[type=search]:not(.browser-default):disabled, + input[type=search]:not(.browser-default)[readonly="readonly"], + textarea.materialize-textarea:disabled, + textarea.materialize-textarea[readonly="readonly"] { + color: rgba(0, 0, 0, 0.42); + border-bottom: 1px dotted rgba(0, 0, 0, 0.42); } + input:not([type]):disabled + label, input:not([type])[readonly="readonly"] + label, + input[type=text]:not(.browser-default):disabled + label, + input[type=text]:not(.browser-default)[readonly="readonly"] + label, + input[type=password]:not(.browser-default):disabled + label, + input[type=password]:not(.browser-default)[readonly="readonly"] + label, + input[type=email]:not(.browser-default):disabled + label, + input[type=email]:not(.browser-default)[readonly="readonly"] + label, + input[type=url]:not(.browser-default):disabled + label, + input[type=url]:not(.browser-default)[readonly="readonly"] + label, + input[type=time]:not(.browser-default):disabled + label, + input[type=time]:not(.browser-default)[readonly="readonly"] + label, + input[type=date]:not(.browser-default):disabled + label, + input[type=date]:not(.browser-default)[readonly="readonly"] + label, + input[type=datetime]:not(.browser-default):disabled + label, + input[type=datetime]:not(.browser-default)[readonly="readonly"] + label, + input[type=datetime-local]:not(.browser-default):disabled + label, + input[type=datetime-local]:not(.browser-default)[readonly="readonly"] + label, + input[type=tel]:not(.browser-default):disabled + label, + input[type=tel]:not(.browser-default)[readonly="readonly"] + label, + input[type=number]:not(.browser-default):disabled + label, + input[type=number]:not(.browser-default)[readonly="readonly"] + label, + input[type=search]:not(.browser-default):disabled + label, + input[type=search]:not(.browser-default)[readonly="readonly"] + label, + textarea.materialize-textarea:disabled + label, + textarea.materialize-textarea[readonly="readonly"] + label { + color: rgba(0, 0, 0, 0.42); } + input:not([type]):focus:not([readonly]), + input[type=text]:not(.browser-default):focus:not([readonly]), + input[type=password]:not(.browser-default):focus:not([readonly]), + input[type=email]:not(.browser-default):focus:not([readonly]), + input[type=url]:not(.browser-default):focus:not([readonly]), + input[type=time]:not(.browser-default):focus:not([readonly]), + input[type=date]:not(.browser-default):focus:not([readonly]), + input[type=datetime]:not(.browser-default):focus:not([readonly]), + input[type=datetime-local]:not(.browser-default):focus:not([readonly]), + input[type=tel]:not(.browser-default):focus:not([readonly]), + input[type=number]:not(.browser-default):focus:not([readonly]), + input[type=search]:not(.browser-default):focus:not([readonly]), + textarea.materialize-textarea:focus:not([readonly]) { + border-bottom: 1px solid #4D9999; + box-shadow: 0 1px 0 0 #4D9999; } + input:not([type]):focus:not([readonly]) + label, + input[type=text]:not(.browser-default):focus:not([readonly]) + label, + input[type=password]:not(.browser-default):focus:not([readonly]) + label, + input[type=email]:not(.browser-default):focus:not([readonly]) + label, + input[type=url]:not(.browser-default):focus:not([readonly]) + label, + input[type=time]:not(.browser-default):focus:not([readonly]) + label, + input[type=date]:not(.browser-default):focus:not([readonly]) + label, + input[type=datetime]:not(.browser-default):focus:not([readonly]) + label, + input[type=datetime-local]:not(.browser-default):focus:not([readonly]) + label, + input[type=tel]:not(.browser-default):focus:not([readonly]) + label, + input[type=number]:not(.browser-default):focus:not([readonly]) + label, + input[type=search]:not(.browser-default):focus:not([readonly]) + label, + textarea.materialize-textarea:focus:not([readonly]) + label { + color: #4D9999; } + input:not([type]):focus.valid ~ label, + input[type=text]:not(.browser-default):focus.valid ~ label, + input[type=password]:not(.browser-default):focus.valid ~ label, + input[type=email]:not(.browser-default):focus.valid ~ label, + input[type=url]:not(.browser-default):focus.valid ~ label, + input[type=time]:not(.browser-default):focus.valid ~ label, + input[type=date]:not(.browser-default):focus.valid ~ label, + input[type=datetime]:not(.browser-default):focus.valid ~ label, + input[type=datetime-local]:not(.browser-default):focus.valid ~ label, + input[type=tel]:not(.browser-default):focus.valid ~ label, + input[type=number]:not(.browser-default):focus.valid ~ label, + input[type=search]:not(.browser-default):focus.valid ~ label, + textarea.materialize-textarea:focus.valid ~ label { + color: #26A96C; } + input:not([type]):focus.invalid ~ label, + input[type=text]:not(.browser-default):focus.invalid ~ label, + input[type=password]:not(.browser-default):focus.invalid ~ label, + input[type=email]:not(.browser-default):focus.invalid ~ label, + input[type=url]:not(.browser-default):focus.invalid ~ label, + input[type=time]:not(.browser-default):focus.invalid ~ label, + input[type=date]:not(.browser-default):focus.invalid ~ label, + input[type=datetime]:not(.browser-default):focus.invalid ~ label, + input[type=datetime-local]:not(.browser-default):focus.invalid ~ label, + input[type=tel]:not(.browser-default):focus.invalid ~ label, + input[type=number]:not(.browser-default):focus.invalid ~ label, + input[type=search]:not(.browser-default):focus.invalid ~ label, + textarea.materialize-textarea:focus.invalid ~ label { + color: #F44336; } + input:not([type]).validate + label, + input[type=text]:not(.browser-default).validate + label, + input[type=password]:not(.browser-default).validate + label, + input[type=email]:not(.browser-default).validate + label, + input[type=url]:not(.browser-default).validate + label, + input[type=time]:not(.browser-default).validate + label, + input[type=date]:not(.browser-default).validate + label, + input[type=datetime]:not(.browser-default).validate + label, + input[type=datetime-local]:not(.browser-default).validate + label, + input[type=tel]:not(.browser-default).validate + label, + input[type=number]:not(.browser-default).validate + label, + input[type=search]:not(.browser-default).validate + label, + textarea.materialize-textarea.validate + label { + width: 100%; } + +/* Validation Sass Placeholders */ +input.valid:not([type]), input.valid:not([type]):focus, +input[type=text].valid:not(.browser-default), +input[type=text].valid:not(.browser-default):focus, +input[type=password].valid:not(.browser-default), +input[type=password].valid:not(.browser-default):focus, +input[type=email].valid:not(.browser-default), +input[type=email].valid:not(.browser-default):focus, +input[type=url].valid:not(.browser-default), +input[type=url].valid:not(.browser-default):focus, +input[type=time].valid:not(.browser-default), +input[type=time].valid:not(.browser-default):focus, +input[type=date].valid:not(.browser-default), +input[type=date].valid:not(.browser-default):focus, +input[type=datetime].valid:not(.browser-default), +input[type=datetime].valid:not(.browser-default):focus, +input[type=datetime-local].valid:not(.browser-default), +input[type=datetime-local].valid:not(.browser-default):focus, +input[type=tel].valid:not(.browser-default), +input[type=tel].valid:not(.browser-default):focus, +input[type=number].valid:not(.browser-default), +input[type=number].valid:not(.browser-default):focus, +input[type=search].valid:not(.browser-default), +input[type=search].valid:not(.browser-default):focus, +textarea.materialize-textarea.valid, +textarea.materialize-textarea.valid:focus, .select-wrapper.valid > input.select-dropdown { + border-bottom: 1px solid #26A96C; + box-shadow: 0 1px 0 0 #26A96C; } + +input.invalid:not([type]), input.invalid:not([type]):focus, +input[type=text].invalid:not(.browser-default), +input[type=text].invalid:not(.browser-default):focus, +input[type=password].invalid:not(.browser-default), +input[type=password].invalid:not(.browser-default):focus, +input[type=email].invalid:not(.browser-default), +input[type=email].invalid:not(.browser-default):focus, +input[type=url].invalid:not(.browser-default), +input[type=url].invalid:not(.browser-default):focus, +input[type=time].invalid:not(.browser-default), +input[type=time].invalid:not(.browser-default):focus, +input[type=date].invalid:not(.browser-default), +input[type=date].invalid:not(.browser-default):focus, +input[type=datetime].invalid:not(.browser-default), +input[type=datetime].invalid:not(.browser-default):focus, +input[type=datetime-local].invalid:not(.browser-default), +input[type=datetime-local].invalid:not(.browser-default):focus, +input[type=tel].invalid:not(.browser-default), +input[type=tel].invalid:not(.browser-default):focus, +input[type=number].invalid:not(.browser-default), +input[type=number].invalid:not(.browser-default):focus, +input[type=search].invalid:not(.browser-default), +input[type=search].invalid:not(.browser-default):focus, +textarea.materialize-textarea.invalid, +textarea.materialize-textarea.invalid:focus, .select-wrapper.invalid > input.select-dropdown, .select-wrapper.invalid > input.select-dropdown:focus { + border-bottom: 1px solid #F44336; + box-shadow: 0 1px 0 0 #F44336; } + +input:not([type]).valid ~ .helper-text[data-success], input:not([type]):focus.valid ~ .helper-text[data-success], input:not([type]).invalid ~ .helper-text[data-error], input:not([type]):focus.invalid ~ .helper-text[data-error], +input[type=text]:not(.browser-default).valid ~ .helper-text[data-success], +input[type=text]:not(.browser-default):focus.valid ~ .helper-text[data-success], +input[type=text]:not(.browser-default).invalid ~ .helper-text[data-error], +input[type=text]:not(.browser-default):focus.invalid ~ .helper-text[data-error], +input[type=password]:not(.browser-default).valid ~ .helper-text[data-success], +input[type=password]:not(.browser-default):focus.valid ~ .helper-text[data-success], +input[type=password]:not(.browser-default).invalid ~ .helper-text[data-error], +input[type=password]:not(.browser-default):focus.invalid ~ .helper-text[data-error], +input[type=email]:not(.browser-default).valid ~ .helper-text[data-success], +input[type=email]:not(.browser-default):focus.valid ~ .helper-text[data-success], +input[type=email]:not(.browser-default).invalid ~ .helper-text[data-error], +input[type=email]:not(.browser-default):focus.invalid ~ .helper-text[data-error], +input[type=url]:not(.browser-default).valid ~ .helper-text[data-success], +input[type=url]:not(.browser-default):focus.valid ~ .helper-text[data-success], +input[type=url]:not(.browser-default).invalid ~ .helper-text[data-error], +input[type=url]:not(.browser-default):focus.invalid ~ .helper-text[data-error], +input[type=time]:not(.browser-default).valid ~ .helper-text[data-success], +input[type=time]:not(.browser-default):focus.valid ~ .helper-text[data-success], +input[type=time]:not(.browser-default).invalid ~ .helper-text[data-error], +input[type=time]:not(.browser-default):focus.invalid ~ .helper-text[data-error], +input[type=date]:not(.browser-default).valid ~ .helper-text[data-success], +input[type=date]:not(.browser-default):focus.valid ~ .helper-text[data-success], +input[type=date]:not(.browser-default).invalid ~ .helper-text[data-error], +input[type=date]:not(.browser-default):focus.invalid ~ .helper-text[data-error], +input[type=datetime]:not(.browser-default).valid ~ .helper-text[data-success], +input[type=datetime]:not(.browser-default):focus.valid ~ .helper-text[data-success], +input[type=datetime]:not(.browser-default).invalid ~ .helper-text[data-error], +input[type=datetime]:not(.browser-default):focus.invalid ~ .helper-text[data-error], +input[type=datetime-local]:not(.browser-default).valid ~ .helper-text[data-success], +input[type=datetime-local]:not(.browser-default):focus.valid ~ .helper-text[data-success], +input[type=datetime-local]:not(.browser-default).invalid ~ .helper-text[data-error], +input[type=datetime-local]:not(.browser-default):focus.invalid ~ .helper-text[data-error], +input[type=tel]:not(.browser-default).valid ~ .helper-text[data-success], +input[type=tel]:not(.browser-default):focus.valid ~ .helper-text[data-success], +input[type=tel]:not(.browser-default).invalid ~ .helper-text[data-error], +input[type=tel]:not(.browser-default):focus.invalid ~ .helper-text[data-error], +input[type=number]:not(.browser-default).valid ~ .helper-text[data-success], +input[type=number]:not(.browser-default):focus.valid ~ .helper-text[data-success], +input[type=number]:not(.browser-default).invalid ~ .helper-text[data-error], +input[type=number]:not(.browser-default):focus.invalid ~ .helper-text[data-error], +input[type=search]:not(.browser-default).valid ~ .helper-text[data-success], +input[type=search]:not(.browser-default):focus.valid ~ .helper-text[data-success], +input[type=search]:not(.browser-default).invalid ~ .helper-text[data-error], +input[type=search]:not(.browser-default):focus.invalid ~ .helper-text[data-error], +textarea.materialize-textarea.valid ~ .helper-text[data-success], +textarea.materialize-textarea:focus.valid ~ .helper-text[data-success], +textarea.materialize-textarea.invalid ~ .helper-text[data-error], +textarea.materialize-textarea:focus.invalid ~ .helper-text[data-error], .select-wrapper.valid .helper-text[data-success], .select-wrapper.invalid ~ .helper-text[data-error] { + color: transparent; + user-select: none; + pointer-events: none; } + +input:not([type]).valid ~ .helper-text:after, input:not([type]):focus.valid ~ .helper-text:after, +input[type=text]:not(.browser-default).valid ~ .helper-text:after, +input[type=text]:not(.browser-default):focus.valid ~ .helper-text:after, +input[type=password]:not(.browser-default).valid ~ .helper-text:after, +input[type=password]:not(.browser-default):focus.valid ~ .helper-text:after, +input[type=email]:not(.browser-default).valid ~ .helper-text:after, +input[type=email]:not(.browser-default):focus.valid ~ .helper-text:after, +input[type=url]:not(.browser-default).valid ~ .helper-text:after, +input[type=url]:not(.browser-default):focus.valid ~ .helper-text:after, +input[type=time]:not(.browser-default).valid ~ .helper-text:after, +input[type=time]:not(.browser-default):focus.valid ~ .helper-text:after, +input[type=date]:not(.browser-default).valid ~ .helper-text:after, +input[type=date]:not(.browser-default):focus.valid ~ .helper-text:after, +input[type=datetime]:not(.browser-default).valid ~ .helper-text:after, +input[type=datetime]:not(.browser-default):focus.valid ~ .helper-text:after, +input[type=datetime-local]:not(.browser-default).valid ~ .helper-text:after, +input[type=datetime-local]:not(.browser-default):focus.valid ~ .helper-text:after, +input[type=tel]:not(.browser-default).valid ~ .helper-text:after, +input[type=tel]:not(.browser-default):focus.valid ~ .helper-text:after, +input[type=number]:not(.browser-default).valid ~ .helper-text:after, +input[type=number]:not(.browser-default):focus.valid ~ .helper-text:after, +input[type=search]:not(.browser-default).valid ~ .helper-text:after, +input[type=search]:not(.browser-default):focus.valid ~ .helper-text:after, +textarea.materialize-textarea.valid ~ .helper-text:after, +textarea.materialize-textarea:focus.valid ~ .helper-text:after, .select-wrapper.valid ~ .helper-text:after { + content: attr(data-success); + color: #26A96C; } + +input:not([type]).invalid ~ .helper-text:after, input:not([type]):focus.invalid ~ .helper-text:after, +input[type=text]:not(.browser-default).invalid ~ .helper-text:after, +input[type=text]:not(.browser-default):focus.invalid ~ .helper-text:after, +input[type=password]:not(.browser-default).invalid ~ .helper-text:after, +input[type=password]:not(.browser-default):focus.invalid ~ .helper-text:after, +input[type=email]:not(.browser-default).invalid ~ .helper-text:after, +input[type=email]:not(.browser-default):focus.invalid ~ .helper-text:after, +input[type=url]:not(.browser-default).invalid ~ .helper-text:after, +input[type=url]:not(.browser-default):focus.invalid ~ .helper-text:after, +input[type=time]:not(.browser-default).invalid ~ .helper-text:after, +input[type=time]:not(.browser-default):focus.invalid ~ .helper-text:after, +input[type=date]:not(.browser-default).invalid ~ .helper-text:after, +input[type=date]:not(.browser-default):focus.invalid ~ .helper-text:after, +input[type=datetime]:not(.browser-default).invalid ~ .helper-text:after, +input[type=datetime]:not(.browser-default):focus.invalid ~ .helper-text:after, +input[type=datetime-local]:not(.browser-default).invalid ~ .helper-text:after, +input[type=datetime-local]:not(.browser-default):focus.invalid ~ .helper-text:after, +input[type=tel]:not(.browser-default).invalid ~ .helper-text:after, +input[type=tel]:not(.browser-default):focus.invalid ~ .helper-text:after, +input[type=number]:not(.browser-default).invalid ~ .helper-text:after, +input[type=number]:not(.browser-default):focus.invalid ~ .helper-text:after, +input[type=search]:not(.browser-default).invalid ~ .helper-text:after, +input[type=search]:not(.browser-default):focus.invalid ~ .helper-text:after, +textarea.materialize-textarea.invalid ~ .helper-text:after, +textarea.materialize-textarea:focus.invalid ~ .helper-text:after, .select-wrapper.invalid ~ .helper-text:after { + content: attr(data-error); + color: #F44336; } + +input:not([type]) + label:after, +input[type=text]:not(.browser-default) + label:after, +input[type=password]:not(.browser-default) + label:after, +input[type=email]:not(.browser-default) + label:after, +input[type=url]:not(.browser-default) + label:after, +input[type=time]:not(.browser-default) + label:after, +input[type=date]:not(.browser-default) + label:after, +input[type=datetime]:not(.browser-default) + label:after, +input[type=datetime-local]:not(.browser-default) + label:after, +input[type=tel]:not(.browser-default) + label:after, +input[type=number]:not(.browser-default) + label:after, +input[type=search]:not(.browser-default) + label:after, +textarea.materialize-textarea + label:after, .select-wrapper + label:after { + display: block; + content: ""; + position: absolute; + top: 100%; + left: 0; + opacity: 0; + transition: .2s opacity ease-out, .2s color ease-out; } + +.input-field { + position: relative; + margin-top: 1rem; + margin-bottom: 1rem; } + .input-field.inline { + display: inline-block; + vertical-align: middle; + margin-left: 5px; } + .input-field.inline input, + .input-field.inline .select-dropdown { + margin-bottom: 1rem; } + .input-field.col label { + left: 0.75rem; } + .input-field.col .prefix ~ label, + .input-field.col .prefix ~ .validate ~ label { + width: calc(100% - 3rem - 1.5rem); } + .input-field > label { + color: #9e9e9e; + position: absolute; + top: 0; + left: 0; + font-size: 1rem; + cursor: text; + transition: transform .2s ease-out, color .2s ease-out; + transform-origin: 0% 100%; + text-align: initial; + transform: translateY(12px); } + .input-field > label:not(.label-icon).active { + transform: translateY(-14px) scale(0.8); + transform-origin: 0 0; } + .input-field > input[type]:-webkit-autofill:not(.browser-default):not([type="search"]) + label, .input-field > input[type=date]:not(.browser-default) + label, .input-field > input[type=time]:not(.browser-default) + label { + transform: translateY(-14px) scale(0.8); + transform-origin: 0 0; } + .input-field .helper-text { + position: relative; + min-height: 18px; + display: block; + font-size: 12px; + color: rgba(0, 0, 0, 0.54); } + .input-field .helper-text::after { + opacity: 1; + position: absolute; + top: 0; + left: 0; } + .input-field .prefix { + position: absolute; + width: 3rem; + font-size: 2rem; + transition: color .2s; + top: 0.5rem; } + .input-field .prefix.active { + color: #4D9999; } + .input-field .prefix ~ input, + .input-field .prefix ~ textarea, + .input-field .prefix ~ label, + .input-field .prefix ~ .validate ~ label, + .input-field .prefix ~ .helper-text, + .input-field .prefix ~ .autocomplete-content { + margin-left: 3rem; + width: 92%; + width: calc(100% - 3rem); } + .input-field .prefix ~ label { + margin-left: 3rem; } + @media only screen and (max-width: 992px) { + .input-field .prefix ~ input { + width: 86%; + width: calc(100% - 3rem); } } + @media only screen and (max-width: 600px) { + .input-field .prefix ~ input { + width: 80%; + width: calc(100% - 3rem); } } + +/* Search Field */ +.input-field input[type=search] { + display: block; + line-height: inherit; + transition: .3s background-color; } + .nav-wrapper .input-field input[type=search] { + height: inherit; + padding-left: 4rem; + width: calc(100% - 4rem); + border: 0; + box-shadow: none; } + .input-field input[type=search]:focus:not(.browser-default) { + background-color: #fff; + border: 0; + box-shadow: none; + color: #444; } + .input-field input[type=search]:focus:not(.browser-default) + label i, .input-field input[type=search]:focus:not(.browser-default) ~ .mdi-navigation-close, .input-field input[type=search]:focus:not(.browser-default) ~ .material-icons { + color: #444; } + .input-field input[type=search] + .label-icon { + transform: none; + left: 1rem; } + .input-field input[type=search] ~ .mdi-navigation-close, .input-field input[type=search] ~ .material-icons { + position: absolute; + top: 0; + right: 1rem; + color: transparent; + cursor: pointer; + font-size: 2rem; + transition: .3s color; } + +/* Textarea */ +textarea { + width: 100%; + height: 3rem; + background-color: transparent; } + textarea.materialize-textarea { + line-height: normal; + overflow-y: hidden; + /* prevents scroll bar flash */ + padding: .8rem 0 .8rem 0; + /* prevents text jump on Enter keypress */ + resize: none; + min-height: 3rem; + box-sizing: border-box; } + +.hiddendiv { + visibility: hidden; + white-space: pre-wrap; + word-wrap: break-word; + overflow-wrap: break-word; + /* future version of deprecated 'word-wrap' */ + padding-top: 1.2rem; + /* prevents text jump on Enter keypress */ + position: absolute; + top: 0; + z-index: -1; } + +/* Autocomplete */ +.autocomplete-content li .highlight { + color: #444; } +.autocomplete-content li img { + height: 40px; + width: 40px; + margin: 5px 15px; } + +/* Character Counter */ +.character-counter { + min-height: 18px; } + +/* Radio Buttons + ========================================================================== */ +[type="radio"]:not(:checked), +[type="radio"]:checked { + position: absolute; + opacity: 0; + pointer-events: none; } + +[type="radio"]:not(:checked) + span, +[type="radio"]:checked + span { + position: relative; + padding-left: 35px; + cursor: pointer; + display: inline-block; + height: 25px; + line-height: 25px; + font-size: 1rem; + transition: .28s ease; + user-select: none; } + +[type="radio"] + span:before, +[type="radio"] + span:after { + content: ''; + position: absolute; + left: 0; + top: 0; + margin: 4px; + width: 16px; + height: 16px; + z-index: 0; + transition: .28s ease; } + +/* Unchecked styles */ +[type="radio"]:not(:checked) + span:before, +[type="radio"]:not(:checked) + span:after, +[type="radio"]:checked + span:before, +[type="radio"]:checked + span:after, +[type="radio"].with-gap:checked + span:before, +[type="radio"].with-gap:checked + span:after { + border-radius: 50%; } + +[type="radio"]:not(:checked) + span:before, +[type="radio"]:not(:checked) + span:after { + border: 2px solid #5a5a5a; } + +[type="radio"]:not(:checked) + span:after { + transform: scale(0); } + +/* Checked styles */ +[type="radio"]:checked + span:before { + border: 2px solid transparent; } + +[type="radio"]:checked + span:after, +[type="radio"].with-gap:checked + span:before, +[type="radio"].with-gap:checked + span:after { + border: 2px solid #4D9999; } + +[type="radio"]:checked + span:after, +[type="radio"].with-gap:checked + span:after { + background-color: #4D9999; } + +[type="radio"]:checked + span:after { + transform: scale(1.02); } + +/* Radio With gap */ +[type="radio"].with-gap:checked + span:after { + transform: scale(0.5); } + +/* Focused styles */ +[type="radio"].tabbed:focus + span:before { + box-shadow: 0 0 0 10px rgba(0, 0, 0, 0.1); } + +/* Disabled Radio With gap */ +[type="radio"].with-gap:disabled:checked + span:before { + border: 2px solid rgba(0, 0, 0, 0.42); } + +[type="radio"].with-gap:disabled:checked + span:after { + border: none; + background-color: rgba(0, 0, 0, 0.42); } + +/* Disabled style */ +[type="radio"]:disabled:not(:checked) + span:before, +[type="radio"]:disabled:checked + span:before { + background-color: transparent; + border-color: rgba(0, 0, 0, 0.42); } + +[type="radio"]:disabled + span { + color: rgba(0, 0, 0, 0.42); } + +[type="radio"]:disabled:not(:checked) + span:before { + border-color: rgba(0, 0, 0, 0.42); } + +[type="radio"]:disabled:checked + span:after { + background-color: rgba(0, 0, 0, 0.42); + border-color: #949494; } + +/* Checkboxes + ========================================================================== */ +/* Remove default checkbox */ +[type="checkbox"]:not(:checked), +[type="checkbox"]:checked { + position: absolute; + opacity: 0; + pointer-events: none; } + +[type="checkbox"] { + /* checkbox aspect */ } + [type="checkbox"] + span:not(.lever) { + position: relative; + padding-left: 35px; + cursor: pointer; + display: inline-block; + height: 25px; + line-height: 25px; + font-size: 1rem; + user-select: none; } + [type="checkbox"] + span:not(.lever):before, [type="checkbox"]:not(.filled-in) + span:not(.lever):after { + content: ''; + position: absolute; + top: 0; + left: 0; + width: 18px; + height: 18px; + z-index: 0; + border: 2px solid #5a5a5a; + border-radius: 1px; + margin-top: 3px; + transition: .2s; } + [type="checkbox"]:not(.filled-in) + span:not(.lever):after { + border: 0; + transform: scale(0); } + [type="checkbox"]:not(:checked):disabled + span:not(.lever):before { + border: none; + background-color: rgba(0, 0, 0, 0.42); } + [type="checkbox"].tabbed:focus + span:not(.lever):after { + transform: scale(1); + border: 0; + border-radius: 50%; + box-shadow: 0 0 0 10px rgba(0, 0, 0, 0.1); + background-color: rgba(0, 0, 0, 0.1); } + +[type="checkbox"]:checked + span:not(.lever):before { + top: -4px; + left: -5px; + width: 12px; + height: 22px; + border-top: 2px solid transparent; + border-left: 2px solid transparent; + border-right: 2px solid #4D9999; + border-bottom: 2px solid #4D9999; + transform: rotate(40deg); + backface-visibility: hidden; + transform-origin: 100% 100%; } +[type="checkbox"]:checked:disabled + span:before { + border-right: 2px solid rgba(0, 0, 0, 0.42); + border-bottom: 2px solid rgba(0, 0, 0, 0.42); } + +/* Indeterminate checkbox */ +[type="checkbox"]:indeterminate + span:not(.lever):before { + top: -11px; + left: -12px; + width: 10px; + height: 22px; + border-top: none; + border-left: none; + border-right: 2px solid #4D9999; + border-bottom: none; + transform: rotate(90deg); + backface-visibility: hidden; + transform-origin: 100% 100%; } +[type="checkbox"]:indeterminate:disabled + span:not(.lever):before { + border-right: 2px solid rgba(0, 0, 0, 0.42); + background-color: transparent; } + +[type="checkbox"].filled-in + span:not(.lever):after { + border-radius: 2px; } +[type="checkbox"].filled-in + span:not(.lever):before, +[type="checkbox"].filled-in + span:not(.lever):after { + content: ''; + left: 0; + position: absolute; + /* .1s delay is for check animation */ + transition: border .25s, background-color .25s, width .20s .1s, height .20s .1s, top .20s .1s, left .20s .1s; + z-index: 1; } +[type="checkbox"].filled-in:not(:checked) + span:not(.lever):before { + width: 0; + height: 0; + border: 3px solid transparent; + left: 6px; + top: 10px; + transform: rotateZ(37deg); + transform-origin: 100% 100%; } +[type="checkbox"].filled-in:not(:checked) + span:not(.lever):after { + height: 20px; + width: 20px; + background-color: transparent; + border: 2px solid #5a5a5a; + top: 0px; + z-index: 0; } +[type="checkbox"].filled-in:checked + span:not(.lever):before { + top: 0; + left: 1px; + width: 8px; + height: 13px; + border-top: 2px solid transparent; + border-left: 2px solid transparent; + border-right: 2px solid #fff; + border-bottom: 2px solid #fff; + transform: rotateZ(37deg); + transform-origin: 100% 100%; } +[type="checkbox"].filled-in:checked + span:not(.lever):after { + top: 0; + width: 20px; + height: 20px; + border: 2px solid #4D9999; + background-color: #4D9999; + z-index: 0; } +[type="checkbox"].filled-in.tabbed:focus + span:not(.lever):after { + border-radius: 2px; + border-color: #5a5a5a; + background-color: rgba(0, 0, 0, 0.1); } +[type="checkbox"].filled-in.tabbed:checked:focus + span:not(.lever):after { + border-radius: 2px; + background-color: #4D9999; + border-color: #4D9999; } +[type="checkbox"].filled-in:disabled:not(:checked) + span:not(.lever):before { + background-color: transparent; + border: 2px solid transparent; } +[type="checkbox"].filled-in:disabled:not(:checked) + span:not(.lever):after { + border-color: transparent; + background-color: #949494; } +[type="checkbox"].filled-in:disabled:checked + span:not(.lever):before { + background-color: transparent; } +[type="checkbox"].filled-in:disabled:checked + span:not(.lever):after { + background-color: #949494; + border-color: #949494; } + +/* Switch + ========================================================================== */ +.switch, +.switch * { + -webkit-tap-highlight-color: transparent; + user-select: none; } + +.switch label { + cursor: pointer; } + +.switch label input[type=checkbox] { + opacity: 0; + width: 0; + height: 0; } + .switch label input[type=checkbox]:checked + .lever { + background-color: #adb9b9; } + .switch label input[type=checkbox]:checked + .lever:before, .switch label input[type=checkbox]:checked + .lever:after { + left: 18px; } + .switch label input[type=checkbox]:checked + .lever:after { + background-color: #4D9999; } + +.switch label .lever { + content: ""; + display: inline-block; + position: relative; + width: 36px; + height: 14px; + background-color: rgba(0, 0, 0, 0.38); + border-radius: 15px; + margin-right: 10px; + transition: background 0.3s ease; + vertical-align: middle; + margin: 0 16px; } + .switch label .lever:before, .switch label .lever:after { + content: ""; + position: absolute; + display: inline-block; + width: 20px; + height: 20px; + border-radius: 50%; + left: 0; + top: -3px; + transition: left 0.3s ease, background .3s ease, box-shadow 0.1s ease, transform .1s ease; } + .switch label .lever:before { + background-color: rgba(77, 153, 153, 0.15); } + .switch label .lever:after { + background-color: #F1F1F1; + box-shadow: 0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12); } + +input[type=checkbox]:checked:not(:disabled) ~ .lever:active::before, +input[type=checkbox]:checked:not(:disabled).tabbed:focus ~ .lever::before { + transform: scale(2.4); + background-color: rgba(77, 153, 153, 0.15); } + +input[type=checkbox]:not(:disabled) ~ .lever:active:before, +input[type=checkbox]:not(:disabled).tabbed:focus ~ .lever::before { + transform: scale(2.4); + background-color: rgba(0, 0, 0, 0.08); } + +.switch input[type=checkbox][disabled] + .lever { + cursor: default; + background-color: rgba(0, 0, 0, 0.12); } + +.switch label input[type=checkbox][disabled] + .lever:after, +.switch label input[type=checkbox][disabled]:checked + .lever:after { + background-color: #949494; } + +/* Select Field + ========================================================================== */ +select { + display: none; } + +select.browser-default { + display: block; } + +select { + background-color: rgba(255, 255, 255, 0.9); + width: 100%; + padding: 5px; + border: 1px solid #f2f2f2; + border-radius: 2px; + height: 3rem; } + +.select-label { + position: absolute; } + +.select-wrapper { + position: relative; } + .select-wrapper.valid + label, .select-wrapper.invalid + label { + width: 100%; + pointer-events: none; } + .select-wrapper input.select-dropdown { + position: relative; + cursor: pointer; + background-color: transparent; + border: none; + border-bottom: 1px solid #9e9e9e; + outline: none; + height: 3rem; + line-height: 3rem; + width: 100%; + font-size: 16px; + margin: 0 0 8px 0; + padding: 0; + display: block; + user-select: none; + z-index: 1; } + .select-wrapper input.select-dropdown:focus { + border-bottom: 1px solid #4D9999; } + .select-wrapper .caret { + position: absolute; + right: 0; + top: 0; + bottom: 0; + margin: auto 0; + z-index: 0; + fill: rgba(0, 0, 0, 0.87); } + .select-wrapper + label { + position: absolute; + top: -26px; + font-size: 0.8rem; } + +select:disabled { + color: rgba(0, 0, 0, 0.42); } + +.select-wrapper.disabled + label { + color: rgba(0, 0, 0, 0.42); } +.select-wrapper.disabled .caret { + fill: rgba(0, 0, 0, 0.42); } + +.select-wrapper input.select-dropdown:disabled { + color: rgba(0, 0, 0, 0.42); + cursor: default; + user-select: none; } + +.select-wrapper i { + color: rgba(0, 0, 0, 0.3); } + +.select-dropdown li.disabled, +.select-dropdown li.disabled > span, +.select-dropdown li.optgroup { + color: rgba(0, 0, 0, 0.3); + background-color: transparent; } + +body.keyboard-focused .select-dropdown.dropdown-content li:focus { + background-color: rgba(0, 0, 0, 0.08); } + +.select-dropdown.dropdown-content li:hover { + background-color: rgba(0, 0, 0, 0.08); } +.select-dropdown.dropdown-content li.selected { + background-color: rgba(0, 0, 0, 0.03); } + +.prefix ~ .select-wrapper { + margin-left: 3rem; + width: 92%; + width: calc(100% - 3rem); } + +.prefix ~ label { + margin-left: 3rem; } + +.select-dropdown li img { + height: 40px; + width: 40px; + margin: 5px 15px; + float: right; } + +.select-dropdown li.optgroup { + border-top: 1px solid #eee; } + .select-dropdown li.optgroup.selected > span { + color: rgba(0, 0, 0, 0.7); } + .select-dropdown li.optgroup > span { + color: rgba(0, 0, 0, 0.4); } + .select-dropdown li.optgroup ~ li.optgroup-option { + padding-left: 1rem; } + +/* File Input + ========================================================================== */ +.file-field { + position: relative; } + .file-field .file-path-wrapper { + overflow: hidden; + padding-left: 10px; } + .file-field input.file-path { + width: 100%; } + .file-field .btn, .file-field .btn-large, .file-field .btn-small { + float: left; + height: 3rem; + line-height: 3rem; } + .file-field span { + cursor: pointer; } + .file-field input[type=file] { + position: absolute; + top: 0; + right: 0; + left: 0; + bottom: 0; + width: 100%; + margin: 0; + padding: 0; + font-size: 20px; + cursor: pointer; + opacity: 0; + filter: alpha(opacity=0); } + .file-field input[type=file]::-webkit-file-upload-button { + display: none; } + +/* Range + ========================================================================== */ +.range-field { + position: relative; } + +input[type=range], +input[type=range] + .thumb { + cursor: pointer; } + +input[type=range] { + position: relative; + background-color: transparent; + border: none; + outline: none; + width: 100%; + margin: 15px 0; + padding: 0; } + input[type=range]:focus { + outline: none; } + +input[type=range] + .thumb { + position: absolute; + top: 10px; + left: 0; + border: none; + height: 0; + width: 0; + border-radius: 50%; + background-color: #4D9999; + margin-left: 7px; + transform-origin: 50% 50%; + transform: rotate(-45deg); } + input[type=range] + .thumb .value { + display: block; + width: 30px; + text-align: center; + color: #4D9999; + font-size: 0; + transform: rotate(45deg); } + input[type=range] + .thumb.active { + border-radius: 50% 50% 50% 0; } + input[type=range] + .thumb.active .value { + color: #fff; + margin-left: -1px; + margin-top: 8px; + font-size: 10px; } + +input[type=range] { + -webkit-appearance: none; } + +input[type=range]::-webkit-slider-runnable-track { + height: 3px; + background: #c2c0c2; + border: none; } + +input[type=range]::-webkit-slider-thumb { + border: none; + height: 14px; + width: 14px; + border-radius: 50%; + background: #4D9999; + transition: box-shadow .3s; + -webkit-appearance: none; + background-color: #4D9999; + transform-origin: 50% 50%; + margin: -5px 0 0 0; } + +.keyboard-focused input[type=range]:focus:not(.active)::-webkit-slider-thumb { + box-shadow: 0 0 0 10px rgba(77, 153, 153, 0.26); } + +input[type=range] { + /* fix for FF unable to apply focus style bug */ + border: 1px solid white; + /*required for proper track sizing in FF*/ } + +input[type=range]::-moz-range-track { + height: 3px; + background: #c2c0c2; + border: none; } + +input[type=range]::-moz-focus-inner { + border: 0; } + +input[type=range]::-moz-range-thumb { + border: none; + height: 14px; + width: 14px; + border-radius: 50%; + background: #4D9999; + transition: box-shadow .3s; + margin-top: -5px; } + +input[type=range]:-moz-focusring { + outline: 1px solid #fff; + outline-offset: -1px; } + +.keyboard-focused input[type=range]:focus:not(.active)::-moz-range-thumb { + box-shadow: 0 0 0 10px rgba(77, 153, 153, 0.26); } + +input[type=range]::-ms-track { + height: 3px; + background: transparent; + border-color: transparent; + border-width: 6px 0; + /*remove default tick marks*/ + color: transparent; } + +input[type=range]::-ms-fill-lower { + background: #777; } + +input[type=range]::-ms-fill-upper { + background: #ddd; } + +input[type=range]::-ms-thumb { + border: none; + height: 14px; + width: 14px; + border-radius: 50%; + background: #4D9999; + transition: box-shadow .3s; } + +.keyboard-focused input[type=range]:focus:not(.active)::-ms-thumb { + box-shadow: 0 0 0 10px rgba(77, 153, 153, 0.26); } + +/*************** + Nav List +***************/ +.table-of-contents.fixed { + position: fixed; } +.table-of-contents li { + padding: 2px 0; } +.table-of-contents a { + display: inline-block; + font-weight: 300; + color: #757575; + padding-left: 16px; + height: 1.5rem; + line-height: 1.5rem; + letter-spacing: .4; + display: inline-block; } + .table-of-contents a:hover { + color: #a8a8a8; + padding-left: 15px; + border-left: 1px solid #B84000; } + .table-of-contents a.active { + font-weight: 500; + padding-left: 14px; + border-left: 2px solid #B84000; } + +.sidenav { + position: fixed; + width: 300px; + left: 0; + top: 0; + margin: 0; + transform: translateX(-100%); + height: 100%; + height: calc(100% + 60px); + height: -moz-calc(100%); + padding-bottom: 60px; + background-color: #fff; + z-index: 999; + overflow-y: auto; + will-change: transform; + backface-visibility: hidden; + transform: translateX(-105%); } + .sidenav.right-aligned { + right: 0; + transform: translateX(105%); + left: auto; + transform: translateX(100%); } + .sidenav .collapsible { + margin: 0; } + .sidenav li { + float: none; + line-height: 48px; } + .sidenav li.active { + background-color: rgba(0, 0, 0, 0.05); } + .sidenav li > a { + color: rgba(0, 0, 0, 0.87); + display: block; + font-size: 14px; + font-weight: 500; + height: 48px; + line-height: 48px; + padding: 0 32px; } + .sidenav li > a:hover { + background-color: rgba(0, 0, 0, 0.05); } + .sidenav li > a.btn, .sidenav li > a.btn-large, .sidenav li > a.btn-small, .sidenav li > a.btn-large, .sidenav li > a.btn-flat, .sidenav li > a.btn-floating { + margin: 10px 15px; } + .sidenav li > a.btn, .sidenav li > a.btn-large, .sidenav li > a.btn-small, .sidenav li > a.btn-large, .sidenav li > a.btn-floating { + color: #fff; } + .sidenav li > a.btn-flat { + color: #343434; } + .sidenav li > a.btn:hover, .sidenav li > a.btn-large:hover, .sidenav li > a.btn-small:hover, .sidenav li > a.btn-large:hover { + background-color: #56aaaa; } + .sidenav li > a.btn-floating:hover { + background-color: #4D9999; } + .sidenav li > a > i, .sidenav li > a > [class^="mdi-"], .sidenav li > a li > a > [class*="mdi-"], .sidenav li > a > i.material-icons { + float: left; + height: 48px; + line-height: 48px; + margin: 0 32px 0 0; + width: 24px; + color: rgba(0, 0, 0, 0.54); } + .sidenav .divider { + margin: 8px 0 0 0; } + .sidenav .subheader { + cursor: initial; + pointer-events: none; + color: rgba(0, 0, 0, 0.54); + font-size: 14px; + font-weight: 500; + line-height: 48px; } + .sidenav .subheader:hover { + background-color: transparent; } + .sidenav .user-view { + position: relative; + padding: 32px 32px 0; + margin-bottom: 8px; } + .sidenav .user-view > a { + height: auto; + padding: 0; } + .sidenav .user-view > a:hover { + background-color: transparent; } + .sidenav .user-view .background { + overflow: hidden; + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: -1; } + .sidenav .user-view .circle, .sidenav .user-view .name, .sidenav .user-view .email { + display: block; } + .sidenav .user-view .circle { + height: 64px; + width: 64px; } + .sidenav .user-view .name, + .sidenav .user-view .email { + font-size: 14px; + line-height: 24px; } + .sidenav .user-view .name { + margin-top: 16px; + font-weight: 500; } + .sidenav .user-view .email { + padding-bottom: 16px; + font-weight: 400; } + +.drag-target { + height: 100%; + width: 10px; + position: fixed; + top: 0; + z-index: 998; } + .drag-target.right-aligned { + right: 0; } + +.sidenav.sidenav-fixed { + left: 0; + transform: translateX(0); + position: fixed; } + .sidenav.sidenav-fixed.right-aligned { + right: 0; + left: auto; } + +@media only screen and (max-width: 992px) { + .sidenav.sidenav-fixed { + transform: translateX(-105%); } + .sidenav.sidenav-fixed.right-aligned { + transform: translateX(105%); } + .sidenav > a { + padding: 0 16px; } + .sidenav .user-view { + padding: 16px 16px 0; } } +.sidenav .collapsible-body > ul:not(.collapsible) > li.active, +.sidenav.sidenav-fixed .collapsible-body > ul:not(.collapsible) > li.active { + background-color: #B84000; } + .sidenav .collapsible-body > ul:not(.collapsible) > li.active a, + .sidenav.sidenav-fixed .collapsible-body > ul:not(.collapsible) > li.active a { + color: #fff; } + +.sidenav .collapsible-body { + padding: 0; } + +.sidenav-overlay { + position: fixed; + top: 0; + left: 0; + right: 0; + opacity: 0; + height: 120vh; + background-color: rgba(0, 0, 0, 0.5); + z-index: 997; + display: none; } + +/* + @license + Copyright (c) 2014 The Polymer Project Authors. All rights reserved. + This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt + The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt + The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt + Code distributed by Google as part of the polymer project is also + subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt + */ +/**************************/ +/* STYLES FOR THE SPINNER */ +/**************************/ +/* + * Constants: + * STROKEWIDTH = 3px + * ARCSIZE = 270 degrees (amount of circle the arc takes up) + * ARCTIME = 1333ms (time it takes to expand and contract arc) + * ARCSTARTROT = 216 degrees (how much the start location of the arc + * should rotate each time, 216 gives us a + * 5 pointed star shape (it's 360/5 * 3). + * For a 7 pointed star, we might do + * 360/7 * 3 = 154.286) + * CONTAINERWIDTH = 28px + * SHRINK_TIME = 400ms + */ +.preloader-wrapper { + display: inline-block; + position: relative; + width: 50px; + height: 50px; } + .preloader-wrapper.small { + width: 36px; + height: 36px; } + .preloader-wrapper.big { + width: 64px; + height: 64px; } + .preloader-wrapper.active { + /* duration: 360 * ARCTIME / (ARCSTARTROT + (360-ARCSIZE)) */ + -webkit-animation: container-rotate 1568ms linear infinite; + animation: container-rotate 1568ms linear infinite; } + +@-webkit-keyframes container-rotate { + to { + -webkit-transform: rotate(360deg); } } +@keyframes container-rotate { + to { + transform: rotate(360deg); } } +.spinner-layer { + position: absolute; + width: 100%; + height: 100%; + opacity: 0; + border-color: #4D9999; } + +.spinner-blue, +.spinner-blue-only { + border-color: #4285f4; } + +.spinner-red, +.spinner-red-only { + border-color: #db4437; } + +.spinner-yellow, +.spinner-yellow-only { + border-color: #f4b400; } + +.spinner-green, +.spinner-green-only { + border-color: #0f9d58; } + +/** + * IMPORTANT NOTE ABOUT CSS ANIMATION PROPERTIES (keanulee): + * + * iOS Safari (tested on iOS 8.1) does not handle animation-delay very well - it doesn't + * guarantee that the animation will start _exactly_ after that value. So we avoid using + * animation-delay and instead set custom keyframes for each color (as redundant as it + * seems). + * + * We write out each animation in full (instead of separating animation-name, + * animation-duration, etc.) because under the polyfill, Safari does not recognize those + * specific properties properly, treats them as -webkit-animation, and overrides the + * other animation rules. See https://github.com/Polymer/platform/issues/53. + */ +.active .spinner-layer.spinner-blue { + /* durations: 4 * ARCTIME */ + -webkit-animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, blue-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; + animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, blue-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; } + +.active .spinner-layer.spinner-red { + /* durations: 4 * ARCTIME */ + -webkit-animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, red-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; + animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, red-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; } + +.active .spinner-layer.spinner-yellow { + /* durations: 4 * ARCTIME */ + -webkit-animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, yellow-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; + animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, yellow-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; } + +.active .spinner-layer.spinner-green { + /* durations: 4 * ARCTIME */ + -webkit-animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, green-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; + animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, green-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; } + +.active .spinner-layer, +.active .spinner-layer.spinner-blue-only, +.active .spinner-layer.spinner-red-only, +.active .spinner-layer.spinner-yellow-only, +.active .spinner-layer.spinner-green-only { + /* durations: 4 * ARCTIME */ + opacity: 1; + -webkit-animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; + animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; } + +@-webkit-keyframes fill-unfill-rotate { + 12.5% { + -webkit-transform: rotate(135deg); } + /* 0.5 * ARCSIZE */ + 25% { + -webkit-transform: rotate(270deg); } + /* 1 * ARCSIZE */ + 37.5% { + -webkit-transform: rotate(405deg); } + /* 1.5 * ARCSIZE */ + 50% { + -webkit-transform: rotate(540deg); } + /* 2 * ARCSIZE */ + 62.5% { + -webkit-transform: rotate(675deg); } + /* 2.5 * ARCSIZE */ + 75% { + -webkit-transform: rotate(810deg); } + /* 3 * ARCSIZE */ + 87.5% { + -webkit-transform: rotate(945deg); } + /* 3.5 * ARCSIZE */ + to { + -webkit-transform: rotate(1080deg); } + /* 4 * ARCSIZE */ } +@keyframes fill-unfill-rotate { + 12.5% { + transform: rotate(135deg); } + /* 0.5 * ARCSIZE */ + 25% { + transform: rotate(270deg); } + /* 1 * ARCSIZE */ + 37.5% { + transform: rotate(405deg); } + /* 1.5 * ARCSIZE */ + 50% { + transform: rotate(540deg); } + /* 2 * ARCSIZE */ + 62.5% { + transform: rotate(675deg); } + /* 2.5 * ARCSIZE */ + 75% { + transform: rotate(810deg); } + /* 3 * ARCSIZE */ + 87.5% { + transform: rotate(945deg); } + /* 3.5 * ARCSIZE */ + to { + transform: rotate(1080deg); } + /* 4 * ARCSIZE */ } +@-webkit-keyframes blue-fade-in-out { + from { + opacity: 1; } + 25% { + opacity: 1; } + 26% { + opacity: 0; } + 89% { + opacity: 0; } + 90% { + opacity: 1; } + 100% { + opacity: 1; } } +@keyframes blue-fade-in-out { + from { + opacity: 1; } + 25% { + opacity: 1; } + 26% { + opacity: 0; } + 89% { + opacity: 0; } + 90% { + opacity: 1; } + 100% { + opacity: 1; } } +@-webkit-keyframes red-fade-in-out { + from { + opacity: 0; } + 15% { + opacity: 0; } + 25% { + opacity: 1; } + 50% { + opacity: 1; } + 51% { + opacity: 0; } } +@keyframes red-fade-in-out { + from { + opacity: 0; } + 15% { + opacity: 0; } + 25% { + opacity: 1; } + 50% { + opacity: 1; } + 51% { + opacity: 0; } } +@-webkit-keyframes yellow-fade-in-out { + from { + opacity: 0; } + 40% { + opacity: 0; } + 50% { + opacity: 1; } + 75% { + opacity: 1; } + 76% { + opacity: 0; } } +@keyframes yellow-fade-in-out { + from { + opacity: 0; } + 40% { + opacity: 0; } + 50% { + opacity: 1; } + 75% { + opacity: 1; } + 76% { + opacity: 0; } } +@-webkit-keyframes green-fade-in-out { + from { + opacity: 0; } + 65% { + opacity: 0; } + 75% { + opacity: 1; } + 90% { + opacity: 1; } + 100% { + opacity: 0; } } +@keyframes green-fade-in-out { + from { + opacity: 0; } + 65% { + opacity: 0; } + 75% { + opacity: 1; } + 90% { + opacity: 1; } + 100% { + opacity: 0; } } +/** + * Patch the gap that appear between the two adjacent div.circle-clipper while the + * spinner is rotating (appears on Chrome 38, Safari 7.1, and IE 11). + */ +.gap-patch { + position: absolute; + top: 0; + left: 45%; + width: 10%; + height: 100%; + overflow: hidden; + border-color: inherit; } + +.gap-patch .circle { + width: 1000%; + left: -450%; } + +.circle-clipper { + display: inline-block; + position: relative; + width: 50%; + height: 100%; + overflow: hidden; + border-color: inherit; } + .circle-clipper .circle { + width: 200%; + height: 100%; + border-width: 3px; + /* STROKEWIDTH */ + border-style: solid; + border-color: inherit; + border-bottom-color: transparent !important; + border-radius: 50%; + -webkit-animation: none; + animation: none; + position: absolute; + top: 0; + right: 0; + bottom: 0; } + .circle-clipper.left .circle { + left: 0; + border-right-color: transparent !important; + -webkit-transform: rotate(129deg); + transform: rotate(129deg); } + .circle-clipper.right .circle { + left: -100%; + border-left-color: transparent !important; + -webkit-transform: rotate(-129deg); + transform: rotate(-129deg); } + +.active .circle-clipper.left .circle { + /* duration: ARCTIME */ + -webkit-animation: left-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; + animation: left-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; } + +.active .circle-clipper.right .circle { + /* duration: ARCTIME */ + -webkit-animation: right-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; + animation: right-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; } + +@-webkit-keyframes left-spin { + from { + -webkit-transform: rotate(130deg); } + 50% { + -webkit-transform: rotate(-5deg); } + to { + -webkit-transform: rotate(130deg); } } +@keyframes left-spin { + from { + transform: rotate(130deg); } + 50% { + transform: rotate(-5deg); } + to { + transform: rotate(130deg); } } +@-webkit-keyframes right-spin { + from { + -webkit-transform: rotate(-130deg); } + 50% { + -webkit-transform: rotate(5deg); } + to { + -webkit-transform: rotate(-130deg); } } +@keyframes right-spin { + from { + transform: rotate(-130deg); } + 50% { + transform: rotate(5deg); } + to { + transform: rotate(-130deg); } } +#spinnerContainer.cooldown { + /* duration: SHRINK_TIME */ + -webkit-animation: container-rotate 1568ms linear infinite, fade-out 400ms cubic-bezier(0.4, 0, 0.2, 1); + animation: container-rotate 1568ms linear infinite, fade-out 400ms cubic-bezier(0.4, 0, 0.2, 1); } + +@-webkit-keyframes fade-out { + from { + opacity: 1; } + to { + opacity: 0; } } +@keyframes fade-out { + from { + opacity: 1; } + to { + opacity: 0; } } +.slider { + position: relative; + height: 400px; + width: 100%; } + .slider.fullscreen { + height: 100%; + width: 100%; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; } + .slider.fullscreen ul.slides { + height: 100%; } + .slider.fullscreen ul.indicators { + z-index: 2; + bottom: 30px; } + .slider .slides { + background-color: #9e9e9e; + margin: 0; + height: 400px; } + .slider .slides li { + opacity: 0; + position: absolute; + top: 0; + left: 0; + z-index: 1; + width: 100%; + height: inherit; + overflow: hidden; } + .slider .slides li img { + height: 100%; + width: 100%; + background-size: cover; + background-position: center; } + .slider .slides li .caption { + color: #fff; + position: absolute; + top: 15%; + left: 15%; + width: 70%; + opacity: 0; } + .slider .slides li .caption p { + color: #e0e0e0; } + .slider .slides li.active { + z-index: 2; } + .slider .indicators { + position: absolute; + text-align: center; + left: 0; + right: 0; + bottom: 0; + margin: 0; } + .slider .indicators .indicator-item { + display: inline-block; + position: relative; + cursor: pointer; + height: 16px; + width: 16px; + margin: 0 12px; + background-color: #e0e0e0; + transition: background-color .3s; + border-radius: 50%; } + .slider .indicators .indicator-item.active { + background-color: #4CAF50; } + +.carousel { + overflow: hidden; + position: relative; + width: 100%; + height: 400px; + perspective: 500px; + transform-style: preserve-3d; + transform-origin: 0% 50%; } + .carousel.carousel-slider { + top: 0; + left: 0; } + .carousel.carousel-slider .carousel-fixed-item { + position: absolute; + left: 0; + right: 0; + bottom: 20px; + z-index: 1; } + .carousel.carousel-slider .carousel-fixed-item.with-indicators { + bottom: 68px; } + .carousel.carousel-slider .carousel-item { + width: 100%; + height: 100%; + min-height: 400px; + position: absolute; + top: 0; + left: 0; } + .carousel.carousel-slider .carousel-item h2 { + font-size: 24px; + font-weight: 500; + line-height: 32px; } + .carousel.carousel-slider .carousel-item p { + font-size: 15px; } + .carousel .carousel-item { + visibility: hidden; + width: 200px; + height: 200px; + position: absolute; + top: 0; + left: 0; } + .carousel .carousel-item > img { + width: 100%; } + .carousel .indicators { + position: absolute; + text-align: center; + left: 0; + right: 0; + bottom: 0; + margin: 0; } + .carousel .indicators .indicator-item { + display: inline-block; + position: relative; + cursor: pointer; + height: 8px; + width: 8px; + margin: 24px 4px; + background-color: rgba(255, 255, 255, 0.5); + transition: background-color .3s; + border-radius: 50%; } + .carousel .indicators .indicator-item.active { + background-color: #fff; } + .carousel.scrolling .carousel-item .materialboxed, + .carousel .carousel-item:not(.active) .materialboxed { + pointer-events: none; } + +.tap-target-wrapper { + width: 800px; + height: 800px; + position: fixed; + z-index: 1000; + visibility: hidden; + transition: visibility 0s .3s; } + +.tap-target-wrapper.open { + visibility: visible; + transition: visibility 0s; } + .tap-target-wrapper.open .tap-target { + transform: scale(1); + opacity: .95; + transition: transform 0.3s cubic-bezier(0.42, 0, 0.58, 1), opacity 0.3s cubic-bezier(0.42, 0, 0.58, 1); } + .tap-target-wrapper.open .tap-target-wave::before { + transform: scale(1); } + .tap-target-wrapper.open .tap-target-wave::after { + visibility: visible; + animation: pulse-animation 1s cubic-bezier(0.24, 0, 0.38, 1) infinite; + transition: opacity .3s, transform .3s, visibility 0s 1s; } + +.tap-target { + position: absolute; + font-size: 1rem; + border-radius: 50%; + background-color: #B84000; + box-shadow: 0 20px 20px 0 rgba(0, 0, 0, 0.14), 0 10px 50px 0 rgba(0, 0, 0, 0.12), 0 30px 10px -20px rgba(0, 0, 0, 0.2); + width: 100%; + height: 100%; + opacity: 0; + transform: scale(0); + transition: transform 0.3s cubic-bezier(0.42, 0, 0.58, 1), opacity 0.3s cubic-bezier(0.42, 0, 0.58, 1); } + +.tap-target-content { + position: relative; + display: table-cell; } + +.tap-target-wave { + position: absolute; + border-radius: 50%; + z-index: 10001; } + .tap-target-wave::before, .tap-target-wave::after { + content: ''; + display: block; + position: absolute; + width: 100%; + height: 100%; + border-radius: 50%; + background-color: #ffffff; } + .tap-target-wave::before { + transform: scale(0); + transition: transform .3s; } + .tap-target-wave::after { + visibility: hidden; + transition: opacity .3s, transform .3s, visibility 0s; + z-index: -1; } + +.tap-target-origin { + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + z-index: 10002; + position: absolute !important; } + .tap-target-origin:not(.btn):not(.btn-large):not(.btn-small), .tap-target-origin:not(.btn):not(.btn-large):not(.btn-small):hover { + background: none; } + +@media only screen and (max-width: 600px) { + .tap-target, .tap-target-wrapper { + width: 600px; + height: 600px; } } +.pulse { + overflow: visible; + position: relative; } + .pulse::before { + content: ''; + display: block; + position: absolute; + width: 100%; + height: 100%; + top: 0; + left: 0; + background-color: inherit; + border-radius: inherit; + transition: opacity .3s, transform .3s; + animation: pulse-animation 1s cubic-bezier(0.24, 0, 0.38, 1) infinite; + z-index: -1; } + +@keyframes pulse-animation { + 0% { + opacity: 1; + transform: scale(1); } + 50% { + opacity: 0; + transform: scale(1.5); } + 100% { + opacity: 0; + transform: scale(1.5); } } +/* Modal */ +.datepicker-modal { + max-width: 325px; + min-width: 300px; + max-height: none; } + +.datepicker-container.modal-content { + display: flex; + flex-direction: column; + padding: 0; } + +.datepicker-controls { + display: flex; + justify-content: space-between; + width: 280px; + margin: 0 auto; } + .datepicker-controls .selects-container { + display: flex; } + .datepicker-controls .select-wrapper input { + border-bottom: none; + text-align: center; + margin: 0; } + .datepicker-controls .select-wrapper input:focus { + border-bottom: none; } + .datepicker-controls .select-wrapper .caret { + display: none; } + .datepicker-controls .select-year input { + width: 50px; } + .datepicker-controls .select-month input { + width: 70px; } + +.month-prev, .month-next { + margin-top: 4px; + cursor: pointer; + background-color: transparent; + border: none; } + +/* Date Display */ +.datepicker-date-display { + flex: 1 auto; + background-color: #4D9999; + color: #fff; + padding: 20px 22px; + font-weight: 500; } + .datepicker-date-display .year-text { + display: block; + font-size: 1.5rem; + line-height: 25px; + color: rgba(255, 255, 255, 0.7); } + .datepicker-date-display .date-text { + display: block; + font-size: 2.8rem; + line-height: 47px; + font-weight: 500; } + +/* Calendar */ +.datepicker-calendar-container { + flex: 2.5 auto; } + +.datepicker-table { + width: 280px; + font-size: 1rem; + margin: 0 auto; } + .datepicker-table thead { + border-bottom: none; } + .datepicker-table th { + padding: 10px 5px; + text-align: center; } + .datepicker-table tr { + border: none; } + .datepicker-table abbr { + text-decoration: none; + color: #999; } + .datepicker-table td { + border-radius: 50%; + padding: 0; } + .datepicker-table td.is-today { + color: #4D9999; } + .datepicker-table td.is-selected { + background-color: #4D9999; + color: #fff; } + .datepicker-table td.is-outside-current-month, .datepicker-table td.is-disabled { + color: rgba(0, 0, 0, 0.3); + pointer-events: none; } + +.datepicker-day-button { + background-color: transparent; + border: none; + line-height: 38px; + display: block; + width: 100%; + border-radius: 50%; + padding: 0 5px; + cursor: pointer; + color: inherit; } + .datepicker-day-button:focus { + background-color: rgba(83, 147, 147, 0.25); } + +/* Footer */ +.datepicker-footer { + width: 280px; + margin: 0 auto; + padding-bottom: 5px; + display: flex; + justify-content: space-between; } + +.datepicker-cancel, +.datepicker-clear, +.datepicker-today, +.datepicker-done { + color: #4D9999; + padding: 0 1rem; } + +.datepicker-clear { + color: #F44336; } + +/* Media Queries */ +@media only screen and (min-width: 601px) { + .datepicker-modal { + max-width: 625px; } + + .datepicker-container.modal-content { + flex-direction: row; } + + .datepicker-date-display { + flex: 0 1 270px; } + + .datepicker-controls, + .datepicker-table, + .datepicker-footer { + width: 320px; } + + .datepicker-day-button { + line-height: 44px; } } +/* Timepicker Containers */ +.timepicker-modal { + max-width: 325px; + max-height: none; } + +.timepicker-container.modal-content { + display: flex; + flex-direction: column; + padding: 0; } + +.text-primary { + color: white; } + +/* Clock Digital Display */ +.timepicker-digital-display { + flex: 1 auto; + background-color: #4D9999; + padding: 10px; + font-weight: 300; } + +.timepicker-text-container { + font-size: 4rem; + font-weight: bold; + text-align: center; + color: rgba(255, 255, 255, 0.6); + font-weight: 400; + position: relative; + user-select: none; } + +.timepicker-span-hours, +.timepicker-span-minutes, +.timepicker-span-am-pm div { + cursor: pointer; } + +.timepicker-span-hours { + margin-right: 3px; } + +.timepicker-span-minutes { + margin-left: 3px; } + +.timepicker-display-am-pm { + font-size: 1.3rem; + position: absolute; + right: 1rem; + bottom: 1rem; + font-weight: 400; } + +/* Analog Clock Display */ +.timepicker-analog-display { + flex: 2.5 auto; } + +.timepicker-plate { + background-color: #eee; + border-radius: 50%; + width: 270px; + height: 270px; + overflow: visible; + position: relative; + margin: auto; + margin-top: 25px; + margin-bottom: 5px; + user-select: none; } + +.timepicker-canvas, +.timepicker-dial { + position: absolute; + left: 0; + right: 0; + top: 0; + bottom: 0; } + +.timepicker-minutes { + visibility: hidden; } + +.timepicker-tick { + border-radius: 50%; + color: rgba(0, 0, 0, 0.87); + line-height: 40px; + text-align: center; + width: 40px; + height: 40px; + position: absolute; + cursor: pointer; + font-size: 15px; } + +.timepicker-tick.active, +.timepicker-tick:hover { + background-color: rgba(77, 153, 153, 0.25); } + +.timepicker-dial { + transition: transform 350ms, opacity 350ms; } + +.timepicker-dial-out { + opacity: 0; } + .timepicker-dial-out.timepicker-hours { + transform: scale(1.1, 1.1); } + .timepicker-dial-out.timepicker-minutes { + transform: scale(0.8, 0.8); } + +.timepicker-canvas { + transition: opacity 175ms; } + .timepicker-canvas line { + stroke: #4D9999; + stroke-width: 4; + stroke-linecap: round; } + +.timepicker-canvas-out { + opacity: 0.25; } + +.timepicker-canvas-bearing { + stroke: none; + fill: #4D9999; } + +.timepicker-canvas-bg { + stroke: none; + fill: #4D9999; } + +/* Footer */ +.timepicker-footer { + margin: 0 auto; + padding: 5px 1rem; + display: flex; + justify-content: space-between; } + +.timepicker-clear { + color: #F44336; } + +.timepicker-close { + color: #4D9999; } + +.timepicker-clear, +.timepicker-close { + padding: 0 20px; } + +/* Media Queries */ +@media only screen and (min-width: 601px) { + .timepicker-modal { + max-width: 600px; } + + .timepicker-container.modal-content { + flex-direction: row; } + + .timepicker-text-container { + top: 32%; } + + .timepicker-display-am-pm { + position: relative; + right: auto; + bottom: auto; + text-align: center; + margin-top: 1.2rem; } } +.material-icons { + font-family: 'Material Icons'; + font-weight: normal; + font-style: normal; + font-size: 24px; + line-height: 1; + letter-spacing: normal; + text-transform: none; + display: inline-block; + white-space: nowrap; + word-wrap: normal; + direction: ltr; + -webkit-font-feature-settings: 'liga'; + -webkit-font-smoothing: antialiased; } + +.btn.disabled, .disabled.btn-large, .disabled.btn-small { + pointer-events: auto; } + +.grid { + grid-auto-rows: min-content; + display: inline-grid; + width: 100%; } + .grid .ghead, .grid .gbody, .grid .gfoot, .grid .gr { + display: contents; } + .grid .gd, .grid .gh { + display: grid; + grid-auto-columns: 1fr; + justify-content: center; + align-content: center; + text-align: center; + padding: 15px; } + .grid .gh { + align-content: baseline; } + .grid .gh .card { + position: sticky; + top: 15px; + bottom: 15px; } + .grid .ghead { + color: #B2B2B2; } + .grid .ghead .gh { + z-index: 8; + border-bottom: 1px solid #B2B2B2; + max-height: 40px; + line-height: 1em; } + .grid .gbody .gr.spacer { + grid-column: 1 / -1; } + .grid .gbody .separator { + grid-column: 1 / -1; + border-top: 1px solid #B2B2B2; } + .grid .pagination { + grid-column: 1 / -1; } + .grid .gbody > .gr > .gd { + min-height: 70px; } + .grid.striped .gbody > .gr:nth-child(odd) .gd { + background-color: #ffeee6; } + .grid.striped .gbody > .gr:nth-child(odd):hover .gd { + background-color: #f7f2ee; } + .grid.striped .gbody > .gr:nth-child(even):hover .gd { + background-color: #eef6f6; } + .grid .gbody > .gr .gd.action { + grid-auto-flow: column; + grid-gap: 5px; } + .grid .gbody > .gr .gd.action.side .btn, .grid .gbody > .gr .gd.action.side .btn-large, .grid .gbody > .gr .gd.action.side .btn-small { + width: min-content; } + .grid .gbody > .gr > .gr.extendable > .gd.action { + padding-top: 0; + padding-bottom: 0; + transition: padding .3s, max-height .3s; } + .grid .gbody > .gr > .gr.extendable > .gd.action .btn, .grid .gbody > .gr > .gr.extendable > .gd.action .btn-large, .grid .gbody > .gr > .gr.extendable > .gd.action .btn-small { + max-height: 0; + transition: max-height 0.3s; } + .grid .gbody > .gr:focus-within .gd { + background-color: #5cd6d6 !important; } + .grid .gbody > .gr:focus-within > .gr.extendable > .gd.action { + padding-bottom: 15px; } + .grid .gbody > .gr:focus-within > .gr.extendable > .gd.action .btn, .grid .gbody > .gr:focus-within > .gr.extendable > .gd.action .btn-large, .grid .gbody > .gr:focus-within > .gr.extendable > .gd.action .btn-small { + max-height: 36px; } + +#tooltip { + opacity: .75; + transition: opacity .3s, margin-top .3s; + position: fixed; + pointer-events: none; + transform: translate(-50%, -100%); + max-width: 120px; + width: 120px; + background-color: black; + color: #fff; + text-align: center; + padding: 5px; + border-radius: 6px; + margin-top: -7px; + font-size: 11px; + line-height: 13px; + z-index: 1005; } + #tooltip.v-enter, #tooltip.v-leave-to { + margin-top: 3px; + opacity: 0; } + #tooltip::after { + content: " "; + position: absolute; + left: 50%; + bottom: -10px; + margin-left: -5px; + border-width: 5px; + border-style: solid; + border-color: black transparent transparent transparent; } + +#documentation { + position: fixed; + display: flex; + align-items: center; + justify-content: center; + z-index: 2000; + pointer-events: none; + opacity: 1; + transition: opacity .3s; } + #documentation.v-enter, #documentation.v-leave-to { + opacity: 0; } + #documentation.v-enter .overlay, #documentation.v-leave-to .overlay { + width: 0 !important; + height: 0 !important; } + #documentation .overlay { + position: fixed; + border-radius: 10050px; + border: 10000px solid rgba(0, 0, 0, 0.66); + box-sizing: content-box; + transform: translate(-50%, -50%); + transition: all .3s; } + #documentation.first .overlay { + transition: opacity .3s, height .3s, width .3s; } + #documentation .content { + position: absolute; + font-size: 1.5em; + color: white; + max-height: 75%; + max-width: 75%; } + #documentation .content h1 { + text-align: center; } + #documentation .content * { + color: white; } + #documentation .content > *:first-child { + margin-top: 0; } + #documentation .content > *:last-child { + margin-bottom: 0; } + #documentation svg { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + stroke-width: 5px; + fill: none; + stroke: white; } + #documentation .next, #documentation .close { + user-select: none; + pointer-events: all !important; } + #documentation .close { + top: 16px; + right: 6px; + padding-top: 0; } + +.dropdown-button { + position: relative; + display: block; + overflow: visible; + margin: 12px 5px; + line-height: 1; } + .dropdown-button:focus .dropdown-content, .dropdown-button:focus-within .dropdown-content { + display: block; + opacity: 1; } + .dropdown-button .dropdown-content { + overflow: visible; + top: calc(100% + 12px); + left: auto; + right: 0; + min-width: 250px; + width: min-content; } + .dropdown-button .dropdown-content::before { + content: ""; + position: absolute; + top: -20px; + right: 10px; + border-width: 10px; + border-style: solid; + border-color: transparent transparent white transparent; } + .dropdown-button .dropdown-content .dropdown-title { + margin: 0; + padding: 8px; + font-weight: bold; + border-bottom: 1px solid #DDDFE2; } + .dropdown-button .dropdown-content .dropdown-title .option { + position: absolute; + right: 8px; + font-weight: normal; + cursor: pointer; } + .dropdown-button .dropdown-content .dropdown-title .option:hover { + text-decoration: underline; } + .dropdown-button .dropdown-content li:hover { + background-color: initial; } + +.tabs { + display: grid; + background: initial; } + .tabs .tab:not(.disabled) a { + cursor: pointer; + position: relative; } + .tabs .tab:not(.disabled) a::after { + position: absolute; + content: ""; + background: #B84000; + width: 0; + height: 2px; + bottom: 0; + left: 50%; + transform: translateX(-50%); + transition: width 0.3s; } + .tabs .tab:not(.disabled) a:hover::after, .tabs .tab:not(.disabled) a.active::after { + width: 100%; } + .tabs .tab.disabled a { + pointer: default; } + +.arrow { + border: solid black; + border-width: 0 2px 2px 0; + border-top-left-radius: 10px; + display: inline-block; + padding: 3px; + transition: transform .3s; } + .arrow.to-right { + transform: rotate(-45deg); + -webkit-transform: rotate(-45deg); } + .arrow.to-left { + transform: rotate(135deg); + -webkit-transform: rotate(135deg); } + .arrow.to-up { + transform: rotate(-135deg); + -webkit-transform: rotate(-135deg); } + .arrow.to-down { + transform: rotate(45deg); + -webkit-transform: rotate(45deg); } + +.modal-wrapper.v-enter-active, .modal-wrapper.v-leave-active { + transition: all .3s; } +.modal-wrapper.v-enter .modal, .modal-wrapper.v-leave-to .modal { + opacity: 0; + transform: scale(0.5); } + .modal-wrapper.v-enter .modal + .modal-overlay, .modal-wrapper.v-leave-to .modal + .modal-overlay { + opacity: 0; } +.modal-wrapper .modal { + opacity: 1; + transform: none; + display: block; + top: 10%; + z-index: 1003; + min-width: 900px; + max-height: 80vh; + transition: opacity .3s ease-in, transform .3s ease-out; } + .modal-wrapper .modal .dragger { + cursor: move; + position: absolute; + height: 24px; + width: 24px; } + .modal-wrapper .modal .dragger:before { + content: '.'; + color: #aaa; + position: absolute; + left: 4.5px; + top: 1.5px; + font-size: 20px; + line-height: 0; + text-shadow: 0 5px, 0 10px, 5px 0, 5px 5px, 5px 10px, 10px 0, 10px 5px, 10px 10px; } + .modal-wrapper .modal.modal-fixed-footer { + height: auto; + padding-bottom: 56px; + overflow: hidden; } + .modal-wrapper .modal.modal-fixed-footer .modal-content { + position: initial; + max-height: calc(80vh - 56px); } + .modal-wrapper .modal + .modal-overlay { + top: 0; + z-index: 1002; + display: block; + opacity: 0.5; + transition: opacity .3s ease-in; } +.modal-wrapper#confirmDialog .modal { + top: 15%; + z-index: 1005; + width: 50vw; + min-width: 500px; } + .modal-wrapper#confirmDialog .modal + .modal-overlay { + z-index: 1004; } + +.input-field:focus-within > label { + color: #4D9999; + transform: translateY(-14px) scale(0.8); + transform-origin: 0 0; } + +.input-field .helper-text.flash { + animation: blinker 1s linear infinite; } + +@keyframes blinker { + 50% { + opacity: 0; } } +.chips { + padding-top: 7px; } + .chips:focus-within { + border-bottom: 1px solid #4D9999; + box-shadow: 0 1px 0 0 #4D9999; } + .chips:empty ~ label { + font-size: inherit; + transform: none; } + .chips .input { + height: 32px; + vertical-align: middle; } + .chips .input[disabled="disabled"] { + border: none; } + +.chip { + cursor: pointer; + user-select: none; + color: white; + background-color: #B2B2B2; } + .chip.negative { + background-color: #B84000; } + .chip.positive { + background-color: #4D9999; } + .chip.valid { + background-color: #26A96C; } + .chip .close { + height: 24px; + width: 24px; + margin: 4px -7px 4px 4px; + line-height: 24px !important; + border-radius: 20px; + text-align: center; + padding: 0; + transition: background .3s; } + .chip .close:hover { + background: rgba(0, 0, 0, 0.3); } + +.toast { + transition: margin-top .3s, opacity .3s; } + .toast.v-enter { + margin-top: 58px; + opacity: 0 !important; } + .toast.v-leave-to { + margin-top: -48px; + opacity: 0 !important; } + +.materialize-textarea { + line-height: normal; + padding: .8rem 0 .8rem 0; + min-height: 3rem; + border-bottom: 1px solid #B2B2B2; + border-radius: 0; + outline: none; + width: 100%; + font-size: 16px; + transition: box-shadow .3s, border .3s; } + +.materialize-textarea:focus { + outline: none; + border-bottom: 1px solid #4D9999; + box-shadow: 0 1px 0 0 #4D9999; } + +/** alternative modals +.modal { + position: fixed; + top: 0; + left: 0; + background-color: rgba(0, 0, 0, 0.5); + height: 100vh; + width: 100vw; + overflow-y: scroll; +} + +.modal::before, .modal::after { + content: ""; + display: block; + height: 20px; + width: 100%; +} + + +.modal .modal-content { + background: #fafafa; + width: 60%; + margin: auto; +} + +.modal .modal-footer { + position: sticky; + bottom: 20px; + left: 0; + right: 0; + text-align: center; +} +**/ +::-webkit-scrollbar { + width: 12px; + height: 12px; + border-radius: 3px; } + +::-webkit-scrollbar-track { + background-color: #cecece; + border-left: 1px solid #cdc7c2; } + +::-webkit-scrollbar-thumb { + background-color: #7e8182; + border: 3px solid #cecece; + border-radius: 6px; + min-height: 40px; } + +::-webkit-scrollbar-thumb:hover { + background-color: #565b5c; } + +::-webkit-scrollbar-thumb:active { + background-color: #1b6acb; } + +h1 { + color: #B84000; } + +h2 { + color: #B84000; } + +h3 { + color: #000000; } + +h4 { + color: #B84000; } + +h5 { + color: #000000; } + +td, th { + border-radius: 0; } + +strong { + font-weight: bold; } + +textarea { + display: block; } + +.btn, .btn-large, .btn-small { + text-overflow: ellipsis; + white-space: nowrap; } + .btn.primary-color:hover, .primary-color.btn-large:hover, .primary-color.btn-small:hover { + background-color: #B84000; } + +.container { + width: 85% !important; } + +img { + overflow: hidden; + max-width: 100%; + max-height: 100%; } + +.clickable:hover { + cursor: pointer; + text-decoration: underline; } + +.input-field .materialize-textarea { + min-width: 50px; + font-size: inherit; } + .input-field .materialize-textarea:not([contenteditable]), .input-field .materialize-textarea[contenteditable="false"] { + border-color: transparent; } + .input-field .materialize-textarea[placeholder]:empty::before { + content: attr(placeholder); + color: black; + opacity: 0.25; } + +[tabindex]:focus { + outline: none; + cursor: initial; } + +[v-cloak] { + display: none; } + +[unselectable="on"] { + -moz-user-select: -moz-none; + -khtml-user-select: none; + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; } + +.search-box > input { + margin-bottom: 0; } + +html body { + min-width: 900px; + overflow-y: scroll; + overflow-x: auto; } + html body #app { + --primary-color-hover: var(--primary-color)10; + --secondary-color-hover: var(--secondary-color)10; + display: flex; + min-height: 100vh; + flex-direction: column; } + html body #app #help { + margin: 0 10px; + cursor: pointer; } + html body #app.help { + cursor: help; } + html body #app.help :not(.documented) { + pointer-events: none; } + html body #app.help .documented { + pointer-events: all; } + html body #app > nav { + height: 64px; + position: sticky; + min-width: 900px; + width: 100%; + top: 0; + left: 0; + z-index: 10; } + html body #app #loading { + position: fixed; + margin: auto; + top: 64px; + border-radius: none; + z-index: 5; } + html body #app .current-view-wrapper { + display: flex; + flex-direction: column; + min-height: calc(100vh - 64px); + padding-bottom: 30px; } + html body #app .current-view-wrapper .current-view { + display: flex; + flex-direction: column; + flex: 1; } + html body #app .current-view-wrapper .current-view > .container { + display: flex; + flex-direction: column; + flex: 1; + width: 85%; } + html body #app .current-view-wrapper .current-view > .container > #header { + position: sticky; + padding: 0 17px; + top: 64px; + background: white; + display: grid; + grid-template-columns: 1fr max-content; + height: 60px; + align-items: center; + z-index: 4; } + html body #app .current-view-wrapper .current-view > .container > #header > div { + display: grid; + grid-column-gap: 0.25em; + grid-template-columns: max-content 1fr max-content max-content; + align-items: center; + margin-right: 15px; + width: fit-content; } + html body #app .current-view-wrapper .current-view > .container > #header > div > h1 { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + margin: 0; } + html body #app .current-view-wrapper .current-view > .container > #header > div .author { + color: #B84000; + font-size: 14px; } + html body #app .current-view-wrapper .current-view > .container > #header > div .details { + margin: 0; + line-height: 1em; } + html body #app .current-view-wrapper .current-view > .container > #header > div .details p { + margin: 0; } + html body #app .current-view-wrapper .current-view > .container > #header #backTo { + position: absolute; + top: 18px; + left: 0; } + html body #app .current-view-wrapper .current-view > .container > .grid { + flex: 1; } + html body #app .current-view-wrapper .current-view > .container > .grid > .ghead .gh { + position: sticky; + top: 124px; + background: white; + z-index: 8; } + html body #app .current-view-wrapper .current-view > .container > .grid .gh > .card { + top: 179px; } + html body #app .page-footer .contributors a { + display: flex; + height: 70px; + align-items: center; + justify-content: center; + float: left; + margin-right: 50px; } + html body #app .page-footer .contributors a img { + max-width: 180px; + max-height: 100%; } + +@media only print { + html body #app > nav { + display: none; } + html body #app .current-view { + padding-top: 0; } + html body #app .current-view > .container { + width: 100%; } + html body #app .current-view > .container > #header { + top: 0; } } +.switch label { + position: relative; } + +.card { + display: block; } + @media only screen and (max-width: 600px) { + .card { + max-width: 120px; } } + @media only screen and (min-width: 601px) { + .card { + max-width: 160px; } } + @media only screen and (min-width: 993px) { + .card { + max-width: 200px; } } + @media only screen and (min-width: 1201px) { + .card { + max-width: 240px; } } + .card h2 { + max-height: 43px; + min-height: 43px; + overflow-y: auto; } + +.card-image { + width: 100%; + margin: auto; } + @media only screen and (max-width: 600px) { + .card-image { + width: 120px; + height: calc(120px / 3 * 2); } } + @media only screen and (min-width: 601px) { + .card-image { + width: 160px; + height: calc(160px / 3 * 2); } } + @media only screen and (min-width: 993px) { + .card-image { + width: 200px; + height: calc(200px / 3 * 2); } } + @media only screen and (min-width: 1201px) { + .card-image { + width: 240px; + height: calc(240px / 3 * 2); } } + .card-image img { + height: auto !important; + width: auto !important; + margin: auto; } + +.light-color { + background: #eef6f6; } + +.primary-color { + background: #B84000; + color: white; } + +nav #logoContainer { + z-index: 1; + float: left; } + nav #logoContainer img { + vertical-align: middle; + margin-bottom: 5px; } +nav .menu a { + position: relative; } + nav .menu a::after { + position: absolute; + content: ""; + background: white; + width: 0; + height: 2px; + bottom: 0; + left: 50%; + transform: translateX(-50%); + transition: width 0.3s; } + nav .menu a:hover::after, nav .menu a.active::after { + width: 100%; } +nav #userSettings .dropdown-content a.btn, nav #userSettings .dropdown-content a.btn-large, nav #userSettings .dropdown-content a.btn-small { + background: #B2B2B2; + color: white; + width: calc(100% - 30px); + margin: 10px 15px; } +nav #userSettings .dropdown-content #changePasswd { + margin: 5px; } + nav #userSettings .dropdown-content #changePasswd .input-field input:not(:focus) { + border-bottom: 1px solid; } +nav #notifications { + position: relative; } + nav #notifications #notificationCount { + position: absolute; + cursor: pointer; + top: 15px; + right: 17px; + border-radius: 2px; + padding: 1px 3px; + line-height: 1.3; + min-height: 1.3em; + min-width: 0; + font-size: 10px; + background-color: #F44336; } + nav #notifications .dropdown-button { + width: 40px; + height: 40px; + padding: 0; + border-radius: 100px; } + nav #notifications .dropdown-button i { + cursor: pointer; + text-align: center; + line-height: 40px; + height: 40px; } + nav #notifications .dropdown-button:focus, nav #notifications .dropdown-button:focus-within { + background-color: rgba(0, 0, 0, 0.1); } + nav #notifications .dropdown-content { + width: 460px; } + nav #notifications .dropdown-content ul { + height: calc(100vh - 112px); + max-height: 600px; + overflow: auto; } + nav #notifications .dropdown-content ul li { + position: relative; + margin-right: 25px; + border-bottom: 1px solid #DDDFE2; } + nav #notifications .dropdown-content ul li.unread { + background-color: #ffeee6; } + nav #notifications .dropdown-content ul li.unread .read-toggle { + border-width: 3px; } + nav #notifications .dropdown-content ul li.unread:hover { + background-color: #f7f2ee; } + nav #notifications .dropdown-content ul li:hover { + background-color: #eef6f6; } + nav #notifications .dropdown-content ul li:hover .read-toggle { + opacity: 1; } + nav #notifications .dropdown-content ul li a { + padding: 5px 16px; + font-size: 14px; } + nav #notifications .dropdown-content ul li a .arg { + font-weight: bold; } + nav #notifications .dropdown-content ul li a:hover { + background-color: initial; } + nav #notifications .dropdown-content ul li .read-toggle { + position: absolute; + opacity: 0; + right: 10px; + top: 10px; + width: 10px; + height: 10px; + padding: 0; + border: 5px solid #B2B2B2; + border-radius: 10px; + transition: opacity .3s; } + nav #notifications .dropdown-content ul li .read-toggle:hover { + border-color: #808080; } + +#login > div { + justify-content: center; } + #login > div #loginForm { + width: 500px; } + +#aafImport .progress { + width: 490px; } + +#home #welcomeCallout { + margin: 0; + color: #B84000; } + #home #welcomeCallout img { + max-height: 100px; } + @media only screen and (min-width: 993px) { + #home #welcomeCallout img { + margin-left: 50px; } } + @media only screen and (max-width: 600px) { + #home #welcomeCallout img { + display: none; } } +#home #categoriesList .col { + display: inline-block; + float: none; } + +#debates .opinion { + height: 16px; + width: 100%; + background-color: #B2B2B2; } + #debates .opinion .for { + height: 100%; + float: left; + background-color: #4D9999; } + #debates .opinion .against { + height: 100%; + float: right; + background-color: #BA4100; } + +#debate .comment-mark, .comment .comment-mark { + display: inline; } + +@media only print { + #debate { + height: auto !important; } + #debate .selection > div { + max-height: none !important; } + #debate .selection::before, #debate .selection::after { + content: none; } + #debate #documentContainer, #debate #commentsContainer { + height: auto !important; } } +#debate .row { + margin: 0; } +#debate #options { + position: sticky; + padding: 0 17px; + top: 124px; + background: white; + z-index: 2; + text-align: right; } + #debate #options .col { + padding: 0; } + #debate #options #sortCommentsBy, #debate #options #leftDisplay { + position: absolute; + bottom: 0; } + #debate #options #sortCommentsBy input + i, #debate #options #leftDisplay input + i { + font-style: normal; } + #debate #options #sortCommentsBy input:checked + i, #debate #options #leftDisplay input:checked + i { + font-weight: bold; } + #debate #options .search-box { + margin: 0; } + #debate #options .search-box > input { + margin-bottom: 5px; + margin-top: -5px; } +#debate #mainContainer { + height: calc(100vh - 170px); } +#debate #documentContainer, #debate #commentsContainer { + width: 50%; + height: 100%; + float: left; } + #debate #documentContainer .scroll-area, #debate #commentsContainer .scroll-area { + height: 100%; + overflow-y: scroll; } +#debate #commentsContainer.loading { + position: relative; + overflow-x: hidden; } + #debate #commentsContainer.loading::before, #debate #commentsContainer.loading::after { + content: ""; + display: block; + top: 0; + left: 0; + width: 100%; + height: 100%; + position: absolute; } + #debate #commentsContainer.loading::before { + background: #e0e0e0; + z-index: 1; } + #debate #commentsContainer.loading::after { + background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.3), transparent); + transform: translateX(-100%); + animation: loading 1.5s infinite; + z-index: 1; } +@keyframes loading { + 100% { + transform: translateX(100%); } } +#debate #documentContainer .scroll-area { + direction: rtl; } + #debate #documentContainer .scroll-area > * { + direction: ltr; } +#debate #documentContainer { + z-index: 1; } + #debate #documentContainer .scroll-area { + padding-left: 5px; } + #debate #documentContainer .scroll-area .wrap { + display: flex; + min-height: 100%; } + #debate #documentContainer .scroll-area .wrap #documentDisplay { + text-align: justify; + font-size: 13px; + line-height: 1.42; + width: calc(100% - 60px); + float: left; } + #debate #documentContainer .scroll-area .wrap #documentDisplay::selection, #debate #documentContainer .scroll-area .wrap #documentDisplay ::selection { + background-color: #C6E4E3; } + #debate #documentContainer .scroll-area .wrap .bullets-container { + float: left; } +#debate .selection_popup { + position: absolute; + cursor: pointer; + background: #4D9999; + color: white; + border-radius: 5px; + padding: 0 5px; } + #debate .selection_popup::before { + content: ""; + position: absolute; + border-width: 8px 5px; + border-style: solid; } + #debate .selection_popup.top { + margin-top: -7px; + margin-left: -15px; + transform: translateY(-100%); } + #debate .selection_popup.top::before { + bottom: -16px; + left: 10px; + border-color: #4D9999 transparent transparent transparent; } + #debate .selection_popup.bottom { + margin-top: 7px; + margin-left: 15px; + transform: translateX(-100%); } + #debate .selection_popup.bottom::before { + top: -16px; + right: 10px; + border-color: transparent transparent #4D9999 transparent; } +#debate .comment-container.moderated::after { + content: ""; + position: absolute; + top: 0; + left: 0; + height: 100%; + width: 100%; + background-color: #F44336; + opacity: 50%; } +#debate .answers-container { + overflow: hidden; } + #debate .answers-container .answers { + overflow-y: hidden; + padding: 0 5px 0 10px; + transition: margin-top .3s; } + #debate .answers-container .answers.v-enter-active { + transition: all 0s; } +#debate .comment-body .selection, #debate .spaghetti-data .selection { + cursor: pointer; } + #debate .comment-body .selection:hover, #debate .comment-body .selection.active, #debate .spaghetti-data .selection:hover, #debate .spaghetti-data .selection.active { + background: #ebecee; + border-left-color: #808080; + border-right-color: #808080; } + #debate .comment-body .selection:hover::before, #debate .comment-body .selection.active::before, #debate .spaghetti-data .selection:hover::before, #debate .spaghetti-data .selection.active::before { + background-image: linear-gradient(#ebecee, transparent); } + #debate .comment-body .selection:hover::after, #debate .comment-body .selection.active::after, #debate .spaghetti-data .selection:hover::after, #debate .spaghetti-data .selection.active::after { + background-image: linear-gradient(transparent, #ebecee); } +#debate .bullets-container { + position: relative; + width: 50px; + margin: 0 5px; } + #debate .bullets-container .bullets-box { + position: absolute; + height: 1em; + width: 100%; + display: flex; + align-items: center; + justify-content: space-evenly; } + #debate .bullets-container .bullets-box .bullet { + height: 10px; + width: 10px; } + #debate .bullets-container .bullets-box .bullet::before { + content: ""; + display: block; + width: 100%; + height: 100%; + box-sizing: border-box; + border-radius: 10px; } + #debate .bullets-container .bullets-box .bullet.for::before { + background: #4D9999; } + #debate .bullets-container .bullets-box .bullet.neutral::before { + background: #B2B2B2; } + #debate .bullets-container .bullets-box .bullet.against::before { + background: #BA4100; } + #debate .bullets-container .bullets-box .bullet:hover { + cursor: pointer; + z-index: 2; + width: 8px; + height: 8px; + margin: 1px; } + #debate .bullets-container .bullets-box .bullets-drop-down { + min-width: 10px; + padding: 5px; + border-radius: 10px; + box-sizing: content-box; + line-height: 10px; + font-size: 10px; + text-align: center; + z-index: 1; + font-weight: bold; + color: white; + transition: box-shadow .3s; } + #debate .bullets-container .bullets-box .bullets-drop-down.for { + background: #4D9999; } + #debate .bullets-container .bullets-box .bullets-drop-down.against { + background: #BA4100; } + #debate .bullets-container .bullets-box .bullets-drop-down.neutral { + background: #B2B2B2; } + #debate .bullets-container .bullets-box .bullets-drop-down > .label { + overflow: hidden; + height: 10px; + transition: height .3s; } + #debate .bullets-container .bullets-box .bullets-drop-down > .body { + transition: height .3s; + overflow: hidden; } + #debate .bullets-container .bullets-box:not(:hover) .bullets-drop-down { + box-shadow: 4px 0 0 -1px #ddd, 4px 0 1px -1px black, 8px 0 0 -2px #bbb, 8px 0 1px -2px black, 12px 0 0 -3px #aaa, 12px 0 1px -3px black; } + #debate .bullets-container .bullets-box:not(:hover) .bullets-drop-down > .body { + height: 0 !important; } + #debate .bullets-container .bullets-box:hover .bullets-drop-down { + z-index: 9999; + background: white !important; + width: 10px; } + #debate .bullets-container .bullets-box:hover .bullets-drop-down > .label { + height: 0; } +#debate .spaghetti-data { + width: 50%; + float: left; } + #debate .spaghetti-data > .theme { + display: grid; + grid-template-columns: min-content 1fr; + align-items: center; } + #debate .spaghetti-data > .theme .close { + cursor: pointer; + margin-bottom: 10px; } +#debate svg.spaghettis { + position: fixed; + pointer-events: none; + top: 0; + left: 0; + width: 100%; + height: 100%; + stroke-width: 3px; } + #debate svg.spaghettis use { + fill: none; + stroke-width: 6px; + cursor: pointer; + pointer-events: initial; } + #debate svg.spaghettis path { + fill: none; + stroke-width: inherit; + pointer-events: initial; } + #debate svg.spaghettis path.trigger { + stroke-width: 20px; } + #debate svg.spaghettis > g { + transition: opacity .3s; } + #debate svg.spaghettis.hover > g { + opacity: 0.25; } + +.comment { + position: relative; + font-size: 13px; + padding: 3px 5px; + margin-bottom: 5px; + box-sizing: border-box; + border-left: 3px solid; + outline-width: 3px; + outline-offset: -3px; } + .comment .close { + position: absolute; + cursor: pointer; + top: 0; + right: .5em; } + .comment.for { + border-color: #4D9999; + outline-color: #4D9999; } + .comment.for .comment-header * { + color: #4D9999; } + .comment.neutral { + border-color: #B2B2B2; + outline-color: #B2B2B2; } + .comment.neutral .comment-header * { + color: #B2B2B2; } + .comment.against { + border-color: #BA4100; + outline-color: #BA4100; } + .comment.against .comment-header * { + color: #BA4100; } + .comment:focus-within { + outline-style: solid; + outline-width: 3px; } + .comment .comment-header .username { + display: inline-block; + margin-right: 10px; + margin-top: 0; } + .comment .comment-header .comment-count { + cursor: pointer; } + .comment .comment-body .reformulation-wrapper, .comment .comment-body .argumentation-wrapper { + display: grid; + grid-template-columns: 20px 1fr 60px; } + .comment .comment-body .reformulation-wrapper > i, .comment .comment-body .reformulation-wrapper > .tags > i, .comment .comment-body .argumentation-wrapper > i, .comment .comment-body .argumentation-wrapper > .tags > i { + font-size: 18px; + margin-top: 1px; } + .comment .comment-body .reformulation-wrapper .reformulation { + white-space: pre-wrap; } + .comment .comment-body .reformulation-wrapper .tags { + margin: 0 20px; } + .comment .comment-body .reformulation-wrapper .tags i { + cursor: pointer; + text-shadow: 0 0 1px black, 0 0 1px black, 0 0 1px black, 0 0 1px black; + color: white; } + .comment .comment-body .reformulation-wrapper .tags.disabled i { + cursor: default; + opacity: .5; } + .comment .comment-body .argumentation-wrapper .argumentation { + white-space: pre-wrap; } + .comment .comment-body .argumentation-wrapper .argumentation::selection { + background-color: #C6E4E3; } + +.selection { + overflow: hidden; + position: relative; + background: #DDDFE2; + border-left: 3px solid #B2B2B2; + border-right: 3px solid #B2B2B2; + border-radius: 5px; + transition: background .3s, border-color .3s; + text-align: justify; + font-size: 13px; + line-height: 1.42; + margin-bottom: 10px; } + .selection > div > *:nth-last-child(1) { + margin-bottom: 0; } + .selection::after, .selection::before { + position: absolute; + content: ""; + width: 100%; + height: 10px; + background-image: linear-gradient(transparent, #DDDFE2); + left: 0; + bottom: 0; } + .selection::before { + background-image: linear-gradient(#DDDFE2, transparent); + top: 0; } + .selection > div { + max-height: 100px; + overflow: auto; + padding: 5px; } + .selection > div *:nth-child(1) { + margin-top: 0; } + .selection > div *:nth-last-child(1) { + margin-bottom: 0; } + +#commentModal .modal { + resize: horizontal; + min-width: 500px; } +#commentModal #argumentation .materialize-textarea { + min-height: 6em; } +#commentModal .input-field:focus-within > #reformulationCheck svg .line { + stroke: #4D9999; + stroke-width: 2px; } +#commentModal #reformulationCheck { + display: flex; + align-items: center; + background: #fafafa; + position: absolute; + right: 0; + bottom: -19px; } +@keyframes spin { + from { + transform: rotate(0deg) translate(-3px) rotate(0deg); } + to { + transform: rotate(360deg) translate(-3px) rotate(-360deg); } } + #commentModal #reformulationCheck.loading svg .pupil { + animation: spin 2s linear infinite; } + #commentModal #reformulationCheck svg { + fill: none; + stroke: none; } + #commentModal #reformulationCheck svg .eye { + stroke: #e5e5e5; } + #commentModal #reformulationCheck svg .eyelid { + fill: #e5e5e5; } + #commentModal #reformulationCheck svg .pupil { + fill: #666666; } + #commentModal #reformulationCheck svg .line, #commentModal #reformulationCheck svg .mouth { + stroke: #9e9e9e; + transition: stroke .3s, stroke-width .3s; } + #commentModal #reformulationCheck svg + span { + font-size: 10px; + border: 1px solid #9e9e9e; + margin-left: 7px; + margin-bottom: 5px; + padding: 0 5px; } + #commentModal #reformulationCheck svg + span::before { + content: ""; + position: absolute; + top: 10px; + left: 36px; + border: solid #9e9e9e; + border-width: 0 1px 1px 0; + padding: 3px; + background: #fafafa; + transform: rotate(135deg); } +#commentModal #opinion { + padding-bottom: 1rem; } + #commentModal #opinion input + span { + padding-left: 16px; } + #commentModal #opinion input + span::before { + display: none; } + #commentModal #opinion input + span::after { + display: none; } + #commentModal #opinion input:checked + span { + box-shadow: 0 3px 3px 0 rgba(0, 0, 0, 0.14) inset, 0 1px 7px 0 rgba(0, 0, 0, 0.12) inset, 0 3px 1px -1px rgba(0, 0, 0, 0.2) inset; } + #commentModal #opinion input:not(:checked) + span:not(:hover) { + opacity: 0.5; } + #commentModal #opinion label > .against { + background-color: #BA4100; } + #commentModal #opinion label > .neutral { + background-color: #B2B2B2; } + #commentModal #opinion label > .for { + background-color: #4D9999; } +#commentModal #hypostase .list { + display: grid; + width: 100%; + grid-template-columns: 1fr 1fr 1fr 1fr 1fr; + transition: height .3s; + height: 27px; } + #commentModal #hypostase .list.expert { + height: 219px; } + #commentModal #hypostase .list input[type="checkbox"] { + display: none; } + #commentModal #hypostase .list > div > .btn, #commentModal #hypostase .list > div > .btn-large, #commentModal #hypostase .list > div > .btn-small { + display: block; + height: auto; + line-height: initial; + text-align: center; + padding: 0; + cursor: pointer; + margin: 3px; + padding: 2px 5px !important; + text-transform: none; } + #commentModal #hypostase .list > div > .btn:first-of-type, #commentModal #hypostase .list > div > .btn-large:first-of-type, #commentModal #hypostase .list > div > .btn-small:first-of-type { + font-weight: bold; } + #commentModal #hypostase .list > div > .btn:not(:hover), #commentModal #hypostase .list > div > .btn-large:not(:hover), #commentModal #hypostase .list > div > .btn-small:not(:hover) { + opacity: 0.75; } + #commentModal #hypostase .list > div input:checked + .btn, #commentModal #hypostase .list > div input:checked + .btn-large, #commentModal #hypostase .list > div input:checked + .btn-small { + background: #4D9999 linear-gradient(0deg, #4D9999 0%, #4D9999 100%); + box-shadow: 0 3px 3px 0 rgba(0, 0, 0, 0.14) inset, 0 1px 7px 0 rgba(0, 0, 0, 0.12) inset, 0 3px 1px -1px rgba(0, 0, 0, 0.2) inset; + opacity: 1; } + +#documents .grid .gr.header .gh:hover { + background-color: #eef6f6; } +#documents .grid .gr.header .card-action { + line-height: 0; + padding-top: 0; + padding-bottom: 0; + border: none; + transition: all .3s; } + #documents .grid .gr.header .card-action .btn, #documents .grid .gr.header .card-action .btn-large, #documents .grid .gr.header .card-action .btn-small { + max-height: 0; } +#documents .grid .gr.header:focus-within .gh { + background-color: #5cd6d6 !important; } +#documents .grid .gr.header:focus-within .card-action { + padding-bottom: 15px; } + #documents .grid .gr.header:focus-within .card-action .btn, #documents .grid .gr.header:focus-within .card-action .btn-large, #documents .grid .gr.header:focus-within .card-action .btn-small { + max-height: 36px; } + +#document .input-field.inline { + margin: 0; } +#document .input-field { + margin-bottom: 1px; } +#document .ql-toolbar { + position: sticky; + top: 124px; + background: white; + z-index: 10; + height: 42px; + overflow: hidden; + transition: height .3s, padding .3s; } +#document .ql-container { + margin-top: -1px; + background: white; + border-top: 1px solid #ccc; + transition: margin-top .3s; } + #document .ql-container .ql-editor { + margin-bottom: 10px; + text-align: justify; + transition: height .3s; } +#document #documentDisplay:not(.in-edition) .ql-toolbar { + height: 0; + padding-top: 0; + padding-bottom: 0; + border-bottom-width: 0; } + +#createDebate .steps > .tabs { + position: sticky; + top: 75px; + z-index: 9; + display: block; + margin-top: -50px; + text-align: center; + border: none; + height: auto; + background: white; } + #createDebate .steps > .tabs .tab { + height: auto; } + #createDebate .steps > .tabs .tab a { + text-transform: capitalize; + line-height: 1em; } + #createDebate .steps > .tabs .tab a::after { + content: none; } + #createDebate .steps > .tabs .tab:not(.disabled) a.active img, #createDebate .steps > .tabs .tab:not(.disabled) a:hover img { + border: 1px solid #5cd6d6; + border-radius: 200px; + margin: 0 -1px; } + #createDebate .steps > .tabs .tab.disabled a img { + filter: grayscale(100%); } +#createDebate .steps .grid > .ghead .gh { + position: sticky; + top: 202px; + background: white; + z-index: 8; } +#createDebate .steps .grid .gh .card { + top: 242px; } +#createDebate .steps #contributors > div > .tabs { + position: sticky; + top: 202px; + background: white; + z-index: 8; } +#createDebate .steps #contributors .grid > .ghead .gh { + position: sticky; + top: 250px; + background: white; + z-index: 8; } +#createDebate .steps .collection-item > span { + display: inline-block; + max-width: calc(100% - 40px); } +#createDebate .steps .collection-item .close { + cursor: pointer; } +#createDebate #advancedOptions > li { + cursor: pointer; } + #createDebate #advancedOptions > li .arrow { + right: 20px; + position: absolute; } +#createDebate #advancedOptions #advancedOptionsBody { + overflow: hidden; } + #createDebate #advancedOptions #advancedOptionsBody > ul { + transition: margin-top .3s; } + +#contributors .search-box { + width: 20em; + margin: 0; } + +#sort-options { + height: 46px; } + #sort-options select { + width: 50%; + float: left; + margin: 0; } + #sort-options .input-field { + width: 20em; + max-width: 50%; + float: right; + margin: 0; } + +#teams #header > div > select { + text-overflow: ellipsis; + color: #B84000; } +#teams .search-box { + margin: 0; } + +#restitution .detail { + background: white; + margin-right: 10px; + margin-bottom: 10px; } + #restitution .detail .document { + padding: 1px 10px; + text-align: justify; + font-size: 13px; + line-height: 1.42; } +#restitution .D3_tree { + width: 100%; + overflow: auto; + height: calc(100vh - 172px); + position: relative; } + #restitution .D3_tree .detail { + background: white; + position: sticky; + height: min-content; + width: 50%; + top: 10px; + left: calc(50% - 10px); } + #restitution .D3_tree svg { + position: absolute; + pointer-events: all; } + #restitution .D3_tree svg .nodes text { + font: 12px sans-serif; } + #restitution .D3_tree svg .nodes .bullet { + cursor: pointer; } + #restitution .D3_tree svg .nodes .bullet:hover { + r: 4px; } + #restitution .D3_tree svg .nodes .with-children text { + cursor: pointer; } + #restitution .D3_tree svg .nodes .with-children .bullet:hover { + r: 3px; } + #restitution .D3_tree svg .links { + fill: none; + stroke: black; + stroke-width: 0.5px; + stroke-opacity: 0.5; } +#restitution .D3_pie { + width: 100%; + height: calc(100vh - 172px); + position: relative; + display: grid; + grid-template-rows: 40px 1fr; + grid-template-columns: 50% 50%; } + #restitution .D3_pie svg { + pointer-events: all; } + #restitution .D3_pie svg .detailsCircle { + fill-opacity: 0.35; + fill: none; } + #restitution .D3_pie svg .detailsText { + text-anchor: middle; } +#restitution .D3_sunburst { + width: 100%; + height: calc(100vh - 172px); + overflow: auto; + display: grid; + grid-template-rows: 40px 1fr; + grid-template-columns: 50% 50%; } + #restitution .D3_sunburst svg { + position: sticky; + top: 40px; + pointer-events: all; } + #restitution .D3_sunburst svg .slices path { + stroke: none; + cursor: pointer; } +#restitution .D3_pie .switch, #restitution .D3_sunburst .switch { + padding: 9px 0; + align-self: center; + background: white; + position: sticky; + top: 0; } +#restitution .D3_pie .legend, #restitution .D3_sunburst .legend { + height: 100%; + overflow: auto; + display: flex; + flex-flow: column wrap; + align-content: flex-start; } + #restitution .D3_pie .legend > div, #restitution .D3_sunburst .legend > div { + cursor: default; + padding-right: 10px; + height: 1.4em; + overflow: hidden; + transition: height .3s ease, opacity .3s ease; } + #restitution .D3_pie .legend > div.v-enter, #restitution .D3_pie .legend > div.v-leave-to, #restitution .D3_sunburst .legend > div.v-enter, #restitution .D3_sunburst .legend > div.v-leave-to { + opacity: 0; + height: 0; } + #restitution .D3_pie .legend > div:hover, #restitution .D3_pie .legend > div.active, #restitution .D3_sunburst .legend > div:hover, #restitution .D3_sunburst .legend > div.active { + background: #eef6f6; } + #restitution .D3_pie .legend > div .square, #restitution .D3_sunburst .legend > div .square { + display: inline-block; + vertical-align: middle; + width: 1em; + height: 1em; + border: 1px solid black; + margin-right: 5px; } +#restitution #tagsRestitution { + margin: 0; + height: calc(100vh - 194px); } + #restitution #tagsRestitution > .col { + height: 100%; + margin: 0; + padding: 15px 0; + overflow: auto; } + #restitution #tagsRestitution > .col .chip { + opacity: 0.5; + padding-left: 5px; + transition: opacity 0.3s; } + #restitution #tagsRestitution > .col .chip.active { + opacity: 1; } + #restitution #tagsRestitution > .col .chip [type="checkbox"] { + display: none; } + #restitution #tagsRestitution > .col .chip [type="checkbox"] + span { + font-size: inherit; + padding-left: 25px; } + #restitution #tagsRestitution > .col .chip [type="checkbox"] + span::before, #restitution #tagsRestitution > .col .chip [type="checkbox"] + span::after { + content: ''; + position: absolute; + left: 0; + top: 0; + margin: 4px; + width: 16px; + height: 16px; + z-index: 0; + -webkit-transition: .28s ease; + transition: .28s ease; + border-radius: 50%; } + #restitution #tagsRestitution > .col .chip [type="checkbox"]:checked + span::before { + border-color: white; + transform: none; } + #restitution #tagsRestitution > .col .chip [type="checkbox"]:checked + span::after { + transform: scale(0.5); + background-color: white; } + +/*# sourceMappingURL=app.css.map */ diff --git a/src/main/webapp/assets/css/app.css.map b/src/main/webapp/assets/css/app.css.map new file mode 100644 index 0000000..d71e9a9 --- /dev/null +++ b/src/main/webapp/assets/css/app.css.map @@ -0,0 +1,7 @@ +{ +"version": 3, +"mappings": "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", +"sources": ["../../WEB-INF/sass/_variables.scss","../../WEB-INF/sass/components/_color-classes.scss","../../WEB-INF/sass/components/_normalize.scss","../../WEB-INF/sass/components/_global.scss","../../WEB-INF/sass/components/_variables.scss","../../WEB-INF/sass/components/_badges.scss","../../WEB-INF/sass/components/_color-variables.scss","../../WEB-INF/sass/components/_icons-material-design.scss","../../WEB-INF/sass/components/_grid.scss","../../WEB-INF/sass/components/_navbar.scss","../../WEB-INF/sass/components/_typography.scss","../../WEB-INF/sass/components/_transitions.scss","../../WEB-INF/sass/components/_cards.scss","../../WEB-INF/sass/components/_toast.scss","../../WEB-INF/sass/components/_tabs.scss","../../WEB-INF/sass/components/_tooltip.scss","../../WEB-INF/sass/components/_buttons.scss","../../WEB-INF/sass/components/_dropdown.scss","../../WEB-INF/sass/components/_waves.scss","../../WEB-INF/sass/components/_modal.scss","../../WEB-INF/sass/components/_collapsible.scss","../../WEB-INF/sass/components/_chips.scss","../../WEB-INF/sass/components/_materialbox.scss","../../WEB-INF/sass/components/forms/_forms.scss","../../WEB-INF/sass/components/forms/_input-fields.scss","../../WEB-INF/sass/components/forms/_radio-buttons.scss","../../WEB-INF/sass/components/forms/_checkboxes.scss","../../WEB-INF/sass/components/forms/_switches.scss","../../WEB-INF/sass/components/forms/_select.scss","../../WEB-INF/sass/components/forms/_file-input.scss","../../WEB-INF/sass/components/forms/_range.scss","../../WEB-INF/sass/components/_table_of_contents.scss","../../WEB-INF/sass/components/_sidenav.scss","../../WEB-INF/sass/components/_preloader.scss","../../WEB-INF/sass/components/_slider.scss","../../WEB-INF/sass/components/_carousel.scss","../../WEB-INF/sass/components/_tapTarget.scss","../../WEB-INF/sass/components/_pulse.scss","../../WEB-INF/sass/components/_datepicker.scss","../../WEB-INF/sass/components/_timepicker.scss","../../WEB-INF/sass/_components.scss","../../WEB-INF/sass/app.scss"], +"names": [], +"file": "app.css" +} diff --git a/src/main/webapp/assets/css/app.min.css b/src/main/webapp/assets/css/app.min.css new file mode 100644 index 0000000..afebe58 --- /dev/null +++ b/src/main/webapp/assets/css/app.min.css @@ -0,0 +1,8 @@ +@font-face{font-family:"Seravek";src:url("../font/seravek-light-webfont.woff") format("woff");font-weight:100}@font-face{font-family:"Seravek";src:url("../font/seravek-regular-webfont.woff") format("woff");font-weight:400}@font-face{font-family:"Seravek";src:url("../font/seravek-medium-webfont.woff") format("woff");font-weight:700}@font-face{font-family:"Seravek";src:url("../font/seravek-bold-webfont.woff") format("woff");font-weight:900}@font-face{font-family:'Material Icons';font-style:normal;font-weight:400;src:url("../font/material-icons.woff") format("woff2")}:root{--blue-color:#4d9999;--red-color:#ba4100;--green-color:#26a96c;--grey-color:#b2b2b2}.materialize-red{background-color:#e51c23!important}.materialize-red-text{color:#e51c23!important}.materialize-red.lighten-5{background-color:#fdeaeb!important}.materialize-red-text.text-lighten-5{color:#fdeaeb!important}.materialize-red.lighten-4{background-color:#f8c1c3!important}.materialize-red-text.text-lighten-4{color:#f8c1c3!important}.materialize-red.lighten-3{background-color:#f3989b!important}.materialize-red-text.text-lighten-3{color:#f3989b!important}.materialize-red.lighten-2{background-color:#ee6e73!important}.materialize-red-text.text-lighten-2{color:#ee6e73!important}.materialize-red.lighten-1{background-color:#ea454b!important}.materialize-red-text.text-lighten-1{color:#ea454b!important}.materialize-red.darken-1{background-color:#d0181e!important}.materialize-red-text.text-darken-1{color:#d0181e!important}.materialize-red.darken-2{background-color:#b9151b!important}.materialize-red-text.text-darken-2{color:#b9151b!important}.materialize-red.darken-3{background-color:#a21318!important}.materialize-red-text.text-darken-3{color:#a21318!important}.materialize-red.darken-4{background-color:#8b1014!important}.materialize-red-text.text-darken-4{color:#8b1014!important}.red{background-color:#f44336!important}.red-text{color:#f44336!important}.red.lighten-5{background-color:#ffebee!important}.red-text.text-lighten-5{color:#ffebee!important}.red.lighten-4{background-color:#ffcdd2!important}.red-text.text-lighten-4{color:#ffcdd2!important}.red.lighten-3{background-color:#ef9a9a!important}.red-text.text-lighten-3{color:#ef9a9a!important}.red.lighten-2{background-color:#e57373!important}.red-text.text-lighten-2{color:#e57373!important}.red.lighten-1{background-color:#ef5350!important}.red-text.text-lighten-1{color:#ef5350!important}.red.darken-1{background-color:#e53935!important}.red-text.text-darken-1{color:#e53935!important}.red.darken-2{background-color:#d32f2f!important}.red-text.text-darken-2{color:#d32f2f!important}.red.darken-3{background-color:#c62828!important}.red-text.text-darken-3{color:#c62828!important}.red.darken-4{background-color:#b71c1c!important}.red-text.text-darken-4{color:#b71c1c!important}.red.accent-1{background-color:#ff8a80!important}.red-text.text-accent-1{color:#ff8a80!important}.red.accent-2{background-color:#ff5252!important}.red-text.text-accent-2{color:#ff5252!important}.red.accent-3{background-color:#ff1744!important}.red-text.text-accent-3{color:#ff1744!important}.red.accent-4{background-color:#d50000!important}.red-text.text-accent-4{color:#d50000!important}.pink{background-color:#e91e63!important}.pink-text{color:#e91e63!important}.pink.lighten-5{background-color:#fce4ec!important}.pink-text.text-lighten-5{color:#fce4ec!important}.pink.lighten-4{background-color:#f8bbd0!important}.pink-text.text-lighten-4{color:#f8bbd0!important}.pink.lighten-3{background-color:#f48fb1!important}.pink-text.text-lighten-3{color:#f48fb1!important}.pink.lighten-2{background-color:#f06292!important}.pink-text.text-lighten-2{color:#f06292!important}.pink.lighten-1{background-color:#ec407a!important}.pink-text.text-lighten-1{color:#ec407a!important}.pink.darken-1{background-color:#d81b60!important}.pink-text.text-darken-1{color:#d81b60!important}.pink.darken-2{background-color:#c2185b!important}.pink-text.text-darken-2{color:#c2185b!important}.pink.darken-3{background-color:#ad1457!important}.pink-text.text-darken-3{color:#ad1457!important}.pink.darken-4{background-color:#880e4f!important}.pink-text.text-darken-4{color:#880e4f!important}.pink.accent-1{background-color:#ff80ab!important}.pink-text.text-accent-1{color:#ff80ab!important}.pink.accent-2{background-color:#ff4081!important}.pink-text.text-accent-2{color:#ff4081!important}.pink.accent-3{background-color:#f50057!important}.pink-text.text-accent-3{color:#f50057!important}.pink.accent-4{background-color:#c51162!important}.pink-text.text-accent-4{color:#c51162!important}.purple{background-color:#9c27b0!important}.purple-text{color:#9c27b0!important}.purple.lighten-5{background-color:#f3e5f5!important}.purple-text.text-lighten-5{color:#f3e5f5!important}.purple.lighten-4{background-color:#e1bee7!important}.purple-text.text-lighten-4{color:#e1bee7!important}.purple.lighten-3{background-color:#ce93d8!important}.purple-text.text-lighten-3{color:#ce93d8!important}.purple.lighten-2{background-color:#ba68c8!important}.purple-text.text-lighten-2{color:#ba68c8!important}.purple.lighten-1{background-color:#ab47bc!important}.purple-text.text-lighten-1{color:#ab47bc!important}.purple.darken-1{background-color:#8e24aa!important}.purple-text.text-darken-1{color:#8e24aa!important}.purple.darken-2{background-color:#7b1fa2!important}.purple-text.text-darken-2{color:#7b1fa2!important}.purple.darken-3{background-color:#6a1b9a!important}.purple-text.text-darken-3{color:#6a1b9a!important}.purple.darken-4{background-color:#4a148c!important}.purple-text.text-darken-4{color:#4a148c!important}.purple.accent-1{background-color:#ea80fc!important}.purple-text.text-accent-1{color:#ea80fc!important}.purple.accent-2{background-color:#e040fb!important}.purple-text.text-accent-2{color:#e040fb!important}.purple.accent-3{background-color:#d500f9!important}.purple-text.text-accent-3{color:#d500f9!important}.purple.accent-4{background-color:#a0f!important}.purple-text.text-accent-4{color:#a0f!important}.deep-purple{background-color:#673ab7!important}.deep-purple-text{color:#673ab7!important}.deep-purple.lighten-5{background-color:#ede7f6!important}.deep-purple-text.text-lighten-5{color:#ede7f6!important}.deep-purple.lighten-4{background-color:#d1c4e9!important}.deep-purple-text.text-lighten-4{color:#d1c4e9!important}.deep-purple.lighten-3{background-color:#b39ddb!important}.deep-purple-text.text-lighten-3{color:#b39ddb!important}.deep-purple.lighten-2{background-color:#9575cd!important}.deep-purple-text.text-lighten-2{color:#9575cd!important}.deep-purple.lighten-1{background-color:#7e57c2!important}.deep-purple-text.text-lighten-1{color:#7e57c2!important}.deep-purple.darken-1{background-color:#5e35b1!important}.deep-purple-text.text-darken-1{color:#5e35b1!important}.deep-purple.darken-2{background-color:#512da8!important}.deep-purple-text.text-darken-2{color:#512da8!important}.deep-purple.darken-3{background-color:#4527a0!important}.deep-purple-text.text-darken-3{color:#4527a0!important}.deep-purple.darken-4{background-color:#311b92!important}.deep-purple-text.text-darken-4{color:#311b92!important}.deep-purple.accent-1{background-color:#b388ff!important}.deep-purple-text.text-accent-1{color:#b388ff!important}.deep-purple.accent-2{background-color:#7c4dff!important}.deep-purple-text.text-accent-2{color:#7c4dff!important}.deep-purple.accent-3{background-color:#651fff!important}.deep-purple-text.text-accent-3{color:#651fff!important}.deep-purple.accent-4{background-color:#6200ea!important}.deep-purple-text.text-accent-4{color:#6200ea!important}.indigo{background-color:#3f51b5!important}.indigo-text{color:#3f51b5!important}.indigo.lighten-5{background-color:#e8eaf6!important}.indigo-text.text-lighten-5{color:#e8eaf6!important}.indigo.lighten-4{background-color:#c5cae9!important}.indigo-text.text-lighten-4{color:#c5cae9!important}.indigo.lighten-3{background-color:#9fa8da!important}.indigo-text.text-lighten-3{color:#9fa8da!important}.indigo.lighten-2{background-color:#7986cb!important}.indigo-text.text-lighten-2{color:#7986cb!important}.indigo.lighten-1{background-color:#5c6bc0!important}.indigo-text.text-lighten-1{color:#5c6bc0!important}.indigo.darken-1{background-color:#3949ab!important}.indigo-text.text-darken-1{color:#3949ab!important}.indigo.darken-2{background-color:#303f9f!important}.indigo-text.text-darken-2{color:#303f9f!important}.indigo.darken-3{background-color:#283593!important}.indigo-text.text-darken-3{color:#283593!important}.indigo.darken-4{background-color:#1a237e!important}.indigo-text.text-darken-4{color:#1a237e!important}.indigo.accent-1{background-color:#8c9eff!important}.indigo-text.text-accent-1{color:#8c9eff!important}.indigo.accent-2{background-color:#536dfe!important}.indigo-text.text-accent-2{color:#536dfe!important}.indigo.accent-3{background-color:#3d5afe!important}.indigo-text.text-accent-3{color:#3d5afe!important}.indigo.accent-4{background-color:#304ffe!important}.indigo-text.text-accent-4{color:#304ffe!important}.blue{background-color:#2196f3!important}.blue-text{color:#2196f3!important}.blue.lighten-5{background-color:#e3f2fd!important}.blue-text.text-lighten-5{color:#e3f2fd!important}.blue.lighten-4{background-color:#bbdefb!important}.blue-text.text-lighten-4{color:#bbdefb!important}.blue.lighten-3{background-color:#90caf9!important}.blue-text.text-lighten-3{color:#90caf9!important}.blue.lighten-2{background-color:#64b5f6!important}.blue-text.text-lighten-2{color:#64b5f6!important}.blue.lighten-1{background-color:#42a5f5!important}.blue-text.text-lighten-1{color:#42a5f5!important}.blue.darken-1{background-color:#1e88e5!important}.blue-text.text-darken-1{color:#1e88e5!important}.blue.darken-2{background-color:#1976d2!important}.blue-text.text-darken-2{color:#1976d2!important}.blue.darken-3{background-color:#1565c0!important}.blue-text.text-darken-3{color:#1565c0!important}.blue.darken-4{background-color:#0d47a1!important}.blue-text.text-darken-4{color:#0d47a1!important}.blue.accent-1{background-color:#82b1ff!important}.blue-text.text-accent-1{color:#82b1ff!important}.blue.accent-2{background-color:#448aff!important}.blue-text.text-accent-2{color:#448aff!important}.blue.accent-3{background-color:#2979ff!important}.blue-text.text-accent-3{color:#2979ff!important}.blue.accent-4{background-color:#2962ff!important}.blue-text.text-accent-4{color:#2962ff!important}.light-blue{background-color:#03a9f4!important}.light-blue-text{color:#03a9f4!important}.light-blue.lighten-5{background-color:#e1f5fe!important}.light-blue-text.text-lighten-5{color:#e1f5fe!important}.light-blue.lighten-4{background-color:#b3e5fc!important}.light-blue-text.text-lighten-4{color:#b3e5fc!important}.light-blue.lighten-3{background-color:#81d4fa!important}.light-blue-text.text-lighten-3{color:#81d4fa!important}.light-blue.lighten-2{background-color:#4fc3f7!important}.light-blue-text.text-lighten-2{color:#4fc3f7!important}.light-blue.lighten-1{background-color:#29b6f6!important}.light-blue-text.text-lighten-1{color:#29b6f6!important}.light-blue.darken-1{background-color:#039be5!important}.light-blue-text.text-darken-1{color:#039be5!important}.light-blue.darken-2{background-color:#0288d1!important}.light-blue-text.text-darken-2{color:#0288d1!important}.light-blue.darken-3{background-color:#0277bd!important}.light-blue-text.text-darken-3{color:#0277bd!important}.light-blue.darken-4{background-color:#01579b!important}.light-blue-text.text-darken-4{color:#01579b!important}.light-blue.accent-1{background-color:#80d8ff!important}.light-blue-text.text-accent-1{color:#80d8ff!important}.light-blue.accent-2{background-color:#40c4ff!important}.light-blue-text.text-accent-2{color:#40c4ff!important}.light-blue.accent-3{background-color:#00b0ff!important}.light-blue-text.text-accent-3{color:#00b0ff!important}.light-blue.accent-4{background-color:#0091ea!important}.light-blue-text.text-accent-4{color:#0091ea!important}.cyan{background-color:#00bcd4!important}.cyan-text{color:#00bcd4!important}.cyan.lighten-5{background-color:#e0f7fa!important}.cyan-text.text-lighten-5{color:#e0f7fa!important}.cyan.lighten-4{background-color:#b2ebf2!important}.cyan-text.text-lighten-4{color:#b2ebf2!important}.cyan.lighten-3{background-color:#80deea!important}.cyan-text.text-lighten-3{color:#80deea!important}.cyan.lighten-2{background-color:#4dd0e1!important}.cyan-text.text-lighten-2{color:#4dd0e1!important}.cyan.lighten-1{background-color:#26c6da!important}.cyan-text.text-lighten-1{color:#26c6da!important}.cyan.darken-1{background-color:#00acc1!important}.cyan-text.text-darken-1{color:#00acc1!important}.cyan.darken-2{background-color:#0097a7!important}.cyan-text.text-darken-2{color:#0097a7!important}.cyan.darken-3{background-color:#00838f!important}.cyan-text.text-darken-3{color:#00838f!important}.cyan.darken-4{background-color:#006064!important}.cyan-text.text-darken-4{color:#006064!important}.cyan.accent-1{background-color:#84ffff!important}.cyan-text.text-accent-1{color:#84ffff!important}.cyan.accent-2{background-color:#18ffff!important}.cyan-text.text-accent-2{color:#18ffff!important}.cyan.accent-3{background-color:#00e5ff!important}.cyan-text.text-accent-3{color:#00e5ff!important}.cyan.accent-4{background-color:#00b8d4!important}.cyan-text.text-accent-4{color:#00b8d4!important}.teal{background-color:#009688!important}.teal-text{color:#009688!important}.teal.lighten-5{background-color:#e0f2f1!important}.teal-text.text-lighten-5{color:#e0f2f1!important}.teal.lighten-4{background-color:#b2dfdb!important}.teal-text.text-lighten-4{color:#b2dfdb!important}.teal.lighten-3{background-color:#80cbc4!important}.teal-text.text-lighten-3{color:#80cbc4!important}.teal.lighten-2{background-color:#4db6ac!important}.teal-text.text-lighten-2{color:#4db6ac!important}.teal.lighten-1{background-color:#26a69a!important}.teal-text.text-lighten-1{color:#26a69a!important}.teal.darken-1{background-color:#00897b!important}.teal-text.text-darken-1{color:#00897b!important}.teal.darken-2{background-color:#00796b!important}.teal-text.text-darken-2{color:#00796b!important}.teal.darken-3{background-color:#00695c!important}.teal-text.text-darken-3{color:#00695c!important}.teal.darken-4{background-color:#004d40!important}.teal-text.text-darken-4{color:#004d40!important}.teal.accent-1{background-color:#a7ffeb!important}.teal-text.text-accent-1{color:#a7ffeb!important}.teal.accent-2{background-color:#64ffda!important}.teal-text.text-accent-2{color:#64ffda!important}.teal.accent-3{background-color:#1de9b6!important}.teal-text.text-accent-3{color:#1de9b6!important}.teal.accent-4{background-color:#00bfa5!important}.teal-text.text-accent-4{color:#00bfa5!important}.green{background-color:#4caf50!important}.green-text{color:#4caf50!important}.green.lighten-5{background-color:#e8f5e9!important}.green-text.text-lighten-5{color:#e8f5e9!important}.green.lighten-4{background-color:#c8e6c9!important}.green-text.text-lighten-4{color:#c8e6c9!important}.green.lighten-3{background-color:#a5d6a7!important}.green-text.text-lighten-3{color:#a5d6a7!important}.green.lighten-2{background-color:#81c784!important}.green-text.text-lighten-2{color:#81c784!important}.green.lighten-1{background-color:#66bb6a!important}.green-text.text-lighten-1{color:#66bb6a!important}.green.darken-1{background-color:#43a047!important}.green-text.text-darken-1{color:#43a047!important}.green.darken-2{background-color:#388e3c!important}.green-text.text-darken-2{color:#388e3c!important}.green.darken-3{background-color:#2e7d32!important}.green-text.text-darken-3{color:#2e7d32!important}.green.darken-4{background-color:#1b5e20!important}.green-text.text-darken-4{color:#1b5e20!important}.green.accent-1{background-color:#b9f6ca!important}.green-text.text-accent-1{color:#b9f6ca!important}.green.accent-2{background-color:#69f0ae!important}.green-text.text-accent-2{color:#69f0ae!important}.green.accent-3{background-color:#00e676!important}.green-text.text-accent-3{color:#00e676!important}.green.accent-4{background-color:#00c853!important}.green-text.text-accent-4{color:#00c853!important}.light-green{background-color:#8bc34a!important}.light-green-text{color:#8bc34a!important}.light-green.lighten-5{background-color:#f1f8e9!important}.light-green-text.text-lighten-5{color:#f1f8e9!important}.light-green.lighten-4{background-color:#dcedc8!important}.light-green-text.text-lighten-4{color:#dcedc8!important}.light-green.lighten-3{background-color:#c5e1a5!important}.light-green-text.text-lighten-3{color:#c5e1a5!important}.light-green.lighten-2{background-color:#aed581!important}.light-green-text.text-lighten-2{color:#aed581!important}.light-green.lighten-1{background-color:#9ccc65!important}.light-green-text.text-lighten-1{color:#9ccc65!important}.light-green.darken-1{background-color:#7cb342!important}.light-green-text.text-darken-1{color:#7cb342!important}.light-green.darken-2{background-color:#689f38!important}.light-green-text.text-darken-2{color:#689f38!important}.light-green.darken-3{background-color:#558b2f!important}.light-green-text.text-darken-3{color:#558b2f!important}.light-green.darken-4{background-color:#33691e!important}.light-green-text.text-darken-4{color:#33691e!important}.light-green.accent-1{background-color:#ccff90!important}.light-green-text.text-accent-1{color:#ccff90!important}.light-green.accent-2{background-color:#b2ff59!important}.light-green-text.text-accent-2{color:#b2ff59!important}.light-green.accent-3{background-color:#76ff03!important}.light-green-text.text-accent-3{color:#76ff03!important}.light-green.accent-4{background-color:#64dd17!important}.light-green-text.text-accent-4{color:#64dd17!important}.lime{background-color:#cddc39!important}.lime-text{color:#cddc39!important}.lime.lighten-5{background-color:#f9fbe7!important}.lime-text.text-lighten-5{color:#f9fbe7!important}.lime.lighten-4{background-color:#f0f4c3!important}.lime-text.text-lighten-4{color:#f0f4c3!important}.lime.lighten-3{background-color:#e6ee9c!important}.lime-text.text-lighten-3{color:#e6ee9c!important}.lime.lighten-2{background-color:#dce775!important}.lime-text.text-lighten-2{color:#dce775!important}.lime.lighten-1{background-color:#d4e157!important}.lime-text.text-lighten-1{color:#d4e157!important}.lime.darken-1{background-color:#c0ca33!important}.lime-text.text-darken-1{color:#c0ca33!important}.lime.darken-2{background-color:#afb42b!important}.lime-text.text-darken-2{color:#afb42b!important}.lime.darken-3{background-color:#9e9d24!important}.lime-text.text-darken-3{color:#9e9d24!important}.lime.darken-4{background-color:#827717!important}.lime-text.text-darken-4{color:#827717!important}.lime.accent-1{background-color:#f4ff81!important}.lime-text.text-accent-1{color:#f4ff81!important}.lime.accent-2{background-color:#eeff41!important}.lime-text.text-accent-2{color:#eeff41!important}.lime.accent-3{background-color:#c6ff00!important}.lime-text.text-accent-3{color:#c6ff00!important}.lime.accent-4{background-color:#aeea00!important}.lime-text.text-accent-4{color:#aeea00!important}.yellow{background-color:#ffeb3b!important}.yellow-text{color:#ffeb3b!important}.yellow.lighten-5{background-color:#fffde7!important}.yellow-text.text-lighten-5{color:#fffde7!important}.yellow.lighten-4{background-color:#fff9c4!important}.yellow-text.text-lighten-4{color:#fff9c4!important}.yellow.lighten-3{background-color:#fff59d!important}.yellow-text.text-lighten-3{color:#fff59d!important}.yellow.lighten-2{background-color:#fff176!important}.yellow-text.text-lighten-2{color:#fff176!important}.yellow.lighten-1{background-color:#ffee58!important}.yellow-text.text-lighten-1{color:#ffee58!important}.yellow.darken-1{background-color:#fdd835!important}.yellow-text.text-darken-1{color:#fdd835!important}.yellow.darken-2{background-color:#fbc02d!important}.yellow-text.text-darken-2{color:#fbc02d!important}.yellow.darken-3{background-color:#f9a825!important}.yellow-text.text-darken-3{color:#f9a825!important}.yellow.darken-4{background-color:#f57f17!important}.yellow-text.text-darken-4{color:#f57f17!important}.yellow.accent-1{background-color:#ffff8d!important}.yellow-text.text-accent-1{color:#ffff8d!important}.yellow.accent-2{background-color:#ff0!important}.yellow-text.text-accent-2{color:#ff0!important}.yellow.accent-3{background-color:#ffea00!important}.yellow-text.text-accent-3{color:#ffea00!important}.yellow.accent-4{background-color:#ffd600!important}.yellow-text.text-accent-4{color:#ffd600!important}.amber{background-color:#ffc107!important}.amber-text{color:#ffc107!important}.amber.lighten-5{background-color:#fff8e1!important}.amber-text.text-lighten-5{color:#fff8e1!important}.amber.lighten-4{background-color:#ffecb3!important}.amber-text.text-lighten-4{color:#ffecb3!important}.amber.lighten-3{background-color:#ffe082!important}.amber-text.text-lighten-3{color:#ffe082!important}.amber.lighten-2{background-color:#ffd54f!important}.amber-text.text-lighten-2{color:#ffd54f!important}.amber.lighten-1{background-color:#ffca28!important}.amber-text.text-lighten-1{color:#ffca28!important}.amber.darken-1{background-color:#ffb300!important}.amber-text.text-darken-1{color:#ffb300!important}.amber.darken-2{background-color:#ffa000!important}.amber-text.text-darken-2{color:#ffa000!important}.amber.darken-3{background-color:#ff8f00!important}.amber-text.text-darken-3{color:#ff8f00!important}.amber.darken-4{background-color:#ff6f00!important}.amber-text.text-darken-4{color:#ff6f00!important}.amber.accent-1{background-color:#ffe57f!important}.amber-text.text-accent-1{color:#ffe57f!important}.amber.accent-2{background-color:#ffd740!important}.amber-text.text-accent-2{color:#ffd740!important}.amber.accent-3{background-color:#ffc400!important}.amber-text.text-accent-3{color:#ffc400!important}.amber.accent-4{background-color:#ffab00!important}.amber-text.text-accent-4{color:#ffab00!important}.orange{background-color:#ff9800!important}.orange-text{color:#ff9800!important}.orange.lighten-5{background-color:#fff3e0!important}.orange-text.text-lighten-5{color:#fff3e0!important}.orange.lighten-4{background-color:#ffe0b2!important}.orange-text.text-lighten-4{color:#ffe0b2!important}.orange.lighten-3{background-color:#ffcc80!important}.orange-text.text-lighten-3{color:#ffcc80!important}.orange.lighten-2{background-color:#ffb74d!important}.orange-text.text-lighten-2{color:#ffb74d!important}.orange.lighten-1{background-color:#ffa726!important}.orange-text.text-lighten-1{color:#ffa726!important}.orange.darken-1{background-color:#fb8c00!important}.orange-text.text-darken-1{color:#fb8c00!important}.orange.darken-2{background-color:#f57c00!important}.orange-text.text-darken-2{color:#f57c00!important}.orange.darken-3{background-color:#ef6c00!important}.orange-text.text-darken-3{color:#ef6c00!important}.orange.darken-4{background-color:#e65100!important}.orange-text.text-darken-4{color:#e65100!important}.orange.accent-1{background-color:#ffd180!important}.orange-text.text-accent-1{color:#ffd180!important}.orange.accent-2{background-color:#ffab40!important}.orange-text.text-accent-2{color:#ffab40!important}.orange.accent-3{background-color:#ff9100!important}.orange-text.text-accent-3{color:#ff9100!important}.orange.accent-4{background-color:#ff6d00!important}.orange-text.text-accent-4{color:#ff6d00!important}.deep-orange{background-color:#ff5722!important}.deep-orange-text{color:#ff5722!important}.deep-orange.lighten-5{background-color:#fbe9e7!important}.deep-orange-text.text-lighten-5{color:#fbe9e7!important}.deep-orange.lighten-4{background-color:#ffccbc!important}.deep-orange-text.text-lighten-4{color:#ffccbc!important}.deep-orange.lighten-3{background-color:#ffab91!important}.deep-orange-text.text-lighten-3{color:#ffab91!important}.deep-orange.lighten-2{background-color:#ff8a65!important}.deep-orange-text.text-lighten-2{color:#ff8a65!important}.deep-orange.lighten-1{background-color:#ff7043!important}.deep-orange-text.text-lighten-1{color:#ff7043!important}.deep-orange.darken-1{background-color:#f4511e!important}.deep-orange-text.text-darken-1{color:#f4511e!important}.deep-orange.darken-2{background-color:#e64a19!important}.deep-orange-text.text-darken-2{color:#e64a19!important}.deep-orange.darken-3{background-color:#d84315!important}.deep-orange-text.text-darken-3{color:#d84315!important}.deep-orange.darken-4{background-color:#bf360c!important}.deep-orange-text.text-darken-4{color:#bf360c!important}.deep-orange.accent-1{background-color:#ff9e80!important}.deep-orange-text.text-accent-1{color:#ff9e80!important}.deep-orange.accent-2{background-color:#ff6e40!important}.deep-orange-text.text-accent-2{color:#ff6e40!important}.deep-orange.accent-3{background-color:#ff3d00!important}.deep-orange-text.text-accent-3{color:#ff3d00!important}.deep-orange.accent-4{background-color:#dd2c00!important}.deep-orange-text.text-accent-4{color:#dd2c00!important}.brown{background-color:#795548!important}.brown-text{color:#795548!important}.brown.lighten-5{background-color:#efebe9!important}.brown-text.text-lighten-5{color:#efebe9!important}.brown.lighten-4{background-color:#d7ccc8!important}.brown-text.text-lighten-4{color:#d7ccc8!important}.brown.lighten-3{background-color:#bcaaa4!important}.brown-text.text-lighten-3{color:#bcaaa4!important}.brown.lighten-2{background-color:#a1887f!important}.brown-text.text-lighten-2{color:#a1887f!important}.brown.lighten-1{background-color:#8d6e63!important}.brown-text.text-lighten-1{color:#8d6e63!important}.brown.darken-1{background-color:#6d4c41!important}.brown-text.text-darken-1{color:#6d4c41!important}.brown.darken-2{background-color:#5d4037!important}.brown-text.text-darken-2{color:#5d4037!important}.brown.darken-3{background-color:#4e342e!important}.brown-text.text-darken-3{color:#4e342e!important}.brown.darken-4{background-color:#3e2723!important}.brown-text.text-darken-4{color:#3e2723!important}.blue-grey{background-color:#607d8b!important}.blue-grey-text{color:#607d8b!important}.blue-grey.lighten-5{background-color:#eceff1!important}.blue-grey-text.text-lighten-5{color:#eceff1!important}.blue-grey.lighten-4{background-color:#cfd8dc!important}.blue-grey-text.text-lighten-4{color:#cfd8dc!important}.blue-grey.lighten-3{background-color:#b0bec5!important}.blue-grey-text.text-lighten-3{color:#b0bec5!important}.blue-grey.lighten-2{background-color:#90a4ae!important}.blue-grey-text.text-lighten-2{color:#90a4ae!important}.blue-grey.lighten-1{background-color:#78909c!important}.blue-grey-text.text-lighten-1{color:#78909c!important}.blue-grey.darken-1{background-color:#546e7a!important}.blue-grey-text.text-darken-1{color:#546e7a!important}.blue-grey.darken-2{background-color:#455a64!important}.blue-grey-text.text-darken-2{color:#455a64!important}.blue-grey.darken-3{background-color:#37474f!important}.blue-grey-text.text-darken-3{color:#37474f!important}.blue-grey.darken-4{background-color:#263238!important}.blue-grey-text.text-darken-4{color:#263238!important}.grey{background-color:#9e9e9e!important}.grey-text{color:#9e9e9e!important}.grey.lighten-5{background-color:#fafafa!important}.grey-text.text-lighten-5{color:#fafafa!important}.grey.lighten-4{background-color:#f5f5f5!important}.grey-text.text-lighten-4{color:#f5f5f5!important}.grey.lighten-3{background-color:#eee!important}.grey-text.text-lighten-3{color:#eee!important}.grey.lighten-2{background-color:#e0e0e0!important}.grey-text.text-lighten-2{color:#e0e0e0!important}.grey.lighten-1{background-color:#bdbdbd!important}.grey-text.text-lighten-1{color:#bdbdbd!important}.grey.darken-1{background-color:#757575!important}.grey-text.text-darken-1{color:#757575!important}.grey.darken-2{background-color:#616161!important}.grey-text.text-darken-2{color:#616161!important}.grey.darken-3{background-color:#424242!important}.grey-text.text-darken-3{color:#424242!important}.grey.darken-4{background-color:#212121!important}.grey-text.text-darken-4{color:#212121!important}.black{background-color:#000!important}.black-text{color:#000!important}.white{background-color:#fff!important}.white-text{color:#fff!important}.transparent{background-color:transparent!important}.transparent-text{color:transparent!important}/*! normalize.css v7.0.0 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,footer,header,nav,section{display:block}h1{font-size:2em;margin:.67em 0}figcaption,figure,main{display:block}figure{margin:1em 40px}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent;-webkit-text-decoration-skip:objects}abbr[title]{border-bottom:0;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:inherit}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}dfn{font-style:italic}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}audio,video{display:inline-block}audio:not([controls]){display:none;height:0}img{border-style:none}svg:not(:root){overflow:hidden}button,input,optgroup,select,textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}button,html [type="button"],[type="reset"],[type="submit"]{-webkit-appearance:button}button::-moz-focus-inner,[type="button"]::-moz-focus-inner,[type="reset"]::-moz-focus-inner,[type="submit"]::-moz-focus-inner{border-style:none;padding:0}button:-moz-focusring,[type="button"]:-moz-focusring,[type="reset"]:-moz-focusring,[type="submit"]:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{display:inline-block;vertical-align:baseline}textarea{overflow:auto}[type="checkbox"],[type="radio"]{box-sizing:border-box;padding:0}[type="number"]::-webkit-inner-spin-button,[type="number"]::-webkit-outer-spin-button{height:auto}[type="search"]{-webkit-appearance:textfield;outline-offset:-2px}[type="search"]::-webkit-search-cancel-button,[type="search"]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details,menu{display:block}summary{display:list-item}canvas{display:inline-block}template{display:none}[hidden]{display:none}html{box-sizing:border-box}*,*:before,*:after{box-sizing:inherit}button,input,optgroup,select,textarea{font-family:Seravek,Helvetica,Roboto,Arial,sans-serif}ul:not(.browser-default){padding-left:0;list-style-type:none}ul:not(.browser-default)>li{list-style-type:none}a{color:#336362;text-decoration:none;-webkit-tap-highlight-color:transparent}.valign-wrapper{display:flex;align-items:center}.clearfix{clear:both}.z-depth-0{box-shadow:none!important}.z-depth-1,nav,.card-panel,.card,.toast,.btn,.btn-large,.btn-small,.btn-floating,.dropdown-content,.collapsible,.sidenav{box-shadow:0 2px 2px 0 rgba(0,0,0,0.14),0 3px 1px -2px rgba(0,0,0,0.12),0 1px 5px 0 rgba(0,0,0,0.2)}.z-depth-1-half,.btn:hover,.btn-large:hover,.btn-small:hover,.btn-floating:hover{box-shadow:0 3px 3px 0 rgba(0,0,0,0.14),0 1px 7px 0 rgba(0,0,0,0.12),0 3px 1px -1px rgba(0,0,0,0.2)}.z-depth-2{box-shadow:0 4px 5px 0 rgba(0,0,0,0.14),0 1px 10px 0 rgba(0,0,0,0.12),0 2px 4px -1px rgba(0,0,0,0.3)}.z-depth-3{box-shadow:0 8px 17px 2px rgba(0,0,0,0.14),0 3px 14px 2px rgba(0,0,0,0.12),0 5px 5px -3px rgba(0,0,0,0.2)}.z-depth-4{box-shadow:0 16px 24px 2px rgba(0,0,0,0.14),0 6px 30px 5px rgba(0,0,0,0.12),0 8px 10px -7px rgba(0,0,0,0.2)}.z-depth-5,.modal{box-shadow:0 24px 38px 3px rgba(0,0,0,0.14),0 9px 46px 8px rgba(0,0,0,0.12),0 11px 15px -7px rgba(0,0,0,0.2)}.hoverable{transition:box-shadow .25s}.hoverable:hover{box-shadow:0 8px 17px 0 rgba(0,0,0,0.2),0 6px 20px 0 rgba(0,0,0,0.19)}.divider{height:1px;overflow:hidden;background-color:#e0e0e0}blockquote{margin:20px 0;padding-left:1.5rem;border-left:5px solid #b84000}i{line-height:inherit}i.left{float:left;margin-right:15px}i.right{float:right;margin-left:15px}i.tiny{font-size:1rem}i.small{font-size:2rem}i.medium{font-size:4rem}i.large{font-size:6rem}img.responsive-img,video.responsive-video{max-width:100%;height:auto}.pagination li{display:inline-block;border-radius:2px;text-align:center;vertical-align:top;height:30px}.pagination li a{color:#444;display:inline-block;font-size:1.2rem;padding:0 10px;line-height:30px}.pagination li.active a{color:#fff}.pagination li.active{background-color:#b84000}.pagination li.disabled a{cursor:default;color:#999}.pagination li i{font-size:2rem}.pagination li.pages ul li{display:inline-block;float:none}@media only screen and (max-width:992px){.pagination{width:100%}.pagination li.prev,.pagination li.next{width:10%}.pagination li.pages{width:80%;overflow:hidden;white-space:nowrap}}.breadcrumb{font-size:18px;color:rgba(255,255,255,0.7)}.breadcrumb i,.breadcrumb [class^="mdi-"],.breadcrumb [class*="mdi-"],.breadcrumb i.material-icons{display:inline-block;float:left;font-size:24px}.breadcrumb:before{content:'\E5CC';color:rgba(255,255,255,0.7);vertical-align:top;display:inline-block;font-family:'Material Icons';font-weight:normal;font-style:normal;font-size:25px;margin:0 10px 0 8px;-webkit-font-smoothing:antialiased}.breadcrumb:first-child:before{display:none}.breadcrumb:last-child{color:#fff}.parallax-container{position:relative;overflow:hidden;height:500px}.parallax-container .parallax{position:absolute;top:0;left:0;right:0;bottom:0;z-index:-1}.parallax-container .parallax img{opacity:0;position:absolute;left:50%;bottom:0;min-width:100%;min-height:100%;transform:translate3d(0,0,0);transform:translateX(-50%)}.pin-top,.pin-bottom{position:relative}.pinned{position:fixed!important}ul.staggered-list li{opacity:0}.fade-in{opacity:0;transform-origin:0 50%}@media only screen and (max-width:600px){.hide-on-small-only,.hide-on-small-and-down{display:none!important}}@media only screen and (max-width:992px){.hide-on-med-and-down{display:none!important}}@media only screen and (min-width:601px){.hide-on-med-and-up{display:none!important}}@media only screen and (min-width:600px) and (max-width:992px){.hide-on-med-only{display:none!important}}@media only screen and (min-width:993px){.hide-on-large-only{display:none!important}}@media only screen and (min-width:1201px){.hide-on-extra-large-only{display:none!important}}@media only screen and (min-width:1201px){.show-on-extra-large{display:block!important}}@media only screen and (min-width:993px){.show-on-large{display:block!important}}@media only screen and (min-width:600px) and (max-width:992px){.show-on-medium{display:block!important}}@media only screen and (max-width:600px){.show-on-small{display:block!important}}@media only screen and (min-width:601px){.show-on-medium-and-up{display:block!important}}@media only screen and (max-width:992px){.show-on-medium-and-down{display:block!important}}@media only screen and (max-width:600px){.center-on-small-only{text-align:center}}.page-footer{padding-top:20px;color:#fff;background-color:#b84000}.page-footer .footer-copyright{overflow:hidden;min-height:50px;display:flex;align-items:center;justify-content:space-between;padding:10px 0;color:rgba(255,255,255,0.8);background-color:rgba(51,51,51,0.08)}table,th,td{border:0}table{width:100%;display:table;border-collapse:collapse;border-spacing:0}table.striped tr{border-bottom:0}table.striped>tbody>tr:nth-child(odd){background-color:rgba(242,242,242,0.5)}table.striped>tbody>tr>td{border-radius:0}table.highlight>tbody>tr{transition:background-color .25s ease}table.highlight>tbody>tr:hover{background-color:rgba(242,242,242,0.5)}table.centered thead tr th,table.centered tbody tr td{text-align:center}tr{border-bottom:1px solid rgba(0,0,0,0.12)}td,th{padding:15px 5px;display:table-cell;text-align:left;vertical-align:middle;border-radius:2px}@media only screen and (max-width:992px){table.responsive-table{width:100%;border-collapse:collapse;border-spacing:0;display:block;position:relative}table.responsive-table td:empty:before{content:'\00a0'}table.responsive-table th,table.responsive-table td{margin:0;vertical-align:top}table.responsive-table th{text-align:left}table.responsive-table thead{display:block;float:left}table.responsive-table thead tr{display:block;padding:0 10px 0 0}table.responsive-table thead tr th::before{content:"\00a0"}table.responsive-table tbody{display:block;width:auto;position:relative;overflow-x:auto;white-space:nowrap}table.responsive-table tbody tr{display:inline-block;vertical-align:top}table.responsive-table th{display:block;text-align:right}table.responsive-table td{display:block;min-height:1.25em;text-align:left}table.responsive-table tr{border-bottom:0;padding:0 10px}table.responsive-table thead{border:0;border-right:1px solid rgba(0,0,0,0.12)}}.collection{margin:.5rem 0 1rem 0;border:1px solid #e0e0e0;border-radius:2px;overflow:hidden;position:relative}.collection .collection-item{background-color:#fff;line-height:1.5rem;padding:10px 20px;margin:0;border-bottom:1px solid #e0e0e0}.collection .collection-item.avatar{min-height:84px;padding-left:72px;position:relative}.collection .collection-item.avatar:not(.circle-clipper)>.circle,.collection .collection-item.avatar :not(.circle-clipper)>.circle{position:absolute;width:42px;height:42px;overflow:hidden;left:15px;display:inline-block;vertical-align:middle}.collection .collection-item.avatar i.circle{font-size:18px;line-height:42px;color:#fff;background-color:#999;text-align:center}.collection .collection-item.avatar .title{font-size:16px}.collection .collection-item.avatar p{margin:0}.collection .collection-item.avatar .secondary-content{position:absolute;top:16px;right:16px}.collection .collection-item:last-child{border-bottom:0}.collection .collection-item.active{background-color:#4d9999;color:white}.collection .collection-item.active .secondary-content{color:#fff}.collection a.collection-item{display:block;transition:.25s;color:#4d9999}.collection a.collection-item:not(.active):hover{background-color:#ddd}.collection.with-header .collection-header{background-color:#fff;border-bottom:1px solid #e0e0e0;padding:10px 20px}.collection.with-header .collection-item{padding-left:30px}.collection.with-header .collection-item.avatar{padding-left:72px}.secondary-content{float:right;color:#4d9999}.collapsible .collection{margin:0;border:0}.video-container{position:relative;padding-bottom:56.25%;height:0;overflow:hidden}.video-container iframe,.video-container object,.video-container embed{position:absolute;top:0;left:0;width:100%;height:100%}.progress{position:relative;height:4px;display:block;width:100%;background-color:#cce6e6;border-radius:2px;margin:.5rem 0 1rem 0;overflow:hidden}.progress .determinate{position:absolute;top:0;left:0;bottom:0;background-color:#4d9999;transition:width .3s linear}.progress .indeterminate{background-color:#4d9999}.progress .indeterminate:before{content:'';position:absolute;background-color:inherit;top:0;left:0;bottom:0;will-change:left,right;animation:indeterminate 2.1s cubic-bezier(0.65,0.815,0.735,0.395) infinite}.progress .indeterminate:after{content:'';position:absolute;background-color:inherit;top:0;left:0;bottom:0;will-change:left,right;animation:indeterminate-short 2.1s cubic-bezier(0.165,0.84,0.44,1) infinite;animation-delay:1.15s}@keyframes indeterminate{0%{left:-35%;right:100%}60%{left:100%;right:-90%}100%{left:100%;right:-90%}}@keyframes indeterminate-short{0%{left:-200%;right:100%}60%{left:107%;right:-8%}100%{left:107%;right:-8%}}.hide{display:none!important}.left-align{text-align:left}.right-align{text-align:right}.center,.center-align{text-align:center}.left{float:left!important}.right{float:right!important}.no-select,input[type=range],input[type=range]+.thumb{user-select:none}.circle{border-radius:50%}.center-block{display:block;margin-left:auto;margin-right:auto}.truncate{display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.no-padding{padding:0!important}span.badge{min-width:3rem;padding:0 6px;margin-left:14px;text-align:center;font-size:1rem;line-height:22px;height:22px;color:#757575;float:right;box-sizing:border-box}span.badge.new{font-weight:300;font-size:.8rem;color:#fff;background-color:#4d9999;border-radius:2px}span.badge.new:after{content:" new"}span.badge[data-badge-caption]::after{content:" " attr(data-badge-caption)}nav ul a span.badge{display:inline-block;float:none;margin-left:4px;line-height:22px;height:22px;-webkit-font-smoothing:auto}.collection-item span.badge{margin-top:calc(0.75rem - 11px)}.collapsible span.badge{margin-left:auto}.sidenav span.badge{margin-top:calc(24px - 11px)}table span.badge{display:inline-block;float:none;margin-left:auto}.material-icons{text-rendering:optimizeLegibility;font-feature-settings:'liga'}.container{margin:0 auto;max-width:1280px;width:90%}@media only screen and (min-width:601px){.container{width:85%}}@media only screen and (min-width:993px){.container{width:70%}}.col .row{margin-left:-0.75rem;margin-right:-0.75rem}.section{padding-top:1rem;padding-bottom:1rem}.section.no-pad{padding:0}.section.no-pad-bot{padding-bottom:0}.section.no-pad-top{padding-top:0}.row{margin-left:auto;margin-right:auto;margin-bottom:20px}.row:after{content:"";display:table;clear:both}.row .col{float:left;box-sizing:border-box;padding:0 .75rem;min-height:1px}.row .col[class*="push-"],.row .col[class*="pull-"]{position:relative}.row .col.s1{width:8.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.s2{width:16.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.s3{width:25%;margin-left:auto;left:auto;right:auto}.row .col.s4{width:33.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.s5{width:41.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.s6{width:50%;margin-left:auto;left:auto;right:auto}.row .col.s7{width:58.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.s8{width:66.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.s9{width:75%;margin-left:auto;left:auto;right:auto}.row .col.s10{width:83.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.s11{width:91.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.s12{width:100%;margin-left:auto;left:auto;right:auto}.row .col.offset-s1{margin-left:8.3333333333%}.row .col.pull-s1{right:8.3333333333%}.row .col.push-s1{left:8.3333333333%}.row .col.offset-s2{margin-left:16.6666666667%}.row .col.pull-s2{right:16.6666666667%}.row .col.push-s2{left:16.6666666667%}.row .col.offset-s3{margin-left:25%}.row .col.pull-s3{right:25%}.row .col.push-s3{left:25%}.row .col.offset-s4{margin-left:33.3333333333%}.row .col.pull-s4{right:33.3333333333%}.row .col.push-s4{left:33.3333333333%}.row .col.offset-s5{margin-left:41.6666666667%}.row .col.pull-s5{right:41.6666666667%}.row .col.push-s5{left:41.6666666667%}.row .col.offset-s6{margin-left:50%}.row .col.pull-s6{right:50%}.row .col.push-s6{left:50%}.row .col.offset-s7{margin-left:58.3333333333%}.row .col.pull-s7{right:58.3333333333%}.row .col.push-s7{left:58.3333333333%}.row .col.offset-s8{margin-left:66.6666666667%}.row .col.pull-s8{right:66.6666666667%}.row .col.push-s8{left:66.6666666667%}.row .col.offset-s9{margin-left:75%}.row .col.pull-s9{right:75%}.row .col.push-s9{left:75%}.row .col.offset-s10{margin-left:83.3333333333%}.row .col.pull-s10{right:83.3333333333%}.row .col.push-s10{left:83.3333333333%}.row .col.offset-s11{margin-left:91.6666666667%}.row .col.pull-s11{right:91.6666666667%}.row .col.push-s11{left:91.6666666667%}.row .col.offset-s12{margin-left:100%}.row .col.pull-s12{right:100%}.row .col.push-s12{left:100%}@media only screen and (min-width:601px){.row .col.m1{width:8.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.m2{width:16.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.m3{width:25%;margin-left:auto;left:auto;right:auto}.row .col.m4{width:33.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.m5{width:41.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.m6{width:50%;margin-left:auto;left:auto;right:auto}.row .col.m7{width:58.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.m8{width:66.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.m9{width:75%;margin-left:auto;left:auto;right:auto}.row .col.m10{width:83.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.m11{width:91.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.m12{width:100%;margin-left:auto;left:auto;right:auto}.row .col.offset-m1{margin-left:8.3333333333%}.row .col.pull-m1{right:8.3333333333%}.row .col.push-m1{left:8.3333333333%}.row .col.offset-m2{margin-left:16.6666666667%}.row .col.pull-m2{right:16.6666666667%}.row .col.push-m2{left:16.6666666667%}.row .col.offset-m3{margin-left:25%}.row .col.pull-m3{right:25%}.row .col.push-m3{left:25%}.row .col.offset-m4{margin-left:33.3333333333%}.row .col.pull-m4{right:33.3333333333%}.row .col.push-m4{left:33.3333333333%}.row .col.offset-m5{margin-left:41.6666666667%}.row .col.pull-m5{right:41.6666666667%}.row .col.push-m5{left:41.6666666667%}.row .col.offset-m6{margin-left:50%}.row .col.pull-m6{right:50%}.row .col.push-m6{left:50%}.row .col.offset-m7{margin-left:58.3333333333%}.row .col.pull-m7{right:58.3333333333%}.row .col.push-m7{left:58.3333333333%}.row .col.offset-m8{margin-left:66.6666666667%}.row .col.pull-m8{right:66.6666666667%}.row .col.push-m8{left:66.6666666667%}.row .col.offset-m9{margin-left:75%}.row .col.pull-m9{right:75%}.row .col.push-m9{left:75%}.row .col.offset-m10{margin-left:83.3333333333%}.row .col.pull-m10{right:83.3333333333%}.row .col.push-m10{left:83.3333333333%}.row .col.offset-m11{margin-left:91.6666666667%}.row .col.pull-m11{right:91.6666666667%}.row .col.push-m11{left:91.6666666667%}.row .col.offset-m12{margin-left:100%}.row .col.pull-m12{right:100%}.row .col.push-m12{left:100%}}@media only screen and (min-width:993px){.row .col.l1{width:8.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.l2{width:16.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.l3{width:25%;margin-left:auto;left:auto;right:auto}.row .col.l4{width:33.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.l5{width:41.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.l6{width:50%;margin-left:auto;left:auto;right:auto}.row .col.l7{width:58.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.l8{width:66.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.l9{width:75%;margin-left:auto;left:auto;right:auto}.row .col.l10{width:83.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.l11{width:91.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.l12{width:100%;margin-left:auto;left:auto;right:auto}.row .col.offset-l1{margin-left:8.3333333333%}.row .col.pull-l1{right:8.3333333333%}.row .col.push-l1{left:8.3333333333%}.row .col.offset-l2{margin-left:16.6666666667%}.row .col.pull-l2{right:16.6666666667%}.row .col.push-l2{left:16.6666666667%}.row .col.offset-l3{margin-left:25%}.row .col.pull-l3{right:25%}.row .col.push-l3{left:25%}.row .col.offset-l4{margin-left:33.3333333333%}.row .col.pull-l4{right:33.3333333333%}.row .col.push-l4{left:33.3333333333%}.row .col.offset-l5{margin-left:41.6666666667%}.row .col.pull-l5{right:41.6666666667%}.row .col.push-l5{left:41.6666666667%}.row .col.offset-l6{margin-left:50%}.row .col.pull-l6{right:50%}.row .col.push-l6{left:50%}.row .col.offset-l7{margin-left:58.3333333333%}.row .col.pull-l7{right:58.3333333333%}.row .col.push-l7{left:58.3333333333%}.row .col.offset-l8{margin-left:66.6666666667%}.row .col.pull-l8{right:66.6666666667%}.row .col.push-l8{left:66.6666666667%}.row .col.offset-l9{margin-left:75%}.row .col.pull-l9{right:75%}.row .col.push-l9{left:75%}.row .col.offset-l10{margin-left:83.3333333333%}.row .col.pull-l10{right:83.3333333333%}.row .col.push-l10{left:83.3333333333%}.row .col.offset-l11{margin-left:91.6666666667%}.row .col.pull-l11{right:91.6666666667%}.row .col.push-l11{left:91.6666666667%}.row .col.offset-l12{margin-left:100%}.row .col.pull-l12{right:100%}.row .col.push-l12{left:100%}}@media only screen and (min-width:1201px){.row .col.xl1{width:8.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.xl2{width:16.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.xl3{width:25%;margin-left:auto;left:auto;right:auto}.row .col.xl4{width:33.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.xl5{width:41.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.xl6{width:50%;margin-left:auto;left:auto;right:auto}.row .col.xl7{width:58.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.xl8{width:66.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.xl9{width:75%;margin-left:auto;left:auto;right:auto}.row .col.xl10{width:83.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.xl11{width:91.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.xl12{width:100%;margin-left:auto;left:auto;right:auto}.row .col.offset-xl1{margin-left:8.3333333333%}.row .col.pull-xl1{right:8.3333333333%}.row .col.push-xl1{left:8.3333333333%}.row .col.offset-xl2{margin-left:16.6666666667%}.row .col.pull-xl2{right:16.6666666667%}.row .col.push-xl2{left:16.6666666667%}.row .col.offset-xl3{margin-left:25%}.row .col.pull-xl3{right:25%}.row .col.push-xl3{left:25%}.row .col.offset-xl4{margin-left:33.3333333333%}.row .col.pull-xl4{right:33.3333333333%}.row .col.push-xl4{left:33.3333333333%}.row .col.offset-xl5{margin-left:41.6666666667%}.row .col.pull-xl5{right:41.6666666667%}.row .col.push-xl5{left:41.6666666667%}.row .col.offset-xl6{margin-left:50%}.row .col.pull-xl6{right:50%}.row .col.push-xl6{left:50%}.row .col.offset-xl7{margin-left:58.3333333333%}.row .col.pull-xl7{right:58.3333333333%}.row .col.push-xl7{left:58.3333333333%}.row .col.offset-xl8{margin-left:66.6666666667%}.row .col.pull-xl8{right:66.6666666667%}.row .col.push-xl8{left:66.6666666667%}.row .col.offset-xl9{margin-left:75%}.row .col.pull-xl9{right:75%}.row .col.push-xl9{left:75%}.row .col.offset-xl10{margin-left:83.3333333333%}.row .col.pull-xl10{right:83.3333333333%}.row .col.push-xl10{left:83.3333333333%}.row .col.offset-xl11{margin-left:91.6666666667%}.row .col.pull-xl11{right:91.6666666667%}.row .col.push-xl11{left:91.6666666667%}.row .col.offset-xl12{margin-left:100%}.row .col.pull-xl12{right:100%}.row .col.push-xl12{left:100%}}nav{color:#fff;background-color:#b84000;width:100%;height:56px;line-height:56px}nav.nav-extended{height:auto}nav.nav-extended .nav-wrapper{min-height:56px;height:auto}nav.nav-extended .nav-content{position:relative;line-height:normal}nav a{color:#fff}nav i,nav [class^="mdi-"],nav [class*="mdi-"],nav i.material-icons{display:block;font-size:24px;height:56px;line-height:56px}nav .nav-wrapper{position:relative;height:100%}@media only screen and (min-width:993px){nav a.sidenav-trigger{display:none}}nav .sidenav-trigger{float:left;position:relative;z-index:1;height:56px;margin:0 18px}nav .sidenav-trigger i{height:56px;line-height:56px}nav .brand-logo{position:absolute;color:#fff;display:inline-block;font-size:2.1rem;padding:0}nav .brand-logo.center{left:50%;transform:translateX(-50%)}@media only screen and (max-width:992px){nav .brand-logo{left:50%;transform:translateX(-50%)}nav .brand-logo.left,nav .brand-logo.right{padding:0;transform:none}nav .brand-logo.left{left:.5rem}nav .brand-logo.right{right:.5rem;left:auto}}nav .brand-logo.right{right:.5rem;padding:0}nav .brand-logo i,nav .brand-logo [class^="mdi-"],nav .brand-logo [class*="mdi-"],nav .brand-logo i.material-icons{float:left;margin-right:15px}nav .nav-title{display:inline-block;font-size:32px;padding:28px 0}nav ul{margin:0}nav ul li{transition:background-color .3s;float:left;padding:0}nav ul li.active{background-color:rgba(0,0,0,0.1)}nav ul a{transition:background-color .3s;font-size:1rem;color:#fff;display:block;padding:0 15px;cursor:pointer}nav ul a.btn,nav ul a.btn-large,nav ul a.btn-small,nav ul a.btn-large,nav ul a.btn-flat,nav ul a.btn-floating{margin-top:-2px;margin-left:15px;margin-right:15px}nav ul a.btn>.material-icons,nav ul a.btn-large>.material-icons,nav ul a.btn-small>.material-icons,nav ul a.btn-large>.material-icons,nav ul a.btn-flat>.material-icons,nav ul a.btn-floating>.material-icons{height:inherit;line-height:inherit}nav ul a:hover{background-color:rgba(0,0,0,0.1)}nav ul.left{float:left}nav form{height:100%}nav .input-field{margin:0;height:100%}nav .input-field input{height:100%;font-size:1.2rem;border:0;padding-left:2rem}nav .input-field input:focus,nav .input-field input[type=text]:valid,nav .input-field input[type=password]:valid,nav .input-field input[type=email]:valid,nav .input-field input[type=url]:valid,nav .input-field input[type=date]:valid{border:0;box-shadow:none}nav .input-field label{top:0;left:0}nav .input-field label i{color:rgba(255,255,255,0.7);transition:color .3s}nav .input-field label.active i{color:#fff}.navbar-fixed{position:relative;height:56px;z-index:997}.navbar-fixed nav{position:fixed}@media only screen and (min-width:601px){nav.nav-extended .nav-wrapper{min-height:64px}nav,nav .nav-wrapper i,nav a.sidenav-trigger,nav a.sidenav-trigger i{height:64px;line-height:64px}.navbar-fixed{height:64px}}a{text-decoration:none}html{line-height:1.5;font-family:Seravek,Helvetica,Roboto,Arial,sans-serif;font-weight:normal;color:rgba(0,0,0,0.87)}@media only screen and (min-width:0){html{font-size:14px}}@media only screen and (min-width:992px){html{font-size:14.5px}}@media only screen and (min-width:1200px){html{font-size:15px}}h1,h2,h3,h4,h5,h6{font-weight:400;line-height:1.3}h1 a,h2 a,h3 a,h4 a,h5 a,h6 a{font-weight:inherit}h1{font-size:1.4em;line-height:110%;margin:.9333333333em 0 .56em 0}h2{font-size:1.2em;line-height:110%;margin:.8em 0 .48em 0}h3{font-size:1em;line-height:110%;margin:.6666666667em 0 .4em 0}h4{font-size:.8em;line-height:110%;margin:.5333333333em 0 .32em 0}h5{font-size:.8em;line-height:110%;margin:.5333333333em 0 .32em 0}h6{font-size:1.15rem;line-height:110%;margin:.7666666667rem 0 .46rem 0}em{font-style:italic}strong{font-weight:500}small{font-size:75%}.light{font-weight:300}.thin{font-weight:200}@media only screen and (min-width:360px){.flow-text{font-size:1.2rem}}@media only screen and (min-width:390px){.flow-text{font-size:1.224rem}}@media only screen and (min-width:420px){.flow-text{font-size:1.248rem}}@media only screen and (min-width:450px){.flow-text{font-size:1.272rem}}@media only screen and (min-width:480px){.flow-text{font-size:1.296rem}}@media only screen and (min-width:510px){.flow-text{font-size:1.32rem}}@media only screen and (min-width:540px){.flow-text{font-size:1.344rem}}@media only screen and (min-width:570px){.flow-text{font-size:1.368rem}}@media only screen and (min-width:600px){.flow-text{font-size:1.392rem}}@media only screen and (min-width:630px){.flow-text{font-size:1.416rem}}@media only screen and (min-width:660px){.flow-text{font-size:1.44rem}}@media only screen and (min-width:690px){.flow-text{font-size:1.464rem}}@media only screen and (min-width:720px){.flow-text{font-size:1.488rem}}@media only screen and (min-width:750px){.flow-text{font-size:1.512rem}}@media only screen and (min-width:780px){.flow-text{font-size:1.536rem}}@media only screen and (min-width:810px){.flow-text{font-size:1.56rem}}@media only screen and (min-width:840px){.flow-text{font-size:1.584rem}}@media only screen and (min-width:870px){.flow-text{font-size:1.608rem}}@media only screen and (min-width:900px){.flow-text{font-size:1.632rem}}@media only screen and (min-width:930px){.flow-text{font-size:1.656rem}}@media only screen and (min-width:960px){.flow-text{font-size:1.68rem}}@media only screen and (max-width:360px){.flow-text{font-size:1.2rem}}.scale-transition{transition:transform .3s cubic-bezier(0.53,0.01,0.36,1.63)!important}.scale-transition.scale-out{transform:scale(0);transition:transform .2s!important}.scale-transition.scale-in{transform:scale(1)}.card-panel{transition:box-shadow .25s;padding:24px;margin:.5rem 0 1rem 0;border-radius:2px;background-color:#fff}.card{position:relative;margin:.5rem 0 1rem 0;background-color:#fff;transition:box-shadow .25s;border-radius:2px}.card .card-title{font-size:24px;font-weight:300}.card .card-title.activator{cursor:pointer}.card.small,.card.medium,.card.large{position:relative}.card.small .card-image,.card.medium .card-image,.card.large .card-image{max-height:60%;overflow:hidden}.card.small .card-image+.card-content,.card.medium .card-image+.card-content,.card.large .card-image+.card-content{max-height:40%}.card.small .card-content,.card.medium .card-content,.card.large .card-content{max-height:100%;overflow:hidden}.card.small .card-action,.card.medium .card-action,.card.large .card-action{position:absolute;bottom:0;left:0;right:0}.card.small{height:300px}.card.medium{height:400px}.card.large{height:500px}.card.horizontal{display:flex}.card.horizontal.small .card-image,.card.horizontal.medium .card-image,.card.horizontal.large .card-image{height:100%;max-height:none;overflow:visible}.card.horizontal.small .card-image img,.card.horizontal.medium .card-image img,.card.horizontal.large .card-image img{height:100%}.card.horizontal .card-image{max-width:50%}.card.horizontal .card-image img{border-radius:2px 0 0 2px;max-width:100%;width:auto}.card.horizontal .card-stacked{display:flex;flex-direction:column;flex:1;position:relative}.card.horizontal .card-stacked .card-content{flex-grow:1}.card.sticky-action .card-action{z-index:2}.card.sticky-action .card-reveal{z-index:1;padding-bottom:64px}.card .card-image{position:relative}.card .card-image img{display:block;border-radius:2px 2px 0 0;position:relative;left:0;right:0;top:0;bottom:0;width:100%}.card .card-image .card-title{color:#fff;position:absolute;bottom:0;left:0;max-width:100%;padding:24px}.card .card-content{padding:24px;border-radius:0 0 2px 2px}.card .card-content p{margin:0}.card .card-content .card-title{display:block;line-height:32px;margin-bottom:8px}.card .card-content .card-title i{line-height:32px}.card .card-action{background-color:inherit;border-top:1px solid rgba(160,160,160,0.2);position:relative;padding:16px 24px}.card .card-action:last-child{border-radius:0 0 2px 2px}.card .card-action a:not(.btn):not(.btn-large):not(.btn-small):not(.btn-large):not(.btn-floating){color:#ffab40;margin-right:24px;transition:color .3s ease;text-transform:uppercase}.card .card-action a:not(.btn):not(.btn-large):not(.btn-small):not(.btn-large):not(.btn-floating):hover{color:#ffd8a6}.card .card-reveal{padding:24px;position:absolute;background-color:#fff;width:100%;overflow-y:auto;left:0;top:100%;height:100%;z-index:3;display:none}.card .card-reveal .card-title{cursor:pointer;display:block}#toast-container{display:block;position:fixed;z-index:10000}@media only screen and (max-width:600px){#toast-container{min-width:100%;bottom:0}}@media only screen and (min-width:601px) and (max-width:992px){#toast-container{left:5%;bottom:7%;max-width:90%}}@media only screen and (min-width:993px){#toast-container{top:10%;right:7%;max-width:86%}}.toast{border-radius:2px;top:35px;width:auto;margin-top:10px;position:relative;max-width:100%;height:auto;min-height:48px;line-height:1.5em;background-color:#323232;padding:10px 25px;font-size:1.1rem;font-weight:300;color:#fff;display:flex;align-items:center;justify-content:space-between;cursor:default}.toast .toast-action{color:#eeff41;font-weight:500;margin-right:-25px;margin-left:3rem}.toast.rounded{border-radius:24px}@media only screen and (max-width:600px){.toast{width:100%;border-radius:0}}.tabs{position:relative;overflow-x:auto;overflow-y:hidden;height:48px;width:100%;background-color:#fff;margin:0 auto;white-space:nowrap}.tabs.tabs-transparent{background-color:transparent}.tabs.tabs-transparent .tab a,.tabs.tabs-transparent .tab.disabled a,.tabs.tabs-transparent .tab.disabled a:hover{color:rgba(255,255,255,0.7)}.tabs.tabs-transparent .tab a:hover,.tabs.tabs-transparent .tab a.active{color:#fff}.tabs.tabs-transparent .indicator{background-color:#fff}.tabs.tabs-fixed-width{display:flex}.tabs.tabs-fixed-width .tab{flex-grow:1}.tabs .tab{display:inline-block;text-align:center;line-height:48px;height:48px;padding:0;margin:0;text-transform:uppercase}.tabs .tab a{color:rgba(184,64,0,0.7);display:block;width:100%;height:100%;padding:0 24px;font-size:14px;text-overflow:ellipsis;overflow:hidden;transition:color .28s ease,background-color .28s ease}.tabs .tab a:focus,.tabs .tab a:focus.active{background-color:rgba(255,238,230,0.2);outline:0}.tabs .tab a:hover,.tabs .tab a.active{background-color:transparent;color:#b84000}.tabs .tab.disabled a,.tabs .tab.disabled a:hover{color:rgba(184,64,0,0.4);cursor:default}.tabs .indicator{position:absolute;bottom:0;height:2px;background-color:#ffeee6;will-change:left,right}@media only screen and (max-width:992px){.tabs{display:flex}.tabs .tab{flex-grow:1}.tabs .tab a{padding:0 12px}}.material-tooltip{padding:10px 8px;font-size:1rem;z-index:2000;background-color:transparent;border-radius:2px;color:#fff;min-height:36px;line-height:120%;opacity:0;position:absolute;text-align:center;max-width:calc(100% - 4px);overflow:hidden;left:0;top:0;pointer-events:none;visibility:hidden;background-color:#323232}.backdrop{position:absolute;opacity:0;height:7px;width:14px;border-radius:0 0 50% 50%;background-color:#323232;z-index:-1;transform-origin:50% 0;visibility:hidden}.btn,.btn-large,.btn-small,.btn-flat{border:0;border-radius:2px;display:inline-block;height:36px;line-height:36px;padding:0 16px;text-transform:uppercase;vertical-align:middle;-webkit-tap-highlight-color:transparent}.btn.disabled,.disabled.btn-large,.disabled.btn-small,.btn-floating.disabled,.btn-large.disabled,.btn-small.disabled,.btn-flat.disabled,.btn:disabled,.btn-large:disabled,.btn-small:disabled,.btn-floating:disabled,.btn-large:disabled,.btn-small:disabled,.btn-flat:disabled,.btn[disabled],[disabled].btn-large,[disabled].btn-small,.btn-floating[disabled],.btn-large[disabled],.btn-small[disabled],.btn-flat[disabled]{pointer-events:none;background-color:#dfdfdf!important;box-shadow:none;color:#9f9f9f!important;cursor:default}.btn.disabled:hover,.disabled.btn-large:hover,.disabled.btn-small:hover,.btn-floating.disabled:hover,.btn-large.disabled:hover,.btn-small.disabled:hover,.btn-flat.disabled:hover,.btn:disabled:hover,.btn-large:disabled:hover,.btn-small:disabled:hover,.btn-floating:disabled:hover,.btn-large:disabled:hover,.btn-small:disabled:hover,.btn-flat:disabled:hover,.btn[disabled]:hover,[disabled].btn-large:hover,[disabled].btn-small:hover,.btn-floating[disabled]:hover,.btn-large[disabled]:hover,.btn-small[disabled]:hover,.btn-flat[disabled]:hover{background-color:#dfdfdf!important;color:#9f9f9f!important}.btn,.btn-large,.btn-small,.btn-floating,.btn-large,.btn-small,.btn-flat{font-size:14px;outline:0}.btn i,.btn-large i,.btn-small i,.btn-floating i,.btn-large i,.btn-small i,.btn-flat i{font-size:1.3rem;line-height:inherit}.btn:focus,.btn-large:focus,.btn-small:focus,.btn-floating:focus{background-color:#3c7777}.btn,.btn-large,.btn-small{text-decoration:none;color:#fff;background-color:#4d9999;text-align:center;letter-spacing:.5px;transition:background-color .2s ease-out;cursor:pointer}.btn:hover,.btn-large:hover,.btn-small:hover{background-color:#56aaaa}.btn-floating{display:inline-block;color:#fff;position:relative;overflow:hidden;z-index:1;width:40px;height:40px;line-height:40px;padding:0;background-color:#4d9999;border-radius:50%;transition:background-color .3s;cursor:pointer;vertical-align:middle}.btn-floating:hover{background-color:#4d9999}.btn-floating:before{border-radius:0}.btn-floating.btn-large{width:56px;height:56px;padding:0}.btn-floating.btn-large.halfway-fab{bottom:-28px}.btn-floating.btn-large i{line-height:56px}.btn-floating.btn-small{width:32.4px;height:32.4px}.btn-floating.btn-small.halfway-fab{bottom:-16.2px}.btn-floating.btn-small i{line-height:32.4px}.btn-floating.halfway-fab{position:absolute;right:24px;bottom:-20px}.btn-floating.halfway-fab.left{right:auto;left:24px}.btn-floating i{width:inherit;display:inline-block;text-align:center;color:#fff;font-size:1.6rem;line-height:40px}button.btn-floating{border:0}.fixed-action-btn{position:fixed;right:23px;bottom:23px;padding-top:15px;margin-bottom:0;z-index:997}.fixed-action-btn.active ul{visibility:visible}.fixed-action-btn.direction-left,.fixed-action-btn.direction-right{padding:0 0 0 15px}.fixed-action-btn.direction-left ul,.fixed-action-btn.direction-right ul{text-align:right;right:64px;top:50%;transform:translateY(-50%);height:100%;left:auto;width:500px}.fixed-action-btn.direction-left ul li,.fixed-action-btn.direction-right ul li{display:inline-block;margin:7.5px 15px 0 0}.fixed-action-btn.direction-right{padding:0 15px 0 0}.fixed-action-btn.direction-right ul{text-align:left;direction:rtl;left:64px;right:auto}.fixed-action-btn.direction-right ul li{margin:7.5px 0 0 15px}.fixed-action-btn.direction-bottom{padding:0 0 15px 0}.fixed-action-btn.direction-bottom ul{top:64px;bottom:auto;display:flex;flex-direction:column-reverse}.fixed-action-btn.direction-bottom ul li{margin:15px 0 0 0}.fixed-action-btn.toolbar{padding:0;height:56px}.fixed-action-btn.toolbar.active>a i{opacity:0}.fixed-action-btn.toolbar ul{display:flex;top:0;bottom:0;z-index:1}.fixed-action-btn.toolbar ul li{flex:1;display:inline-block;margin:0;height:100%;transition:none}.fixed-action-btn.toolbar ul li a{display:block;overflow:hidden;position:relative;width:100%;height:100%;background-color:transparent;box-shadow:none;color:#fff;line-height:56px;z-index:1}.fixed-action-btn.toolbar ul li a i{line-height:inherit}.fixed-action-btn ul{left:0;right:0;text-align:center;position:absolute;bottom:64px;margin:0;visibility:hidden}.fixed-action-btn ul li{margin-bottom:15px}.fixed-action-btn ul a.btn-floating{opacity:0}.fixed-action-btn .fab-backdrop{position:absolute;top:0;left:0;z-index:-1;width:40px;height:40px;background-color:#4d9999;border-radius:50%;transform:scale(0)}.btn-flat{box-shadow:none;background-color:transparent;color:#343434;cursor:pointer;transition:background-color .2s}.btn-flat:focus,.btn-flat:hover{box-shadow:none}.btn-flat:focus{background-color:rgba(0,0,0,0.1)}.btn-flat.disabled,.btn-flat.btn-flat[disabled]{background-color:transparent!important;color:#b3b3b3!important;cursor:default}.btn-large{height:54px;line-height:54px;font-size:15px;padding:0 28px}.btn-large i{font-size:1.6rem}.btn-small{height:32.4px;line-height:32.4px;font-size:13px}.btn-small i{font-size:1.2rem}.btn-block{display:block}.dropdown-content{background-color:#fff;margin:0;display:none;min-width:100px;overflow-y:auto;opacity:0;position:absolute;left:0;top:0;z-index:9999;transform-origin:0 0}.dropdown-content:focus{outline:0}.dropdown-content li{clear:both;color:rgba(0,0,0,0.87);cursor:pointer;min-height:50px;line-height:1.5rem;width:100%;text-align:left}.dropdown-content li:hover,.dropdown-content li.active{background-color:#eee}.dropdown-content li:focus{outline:0}.dropdown-content li.divider{min-height:0;height:1px}.dropdown-content li>a,.dropdown-content li>span{font-size:16px;color:#4d9999;display:block;line-height:22px;padding:14px 16px}.dropdown-content li>span>label{top:1px;left:0;height:18px}.dropdown-content li>a>i{height:inherit;line-height:inherit;float:left;margin:0 24px 0 0;width:24px}body.keyboard-focused .dropdown-content li:focus{background-color:#dadada}.input-field.col .dropdown-content [type="checkbox"]+label{top:1px;left:0;height:18px;transform:none}.dropdown-trigger{cursor:pointer}/*! + * Waves v0.6.0 + * http://fian.my.id/Waves + * + * Copyright 2014 Alfiana E. Sibuea and other contributors + * Released under the MIT license + * https://github.com/fians/Waves/blob/master/LICENSE + */.waves-effect{position:relative;cursor:pointer;display:inline-block;overflow:hidden;user-select:none;-webkit-tap-highlight-color:transparent;vertical-align:middle;z-index:1;transition:.3s ease-out}.waves-effect .waves-ripple{position:absolute;border-radius:50%;width:20px;height:20px;margin-top:-10px;margin-left:-10px;opacity:0;background:rgba(0,0,0,0.2);transition:all .7s ease-out;transition-property:transform,opacity;transform:scale(0);pointer-events:none}.waves-effect.waves-light .waves-ripple{background-color:rgba(255,255,255,0.45)}.waves-effect.waves-red .waves-ripple{background-color:rgba(244,67,54,0.7)}.waves-effect.waves-yellow .waves-ripple{background-color:rgba(255,235,59,0.7)}.waves-effect.waves-orange .waves-ripple{background-color:rgba(255,152,0,0.7)}.waves-effect.waves-purple .waves-ripple{background-color:rgba(156,39,176,0.7)}.waves-effect.waves-green .waves-ripple{background-color:rgba(76,175,80,0.7)}.waves-effect.waves-teal .waves-ripple{background-color:rgba(0,150,136,0.7)}.waves-effect input[type="button"],.waves-effect input[type="reset"],.waves-effect input[type="submit"]{border:0;font-style:normal;font-size:inherit;text-transform:inherit;background:0}.waves-effect img{position:relative;z-index:-1}.waves-notransition{transition:none!important}.waves-circle{transform:translateZ(0);-webkit-mask-image:-webkit-radial-gradient(circle,white 100%,black 100%)}.waves-input-wrapper{border-radius:.2em;vertical-align:bottom}.waves-input-wrapper .waves-button-input{position:relative;top:0;left:0;z-index:1}.waves-circle{text-align:center;width:2.5em;height:2.5em;line-height:2.5em;border-radius:50%;-webkit-mask-image:none}.waves-block{display:block}.waves-effect .waves-ripple{z-index:-1}.modal{display:none;position:fixed;left:0;right:0;background-color:#fafafa;padding:0;max-height:70%;width:55%;margin:auto;overflow-y:auto;border-radius:2px;will-change:top,opacity}.modal:focus{outline:0}@media only screen and (max-width:992px){.modal{width:80%}}.modal h1,.modal h2,.modal h3,.modal h4{margin-top:0}.modal .modal-content{padding:24px}.modal .modal-close{cursor:pointer}.modal .modal-footer{border-radius:0 0 2px 2px;background-color:#fafafa;padding:4px 6px;height:56px;width:100%;text-align:right}.modal .modal-footer .btn,.modal .modal-footer .btn-large,.modal .modal-footer .btn-small,.modal .modal-footer .btn-flat{margin:6px 0}.modal-overlay{position:fixed;z-index:999;top:-25%;left:0;bottom:0;right:0;height:125%;width:100%;background:#000;display:none;will-change:opacity}.modal.modal-fixed-footer{padding:0;height:70%}.modal.modal-fixed-footer .modal-content{position:absolute;height:calc(100% - 56px);max-height:100%;width:100%;overflow-y:auto}.modal.modal-fixed-footer .modal-footer{border-top:1px solid rgba(0,0,0,0.1);position:absolute;bottom:0}.modal.bottom-sheet{top:auto;bottom:-100%;margin:0;width:100%;max-height:45%;border-radius:0;will-change:bottom,opacity}.collapsible{border-top:1px solid #ddd;border-right:1px solid #ddd;border-left:1px solid #ddd;margin:.5rem 0 1rem 0}.collapsible-header{display:flex;cursor:pointer;-webkit-tap-highlight-color:transparent;line-height:1.5;padding:1rem;background-color:#fff;border-bottom:1px solid #ddd}.collapsible-header:focus{outline:0}.collapsible-header i{width:2rem;font-size:1.6rem;display:inline-block;text-align:center;margin-right:1rem}.keyboard-focused .collapsible-header:focus{background-color:#eee}.collapsible-body{display:none;border-bottom:1px solid #ddd;box-sizing:border-box;padding:2rem}.sidenav .collapsible,.sidenav.fixed .collapsible{border:0;box-shadow:none}.sidenav .collapsible li,.sidenav.fixed .collapsible li{padding:0}.sidenav .collapsible-header,.sidenav.fixed .collapsible-header{background-color:transparent;border:0;line-height:inherit;height:inherit;padding:0 16px}.sidenav .collapsible-header:hover,.sidenav.fixed .collapsible-header:hover{background-color:rgba(0,0,0,0.05)}.sidenav .collapsible-header i,.sidenav.fixed .collapsible-header i{line-height:inherit}.sidenav .collapsible-body,.sidenav.fixed .collapsible-body{border:0;background-color:#fff}.sidenav .collapsible-body li a,.sidenav.fixed .collapsible-body li a{padding:0 23.5px 0 31px}.collapsible.popout{border:0;box-shadow:none}.collapsible.popout>li{box-shadow:0 2px 5px 0 rgba(0,0,0,0.16),0 2px 10px 0 rgba(0,0,0,0.12);margin:0 24px;transition:margin .35s cubic-bezier(0.25,0.46,0.45,0.94)}.collapsible.popout>li.active{box-shadow:0 5px 11px 0 rgba(0,0,0,0.18),0 4px 15px 0 rgba(0,0,0,0.15);margin:16px 0}.chip{display:inline-block;height:32px;font-size:13px;font-weight:500;color:rgba(0,0,0,0.6);line-height:32px;padding:0 12px;border-radius:16px;background-color:#e4e4e4;margin-bottom:5px;margin-right:5px}.chip:focus{outline:0;background-color:#26a69a;color:#fff}.chip>img{float:left;margin:0 8px 0 -12px;height:32px;width:32px;border-radius:50%}.chip .close{cursor:pointer;float:right;font-size:16px;line-height:32px;padding-left:8px}.chips{border:0;border-bottom:1px solid #9e9e9e;box-shadow:none;margin:0 0 8px 0;min-height:45px;outline:0;transition:all .3s}.chips.focus{border-bottom:1px solid #26a69a;box-shadow:0 1px 0 0 #26a69a}.chips:hover{cursor:text}.chips .input{background:0;border:0;color:rgba(0,0,0,0.6);display:inline-block;font-size:16px;height:3rem;line-height:32px;outline:0;margin:0;padding:0!important;width:120px!important}.chips .input:focus{border:0!important;box-shadow:none!important}.chips .autocomplete-content{margin-top:0;margin-bottom:0}.prefix ~ .chips{margin-left:3rem;width:92%;width:calc(100% - 3rem)}.chips:empty ~ label{font-size:.8rem;transform:translateY(-140%)}.materialboxed{display:block;cursor:zoom-in;position:relative;transition:opacity .4s;-webkit-backface-visibility:hidden}.materialboxed:hover:not(.active){opacity:.8}.materialboxed.active{cursor:zoom-out}#materialbox-overlay{position:fixed;top:0;right:0;bottom:0;left:0;background-color:#292929;z-index:1000;will-change:opacity}.materialbox-caption{position:fixed;display:none;color:#fff;line-height:50px;bottom:0;left:0;width:100%;text-align:center;padding:0 15%;height:50px;z-index:1000;-webkit-font-smoothing:antialiased}select:focus{outline:1px solid #e4f2f2}button:focus{outline:0;background-color:#54a7a7}label{font-size:.8rem;color:#9e9e9e}::placeholder{color:#d1d1d1}input:not([type]),input[type=text]:not(.browser-default),input[type=password]:not(.browser-default),input[type=email]:not(.browser-default),input[type=url]:not(.browser-default),input[type=time]:not(.browser-default),input[type=date]:not(.browser-default),input[type=datetime]:not(.browser-default),input[type=datetime-local]:not(.browser-default),input[type=tel]:not(.browser-default),input[type=number]:not(.browser-default),input[type=search]:not(.browser-default),textarea.materialize-textarea{background-color:transparent;border:0;border-bottom:1px solid #9e9e9e;border-radius:0;outline:0;height:3rem;width:100%;font-size:16px;margin:0 0 8px 0;padding:0;box-shadow:none;box-sizing:content-box;transition:box-shadow .3s,border .3s}input:not([type]):disabled,input:not([type])[readonly="readonly"],input[type=text]:not(.browser-default):disabled,input[type=text]:not(.browser-default)[readonly="readonly"],input[type=password]:not(.browser-default):disabled,input[type=password]:not(.browser-default)[readonly="readonly"],input[type=email]:not(.browser-default):disabled,input[type=email]:not(.browser-default)[readonly="readonly"],input[type=url]:not(.browser-default):disabled,input[type=url]:not(.browser-default)[readonly="readonly"],input[type=time]:not(.browser-default):disabled,input[type=time]:not(.browser-default)[readonly="readonly"],input[type=date]:not(.browser-default):disabled,input[type=date]:not(.browser-default)[readonly="readonly"],input[type=datetime]:not(.browser-default):disabled,input[type=datetime]:not(.browser-default)[readonly="readonly"],input[type=datetime-local]:not(.browser-default):disabled,input[type=datetime-local]:not(.browser-default)[readonly="readonly"],input[type=tel]:not(.browser-default):disabled,input[type=tel]:not(.browser-default)[readonly="readonly"],input[type=number]:not(.browser-default):disabled,input[type=number]:not(.browser-default)[readonly="readonly"],input[type=search]:not(.browser-default):disabled,input[type=search]:not(.browser-default)[readonly="readonly"],textarea.materialize-textarea:disabled,textarea.materialize-textarea[readonly="readonly"]{color:rgba(0,0,0,0.42);border-bottom:1px dotted rgba(0,0,0,0.42)}input:not([type]):disabled+label,input:not([type])[readonly="readonly"]+label,input[type=text]:not(.browser-default):disabled+label,input[type=text]:not(.browser-default)[readonly="readonly"]+label,input[type=password]:not(.browser-default):disabled+label,input[type=password]:not(.browser-default)[readonly="readonly"]+label,input[type=email]:not(.browser-default):disabled+label,input[type=email]:not(.browser-default)[readonly="readonly"]+label,input[type=url]:not(.browser-default):disabled+label,input[type=url]:not(.browser-default)[readonly="readonly"]+label,input[type=time]:not(.browser-default):disabled+label,input[type=time]:not(.browser-default)[readonly="readonly"]+label,input[type=date]:not(.browser-default):disabled+label,input[type=date]:not(.browser-default)[readonly="readonly"]+label,input[type=datetime]:not(.browser-default):disabled+label,input[type=datetime]:not(.browser-default)[readonly="readonly"]+label,input[type=datetime-local]:not(.browser-default):disabled+label,input[type=datetime-local]:not(.browser-default)[readonly="readonly"]+label,input[type=tel]:not(.browser-default):disabled+label,input[type=tel]:not(.browser-default)[readonly="readonly"]+label,input[type=number]:not(.browser-default):disabled+label,input[type=number]:not(.browser-default)[readonly="readonly"]+label,input[type=search]:not(.browser-default):disabled+label,input[type=search]:not(.browser-default)[readonly="readonly"]+label,textarea.materialize-textarea:disabled+label,textarea.materialize-textarea[readonly="readonly"]+label{color:rgba(0,0,0,0.42)}input:not([type]):focus:not([readonly]),input[type=text]:not(.browser-default):focus:not([readonly]),input[type=password]:not(.browser-default):focus:not([readonly]),input[type=email]:not(.browser-default):focus:not([readonly]),input[type=url]:not(.browser-default):focus:not([readonly]),input[type=time]:not(.browser-default):focus:not([readonly]),input[type=date]:not(.browser-default):focus:not([readonly]),input[type=datetime]:not(.browser-default):focus:not([readonly]),input[type=datetime-local]:not(.browser-default):focus:not([readonly]),input[type=tel]:not(.browser-default):focus:not([readonly]),input[type=number]:not(.browser-default):focus:not([readonly]),input[type=search]:not(.browser-default):focus:not([readonly]),textarea.materialize-textarea:focus:not([readonly]){border-bottom:1px solid #4d9999;box-shadow:0 1px 0 0 #4d9999}input:not([type]):focus:not([readonly])+label,input[type=text]:not(.browser-default):focus:not([readonly])+label,input[type=password]:not(.browser-default):focus:not([readonly])+label,input[type=email]:not(.browser-default):focus:not([readonly])+label,input[type=url]:not(.browser-default):focus:not([readonly])+label,input[type=time]:not(.browser-default):focus:not([readonly])+label,input[type=date]:not(.browser-default):focus:not([readonly])+label,input[type=datetime]:not(.browser-default):focus:not([readonly])+label,input[type=datetime-local]:not(.browser-default):focus:not([readonly])+label,input[type=tel]:not(.browser-default):focus:not([readonly])+label,input[type=number]:not(.browser-default):focus:not([readonly])+label,input[type=search]:not(.browser-default):focus:not([readonly])+label,textarea.materialize-textarea:focus:not([readonly])+label{color:#4d9999}input:not([type]):focus.valid ~ label,input[type=text]:not(.browser-default):focus.valid ~ label,input[type=password]:not(.browser-default):focus.valid ~ label,input[type=email]:not(.browser-default):focus.valid ~ label,input[type=url]:not(.browser-default):focus.valid ~ label,input[type=time]:not(.browser-default):focus.valid ~ label,input[type=date]:not(.browser-default):focus.valid ~ label,input[type=datetime]:not(.browser-default):focus.valid ~ label,input[type=datetime-local]:not(.browser-default):focus.valid ~ label,input[type=tel]:not(.browser-default):focus.valid ~ label,input[type=number]:not(.browser-default):focus.valid ~ label,input[type=search]:not(.browser-default):focus.valid ~ label,textarea.materialize-textarea:focus.valid ~ label{color:#26a96c}input:not([type]):focus.invalid ~ label,input[type=text]:not(.browser-default):focus.invalid ~ label,input[type=password]:not(.browser-default):focus.invalid ~ label,input[type=email]:not(.browser-default):focus.invalid ~ label,input[type=url]:not(.browser-default):focus.invalid ~ label,input[type=time]:not(.browser-default):focus.invalid ~ label,input[type=date]:not(.browser-default):focus.invalid ~ label,input[type=datetime]:not(.browser-default):focus.invalid ~ label,input[type=datetime-local]:not(.browser-default):focus.invalid ~ label,input[type=tel]:not(.browser-default):focus.invalid ~ label,input[type=number]:not(.browser-default):focus.invalid ~ label,input[type=search]:not(.browser-default):focus.invalid ~ label,textarea.materialize-textarea:focus.invalid ~ label{color:#f44336}input:not([type]).validate+label,input[type=text]:not(.browser-default).validate+label,input[type=password]:not(.browser-default).validate+label,input[type=email]:not(.browser-default).validate+label,input[type=url]:not(.browser-default).validate+label,input[type=time]:not(.browser-default).validate+label,input[type=date]:not(.browser-default).validate+label,input[type=datetime]:not(.browser-default).validate+label,input[type=datetime-local]:not(.browser-default).validate+label,input[type=tel]:not(.browser-default).validate+label,input[type=number]:not(.browser-default).validate+label,input[type=search]:not(.browser-default).validate+label,textarea.materialize-textarea.validate+label{width:100%}input.valid:not([type]),input.valid:not([type]):focus,input[type=text].valid:not(.browser-default),input[type=text].valid:not(.browser-default):focus,input[type=password].valid:not(.browser-default),input[type=password].valid:not(.browser-default):focus,input[type=email].valid:not(.browser-default),input[type=email].valid:not(.browser-default):focus,input[type=url].valid:not(.browser-default),input[type=url].valid:not(.browser-default):focus,input[type=time].valid:not(.browser-default),input[type=time].valid:not(.browser-default):focus,input[type=date].valid:not(.browser-default),input[type=date].valid:not(.browser-default):focus,input[type=datetime].valid:not(.browser-default),input[type=datetime].valid:not(.browser-default):focus,input[type=datetime-local].valid:not(.browser-default),input[type=datetime-local].valid:not(.browser-default):focus,input[type=tel].valid:not(.browser-default),input[type=tel].valid:not(.browser-default):focus,input[type=number].valid:not(.browser-default),input[type=number].valid:not(.browser-default):focus,input[type=search].valid:not(.browser-default),input[type=search].valid:not(.browser-default):focus,textarea.materialize-textarea.valid,textarea.materialize-textarea.valid:focus,.select-wrapper.valid>input.select-dropdown{border-bottom:1px solid #26a96c;box-shadow:0 1px 0 0 #26a96c}input.invalid:not([type]),input.invalid:not([type]):focus,input[type=text].invalid:not(.browser-default),input[type=text].invalid:not(.browser-default):focus,input[type=password].invalid:not(.browser-default),input[type=password].invalid:not(.browser-default):focus,input[type=email].invalid:not(.browser-default),input[type=email].invalid:not(.browser-default):focus,input[type=url].invalid:not(.browser-default),input[type=url].invalid:not(.browser-default):focus,input[type=time].invalid:not(.browser-default),input[type=time].invalid:not(.browser-default):focus,input[type=date].invalid:not(.browser-default),input[type=date].invalid:not(.browser-default):focus,input[type=datetime].invalid:not(.browser-default),input[type=datetime].invalid:not(.browser-default):focus,input[type=datetime-local].invalid:not(.browser-default),input[type=datetime-local].invalid:not(.browser-default):focus,input[type=tel].invalid:not(.browser-default),input[type=tel].invalid:not(.browser-default):focus,input[type=number].invalid:not(.browser-default),input[type=number].invalid:not(.browser-default):focus,input[type=search].invalid:not(.browser-default),input[type=search].invalid:not(.browser-default):focus,textarea.materialize-textarea.invalid,textarea.materialize-textarea.invalid:focus,.select-wrapper.invalid>input.select-dropdown,.select-wrapper.invalid>input.select-dropdown:focus{border-bottom:1px solid #f44336;box-shadow:0 1px 0 0 #f44336}input:not([type]).valid ~ .helper-text[data-success],input:not([type]):focus.valid ~ .helper-text[data-success],input:not([type]).invalid ~ .helper-text[data-error],input:not([type]):focus.invalid ~ .helper-text[data-error],input[type=text]:not(.browser-default).valid ~ .helper-text[data-success],input[type=text]:not(.browser-default):focus.valid ~ .helper-text[data-success],input[type=text]:not(.browser-default).invalid ~ .helper-text[data-error],input[type=text]:not(.browser-default):focus.invalid ~ .helper-text[data-error],input[type=password]:not(.browser-default).valid ~ .helper-text[data-success],input[type=password]:not(.browser-default):focus.valid ~ .helper-text[data-success],input[type=password]:not(.browser-default).invalid ~ .helper-text[data-error],input[type=password]:not(.browser-default):focus.invalid ~ .helper-text[data-error],input[type=email]:not(.browser-default).valid ~ .helper-text[data-success],input[type=email]:not(.browser-default):focus.valid ~ .helper-text[data-success],input[type=email]:not(.browser-default).invalid ~ .helper-text[data-error],input[type=email]:not(.browser-default):focus.invalid ~ .helper-text[data-error],input[type=url]:not(.browser-default).valid ~ .helper-text[data-success],input[type=url]:not(.browser-default):focus.valid ~ .helper-text[data-success],input[type=url]:not(.browser-default).invalid ~ .helper-text[data-error],input[type=url]:not(.browser-default):focus.invalid ~ .helper-text[data-error],input[type=time]:not(.browser-default).valid ~ .helper-text[data-success],input[type=time]:not(.browser-default):focus.valid ~ .helper-text[data-success],input[type=time]:not(.browser-default).invalid ~ .helper-text[data-error],input[type=time]:not(.browser-default):focus.invalid ~ .helper-text[data-error],input[type=date]:not(.browser-default).valid ~ .helper-text[data-success],input[type=date]:not(.browser-default):focus.valid ~ .helper-text[data-success],input[type=date]:not(.browser-default).invalid ~ .helper-text[data-error],input[type=date]:not(.browser-default):focus.invalid ~ .helper-text[data-error],input[type=datetime]:not(.browser-default).valid ~ .helper-text[data-success],input[type=datetime]:not(.browser-default):focus.valid ~ .helper-text[data-success],input[type=datetime]:not(.browser-default).invalid ~ .helper-text[data-error],input[type=datetime]:not(.browser-default):focus.invalid ~ .helper-text[data-error],input[type=datetime-local]:not(.browser-default).valid ~ .helper-text[data-success],input[type=datetime-local]:not(.browser-default):focus.valid ~ .helper-text[data-success],input[type=datetime-local]:not(.browser-default).invalid ~ .helper-text[data-error],input[type=datetime-local]:not(.browser-default):focus.invalid ~ .helper-text[data-error],input[type=tel]:not(.browser-default).valid ~ .helper-text[data-success],input[type=tel]:not(.browser-default):focus.valid ~ .helper-text[data-success],input[type=tel]:not(.browser-default).invalid ~ .helper-text[data-error],input[type=tel]:not(.browser-default):focus.invalid ~ .helper-text[data-error],input[type=number]:not(.browser-default).valid ~ .helper-text[data-success],input[type=number]:not(.browser-default):focus.valid ~ .helper-text[data-success],input[type=number]:not(.browser-default).invalid ~ .helper-text[data-error],input[type=number]:not(.browser-default):focus.invalid ~ .helper-text[data-error],input[type=search]:not(.browser-default).valid ~ .helper-text[data-success],input[type=search]:not(.browser-default):focus.valid ~ .helper-text[data-success],input[type=search]:not(.browser-default).invalid ~ .helper-text[data-error],input[type=search]:not(.browser-default):focus.invalid ~ .helper-text[data-error],textarea.materialize-textarea.valid ~ .helper-text[data-success],textarea.materialize-textarea:focus.valid ~ .helper-text[data-success],textarea.materialize-textarea.invalid ~ .helper-text[data-error],textarea.materialize-textarea:focus.invalid ~ .helper-text[data-error],.select-wrapper.valid .helper-text[data-success],.select-wrapper.invalid ~ .helper-text[data-error]{color:transparent;user-select:none;pointer-events:none}input:not([type]).valid ~ .helper-text:after,input:not([type]):focus.valid ~ .helper-text:after,input[type=text]:not(.browser-default).valid ~ .helper-text:after,input[type=text]:not(.browser-default):focus.valid ~ .helper-text:after,input[type=password]:not(.browser-default).valid ~ .helper-text:after,input[type=password]:not(.browser-default):focus.valid ~ .helper-text:after,input[type=email]:not(.browser-default).valid ~ .helper-text:after,input[type=email]:not(.browser-default):focus.valid ~ .helper-text:after,input[type=url]:not(.browser-default).valid ~ .helper-text:after,input[type=url]:not(.browser-default):focus.valid ~ .helper-text:after,input[type=time]:not(.browser-default).valid ~ .helper-text:after,input[type=time]:not(.browser-default):focus.valid ~ .helper-text:after,input[type=date]:not(.browser-default).valid ~ .helper-text:after,input[type=date]:not(.browser-default):focus.valid ~ .helper-text:after,input[type=datetime]:not(.browser-default).valid ~ .helper-text:after,input[type=datetime]:not(.browser-default):focus.valid ~ .helper-text:after,input[type=datetime-local]:not(.browser-default).valid ~ .helper-text:after,input[type=datetime-local]:not(.browser-default):focus.valid ~ .helper-text:after,input[type=tel]:not(.browser-default).valid ~ .helper-text:after,input[type=tel]:not(.browser-default):focus.valid ~ .helper-text:after,input[type=number]:not(.browser-default).valid ~ .helper-text:after,input[type=number]:not(.browser-default):focus.valid ~ .helper-text:after,input[type=search]:not(.browser-default).valid ~ .helper-text:after,input[type=search]:not(.browser-default):focus.valid ~ .helper-text:after,textarea.materialize-textarea.valid ~ .helper-text:after,textarea.materialize-textarea:focus.valid ~ .helper-text:after,.select-wrapper.valid ~ .helper-text:after{content:attr(data-success);color:#26a96c}input:not([type]).invalid ~ .helper-text:after,input:not([type]):focus.invalid ~ .helper-text:after,input[type=text]:not(.browser-default).invalid ~ .helper-text:after,input[type=text]:not(.browser-default):focus.invalid ~ .helper-text:after,input[type=password]:not(.browser-default).invalid ~ .helper-text:after,input[type=password]:not(.browser-default):focus.invalid ~ .helper-text:after,input[type=email]:not(.browser-default).invalid ~ .helper-text:after,input[type=email]:not(.browser-default):focus.invalid ~ .helper-text:after,input[type=url]:not(.browser-default).invalid ~ .helper-text:after,input[type=url]:not(.browser-default):focus.invalid ~ .helper-text:after,input[type=time]:not(.browser-default).invalid ~ .helper-text:after,input[type=time]:not(.browser-default):focus.invalid ~ .helper-text:after,input[type=date]:not(.browser-default).invalid ~ .helper-text:after,input[type=date]:not(.browser-default):focus.invalid ~ .helper-text:after,input[type=datetime]:not(.browser-default).invalid ~ .helper-text:after,input[type=datetime]:not(.browser-default):focus.invalid ~ .helper-text:after,input[type=datetime-local]:not(.browser-default).invalid ~ .helper-text:after,input[type=datetime-local]:not(.browser-default):focus.invalid ~ .helper-text:after,input[type=tel]:not(.browser-default).invalid ~ .helper-text:after,input[type=tel]:not(.browser-default):focus.invalid ~ .helper-text:after,input[type=number]:not(.browser-default).invalid ~ .helper-text:after,input[type=number]:not(.browser-default):focus.invalid ~ .helper-text:after,input[type=search]:not(.browser-default).invalid ~ .helper-text:after,input[type=search]:not(.browser-default):focus.invalid ~ .helper-text:after,textarea.materialize-textarea.invalid ~ .helper-text:after,textarea.materialize-textarea:focus.invalid ~ .helper-text:after,.select-wrapper.invalid ~ .helper-text:after{content:attr(data-error);color:#f44336}input:not([type])+label:after,input[type=text]:not(.browser-default)+label:after,input[type=password]:not(.browser-default)+label:after,input[type=email]:not(.browser-default)+label:after,input[type=url]:not(.browser-default)+label:after,input[type=time]:not(.browser-default)+label:after,input[type=date]:not(.browser-default)+label:after,input[type=datetime]:not(.browser-default)+label:after,input[type=datetime-local]:not(.browser-default)+label:after,input[type=tel]:not(.browser-default)+label:after,input[type=number]:not(.browser-default)+label:after,input[type=search]:not(.browser-default)+label:after,textarea.materialize-textarea+label:after,.select-wrapper+label:after{display:block;content:"";position:absolute;top:100%;left:0;opacity:0;transition:.2s opacity ease-out,.2s color ease-out}.input-field{position:relative;margin-top:1rem;margin-bottom:1rem}.input-field.inline{display:inline-block;vertical-align:middle;margin-left:5px}.input-field.inline input,.input-field.inline .select-dropdown{margin-bottom:1rem}.input-field.col label{left:.75rem}.input-field.col .prefix ~ label,.input-field.col .prefix ~ .validate ~ label{width:calc(100% - 3rem - 1.5rem)}.input-field>label{color:#9e9e9e;position:absolute;top:0;left:0;font-size:1rem;cursor:text;transition:transform .2s ease-out,color .2s ease-out;transform-origin:0 100%;text-align:initial;transform:translateY(12px)}.input-field>label:not(.label-icon).active{transform:translateY(-14px) scale(0.8);transform-origin:0 0}.input-field>input[type]:-webkit-autofill:not(.browser-default):not([type="search"])+label,.input-field>input[type=date]:not(.browser-default)+label,.input-field>input[type=time]:not(.browser-default)+label{transform:translateY(-14px) scale(0.8);transform-origin:0 0}.input-field .helper-text{position:relative;min-height:18px;display:block;font-size:12px;color:rgba(0,0,0,0.54)}.input-field .helper-text::after{opacity:1;position:absolute;top:0;left:0}.input-field .prefix{position:absolute;width:3rem;font-size:2rem;transition:color .2s;top:.5rem}.input-field .prefix.active{color:#4d9999}.input-field .prefix ~ input,.input-field .prefix ~ textarea,.input-field .prefix ~ label,.input-field .prefix ~ .validate ~ label,.input-field .prefix ~ .helper-text,.input-field .prefix ~ .autocomplete-content{margin-left:3rem;width:92%;width:calc(100% - 3rem)}.input-field .prefix ~ label{margin-left:3rem}@media only screen and (max-width:992px){.input-field .prefix ~ input{width:86%;width:calc(100% - 3rem)}}@media only screen and (max-width:600px){.input-field .prefix ~ input{width:80%;width:calc(100% - 3rem)}}.input-field input[type=search]{display:block;line-height:inherit;transition:.3s background-color}.nav-wrapper .input-field input[type=search]{height:inherit;padding-left:4rem;width:calc(100% - 4rem);border:0;box-shadow:none}.input-field input[type=search]:focus:not(.browser-default){background-color:#fff;border:0;box-shadow:none;color:#444}.input-field input[type=search]:focus:not(.browser-default)+label i,.input-field input[type=search]:focus:not(.browser-default) ~ .mdi-navigation-close,.input-field input[type=search]:focus:not(.browser-default) ~ .material-icons{color:#444}.input-field input[type=search]+.label-icon{transform:none;left:1rem}.input-field input[type=search] ~ .mdi-navigation-close,.input-field input[type=search] ~ .material-icons{position:absolute;top:0;right:1rem;color:transparent;cursor:pointer;font-size:2rem;transition:.3s color}textarea{width:100%;height:3rem;background-color:transparent}textarea.materialize-textarea{line-height:normal;overflow-y:hidden;padding:.8rem 0 .8rem 0;resize:none;min-height:3rem;box-sizing:border-box}.hiddendiv{visibility:hidden;white-space:pre-wrap;word-wrap:break-word;overflow-wrap:break-word;padding-top:1.2rem;position:absolute;top:0;z-index:-1}.autocomplete-content li .highlight{color:#444}.autocomplete-content li img{height:40px;width:40px;margin:5px 15px}.character-counter{min-height:18px}[type="radio"]:not(:checked),[type="radio"]:checked{position:absolute;opacity:0;pointer-events:none}[type="radio"]:not(:checked)+span,[type="radio"]:checked+span{position:relative;padding-left:35px;cursor:pointer;display:inline-block;height:25px;line-height:25px;font-size:1rem;transition:.28s ease;user-select:none}[type="radio"]+span:before,[type="radio"]+span:after{content:'';position:absolute;left:0;top:0;margin:4px;width:16px;height:16px;z-index:0;transition:.28s ease}[type="radio"]:not(:checked)+span:before,[type="radio"]:not(:checked)+span:after,[type="radio"]:checked+span:before,[type="radio"]:checked+span:after,[type="radio"].with-gap:checked+span:before,[type="radio"].with-gap:checked+span:after{border-radius:50%}[type="radio"]:not(:checked)+span:before,[type="radio"]:not(:checked)+span:after{border:2px solid #5a5a5a}[type="radio"]:not(:checked)+span:after{transform:scale(0)}[type="radio"]:checked+span:before{border:2px solid transparent}[type="radio"]:checked+span:after,[type="radio"].with-gap:checked+span:before,[type="radio"].with-gap:checked+span:after{border:2px solid #4d9999}[type="radio"]:checked+span:after,[type="radio"].with-gap:checked+span:after{background-color:#4d9999}[type="radio"]:checked+span:after{transform:scale(1.02)}[type="radio"].with-gap:checked+span:after{transform:scale(0.5)}[type="radio"].tabbed:focus+span:before{box-shadow:0 0 0 10px rgba(0,0,0,0.1)}[type="radio"].with-gap:disabled:checked+span:before{border:2px solid rgba(0,0,0,0.42)}[type="radio"].with-gap:disabled:checked+span:after{border:0;background-color:rgba(0,0,0,0.42)}[type="radio"]:disabled:not(:checked)+span:before,[type="radio"]:disabled:checked+span:before{background-color:transparent;border-color:rgba(0,0,0,0.42)}[type="radio"]:disabled+span{color:rgba(0,0,0,0.42)}[type="radio"]:disabled:not(:checked)+span:before{border-color:rgba(0,0,0,0.42)}[type="radio"]:disabled:checked+span:after{background-color:rgba(0,0,0,0.42);border-color:#949494}[type="checkbox"]:not(:checked),[type="checkbox"]:checked{position:absolute;opacity:0;pointer-events:none}[type="checkbox"]+span:not(.lever){position:relative;padding-left:35px;cursor:pointer;display:inline-block;height:25px;line-height:25px;font-size:1rem;user-select:none}[type="checkbox"]+span:not(.lever):before,[type="checkbox"]:not(.filled-in)+span:not(.lever):after{content:'';position:absolute;top:0;left:0;width:18px;height:18px;z-index:0;border:2px solid #5a5a5a;border-radius:1px;margin-top:3px;transition:.2s}[type="checkbox"]:not(.filled-in)+span:not(.lever):after{border:0;transform:scale(0)}[type="checkbox"]:not(:checked):disabled+span:not(.lever):before{border:0;background-color:rgba(0,0,0,0.42)}[type="checkbox"].tabbed:focus+span:not(.lever):after{transform:scale(1);border:0;border-radius:50%;box-shadow:0 0 0 10px rgba(0,0,0,0.1);background-color:rgba(0,0,0,0.1)}[type="checkbox"]:checked+span:not(.lever):before{top:-4px;left:-5px;width:12px;height:22px;border-top:2px solid transparent;border-left:2px solid transparent;border-right:2px solid #4d9999;border-bottom:2px solid #4d9999;transform:rotate(40deg);backface-visibility:hidden;transform-origin:100% 100%}[type="checkbox"]:checked:disabled+span:before{border-right:2px solid rgba(0,0,0,0.42);border-bottom:2px solid rgba(0,0,0,0.42)}[type="checkbox"]:indeterminate+span:not(.lever):before{top:-11px;left:-12px;width:10px;height:22px;border-top:0;border-left:none;border-right:2px solid #4d9999;border-bottom:0;transform:rotate(90deg);backface-visibility:hidden;transform-origin:100% 100%}[type="checkbox"]:indeterminate:disabled+span:not(.lever):before{border-right:2px solid rgba(0,0,0,0.42);background-color:transparent}[type="checkbox"].filled-in+span:not(.lever):after{border-radius:2px}[type="checkbox"].filled-in+span:not(.lever):before,[type="checkbox"].filled-in+span:not(.lever):after{content:'';left:0;position:absolute;transition:border .25s,background-color .25s,width .20s .1s,height .20s .1s,top .20s .1s,left .20s .1s;z-index:1}[type="checkbox"].filled-in:not(:checked)+span:not(.lever):before{width:0;height:0;border:3px solid transparent;left:6px;top:10px;transform:rotateZ(37deg);transform-origin:100% 100%}[type="checkbox"].filled-in:not(:checked)+span:not(.lever):after{height:20px;width:20px;background-color:transparent;border:2px solid #5a5a5a;top:0;z-index:0}[type="checkbox"].filled-in:checked+span:not(.lever):before{top:0;left:1px;width:8px;height:13px;border-top:2px solid transparent;border-left:2px solid transparent;border-right:2px solid #fff;border-bottom:2px solid #fff;transform:rotateZ(37deg);transform-origin:100% 100%}[type="checkbox"].filled-in:checked+span:not(.lever):after{top:0;width:20px;height:20px;border:2px solid #4d9999;background-color:#4d9999;z-index:0}[type="checkbox"].filled-in.tabbed:focus+span:not(.lever):after{border-radius:2px;border-color:#5a5a5a;background-color:rgba(0,0,0,0.1)}[type="checkbox"].filled-in.tabbed:checked:focus+span:not(.lever):after{border-radius:2px;background-color:#4d9999;border-color:#4d9999}[type="checkbox"].filled-in:disabled:not(:checked)+span:not(.lever):before{background-color:transparent;border:2px solid transparent}[type="checkbox"].filled-in:disabled:not(:checked)+span:not(.lever):after{border-color:transparent;background-color:#949494}[type="checkbox"].filled-in:disabled:checked+span:not(.lever):before{background-color:transparent}[type="checkbox"].filled-in:disabled:checked+span:not(.lever):after{background-color:#949494;border-color:#949494}.switch,.switch *{-webkit-tap-highlight-color:transparent;user-select:none}.switch label{cursor:pointer}.switch label input[type=checkbox]{opacity:0;width:0;height:0}.switch label input[type=checkbox]:checked+.lever{background-color:#adb9b9}.switch label input[type=checkbox]:checked+.lever:before,.switch label input[type=checkbox]:checked+.lever:after{left:18px}.switch label input[type=checkbox]:checked+.lever:after{background-color:#4d9999}.switch label .lever{content:"";display:inline-block;position:relative;width:36px;height:14px;background-color:rgba(0,0,0,0.38);border-radius:15px;margin-right:10px;transition:background .3s ease;vertical-align:middle;margin:0 16px}.switch label .lever:before,.switch label .lever:after{content:"";position:absolute;display:inline-block;width:20px;height:20px;border-radius:50%;left:0;top:-3px;transition:left .3s ease,background .3s ease,box-shadow .1s ease,transform .1s ease}.switch label .lever:before{background-color:rgba(77,153,153,0.15)}.switch label .lever:after{background-color:#f1f1f1;box-shadow:0 3px 1px -2px rgba(0,0,0,0.2),0px 2px 2px 0 rgba(0,0,0,0.14),0px 1px 5px 0 rgba(0,0,0,0.12)}input[type=checkbox]:checked:not(:disabled) ~ .lever:active::before,input[type=checkbox]:checked:not(:disabled).tabbed:focus ~ .lever::before{transform:scale(2.4);background-color:rgba(77,153,153,0.15)}input[type=checkbox]:not(:disabled) ~ .lever:active:before,input[type=checkbox]:not(:disabled).tabbed:focus ~ .lever::before{transform:scale(2.4);background-color:rgba(0,0,0,0.08)}.switch input[type=checkbox][disabled]+.lever{cursor:default;background-color:rgba(0,0,0,0.12)}.switch label input[type=checkbox][disabled]+.lever:after,.switch label input[type=checkbox][disabled]:checked+.lever:after{background-color:#949494}select{display:none}select.browser-default{display:block}select{background-color:rgba(255,255,255,0.9);width:100%;padding:5px;border:1px solid #f2f2f2;border-radius:2px;height:3rem}.select-label{position:absolute}.select-wrapper{position:relative}.select-wrapper.valid+label,.select-wrapper.invalid+label{width:100%;pointer-events:none}.select-wrapper input.select-dropdown{position:relative;cursor:pointer;background-color:transparent;border:0;border-bottom:1px solid #9e9e9e;outline:0;height:3rem;line-height:3rem;width:100%;font-size:16px;margin:0 0 8px 0;padding:0;display:block;user-select:none;z-index:1}.select-wrapper input.select-dropdown:focus{border-bottom:1px solid #4d9999}.select-wrapper .caret{position:absolute;right:0;top:0;bottom:0;margin:auto 0;z-index:0;fill:rgba(0,0,0,0.87)}.select-wrapper+label{position:absolute;top:-26px;font-size:.8rem}select:disabled{color:rgba(0,0,0,0.42)}.select-wrapper.disabled+label{color:rgba(0,0,0,0.42)}.select-wrapper.disabled .caret{fill:rgba(0,0,0,0.42)}.select-wrapper input.select-dropdown:disabled{color:rgba(0,0,0,0.42);cursor:default;user-select:none}.select-wrapper i{color:rgba(0,0,0,0.3)}.select-dropdown li.disabled,.select-dropdown li.disabled>span,.select-dropdown li.optgroup{color:rgba(0,0,0,0.3);background-color:transparent}body.keyboard-focused .select-dropdown.dropdown-content li:focus{background-color:rgba(0,0,0,0.08)}.select-dropdown.dropdown-content li:hover{background-color:rgba(0,0,0,0.08)}.select-dropdown.dropdown-content li.selected{background-color:rgba(0,0,0,0.03)}.prefix ~ .select-wrapper{margin-left:3rem;width:92%;width:calc(100% - 3rem)}.prefix ~ label{margin-left:3rem}.select-dropdown li img{height:40px;width:40px;margin:5px 15px;float:right}.select-dropdown li.optgroup{border-top:1px solid #eee}.select-dropdown li.optgroup.selected>span{color:rgba(0,0,0,0.7)}.select-dropdown li.optgroup>span{color:rgba(0,0,0,0.4)}.select-dropdown li.optgroup ~ li.optgroup-option{padding-left:1rem}.file-field{position:relative}.file-field .file-path-wrapper{overflow:hidden;padding-left:10px}.file-field input.file-path{width:100%}.file-field .btn,.file-field .btn-large,.file-field .btn-small{float:left;height:3rem;line-height:3rem}.file-field span{cursor:pointer}.file-field input[type=file]{position:absolute;top:0;right:0;left:0;bottom:0;width:100%;margin:0;padding:0;font-size:20px;cursor:pointer;opacity:0;filter:alpha(opacity=0)}.file-field input[type=file]::-webkit-file-upload-button{display:none}.range-field{position:relative}input[type=range],input[type=range]+.thumb{cursor:pointer}input[type=range]{position:relative;background-color:transparent;border:0;outline:0;width:100%;margin:15px 0;padding:0}input[type=range]:focus{outline:0}input[type=range]+.thumb{position:absolute;top:10px;left:0;border:0;height:0;width:0;border-radius:50%;background-color:#4d9999;margin-left:7px;transform-origin:50% 50%;transform:rotate(-45deg)}input[type=range]+.thumb .value{display:block;width:30px;text-align:center;color:#4d9999;font-size:0;transform:rotate(45deg)}input[type=range]+.thumb.active{border-radius:50% 50% 50% 0}input[type=range]+.thumb.active .value{color:#fff;margin-left:-1px;margin-top:8px;font-size:10px}input[type=range]{-webkit-appearance:none}input[type=range]::-webkit-slider-runnable-track{height:3px;background:#c2c0c2;border:0}input[type=range]::-webkit-slider-thumb{border:0;height:14px;width:14px;border-radius:50%;background:#4d9999;transition:box-shadow .3s;-webkit-appearance:none;background-color:#4d9999;transform-origin:50% 50%;margin:-5px 0 0 0}.keyboard-focused input[type=range]:focus:not(.active)::-webkit-slider-thumb{box-shadow:0 0 0 10px rgba(77,153,153,0.26)}input[type=range]{border:1px solid white}input[type=range]::-moz-range-track{height:3px;background:#c2c0c2;border:0}input[type=range]::-moz-focus-inner{border:0}input[type=range]::-moz-range-thumb{border:0;height:14px;width:14px;border-radius:50%;background:#4d9999;transition:box-shadow .3s;margin-top:-5px}input[type=range]:-moz-focusring{outline:1px solid #fff;outline-offset:-1px}.keyboard-focused input[type=range]:focus:not(.active)::-moz-range-thumb{box-shadow:0 0 0 10px rgba(77,153,153,0.26)}input[type=range]::-ms-track{height:3px;background:transparent;border-color:transparent;border-width:6px 0;color:transparent}input[type=range]::-ms-fill-lower{background:#777}input[type=range]::-ms-fill-upper{background:#ddd}input[type=range]::-ms-thumb{border:0;height:14px;width:14px;border-radius:50%;background:#4d9999;transition:box-shadow .3s}.keyboard-focused input[type=range]:focus:not(.active)::-ms-thumb{box-shadow:0 0 0 10px rgba(77,153,153,0.26)}.table-of-contents.fixed{position:fixed}.table-of-contents li{padding:2px 0}.table-of-contents a{display:inline-block;font-weight:300;color:#757575;padding-left:16px;height:1.5rem;line-height:1.5rem;letter-spacing:.4;display:inline-block}.table-of-contents a:hover{color:#a8a8a8;padding-left:15px;border-left:1px solid #b84000}.table-of-contents a.active{font-weight:500;padding-left:14px;border-left:2px solid #b84000}.sidenav{position:fixed;width:300px;left:0;top:0;margin:0;transform:translateX(-100%);height:100%;height:calc(100% + 60px);height:-moz-calc(100%);padding-bottom:60px;background-color:#fff;z-index:999;overflow-y:auto;will-change:transform;backface-visibility:hidden;transform:translateX(-105%)}.sidenav.right-aligned{right:0;transform:translateX(105%);left:auto;transform:translateX(100%)}.sidenav .collapsible{margin:0}.sidenav li{float:none;line-height:48px}.sidenav li.active{background-color:rgba(0,0,0,0.05)}.sidenav li>a{color:rgba(0,0,0,0.87);display:block;font-size:14px;font-weight:500;height:48px;line-height:48px;padding:0 32px}.sidenav li>a:hover{background-color:rgba(0,0,0,0.05)}.sidenav li>a.btn,.sidenav li>a.btn-large,.sidenav li>a.btn-small,.sidenav li>a.btn-large,.sidenav li>a.btn-flat,.sidenav li>a.btn-floating{margin:10px 15px}.sidenav li>a.btn,.sidenav li>a.btn-large,.sidenav li>a.btn-small,.sidenav li>a.btn-large,.sidenav li>a.btn-floating{color:#fff}.sidenav li>a.btn-flat{color:#343434}.sidenav li>a.btn:hover,.sidenav li>a.btn-large:hover,.sidenav li>a.btn-small:hover,.sidenav li>a.btn-large:hover{background-color:#56aaaa}.sidenav li>a.btn-floating:hover{background-color:#4d9999}.sidenav li>a>i,.sidenav li>a>[class^="mdi-"],.sidenav li>a li>a>[class*="mdi-"],.sidenav li>a>i.material-icons{float:left;height:48px;line-height:48px;margin:0 32px 0 0;width:24px;color:rgba(0,0,0,0.54)}.sidenav .divider{margin:8px 0 0 0}.sidenav .subheader{cursor:initial;pointer-events:none;color:rgba(0,0,0,0.54);font-size:14px;font-weight:500;line-height:48px}.sidenav .subheader:hover{background-color:transparent}.sidenav .user-view{position:relative;padding:32px 32px 0;margin-bottom:8px}.sidenav .user-view>a{height:auto;padding:0}.sidenav .user-view>a:hover{background-color:transparent}.sidenav .user-view .background{overflow:hidden;position:absolute;top:0;right:0;bottom:0;left:0;z-index:-1}.sidenav .user-view .circle,.sidenav .user-view .name,.sidenav .user-view .email{display:block}.sidenav .user-view .circle{height:64px;width:64px}.sidenav .user-view .name,.sidenav .user-view .email{font-size:14px;line-height:24px}.sidenav .user-view .name{margin-top:16px;font-weight:500}.sidenav .user-view .email{padding-bottom:16px;font-weight:400}.drag-target{height:100%;width:10px;position:fixed;top:0;z-index:998}.drag-target.right-aligned{right:0}.sidenav.sidenav-fixed{left:0;transform:translateX(0);position:fixed}.sidenav.sidenav-fixed.right-aligned{right:0;left:auto}@media only screen and (max-width:992px){.sidenav.sidenav-fixed{transform:translateX(-105%)}.sidenav.sidenav-fixed.right-aligned{transform:translateX(105%)}.sidenav>a{padding:0 16px}.sidenav .user-view{padding:16px 16px 0}}.sidenav .collapsible-body>ul:not(.collapsible)>li.active,.sidenav.sidenav-fixed .collapsible-body>ul:not(.collapsible)>li.active{background-color:#b84000}.sidenav .collapsible-body>ul:not(.collapsible)>li.active a,.sidenav.sidenav-fixed .collapsible-body>ul:not(.collapsible)>li.active a{color:#fff}.sidenav .collapsible-body{padding:0}.sidenav-overlay{position:fixed;top:0;left:0;right:0;opacity:0;height:120vh;background-color:rgba(0,0,0,0.5);z-index:997;display:none}.preloader-wrapper{display:inline-block;position:relative;width:50px;height:50px}.preloader-wrapper.small{width:36px;height:36px}.preloader-wrapper.big{width:64px;height:64px}.preloader-wrapper.active{-webkit-animation:container-rotate 1568ms linear infinite;animation:container-rotate 1568ms linear infinite}@-webkit-keyframes container-rotate{to{-webkit-transform:rotate(360deg)}}@keyframes container-rotate{to{transform:rotate(360deg)}}.spinner-layer{position:absolute;width:100%;height:100%;opacity:0;border-color:#4d9999}.spinner-blue,.spinner-blue-only{border-color:#4285f4}.spinner-red,.spinner-red-only{border-color:#db4437}.spinner-yellow,.spinner-yellow-only{border-color:#f4b400}.spinner-green,.spinner-green-only{border-color:#0f9d58}.active .spinner-layer.spinner-blue{-webkit-animation:fill-unfill-rotate 5332ms cubic-bezier(0.4,0,0.2,1) infinite both,blue-fade-in-out 5332ms cubic-bezier(0.4,0,0.2,1) infinite both;animation:fill-unfill-rotate 5332ms cubic-bezier(0.4,0,0.2,1) infinite both,blue-fade-in-out 5332ms cubic-bezier(0.4,0,0.2,1) infinite both}.active .spinner-layer.spinner-red{-webkit-animation:fill-unfill-rotate 5332ms cubic-bezier(0.4,0,0.2,1) infinite both,red-fade-in-out 5332ms cubic-bezier(0.4,0,0.2,1) infinite both;animation:fill-unfill-rotate 5332ms cubic-bezier(0.4,0,0.2,1) infinite both,red-fade-in-out 5332ms cubic-bezier(0.4,0,0.2,1) infinite both}.active .spinner-layer.spinner-yellow{-webkit-animation:fill-unfill-rotate 5332ms cubic-bezier(0.4,0,0.2,1) infinite both,yellow-fade-in-out 5332ms cubic-bezier(0.4,0,0.2,1) infinite both;animation:fill-unfill-rotate 5332ms cubic-bezier(0.4,0,0.2,1) infinite both,yellow-fade-in-out 5332ms cubic-bezier(0.4,0,0.2,1) infinite both}.active .spinner-layer.spinner-green{-webkit-animation:fill-unfill-rotate 5332ms cubic-bezier(0.4,0,0.2,1) infinite both,green-fade-in-out 5332ms cubic-bezier(0.4,0,0.2,1) infinite both;animation:fill-unfill-rotate 5332ms cubic-bezier(0.4,0,0.2,1) infinite both,green-fade-in-out 5332ms cubic-bezier(0.4,0,0.2,1) infinite both}.active .spinner-layer,.active .spinner-layer.spinner-blue-only,.active .spinner-layer.spinner-red-only,.active .spinner-layer.spinner-yellow-only,.active .spinner-layer.spinner-green-only{opacity:1;-webkit-animation:fill-unfill-rotate 5332ms cubic-bezier(0.4,0,0.2,1) infinite both;animation:fill-unfill-rotate 5332ms cubic-bezier(0.4,0,0.2,1) infinite both}@-webkit-keyframes fill-unfill-rotate{12.5%{-webkit-transform:rotate(135deg)}25%{-webkit-transform:rotate(270deg)}37.5%{-webkit-transform:rotate(405deg)}50%{-webkit-transform:rotate(540deg)}62.5%{-webkit-transform:rotate(675deg)}75%{-webkit-transform:rotate(810deg)}87.5%{-webkit-transform:rotate(945deg)}to{-webkit-transform:rotate(1080deg)}}@keyframes fill-unfill-rotate{12.5%{transform:rotate(135deg)}25%{transform:rotate(270deg)}37.5%{transform:rotate(405deg)}50%{transform:rotate(540deg)}62.5%{transform:rotate(675deg)}75%{transform:rotate(810deg)}87.5%{transform:rotate(945deg)}to{transform:rotate(1080deg)}}@-webkit-keyframes blue-fade-in-out{from{opacity:1}25%{opacity:1}26%{opacity:0}89%{opacity:0}90%{opacity:1}100%{opacity:1}}@keyframes blue-fade-in-out{from{opacity:1}25%{opacity:1}26%{opacity:0}89%{opacity:0}90%{opacity:1}100%{opacity:1}}@-webkit-keyframes red-fade-in-out{from{opacity:0}15%{opacity:0}25%{opacity:1}50%{opacity:1}51%{opacity:0}}@keyframes red-fade-in-out{from{opacity:0}15%{opacity:0}25%{opacity:1}50%{opacity:1}51%{opacity:0}}@-webkit-keyframes yellow-fade-in-out{from{opacity:0}40%{opacity:0}50%{opacity:1}75%{opacity:1}76%{opacity:0}}@keyframes yellow-fade-in-out{from{opacity:0}40%{opacity:0}50%{opacity:1}75%{opacity:1}76%{opacity:0}}@-webkit-keyframes green-fade-in-out{from{opacity:0}65%{opacity:0}75%{opacity:1}90%{opacity:1}100%{opacity:0}}@keyframes green-fade-in-out{from{opacity:0}65%{opacity:0}75%{opacity:1}90%{opacity:1}100%{opacity:0}}.gap-patch{position:absolute;top:0;left:45%;width:10%;height:100%;overflow:hidden;border-color:inherit}.gap-patch .circle{width:1000%;left:-450%}.circle-clipper{display:inline-block;position:relative;width:50%;height:100%;overflow:hidden;border-color:inherit}.circle-clipper .circle{width:200%;height:100%;border-width:3px;border-style:solid;border-color:inherit;border-bottom-color:transparent!important;border-radius:50%;-webkit-animation:none;animation:none;position:absolute;top:0;right:0;bottom:0}.circle-clipper.left .circle{left:0;border-right-color:transparent!important;-webkit-transform:rotate(129deg);transform:rotate(129deg)}.circle-clipper.right .circle{left:-100%;border-left-color:transparent!important;-webkit-transform:rotate(-129deg);transform:rotate(-129deg)}.active .circle-clipper.left .circle{-webkit-animation:left-spin 1333ms cubic-bezier(0.4,0,0.2,1) infinite both;animation:left-spin 1333ms cubic-bezier(0.4,0,0.2,1) infinite both}.active .circle-clipper.right .circle{-webkit-animation:right-spin 1333ms cubic-bezier(0.4,0,0.2,1) infinite both;animation:right-spin 1333ms cubic-bezier(0.4,0,0.2,1) infinite both}@-webkit-keyframes left-spin{from{-webkit-transform:rotate(130deg)}50%{-webkit-transform:rotate(-5deg)}to{-webkit-transform:rotate(130deg)}}@keyframes left-spin{from{transform:rotate(130deg)}50%{transform:rotate(-5deg)}to{transform:rotate(130deg)}}@-webkit-keyframes right-spin{from{-webkit-transform:rotate(-130deg)}50%{-webkit-transform:rotate(5deg)}to{-webkit-transform:rotate(-130deg)}}@keyframes right-spin{from{transform:rotate(-130deg)}50%{transform:rotate(5deg)}to{transform:rotate(-130deg)}}#spinnerContainer.cooldown{-webkit-animation:container-rotate 1568ms linear infinite,fade-out 400ms cubic-bezier(0.4,0,0.2,1);animation:container-rotate 1568ms linear infinite,fade-out 400ms cubic-bezier(0.4,0,0.2,1)}@-webkit-keyframes fade-out{from{opacity:1}to{opacity:0}}@keyframes fade-out{from{opacity:1}to{opacity:0}}.slider{position:relative;height:400px;width:100%}.slider.fullscreen{height:100%;width:100%;position:absolute;top:0;left:0;right:0;bottom:0}.slider.fullscreen ul.slides{height:100%}.slider.fullscreen ul.indicators{z-index:2;bottom:30px}.slider .slides{background-color:#9e9e9e;margin:0;height:400px}.slider .slides li{opacity:0;position:absolute;top:0;left:0;z-index:1;width:100%;height:inherit;overflow:hidden}.slider .slides li img{height:100%;width:100%;background-size:cover;background-position:center}.slider .slides li .caption{color:#fff;position:absolute;top:15%;left:15%;width:70%;opacity:0}.slider .slides li .caption p{color:#e0e0e0}.slider .slides li.active{z-index:2}.slider .indicators{position:absolute;text-align:center;left:0;right:0;bottom:0;margin:0}.slider .indicators .indicator-item{display:inline-block;position:relative;cursor:pointer;height:16px;width:16px;margin:0 12px;background-color:#e0e0e0;transition:background-color .3s;border-radius:50%}.slider .indicators .indicator-item.active{background-color:#4caf50}.carousel{overflow:hidden;position:relative;width:100%;height:400px;perspective:500px;transform-style:preserve-3d;transform-origin:0 50%}.carousel.carousel-slider{top:0;left:0}.carousel.carousel-slider .carousel-fixed-item{position:absolute;left:0;right:0;bottom:20px;z-index:1}.carousel.carousel-slider .carousel-fixed-item.with-indicators{bottom:68px}.carousel.carousel-slider .carousel-item{width:100%;height:100%;min-height:400px;position:absolute;top:0;left:0}.carousel.carousel-slider .carousel-item h2{font-size:24px;font-weight:500;line-height:32px}.carousel.carousel-slider .carousel-item p{font-size:15px}.carousel .carousel-item{visibility:hidden;width:200px;height:200px;position:absolute;top:0;left:0}.carousel .carousel-item>img{width:100%}.carousel .indicators{position:absolute;text-align:center;left:0;right:0;bottom:0;margin:0}.carousel .indicators .indicator-item{display:inline-block;position:relative;cursor:pointer;height:8px;width:8px;margin:24px 4px;background-color:rgba(255,255,255,0.5);transition:background-color .3s;border-radius:50%}.carousel .indicators .indicator-item.active{background-color:#fff}.carousel.scrolling .carousel-item .materialboxed,.carousel .carousel-item:not(.active) .materialboxed{pointer-events:none}.tap-target-wrapper{width:800px;height:800px;position:fixed;z-index:1000;visibility:hidden;transition:visibility 0s .3s}.tap-target-wrapper.open{visibility:visible;transition:visibility 0s}.tap-target-wrapper.open .tap-target{transform:scale(1);opacity:.95;transition:transform .3s cubic-bezier(0.42,0,0.58,1),opacity .3s cubic-bezier(0.42,0,0.58,1)}.tap-target-wrapper.open .tap-target-wave::before{transform:scale(1)}.tap-target-wrapper.open .tap-target-wave::after{visibility:visible;animation:pulse-animation 1s cubic-bezier(0.24,0,0.38,1) infinite;transition:opacity .3s,transform .3s,visibility 0s 1s}.tap-target{position:absolute;font-size:1rem;border-radius:50%;background-color:#b84000;box-shadow:0 20px 20px 0 rgba(0,0,0,0.14),0 10px 50px 0 rgba(0,0,0,0.12),0 30px 10px -20px rgba(0,0,0,0.2);width:100%;height:100%;opacity:0;transform:scale(0);transition:transform .3s cubic-bezier(0.42,0,0.58,1),opacity .3s cubic-bezier(0.42,0,0.58,1)}.tap-target-content{position:relative;display:table-cell}.tap-target-wave{position:absolute;border-radius:50%;z-index:10001}.tap-target-wave::before,.tap-target-wave::after{content:'';display:block;position:absolute;width:100%;height:100%;border-radius:50%;background-color:#fff}.tap-target-wave::before{transform:scale(0);transition:transform .3s}.tap-target-wave::after{visibility:hidden;transition:opacity .3s,transform .3s,visibility 0s;z-index:-1}.tap-target-origin{top:50%;left:50%;transform:translate(-50%,-50%);z-index:10002;position:absolute!important}.tap-target-origin:not(.btn):not(.btn-large):not(.btn-small),.tap-target-origin:not(.btn):not(.btn-large):not(.btn-small):hover{background:0}@media only screen and (max-width:600px){.tap-target,.tap-target-wrapper{width:600px;height:600px}}.pulse{overflow:visible;position:relative}.pulse::before{content:'';display:block;position:absolute;width:100%;height:100%;top:0;left:0;background-color:inherit;border-radius:inherit;transition:opacity .3s,transform .3s;animation:pulse-animation 1s cubic-bezier(0.24,0,0.38,1) infinite;z-index:-1}@keyframes pulse-animation{0%{opacity:1;transform:scale(1)}50%{opacity:0;transform:scale(1.5)}100%{opacity:0;transform:scale(1.5)}}.datepicker-modal{max-width:325px;min-width:300px;max-height:none}.datepicker-container.modal-content{display:flex;flex-direction:column;padding:0}.datepicker-controls{display:flex;justify-content:space-between;width:280px;margin:0 auto}.datepicker-controls .selects-container{display:flex}.datepicker-controls .select-wrapper input{border-bottom:0;text-align:center;margin:0}.datepicker-controls .select-wrapper input:focus{border-bottom:0}.datepicker-controls .select-wrapper .caret{display:none}.datepicker-controls .select-year input{width:50px}.datepicker-controls .select-month input{width:70px}.month-prev,.month-next{margin-top:4px;cursor:pointer;background-color:transparent;border:0}.datepicker-date-display{flex:1 auto;background-color:#4d9999;color:#fff;padding:20px 22px;font-weight:500}.datepicker-date-display .year-text{display:block;font-size:1.5rem;line-height:25px;color:rgba(255,255,255,0.7)}.datepicker-date-display .date-text{display:block;font-size:2.8rem;line-height:47px;font-weight:500}.datepicker-calendar-container{flex:2.5 auto}.datepicker-table{width:280px;font-size:1rem;margin:0 auto}.datepicker-table thead{border-bottom:0}.datepicker-table th{padding:10px 5px;text-align:center}.datepicker-table tr{border:0}.datepicker-table abbr{text-decoration:none;color:#999}.datepicker-table td{border-radius:50%;padding:0}.datepicker-table td.is-today{color:#4d9999}.datepicker-table td.is-selected{background-color:#4d9999;color:#fff}.datepicker-table td.is-outside-current-month,.datepicker-table td.is-disabled{color:rgba(0,0,0,0.3);pointer-events:none}.datepicker-day-button{background-color:transparent;border:0;line-height:38px;display:block;width:100%;border-radius:50%;padding:0 5px;cursor:pointer;color:inherit}.datepicker-day-button:focus{background-color:rgba(83,147,147,0.25)}.datepicker-footer{width:280px;margin:0 auto;padding-bottom:5px;display:flex;justify-content:space-between}.datepicker-cancel,.datepicker-clear,.datepicker-today,.datepicker-done{color:#4d9999;padding:0 1rem}.datepicker-clear{color:#f44336}@media only screen and (min-width:601px){.datepicker-modal{max-width:625px}.datepicker-container.modal-content{flex-direction:row}.datepicker-date-display{flex:0 1 270px}.datepicker-controls,.datepicker-table,.datepicker-footer{width:320px}.datepicker-day-button{line-height:44px}}.timepicker-modal{max-width:325px;max-height:none}.timepicker-container.modal-content{display:flex;flex-direction:column;padding:0}.text-primary{color:white}.timepicker-digital-display{flex:1 auto;background-color:#4d9999;padding:10px;font-weight:300}.timepicker-text-container{font-size:4rem;font-weight:bold;text-align:center;color:rgba(255,255,255,0.6);font-weight:400;position:relative;user-select:none}.timepicker-span-hours,.timepicker-span-minutes,.timepicker-span-am-pm div{cursor:pointer}.timepicker-span-hours{margin-right:3px}.timepicker-span-minutes{margin-left:3px}.timepicker-display-am-pm{font-size:1.3rem;position:absolute;right:1rem;bottom:1rem;font-weight:400}.timepicker-analog-display{flex:2.5 auto}.timepicker-plate{background-color:#eee;border-radius:50%;width:270px;height:270px;overflow:visible;position:relative;margin:auto;margin-top:25px;margin-bottom:5px;user-select:none}.timepicker-canvas,.timepicker-dial{position:absolute;left:0;right:0;top:0;bottom:0}.timepicker-minutes{visibility:hidden}.timepicker-tick{border-radius:50%;color:rgba(0,0,0,0.87);line-height:40px;text-align:center;width:40px;height:40px;position:absolute;cursor:pointer;font-size:15px}.timepicker-tick.active,.timepicker-tick:hover{background-color:rgba(77,153,153,0.25)}.timepicker-dial{transition:transform 350ms,opacity 350ms}.timepicker-dial-out{opacity:0}.timepicker-dial-out.timepicker-hours{transform:scale(1.1,1.1)}.timepicker-dial-out.timepicker-minutes{transform:scale(0.8,0.8)}.timepicker-canvas{transition:opacity 175ms}.timepicker-canvas line{stroke:#4d9999;stroke-width:4;stroke-linecap:round}.timepicker-canvas-out{opacity:.25}.timepicker-canvas-bearing{stroke:none;fill:#4d9999}.timepicker-canvas-bg{stroke:none;fill:#4d9999}.timepicker-footer{margin:0 auto;padding:5px 1rem;display:flex;justify-content:space-between}.timepicker-clear{color:#f44336}.timepicker-close{color:#4d9999}.timepicker-clear,.timepicker-close{padding:0 20px}@media only screen and (min-width:601px){.timepicker-modal{max-width:600px}.timepicker-container.modal-content{flex-direction:row}.timepicker-text-container{top:32%}.timepicker-display-am-pm{position:relative;right:auto;bottom:auto;text-align:center;margin-top:1.2rem}}.material-icons{font-family:'Material Icons';font-weight:normal;font-style:normal;font-size:24px;line-height:1;letter-spacing:normal;text-transform:none;display:inline-block;white-space:nowrap;word-wrap:normal;direction:ltr;-webkit-font-feature-settings:'liga';-webkit-font-smoothing:antialiased}.btn.disabled,.disabled.btn-large,.disabled.btn-small{pointer-events:auto}.grid{grid-auto-rows:min-content;display:inline-grid;width:100%}.grid .ghead,.grid .gbody,.grid .gfoot,.grid .gr{display:contents}.grid .gd,.grid .gh{display:grid;grid-auto-columns:1fr;justify-content:center;align-content:center;text-align:center;padding:15px}.grid .gh{align-content:baseline}.grid .gh .card{position:sticky;top:15px;bottom:15px}.grid .ghead{color:#b2b2b2}.grid .ghead .gh{z-index:8;border-bottom:1px solid #b2b2b2;max-height:40px;line-height:1em}.grid .gbody .gr.spacer{grid-column:1 / -1}.grid .gbody .separator{grid-column:1 / -1;border-top:1px solid #b2b2b2}.grid .pagination{grid-column:1 / -1}.grid .gbody>.gr>.gd{min-height:70px}.grid.striped .gbody>.gr:nth-child(odd) .gd{background-color:#ffeee6}.grid.striped .gbody>.gr:nth-child(odd):hover .gd{background-color:#f7f2ee}.grid.striped .gbody>.gr:nth-child(even):hover .gd{background-color:#eef6f6}.grid .gbody>.gr .gd.action{grid-auto-flow:column;grid-gap:5px}.grid .gbody>.gr .gd.action.side .btn,.grid .gbody>.gr .gd.action.side .btn-large,.grid .gbody>.gr .gd.action.side .btn-small{width:min-content}.grid .gbody>.gr>.gr.extendable>.gd.action{padding-top:0;padding-bottom:0;transition:padding .3s,max-height .3s}.grid .gbody>.gr>.gr.extendable>.gd.action .btn,.grid .gbody>.gr>.gr.extendable>.gd.action .btn-large,.grid .gbody>.gr>.gr.extendable>.gd.action .btn-small{max-height:0;transition:max-height .3s}.grid .gbody>.gr:focus-within .gd{background-color:#5cd6d6!important}.grid .gbody>.gr:focus-within>.gr.extendable>.gd.action{padding-bottom:15px}.grid .gbody>.gr:focus-within>.gr.extendable>.gd.action .btn,.grid .gbody>.gr:focus-within>.gr.extendable>.gd.action .btn-large,.grid .gbody>.gr:focus-within>.gr.extendable>.gd.action .btn-small{max-height:36px}#tooltip{opacity:.75;transition:opacity .3s,margin-top .3s;position:fixed;pointer-events:none;transform:translate(-50%,-100%);max-width:120px;width:120px;background-color:black;color:#fff;text-align:center;padding:5px;border-radius:6px;margin-top:-7px;font-size:11px;line-height:13px;z-index:1005}#tooltip.v-enter,#tooltip.v-leave-to{margin-top:3px;opacity:0}#tooltip::after{content:" ";position:absolute;left:50%;bottom:-10px;margin-left:-5px;border-width:5px;border-style:solid;border-color:black transparent transparent transparent}#documentation{position:fixed;display:flex;align-items:center;justify-content:center;z-index:2000;pointer-events:none;opacity:1;transition:opacity .3s}#documentation.v-enter,#documentation.v-leave-to{opacity:0}#documentation.v-enter .overlay,#documentation.v-leave-to .overlay{width:0!important;height:0!important}#documentation .overlay{position:fixed;border-radius:10050px;border:10000px solid rgba(0,0,0,0.66);box-sizing:content-box;transform:translate(-50%,-50%);transition:all .3s}#documentation.first .overlay{transition:opacity .3s,height .3s,width .3s}#documentation .content{position:absolute;font-size:1.5em;color:white;max-height:75%;max-width:75%}#documentation .content h1{text-align:center}#documentation .content *{color:white}#documentation .content>*:first-child{margin-top:0}#documentation .content>*:last-child{margin-bottom:0}#documentation svg{position:fixed;top:0;left:0;width:100%;height:100%;stroke-width:5px;fill:none;stroke:white}#documentation .next,#documentation .close{user-select:none;pointer-events:all!important}#documentation .close{top:16px;right:6px;padding-top:0}.dropdown-button{position:relative;display:block;overflow:visible;margin:12px 5px;line-height:1}.dropdown-button:focus .dropdown-content,.dropdown-button:focus-within .dropdown-content{display:block;opacity:1}.dropdown-button .dropdown-content{overflow:visible;top:calc(100% + 12px);left:auto;right:0;min-width:250px;width:min-content}.dropdown-button .dropdown-content::before{content:"";position:absolute;top:-20px;right:10px;border-width:10px;border-style:solid;border-color:transparent transparent white transparent}.dropdown-button .dropdown-content .dropdown-title{margin:0;padding:8px;font-weight:bold;border-bottom:1px solid #dddfe2}.dropdown-button .dropdown-content .dropdown-title .option{position:absolute;right:8px;font-weight:normal;cursor:pointer}.dropdown-button .dropdown-content .dropdown-title .option:hover{text-decoration:underline}.dropdown-button .dropdown-content li:hover{background-color:initial}.tabs{display:grid;background:initial}.tabs .tab:not(.disabled) a{cursor:pointer;position:relative}.tabs .tab:not(.disabled) a::after{position:absolute;content:"";background:#b84000;width:0;height:2px;bottom:0;left:50%;transform:translateX(-50%);transition:width .3s}.tabs .tab:not(.disabled) a:hover::after,.tabs .tab:not(.disabled) a.active::after{width:100%}.tabs .tab.disabled a{pointer:default}.arrow{border:solid black;border-width:0 2px 2px 0;border-top-left-radius:10px;display:inline-block;padding:3px;transition:transform .3s}.arrow.to-right{transform:rotate(-45deg);-webkit-transform:rotate(-45deg)}.arrow.to-left{transform:rotate(135deg);-webkit-transform:rotate(135deg)}.arrow.to-up{transform:rotate(-135deg);-webkit-transform:rotate(-135deg)}.arrow.to-down{transform:rotate(45deg);-webkit-transform:rotate(45deg)}.modal-wrapper.v-enter-active,.modal-wrapper.v-leave-active{transition:all .3s}.modal-wrapper.v-enter .modal,.modal-wrapper.v-leave-to .modal{opacity:0;transform:scale(0.5)}.modal-wrapper.v-enter .modal+.modal-overlay,.modal-wrapper.v-leave-to .modal+.modal-overlay{opacity:0}.modal-wrapper .modal{opacity:1;transform:none;display:block;top:10%;z-index:1003;min-width:900px;max-height:80vh;transition:opacity .3s ease-in,transform .3s ease-out}.modal-wrapper .modal .dragger{cursor:move;position:absolute;height:24px;width:24px}.modal-wrapper .modal .dragger:before{content:'.';color:#aaa;position:absolute;left:4.5px;top:1.5px;font-size:20px;line-height:0;text-shadow:0 5px,0 10px,5px 0,5px 5px,5px 10px,10px 0,10px 5px,10px 10px}.modal-wrapper .modal.modal-fixed-footer{height:auto;padding-bottom:56px;overflow:hidden}.modal-wrapper .modal.modal-fixed-footer .modal-content{position:initial;max-height:calc(80vh - 56px)}.modal-wrapper .modal+.modal-overlay{top:0;z-index:1002;display:block;opacity:.5;transition:opacity .3s ease-in}.modal-wrapper#confirmDialog .modal{top:15%;z-index:1005;width:50vw;min-width:500px}.modal-wrapper#confirmDialog .modal+.modal-overlay{z-index:1004}.input-field:focus-within>label{color:#4d9999;transform:translateY(-14px) scale(0.8);transform-origin:0 0}.input-field .helper-text.flash{animation:blinker 1s linear infinite}@keyframes blinker{50%{opacity:0}}.chips{padding-top:7px}.chips:focus-within{border-bottom:1px solid #4d9999;box-shadow:0 1px 0 0 #4d9999}.chips:empty ~ label{font-size:inherit;transform:none}.chips .input{height:32px;vertical-align:middle}.chips .input[disabled="disabled"]{border:0}.chip{cursor:pointer;user-select:none;color:white;background-color:#b2b2b2}.chip.negative{background-color:#b84000}.chip.positive{background-color:#4d9999}.chip.valid{background-color:#26a96c}.chip .close{height:24px;width:24px;margin:4px -7px 4px 4px;line-height:24px!important;border-radius:20px;text-align:center;padding:0;transition:background .3s}.chip .close:hover{background:rgba(0,0,0,0.3)}.toast{transition:margin-top .3s,opacity .3s}.toast.v-enter{margin-top:58px;opacity:0!important}.toast.v-leave-to{margin-top:-48px;opacity:0!important}.materialize-textarea{line-height:normal;padding:.8rem 0 .8rem 0;min-height:3rem;border-bottom:1px solid #b2b2b2;border-radius:0;outline:0;width:100%;font-size:16px;transition:box-shadow .3s,border .3s}.materialize-textarea:focus{outline:0;border-bottom:1px solid #4d9999;box-shadow:0 1px 0 0 #4d9999}::-webkit-scrollbar{width:12px;height:12px;border-radius:3px}::-webkit-scrollbar-track{background-color:#cecece;border-left:1px solid #cdc7c2}::-webkit-scrollbar-thumb{background-color:#7e8182;border:3px solid #cecece;border-radius:6px;min-height:40px}::-webkit-scrollbar-thumb:hover{background-color:#565b5c}::-webkit-scrollbar-thumb:active{background-color:#1b6acb}h1{color:#b84000}h2{color:#b84000}h3{color:#000}h4{color:#b84000}h5{color:#000}td,th{border-radius:0}strong{font-weight:bold}textarea{display:block}.btn,.btn-large,.btn-small{text-overflow:ellipsis;white-space:nowrap}.btn.primary-color:hover,.primary-color.btn-large:hover,.primary-color.btn-small:hover{background-color:#b84000}.container{width:85%!important}img{overflow:hidden;max-width:100%;max-height:100%}.clickable:hover{cursor:pointer;text-decoration:underline}.input-field .materialize-textarea{min-width:50px;font-size:inherit}.input-field .materialize-textarea:not([contenteditable]),.input-field .materialize-textarea[contenteditable="false"]{border-color:transparent}.input-field .materialize-textarea[placeholder]:empty::before{content:attr(placeholder);color:black;opacity:.25}[tabindex]:focus{outline:0;cursor:initial}[v-cloak]{display:none}[unselectable="on"]{-moz-user-select:-moz-none;-khtml-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}.search-box>input{margin-bottom:0}html body{min-width:900px;overflow-y:scroll;overflow-x:auto}html body #app{--primary-color-hover:var(--primary-color)10;--secondary-color-hover:var(--secondary-color)10;display:flex;min-height:100vh;flex-direction:column}html body #app #help{margin:0 10px;cursor:pointer}html body #app.help{cursor:help}html body #app.help :not(.documented){pointer-events:none}html body #app.help .documented{pointer-events:all}html body #app>nav{height:64px;position:sticky;min-width:900px;width:100%;top:0;left:0;z-index:10}html body #app #loading{position:fixed;margin:auto;top:64px;border-radius:none;z-index:5}html body #app .current-view-wrapper{display:flex;flex-direction:column;min-height:calc(100vh - 64px);padding-bottom:30px}html body #app .current-view-wrapper .current-view{display:flex;flex-direction:column;flex:1}html body #app .current-view-wrapper .current-view>.container{display:flex;flex-direction:column;flex:1;width:85%}html body #app .current-view-wrapper .current-view>.container>#header{position:sticky;padding:0 17px;top:64px;background:white;display:grid;grid-template-columns:1fr max-content;height:60px;align-items:center;z-index:4}html body #app .current-view-wrapper .current-view>.container>#header>div{display:grid;grid-column-gap:.25em;grid-template-columns:max-content 1fr max-content max-content;align-items:center;margin-right:15px;width:fit-content}html body #app .current-view-wrapper .current-view>.container>#header>div>h1{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin:0}html body #app .current-view-wrapper .current-view>.container>#header>div .author{color:#b84000;font-size:14px}html body #app .current-view-wrapper .current-view>.container>#header>div .details{margin:0;line-height:1em}html body #app .current-view-wrapper .current-view>.container>#header>div .details p{margin:0}html body #app .current-view-wrapper .current-view>.container>#header #backTo{position:absolute;top:18px;left:0}html body #app .current-view-wrapper .current-view>.container>.grid{flex:1}html body #app .current-view-wrapper .current-view>.container>.grid>.ghead .gh{position:sticky;top:124px;background:white;z-index:8}html body #app .current-view-wrapper .current-view>.container>.grid .gh>.card{top:179px}html body #app .page-footer .contributors a{display:flex;height:70px;align-items:center;justify-content:center;float:left;margin-right:50px}html body #app .page-footer .contributors a img{max-width:180px;max-height:100%}@media only print{html body #app>nav{display:none}html body #app .current-view{padding-top:0}html body #app .current-view>.container{width:100%}html body #app .current-view>.container>#header{top:0}}.switch label{position:relative}.card{display:block}@media only screen and (max-width:600px){.card{max-width:120px}}@media only screen and (min-width:601px){.card{max-width:160px}}@media only screen and (min-width:993px){.card{max-width:200px}}@media only screen and (min-width:1201px){.card{max-width:240px}}.card h2{max-height:43px;min-height:43px;overflow-y:auto}.card-image{width:100%;margin:auto}@media only screen and (max-width:600px){.card-image{width:120px;height:calc(120px / 3 * 2)}}@media only screen and (min-width:601px){.card-image{width:160px;height:calc(160px / 3 * 2)}}@media only screen and (min-width:993px){.card-image{width:200px;height:calc(200px / 3 * 2)}}@media only screen and (min-width:1201px){.card-image{width:240px;height:calc(240px / 3 * 2)}}.card-image img{height:auto!important;width:auto!important;margin:auto}.light-color{background:#eef6f6}.primary-color{background:#b84000;color:white}nav #logoContainer{z-index:1;float:left}nav #logoContainer img{vertical-align:middle;margin-bottom:5px}nav .menu a{position:relative}nav .menu a::after{position:absolute;content:"";background:white;width:0;height:2px;bottom:0;left:50%;transform:translateX(-50%);transition:width .3s}nav .menu a:hover::after,nav .menu a.active::after{width:100%}nav #userSettings .dropdown-content a.btn,nav #userSettings .dropdown-content a.btn-large,nav #userSettings .dropdown-content a.btn-small{background:#b2b2b2;color:white;width:calc(100% - 30px);margin:10px 15px}nav #userSettings .dropdown-content #changePasswd{margin:5px}nav #userSettings .dropdown-content #changePasswd .input-field input:not(:focus){border-bottom:1px solid}nav #notifications{position:relative}nav #notifications #notificationCount{position:absolute;cursor:pointer;top:15px;right:17px;border-radius:2px;padding:1px 3px;line-height:1.3;min-height:1.3em;min-width:0;font-size:10px;background-color:#f44336}nav #notifications .dropdown-button{width:40px;height:40px;padding:0;border-radius:100px}nav #notifications .dropdown-button i{cursor:pointer;text-align:center;line-height:40px;height:40px}nav #notifications .dropdown-button:focus,nav #notifications .dropdown-button:focus-within{background-color:rgba(0,0,0,0.1)}nav #notifications .dropdown-content{width:460px}nav #notifications .dropdown-content ul{height:calc(100vh - 112px);max-height:600px;overflow:auto}nav #notifications .dropdown-content ul li{position:relative;margin-right:25px;border-bottom:1px solid #dddfe2}nav #notifications .dropdown-content ul li.unread{background-color:#ffeee6}nav #notifications .dropdown-content ul li.unread .read-toggle{border-width:3px}nav #notifications .dropdown-content ul li.unread:hover{background-color:#f7f2ee}nav #notifications .dropdown-content ul li:hover{background-color:#eef6f6}nav #notifications .dropdown-content ul li:hover .read-toggle{opacity:1}nav #notifications .dropdown-content ul li a{padding:5px 16px;font-size:14px}nav #notifications .dropdown-content ul li a .arg{font-weight:bold}nav #notifications .dropdown-content ul li a:hover{background-color:initial}nav #notifications .dropdown-content ul li .read-toggle{position:absolute;opacity:0;right:10px;top:10px;width:10px;height:10px;padding:0;border:5px solid #b2b2b2;border-radius:10px;transition:opacity .3s}nav #notifications .dropdown-content ul li .read-toggle:hover{border-color:#808080}#login>div{justify-content:center}#login>div #loginForm{width:500px}#aafImport .progress{width:490px}#home #welcomeCallout{margin:0;color:#b84000}#home #welcomeCallout img{max-height:100px}@media only screen and (min-width:993px){#home #welcomeCallout img{margin-left:50px}}@media only screen and (max-width:600px){#home #welcomeCallout img{display:none}}#home #categoriesList .col{display:inline-block;float:none}#debates .opinion{height:16px;width:100%;background-color:#b2b2b2}#debates .opinion .for{height:100%;float:left;background-color:#4d9999}#debates .opinion .against{height:100%;float:right;background-color:#ba4100}#debate .comment-mark,.comment .comment-mark{display:inline}@media only print{#debate{height:auto!important}#debate .selection>div{max-height:none!important}#debate .selection::before,#debate .selection::after{content:none}#debate #documentContainer,#debate #commentsContainer{height:auto!important}}#debate .row{margin:0}#debate #options{position:sticky;padding:0 17px;top:124px;background:white;z-index:2;text-align:right}#debate #options .col{padding:0}#debate #options #sortCommentsBy,#debate #options #leftDisplay{position:absolute;bottom:0}#debate #options #sortCommentsBy input+i,#debate #options #leftDisplay input+i{font-style:normal}#debate #options #sortCommentsBy input:checked+i,#debate #options #leftDisplay input:checked+i{font-weight:bold}#debate #options .search-box{margin:0}#debate #options .search-box>input{margin-bottom:5px;margin-top:-5px}#debate #mainContainer{height:calc(100vh - 170px)}#debate #documentContainer,#debate #commentsContainer{width:50%;height:100%;float:left}#debate #documentContainer .scroll-area,#debate #commentsContainer .scroll-area{height:100%;overflow-y:scroll}#debate #commentsContainer.loading{position:relative;overflow-x:hidden}#debate #commentsContainer.loading::before,#debate #commentsContainer.loading::after{content:"";display:block;top:0;left:0;width:100%;height:100%;position:absolute}#debate #commentsContainer.loading::before{background:#e0e0e0;z-index:1}#debate #commentsContainer.loading::after{background:linear-gradient(90deg,transparent,rgba(255,255,255,0.3),transparent);transform:translateX(-100%);animation:loading 1.5s infinite;z-index:1}@keyframes loading{100%{transform:translateX(100%)}}#debate #documentContainer .scroll-area{direction:rtl}#debate #documentContainer .scroll-area>*{direction:ltr}#debate #documentContainer{z-index:1}#debate #documentContainer .scroll-area{padding-left:5px}#debate #documentContainer .scroll-area .wrap{display:flex;min-height:100%}#debate #documentContainer .scroll-area .wrap #documentDisplay{text-align:justify;font-size:13px;line-height:1.42;width:calc(100% - 60px);float:left}#debate #documentContainer .scroll-area .wrap #documentDisplay::selection,#debate #documentContainer .scroll-area .wrap #documentDisplay ::selection{background-color:#c6e4e3}#debate #documentContainer .scroll-area .wrap .bullets-container{float:left}#debate .selection_popup{position:absolute;cursor:pointer;background:#4d9999;color:white;border-radius:5px;padding:0 5px}#debate .selection_popup::before{content:"";position:absolute;border-width:8px 5px;border-style:solid}#debate .selection_popup.top{margin-top:-7px;margin-left:-15px;transform:translateY(-100%)}#debate .selection_popup.top::before{bottom:-16px;left:10px;border-color:#4d9999 transparent transparent transparent}#debate .selection_popup.bottom{margin-top:7px;margin-left:15px;transform:translateX(-100%)}#debate .selection_popup.bottom::before{top:-16px;right:10px;border-color:transparent transparent #4d9999 transparent}#debate .comment-container.moderated::after{content:"";position:absolute;top:0;left:0;height:100%;width:100%;background-color:#f44336;opacity:50%}#debate .answers-container{overflow:hidden}#debate .answers-container .answers{overflow-y:hidden;padding:0 5px 0 10px;transition:margin-top .3s}#debate .answers-container .answers.v-enter-active{transition:all 0s}#debate .comment-body .selection,#debate .spaghetti-data .selection{cursor:pointer}#debate .comment-body .selection:hover,#debate .comment-body .selection.active,#debate .spaghetti-data .selection:hover,#debate .spaghetti-data .selection.active{background:#ebecee;border-left-color:#808080;border-right-color:#808080}#debate .comment-body .selection:hover::before,#debate .comment-body .selection.active::before,#debate .spaghetti-data .selection:hover::before,#debate .spaghetti-data .selection.active::before{background-image:linear-gradient(#ebecee,transparent)}#debate .comment-body .selection:hover::after,#debate .comment-body .selection.active::after,#debate .spaghetti-data .selection:hover::after,#debate .spaghetti-data .selection.active::after{background-image:linear-gradient(transparent,#ebecee)}#debate .bullets-container{position:relative;width:50px;margin:0 5px}#debate .bullets-container .bullets-box{position:absolute;height:1em;width:100%;display:flex;align-items:center;justify-content:space-evenly}#debate .bullets-container .bullets-box .bullet{height:10px;width:10px}#debate .bullets-container .bullets-box .bullet::before{content:"";display:block;width:100%;height:100%;box-sizing:border-box;border-radius:10px}#debate .bullets-container .bullets-box .bullet.for::before{background:#4d9999}#debate .bullets-container .bullets-box .bullet.neutral::before{background:#b2b2b2}#debate .bullets-container .bullets-box .bullet.against::before{background:#ba4100}#debate .bullets-container .bullets-box .bullet:hover{cursor:pointer;z-index:2;width:8px;height:8px;margin:1px}#debate .bullets-container .bullets-box .bullets-drop-down{min-width:10px;padding:5px;border-radius:10px;box-sizing:content-box;line-height:10px;font-size:10px;text-align:center;z-index:1;font-weight:bold;color:white;transition:box-shadow .3s}#debate .bullets-container .bullets-box .bullets-drop-down.for{background:#4d9999}#debate .bullets-container .bullets-box .bullets-drop-down.against{background:#ba4100}#debate .bullets-container .bullets-box .bullets-drop-down.neutral{background:#b2b2b2}#debate .bullets-container .bullets-box .bullets-drop-down>.label{overflow:hidden;height:10px;transition:height .3s}#debate .bullets-container .bullets-box .bullets-drop-down>.body{transition:height .3s;overflow:hidden}#debate .bullets-container .bullets-box:not(:hover) .bullets-drop-down{box-shadow:4px 0 0 -1px #ddd,4px 0 1px -1px black,8px 0 0 -2px #bbb,8px 0 1px -2px black,12px 0 0 -3px #aaa,12px 0 1px -3px black}#debate .bullets-container .bullets-box:not(:hover) .bullets-drop-down>.body{height:0!important}#debate .bullets-container .bullets-box:hover .bullets-drop-down{z-index:9999;background:white!important;width:10px}#debate .bullets-container .bullets-box:hover .bullets-drop-down>.label{height:0}#debate .spaghetti-data{width:50%;float:left}#debate .spaghetti-data>.theme{display:grid;grid-template-columns:min-content 1fr;align-items:center}#debate .spaghetti-data>.theme .close{cursor:pointer;margin-bottom:10px}#debate svg.spaghettis{position:fixed;pointer-events:none;top:0;left:0;width:100%;height:100%;stroke-width:3px}#debate svg.spaghettis use{fill:none;stroke-width:6px;cursor:pointer;pointer-events:initial}#debate svg.spaghettis path{fill:none;stroke-width:inherit;pointer-events:initial}#debate svg.spaghettis path.trigger{stroke-width:20px}#debate svg.spaghettis>g{transition:opacity .3s}#debate svg.spaghettis.hover>g{opacity:.25}.comment{position:relative;font-size:13px;padding:3px 5px;margin-bottom:5px;box-sizing:border-box;border-left:3px solid;outline-width:3px;outline-offset:-3px}.comment .close{position:absolute;cursor:pointer;top:0;right:.5em}.comment.for{border-color:#4d9999;outline-color:#4d9999}.comment.for .comment-header *{color:#4d9999}.comment.neutral{border-color:#b2b2b2;outline-color:#b2b2b2}.comment.neutral .comment-header *{color:#b2b2b2}.comment.against{border-color:#ba4100;outline-color:#ba4100}.comment.against .comment-header *{color:#ba4100}.comment:focus-within{outline-style:solid;outline-width:3px}.comment .comment-header .username{display:inline-block;margin-right:10px;margin-top:0}.comment .comment-header .comment-count{cursor:pointer}.comment .comment-body .reformulation-wrapper,.comment .comment-body .argumentation-wrapper{display:grid;grid-template-columns:20px 1fr 60px}.comment .comment-body .reformulation-wrapper>i,.comment .comment-body .reformulation-wrapper>.tags>i,.comment .comment-body .argumentation-wrapper>i,.comment .comment-body .argumentation-wrapper>.tags>i{font-size:18px;margin-top:1px}.comment .comment-body .reformulation-wrapper .reformulation{white-space:pre-wrap}.comment .comment-body .reformulation-wrapper .tags{margin:0 20px}.comment .comment-body .reformulation-wrapper .tags i{cursor:pointer;text-shadow:0 0 1px black,0 0 1px black,0 0 1px black,0 0 1px black;color:white}.comment .comment-body .reformulation-wrapper .tags.disabled i{cursor:default;opacity:.5}.comment .comment-body .argumentation-wrapper .argumentation{white-space:pre-wrap}.comment .comment-body .argumentation-wrapper .argumentation::selection{background-color:#c6e4e3}.selection{overflow:hidden;position:relative;background:#dddfe2;border-left:3px solid #b2b2b2;border-right:3px solid #b2b2b2;border-radius:5px;transition:background .3s,border-color .3s;text-align:justify;font-size:13px;line-height:1.42;margin-bottom:10px}.selection>div>*:nth-last-child(1){margin-bottom:0}.selection::after,.selection::before{position:absolute;content:"";width:100%;height:10px;background-image:linear-gradient(transparent,#dddfe2);left:0;bottom:0}.selection::before{background-image:linear-gradient(#dddfe2,transparent);top:0}.selection>div{max-height:100px;overflow:auto;padding:5px}.selection>div *:nth-child(1){margin-top:0}.selection>div *:nth-last-child(1){margin-bottom:0}#commentModal .modal{resize:horizontal;min-width:500px}#commentModal #argumentation .materialize-textarea{min-height:6em}#commentModal .input-field:focus-within>#reformulationCheck svg .line{stroke:#4d9999;stroke-width:2px}#commentModal #reformulationCheck{display:flex;align-items:center;background:#fafafa;position:absolute;right:0;bottom:-19px}@keyframes spin{from{transform:rotate(0deg) translate(-3px) rotate(0deg)}to{transform:rotate(360deg) translate(-3px) rotate(-360deg)}}#commentModal #reformulationCheck.loading svg .pupil{animation:spin 2s linear infinite}#commentModal #reformulationCheck svg{fill:none;stroke:none}#commentModal #reformulationCheck svg .eye{stroke:#e5e5e5}#commentModal #reformulationCheck svg .eyelid{fill:#e5e5e5}#commentModal #reformulationCheck svg .pupil{fill:#666}#commentModal #reformulationCheck svg .line,#commentModal #reformulationCheck svg .mouth{stroke:#9e9e9e;transition:stroke .3s,stroke-width .3s}#commentModal #reformulationCheck svg+span{font-size:10px;border:1px solid #9e9e9e;margin-left:7px;margin-bottom:5px;padding:0 5px}#commentModal #reformulationCheck svg+span::before{content:"";position:absolute;top:10px;left:36px;border:solid #9e9e9e;border-width:0 1px 1px 0;padding:3px;background:#fafafa;transform:rotate(135deg)}#commentModal #opinion{padding-bottom:1rem}#commentModal #opinion input+span{padding-left:16px}#commentModal #opinion input+span::before{display:none}#commentModal #opinion input+span::after{display:none}#commentModal #opinion input:checked+span{box-shadow:0 3px 3px 0 rgba(0,0,0,0.14) inset,0 1px 7px 0 rgba(0,0,0,0.12) inset,0 3px 1px -1px rgba(0,0,0,0.2) inset}#commentModal #opinion input:not(:checked)+span:not(:hover){opacity:.5}#commentModal #opinion label>.against{background-color:#ba4100}#commentModal #opinion label>.neutral{background-color:#b2b2b2}#commentModal #opinion label>.for{background-color:#4d9999}#commentModal #hypostase .list{display:grid;width:100%;grid-template-columns:1fr 1fr 1fr 1fr 1fr;transition:height .3s;height:27px}#commentModal #hypostase .list.expert{height:219px}#commentModal #hypostase .list input[type="checkbox"]{display:none}#commentModal #hypostase .list>div>.btn,#commentModal #hypostase .list>div>.btn-large,#commentModal #hypostase .list>div>.btn-small{display:block;height:auto;line-height:initial;text-align:center;padding:0;cursor:pointer;margin:3px;padding:2px 5px!important;text-transform:none}#commentModal #hypostase .list>div>.btn:first-of-type,#commentModal #hypostase .list>div>.btn-large:first-of-type,#commentModal #hypostase .list>div>.btn-small:first-of-type{font-weight:bold}#commentModal #hypostase .list>div>.btn:not(:hover),#commentModal #hypostase .list>div>.btn-large:not(:hover),#commentModal #hypostase .list>div>.btn-small:not(:hover){opacity:.75}#commentModal #hypostase .list>div input:checked+.btn,#commentModal #hypostase .list>div input:checked+.btn-large,#commentModal #hypostase .list>div input:checked+.btn-small{background:#4d9999 linear-gradient(0deg,#4d9999 0,#4d9999 100%);box-shadow:0 3px 3px 0 rgba(0,0,0,0.14) inset,0 1px 7px 0 rgba(0,0,0,0.12) inset,0 3px 1px -1px rgba(0,0,0,0.2) inset;opacity:1}#documents .grid .gr.header .gh:hover{background-color:#eef6f6}#documents .grid .gr.header .card-action{line-height:0;padding-top:0;padding-bottom:0;border:0;transition:all .3s}#documents .grid .gr.header .card-action .btn,#documents .grid .gr.header .card-action .btn-large,#documents .grid .gr.header .card-action .btn-small{max-height:0}#documents .grid .gr.header:focus-within .gh{background-color:#5cd6d6!important}#documents .grid .gr.header:focus-within .card-action{padding-bottom:15px}#documents .grid .gr.header:focus-within .card-action .btn,#documents .grid .gr.header:focus-within .card-action .btn-large,#documents .grid .gr.header:focus-within .card-action .btn-small{max-height:36px}#document .input-field.inline{margin:0}#document .input-field{margin-bottom:1px}#document .ql-toolbar{position:sticky;top:124px;background:white;z-index:10;height:42px;overflow:hidden;transition:height .3s,padding .3s}#document .ql-container{margin-top:-1px;background:white;border-top:1px solid #ccc;transition:margin-top .3s}#document .ql-container .ql-editor{margin-bottom:10px;text-align:justify;transition:height .3s}#document #documentDisplay:not(.in-edition) .ql-toolbar{height:0;padding-top:0;padding-bottom:0;border-bottom-width:0}#createDebate .steps>.tabs{position:sticky;top:75px;z-index:9;display:block;margin-top:-50px;text-align:center;border:0;height:auto;background:white}#createDebate .steps>.tabs .tab{height:auto}#createDebate .steps>.tabs .tab a{text-transform:capitalize;line-height:1em}#createDebate .steps>.tabs .tab a::after{content:none}#createDebate .steps>.tabs .tab:not(.disabled) a.active img,#createDebate .steps>.tabs .tab:not(.disabled) a:hover img{border:1px solid #5cd6d6;border-radius:200px;margin:0 -1px}#createDebate .steps>.tabs .tab.disabled a img{filter:grayscale(100%)}#createDebate .steps .grid>.ghead .gh{position:sticky;top:202px;background:white;z-index:8}#createDebate .steps .grid .gh .card{top:242px}#createDebate .steps #contributors>div>.tabs{position:sticky;top:202px;background:white;z-index:8}#createDebate .steps #contributors .grid>.ghead .gh{position:sticky;top:250px;background:white;z-index:8}#createDebate .steps .collection-item>span{display:inline-block;max-width:calc(100% - 40px)}#createDebate .steps .collection-item .close{cursor:pointer}#createDebate #advancedOptions>li{cursor:pointer}#createDebate #advancedOptions>li .arrow{right:20px;position:absolute}#createDebate #advancedOptions #advancedOptionsBody{overflow:hidden}#createDebate #advancedOptions #advancedOptionsBody>ul{transition:margin-top .3s}#contributors .search-box{width:20em;margin:0}#sort-options{height:46px}#sort-options select{width:50%;float:left;margin:0}#sort-options .input-field{width:20em;max-width:50%;float:right;margin:0}#teams #header>div>select{text-overflow:ellipsis;color:#b84000}#teams .search-box{margin:0}#restitution .detail{background:white;margin-right:10px;margin-bottom:10px}#restitution .detail .document{padding:1px 10px;text-align:justify;font-size:13px;line-height:1.42}#restitution .D3_tree{width:100%;overflow:auto;height:calc(100vh - 172px);position:relative}#restitution .D3_tree .detail{background:white;position:sticky;height:min-content;width:50%;top:10px;left:calc(50% - 10px)}#restitution .D3_tree svg{position:absolute;pointer-events:all}#restitution .D3_tree svg .nodes text{font:12px sans-serif}#restitution .D3_tree svg .nodes .bullet{cursor:pointer}#restitution .D3_tree svg .nodes .bullet:hover{r:4px}#restitution .D3_tree svg .nodes .with-children text{cursor:pointer}#restitution .D3_tree svg .nodes .with-children .bullet:hover{r:3px}#restitution .D3_tree svg .links{fill:none;stroke:black;stroke-width:.5px;stroke-opacity:.5}#restitution .D3_pie{width:100%;height:calc(100vh - 172px);position:relative;display:grid;grid-template-rows:40px 1fr;grid-template-columns:50% 50%}#restitution .D3_pie svg{pointer-events:all}#restitution .D3_pie svg .detailsCircle{fill-opacity:.35;fill:none}#restitution .D3_pie svg .detailsText{text-anchor:middle}#restitution .D3_sunburst{width:100%;height:calc(100vh - 172px);overflow:auto;display:grid;grid-template-rows:40px 1fr;grid-template-columns:50% 50%}#restitution .D3_sunburst svg{position:sticky;top:40px;pointer-events:all}#restitution .D3_sunburst svg .slices path{stroke:none;cursor:pointer}#restitution .D3_pie .switch,#restitution .D3_sunburst .switch{padding:9px 0;align-self:center;background:white;position:sticky;top:0}#restitution .D3_pie .legend,#restitution .D3_sunburst .legend{height:100%;overflow:auto;display:flex;flex-flow:column wrap;align-content:flex-start}#restitution .D3_pie .legend>div,#restitution .D3_sunburst .legend>div{cursor:default;padding-right:10px;height:1.4em;overflow:hidden;transition:height .3s ease,opacity .3s ease}#restitution .D3_pie .legend>div.v-enter,#restitution .D3_pie .legend>div.v-leave-to,#restitution .D3_sunburst .legend>div.v-enter,#restitution .D3_sunburst .legend>div.v-leave-to{opacity:0;height:0}#restitution .D3_pie .legend>div:hover,#restitution .D3_pie .legend>div.active,#restitution .D3_sunburst .legend>div:hover,#restitution .D3_sunburst .legend>div.active{background:#eef6f6}#restitution .D3_pie .legend>div .square,#restitution .D3_sunburst .legend>div .square{display:inline-block;vertical-align:middle;width:1em;height:1em;border:1px solid black;margin-right:5px}#restitution #tagsRestitution{margin:0;height:calc(100vh - 194px)}#restitution #tagsRestitution>.col{height:100%;margin:0;padding:15px 0;overflow:auto}#restitution #tagsRestitution>.col .chip{opacity:.5;padding-left:5px;transition:opacity .3s}#restitution #tagsRestitution>.col .chip.active{opacity:1}#restitution #tagsRestitution>.col .chip [type="checkbox"]{display:none}#restitution #tagsRestitution>.col .chip [type="checkbox"]+span{font-size:inherit;padding-left:25px}#restitution #tagsRestitution>.col .chip [type="checkbox"]+span::before,#restitution #tagsRestitution>.col .chip [type="checkbox"]+span::after{content:'';position:absolute;left:0;top:0;margin:4px;width:16px;height:16px;z-index:0;-webkit-transition:.28s ease;transition:.28s ease;border-radius:50%}#restitution #tagsRestitution>.col .chip [type="checkbox"]:checked+span::before{border-color:white;transform:none}#restitution #tagsRestitution>.col .chip [type="checkbox"]:checked+span::after{transform:scale(0.5);background-color:white} \ No newline at end of file diff --git a/src/main/webapp/assets/css/quill.snow.css b/src/main/webapp/assets/css/quill.snow.css new file mode 100644 index 0000000..8bdc607 --- /dev/null +++ b/src/main/webapp/assets/css/quill.snow.css @@ -0,0 +1,945 @@ +/*! + * Quill Editor v1.3.6 + * https://quilljs.com/ + * Copyright (c) 2014, Jason Chen + * Copyright (c) 2013, salesforce.com + */ +.ql-container { + box-sizing: border-box; + font-family: Helvetica, Arial, sans-serif; + font-size: 13px; + height: 100%; + margin: 0px; + position: relative; +} +.ql-container.ql-disabled .ql-tooltip { + visibility: hidden; +} +.ql-container.ql-disabled .ql-editor ul[data-checked] > li::before { + pointer-events: none; +} +.ql-clipboard { + left: -100000px; + height: 1px; + overflow-y: hidden; + position: absolute; + top: 50%; +} +.ql-clipboard p { + margin: 0; + padding: 0; +} +.ql-editor { + box-sizing: border-box; + line-height: 1.42; + height: 100%; + outline: none; + overflow-y: auto; + padding: 12px 15px; + tab-size: 4; + -moz-tab-size: 4; + text-align: left; + white-space: pre-wrap; + word-wrap: break-word; +} +.ql-editor > * { + cursor: text; +} +.ql-editor p, +.ql-editor ol, +.ql-editor ul, +.ql-editor pre, +.ql-editor blockquote, +.ql-editor h1, +.ql-editor h2, +.ql-editor h3, +.ql-editor h4, +.ql-editor h5, +.ql-editor h6 { + margin: 0; + padding: 0; + counter-reset: list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9; +} +.ql-editor ol, +.ql-editor ul { + padding-left: 1.5em; +} +.ql-editor ol > li, +.ql-editor ul > li { + list-style-type: none; +} +.ql-editor ul > li::before { + content: '\2022'; +} +.ql-editor ul[data-checked=true], +.ql-editor ul[data-checked=false] { + pointer-events: none; +} +.ql-editor ul[data-checked=true] > li *, +.ql-editor ul[data-checked=false] > li * { + pointer-events: all; +} +.ql-editor ul[data-checked=true] > li::before, +.ql-editor ul[data-checked=false] > li::before { + color: #777; + cursor: pointer; + pointer-events: all; +} +.ql-editor ul[data-checked=true] > li::before { + content: '\2611'; +} +.ql-editor ul[data-checked=false] > li::before { + content: '\2610'; +} +.ql-editor li::before { + display: inline-block; + white-space: nowrap; + width: 1.2em; +} +.ql-editor li:not(.ql-direction-rtl)::before { + margin-left: -1.5em; + margin-right: 0.3em; + text-align: right; +} +.ql-editor li.ql-direction-rtl::before { + margin-left: 0.3em; + margin-right: -1.5em; +} +.ql-editor ol li:not(.ql-direction-rtl), +.ql-editor ul li:not(.ql-direction-rtl) { + padding-left: 1.5em; +} +.ql-editor ol li.ql-direction-rtl, +.ql-editor ul li.ql-direction-rtl { + padding-right: 1.5em; +} +.ql-editor ol li { + counter-reset: list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9; + counter-increment: list-0; +} +.ql-editor ol li:before { + content: counter(list-0, decimal) '. '; +} +.ql-editor ol li.ql-indent-1 { + counter-increment: list-1; +} +.ql-editor ol li.ql-indent-1:before { + content: counter(list-1, lower-alpha) '. '; +} +.ql-editor ol li.ql-indent-1 { + counter-reset: list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9; +} +.ql-editor ol li.ql-indent-2 { + counter-increment: list-2; +} +.ql-editor ol li.ql-indent-2:before { + content: counter(list-2, lower-roman) '. '; +} +.ql-editor ol li.ql-indent-2 { + counter-reset: list-3 list-4 list-5 list-6 list-7 list-8 list-9; +} +.ql-editor ol li.ql-indent-3 { + counter-increment: list-3; +} +.ql-editor ol li.ql-indent-3:before { + content: counter(list-3, decimal) '. '; +} +.ql-editor ol li.ql-indent-3 { + counter-reset: list-4 list-5 list-6 list-7 list-8 list-9; +} +.ql-editor ol li.ql-indent-4 { + counter-increment: list-4; +} +.ql-editor ol li.ql-indent-4:before { + content: counter(list-4, lower-alpha) '. '; +} +.ql-editor ol li.ql-indent-4 { + counter-reset: list-5 list-6 list-7 list-8 list-9; +} +.ql-editor ol li.ql-indent-5 { + counter-increment: list-5; +} +.ql-editor ol li.ql-indent-5:before { + content: counter(list-5, lower-roman) '. '; +} +.ql-editor ol li.ql-indent-5 { + counter-reset: list-6 list-7 list-8 list-9; +} +.ql-editor ol li.ql-indent-6 { + counter-increment: list-6; +} +.ql-editor ol li.ql-indent-6:before { + content: counter(list-6, decimal) '. '; +} +.ql-editor ol li.ql-indent-6 { + counter-reset: list-7 list-8 list-9; +} +.ql-editor ol li.ql-indent-7 { + counter-increment: list-7; +} +.ql-editor ol li.ql-indent-7:before { + content: counter(list-7, lower-alpha) '. '; +} +.ql-editor ol li.ql-indent-7 { + counter-reset: list-8 list-9; +} +.ql-editor ol li.ql-indent-8 { + counter-increment: list-8; +} +.ql-editor ol li.ql-indent-8:before { + content: counter(list-8, lower-roman) '. '; +} +.ql-editor ol li.ql-indent-8 { + counter-reset: list-9; +} +.ql-editor ol li.ql-indent-9 { + counter-increment: list-9; +} +.ql-editor ol li.ql-indent-9:before { + content: counter(list-9, decimal) '. '; +} +.ql-editor .ql-indent-1:not(.ql-direction-rtl) { + padding-left: 3em; +} +.ql-editor li.ql-indent-1:not(.ql-direction-rtl) { + padding-left: 4.5em; +} +.ql-editor .ql-indent-1.ql-direction-rtl.ql-align-right { + padding-right: 3em; +} +.ql-editor li.ql-indent-1.ql-direction-rtl.ql-align-right { + padding-right: 4.5em; +} +.ql-editor .ql-indent-2:not(.ql-direction-rtl) { + padding-left: 6em; +} +.ql-editor li.ql-indent-2:not(.ql-direction-rtl) { + padding-left: 7.5em; +} +.ql-editor .ql-indent-2.ql-direction-rtl.ql-align-right { + padding-right: 6em; +} +.ql-editor li.ql-indent-2.ql-direction-rtl.ql-align-right { + padding-right: 7.5em; +} +.ql-editor .ql-indent-3:not(.ql-direction-rtl) { + padding-left: 9em; +} +.ql-editor li.ql-indent-3:not(.ql-direction-rtl) { + padding-left: 10.5em; +} +.ql-editor .ql-indent-3.ql-direction-rtl.ql-align-right { + padding-right: 9em; +} +.ql-editor li.ql-indent-3.ql-direction-rtl.ql-align-right { + padding-right: 10.5em; +} +.ql-editor .ql-indent-4:not(.ql-direction-rtl) { + padding-left: 12em; +} +.ql-editor li.ql-indent-4:not(.ql-direction-rtl) { + padding-left: 13.5em; +} +.ql-editor .ql-indent-4.ql-direction-rtl.ql-align-right { + padding-right: 12em; +} +.ql-editor li.ql-indent-4.ql-direction-rtl.ql-align-right { + padding-right: 13.5em; +} +.ql-editor .ql-indent-5:not(.ql-direction-rtl) { + padding-left: 15em; +} +.ql-editor li.ql-indent-5:not(.ql-direction-rtl) { + padding-left: 16.5em; +} +.ql-editor .ql-indent-5.ql-direction-rtl.ql-align-right { + padding-right: 15em; +} +.ql-editor li.ql-indent-5.ql-direction-rtl.ql-align-right { + padding-right: 16.5em; +} +.ql-editor .ql-indent-6:not(.ql-direction-rtl) { + padding-left: 18em; +} +.ql-editor li.ql-indent-6:not(.ql-direction-rtl) { + padding-left: 19.5em; +} +.ql-editor .ql-indent-6.ql-direction-rtl.ql-align-right { + padding-right: 18em; +} +.ql-editor li.ql-indent-6.ql-direction-rtl.ql-align-right { + padding-right: 19.5em; +} +.ql-editor .ql-indent-7:not(.ql-direction-rtl) { + padding-left: 21em; +} +.ql-editor li.ql-indent-7:not(.ql-direction-rtl) { + padding-left: 22.5em; +} +.ql-editor .ql-indent-7.ql-direction-rtl.ql-align-right { + padding-right: 21em; +} +.ql-editor li.ql-indent-7.ql-direction-rtl.ql-align-right { + padding-right: 22.5em; +} +.ql-editor .ql-indent-8:not(.ql-direction-rtl) { + padding-left: 24em; +} +.ql-editor li.ql-indent-8:not(.ql-direction-rtl) { + padding-left: 25.5em; +} +.ql-editor .ql-indent-8.ql-direction-rtl.ql-align-right { + padding-right: 24em; +} +.ql-editor li.ql-indent-8.ql-direction-rtl.ql-align-right { + padding-right: 25.5em; +} +.ql-editor .ql-indent-9:not(.ql-direction-rtl) { + padding-left: 27em; +} +.ql-editor li.ql-indent-9:not(.ql-direction-rtl) { + padding-left: 28.5em; +} +.ql-editor .ql-indent-9.ql-direction-rtl.ql-align-right { + padding-right: 27em; +} +.ql-editor li.ql-indent-9.ql-direction-rtl.ql-align-right { + padding-right: 28.5em; +} +.ql-editor .ql-video { + display: block; + max-width: 100%; +} +.ql-editor .ql-video.ql-align-center { + margin: 0 auto; +} +.ql-editor .ql-video.ql-align-right { + margin: 0 0 0 auto; +} +.ql-editor .ql-bg-black { + background-color: #000; +} +.ql-editor .ql-bg-red { + background-color: #e60000; +} +.ql-editor .ql-bg-orange { + background-color: #f90; +} +.ql-editor .ql-bg-yellow { + background-color: #ff0; +} +.ql-editor .ql-bg-green { + background-color: #008a00; +} +.ql-editor .ql-bg-blue { + background-color: #06c; +} +.ql-editor .ql-bg-purple { + background-color: #93f; +} +.ql-editor .ql-color-white { + color: #fff; +} +.ql-editor .ql-color-red { + color: #e60000; +} +.ql-editor .ql-color-orange { + color: #f90; +} +.ql-editor .ql-color-yellow { + color: #ff0; +} +.ql-editor .ql-color-green { + color: #008a00; +} +.ql-editor .ql-color-blue { + color: #06c; +} +.ql-editor .ql-color-purple { + color: #93f; +} +.ql-editor .ql-font-serif { + font-family: Georgia, Times New Roman, serif; +} +.ql-editor .ql-font-monospace { + font-family: Monaco, Courier New, monospace; +} +.ql-editor .ql-size-small { + font-size: 0.75em; +} +.ql-editor .ql-size-large { + font-size: 1.5em; +} +.ql-editor .ql-size-huge { + font-size: 2.5em; +} +.ql-editor .ql-direction-rtl { + direction: rtl; + text-align: inherit; +} +.ql-editor .ql-align-center { + text-align: center; +} +.ql-editor .ql-align-justify { + text-align: justify; +} +.ql-editor .ql-align-right { + text-align: right; +} +.ql-editor.ql-blank::before { + color: rgba(0,0,0,0.6); + content: attr(data-placeholder); + font-style: italic; + left: 15px; + pointer-events: none; + position: absolute; + right: 15px; +} +.ql-snow.ql-toolbar:after, +.ql-snow .ql-toolbar:after { + clear: both; + content: ''; + display: table; +} +.ql-snow.ql-toolbar button, +.ql-snow .ql-toolbar button { + background: none; + border: none; + cursor: pointer; + display: inline-block; + float: left; + height: 24px; + padding: 3px 5px; + width: 28px; +} +.ql-snow.ql-toolbar button svg, +.ql-snow .ql-toolbar button svg { + float: left; + height: 100%; +} +.ql-snow.ql-toolbar button:active:hover, +.ql-snow .ql-toolbar button:active:hover { + outline: none; +} +.ql-snow.ql-toolbar input.ql-image[type=file], +.ql-snow .ql-toolbar input.ql-image[type=file] { + display: none; +} +.ql-snow.ql-toolbar button:hover, +.ql-snow .ql-toolbar button:hover, +.ql-snow.ql-toolbar button:focus, +.ql-snow .ql-toolbar button:focus, +.ql-snow.ql-toolbar button.ql-active, +.ql-snow .ql-toolbar button.ql-active, +.ql-snow.ql-toolbar .ql-picker-label:hover, +.ql-snow .ql-toolbar .ql-picker-label:hover, +.ql-snow.ql-toolbar .ql-picker-label.ql-active, +.ql-snow .ql-toolbar .ql-picker-label.ql-active, +.ql-snow.ql-toolbar .ql-picker-item:hover, +.ql-snow .ql-toolbar .ql-picker-item:hover, +.ql-snow.ql-toolbar .ql-picker-item.ql-selected, +.ql-snow .ql-toolbar .ql-picker-item.ql-selected { + color: #06c; +} +.ql-snow.ql-toolbar button:hover .ql-fill, +.ql-snow .ql-toolbar button:hover .ql-fill, +.ql-snow.ql-toolbar button:focus .ql-fill, +.ql-snow .ql-toolbar button:focus .ql-fill, +.ql-snow.ql-toolbar button.ql-active .ql-fill, +.ql-snow .ql-toolbar button.ql-active .ql-fill, +.ql-snow.ql-toolbar .ql-picker-label:hover .ql-fill, +.ql-snow .ql-toolbar .ql-picker-label:hover .ql-fill, +.ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-fill, +.ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-fill, +.ql-snow.ql-toolbar .ql-picker-item:hover .ql-fill, +.ql-snow .ql-toolbar .ql-picker-item:hover .ql-fill, +.ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-fill, +.ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-fill, +.ql-snow.ql-toolbar button:hover .ql-stroke.ql-fill, +.ql-snow .ql-toolbar button:hover .ql-stroke.ql-fill, +.ql-snow.ql-toolbar button:focus .ql-stroke.ql-fill, +.ql-snow .ql-toolbar button:focus .ql-stroke.ql-fill, +.ql-snow.ql-toolbar button.ql-active .ql-stroke.ql-fill, +.ql-snow .ql-toolbar button.ql-active .ql-stroke.ql-fill, +.ql-snow.ql-toolbar .ql-picker-label:hover .ql-stroke.ql-fill, +.ql-snow .ql-toolbar .ql-picker-label:hover .ql-stroke.ql-fill, +.ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-stroke.ql-fill, +.ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-stroke.ql-fill, +.ql-snow.ql-toolbar .ql-picker-item:hover .ql-stroke.ql-fill, +.ql-snow .ql-toolbar .ql-picker-item:hover .ql-stroke.ql-fill, +.ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-stroke.ql-fill, +.ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-stroke.ql-fill { + fill: #06c; +} +.ql-snow.ql-toolbar button:hover .ql-stroke, +.ql-snow .ql-toolbar button:hover .ql-stroke, +.ql-snow.ql-toolbar button:focus .ql-stroke, +.ql-snow .ql-toolbar button:focus .ql-stroke, +.ql-snow.ql-toolbar button.ql-active .ql-stroke, +.ql-snow .ql-toolbar button.ql-active .ql-stroke, +.ql-snow.ql-toolbar .ql-picker-label:hover .ql-stroke, +.ql-snow .ql-toolbar .ql-picker-label:hover .ql-stroke, +.ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-stroke, +.ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-stroke, +.ql-snow.ql-toolbar .ql-picker-item:hover .ql-stroke, +.ql-snow .ql-toolbar .ql-picker-item:hover .ql-stroke, +.ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-stroke, +.ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-stroke, +.ql-snow.ql-toolbar button:hover .ql-stroke-miter, +.ql-snow .ql-toolbar button:hover .ql-stroke-miter, +.ql-snow.ql-toolbar button:focus .ql-stroke-miter, +.ql-snow .ql-toolbar button:focus .ql-stroke-miter, +.ql-snow.ql-toolbar button.ql-active .ql-stroke-miter, +.ql-snow .ql-toolbar button.ql-active .ql-stroke-miter, +.ql-snow.ql-toolbar .ql-picker-label:hover .ql-stroke-miter, +.ql-snow .ql-toolbar .ql-picker-label:hover .ql-stroke-miter, +.ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-stroke-miter, +.ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-stroke-miter, +.ql-snow.ql-toolbar .ql-picker-item:hover .ql-stroke-miter, +.ql-snow .ql-toolbar .ql-picker-item:hover .ql-stroke-miter, +.ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-stroke-miter, +.ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-stroke-miter { + stroke: #06c; +} +@media (pointer: coarse) { + .ql-snow.ql-toolbar button:hover:not(.ql-active), + .ql-snow .ql-toolbar button:hover:not(.ql-active) { + color: #444; + } + .ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-fill, + .ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-fill, + .ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-stroke.ql-fill, + .ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-stroke.ql-fill { + fill: #444; + } + .ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-stroke, + .ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-stroke, + .ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-stroke-miter, + .ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-stroke-miter { + stroke: #444; + } +} +.ql-snow { + box-sizing: border-box; +} +.ql-snow * { + box-sizing: border-box; +} +.ql-snow .ql-hidden { + display: none; +} +.ql-snow .ql-out-bottom, +.ql-snow .ql-out-top { + visibility: hidden; +} +.ql-snow .ql-tooltip { + position: absolute; + transform: translateY(10px); +} +.ql-snow .ql-tooltip a { + cursor: pointer; + text-decoration: none; +} +.ql-snow .ql-tooltip.ql-flip { + transform: translateY(-10px); +} +.ql-snow .ql-formats { + display: inline-block; + vertical-align: middle; +} +.ql-snow .ql-formats:after { + clear: both; + content: ''; + display: table; +} +.ql-snow .ql-stroke { + fill: none; + stroke: #444; + stroke-linecap: round; + stroke-linejoin: round; + stroke-width: 2; +} +.ql-snow .ql-stroke-miter { + fill: none; + stroke: #444; + stroke-miterlimit: 10; + stroke-width: 2; +} +.ql-snow .ql-fill, +.ql-snow .ql-stroke.ql-fill { + fill: #444; +} +.ql-snow .ql-empty { + fill: none; +} +.ql-snow .ql-even { + fill-rule: evenodd; +} +.ql-snow .ql-thin, +.ql-snow .ql-stroke.ql-thin { + stroke-width: 1; +} +.ql-snow .ql-transparent { + opacity: 0.4; +} +.ql-snow .ql-direction svg:last-child { + display: none; +} +.ql-snow .ql-direction.ql-active svg:last-child { + display: inline; +} +.ql-snow .ql-direction.ql-active svg:first-child { + display: none; +} +.ql-snow .ql-editor h1 { + font-size: 2em; +} +.ql-snow .ql-editor h2 { + font-size: 1.5em; +} +.ql-snow .ql-editor h3 { + font-size: 1.17em; +} +.ql-snow .ql-editor h4 { + font-size: 1em; +} +.ql-snow .ql-editor h5 { + font-size: 0.83em; +} +.ql-snow .ql-editor h6 { + font-size: 0.67em; +} +.ql-snow .ql-editor a { + text-decoration: underline; +} +.ql-snow .ql-editor blockquote { + border-left: 4px solid #ccc; + margin-bottom: 5px; + margin-top: 5px; + padding-left: 16px; +} +.ql-snow .ql-editor code, +.ql-snow .ql-editor pre { + background-color: #f0f0f0; + border-radius: 3px; +} +.ql-snow .ql-editor pre { + white-space: pre-wrap; + margin-bottom: 5px; + margin-top: 5px; + padding: 5px 10px; +} +.ql-snow .ql-editor code { + font-size: 85%; + padding: 2px 4px; +} +.ql-snow .ql-editor pre.ql-syntax { + background-color: #23241f; + color: #f8f8f2; + overflow: visible; +} +.ql-snow .ql-editor img { + max-width: 100%; +} +.ql-snow .ql-picker { + color: #444; + display: inline-block; + float: left; + font-size: 14px; + font-weight: 500; + height: 24px; + position: relative; + vertical-align: middle; +} +.ql-snow .ql-picker-label { + cursor: pointer; + display: inline-block; + height: 100%; + padding-left: 8px; + padding-right: 2px; + position: relative; + width: 100%; +} +.ql-snow .ql-picker-label::before { + display: inline-block; + line-height: 22px; +} +.ql-snow .ql-picker-options { + background-color: #fff; + display: none; + min-width: 100%; + padding: 4px 8px; + position: absolute; + white-space: nowrap; +} +.ql-snow .ql-picker-options .ql-picker-item { + cursor: pointer; + display: block; + padding-bottom: 5px; + padding-top: 5px; +} +.ql-snow .ql-picker.ql-expanded .ql-picker-label { + color: #ccc; + z-index: 2; +} +.ql-snow .ql-picker.ql-expanded .ql-picker-label .ql-fill { + fill: #ccc; +} +.ql-snow .ql-picker.ql-expanded .ql-picker-label .ql-stroke { + stroke: #ccc; +} +.ql-snow .ql-picker.ql-expanded .ql-picker-options { + display: block; + margin-top: -1px; + top: 100%; + z-index: 1; +} +.ql-snow .ql-color-picker, +.ql-snow .ql-icon-picker { + width: 28px; +} +.ql-snow .ql-color-picker .ql-picker-label, +.ql-snow .ql-icon-picker .ql-picker-label { + padding: 2px 4px; +} +.ql-snow .ql-color-picker .ql-picker-label svg, +.ql-snow .ql-icon-picker .ql-picker-label svg { + right: 4px; +} +.ql-snow .ql-icon-picker .ql-picker-options { + padding: 4px 0px; +} +.ql-snow .ql-icon-picker .ql-picker-item { + height: 24px; + width: 24px; + padding: 2px 4px; +} +.ql-snow .ql-color-picker .ql-picker-options { + padding: 3px 5px; + width: 152px; +} +.ql-snow .ql-color-picker .ql-picker-item { + border: 1px solid transparent; + float: left; + height: 16px; + margin: 2px; + padding: 0px; + width: 16px; +} +.ql-snow .ql-picker:not(.ql-color-picker):not(.ql-icon-picker) svg { + position: absolute; + margin-top: -9px; + right: 0; + top: 50%; + width: 18px; +} +.ql-snow .ql-picker.ql-header .ql-picker-label[data-label]:not([data-label=''])::before, +.ql-snow .ql-picker.ql-font .ql-picker-label[data-label]:not([data-label=''])::before, +.ql-snow .ql-picker.ql-size .ql-picker-label[data-label]:not([data-label=''])::before, +.ql-snow .ql-picker.ql-header .ql-picker-item[data-label]:not([data-label=''])::before, +.ql-snow .ql-picker.ql-font .ql-picker-item[data-label]:not([data-label=''])::before, +.ql-snow .ql-picker.ql-size .ql-picker-item[data-label]:not([data-label=''])::before { + content: attr(data-label); +} +.ql-snow .ql-picker.ql-header { + width: 98px; +} +.ql-snow .ql-picker.ql-header .ql-picker-label::before, +.ql-snow .ql-picker.ql-header .ql-picker-item::before { + content: 'Normal'; +} +.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="1"]::before, +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="1"]::before { + content: 'Heading 1'; +} +.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="2"]::before, +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="2"]::before { + content: 'Heading 2'; +} +.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="3"]::before, +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="3"]::before { + content: 'Heading 3'; +} +.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="4"]::before, +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="4"]::before { + content: 'Heading 4'; +} +.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="5"]::before, +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="5"]::before { + content: 'Heading 5'; +} +.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="6"]::before, +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="6"]::before { + content: 'Heading 6'; +} +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="1"]::before { + font-size: 2em; +} +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="2"]::before { + font-size: 1.5em; +} +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="3"]::before { + font-size: 1.17em; +} +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="4"]::before { + font-size: 1em; +} +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="5"]::before { + font-size: 0.83em; +} +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="6"]::before { + font-size: 0.67em; +} +.ql-snow .ql-picker.ql-font { + width: 108px; +} +.ql-snow .ql-picker.ql-font .ql-picker-label::before, +.ql-snow .ql-picker.ql-font .ql-picker-item::before { + content: 'Sans Serif'; +} +.ql-snow .ql-picker.ql-font .ql-picker-label[data-value=serif]::before, +.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=serif]::before { + content: 'Serif'; +} +.ql-snow .ql-picker.ql-font .ql-picker-label[data-value=monospace]::before, +.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=monospace]::before { + content: 'Monospace'; +} +.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=serif]::before { + font-family: Georgia, Times New Roman, serif; +} +.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=monospace]::before { + font-family: Monaco, Courier New, monospace; +} +.ql-snow .ql-picker.ql-size { + width: 98px; +} +.ql-snow .ql-picker.ql-size .ql-picker-label::before, +.ql-snow .ql-picker.ql-size .ql-picker-item::before { + content: 'Normal'; +} +.ql-snow .ql-picker.ql-size .ql-picker-label[data-value=small]::before, +.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=small]::before { + content: 'Small'; +} +.ql-snow .ql-picker.ql-size .ql-picker-label[data-value=large]::before, +.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=large]::before { + content: 'Large'; +} +.ql-snow .ql-picker.ql-size .ql-picker-label[data-value=huge]::before, +.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=huge]::before { + content: 'Huge'; +} +.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=small]::before { + font-size: 10px; +} +.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=large]::before { + font-size: 18px; +} +.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=huge]::before { + font-size: 32px; +} +.ql-snow .ql-color-picker.ql-background .ql-picker-item { + background-color: #fff; +} +.ql-snow .ql-color-picker.ql-color .ql-picker-item { + background-color: #000; +} +.ql-toolbar.ql-snow { + border: 1px solid #ccc; + box-sizing: border-box; + font-family: 'Helvetica Neue', 'Helvetica', 'Arial', sans-serif; + padding: 8px; +} +.ql-toolbar.ql-snow .ql-formats { + margin-right: 15px; +} +.ql-toolbar.ql-snow .ql-picker-label { + border: 1px solid transparent; +} +.ql-toolbar.ql-snow .ql-picker-options { + border: 1px solid transparent; + box-shadow: rgba(0,0,0,0.2) 0 2px 8px; +} +.ql-toolbar.ql-snow .ql-picker.ql-expanded .ql-picker-label { + border-color: #ccc; +} +.ql-toolbar.ql-snow .ql-picker.ql-expanded .ql-picker-options { + border-color: #ccc; +} +.ql-toolbar.ql-snow .ql-color-picker .ql-picker-item.ql-selected, +.ql-toolbar.ql-snow .ql-color-picker .ql-picker-item:hover { + border-color: #000; +} +.ql-toolbar.ql-snow + .ql-container.ql-snow { + border-top: 0px; +} +.ql-snow .ql-tooltip { + background-color: #fff; + border: 1px solid #ccc; + box-shadow: 0px 0px 5px #ddd; + color: #444; + padding: 5px 12px; + white-space: nowrap; +} +.ql-snow .ql-tooltip::before { + content: "Visit URL:"; + line-height: 26px; + margin-right: 8px; +} +.ql-snow .ql-tooltip input[type=text] { + display: none; + border: 1px solid #ccc; + font-size: 13px; + height: 26px; + margin: 0px; + padding: 3px 5px; + width: 170px; +} +.ql-snow .ql-tooltip a.ql-preview { + display: inline-block; + max-width: 200px; + overflow-x: hidden; + text-overflow: ellipsis; + vertical-align: top; +} +.ql-snow .ql-tooltip a.ql-action::after { + border-right: 1px solid #ccc; + content: 'Edit'; + margin-left: 16px; + padding-right: 8px; +} +.ql-snow .ql-tooltip a.ql-remove::before { + content: 'Remove'; + margin-left: 8px; +} +.ql-snow .ql-tooltip a { + line-height: 26px; +} +.ql-snow .ql-tooltip.ql-editing a.ql-preview, +.ql-snow .ql-tooltip.ql-editing a.ql-remove { + display: none; +} +.ql-snow .ql-tooltip.ql-editing input[type=text] { + display: inline-block; +} +.ql-snow .ql-tooltip.ql-editing a.ql-action::after { + border-right: 0px; + content: 'Save'; + padding-right: 0px; +} +.ql-snow .ql-tooltip[data-mode=link]::before { + content: "Enter link:"; +} +.ql-snow .ql-tooltip[data-mode=formula]::before { + content: "Enter formula:"; +} +.ql-snow .ql-tooltip[data-mode=video]::before { + content: "Enter video:"; +} +.ql-snow a { + color: #06c; +} +.ql-container.ql-snow { + border: 1px solid #ccc; +} diff --git a/src/main/webapp/assets/css/quill.snow.min.css b/src/main/webapp/assets/css/quill.snow.min.css new file mode 100644 index 0000000..70c895e --- /dev/null +++ b/src/main/webapp/assets/css/quill.snow.min.css @@ -0,0 +1,6 @@ +/*! + * Quill Editor v1.3.6 + * https://quilljs.com/ + * Copyright (c) 2014, Jason Chen + * Copyright (c) 2013, salesforce.com + */.ql-container{box-sizing:border-box;font-family:Helvetica,Arial,sans-serif;font-size:13px;height:100%;margin:0;position:relative}.ql-container.ql-disabled .ql-tooltip{visibility:hidden}.ql-container.ql-disabled .ql-editor ul[data-checked]>li::before{pointer-events:none}.ql-clipboard{left:-100000px;height:1px;overflow-y:hidden;position:absolute;top:50%}.ql-clipboard p{margin:0;padding:0}.ql-editor{box-sizing:border-box;line-height:1.42;height:100%;outline:0;overflow-y:auto;padding:12px 15px;tab-size:4;-moz-tab-size:4;text-align:left;white-space:pre-wrap;word-wrap:break-word}.ql-editor>*{cursor:text}.ql-editor p,.ql-editor ol,.ql-editor ul,.ql-editor pre,.ql-editor blockquote,.ql-editor h1,.ql-editor h2,.ql-editor h3,.ql-editor h4,.ql-editor h5,.ql-editor h6{margin:0;padding:0;counter-reset:list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}.ql-editor ol,.ql-editor ul{padding-left:1.5em}.ql-editor ol>li,.ql-editor ul>li{list-style-type:none}.ql-editor ul>li::before{content:'\2022'}.ql-editor ul[data-checked=true],.ql-editor ul[data-checked=false]{pointer-events:none}.ql-editor ul[data-checked=true]>li *,.ql-editor ul[data-checked=false]>li *{pointer-events:all}.ql-editor ul[data-checked=true]>li::before,.ql-editor ul[data-checked=false]>li::before{color:#777;cursor:pointer;pointer-events:all}.ql-editor ul[data-checked=true]>li::before{content:'\2611'}.ql-editor ul[data-checked=false]>li::before{content:'\2610'}.ql-editor li::before{display:inline-block;white-space:nowrap;width:1.2em}.ql-editor li:not(.ql-direction-rtl)::before{margin-left:-1.5em;margin-right:.3em;text-align:right}.ql-editor li.ql-direction-rtl::before{margin-left:.3em;margin-right:-1.5em}.ql-editor ol li:not(.ql-direction-rtl),.ql-editor ul li:not(.ql-direction-rtl){padding-left:1.5em}.ql-editor ol li.ql-direction-rtl,.ql-editor ul li.ql-direction-rtl{padding-right:1.5em}.ql-editor ol li{counter-reset:list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9;counter-increment:list-0}.ql-editor ol li:before{content:counter(list-0,decimal) '. '}.ql-editor ol li.ql-indent-1{counter-increment:list-1}.ql-editor ol li.ql-indent-1:before{content:counter(list-1,lower-alpha) '. '}.ql-editor ol li.ql-indent-1{counter-reset:list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}.ql-editor ol li.ql-indent-2{counter-increment:list-2}.ql-editor ol li.ql-indent-2:before{content:counter(list-2,lower-roman) '. '}.ql-editor ol li.ql-indent-2{counter-reset:list-3 list-4 list-5 list-6 list-7 list-8 list-9}.ql-editor ol li.ql-indent-3{counter-increment:list-3}.ql-editor ol li.ql-indent-3:before{content:counter(list-3,decimal) '. '}.ql-editor ol li.ql-indent-3{counter-reset:list-4 list-5 list-6 list-7 list-8 list-9}.ql-editor ol li.ql-indent-4{counter-increment:list-4}.ql-editor ol li.ql-indent-4:before{content:counter(list-4,lower-alpha) '. '}.ql-editor ol li.ql-indent-4{counter-reset:list-5 list-6 list-7 list-8 list-9}.ql-editor ol li.ql-indent-5{counter-increment:list-5}.ql-editor ol li.ql-indent-5:before{content:counter(list-5,lower-roman) '. '}.ql-editor ol li.ql-indent-5{counter-reset:list-6 list-7 list-8 list-9}.ql-editor ol li.ql-indent-6{counter-increment:list-6}.ql-editor ol li.ql-indent-6:before{content:counter(list-6,decimal) '. '}.ql-editor ol li.ql-indent-6{counter-reset:list-7 list-8 list-9}.ql-editor ol li.ql-indent-7{counter-increment:list-7}.ql-editor ol li.ql-indent-7:before{content:counter(list-7,lower-alpha) '. '}.ql-editor ol li.ql-indent-7{counter-reset:list-8 list-9}.ql-editor ol li.ql-indent-8{counter-increment:list-8}.ql-editor ol li.ql-indent-8:before{content:counter(list-8,lower-roman) '. '}.ql-editor ol li.ql-indent-8{counter-reset:list-9}.ql-editor ol li.ql-indent-9{counter-increment:list-9}.ql-editor ol li.ql-indent-9:before{content:counter(list-9,decimal) '. '}.ql-editor .ql-indent-1:not(.ql-direction-rtl){padding-left:3em}.ql-editor li.ql-indent-1:not(.ql-direction-rtl){padding-left:4.5em}.ql-editor .ql-indent-1.ql-direction-rtl.ql-align-right{padding-right:3em}.ql-editor li.ql-indent-1.ql-direction-rtl.ql-align-right{padding-right:4.5em}.ql-editor .ql-indent-2:not(.ql-direction-rtl){padding-left:6em}.ql-editor li.ql-indent-2:not(.ql-direction-rtl){padding-left:7.5em}.ql-editor .ql-indent-2.ql-direction-rtl.ql-align-right{padding-right:6em}.ql-editor li.ql-indent-2.ql-direction-rtl.ql-align-right{padding-right:7.5em}.ql-editor .ql-indent-3:not(.ql-direction-rtl){padding-left:9em}.ql-editor li.ql-indent-3:not(.ql-direction-rtl){padding-left:10.5em}.ql-editor .ql-indent-3.ql-direction-rtl.ql-align-right{padding-right:9em}.ql-editor li.ql-indent-3.ql-direction-rtl.ql-align-right{padding-right:10.5em}.ql-editor .ql-indent-4:not(.ql-direction-rtl){padding-left:12em}.ql-editor li.ql-indent-4:not(.ql-direction-rtl){padding-left:13.5em}.ql-editor .ql-indent-4.ql-direction-rtl.ql-align-right{padding-right:12em}.ql-editor li.ql-indent-4.ql-direction-rtl.ql-align-right{padding-right:13.5em}.ql-editor .ql-indent-5:not(.ql-direction-rtl){padding-left:15em}.ql-editor li.ql-indent-5:not(.ql-direction-rtl){padding-left:16.5em}.ql-editor .ql-indent-5.ql-direction-rtl.ql-align-right{padding-right:15em}.ql-editor li.ql-indent-5.ql-direction-rtl.ql-align-right{padding-right:16.5em}.ql-editor .ql-indent-6:not(.ql-direction-rtl){padding-left:18em}.ql-editor li.ql-indent-6:not(.ql-direction-rtl){padding-left:19.5em}.ql-editor .ql-indent-6.ql-direction-rtl.ql-align-right{padding-right:18em}.ql-editor li.ql-indent-6.ql-direction-rtl.ql-align-right{padding-right:19.5em}.ql-editor .ql-indent-7:not(.ql-direction-rtl){padding-left:21em}.ql-editor li.ql-indent-7:not(.ql-direction-rtl){padding-left:22.5em}.ql-editor .ql-indent-7.ql-direction-rtl.ql-align-right{padding-right:21em}.ql-editor li.ql-indent-7.ql-direction-rtl.ql-align-right{padding-right:22.5em}.ql-editor .ql-indent-8:not(.ql-direction-rtl){padding-left:24em}.ql-editor li.ql-indent-8:not(.ql-direction-rtl){padding-left:25.5em}.ql-editor .ql-indent-8.ql-direction-rtl.ql-align-right{padding-right:24em}.ql-editor li.ql-indent-8.ql-direction-rtl.ql-align-right{padding-right:25.5em}.ql-editor .ql-indent-9:not(.ql-direction-rtl){padding-left:27em}.ql-editor li.ql-indent-9:not(.ql-direction-rtl){padding-left:28.5em}.ql-editor .ql-indent-9.ql-direction-rtl.ql-align-right{padding-right:27em}.ql-editor li.ql-indent-9.ql-direction-rtl.ql-align-right{padding-right:28.5em}.ql-editor .ql-video{display:block;max-width:100%}.ql-editor .ql-video.ql-align-center{margin:0 auto}.ql-editor .ql-video.ql-align-right{margin:0 0 0 auto}.ql-editor .ql-bg-black{background-color:#000}.ql-editor .ql-bg-red{background-color:#e60000}.ql-editor .ql-bg-orange{background-color:#f90}.ql-editor .ql-bg-yellow{background-color:#ff0}.ql-editor .ql-bg-green{background-color:#008a00}.ql-editor .ql-bg-blue{background-color:#06c}.ql-editor .ql-bg-purple{background-color:#93f}.ql-editor .ql-color-white{color:#fff}.ql-editor .ql-color-red{color:#e60000}.ql-editor .ql-color-orange{color:#f90}.ql-editor .ql-color-yellow{color:#ff0}.ql-editor .ql-color-green{color:#008a00}.ql-editor .ql-color-blue{color:#06c}.ql-editor .ql-color-purple{color:#93f}.ql-editor .ql-font-serif{font-family:Georgia,Times New Roman,serif}.ql-editor .ql-font-monospace{font-family:Monaco,Courier New,monospace}.ql-editor .ql-size-small{font-size:.75em}.ql-editor .ql-size-large{font-size:1.5em}.ql-editor .ql-size-huge{font-size:2.5em}.ql-editor .ql-direction-rtl{direction:rtl;text-align:inherit}.ql-editor .ql-align-center{text-align:center}.ql-editor .ql-align-justify{text-align:justify}.ql-editor .ql-align-right{text-align:right}.ql-editor.ql-blank::before{color:rgba(0,0,0,0.6);content:attr(data-placeholder);font-style:italic;left:15px;pointer-events:none;position:absolute;right:15px}.ql-snow.ql-toolbar:after,.ql-snow .ql-toolbar:after{clear:both;content:'';display:table}.ql-snow.ql-toolbar button,.ql-snow .ql-toolbar button{background:0;border:0;cursor:pointer;display:inline-block;float:left;height:24px;padding:3px 5px;width:28px}.ql-snow.ql-toolbar button svg,.ql-snow .ql-toolbar button svg{float:left;height:100%}.ql-snow.ql-toolbar button:active:hover,.ql-snow .ql-toolbar button:active:hover{outline:0}.ql-snow.ql-toolbar input.ql-image[type=file],.ql-snow .ql-toolbar input.ql-image[type=file]{display:none}.ql-snow.ql-toolbar button:hover,.ql-snow .ql-toolbar button:hover,.ql-snow.ql-toolbar button:focus,.ql-snow .ql-toolbar button:focus,.ql-snow.ql-toolbar button.ql-active,.ql-snow .ql-toolbar button.ql-active,.ql-snow.ql-toolbar .ql-picker-label:hover,.ql-snow .ql-toolbar .ql-picker-label:hover,.ql-snow.ql-toolbar .ql-picker-label.ql-active,.ql-snow .ql-toolbar .ql-picker-label.ql-active,.ql-snow.ql-toolbar .ql-picker-item:hover,.ql-snow .ql-toolbar .ql-picker-item:hover,.ql-snow.ql-toolbar .ql-picker-item.ql-selected,.ql-snow .ql-toolbar .ql-picker-item.ql-selected{color:#06c}.ql-snow.ql-toolbar button:hover .ql-fill,.ql-snow .ql-toolbar button:hover .ql-fill,.ql-snow.ql-toolbar button:focus .ql-fill,.ql-snow .ql-toolbar button:focus .ql-fill,.ql-snow.ql-toolbar button.ql-active .ql-fill,.ql-snow .ql-toolbar button.ql-active .ql-fill,.ql-snow.ql-toolbar .ql-picker-label:hover .ql-fill,.ql-snow .ql-toolbar .ql-picker-label:hover .ql-fill,.ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-fill,.ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-fill,.ql-snow.ql-toolbar .ql-picker-item:hover .ql-fill,.ql-snow .ql-toolbar .ql-picker-item:hover .ql-fill,.ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-fill,.ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-fill,.ql-snow.ql-toolbar button:hover .ql-stroke.ql-fill,.ql-snow .ql-toolbar button:hover .ql-stroke.ql-fill,.ql-snow.ql-toolbar button:focus .ql-stroke.ql-fill,.ql-snow .ql-toolbar button:focus .ql-stroke.ql-fill,.ql-snow.ql-toolbar button.ql-active .ql-stroke.ql-fill,.ql-snow .ql-toolbar button.ql-active .ql-stroke.ql-fill,.ql-snow.ql-toolbar .ql-picker-label:hover .ql-stroke.ql-fill,.ql-snow .ql-toolbar .ql-picker-label:hover .ql-stroke.ql-fill,.ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-stroke.ql-fill,.ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-stroke.ql-fill,.ql-snow.ql-toolbar .ql-picker-item:hover .ql-stroke.ql-fill,.ql-snow .ql-toolbar .ql-picker-item:hover .ql-stroke.ql-fill,.ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-stroke.ql-fill,.ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-stroke.ql-fill{fill:#06c}.ql-snow.ql-toolbar button:hover .ql-stroke,.ql-snow .ql-toolbar button:hover .ql-stroke,.ql-snow.ql-toolbar button:focus .ql-stroke,.ql-snow .ql-toolbar button:focus .ql-stroke,.ql-snow.ql-toolbar button.ql-active .ql-stroke,.ql-snow .ql-toolbar button.ql-active .ql-stroke,.ql-snow.ql-toolbar .ql-picker-label:hover .ql-stroke,.ql-snow .ql-toolbar .ql-picker-label:hover .ql-stroke,.ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-stroke,.ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-stroke,.ql-snow.ql-toolbar .ql-picker-item:hover .ql-stroke,.ql-snow .ql-toolbar .ql-picker-item:hover .ql-stroke,.ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-stroke,.ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-stroke,.ql-snow.ql-toolbar button:hover .ql-stroke-miter,.ql-snow .ql-toolbar button:hover .ql-stroke-miter,.ql-snow.ql-toolbar button:focus .ql-stroke-miter,.ql-snow .ql-toolbar button:focus .ql-stroke-miter,.ql-snow.ql-toolbar button.ql-active .ql-stroke-miter,.ql-snow .ql-toolbar button.ql-active .ql-stroke-miter,.ql-snow.ql-toolbar .ql-picker-label:hover .ql-stroke-miter,.ql-snow .ql-toolbar .ql-picker-label:hover .ql-stroke-miter,.ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-stroke-miter,.ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-stroke-miter,.ql-snow.ql-toolbar .ql-picker-item:hover .ql-stroke-miter,.ql-snow .ql-toolbar .ql-picker-item:hover .ql-stroke-miter,.ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-stroke-miter,.ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-stroke-miter{stroke:#06c}@media(pointer:coarse){.ql-snow.ql-toolbar button:hover:not(.ql-active),.ql-snow .ql-toolbar button:hover:not(.ql-active){color:#444}.ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-fill,.ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-fill,.ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-stroke.ql-fill,.ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-stroke.ql-fill{fill:#444}.ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-stroke,.ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-stroke,.ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-stroke-miter,.ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-stroke-miter{stroke:#444}}.ql-snow{box-sizing:border-box}.ql-snow *{box-sizing:border-box}.ql-snow .ql-hidden{display:none}.ql-snow .ql-out-bottom,.ql-snow .ql-out-top{visibility:hidden}.ql-snow .ql-tooltip{position:absolute;transform:translateY(10px)}.ql-snow .ql-tooltip a{cursor:pointer;text-decoration:none}.ql-snow .ql-tooltip.ql-flip{transform:translateY(-10px)}.ql-snow .ql-formats{display:inline-block;vertical-align:middle}.ql-snow .ql-formats:after{clear:both;content:'';display:table}.ql-snow .ql-stroke{fill:none;stroke:#444;stroke-linecap:round;stroke-linejoin:round;stroke-width:2}.ql-snow .ql-stroke-miter{fill:none;stroke:#444;stroke-miterlimit:10;stroke-width:2}.ql-snow .ql-fill,.ql-snow .ql-stroke.ql-fill{fill:#444}.ql-snow .ql-empty{fill:none}.ql-snow .ql-even{fill-rule:evenodd}.ql-snow .ql-thin,.ql-snow .ql-stroke.ql-thin{stroke-width:1}.ql-snow .ql-transparent{opacity:.4}.ql-snow .ql-direction svg:last-child{display:none}.ql-snow .ql-direction.ql-active svg:last-child{display:inline}.ql-snow .ql-direction.ql-active svg:first-child{display:none}.ql-snow .ql-editor h1{font-size:2em}.ql-snow .ql-editor h2{font-size:1.5em}.ql-snow .ql-editor h3{font-size:1.17em}.ql-snow .ql-editor h4{font-size:1em}.ql-snow .ql-editor h5{font-size:.83em}.ql-snow .ql-editor h6{font-size:.67em}.ql-snow .ql-editor a{text-decoration:underline}.ql-snow .ql-editor blockquote{border-left:4px solid #ccc;margin-bottom:5px;margin-top:5px;padding-left:16px}.ql-snow .ql-editor code,.ql-snow .ql-editor pre{background-color:#f0f0f0;border-radius:3px}.ql-snow .ql-editor pre{white-space:pre-wrap;margin-bottom:5px;margin-top:5px;padding:5px 10px}.ql-snow .ql-editor code{font-size:85%;padding:2px 4px}.ql-snow .ql-editor pre.ql-syntax{background-color:#23241f;color:#f8f8f2;overflow:visible}.ql-snow .ql-editor img{max-width:100%}.ql-snow .ql-picker{color:#444;display:inline-block;float:left;font-size:14px;font-weight:500;height:24px;position:relative;vertical-align:middle}.ql-snow .ql-picker-label{cursor:pointer;display:inline-block;height:100%;padding-left:8px;padding-right:2px;position:relative;width:100%}.ql-snow .ql-picker-label::before{display:inline-block;line-height:22px}.ql-snow .ql-picker-options{background-color:#fff;display:none;min-width:100%;padding:4px 8px;position:absolute;white-space:nowrap}.ql-snow .ql-picker-options .ql-picker-item{cursor:pointer;display:block;padding-bottom:5px;padding-top:5px}.ql-snow .ql-picker.ql-expanded .ql-picker-label{color:#ccc;z-index:2}.ql-snow .ql-picker.ql-expanded .ql-picker-label .ql-fill{fill:#ccc}.ql-snow .ql-picker.ql-expanded .ql-picker-label .ql-stroke{stroke:#ccc}.ql-snow .ql-picker.ql-expanded .ql-picker-options{display:block;margin-top:-1px;top:100%;z-index:1}.ql-snow .ql-color-picker,.ql-snow .ql-icon-picker{width:28px}.ql-snow .ql-color-picker .ql-picker-label,.ql-snow .ql-icon-picker .ql-picker-label{padding:2px 4px}.ql-snow .ql-color-picker .ql-picker-label svg,.ql-snow .ql-icon-picker .ql-picker-label svg{right:4px}.ql-snow .ql-icon-picker .ql-picker-options{padding:4px 0}.ql-snow .ql-icon-picker .ql-picker-item{height:24px;width:24px;padding:2px 4px}.ql-snow .ql-color-picker .ql-picker-options{padding:3px 5px;width:152px}.ql-snow .ql-color-picker .ql-picker-item{border:1px solid transparent;float:left;height:16px;margin:2px;padding:0;width:16px}.ql-snow .ql-picker:not(.ql-color-picker):not(.ql-icon-picker) svg{position:absolute;margin-top:-9px;right:0;top:50%;width:18px}.ql-snow .ql-picker.ql-header .ql-picker-label[data-label]:not([data-label=''])::before,.ql-snow .ql-picker.ql-font .ql-picker-label[data-label]:not([data-label=''])::before,.ql-snow .ql-picker.ql-size .ql-picker-label[data-label]:not([data-label=''])::before,.ql-snow .ql-picker.ql-header .ql-picker-item[data-label]:not([data-label=''])::before,.ql-snow .ql-picker.ql-font .ql-picker-item[data-label]:not([data-label=''])::before,.ql-snow .ql-picker.ql-size .ql-picker-item[data-label]:not([data-label=''])::before{content:attr(data-label)}.ql-snow .ql-picker.ql-header{width:98px}.ql-snow .ql-picker.ql-header .ql-picker-label::before,.ql-snow .ql-picker.ql-header .ql-picker-item::before{content:'Normal'}.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="1"]::before,.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="1"]::before{content:'Heading 1'}.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="2"]::before,.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="2"]::before{content:'Heading 2'}.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="3"]::before,.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="3"]::before{content:'Heading 3'}.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="4"]::before,.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="4"]::before{content:'Heading 4'}.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="5"]::before,.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="5"]::before{content:'Heading 5'}.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="6"]::before,.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="6"]::before{content:'Heading 6'}.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="1"]::before{font-size:2em}.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="2"]::before{font-size:1.5em}.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="3"]::before{font-size:1.17em}.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="4"]::before{font-size:1em}.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="5"]::before{font-size:.83em}.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="6"]::before{font-size:.67em}.ql-snow .ql-picker.ql-font{width:108px}.ql-snow .ql-picker.ql-font .ql-picker-label::before,.ql-snow .ql-picker.ql-font .ql-picker-item::before{content:'Sans Serif'}.ql-snow .ql-picker.ql-font .ql-picker-label[data-value=serif]::before,.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=serif]::before{content:'Serif'}.ql-snow .ql-picker.ql-font .ql-picker-label[data-value=monospace]::before,.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=monospace]::before{content:'Monospace'}.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=serif]::before{font-family:Georgia,Times New Roman,serif}.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=monospace]::before{font-family:Monaco,Courier New,monospace}.ql-snow .ql-picker.ql-size{width:98px}.ql-snow .ql-picker.ql-size .ql-picker-label::before,.ql-snow .ql-picker.ql-size .ql-picker-item::before{content:'Normal'}.ql-snow .ql-picker.ql-size .ql-picker-label[data-value=small]::before,.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=small]::before{content:'Small'}.ql-snow .ql-picker.ql-size .ql-picker-label[data-value=large]::before,.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=large]::before{content:'Large'}.ql-snow .ql-picker.ql-size .ql-picker-label[data-value=huge]::before,.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=huge]::before{content:'Huge'}.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=small]::before{font-size:10px}.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=large]::before{font-size:18px}.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=huge]::before{font-size:32px}.ql-snow .ql-color-picker.ql-background .ql-picker-item{background-color:#fff}.ql-snow .ql-color-picker.ql-color .ql-picker-item{background-color:#000}.ql-toolbar.ql-snow{border:1px solid #ccc;box-sizing:border-box;font-family:'Helvetica Neue','Helvetica','Arial',sans-serif;padding:8px}.ql-toolbar.ql-snow .ql-formats{margin-right:15px}.ql-toolbar.ql-snow .ql-picker-label{border:1px solid transparent}.ql-toolbar.ql-snow .ql-picker-options{border:1px solid transparent;box-shadow:rgba(0,0,0,0.2) 0 2px 8px}.ql-toolbar.ql-snow .ql-picker.ql-expanded .ql-picker-label{border-color:#ccc}.ql-toolbar.ql-snow .ql-picker.ql-expanded .ql-picker-options{border-color:#ccc}.ql-toolbar.ql-snow .ql-color-picker .ql-picker-item.ql-selected,.ql-toolbar.ql-snow .ql-color-picker .ql-picker-item:hover{border-color:#000}.ql-toolbar.ql-snow+.ql-container.ql-snow{border-top:0}.ql-snow .ql-tooltip{background-color:#fff;border:1px solid #ccc;box-shadow:0 0 5px #ddd;color:#444;padding:5px 12px;white-space:nowrap}.ql-snow .ql-tooltip::before{content:"Visit URL:";line-height:26px;margin-right:8px}.ql-snow .ql-tooltip input[type=text]{display:none;border:1px solid #ccc;font-size:13px;height:26px;margin:0;padding:3px 5px;width:170px}.ql-snow .ql-tooltip a.ql-preview{display:inline-block;max-width:200px;overflow-x:hidden;text-overflow:ellipsis;vertical-align:top}.ql-snow .ql-tooltip a.ql-action::after{border-right:1px solid #ccc;content:'Edit';margin-left:16px;padding-right:8px}.ql-snow .ql-tooltip a.ql-remove::before{content:'Remove';margin-left:8px}.ql-snow .ql-tooltip a{line-height:26px}.ql-snow .ql-tooltip.ql-editing a.ql-preview,.ql-snow .ql-tooltip.ql-editing a.ql-remove{display:none}.ql-snow .ql-tooltip.ql-editing input[type=text]{display:inline-block}.ql-snow .ql-tooltip.ql-editing a.ql-action::after{border-right:0;content:'Save';padding-right:0}.ql-snow .ql-tooltip[data-mode=link]::before{content:"Enter link:"}.ql-snow .ql-tooltip[data-mode=formula]::before{content:"Enter formula:"}.ql-snow .ql-tooltip[data-mode=video]::before{content:"Enter video:"}.ql-snow a{color:#06c}.ql-container.ql-snow{border:1px solid #ccc} \ No newline at end of file diff --git a/src/main/webapp/assets/font/material-icons.woff b/src/main/webapp/assets/font/material-icons.woff new file mode 100644 index 0000000000000000000000000000000000000000..db9f5540b25529ba6f63277b0ce504f4e179c92e GIT binary patch literal 81008 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ð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 literal 0 HcmV?d00001 diff --git a/src/main/webapp/assets/font/seravek-light-webfont.woff b/src/main/webapp/assets/font/seravek-light-webfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..f0b041dac4b4fdc35d1cec5fcadd5b3f67733e54 GIT binary patch literal 23724 zcmY&wDl9`nb=MywkDd`_QaUjwr$&XGO=yjwrx8%@BQwduh!aKwRfL$`m}2G zs;YLD6%he|0KSW6IRNFqI@jU<@&DTYe-RN;lm-AmO1@Rx|DZ9@{~{_REb^`Oe{Fpim(BR=Spk-P@NYc|&Q4gi4K^S5^S9rFOvn%2?A&hXn;j?2xKLl6<>qJAi-u=k#BsAK&*79{^&Z>tOYL zwZQ+AzrOz40st70z*X7nX*>J3cL=NovYtIS&}l~B8c-wOE7u0H>sC=1RhBr6 zM}|!o?b|lHs1|nxk+M>NvKJvKe>gM$S(^r}6O+jsD&ow*@@lX*6yY%HBOy>-UgoK; zAsgZdGiWyMmuX2%4w(*W#Iw_PY$OKVLtR;66o2QducH^GGq0;-sH2-XU^d>}O@WY` zO8={Xk&%Ic!M5&K9e@%t2?7@O3Jepq6e}kur-TGf?B>%*SN|Expn8Z=iIRa~9BPD7 z+W-#a&kxvffWQ;%-T%hb(J}JT!GaWlL~I7zXY_lafrav^hxZ4K82~f5`8Ch@ZVYQw zuER0tAnGg0FT^jwFT*d+FU_yrBSEO88<{r?7PLk4_2oaY197U+jR~$ak@GX>XYNlh zB}<^n1hnGB^Viwe&=?LKN@sdz~+TPXs64FVo{ z;gaK&<>u!Ap`gac$;%O@Lt3qRgO%9>YLzPWI;W3TI2<+$%YWtDWHk5@ zH{cM!eEXMwvah1nrN#`p=RyGc7b5ixI0Fx$P1)>X!)-wb_+B~}nIuPJOPx>5rxcDzVtO|qCs;pZ#2V@VPX%XZkrDO&Q0f*& z_oI$)pD>W=GYOn#fCFx8N(3xvPG9x<;?J4)A3<;L1b3X6^~`hk^BlkvLh!?MTS@;b ztclh!gjc_X9X$qyf|R0NI^Lo`pH0k1W@FV2u`})dOh_*y%zO&wmf&fh^Mng`wy2UZ zV?{NrDJiv|Bq%+BBMwRm4dc(NJ%4NKj&=O0CVZim`;=W_@!=83P-mM+Mrq)X9`(xl zp^@Tof3P2{k9-#Jy@(+Xwu?(}?gceK4#qBZ=djAweQ~8rTUz7wKC9vOICo)5ay$2D? zwJEnuh6^}bmztH#Qck>SO?D1}W#Pm0@$2`bPrZFg_`Y({R5F{ugA2N`xqam|oQ9OO zWAN0H&vn(P|JMP506@O`A_SM!g$@`G#e)Wl&aRH9c7jyysdlmvgE&}Sv7qsofSnJo z5y^;?J=n$kn9Dd>YA7QxR376bh(?seetBdO96=)6k=9I<3IOY|_$#$sm z6MxU%9!cV3ayq)+y1u@;SW>x}46Yg$n>rt~&h}iaP={{p9og(bjkib9dW9iLVf7}r z^1`&9uKbZf5t1{Awud<0f9p;kHNs0EzH^a56zuw-Vh&)G2pe>@$~oU9Vu*%b+1N;4 zK9p(4TDD?0mqoVuN@D(|D~B#h3J5*w6>1bUu#=flQ@<`=$s-=D)^lhW9t_d5ZJ@v+ zDOZh%t5ciCc_z}%P>}N5PpG)*L{s`G&C_b?l#9`eL-gqQiun96-oKp8UTib!_DKWj zHQx{6sJoyL)%{JweC-Yb*JG<9tc5@A`nY7vCy}<)PJfb7 z6FpP$FoyK0&}-uM@Yqn5!*$}OL1T}K5M9Xd%25K1b9jbuk5a^CQb3OhJR1U2NKv(g z1BKS}JXp3{`}4mch-^39FbJN8R*eJza7<~XIEd$KLUj^_H5>c&oUP+VVA6^CZUqv9 zEBSMA&)P+-j&ckdLrb)7#oTtMBFz$?`W+1FgLY=i>OJynQ1lD#U5V_2y4hIfl&9t2 z+w;v9^HJfaA&(awto=18(Me3qkCxB&_glKJ_+Ufg8*2SZ9Yeq(z*{ft=LfJA^jZPW z2IA0L$tlz(_Z2aAXKBbAsQpY;U#gg?u1>JZxBttL%Cv-3)O-Z_LH_-pQt?u0WC4ix zwtW<_=AKerwE(a0+1SP5J`WN*vI6*D$-HQv`Ev#M`SCD{xJqFsQItREUKH%o-5Y2~ zD_$}q4Nb!>@P)V~e<8z3&@$pt*)$W_QMo;o&8+3~uGO<7*){0m(`W^h5u5+cwC&^* zZM)?nXxiAaOPY~6X;XTT_d#hbLkfnnp;wfit4s!uiW_#7o{pvroiQbV!#vz zd@8SKy$Eut7U?uT({(>X`-myb$JjtCi9#3tVdp<%8lMcenl*0OkxPNPR4XIkNg~)?GL5$y&2@W&%Le<2kzED*#E$l%y`@$LbTABMa52t{B zPQYgM2emGIX_A9!o!6#fNR#>?ThR_VL5V$-h}xlL)~y8BZb1r;Ub> z(-076Vk5+wr9gC>-eOF{obF=Bd>u>zvD}Jd%EkoFUt%qUi5ms%pJlfN&4|{+nN42)%FoO7V0UfOqcOw z4Fv-;s3dzZh3Capwbd*?_clM?f%AknY>Av}=MIQpO&ccr=^1OzC$uNaB>S7#W2m4W zab~|c&pdg8B3Yhfk9%RlL+pvg_&^gk*7BYQ(mq_z_^Ua4?qKc?zIaN9ESSKIH}dr94j@2D~)Ze=4)%c$RZy z1yNh{c~WnE>VbMHE$$+N8o3(ose&rmD%Dr&;E?%1zakBI(LRpq_M+O^j}ZG~ybBvr z!9--75kFuudwJNds831f^mZ!OfPkvgFtyDTpp%S)&GS<591qM!?;9&d;X&$bw*IJw z3uqg)#BBWRL^{*ZSRx*mwI?5FZbsM18U!I92}%**b34fcM&;b^ju+YZ*|>;9%@52bccM-xGOD7JxO{3oWh#&|3Fm8wHabVNh*X~Jf3 z?1S>H(kfd-OwDZk#Bb~?h^E?VrJ-muo0aOpF=pABm_-O!B+RGe(()QtZ`=55lQ2)j z9m7NKG+vmc{hHAcU%`bcY3QMWYggG=!1R`10@%2)N3zAYLoCU-H%32;;n7!`nRAy3gA@ZaRah`L9{3<4nj)vdCJMhTOEXS%oO_Z!E$L`iDN|4&Hvm2X7e(Y@% z&t6~0Q z`;dqHbP&T8*TMxOn@)@swojW!zuBKti3+u@)ITFQ`kf1TJ+(V%8%oo^3A4P0`uD( z15sdAipDUhUji+FhoJWeRXq;fej18u+%G3dP7X#V_m^CgG1xfP3bZ}sIWcJf0}MZ8 zo!TEU5Izgr(a+{{aKWEAn=cu)0pg@>$9zK8d~k&b=t<*GytB<$P+yXpPId0dC@i+4|Usqg6HQDr3HZI9evn@4ko?=M#qj>GUsAIdSHKIB(1UMbA zr{C$Ty^N{{L~VfjW)Sg4;jznn4uhz5AO`@J@yH_sb45m7Z8F(b7Myc@oBI>J0gDRM3+lJ`5?;JR7A4`m_%2SYY{8NSMaSZa z8FR%}h`ygavfhwLs`-%bMzp+JADZS)E$Tw4? z6ybfHj<~ImOqNm_?qY}H2tJOPzx*5Nix#LfivMlByV(&n+imaRJe}`oS1EwiaAv1u zJ}V$Kto3vv@qpl8+wohWC&wV3Y6?pFiKeOjAjN0z1|VX{v+RQX!OE|l%H7YGfkaY< zt$N`ZN!^DC?=MdfV7Noh*nsvZ1H5q56PtGSadWwn zj(^&8?~5i_u1%lyCMx&LxZDt+%ayEX?t8+!WxcEzUD~@6BEZC5E`w?<}7iOPhib^yB-B{XN|M=_R=-Mt!i)g)$5pkM8C;HOkYeThlkbsHI(6Q zol*U9Jerumiw;V=39A0gCjszQjVT5FLkNv~F;WBFO@I#;kH{Az#m646-dKyGNO=u4 z3`vTx%w~#Ip7m3BO+VMl2YDQXhtYP@C1V#}^$3U$1%yK?o2#y@q&fmw3jA_)8_b6p z#AvK2Yc;=$;vD?FJ3=}%#a(ZHhbId4Lm0(J8XnrZlW$+rOd~S*lNl-J51W+;v z3_8vT{W^hQJCyRxC;AE4C%85NzGHXV60kPFO&v5qwhWe0hAi#fN2jY+@Zh%{ecb>v zoT}~^*xH`-at^GOj(~wO9silGhQV?8a8}|N^Gmk7^yhUvVq<+JN@I*=c=xngeaK0( zh>I4Vdse6-3W6!>dj$qjZ|!1-4j+%e<9ul!dP(24tD{O6vR}7kizd?Wi4f9kXLr9r zWL#uh{cob9%=ioWLc|j7;S5r|kUnG=+JK4K@ip9)gy32jA7_U~&H2c7@LD7|`9@2J zplL*~IT{(uic@Tqp)JaY1u1oQQXW=iN6~|T+0Dsd6*h}>yVPo>_vFe$FCBJJE|o z7=w}+j5@l>P@MaO#tE7qY<81amF(os*N71)F^|-)s;u(oAEZZ;9F)|G_&5x(nZge7 z$Vr`O!|Gv*@M#cLiMn7UN8-dslhi-fSdjM1slw1~bX2AGVh%_ul3$GCS|1BtE7I z%bdyxG&%lx6~yot#2CC&9(66i1TT!;;fmo>qOnG?rFo zGkRWhG|8?t89AiBdQJ1%-L@F>e7xqoPHLPcpSnw$pB_ZkZ?P0I|Vxsn-%34@JVn2&^28 z+PspzznC{;Cb1tS*bZ2<5{Nw4{EJPsH5mTpAwHYKX;TFj1oJ{wU09$EyiLIP8)d{I&xbt zW8IS~f;u=+&hOCXdGLBk+e7?`4Kp>E-%!i#IbCw*DI8rueqmrb{bAaXD(Nx6>y1EX z|0SIOY50S08zPUQ*)LF-l<6ua^k#ZIJ8E>*S?ojLBjldwQt+)-W%!N zq!~PkJ^sp+?dM)2xc0&$b*G4mLRIVO+Nb=K0W}ZC-YA(Brn}V;QzXZ$6fw`-`UF!? z;R3$N$!+)Ed$Hxv3y3A}(n7iEo1667+_~B?j5Qd&f!!UmR&{=rfd4pUqZ@i496+QCZONclg%Rgu+na4!Vtbl-{OgFu3@ zRf~Mm#T#QnwYjoiX0aZ;ORM5LNuFL7(yiV-0$))aiN8>>MAOI?rRAndk9;$|G^92y zIkn{k7K@KbJ0+J)OB(OsERM!nRsS$3gaHR1l>}g)DTqLl2&bcd$(eaFY)5C|AzGyC ztTa|UWVfa@7C*PBMBSLLrD0BJ1!?D-oRh^g^86c)+&0VQZGGhIY{w%7eyo)xck^Hh zFR`M$OT8K!nc*Do$S$Y(R%imf3y5(z`fbe<^+VWj=mszF*h63L|8`UfoUWhH36u6q< zvvMWH6;9_ExE^3-jU@$gG|7*BwqWtV@4G94Ps}1x)O_c$ z3-y#1VOxvg=ArU*sY^k4KOUc$4W`%)>;~b#1R68g9m$4y8pa@lEx7XIAK=xTMYd7% zArgsZcBqxY!axQ<>4_AI6nY^HLR$Plrv;X6m&j%Xc(xSV4E;D9yEq*EDvKHvpAkLW z7>ol9w=OM@>h2sa22C86if8_=MLA*bq9HPJqr{9@HACEIRgDnI zt*@zh5X@O+wT0tyo@iPtxnO)d72e>$mIU4-N>Ucgu7aFhOzTm~6sgzZE=3ojPOD1r zv)i`(<2@`tAIc{>GTwS!N1J^bt!vtRJx6; z@yzf1gj4#6E~{Ev>XLC{_Ha3V6zqS0*VXfKddx*g#l_gncb^UabO}bi^Fw9QILTrr ze(rqaHjOL-565R1F1SHdI zrUiB+%nV`OCLQmELPHN2DL@HA75mDFEzC%l&xCky?_PAavS+YK;kX+k{#GTpo=H$L zwQ)Z}v^#Pf)r*^7qYA_97%M>siBBS7gza*z@QXNEOx^&sO2kNL5hfx} z6$DO=-WLe!M6^m&)SN->NYuFra2K9Z2KdWc00%8U9NsvmVw3XCgsXPjl$kR+oUeP~ z_Pp}SQtjS1$-Oq)E--mjE#4r!Esh)8MCfrdpx#Q*J;sQu@jY8!H1oJfHQJ$_;Ct1P zV*ef`aM{D8^hA;y4X94W)5U9B#FOrkd{i9$02ySN=eN5*{L@kvgEAwde z?T=_bcwUGnXIopk9X_{H7B$**K86;BU3K)5(Y}cy7lu@-?$-RJ&?YGM{YP}g+(TRa zfJENb3k-u3`o_rh=P~N8_1|$GG|cst-Zx8KUh>Q9tIatrrlSc(MlP%t47S{n9pKFC zCO_0e3Inz76+d-bdjkfYyinK$qL}|_RoixE(&0lah&5vlVM+Xpa*3Bzz2Omwhj0X+ zh(zR{#|iVeNCQP#4!D7&vX)kOx9Hu9q?Fc$kmkqz<$XB69q8Q_k$q~At4Y|7#8XFY zG{wfDNX)x7)tMlD5H?_uFmas;--WV+AX~denKwB+A09=C<12a1!Nj56C)EzvN*hNv zUmB;~m6(Ar#90#&iNP8ghW(|N-dZW{spx4zz1=Cb9?tvoV(X0+lo_+|#1UqgvN1i9 z@svaX&ookwSa?U?JH)7zcbQ4*IYxfJ$?S`KSiSbqM_qc;U1Fo$>M+`$!#ljnDt(1D zl3?Z$n+t4NaNN%rbH<6mL7iSfh&3Z$peLfYhff7AX=>W^#RmfKZCK(@lPn%Q3^W_h z=BwA*kVnYLE64T&{l6%w6*$OkVP*%L`23^-j~2EZ=<8 zkQ4N>5Jp}lljlEzaFjjoo+YqhqHnUb=(~1G$%0-U+EuH{fS&f934=TU^sL@r;CGyS zgv;tk^;48ILH5-Z@osQ{U;(}uq~*ORR5<~v-d(T_ZQ!BnUZJExN9&9EN1l>)_Vh0G zJASV3C3UE|tnl=QkpEo24pF4RaEHM#kxg*dzV^{meMQJ^{2H>3eq(6{gTTOgY<6D; zA-Ns9o~nB;7D-SV09hDyus-V#xm35Y7P`tc;fC#Vo7VkRNN8PyF-a_yQzR9i6O~yk zxn|E;uygqgp32mpOhxYp7~Q06jBDEPW<$;1K-@z?*6XwGil5`b5|9o&oF+v+!+N~c z`E@;yV@?zhn9sJt`C$s-p9aKD8s$0ZKMDdyF7s_+GZFBwL_8z#?Wu%kt4do-Ik@Wp z{nF9o%BOIzugPB3?+z)o-{8ju~{P%?*^L2&*QkVi^0^kDm1EYHm zz`G@=j|M1!&t<_$5rk5Xo{;MJEi(ep5OvZcf&y=opMCcLTVPr>-`Z)H;xD!{zr6AM>{f=NOEGkMZq{+fvDu zWUoYnh0HV;adj);mn0$js|me2jNoaoJ-FM(zAG!tJ(9CV{&nBCwEL9YogmHDN^Q}< zr`dhm8@u8fn40{u{BhaPJ%>N-G=?Qh?bHETt8F3fMoSkF?EXO0@NcC~%WNu7*s9)a zMcN?&q74SmFh7BTlVtRJ0>zvJwt5)etPa5YOp2{*`(R&-8ci4@8gs3qdRqyw5h@`8 zFY)*syl5*5wzNEZ$rr_6+g-EWmG#~lTzmEsWVLef)8vwU7gRY<<+0ffo$Eu7AY(7! zn$zI5C3E#3NkQ^iN86z6hG|}rzCi94n+%bk13wp%41kzuM_Q4#-=|Xrx-;+C?IE`? zaBVy76yjWrxET?TKtFZ0Ti#<$>)Dt}OYLw1Tt+ z&#N%#F(whbeiiXY=UIe~YYvx!!XXgly6t<6Wie-yj(tzloK`EVG5dTnkzbDQjY7F1FZbDSQF$aTzAV8RAq5c{; z3^f{VI3=J{e~2=UaC7pK3ta<4=Nw!fGGM%cuEy9r_4moc#-#su?fu0F0gr|{@?Ym9 z*shD2>`C{Rsq`mHo@Z_IByy;AI|a2b+OnjJ)fNxKxqr`ig6?Xs>kH21oX_L8+{No- zWLr%S5j?o526p>hya%~hXb8M6chU$G1iYgr&QGVjGS^kAbJZrceP)BQ!MZbA{vQ{I zWTubdEQ0~WgBTA{@H@x3>HQM{`D?yGk$Mp90a~FG(w;mrwl?acbVLaTfK}~3N%bq9zRv9)Fi&EHaLL;@= zn52>UxN4;NGWZ`6o3nnr6IgDOV!r(TF#T+Bj7B=pJtPd0YLauhz1S6pMWeHu3kw~R z)b?rp)E%!+S7@b`pNRcHYW-VdIRu&Iz!Y&~>k;F-SBPCfa;uO{>`A1NAX9eyiO zvCP<`0e_*U>ROKPz-@lcP#nRX$kJ&vl$cILttb_Cl$E+AEB|xHCpjdkYINOF)?O=? zHM4OjA7fO-U^43bb3+8_gHH3y89cn-%3nA*eHezmWN&z2&rHa&;V7Oup}j{l+W z13~K}>}dOwm9FavTk{F%Qs2@fN=A=;Rd3}2WuOMtR z8eUo+cWbfvgX%|ZY)yMPRgh|k+et;cmui^&M3~Y<^EU%F(C52~+uYsF)Z00Xqcltv zgagN*bX0?)wO|P|`!wQ=Zo0)B8DUuBmCu~QCS1dAom8c<3g<`C`u);11e>mhix&hN zANM6i-s|_*Cf0MjWalBktM4zxy@n;$FDvT3;Wev_`c@`uvo{DEyTaYETH(HsQ1Kz!cp1yhj*^c zp-oeDNBM7%N%%P555R2Ja0}(02Jc4KA8_a|Ee(BsZ-{+NA zlE+o!j+lzilc~=V{NlBurSWftBKYNSotZgFMJ0C@QzmA}v&~3hGjjT+YGfWGPpqxE+F5S<$AeT3nYka2qZ(Moyx*~3&Z|g_j}uAgAMs{fyrSQC zkiAqshbVdWqk-AopB2+Yjv@gu$NG%Q)%}fC6YKJH`VvRKTlu+koWSY=y;QZ+P+rY) zuQ$)?R8r0+>nC*Eqr80aO=8jSKqQ)P*wrA>?_wt@*|F+F{02RKsg9G2o`$@rZm0?W zONm}e#=q-1)h&x2^jKd~L`a_gYDy<8cUkVGD!6z==PJtRtq(V<>@na%kTB#ta^bRu)Oe4DVar4?4 z;zrRVYZ96Z|76Hm26(xoB~1m@OlIu_OsyDAP2ze^7ACv#>_nsA0^>uKjscRqWrg|M zU8~`zuoHc1&rxl|3YfXQstdyXqiW;ZoS&FfeGzlx&zYadE>*R(tCcmTdwyVoYi_OS ze`ZJ=T1z0JX5_r476;OcFQZs2&0Nf14@U@ZS*uhAlD*x=Y(C=`q0uCvB`FW_07>;O z$S+YYe@^J)gnv1gK{@-+audUvM^?MU(E*=o>~K;Fx>bK{mZm~y3W^^_$;Gu0Cou1g zMYjS;KaR(yQgxTvaSN_F>H)5qGihM}$_yn*2LEtaxz>6yxw-6+7fQX)a`6wB_*dTf z@N~eTY=GV?3X+*RBf2t>`8Q~_a}-$Y6$Vr(iR0-WR7kW7LP>OdE7)oF!ri{)^!(X~ z(Lxo+2&*F;7cq1#kd@LHkWD76r$%5(|J58cTDeWv{Lel(t;Uc(|1OctE@lA;)}Eu@ zI_NR{6!pSdlM*Uu6`}woLO9?C#%D)GB ztPX5%7C~aWEN=U~meUNLhoDSV)BbGMkjV^Pr9X>T)gG!!TfQwOg45MtArA5Z!%?HI zF8y>~o0&$J%`CHI}rQ)>|L3%;23C0diJpJnTfi`ChS6~O(8+})3<*OAoomOa zYO;idJ*F}>LUD~IL1->y9c~!xR~c4%%l?tHwR`b5k!4Wl-zX3YkIuW1cy52`js*uJ zG*9Vj))*M1nQnmTWjyc-Arf6EHveKN<3DM6K?+y~k(b+=eBz;^^IuQx zk_Ah^nIUQLEf2LwpQsjaX*wNf4h`P~(5m1`Lo9iqkz434$Krh5gdYzd5kU1+F>q%# z_DIDfiZ@{%83WZvr|d~JN#VCC+J(+sHBOn3PB(u3Yn`RprJLk_l15zXv7aS;xpt-P zeJlNWTqcz5d?G1$Rk)+w;c|X)y}KDyMR$bUfxh=4*93droG!V)?KOp3k1bxU7N18q zWC1f)nL>meBTfnG1{?N=a}h_n*(9s)phpivh1H1D1eG6Q`A>uvyfACs3YTGsVtyU*ybL80_UavJRYW8PrRpd=&Q>wh%PfedwFL!hn8aL6r zpLJ%Y`!2U-Xs3m9j;a{L7Z@1f#eif)7j!!#p%Dzqqcp~>>F`(M7OT|*Md%puYEMaE z(Go*?Dbs$=fII~YPQ|9hV(Yxcn2l=*OGfnB?nKcz{1&wSJbe)77@w_$`BXRn3ad($p)|;U?(exTl?}I4LRvz1v`|lWO_@7M}jm#a_ z$@*}zypB`RMDb84BbJX?}C}O`&b+2d=(Bifi31X5pQN>p>Q z)QPz`i^;|M{Mm91M$4xHCXYuqom||9MmNNWX`nWVp8zb$d#K`-BRcgOSMfd{{<}AX z$<(jDXqBt3wVFoV3o_9X8;g^R%gi+uNHQs`!Coyv>oqhc1brAmp234ig2| z)vwKMPAv2!iJ*lf(^OBW)lI6uCwE3bD?l4DE^}TpGTB<_+0J(vt0I{L zsuKp%cx*B*D$4^WKJM(R3Z^<;XTxw!|GY`F){ z3*Qr}jP;9QZV zRWL@U;*aP(R+3O*aN4}Yc|H1OFE)|ES>X7z6dSDS0`as;KTQw?=^Ux}>m@(_2ry&J zn(-S8+=3s6C8LT@7W7&~Smz!ldQ3T}fN`$xDk?V9cm{^mXm zO|c6a?j1xG3gu|u%HS9Mi2+VOrub@o=1v}JWA&@`G_{TnnPd4U&RrlDdOZuA2rEIi zsbF8$TpAh0XCP^PAx1SlSM|l6<+b+3d~uPKtAu8q&Qulz41w$Za-aPbHn&9C8!s&E zFGWqTX9F8&vn*^YC8V+Cnj3t_HZd4kAx>38j_+Z6Oeq>ME8gJIg~LIaoPbCw&vZV# zihvCfIM8hk#lCWDqQOrL)G%^gj{U^F^k$Z?!|9zfvPeh{|&U^P}O)FH< zOne{6_d(cLVFI`#RPu9#Vvy{;ao>;FV0>X^tI{VL-D*AF(2N~}4-KUS!2p@RMotyl zR`X{wx21%iCn&{Bhg&b(A8mdpqVU(&KZDmc(W1DQid7E!M><4hE3;UheM!NNHh7rh zTvccf0@Zqddtr5}1jLGBqfti4`GaI?xY&wJtLMR|eP+a6$*_#KaI%ccLrwgla9kof zD(%z?&nUVwdNDKJV(rR(oJ?y|mL>2Wx*uP|*Q_%anOGsPJn_!1wo+bMM%o*itia;1 zky|NWj^iApyA_3}*^HT^Y|{2=U$?jFvKEF91tvS=dMRo02bCI|YTroNVm&{3mAeiZ zbe>1(hG;j6)|B?}r=}tepyuB!ag~mI(3o8;l}3%z*1N*ypV_gdap~;pH|2NArwb_Uq@%lH%WgF?QU@@qDsjEMdVS6{4of%9 zFI%_l9MAp}mGv4i^&CG6bnbp^umxjRzK0t0?3KdWu;3@}x3HM{Lqc0$r%a8Y3~QBC zH;sJ}8|(jvaEaliN8dSy<*f3Z|3g`|<}|UPuWKc@sh&p^cG+7pi>TpUvswnm)H6iK z?4;#paphk{NQU_pr!R}b&~$AY?7a+dmHMZQL<%^gDKhwDA%q1P^_lXY-za0Ih@m3J zo(qht962yEV#f!$;bB8GieE{tG|oErC&fn^WD)BqS*g6U8ru!McSOB3vpL#RCp|c3 zS00Yqb1&+V4>Li-2PbDTr-I+(cYD#W=hX;7ex5pD)YQRkiQ?R(I8MQtmj>(9`0FI& zxq)!BoN62(|01HYQS>n$BV63M11tb|0)N*m5YV6O@o4qSjq5Yy+<%fnJhXY;j>q}O zYwgNV&D@kUXf}VS$94dBCb*jxXi?u5#1?#=#$}ijTsSu@>WHy`+E-!SHk0 z=`<#K^D_Gy{9p7HL4=b5I->>^juwT}T05qk)Xi_pldC?GPZ*#6sg{M^|E9{-nkuy_ zs>oOJMwRc@99vI3t8ht)hnGs7ABPC0$egDi22wHencoF8QIZ+*39tlM{*W}*@1Py5rcGDyWHY)9~nGIV+gIxO(C^~}Y(A2Ktp%VBo7 z?v7I4*q&_o5n2$FJSYmNz^if_Z}w|I1#mpT(4{{r)X<}BfSw7@WrMyTm_4joF`J9B zsf&O!&E|ZTtM3+c;LslWC*McaV?^Qoed2dh`TqYV(7Nl8-q|gyrR@l-%~gwS!y5EB ztP;;=FAD#SxdSHZH@&7#Ezd{ltYbDXDYh)w*e?cxOK^!xxx>!wsw|z&`ttR-I9tZu z3AxzSm!7xgtd97fu|GoT?+4lmUE?Su*5pp%!PGx9&~7IHS@7+D-FCM3W0^EEtME7z zriZ|qV?-?&F&q;brAZw#AD`^ zR1+1)^>({>Y$8HcBNp(@ABAkv`;LC%#z+q&^};s#cPrSDR@~sj#TouaM+p@LDvh(3*RRPrNdmJ{{%tMbQ5UcZ#y+}DykpF`ZtY@R&yvr@tfbfFJiM z?xj*iPuqjoDPmLI2zaRbO?m{JF(AE^Qny4Tu2&9I8>19*!4?y?Wld=c95cepP})py za{Bp;dbO>dXtk_~?mShKC$G^-Xa#jD5n(l!GDTU9y&`NC+A3;JpW6zuynjz!BsSd9 z3c8-N{I{7vm@WdI$wk4WiRBfdgRl)LLz9cqkT6=#0VTZqd4qlS{z#cADpz%y5A@np>CF~k7h&Wui_6_ zBolscN*K1>_eqy-)KC^{^mWsXv=z!4^L6htLv2o}@Tg>kI30r*t_BLF$s)@jx3FjZ zMII_m#d~e7+=Ys3$t;_NXYoGWl4tK0oUnQwo|JqA&Vh#KUqIE?UO*fV9OQyy?i5Hd@{!BAHyMSUY)B+AFMj_M%uLb5z6EUpDsU>!B7+o$ zy#zaUH^`b5quy5D5rMTQu6otv7m_%jC$e&QGQ6t_VQQ3spoLqPmm*KE<>il!brzIxbdQ*_LsCcNK=5|n3j2eJ6= zHAinFnyA(*2VOc{IM-f49lzHLG4qR{_l2q*FQRpXix0gDjs9VCL;oQAFf6MeUAH>l zg9Q9GR1tc;mX!v%74E^kW>f zLECu~L#lK?r~}8q5v1V`yNiq3Pdp@E`qu1E%0!;2l>_+Q`;1ghjsB!w9-XR+_(*V` zHX4DjAx+Zx@J&U|r1_syz*#JtCc-<-8VaMpV?)~Sr}YBc^0^_4(8}~tba@^|YveZe zqlOY`KvhJdmAzsX3-Dt!FDy@ob?y)fo=VGxnj9U<;x|quI=x7>lg-qR&XnjDnksLp z*WAIT&KPy3F-TpLt(3}(Z2S!s4Z-Dxz!IQ)aSf2<8i-C(1nB0$$r3Aus2%QBOQUT~*f%&Ko zao%vVvGY3@C2GdpMvmDxR~$cf62 z&Gn8Ac|^=SYbi>|is@hu8`FY5flEY+kQhN=pJBfMRB#b=*vYaSqWOt%jG`{E1XvZT z_;A(L%{xiA`pGHwOmG4}`?P!{K;9HOiQP=3iAcoV$U4Ahv}OkMHYusR61cW ztN0L*MuKwvVZg#qCOi0~0My*mO80i`u!_GFqzk9s?_Jll>=do(CR3z-Xd^hf1lWi=_qP zV*T%iI0*l-i#|erx6K1XMYsuX$Hh#(z7Gt9Y;5P(Mo!;|H+r70+mMNObA+z@`>n;! zn{Lyb!y=&e0`i$Yr>`4=7yES?=YnMPCHN036Qt2qc;MMtmJ)pvOF5r_*Bx&7!K{`^ z3_acC5Zq}c4o6*^)iF&4PAhxg&SPzFr8!QXe7Un}SS5gR)6%%!YCZ7lXb0qG9ReRK zqS3ZJ*O4bUStMjbepQsT=jH?dJJwPJ-grPY~evBuCW%nAZaf&V~gYR7%*cCO5&`)CpC0YG}uLVoK0pDwDF!_L8hoHtW=q;rZDwJ+XVSr*7r!6?r2f zKP>p*tp;D_psj4RaoNT)6Q0-=2CPe?YIQ%>G7eWmfOv-i3wE-X>$e?19lq z;kA1sOUtHCC>~OspY8R9gMF(D^5X;ZhU#nsbNZI&Or3q=WNQ%j3+=Pk9jATPy|@+M ztJAu)$4=|sT{^9kCcCegUDAD|46g#o!7Pi^!B=Re2dfZEoJzYicF6KzJ(cdd}6P3d{K=TaySLhN;g9<=_FvB zlbct7o5YEw2>&wXIXF2fWZ*sR6zC55<)3W-Wb@NcFV<+#9s0sQ5bMAHy{+&E8X?;8 zUkvyU2Alea>G%%^{QW3C%VJ8Up{2Rhk4ANcA&n}d8C6CjRmM}Q3<0VPaVVqGse-2V zkTj}{qEzvhRt#oTQOe3u3Xi6Jz3|X#lDuV`NS(Bt>Q(@9Gy);|g zh%Io;77vxs;&$QsqX}vXZ@OXRjiT4+GG~}=R-FfI+3CHe4(vB?e2LX1nH_q!SbV+l z1!8B_y0IXIYYR2f8@P z-t1lPE|LyM50{rPs>Xo7{h?mrK6WbU0zFe!sl=lvic5Q!P>cS1iNBQDRMMVrxvnsr zFzeu~SqE(~mVCLcSQLgnSX=wxoxf(87%Cfd7lprYC0vvn$erR61sK^XiYYmIOovmF zVhGU$hDHBqQs`TNgcWeG?I23Tkexbl@k5U@;q&KFR?R5@I_JgZzEYC&7l!(dJ?WaE#2NR=YiHdvA)id5LUDn2dc^mPFk%${`fq35*YR_BtD$uDtO}pFPj1_N`|Q1Reuz4T&JUrvAa`nhNRUf) z+u}g=>_{@FQ!WU*L~YCt&(v~3ejDb3%(@J>Cp)K*&4PAgfp2CZR_sZ1=!i4H86_KoiIT%R*K{}SWABMK_N z*U%M5EVS`69R2$C$@Yk&pW>LO;fVgCg`7tVI>HPIoQ7D%@Lyyv~{Tk<8T;YQ>u^&IE@MVV3<;lNLXTHbhgj5vDj%( zFczh8v}EhMctGf(!{d5}eBI1y@Ws+_VL_ z9Pgyn-SSu80wB$BKUQz2<=;qJ{>|Kxe^ZE#O$%{RCd0@^^(Whan|?5(iQVw;f7bw| zIk@*RI6-@IaGJu1w8<#gxQDGdSy631N^aM-9Bo(u&eHI*Bq=_)%UG07!%9-C^Intl znl_zpixH~!x0sj1c@(R%$1x1VFuqS$8BhK-1z$twTY{v(wI!kamU!HXr1% zWV0NC{i`#9{>d`4Hk<&~8FQ&I3bNJNY%pffnbtN5HnUb->MIEuLZEf4y{RxJPkY#@ zHXb4jCa8z?^Z)CO6OUBA@j>;;hhFl3kVsZOx$(vMzkhtij}}!u^xVENb>pL+!Oz_M z?2F`sKmPZeFCO^8_{ItO3-cCi8DBp`{mCDGu6}sz#;wQZy!hMxx2?N(Xrf~9tBi+) z*TDC2an_iGa@&^hIDlhC28-RQ&n>(wq{icYB&uGWGC|)jiKE5vF(O-T&)wQ+?VK++U(H?GbL?*IA#Y zU=Q{Hdr^0=7k7fa;9rFu1z3;Z2bhlhE)4$u_jDW4VMy}C*GTAWIAdA%_P%5r(IGA3M#d|ZlfdoE9+ zfdcfs@QgKEl!jljX`Ou*3jtb8-b{O^WL~kC)k)_|Cx~4Vb9+R257llNF&e19bl>vEQB5Pq;N=rbHjf!kk`q_LVr-tg^1urdCcirFXUpdU z^(Va?`{|h1m(Pb4xZxx}|M?~SoMFon>aZc79Y4H`<?t~f?_g$vcyaZNWHxIIiSM33PRVTs_gsLxfa`;`ew`uD z?TD165NY-Z7=6sKbU~>(WHlMJ6k!A_2k7Co0gOgC^xw@PJqVsINUlpo z64S&@HwZs-txv+{^1ymwZCsbhJgLDy*G%R?_aSXMj~7^?V?vL(MpNk8{4_d$HHW)7 zZGKwX=roypzv*c@YfsbDq#mcIHLZWGo9StWiEYRBb~8Q=c!1FY`{-OiiDm@{>15Dls2z=eVKB&I4}3h)d@yIYq!gOMHZkmYR8Z)d=z zIhx4ur%n)LCkf$n9jBXVQk=k%;IjO96rUNV&XUYL?U({uV(sgwV-4u>z#b<%jHM)4 zFl+X4l5yn8-L#ywvh8iYrY&%)?uhzd$ID2RxF3J;!N=7v_)JnnxU(y>w9?kBm1p^9 z+Wu30)i2KXYj&4@v+x(Lh^yfGbBDM@fMe$+W5(CZ3<&Hx2AfN+iYBA30OA|PkVKr~ zTMUY;nB@&zF0?t&qrrL}hpj~!0Iz+DVPOM0cIJ!`u#;oXW{Wqc3I&uyYIbI3^`n+& zuK=rIaY@ZwW*(gp7o~aNh}29ReT?nK23DSHb4Jr66eS@xVy}}4qSK-{sNo*?#ek|; z@4bE3&0%ZXdj7|U9>pld&UgC`esj~(PG*RZ!CNtKv7Z?q8<#ELFm%Q4TZWBQ&J0^H z`hi7@H+3>Zf;7k@Xf*`KI3rwTayNCZBESN0*b-I~n|+x@517>Ufq@HM&+vj;i`4(t*P{KSsq+i!nAt{9rwaR54C%VLaIuf9&pGT)>c&*HcK0Yf2=*d$*!vJ zX=f*2Amg||WCWsLj%*uhzb{G2<%tzIJY(@FstO!ezs$0{Vz-i)o0;rf6!c zCE$u11osM_*O}3Qwrr3T9-EMD^oX{0B2=@NMn;RzrHyj{lXjBW3IARhpmZG=7*Zg^ zDGUrR?Ek@Y7c3eK8j5(VuEEAyHmzyID`qc^3~ypf(Gmdw0+e;o6wjo*z$Yn9{|~|7 z>jcB}&M>6bplt1{n=%*(SpP#N^LvEBVAX){WJ;}T`|{G0x$w*c{E)q*&fHGZ!-sb) zTD)V&;zc|7G4uEAUa)ZYZfYwYxcZfDCOz*u1Gs;*cDkqC8>5{BirEPcYscx=ndwah z7>l)8XvPYAc0BC^hpM^=!lKS?`fsq8*W(?hWvBm_ItybQ@1uR?c(#N-HEF>twoiBI zJV~ZwfDHTl1Mv4l>E8!Ze=qaVq}YB7I;@%P&+0A>>$^JjrqeT@#W?NjYShkr&NFCd z6gvzpNsa_9wlMY(ayYvunl$L?2kw|+!08rIn%)!XLBI*omzq)|>!ZLka!J8CNjAom zTs!{LL@pgDlbZwIgA3e?+N^m1Xh9sFm9nlYV)aJ2#R@=vVJs)bjIF?LWTkBY~^$+UTW#qNHhVLGJ*C(x| zON!O~cMTgqZunj5{^CX9)=xAWjQ?0Sk)FZh#+f*@VaQ~Q#k5l~WTE|lc)cmyY_w;% zi?CVLgU#4DlEsT-qPjbtM{7+*k1&4#$Jp*c7mwbK!1Mu%)VV~2kvyUv_CQ~Yf+ znvSxDtK(Pz*hya64C7(P0%)@gkSHEzaY$xX%j(4POA8v| z61WORnjrd)g97Loe0WsAFMqmov8%RWTLWL+q)x-L0;)g!q;zHI$wLEMBf=bdTmZm* z^(%2Rz+K2~)ND;hj9J)sxPoA}@0kWtWk^~=eJxX#Yn`%>$ymTJdBcvrX{eQxMA zYu>T$`U^mhe&}Pws9Y-tdK6IC3RXVmz!N$&`t;W5)2A<^Pe})TDkE}?(kII3qs?hR z`a~U=QbPKa!*`|8M0o_iEAL~X1vuz?Wtv%ZGZIaaDp*eQEhz#OU579|v&l6y>V|7P z>R-FkswWPjB>P{bX~9SU004N}V_;-pU;tvD^e0E-`E9;3$a64&z?qAMOJVf?lm8gl zHQ9Cnxf~2kAW;BrJ`GC%004N}V_;-pV2}IT#=yYA@c-ohW9*s?KoJ!13ILAY2AX)< zZBs#L6G0SxyYqJ=#e)Ya9)yB=&_gM*6cLHi7%755@DM^+E0hv?64s)E5j-tYN?C%Z zMk*EpqR0}8NDvW04+>R6D=eXilpcbphp0p$%K9cX5K0e^_hEc@)%V_z6MLYT%Z!ii)|^MNy5RC=u=%Eo99IMWchV%D|JyxN3$NR#hBV z?@%IfIZ_VsU;k-nsC%QM%5e+s(^Zo@a)}qNA@IuZ!A#zNv>PeBni(F zl-cX)8fh@zhqnCy0d)$fk0+ZvpW4f9-o3+nJFL-rACTtxuKpK!&HLQ=?+@4J07mGG z?l0SyQM5l2pO{;u$JBi%*x#^Md!c>khtY|@^SjIB-^7MhMWN@zc1Vf)P3GxEKeQM0 zDU?O(McsFTog~u>?L$9|dfcWL^do*ttjTH4ThE8>pe~ZtvTH~s29f#)zfktM004N}V_;y=fxEa#62(%%GLK~ks}QRNYX|EmHUqXUwh!zg?6WwSILtVTI6631 zaU9@O;QYj;!qvfbja!C0g1e9V1CIue8&3w$ES>|rD!g&LyZ9LRa`;a0JMb6quj9WY z5F*efuub5RAfKRyV3c5m;1t1aLMlQvLPvxZgnNYVh-?x0Cu%3!Ai6>Hk(iIz1hFUL zHsTY+4@p=_Opv%H@k=s7vP*J<MGS2YB6g2 z)RokyX$WaVXw1@hqUobqqB%$NgcgrhmDV5a1npxwdOGKHqjYO@zvcj2efnWafos#a_Dl{;Bd|1kE5MqgX1B` z4^B2f7~|CB)a1{N6mRkY}?(0_|*5}H`) zt`Fc7_yjJ+r_fh$;UlrcnVp~5S}Jm!ZWC7W#L)mv{UL2(i_yfs(Ki8 z(fZZD{b}aD`uBC}N1Vl1`~U0H4kH1pSSZl0mF4M=b_%3VE7qk>zxyvL6j-Clc|DTH z+!nc`);en5XwELx@tg2{L(b{fRCPz4L3FFi>=pjs67{~ENEj<}uUpvU+oTuiR6hWT zJiX%p004N}ZO}JtQ*jW-@$V&$ojASsgx<@0&vpvkCN>ay?epFpA{nrJMCWTbeNGF3#vdAWfT=K}LfI^BWrXB6+Ku0>!nJ#pt8{O$aPkPatKJ-OH z$H0LT7bTQZMmhcH&j1E8h`|iOjfbIB;Kj!nD4l-*U|ODy004N}Ma(}E!9WxS@ZGFzB7fxX z=$I%JX5Bz5Y0_j=+2I&QO`+rfj-Yx`8CP%!N8yFF>E7>~?|XOpJ_0?F66~sOC_T%j z;G&*DC`(9JcGAK2pb{-njZXRPHT4*M1AvWe+ ZA;m&+_)|hEKJ5BbegFUgP^-Zu000MO)vo{m literal 0 HcmV?d00001 diff --git a/src/main/webapp/assets/font/seravek-medium-webfont.woff b/src/main/webapp/assets/font/seravek-medium-webfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..13c17fa1806532c3b8c66865e4104045383ea352 GIT binary patch literal 60280 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 lzLVF?k@RAWRqoLNET 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 literal 0 HcmV?d00001 diff --git a/src/main/webapp/assets/img/Aren-icones-clic-01.svg b/src/main/webapp/assets/img/Aren-icones-clic-01.svg new file mode 100644 index 0000000..8eafef1 --- /dev/null +++ b/src/main/webapp/assets/img/Aren-icones-clic-01.svg @@ -0,0 +1,177 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/webapp/assets/img/Aren-icones-clic-02.svg b/src/main/webapp/assets/img/Aren-icones-clic-02.svg new file mode 100644 index 0000000..e274ae2 --- /dev/null +++ b/src/main/webapp/assets/img/Aren-icones-clic-02.svg @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/webapp/assets/img/Aren-icones-clic-03.svg b/src/main/webapp/assets/img/Aren-icones-clic-03.svg new file mode 100644 index 0000000..9c7af48 --- /dev/null +++ b/src/main/webapp/assets/img/Aren-icones-clic-03.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/webapp/assets/img/Aren-icones-dispo-01.svg b/src/main/webapp/assets/img/Aren-icones-dispo-01.svg new file mode 100644 index 0000000..9213c33 --- /dev/null +++ b/src/main/webapp/assets/img/Aren-icones-dispo-01.svg @@ -0,0 +1,177 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/webapp/assets/img/Aren-icones-dispo-02.svg b/src/main/webapp/assets/img/Aren-icones-dispo-02.svg new file mode 100644 index 0000000..e304291 --- /dev/null +++ b/src/main/webapp/assets/img/Aren-icones-dispo-02.svg @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/webapp/assets/img/Aren-icones-dispo-03.svg b/src/main/webapp/assets/img/Aren-icones-dispo-03.svg new file mode 100644 index 0000000..ec9d7cf --- /dev/null +++ b/src/main/webapp/assets/img/Aren-icones-dispo-03.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/webapp/assets/img/Aren-logo.svg b/src/main/webapp/assets/img/Aren-logo.svg new file mode 100644 index 0000000..72fe52f --- /dev/null +++ b/src/main/webapp/assets/img/Aren-logo.svg @@ -0,0 +1,620 @@ + +image/svg+xml diff --git a/src/main/webapp/assets/img/Aren-logold.svg b/src/main/webapp/assets/img/Aren-logold.svg new file mode 100644 index 0000000..eeb5c5a --- /dev/null +++ b/src/main/webapp/assets/img/Aren-logold.svg @@ -0,0 +1,358 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/webapp/assets/img/GitHub-Mark-Light-120px-plus.png b/src/main/webapp/assets/img/GitHub-Mark-Light-120px-plus.png new file mode 100644 index 0000000000000000000000000000000000000000..192846a12085914cc0e38d9b48036b11d2a4d7c4 GIT binary patch literal 4044 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 ZsK8ky_?39l4gAjkwLQ)WTW#Z?@NW_mBhUZ< literal 0 HcmV?d00001 diff --git a/src/main/webapp/assets/img/GitHub-Mark-Light-32px.png b/src/main/webapp/assets/img/GitHub-Mark-Light-32px.png new file mode 100644 index 0000000000000000000000000000000000000000..628da97c70890c73e59204f5b140c4e67671e92d GIT binary patch literal 1571 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 A!vFvP literal 0 HcmV?d00001 diff --git a/src/main/webapp/assets/img/LIRMM_logo.png b/src/main/webapp/assets/img/LIRMM_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..4fa3558406f86e7539bd7e8e2f4561aa4c01110b GIT binary patch literal 7107 zcmV;!8$9HRP)APEVkPv|j3iXz}H zko`o8iWCuL5u>1hp@f9=WKx)!%*?Il`$K^wW@-impLw5$=OJ^>xu?AE?``Ltdm*?_ zv}R3)M_pZA1VX4khGFe8nQU`rX4XaEA{YJ61n+eRSy@@`RaG|^LkNA9O6B^Dj5XzJ z*RGXZzkY2I0I;`G>9!#~J)_da3K#w1K#-A z9v!`8Olxavfyrc=bo)1gAZp#+-Q&lOeRTJ{dGk@n`tk8g$C^y0Hz9;4r%jvw;q2M7 z1sAJa^gx1O*|LP8dc8gl!|+ps2M^xy)?06N64s=oq+WG(wQCFp!>b4(yt`-6H2t-= zw|BH!UGQz!vY42dzwkWw5{BXXQ&Uqv_VDmPE|$6IfdD~D%Bo%(jV1vA&>9@vN1c$6 z(8;aYym>SA-FN4r4F*G!AP7pUgMd(!N~Q1j>gAu5nVDJJvFzBfW7vQGQ}Pdl&TN!FI~DA2>=LncX!W9PtU08S|=i6@w07hZ8;prh1ok848!#v zo?daAH*GBHT2@q4ME&^Vg|`qw!(=jfUUqi&Wf%Kgbl*U5=FAzmd-v`+f*?FCl}a|{ z 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 tpMVe|gwT!P;NXoaRf5jN0vG+>^#3R1y-#LR9 literal 0 HcmV?d00001 diff --git a/src/main/webapp/assets/img/against.png b/src/main/webapp/assets/img/against.png new file mode 100644 index 0000000000000000000000000000000000000000..067ea5411e1421e64ad3b49265bd34771baadbbb GIT binary patch literal 1516 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 literal 0 HcmV?d00001 diff --git a/src/main/webapp/assets/img/investissement_avenir.png b/src/main/webapp/assets/img/investissement_avenir.png new file mode 100644 index 0000000000000000000000000000000000000000..35a4c6e0cad69679bfc51ffef2bdfa23848582a0 GIT binary patch literal 29377 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 M07*qoM6N<$f~GJ}umAu6 literal 0 HcmV?d00001 diff --git a/src/main/webapp/assets/img/logo-cartodebat.png b/src/main/webapp/assets/img/logo-cartodebat.png new file mode 100644 index 0000000000000000000000000000000000000000..f28aa68e37fb2a5f9a622e700d2a93d9955149cc GIT binary patch literal 20094 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 literal 0 HcmV?d00001 diff --git a/src/main/webapp/assets/img/logo-cartodebat.svg b/src/main/webapp/assets/img/logo-cartodebat.svg new file mode 100644 index 0000000000000000000000000000000000000000..f28aa68e37fb2a5f9a622e700d2a93d9955149cc GIT binary patch literal 20094 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 literal 0 HcmV?d00001 diff --git a/src/main/webapp/assets/img/logo-cdc.jpg b/src/main/webapp/assets/img/logo-cdc.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d5a1ce6310cf92a1b9447802bd5274a6f54225e7 GIT binary patch literal 181793 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

#d#{pgL($J@@erktL#7w3K~cD}txhw|l{miX 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

qKdWV#S3s{^9u}c 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

N*KAAkSQ;a*4b~C7dGKr&S{jxyC@Y*POmI> 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

*SB$3_xHT^y}z&gf!Pbc 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 Fe*?Wj(5e6c literal 0 HcmV?d00001 diff --git a/src/main/webapp/assets/img/logo-controversciences.png b/src/main/webapp/assets/img/logo-controversciences.png new file mode 100644 index 0000000000000000000000000000000000000000..b31a42b52191e8d8a6af1f77e2a222ff3903fae3 GIT binary patch literal 68465 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 %PDnw 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 literal 0 HcmV?d00001 diff --git a/src/main/webapp/assets/img/logo-forum-debate.png b/src/main/webapp/assets/img/logo-forum-debate.png new file mode 100644 index 0000000000000000000000000000000000000000..7dc3f528231ceb563fe9bf57916eb323f7f75495 GIT binary patch literal 6995 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 literal 0 HcmV?d00001 diff --git a/src/main/webapp/assets/img/logo-intactile.svg b/src/main/webapp/assets/img/logo-intactile.svg new file mode 100644 index 0000000..adb1243 --- /dev/null +++ b/src/main/webapp/assets/img/logo-intactile.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/main/webapp/assets/img/logo-lirdef.png b/src/main/webapp/assets/img/logo-lirdef.png new file mode 100644 index 0000000000000000000000000000000000000000..8c36a4601885e23b6fdf5d87e2f2e8d38ba9b077 GIT binary patch literal 11780 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 P-C)w<@?w=DhJpVBj?K+S literal 0 HcmV?d00001 diff --git a/src/main/webapp/assets/img/logo-lirmm.png b/src/main/webapp/assets/img/logo-lirmm.png new file mode 100644 index 0000000000000000000000000000000000000000..82c8408271b96da7aeb8b8643e99573c341efaa4 GIT binary patch literal 53680 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 literal 0 HcmV?d00001 diff --git a/src/main/webapp/assets/img/logo_acad_montpellier.png b/src/main/webapp/assets/img/logo_acad_montpellier.png new file mode 100644 index 0000000000000000000000000000000000000000..c59761bfe69141d492d78ffb20ab6d26dc66cb3d GIT binary patch literal 60375 zcmZsCWl&sQux&zu2G<$f-QC@t;O_1aT!Xs?cL?t85S+o?861MU1-m5Qy?1hX`!Bz8(7iruR^ojlCC9)uf<*)(lII7x3?!C@bt= z3%5Z1&!$QLS-zCyUlUD?`)6U~M1KuMPWZ18r~mhq|L5NSy_NL;d+%13@EswCG>P^5 zYrs?`o`T3IDi}g2x{U3Ya0`=@8*CiMKLETdujgXhRou^azgyop{OsFaPv~D>W7QLO zPU1jk{AP?o(PI4_2Ma3ULl1QS2Gh&aVl!Q#{oRDuR}-9}<0-r6m6twmiw&{4_9hpa zs<@$dF2-1PdJcXW$Rr|+RW$x(a&mI=EB6D63J!7S+xByp^1lVJua1~b3JCvFQ#Mor zZG~B{{HwXS88zHsRtpcy2^)g*{4II$kEr2%R_j_m;brq7Zwz4W>8=U?BQJg=2jsE^ zP6(O`#5BxRR}?bY-}$@Wv&o`?nagVu2npd_!fCJo=QR)u4349-^TcKdjn^4iEnYhJ zikMU0f^;G(;Y2(aCMBR@iB))4djDO%8BYPKw12A``?Jn+9)YmzVE|Vq7-Qfe;poOC z=DZ_nnk;`_n}RDKKjNVdb}leFI$na(A87>id30`>_kDC% zmn>@ELF)eT=pAv10X1L&y4vM#Z4WjL|GkahkL;HLf8Hp9ZXk-x>7sF4XG2Ax2W8P_2j&7M8!bZ*>#S^l@}?#(5I z60qxH>hs1hR#5837vJ5z#n=Q)e&NnF25oil$gmQ-vz1goeMYOcKQkWKR{EK7p|l7F zD;I!`C!@lKTzcjQ8(zf(2kCx8MHF7e|P*QUmWg00$yxz9hDcK-)~^XNNPzn=R+OT z4&H7}*9!m{TRPFE{^|oPxyiQVSXD|V{9*$z444$aCO~~-GXd(GQJ_;eO6|QeKKWnQ z=_Se4nLxs*R5$%@&YzR81+z{SvwSI6Auy;2iLfb?{%euDmNf{i?ZQWfAK{QS1=^@K zOhXi%Cg_MskaWmvV3d(E?F&KS($fbvF+yOXaRglm7X3#^{8`vgOBL4r?DMA+$HTIW zdqkoC96}w%39F45@>Wqbtemk6e%{DVs*$(Q0El{97Ur)UYoQNf{hV(dou&(M^di2p zCVNU<0YHyr0yZL+EE(4M(Zxjpcjh)_<>@}T-Z2C~Z6DI4JSAFx{pY<%vC?OiZbtkh zL7C`twW*T<2`B?)1(^iK-@YedSJU?wl15TJEAlP4C%Mc^yL;l`P%q00x~uR_9E9!q zN51evQS4+VI9io}E_P3Jd?CL1i_g!DpLRDoEPFA`C9h?mp`zjgVeo(E>x?N@hjELh zWa6)jHuOJXNBN^xBY$O#|in7O5$(Yxj+t=P>W>Gw(9E7*SG}e ze`P4rphKx-Jh~_=xfxAawPNXRU7^(}N|nbS1hiW{+;okDQl~Lo8T9*>VZrDsMY-&d ztL;y5kS+y|l&eQBIpryms^(IEvs6dHRPA*>U(BdRcg#GF!Q+7z_M4gVhPrqd|k_L@7TJQSCujUUl zRyRu@-2R!n0Nc2Hu$_doQ?J`W<*>^M3QPdn6-<*V8|g{y3c2rfrpzh)i+JuwxCoDF z12;jk){3D6O4;B+D+h?*1u~>Qi)P04F<&DJQpJ#!L=jwcn_7VfdC9Oz9tko8&z$L} zo5Pn&g3MU-eFkg%8^C+h)|>>X&$GVthsb}|Ba&5wC8drU3sA{)Bxo&)9*wW{wX2C~3#0f9Aa%fUSWGKqn2At|-&cHF_E zsDD?O_s9tf#*n2al=y?y(E$2oWQp0D)~BMrVI08Z34*ZrDW?1UR3wSE%D$9qHSd?@ zpQnHBjX>h7sUSTEbitMFy1|}Y8OBng>z+7a^LKu7j-3upTmFXq1%fv@VrMpx(R?rk zfP#KH9{-VeS&~+X9fxnCm(qVwmIa!s1fVz?)Ja3o6LVKO?jM0mN3;wyPKvDX zR1p0W*!66L@5I8SzmrU%!3XDT?oF6lr3xSP)vOpXS}v1cEg_s~Q;vp54Ivw{(MCCg zuZh7Y$jB*83(B@ymVd>xr5?v@1kiqzB*m5bA0a@RZa5p8N}HWY<0+`h;z>M|aZ}|p{xhnpH6eu$_k`8=6gh!VA-nZ)3>=-j@wg-`;O0h||tnK4B^?qg{i82Urr_8RYvD{8|CDY-8Xqrl>twC$KNqx>us#eB%}7~l zcbdGFN(7|g2(R>s{ayKfh-@6h{g(P zzjmxcA@Xv2xC;E=WW!!y&%GQnHR0f&sYFKuk?<5Z^Em0|*DFQ(1N|>s+L2?iE=^@O z!hC~SJO&0|6UK~CEncNkF3kN+Ru^}u_g6f{|_dR|%22jy9zjq+rxZyd6urLlj* z&AM)o8tx3TnDRGFUu!?9jhb2vi)i+}F}8HcEfk4=ux!q-;travLm2N40cf}D8yC5j z&B4ePp4w?`1Tk}+{}I*t4=O}AXpA#77-#ga{HVcAh!b-{dG6{vnO?c(qme?faHNs1 zrqn)rEI)LO7u*U6cD}PMvy`g%$NU%_bz8Bsy39h3u(K+J_mM)c!Yp*N`2ctf3 zpz-wY(xOXW&E$9_aUm2_gu{kCdxQ*8)Py_E+ZcsV3ze4;rcdYk`K|g)|GZq{&AOw> zqVo~bGBMo5OVe#=VntNeam!PE8_RjbDcqS2JU^ZQrlpK_6;=g_@cvPTnM+Rsvx4#Z)JgcLCCLN3uJ#EK1w zf|;y``2XUo*DKuuJHf+Q)Oo`}g8_blHw9Yt*-1z<`9~yh+d2sQ5?>^`#~3n-yMtY* zR1n=T?XEmni_ZlkP`~Qu*{-RM?pE0{-$vm0&=Rfv+hhf#c2M^Cs{5k zxpmnhr^{^BAYVpQkAWaRzz_;D?p6Z6;d7=F&tH6iuSK0F?T-eLWm8NR=&o@9+fe|Q zN~^TV;?1LE-Z|*tujL5?tJ=Kc*6?f=2y==P4ld#4$#b_5>U5g)#Ts;rVAbXizevge zu*w`9UF|H9%hG!#aH&z=j6M6G>TJTsp_eNBjc~(B`Vz%nOiKrh`oBs*l8PJEOd8k> zE|^f1WkC>Av0+!xeUmwx{0G?SenGWr7z4g=fflB3KUK#$xqI;p4}` zYr~89n)7N=WuDo&>Z1 zYdN7fF~SISH47jBC>p?Qz5Du#gO&B3X109fnHyRYi?(S>QXX$UACDscnZc%sw_sHX z4_DiyIdbYbx$$@M3^EL{2%e`(CJTW(kck>sBmfB>x3q)?`|5VGzGVPLlpX0n7POx& z=At}f*@%#4`Nc`eMKBl0(S||&S7y_`Y#Pqp`;SqzoQ>|w`DXr!5Q*oED=Q=fvcnNX zOF}9^S(~oUD2K1P2$`k| zmX=VfNvnq9ghEa238zZ1M^tsK3V^O>+;J4mY>11$L_2Cf=t5d5d+dFu>KHTeWHf5VgaBpF*C&;ug_2<)H;S( z^ZG+pfwAthK8g4$IQ~o+th=-tr%_-Lq*opOrvgpKDUVagJC+gK$wIQERd({UQ6j{;pj`L1#O9iv3J4ZAmk*SyJ**JH}zA=8m`e>Li#G;Vk@wG>5s7M|9Dlba9a zWa2WUMG3oFDM&Nb8i^xmRx}b5hyz4z)Zb%_J zlCpPv`q=+~$tTZCgRvv*;ly?D@Ec|a3*e$rSrfDtSqN3BAsd^9ryF_%b6l)p7B;s@ z9TlFW3pO5T7}@O@@JUSnO_k`p5NqddgBIR_a&=gW!$9}F^gfKWlY<>q=V6`KPkFj% zDY|eY6&X_nxD8NFgC*ZE?08Zscf!?#FJyx&<}7z$v>gWr(oXz~GGL{z9~lROc!#h- z0PnG$F-=*8l2J{Y5_q{J%-DIjX(~I{;dO0>ghSlvIyye`yB3(di1NeSbMoa36F+sj ziqNXLrzWim-J3)7&tcZp)?t!75k`Db3uOgG5S7=Na<7F{k!r?9CA7Oy{ZHV%BglC; z>j<#3r@FBm3M^AX94OyyHG*=Ur$5HX!WQ|8i`k^^{$m7)Y`Cd}N?5beq-AhC_Yee> z_pd-GeiuaEtGSCX6gj{%8L|7hx(C2TF=b31Q3O$(#zuwSmZVUdnUBlF*B!51V%Ib5 z!J}Tdq5aKHUs|K4e(IFqnnf<*RZn!5EMuOUMS}}k^sxrca{5c2%XvFh>jp_fiONEF z(KwJzdca1_*xX45@8S0+^D*fpAg-QVi!5!xSL@-uIkS|?bqb)ZzSZc@`CU#n&RR|o zmG~-rQxhT1w+cHjPS9T=YKu>VGyC`2yjsHJA?)ldiH%Ke!%@w4t#A0;(2wF~E3e^q0WSDgm(aB?rw2rL{)<5 z&6qz%+{?cH3pHM%^EWm|BV0qFZcJK6K2k-9J%)~9^i;)eTwT}9X#&KvXch8aTwz5X zGZ6!g_{l5u7vBwzyl83f$%?cwzx%Cp7Pa*;7-2|z6*yXWag~P zWCZpu()k4Xz5lj06&X|{`b~R&tt8cRV*8;cF%)(%IZaI?YsajatK*hgO@XQHR~`IO zq4GM}y(Q%d{qB0^D7m$_DiYXVvfMv21WNX{JWg%am;_Z=tdo31Bgs|V=V6M{axT~* z&la za+?|W(B{LCA?#=_Q1N zqd+n)>!Zt>dB2F){=X${Ilq@(rMf4=Vlnmf#&VRYSg4h4?X?o)>g>BbRR`Vp>%{h+ z7M|=8_vYKNhjg@w&X$E}NO#C{AE^4fFxWfutak)c>y^th$e3@%n5EecN7J%?l{UXr z!@{8rhAU_GnH7cCbO$h=)52_wBi$3S+KFxu5Pl>&pdt#UasP#H#AbhcR=X4x#K zzFD+noRGwAt18!hno0CA3Icx%{7u=8R_I~Ht@@Y847$24$fo<8kRC`Y7OPX6Il$F4 zePGsl^aOrzO({0f3OVzohG&bM{Z!PPLvbyUmyu%$ zv(XR94p5(A7&s;EImf_XRUxeb+3mx_a;*$>*4kgPh9p77!&lD$bue>s7~jN1C*kRj zdsSu1_AC|IW~hE}nmcH@sR+5r3f;T2iq3jt+m=)}F9h$8%OyGS70%W!py=@2<+@13 zFAaDBE5|CL8%;&{^LW|%DVKE8#r9)uuQY@OhVebRvAUryF8&a;TxMTlF^! zMq^Et7fO?jzA3i$DBvE|mvqCZ#wEPRK$3kef{!M^+6`Qu8GB56=%c-YD^3|&qb$&| zpHYQcZ97~68wsH~1Ly3BOD9p>p6_Aq7s!x7H6wafr* zs!cqK&&?tuTA2^0?yT)gMd(VKG1^2~9`ap3di$kJ zq@?x$RZbcIO&(S0AB*%ineYbAOVFgIFR!mE%GYYSmW?FiZuka!dh*>2I6Omj-IyQr z+mK=sJW1PhYmF&~LQa`XO_&2W$pGSr6j*^)K$}3kAcr&)rM#eimrA)hPd2z#A8->( zzk$sHzkr|;JbPDholaGNcGV!yMnZUQ{Er}V^@0jC<YX{aheRzl|2WZsmmfq4O&y$He+gWXUKXk@tsC zh7e)KmnYkJe>+Mzm};s8`Yw^Y#=rVkEZp?BUXgr^Ip-obdy*>Q=LDO|vN1ZlcX70( z@&^v+C(gE3w=WxJ>o2cRqt!A>5yJ1c!IYG-s13hB019nRmOQ{YOZG`~Ss`rT#}bfI zwR>&L5?Ve$g&Dcefbo|JpCTQ9p$? zWz>~ER;*TQX9qXijC?ZU=UQ5x{h%DE7r)i@|9Sy9Z6#Ej&&F#5Dogc_QRUI#zA)HV zN>?i5I^g$w>zq|_!Zo(49~~&>hYF0GGef^-|1`I6qucU%8Aid?EL969!3R1L@~?`= zD=j*!0aB4E3gs|P@sq8OJ>RH9 zodVr7iyX5R)l%1u=;|8qPZ;Oy=JJccKSd?OYT_XYlB~Y}4;)SQ*rdbkB3Ik3ZAH%D zPrp{Jetf~swer%sO9X3dl*LnB+)wYt6)4F2*hz(9mFbY-yT)7tsdBg&sAeF}n~|6S zN~mzklF=q<$ZBaZ!a!}V-B8o2FLJ8Zz;a{56H!=uzJ6rd!fTQ|CvZXKnrz+)UkB63 zK4G4E*V7@dgwR+1T^>)zW90MnF_j--PB&1q)x2*Dh=(Rkzpn6x&)e4keq9aW^RRMmcI2K)aJ%wtgt#zodCsH9p^)KcVxVi2Kr1)Tc*m_Ac} zKW>ykG@>&7br(FUXd_m4n9XpWNul+xlGYp#nv#dSMw5?0Tmh%zhF&U<6sV_xU*uQ! z7_Omj4nghbh>AeH0u8O+Z7G5`5>BG z_%1wb#qOBTBCdyW^J+(nmBeL3&}>%`b~ml&n7rd2L;)L6m5@M(aw4oX)5$Yswje{& zBSQx%usYKc4v8IYyod=#x0lJJQ@Yzu;D<7j)h|1xQOqv)h?nxoZ4*&C57xaC8XR!2 z_{84`a!x%NG!U^zMd4;2|H#PCH4Aqv&&BVK;P%HU)f4DtE=!x$d7zUjA1m%Py|O#% z>X-=Mad^`O&yM)}s}1h6jUc=pbHub-Dx76KOOpHn-NP|lk#hkwdHNHrwM`Q!97^RZAd2|KKeDz+3JI~BLk-!(qBKpg#Gk9Oh?*&W22|vImSTNB4Rf z|Mq;S@7Bmjm09gY%rSTZo!f#22Xb6Y>zTJs61wl;pz)!I{!RyaSR9|QWBQ=bZtP_Y z1pd*;uSQyM6NQ)&^XAzD%37>#>$eiCA{&%@4+W@Wdc?B@Qw4dqgRK;uVkMfH+n1UI zk!xqia!^M`oOH-zBmI|wj7!BuFmnD0p|1~SFpC!OeU3w8(;W)(J8X^flu9l&oTf}U zjfQLuF)xoXvRE~|Caz9_1D6O+ng-vnB}}2K8_Yz73S=v&jJhgf6m)NKo4oAcKSM(s zBy|%NC)k?Yd@Hw^+f}hD8E2%-==mIbiXQY$j_dY2EHR2)FG(|tw{pARJjNTZFj&q$ z>6>hE+t^%W>P*K;Pu)?y#x_K!XH-k2`dQH_#@PqXka?bxDYm#C4i?9R=Ei|J0`?-c%K z`lb7&rCNSF!oR~7VYNT)w-GTx%6GsoR~>~WEBI36rsl)k^VMwPy=a+AJfPYIYzs0M z?};;1dX?d@-;Y`}gkRQ)jr;f9C7$M1zIWD$QtW9cVZ!4~Ql}1OU2JHT+-FWU7C00Y z50%iMoP+ue9f|yQ%zjW*J9}QBCTp@@=|Jf>S}3D=I&g2`X=dECHeFg|;gQA+t69!l zmD|wkM<%o3)wMp5?gp|LLxE$?|H^n0t_Lku5W9Re!@*V8kV72yhR2#=$B`7y#Xlsf z8QY(F%LqO>bnzP7ER&_1RlRtGo8)rT0jU1;HIk=Xn)LisqMg{CV>V!2M!+yh5V8K& zT1V%RYM3;no>pb++Xg3rH*YiYd_!qNY$WjG0Zs-F+upuo39(RFU?2i^R<<*UT98&; zSCQH}uU<}>w=$e;%4lVBbre&6@L?P7Nj;}9nTgt?#IixewMyq>1bft-t55fP8s}yH zJbV5%d5VX!{700~Wb3K%6~2@G%oj8WF#5uDzJn-x^l*sttM{l+^+nw(!OqMcP^PdW9hcB2zp?O$C zizeIoR93cE0l&zcRrETI8bYT$1aX5%$} z8g<(L5z65BzL#7>hPC0a+w4(JvC{PpHR*8mzM-w2meASrQB>n-QTP16EbgT(TB1k- zbZ>^RZO@HE3Q7!4p2(rE4USi#>}wE2XYrcxnq~Y0_o8p`} zOP<*$IhRCsg<34jDbx^X19(WiD?S0=kOW1~ob+Dak`3Jtne_Hya6!Ba*Psk0sfyG1=Cq7Y|C-=V73+ z;KUm8H~kNFO8|9^ZjdHn_aRQcy}84NEwe;e*D=0-Ay&aY(UvBi?sFcPooG%g(VLBA zzPV?gb5ZPfh4C6Y`9fd#<%@-(#2h#T;V19*?hI9@9eW3n6~h`|mN6qCS2Ee{bKLCe z#?On;$^_W0-XvptN}onsvE?=+*cWD(r^m3=RAi|6D6J-@g5nnUM{KJhx}G^JB7(0` zZpH$#n8oe9V{uE`l2roC_uWI6ar3t6s~pX`8!)9>q9IZD4A3sl-$eHh2xHQTTpi*g z3H~_au6u@C`QptdPNixyFlnx7h<-_PCD}wbR#WCz^*&+HMX2~fA&#J-SR<>6-}Q@8 z{bT{!!H80Yi;LS}Rl|f47LKwBcWrcq;vKK6g3P@gU$dVQ1qL1~UdS~|AErY2`}ZjB zJoOKp(Vi+P)O7qI?KV=c*PQit2wwLEwzN0sT0QcYyfXqJWtoTerip_-?4mGy{(XB7 zL(E9m$Hc?UO*q--61hyJP7mLz(>>ADjf3`9g++h3(x+|cJZyuYMmrH0Ns>t8T2nyb zrMt}rG;*?GGHR)Zc5N9M_(tBg)Mk<{({Q_hMo6WWU`cSm;s% zen>*%L}vtr1*RW;a_grBD!2-xz8g(N3?=4_{z1F@SrgGbc_w(e18WfD?b7d}UdPjj zAq3VtqvD(zfP#Y_4=ZzY^117-QD7&s`^B{D>h_$mnl5RwoJnoZidI zeaE4JZ%|mVx-UXm@8K4T-*Jk-=y+mgujk!h49EgB`8-c>aK)~XHLU?E_v9rU%yq;j zhmfBLFRJGSd=z*SlcH0f-=kALed#$Hq@tq|=3$M~{kI);0fSoHy|#y4 z58HV_is2IH%H%c5%c&O!sou6iFft>itBeES6vERUhx497-_LCeFck(DvQ1NIB$|Ky zF=qZK5^M%_xtR{}VVO6wgkx#K>~ye4w3}@dp3a`JJ&~#F!O^LgV|UkF!o)nh9`W3Z9R?`6D70v?a^9)_x!C-VDnp=a|^(* zo=5^?OlRPgkz$t2%Q(=qXMk>~`;tWfMA3ab~*W4AL{|EnMLCgxc`QFvI z^ig~DiE#}s>!ouou!|$zkRUz5ui&ZX^;hHmxm~HRvt+cTuy%liu;rCSN@d69!-Orf zZU9^(;&4;8Q3d4e>SUk*VIm_~J6b3c_K}~@x~#3r?z5N}la*(5)^91wO8hfrS@=eH zCarqTR*~#rJtvBTJ3nK?DwL%kFhMTK(Bm?memxsEZW8-NfgI*cVEIw+D=??*@DtkOOW-cU>=EU&pC|@kKwD9S6(eeR>Si>e87kps3YyV1c2h8eV5X-cu7 z^LJB5CV1x-=NFHQI1swdyc<&7wN%k^Sjm0Q7dZ^skb5>Y+%k&HHQ)G1j~F~1_($c+ zRQwIo&$=?AiO5})S){vn4!>>-BC>?!Pq``DL#CEJH-wbWmIp|kb#T>W zp)hj(ycR#i6TA}f-ySN|H)3E}2Lv$9tUGcGD8xO#h>}mA)bu>O72$GH(>3DACFruy+=E`Q;<4J z1HQ{Hd*A!-l-zrNC`Qw3$4fiEKKfeNHpYR{3^GxM3M;uxD|McR5&ib`AEkURp#8#V z)FI1}?_9IEh;2FTvMO$-$HrmuhVt~pkK-eX84w>8-U{?LHy`2>+uc%4@ORAMkBn_z zhzD=5LR?c;`sc)!I2UB;sDbk0KlUL~vOO`Oyebn)Ns;VEpRhgw4Mp+^R`6~I5R*~mAS_bX(KDzc=(h>`k-Jl zeq$SMp2wvcNOZE){b&TVe_kU+6%*K}J@DP7Ah<-nd{o%p_k4fqW6qVGF;Oz@!*b zgwAkBA)6%|lBj06kqFZ__zA_E&lVxnKj6@XRK1>(2gtq7&+_b#5kvq(Et;mtX^aGc zUT0e_#gftKfO`eDP(1BKI^=h93^{7Yf)(mSN?Kj{B*fco`9k-Y=*?TY4X< z55_X!vWN|`k;a&^GEH@7rIpQkhRd5uE~HH4V)xa*PaB98iZyIwLF=kQ6x7s?lyLU>Uxz~V+i)IhZ+RdI<3py zlc4Ix0X-5B^3Z;rR`jC!FSBznD4x~VpxjXWV9l|wN)3l)lr8T!ByR6vZ>=hzih*Wu zp~{Js2ElRv5!;3Ia^>RB&$R9D9OYiDLt_#BU!I`S*EiPPNF19BVXQ33FYY#M?@gsb zPdt&n-H9IJZ%l!lk~>8Eywj{)alI=3u= zqURai4zI|&6~~1}vDXeWWuL(A*4WJh{${_aAuo|3Nr&`26M(7?gIoRKE;kO?Y9Y-` z4h7_8Vyxn5)%RJ2W&2@pk+DlyH=J#JpIV>oW!qsJWn9g0*-V(yABp1UHQPb}O6;t0 z43eJl!AxU~%S;EFa7O<)3etMdQ!Qb-Zv|TR+d?ERKHZ=49xen69v&Xvm#t#Jt|74D z6gIE(YBHLLS+-rn_de-U*UPE>_2k=T?8APu9>k^u|H}*SQ+VvvC%-f06MYyWWW%JW zQ?*+gCo;9~s~kukdr9h^>ksCsEOv)(u5KPjN2*OtpGCa8p2(dGRcWam9MnB7AMGoo z1WK~D&bH7^!Wy}DXorKxMn3uRi=$TuL`t2VcRBr1fBmiSILPs4v%}P0LjjQWCa5Tt zsxM;f^Lkil*4y3PMK6AQ%y~((4EH>DCIkDLyQLHhJfrssE!CzksZcS2J30An#+k)v zqLMq@ujA}_->{c=uZ}db@f~fu-^FRXkUMl2qBZadZ$^jQDW*YFscA-Qr>rIY#Z3HG z2E)c~@cA>-hoNE&fvZD;%~Fc$i@f6M%M*(1K|`jQ-4?LXPN8Q%%r@R^-=gC@EtvuP zp2-!HOH-doT_A;a@GSnt(s7XmER+($5xT?mjv#76e6&G>TlBzs#9F}pHKF1PW!NTU z6i68M2I`YyPw)XKfXCmBYyrNcXwlFdi^UxRM^zIhFFJQ8_?}UBj-Y)i4f^$hW@GpI z?Vf;qehgK$>n^|wIThuizeMlRo)r?n}JQ6N$knvsN+rjaeH4cGS0LEU@hA+x> z;lVPV?{~lRjaN(GZ34y?U+X<1Y(? zmIexwM1`xZG3GLT3HY8;P3Aco08U6YP=ridwm#NjRBx|*!#j!LrM`MwM_kpM_9$uw z!Tpg#-y~HacI*Bjc=Fl$Ik@|QDx}q5h44ySomDMmEVfH#|D5<-Sfn_jqx699+}Hl@ zlHGouI@v6?2P{z=rBsU(aeJ1dzW(F>D^plV=6J7a%gl~XaD2eK8vlXz+&A%iW#1HA zr6pOh_+< zlvjPSxvc%Qti2A-tjs5{d84_X0hfjfZ{yAL>D%6y56?@ne%#U**Ra26XsP#7d=LHh z-(HU7^tiHXE>QoN5QmRhP0AZ`#cb8R7!LN-8QJW9N0&omcl_0pca`&o)!o0SujNp) zw4YlTi-=c z0QO%=15Cg*<7tf^hJUphAD@Nfcs+jm{cCqr&Au^dL&Z?J1S=yftMmz> zNngttC*adi2H)3thUt2w2O_2{Q;cud@43CZw{AxDN_~Pl`l9E{C^c>B+cxCTmeX(# z1R^E|V9VfeMa*;Shn5p!ib&Um7sJK7@2kNyyIcvsOrbGhlhm-f$cUAH3v!31>|mn%2bZ-HhRb{37a8xD!pz0u z)y#$DG-r6{z8<4x{xL?5_shP$xJkc55B|5-4dGShYiM1VZ`UC|4|jTk*K0o8vy&#< z0GucG8BD@^_XXe8`bH~)g2%&j!H{ieEUYevR<;|v^HRsIe&zeN?eX+(J!fC{`MaiU z?r(!Qp0PCfr>5hvlE3q@5bE_5S6|f#oG78f&o`>#bGmwNBNyfxKxl4K5(EA~#x?K| z%9s*HWa7u2PNc8PqjORDea<07eE{bWlMHI{0-sOv1UZvo{tFtqHJskC$!@h;h7KCd z1|CkR>s;GB-U53Tf1sIzcwM23ca2)|lSlf#9WLPnCvG{MEz!}+2pD{4EVn|$x|q4; zs_ya}VIcs==yTRHLGONNczf;M#9>hIaO8$E5Kyj)vZ_$o4Qc8&(b9}5!@c@gjce|G z$I&%bEO7hcy^W^smGt#^-t4lYPkO*a@d}hRAHK%xdd)kFipy2p=%DB&-Kc|$=yBFs z?YI}Nu)%_G2?3bc_U0D<60e$qinQUr-xm)Bh5%Cez+WEq8tLi1tH|-}`!-1Zb zlR48*%)Tj3s3r*gtM7QD`PodvAC(<^P`Wxein(%Ly1T}5-co$y6uh^s+9S{QzH� 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 VKF3|h%L7cJ44$rjF6*2Ung9zHL;(N* literal 0 HcmV?d00001 diff --git a/src/main/webapp/assets/js/components/grids/debatesGrid.vue b/src/main/webapp/assets/js/components/grids/debatesGrid.vue new file mode 100644 index 0000000..7cc27ac --- /dev/null +++ b/src/main/webapp/assets/js/components/grids/debatesGrid.vue @@ -0,0 +1,78 @@ + + + \ No newline at end of file diff --git a/src/main/webapp/assets/js/components/grids/documentsGrid.vue b/src/main/webapp/assets/js/components/grids/documentsGrid.vue new file mode 100644 index 0000000..6e4d89c --- /dev/null +++ b/src/main/webapp/assets/js/components/grids/documentsGrid.vue @@ -0,0 +1,51 @@ + + + \ No newline at end of file diff --git a/src/main/webapp/assets/js/components/grids/teamsGrid.vue b/src/main/webapp/assets/js/components/grids/teamsGrid.vue new file mode 100644 index 0000000..976b1f8 --- /dev/null +++ b/src/main/webapp/assets/js/components/grids/teamsGrid.vue @@ -0,0 +1,43 @@ + + + \ No newline at end of file diff --git a/src/main/webapp/assets/js/components/grids/usersGrid.vue b/src/main/webapp/assets/js/components/grids/usersGrid.vue new file mode 100644 index 0000000..9f45ee9 --- /dev/null +++ b/src/main/webapp/assets/js/components/grids/usersGrid.vue @@ -0,0 +1,70 @@ + + + diff --git a/src/main/webapp/assets/js/components/modals/categoryModal.vue b/src/main/webapp/assets/js/components/modals/categoryModal.vue new file mode 100644 index 0000000..32c17d7 --- /dev/null +++ b/src/main/webapp/assets/js/components/modals/categoryModal.vue @@ -0,0 +1,39 @@ + + + \ No newline at end of file diff --git a/src/main/webapp/assets/js/components/modals/commentModal.vue b/src/main/webapp/assets/js/components/modals/commentModal.vue new file mode 100644 index 0000000..cee0516 --- /dev/null +++ b/src/main/webapp/assets/js/components/modals/commentModal.vue @@ -0,0 +1,184 @@ + + + \ No newline at end of file diff --git a/src/main/webapp/assets/js/components/modals/contributorModal.vue b/src/main/webapp/assets/js/components/modals/contributorModal.vue new file mode 100644 index 0000000..57c0ab2 --- /dev/null +++ b/src/main/webapp/assets/js/components/modals/contributorModal.vue @@ -0,0 +1,73 @@ + + + \ No newline at end of file diff --git a/src/main/webapp/assets/js/components/modals/createUserModal.vue b/src/main/webapp/assets/js/components/modals/createUserModal.vue new file mode 100644 index 0000000..4e9f3f8 --- /dev/null +++ b/src/main/webapp/assets/js/components/modals/createUserModal.vue @@ -0,0 +1,123 @@ + + + \ No newline at end of file diff --git a/src/main/webapp/assets/js/components/modals/loginModal.vue b/src/main/webapp/assets/js/components/modals/loginModal.vue new file mode 100644 index 0000000..5f3b4d3 --- /dev/null +++ b/src/main/webapp/assets/js/components/modals/loginModal.vue @@ -0,0 +1,58 @@ + + + \ No newline at end of file diff --git a/src/main/webapp/assets/js/components/modals/passwordModal.vue b/src/main/webapp/assets/js/components/modals/passwordModal.vue new file mode 100644 index 0000000..ba0871c --- /dev/null +++ b/src/main/webapp/assets/js/components/modals/passwordModal.vue @@ -0,0 +1,96 @@ + + + \ No newline at end of file diff --git a/src/main/webapp/assets/js/components/modals/resetPasswordModal.vue b/src/main/webapp/assets/js/components/modals/resetPasswordModal.vue new file mode 100644 index 0000000..3ffb1cd --- /dev/null +++ b/src/main/webapp/assets/js/components/modals/resetPasswordModal.vue @@ -0,0 +1,43 @@ + + + \ No newline at end of file diff --git a/src/main/webapp/assets/js/components/modals/tagsModal.vue b/src/main/webapp/assets/js/components/modals/tagsModal.vue new file mode 100644 index 0000000..ab098fb --- /dev/null +++ b/src/main/webapp/assets/js/components/modals/tagsModal.vue @@ -0,0 +1,110 @@ + + + diff --git a/src/main/webapp/assets/js/components/modals/teamModal.vue b/src/main/webapp/assets/js/components/modals/teamModal.vue new file mode 100644 index 0000000..857fc12 --- /dev/null +++ b/src/main/webapp/assets/js/components/modals/teamModal.vue @@ -0,0 +1,31 @@ + + + \ No newline at end of file diff --git a/src/main/webapp/assets/js/components/modals/userInTeamModal.vue b/src/main/webapp/assets/js/components/modals/userInTeamModal.vue new file mode 100644 index 0000000..d7f7c60 --- /dev/null +++ b/src/main/webapp/assets/js/components/modals/userInTeamModal.vue @@ -0,0 +1,57 @@ + + + diff --git a/src/main/webapp/assets/js/components/singletons/confirm.vue b/src/main/webapp/assets/js/components/singletons/confirm.vue new file mode 100644 index 0000000..64e38c6 --- /dev/null +++ b/src/main/webapp/assets/js/components/singletons/confirm.vue @@ -0,0 +1,57 @@ + + + \ No newline at end of file diff --git a/src/main/webapp/assets/js/components/singletons/documentation.vue b/src/main/webapp/assets/js/components/singletons/documentation.vue new file mode 100644 index 0000000..dd537d8 --- /dev/null +++ b/src/main/webapp/assets/js/components/singletons/documentation.vue @@ -0,0 +1,154 @@ + + + \ No newline at end of file diff --git a/src/main/webapp/assets/js/components/singletons/toaster.vue b/src/main/webapp/assets/js/components/singletons/toaster.vue new file mode 100644 index 0000000..dd6b03d --- /dev/null +++ b/src/main/webapp/assets/js/components/singletons/toaster.vue @@ -0,0 +1,43 @@ + + + \ No newline at end of file diff --git a/src/main/webapp/assets/js/components/singletons/tooltip.vue b/src/main/webapp/assets/js/components/singletons/tooltip.vue new file mode 100644 index 0000000..cc9b7f3 --- /dev/null +++ b/src/main/webapp/assets/js/components/singletons/tooltip.vue @@ -0,0 +1,40 @@ + + + \ No newline at end of file diff --git a/src/main/webapp/assets/js/components/widgets/D3Pie.vue b/src/main/webapp/assets/js/components/widgets/D3Pie.vue new file mode 100644 index 0000000..46aa9a7 --- /dev/null +++ b/src/main/webapp/assets/js/components/widgets/D3Pie.vue @@ -0,0 +1,194 @@ + + + \ No newline at end of file diff --git a/src/main/webapp/assets/js/components/widgets/D3Sunburst.vue b/src/main/webapp/assets/js/components/widgets/D3Sunburst.vue new file mode 100644 index 0000000..c2418fc --- /dev/null +++ b/src/main/webapp/assets/js/components/widgets/D3Sunburst.vue @@ -0,0 +1,240 @@ + + + \ No newline at end of file diff --git a/src/main/webapp/assets/js/components/widgets/D3Tree.vue b/src/main/webapp/assets/js/components/widgets/D3Tree.vue new file mode 100644 index 0000000..a988229 --- /dev/null +++ b/src/main/webapp/assets/js/components/widgets/D3Tree.vue @@ -0,0 +1,166 @@ + + + \ No newline at end of file diff --git a/src/main/webapp/assets/js/components/widgets/actionButton.vue b/src/main/webapp/assets/js/components/widgets/actionButton.vue new file mode 100644 index 0000000..c1bb18e --- /dev/null +++ b/src/main/webapp/assets/js/components/widgets/actionButton.vue @@ -0,0 +1,22 @@ + + + \ No newline at end of file diff --git a/src/main/webapp/assets/js/components/widgets/bulletsContainer.vue b/src/main/webapp/assets/js/components/widgets/bulletsContainer.vue new file mode 100644 index 0000000..e85ddf8 --- /dev/null +++ b/src/main/webapp/assets/js/components/widgets/bulletsContainer.vue @@ -0,0 +1,108 @@ + + + \ No newline at end of file diff --git a/src/main/webapp/assets/js/components/widgets/comment.vue b/src/main/webapp/assets/js/components/widgets/comment.vue new file mode 100644 index 0000000..6fc25ea --- /dev/null +++ b/src/main/webapp/assets/js/components/widgets/comment.vue @@ -0,0 +1,264 @@ + + + diff --git a/src/main/webapp/assets/js/components/widgets/contributors.vue b/src/main/webapp/assets/js/components/widgets/contributors.vue new file mode 100644 index 0000000..a63ea68 --- /dev/null +++ b/src/main/webapp/assets/js/components/widgets/contributors.vue @@ -0,0 +1,65 @@ + + + diff --git a/src/main/webapp/assets/js/components/widgets/debatePrint.vue b/src/main/webapp/assets/js/components/widgets/debatePrint.vue new file mode 100644 index 0000000..fe75eec --- /dev/null +++ b/src/main/webapp/assets/js/components/widgets/debatePrint.vue @@ -0,0 +1,97 @@ + + + diff --git a/src/main/webapp/assets/js/components/widgets/documented.vue b/src/main/webapp/assets/js/components/widgets/documented.vue new file mode 100644 index 0000000..af5bdba --- /dev/null +++ b/src/main/webapp/assets/js/components/widgets/documented.vue @@ -0,0 +1,25 @@ + \ No newline at end of file diff --git a/src/main/webapp/assets/js/components/widgets/institutionSelect.vue b/src/main/webapp/assets/js/components/widgets/institutionSelect.vue new file mode 100644 index 0000000..90c8e32 --- /dev/null +++ b/src/main/webapp/assets/js/components/widgets/institutionSelect.vue @@ -0,0 +1,44 @@ + + + \ No newline at end of file diff --git a/src/main/webapp/assets/js/components/widgets/notificationsPanel.vue b/src/main/webapp/assets/js/components/widgets/notificationsPanel.vue new file mode 100644 index 0000000..15d80fb --- /dev/null +++ b/src/main/webapp/assets/js/components/widgets/notificationsPanel.vue @@ -0,0 +1,74 @@ + + + \ No newline at end of file diff --git a/src/main/webapp/assets/js/components/widgets/searchBox.vue b/src/main/webapp/assets/js/components/widgets/searchBox.vue new file mode 100644 index 0000000..3d9b15b --- /dev/null +++ b/src/main/webapp/assets/js/components/widgets/searchBox.vue @@ -0,0 +1,13 @@ + + + \ No newline at end of file diff --git a/src/main/webapp/assets/js/components/widgets/tagsRestitution.vue b/src/main/webapp/assets/js/components/widgets/tagsRestitution.vue new file mode 100644 index 0000000..3e17995 --- /dev/null +++ b/src/main/webapp/assets/js/components/widgets/tagsRestitution.vue @@ -0,0 +1,120 @@ + + + \ No newline at end of file diff --git a/src/main/webapp/assets/js/components/widgets/textInput.vue b/src/main/webapp/assets/js/components/widgets/textInput.vue new file mode 100644 index 0000000..c84ea2c --- /dev/null +++ b/src/main/webapp/assets/js/components/widgets/textInput.vue @@ -0,0 +1,78 @@ + + + \ No newline at end of file diff --git a/src/main/webapp/assets/js/components/widgets/toggleActionButton.vue b/src/main/webapp/assets/js/components/widgets/toggleActionButton.vue new file mode 100644 index 0000000..76068a9 --- /dev/null +++ b/src/main/webapp/assets/js/components/widgets/toggleActionButton.vue @@ -0,0 +1,24 @@ + + + \ No newline at end of file diff --git a/src/main/webapp/assets/js/components/widgets/tooltiped.vue b/src/main/webapp/assets/js/components/widgets/tooltiped.vue new file mode 100644 index 0000000..dd9a05a --- /dev/null +++ b/src/main/webapp/assets/js/components/widgets/tooltiped.vue @@ -0,0 +1,28 @@ + \ No newline at end of file diff --git a/src/main/webapp/assets/js/components/widgets/wysiwygEditor.vue b/src/main/webapp/assets/js/components/widgets/wysiwygEditor.vue new file mode 100644 index 0000000..f2cacb0 --- /dev/null +++ b/src/main/webapp/assets/js/components/widgets/wysiwygEditor.vue @@ -0,0 +1,48 @@ + + + \ No newline at end of file diff --git a/src/main/webapp/assets/js/layouts/baseLayout.vue b/src/main/webapp/assets/js/layouts/baseLayout.vue new file mode 100644 index 0000000..5457d3c --- /dev/null +++ b/src/main/webapp/assets/js/layouts/baseLayout.vue @@ -0,0 +1,28 @@ + + + \ No newline at end of file diff --git a/src/main/webapp/assets/js/layouts/gridLayout.vue b/src/main/webapp/assets/js/layouts/gridLayout.vue new file mode 100644 index 0000000..2b77d2b --- /dev/null +++ b/src/main/webapp/assets/js/layouts/gridLayout.vue @@ -0,0 +1,152 @@ + + + \ No newline at end of file diff --git a/src/main/webapp/assets/js/layouts/modalLayout.vue b/src/main/webapp/assets/js/layouts/modalLayout.vue new file mode 100644 index 0000000..c1a3f03 --- /dev/null +++ b/src/main/webapp/assets/js/layouts/modalLayout.vue @@ -0,0 +1,67 @@ + + + diff --git a/src/main/webapp/assets/js/layouts/tabsLayout.vue b/src/main/webapp/assets/js/layouts/tabsLayout.vue new file mode 100644 index 0000000..0c46e4a --- /dev/null +++ b/src/main/webapp/assets/js/layouts/tabsLayout.vue @@ -0,0 +1,58 @@ + + + \ No newline at end of file diff --git a/src/main/webapp/assets/js/router.js b/src/main/webapp/assets/js/router.js new file mode 100644 index 0000000..0419957 --- /dev/null +++ b/src/main/webapp/assets/js/router.js @@ -0,0 +1,24 @@ +const router = new VueRouter({ + base: "", + mode: "history", + routes: [ + {path: '/', component: vueLoader('views/home')}, + {path: '/createDebate', component: vueLoader('views/createDebate')}, + {path: '/teams', component: vueLoader('views/teams')}, + {path: '/teams/:id', component: vueLoader('views/team')}, + {path: '/documents', component: vueLoader('views/documents')}, + {path: '/documents/:id', component: vueLoader('views/document')}, + {path: '/debates', component: vueLoader('views/debates')}, + {path: '/debates/:id', component: vueLoader('views/debate')}, + {path: '/debates/:id/restitution', component: vueLoader('views/restitution')}, + {path: '/debates/:id/print', component: vueLoader('views/debatePrint')}, + {path: '/aaf', component: vueLoader('views/aaf')}, + {path: '/tags', component: vueLoader('views/updateTags')}, + {path: '/agendas', component: vueLoader('views/agendas')}, + {path: '/agenda', component: vueLoader('views/agenda')}, + {path: '/sondages', component: vueLoader('views/sondages')}, + {path: '/sondage', component: vueLoader('views/sondage')}, + {path: '/test', component: vueLoader('views/test')}, + {path: '*', component: vueLoader('views/404')}, + ] +}); \ No newline at end of file diff --git a/src/main/webapp/assets/js/router.min.js b/src/main/webapp/assets/js/router.min.js new file mode 100644 index 0000000..fe8fe4f --- /dev/null +++ b/src/main/webapp/assets/js/router.min.js @@ -0,0 +1,2 @@ +const router=new VueRouter({base:"",mode:"history",routes:[{path:"/",component:vueLoader("views/home")},{path:"/createDebate",component:vueLoader("views/createDebate")},{path:"/teams",component:vueLoader("views/teams")},{path:"/teams/:id",component:vueLoader("views/team")},{path:"/documents",component:vueLoader("views/documents")},{path:"/documents/:id",component:vueLoader("views/document")},{path:"/debates",component:vueLoader("views/debates")},{path:"/debates/:id",component:vueLoader("views/debate")}, +{path:"/debates/:id/restitution",component:vueLoader("views/restitution")},{path:"/debates/:id/print",component:vueLoader("views/debatePrint")},{path:"/aaf",component:vueLoader("views/aaf")},{path:"/tags",component:vueLoader("views/updateTags")},{path:"*",component:vueLoader("views/404")}]}); \ No newline at end of file diff --git a/src/main/webapp/assets/js/service/aren.js b/src/main/webapp/assets/js/service/aren.js new file mode 100644 index 0000000..8d464ad --- /dev/null +++ b/src/main/webapp/assets/js/service/aren.js @@ -0,0 +1,937 @@ +const Authority = { + DELETED: "DELETED", + GUEST: "GUEST", + USER: "USER", + MODO: "MODO", + ADMIN: "ADMIN", + SUPERADMIN: "SUPERADMIN", + _value: { + DELETED: -1, + GUEST: 0, + USER: 1, + MODO: 2, + ADMIN: 3, + SUPERADMIN: 4, + }, +}; + +const Opinion = { + FOR: "FOR", + NEUTRAL: "NEUTRAL", + AGAINST: "AGAINST", +}; + +const Hypostase = [ + [ + "EXPLANATION", + "LAW", + "PRINCIPLE", + "THEORY", + "BELIEF", + "CONJECTURE", + "HYPOTHESIS", + "AXIOM", + "DEFINITION", + ], + [ + "QUALITATIVE", + "VARIABLE", + "OBJECT", + "EVENT", + "PHENOMENON", + "DATA", + "MODE", + "DOMAIN", + ], + [ + "QUANTITATIVE", + "VARIATION", + "VARIANCE", + "APPROXIMATION", + "VALUE", + "CLUE", + "INVARIANT", + "DIMENSION", + ], + [ + "STRUCTURAL", + "STRUCTURE", + "METHOD", + "FORMALISM", + "CLASSIFICATION", + "PARADIGME", + ], + ["DIFFICULTY", "APORIA", "PARADOXE", "PROBLEM"], +]; + +function Tag(obj = {}) { + if (obj.constructor === String) { + obj = obj.replace(/[^A-Za-zÀ-ÖØ-öø-ÿ0-9 \-\']/g, "").trim(); + let split = obj.split("|"); + if (split[1]) { + this.power = split[1] * 1; + } else { + this.power = 0; + } + split[0] = split[0].trim(); + if (split[0][0] === "-") { + this.negative = true; + this.value = split[0].substring(1).trim(); + } else { + this.negative = false; + this.value = split[0]; + } + } else { + this.value = obj.value; + this.negative = obj.negative; + this.power = obj.power; + } +} + +function Message(obj = {}) { + this.title = obj.title; + this.message = obj.message; + this.details = obj.details; +} + +function Entity(obj = {}) { + for (let attr in this.attrs) { + this[attr] = obj[attr] ? obj[attr] : undefined; + } + for (let attr in this.manyToOne) { + this[attr] = undefined; + } + for (let attr in this.oneToMany) { + this[attr] = []; + } + for (let attr in this.manyToMany) { + this[attr] = []; + } +} + +function Category(obj = {}) { + Entity.call(this, obj); +} +Category.prototype.attrs = { + id: Number, + name: String, + picture: String, + debatesCount: Number, + lastCommentDate: Date, +}; +Category.prototype.oneToMany = { + documents: [Document, "category"], +}; +Category.prototype.debates = function () { + return this.documents.map((document) => document.debates).flat(); +}; + +function Document(obj = {}) { + Entity.call(this, obj); +} +Document.prototype.attrs = { + id: Number, + created: Date, + name: String, + author: String, + content: String, + debatesCount: Number, + lastCommentDate: Date, +}; +Document.prototype.oneToMany = { + debates: [Debate, "document"], +}; +Document.prototype.manyToOne = { + category: [Category, "documents"], +}; + +function Debate(obj = {}) { + Entity.call(this, obj); +} +Debate.prototype.attrs = { + id: Number, + created: Date, + name: String, + closed: Date, + active: Boolean, + commentsCount: Number, + commentsCountFor: Number, + commentsCountAgainst: Number, + lastCommentDate: Date, + withHypostases: Boolean, + reformulationCheck: Boolean, + idfixLink: Boolean, + openPublic: Boolean, +}; +Debate.prototype.oneToMany = { + comments: [Comment, "debate"], +}; +Debate.prototype.manyToOne = { + owner: [User, "createdDebates"], + document: [Document, "debates"], +}; +Debate.prototype.manyToMany = { + teams: [Team, "debates"], + guests: [User, "invitedDebates"], +}; +Debate.prototype.deepSortComments = function (sortFunction) { + this.comments.sort(sortFunction); + let len = this.comments.length; + for (let i = 0; i < len; i++) { + this.comments[i].deepSortComments(sortFunction); + } +}; + +function Comment(obj = {}) { + Entity.call(this, obj); +} +Comment.prototype.attrs = { + id: Number, + created: Date, + reformulation: String, + argumentation: String, + selection: String, + startContainer: String, + startOffset: Number, + endContainer: String, + endOffset: Number, + opinion: String, + signaled: Boolean, + moderated: Boolean, + hypostases: Array, + proposedTags: Array, + tags: Array, +}; +Comment.prototype.oneToMany = { + comments: [Comment, "parent"], +}; +Comment.prototype.manyToOne = { + owner: [User, "comments"], + debate: [Debate, "comments"], + parent: [Comment, "comments"], +}; +Comment.prototype.deepSortComments = function (sortFunction) { + this.comments.sort(sortFunction); + let len = this.comments.length; + for (let i = 0; i < len; i++) { + this.comments[i].deepSortComments(sortFunction); + } +}; +Comment.prototype.compareBoundaryPoints = function (type, comment) { + return compareRange(type, this, comment); +}; + +function Institution(obj = {}) { + Entity.call(this, obj); +} +Institution.prototype.attrs = { + id: Number, + type: String, + name: String, + academy: String, +}; +Institution.prototype.oneToMany = { + users: [User, "institution"], + teams: [Team, "institution"], +}; + +function Notification(obj = {}) { + Entity.call(this, obj); +} +Notification.prototype.attrs = { + id: Number, + owner: Number, + created: Date, + content: Message, + unread: Boolean, + comment: Number, + debate: Number, +}; + +function Team(obj = {}) { + Entity.call(this, obj); +} +Team.prototype.attrs = { + id: Number, + entId: String, + name: String, + community: Boolean, + debatesCount: Number, + usersCount: Number, +}; +Team.prototype.manyToOne = { + institution: [Institution, "teams"], +}; +Team.prototype.manyToMany = { + debates: [Debate, "teams"], + users: [User, "teams"], +}; + +function User(obj = {}) { + Entity.call(this, obj); + this.authority = Authority.GUEST; +} +User.prototype.attrs = { + id: Number, + entId: String, + username: String, + password: String, + firstName: String, + lastName: String, + email: String, + lastLogin: Date, + active: Boolean, + authority: String, +}; +User.prototype.oneToMany = { + comments: [Comment, "owner"], + createdDebates: [Debate, "owner"], + notifications: [Notification, "owner"], +}; +User.prototype.manyToOne = { + institution: [Institution, "users"], +}; +User.prototype.manyToMany = { + invitedDebates: [Debate, "guests"], + teams: [Team, "users"], +}; +User.prototype.fullName = function () { + if (this.firstName && this.lastName) { + return this.firstName + " " + this.lastName; + } else { + return this.username; + } +}; +User.prototype.is = function (authority) { + return Authority._value[this.authority] >= Authority._value[authority]; +}; + +const ApiService = function (anUrl, locale) { + let self = this; + + this.Store = { + clear() { + this.Category = []; + this.Document = []; + this.Debate = []; + this.Comment = []; + this.Institution = []; + this.Notification = []; + this.Team = []; + this.User = []; + }, + detach(obj) { + this[obj.constructor.name].remove(obj); + }, + remove(obj) { + let manyToOne = obj.manyToOne; + let oneToMany = obj.oneToMany; + let manyToMany = obj.manyToMany; + + for (let foreignKey in manyToOne) { + if (obj[foreignKey]) { + obj[foreignKey][manyToOne[foreignKey][1]].remove(obj); + } + } + for (let collection in oneToMany) { + if (obj[collection]) { + let len = obj[collection].length; + for (let i = 0; i < len; i++) { + delete obj[collection][i][oneToMany[collection][1]]; + } + } + } + for (let collection in manyToMany) { + if (obj[collection]) { + let len = obj[collection].length; + for (let i = 0; i < len; i++) { + obj[collection][i][manyToMany[collection][1]].remove(obj); + } + } + } + this.detach(obj); + }, + createOrUpdate(obj, constructor) { + if (!isNaN(obj)) { + return this.get(obj * 1, constructor); + } + let that = this.get(obj.id, constructor); + if (that === -1) { + that = new constructor(); + if (this.hasOwnProperty(constructor.name)) { + this[constructor.name].push(that); + } + } + + let attrs = that.attrs; + let manyToOne = that.manyToOne; + let oneToMany = that.oneToMany; + let manyToMany = that.manyToMany; + + for (let attr in attrs) { + if (obj[attr] !== undefined) { + switch (attrs[attr]) { + case Boolean: + that[attr] = !!obj[attr]; + break; + case Number: + that[attr] = obj[attr] * 1; + break; + case String: + that[attr] = "" + obj[attr]; + break; + case Date: + that[attr] = new Date(obj[attr]); + break; + case Array: + that[attr] = obj[attr]; + break; + default: + that[attr] = new attrs[attr](obj[attr]); + } + } + } + if (constructor === Comment && that.tags !== undefined) { + // If same same value in Tags and ProposedTags array + // Then point to the same object + let len = that.tags.length; + for (let i = 0; i < len; i++) { + let pTag = that.proposedTags.find( + (t) => t.value === that.tags[i].value + ); + if (pTag !== undefined) { + that.tags[i] = pTag; + } + } + } + + for (let foreignKey in manyToOne) { + if (obj[foreignKey] !== undefined) { + that[foreignKey] = this.createOrUpdate( + obj[foreignKey], + manyToOne[foreignKey][0] + ); + if (manyToOne[foreignKey][1]) { + let foreignCollection = that[foreignKey][manyToOne[foreignKey][1]]; + if (!foreignCollection.includes(that)) { + foreignCollection.push(that); + } + } + } + } + for (let collection in oneToMany) { + if (obj[collection] !== undefined) { + if (obj[collection] && obj[collection].length > 0) { + that[collection].splice(0, that[collection].length); + let len = obj[collection].length; + for (let i = 0; i < len; i++) { + let foreignObj = this.createOrUpdate( + obj[collection][i], + oneToMany[collection][0] + ); + if (!that[collection].includes(foreignObj)) { + that[collection].push(foreignObj); + } + if (oneToMany[collection][1]) { + foreignObj[oneToMany[collection][1]] = that; + } + } + } + } + } + for (let collection in manyToMany) { + if (obj[collection] !== undefined) { + if (obj[collection] && obj[collection].length > 0) { + that[collection].splice(0, that[collection].length); + let len = obj[collection].length; + for (let i = 0; i < len; i++) { + let foreignObj = this.createOrUpdate( + obj[collection][i], + manyToMany[collection][0] + ); + if (!that[collection].includes(foreignObj)) { + that[collection].push(foreignObj); + } + if (manyToMany[collection][1]) { + let foreignCollection = foreignObj[manyToMany[collection][1]]; + if (!foreignCollection.includes(that)) { + foreignCollection.push(that); + } + } + } + } + } + } + return that; + }, + get(id, constructor) { + if (this.hasOwnProperty(constructor.name)) { + let index = this[constructor.name].findIndex((o) => o.id === id); + if (index !== -1) { + return this[constructor.name][index]; + } + } + return -1; + }, + }; + this.Store.clear(); + + this.onLoad = (loading) => {}; + + this.onError = (json, xhttp) => { + if (typeof json === "string") { + console.log(xhttp); + alert( + "ERREUR INTERNE\n\nToutes nos excuses, une erreur s'est produite sur nos serveurs.\nVeuillez réessayer ou contacter un administrateur si l'erreur persiste." + ); + } else { + console.log(xhttp); + alert("ERREUR : " + json.title + "\n\n" + Message.parse(json)); + } + }; + let url = anUrl; + + let xhttp; + + this.abort = () => { + xhttp.abort(); + }; + let ajaxCall = ({ + method, + path, + headers, + onSuccess, + onError, + onProgress, + data, + json = true, + async = true, + loading = true, + } = {}) => { + let xhttp = new XMLHttpRequest(); + xhttp.onreadystatechange = () => { + if ( + xhttp.readyState === 4 && + (xhttp.status === 200 || xhttp.status === 204) + ) { + let arr = xhttp + .getAllResponseHeaders() + .trim() + .split(/[\r\n]+/); + let headersMap = {}; + arr.forEach(function (line) { + let parts = line.split(": "); + let header = parts.shift(); + let value = parts.join(": "); + headersMap[header] = value; + }); + if (onSuccess) { + let returnValue; + try { + returnValue = JSON.parse(xhttp.responseText); + } catch (e) { + returnValue = xhttp.responseText; + } + onSuccess(returnValue, headersMap); + } + if (loading) { + this.onLoad(false); + } + } else if (xhttp.readyState === 3) { + if (onProgress) { + let newResponses = xhttp.responseText.split("\ndata: "); + let response = newResponses[newResponses.length - 1]; + try { + onProgress(JSON.parse(response)); + } catch (ex) { + onProgress(response); + } + } + } else if (xhttp.readyState === 4) { + let response = xhttp.responseText; + let jsonResponse = {}; + if (onProgress) { + let newResponses = response.split("\ndata: "); + response = newResponses[newResponses.length - 1]; + } + try { + jsonResponse = JSON.parse(response); + } catch (e) { + jsonResponse = response; + } + if (onError) { + onError(jsonResponse, xhttp); + } else { + this.onError(jsonResponse, xhttp); + } + if (loading) { + this.onLoad(false); + } + } + }; + + xhttp.open(method, url + "/" + path, async); + for (let header in headers) { + xhttp.setRequestHeader(header.name, header.value); + } + xhttp.setRequestHeader("Accept-Language", locale); + if (json) { + xhttp.setRequestHeader("Content-type", "application/json"); + if (typeof data === "string") { + xhttp.send(data); + } else { + xhttp.send(JSON.stringify(decycle(data))); + } + } else { + xhttp.send(data); + } + if (loading) { + this.onLoad(true); + } + }; + + this.import = ({ data, onSuccess, onError, onProgress, loading } = {}) => { + ajaxCall({ + method: "POST", + path: "aaf/import", + data: data, + onProgress, + onSuccess, + onError: onError, + json: false, + loading: loading, + }); + }; + let parse = function (obj, className) { + if (Array.isArray(obj)) { + return obj.map((obj) => self.Store.createOrUpdate(obj, className)); + } else { + return self.Store.createOrUpdate(obj, className); + } + }; + let decycle = function (obj, root = true) { + if (!obj || typeof obj !== "object") return obj; + + if (!root && typeof obj.id !== "undefined") return { id: obj.id }; + + if (obj.constructor === Date) return obj; + + if (Array.isArray(obj)) return obj.map((el) => decycle(el, false)); + + let replica = {}; + Object.keys(obj).forEach( + (key) => (replica[key] = decycle(obj[key], false)) + ); + return replica; + }; + let EntityProcessor = function (resourcePath, className) { + this.call = ({ + method, + data = null, + path = "", + onSuccess, + onError, + onProgress, + query = {}, + parsingClassName = className, + async = true, + loading = true, + } = {}) => { + let urlParameters = Object.keys(query) + .map((key) => key + "=" + encodeURIComponent(query[key])) + .join("&"); + ajaxCall({ + method, + data, + path: + resourcePath + + path + + (urlParameters.length > 0 ? "?" + urlParameters : ""), + onSuccess: function (response) { + let result = response; + if (response && parsingClassName) { + result = parse(response, parsingClassName); + } + onSuccess ? onSuccess(result) : null; + }, + onError, + onProgress, + async, + loading, + }); + }; + + this.getAll = (params = {}) => { + params.method = "GET"; + this.call(params); + }; + this.get = (params = {}) => { + params.method = "GET"; + params.path = "/" + params.id; + this.call(params); + }; + this.remove = (params = {}) => { + params.method = "DELETE"; + params.path = "/" + params.data.id; + let onSuccess = params.onSuccess; + params.onSuccess = function () { + self.Store.remove(params.data); + onSuccess ? onSuccess() : null; + }; + this.call(params); + }; + this.create = (params = {}) => { + params.method = "POST"; + this.call(params); + }; + this.edit = (params = {}) => { + params.method = "PUT"; + params.path = "/" + params.data.id; + this.call(params); + }; + this.createOrUpdate = (params = {}) => { + if (params.data.id) { + this.edit(params); + } else { + this.create(params); + } + }; + }; + + this.Documentation = function ({ onSuccess, onError } = {}) { + ajaxCall({ + method: "GET", + path: "documentation", + onSuccess, + onError, + }); + }; + + let Listener; + if (!!window.SharedWorker) { + Listener = function (aPath, className) { + this.listen = ({ id, onMessage } = {}) => { + let sseWorker = new SharedWorker("assets/js/service/worker.js"); + let eventPath = url + "/events/" + aPath + (id ? "/" + id : ""); + sseWorker.port.postMessage(eventPath); + sseWorker.port.addEventListener( + "message", + (message) => { + let result = parse(JSON.parse(message.data.data), className); + if (onMessage) { + onMessage(result); + } + }, + false + ); + sseWorker.port.start(); + }; + }; + } else { + Listener = function (aPath, className) { + let eventPath = url + "/events/" + aPath; + let source = null; + this.listen = ({ id, onMessage } = {}) => { + source = new EventSource(eventPath + (id ? "/" + id : "")); + source.onmessage = (message) => { + let result = parse(JSON.parse(message.data), className); + if (onMessage) { + onMessage(result); + } + }; + source.onclose = () => {}; + }; + this.stop = () => { + if (source) { + source.close(); + } + }; + }; + } + + this.Categories = new EntityProcessor("categories", Category); + this.Documents = new EntityProcessor("documents", Document); + this.Debates = new EntityProcessor("debates", Debate); + this.Teams = new EntityProcessor("teams", Team); + this.Comments = new EntityProcessor("comments", Comment); + this.Institutions = new EntityProcessor("institutions", Institution); + this.Users = new EntityProcessor("users", User); + this.Notifications = new EntityProcessor("notifications", Notification); + this.CommentListener = new Listener("comments", Comment); + this.NotificationListener = new Listener("notifications", Notification); + + this.Users.getLoged = function (params = {}) { + params.method = "GET"; + params.path = "/me"; + this.call(params); + }; + this.Users.login = function (params = {}) { + params.method = "POST"; + params.path = "/login"; + params.parsingClassName = false; + let onSuccess = params.onSuccess; + params.onSuccess = (token) => { + document.cookie = + "Authorization=" + + token + + "; maxAge=" + + (params.data.rememberMe ? 360 * 24 * 60 * 60 : -1) + + "; path=/"; + document.location.reload(true); + onSuccess ? onSuccess() : null; + }; + this.call(params); + }; + this.Users.logout = function (params = {}) { + params.method = "POST"; + params.path = "/logout"; + params.parsingClassName = false; + let onSuccess = params.onSuccess; + params.onSuccess = () => { + document.cookie = + "Authorization=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;"; + document.location.replace(""); + onSuccess ? onSuccess() : null; + }; + this.call(params); + }; + this.Users.passwd = function (params = {}) { + params.method = "PUT"; + params.path = "/passwd"; + this.call(params); + }; + this.Users.activate = function (params = {}) { + params.method = "GET"; + params.path = "/activate"; + this.call(params); + }; + this.Users.resetPasswd = function (params = {}) { + params.method = "POST"; + params.path = "/resetPasswd"; + this.call(params); + }; + this.Users.permanentRemove = function (params = {}) { + params.method = "DELETE"; + params.path = "/" + params.data.id + "/permanent/"; + this.call(params); + }; + this.Users.exists = function (params = {}) { + params.method = "GET"; + params.path = "/test"; + params.query = { identifier: params.data }; + params.parsingClassName = false; + this.call(params); + }; + this.Documents.duplicate = function (params = {}) { + params.method = "POST"; + params.path = "/" + params.id + "/duplicate"; + this.call(params); + }; + this.Debates.addComment = function (params = {}) { + params.method = "POST"; + params.path = "/" + params.id + "/comments"; + params.parsingClassName = Comment; + this.call(params); + }; + this.Debates.addTeam = function (params = {}) { + params.method = "PUT"; + params.path = "/" + params.id + "/teams/" + params.data.id; + let onSuccess = params.onSuccess; + params.onSuccess = function () { + self.Store.get(params.id, Debate).teams.push(params.data); + params.data.debates.push(self.Store.get(params.id, Debate)); + onSuccess ? onSuccess() : null; + }; + params.parsingClassName = Team; + this.call(params); + }; + this.Debates.removeTeam = function (params = {}) { + params.method = "DELETE"; + params.path = "/" + params.id + "/teams/" + params.data.id; + let onSuccess = params.onSuccess; + params.onSuccess = function () { + self.Store.get(params.id, Debate).teams.remove(params.data); + onSuccess ? onSuccess() : null; + }; + this.call(params); + }; + this.Debates.addGuest = function (params = {}) { + params.method = "PUT"; + params.path = "/" + params.id + "/users/" + params.data.id; + let onSuccess = params.onSuccess; + params.onSuccess = function () { + self.Store.get(params.id, Debate).guests.push(params.data); + params.data.invitedDebates.push(self.Store.get(params.id, Debate)); + onSuccess ? onSuccess() : null; + }; + params.parsingClassName = User; + this.call(params); + }; + this.Debates.removeGuest = function (params = {}) { + params.method = "DELETE"; + params.path = "/" + params.id + "/users/" + params.data.id; + let onSuccess = params.onSuccess; + params.onSuccess = function () { + self.Store.get(params.id, Debate).guests.remove(params.data); + onSuccess ? onSuccess() : null; + }; + this.call(params); + }; + this.Debates.getScraps = function (params = {}) { + params.method = "GET"; + params.path = "/" + params.id + "/scraps"; + params.parsingClassName = false; + this.call(params); + }; + this.Debates.getTheme = function (params = {}) { + params.method = "GET"; + params.path = "/" + params.id + "/theme"; + params.parsingClassName = false; + this.call(params); + }; + this.Teams.addUser = function (params = {}) { + params.method = "PUT"; + params.path = "/" + params.id + "/users/" + params.data.id; + let onSuccess = params.onSuccess; + params.onSuccess = function () { + self.Store.get(params.id, Team).users.push(params.data); + params.data.teams.push(self.Store.get(params.id, Team)); + onSuccess ? onSuccess() : null; + }; + params.parsingClassName = User; + this.call(params); + }; + this.Teams.removeUser = function (params = {}) { + params.method = "DELETE"; + params.path = "/" + params.id + "/users/" + params.data.id; + let onSuccess = params.onSuccess; + params.onSuccess = function () { + self.Store.get(params.id, Team).users.remove(params.data); + onSuccess ? onSuccess() : null; + }; + this.call(params); + }; + this.Comments.getScalar = function (params = {}) { + params.method = "POST"; + params.path = "/scalar"; + params.parsingClassName = false; + this.call(params); + }; + this.Comments.updateTags = function (params = {}) { + params.method = "PUT"; + params.path = "/" + params.id + "/updateTags"; + params.parsingClassName = false; + this.call(params); + }; + this.Comments.updateAllTags = function (params = {}) { + params.method = "PUT"; + params.path = "/updateTags"; + params.parsingClassName = false; + this.call(params); + }; + + this.Notifications.readAll = function (params = {}) { + params.method = "PUT"; + this.call(params); + }; +}; diff --git a/src/main/webapp/assets/js/service/aren.min.js b/src/main/webapp/assets/js/service/aren.min.js new file mode 100644 index 0000000..f4eaf28 --- /dev/null +++ b/src/main/webapp/assets/js/service/aren.min.js @@ -0,0 +1,28 @@ +const Authority={DELETED:"DELETED",GUEST:"GUEST",USER:"USER",MODO:"MODO",ADMIN:"ADMIN",SUPERADMIN:"SUPERADMIN",_value:{DELETED:-1,GUEST:0,USER:1,MODO:2,ADMIN:3,SUPERADMIN:4}},Opinion={FOR:"FOR",NEUTRAL:"NEUTRAL",AGAINST:"AGAINST"},Hypostase=["EXPLANATION LAW PRINCIPLE THEORY BELIEF CONJECTURE HYPOTHESIS AXIOM DEFINITION".split(" "),"QUALITATIVE VARIABLE OBJECT EVENT PHENOMENON DATA MODE DOMAIN".split(" "),"QUANTITATIVE VARIATION VARIANCE APPROXIMATION VALUE CLUE INVARIANT DIMENSION".split(" "),"STRUCTURAL STRUCTURE METHOD FORMALISM CLASSIFICATION PARADIGME".split(" "), +["DIFFICULTY","APORIA","PARADOXE","PROBLEM"]];function Tag(c={}){c.constructor===String?(c=c.replace(/[^A-Za-z\u00c0-\u00d6\u00d8-\u00f6\u00f8-\u00ff0-9 \-']/g,"").trim(),c=c.split("|"),this.power=c[1]?1*c[1]:0,c[0]=c[0].trim(),"-"===c[0][0]?(this.negative=!0,this.value=c[0].substring(1).trim()):(this.negative=!1,this.value=c[0])):(this.value=c.value,this.negative=c.negative,this.power=c.power)}function Message(c={}){this.title=c.title;this.message=c.message;this.details=c.details} +function Entity(c={}){for(let n in this.attrs)this[n]=c[n]?c[n]:void 0;for(let c in this.manyToOne)this[c]=void 0;for(let c in this.oneToMany)this[c]=[];for(let c in this.manyToMany)this[c]=[]}function Category(c={}){Entity.call(this,c)}Category.prototype.attrs={id:Number,name:String,picture:String,debatesCount:Number,lastCommentDate:Date};Category.prototype.oneToMany={documents:[Document,"category"]};Category.prototype.debates=function(){return this.documents.map(c=>c.debates).flat()}; +function Document(c={}){Entity.call(this,c)}Document.prototype.attrs={id:Number,created:Date,name:String,author:String,content:String,debatesCount:Number,lastCommentDate:Date};Document.prototype.oneToMany={debates:[Debate,"document"]};Document.prototype.manyToOne={category:[Category,"documents"]};function Debate(c={}){Entity.call(this,c)} +Debate.prototype.attrs={id:Number,created:Date,name:String,closed:Date,active:Boolean,commentsCount:Number,commentsCountFor:Number,commentsCountAgainst:Number,lastCommentDate:Date,withHypostases:Boolean,reformulationCheck:Boolean,idfixLink:Boolean,openPublic:Boolean};Debate.prototype.oneToMany={comments:[Comment,"debate"]};Debate.prototype.manyToOne={owner:[User,"createdDebates"],document:[Document,"debates"]};Debate.prototype.manyToMany={teams:[Team,"debates"],guests:[User,"invitedDebates"]}; +Debate.prototype.deepSortComments=function(c){this.comments.sort(c);let n=this.comments.length;for(let e=0;e=Authority._value[c]}; +ApiService=function(c,n){let e=this;this.Store={clear(){this.Category=[];this.Document=[];this.Debate=[];this.Comment=[];this.Institution=[];this.Notification=[];this.Team=[];this.User=[]},detach(a){this[a.constructor.name].remove(a)},remove(a){var b=a.manyToOne,d=a.oneToMany;let c=a.manyToMany;for(var f in b)a[f]&&a[f][b[f][1]].remove(a);for(var g in d)if(a[g])for(b=a[g].length,f=0;fb.value===d.tags[a].value),void 0!==c&&(d.tags[a]=c)}for(var l in f)void 0!==a[l]&&(d[l]=this.createOrUpdate(a[l],f[l][0]),f[l][1]&&(b=d[l][f[l][1]],b.includes(d)||b.push(d)));for(var k in g)if(void 0!==a[k]&&a[k]&&0b.id===a);if(-1!==d)return this[b.name][d]}return-1}};this.Store.clear();this.onLoad=a=>{};this.onError=(a,b)=>{"string"===typeof a?(console.log(b),alert("ERREUR INTERNE\n\nToutes nos excuses, une erreur s'est produite sur nos serveurs.\nVeuillez r\u00e9essayer ou contacter un administrateur si l'erreur persiste.")): +(console.log(b),alert("ERREUR : "+a.title+"\n\n"+Message.parse(a)))};this.abort=()=>{(void 0).abort()};let r=({method:a,path:b,headers:d,onSuccess:e,onError:f,onProgress:g,data:p,json:l=!0,async:k=!0,loading:m=!0}={})=>{let h=new XMLHttpRequest;h.onreadystatechange=()=>{if(4===h.readyState&&(200===h.status||204===h.status)){let b={};h.getAllResponseHeaders().trim().split(/[\r\n]+/).forEach(function(a){var d=a.split(": ");a=d.shift();d=d.join(": ");b[a]=d});if(e){try{var a=JSON.parse(h.responseText)}catch(w){a= +h.responseText}e(a,b)}if(m)this.onLoad(!1)}else if(3===h.readyState){if(g){a=h.responseText.split("\ndata: ");a=a[a.length-1];try{g(JSON.parse(a))}catch(v){g(a)}}}else if(4===h.readyState){var b=h.responseText;a={};g&&(b=b.split("\ndata: "),b=b[b.length-1]);try{a=JSON.parse(b)}catch(v){a=b}if(f)f(a,h);else this.onError(a,h);if(m)this.onLoad(!1)}};h.open(a,c+"/"+b,k);for(let a in d)h.setRequestHeader(a.name,a.value);h.setRequestHeader("Accept-Language",n);l?(h.setRequestHeader("Content-type","application/json"), +"string"===typeof p?h.send(p):h.send(JSON.stringify(q(p)))):h.send(p);if(m)this.onLoad(!0)};this.import=({data:a,onSuccess:b,onError:d,onProgress:c,loading:f}={})=>{r({method:"POST",path:"aaf/import",data:a,onProgress:c,onSuccess:b,onError:d,json:!1,loading:f})};let t=function(a,b){return Array.isArray(a)?a.map(a=>e.Store.createOrUpdate(a,b)):e.Store.createOrUpdate(a,b)},q=function(a,b=!0){if(!a||"object"!==typeof a)return a;if(!b&&"undefined"!==typeof a.id)return{id:a.id};if(a.constructor===Date)return a; +if(Array.isArray(a))return a.map(a=>q(a,!1));let d={};Object.keys(a).forEach(b=>d[b]=q(a[b],!1));return d},m=function(a,b){this.call=({method:d,data:c=null,path:f="",onSuccess:g,onError:e,onProgress:l,query:k={},parsingClassName:m=b,async:h=!0,loading:n=!0}={})=>{let b=Object.keys(k).map(a=>a+"="+encodeURIComponent(k[a])).join("&");r({method:d,data:c,path:a+f+(0{a.method="GET";this.call(a)};this.get=(a={})=>{a.method="GET";a.path="/"+a.id;this.call(a)};this.remove=(a={})=>{a.method="DELETE";a.path="/"+a.data.id;let b=a.onSuccess;a.onSuccess=function(){e.Store.remove(a.data);b?b():null};this.call(a)};this.create=(a={})=>{a.method="POST";this.call(a)};this.edit=(a={})=>{a.method="PUT";a.path="/"+a.data.id;this.call(a)};this.createOrUpdate=(a={})=>{a.data.id?this.edit(a):this.create(a)}};this.Documentation=function({onSuccess:a,onError:b}={}){r({method:"GET", +path:"documentation",onSuccess:a,onError:b})};let u;u=window.SharedWorker?function(a,b){this.listen=({id:d,onMessage:e}={})=>{let f=new SharedWorker("assets/js/service/worker.js");f.port.postMessage(c+"/events/"+a+(d?"/"+d:""));f.port.addEventListener("message",a=>{a=t(JSON.parse(a.data.data),b);e&&e(a)},!1);f.port.start()}}:function(a,b){let d=c+"/events/"+a,e=null;this.listen=({id:a,onMessage:c}={})=>{e=new EventSource(d+(a?"/"+a:""));e.onmessage=a=>{a=t(JSON.parse(a.data),b);c&&c(a)};e.onclose= +()=>{}};this.stop=()=>{e&&e.close()}};this.Categories=new m("categories",Category);this.Documents=new m("documents",Document);this.Debates=new m("debates",Debate);this.Teams=new m("teams",Team);this.Comments=new m("comments",Comment);this.Institutions=new m("institutions",Institution);this.Users=new m("users",User);this.Notifications=new m("notifications",Notification);this.CommentListener=new u("comments",Comment);this.NotificationListener=new u("notifications",Notification);this.Users.getLoged= +function(a={}){a.method="GET";a.path="/me";this.call(a)};this.Users.login=function(a={}){a.method="POST";a.path="/login";a.parsingClassName=!1;let b=a.onSuccess;a.onSuccess=c=>{document.cookie="Authorization="+c+"; maxAge="+(a.data.rememberMe?31104E3:-1)+"; path=/";document.location.reload(!0);b?b():null};this.call(a)};this.Users.logout=function(a={}){a.method="POST";a.path="/logout";a.parsingClassName=!1;let b=a.onSuccess;a.onSuccess=()=>{document.cookie="Authorization=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;"; +document.location.replace("");b?b():null};this.call(a)};this.Users.passwd=function(a={}){a.method="PUT";a.path="/passwd";this.call(a)};this.Users.activate=function(a={}){a.method="GET";a.path="/activate";this.call(a)};this.Users.resetPasswd=function(a={}){a.method="POST";a.path="/resetPasswd";this.call(a)};this.Users.permanentRemove=function(a={}){a.method="DELETE";a.path="/"+a.data.id+"/permanent/";this.call(a)};this.Users.exists=function(a={}){a.method="GET";a.path="/test";a.query={identifier:a.data}; +a.parsingClassName=!1;this.call(a)};this.Documents.duplicate=function(a={}){a.method="POST";a.path="/"+a.id+"/duplicate";this.call(a)};this.Debates.addComment=function(a={}){a.method="POST";a.path="/"+a.id+"/comments";a.parsingClassName=Comment;this.call(a)};this.Debates.addTeam=function(a={}){a.method="PUT";a.path="/"+a.id+"/teams/"+a.data.id;let b=a.onSuccess;a.onSuccess=function(){e.Store.get(a.id,Debate).teams.push(a.data);a.data.debates.push(e.Store.get(a.id,Debate));b?b():null};a.parsingClassName= +Team;this.call(a)};this.Debates.removeTeam=function(a={}){a.method="DELETE";a.path="/"+a.id+"/teams/"+a.data.id;let b=a.onSuccess;a.onSuccess=function(){e.Store.get(a.id,Debate).teams.remove(a.data);b?b():null};this.call(a)};this.Debates.addGuest=function(a={}){a.method="PUT";a.path="/"+a.id+"/users/"+a.data.id;let b=a.onSuccess;a.onSuccess=function(){e.Store.get(a.id,Debate).guests.push(a.data);a.data.invitedDebates.push(e.Store.get(a.id,Debate));b?b():null};a.parsingClassName=User;this.call(a)}; +this.Debates.removeGuest=function(a={}){a.method="DELETE";a.path="/"+a.id+"/users/"+a.data.id;let b=a.onSuccess;a.onSuccess=function(){e.Store.get(a.id,Debate).guests.remove(a.data);b?b():null};this.call(a)};this.Debates.getScraps=function(a={}){a.method="GET";a.path="/"+a.id+"/scraps";a.parsingClassName=!1;this.call(a)};this.Debates.getTheme=function(a={}){a.method="GET";a.path="/"+a.id+"/theme";a.parsingClassName=!1;this.call(a)};this.Teams.addUser=function(a={}){a.method="PUT";a.path="/"+a.id+ +"/users/"+a.data.id;let b=a.onSuccess;a.onSuccess=function(){e.Store.get(a.id,Team).users.push(a.data);a.data.teams.push(e.Store.get(a.id,Team));b?b():null};a.parsingClassName=User;this.call(a)};this.Teams.removeUser=function(a={}){a.method="DELETE";a.path="/"+a.id+"/users/"+a.data.id;let b=a.onSuccess;a.onSuccess=function(){e.Store.get(a.id,Team).users.remove(a.data);b?b():null};this.call(a)};this.Comments.getScalar=function(a={}){a.method="POST";a.path="/scalar";a.parsingClassName=!1;this.call(a)}; +this.Comments.updateTags=function(a={}){a.method="PUT";a.path="/"+a.id+"/updateTags";a.parsingClassName=!1;this.call(a)};this.Comments.updateAllTags=function(a={}){a.method="PUT";a.path="/updateTags";a.parsingClassName=!1;this.call(a)};this.Notifications.readAll=function(a={}){a.method="PUT";this.call(a)}}; \ No newline at end of file diff --git a/src/main/webapp/assets/js/service/i18n.js b/src/main/webapp/assets/js/service/i18n.js new file mode 100644 index 0000000..21ac9de --- /dev/null +++ b/src/main/webapp/assets/js/service/i18n.js @@ -0,0 +1,330 @@ +const dateTimeFormats = { + 'fr-FR': { + short: { + year: 'numeric', month: 'short', day: 'numeric' + }, + long: { + year: 'numeric', month: 'short', day: 'numeric', + weekday: 'short', hour: 'numeric', minute: 'numeric' + } + }, +} + +const messages = { + 'fr-FR': { + password_forgotten: "Mot de passe oublié", + with_dots: "Avec...", + on_the_doc: "Sur le document...", + recapitulative: "Récapitulatif", + by: "Par", + proposed_by: "Proposé par", + 'with': "Avec", + print: "Imprimer", + connection: "Se connecter à AREN", + connect: "Se connecter", + cas_connection: "Connexion CAS", + cancel: "Annuler", + validate: "Valider", + close: "Fermer", + yes: "Oui", + no: "Non", + i_am: "Je suis", + debate: "Débat", + debate_tree: "Arbre du débat", + comment_repartition: "Répartition des arguments", + debate_sunburst: "Topologie", + odt_export: "Export du débat", + nb_comment: "{count} argument|{count} arguments", + nb_letter: "{count} lettre|{count} lettres", + by_comment_count: "Par nombre d'arguments", + by_letter_count: "Par nombre de lettres", + by_user: "Par utilisateur⋅rice", + by_opinion: "Par opinion", + display_labels: "Afficher les légendes", + display_arguments: "Afficher les arguments", + tags_edition: "Édition des mots-clefs", + tags: "Mots-clefs", + proposed_tags: "Mots-clefs proposés", + no_tags_yet: "En recherche de proposition", + category_edition: "Édition de catégorie", + category_creation: "Création de catégorie", + team_edition: "Édition de groupe", + team_creation: "Création de groupe", + image: "Image", + user_creation: "Création d'un⋅e untilisateur⋅rice", + username: "Pseudonyme", + email: "E-mail", + first_name: "Prénom", + last_name: "Nom de famille", + password: "Mot de passe", + remember_me: "Se souvenir de moi", + old_password: "Mot de passe actuel", + new_password: "Nouveau mot de passe", + password_check: "Vérification du mot de passe", + change_password: "Changer de mot de passe", + theme: "Thème", + scraps: "Selections", + display: "Afficher", + sort_by: "Trier par", + date: "Date", + position: "Position", + creation_success: "Création réussie", + import_success: "Importation réussie", + update_success: "Mise à jour réussie", + display_team: "Afficher le groupe", + new_team: "Nouveau groupe", + new_user: "Nouvel⋅le utilisateur⋅rice", + add_user: "Ajouter un⋅e utilisateur⋅rice", + team_managment: "Gestion des groupes", + user_managment: "Gestion des utilisateur⋅rices", + user_created: "Utilisateur⋅rice enregistré⋅e", + user_activated: "Utilisateur⋅rice activé⋅e", + anonymous_user: "Anonyme", + save: "Sauvegarder", + modify: "Modifier", + nb_users: "Aucun utilisateur⋅rice|{count} utilisateur⋅rice|{count} utilisateur⋅rice⋅s", + nb_teams: "Aucun groupe|{count} groupe|{count} groupes", + nb_debates: "Aucun débat|{count} débat|{count} débats", + nb_comments: "Aucun argument|{count} argument|{count} arguments", + last_post_the: "Dernier post le", + no_post: "Aucun post", + category: "Catégorie", + title: "Titre", + author: "Auteur⋅e", + restitution: "Restitution", + posts: "Posts", + last_post: "Dernier post", + document: "Document", + teams: "Groupes", + moderators: "Modérateur⋅rice.s", + authority: "Status", + users: "Utilisateur⋅rice⋅s", + guests: "Invité⋅e⋅s", + debates: "Débats", + new_debate: "Nouveau débat", + invite_in_debate: "Inviter au débat", + SUPERADMIN: "Super administrateur⋅rice", + SUPERADMIN: "Root", + ADMIN: "Administrateur⋅rice", + MODO: "Modérateur⋅rice", + USER: "Utilisateur⋅rice", + GUEST: "Invité⋅e", + DELETED: "Supprimé", + report: "Signalement", + select_all: "Selectionner tout", + unselect_all: "Déselectionner tout", + advanced_options: "Options avancées", + public_debate: "Débat public", + reformulation_assist: "Assistant de reformulation", + idefix_link: "Lien IDEFIX", + with_hypostases: "Avec hypostase", + without_institution: "Sans établissement", + running: "En cours...", + import: "Importer", + not_connected: "Vous n'êtes pas connecté⋅e", + tutorials: "Tutoriels", + argue: "Argumenter", + aaf_import: "Import AAF", + update_tags: "Mise à jour des tags", + start: "Lancer", + helper: { + welcome: "Bienvenue sur la plateforme AREN (Argumentation & Numérique)
Il s'agit d’un espace numérique de débat pour pratiquer l’argumentation.
Prendre en compte les arguments des autres et justifier son opinion pour mieux argumenter et exercer son esprit critique !", + creating_user: "Création en cour, veuillez patienter...", + not_connected: "Vous devez être inscrit⋅e et connecté⋅e pour réaliser cette action", + mark_as_read: "Marquer comme lue", + mark_as_unread: "Marquer comme non lue", + cas_login: "Connectez-vous via le system CAS de l'ENT", + add_document: "Ajouter un document", + edit_category: "Modifier la catégorie", + remove_category: "Supprimer la catégorie", + cannot_remove_category: "Vous ne pouvez pas supprimer une catégorie contenant un document", + copy_document: "Dupliquer le document", + remove_debate: "Supprimer le débat", + cannot_remove_debate: "Vous ne pouvez pas supprimer un débat contenant des arguments", + remove_document: "Supprimer le document", + cannot_edit_document: "Vous ne pouvez pas modifier un document contenant un débat", + cannot_remove_document: "Vous ne pouvez pas supprimer un document contenant un débat", + edit_team: "Modifier le groupe", + cannot_edit_institution_team: "Vous ne pouvez pas modifier un groupe appartenant à une institution", + remove_team: "Supprimer le groupe", + cannot_remove_institution_team: "Vous ne pouvez pas supprimer un groupe appartenant à une institution", + cannot_remove_team: "Vous ne pouvez pas supprimer un groupe lié à un débat", + add_user_in_team: "Ajouter l'utilisateur⋅rice au groupe", + remove_user_from_team: "Supprimer l'utilisateur⋅rice du groupe", + cannot_add_institution_user: "Vous ne pouvez pas ajouter un utilisateur⋅rice d'un groupe institutionel", + remove_user: "Supprimer l'utilisateur⋅rice", + remove_permanent_user: "Supprimer définitivement l'utilisateur⋅rice", + cannot_remove_institution_user: "Vous ne pouvez pas supprimer un⋅¢ utilisateur⋅rice d'un groupe institutionel", + cannot_create_institution_user: "Vous ne pouvez pas créer un⋅e utilisateur⋅rice dans un établissemnt", + cannot_create_institution_team: "Vous ne pouvez pas ajouter un groupe dans un établissement", + user_already_in_team: "L'utilisateur⋅rice fait déjà partie du groupe", + add_user_to_debate: "Ajouter l'utilisateur⋅rice au débat", + user_already_in_debate: "L'utilisateur⋅rice fait déjà partie du débat", + add_team_to_debate: "Ajouter le groupe au débat", + team_already_in_debate: "Le groupe fait déjà parti du débat", + used_for_connection: "Utilisé pour la connexion", + not_an_email: "Ce n'est pas une adresse e-mail", + different_passwords: "Mots de passes différents", + title_placeholder: "Un titre pertinent", + image_url_placeholder: "L'url d'une image", + restitution_display_details: "Survolez une tranche du graphique pour afficher ses données", + debate_created: "Votre débat a bien été créé sur le document '{documentName}' de la catégorie '{categoryName}'
Voulez-vous y accéder ?", + delete_category: "Vous êtes sur le point de supprimer la catégorie '{categoryName}'", + delete_document: "Vous êtes sur le point de supprimer le document '{documentName}'", + delete_debate: "Vous êtes sur le point de supprimer le débat '{debateName}'", + delete_team: "Vous êtes sur le point de supprimer le groupe '{teamName}'", + delete_user: "Vous êtes sur le point de supprimer l'utilisateur⋅rice '{userName}'", + delete_permanent_user: "Vous êtes sur le point de définitivement supprimer l'utilisateur⋅rice '{userName}'", + delete_permanent_user_warning: "Cette action est irréversible
Si l'utilisateur⋅rice a déja posté des arguments, cette action échouera.
Êtes vous sûr⋅e de vouloir continuer ?", + do_continue: "Êtes vous sûr⋅e de vouloir continuer ?", + password_changed: "Mot de passe mis à jour avec succès", + password_changed_loged_out: "Veuillez vous reconnecter avec votre nouveau mot de passe", + user_created_email: "Un e-mail à été envoyé à l'adresse saisie, cliquez sur le lien fourni pour activer votre compte", + user_activated: "Votre adresse e-mail a bien été vérifiée, vous pouvez fermer cette fenêtre et vous connecter", + username_exists: "Nom d'utilisateur⋅rice déjà existant", + email_exists: "Mail déjà existant", + tag_explanations: "Cliquez sur les mots-clefs cohérents.", + tag_input_explanations: "Presser Entrée pour valider", + report_comment: "Signaler l'argument", + report_details: "Vous vous apprétez à signaler un message à la modération.

Un message doit être signalé pour les raisons suivantes :

Êtes vous sûr⋅e de vouloir continuer ?", + export: "Votre téléchargement va débuter... Si rien ne se passe cliquez ici", + password_forgotten: "

Vous avez oubié votre mot de passe ? Pas de problème !

Saisissez votre adresse e-mail ou votre pseudonyme.

", + password_forgotten_email: "

Si vous êtes enregistré⋅e, un e-mail expliquant la procédure de réinitialisation sera envoyé à l'adresse associée à votre compte.

Vérifiez votre boite mail.

", + theme_not_found: "Aucun résultat pour ce thème", + theme_already_set: "Thème déjà saisi", + public_debate: "Le débat sera accessible par n'importe quel utilisateur⋅ice, même non coonnecté⋅e", + reformulation_assist: "Affiche un smiley lors de la reformulation", + idefix_link: "Ajoute des tags aux documents et arguments pour les utiliser avec IDFIX", + with_hypostases: "Propose une selection d'hypostase pour les arguments", + aaf_import_success: "Les données AAF ont bien été importées, vous pouvez fermer cette fenêtre.", + update_tags: "Veuillez patienter, ce processus peut-être très long.
Ne fermez pas cette fenêtre", + tag_update_success: "La mise à jour des tags est un succès, vous pouvez fermer cette fenêtre." + }, + notification: { + team_added_to_debate: "Votre groupe {teamName} participe au débat {debateName}.", + invited_to_debate: "Vous êtes invité⋅e sur le débat {debateName}.", + comment_answered: "{firstName} {lastName} à répondu à votre argument.", + comment_moderated: "Votre argument à été modéré sur le débat {debateName}.", + comment_signaled: "Votre argument à été signalé sur le débat {debateName}." + }, + error: { + 'Insertion error': "Erreur d'enregistrement", + 'HTTP 404 Not Found': "HTTP 404 non trouvé", + 'Resource not found': "Resource non trouvée", + 'Authentication error': "Erreur d'authentification", + "Access denied": "Accès refusé", + "Invalid token": "Erreur d'authentification", + permission_missing: "Vous n'avez pas les droits", + invalid_token: "Authentification invalide
Veuillez vous reconnecter et réessayer", + unmutable_object: "Impossible de supprimer l'objet", + bad_credentials: "Identifiants incorrects", + duplicate_key: "La clef {keyName} avec la valeur {keyValue} existe déjà.", + mandatory_property: "La valeur {propertyName} est nécessaire.", + internal: "ERREUR INTERNE", + expired_token: "Jeton d'authentification expiré", + internal_message: "

Toutes nos excuses, une erreur s'est produite sur nos serveurs.

Veuillez réessayer ou contacter un administrateur⋅trice si l'erreur persiste.

", + aaf_import: "

Erreur lors de l'import AAF.

Il est probable que votre fichier soit corompu ou n'entre pas dans les standard de l'application.

", + tag_update_success: "

Erreur lors de la mise à jour des tags.

Contacter un développeur.

" + }, + menu: { + open: "Ouvrir un débat", + users: "Utilisateur⋅rice⋅s", + teams: "Groupes", + documents: "Documents", + my_debates: "Mes débats", + public_debates: "Débats publics", + logout: "Déconnection", + login: "Se connecter", + signin: "S'enregistrer" + }, + comment: { + add_argument: "Ajouter un argument", + reformulation: "Reformulation", + argumentation: "Argumentation", + against: "Plutôt pas d'accord", + for : "Plutôt d'accord", + neutral: "Pas compris", + is_argument: "Il s'agit d'un argument", + is_opinion: "Il s'agit d'une opinion", + opinion: "Opinion", + nb_answer: " |{count} réponse|{count} réponses", + select_hypostases: "Selectionnez une ou plusieurs hypostases dans la liste", + expert: "Expert" + }, + argumentation_check: { + waiting: "Attente de saisie", + loading: "Analyse en cours", + off_topic: "Reformulation hors sujet", + close: "Reformulation un peu éloignée", + nice: "Belle reformulation !", + identical: "Reformulation identique !" + }, + hypostase: { + qualitative: "Qualitatif", + quantitative: "Quantitatif", + structural: "Structurel", + difficulty: "Difficulté", + explanation: "Explicatif", + variance: "Variance", + mode: "Mode", + axiom: "Axiome", + hypothesis: "Hypothèse", + principle: "Principe", + classification: "Classification", + variation: "Variation", + value: "Valeur", + definition: "Définition", + paradigme: "Paradigme", + paradoxe: "Paradoxe", + clue: "Indice", + conjecture: "Conjecture", + problem: "Problème", + domain: "Domaine", + formalism: "Formalisme", + data: "Donnée", + belief: "Croyance", + theory: "Théorie", + law: "Loi", + aporia: "Aporie", + variable: "Variable", + dimension: "Dimension", + structure: "Structure", + object: "Objet", + approximation: "Approximation", + phenomenon: "Phénomène", + event: "Évènement", + invariant: "Invariant", + method: "Méthode" + }, + documentation: { + help: "

Aide

Cliquez sur la flèche pour passer à l'aide suivante, ou survolez les éléments qui vous questionnent.

", + user_panel: "

Panneau d'utilisateur⋅ice

Vous permet de changer de mot de passe et de vous déconnecter

", + notification_panel: "

Restez informé des débats auxquels vous participez.

Vous recevrez une notification lorsqu'une réponse est postée à un de vos arguments et lorsque vous avez été invité⋅e à un nouveau débat.

", + create_debate_with: "

Débatre avec

Sélectionnez les personnes et groupes qui pouront participer au débat. Si rien n'est sélectioné le débat sera public, accessible à tou⋅te⋅s

", + create_debate_document: "

Débatre sur

Sélectionnez le document sur lequel vous désirez porter le débat

", + create_debate_recap: "

Récapitulatif

Vérifiez les informations saisies et selectionez des paramètres avancés

", + debate_display: "

Informations supplémentaires

Sélectionnez Document pour afficher le document à débattre.
Sélectionnez Thème pour retrouver les arguments en lien avec une thématique donnée.
Sélectionnez Sélections pour afficher les parties de texte les plus argumentées.

", + debate_sort: "

Tri des arguments

Triez les arguments par date de rédaction ou par position dans le document.

", + debate_document: "

Document à débattre

Ici s'affiche le texte à débattre, lisez-le attentivement avant de proposer des arguments.

Sélectionnez une partie du texte sur laquelle vous souhaitez intervenir, une icône apparaîtra pour vous permettre d'argumenter.

Vous êtes sur une plateforme dédiée au débat, n'hésitez pas à défendre votre opinion avec des arguments : s’appuyer sur des données, utiliser des connaissances, donner des exemples, préciser vos sources, etc.

", + debate_bulets: "

Puces d'arguments

Les puces indiquent les sélections du texte sur lesquelles des arguments ont été produits. Les couleurs permettent de savoir si les arguments sont pour ou contre la sélection.

Au survol, la partie argumentée est mise en surbrillance.
Au clic, l'argument est sélectionné dans le panneau de droite.

", + debate_themes: "

Thèmes du débat

Saisissez un mot ou un groupe de mot définissant un thème et pressez Entrée

pour valier. Les argument savec le thème saisis seront alors calculé et mis en lien avec celui-ci.

Vous pouvez supprimer un thème an cliquant sur delete_forever

", + debate_scraps: "

Textes les plus selectioné

Voici la liste des portions de texte du document les plus sélectionnées pour argumenter. Chaque seletion est relier aux arguments qui la contienne.

", + debate_spaghettis: "

Spaghettis

" + }, + footer: { + collaborators: "Partenaires", + useful_links: "Liens utiles", + contact: "Contact", + about: "À propos", + contribute: "Contribuer sur GitHub", + } + } +} + + +const i18n = new VueI18n({ + locale: 'fr-FR', + fallbackLocale: 'fr-FR', + messages, + dateTimeFormats +}) \ No newline at end of file diff --git a/src/main/webapp/assets/js/service/i18n.min.js b/src/main/webapp/assets/js/service/i18n.min.js new file mode 100644 index 0000000..b9725cd --- /dev/null +++ b/src/main/webapp/assets/js/service/i18n.min.js @@ -0,0 +1,31 @@ +const dateTimeFormats={"fr-FR":{short:{year:"numeric",month:"short",day:"numeric"},long:{year:"numeric",month:"short",day:"numeric",weekday:"short",hour:"numeric",minute:"numeric"}}}; +const messages={"fr-FR":{password_forgotten:"Mot de passe oubli\u00e9",with_dots:"Avec...",on_the_doc:"Sur le document...",recapitulative:"R\u00e9capitulatif",by:"Par",proposed_by:"Propos\u00e9 par","with":"Avec",print:"Imprimer",connection:"Se connecter \u00e0 AREN",connect:"Se connecter",cas_connection:"Connexion CAS",cancel:"Annuler",validate:"Valider",close:"Fermer",yes:"Oui",no:"Non",i_am:"Je suis",debate:"D\u00e9bat",debate_tree:"Arbre du d\u00e9bat",comment_repartition:"R\u00e9partition des arguments", +debate_sunburst:"Topologie",odt_export:"Export du d\u00e9bat",nb_comment:"{count} argument|{count} arguments",nb_letter:"{count} lettre|{count} lettres",by_comment_count:"Par nombre d'arguments",by_letter_count:"Par nombre de lettres",by_user:"Par utilisateur\u22c5rice",by_opinion:"Par opinion",display_labels:"Afficher les l\u00e9gendes",display_arguments:"Afficher les arguments",tags_edition:"\u00c9dition des mots-clefs",tags:"Mots-clefs",proposed_tags:"Mots-clefs propos\u00e9s",no_tags_yet:"En recherche de proposition", +category_edition:"\u00c9dition de cat\u00e9gorie",category_creation:"Cr\u00e9ation de cat\u00e9gorie",team_edition:"\u00c9dition de groupe",team_creation:"Cr\u00e9ation de groupe",image:"Image",user_creation:"Cr\u00e9ation d'un\u22c5e untilisateur\u22c5rice",username:"Pseudonyme",email:"E-mail",first_name:"Pr\u00e9nom",last_name:"Nom de famille",password:"Mot de passe",remember_me:"Se souvenir de moi",old_password:"Mot de passe actuel",new_password:"Nouveau mot de passe",password_check:"V\u00e9rification du mot de passe", +change_password:"Changer de mot de passe",theme:"Th\u00e8me",scraps:"Selections",display:"Afficher",sort_by:"Trier par",date:"Date",position:"Position",creation_success:"Cr\u00e9ation r\u00e9ussie",import_success:"Importation r\u00e9ussie",update_success:"Mise \u00e0 jour r\u00e9ussie",display_team:"Afficher le groupe",new_team:"Nouveau groupe",new_user:"Nouvel\u22c5le utilisateur\u22c5rice",add_user:"Ajouter un\u22c5e utilisateur\u22c5rice",team_managment:"Gestion des groupes",user_managment:"Gestion des utilisateur\u22c5rices", +user_created:"Utilisateur\u22c5rice enregistr\u00e9\u22c5e",user_activated:"Utilisateur\u22c5rice activ\u00e9\u22c5e",anonymous_user:"Anonyme",save:"Sauvegarder",modify:"Modifier",nb_users:"Aucun utilisateur\u22c5rice|{count} utilisateur\u22c5rice|{count} utilisateur\u22c5rice\u22c5s",nb_teams:"Aucun groupe|{count} groupe|{count} groupes",nb_debates:"Aucun d\u00e9bat|{count} d\u00e9bat|{count} d\u00e9bats",nb_comments:"Aucun argument|{count} argument|{count} arguments",last_post_the:"Dernier post le", +no_post:"Aucun post",category:"Cat\u00e9gorie",title:"Titre",author:"Auteur\u22c5e",restitution:"Restitution",posts:"Posts",last_post:"Dernier post",document:"Document",teams:"Groupes",moderators:"Mod\u00e9rateur\u22c5rice.s",authority:"Status",users:"Utilisateur\u22c5rice\u22c5s",guests:"Invit\u00e9\u22c5e\u22c5s",debates:"D\u00e9bats",new_debate:"Nouveau d\u00e9bat",invite_in_debate:"Inviter au d\u00e9bat",SUPERADMIN:"Super administrateur\u22c5rice",SUPERADMIN:"Root",ADMIN:"Administrateur\u22c5rice", +MODO:"Mod\u00e9rateur\u22c5rice",USER:"Utilisateur\u22c5rice",GUEST:"Invit\u00e9\u22c5e",DELETED:"Supprim\u00e9",report:"Signalement",select_all:"Selectionner tout",unselect_all:"D\u00e9selectionner tout",advanced_options:"Options avanc\u00e9es",public_debate:"D\u00e9bat public",reformulation_assist:"Assistant de reformulation",idefix_link:"Lien IDEFIX",with_hypostases:"Avec hypostase",without_institution:"Sans \u00e9tablissement",running:"En cours...",import:"Importer",not_connected:"Vous n'\u00eates pas connect\u00e9\u22c5e", +tutorials:"Tutoriels",argue:"Argumenter",aaf_import:"Import AAF",update_tags:"Mise \u00e0 jour des tags",start:"Lancer",helper:{welcome:"Bienvenue sur la plateforme AREN (Argumentation & Num\u00e9rique)
Il s'agit d\u2019un espace num\u00e9rique de d\u00e9bat pour pratiquer l\u2019argumentation.
Prendre en compte les arguments des autres et justifier son opinion pour mieux argumenter et exercer son esprit critique !",creating_user:"Cr\u00e9ation en cour, veuillez patienter...",not_connected:"Vous devez \u00eatre inscrit\u22c5e et connect\u00e9\u22c5e pour r\u00e9aliser cette action", +mark_as_read:"Marquer comme lue",mark_as_unread:"Marquer comme non lue",cas_login:"Connectez-vous via le system CAS de l'ENT",add_document:"Ajouter un document",edit_category:"Modifier la cat\u00e9gorie",remove_category:"Supprimer la cat\u00e9gorie",cannot_remove_category:"Vous ne pouvez pas supprimer une cat\u00e9gorie contenant un document",copy_document:"Dupliquer le document",remove_debate:"Supprimer le d\u00e9bat",cannot_remove_debate:"Vous ne pouvez pas supprimer un d\u00e9bat contenant des arguments", +remove_document:"Supprimer le document",cannot_edit_document:"Vous ne pouvez pas modifier un document contenant un d\u00e9bat",cannot_remove_document:"Vous ne pouvez pas supprimer un document contenant un d\u00e9bat",edit_team:"Modifier le groupe",cannot_edit_institution_team:"Vous ne pouvez pas modifier un groupe appartenant \u00e0 une institution",remove_team:"Supprimer le groupe",cannot_remove_institution_team:"Vous ne pouvez pas supprimer un groupe appartenant \u00e0 une institution",cannot_remove_team:"Vous ne pouvez pas supprimer un groupe li\u00e9 \u00e0 un d\u00e9bat", +add_user_in_team:"Ajouter l'utilisateur\u22c5rice au groupe",remove_user_from_team:"Supprimer l'utilisateur\u22c5rice du groupe",cannot_add_institution_user:"Vous ne pouvez pas ajouter un utilisateur\u22c5rice d'un groupe institutionel",remove_user:"Supprimer l'utilisateur\u22c5rice",remove_permanent_user:"Supprimer d\u00e9finitivement l'utilisateur\u22c5rice",cannot_remove_institution_user:"Vous ne pouvez pas supprimer un\u22c5\u00a2 utilisateur\u22c5rice d'un groupe institutionel",cannot_create_institution_user:"Vous ne pouvez pas cr\u00e9er un\u22c5e utilisateur\u22c5rice dans un \u00e9tablissemnt", +cannot_create_institution_team:"Vous ne pouvez pas ajouter un groupe dans un \u00e9tablissement",user_already_in_team:"L'utilisateur\u22c5rice fait d\u00e9j\u00e0 partie du groupe",add_user_to_debate:"Ajouter l'utilisateur\u22c5rice au d\u00e9bat",user_already_in_debate:"L'utilisateur\u22c5rice fait d\u00e9j\u00e0 partie du d\u00e9bat",add_team_to_debate:"Ajouter le groupe au d\u00e9bat",team_already_in_debate:"Le groupe fait d\u00e9j\u00e0 parti du d\u00e9bat",used_for_connection:"Utilis\u00e9 pour la connexion", +not_an_email:"Ce n'est pas une adresse e-mail",different_passwords:"Mots de passes diff\u00e9rents",title_placeholder:"Un titre pertinent",image_url_placeholder:"L'url d'une image",restitution_display_details:"Survolez une tranche du graphique pour afficher ses donn\u00e9es",debate_created:"Votre d\u00e9bat a bien \u00e9t\u00e9 cr\u00e9\u00e9 sur le document '{documentName}' de la cat\u00e9gorie '{categoryName}'
Voulez-vous y acc\u00e9der ?",delete_category:"Vous \u00eates sur le point de supprimer la cat\u00e9gorie '{categoryName}'", +delete_document:"Vous \u00eates sur le point de supprimer le document '{documentName}'",delete_debate:"Vous \u00eates sur le point de supprimer le d\u00e9bat '{debateName}'",delete_team:"Vous \u00eates sur le point de supprimer le groupe '{teamName}'",delete_user:"Vous \u00eates sur le point de supprimer l'utilisateur\u22c5rice '{userName}'",delete_permanent_user:"Vous \u00eates sur le point de d\u00e9finitivement supprimer l'utilisateur\u22c5rice '{userName}'",delete_permanent_user_warning:"Cette action est irr\u00e9versible
Si l'utilisateur\u22c5rice a d\u00e9ja post\u00e9 des arguments, cette action \u00e9chouera.
\u00cates vous s\u00fbr\u22c5e de vouloir continuer ?", +do_continue:"\u00cates vous s\u00fbr\u22c5e de vouloir continuer ?",password_changed:"Mot de passe mis \u00e0 jour avec succ\u00e8s",password_changed_loged_out:"Veuillez vous reconnecter avec votre nouveau mot de passe",user_created_email:"Un e-mail \u00e0 \u00e9t\u00e9 envoy\u00e9 \u00e0 l'adresse saisie, cliquez sur le lien fourni pour activer votre compte",user_activated:"Votre adresse e-mail a bien \u00e9t\u00e9 v\u00e9rifi\u00e9e, vous pouvez fermer cette fen\u00eatre et vous connecter",username_exists:"Nom d'utilisateur\u22c5rice d\u00e9j\u00e0 existant", +email_exists:"Mail d\u00e9j\u00e0 existant",tag_explanations:"Cliquez sur les mots-clefs coh\u00e9rents.",tag_input_explanations:"Presser Entr\u00e9e pour valider",report_comment:"Signaler l'argument",report_details:"Vous vous appr\u00e9tez \u00e0 signaler un message \u00e0 la mod\u00e9ration.

Un message doit \u00eatre signal\u00e9 pour les raisons suivantes :

  • propos inappropri\u00e9s ou insultants (par ex. : atteinte \u00e0 la dignit\u00e9, discours haineux, menaces)
  • opression syst\u00e9mique (par ex. : racisme, sexisme, homophobie)
  • contenu commercial (par ex. : publicit\u00e9, promotion, appel d'offre)
  • autres propos sans lien aucun avec le d\u00e9bat en cours

\u00cates vous s\u00fbr\u22c5e de vouloir continuer ?", +export:"Votre t\u00e9l\u00e9chargement va d\u00e9buter... Si rien ne se passe cliquez ici",password_forgotten:"

Vous avez oubi\u00e9 votre mot de passe ? Pas de probl\u00e8me !

Saisissez votre adresse e-mail ou votre pseudonyme.

",password_forgotten_email:"

Si vous \u00eates enregistr\u00e9\u22c5e, un e-mail expliquant la proc\u00e9dure de r\u00e9initialisation sera envoy\u00e9 \u00e0 l'adresse associ\u00e9e \u00e0 votre compte.

V\u00e9rifiez votre boite mail.

", +theme_not_found:"Aucun r\u00e9sultat pour ce th\u00e8me",theme_already_set:"Th\u00e8me d\u00e9j\u00e0 saisi",public_debate:"Le d\u00e9bat sera accessible par n'importe quel utilisateur\u22c5ice, m\u00eame non coonnect\u00e9\u22c5e",reformulation_assist:"Affiche un smiley lors de la reformulation",idefix_link:"Ajoute des tags aux documents et arguments pour les utiliser avec IDFIX",with_hypostases:"Propose une selection d'hypostase pour les arguments",aaf_import_success:"Les donn\u00e9es AAF ont bien \u00e9t\u00e9 import\u00e9es, vous pouvez fermer cette fen\u00eatre.", +update_tags:"Veuillez patienter, ce processus peut-\u00eatre tr\u00e8s long.
Ne fermez pas cette fen\u00eatre",tag_update_success:"La mise \u00e0 jour des tags est un succ\u00e8s, vous pouvez fermer cette fen\u00eatre."},notification:{team_added_to_debate:"Votre groupe {teamName} participe au d\u00e9bat {debateName}.",invited_to_debate:"Vous \u00eates invit\u00e9\u22c5e sur le d\u00e9bat {debateName}.",comment_answered:"{firstName} {lastName} \u00e0 r\u00e9pondu \u00e0 votre argument.", +comment_moderated:"Votre argument \u00e0 \u00e9t\u00e9 mod\u00e9r\u00e9 sur le d\u00e9bat {debateName}.",comment_signaled:"Votre argument \u00e0 \u00e9t\u00e9 signal\u00e9 sur le d\u00e9bat {debateName}."},error:{"Insertion error":"Erreur d'enregistrement","HTTP 404 Not Found":"HTTP 404 non trouv\u00e9","Resource not found":"Resource non trouv\u00e9e","Authentication error":"Erreur d'authentification","Access denied":"Acc\u00e8s refus\u00e9","Invalid token":"Erreur d'authentification",permission_missing:"Vous n'avez pas les droits", +invalid_token:"Authentification invalide
Veuillez vous reconnecter et r\u00e9essayer",unmutable_object:"Impossible de supprimer l'objet",bad_credentials:"Identifiants incorrects",duplicate_key:"La clef {keyName} avec la valeur {keyValue} existe d\u00e9j\u00e0.",mandatory_property:"La valeur {propertyName} est n\u00e9cessaire.",internal:"ERREUR INTERNE",expired_token:"Jeton d'authentification expir\u00e9",internal_message:"

Toutes nos excuses, une erreur s'est produite sur nos serveurs.

Veuillez r\u00e9essayer ou contacter un administrateur\u22c5trice si l'erreur persiste.

", +aaf_import:"

Erreur lors de l'import AAF.

Il est probable que votre fichier soit corompu ou n'entre pas dans les standard de l'application.

",tag_update_success:"

Erreur lors de la mise \u00e0 jour des tags.

Contacter un d\u00e9veloppeur.

"},menu:{open:"Ouvrir un d\u00e9bat",users:"Utilisateur\u22c5rice\u22c5s",teams:"Groupes",documents:"Documents",my_debates:"Mes d\u00e9bats",public_debates:"D\u00e9bats publics",logout:"D\u00e9connection",login:"Se connecter",signin:"S'enregistrer"}, +comment:{add_argument:"Ajouter un argument",reformulation:"Reformulation",argumentation:"Argumentation",against:"Plut\u00f4t pas d'accord",for:"Plut\u00f4t d'accord",neutral:"Pas compris",is_argument:"Il s'agit d'un argument",is_opinion:"Il s'agit d'une opinion",opinion:"Opinion",nb_answer:" |{count} r\u00e9ponse|{count} r\u00e9ponses",select_hypostases:"Selectionnez une ou plusieurs hypostases dans la liste",expert:"Expert"},argumentation_check:{waiting:"Attente de saisie",loading:"Analyse en cours", +off_topic:"Reformulation hors sujet",close:"Reformulation un peu \u00e9loign\u00e9e",nice:"Belle reformulation !",identical:"Reformulation identique !"},hypostase:{qualitative:"Qualitatif",quantitative:"Quantitatif",structural:"Structurel",difficulty:"Difficult\u00e9",explanation:"Explicatif",variance:"Variance",mode:"Mode",axiom:"Axiome",hypothesis:"Hypoth\u00e8se",principle:"Principe",classification:"Classification",variation:"Variation",value:"Valeur",definition:"D\u00e9finition",paradigme:"Paradigme", +paradoxe:"Paradoxe",clue:"Indice",conjecture:"Conjecture",problem:"Probl\u00e8me",domain:"Domaine",formalism:"Formalisme",data:"Donn\u00e9e",belief:"Croyance",theory:"Th\u00e9orie",law:"Loi",aporia:"Aporie",variable:"Variable",dimension:"Dimension",structure:"Structure",object:"Objet",approximation:"Approximation",phenomenon:"Ph\u00e9nom\u00e8ne",event:"\u00c9v\u00e8nement",invariant:"Invariant",method:"M\u00e9thode"},documentation:{help:"

Aide

Cliquez sur la fl\u00e8che pour passer \u00e0 l'aide suivante, ou survolez les \u00e9l\u00e9ments qui vous questionnent.

", +user_panel:"

Panneau d'utilisateur\u22c5ice

Vous permet de changer de mot de passe et de vous d\u00e9connecter

",notification_panel:"

Restez inform\u00e9 des d\u00e9bats auxquels vous participez.

Vous recevrez une notification lorsqu'une r\u00e9ponse est post\u00e9e \u00e0 un de vos arguments et lorsque vous avez \u00e9t\u00e9 invit\u00e9\u22c5e \u00e0 un nouveau d\u00e9bat.

",create_debate_with:"

D\u00e9batre avec

S\u00e9lectionnez les personnes et groupes qui pouront participer au d\u00e9bat. Si rien n'est s\u00e9lection\u00e9 le d\u00e9bat sera public, accessible \u00e0 tou\u22c5te\u22c5s

", +create_debate_document:"

D\u00e9batre sur

S\u00e9lectionnez le document sur lequel vous d\u00e9sirez porter le d\u00e9bat

",create_debate_recap:"

R\u00e9capitulatif

V\u00e9rifiez les informations saisies et selectionez des param\u00e8tres avanc\u00e9s

",debate_display:"

Informations suppl\u00e9mentaires

S\u00e9lectionnez Document pour afficher le document \u00e0 d\u00e9battre.
S\u00e9lectionnez Th\u00e8me pour retrouver les arguments en lien avec une th\u00e9matique donn\u00e9e.
S\u00e9lectionnez S\u00e9lections pour afficher les parties de texte les plus argument\u00e9es.

", +debate_sort:"

Tri des arguments

Triez les arguments par date de r\u00e9daction ou par position dans le document.

",debate_document:"

Document \u00e0 d\u00e9battre

Ici s'affiche le texte \u00e0 d\u00e9battre, lisez-le attentivement avant de proposer des arguments.

S\u00e9lectionnez une partie du texte sur laquelle vous souhaitez intervenir, une ic\u00f4ne appara\u00eetra pour vous permettre d'argumenter.

Vous \u00eates sur une plateforme d\u00e9di\u00e9e au d\u00e9bat, n'h\u00e9sitez pas \u00e0 d\u00e9fendre votre opinion avec des arguments : s\u2019appuyer sur des donn\u00e9es, utiliser des connaissances, donner des exemples, pr\u00e9ciser vos sources, etc.

", +debate_bulets:"

Puces d'arguments

Les puces indiquent les s\u00e9lections du texte sur lesquelles des arguments ont \u00e9t\u00e9 produits. Les couleurs permettent de savoir si les arguments sont pour ou contre la s\u00e9lection.

Au survol, la partie argument\u00e9e est mise en surbrillance.
Au clic, l'argument est s\u00e9lectionn\u00e9 dans le panneau de droite.

",debate_themes:"

Th\u00e8mes du d\u00e9bat

Saisissez un mot ou un groupe de mot d\u00e9finissant un th\u00e8me et pressez Entr\u00e9e

pour valier. Les argument savec le th\u00e8me saisis seront alors calcul\u00e9 et mis en lien avec celui-ci.

Vous pouvez supprimer un th\u00e8me an cliquant sur delete_forever

", +debate_scraps:"

Textes les plus selection\u00e9

Voici la liste des portions de texte du document les plus s\u00e9lectionn\u00e9es pour argumenter. Chaque seletion est relier aux arguments qui la contienne.

",debate_spaghettis:"

Spaghettis

"},footer:{collaborators:"Partenaires",useful_links:"Liens utiles",contact:"Contact",about:"\u00c0 propos",contribute:"Contribuer sur GitHub"}}};const i18n=new VueI18n({locale:"fr-FR",fallbackLocale:"fr-FR",messages,dateTimeFormats}); \ No newline at end of file diff --git a/src/main/webapp/assets/js/service/worker.js b/src/main/webapp/assets/js/service/worker.js new file mode 100644 index 0000000..39493b7 --- /dev/null +++ b/src/main/webapp/assets/js/service/worker.js @@ -0,0 +1,31 @@ +var connections = 0; +var sources = {}; + +onconnect = function (e) { + let port = e.ports[0]; + connections++; + + port.addEventListener("message", function (e) { + let url = e.data; + + if (!sources.hasOwnProperty(url)) { + sources[url] = new EventSource(url); + } + + sources[url].addEventListener("message", (message) => { + console.clear(); + console.log(message); + port.postMessage({url: url, data: message.data}); + }, false); + + }, false); + + port.start(); +} + +onbeforeunload = function () { + connections--; + if (connections === 0) { + self.terminate(); + } +} \ No newline at end of file diff --git a/src/main/webapp/assets/js/service/worker.min.js b/src/main/webapp/assets/js/service/worker.min.js new file mode 100644 index 0000000..4d374b8 --- /dev/null +++ b/src/main/webapp/assets/js/service/worker.min.js @@ -0,0 +1 @@ +var connections=0,sources={};onconnect=function(a){let c=a.ports[0];connections++;c.addEventListener("message",function(a){let b=a.data;sources.hasOwnProperty(b)||(sources[b]=new EventSource(b));sources[b].addEventListener("message",a=>{console.clear();console.log(a);c.postMessage({url:b,data:a.data})},!1)},!1);c.start()};onbeforeunload=function(){connections--;0===connections&&self.terminate()}; \ No newline at end of file diff --git a/src/main/webapp/assets/js/utils.js b/src/main/webapp/assets/js/utils.js new file mode 100644 index 0000000..8f5d14b --- /dev/null +++ b/src/main/webapp/assets/js/utils.js @@ -0,0 +1,259 @@ +function decycle(obj, stack = [ ]) { + if (!obj || typeof obj !== 'object') + return obj; + + if (stack.includes(obj)) + return null; + + let s = stack.concat([obj]); + + return Array.isArray(obj) ? obj.map(x => decycle(x, s)) + : Object.assign(new obj.constructor(), Object.fromEntries( + Object.entries(obj) + .map(([k, v]) => [k, decycle(v, s)]))); +} + +function vueLoader(file) { + return httpVueLoader('assets/js/' + file + '.vue'); +} + +/***** Useful function on prototypes *****/ +Array.prototype.remove = function (obj) { + let index = this.indexOf(obj); + if (index !== -1) { + this.splice(index, 1); + return true; + } else { + return false; + } +}; + +Array.prototype.compare = function (obj) { + if (this === obj) { + return 0; + } + let len = Math.max(this.length, obj.length); + for (let i = 0; i < len; i++) { + if (this[i] === undefined || obj[i] !== undefined && this[i] < obj[i]) { + return -1; + } else if (obj[i] === undefined || this[i] !== undefined && this[i] > obj[i]) { + return 1; + } + } + return 0; +} + +if (!Array.prototype.includes) { + Array.prototype.includes = function (obj) { + return this.indexOf(obj) !== -1; + } +} + +if (!String.prototype.includes) { + String.prototype.includes = function (obj) { + return this.indexOf(obj) !== -1; + } +} + +Node.prototype.getChildPathTo = function (el) { + if (el === this) { + return ""; + } + let sibIndex = -1; + let len = el.parentNode.childNodes.length; + let sib; + while (sibIndex < len && sib !== el) { + sibIndex++; + sib = el.parentNode.childNodes[sibIndex]; + } + if (el.parentNode === this) { + return sibIndex; + } else { + return this.getChildPathTo(el.parentNode) + "/" + sibIndex; + } +}; + +Node.prototype.childPathSelector = function (path) { + if (path.constructor !== String) { + path = path + ""; + } + let arrayPath = path.split("/"); + var result = this; + let len = arrayPath.length; + for (let i = 0; i < len; i++) { + if (result.childNodes.length > arrayPath[i]) { + result = result.childNodes[arrayPath[i]]; + } else { + console.warn("Warning : impossible to find child number " + arrayPath[i] + ". The return child may be wrong.", this, result); + } + } + return result; +}; + +Node.prototype.forEachNode = function (callback, origin = this, end = false, index = []) { + if (end && this === origin) { + return null; + } + if (!end && callback) { + callback(this, [...index], origin); + } + if (!end && this.firstChild !== null) { + index.push(0); + this.firstChild.forEachNode(callback, origin, false, index); + } else if (this.nextSibling !== null) { + index[index.length - 1]++; + this.nextSibling.forEachNode(callback, origin, false, index); + } else { + index.pop(); + this.parentNode.forEachNode(callback, origin, true, index); +} +} + +/***** Selection handling *****/ +function compareRange(type, r1, r2) { + let pos1, pos2; + switch (type) { + case Range.START_TO_START: + pos1 = (r1.startContainer + "/" + r1.startOffset).split("/").map(v => v * 1); + pos2 = (r2.startContainer + "/" + r2.startOffset).split("/").map(v => v * 1); + break; + case Range.START_TO_END: + pos1 = (r1.startContainer + "/" + r1.startOffset).split("/").map(v => v * 1); + pos2 = (r2.endContainer + "/" + r2.endOffset).split("/").map(v => v * 1); + break; + case Range.END_TO_START: + pos1 = (r1.endContainer + "/" + r1.endOffset).split("/").map(v => v * 1); + pos2 = (r2.startContainer + "/" + r2.startOffset).split("/").map(v => v * 1); + break; + case Range.END_TO_END: + pos1 = (r1.endContainer + "/" + r1.endOffset).split("/").map(v => v * 1); + pos2 = (r2.endContainer + "/" + r2.endOffset).split("/").map(v => v * 1); + break; + default: + throw "Invalid first parameter. Use Range.START_TO_START, Range.START_TO_END, Range.END_TO_START or Range.END_TO_END."; + } + return pos1.compare(pos2); +} + +Range.prototype.setPathStart = function (container, startContainer, startOffset) { + this.setStart(startContainer ? container.childPathSelector(startContainer) : container.firstChild, startOffset); +} + +Range.prototype.setPathEnd = function (container, endContainer, endOffset) { + this.setEnd(endContainer ? container.childPathSelector(endContainer) : container.firstChild, endOffset); +} + +Range.prototype.getHtml = function () { + let div = document.createElement('div'); + div.appendChild(this.cloneContents()); + return div.innerHTML; +} + +Range.prototype.affineToWord = function () { + let regExp = new RegExp('[A-Za-zÀ-ÖØ-öø-ÿ\'\.\n\t]'); + while (this.startOffset > 0 && regExp.test(this.toString().charAt(0))) { + this.setStart(this.startContainer, this.startOffset - 1); + } + if (this.startOffset !== 0) { + this.setStart(this.startContainer, this.startOffset + 1); + } + while (this.endOffset < this.endContainer.length && regExp.test(this.toString().slice(-1))) { + this.setEnd(this.endContainer, this.endOffset + 1); + } + if (!regExp.test(this.toString().slice(-1)) && this.endOffset !== 0) { + this.setEnd(this.endContainer, this.endOffset - 1); + } +} + +function clearSelection() { + if (window.getSelection) { + window.getSelection().removeAllRanges(); + } else if (document.selection) { + document.selection.empty(); + } +} + + +/***** Smooth Scroll *****/ +var scrollProcess = []; + +Math.easeOutExpo = function (time, origin, delta, duration) { + return delta * (-Math.pow(2, -10 * time / duration) + 1) + origin; +}; + +function clearAllSmoothScroll(container) { + let index = scrollProcess.findIndex((s) => s.container === container); + if (index !== -1) { + let len = scrollProcess[index].intervals.length; + for (var i = 0; i < len; i++) { + clearInterval(scrollProcess[index].intervals[i]); + } + scrollProcess.splice(index, 1); + } +} + +function smoothScroll(container, scrollGoal, callback, duration = 0.5) { + clearAllSmoothScroll(container); + + let scrollDir = container.scrollTop < scrollGoal ? 1 : -1; + let timeInt = 5; + + let time = 0; + let origin = container.scrollTop; + let delta = scrollGoal - container.scrollTop; + duration = duration * (1000 / timeInt); + + let index = scrollProcess.findIndex((s) => s.container === container); + if (index === -1) { + scrollProcess.push({ + container, + intervals: [] + }); + index = scrollProcess.length - 1; + } + + scrollProcess[index].intervals.push(setInterval(() => { + if (time === duration + || scrollDir === 1 && ( + container.scrollTop === container.scrollTopMax + || container.scrollTop >= scrollGoal - 1) + || scrollDir === -1 && ( + container.scrollTop === 0 + || container.scrollTop <= scrollGoal + 1) + ) { + clearAllSmoothScroll(container); + if (callback) { + callback(); + } + } else { + container.scrollTop = Math.easeOutExpo(time, origin, delta, duration); + time++; + } + }, timeInt)); +} + +function scrollCenter(container, element, callback, duration = 0.5) { + let elemRect = element.getBoundingClientRect(); + let containerRect = container.getBoundingClientRect(); + let scrollGoal = elemRect.top + (container.scrollTop - containerRect.top); + smoothScroll(container, scrollGoal - (containerRect.height / 4), callback, duration); +} + +function inScrollView(container, element) { + let elemRect = element.getBoundingClientRect(); + let containerRect = container.getBoundingClientRect(); + let scrollTop = elemRect.top + (container.scrollTop - containerRect.top); + let scrollBottom = elemRect.top + (container.scrollTop - containerRect.top - containerRect.height) + elemRect.height; + return (container.scrollTop < scrollTop && container.scrollTop > scrollBottom); +} + +/***** Color function *****/ +const HSL = { + fromString(color) { + let match = /hsl\((\d+),\s*([\d.]+)%,\s*([\d.]+)%\)/g.exec(color); + return {h: match[1], s: match[2], l: match[3] / 100}; + }, + toString(hsl) { + return "hsl(" + hsl.h + ", " + hsl.s * 100 + "%, " + hsl.l * 100 + "%)"; + } +} \ No newline at end of file diff --git a/src/main/webapp/assets/js/utils.min.js b/src/main/webapp/assets/js/utils.min.js new file mode 100644 index 0000000..94a6810 --- /dev/null +++ b/src/main/webapp/assets/js/utils.min.js @@ -0,0 +1,13 @@ +function decycle(a,b=[]){if(!a||"object"!==typeof a)return a;if(b.includes(a))return null;let c=b.concat([a]);return Array.isArray(a)?a.map(a=>decycle(a,c)):Object.assign(new a.constructor,Object.fromEntries(Object.entries(a).map(([a,b])=>[a,decycle(b,c)])))}function vueLoader(a){return httpVueLoader("assets/js/"+a+".vue")}Array.prototype.remove=function(a){a=this.indexOf(a);return-1!==a?(this.splice(a,1),!0):!1}; +Array.prototype.compare=function(a){if(this===a)return 0;let b=Math.max(this.length,a.length);for(let c=0;ca[c])return 1}return 0};Array.prototype.includes||(Array.prototype.includes=function(a){return-1!==this.indexOf(a)});String.prototype.includes||(String.prototype.includes=function(a){return-1!==this.indexOf(a)}); +Node.prototype.getChildPathTo=function(a){if(a===this)return"";let b=-1,c=a.parentNode.childNodes.length,d;for(;ba[d]?b=b.childNodes[a[d]]:console.warn("Warning : impossible to find child number "+a[d]+". The return child may be wrong.",this,b);return b}; +Node.prototype.forEachNode=function(a,b=this,c=!1,d=[]){if(c&&this===b)return null;!c&&a&&a(this,[...d],b);c||null===this.firstChild?null!==this.nextSibling?(d[d.length-1]++,this.nextSibling.forEachNode(a,b,!1,d)):(d.pop(),this.parentNode.forEachNode(a,b,!0,d)):(d.push(0),this.firstChild.forEachNode(a,b,!1,d))}; +function compareRange(a,b,c){switch(a){case Range.START_TO_START:a=(b.startContainer+"/"+b.startOffset).split("/").map(a=>1*a);c=(c.startContainer+"/"+c.startOffset).split("/").map(a=>1*a);break;case Range.START_TO_END:a=(b.startContainer+"/"+b.startOffset).split("/").map(a=>1*a);c=(c.endContainer+"/"+c.endOffset).split("/").map(a=>1*a);break;case Range.END_TO_START:a=(b.endContainer+"/"+b.endOffset).split("/").map(a=>1*a);c=(c.startContainer+"/"+c.startOffset).split("/").map(a=>1*a);break;case Range.END_TO_END:a= +(b.endContainer+"/"+b.endOffset).split("/").map(a=>1*a);c=(c.endContainer+"/"+c.endOffset).split("/").map(a=>1*a);break;default:throw"Invalid first parameter. Use Range.START_TO_START, Range.START_TO_END, Range.END_TO_START or Range.END_TO_END.";}return a.compare(c)}Range.prototype.setPathStart=function(a,b,c){this.setStart(b?a.childPathSelector(b):a.firstChild,c)};Range.prototype.setPathEnd=function(a,b,c){this.setEnd(b?a.childPathSelector(b):a.firstChild,c)}; +Range.prototype.getHtml=function(){let a=document.createElement("div");a.appendChild(this.cloneContents());return a.innerHTML}; +Range.prototype.affineToWord=function(){let a=/[A-Za-z\u00c0-\u00d6\u00d8-\u00f6\u00f8-\u00ff'.\n\t]/;for(;0b.container===a);if(-1!==b){let a=scrollProcess[b].intervals.length;for(var c=0;cb.container===a);-1===g&&(scrollProcess.push({container:a,intervals:[]}),g=scrollProcess.length-1);scrollProcess[g].intervals.push(setInterval(()=>{f===d||1===e&&(a.scrollTop===a.scrollTopMax||a.scrollTop>=b-1)||-1===e&&(0===a.scrollTop||a.scrollTop<=b+1)?(clearAllSmoothScroll(a),c&&c()):(a.scrollTop=Math.easeOutExpo(f,h,k,d),f++)},5))} +function scrollCenter(a,b,c,d=.5){b=b.getBoundingClientRect();let e=a.getBoundingClientRect();smoothScroll(a,b.top+(a.scrollTop-e.top)-e.height/4,c,d)}function inScrollView(a,b){b=b.getBoundingClientRect();let c=a.getBoundingClientRect(),d=b.top+(a.scrollTop-c.top-c.height)+b.height;return a.scrollTopd} +const HSL={fromString(a){a=/hsl\((\d+),\s*([\d.]+)%,\s*([\d.]+)%\)/g.exec(a);return{h:a[1],s:a[2],l:a[3]/100}},toString(a){return"hsl("+a.h+", "+100*a.s+"%, "+100*a.l+"%)"}}; \ No newline at end of file diff --git a/src/main/webapp/assets/js/vendors/axios.js b/src/main/webapp/assets/js/vendors/axios.js new file mode 100644 index 0000000..6dd94bd --- /dev/null +++ b/src/main/webapp/assets/js/vendors/axios.js @@ -0,0 +1,1756 @@ +/* axios v0.21.1 | (c) 2020 by Matt Zabriskie */ +(function webpackUniversalModuleDefinition(root, factory) { + if(typeof exports === 'object' && typeof module === 'object') + module.exports = factory(); + else if(typeof define === 'function' && define.amd) + define([], factory); + else if(typeof exports === 'object') + exports["axios"] = factory(); + else + root["axios"] = factory(); +})(this, function() { +return /******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) +/******/ return installedModules[moduleId].exports; +/******/ +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ exports: {}, +/******/ id: moduleId, +/******/ loaded: false +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.loaded = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; +/******/ +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; +/******/ +/******/ // Load entry module and return exports +/******/ return __webpack_require__(0); +/******/ }) +/************************************************************************/ +/******/ ([ +/* 0 */ +/***/ (function(module, exports, __webpack_require__) { + + module.exports = __webpack_require__(1); + +/***/ }), +/* 1 */ +/***/ (function(module, exports, __webpack_require__) { + + 'use strict'; + + var utils = __webpack_require__(2); + var bind = __webpack_require__(3); + var Axios = __webpack_require__(4); + var mergeConfig = __webpack_require__(22); + var defaults = __webpack_require__(10); + + /** + * Create an instance of Axios + * + * @param {Object} defaultConfig The default config for the instance + * @return {Axios} A new instance of Axios + */ + function createInstance(defaultConfig) { + var context = new Axios(defaultConfig); + var instance = bind(Axios.prototype.request, context); + + // Copy axios.prototype to instance + utils.extend(instance, Axios.prototype, context); + + // Copy context to instance + utils.extend(instance, context); + + return instance; + } + + // Create the default instance to be exported + var axios = createInstance(defaults); + + // Expose Axios class to allow class inheritance + axios.Axios = Axios; + + // Factory for creating new instances + axios.create = function create(instanceConfig) { + return createInstance(mergeConfig(axios.defaults, instanceConfig)); + }; + + // Expose Cancel & CancelToken + axios.Cancel = __webpack_require__(23); + axios.CancelToken = __webpack_require__(24); + axios.isCancel = __webpack_require__(9); + + // Expose all/spread + axios.all = function all(promises) { + return Promise.all(promises); + }; + axios.spread = __webpack_require__(25); + + // Expose isAxiosError + axios.isAxiosError = __webpack_require__(26); + + module.exports = axios; + + // Allow use of default import syntax in TypeScript + module.exports.default = axios; + + +/***/ }), +/* 2 */ +/***/ (function(module, exports, __webpack_require__) { + + 'use strict'; + + var bind = __webpack_require__(3); + + /*global toString:true*/ + + // utils is a library of generic helper functions non-specific to axios + + var toString = Object.prototype.toString; + + /** + * Determine if a value is an Array + * + * @param {Object} val The value to test + * @returns {boolean} True if value is an Array, otherwise false + */ + function isArray(val) { + return toString.call(val) === '[object Array]'; + } + + /** + * Determine if a value is undefined + * + * @param {Object} val The value to test + * @returns {boolean} True if the value is undefined, otherwise false + */ + function isUndefined(val) { + return typeof val === 'undefined'; + } + + /** + * Determine if a value is a Buffer + * + * @param {Object} val The value to test + * @returns {boolean} True if value is a Buffer, otherwise false + */ + function isBuffer(val) { + return val !== null && !isUndefined(val) && val.constructor !== null && !isUndefined(val.constructor) + && typeof val.constructor.isBuffer === 'function' && val.constructor.isBuffer(val); + } + + /** + * Determine if a value is an ArrayBuffer + * + * @param {Object} val The value to test + * @returns {boolean} True if value is an ArrayBuffer, otherwise false + */ + function isArrayBuffer(val) { + return toString.call(val) === '[object ArrayBuffer]'; + } + + /** + * Determine if a value is a FormData + * + * @param {Object} val The value to test + * @returns {boolean} True if value is an FormData, otherwise false + */ + function isFormData(val) { + return (typeof FormData !== 'undefined') && (val instanceof FormData); + } + + /** + * Determine if a value is a view on an ArrayBuffer + * + * @param {Object} val The value to test + * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false + */ + function isArrayBufferView(val) { + var result; + if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) { + result = ArrayBuffer.isView(val); + } else { + result = (val) && (val.buffer) && (val.buffer instanceof ArrayBuffer); + } + return result; + } + + /** + * Determine if a value is a String + * + * @param {Object} val The value to test + * @returns {boolean} True if value is a String, otherwise false + */ + function isString(val) { + return typeof val === 'string'; + } + + /** + * Determine if a value is a Number + * + * @param {Object} val The value to test + * @returns {boolean} True if value is a Number, otherwise false + */ + function isNumber(val) { + return typeof val === 'number'; + } + + /** + * Determine if a value is an Object + * + * @param {Object} val The value to test + * @returns {boolean} True if value is an Object, otherwise false + */ + function isObject(val) { + return val !== null && typeof val === 'object'; + } + + /** + * Determine if a value is a plain Object + * + * @param {Object} val The value to test + * @return {boolean} True if value is a plain Object, otherwise false + */ + function isPlainObject(val) { + if (toString.call(val) !== '[object Object]') { + return false; + } + + var prototype = Object.getPrototypeOf(val); + return prototype === null || prototype === Object.prototype; + } + + /** + * Determine if a value is a Date + * + * @param {Object} val The value to test + * @returns {boolean} True if value is a Date, otherwise false + */ + function isDate(val) { + return toString.call(val) === '[object Date]'; + } + + /** + * Determine if a value is a File + * + * @param {Object} val The value to test + * @returns {boolean} True if value is a File, otherwise false + */ + function isFile(val) { + return toString.call(val) === '[object File]'; + } + + /** + * Determine if a value is a Blob + * + * @param {Object} val The value to test + * @returns {boolean} True if value is a Blob, otherwise false + */ + function isBlob(val) { + return toString.call(val) === '[object Blob]'; + } + + /** + * Determine if a value is a Function + * + * @param {Object} val The value to test + * @returns {boolean} True if value is a Function, otherwise false + */ + function isFunction(val) { + return toString.call(val) === '[object Function]'; + } + + /** + * Determine if a value is a Stream + * + * @param {Object} val The value to test + * @returns {boolean} True if value is a Stream, otherwise false + */ + function isStream(val) { + return isObject(val) && isFunction(val.pipe); + } + + /** + * Determine if a value is a URLSearchParams object + * + * @param {Object} val The value to test + * @returns {boolean} True if value is a URLSearchParams object, otherwise false + */ + function isURLSearchParams(val) { + return typeof URLSearchParams !== 'undefined' && val instanceof URLSearchParams; + } + + /** + * Trim excess whitespace off the beginning and end of a string + * + * @param {String} str The String to trim + * @returns {String} The String freed of excess whitespace + */ + function trim(str) { + return str.replace(/^\s*/, '').replace(/\s*$/, ''); + } + + /** + * Determine if we're running in a standard browser environment + * + * This allows axios to run in a web worker, and react-native. + * Both environments support XMLHttpRequest, but not fully standard globals. + * + * web workers: + * typeof window -> undefined + * typeof document -> undefined + * + * react-native: + * navigator.product -> 'ReactNative' + * nativescript + * navigator.product -> 'NativeScript' or 'NS' + */ + function isStandardBrowserEnv() { + if (typeof navigator !== 'undefined' && (navigator.product === 'ReactNative' || + navigator.product === 'NativeScript' || + navigator.product === 'NS')) { + return false; + } + return ( + typeof window !== 'undefined' && + typeof document !== 'undefined' + ); + } + + /** + * Iterate over an Array or an Object invoking a function for each item. + * + * If `obj` is an Array callback will be called passing + * the value, index, and complete array for each item. + * + * If 'obj' is an Object callback will be called passing + * the value, key, and complete object for each property. + * + * @param {Object|Array} obj The object to iterate + * @param {Function} fn The callback to invoke for each item + */ + function forEach(obj, fn) { + // Don't bother if no value provided + if (obj === null || typeof obj === 'undefined') { + return; + } + + // Force an array if not already something iterable + if (typeof obj !== 'object') { + /*eslint no-param-reassign:0*/ + obj = [obj]; + } + + if (isArray(obj)) { + // Iterate over array values + for (var i = 0, l = obj.length; i < l; i++) { + fn.call(null, obj[i], i, obj); + } + } else { + // Iterate over object keys + for (var key in obj) { + if (Object.prototype.hasOwnProperty.call(obj, key)) { + fn.call(null, obj[key], key, obj); + } + } + } + } + + /** + * Accepts varargs expecting each argument to be an object, then + * immutably merges the properties of each object and returns result. + * + * When multiple objects contain the same key the later object in + * the arguments list will take precedence. + * + * Example: + * + * ```js + * var result = merge({foo: 123}, {foo: 456}); + * console.log(result.foo); // outputs 456 + * ``` + * + * @param {Object} obj1 Object to merge + * @returns {Object} Result of all merge properties + */ + function merge(/* obj1, obj2, obj3, ... */) { + var result = {}; + function assignValue(val, key) { + if (isPlainObject(result[key]) && isPlainObject(val)) { + result[key] = merge(result[key], val); + } else if (isPlainObject(val)) { + result[key] = merge({}, val); + } else if (isArray(val)) { + result[key] = val.slice(); + } else { + result[key] = val; + } + } + + for (var i = 0, l = arguments.length; i < l; i++) { + forEach(arguments[i], assignValue); + } + return result; + } + + /** + * Extends object a by mutably adding to it the properties of object b. + * + * @param {Object} a The object to be extended + * @param {Object} b The object to copy properties from + * @param {Object} thisArg The object to bind function to + * @return {Object} The resulting value of object a + */ + function extend(a, b, thisArg) { + forEach(b, function assignValue(val, key) { + if (thisArg && typeof val === 'function') { + a[key] = bind(val, thisArg); + } else { + a[key] = val; + } + }); + return a; + } + + /** + * Remove byte order marker. This catches EF BB BF (the UTF-8 BOM) + * + * @param {string} content with BOM + * @return {string} content value without BOM + */ + function stripBOM(content) { + if (content.charCodeAt(0) === 0xFEFF) { + content = content.slice(1); + } + return content; + } + + module.exports = { + isArray: isArray, + isArrayBuffer: isArrayBuffer, + isBuffer: isBuffer, + isFormData: isFormData, + isArrayBufferView: isArrayBufferView, + isString: isString, + isNumber: isNumber, + isObject: isObject, + isPlainObject: isPlainObject, + isUndefined: isUndefined, + isDate: isDate, + isFile: isFile, + isBlob: isBlob, + isFunction: isFunction, + isStream: isStream, + isURLSearchParams: isURLSearchParams, + isStandardBrowserEnv: isStandardBrowserEnv, + forEach: forEach, + merge: merge, + extend: extend, + trim: trim, + stripBOM: stripBOM + }; + + +/***/ }), +/* 3 */ +/***/ (function(module, exports) { + + 'use strict'; + + module.exports = function bind(fn, thisArg) { + return function wrap() { + var args = new Array(arguments.length); + for (var i = 0; i < args.length; i++) { + args[i] = arguments[i]; + } + return fn.apply(thisArg, args); + }; + }; + + +/***/ }), +/* 4 */ +/***/ (function(module, exports, __webpack_require__) { + + 'use strict'; + + var utils = __webpack_require__(2); + var buildURL = __webpack_require__(5); + var InterceptorManager = __webpack_require__(6); + var dispatchRequest = __webpack_require__(7); + var mergeConfig = __webpack_require__(22); + + /** + * Create a new instance of Axios + * + * @param {Object} instanceConfig The default config for the instance + */ + function Axios(instanceConfig) { + this.defaults = instanceConfig; + this.interceptors = { + request: new InterceptorManager(), + response: new InterceptorManager() + }; + } + + /** + * Dispatch a request + * + * @param {Object} config The config specific for this request (merged with this.defaults) + */ + Axios.prototype.request = function request(config) { + /*eslint no-param-reassign:0*/ + // Allow for axios('example/url'[, config]) a la fetch API + if (typeof config === 'string') { + config = arguments[1] || {}; + config.url = arguments[0]; + } else { + config = config || {}; + } + + config = mergeConfig(this.defaults, config); + + // Set config.method + if (config.method) { + config.method = config.method.toLowerCase(); + } else if (this.defaults.method) { + config.method = this.defaults.method.toLowerCase(); + } else { + config.method = 'get'; + } + + // Hook up interceptors middleware + var chain = [dispatchRequest, undefined]; + var promise = Promise.resolve(config); + + this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) { + chain.unshift(interceptor.fulfilled, interceptor.rejected); + }); + + this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) { + chain.push(interceptor.fulfilled, interceptor.rejected); + }); + + while (chain.length) { + promise = promise.then(chain.shift(), chain.shift()); + } + + return promise; + }; + + Axios.prototype.getUri = function getUri(config) { + config = mergeConfig(this.defaults, config); + return buildURL(config.url, config.params, config.paramsSerializer).replace(/^\?/, ''); + }; + + // Provide aliases for supported request methods + utils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) { + /*eslint func-names:0*/ + Axios.prototype[method] = function(url, config) { + return this.request(mergeConfig(config || {}, { + method: method, + url: url, + data: (config || {}).data + })); + }; + }); + + utils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) { + /*eslint func-names:0*/ + Axios.prototype[method] = function(url, data, config) { + return this.request(mergeConfig(config || {}, { + method: method, + url: url, + data: data + })); + }; + }); + + module.exports = Axios; + + +/***/ }), +/* 5 */ +/***/ (function(module, exports, __webpack_require__) { + + 'use strict'; + + var utils = __webpack_require__(2); + + function encode(val) { + return encodeURIComponent(val). + replace(/%3A/gi, ':'). + replace(/%24/g, '$'). + replace(/%2C/gi, ','). + replace(/%20/g, '+'). + replace(/%5B/gi, '['). + replace(/%5D/gi, ']'); + } + + /** + * Build a URL by appending params to the end + * + * @param {string} url The base of the url (e.g., http://www.google.com) + * @param {object} [params] The params to be appended + * @returns {string} The formatted url + */ + module.exports = function buildURL(url, params, paramsSerializer) { + /*eslint no-param-reassign:0*/ + if (!params) { + return url; + } + + var serializedParams; + if (paramsSerializer) { + serializedParams = paramsSerializer(params); + } else if (utils.isURLSearchParams(params)) { + serializedParams = params.toString(); + } else { + var parts = []; + + utils.forEach(params, function serialize(val, key) { + if (val === null || typeof val === 'undefined') { + return; + } + + if (utils.isArray(val)) { + key = key + '[]'; + } else { + val = [val]; + } + + utils.forEach(val, function parseValue(v) { + if (utils.isDate(v)) { + v = v.toISOString(); + } else if (utils.isObject(v)) { + v = JSON.stringify(v); + } + parts.push(encode(key) + '=' + encode(v)); + }); + }); + + serializedParams = parts.join('&'); + } + + if (serializedParams) { + var hashmarkIndex = url.indexOf('#'); + if (hashmarkIndex !== -1) { + url = url.slice(0, hashmarkIndex); + } + + url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams; + } + + return url; + }; + + +/***/ }), +/* 6 */ +/***/ (function(module, exports, __webpack_require__) { + + 'use strict'; + + var utils = __webpack_require__(2); + + function InterceptorManager() { + this.handlers = []; + } + + /** + * Add a new interceptor to the stack + * + * @param {Function} fulfilled The function to handle `then` for a `Promise` + * @param {Function} rejected The function to handle `reject` for a `Promise` + * + * @return {Number} An ID used to remove interceptor later + */ + InterceptorManager.prototype.use = function use(fulfilled, rejected) { + this.handlers.push({ + fulfilled: fulfilled, + rejected: rejected + }); + return this.handlers.length - 1; + }; + + /** + * Remove an interceptor from the stack + * + * @param {Number} id The ID that was returned by `use` + */ + InterceptorManager.prototype.eject = function eject(id) { + if (this.handlers[id]) { + this.handlers[id] = null; + } + }; + + /** + * Iterate over all the registered interceptors + * + * This method is particularly useful for skipping over any + * interceptors that may have become `null` calling `eject`. + * + * @param {Function} fn The function to call for each interceptor + */ + InterceptorManager.prototype.forEach = function forEach(fn) { + utils.forEach(this.handlers, function forEachHandler(h) { + if (h !== null) { + fn(h); + } + }); + }; + + module.exports = InterceptorManager; + + +/***/ }), +/* 7 */ +/***/ (function(module, exports, __webpack_require__) { + + 'use strict'; + + var utils = __webpack_require__(2); + var transformData = __webpack_require__(8); + var isCancel = __webpack_require__(9); + var defaults = __webpack_require__(10); + + /** + * Throws a `Cancel` if cancellation has been requested. + */ + function throwIfCancellationRequested(config) { + if (config.cancelToken) { + config.cancelToken.throwIfRequested(); + } + } + + /** + * Dispatch a request to the server using the configured adapter. + * + * @param {object} config The config that is to be used for the request + * @returns {Promise} The Promise to be fulfilled + */ + module.exports = function dispatchRequest(config) { + throwIfCancellationRequested(config); + + // Ensure headers exist + config.headers = config.headers || {}; + + // Transform request data + config.data = transformData( + config.data, + config.headers, + config.transformRequest + ); + + // Flatten headers + config.headers = utils.merge( + config.headers.common || {}, + config.headers[config.method] || {}, + config.headers + ); + + utils.forEach( + ['delete', 'get', 'head', 'post', 'put', 'patch', 'common'], + function cleanHeaderConfig(method) { + delete config.headers[method]; + } + ); + + var adapter = config.adapter || defaults.adapter; + + return adapter(config).then(function onAdapterResolution(response) { + throwIfCancellationRequested(config); + + // Transform response data + response.data = transformData( + response.data, + response.headers, + config.transformResponse + ); + + return response; + }, function onAdapterRejection(reason) { + if (!isCancel(reason)) { + throwIfCancellationRequested(config); + + // Transform response data + if (reason && reason.response) { + reason.response.data = transformData( + reason.response.data, + reason.response.headers, + config.transformResponse + ); + } + } + + return Promise.reject(reason); + }); + }; + + +/***/ }), +/* 8 */ +/***/ (function(module, exports, __webpack_require__) { + + 'use strict'; + + var utils = __webpack_require__(2); + + /** + * Transform the data for a request or a response + * + * @param {Object|String} data The data to be transformed + * @param {Array} headers The headers for the request or response + * @param {Array|Function} fns A single function or Array of functions + * @returns {*} The resulting transformed data + */ + module.exports = function transformData(data, headers, fns) { + /*eslint no-param-reassign:0*/ + utils.forEach(fns, function transform(fn) { + data = fn(data, headers); + }); + + return data; + }; + + +/***/ }), +/* 9 */ +/***/ (function(module, exports) { + + 'use strict'; + + module.exports = function isCancel(value) { + return !!(value && value.__CANCEL__); + }; + + +/***/ }), +/* 10 */ +/***/ (function(module, exports, __webpack_require__) { + + 'use strict'; + + var utils = __webpack_require__(2); + var normalizeHeaderName = __webpack_require__(11); + + var DEFAULT_CONTENT_TYPE = { + 'Content-Type': 'application/x-www-form-urlencoded' + }; + + function setContentTypeIfUnset(headers, value) { + if (!utils.isUndefined(headers) && utils.isUndefined(headers['Content-Type'])) { + headers['Content-Type'] = value; + } + } + + function getDefaultAdapter() { + var adapter; + if (typeof XMLHttpRequest !== 'undefined') { + // For browsers use XHR adapter + adapter = __webpack_require__(12); + } else if (typeof process !== 'undefined' && Object.prototype.toString.call(process) === '[object process]') { + // For node use HTTP adapter + adapter = __webpack_require__(12); + } + return adapter; + } + + var defaults = { + adapter: getDefaultAdapter(), + + transformRequest: [function transformRequest(data, headers) { + normalizeHeaderName(headers, 'Accept'); + normalizeHeaderName(headers, 'Content-Type'); + if (utils.isFormData(data) || + utils.isArrayBuffer(data) || + utils.isBuffer(data) || + utils.isStream(data) || + utils.isFile(data) || + utils.isBlob(data) + ) { + return data; + } + if (utils.isArrayBufferView(data)) { + return data.buffer; + } + if (utils.isURLSearchParams(data)) { + setContentTypeIfUnset(headers, 'application/x-www-form-urlencoded;charset=utf-8'); + return data.toString(); + } + if (utils.isObject(data)) { + setContentTypeIfUnset(headers, 'application/json;charset=utf-8'); + return JSON.stringify(data); + } + return data; + }], + + transformResponse: [function transformResponse(data) { + /*eslint no-param-reassign:0*/ + if (typeof data === 'string') { + try { + data = JSON.parse(data); + } catch (e) { /* Ignore */ } + } + return data; + }], + + /** + * A timeout in milliseconds to abort a request. If set to 0 (default) a + * timeout is not created. + */ + timeout: 0, + + xsrfCookieName: 'XSRF-TOKEN', + xsrfHeaderName: 'X-XSRF-TOKEN', + + maxContentLength: -1, + maxBodyLength: -1, + + validateStatus: function validateStatus(status) { + return status >= 200 && status < 300; + } + }; + + defaults.headers = { + common: { + 'Accept': 'application/json, text/plain, */*' + } + }; + + utils.forEach(['delete', 'get', 'head'], function forEachMethodNoData(method) { + defaults.headers[method] = {}; + }); + + utils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) { + defaults.headers[method] = utils.merge(DEFAULT_CONTENT_TYPE); + }); + + module.exports = defaults; + + +/***/ }), +/* 11 */ +/***/ (function(module, exports, __webpack_require__) { + + 'use strict'; + + var utils = __webpack_require__(2); + + module.exports = function normalizeHeaderName(headers, normalizedName) { + utils.forEach(headers, function processHeader(value, name) { + if (name !== normalizedName && name.toUpperCase() === normalizedName.toUpperCase()) { + headers[normalizedName] = value; + delete headers[name]; + } + }); + }; + + +/***/ }), +/* 12 */ +/***/ (function(module, exports, __webpack_require__) { + + 'use strict'; + + var utils = __webpack_require__(2); + var settle = __webpack_require__(13); + var cookies = __webpack_require__(16); + var buildURL = __webpack_require__(5); + var buildFullPath = __webpack_require__(17); + var parseHeaders = __webpack_require__(20); + var isURLSameOrigin = __webpack_require__(21); + var createError = __webpack_require__(14); + + module.exports = function xhrAdapter(config) { + return new Promise(function dispatchXhrRequest(resolve, reject) { + var requestData = config.data; + var requestHeaders = config.headers; + + if (utils.isFormData(requestData)) { + delete requestHeaders['Content-Type']; // Let the browser set it + } + + var request = new XMLHttpRequest(); + + // HTTP basic authentication + if (config.auth) { + var username = config.auth.username || ''; + var password = config.auth.password ? unescape(encodeURIComponent(config.auth.password)) : ''; + requestHeaders.Authorization = 'Basic ' + btoa(username + ':' + password); + } + + var fullPath = buildFullPath(config.baseURL, config.url); + request.open(config.method.toUpperCase(), buildURL(fullPath, config.params, config.paramsSerializer), true); + + // Set the request timeout in MS + request.timeout = config.timeout; + + // Listen for ready state + request.onreadystatechange = function handleLoad() { + if (!request || request.readyState !== 4) { + return; + } + + // The request errored out and we didn't get a response, this will be + // handled by onerror instead + // With one exception: request that using file: protocol, most browsers + // will return status as 0 even though it's a successful request + if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) { + return; + } + + // Prepare the response + var responseHeaders = 'getAllResponseHeaders' in request ? parseHeaders(request.getAllResponseHeaders()) : null; + var responseData = !config.responseType || config.responseType === 'text' ? request.responseText : request.response; + var response = { + data: responseData, + status: request.status, + statusText: request.statusText, + headers: responseHeaders, + config: config, + request: request + }; + + settle(resolve, reject, response); + + // Clean up request + request = null; + }; + + // Handle browser request cancellation (as opposed to a manual cancellation) + request.onabort = function handleAbort() { + if (!request) { + return; + } + + reject(createError('Request aborted', config, 'ECONNABORTED', request)); + + // Clean up request + request = null; + }; + + // Handle low level network errors + request.onerror = function handleError() { + // Real errors are hidden from us by the browser + // onerror should only fire if it's a network error + reject(createError('Network Error', config, null, request)); + + // Clean up request + request = null; + }; + + // Handle timeout + request.ontimeout = function handleTimeout() { + var timeoutErrorMessage = 'timeout of ' + config.timeout + 'ms exceeded'; + if (config.timeoutErrorMessage) { + timeoutErrorMessage = config.timeoutErrorMessage; + } + reject(createError(timeoutErrorMessage, config, 'ECONNABORTED', + request)); + + // Clean up request + request = null; + }; + + // Add xsrf header + // This is only done if running in a standard browser environment. + // Specifically not if we're in a web worker, or react-native. + if (utils.isStandardBrowserEnv()) { + // Add xsrf header + var xsrfValue = (config.withCredentials || isURLSameOrigin(fullPath)) && config.xsrfCookieName ? + cookies.read(config.xsrfCookieName) : + undefined; + + if (xsrfValue) { + requestHeaders[config.xsrfHeaderName] = xsrfValue; + } + } + + // Add headers to the request + if ('setRequestHeader' in request) { + utils.forEach(requestHeaders, function setRequestHeader(val, key) { + if (typeof requestData === 'undefined' && key.toLowerCase() === 'content-type') { + // Remove Content-Type if data is undefined + delete requestHeaders[key]; + } else { + // Otherwise add header to the request + request.setRequestHeader(key, val); + } + }); + } + + // Add withCredentials to request if needed + if (!utils.isUndefined(config.withCredentials)) { + request.withCredentials = !!config.withCredentials; + } + + // Add responseType to request if needed + if (config.responseType) { + try { + request.responseType = config.responseType; + } catch (e) { + // Expected DOMException thrown by browsers not compatible XMLHttpRequest Level 2. + // But, this can be suppressed for 'json' type as it can be parsed by default 'transformResponse' function. + if (config.responseType !== 'json') { + throw e; + } + } + } + + // Handle progress if needed + if (typeof config.onDownloadProgress === 'function') { + request.addEventListener('progress', config.onDownloadProgress); + } + + // Not all browsers support upload events + if (typeof config.onUploadProgress === 'function' && request.upload) { + request.upload.addEventListener('progress', config.onUploadProgress); + } + + if (config.cancelToken) { + // Handle cancellation + config.cancelToken.promise.then(function onCanceled(cancel) { + if (!request) { + return; + } + + request.abort(); + reject(cancel); + // Clean up request + request = null; + }); + } + + if (!requestData) { + requestData = null; + } + + // Send the request + request.send(requestData); + }); + }; + + +/***/ }), +/* 13 */ +/***/ (function(module, exports, __webpack_require__) { + + 'use strict'; + + var createError = __webpack_require__(14); + + /** + * Resolve or reject a Promise based on response status. + * + * @param {Function} resolve A function that resolves the promise. + * @param {Function} reject A function that rejects the promise. + * @param {object} response The response. + */ + module.exports = function settle(resolve, reject, response) { + var validateStatus = response.config.validateStatus; + if (!response.status || !validateStatus || validateStatus(response.status)) { + resolve(response); + } else { + reject(createError( + 'Request failed with status code ' + response.status, + response.config, + null, + response.request, + response + )); + } + }; + + +/***/ }), +/* 14 */ +/***/ (function(module, exports, __webpack_require__) { + + 'use strict'; + + var enhanceError = __webpack_require__(15); + + /** + * Create an Error with the specified message, config, error code, request and response. + * + * @param {string} message The error message. + * @param {Object} config The config. + * @param {string} [code] The error code (for example, 'ECONNABORTED'). + * @param {Object} [request] The request. + * @param {Object} [response] The response. + * @returns {Error} The created error. + */ + module.exports = function createError(message, config, code, request, response) { + var error = new Error(message); + return enhanceError(error, config, code, request, response); + }; + + +/***/ }), +/* 15 */ +/***/ (function(module, exports) { + + 'use strict'; + + /** + * Update an Error with the specified config, error code, and response. + * + * @param {Error} error The error to update. + * @param {Object} config The config. + * @param {string} [code] The error code (for example, 'ECONNABORTED'). + * @param {Object} [request] The request. + * @param {Object} [response] The response. + * @returns {Error} The error. + */ + module.exports = function enhanceError(error, config, code, request, response) { + error.config = config; + if (code) { + error.code = code; + } + + error.request = request; + error.response = response; + error.isAxiosError = true; + + error.toJSON = function toJSON() { + return { + // Standard + message: this.message, + name: this.name, + // Microsoft + description: this.description, + number: this.number, + // Mozilla + fileName: this.fileName, + lineNumber: this.lineNumber, + columnNumber: this.columnNumber, + stack: this.stack, + // Axios + config: this.config, + code: this.code + }; + }; + return error; + }; + + +/***/ }), +/* 16 */ +/***/ (function(module, exports, __webpack_require__) { + + 'use strict'; + + var utils = __webpack_require__(2); + + module.exports = ( + utils.isStandardBrowserEnv() ? + + // Standard browser envs support document.cookie + (function standardBrowserEnv() { + return { + write: function write(name, value, expires, path, domain, secure) { + var cookie = []; + cookie.push(name + '=' + encodeURIComponent(value)); + + if (utils.isNumber(expires)) { + cookie.push('expires=' + new Date(expires).toGMTString()); + } + + if (utils.isString(path)) { + cookie.push('path=' + path); + } + + if (utils.isString(domain)) { + cookie.push('domain=' + domain); + } + + if (secure === true) { + cookie.push('secure'); + } + + document.cookie = cookie.join('; '); + }, + + read: function read(name) { + var match = document.cookie.match(new RegExp('(^|;\\s*)(' + name + ')=([^;]*)')); + return (match ? decodeURIComponent(match[3]) : null); + }, + + remove: function remove(name) { + this.write(name, '', Date.now() - 86400000); + } + }; + })() : + + // Non standard browser env (web workers, react-native) lack needed support. + (function nonStandardBrowserEnv() { + return { + write: function write() {}, + read: function read() { return null; }, + remove: function remove() {} + }; + })() + ); + + +/***/ }), +/* 17 */ +/***/ (function(module, exports, __webpack_require__) { + + 'use strict'; + + var isAbsoluteURL = __webpack_require__(18); + var combineURLs = __webpack_require__(19); + + /** + * Creates a new URL by combining the baseURL with the requestedURL, + * only when the requestedURL is not already an absolute URL. + * If the requestURL is absolute, this function returns the requestedURL untouched. + * + * @param {string} baseURL The base URL + * @param {string} requestedURL Absolute or relative URL to combine + * @returns {string} The combined full path + */ + module.exports = function buildFullPath(baseURL, requestedURL) { + if (baseURL && !isAbsoluteURL(requestedURL)) { + return combineURLs(baseURL, requestedURL); + } + return requestedURL; + }; + + +/***/ }), +/* 18 */ +/***/ (function(module, exports) { + + 'use strict'; + + /** + * Determines whether the specified URL is absolute + * + * @param {string} url The URL to test + * @returns {boolean} True if the specified URL is absolute, otherwise false + */ + module.exports = function isAbsoluteURL(url) { + // A URL is considered absolute if it begins with "://" or "//" (protocol-relative URL). + // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed + // by any combination of letters, digits, plus, period, or hyphen. + return /^([a-z][a-z\d\+\-\.]*:)?\/\//i.test(url); + }; + + +/***/ }), +/* 19 */ +/***/ (function(module, exports) { + + 'use strict'; + + /** + * Creates a new URL by combining the specified URLs + * + * @param {string} baseURL The base URL + * @param {string} relativeURL The relative URL + * @returns {string} The combined URL + */ + module.exports = function combineURLs(baseURL, relativeURL) { + return relativeURL + ? baseURL.replace(/\/+$/, '') + '/' + relativeURL.replace(/^\/+/, '') + : baseURL; + }; + + +/***/ }), +/* 20 */ +/***/ (function(module, exports, __webpack_require__) { + + 'use strict'; + + var utils = __webpack_require__(2); + + // Headers whose duplicates are ignored by node + // c.f. https://nodejs.org/api/http.html#http_message_headers + var ignoreDuplicateOf = [ + 'age', 'authorization', 'content-length', 'content-type', 'etag', + 'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since', + 'last-modified', 'location', 'max-forwards', 'proxy-authorization', + 'referer', 'retry-after', 'user-agent' + ]; + + /** + * Parse headers into an object + * + * ``` + * Date: Wed, 27 Aug 2014 08:58:49 GMT + * Content-Type: application/json + * Connection: keep-alive + * Transfer-Encoding: chunked + * ``` + * + * @param {String} headers Headers needing to be parsed + * @returns {Object} Headers parsed into an object + */ + module.exports = function parseHeaders(headers) { + var parsed = {}; + var key; + var val; + var i; + + if (!headers) { return parsed; } + + utils.forEach(headers.split('\n'), function parser(line) { + i = line.indexOf(':'); + key = utils.trim(line.substr(0, i)).toLowerCase(); + val = utils.trim(line.substr(i + 1)); + + if (key) { + if (parsed[key] && ignoreDuplicateOf.indexOf(key) >= 0) { + return; + } + if (key === 'set-cookie') { + parsed[key] = (parsed[key] ? parsed[key] : []).concat([val]); + } else { + parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val; + } + } + }); + + return parsed; + }; + + +/***/ }), +/* 21 */ +/***/ (function(module, exports, __webpack_require__) { + + 'use strict'; + + var utils = __webpack_require__(2); + + module.exports = ( + utils.isStandardBrowserEnv() ? + + // Standard browser envs have full support of the APIs needed to test + // whether the request URL is of the same origin as current location. + (function standardBrowserEnv() { + var msie = /(msie|trident)/i.test(navigator.userAgent); + var urlParsingNode = document.createElement('a'); + var originURL; + + /** + * Parse a URL to discover it's components + * + * @param {String} url The URL to be parsed + * @returns {Object} + */ + function resolveURL(url) { + var href = url; + + if (msie) { + // IE needs attribute set twice to normalize properties + urlParsingNode.setAttribute('href', href); + href = urlParsingNode.href; + } + + urlParsingNode.setAttribute('href', href); + + // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils + return { + href: urlParsingNode.href, + protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '', + host: urlParsingNode.host, + search: urlParsingNode.search ? urlParsingNode.search.replace(/^\?/, '') : '', + hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '', + hostname: urlParsingNode.hostname, + port: urlParsingNode.port, + pathname: (urlParsingNode.pathname.charAt(0) === '/') ? + urlParsingNode.pathname : + '/' + urlParsingNode.pathname + }; + } + + originURL = resolveURL(window.location.href); + + /** + * Determine if a URL shares the same origin as the current location + * + * @param {String} requestURL The URL to test + * @returns {boolean} True if URL shares the same origin, otherwise false + */ + return function isURLSameOrigin(requestURL) { + var parsed = (utils.isString(requestURL)) ? resolveURL(requestURL) : requestURL; + return (parsed.protocol === originURL.protocol && + parsed.host === originURL.host); + }; + })() : + + // Non standard browser envs (web workers, react-native) lack needed support. + (function nonStandardBrowserEnv() { + return function isURLSameOrigin() { + return true; + }; + })() + ); + + +/***/ }), +/* 22 */ +/***/ (function(module, exports, __webpack_require__) { + + 'use strict'; + + var utils = __webpack_require__(2); + + /** + * Config-specific merge-function which creates a new config-object + * by merging two configuration objects together. + * + * @param {Object} config1 + * @param {Object} config2 + * @returns {Object} New object resulting from merging config2 to config1 + */ + module.exports = function mergeConfig(config1, config2) { + // eslint-disable-next-line no-param-reassign + config2 = config2 || {}; + var config = {}; + + var valueFromConfig2Keys = ['url', 'method', 'data']; + var mergeDeepPropertiesKeys = ['headers', 'auth', 'proxy', 'params']; + var defaultToConfig2Keys = [ + 'baseURL', 'transformRequest', 'transformResponse', 'paramsSerializer', + 'timeout', 'timeoutMessage', 'withCredentials', 'adapter', 'responseType', 'xsrfCookieName', + 'xsrfHeaderName', 'onUploadProgress', 'onDownloadProgress', 'decompress', + 'maxContentLength', 'maxBodyLength', 'maxRedirects', 'transport', 'httpAgent', + 'httpsAgent', 'cancelToken', 'socketPath', 'responseEncoding' + ]; + var directMergeKeys = ['validateStatus']; + + function getMergedValue(target, source) { + if (utils.isPlainObject(target) && utils.isPlainObject(source)) { + return utils.merge(target, source); + } else if (utils.isPlainObject(source)) { + return utils.merge({}, source); + } else if (utils.isArray(source)) { + return source.slice(); + } + return source; + } + + function mergeDeepProperties(prop) { + if (!utils.isUndefined(config2[prop])) { + config[prop] = getMergedValue(config1[prop], config2[prop]); + } else if (!utils.isUndefined(config1[prop])) { + config[prop] = getMergedValue(undefined, config1[prop]); + } + } + + utils.forEach(valueFromConfig2Keys, function valueFromConfig2(prop) { + if (!utils.isUndefined(config2[prop])) { + config[prop] = getMergedValue(undefined, config2[prop]); + } + }); + + utils.forEach(mergeDeepPropertiesKeys, mergeDeepProperties); + + utils.forEach(defaultToConfig2Keys, function defaultToConfig2(prop) { + if (!utils.isUndefined(config2[prop])) { + config[prop] = getMergedValue(undefined, config2[prop]); + } else if (!utils.isUndefined(config1[prop])) { + config[prop] = getMergedValue(undefined, config1[prop]); + } + }); + + utils.forEach(directMergeKeys, function merge(prop) { + if (prop in config2) { + config[prop] = getMergedValue(config1[prop], config2[prop]); + } else if (prop in config1) { + config[prop] = getMergedValue(undefined, config1[prop]); + } + }); + + var axiosKeys = valueFromConfig2Keys + .concat(mergeDeepPropertiesKeys) + .concat(defaultToConfig2Keys) + .concat(directMergeKeys); + + var otherKeys = Object + .keys(config1) + .concat(Object.keys(config2)) + .filter(function filterAxiosKeys(key) { + return axiosKeys.indexOf(key) === -1; + }); + + utils.forEach(otherKeys, mergeDeepProperties); + + return config; + }; + + +/***/ }), +/* 23 */ +/***/ (function(module, exports) { + + 'use strict'; + + /** + * A `Cancel` is an object that is thrown when an operation is canceled. + * + * @class + * @param {string=} message The message. + */ + function Cancel(message) { + this.message = message; + } + + Cancel.prototype.toString = function toString() { + return 'Cancel' + (this.message ? ': ' + this.message : ''); + }; + + Cancel.prototype.__CANCEL__ = true; + + module.exports = Cancel; + + +/***/ }), +/* 24 */ +/***/ (function(module, exports, __webpack_require__) { + + 'use strict'; + + var Cancel = __webpack_require__(23); + + /** + * A `CancelToken` is an object that can be used to request cancellation of an operation. + * + * @class + * @param {Function} executor The executor function. + */ + function CancelToken(executor) { + if (typeof executor !== 'function') { + throw new TypeError('executor must be a function.'); + } + + var resolvePromise; + this.promise = new Promise(function promiseExecutor(resolve) { + resolvePromise = resolve; + }); + + var token = this; + executor(function cancel(message) { + if (token.reason) { + // Cancellation has already been requested + return; + } + + token.reason = new Cancel(message); + resolvePromise(token.reason); + }); + } + + /** + * Throws a `Cancel` if cancellation has been requested. + */ + CancelToken.prototype.throwIfRequested = function throwIfRequested() { + if (this.reason) { + throw this.reason; + } + }; + + /** + * Returns an object that contains a new `CancelToken` and a function that, when called, + * cancels the `CancelToken`. + */ + CancelToken.source = function source() { + var cancel; + var token = new CancelToken(function executor(c) { + cancel = c; + }); + return { + token: token, + cancel: cancel + }; + }; + + module.exports = CancelToken; + + +/***/ }), +/* 25 */ +/***/ (function(module, exports) { + + 'use strict'; + + /** + * Syntactic sugar for invoking a function and expanding an array for arguments. + * + * Common use case would be to use `Function.prototype.apply`. + * + * ```js + * function f(x, y, z) {} + * var args = [1, 2, 3]; + * f.apply(null, args); + * ``` + * + * With `spread` this example can be re-written. + * + * ```js + * spread(function(x, y, z) {})([1, 2, 3]); + * ``` + * + * @param {Function} callback + * @returns {Function} + */ + module.exports = function spread(callback) { + return function wrap(arr) { + return callback.apply(null, arr); + }; + }; + + +/***/ }), +/* 26 */ +/***/ (function(module, exports) { + + 'use strict'; + + /** + * Determines whether the payload is an error thrown by Axios + * + * @param {*} payload The value to test + * @returns {boolean} True if the payload is an error thrown by Axios, otherwise false + */ + module.exports = function isAxiosError(payload) { + return (typeof payload === 'object') && (payload.isAxiosError === true); + }; + + +/***/ }) +/******/ ]) +}); +; +//# sourceMappingURL=axios.map \ No newline at end of file diff --git a/src/main/webapp/assets/js/vendors/d3.js b/src/main/webapp/assets/js/vendors/d3.js new file mode 100644 index 0000000..338e89e --- /dev/null +++ b/src/main/webapp/assets/js/vendors/d3.js @@ -0,0 +1,20013 @@ +// https://d3js.org v5.16.0 Copyright 2020 Mike Bostock +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (global = global || self, factory(global.d3 = global.d3 || {})); +}(this, function (exports) { + 'use strict'; + + var version = "5.16.0"; + + function ascending(a, b) { + return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN; + } + + function bisector(compare) { + if (compare.length === 1) + compare = ascendingComparator(compare); + return { + left: function (a, x, lo, hi) { + if (lo == null) + lo = 0; + if (hi == null) + hi = a.length; + while (lo < hi) { + var mid = lo + hi >>> 1; + if (compare(a[mid], x) < 0) + lo = mid + 1; + else + hi = mid; + } + return lo; + }, + right: function (a, x, lo, hi) { + if (lo == null) + lo = 0; + if (hi == null) + hi = a.length; + while (lo < hi) { + var mid = lo + hi >>> 1; + if (compare(a[mid], x) > 0) + hi = mid; + else + lo = mid + 1; + } + return lo; + } + }; + } + + function ascendingComparator(f) { + return function (d, x) { + return ascending(f(d), x); + }; + } + + var ascendingBisect = bisector(ascending); + var bisectRight = ascendingBisect.right; + var bisectLeft = ascendingBisect.left; + + function pairs(array, f) { + if (f == null) + f = pair; + var i = 0, n = array.length - 1, p = array[0], pairs = new Array(n < 0 ? 0 : n); + while (i < n) + pairs[i] = f(p, p = array[++i]); + return pairs; + } + + function pair(a, b) { + return [a, b]; + } + + function cross(values0, values1, reduce) { + var n0 = values0.length, + n1 = values1.length, + values = new Array(n0 * n1), + i0, + i1, + i, + value0; + + if (reduce == null) + reduce = pair; + + for (i0 = i = 0; i0 < n0; ++i0) { + for (value0 = values0[i0], i1 = 0; i1 < n1; ++i1, ++i) { + values[i] = reduce(value0, values1[i1]); + } + } + + return values; + } + + function descending(a, b) { + return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN; + } + + function number(x) { + return x === null ? NaN : +x; + } + + function variance(values, valueof) { + var n = values.length, + m = 0, + i = -1, + mean = 0, + value, + delta, + sum = 0; + + if (valueof == null) { + while (++i < n) { + if (!isNaN(value = number(values[i]))) { + delta = value - mean; + mean += delta / ++m; + sum += delta * (value - mean); + } + } + } else { + while (++i < n) { + if (!isNaN(value = number(valueof(values[i], i, values)))) { + delta = value - mean; + mean += delta / ++m; + sum += delta * (value - mean); + } + } + } + + if (m > 1) + return sum / (m - 1); + } + + function deviation(array, f) { + var v = variance(array, f); + return v ? Math.sqrt(v) : v; + } + + function extent(values, valueof) { + var n = values.length, + i = -1, + value, + min, + max; + + if (valueof == null) { + while (++i < n) { // Find the first comparable value. + if ((value = values[i]) != null && value >= value) { + min = max = value; + while (++i < n) { // Compare the remaining values. + if ((value = values[i]) != null) { + if (min > value) + min = value; + if (max < value) + max = value; + } + } + } + } + } else { + while (++i < n) { // Find the first comparable value. + if ((value = valueof(values[i], i, values)) != null && value >= value) { + min = max = value; + while (++i < n) { // Compare the remaining values. + if ((value = valueof(values[i], i, values)) != null) { + if (min > value) + min = value; + if (max < value) + max = value; + } + } + } + } + } + + return [min, max]; + } + + var array = Array.prototype; + + var slice = array.slice; + var map = array.map; + + function constant(x) { + return function () { + return x; + }; + } + + function identity(x) { + return x; + } + + function sequence(start, stop, step) { + start = +start, stop = +stop, step = (n = arguments.length) < 2 ? (stop = start, start = 0, 1) : n < 3 ? 1 : +step; + + var i = -1, + n = Math.max(0, Math.ceil((stop - start) / step)) | 0, + range = new Array(n); + + while (++i < n) { + range[i] = start + i * step; + } + + return range; + } + + var e10 = Math.sqrt(50), + e5 = Math.sqrt(10), + e2 = Math.sqrt(2); + + function ticks(start, stop, count) { + var reverse, + i = -1, + n, + ticks, + step; + + stop = +stop, start = +start, count = +count; + if (start === stop && count > 0) + return [start]; + if (reverse = stop < start) + n = start, start = stop, stop = n; + if ((step = tickIncrement(start, stop, count)) === 0 || !isFinite(step)) + return []; + + if (step > 0) { + start = Math.ceil(start / step); + stop = Math.floor(stop / step); + ticks = new Array(n = Math.ceil(stop - start + 1)); + while (++i < n) + ticks[i] = (start + i) * step; + } else { + start = Math.floor(start * step); + stop = Math.ceil(stop * step); + ticks = new Array(n = Math.ceil(start - stop + 1)); + while (++i < n) + ticks[i] = (start - i) / step; + } + + if (reverse) + ticks.reverse(); + + return ticks; + } + + function tickIncrement(start, stop, count) { + var step = (stop - start) / Math.max(0, count), + power = Math.floor(Math.log(step) / Math.LN10), + error = step / Math.pow(10, power); + return power >= 0 + ? (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1) * Math.pow(10, power) + : -Math.pow(10, -power) / (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1); + } + + function tickStep(start, stop, count) { + var step0 = Math.abs(stop - start) / Math.max(0, count), + step1 = Math.pow(10, Math.floor(Math.log(step0) / Math.LN10)), + error = step0 / step1; + if (error >= e10) + step1 *= 10; + else if (error >= e5) + step1 *= 5; + else if (error >= e2) + step1 *= 2; + return stop < start ? -step1 : step1; + } + + function thresholdSturges(values) { + return Math.ceil(Math.log(values.length) / Math.LN2) + 1; + } + + function histogram() { + var value = identity, + domain = extent, + threshold = thresholdSturges; + + function histogram(data) { + var i, + n = data.length, + x, + values = new Array(n); + + for (i = 0; i < n; ++i) { + values[i] = value(data[i], i, data); + } + + var xz = domain(values), + x0 = xz[0], + x1 = xz[1], + tz = threshold(values, x0, x1); + + // Convert number of thresholds into uniform thresholds. + if (!Array.isArray(tz)) { + tz = tickStep(x0, x1, tz); + tz = sequence(Math.ceil(x0 / tz) * tz, x1, tz); // exclusive + } + + // Remove any thresholds outside the domain. + var m = tz.length; + while (tz[0] <= x0) + tz.shift(), --m; + while (tz[m - 1] > x1) + tz.pop(), --m; + + var bins = new Array(m + 1), + bin; + + // Initialize bins. + for (i = 0; i <= m; ++i) { + bin = bins[i] = []; + bin.x0 = i > 0 ? tz[i - 1] : x0; + bin.x1 = i < m ? tz[i] : x1; + } + + // Assign data to bins by value, ignoring any outside the domain. + for (i = 0; i < n; ++i) { + x = values[i]; + if (x0 <= x && x <= x1) { + bins[bisectRight(tz, x, 0, m)].push(data[i]); + } + } + + return bins; + } + + histogram.value = function (_) { + return arguments.length ? (value = typeof _ === "function" ? _ : constant(_), histogram) : value; + }; + + histogram.domain = function (_) { + return arguments.length ? (domain = typeof _ === "function" ? _ : constant([_[0], _[1]]), histogram) : domain; + }; + + histogram.thresholds = function (_) { + return arguments.length ? (threshold = typeof _ === "function" ? _ : Array.isArray(_) ? constant(slice.call(_)) : constant(_), histogram) : threshold; + }; + + return histogram; + } + + function threshold(values, p, valueof) { + if (valueof == null) + valueof = number; + if (!(n = values.length)) + return; + if ((p = +p) <= 0 || n < 2) + return +valueof(values[0], 0, values); + if (p >= 1) + return +valueof(values[n - 1], n - 1, values); + var n, + i = (n - 1) * p, + i0 = Math.floor(i), + value0 = +valueof(values[i0], i0, values), + value1 = +valueof(values[i0 + 1], i0 + 1, values); + return value0 + (value1 - value0) * (i - i0); + } + + function freedmanDiaconis(values, min, max) { + values = map.call(values, number).sort(ascending); + return Math.ceil((max - min) / (2 * (threshold(values, 0.75) - threshold(values, 0.25)) * Math.pow(values.length, -1 / 3))); + } + + function scott(values, min, max) { + return Math.ceil((max - min) / (3.5 * deviation(values) * Math.pow(values.length, -1 / 3))); + } + + function max(values, valueof) { + var n = values.length, + i = -1, + value, + max; + + if (valueof == null) { + while (++i < n) { // Find the first comparable value. + if ((value = values[i]) != null && value >= value) { + max = value; + while (++i < n) { // Compare the remaining values. + if ((value = values[i]) != null && value > max) { + max = value; + } + } + } + } + } else { + while (++i < n) { // Find the first comparable value. + if ((value = valueof(values[i], i, values)) != null && value >= value) { + max = value; + while (++i < n) { // Compare the remaining values. + if ((value = valueof(values[i], i, values)) != null && value > max) { + max = value; + } + } + } + } + } + + return max; + } + + function mean(values, valueof) { + var n = values.length, + m = n, + i = -1, + value, + sum = 0; + + if (valueof == null) { + while (++i < n) { + if (!isNaN(value = number(values[i]))) + sum += value; + else + --m; + } + } else { + while (++i < n) { + if (!isNaN(value = number(valueof(values[i], i, values)))) + sum += value; + else + --m; + } + } + + if (m) + return sum / m; + } + + function median(values, valueof) { + var n = values.length, + i = -1, + value, + numbers = []; + + if (valueof == null) { + while (++i < n) { + if (!isNaN(value = number(values[i]))) { + numbers.push(value); + } + } + } else { + while (++i < n) { + if (!isNaN(value = number(valueof(values[i], i, values)))) { + numbers.push(value); + } + } + } + + return threshold(numbers.sort(ascending), 0.5); + } + + function merge(arrays) { + var n = arrays.length, + m, + i = -1, + j = 0, + merged, + array; + + while (++i < n) + j += arrays[i].length; + merged = new Array(j); + + while (--n >= 0) { + array = arrays[n]; + m = array.length; + while (--m >= 0) { + merged[--j] = array[m]; + } + } + + return merged; + } + + function min(values, valueof) { + var n = values.length, + i = -1, + value, + min; + + if (valueof == null) { + while (++i < n) { // Find the first comparable value. + if ((value = values[i]) != null && value >= value) { + min = value; + while (++i < n) { // Compare the remaining values. + if ((value = values[i]) != null && min > value) { + min = value; + } + } + } + } + } else { + while (++i < n) { // Find the first comparable value. + if ((value = valueof(values[i], i, values)) != null && value >= value) { + min = value; + while (++i < n) { // Compare the remaining values. + if ((value = valueof(values[i], i, values)) != null && min > value) { + min = value; + } + } + } + } + } + + return min; + } + + function permute(array, indexes) { + var i = indexes.length, permutes = new Array(i); + while (i--) + permutes[i] = array[indexes[i]]; + return permutes; + } + + function scan(values, compare) { + if (!(n = values.length)) + return; + var n, + i = 0, + j = 0, + xi, + xj = values[j]; + + if (compare == null) + compare = ascending; + + while (++i < n) { + if (compare(xi = values[i], xj) < 0 || compare(xj, xj) !== 0) { + xj = xi, j = i; + } + } + + if (compare(xj, xj) === 0) + return j; + } + + function shuffle(array, i0, i1) { + var m = (i1 == null ? array.length : i1) - (i0 = i0 == null ? 0 : +i0), + t, + i; + + while (m) { + i = Math.random() * m-- | 0; + t = array[m + i0]; + array[m + i0] = array[i + i0]; + array[i + i0] = t; + } + + return array; + } + + function sum(values, valueof) { + var n = values.length, + i = -1, + value, + sum = 0; + + if (valueof == null) { + while (++i < n) { + if (value = +values[i]) + sum += value; // Note: zero and null are equivalent. + } + } else { + while (++i < n) { + if (value = +valueof(values[i], i, values)) + sum += value; + } + } + + return sum; + } + + function transpose(matrix) { + if (!(n = matrix.length)) + return []; + for (var i = -1, m = min(matrix, length), transpose = new Array(m); ++i < m; ) { + for (var j = -1, n, row = transpose[i] = new Array(n); ++j < n; ) { + row[j] = matrix[j][i]; + } + } + return transpose; + } + + function length(d) { + return d.length; + } + + function zip() { + return transpose(arguments); + } + + var slice$1 = Array.prototype.slice; + + function identity$1(x) { + return x; + } + + var top = 1, + right = 2, + bottom = 3, + left = 4, + epsilon = 1e-6; + + function translateX(x) { + return "translate(" + (x + 0.5) + ",0)"; + } + + function translateY(y) { + return "translate(0," + (y + 0.5) + ")"; + } + + function number$1(scale) { + return function (d) { + return +scale(d); + }; + } + + function center(scale) { + var offset = Math.max(0, scale.bandwidth() - 1) / 2; // Adjust for 0.5px offset. + if (scale.round()) + offset = Math.round(offset); + return function (d) { + return +scale(d) + offset; + }; + } + + function entering() { + return !this.__axis; + } + + function axis(orient, scale) { + var tickArguments = [], + tickValues = null, + tickFormat = null, + tickSizeInner = 6, + tickSizeOuter = 6, + tickPadding = 3, + k = orient === top || orient === left ? -1 : 1, + x = orient === left || orient === right ? "x" : "y", + transform = orient === top || orient === bottom ? translateX : translateY; + + function axis(context) { + var values = tickValues == null ? (scale.ticks ? scale.ticks.apply(scale, tickArguments) : scale.domain()) : tickValues, + format = tickFormat == null ? (scale.tickFormat ? scale.tickFormat.apply(scale, tickArguments) : identity$1) : tickFormat, + spacing = Math.max(tickSizeInner, 0) + tickPadding, + range = scale.range(), + range0 = +range[0] + 0.5, + range1 = +range[range.length - 1] + 0.5, + position = (scale.bandwidth ? center : number$1)(scale.copy()), + selection = context.selection ? context.selection() : context, + path = selection.selectAll(".domain").data([null]), + tick = selection.selectAll(".tick").data(values, scale).order(), + tickExit = tick.exit(), + tickEnter = tick.enter().append("g").attr("class", "tick"), + line = tick.select("line"), + text = tick.select("text"); + + path = path.merge(path.enter().insert("path", ".tick") + .attr("class", "domain") + .attr("stroke", "currentColor")); + + tick = tick.merge(tickEnter); + + line = line.merge(tickEnter.append("line") + .attr("stroke", "currentColor") + .attr(x + "2", k * tickSizeInner)); + + text = text.merge(tickEnter.append("text") + .attr("fill", "currentColor") + .attr(x, k * spacing) + .attr("dy", orient === top ? "0em" : orient === bottom ? "0.71em" : "0.32em")); + + if (context !== selection) { + path = path.transition(context); + tick = tick.transition(context); + line = line.transition(context); + text = text.transition(context); + + tickExit = tickExit.transition(context) + .attr("opacity", epsilon) + .attr("transform", function (d) { + return isFinite(d = position(d)) ? transform(d) : this.getAttribute("transform"); + }); + + tickEnter + .attr("opacity", epsilon) + .attr("transform", function (d) { + var p = this.parentNode.__axis; + return transform(p && isFinite(p = p(d)) ? p : position(d)); + }); + } + + tickExit.remove(); + + path + .attr("d", orient === left || orient == right + ? (tickSizeOuter ? "M" + k * tickSizeOuter + "," + range0 + "H0.5V" + range1 + "H" + k * tickSizeOuter : "M0.5," + range0 + "V" + range1) + : (tickSizeOuter ? "M" + range0 + "," + k * tickSizeOuter + "V0.5H" + range1 + "V" + k * tickSizeOuter : "M" + range0 + ",0.5H" + range1)); + + tick + .attr("opacity", 1) + .attr("transform", function (d) { + return transform(position(d)); + }); + + line + .attr(x + "2", k * tickSizeInner); + + text + .attr(x, k * spacing) + .text(format); + + selection.filter(entering) + .attr("fill", "none") + .attr("font-size", 10) + .attr("font-family", "sans-serif") + .attr("text-anchor", orient === right ? "start" : orient === left ? "end" : "middle"); + + selection + .each(function () { + this.__axis = position; + }); + } + + axis.scale = function (_) { + return arguments.length ? (scale = _, axis) : scale; + }; + + axis.ticks = function () { + return tickArguments = slice$1.call(arguments), axis; + }; + + axis.tickArguments = function (_) { + return arguments.length ? (tickArguments = _ == null ? [] : slice$1.call(_), axis) : tickArguments.slice(); + }; + + axis.tickValues = function (_) { + return arguments.length ? (tickValues = _ == null ? null : slice$1.call(_), axis) : tickValues && tickValues.slice(); + }; + + axis.tickFormat = function (_) { + return arguments.length ? (tickFormat = _, axis) : tickFormat; + }; + + axis.tickSize = function (_) { + return arguments.length ? (tickSizeInner = tickSizeOuter = +_, axis) : tickSizeInner; + }; + + axis.tickSizeInner = function (_) { + return arguments.length ? (tickSizeInner = +_, axis) : tickSizeInner; + }; + + axis.tickSizeOuter = function (_) { + return arguments.length ? (tickSizeOuter = +_, axis) : tickSizeOuter; + }; + + axis.tickPadding = function (_) { + return arguments.length ? (tickPadding = +_, axis) : tickPadding; + }; + + return axis; + } + + function axisTop(scale) { + return axis(top, scale); + } + + function axisRight(scale) { + return axis(right, scale); + } + + function axisBottom(scale) { + return axis(bottom, scale); + } + + function axisLeft(scale) { + return axis(left, scale); + } + + var noop = {value: function () {}}; + + function dispatch() { + for (var i = 0, n = arguments.length, _ = {}, t; i < n; ++i) { + if (!(t = arguments[i] + "") || (t in _) || /[\s.]/.test(t)) + throw new Error("illegal type: " + t); + _[t] = []; + } + return new Dispatch(_); + } + + function Dispatch(_) { + this._ = _; + } + + function parseTypenames(typenames, types) { + return typenames.trim().split(/^|\s+/).map(function (t) { + var name = "", i = t.indexOf("."); + if (i >= 0) + name = t.slice(i + 1), t = t.slice(0, i); + if (t && !types.hasOwnProperty(t)) + throw new Error("unknown type: " + t); + return {type: t, name: name}; + }); + } + + Dispatch.prototype = dispatch.prototype = { + constructor: Dispatch, + on: function (typename, callback) { + var _ = this._, + T = parseTypenames(typename + "", _), + t, + i = -1, + n = T.length; + + // If no callback was specified, return the callback of the given type and name. + if (arguments.length < 2) { + while (++i < n) + if ((t = (typename = T[i]).type) && (t = get(_[t], typename.name))) + return t; + return; + } + + // If a type was specified, set the callback for the given type and name. + // Otherwise, if a null callback was specified, remove callbacks of the given name. + if (callback != null && typeof callback !== "function") + throw new Error("invalid callback: " + callback); + while (++i < n) { + if (t = (typename = T[i]).type) + _[t] = set(_[t], typename.name, callback); + else if (callback == null) + for (t in _) + _[t] = set(_[t], typename.name, null); + } + + return this; + }, + copy: function () { + var copy = {}, _ = this._; + for (var t in _) + copy[t] = _[t].slice(); + return new Dispatch(copy); + }, + call: function (type, that) { + if ((n = arguments.length - 2) > 0) + for (var args = new Array(n), i = 0, n, t; i < n; ++i) + args[i] = arguments[i + 2]; + if (!this._.hasOwnProperty(type)) + throw new Error("unknown type: " + type); + for (t = this._[type], i = 0, n = t.length; i < n; ++i) + t[i].value.apply(that, args); + }, + apply: function (type, that, args) { + if (!this._.hasOwnProperty(type)) + throw new Error("unknown type: " + type); + for (var t = this._[type], i = 0, n = t.length; i < n; ++i) + t[i].value.apply(that, args); + } + }; + + function get(type, name) { + for (var i = 0, n = type.length, c; i < n; ++i) { + if ((c = type[i]).name === name) { + return c.value; + } + } + } + + function set(type, name, callback) { + for (var i = 0, n = type.length; i < n; ++i) { + if (type[i].name === name) { + type[i] = noop, type = type.slice(0, i).concat(type.slice(i + 1)); + break; + } + } + if (callback != null) + type.push({name: name, value: callback}); + return type; + } + + var xhtml = "http://www.w3.org/1999/xhtml"; + + var namespaces = { + svg: "http://www.w3.org/2000/svg", + xhtml: xhtml, + xlink: "http://www.w3.org/1999/xlink", + xml: "http://www.w3.org/XML/1998/namespace", + xmlns: "http://www.w3.org/2000/xmlns/" + }; + + function namespace(name) { + var prefix = name += "", i = prefix.indexOf(":"); + if (i >= 0 && (prefix = name.slice(0, i)) !== "xmlns") + name = name.slice(i + 1); + return namespaces.hasOwnProperty(prefix) ? {space: namespaces[prefix], local: name} : name; + } + + function creatorInherit(name) { + return function () { + var document = this.ownerDocument, + uri = this.namespaceURI; + return uri === xhtml && document.documentElement.namespaceURI === xhtml + ? document.createElement(name) + : document.createElementNS(uri, name); + }; + } + + function creatorFixed(fullname) { + return function () { + return this.ownerDocument.createElementNS(fullname.space, fullname.local); + }; + } + + function creator(name) { + var fullname = namespace(name); + return (fullname.local + ? creatorFixed + : creatorInherit)(fullname); + } + + function none() {} + + function selector(selector) { + return selector == null ? none : function () { + return this.querySelector(selector); + }; + } + + function selection_select(select) { + if (typeof select !== "function") + select = selector(select); + + for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) { + if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) { + if ("__data__" in node) + subnode.__data__ = node.__data__; + subgroup[i] = subnode; + } + } + } + + return new Selection(subgroups, this._parents); + } + + function empty() { + return []; + } + + function selectorAll(selector) { + return selector == null ? empty : function () { + return this.querySelectorAll(selector); + }; + } + + function selection_selectAll(select) { + if (typeof select !== "function") + select = selectorAll(select); + + for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { + if (node = group[i]) { + subgroups.push(select.call(node, node.__data__, i, group)); + parents.push(node); + } + } + } + + return new Selection(subgroups, parents); + } + + function matcher(selector) { + return function () { + return this.matches(selector); + }; + } + + function selection_filter(match) { + if (typeof match !== "function") + match = matcher(match); + + for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) { + if ((node = group[i]) && match.call(node, node.__data__, i, group)) { + subgroup.push(node); + } + } + } + + return new Selection(subgroups, this._parents); + } + + function sparse(update) { + return new Array(update.length); + } + + function selection_enter() { + return new Selection(this._enter || this._groups.map(sparse), this._parents); + } + + function EnterNode(parent, datum) { + this.ownerDocument = parent.ownerDocument; + this.namespaceURI = parent.namespaceURI; + this._next = null; + this._parent = parent; + this.__data__ = datum; + } + + EnterNode.prototype = { + constructor: EnterNode, + appendChild: function (child) { + return this._parent.insertBefore(child, this._next); + }, + insertBefore: function (child, next) { + return this._parent.insertBefore(child, next); + }, + querySelector: function (selector) { + return this._parent.querySelector(selector); + }, + querySelectorAll: function (selector) { + return this._parent.querySelectorAll(selector); + } + }; + + function constant$1(x) { + return function () { + return x; + }; + } + + var keyPrefix = "$"; // Protect against keys like “__proto__”. + + function bindIndex(parent, group, enter, update, exit, data) { + var i = 0, + node, + groupLength = group.length, + dataLength = data.length; + + // Put any non-null nodes that fit into update. + // Put any null nodes into enter. + // Put any remaining data into enter. + for (; i < dataLength; ++i) { + if (node = group[i]) { + node.__data__ = data[i]; + update[i] = node; + } else { + enter[i] = new EnterNode(parent, data[i]); + } + } + + // Put any non-null nodes that don’t fit into exit. + for (; i < groupLength; ++i) { + if (node = group[i]) { + exit[i] = node; + } + } + } + + function bindKey(parent, group, enter, update, exit, data, key) { + var i, + node, + nodeByKeyValue = {}, + groupLength = group.length, + dataLength = data.length, + keyValues = new Array(groupLength), + keyValue; + + // Compute the key for each node. + // If multiple nodes have the same key, the duplicates are added to exit. + for (i = 0; i < groupLength; ++i) { + if (node = group[i]) { + keyValues[i] = keyValue = keyPrefix + key.call(node, node.__data__, i, group); + if (keyValue in nodeByKeyValue) { + exit[i] = node; + } else { + nodeByKeyValue[keyValue] = node; + } + } + } + + // Compute the key for each datum. + // If there a node associated with this key, join and add it to update. + // If there is not (or the key is a duplicate), add it to enter. + for (i = 0; i < dataLength; ++i) { + keyValue = keyPrefix + key.call(parent, data[i], i, data); + if (node = nodeByKeyValue[keyValue]) { + update[i] = node; + node.__data__ = data[i]; + nodeByKeyValue[keyValue] = null; + } else { + enter[i] = new EnterNode(parent, data[i]); + } + } + + // Add any remaining nodes that were not bound to data to exit. + for (i = 0; i < groupLength; ++i) { + if ((node = group[i]) && (nodeByKeyValue[keyValues[i]] === node)) { + exit[i] = node; + } + } + } + + function selection_data(value, key) { + if (!value) { + data = new Array(this.size()), j = -1; + this.each(function (d) { + data[++j] = d; + }); + return data; + } + + var bind = key ? bindKey : bindIndex, + parents = this._parents, + groups = this._groups; + + if (typeof value !== "function") + value = constant$1(value); + + for (var m = groups.length, update = new Array(m), enter = new Array(m), exit = new Array(m), j = 0; j < m; ++j) { + var parent = parents[j], + group = groups[j], + groupLength = group.length, + data = value.call(parent, parent && parent.__data__, j, parents), + dataLength = data.length, + enterGroup = enter[j] = new Array(dataLength), + updateGroup = update[j] = new Array(dataLength), + exitGroup = exit[j] = new Array(groupLength); + + bind(parent, group, enterGroup, updateGroup, exitGroup, data, key); + + // Now connect the enter nodes to their following update node, such that + // appendChild can insert the materialized enter node before this node, + // rather than at the end of the parent node. + for (var i0 = 0, i1 = 0, previous, next; i0 < dataLength; ++i0) { + if (previous = enterGroup[i0]) { + if (i0 >= i1) + i1 = i0 + 1; + while (!(next = updateGroup[i1]) && ++i1 < dataLength) + ; + previous._next = next || null; + } + } + } + + update = new Selection(update, parents); + update._enter = enter; + update._exit = exit; + return update; + } + + function selection_exit() { + return new Selection(this._exit || this._groups.map(sparse), this._parents); + } + + function selection_join(onenter, onupdate, onexit) { + var enter = this.enter(), update = this, exit = this.exit(); + enter = typeof onenter === "function" ? onenter(enter) : enter.append(onenter + ""); + if (onupdate != null) + update = onupdate(update); + if (onexit == null) + exit.remove(); + else + onexit(exit); + return enter && update ? enter.merge(update).order() : update; + } + + function selection_merge(selection) { + + 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) { + for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) { + if (node = group0[i] || group1[i]) { + merge[i] = node; + } + } + } + + for (; j < m0; ++j) { + merges[j] = groups0[j]; + } + + return new Selection(merges, this._parents); + } + + function selection_order() { + + for (var groups = this._groups, j = -1, m = groups.length; ++j < m; ) { + for (var group = groups[j], i = group.length - 1, next = group[i], node; --i >= 0; ) { + if (node = group[i]) { + if (next && node.compareDocumentPosition(next) ^ 4) + next.parentNode.insertBefore(node, next); + next = node; + } + } + } + + return this; + } + + function selection_sort(compare) { + if (!compare) + compare = ascending$1; + + function compareNode(a, b) { + return a && b ? compare(a.__data__, b.__data__) : !a - !b; + } + + for (var groups = this._groups, m = groups.length, sortgroups = new Array(m), j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, sortgroup = sortgroups[j] = new Array(n), node, i = 0; i < n; ++i) { + if (node = group[i]) { + sortgroup[i] = node; + } + } + sortgroup.sort(compareNode); + } + + return new Selection(sortgroups, this._parents).order(); + } + + function ascending$1(a, b) { + return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN; + } + + function selection_call() { + var callback = arguments[0]; + arguments[0] = this; + callback.apply(null, arguments); + return this; + } + + function selection_nodes() { + var nodes = new Array(this.size()), i = -1; + this.each(function () { + nodes[++i] = this; + }); + return nodes; + } + + function selection_node() { + + for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) { + for (var group = groups[j], i = 0, n = group.length; i < n; ++i) { + var node = group[i]; + if (node) + return node; + } + } + + return null; + } + + function selection_size() { + var size = 0; + this.each(function () { + ++size; + }); + return size; + } + + function selection_empty() { + return !this.node(); + } + + function selection_each(callback) { + + for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) { + for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) { + if (node = group[i]) + callback.call(node, node.__data__, i, group); + } + } + + return this; + } + + function attrRemove(name) { + return function () { + this.removeAttribute(name); + }; + } + + function attrRemoveNS(fullname) { + return function () { + this.removeAttributeNS(fullname.space, fullname.local); + }; + } + + function attrConstant(name, value) { + return function () { + this.setAttribute(name, value); + }; + } + + function attrConstantNS(fullname, value) { + return function () { + this.setAttributeNS(fullname.space, fullname.local, value); + }; + } + + function attrFunction(name, value) { + return function () { + var v = value.apply(this, arguments); + if (v == null) + this.removeAttribute(name); + else + this.setAttribute(name, v); + }; + } + + function attrFunctionNS(fullname, value) { + return function () { + var v = value.apply(this, arguments); + if (v == null) + this.removeAttributeNS(fullname.space, fullname.local); + else + this.setAttributeNS(fullname.space, fullname.local, v); + }; + } + + function selection_attr(name, value) { + var fullname = namespace(name); + + if (arguments.length < 2) { + var node = this.node(); + return fullname.local + ? node.getAttributeNS(fullname.space, fullname.local) + : node.getAttribute(fullname); + } + + return this.each((value == null + ? (fullname.local ? attrRemoveNS : attrRemove) : (typeof value === "function" + ? (fullname.local ? attrFunctionNS : attrFunction) + : (fullname.local ? attrConstantNS : attrConstant)))(fullname, value)); + } + + function defaultView(node) { + return (node.ownerDocument && node.ownerDocument.defaultView) // node is a Node + || (node.document && node) // node is a Window + || node.defaultView; // node is a Document + } + + function styleRemove(name) { + return function () { + this.style.removeProperty(name); + }; + } + + function styleConstant(name, value, priority) { + return function () { + this.style.setProperty(name, value, priority); + }; + } + + function styleFunction(name, value, priority) { + return function () { + var v = value.apply(this, arguments); + if (v == null) + this.style.removeProperty(name); + else + this.style.setProperty(name, v, priority); + }; + } + + function selection_style(name, value, priority) { + return arguments.length > 1 + ? this.each((value == null + ? styleRemove : typeof value === "function" + ? styleFunction + : styleConstant)(name, value, priority == null ? "" : priority)) + : styleValue(this.node(), name); + } + + function styleValue(node, name) { + return node.style.getPropertyValue(name) + || defaultView(node).getComputedStyle(node, null).getPropertyValue(name); + } + + function propertyRemove(name) { + return function () { + delete this[name]; + }; + } + + function propertyConstant(name, value) { + return function () { + this[name] = value; + }; + } + + function propertyFunction(name, value) { + return function () { + var v = value.apply(this, arguments); + if (v == null) + delete this[name]; + else + this[name] = v; + }; + } + + function selection_property(name, value) { + return arguments.length > 1 + ? this.each((value == null + ? propertyRemove : typeof value === "function" + ? propertyFunction + : propertyConstant)(name, value)) + : this.node()[name]; + } + + function classArray(string) { + return string.trim().split(/^|\s+/); + } + + function classList(node) { + return node.classList || new ClassList(node); + } + + function ClassList(node) { + this._node = node; + this._names = classArray(node.getAttribute("class") || ""); + } + + ClassList.prototype = { + add: function (name) { + var i = this._names.indexOf(name); + if (i < 0) { + this._names.push(name); + this._node.setAttribute("class", this._names.join(" ")); + } + }, + remove: function (name) { + var i = this._names.indexOf(name); + if (i >= 0) { + this._names.splice(i, 1); + this._node.setAttribute("class", this._names.join(" ")); + } + }, + contains: function (name) { + return this._names.indexOf(name) >= 0; + } + }; + + function classedAdd(node, names) { + var list = classList(node), i = -1, n = names.length; + while (++i < n) + list.add(names[i]); + } + + function classedRemove(node, names) { + var list = classList(node), i = -1, n = names.length; + while (++i < n) + list.remove(names[i]); + } + + function classedTrue(names) { + return function () { + classedAdd(this, names); + }; + } + + function classedFalse(names) { + return function () { + classedRemove(this, names); + }; + } + + function classedFunction(names, value) { + return function () { + (value.apply(this, arguments) ? classedAdd : classedRemove)(this, names); + }; + } + + function selection_classed(name, value) { + var names = classArray(name + ""); + + if (arguments.length < 2) { + var list = classList(this.node()), i = -1, n = names.length; + while (++i < n) + if (!list.contains(names[i])) + return false; + return true; + } + + return this.each((typeof value === "function" + ? classedFunction : value + ? classedTrue + : classedFalse)(names, value)); + } + + function textRemove() { + this.textContent = ""; + } + + function textConstant(value) { + return function () { + this.textContent = value; + }; + } + + function textFunction(value) { + return function () { + var v = value.apply(this, arguments); + this.textContent = v == null ? "" : v; + }; + } + + function selection_text(value) { + return arguments.length + ? this.each(value == null + ? textRemove : (typeof value === "function" + ? textFunction + : textConstant)(value)) + : this.node().textContent; + } + + function htmlRemove() { + this.innerHTML = ""; + } + + function htmlConstant(value) { + return function () { + this.innerHTML = value; + }; + } + + function htmlFunction(value) { + return function () { + var v = value.apply(this, arguments); + this.innerHTML = v == null ? "" : v; + }; + } + + function selection_html(value) { + return arguments.length + ? this.each(value == null + ? htmlRemove : (typeof value === "function" + ? htmlFunction + : htmlConstant)(value)) + : this.node().innerHTML; + } + + function raise() { + if (this.nextSibling) + this.parentNode.appendChild(this); + } + + function selection_raise() { + return this.each(raise); + } + + function lower() { + if (this.previousSibling) + this.parentNode.insertBefore(this, this.parentNode.firstChild); + } + + function selection_lower() { + return this.each(lower); + } + + function selection_append(name) { + var create = typeof name === "function" ? name : creator(name); + return this.select(function () { + return this.appendChild(create.apply(this, arguments)); + }); + } + + function constantNull() { + return null; + } + + function selection_insert(name, before) { + var create = typeof name === "function" ? name : creator(name), + select = before == null ? constantNull : typeof before === "function" ? before : selector(before); + return this.select(function () { + return this.insertBefore(create.apply(this, arguments), select.apply(this, arguments) || null); + }); + } + + function remove() { + var parent = this.parentNode; + if (parent) + parent.removeChild(this); + } + + function selection_remove() { + return this.each(remove); + } + + function selection_cloneShallow() { + var clone = this.cloneNode(false), parent = this.parentNode; + return parent ? parent.insertBefore(clone, this.nextSibling) : clone; + } + + function selection_cloneDeep() { + var clone = this.cloneNode(true), parent = this.parentNode; + return parent ? parent.insertBefore(clone, this.nextSibling) : clone; + } + + function selection_clone(deep) { + return this.select(deep ? selection_cloneDeep : selection_cloneShallow); + } + + function selection_datum(value) { + return arguments.length + ? this.property("__data__", value) + : this.node().__data__; + } + + var filterEvents = {}; + + exports.event = null; + + if (typeof document !== "undefined") { + var element = document.documentElement; + if (!("onmouseenter" in element)) { + filterEvents = {mouseenter: "mouseover", mouseleave: "mouseout"}; + } + } + + function filterContextListener(listener, index, group) { + listener = contextListener(listener, index, group); + return function (event) { + var related = event.relatedTarget; + if (!related || (related !== this && !(related.compareDocumentPosition(this) & 8))) { + listener.call(this, event); + } + }; + } + + function contextListener(listener, index, group) { + return function (event1) { + var event0 = exports.event; // Events can be reentrant (e.g., focus). + exports.event = event1; + try { + listener.call(this, this.__data__, index, group); + } finally { + exports.event = event0; + } + }; + } + + function parseTypenames$1(typenames) { + return typenames.trim().split(/^|\s+/).map(function (t) { + var name = "", i = t.indexOf("."); + if (i >= 0) + name = t.slice(i + 1), t = t.slice(0, i); + return {type: t, name: name}; + }); + } + + function onRemove(typename) { + return function () { + var on = this.__on; + if (!on) + return; + for (var j = 0, i = -1, m = on.length, o; j < m; ++j) { + if (o = on[j], (!typename.type || o.type === typename.type) && o.name === typename.name) { + this.removeEventListener(o.type, o.listener, o.capture); + } else { + on[++i] = o; + } + } + if (++i) + on.length = i; + else + delete this.__on; + }; + } + + function onAdd(typename, value, capture) { + var wrap = filterEvents.hasOwnProperty(typename.type) ? filterContextListener : contextListener; + return function (d, i, group) { + var on = this.__on, o, listener = wrap(value, i, group); + if (on) + for (var j = 0, m = on.length; j < m; ++j) { + if ((o = on[j]).type === typename.type && o.name === typename.name) { + this.removeEventListener(o.type, o.listener, o.capture); + this.addEventListener(o.type, o.listener = listener, o.capture = capture); + o.value = value; + return; + } + } + this.addEventListener(typename.type, listener, capture); + o = {type: typename.type, name: typename.name, value: value, listener: listener, capture: capture}; + if (!on) + this.__on = [o]; + else + on.push(o); + }; + } + + function selection_on(typename, value, capture) { + var typenames = parseTypenames$1(typename + ""), i, n = typenames.length, t; + + if (arguments.length < 2) { + var on = this.node().__on; + if (on) + for (var j = 0, m = on.length, o; j < m; ++j) { + for (i = 0, o = on[j]; i < n; ++i) { + if ((t = typenames[i]).type === o.type && t.name === o.name) { + return o.value; + } + } + } + return; + } + + on = value ? onAdd : onRemove; + if (capture == null) + capture = false; + for (i = 0; i < n; ++i) + this.each(on(typenames[i], value, capture)); + return this; + } + + function customEvent(event1, listener, that, args) { + var event0 = exports.event; + event1.sourceEvent = exports.event; + exports.event = event1; + try { + return listener.apply(that, args); + } finally { + exports.event = event0; + } + } + + function dispatchEvent(node, type, params) { + var window = defaultView(node), + event = window.CustomEvent; + + if (typeof event === "function") { + event = new event(type, params); + } else { + event = window.document.createEvent("Event"); + if (params) + event.initEvent(type, params.bubbles, params.cancelable), event.detail = params.detail; + else + event.initEvent(type, false, false); + } + + node.dispatchEvent(event); + } + + function dispatchConstant(type, params) { + return function () { + return dispatchEvent(this, type, params); + }; + } + + function dispatchFunction(type, params) { + return function () { + return dispatchEvent(this, type, params.apply(this, arguments)); + }; + } + + function selection_dispatch(type, params) { + return this.each((typeof params === "function" + ? dispatchFunction + : dispatchConstant)(type, params)); + } + + var root = [null]; + + function Selection(groups, parents) { + this._groups = groups; + this._parents = parents; + } + + function selection() { + return new Selection([[document.documentElement]], root); + } + + Selection.prototype = selection.prototype = { + constructor: Selection, + select: selection_select, + selectAll: selection_selectAll, + filter: selection_filter, + data: selection_data, + enter: selection_enter, + exit: selection_exit, + join: selection_join, + merge: selection_merge, + order: selection_order, + sort: selection_sort, + call: selection_call, + nodes: selection_nodes, + node: selection_node, + size: selection_size, + empty: selection_empty, + each: selection_each, + attr: selection_attr, + style: selection_style, + property: selection_property, + classed: selection_classed, + text: selection_text, + html: selection_html, + raise: selection_raise, + lower: selection_lower, + append: selection_append, + insert: selection_insert, + remove: selection_remove, + clone: selection_clone, + datum: selection_datum, + on: selection_on, + dispatch: selection_dispatch + }; + + function select(selector) { + return typeof selector === "string" + ? new Selection([[document.querySelector(selector)]], [document.documentElement]) + : new Selection([[selector]], root); + } + + function create(name) { + return select(creator(name).call(document.documentElement)); + } + + var nextId = 0; + + function local() { + return new Local; + } + + function Local() { + this._ = "@" + (++nextId).toString(36); + } + + Local.prototype = local.prototype = { + constructor: Local, + get: function (node) { + var id = this._; + while (!(id in node)) + if (!(node = node.parentNode)) + return; + return node[id]; + }, + set: function (node, value) { + return node[this._] = value; + }, + remove: function (node) { + return this._ in node && delete node[this._]; + }, + toString: function () { + return this._; + } + }; + + function sourceEvent() { + var current = exports.event, source; + while (source = current.sourceEvent) + current = source; + return current; + } + + function point(node, event) { + var svg = node.ownerSVGElement || node; + + if (svg.createSVGPoint) { + var point = svg.createSVGPoint(); + point.x = event.clientX, point.y = event.clientY; + point = point.matrixTransform(node.getScreenCTM().inverse()); + return [point.x, point.y]; + } + + var rect = node.getBoundingClientRect(); + return [event.clientX - rect.left - node.clientLeft, event.clientY - rect.top - node.clientTop]; + } + + function mouse(node) { + var event = sourceEvent(); + if (event.changedTouches) + event = event.changedTouches[0]; + return point(node, event); + } + + function selectAll(selector) { + return typeof selector === "string" + ? new Selection([document.querySelectorAll(selector)], [document.documentElement]) + : new Selection([selector == null ? [] : selector], root); + } + + function touch(node, touches, identifier) { + if (arguments.length < 3) + identifier = touches, touches = sourceEvent().changedTouches; + + for (var i = 0, n = touches ? touches.length : 0, touch; i < n; ++i) { + if ((touch = touches[i]).identifier === identifier) { + return point(node, touch); + } + } + + return null; + } + + function touches(node, touches) { + if (touches == null) + touches = sourceEvent().touches; + + for (var i = 0, n = touches ? touches.length : 0, points = new Array(n); i < n; ++i) { + points[i] = point(node, touches[i]); + } + + return points; + } + + function nopropagation() { + exports.event.stopImmediatePropagation(); + } + + function noevent() { + exports.event.preventDefault(); + exports.event.stopImmediatePropagation(); + } + + function dragDisable(view) { + var root = view.document.documentElement, + selection = select(view).on("dragstart.drag", noevent, true); + if ("onselectstart" in root) { + selection.on("selectstart.drag", noevent, true); + } else { + root.__noselect = root.style.MozUserSelect; + root.style.MozUserSelect = "none"; + } + } + + function yesdrag(view, noclick) { + var root = view.document.documentElement, + selection = select(view).on("dragstart.drag", null); + if (noclick) { + selection.on("click.drag", noevent, true); + setTimeout(function () { + selection.on("click.drag", null); + }, 0); + } + if ("onselectstart" in root) { + selection.on("selectstart.drag", null); + } else { + root.style.MozUserSelect = root.__noselect; + delete root.__noselect; + } + } + + function constant$2(x) { + return function () { + return x; + }; + } + + function DragEvent(target, type, subject, id, active, x, y, dx, dy, dispatch) { + this.target = target; + this.type = type; + this.subject = subject; + this.identifier = id; + this.active = active; + this.x = x; + this.y = y; + this.dx = dx; + this.dy = dy; + this._ = dispatch; + } + + DragEvent.prototype.on = function () { + var value = this._.on.apply(this._, arguments); + return value === this._ ? this : value; + }; + +// Ignore right-click, since that should open the context menu. + function defaultFilter() { + return !exports.event.ctrlKey && !exports.event.button; + } + + function defaultContainer() { + return this.parentNode; + } + + function defaultSubject(d) { + return d == null ? {x: exports.event.x, y: exports.event.y} : d; + } + + function defaultTouchable() { + return navigator.maxTouchPoints || ("ontouchstart" in this); + } + + function drag() { + var filter = defaultFilter, + container = defaultContainer, + subject = defaultSubject, + touchable = defaultTouchable, + gestures = {}, + listeners = dispatch("start", "drag", "end"), + active = 0, + mousedownx, + mousedowny, + mousemoving, + touchending, + clickDistance2 = 0; + + function drag(selection) { + selection + .on("mousedown.drag", mousedowned) + .filter(touchable) + .on("touchstart.drag", touchstarted) + .on("touchmove.drag", touchmoved) + .on("touchend.drag touchcancel.drag", touchended) + .style("touch-action", "none") + .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)"); + } + + function mousedowned() { + if (touchending || !filter.apply(this, arguments)) + return; + var gesture = beforestart("mouse", container.apply(this, arguments), mouse, this, arguments); + if (!gesture) + return; + select(exports.event.view).on("mousemove.drag", mousemoved, true).on("mouseup.drag", mouseupped, true); + dragDisable(exports.event.view); + nopropagation(); + mousemoving = false; + mousedownx = exports.event.clientX; + mousedowny = exports.event.clientY; + gesture("start"); + } + + function mousemoved() { + noevent(); + if (!mousemoving) { + var dx = exports.event.clientX - mousedownx, dy = exports.event.clientY - mousedowny; + mousemoving = dx * dx + dy * dy > clickDistance2; + } + gestures.mouse("drag"); + } + + function mouseupped() { + select(exports.event.view).on("mousemove.drag mouseup.drag", null); + yesdrag(exports.event.view, mousemoving); + noevent(); + gestures.mouse("end"); + } + + function touchstarted() { + if (!filter.apply(this, arguments)) + return; + var touches = exports.event.changedTouches, + c = container.apply(this, arguments), + n = touches.length, i, gesture; + + for (i = 0; i < n; ++i) { + if (gesture = beforestart(touches[i].identifier, c, touch, this, arguments)) { + nopropagation(); + gesture("start"); + } + } + } + + function touchmoved() { + var touches = exports.event.changedTouches, + n = touches.length, i, gesture; + + for (i = 0; i < n; ++i) { + if (gesture = gestures[touches[i].identifier]) { + noevent(); + gesture("drag"); + } + } + } + + function touchended() { + var touches = exports.event.changedTouches, + n = touches.length, i, gesture; + + if (touchending) + clearTimeout(touchending); + touchending = setTimeout(function () { + touchending = null; + }, 500); // Ghost clicks are delayed! + for (i = 0; i < n; ++i) { + if (gesture = gestures[touches[i].identifier]) { + nopropagation(); + gesture("end"); + } + } + } + + function beforestart(id, container, point, that, args) { + var p = point(container, id), s, dx, dy, + sublisteners = listeners.copy(); + + if (!customEvent(new DragEvent(drag, "beforestart", s, id, active, p[0], p[1], 0, 0, sublisteners), function () { + if ((exports.event.subject = s = subject.apply(that, args)) == null) + return false; + dx = s.x - p[0] || 0; + dy = s.y - p[1] || 0; + return true; + })) + return; + + return function gesture(type) { + var p0 = p, n; + switch (type) { + case "start": + gestures[id] = gesture, n = active++; + break; + case "end": + delete gestures[id], --active; // nobreak + case "drag": + p = point(container, id), n = active; + break; + } + 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]); + }; + } + + drag.filter = function (_) { + return arguments.length ? (filter = typeof _ === "function" ? _ : constant$2(!!_), drag) : filter; + }; + + drag.container = function (_) { + return arguments.length ? (container = typeof _ === "function" ? _ : constant$2(_), drag) : container; + }; + + drag.subject = function (_) { + return arguments.length ? (subject = typeof _ === "function" ? _ : constant$2(_), drag) : subject; + }; + + drag.touchable = function (_) { + return arguments.length ? (touchable = typeof _ === "function" ? _ : constant$2(!!_), drag) : touchable; + }; + + drag.on = function () { + var value = listeners.on.apply(listeners, arguments); + return value === listeners ? drag : value; + }; + + drag.clickDistance = function (_) { + return arguments.length ? (clickDistance2 = (_ = +_) * _, drag) : Math.sqrt(clickDistance2); + }; + + return drag; + } + + function define(constructor, factory, prototype) { + constructor.prototype = factory.prototype = prototype; + prototype.constructor = constructor; + } + + function extend(parent, definition) { + var prototype = Object.create(parent.prototype); + for (var key in definition) + prototype[key] = definition[key]; + return prototype; + } + + function Color() {} + + var darker = 0.7; + var brighter = 1 / darker; + + var reI = "\\s*([+-]?\\d+)\\s*", + reN = "\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)\\s*", + reP = "\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)%\\s*", + reHex = /^#([0-9a-f]{3,8})$/, + reRgbInteger = new RegExp("^rgb\\(" + [reI, reI, reI] + "\\)$"), + reRgbPercent = new RegExp("^rgb\\(" + [reP, reP, reP] + "\\)$"), + reRgbaInteger = new RegExp("^rgba\\(" + [reI, reI, reI, reN] + "\\)$"), + reRgbaPercent = new RegExp("^rgba\\(" + [reP, reP, reP, reN] + "\\)$"), + reHslPercent = new RegExp("^hsl\\(" + [reN, reP, reP] + "\\)$"), + reHslaPercent = new RegExp("^hsla\\(" + [reN, reP, reP, reN] + "\\)$"); + + var named = { + aliceblue: 0xf0f8ff, + antiquewhite: 0xfaebd7, + aqua: 0x00ffff, + aquamarine: 0x7fffd4, + azure: 0xf0ffff, + beige: 0xf5f5dc, + bisque: 0xffe4c4, + black: 0x000000, + blanchedalmond: 0xffebcd, + blue: 0x0000ff, + blueviolet: 0x8a2be2, + brown: 0xa52a2a, + burlywood: 0xdeb887, + cadetblue: 0x5f9ea0, + chartreuse: 0x7fff00, + chocolate: 0xd2691e, + coral: 0xff7f50, + cornflowerblue: 0x6495ed, + cornsilk: 0xfff8dc, + crimson: 0xdc143c, + cyan: 0x00ffff, + darkblue: 0x00008b, + darkcyan: 0x008b8b, + darkgoldenrod: 0xb8860b, + darkgray: 0xa9a9a9, + darkgreen: 0x006400, + darkgrey: 0xa9a9a9, + darkkhaki: 0xbdb76b, + darkmagenta: 0x8b008b, + darkolivegreen: 0x556b2f, + darkorange: 0xff8c00, + darkorchid: 0x9932cc, + darkred: 0x8b0000, + darksalmon: 0xe9967a, + darkseagreen: 0x8fbc8f, + darkslateblue: 0x483d8b, + darkslategray: 0x2f4f4f, + darkslategrey: 0x2f4f4f, + darkturquoise: 0x00ced1, + darkviolet: 0x9400d3, + deeppink: 0xff1493, + deepskyblue: 0x00bfff, + dimgray: 0x696969, + dimgrey: 0x696969, + dodgerblue: 0x1e90ff, + firebrick: 0xb22222, + floralwhite: 0xfffaf0, + forestgreen: 0x228b22, + fuchsia: 0xff00ff, + gainsboro: 0xdcdcdc, + ghostwhite: 0xf8f8ff, + gold: 0xffd700, + goldenrod: 0xdaa520, + gray: 0x808080, + green: 0x008000, + greenyellow: 0xadff2f, + grey: 0x808080, + honeydew: 0xf0fff0, + hotpink: 0xff69b4, + indianred: 0xcd5c5c, + indigo: 0x4b0082, + ivory: 0xfffff0, + khaki: 0xf0e68c, + lavender: 0xe6e6fa, + lavenderblush: 0xfff0f5, + lawngreen: 0x7cfc00, + lemonchiffon: 0xfffacd, + lightblue: 0xadd8e6, + lightcoral: 0xf08080, + lightcyan: 0xe0ffff, + lightgoldenrodyellow: 0xfafad2, + lightgray: 0xd3d3d3, + lightgreen: 0x90ee90, + lightgrey: 0xd3d3d3, + lightpink: 0xffb6c1, + lightsalmon: 0xffa07a, + lightseagreen: 0x20b2aa, + lightskyblue: 0x87cefa, + lightslategray: 0x778899, + lightslategrey: 0x778899, + lightsteelblue: 0xb0c4de, + lightyellow: 0xffffe0, + lime: 0x00ff00, + limegreen: 0x32cd32, + linen: 0xfaf0e6, + magenta: 0xff00ff, + maroon: 0x800000, + mediumaquamarine: 0x66cdaa, + mediumblue: 0x0000cd, + mediumorchid: 0xba55d3, + mediumpurple: 0x9370db, + mediumseagreen: 0x3cb371, + mediumslateblue: 0x7b68ee, + mediumspringgreen: 0x00fa9a, + mediumturquoise: 0x48d1cc, + mediumvioletred: 0xc71585, + midnightblue: 0x191970, + mintcream: 0xf5fffa, + mistyrose: 0xffe4e1, + moccasin: 0xffe4b5, + navajowhite: 0xffdead, + navy: 0x000080, + oldlace: 0xfdf5e6, + olive: 0x808000, + olivedrab: 0x6b8e23, + orange: 0xffa500, + orangered: 0xff4500, + orchid: 0xda70d6, + palegoldenrod: 0xeee8aa, + palegreen: 0x98fb98, + paleturquoise: 0xafeeee, + palevioletred: 0xdb7093, + papayawhip: 0xffefd5, + peachpuff: 0xffdab9, + peru: 0xcd853f, + pink: 0xffc0cb, + plum: 0xdda0dd, + powderblue: 0xb0e0e6, + purple: 0x800080, + rebeccapurple: 0x663399, + red: 0xff0000, + rosybrown: 0xbc8f8f, + royalblue: 0x4169e1, + saddlebrown: 0x8b4513, + salmon: 0xfa8072, + sandybrown: 0xf4a460, + seagreen: 0x2e8b57, + seashell: 0xfff5ee, + sienna: 0xa0522d, + silver: 0xc0c0c0, + skyblue: 0x87ceeb, + slateblue: 0x6a5acd, + slategray: 0x708090, + slategrey: 0x708090, + snow: 0xfffafa, + springgreen: 0x00ff7f, + steelblue: 0x4682b4, + tan: 0xd2b48c, + teal: 0x008080, + thistle: 0xd8bfd8, + tomato: 0xff6347, + turquoise: 0x40e0d0, + violet: 0xee82ee, + wheat: 0xf5deb3, + white: 0xffffff, + whitesmoke: 0xf5f5f5, + yellow: 0xffff00, + yellowgreen: 0x9acd32 + }; + + define(Color, color, { + copy: function (channels) { + return Object.assign(new this.constructor, this, channels); + }, + displayable: function () { + return this.rgb().displayable(); + }, + hex: color_formatHex, // Deprecated! Use color.formatHex. + formatHex: color_formatHex, + formatHsl: color_formatHsl, + formatRgb: color_formatRgb, + toString: color_formatRgb + }); + + function color_formatHex() { + return this.rgb().formatHex(); + } + + function color_formatHsl() { + return hslConvert(this).formatHsl(); + } + + function color_formatRgb() { + return this.rgb().formatRgb(); + } + + function color(format) { + var m, l; + format = (format + "").trim().toLowerCase(); + return (m = reHex.exec(format)) ? (l = m[1].length, m = parseInt(m[1], 16), l === 6 ? rgbn(m) // #ff0000 + : l === 3 ? new Rgb((m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), ((m & 0xf) << 4) | (m & 0xf), 1) // #f00 + : l === 8 ? rgba(m >> 24 & 0xff, m >> 16 & 0xff, m >> 8 & 0xff, (m & 0xff) / 0xff) // #ff000000 + : l === 4 ? rgba((m >> 12 & 0xf) | (m >> 8 & 0xf0), (m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), (((m & 0xf) << 4) | (m & 0xf)) / 0xff) // #f000 + : null) // invalid hex + : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0) + : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%) + : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1) + : (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1) + : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%) + : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1) + : named.hasOwnProperty(format) ? rgbn(named[format]) // eslint-disable-line no-prototype-builtins + : format === "transparent" ? new Rgb(NaN, NaN, NaN, 0) + : null; + } + + function rgbn(n) { + return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1); + } + + function rgba(r, g, b, a) { + if (a <= 0) + r = g = b = NaN; + return new Rgb(r, g, b, a); + } + + function rgbConvert(o) { + if (!(o instanceof Color)) + o = color(o); + if (!o) + return new Rgb; + o = o.rgb(); + return new Rgb(o.r, o.g, o.b, o.opacity); + } + + function rgb(r, g, b, opacity) { + return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity); + } + + function Rgb(r, g, b, opacity) { + this.r = +r; + this.g = +g; + this.b = +b; + this.opacity = +opacity; + } + + define(Rgb, rgb, extend(Color, { + brighter: function (k) { + k = k == null ? brighter : Math.pow(brighter, k); + return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity); + }, + darker: function (k) { + k = k == null ? darker : Math.pow(darker, k); + return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity); + }, + rgb: function () { + return this; + }, + displayable: function () { + return (-0.5 <= this.r && this.r < 255.5) + && (-0.5 <= this.g && this.g < 255.5) + && (-0.5 <= this.b && this.b < 255.5) + && (0 <= this.opacity && this.opacity <= 1); + }, + hex: rgb_formatHex, // Deprecated! Use color.formatHex. + formatHex: rgb_formatHex, + formatRgb: rgb_formatRgb, + toString: rgb_formatRgb + })); + + function rgb_formatHex() { + return "#" + hex(this.r) + hex(this.g) + hex(this.b); + } + + function rgb_formatRgb() { + var a = this.opacity; + a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a)); + return (a === 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)) + + (a === 1 ? ")" : ", " + a + ")"); + } + + function hex(value) { + value = Math.max(0, Math.min(255, Math.round(value) || 0)); + return (value < 16 ? "0" : "") + value.toString(16); + } + + function hsla(h, s, l, a) { + if (a <= 0) + h = s = l = NaN; + else if (l <= 0 || l >= 1) + h = s = NaN; + else if (s <= 0) + h = NaN; + return new Hsl(h, s, l, a); + } + + function hslConvert(o) { + if (o instanceof Hsl) + return new Hsl(o.h, o.s, o.l, o.opacity); + if (!(o instanceof Color)) + o = color(o); + if (!o) + return new Hsl; + if (o instanceof Hsl) + return o; + o = o.rgb(); + var r = o.r / 255, + g = o.g / 255, + b = o.b / 255, + min = Math.min(r, g, b), + max = Math.max(r, g, b), + h = NaN, + s = max - min, + l = (max + min) / 2; + if (s) { + if (r === max) + h = (g - b) / s + (g < b) * 6; + else if (g === max) + h = (b - r) / s + 2; + else + h = (r - g) / s + 4; + s /= l < 0.5 ? max + min : 2 - max - min; + h *= 60; + } else { + s = l > 0 && l < 1 ? 0 : h; + } + return new Hsl(h, s, l, o.opacity); + } + + function hsl(h, s, l, opacity) { + return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity); + } + + function Hsl(h, s, l, opacity) { + this.h = +h; + this.s = +s; + this.l = +l; + this.opacity = +opacity; + } + + define(Hsl, hsl, extend(Color, { + brighter: function (k) { + k = k == null ? brighter : Math.pow(brighter, k); + return new Hsl(this.h, this.s, this.l * k, this.opacity); + }, + darker: function (k) { + k = k == null ? darker : Math.pow(darker, k); + return new Hsl(this.h, this.s, this.l * k, this.opacity); + }, + rgb: function () { + var h = this.h % 360 + (this.h < 0) * 360, + s = isNaN(h) || isNaN(this.s) ? 0 : this.s, + l = this.l, + m2 = l + (l < 0.5 ? l : 1 - l) * s, + m1 = 2 * l - m2; + return new Rgb( + hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2), + hsl2rgb(h, m1, m2), + hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2), + 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 a = this.opacity; + a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a)); + return (a === 1 ? "hsl(" : "hsla(") + + (this.h || 0) + ", " + + (this.s || 0) * 100 + "%, " + + (this.l || 0) * 100 + "%" + + (a === 1 ? ")" : ", " + a + ")"); + } + })); + + /* From FvD 13.37, CSS Color Module Level 3 */ + function hsl2rgb(h, m1, m2) { + return (h < 60 ? m1 + (m2 - m1) * h / 60 + : h < 180 ? m2 + : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60 + : m1) * 255; + } + + var deg2rad = Math.PI / 180; + var rad2deg = 180 / Math.PI; + +// https://observablehq.com/@mbostock/lab-and-rgb + var K = 18, + Xn = 0.96422, + Yn = 1, + Zn = 0.82521, + t0 = 4 / 29, + t1 = 6 / 29, + t2 = 3 * t1 * t1, + t3 = t1 * t1 * t1; + + function labConvert(o) { + if (o instanceof Lab) + return new Lab(o.l, o.a, o.b, o.opacity); + if (o instanceof Hcl) + return hcl2lab(o); + if (!(o instanceof Rgb)) + o = rgbConvert(o); + var r = rgb2lrgb(o.r), + g = rgb2lrgb(o.g), + b = rgb2lrgb(o.b), + y = xyz2lab((0.2225045 * r + 0.7168786 * g + 0.0606169 * b) / Yn), x, z; + if (r === g && g === b) + x = z = y; + else { + x = xyz2lab((0.4360747 * r + 0.3850649 * g + 0.1430804 * b) / Xn); + z = xyz2lab((0.0139322 * r + 0.0971045 * g + 0.7141733 * b) / Zn); + } + return new Lab(116 * y - 16, 500 * (x - y), 200 * (y - z), o.opacity); + } + + function gray(l, opacity) { + return new Lab(l, 0, 0, opacity == null ? 1 : opacity); + } + + function lab(l, a, b, opacity) { + return arguments.length === 1 ? labConvert(l) : new Lab(l, a, b, opacity == null ? 1 : opacity); + } + + function Lab(l, a, b, opacity) { + this.l = +l; + this.a = +a; + this.b = +b; + this.opacity = +opacity; + } + + define(Lab, lab, extend(Color, { + brighter: function (k) { + return new Lab(this.l + K * (k == null ? 1 : k), this.a, this.b, this.opacity); + }, + darker: function (k) { + return new Lab(this.l - K * (k == null ? 1 : k), this.a, this.b, this.opacity); + }, + rgb: function () { + var y = (this.l + 16) / 116, + x = isNaN(this.a) ? y : y + this.a / 500, + z = isNaN(this.b) ? y : y - this.b / 200; + x = Xn * lab2xyz(x); + y = Yn * lab2xyz(y); + z = Zn * lab2xyz(z); + return new Rgb( + lrgb2rgb(3.1338561 * x - 1.6168667 * y - 0.4906146 * z), + lrgb2rgb(-0.9787684 * x + 1.9161415 * y + 0.0334540 * z), + lrgb2rgb(0.0719453 * x - 0.2289914 * y + 1.4052427 * z), + this.opacity + ); + } + })); + + function xyz2lab(t) { + return t > t3 ? Math.pow(t, 1 / 3) : t / t2 + t0; + } + + function lab2xyz(t) { + return t > t1 ? t * t * t : t2 * (t - t0); + } + + function lrgb2rgb(x) { + return 255 * (x <= 0.0031308 ? 12.92 * x : 1.055 * Math.pow(x, 1 / 2.4) - 0.055); + } + + function rgb2lrgb(x) { + return (x /= 255) <= 0.04045 ? x / 12.92 : Math.pow((x + 0.055) / 1.055, 2.4); + } + + function hclConvert(o) { + if (o instanceof Hcl) + return new Hcl(o.h, o.c, o.l, o.opacity); + if (!(o instanceof Lab)) + o = labConvert(o); + if (o.a === 0 && o.b === 0) + return new Hcl(NaN, 0 < o.l && o.l < 100 ? 0 : NaN, o.l, o.opacity); + var h = Math.atan2(o.b, o.a) * rad2deg; + return new Hcl(h < 0 ? h + 360 : h, Math.sqrt(o.a * o.a + o.b * o.b), o.l, o.opacity); + } + + function lch(l, c, h, opacity) { + return arguments.length === 1 ? hclConvert(l) : new Hcl(h, c, l, opacity == null ? 1 : opacity); + } + + function hcl(h, c, l, opacity) { + return arguments.length === 1 ? hclConvert(h) : new Hcl(h, c, l, opacity == null ? 1 : opacity); + } + + function Hcl(h, c, l, opacity) { + this.h = +h; + this.c = +c; + this.l = +l; + this.opacity = +opacity; + } + + function hcl2lab(o) { + if (isNaN(o.h)) + return new Lab(o.l, 0, 0, o.opacity); + var h = o.h * deg2rad; + return new Lab(o.l, Math.cos(h) * o.c, Math.sin(h) * o.c, o.opacity); + } + + define(Hcl, hcl, extend(Color, { + brighter: function (k) { + return new Hcl(this.h, this.c, this.l + K * (k == null ? 1 : k), this.opacity); + }, + darker: function (k) { + return new Hcl(this.h, this.c, this.l - K * (k == null ? 1 : k), this.opacity); + }, + rgb: function () { + return hcl2lab(this).rgb(); + } + })); + + var A = -0.14861, + B = +1.78277, + C = -0.29227, + D = -0.90649, + E = +1.97294, + ED = E * D, + EB = E * B, + BC_DA = B * C - D * A; + + function cubehelixConvert(o) { + if (o instanceof Cubehelix) + return new Cubehelix(o.h, o.s, o.l, o.opacity); + if (!(o instanceof Rgb)) + o = rgbConvert(o); + var r = o.r / 255, + g = o.g / 255, + b = o.b / 255, + l = (BC_DA * b + ED * r - EB * g) / (BC_DA + ED - EB), + bl = b - l, + k = (E * (g - l) - C * bl) / D, + s = Math.sqrt(k * k + bl * bl) / (E * l * (1 - l)), // NaN if l=0 or l=1 + h = s ? Math.atan2(k, bl) * rad2deg - 120 : NaN; + return new Cubehelix(h < 0 ? h + 360 : h, s, l, o.opacity); + } + + function cubehelix(h, s, l, opacity) { + return arguments.length === 1 ? cubehelixConvert(h) : new Cubehelix(h, s, l, opacity == null ? 1 : opacity); + } + + function Cubehelix(h, s, l, opacity) { + this.h = +h; + this.s = +s; + this.l = +l; + this.opacity = +opacity; + } + + define(Cubehelix, cubehelix, extend(Color, { + brighter: function (k) { + k = k == null ? brighter : Math.pow(brighter, k); + return new Cubehelix(this.h, this.s, this.l * k, this.opacity); + }, + darker: function (k) { + k = k == null ? darker : Math.pow(darker, k); + return new Cubehelix(this.h, this.s, this.l * k, this.opacity); + }, + rgb: function () { + var h = isNaN(this.h) ? 0 : (this.h + 120) * deg2rad, + l = +this.l, + a = isNaN(this.s) ? 0 : this.s * l * (1 - l), + cosh = Math.cos(h), + sinh = Math.sin(h); + return new Rgb( + 255 * (l + a * (A * cosh + B * sinh)), + 255 * (l + a * (C * cosh + D * sinh)), + 255 * (l + a * (E * cosh)), + this.opacity + ); + } + })); + + function basis(t1, v0, v1, v2, v3) { + var t2 = t1 * t1, t3 = t2 * t1; + return ((1 - 3 * t1 + 3 * t2 - t3) * v0 + + (4 - 6 * t2 + 3 * t3) * v1 + + (1 + 3 * t1 + 3 * t2 - 3 * t3) * v2 + + t3 * v3) / 6; + } + + function basis$1(values) { + var n = values.length - 1; + return function (t) { + var i = t <= 0 ? (t = 0) : t >= 1 ? (t = 1, n - 1) : Math.floor(t * n), + v1 = values[i], + v2 = values[i + 1], + v0 = i > 0 ? values[i - 1] : 2 * v1 - v2, + v3 = i < n - 1 ? values[i + 2] : 2 * v2 - v1; + return basis((t - i / n) * n, v0, v1, v2, v3); + }; + } + + function basisClosed(values) { + var n = values.length; + return function (t) { + var i = Math.floor(((t %= 1) < 0 ? ++t : t) * n), + v0 = values[(i + n - 1) % n], + v1 = values[i % n], + v2 = values[(i + 1) % n], + v3 = values[(i + 2) % n]; + return basis((t - i / n) * n, v0, v1, v2, v3); + }; + } + + function constant$3(x) { + return function () { + return x; + }; + } + + function linear(a, d) { + return function (t) { + return a + t * d; + }; + } + + function exponential(a, b, y) { + return a = Math.pow(a, y), b = Math.pow(b, y) - a, y = 1 / y, function (t) { + return Math.pow(a + t * b, y); + }; + } + + function hue(a, b) { + var d = b - a; + return d ? linear(a, d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d) : constant$3(isNaN(a) ? b : a); + } + + function gamma(y) { + return (y = +y) === 1 ? nogamma : function (a, b) { + return b - a ? exponential(a, b, y) : constant$3(isNaN(a) ? b : a); + }; + } + + function nogamma(a, b) { + var d = b - a; + return d ? linear(a, d) : constant$3(isNaN(a) ? b : a); + } + + var interpolateRgb = (function rgbGamma(y) { + var color = gamma(y); + + function rgb$1(start, end) { + var r = color((start = rgb(start)).r, (end = rgb(end)).r), + g = color(start.g, end.g), + b = color(start.b, end.b), + opacity = nogamma(start.opacity, end.opacity); + return function (t) { + start.r = r(t); + start.g = g(t); + start.b = b(t); + start.opacity = opacity(t); + return start + ""; + }; + } + + rgb$1.gamma = rgbGamma; + + return rgb$1; + })(1); + + function rgbSpline(spline) { + return function (colors) { + var n = colors.length, + r = new Array(n), + g = new Array(n), + b = new Array(n), + i, color; + for (i = 0; i < n; ++i) { + color = rgb(colors[i]); + r[i] = color.r || 0; + g[i] = color.g || 0; + b[i] = color.b || 0; + } + r = spline(r); + g = spline(g); + b = spline(b); + color.opacity = 1; + return function (t) { + color.r = r(t); + color.g = g(t); + color.b = b(t); + return color + ""; + }; + }; + } + + var rgbBasis = rgbSpline(basis$1); + var rgbBasisClosed = rgbSpline(basisClosed); + + function numberArray(a, b) { + if (!b) + b = []; + var n = a ? Math.min(b.length, a.length) : 0, + c = b.slice(), + i; + return function (t) { + for (i = 0; i < n; ++i) + c[i] = a[i] * (1 - t) + b[i] * t; + return c; + }; + } + + function isNumberArray(x) { + return ArrayBuffer.isView(x) && !(x instanceof DataView); + } + + function array$1(a, b) { + return (isNumberArray(b) ? numberArray : genericArray)(a, b); + } + + function genericArray(a, b) { + var nb = b ? b.length : 0, + na = a ? Math.min(nb, a.length) : 0, + x = new Array(na), + c = new Array(nb), + i; + + for (i = 0; i < na; ++i) + x[i] = interpolateValue(a[i], b[i]); + for (; i < nb; ++i) + c[i] = b[i]; + + return function (t) { + for (i = 0; i < na; ++i) + c[i] = x[i](t); + return c; + }; + } + + function date(a, b) { + var d = new Date; + return a = +a, b = +b, function (t) { + return d.setTime(a * (1 - t) + b * t), d; + }; + } + + function interpolateNumber(a, b) { + return a = +a, b = +b, function (t) { + return a * (1 - t) + b * t; + }; + } + + function object(a, b) { + var i = {}, + c = {}, + k; + + if (a === null || typeof a !== "object") + a = {}; + if (b === null || typeof b !== "object") + b = {}; + + for (k in b) { + if (k in a) { + i[k] = interpolateValue(a[k], b[k]); + } else { + c[k] = b[k]; + } + } + + return function (t) { + for (k in i) + c[k] = i[k](t); + return c; + }; + } + + var reA = /[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g, + reB = new RegExp(reA.source, "g"); + + function zero(b) { + return function () { + return b; + }; + } + + function one(b) { + return function (t) { + return b(t) + ""; + }; + } + + function interpolateString(a, b) { + var bi = reA.lastIndex = reB.lastIndex = 0, // scan index for next number in b + am, // current match in a + bm, // current match in b + bs, // string preceding current number in b, if any + i = -1, // index in s + s = [], // string constants and placeholders + q = []; // number interpolators + + // Coerce inputs to strings. + a = a + "", b = b + ""; + + // Interpolate pairs of numbers in a & b. + while ((am = reA.exec(a)) + && (bm = reB.exec(b))) { + if ((bs = bm.index) > bi) { // a string precedes the next number in b + bs = b.slice(bi, bs); + if (s[i]) + s[i] += bs; // coalesce with previous string + else + s[++i] = bs; + } + if ((am = am[0]) === (bm = bm[0])) { // numbers in a & b match + if (s[i]) + s[i] += bm; // coalesce with previous string + else + s[++i] = bm; + } else { // interpolate non-matching numbers + s[++i] = null; + q.push({i: i, x: interpolateNumber(am, bm)}); + } + bi = reB.lastIndex; + } + + // Add remains of b. + if (bi < b.length) { + bs = b.slice(bi); + if (s[i]) + s[i] += bs; // coalesce with previous string + else + s[++i] = bs; + } + + // Special optimization for only a single match. + // Otherwise, interpolate each of the numbers and rejoin the string. + return s.length < 2 ? (q[0] + ? one(q[0].x) + : zero(b)) + : (b = q.length, function (t) { + for (var i = 0, o; i < b; ++i) + s[(o = q[i]).i] = o.x(t); + return s.join(""); + }); + } + + function interpolateValue(a, b) { + var t = typeof b, c; + return b == null || t === "boolean" ? constant$3(b) + : (t === "number" ? interpolateNumber + : t === "string" ? ((c = color(b)) ? (b = c, interpolateRgb) : interpolateString) + : b instanceof color ? interpolateRgb + : b instanceof Date ? date + : isNumberArray(b) ? numberArray + : Array.isArray(b) ? genericArray + : typeof b.valueOf !== "function" && typeof b.toString !== "function" || isNaN(b) ? object + : interpolateNumber)(a, b); + } + + function discrete(range) { + var n = range.length; + return function (t) { + return range[Math.max(0, Math.min(n - 1, Math.floor(t * n)))]; + }; + } + + function hue$1(a, b) { + var i = hue(+a, +b); + return function (t) { + var x = i(t); + return x - 360 * Math.floor(x / 360); + }; + } + + function interpolateRound(a, b) { + return a = +a, b = +b, function (t) { + return Math.round(a * (1 - t) + b * t); + }; + } + + var degrees = 180 / Math.PI; + + var identity$2 = { + translateX: 0, + translateY: 0, + rotate: 0, + skewX: 0, + scaleX: 1, + scaleY: 1 + }; + + function decompose(a, b, c, d, e, f) { + var scaleX, scaleY, skewX; + if (scaleX = Math.sqrt(a * a + b * b)) + a /= scaleX, b /= scaleX; + if (skewX = a * c + b * d) + c -= a * skewX, d -= b * skewX; + if (scaleY = Math.sqrt(c * c + d * d)) + c /= scaleY, d /= scaleY, skewX /= scaleY; + if (a * d < b * c) + a = -a, b = -b, skewX = -skewX, scaleX = -scaleX; + return { + translateX: e, + translateY: f, + rotate: Math.atan2(b, a) * degrees, + skewX: Math.atan(skewX) * degrees, + scaleX: scaleX, + scaleY: scaleY + }; + } + + var cssNode, + cssRoot, + cssView, + svgNode; + + function parseCss(value) { + if (value === "none") + return identity$2; + if (!cssNode) + cssNode = document.createElement("DIV"), cssRoot = document.documentElement, cssView = document.defaultView; + cssNode.style.transform = value; + value = cssView.getComputedStyle(cssRoot.appendChild(cssNode), null).getPropertyValue("transform"); + cssRoot.removeChild(cssNode); + value = value.slice(7, -1).split(","); + return decompose(+value[0], +value[1], +value[2], +value[3], +value[4], +value[5]); + } + + function parseSvg(value) { + if (value == null) + return identity$2; + if (!svgNode) + svgNode = document.createElementNS("http://www.w3.org/2000/svg", "g"); + svgNode.setAttribute("transform", value); + if (!(value = svgNode.transform.baseVal.consolidate())) + return identity$2; + value = value.matrix; + return decompose(value.a, value.b, value.c, value.d, value.e, value.f); + } + + function interpolateTransform(parse, pxComma, pxParen, degParen) { + + function pop(s) { + return s.length ? s.pop() + " " : ""; + } + + function translate(xa, ya, xb, yb, s, q) { + if (xa !== xb || ya !== yb) { + var i = s.push("translate(", null, pxComma, null, pxParen); + q.push({i: i - 4, x: interpolateNumber(xa, xb)}, {i: i - 2, x: interpolateNumber(ya, yb)}); + } else if (xb || yb) { + s.push("translate(" + xb + pxComma + yb + pxParen); + } + } + + function rotate(a, b, s, q) { + if (a !== b) { + if (a - b > 180) + b += 360; + else if (b - a > 180) + a += 360; // shortest path + q.push({i: s.push(pop(s) + "rotate(", null, degParen) - 2, x: interpolateNumber(a, b)}); + } else if (b) { + s.push(pop(s) + "rotate(" + b + degParen); + } + } + + function skewX(a, b, s, q) { + if (a !== b) { + q.push({i: s.push(pop(s) + "skewX(", null, degParen) - 2, x: interpolateNumber(a, b)}); + } else if (b) { + s.push(pop(s) + "skewX(" + b + degParen); + } + } + + function scale(xa, ya, xb, yb, s, q) { + if (xa !== xb || ya !== yb) { + var i = s.push(pop(s) + "scale(", null, ",", null, ")"); + q.push({i: i - 4, x: interpolateNumber(xa, xb)}, {i: i - 2, x: interpolateNumber(ya, yb)}); + } else if (xb !== 1 || yb !== 1) { + s.push(pop(s) + "scale(" + xb + "," + yb + ")"); + } + } + + return function (a, b) { + var s = [], // string constants and placeholders + q = []; // number interpolators + a = parse(a), b = parse(b); + translate(a.translateX, a.translateY, b.translateX, b.translateY, s, q); + rotate(a.rotate, b.rotate, s, q); + skewX(a.skewX, b.skewX, s, q); + scale(a.scaleX, a.scaleY, b.scaleX, b.scaleY, s, q); + a = b = null; // gc + return function (t) { + var i = -1, n = q.length, o; + while (++i < n) + s[(o = q[i]).i] = o.x(t); + return s.join(""); + }; + }; + } + + var interpolateTransformCss = interpolateTransform(parseCss, "px, ", "px)", "deg)"); + var interpolateTransformSvg = interpolateTransform(parseSvg, ", ", ")", ")"); + + var rho = Math.SQRT2, + rho2 = 2, + rho4 = 4, + epsilon2 = 1e-12; + + function cosh(x) { + return ((x = Math.exp(x)) + 1 / x) / 2; + } + + function sinh(x) { + return ((x = Math.exp(x)) - 1 / x) / 2; + } + + function tanh(x) { + return ((x = Math.exp(2 * x)) - 1) / (x + 1); + } + +// p0 = [ux0, uy0, w0] +// p1 = [ux1, uy1, w1] + function interpolateZoom(p0, p1) { + var ux0 = p0[0], uy0 = p0[1], w0 = p0[2], + ux1 = p1[0], uy1 = p1[1], w1 = p1[2], + dx = ux1 - ux0, + dy = uy1 - uy0, + d2 = dx * dx + dy * dy, + i, + S; + + // Special case for u0 ≅ u1. + if (d2 < epsilon2) { + S = Math.log(w1 / w0) / rho; + i = function (t) { + return [ + ux0 + t * dx, + uy0 + t * dy, + w0 * Math.exp(rho * t * S) + ]; + }; + } + + // General case. + else { + var d1 = Math.sqrt(d2), + b0 = (w1 * w1 - w0 * w0 + rho4 * d2) / (2 * w0 * rho2 * d1), + b1 = (w1 * w1 - w0 * w0 - rho4 * d2) / (2 * w1 * rho2 * d1), + r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0), + r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1); + S = (r1 - r0) / rho; + i = function (t) { + var s = t * S, + coshr0 = cosh(r0), + u = w0 / (rho2 * d1) * (coshr0 * tanh(rho * s + r0) - sinh(r0)); + return [ + ux0 + u * dx, + uy0 + u * dy, + w0 * coshr0 / cosh(rho * s + r0) + ]; + }; + } + + i.duration = S * 1000; + + return i; + } + + function hsl$1(hue) { + return function (start, end) { + var h = hue((start = hsl(start)).h, (end = hsl(end)).h), + s = nogamma(start.s, end.s), + l = nogamma(start.l, end.l), + opacity = nogamma(start.opacity, end.opacity); + return function (t) { + start.h = h(t); + start.s = s(t); + start.l = l(t); + start.opacity = opacity(t); + return start + ""; + }; + } + } + + var hsl$2 = hsl$1(hue); + var hslLong = hsl$1(nogamma); + + function lab$1(start, end) { + var l = nogamma((start = lab(start)).l, (end = lab(end)).l), + a = nogamma(start.a, end.a), + b = nogamma(start.b, end.b), + opacity = nogamma(start.opacity, end.opacity); + return function (t) { + start.l = l(t); + start.a = a(t); + start.b = b(t); + start.opacity = opacity(t); + return start + ""; + }; + } + + function hcl$1(hue) { + return function (start, end) { + var h = hue((start = hcl(start)).h, (end = hcl(end)).h), + c = nogamma(start.c, end.c), + l = nogamma(start.l, end.l), + opacity = nogamma(start.opacity, end.opacity); + return function (t) { + start.h = h(t); + start.c = c(t); + start.l = l(t); + start.opacity = opacity(t); + return start + ""; + }; + } + } + + var hcl$2 = hcl$1(hue); + var hclLong = hcl$1(nogamma); + + function cubehelix$1(hue) { + return (function cubehelixGamma(y) { + y = +y; + + function cubehelix$1(start, end) { + var h = hue((start = cubehelix(start)).h, (end = cubehelix(end)).h), + s = nogamma(start.s, end.s), + l = nogamma(start.l, end.l), + opacity = nogamma(start.opacity, end.opacity); + return function (t) { + start.h = h(t); + start.s = s(t); + start.l = l(Math.pow(t, y)); + start.opacity = opacity(t); + return start + ""; + }; + } + + cubehelix$1.gamma = cubehelixGamma; + + return cubehelix$1; + })(1); + } + + var cubehelix$2 = cubehelix$1(hue); + var cubehelixLong = cubehelix$1(nogamma); + + function piecewise(interpolate, values) { + var i = 0, n = values.length - 1, v = values[0], I = new Array(n < 0 ? 0 : n); + while (i < n) + I[i] = interpolate(v, v = values[++i]); + return function (t) { + var i = Math.max(0, Math.min(n - 1, Math.floor(t *= n))); + return I[i](t - i); + }; + } + + function quantize(interpolator, n) { + var samples = new Array(n); + for (var i = 0; i < n; ++i) + samples[i] = interpolator(i / (n - 1)); + return samples; + } + + var frame = 0, // is an animation frame pending? + timeout = 0, // is a timeout pending? + interval = 0, // are any timers active? + pokeDelay = 1000, // how frequently we check for clock skew + taskHead, + taskTail, + clockLast = 0, + clockNow = 0, + clockSkew = 0, + clock = typeof performance === "object" && performance.now ? performance : Date, + setFrame = typeof window === "object" && window.requestAnimationFrame ? window.requestAnimationFrame.bind(window) : function (f) { + setTimeout(f, 17); + }; + + function now() { + return clockNow || (setFrame(clearNow), clockNow = clock.now() + clockSkew); + } + + function clearNow() { + clockNow = 0; + } + + function Timer() { + this._call = + this._time = + this._next = null; + } + + Timer.prototype = timer.prototype = { + constructor: Timer, + restart: function (callback, delay, time) { + if (typeof callback !== "function") + throw new TypeError("callback is not a function"); + time = (time == null ? now() : +time) + (delay == null ? 0 : +delay); + if (!this._next && taskTail !== this) { + if (taskTail) + taskTail._next = this; + else + taskHead = this; + taskTail = this; + } + this._call = callback; + this._time = time; + sleep(); + }, + stop: function () { + if (this._call) { + this._call = null; + this._time = Infinity; + sleep(); + } + } + }; + + function timer(callback, delay, time) { + var t = new Timer; + t.restart(callback, delay, time); + return t; + } + + function timerFlush() { + now(); // Get the current time, if not already set. + ++frame; // Pretend we’ve set an alarm, if we haven’t already. + var t = taskHead, e; + while (t) { + if ((e = clockNow - t._time) >= 0) + t._call.call(null, e); + t = t._next; + } + --frame; + } + + function wake() { + clockNow = (clockLast = clock.now()) + clockSkew; + frame = timeout = 0; + try { + timerFlush(); + } finally { + frame = 0; + nap(); + clockNow = 0; + } + } + + function poke() { + var now = clock.now(), delay = now - clockLast; + if (delay > pokeDelay) + clockSkew -= delay, clockLast = now; + } + + function nap() { + var t0, t1 = taskHead, t2, time = Infinity; + while (t1) { + if (t1._call) { + if (time > t1._time) + time = t1._time; + t0 = t1, t1 = t1._next; + } else { + t2 = t1._next, t1._next = null; + t1 = t0 ? t0._next = t2 : taskHead = t2; + } + } + taskTail = t0; + sleep(time); + } + + function sleep(time) { + if (frame) + return; // Soonest alarm already set, or will be. + if (timeout) + timeout = clearTimeout(timeout); + var delay = time - clockNow; // Strictly less than if we recomputed clockNow. + if (delay > 24) { + if (time < Infinity) + timeout = setTimeout(wake, time - clock.now() - clockSkew); + if (interval) + interval = clearInterval(interval); + } else { + if (!interval) + clockLast = clock.now(), interval = setInterval(poke, pokeDelay); + frame = 1, setFrame(wake); + } + } + + function timeout$1(callback, delay, time) { + var t = new Timer; + delay = delay == null ? 0 : +delay; + t.restart(function (elapsed) { + t.stop(); + callback(elapsed + delay); + }, delay, time); + return t; + } + + function interval$1(callback, delay, time) { + var t = new Timer, total = delay; + if (delay == null) + return t.restart(callback, delay, time), t; + delay = +delay, time = time == null ? now() : +time; + t.restart(function tick(elapsed) { + elapsed += total; + t.restart(tick, total += delay, time); + callback(elapsed); + }, delay, time); + return t; + } + + var emptyOn = dispatch("start", "end", "cancel", "interrupt"); + var emptyTween = []; + + var CREATED = 0; + var SCHEDULED = 1; + var STARTING = 2; + var STARTED = 3; + var RUNNING = 4; + var ENDING = 5; + var ENDED = 6; + + function schedule(node, name, id, index, group, timing) { + var schedules = node.__transition; + if (!schedules) + node.__transition = {}; + else if (id in schedules) + return; + create$1(node, id, { + name: name, + index: index, // For context during callback. + group: group, // For context during callback. + on: emptyOn, + tween: emptyTween, + time: timing.time, + delay: timing.delay, + duration: timing.duration, + ease: timing.ease, + timer: null, + state: CREATED + }); + } + + function init(node, id) { + var schedule = get$1(node, id); + if (schedule.state > CREATED) + throw new Error("too late; already scheduled"); + return schedule; + } + + function set$1(node, id) { + var schedule = get$1(node, id); + if (schedule.state > STARTED) + throw new Error("too late; already running"); + return schedule; + } + + function get$1(node, id) { + var schedule = node.__transition; + if (!schedule || !(schedule = schedule[id])) + throw new Error("transition not found"); + return schedule; + } + + function create$1(node, id, self) { + var schedules = node.__transition, + tween; + + // Initialize the self timer when the transition is created. + // Note the actual delay is not known until the first callback! + schedules[id] = self; + self.timer = timer(schedule, 0, self.time); + + function schedule(elapsed) { + self.state = SCHEDULED; + self.timer.restart(start, self.delay, self.time); + + // If the elapsed delay is less than our first sleep, start immediately. + if (self.delay <= elapsed) + start(elapsed - self.delay); + } + + function start(elapsed) { + var i, j, n, o; + + // If the state is not SCHEDULED, then we previously errored on start. + if (self.state !== SCHEDULED) + return stop(); + + for (i in schedules) { + o = schedules[i]; + if (o.name !== self.name) + continue; + + // While this element already has a starting transition during this frame, + // defer starting an interrupting transition until that transition has a + // chance to tick (and possibly end); see d3/d3-transition#54! + if (o.state === STARTED) + return timeout$1(start); + + // Interrupt the active transition, if any. + if (o.state === RUNNING) { + o.state = ENDED; + o.timer.stop(); + o.on.call("interrupt", node, node.__data__, o.index, o.group); + delete schedules[i]; + } + + // Cancel any pre-empted transitions. + else if (+i < id) { + o.state = ENDED; + o.timer.stop(); + o.on.call("cancel", node, node.__data__, o.index, o.group); + delete schedules[i]; + } + } + + // Defer the first tick to end of the current frame; see d3/d3#1576. + // Note the transition may be canceled after start and before the first tick! + // Note this must be scheduled before the start event; see d3/d3-transition#16! + // Assuming this is successful, subsequent callbacks go straight to tick. + timeout$1(function () { + if (self.state === STARTED) { + self.state = RUNNING; + self.timer.restart(tick, self.delay, self.time); + tick(elapsed); + } + }); + + // Dispatch the start event. + // Note this must be done before the tween are initialized. + self.state = STARTING; + self.on.call("start", node, node.__data__, self.index, self.group); + if (self.state !== STARTING) + return; // interrupted + self.state = STARTED; + + // Initialize the tween, deleting null tween. + tween = new Array(n = self.tween.length); + for (i = 0, j = -1; i < n; ++i) { + if (o = self.tween[i].value.call(node, node.__data__, self.index, self.group)) { + tween[++j] = o; + } + } + tween.length = j + 1; + } + + function tick(elapsed) { + var t = elapsed < self.duration ? self.ease.call(null, elapsed / self.duration) : (self.timer.restart(stop), self.state = ENDING, 1), + i = -1, + n = tween.length; + + while (++i < n) { + tween[i].call(node, t); + } + + // Dispatch the end event. + if (self.state === ENDING) { + self.on.call("end", node, node.__data__, self.index, self.group); + stop(); + } + } + + function stop() { + self.state = ENDED; + self.timer.stop(); + delete schedules[id]; + for (var i in schedules) + return; // eslint-disable-line no-unused-vars + delete node.__transition; + } + } + + function interrupt(node, name) { + var schedules = node.__transition, + schedule, + active, + empty = true, + i; + + if (!schedules) + return; + + name = name == null ? null : name + ""; + + for (i in schedules) { + if ((schedule = schedules[i]).name !== name) { + empty = false; + continue; + } + active = schedule.state > STARTING && schedule.state < ENDING; + schedule.state = ENDED; + schedule.timer.stop(); + schedule.on.call(active ? "interrupt" : "cancel", node, node.__data__, schedule.index, schedule.group); + delete schedules[i]; + } + + if (empty) + delete node.__transition; + } + + function selection_interrupt(name) { + return this.each(function () { + interrupt(this, name); + }); + } + + function tweenRemove(id, name) { + var tween0, tween1; + return function () { + var schedule = set$1(this, id), + tween = schedule.tween; + + // If this node shared tween with the previous node, + // just assign the updated shared tween and we’re done! + // Otherwise, copy-on-write. + if (tween !== tween0) { + tween1 = tween0 = tween; + for (var i = 0, n = tween1.length; i < n; ++i) { + if (tween1[i].name === name) { + tween1 = tween1.slice(); + tween1.splice(i, 1); + break; + } + } + } + + schedule.tween = tween1; + }; + } + + function tweenFunction(id, name, value) { + var tween0, tween1; + if (typeof value !== "function") + throw new Error; + return function () { + var schedule = set$1(this, id), + tween = schedule.tween; + + // If this node shared tween with the previous node, + // just assign the updated shared tween and we’re done! + // Otherwise, copy-on-write. + if (tween !== tween0) { + tween1 = (tween0 = tween).slice(); + for (var t = {name: name, value: value}, i = 0, n = tween1.length; i < n; ++i) { + if (tween1[i].name === name) { + tween1[i] = t; + break; + } + } + if (i === n) + tween1.push(t); + } + + schedule.tween = tween1; + }; + } + + function transition_tween(name, value) { + var id = this._id; + + name += ""; + + if (arguments.length < 2) { + var tween = get$1(this.node(), id).tween; + for (var i = 0, n = tween.length, t; i < n; ++i) { + if ((t = tween[i]).name === name) { + return t.value; + } + } + return null; + } + + return this.each((value == null ? tweenRemove : tweenFunction)(id, name, value)); + } + + function tweenValue(transition, name, value) { + var id = transition._id; + + transition.each(function () { + var schedule = set$1(this, id); + (schedule.value || (schedule.value = {}))[name] = value.apply(this, arguments); + }); + + return function (node) { + return get$1(node, id).value[name]; + }; + } + + function interpolate(a, b) { + var c; + return (typeof b === "number" ? interpolateNumber + : b instanceof color ? interpolateRgb + : (c = color(b)) ? (b = c, interpolateRgb) + : interpolateString)(a, b); + } + + function attrRemove$1(name) { + return function () { + this.removeAttribute(name); + }; + } + + function attrRemoveNS$1(fullname) { + return function () { + this.removeAttributeNS(fullname.space, fullname.local); + }; + } + + function attrConstant$1(name, interpolate, value1) { + var string00, + string1 = value1 + "", + interpolate0; + return function () { + var string0 = this.getAttribute(name); + return string0 === string1 ? null + : string0 === string00 ? interpolate0 + : interpolate0 = interpolate(string00 = string0, value1); + }; + } + + function attrConstantNS$1(fullname, interpolate, value1) { + var string00, + string1 = value1 + "", + interpolate0; + return function () { + var string0 = this.getAttributeNS(fullname.space, fullname.local); + return string0 === string1 ? null + : string0 === string00 ? interpolate0 + : interpolate0 = interpolate(string00 = string0, value1); + }; + } + + function attrFunction$1(name, interpolate, value) { + var string00, + string10, + interpolate0; + return function () { + var string0, value1 = value(this), string1; + if (value1 == null) + return void this.removeAttribute(name); + string0 = this.getAttribute(name); + string1 = value1 + ""; + return string0 === string1 ? null + : string0 === string00 && string1 === string10 ? interpolate0 + : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1)); + }; + } + + function attrFunctionNS$1(fullname, interpolate, value) { + var string00, + string10, + interpolate0; + return function () { + var string0, value1 = value(this), string1; + if (value1 == null) + return void this.removeAttributeNS(fullname.space, fullname.local); + string0 = this.getAttributeNS(fullname.space, fullname.local); + string1 = value1 + ""; + return string0 === string1 ? null + : string0 === string00 && string1 === string10 ? interpolate0 + : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1)); + }; + } + + function transition_attr(name, value) { + var fullname = namespace(name), i = fullname === "transform" ? interpolateTransformSvg : interpolate; + return this.attrTween(name, typeof value === "function" + ? (fullname.local ? attrFunctionNS$1 : attrFunction$1)(fullname, i, tweenValue(this, "attr." + name, value)) + : value == null ? (fullname.local ? attrRemoveNS$1 : attrRemove$1)(fullname) + : (fullname.local ? attrConstantNS$1 : attrConstant$1)(fullname, i, value)); + } + + function attrInterpolate(name, i) { + return function (t) { + this.setAttribute(name, i.call(this, t)); + }; + } + + function attrInterpolateNS(fullname, i) { + return function (t) { + this.setAttributeNS(fullname.space, fullname.local, i.call(this, t)); + }; + } + + function attrTweenNS(fullname, value) { + var t0, i0; + function tween() { + var i = value.apply(this, arguments); + if (i !== i0) + t0 = (i0 = i) && attrInterpolateNS(fullname, i); + return t0; + } + tween._value = value; + return tween; + } + + function attrTween(name, value) { + var t0, i0; + function tween() { + var i = value.apply(this, arguments); + if (i !== i0) + t0 = (i0 = i) && attrInterpolate(name, i); + return t0; + } + tween._value = value; + return tween; + } + + function transition_attrTween(name, value) { + var key = "attr." + name; + if (arguments.length < 2) + return (key = this.tween(key)) && key._value; + if (value == null) + return this.tween(key, null); + if (typeof value !== "function") + throw new Error; + var fullname = namespace(name); + return this.tween(key, (fullname.local ? attrTweenNS : attrTween)(fullname, value)); + } + + function delayFunction(id, value) { + return function () { + init(this, id).delay = +value.apply(this, arguments); + }; + } + + function delayConstant(id, value) { + return value = +value, function () { + init(this, id).delay = value; + }; + } + + function transition_delay(value) { + var id = this._id; + + return arguments.length + ? this.each((typeof value === "function" + ? delayFunction + : delayConstant)(id, value)) + : get$1(this.node(), id).delay; + } + + function durationFunction(id, value) { + return function () { + set$1(this, id).duration = +value.apply(this, arguments); + }; + } + + function durationConstant(id, value) { + return value = +value, function () { + set$1(this, id).duration = value; + }; + } + + function transition_duration(value) { + var id = this._id; + + return arguments.length + ? this.each((typeof value === "function" + ? durationFunction + : durationConstant)(id, value)) + : get$1(this.node(), id).duration; + } + + function easeConstant(id, value) { + if (typeof value !== "function") + throw new Error; + return function () { + set$1(this, id).ease = value; + }; + } + + function transition_ease(value) { + var id = this._id; + + return arguments.length + ? this.each(easeConstant(id, value)) + : get$1(this.node(), id).ease; + } + + function transition_filter(match) { + if (typeof match !== "function") + match = matcher(match); + + for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) { + if ((node = group[i]) && match.call(node, node.__data__, i, group)) { + subgroup.push(node); + } + } + } + + return new Transition(subgroups, this._parents, this._name, this._id); + } + + function transition_merge(transition) { + if (transition._id !== this._id) + throw new Error; + + 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) { + for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) { + if (node = group0[i] || group1[i]) { + merge[i] = node; + } + } + } + + for (; j < m0; ++j) { + merges[j] = groups0[j]; + } + + return new Transition(merges, this._parents, this._name, this._id); + } + + function start(name) { + return (name + "").trim().split(/^|\s+/).every(function (t) { + var i = t.indexOf("."); + if (i >= 0) + t = t.slice(0, i); + return !t || t === "start"; + }); + } + + function onFunction(id, name, listener) { + var on0, on1, sit = start(name) ? init : set$1; + return function () { + var schedule = sit(this, id), + on = schedule.on; + + // If this node shared a dispatch with the previous node, + // just assign the updated shared dispatch and we’re done! + // Otherwise, copy-on-write. + if (on !== on0) + (on1 = (on0 = on).copy()).on(name, listener); + + schedule.on = on1; + }; + } + + function transition_on(name, listener) { + var id = this._id; + + return arguments.length < 2 + ? get$1(this.node(), id).on.on(name) + : this.each(onFunction(id, name, listener)); + } + + function removeFunction(id) { + return function () { + var parent = this.parentNode; + for (var i in this.__transition) + if (+i !== id) + return; + if (parent) + parent.removeChild(this); + }; + } + + function transition_remove() { + return this.on("end.remove", removeFunction(this._id)); + } + + function transition_select(select) { + var name = this._name, + id = this._id; + + if (typeof select !== "function") + select = selector(select); + + for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) { + if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) { + if ("__data__" in node) + subnode.__data__ = node.__data__; + subgroup[i] = subnode; + schedule(subgroup[i], name, id, i, subgroup, get$1(node, id)); + } + } + } + + return new Transition(subgroups, this._parents, name, id); + } + + function transition_selectAll(select) { + var name = this._name, + id = this._id; + + if (typeof select !== "function") + select = selectorAll(select); + + for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { + if (node = group[i]) { + for (var children = select.call(node, node.__data__, i, group), child, inherit = get$1(node, id), k = 0, l = children.length; k < l; ++k) { + if (child = children[k]) { + schedule(child, name, id, k, children, inherit); + } + } + subgroups.push(children); + parents.push(node); + } + } + } + + return new Transition(subgroups, parents, name, id); + } + + var Selection$1 = selection.prototype.constructor; + + function transition_selection() { + return new Selection$1(this._groups, this._parents); + } + + function styleNull(name, interpolate) { + var string00, + string10, + interpolate0; + return function () { + var string0 = styleValue(this, name), + string1 = (this.style.removeProperty(name), styleValue(this, name)); + return string0 === string1 ? null + : string0 === string00 && string1 === string10 ? interpolate0 + : interpolate0 = interpolate(string00 = string0, string10 = string1); + }; + } + + function styleRemove$1(name) { + return function () { + this.style.removeProperty(name); + }; + } + + function styleConstant$1(name, interpolate, value1) { + var string00, + string1 = value1 + "", + interpolate0; + return function () { + var string0 = styleValue(this, name); + return string0 === string1 ? null + : string0 === string00 ? interpolate0 + : interpolate0 = interpolate(string00 = string0, value1); + }; + } + + function styleFunction$1(name, interpolate, value) { + var string00, + string10, + interpolate0; + return function () { + var string0 = styleValue(this, name), + value1 = value(this), + string1 = value1 + ""; + if (value1 == null) + string1 = value1 = (this.style.removeProperty(name), styleValue(this, name)); + return string0 === string1 ? null + : string0 === string00 && string1 === string10 ? interpolate0 + : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1)); + }; + } + + function styleMaybeRemove(id, name) { + var on0, on1, listener0, key = "style." + name, event = "end." + key, remove; + return function () { + var schedule = set$1(this, id), + on = schedule.on, + listener = schedule.value[key] == null ? remove || (remove = styleRemove$1(name)) : undefined; + + // If this node shared a dispatch with the previous node, + // just assign the updated shared dispatch and we’re done! + // Otherwise, copy-on-write. + if (on !== on0 || listener0 !== listener) + (on1 = (on0 = on).copy()).on(event, listener0 = listener); + + schedule.on = on1; + }; + } + + function transition_style(name, value, priority) { + var i = (name += "") === "transform" ? interpolateTransformCss : interpolate; + return value == null ? this + .styleTween(name, styleNull(name, i)) + .on("end.style." + name, styleRemove$1(name)) + : typeof value === "function" ? this + .styleTween(name, styleFunction$1(name, i, tweenValue(this, "style." + name, value))) + .each(styleMaybeRemove(this._id, name)) + : this + .styleTween(name, styleConstant$1(name, i, value), priority) + .on("end.style." + name, null); + } + + function styleInterpolate(name, i, priority) { + return function (t) { + this.style.setProperty(name, i.call(this, t), priority); + }; + } + + function styleTween(name, value, priority) { + var t, i0; + function tween() { + var i = value.apply(this, arguments); + if (i !== i0) + t = (i0 = i) && styleInterpolate(name, i, priority); + return t; + } + tween._value = value; + return tween; + } + + function transition_styleTween(name, value, priority) { + var key = "style." + (name += ""); + if (arguments.length < 2) + return (key = this.tween(key)) && key._value; + if (value == null) + return this.tween(key, null); + if (typeof value !== "function") + throw new Error; + return this.tween(key, styleTween(name, value, priority == null ? "" : priority)); + } + + function textConstant$1(value) { + return function () { + this.textContent = value; + }; + } + + function textFunction$1(value) { + return function () { + var value1 = value(this); + this.textContent = value1 == null ? "" : value1; + }; + } + + function transition_text(value) { + return this.tween("text", typeof value === "function" + ? textFunction$1(tweenValue(this, "text", value)) + : textConstant$1(value == null ? "" : value + "")); + } + + function textInterpolate(i) { + return function (t) { + this.textContent = i.call(this, t); + }; + } + + function textTween(value) { + var t0, i0; + function tween() { + var i = value.apply(this, arguments); + if (i !== i0) + t0 = (i0 = i) && textInterpolate(i); + return t0; + } + tween._value = value; + return tween; + } + + function transition_textTween(value) { + var key = "text"; + if (arguments.length < 1) + return (key = this.tween(key)) && key._value; + if (value == null) + return this.tween(key, null); + if (typeof value !== "function") + throw new Error; + return this.tween(key, textTween(value)); + } + + function transition_transition() { + var name = this._name, + id0 = this._id, + id1 = newId(); + + for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { + if (node = group[i]) { + var inherit = get$1(node, id0); + schedule(node, name, id1, i, group, { + time: inherit.time + inherit.delay + inherit.duration, + delay: 0, + duration: inherit.duration, + ease: inherit.ease + }); + } + } + } + + return new Transition(groups, this._parents, name, id1); + } + + function transition_end() { + var on0, on1, that = this, id = that._id, size = that.size(); + return new Promise(function (resolve, reject) { + var cancel = {value: reject}, + end = {value: function () { + if (--size === 0) + resolve(); + }}; + + that.each(function () { + var schedule = set$1(this, id), + on = schedule.on; + + // If this node shared a dispatch with the previous node, + // just assign the updated shared dispatch and we’re done! + // Otherwise, copy-on-write. + if (on !== on0) { + on1 = (on0 = on).copy(); + on1._.cancel.push(cancel); + on1._.interrupt.push(cancel); + on1._.end.push(end); + } + + schedule.on = on1; + }); + }); + } + + var id = 0; + + function Transition(groups, parents, name, id) { + this._groups = groups; + this._parents = parents; + this._name = name; + this._id = id; + } + + function transition(name) { + return selection().transition(name); + } + + function newId() { + return ++id; + } + + var selection_prototype = selection.prototype; + + Transition.prototype = transition.prototype = { + constructor: Transition, + select: transition_select, + selectAll: transition_selectAll, + filter: transition_filter, + merge: transition_merge, + selection: transition_selection, + transition: transition_transition, + call: selection_prototype.call, + nodes: selection_prototype.nodes, + node: selection_prototype.node, + size: selection_prototype.size, + empty: selection_prototype.empty, + each: selection_prototype.each, + on: transition_on, + attr: transition_attr, + attrTween: transition_attrTween, + style: transition_style, + styleTween: transition_styleTween, + text: transition_text, + textTween: transition_textTween, + remove: transition_remove, + tween: transition_tween, + delay: transition_delay, + duration: transition_duration, + ease: transition_ease, + end: transition_end + }; + + function linear$1(t) { + return +t; + } + + function quadIn(t) { + return t * t; + } + + function quadOut(t) { + return t * (2 - t); + } + + function quadInOut(t) { + return ((t *= 2) <= 1 ? t * t : --t * (2 - t) + 1) / 2; + } + + function cubicIn(t) { + return t * t * t; + } + + function cubicOut(t) { + return --t * t * t + 1; + } + + function cubicInOut(t) { + return ((t *= 2) <= 1 ? t * t * t : (t -= 2) * t * t + 2) / 2; + } + + var exponent = 3; + + var polyIn = (function custom(e) { + e = +e; + + function polyIn(t) { + return Math.pow(t, e); + } + + polyIn.exponent = custom; + + return polyIn; + })(exponent); + + var polyOut = (function custom(e) { + e = +e; + + function polyOut(t) { + return 1 - Math.pow(1 - t, e); + } + + polyOut.exponent = custom; + + return polyOut; + })(exponent); + + var polyInOut = (function custom(e) { + e = +e; + + function polyInOut(t) { + return ((t *= 2) <= 1 ? Math.pow(t, e) : 2 - Math.pow(2 - t, e)) / 2; + } + + polyInOut.exponent = custom; + + return polyInOut; + })(exponent); + + var pi = Math.PI, + halfPi = pi / 2; + + function sinIn(t) { + return 1 - Math.cos(t * halfPi); + } + + function sinOut(t) { + return Math.sin(t * halfPi); + } + + function sinInOut(t) { + return (1 - Math.cos(pi * t)) / 2; + } + + function expIn(t) { + return Math.pow(2, 10 * t - 10); + } + + function expOut(t) { + return 1 - Math.pow(2, -10 * t); + } + + function expInOut(t) { + return ((t *= 2) <= 1 ? Math.pow(2, 10 * t - 10) : 2 - Math.pow(2, 10 - 10 * t)) / 2; + } + + function circleIn(t) { + return 1 - Math.sqrt(1 - t * t); + } + + function circleOut(t) { + return Math.sqrt(1 - --t * t); + } + + function circleInOut(t) { + return ((t *= 2) <= 1 ? 1 - Math.sqrt(1 - t * t) : Math.sqrt(1 - (t -= 2) * t) + 1) / 2; + } + + var b1 = 4 / 11, + b2 = 6 / 11, + b3 = 8 / 11, + b4 = 3 / 4, + b5 = 9 / 11, + b6 = 10 / 11, + b7 = 15 / 16, + b8 = 21 / 22, + b9 = 63 / 64, + b0 = 1 / b1 / b1; + + function bounceIn(t) { + return 1 - bounceOut(1 - t); + } + + function bounceOut(t) { + 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; + } + + function bounceInOut(t) { + return ((t *= 2) <= 1 ? 1 - bounceOut(1 - t) : bounceOut(t - 1) + 1) / 2; + } + + var overshoot = 1.70158; + + var backIn = (function custom(s) { + s = +s; + + function backIn(t) { + return t * t * ((s + 1) * t - s); + } + + backIn.overshoot = custom; + + return backIn; + })(overshoot); + + var backOut = (function custom(s) { + s = +s; + + function backOut(t) { + return --t * t * ((s + 1) * t + s) + 1; + } + + backOut.overshoot = custom; + + return backOut; + })(overshoot); + + var backInOut = (function custom(s) { + s = +s; + + function backInOut(t) { + return ((t *= 2) < 1 ? t * t * ((s + 1) * t - s) : (t -= 2) * t * ((s + 1) * t + s) + 2) / 2; + } + + backInOut.overshoot = custom; + + return backInOut; + })(overshoot); + + var tau = 2 * Math.PI, + amplitude = 1, + period = 0.3; + + var elasticIn = (function custom(a, p) { + var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau); + + function elasticIn(t) { + return a * Math.pow(2, 10 * --t) * Math.sin((s - t) / p); + } + + elasticIn.amplitude = function (a) { + return custom(a, p * tau); + }; + elasticIn.period = function (p) { + return custom(a, p); + }; + + return elasticIn; + })(amplitude, period); + + var elasticOut = (function custom(a, p) { + var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau); + + function elasticOut(t) { + return 1 - a * Math.pow(2, -10 * (t = +t)) * Math.sin((t + s) / p); + } + + elasticOut.amplitude = function (a) { + return custom(a, p * tau); + }; + elasticOut.period = function (p) { + return custom(a, p); + }; + + return elasticOut; + })(amplitude, period); + + var elasticInOut = (function custom(a, p) { + var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau); + + function elasticInOut(t) { + return ((t = t * 2 - 1) < 0 + ? a * Math.pow(2, 10 * t) * Math.sin((s - t) / p) + : 2 - a * Math.pow(2, -10 * t) * Math.sin((s + t) / p)) / 2; + } + + elasticInOut.amplitude = function (a) { + return custom(a, p * tau); + }; + elasticInOut.period = function (p) { + return custom(a, p); + }; + + return elasticInOut; + })(amplitude, period); + + var defaultTiming = { + time: null, // Set on use. + delay: 0, + duration: 250, + ease: cubicInOut + }; + + function inherit(node, id) { + var timing; + while (!(timing = node.__transition) || !(timing = timing[id])) { + if (!(node = node.parentNode)) { + return defaultTiming.time = now(), defaultTiming; + } + } + return timing; + } + + function selection_transition(name) { + var id, + timing; + + if (name instanceof Transition) { + id = name._id, name = name._name; + } else { + id = newId(), (timing = defaultTiming).time = now(), name = name == null ? null : name + ""; + } + + for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { + if (node = group[i]) { + schedule(node, name, id, i, group, timing || inherit(node, id)); + } + } + } + + return new Transition(groups, this._parents, name, id); + } + + selection.prototype.interrupt = selection_interrupt; + selection.prototype.transition = selection_transition; + + var root$1 = [null]; + + function active(node, name) { + var schedules = node.__transition, + schedule, + i; + + if (schedules) { + name = name == null ? null : name + ""; + for (i in schedules) { + if ((schedule = schedules[i]).state > SCHEDULED && schedule.name === name) { + return new Transition([[node]], root$1, name, +i); + } + } + } + + return null; + } + + function constant$4(x) { + return function () { + return x; + }; + } + + function BrushEvent(target, type, selection) { + this.target = target; + this.type = type; + this.selection = selection; + } + + function nopropagation$1() { + exports.event.stopImmediatePropagation(); + } + + function noevent$1() { + exports.event.preventDefault(); + exports.event.stopImmediatePropagation(); + } + + var MODE_DRAG = {name: "drag"}, + MODE_SPACE = {name: "space"}, + MODE_HANDLE = {name: "handle"}, + MODE_CENTER = {name: "center"}; + + function number1(e) { + return [+e[0], +e[1]]; + } + + function number2(e) { + return [number1(e[0]), number1(e[1])]; + } + + function toucher(identifier) { + return function (target) { + return touch(target, exports.event.touches, identifier); + }; + } + + var X = { + name: "x", + handles: ["w", "e"].map(type), + input: function (x, e) { + return x == null ? null : [[+x[0], e[0][1]], [+x[1], e[1][1]]]; + }, + output: function (xy) { + return xy && [xy[0][0], xy[1][0]]; + } + }; + + var Y = { + name: "y", + handles: ["n", "s"].map(type), + input: function (y, e) { + return y == null ? null : [[e[0][0], +y[0]], [e[1][0], +y[1]]]; + }, + output: function (xy) { + return xy && [xy[0][1], xy[1][1]]; + } + }; + + var XY = { + name: "xy", + handles: ["n", "w", "e", "s", "nw", "ne", "sw", "se"].map(type), + input: function (xy) { + return xy == null ? null : number2(xy); + }, + output: function (xy) { + return xy; + } + }; + + var cursors = { + 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 flipX = { + e: "w", + w: "e", + nw: "ne", + ne: "nw", + se: "sw", + sw: "se" + }; + + var flipY = { + n: "s", + s: "n", + nw: "sw", + ne: "se", + se: "ne", + sw: "nw" + }; + + var signsX = { + overlay: +1, + selection: +1, + n: null, + e: +1, + s: null, + w: -1, + nw: -1, + ne: +1, + se: +1, + sw: -1 + }; + + var signsY = { + overlay: +1, + selection: +1, + n: -1, + e: null, + s: +1, + w: null, + nw: -1, + ne: -1, + se: +1, + sw: +1 + }; + + function type(t) { + return {type: t}; + } + +// Ignore right-click, since that should open the context menu. + function defaultFilter$1() { + return !exports.event.ctrlKey && !exports.event.button; + } + + function defaultExtent() { + var svg = this.ownerSVGElement || this; + if (svg.hasAttribute("viewBox")) { + svg = svg.viewBox.baseVal; + return [[svg.x, svg.y], [svg.x + svg.width, svg.y + svg.height]]; + } + return [[0, 0], [svg.width.baseVal.value, svg.height.baseVal.value]]; + } + + function defaultTouchable$1() { + return navigator.maxTouchPoints || ("ontouchstart" in this); + } + +// Like d3.local, but with the name “__brush” rather than auto-generated. + function local$1(node) { + while (!node.__brush) + if (!(node = node.parentNode)) + return; + return node.__brush; + } + + function empty$1(extent) { + return extent[0][0] === extent[1][0] + || extent[0][1] === extent[1][1]; + } + + function brushSelection(node) { + var state = node.__brush; + return state ? state.dim.output(state.selection) : null; + } + + function brushX() { + return brush$1(X); + } + + function brushY() { + return brush$1(Y); + } + + function brush() { + return brush$1(XY); + } + + function brush$1(dim) { + var extent = defaultExtent, + filter = defaultFilter$1, + touchable = defaultTouchable$1, + keys = true, + listeners = dispatch("start", "brush", "end"), + handleSize = 6, + touchending; + + function brush(group) { + var overlay = group + .property("__brush", initialize) + .selectAll(".overlay") + .data([type("overlay")]); + + overlay.enter().append("rect") + .attr("class", "overlay") + .attr("pointer-events", "all") + .attr("cursor", cursors.overlay) + .merge(overlay) + .each(function () { + var extent = local$1(this).extent; + select(this) + .attr("x", extent[0][0]) + .attr("y", extent[0][1]) + .attr("width", extent[1][0] - extent[0][0]) + .attr("height", extent[1][1] - extent[0][1]); + }); + + group.selectAll(".selection") + .data([type("selection")]) + .enter().append("rect") + .attr("class", "selection") + .attr("cursor", cursors.selection) + .attr("fill", "#777") + .attr("fill-opacity", 0.3) + .attr("stroke", "#fff") + .attr("shape-rendering", "crispEdges"); + + var handle = group.selectAll(".handle") + .data(dim.handles, function (d) { + return d.type; + }); + + handle.exit().remove(); + + handle.enter().append("rect") + .attr("class", function (d) { + return "handle handle--" + d.type; + }) + .attr("cursor", function (d) { + return cursors[d.type]; + }); + + group + .each(redraw) + .attr("fill", "none") + .attr("pointer-events", "all") + .on("mousedown.brush", started) + .filter(touchable) + .on("touchstart.brush", started) + .on("touchmove.brush", touchmoved) + .on("touchend.brush touchcancel.brush", touchended) + .style("touch-action", "none") + .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)"); + } + + brush.move = function (group, selection) { + if (group.selection) { + group + .on("start.brush", function () { + emitter(this, arguments).beforestart().start(); + }) + .on("interrupt.brush end.brush", function () { + emitter(this, arguments).end(); + }) + .tween("brush", function () { + var that = this, + state = that.__brush, + emit = emitter(that, arguments), + selection0 = state.selection, + selection1 = dim.input(typeof selection === "function" ? selection.apply(this, arguments) : selection, state.extent), + i = interpolateValue(selection0, selection1); + + function tween(t) { + state.selection = t === 1 && selection1 === null ? null : i(t); + redraw.call(that); + emit.brush(); + } + + return selection0 !== null && selection1 !== null ? tween : tween(1); + }); + } else { + group + .each(function () { + var that = this, + args = arguments, + state = that.__brush, + selection1 = dim.input(typeof selection === "function" ? selection.apply(that, args) : selection, state.extent), + emit = emitter(that, args).beforestart(); + + interrupt(that); + state.selection = selection1 === null ? null : selection1; + redraw.call(that); + emit.start().brush().end(); + }); + } + }; + + brush.clear = function (group) { + brush.move(group, null); + }; + + function redraw() { + var group = select(this), + selection = local$1(this).selection; + + if (selection) { + group.selectAll(".selection") + .style("display", null) + .attr("x", selection[0][0]) + .attr("y", selection[0][1]) + .attr("width", selection[1][0] - selection[0][0]) + .attr("height", selection[1][1] - selection[0][1]); + + group.selectAll(".handle") + .style("display", null) + .attr("x", function (d) { + return d.type[d.type.length - 1] === "e" ? selection[1][0] - handleSize / 2 : selection[0][0] - handleSize / 2; + }) + .attr("y", function (d) { + return d.type[0] === "s" ? selection[1][1] - handleSize / 2 : selection[0][1] - handleSize / 2; + }) + .attr("width", function (d) { + return d.type === "n" || d.type === "s" ? selection[1][0] - selection[0][0] + handleSize : handleSize; + }) + .attr("height", function (d) { + return d.type === "e" || d.type === "w" ? selection[1][1] - selection[0][1] + handleSize : handleSize; + }); + } else { + group.selectAll(".selection,.handle") + .style("display", "none") + .attr("x", null) + .attr("y", null) + .attr("width", null) + .attr("height", null); + } + } + + function emitter(that, args, clean) { + return (!clean && that.__brush.emitter) || new Emitter(that, args); + } + + function Emitter(that, args) { + this.that = that; + this.args = args; + this.state = that.__brush; + this.active = 0; + } + + Emitter.prototype = { + beforestart: function () { + if (++this.active === 1) + this.state.emitter = this, this.starting = true; + return this; + }, + start: function () { + if (this.starting) + this.starting = false, this.emit("start"); + else + this.emit("brush"); + return this; + }, + brush: function () { + this.emit("brush"); + return this; + }, + end: function () { + if (--this.active === 0) + delete this.state.emitter, this.emit("end"); + return this; + }, + emit: function (type) { + customEvent(new BrushEvent(brush, type, dim.output(this.state.selection)), listeners.apply, listeners, [type, this.that, this.args]); + } + }; + + function started() { + if (touchending && !exports.event.touches) + return; + if (!filter.apply(this, arguments)) + return; + + var that = this, + type = exports.event.target.__data__.type, + mode = (keys && exports.event.metaKey ? type = "overlay" : type) === "selection" ? MODE_DRAG : (keys && exports.event.altKey ? MODE_CENTER : MODE_HANDLE), + signX = dim === Y ? null : signsX[type], + signY = dim === X ? null : signsY[type], + state = local$1(that), + extent = state.extent, + selection = state.selection, + W = extent[0][0], w0, w1, + N = extent[0][1], n0, n1, + E = extent[1][0], e0, e1, + S = extent[1][1], s0, s1, + dx = 0, + dy = 0, + moving, + shifting = signX && signY && keys && exports.event.shiftKey, + lockX, + lockY, + pointer = exports.event.touches ? toucher(exports.event.changedTouches[0].identifier) : mouse, + point0 = pointer(that), + point = point0, + emit = emitter(that, arguments, true).beforestart(); + + if (type === "overlay") { + if (selection) + moving = true; + state.selection = selection = [ + [w0 = dim === Y ? W : point0[0], n0 = dim === X ? N : point0[1]], + [e0 = dim === Y ? E : w0, s0 = dim === X ? S : n0] + ]; + } else { + w0 = selection[0][0]; + n0 = selection[0][1]; + e0 = selection[1][0]; + s0 = selection[1][1]; + } + + w1 = w0; + n1 = n0; + e1 = e0; + s1 = s0; + + var group = select(that) + .attr("pointer-events", "none"); + + var overlay = group.selectAll(".overlay") + .attr("cursor", cursors[type]); + + if (exports.event.touches) { + emit.moved = moved; + emit.ended = ended; + } else { + var view = select(exports.event.view) + .on("mousemove.brush", moved, true) + .on("mouseup.brush", ended, true); + if (keys) + view + .on("keydown.brush", keydowned, true) + .on("keyup.brush", keyupped, true); + + dragDisable(exports.event.view); + } + + nopropagation$1(); + interrupt(that); + redraw.call(that); + emit.start(); + + function moved() { + var point1 = pointer(that); + if (shifting && !lockX && !lockY) { + if (Math.abs(point1[0] - point[0]) > Math.abs(point1[1] - point[1])) + lockY = true; + else + lockX = true; + } + point = point1; + moving = true; + noevent$1(); + move(); + } + + function move() { + var t; + + dx = point[0] - point0[0]; + dy = point[1] - point0[1]; + + switch (mode) { + case MODE_SPACE: + case MODE_DRAG: + { + if (signX) + dx = Math.max(W - w0, Math.min(E - e0, dx)), w1 = w0 + dx, e1 = e0 + dx; + if (signY) + dy = Math.max(N - n0, Math.min(S - s0, dy)), n1 = n0 + dy, s1 = s0 + dy; + break; + } + case MODE_HANDLE: + { + if (signX < 0) + dx = Math.max(W - w0, Math.min(E - w0, dx)), w1 = w0 + dx, e1 = e0; + else if (signX > 0) + dx = Math.max(W - e0, Math.min(E - e0, dx)), w1 = w0, e1 = e0 + dx; + if (signY < 0) + dy = Math.max(N - n0, Math.min(S - n0, dy)), n1 = n0 + dy, s1 = s0; + else if (signY > 0) + dy = Math.max(N - s0, Math.min(S - s0, dy)), n1 = n0, s1 = s0 + dy; + break; + } + case MODE_CENTER: + { + if (signX) + w1 = Math.max(W, Math.min(E, w0 - dx * signX)), e1 = Math.max(W, Math.min(E, e0 + dx * signX)); + if (signY) + n1 = Math.max(N, Math.min(S, n0 - dy * signY)), s1 = Math.max(N, Math.min(S, s0 + dy * signY)); + break; + } + } + + if (e1 < w1) { + signX *= -1; + t = w0, w0 = e0, e0 = t; + t = w1, w1 = e1, e1 = t; + if (type in flipX) + overlay.attr("cursor", cursors[type = flipX[type]]); + } + + if (s1 < n1) { + signY *= -1; + t = n0, n0 = s0, s0 = t; + t = n1, n1 = s1, s1 = t; + if (type in flipY) + overlay.attr("cursor", cursors[type = flipY[type]]); + } + + if (state.selection) + selection = state.selection; // May be set by brush.move! + if (lockX) + w1 = selection[0][0], e1 = selection[1][0]; + if (lockY) + n1 = selection[0][1], s1 = selection[1][1]; + + if (selection[0][0] !== w1 + || selection[0][1] !== n1 + || selection[1][0] !== e1 + || selection[1][1] !== s1) { + state.selection = [[w1, n1], [e1, s1]]; + redraw.call(that); + emit.brush(); + } + } + + function ended() { + nopropagation$1(); + if (exports.event.touches) { + if (exports.event.touches.length) + return; + if (touchending) + clearTimeout(touchending); + touchending = setTimeout(function () { + touchending = null; + }, 500); // Ghost clicks are delayed! + } else { + yesdrag(exports.event.view, moving); + view.on("keydown.brush keyup.brush mousemove.brush mouseup.brush", null); + } + group.attr("pointer-events", "all"); + overlay.attr("cursor", cursors.overlay); + if (state.selection) + selection = state.selection; // May be set by brush.move (on start)! + if (empty$1(selection)) + state.selection = null, redraw.call(that); + emit.end(); + } + + function keydowned() { + switch (exports.event.keyCode) { + case 16: + { // SHIFT + shifting = signX && signY; + break; + } + case 18: + { // ALT + if (mode === MODE_HANDLE) { + if (signX) + e0 = e1 - dx * signX, w0 = w1 + dx * signX; + if (signY) + s0 = s1 - dy * signY, n0 = n1 + dy * signY; + mode = MODE_CENTER; + move(); + } + break; + } + case 32: + { // SPACE; takes priority over ALT + if (mode === MODE_HANDLE || mode === MODE_CENTER) { + if (signX < 0) + e0 = e1 - dx; + else if (signX > 0) + w0 = w1 - dx; + if (signY < 0) + s0 = s1 - dy; + else if (signY > 0) + n0 = n1 - dy; + mode = MODE_SPACE; + overlay.attr("cursor", cursors.selection); + move(); + } + break; + } + default: + return; + } + noevent$1(); + } + + function keyupped() { + switch (exports.event.keyCode) { + case 16: + { // SHIFT + if (shifting) { + lockX = lockY = shifting = false; + move(); + } + break; + } + case 18: + { // ALT + if (mode === MODE_CENTER) { + if (signX < 0) + e0 = e1; + else if (signX > 0) + w0 = w1; + if (signY < 0) + s0 = s1; + else if (signY > 0) + n0 = n1; + mode = MODE_HANDLE; + move(); + } + break; + } + case 32: + { // SPACE + if (mode === MODE_SPACE) { + if (exports.event.altKey) { + if (signX) + e0 = e1 - dx * signX, w0 = w1 + dx * signX; + if (signY) + s0 = s1 - dy * signY, n0 = n1 + dy * signY; + mode = MODE_CENTER; + } else { + if (signX < 0) + e0 = e1; + else if (signX > 0) + w0 = w1; + if (signY < 0) + s0 = s1; + else if (signY > 0) + n0 = n1; + mode = MODE_HANDLE; + } + overlay.attr("cursor", cursors[type]); + move(); + } + break; + } + default: + return; + } + noevent$1(); + } + } + + function touchmoved() { + emitter(this, arguments).moved(); + } + + function touchended() { + emitter(this, arguments).ended(); + } + + function initialize() { + var state = this.__brush || {selection: null}; + state.extent = number2(extent.apply(this, arguments)); + state.dim = dim; + return state; + } + + brush.extent = function (_) { + return arguments.length ? (extent = typeof _ === "function" ? _ : constant$4(number2(_)), brush) : extent; + }; + + brush.filter = function (_) { + return arguments.length ? (filter = typeof _ === "function" ? _ : constant$4(!!_), brush) : filter; + }; + + brush.touchable = function (_) { + return arguments.length ? (touchable = typeof _ === "function" ? _ : constant$4(!!_), brush) : touchable; + }; + + brush.handleSize = function (_) { + return arguments.length ? (handleSize = +_, brush) : handleSize; + }; + + brush.keyModifiers = function (_) { + return arguments.length ? (keys = !!_, brush) : keys; + }; + + brush.on = function () { + var value = listeners.on.apply(listeners, arguments); + return value === listeners ? brush : value; + }; + + return brush; + } + + var cos = Math.cos; + var sin = Math.sin; + var pi$1 = Math.PI; + var halfPi$1 = pi$1 / 2; + var tau$1 = pi$1 * 2; + var max$1 = Math.max; + + function compareValue(compare) { + return function (a, b) { + return compare( + a.source.value + a.target.value, + b.source.value + b.target.value + ); + }; + } + + function chord() { + var padAngle = 0, + sortGroups = null, + sortSubgroups = null, + sortChords = null; + + function chord(matrix) { + var n = matrix.length, + groupSums = [], + groupIndex = sequence(n), + subgroupIndex = [], + chords = [], + groups = chords.groups = new Array(n), + subgroups = new Array(n * n), + k, + x, + x0, + dx, + i, + j; + + // Compute the sum. + k = 0, i = -1; + while (++i < n) { + x = 0, j = -1; + while (++j < n) { + x += matrix[i][j]; + } + groupSums.push(x); + subgroupIndex.push(sequence(n)); + k += x; + } + + // Sort groups… + if (sortGroups) + groupIndex.sort(function (a, b) { + return sortGroups(groupSums[a], groupSums[b]); + }); + + // Sort subgroups… + if (sortSubgroups) + subgroupIndex.forEach(function (d, i) { + d.sort(function (a, b) { + return sortSubgroups(matrix[i][a], matrix[i][b]); + }); + }); + + // Convert the sum to scaling factor for [0, 2pi]. + // TODO Allow start and end angle to be specified? + // TODO Allow padding to be specified as percentage? + k = max$1(0, tau$1 - padAngle * n) / k; + dx = k ? padAngle : tau$1 / n; + + // Compute the start and end angle for each group and subgroup. + // Note: Opera has a bug reordering object literal properties! + x = 0, i = -1; + while (++i < n) { + x0 = x, j = -1; + while (++j < n) { + var di = groupIndex[i], + dj = subgroupIndex[di][j], + v = matrix[di][dj], + a0 = x, + a1 = x += v * k; + subgroups[dj * n + di] = { + index: di, + subindex: dj, + startAngle: a0, + endAngle: a1, + value: v + }; + } + groups[di] = { + index: di, + startAngle: x0, + endAngle: x, + value: groupSums[di] + }; + x += dx; + } + + // Generate chords for each (non-empty) subgroup-subgroup link. + i = -1; + while (++i < n) { + j = i - 1; + while (++j < n) { + var source = subgroups[j * n + i], + target = subgroups[i * n + j]; + if (source.value || target.value) { + chords.push(source.value < target.value + ? {source: target, target: source} + : {source: source, target: target}); + } + } + } + + return sortChords ? chords.sort(sortChords) : chords; + } + + chord.padAngle = function (_) { + return arguments.length ? (padAngle = max$1(0, _), chord) : padAngle; + }; + + chord.sortGroups = function (_) { + return arguments.length ? (sortGroups = _, chord) : sortGroups; + }; + + chord.sortSubgroups = function (_) { + return arguments.length ? (sortSubgroups = _, chord) : sortSubgroups; + }; + + chord.sortChords = function (_) { + return arguments.length ? (_ == null ? sortChords = null : (sortChords = compareValue(_))._ = _, chord) : sortChords && sortChords._; + }; + + return chord; + } + + var slice$2 = Array.prototype.slice; + + function constant$5(x) { + return function () { + return x; + }; + } + + var pi$2 = Math.PI, + tau$2 = 2 * pi$2, + epsilon$1 = 1e-6, + tauEpsilon = tau$2 - epsilon$1; + + function Path() { + this._x0 = this._y0 = // start of current subpath + this._x1 = this._y1 = null; // end of current subpath + this._ = ""; + } + + function path() { + return new Path; + } + + Path.prototype = path.prototype = { + constructor: Path, + moveTo: function (x, y) { + this._ += "M" + (this._x0 = this._x1 = +x) + "," + (this._y0 = this._y1 = +y); + }, + closePath: function () { + if (this._x1 !== null) { + this._x1 = this._x0, this._y1 = this._y0; + this._ += "Z"; + } + }, + lineTo: function (x, y) { + this._ += "L" + (this._x1 = +x) + "," + (this._y1 = +y); + }, + quadraticCurveTo: function (x1, y1, x, y) { + this._ += "Q" + (+x1) + "," + (+y1) + "," + (this._x1 = +x) + "," + (this._y1 = +y); + }, + bezierCurveTo: function (x1, y1, x2, y2, x, y) { + this._ += "C" + (+x1) + "," + (+y1) + "," + (+x2) + "," + (+y2) + "," + (this._x1 = +x) + "," + (this._y1 = +y); + }, + arcTo: function (x1, y1, x2, y2, r) { + x1 = +x1, y1 = +y1, x2 = +x2, y2 = +y2, r = +r; + var x0 = this._x1, + y0 = this._y1, + x21 = x2 - x1, + y21 = y2 - y1, + x01 = x0 - x1, + y01 = y0 - y1, + l01_2 = x01 * x01 + y01 * y01; + + // Is the radius negative? Error. + if (r < 0) + throw new Error("negative radius: " + r); + + // Is this path empty? Move to (x1,y1). + if (this._x1 === null) { + this._ += "M" + (this._x1 = x1) + "," + (this._y1 = y1); + } + + // Or, is (x1,y1) coincident with (x0,y0)? Do nothing. + else if (!(l01_2 > epsilon$1)) + ; + + // Or, are (x0,y0), (x1,y1) and (x2,y2) collinear? + // Equivalently, is (x1,y1) coincident with (x2,y2)? + // Or, is the radius zero? Line to (x1,y1). + else if (!(Math.abs(y01 * x21 - y21 * x01) > epsilon$1) || !r) { + this._ += "L" + (this._x1 = x1) + "," + (this._y1 = y1); + } + + // Otherwise, draw an arc! + else { + var x20 = x2 - x0, + y20 = y2 - y0, + l21_2 = x21 * x21 + y21 * y21, + l20_2 = x20 * x20 + y20 * y20, + l21 = Math.sqrt(l21_2), + l01 = Math.sqrt(l01_2), + l = r * Math.tan((pi$2 - Math.acos((l21_2 + l01_2 - l20_2) / (2 * l21 * l01))) / 2), + t01 = l / l01, + t21 = l / l21; + + // If the start tangent is not coincident with (x0,y0), line to. + if (Math.abs(t01 - 1) > epsilon$1) { + this._ += "L" + (x1 + t01 * x01) + "," + (y1 + t01 * y01); + } + + this._ += "A" + r + "," + r + ",0,0," + (+(y01 * x20 > x01 * y20)) + "," + (this._x1 = x1 + t21 * x21) + "," + (this._y1 = y1 + t21 * y21); + } + }, + arc: function (x, y, r, a0, a1, ccw) { + x = +x, y = +y, r = +r, ccw = !!ccw; + var dx = r * Math.cos(a0), + dy = r * Math.sin(a0), + x0 = x + dx, + y0 = y + dy, + cw = 1 ^ ccw, + da = ccw ? a0 - a1 : a1 - a0; + + // Is the radius negative? Error. + if (r < 0) + throw new Error("negative radius: " + r); + + // Is this path empty? Move to (x0,y0). + if (this._x1 === null) { + this._ += "M" + x0 + "," + y0; + } + + // Or, is (x0,y0) not coincident with the previous point? Line to (x0,y0). + else if (Math.abs(this._x1 - x0) > epsilon$1 || Math.abs(this._y1 - y0) > epsilon$1) { + this._ += "L" + x0 + "," + y0; + } + + // Is this arc empty? We’re done. + if (!r) + return; + + // Does the angle go the wrong way? Flip the direction. + if (da < 0) + da = da % tau$2 + tau$2; + + // Is this a complete circle? Draw two arcs to complete the circle. + if (da > tauEpsilon) { + this._ += "A" + r + "," + r + ",0,1," + cw + "," + (x - dx) + "," + (y - dy) + "A" + r + "," + r + ",0,1," + cw + "," + (this._x1 = x0) + "," + (this._y1 = y0); + } + + // Is this arc non-empty? Draw an arc! + else if (da > epsilon$1) { + this._ += "A" + r + "," + r + ",0," + (+(da >= pi$2)) + "," + cw + "," + (this._x1 = x + r * Math.cos(a1)) + "," + (this._y1 = y + r * Math.sin(a1)); + } + }, + rect: function (x, y, w, h) { + this._ += "M" + (this._x0 = this._x1 = +x) + "," + (this._y0 = this._y1 = +y) + "h" + (+w) + "v" + (+h) + "h" + (-w) + "Z"; + }, + toString: function () { + return this._; + } + }; + + function defaultSource(d) { + return d.source; + } + + function defaultTarget(d) { + return d.target; + } + + function defaultRadius(d) { + return d.radius; + } + + function defaultStartAngle(d) { + return d.startAngle; + } + + function defaultEndAngle(d) { + return d.endAngle; + } + + function ribbon() { + var source = defaultSource, + target = defaultTarget, + radius = defaultRadius, + startAngle = defaultStartAngle, + endAngle = defaultEndAngle, + context = null; + + function ribbon() { + var buffer, + argv = slice$2.call(arguments), + s = source.apply(this, argv), + t = target.apply(this, argv), + sr = +radius.apply(this, (argv[0] = s, argv)), + sa0 = startAngle.apply(this, argv) - halfPi$1, + sa1 = endAngle.apply(this, argv) - halfPi$1, + sx0 = sr * cos(sa0), + sy0 = sr * sin(sa0), + tr = +radius.apply(this, (argv[0] = t, argv)), + ta0 = startAngle.apply(this, argv) - halfPi$1, + ta1 = endAngle.apply(this, argv) - halfPi$1; + + if (!context) + context = buffer = path(); + + context.moveTo(sx0, sy0); + context.arc(0, 0, sr, sa0, sa1); + if (sa0 !== ta0 || sa1 !== ta1) { // TODO sr !== tr? + context.quadraticCurveTo(0, 0, tr * cos(ta0), tr * sin(ta0)); + context.arc(0, 0, tr, ta0, ta1); + } + context.quadraticCurveTo(0, 0, sx0, sy0); + context.closePath(); + + if (buffer) + return context = null, buffer + "" || null; + } + + ribbon.radius = function (_) { + return arguments.length ? (radius = typeof _ === "function" ? _ : constant$5(+_), ribbon) : radius; + }; + + ribbon.startAngle = function (_) { + return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant$5(+_), ribbon) : startAngle; + }; + + ribbon.endAngle = function (_) { + return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant$5(+_), ribbon) : endAngle; + }; + + ribbon.source = function (_) { + return arguments.length ? (source = _, ribbon) : source; + }; + + ribbon.target = function (_) { + return arguments.length ? (target = _, ribbon) : target; + }; + + ribbon.context = function (_) { + return arguments.length ? ((context = _ == null ? null : _), ribbon) : context; + }; + + return ribbon; + } + + var prefix = "$"; + + function Map() {} + + Map.prototype = map$1.prototype = { + constructor: Map, + has: function (key) { + return (prefix + key) in this; + }, + get: function (key) { + return this[prefix + key]; + }, + set: function (key, value) { + this[prefix + key] = value; + return this; + }, + remove: function (key) { + var property = prefix + key; + return property in this && delete this[property]; + }, + clear: function () { + for (var property in this) + if (property[0] === prefix) + delete this[property]; + }, + keys: function () { + var keys = []; + for (var property in this) + if (property[0] === prefix) + keys.push(property.slice(1)); + return keys; + }, + values: function () { + var values = []; + for (var property in this) + if (property[0] === prefix) + values.push(this[property]); + return values; + }, + entries: function () { + var entries = []; + for (var property in this) + if (property[0] === prefix) + entries.push({key: property.slice(1), value: this[property]}); + return entries; + }, + size: function () { + var size = 0; + for (var property in this) + if (property[0] === prefix) + ++size; + return size; + }, + empty: function () { + for (var property in this) + if (property[0] === prefix) + return false; + return true; + }, + each: function (f) { + for (var property in this) + if (property[0] === prefix) + f(this[property], property.slice(1), this); + } + }; + + function map$1(object, f) { + var map = new Map; + + // Copy constructor. + if (object instanceof Map) + object.each(function (value, key) { + map.set(key, value); + }); + + // Index array by numeric index or specified key function. + else if (Array.isArray(object)) { + var i = -1, + n = object.length, + o; + + if (f == null) + while (++i < n) + map.set(i, object[i]); + else + while (++i < n) + map.set(f(o = object[i], i, object), o); + } + + // Convert object to map. + else if (object) + for (var key in object) + map.set(key, object[key]); + + return map; + } + + function nest() { + var keys = [], + sortKeys = [], + sortValues, + rollup, + nest; + + function apply(array, depth, createResult, setResult) { + if (depth >= keys.length) { + if (sortValues != null) + array.sort(sortValues); + return rollup != null ? rollup(array) : array; + } + + var i = -1, + n = array.length, + key = keys[depth++], + keyValue, + value, + valuesByKey = map$1(), + values, + result = createResult(); + + while (++i < n) { + if (values = valuesByKey.get(keyValue = key(value = array[i]) + "")) { + values.push(value); + } else { + valuesByKey.set(keyValue, [value]); + } + } + + valuesByKey.each(function (values, key) { + setResult(result, key, apply(values, depth, createResult, setResult)); + }); + + return result; + } + + function entries(map, depth) { + if (++depth > keys.length) + return map; + var array, sortKey = sortKeys[depth - 1]; + if (rollup != null && depth >= keys.length) + array = map.entries(); + else + array = [], map.each(function (v, k) { + array.push({key: k, values: entries(v, depth)}); + }); + return sortKey != null ? array.sort(function (a, b) { + return sortKey(a.key, b.key); + }) : array; + } + + return nest = { + object: function (array) { + return apply(array, 0, createObject, setObject); + }, + map: function (array) { + return apply(array, 0, createMap, setMap); + }, + entries: function (array) { + return entries(apply(array, 0, createMap, setMap), 0); + }, + key: function (d) { + keys.push(d); + return nest; + }, + sortKeys: function (order) { + sortKeys[keys.length - 1] = order; + return nest; + }, + sortValues: function (order) { + sortValues = order; + return nest; + }, + rollup: function (f) { + rollup = f; + return nest; + } + }; + } + + function createObject() { + return {}; + } + + function setObject(object, key, value) { + object[key] = value; + } + + function createMap() { + return map$1(); + } + + function setMap(map, key, value) { + map.set(key, value); + } + + function Set() {} + + var proto = map$1.prototype; + + Set.prototype = set$2.prototype = { + constructor: Set, + has: proto.has, + add: function (value) { + value += ""; + this[prefix + value] = value; + return this; + }, + remove: proto.remove, + clear: proto.clear, + values: proto.keys, + size: proto.size, + empty: proto.empty, + each: proto.each + }; + + function set$2(object, f) { + var set = new Set; + + // Copy constructor. + if (object instanceof Set) + object.each(function (value) { + set.add(value); + }); + + // Otherwise, assume it’s an array. + else if (object) { + var i = -1, n = object.length; + if (f == null) + while (++i < n) + set.add(object[i]); + else + while (++i < n) + set.add(f(object[i], i, object)); + } + + return set; + } + + function keys(map) { + var keys = []; + for (var key in map) + keys.push(key); + return keys; + } + + function values(map) { + var values = []; + for (var key in map) + values.push(map[key]); + return values; + } + + function entries(map) { + var entries = []; + for (var key in map) + entries.push({key: key, value: map[key]}); + return entries; + } + + var array$2 = Array.prototype; + + var slice$3 = array$2.slice; + + function ascending$2(a, b) { + return a - b; + } + + function area(ring) { + var i = 0, n = ring.length, area = ring[n - 1][1] * ring[0][0] - ring[n - 1][0] * ring[0][1]; + while (++i < n) + area += ring[i - 1][1] * ring[i][0] - ring[i - 1][0] * ring[i][1]; + return area; + } + + function constant$6(x) { + return function () { + return x; + }; + } + + function contains(ring, hole) { + var i = -1, n = hole.length, c; + while (++i < n) + if (c = ringContains(ring, hole[i])) + return c; + return 0; + } + + function ringContains(ring, point) { + var x = point[0], y = point[1], contains = -1; + for (var i = 0, n = ring.length, j = n - 1; i < n; j = i++) { + var pi = ring[i], xi = pi[0], yi = pi[1], pj = ring[j], xj = pj[0], yj = pj[1]; + if (segmentContains(pi, pj, point)) + return 0; + if (((yi > y) !== (yj > y)) && ((x < (xj - xi) * (y - yi) / (yj - yi) + xi))) + contains = -contains; + } + return contains; + } + + function segmentContains(a, b, c) { + var i; + return collinear(a, b, c) && within(a[i = +(a[0] === b[0])], c[i], b[i]); + } + + function collinear(a, b, c) { + return (b[0] - a[0]) * (c[1] - a[1]) === (c[0] - a[0]) * (b[1] - a[1]); + } + + function within(p, q, r) { + return p <= q && q <= r || r <= q && q <= p; + } + + function noop$1() {} + + var cases = [ + [], + [[[1.0, 1.5], [0.5, 1.0]]], + [[[1.5, 1.0], [1.0, 1.5]]], + [[[1.5, 1.0], [0.5, 1.0]]], + [[[1.0, 0.5], [1.5, 1.0]]], + [[[1.0, 1.5], [0.5, 1.0]], [[1.0, 0.5], [1.5, 1.0]]], + [[[1.0, 0.5], [1.0, 1.5]]], + [[[1.0, 0.5], [0.5, 1.0]]], + [[[0.5, 1.0], [1.0, 0.5]]], + [[[1.0, 1.5], [1.0, 0.5]]], + [[[0.5, 1.0], [1.0, 0.5]], [[1.5, 1.0], [1.0, 1.5]]], + [[[1.5, 1.0], [1.0, 0.5]]], + [[[0.5, 1.0], [1.5, 1.0]]], + [[[1.0, 1.5], [1.5, 1.0]]], + [[[0.5, 1.0], [1.0, 1.5]]], + [] + ]; + + function contours() { + var dx = 1, + dy = 1, + threshold = thresholdSturges, + smooth = smoothLinear; + + function contours(values) { + var tz = threshold(values); + + // Convert number of thresholds into uniform thresholds. + if (!Array.isArray(tz)) { + var domain = extent(values), start = domain[0], stop = domain[1]; + tz = tickStep(start, stop, tz); + tz = sequence(Math.floor(start / tz) * tz, Math.floor(stop / tz) * tz, tz); + } else { + tz = tz.slice().sort(ascending$2); + } + + return tz.map(function (value) { + return contour(values, value); + }); + } + + // Accumulate, smooth contour rings, assign holes to exterior rings. + // Based on https://github.com/mbostock/shapefile/blob/v0.6.2/shp/polygon.js + function contour(values, value) { + var polygons = [], + holes = []; + + isorings(values, value, function (ring) { + smooth(ring, values, value); + if (area(ring) > 0) + polygons.push([ring]); + else + holes.push(ring); + }); + + holes.forEach(function (hole) { + for (var i = 0, n = polygons.length, polygon; i < n; ++i) { + if (contains((polygon = polygons[i])[0], hole) !== -1) { + polygon.push(hole); + return; + } + } + }); + + return { + type: "MultiPolygon", + value: value, + coordinates: polygons + }; + } + + // Marching squares with isolines stitched into rings. + // Based on https://github.com/topojson/topojson-client/blob/v3.0.0/src/stitch.js + function isorings(values, value, callback) { + var fragmentByStart = new Array, + fragmentByEnd = new Array, + x, y, t0, t1, t2, t3; + + // Special case for the first row (y = -1, t2 = t3 = 0). + x = y = -1; + t1 = values[0] >= value; + cases[t1 << 1].forEach(stitch); + while (++x < dx - 1) { + t0 = t1, t1 = values[x + 1] >= value; + cases[t0 | t1 << 1].forEach(stitch); + } + cases[t1 << 0].forEach(stitch); + + // General case for the intermediate rows. + while (++y < dy - 1) { + x = -1; + t1 = values[y * dx + dx] >= value; + t2 = values[y * dx] >= value; + cases[t1 << 1 | t2 << 2].forEach(stitch); + while (++x < dx - 1) { + t0 = t1, t1 = values[y * dx + dx + x + 1] >= value; + t3 = t2, t2 = values[y * dx + x + 1] >= value; + cases[t0 | t1 << 1 | t2 << 2 | t3 << 3].forEach(stitch); + } + cases[t1 | t2 << 3].forEach(stitch); + } + + // Special case for the last row (y = dy - 1, t0 = t1 = 0). + x = -1; + t2 = values[y * dx] >= value; + cases[t2 << 2].forEach(stitch); + while (++x < dx - 1) { + t3 = t2, t2 = values[y * dx + x + 1] >= value; + cases[t2 << 2 | t3 << 3].forEach(stitch); + } + cases[t2 << 3].forEach(stitch); + + function stitch(line) { + var start = [line[0][0] + x, line[0][1] + y], + end = [line[1][0] + x, line[1][1] + y], + startIndex = index(start), + endIndex = index(end), + f, g; + if (f = fragmentByEnd[startIndex]) { + if (g = fragmentByStart[endIndex]) { + delete fragmentByEnd[f.end]; + delete fragmentByStart[g.start]; + if (f === g) { + f.ring.push(end); + callback(f.ring); + } else { + fragmentByStart[f.start] = fragmentByEnd[g.end] = {start: f.start, end: g.end, ring: f.ring.concat(g.ring)}; + } + } else { + delete fragmentByEnd[f.end]; + f.ring.push(end); + fragmentByEnd[f.end = endIndex] = f; + } + } else if (f = fragmentByStart[endIndex]) { + if (g = fragmentByEnd[startIndex]) { + delete fragmentByStart[f.start]; + delete fragmentByEnd[g.end]; + if (f === g) { + f.ring.push(end); + callback(f.ring); + } else { + fragmentByStart[g.start] = fragmentByEnd[f.end] = {start: g.start, end: f.end, ring: g.ring.concat(f.ring)}; + } + } else { + delete fragmentByStart[f.start]; + f.ring.unshift(start); + fragmentByStart[f.start = startIndex] = f; + } + } else { + fragmentByStart[startIndex] = fragmentByEnd[endIndex] = {start: startIndex, end: endIndex, ring: [start, end]}; + } + } + } + + function index(point) { + return point[0] * 2 + point[1] * (dx + 1) * 4; + } + + function smoothLinear(ring, values, value) { + ring.forEach(function (point) { + var x = point[0], + y = point[1], + xt = x | 0, + yt = y | 0, + v0, + v1 = values[yt * dx + xt]; + if (x > 0 && x < dx && xt === x) { + v0 = values[yt * dx + xt - 1]; + point[0] = x + (value - v0) / (v1 - v0) - 0.5; + } + if (y > 0 && y < dy && yt === y) { + v0 = values[(yt - 1) * dx + xt]; + point[1] = y + (value - v0) / (v1 - v0) - 0.5; + } + }); + } + + contours.contour = contour; + + contours.size = function (_) { + if (!arguments.length) + return [dx, dy]; + var _0 = Math.ceil(_[0]), _1 = Math.ceil(_[1]); + if (!(_0 > 0) || !(_1 > 0)) + throw new Error("invalid size"); + return dx = _0, dy = _1, contours; + }; + + contours.thresholds = function (_) { + return arguments.length ? (threshold = typeof _ === "function" ? _ : Array.isArray(_) ? constant$6(slice$3.call(_)) : constant$6(_), contours) : threshold; + }; + + contours.smooth = function (_) { + return arguments.length ? (smooth = _ ? smoothLinear : noop$1, contours) : smooth === smoothLinear; + }; + + return contours; + } + +// TODO Optimize edge cases. +// TODO Optimize index calculation. +// TODO Optimize arguments. + function blurX(source, target, r) { + var n = source.width, + m = source.height, + w = (r << 1) + 1; + for (var j = 0; j < m; ++j) { + for (var i = 0, sr = 0; i < n + r; ++i) { + if (i < n) { + sr += source.data[i + j * n]; + } + if (i >= r) { + if (i >= w) { + sr -= source.data[i - w + j * n]; + } + target.data[i - r + j * n] = sr / Math.min(i + 1, n - 1 + w - i, w); + } + } + } + } + +// TODO Optimize edge cases. +// TODO Optimize index calculation. +// TODO Optimize arguments. + function blurY(source, target, r) { + var n = source.width, + m = source.height, + w = (r << 1) + 1; + for (var i = 0; i < n; ++i) { + for (var j = 0, sr = 0; j < m + r; ++j) { + if (j < m) { + sr += source.data[i + j * n]; + } + if (j >= r) { + if (j >= w) { + sr -= source.data[i + (j - w) * n]; + } + target.data[i + (j - r) * n] = sr / Math.min(j + 1, m - 1 + w - j, w); + } + } + } + } + + function defaultX(d) { + return d[0]; + } + + function defaultY(d) { + return d[1]; + } + + function defaultWeight() { + return 1; + } + + function density() { + var x = defaultX, + y = defaultY, + weight = defaultWeight, + dx = 960, + dy = 500, + r = 20, // blur radius + k = 2, // log2(grid cell size) + o = r * 3, // grid offset, to pad for blur + n = (dx + o * 2) >> k, // grid width + m = (dy + o * 2) >> k, // grid height + threshold = constant$6(20); + + function density(data) { + var values0 = new Float32Array(n * m), + values1 = new Float32Array(n * m); + + data.forEach(function (d, i, data) { + var xi = (+x(d, i, data) + o) >> k, + yi = (+y(d, i, data) + o) >> k, + wi = +weight(d, i, data); + if (xi >= 0 && xi < n && yi >= 0 && yi < m) { + values0[xi + yi * n] += wi; + } + }); + + // TODO Optimize. + blurX({width: n, height: m, data: values0}, {width: n, height: m, data: values1}, r >> k); + blurY({width: n, height: m, data: values1}, {width: n, height: m, data: values0}, r >> k); + blurX({width: n, height: m, data: values0}, {width: n, height: m, data: values1}, r >> k); + blurY({width: n, height: m, data: values1}, {width: n, height: m, data: values0}, r >> k); + blurX({width: n, height: m, data: values0}, {width: n, height: m, data: values1}, r >> k); + blurY({width: n, height: m, data: values1}, {width: n, height: m, data: values0}, r >> k); + + var tz = threshold(values0); + + // Convert number of thresholds into uniform thresholds. + if (!Array.isArray(tz)) { + var stop = max(values0); + tz = tickStep(0, stop, tz); + tz = sequence(0, Math.floor(stop / tz) * tz, tz); + tz.shift(); + } + + return contours() + .thresholds(tz) + .size([n, m]) + (values0) + .map(transform); + } + + function transform(geometry) { + geometry.value *= Math.pow(2, -2 * k); // Density in points per square pixel. + geometry.coordinates.forEach(transformPolygon); + return geometry; + } + + function transformPolygon(coordinates) { + coordinates.forEach(transformRing); + } + + function transformRing(coordinates) { + coordinates.forEach(transformPoint); + } + + // TODO Optimize. + function transformPoint(coordinates) { + coordinates[0] = coordinates[0] * Math.pow(2, k) - o; + coordinates[1] = coordinates[1] * Math.pow(2, k) - o; + } + + function resize() { + o = r * 3; + n = (dx + o * 2) >> k; + m = (dy + o * 2) >> k; + return density; + } + + density.x = function (_) { + return arguments.length ? (x = typeof _ === "function" ? _ : constant$6(+_), density) : x; + }; + + density.y = function (_) { + return arguments.length ? (y = typeof _ === "function" ? _ : constant$6(+_), density) : y; + }; + + density.weight = function (_) { + return arguments.length ? (weight = typeof _ === "function" ? _ : constant$6(+_), density) : weight; + }; + + density.size = function (_) { + if (!arguments.length) + return [dx, dy]; + var _0 = Math.ceil(_[0]), _1 = Math.ceil(_[1]); + if (!(_0 >= 0) && !(_0 >= 0)) + throw new Error("invalid size"); + return dx = _0, dy = _1, resize(); + }; + + density.cellSize = function (_) { + if (!arguments.length) + return 1 << k; + if (!((_ = +_) >= 1)) + throw new Error("invalid cell size"); + return k = Math.floor(Math.log(_) / Math.LN2), resize(); + }; + + density.thresholds = function (_) { + return arguments.length ? (threshold = typeof _ === "function" ? _ : Array.isArray(_) ? constant$6(slice$3.call(_)) : constant$6(_), density) : threshold; + }; + + density.bandwidth = function (_) { + if (!arguments.length) + return Math.sqrt(r * (r + 1)); + if (!((_ = +_) >= 0)) + throw new Error("invalid bandwidth"); + return r = Math.round((Math.sqrt(4 * _ * _ + 1) - 1) / 2), resize(); + }; + + return density; + } + + var EOL = {}, + EOF = {}, + QUOTE = 34, + NEWLINE = 10, + RETURN = 13; + + function objectConverter(columns) { + return new Function("d", "return {" + columns.map(function (name, i) { + return JSON.stringify(name) + ": d[" + i + "] || \"\""; + }).join(",") + "}"); + } + + function customConverter(columns, f) { + var object = objectConverter(columns); + return function (row, i) { + return f(object(row), i, columns); + }; + } + +// Compute unique columns in order of discovery. + function inferColumns(rows) { + var columnSet = Object.create(null), + columns = []; + + rows.forEach(function (row) { + for (var column in row) { + if (!(column in columnSet)) { + columns.push(columnSet[column] = column); + } + } + }); + + return columns; + } + + function pad(value, width) { + var s = value + "", length = s.length; + return length < width ? new Array(width - length + 1).join(0) + s : s; + } + + function formatYear(year) { + return year < 0 ? "-" + pad(-year, 6) + : year > 9999 ? "+" + pad(year, 6) + : pad(year, 4); + } + + function formatDate(date) { + var hours = date.getUTCHours(), + minutes = date.getUTCMinutes(), + seconds = date.getUTCSeconds(), + milliseconds = date.getUTCMilliseconds(); + return isNaN(date) ? "Invalid Date" + : formatYear(date.getUTCFullYear()) + "-" + pad(date.getUTCMonth() + 1, 2) + "-" + pad(date.getUTCDate(), 2) + + (milliseconds ? "T" + pad(hours, 2) + ":" + pad(minutes, 2) + ":" + pad(seconds, 2) + "." + pad(milliseconds, 3) + "Z" + : seconds ? "T" + pad(hours, 2) + ":" + pad(minutes, 2) + ":" + pad(seconds, 2) + "Z" + : minutes || hours ? "T" + pad(hours, 2) + ":" + pad(minutes, 2) + "Z" + : ""); + } + + function dsvFormat(delimiter) { + var reFormat = new RegExp("[\"" + delimiter + "\n\r]"), + DELIMITER = delimiter.charCodeAt(0); + + function parse(text, f) { + var convert, columns, rows = parseRows(text, function (row, i) { + if (convert) + return convert(row, i - 1); + columns = row, convert = f ? customConverter(row, f) : objectConverter(row); + }); + rows.columns = columns || []; + return rows; + } + + function parseRows(text, f) { + var rows = [], // output rows + N = text.length, + I = 0, // current character index + n = 0, // current line number + t, // current token + eof = N <= 0, // current token followed by EOF? + eol = false; // current token followed by EOL? + + // Strip the trailing newline. + if (text.charCodeAt(N - 1) === NEWLINE) + --N; + if (text.charCodeAt(N - 1) === RETURN) + --N; + + function token() { + if (eof) + return EOF; + if (eol) + return eol = false, EOL; + + // Unescape quotes. + var i, j = I, c; + if (text.charCodeAt(j) === QUOTE) { + while (I++ < N && text.charCodeAt(I) !== QUOTE || text.charCodeAt(++I) === QUOTE) + ; + if ((i = I) >= N) + eof = true; + else if ((c = text.charCodeAt(I++)) === NEWLINE) + eol = true; + else if (c === RETURN) { + eol = true; + if (text.charCodeAt(I) === NEWLINE) + ++I; + } + return text.slice(j + 1, i - 1).replace(/""/g, "\""); + } + + // Find next delimiter or newline. + while (I < N) { + if ((c = text.charCodeAt(i = I++)) === NEWLINE) + eol = true; + else if (c === RETURN) { + eol = true; + if (text.charCodeAt(I) === NEWLINE) + ++I; + } else if (c !== DELIMITER) + continue; + return text.slice(j, i); + } + + // Return last token before EOF. + return eof = true, text.slice(j, N); + } + + while ((t = token()) !== EOF) { + var row = []; + while (t !== EOL && t !== EOF) + row.push(t), t = token(); + if (f && (row = f(row, n++)) == null) + continue; + rows.push(row); + } + + return rows; + } + + function preformatBody(rows, columns) { + return rows.map(function (row) { + return columns.map(function (column) { + return formatValue(row[column]); + }).join(delimiter); + }); + } + + function format(rows, columns) { + if (columns == null) + columns = inferColumns(rows); + return [columns.map(formatValue).join(delimiter)].concat(preformatBody(rows, columns)).join("\n"); + } + + function formatBody(rows, columns) { + if (columns == null) + columns = inferColumns(rows); + return preformatBody(rows, columns).join("\n"); + } + + function formatRows(rows) { + return rows.map(formatRow).join("\n"); + } + + function formatRow(row) { + return row.map(formatValue).join(delimiter); + } + + function formatValue(value) { + return value == null ? "" + : value instanceof Date ? formatDate(value) + : reFormat.test(value += "") ? "\"" + value.replace(/"/g, "\"\"") + "\"" + : value; + } + + return { + parse: parse, + parseRows: parseRows, + format: format, + formatBody: formatBody, + formatRows: formatRows, + formatRow: formatRow, + formatValue: formatValue + }; + } + + var csv = dsvFormat(","); + + var csvParse = csv.parse; + var csvParseRows = csv.parseRows; + var csvFormat = csv.format; + var csvFormatBody = csv.formatBody; + var csvFormatRows = csv.formatRows; + var csvFormatRow = csv.formatRow; + var csvFormatValue = csv.formatValue; + + var tsv = dsvFormat("\t"); + + var tsvParse = tsv.parse; + var tsvParseRows = tsv.parseRows; + var tsvFormat = tsv.format; + var tsvFormatBody = tsv.formatBody; + var tsvFormatRows = tsv.formatRows; + var tsvFormatRow = tsv.formatRow; + var tsvFormatValue = tsv.formatValue; + + function autoType(object) { + for (var key in object) { + var value = object[key].trim(), number, m; + if (!value) + value = null; + else if (value === "true") + value = true; + else if (value === "false") + value = false; + else if (value === "NaN") + value = NaN; + else if (!isNaN(number = +value)) + value = number; + 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})?)?$/)) { + if (fixtz && !!m[4] && !m[7]) + value = value.replace(/-/g, "/").replace(/T/, " "); + value = new Date(value); + } else + continue; + object[key] = value; + } + return object; + } + +// https://github.com/d3/d3-dsv/issues/45 + var fixtz = new Date("2019-01-01T00:00").getHours() || new Date("2019-07-01T00:00").getHours(); + + function responseBlob(response) { + if (!response.ok) + throw new Error(response.status + " " + response.statusText); + return response.blob(); + } + + function blob(input, init) { + return fetch(input, init).then(responseBlob); + } + + function responseArrayBuffer(response) { + if (!response.ok) + throw new Error(response.status + " " + response.statusText); + return response.arrayBuffer(); + } + + function buffer(input, init) { + return fetch(input, init).then(responseArrayBuffer); + } + + function responseText(response) { + if (!response.ok) + throw new Error(response.status + " " + response.statusText); + return response.text(); + } + + function text(input, init) { + return fetch(input, init).then(responseText); + } + + function dsvParse(parse) { + return function (input, init, row) { + if (arguments.length === 2 && typeof init === "function") + row = init, init = undefined; + return text(input, init).then(function (response) { + return parse(response, row); + }); + }; + } + + function dsv(delimiter, input, init, row) { + if (arguments.length === 3 && typeof init === "function") + row = init, init = undefined; + var format = dsvFormat(delimiter); + return text(input, init).then(function (response) { + return format.parse(response, row); + }); + } + + var csv$1 = dsvParse(csvParse); + var tsv$1 = dsvParse(tsvParse); + + function image(input, init) { + return new Promise(function (resolve, reject) { + var image = new Image; + for (var key in init) + image[key] = init[key]; + image.onerror = reject; + image.onload = function () { + resolve(image); + }; + image.src = input; + }); + } + + function responseJson(response) { + if (!response.ok) + throw new Error(response.status + " " + response.statusText); + return response.json(); + } + + function json(input, init) { + return fetch(input, init).then(responseJson); + } + + function parser(type) { + return function (input, init) { + return text(input, init).then(function (text) { + return (new DOMParser).parseFromString(text, type); + }); + }; + } + + var xml = parser("application/xml"); + + var html = parser("text/html"); + + var svg = parser("image/svg+xml"); + + function center$1(x, y) { + var nodes; + + if (x == null) + x = 0; + if (y == null) + y = 0; + + function force() { + var i, + n = nodes.length, + node, + sx = 0, + sy = 0; + + for (i = 0; i < n; ++i) { + node = nodes[i], sx += node.x, sy += node.y; + } + + for (sx = sx / n - x, sy = sy / n - y, i = 0; i < n; ++i) { + node = nodes[i], node.x -= sx, node.y -= sy; + } + } + + force.initialize = function (_) { + nodes = _; + }; + + force.x = function (_) { + return arguments.length ? (x = +_, force) : x; + }; + + force.y = function (_) { + return arguments.length ? (y = +_, force) : y; + }; + + return force; + } + + function constant$7(x) { + return function () { + return x; + }; + } + + function jiggle() { + return (Math.random() - 0.5) * 1e-6; + } + + function tree_add(d) { + var x = +this._x.call(null, d), + y = +this._y.call(null, d); + return add(this.cover(x, y), x, y, d); + } + + function add(tree, x, y, d) { + if (isNaN(x) || isNaN(y)) + return tree; // ignore invalid points + + var parent, + node = tree._root, + leaf = {data: d}, + x0 = tree._x0, + y0 = tree._y0, + x1 = tree._x1, + y1 = tree._y1, + xm, + ym, + xp, + yp, + right, + bottom, + i, + j; + + // If the tree is empty, initialize the root as a leaf. + if (!node) + return tree._root = leaf, tree; + + // Find the existing leaf for the new point, or add it. + while (node.length) { + if (right = x >= (xm = (x0 + x1) / 2)) + x0 = xm; + else + x1 = xm; + if (bottom = y >= (ym = (y0 + y1) / 2)) + y0 = ym; + else + y1 = ym; + if (parent = node, !(node = node[i = bottom << 1 | right])) + return parent[i] = leaf, tree; + } + + // Is the new point is exactly coincident with the existing point? + xp = +tree._x.call(null, node.data); + yp = +tree._y.call(null, node.data); + if (x === xp && y === yp) + return leaf.next = node, parent ? parent[i] = leaf : tree._root = leaf, tree; + + // Otherwise, split the leaf node until the old and new point are separated. + do { + parent = parent ? parent[i] = new Array(4) : tree._root = new Array(4); + if (right = x >= (xm = (x0 + x1) / 2)) + x0 = xm; + else + x1 = xm; + if (bottom = y >= (ym = (y0 + y1) / 2)) + y0 = ym; + else + y1 = ym; + } while ((i = bottom << 1 | right) === (j = (yp >= ym) << 1 | (xp >= xm))); + return parent[j] = node, parent[i] = leaf, tree; + } + + function addAll(data) { + var d, i, n = data.length, + x, + y, + xz = new Array(n), + yz = new Array(n), + x0 = Infinity, + y0 = Infinity, + x1 = -Infinity, + y1 = -Infinity; + + // Compute the points and their extent. + for (i = 0; i < n; ++i) { + if (isNaN(x = +this._x.call(null, d = data[i])) || isNaN(y = +this._y.call(null, d))) + continue; + xz[i] = x; + yz[i] = y; + if (x < x0) + x0 = x; + if (x > x1) + x1 = x; + if (y < y0) + y0 = y; + if (y > y1) + y1 = y; + } + + // If there were no (valid) points, abort. + if (x0 > x1 || y0 > y1) + return this; + + // Expand the tree to cover the new points. + this.cover(x0, y0).cover(x1, y1); + + // Add the new points. + for (i = 0; i < n; ++i) { + add(this, xz[i], yz[i], data[i]); + } + + return this; + } + + function tree_cover(x, y) { + if (isNaN(x = +x) || isNaN(y = +y)) + return this; // ignore invalid points + + var x0 = this._x0, + y0 = this._y0, + x1 = this._x1, + y1 = this._y1; + + // If the quadtree has no extent, initialize them. + // Integer extent are necessary so that if we later double the extent, + // the existing quadrant boundaries don’t change due to floating point error! + if (isNaN(x0)) { + x1 = (x0 = Math.floor(x)) + 1; + y1 = (y0 = Math.floor(y)) + 1; + } + + // Otherwise, double repeatedly to cover. + else { + var z = x1 - x0, + node = this._root, + parent, + i; + + while (x0 > x || x >= x1 || y0 > y || y >= y1) { + i = (y < y0) << 1 | (x < x0); + parent = new Array(4), parent[i] = node, node = parent, z *= 2; + switch (i) { + case 0: + x1 = x0 + z, y1 = y0 + z; + break; + case 1: + x0 = x1 - z, y1 = y0 + z; + break; + case 2: + x1 = x0 + z, y0 = y1 - z; + break; + case 3: + x0 = x1 - z, y0 = y1 - z; + break; + } + } + + if (this._root && this._root.length) + this._root = node; + } + + this._x0 = x0; + this._y0 = y0; + this._x1 = x1; + this._y1 = y1; + return this; + } + + function tree_data() { + var data = []; + this.visit(function (node) { + if (!node.length) + do + data.push(node.data); + while (node = node.next) + }); + return data; + } + + function tree_extent(_) { + return arguments.length + ? this.cover(+_[0][0], +_[0][1]).cover(+_[1][0], +_[1][1]) + : isNaN(this._x0) ? undefined : [[this._x0, this._y0], [this._x1, this._y1]]; + } + + function Quad(node, x0, y0, x1, y1) { + this.node = node; + this.x0 = x0; + this.y0 = y0; + this.x1 = x1; + this.y1 = y1; + } + + function tree_find(x, y, radius) { + var data, + x0 = this._x0, + y0 = this._y0, + x1, + y1, + x2, + y2, + x3 = this._x1, + y3 = this._y1, + quads = [], + node = this._root, + q, + i; + + if (node) + quads.push(new Quad(node, x0, y0, x3, y3)); + if (radius == null) + radius = Infinity; + else { + x0 = x - radius, y0 = y - radius; + x3 = x + radius, y3 = y + radius; + radius *= radius; + } + + while (q = quads.pop()) { + + // Stop searching if this quadrant can’t contain a closer node. + if (!(node = q.node) + || (x1 = q.x0) > x3 + || (y1 = q.y0) > y3 + || (x2 = q.x1) < x0 + || (y2 = q.y1) < y0) + continue; + + // Bisect the current quadrant. + if (node.length) { + var xm = (x1 + x2) / 2, + ym = (y1 + y2) / 2; + + quads.push( + new Quad(node[3], xm, ym, x2, y2), + new Quad(node[2], x1, ym, xm, y2), + new Quad(node[1], xm, y1, x2, ym), + new Quad(node[0], x1, y1, xm, ym) + ); + + // Visit the closest quadrant first. + if (i = (y >= ym) << 1 | (x >= xm)) { + q = quads[quads.length - 1]; + quads[quads.length - 1] = quads[quads.length - 1 - i]; + quads[quads.length - 1 - i] = q; + } + } + + // Visit this point. (Visiting coincident points isn’t necessary!) + else { + var dx = x - +this._x.call(null, node.data), + dy = y - +this._y.call(null, node.data), + d2 = dx * dx + dy * dy; + if (d2 < radius) { + var d = Math.sqrt(radius = d2); + x0 = x - d, y0 = y - d; + x3 = x + d, y3 = y + d; + data = node.data; + } + } + } + + return data; + } + + function tree_remove(d) { + if (isNaN(x = +this._x.call(null, d)) || isNaN(y = +this._y.call(null, d))) + return this; // ignore invalid points + + var parent, + node = this._root, + retainer, + previous, + next, + x0 = this._x0, + y0 = this._y0, + x1 = this._x1, + y1 = this._y1, + x, + y, + xm, + ym, + right, + bottom, + i, + j; + + // If the tree is empty, initialize the root as a leaf. + if (!node) + return this; + + // Find the leaf node for the point. + // While descending, also retain the deepest parent with a non-removed sibling. + if (node.length) + while (true) { + if (right = x >= (xm = (x0 + x1) / 2)) + x0 = xm; + else + x1 = xm; + if (bottom = y >= (ym = (y0 + y1) / 2)) + y0 = ym; + else + y1 = ym; + if (!(parent = node, node = node[i = bottom << 1 | right])) + return this; + if (!node.length) + break; + if (parent[(i + 1) & 3] || parent[(i + 2) & 3] || parent[(i + 3) & 3]) + retainer = parent, j = i; + } + + // Find the point to remove. + while (node.data !== d) + if (!(previous = node, node = node.next)) + return this; + if (next = node.next) + delete node.next; + + // If there are multiple coincident points, remove just the point. + if (previous) + return (next ? previous.next = next : delete previous.next), this; + + // If this is the root point, remove it. + if (!parent) + return this._root = next, this; + + // Remove this leaf. + next ? parent[i] = next : delete parent[i]; + + // If the parent now contains exactly one leaf, collapse superfluous parents. + if ((node = parent[0] || parent[1] || parent[2] || parent[3]) + && node === (parent[3] || parent[2] || parent[1] || parent[0]) + && !node.length) { + if (retainer) + retainer[j] = node; + else + this._root = node; + } + + return this; + } + + function removeAll(data) { + for (var i = 0, n = data.length; i < n; ++i) + this.remove(data[i]); + return this; + } + + function tree_root() { + return this._root; + } + + function tree_size() { + var size = 0; + this.visit(function (node) { + if (!node.length) + do + ++size; + while (node = node.next) + }); + return size; + } + + function tree_visit(callback) { + var quads = [], q, node = this._root, child, x0, y0, x1, y1; + if (node) + quads.push(new Quad(node, this._x0, this._y0, this._x1, this._y1)); + while (q = quads.pop()) { + if (!callback(node = q.node, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1) && node.length) { + var xm = (x0 + x1) / 2, ym = (y0 + y1) / 2; + if (child = node[3]) + quads.push(new Quad(child, xm, ym, x1, y1)); + if (child = node[2]) + quads.push(new Quad(child, x0, ym, xm, y1)); + if (child = node[1]) + quads.push(new Quad(child, xm, y0, x1, ym)); + if (child = node[0]) + quads.push(new Quad(child, x0, y0, xm, ym)); + } + } + return this; + } + + function tree_visitAfter(callback) { + var quads = [], next = [], q; + if (this._root) + quads.push(new Quad(this._root, this._x0, this._y0, this._x1, this._y1)); + while (q = quads.pop()) { + var node = q.node; + if (node.length) { + var child, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1, xm = (x0 + x1) / 2, ym = (y0 + y1) / 2; + if (child = node[0]) + quads.push(new Quad(child, x0, y0, xm, ym)); + if (child = node[1]) + quads.push(new Quad(child, xm, y0, x1, ym)); + if (child = node[2]) + quads.push(new Quad(child, x0, ym, xm, y1)); + if (child = node[3]) + quads.push(new Quad(child, xm, ym, x1, y1)); + } + next.push(q); + } + while (q = next.pop()) { + callback(q.node, q.x0, q.y0, q.x1, q.y1); + } + return this; + } + + function defaultX$1(d) { + return d[0]; + } + + function tree_x(_) { + return arguments.length ? (this._x = _, this) : this._x; + } + + function defaultY$1(d) { + return d[1]; + } + + function tree_y(_) { + return arguments.length ? (this._y = _, this) : this._y; + } + + function quadtree(nodes, x, y) { + var tree = new Quadtree(x == null ? defaultX$1 : x, y == null ? defaultY$1 : y, NaN, NaN, NaN, NaN); + return nodes == null ? tree : tree.addAll(nodes); + } + + function Quadtree(x, y, x0, y0, x1, y1) { + this._x = x; + this._y = y; + this._x0 = x0; + this._y0 = y0; + this._x1 = x1; + this._y1 = y1; + this._root = undefined; + } + + function leaf_copy(leaf) { + var copy = {data: leaf.data}, next = copy; + while (leaf = leaf.next) + next = next.next = {data: leaf.data}; + return copy; + } + + var treeProto = quadtree.prototype = Quadtree.prototype; + + treeProto.copy = function () { + var copy = new Quadtree(this._x, this._y, this._x0, this._y0, this._x1, this._y1), + node = this._root, + nodes, + child; + + if (!node) + return copy; + + if (!node.length) + return copy._root = leaf_copy(node), copy; + + nodes = [{source: node, target: copy._root = new Array(4)}]; + while (node = nodes.pop()) { + for (var i = 0; i < 4; ++i) { + if (child = node.source[i]) { + if (child.length) + nodes.push({source: child, target: node.target[i] = new Array(4)}); + else + node.target[i] = leaf_copy(child); + } + } + } + + return copy; + }; + + treeProto.add = tree_add; + treeProto.addAll = addAll; + treeProto.cover = tree_cover; + treeProto.data = tree_data; + treeProto.extent = tree_extent; + treeProto.find = tree_find; + treeProto.remove = tree_remove; + treeProto.removeAll = removeAll; + treeProto.root = tree_root; + treeProto.size = tree_size; + treeProto.visit = tree_visit; + treeProto.visitAfter = tree_visitAfter; + treeProto.x = tree_x; + treeProto.y = tree_y; + + function x(d) { + return d.x + d.vx; + } + + function y(d) { + return d.y + d.vy; + } + + function collide(radius) { + var nodes, + radii, + strength = 1, + iterations = 1; + + if (typeof radius !== "function") + radius = constant$7(radius == null ? 1 : +radius); + + function force() { + var i, n = nodes.length, + tree, + node, + xi, + yi, + ri, + ri2; + + for (var k = 0; k < iterations; ++k) { + tree = quadtree(nodes, x, y).visitAfter(prepare); + for (i = 0; i < n; ++i) { + node = nodes[i]; + ri = radii[node.index], ri2 = ri * ri; + xi = node.x + node.vx; + yi = node.y + node.vy; + tree.visit(apply); + } + } + + function apply(quad, x0, y0, x1, y1) { + var data = quad.data, rj = quad.r, r = ri + rj; + if (data) { + if (data.index > node.index) { + var x = xi - data.x - data.vx, + y = yi - data.y - data.vy, + l = x * x + y * y; + if (l < r * r) { + if (x === 0) + x = jiggle(), l += x * x; + if (y === 0) + y = jiggle(), l += y * y; + l = (r - (l = Math.sqrt(l))) / l * strength; + node.vx += (x *= l) * (r = (rj *= rj) / (ri2 + rj)); + node.vy += (y *= l) * r; + data.vx -= x * (r = 1 - r); + data.vy -= y * r; + } + } + return; + } + return x0 > xi + r || x1 < xi - r || y0 > yi + r || y1 < yi - r; + } + } + + function prepare(quad) { + if (quad.data) + return quad.r = radii[quad.data.index]; + for (var i = quad.r = 0; i < 4; ++i) { + if (quad[i] && quad[i].r > quad.r) { + quad.r = quad[i].r; + } + } + } + + function initialize() { + if (!nodes) + return; + var i, n = nodes.length, node; + radii = new Array(n); + for (i = 0; i < n; ++i) + node = nodes[i], radii[node.index] = +radius(node, i, nodes); + } + + force.initialize = function (_) { + nodes = _; + initialize(); + }; + + force.iterations = function (_) { + return arguments.length ? (iterations = +_, force) : iterations; + }; + + force.strength = function (_) { + return arguments.length ? (strength = +_, force) : strength; + }; + + force.radius = function (_) { + return arguments.length ? (radius = typeof _ === "function" ? _ : constant$7(+_), initialize(), force) : radius; + }; + + return force; + } + + function index(d) { + return d.index; + } + + function find(nodeById, nodeId) { + var node = nodeById.get(nodeId); + if (!node) + throw new Error("missing: " + nodeId); + return node; + } + + function link(links) { + var id = index, + strength = defaultStrength, + strengths, + distance = constant$7(30), + distances, + nodes, + count, + bias, + iterations = 1; + + if (links == null) + links = []; + + function defaultStrength(link) { + return 1 / Math.min(count[link.source.index], count[link.target.index]); + } + + function force(alpha) { + for (var k = 0, n = links.length; k < iterations; ++k) { + for (var i = 0, link, source, target, x, y, l, b; i < n; ++i) { + link = links[i], source = link.source, target = link.target; + x = target.x + target.vx - source.x - source.vx || jiggle(); + y = target.y + target.vy - source.y - source.vy || jiggle(); + l = Math.sqrt(x * x + y * y); + l = (l - distances[i]) / l * alpha * strengths[i]; + x *= l, y *= l; + target.vx -= x * (b = bias[i]); + target.vy -= y * b; + source.vx += x * (b = 1 - b); + source.vy += y * b; + } + } + } + + function initialize() { + if (!nodes) + return; + + var i, + n = nodes.length, + m = links.length, + nodeById = map$1(nodes, id), + link; + + for (i = 0, count = new Array(n); i < m; ++i) { + link = links[i], link.index = i; + if (typeof link.source !== "object") + link.source = find(nodeById, link.source); + if (typeof link.target !== "object") + link.target = find(nodeById, link.target); + count[link.source.index] = (count[link.source.index] || 0) + 1; + count[link.target.index] = (count[link.target.index] || 0) + 1; + } + + for (i = 0, bias = new Array(m); i < m; ++i) { + link = links[i], bias[i] = count[link.source.index] / (count[link.source.index] + count[link.target.index]); + } + + strengths = new Array(m), initializeStrength(); + distances = new Array(m), initializeDistance(); + } + + function initializeStrength() { + if (!nodes) + return; + + for (var i = 0, n = links.length; i < n; ++i) { + strengths[i] = +strength(links[i], i, links); + } + } + + function initializeDistance() { + if (!nodes) + return; + + for (var i = 0, n = links.length; i < n; ++i) { + distances[i] = +distance(links[i], i, links); + } + } + + force.initialize = function (_) { + nodes = _; + initialize(); + }; + + force.links = function (_) { + return arguments.length ? (links = _, initialize(), force) : links; + }; + + force.id = function (_) { + return arguments.length ? (id = _, force) : id; + }; + + force.iterations = function (_) { + return arguments.length ? (iterations = +_, force) : iterations; + }; + + force.strength = function (_) { + return arguments.length ? (strength = typeof _ === "function" ? _ : constant$7(+_), initializeStrength(), force) : strength; + }; + + force.distance = function (_) { + return arguments.length ? (distance = typeof _ === "function" ? _ : constant$7(+_), initializeDistance(), force) : distance; + }; + + return force; + } + + function x$1(d) { + return d.x; + } + + function y$1(d) { + return d.y; + } + + var initialRadius = 10, + initialAngle = Math.PI * (3 - Math.sqrt(5)); + + function simulation(nodes) { + var simulation, + alpha = 1, + alphaMin = 0.001, + alphaDecay = 1 - Math.pow(alphaMin, 1 / 300), + alphaTarget = 0, + velocityDecay = 0.6, + forces = map$1(), + stepper = timer(step), + event = dispatch("tick", "end"); + + if (nodes == null) + nodes = []; + + function step() { + tick(); + event.call("tick", simulation); + if (alpha < alphaMin) { + stepper.stop(); + event.call("end", simulation); + } + } + + function tick(iterations) { + var i, n = nodes.length, node; + + if (iterations === undefined) + iterations = 1; + + for (var k = 0; k < iterations; ++k) { + alpha += (alphaTarget - alpha) * alphaDecay; + + forces.each(function (force) { + force(alpha); + }); + + for (i = 0; i < n; ++i) { + node = nodes[i]; + if (node.fx == null) + node.x += node.vx *= velocityDecay; + else + node.x = node.fx, node.vx = 0; + if (node.fy == null) + node.y += node.vy *= velocityDecay; + else + node.y = node.fy, node.vy = 0; + } + } + + return simulation; + } + + function initializeNodes() { + for (var i = 0, n = nodes.length, node; i < n; ++i) { + node = nodes[i], node.index = i; + if (node.fx != null) + node.x = node.fx; + if (node.fy != null) + node.y = node.fy; + if (isNaN(node.x) || isNaN(node.y)) { + var radius = initialRadius * Math.sqrt(i), angle = i * initialAngle; + node.x = radius * Math.cos(angle); + node.y = radius * Math.sin(angle); + } + if (isNaN(node.vx) || isNaN(node.vy)) { + node.vx = node.vy = 0; + } + } + } + + function initializeForce(force) { + if (force.initialize) + force.initialize(nodes); + return force; + } + + initializeNodes(); + + return simulation = { + tick: tick, + + restart: function () { + return stepper.restart(step), simulation; + }, + + stop: function () { + return stepper.stop(), simulation; + }, + + nodes: function (_) { + return arguments.length ? (nodes = _, initializeNodes(), forces.each(initializeForce), simulation) : nodes; + }, + + alpha: function (_) { + return arguments.length ? (alpha = +_, simulation) : alpha; + }, + + alphaMin: function (_) { + return arguments.length ? (alphaMin = +_, simulation) : alphaMin; + }, + + alphaDecay: function (_) { + return arguments.length ? (alphaDecay = +_, simulation) : +alphaDecay; + }, + + alphaTarget: function (_) { + return arguments.length ? (alphaTarget = +_, simulation) : alphaTarget; + }, + + velocityDecay: function (_) { + return arguments.length ? (velocityDecay = 1 - _, simulation) : 1 - velocityDecay; + }, + + force: function (name, _) { + return arguments.length > 1 ? ((_ == null ? forces.remove(name) : forces.set(name, initializeForce(_))), simulation) : forces.get(name); + }, + + find: function (x, y, radius) { + var i = 0, + n = nodes.length, + dx, + dy, + d2, + node, + closest; + + if (radius == null) + radius = Infinity; + else + radius *= radius; + + for (i = 0; i < n; ++i) { + node = nodes[i]; + dx = x - node.x; + dy = y - node.y; + d2 = dx * dx + dy * dy; + if (d2 < radius) + closest = node, radius = d2; + } + + return closest; + }, + + on: function (name, _) { + return arguments.length > 1 ? (event.on(name, _), simulation) : event.on(name); + } + }; + } + + function manyBody() { + var nodes, + node, + alpha, + strength = constant$7(-30), + strengths, + distanceMin2 = 1, + distanceMax2 = Infinity, + theta2 = 0.81; + + function force(_) { + var i, n = nodes.length, tree = quadtree(nodes, x$1, y$1).visitAfter(accumulate); + for (alpha = _, i = 0; i < n; ++i) + node = nodes[i], tree.visit(apply); + } + + function initialize() { + if (!nodes) + return; + var i, n = nodes.length, node; + strengths = new Array(n); + for (i = 0; i < n; ++i) + node = nodes[i], strengths[node.index] = +strength(node, i, nodes); + } + + function accumulate(quad) { + var strength = 0, q, c, weight = 0, x, y, i; + + // For internal nodes, accumulate forces from child quadrants. + if (quad.length) { + for (x = y = i = 0; i < 4; ++i) { + if ((q = quad[i]) && (c = Math.abs(q.value))) { + strength += q.value, weight += c, x += c * q.x, y += c * q.y; + } + } + quad.x = x / weight; + quad.y = y / weight; + } + + // For leaf nodes, accumulate forces from coincident quadrants. + else { + q = quad; + q.x = q.data.x; + q.y = q.data.y; + do + strength += strengths[q.data.index]; + while (q = q.next); + } + + quad.value = strength; + } + + function apply(quad, x1, _, x2) { + if (!quad.value) + return true; + + var x = quad.x - node.x, + y = quad.y - node.y, + w = x2 - x1, + l = x * x + y * y; + + // Apply the Barnes-Hut approximation if possible. + // Limit forces for very close nodes; randomize direction if coincident. + if (w * w / theta2 < l) { + if (l < distanceMax2) { + if (x === 0) + x = jiggle(), l += x * x; + if (y === 0) + y = jiggle(), l += y * y; + if (l < distanceMin2) + l = Math.sqrt(distanceMin2 * l); + node.vx += x * quad.value * alpha / l; + node.vy += y * quad.value * alpha / l; + } + return true; + } + + // Otherwise, process points directly. + else if (quad.length || l >= distanceMax2) + return; + + // Limit forces for very close nodes; randomize direction if coincident. + if (quad.data !== node || quad.next) { + if (x === 0) + x = jiggle(), l += x * x; + if (y === 0) + y = jiggle(), l += y * y; + if (l < distanceMin2) + l = Math.sqrt(distanceMin2 * l); + } + + do + if (quad.data !== node) { + w = strengths[quad.data.index] * alpha / l; + node.vx += x * w; + node.vy += y * w; + } + while (quad = quad.next); + } + + force.initialize = function (_) { + nodes = _; + initialize(); + }; + + force.strength = function (_) { + return arguments.length ? (strength = typeof _ === "function" ? _ : constant$7(+_), initialize(), force) : strength; + }; + + force.distanceMin = function (_) { + return arguments.length ? (distanceMin2 = _ * _, force) : Math.sqrt(distanceMin2); + }; + + force.distanceMax = function (_) { + return arguments.length ? (distanceMax2 = _ * _, force) : Math.sqrt(distanceMax2); + }; + + force.theta = function (_) { + return arguments.length ? (theta2 = _ * _, force) : Math.sqrt(theta2); + }; + + return force; + } + + function radial(radius, x, y) { + var nodes, + strength = constant$7(0.1), + strengths, + radiuses; + + if (typeof radius !== "function") + radius = constant$7(+radius); + if (x == null) + x = 0; + if (y == null) + y = 0; + + function force(alpha) { + for (var i = 0, n = nodes.length; i < n; ++i) { + var node = nodes[i], + dx = node.x - x || 1e-6, + dy = node.y - y || 1e-6, + r = Math.sqrt(dx * dx + dy * dy), + k = (radiuses[i] - r) * strengths[i] * alpha / r; + node.vx += dx * k; + node.vy += dy * k; + } + } + + function initialize() { + if (!nodes) + return; + var i, n = nodes.length; + strengths = new Array(n); + radiuses = new Array(n); + for (i = 0; i < n; ++i) { + radiuses[i] = +radius(nodes[i], i, nodes); + strengths[i] = isNaN(radiuses[i]) ? 0 : +strength(nodes[i], i, nodes); + } + } + + force.initialize = function (_) { + nodes = _, initialize(); + }; + + force.strength = function (_) { + return arguments.length ? (strength = typeof _ === "function" ? _ : constant$7(+_), initialize(), force) : strength; + }; + + force.radius = function (_) { + return arguments.length ? (radius = typeof _ === "function" ? _ : constant$7(+_), initialize(), force) : radius; + }; + + force.x = function (_) { + return arguments.length ? (x = +_, force) : x; + }; + + force.y = function (_) { + return arguments.length ? (y = +_, force) : y; + }; + + return force; + } + + function x$2(x) { + var strength = constant$7(0.1), + nodes, + strengths, + xz; + + if (typeof x !== "function") + x = constant$7(x == null ? 0 : +x); + + function force(alpha) { + for (var i = 0, n = nodes.length, node; i < n; ++i) { + node = nodes[i], node.vx += (xz[i] - node.x) * strengths[i] * alpha; + } + } + + function initialize() { + if (!nodes) + return; + var i, n = nodes.length; + strengths = new Array(n); + xz = new Array(n); + for (i = 0; i < n; ++i) { + strengths[i] = isNaN(xz[i] = +x(nodes[i], i, nodes)) ? 0 : +strength(nodes[i], i, nodes); + } + } + + force.initialize = function (_) { + nodes = _; + initialize(); + }; + + force.strength = function (_) { + return arguments.length ? (strength = typeof _ === "function" ? _ : constant$7(+_), initialize(), force) : strength; + }; + + force.x = function (_) { + return arguments.length ? (x = typeof _ === "function" ? _ : constant$7(+_), initialize(), force) : x; + }; + + return force; + } + + function y$2(y) { + var strength = constant$7(0.1), + nodes, + strengths, + yz; + + if (typeof y !== "function") + y = constant$7(y == null ? 0 : +y); + + function force(alpha) { + for (var i = 0, n = nodes.length, node; i < n; ++i) { + node = nodes[i], node.vy += (yz[i] - node.y) * strengths[i] * alpha; + } + } + + function initialize() { + if (!nodes) + return; + var i, n = nodes.length; + strengths = new Array(n); + yz = new Array(n); + for (i = 0; i < n; ++i) { + strengths[i] = isNaN(yz[i] = +y(nodes[i], i, nodes)) ? 0 : +strength(nodes[i], i, nodes); + } + } + + force.initialize = function (_) { + nodes = _; + initialize(); + }; + + force.strength = function (_) { + return arguments.length ? (strength = typeof _ === "function" ? _ : constant$7(+_), initialize(), force) : strength; + }; + + force.y = function (_) { + return arguments.length ? (y = typeof _ === "function" ? _ : constant$7(+_), initialize(), force) : y; + }; + + return force; + } + +// Computes the decimal coefficient and exponent of the specified number x with +// significant digits p, where x is positive and p is in [1, 21] or undefined. +// For example, formatDecimal(1.23) returns ["123", 0]. + function formatDecimal(x, p) { + if ((i = (x = p ? x.toExponential(p - 1) : x.toExponential()).indexOf("e")) < 0) + return null; // NaN, ±Infinity + var i, coefficient = x.slice(0, i); + + // The string returned by toExponential either has the form \d\.\d+e[-+]\d+ + // (e.g., 1.2e+3) or the form \de[-+]\d+ (e.g., 1e+3). + return [ + coefficient.length > 1 ? coefficient[0] + coefficient.slice(2) : coefficient, + +x.slice(i + 1) + ]; + } + + function exponent$1(x) { + return x = formatDecimal(Math.abs(x)), x ? x[1] : NaN; + } + + function formatGroup(grouping, thousands) { + return function (value, width) { + var i = value.length, + t = [], + j = 0, + g = grouping[0], + length = 0; + + while (i > 0 && g > 0) { + if (length + g + 1 > width) + g = Math.max(1, width - length); + t.push(value.substring(i -= g, i + g)); + if ((length += g + 1) > width) + break; + g = grouping[j = (j + 1) % grouping.length]; + } + + return t.reverse().join(thousands); + }; + } + + function formatNumerals(numerals) { + return function (value) { + return value.replace(/[0-9]/g, function (i) { + return numerals[+i]; + }); + }; + } + +// [[fill]align][sign][symbol][0][width][,][.precision][~][type] + var re = /^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i; + + function formatSpecifier(specifier) { + if (!(match = re.exec(specifier))) + throw new Error("invalid format: " + specifier); + var match; + return new FormatSpecifier({ + fill: match[1], + align: match[2], + sign: match[3], + symbol: match[4], + zero: match[5], + width: match[6], + comma: match[7], + precision: match[8] && match[8].slice(1), + trim: match[9], + type: match[10] + }); + } + + formatSpecifier.prototype = FormatSpecifier.prototype; // instanceof + + function FormatSpecifier(specifier) { + this.fill = specifier.fill === undefined ? " " : specifier.fill + ""; + this.align = specifier.align === undefined ? ">" : specifier.align + ""; + this.sign = specifier.sign === undefined ? "-" : specifier.sign + ""; + this.symbol = specifier.symbol === undefined ? "" : specifier.symbol + ""; + this.zero = !!specifier.zero; + this.width = specifier.width === undefined ? undefined : +specifier.width; + this.comma = !!specifier.comma; + this.precision = specifier.precision === undefined ? undefined : +specifier.precision; + this.trim = !!specifier.trim; + this.type = specifier.type === undefined ? "" : specifier.type + ""; + } + + FormatSpecifier.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; + }; + +// Trims insignificant zeros, e.g., replaces 1.2000k with 1.2k. + function formatTrim(s) { + out: for (var n = s.length, i = 1, i0 = -1, i1; i < n; ++i) { + switch (s[i]) { + case ".": + i0 = i1 = i; + break; + case "0": + if (i0 === 0) + i0 = i; + i1 = i; + break; + default: + if (!+s[i]) + break out; + if (i0 > 0) + i0 = 0; + break; + } + } + return i0 > 0 ? s.slice(0, i0) + s.slice(i1 + 1) : s; + } + + var prefixExponent; + + function formatPrefixAuto(x, p) { + var d = formatDecimal(x, p); + if (!d) + return x + ""; + var coefficient = d[0], + exponent = d[1], + i = exponent - (prefixExponent = Math.max(-8, Math.min(8, Math.floor(exponent / 3))) * 3) + 1, + n = coefficient.length; + return i === n ? coefficient + : i > n ? coefficient + new Array(i - n + 1).join("0") + : i > 0 ? coefficient.slice(0, i) + "." + coefficient.slice(i) + : "0." + new Array(1 - i).join("0") + formatDecimal(x, Math.max(0, p + i - 1))[0]; // less than 1y! + } + + function formatRounded(x, p) { + var d = formatDecimal(x, p); + if (!d) + return x + ""; + var coefficient = d[0], + exponent = d[1]; + return exponent < 0 ? "0." + new Array(-exponent).join("0") + coefficient + : coefficient.length > exponent + 1 ? coefficient.slice(0, exponent + 1) + "." + coefficient.slice(exponent + 1) + : coefficient + new Array(exponent - coefficient.length + 2).join("0"); + } + + var formatTypes = { + "%": function (x, p) { + return (x * 100).toFixed(p); + }, + "b": function (x) { + return Math.round(x).toString(2); + }, + "c": function (x) { + return x + ""; + }, + "d": function (x) { + return Math.round(x).toString(10); + }, + "e": function (x, p) { + return x.toExponential(p); + }, + "f": function (x, p) { + return x.toFixed(p); + }, + "g": function (x, p) { + return x.toPrecision(p); + }, + "o": function (x) { + return Math.round(x).toString(8); + }, + "p": function (x, p) { + return formatRounded(x * 100, p); + }, + "r": formatRounded, + "s": formatPrefixAuto, + "X": function (x) { + return Math.round(x).toString(16).toUpperCase(); + }, + "x": function (x) { + return Math.round(x).toString(16); + } + }; + + function identity$3(x) { + return x; + } + + var map$2 = Array.prototype.map, + prefixes = ["y", "z", "a", "f", "p", "n", "\xB5", "m", "", "k", "M", "G", "T", "P", "E", "Z", "Y"]; + + function formatLocale(locale) { + var group = locale.grouping === undefined || locale.thousands === undefined ? identity$3 : formatGroup(map$2.call(locale.grouping, Number), locale.thousands + ""), + currencyPrefix = locale.currency === undefined ? "" : locale.currency[0] + "", + currencySuffix = locale.currency === undefined ? "" : locale.currency[1] + "", + decimal = locale.decimal === undefined ? "." : locale.decimal + "", + numerals = locale.numerals === undefined ? identity$3 : formatNumerals(map$2.call(locale.numerals, String)), + percent = locale.percent === undefined ? "%" : locale.percent + "", + minus = locale.minus === undefined ? "-" : locale.minus + "", + nan = locale.nan === undefined ? "NaN" : locale.nan + ""; + + function newFormat(specifier) { + specifier = formatSpecifier(specifier); + + var fill = specifier.fill, + align = specifier.align, + sign = specifier.sign, + symbol = specifier.symbol, + zero = specifier.zero, + width = specifier.width, + comma = specifier.comma, + precision = specifier.precision, + trim = specifier.trim, + type = specifier.type; + + // The "n" type is an alias for ",g". + if (type === "n") + comma = true, type = "g"; + + // The "" type, and any invalid type, is an alias for ".12~g". + else if (!formatTypes[type]) + precision === undefined && (precision = 12), trim = true, type = "g"; + + // If zero fill is specified, padding goes after sign and before digits. + if (zero || (fill === "0" && align === "=")) + zero = true, fill = "0", align = "="; + + // Compute the prefix and suffix. + // For SI-prefix, the suffix is lazily computed. + var prefix = symbol === "$" ? currencyPrefix : symbol === "#" && /[boxX]/.test(type) ? "0" + type.toLowerCase() : "", + suffix = symbol === "$" ? currencySuffix : /[%p]/.test(type) ? percent : ""; + + // What format function should we use? + // Is this an integer type? + // Can this type generate exponential notation? + var formatType = formatTypes[type], + maybeSuffix = /[defgprs%]/.test(type); + + // Set the default precision if not specified, + // or clamp the specified precision to the supported range. + // For significant precision, it must be in [1, 21]. + // For fixed precision, it must be in [0, 20]. + precision = precision === undefined ? 6 + : /[gprs]/.test(type) ? Math.max(1, Math.min(21, precision)) + : Math.max(0, Math.min(20, precision)); + + function format(value) { + var valuePrefix = prefix, + valueSuffix = suffix, + i, n, c; + + if (type === "c") { + valueSuffix = formatType(value) + valueSuffix; + value = ""; + } else { + value = +value; + + // Determine the sign. -0 is not less than 0, but 1 / -0 is! + var valueNegative = value < 0 || 1 / value < 0; + + // Perform the initial formatting. + value = isNaN(value) ? nan : formatType(Math.abs(value), precision); + + // Trim insignificant zeros. + if (trim) + value = formatTrim(value); + + // If a negative value rounds to zero after formatting, and no explicit positive sign is requested, hide the sign. + if (valueNegative && +value === 0 && sign !== "+") + valueNegative = false; + + // Compute the prefix and suffix. + valuePrefix = (valueNegative ? (sign === "(" ? sign : minus) : sign === "-" || sign === "(" ? "" : sign) + valuePrefix; + valueSuffix = (type === "s" ? prefixes[8 + prefixExponent / 3] : "") + valueSuffix + (valueNegative && sign === "(" ? ")" : ""); + + // Break the formatted value into the integer “value” part that can be + // grouped, and fractional or exponential “suffix” part that is not. + if (maybeSuffix) { + i = -1, n = value.length; + while (++i < n) { + if (c = value.charCodeAt(i), 48 > c || c > 57) { + valueSuffix = (c === 46 ? decimal + value.slice(i + 1) : value.slice(i)) + valueSuffix; + value = value.slice(0, i); + break; + } + } + } + } + + // If the fill character is not "0", grouping is applied before padding. + if (comma && !zero) + value = group(value, Infinity); + + // Compute the padding. + var length = valuePrefix.length + value.length + valueSuffix.length, + padding = length < width ? new Array(width - length + 1).join(fill) : ""; + + // If the fill character is "0", grouping is applied after padding. + if (comma && zero) + value = group(padding + value, padding.length ? width - valueSuffix.length : Infinity), padding = ""; + + // Reconstruct the final output based on the desired alignment. + switch (align) { + case "<": + value = valuePrefix + value + valueSuffix + padding; + break; + case "=": + value = valuePrefix + padding + value + valueSuffix; + break; + case "^": + value = padding.slice(0, length = padding.length >> 1) + valuePrefix + value + valueSuffix + padding.slice(length); + break; + default: + value = padding + valuePrefix + value + valueSuffix; + break; + } + + return numerals(value); + } + + format.toString = function () { + return specifier + ""; + }; + + return format; + } + + function formatPrefix(specifier, value) { + var f = newFormat((specifier = formatSpecifier(specifier), specifier.type = "f", specifier)), + e = Math.max(-8, Math.min(8, Math.floor(exponent$1(value) / 3))) * 3, + k = Math.pow(10, -e), + prefix = prefixes[8 + e / 3]; + return function (value) { + return f(k * value) + prefix; + }; + } + + return { + format: newFormat, + formatPrefix: formatPrefix + }; + } + + var locale; + + defaultLocale({ + decimal: ".", + thousands: ",", + grouping: [3], + currency: ["$", ""], + minus: "-" + }); + + function defaultLocale(definition) { + locale = formatLocale(definition); + exports.format = locale.format; + exports.formatPrefix = locale.formatPrefix; + return locale; + } + + function precisionFixed(step) { + return Math.max(0, -exponent$1(Math.abs(step))); + } + + function precisionPrefix(step, value) { + return Math.max(0, Math.max(-8, Math.min(8, Math.floor(exponent$1(value) / 3))) * 3 - exponent$1(Math.abs(step))); + } + + function precisionRound(step, max) { + step = Math.abs(step), max = Math.abs(max) - step; + return Math.max(0, exponent$1(max) - exponent$1(step)) + 1; + } + +// Adds floating point numbers with twice the normal precision. +// Reference: J. R. Shewchuk, Adaptive Precision Floating-Point Arithmetic and +// Fast Robust Geometric Predicates, Discrete & Computational Geometry 18(3) +// 305–363 (1997). +// Code adapted from GeographicLib by Charles F. F. Karney, +// http://geographiclib.sourceforge.net/ + + function adder() { + return new Adder; + } + + function Adder() { + this.reset(); + } + + Adder.prototype = { + constructor: Adder, + reset: function () { + this.s = // rounded value + this.t = 0; // exact error + }, + add: function (y) { + add$1(temp, y, this.t); + add$1(this, temp.s, this.s); + if (this.s) + this.t += temp.t; + else + this.s = temp.t; + }, + valueOf: function () { + return this.s; + } + }; + + var temp = new Adder; + + function add$1(adder, a, b) { + var x = adder.s = a + b, + bv = x - a, + av = x - bv; + adder.t = (a - av) + (b - bv); + } + + var epsilon$2 = 1e-6; + var epsilon2$1 = 1e-12; + var pi$3 = Math.PI; + var halfPi$2 = pi$3 / 2; + var quarterPi = pi$3 / 4; + var tau$3 = pi$3 * 2; + + var degrees$1 = 180 / pi$3; + var radians = pi$3 / 180; + + var abs = Math.abs; + var atan = Math.atan; + var atan2 = Math.atan2; + var cos$1 = Math.cos; + var ceil = Math.ceil; + var exp = Math.exp; + var log = Math.log; + var pow = Math.pow; + var sin$1 = Math.sin; + var sign = Math.sign || function (x) { + return x > 0 ? 1 : x < 0 ? -1 : 0; + }; + var sqrt = Math.sqrt; + var tan = Math.tan; + + function acos(x) { + return x > 1 ? 0 : x < -1 ? pi$3 : Math.acos(x); + } + + function asin(x) { + return x > 1 ? halfPi$2 : x < -1 ? -halfPi$2 : Math.asin(x); + } + + function haversin(x) { + return (x = sin$1(x / 2)) * x; + } + + function noop$2() {} + + function streamGeometry(geometry, stream) { + if (geometry && streamGeometryType.hasOwnProperty(geometry.type)) { + streamGeometryType[geometry.type](geometry, stream); + } + } + + var streamObjectType = { + Feature: function (object, stream) { + streamGeometry(object.geometry, stream); + }, + FeatureCollection: function (object, stream) { + var features = object.features, i = -1, n = features.length; + while (++i < n) + streamGeometry(features[i].geometry, stream); + } + }; + + var streamGeometryType = { + Sphere: function (object, stream) { + stream.sphere(); + }, + Point: function (object, stream) { + object = object.coordinates; + stream.point(object[0], object[1], object[2]); + }, + MultiPoint: function (object, stream) { + var coordinates = object.coordinates, i = -1, n = coordinates.length; + while (++i < n) + object = coordinates[i], stream.point(object[0], object[1], object[2]); + }, + LineString: function (object, stream) { + streamLine(object.coordinates, stream, 0); + }, + MultiLineString: function (object, stream) { + var coordinates = object.coordinates, i = -1, n = coordinates.length; + while (++i < n) + streamLine(coordinates[i], stream, 0); + }, + Polygon: function (object, stream) { + streamPolygon(object.coordinates, stream); + }, + MultiPolygon: function (object, stream) { + var coordinates = object.coordinates, i = -1, n = coordinates.length; + while (++i < n) + streamPolygon(coordinates[i], stream); + }, + GeometryCollection: function (object, stream) { + var geometries = object.geometries, i = -1, n = geometries.length; + while (++i < n) + streamGeometry(geometries[i], stream); + } + }; + + function streamLine(coordinates, stream, closed) { + var i = -1, n = coordinates.length - closed, coordinate; + stream.lineStart(); + while (++i < n) + coordinate = coordinates[i], stream.point(coordinate[0], coordinate[1], coordinate[2]); + stream.lineEnd(); + } + + function streamPolygon(coordinates, stream) { + var i = -1, n = coordinates.length; + stream.polygonStart(); + while (++i < n) + streamLine(coordinates[i], stream, 1); + stream.polygonEnd(); + } + + function geoStream(object, stream) { + if (object && streamObjectType.hasOwnProperty(object.type)) { + streamObjectType[object.type](object, stream); + } else { + streamGeometry(object, stream); + } + } + + var areaRingSum = adder(); + + var areaSum = adder(), + lambda00, + phi00, + lambda0, + cosPhi0, + sinPhi0; + + var areaStream = { + point: noop$2, + lineStart: noop$2, + lineEnd: noop$2, + polygonStart: function () { + areaRingSum.reset(); + areaStream.lineStart = areaRingStart; + areaStream.lineEnd = areaRingEnd; + }, + polygonEnd: function () { + var areaRing = +areaRingSum; + areaSum.add(areaRing < 0 ? tau$3 + areaRing : areaRing); + this.lineStart = this.lineEnd = this.point = noop$2; + }, + sphere: function () { + areaSum.add(tau$3); + } + }; + + function areaRingStart() { + areaStream.point = areaPointFirst; + } + + function areaRingEnd() { + areaPoint(lambda00, phi00); + } + + function areaPointFirst(lambda, phi) { + areaStream.point = areaPoint; + lambda00 = lambda, phi00 = phi; + lambda *= radians, phi *= radians; + lambda0 = lambda, cosPhi0 = cos$1(phi = phi / 2 + quarterPi), sinPhi0 = sin$1(phi); + } + + function areaPoint(lambda, phi) { + lambda *= radians, phi *= radians; + phi = phi / 2 + quarterPi; // half the angular distance from south pole + + // Spherical excess E for a spherical triangle with vertices: south pole, + // previous point, current point. Uses a formula derived from Cagnoli’s + // theorem. See Todhunter, Spherical Trig. (1871), Sec. 103, Eq. (2). + var dLambda = lambda - lambda0, + sdLambda = dLambda >= 0 ? 1 : -1, + adLambda = sdLambda * dLambda, + cosPhi = cos$1(phi), + sinPhi = sin$1(phi), + k = sinPhi0 * sinPhi, + u = cosPhi0 * cosPhi + k * cos$1(adLambda), + v = k * sdLambda * sin$1(adLambda); + areaRingSum.add(atan2(v, u)); + + // Advance the previous points. + lambda0 = lambda, cosPhi0 = cosPhi, sinPhi0 = sinPhi; + } + + function area$1(object) { + areaSum.reset(); + geoStream(object, areaStream); + return areaSum * 2; + } + + function spherical(cartesian) { + return [atan2(cartesian[1], cartesian[0]), asin(cartesian[2])]; + } + + function cartesian(spherical) { + var lambda = spherical[0], phi = spherical[1], cosPhi = cos$1(phi); + return [cosPhi * cos$1(lambda), cosPhi * sin$1(lambda), sin$1(phi)]; + } + + function cartesianDot(a, b) { + return a[0] * b[0] + a[1] * b[1] + a[2] * b[2]; + } + + function cartesianCross(a, b) { + 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]]; + } + +// TODO return a + function cartesianAddInPlace(a, b) { + a[0] += b[0], a[1] += b[1], a[2] += b[2]; + } + + function cartesianScale(vector, k) { + return [vector[0] * k, vector[1] * k, vector[2] * k]; + } + +// TODO return d + function cartesianNormalizeInPlace(d) { + var l = sqrt(d[0] * d[0] + d[1] * d[1] + d[2] * d[2]); + d[0] /= l, d[1] /= l, d[2] /= l; + } + + var lambda0$1, phi0, lambda1, phi1, // bounds + lambda2, // previous lambda-coordinate + lambda00$1, phi00$1, // first point + p0, // previous 3D point + deltaSum = adder(), + ranges, + range; + + var boundsStream = { + point: boundsPoint, + lineStart: boundsLineStart, + lineEnd: boundsLineEnd, + polygonStart: function () { + boundsStream.point = boundsRingPoint; + boundsStream.lineStart = boundsRingStart; + boundsStream.lineEnd = boundsRingEnd; + deltaSum.reset(); + areaStream.polygonStart(); + }, + polygonEnd: function () { + areaStream.polygonEnd(); + boundsStream.point = boundsPoint; + boundsStream.lineStart = boundsLineStart; + boundsStream.lineEnd = boundsLineEnd; + if (areaRingSum < 0) + lambda0$1 = -(lambda1 = 180), phi0 = -(phi1 = 90); + else if (deltaSum > epsilon$2) + phi1 = 90; + else if (deltaSum < -epsilon$2) + phi0 = -90; + range[0] = lambda0$1, range[1] = lambda1; + }, + sphere: function () { + lambda0$1 = -(lambda1 = 180), phi0 = -(phi1 = 90); + } + }; + + function boundsPoint(lambda, phi) { + ranges.push(range = [lambda0$1 = lambda, lambda1 = lambda]); + if (phi < phi0) + phi0 = phi; + if (phi > phi1) + phi1 = phi; + } + + function linePoint(lambda, phi) { + var p = cartesian([lambda * radians, phi * radians]); + if (p0) { + var normal = cartesianCross(p0, p), + equatorial = [normal[1], -normal[0], 0], + inflection = cartesianCross(equatorial, normal); + cartesianNormalizeInPlace(inflection); + inflection = spherical(inflection); + var delta = lambda - lambda2, + sign = delta > 0 ? 1 : -1, + lambdai = inflection[0] * degrees$1 * sign, + phii, + antimeridian = abs(delta) > 180; + if (antimeridian ^ (sign * lambda2 < lambdai && lambdai < sign * lambda)) { + phii = inflection[1] * degrees$1; + if (phii > phi1) + phi1 = phii; + } else if (lambdai = (lambdai + 360) % 360 - 180, antimeridian ^ (sign * lambda2 < lambdai && lambdai < sign * lambda)) { + phii = -inflection[1] * degrees$1; + if (phii < phi0) + phi0 = phii; + } else { + if (phi < phi0) + phi0 = phi; + if (phi > phi1) + phi1 = phi; + } + if (antimeridian) { + if (lambda < lambda2) { + if (angle(lambda0$1, lambda) > angle(lambda0$1, lambda1)) + lambda1 = lambda; + } else { + if (angle(lambda, lambda1) > angle(lambda0$1, lambda1)) + lambda0$1 = lambda; + } + } else { + if (lambda1 >= lambda0$1) { + if (lambda < lambda0$1) + lambda0$1 = lambda; + if (lambda > lambda1) + lambda1 = lambda; + } else { + if (lambda > lambda2) { + if (angle(lambda0$1, lambda) > angle(lambda0$1, lambda1)) + lambda1 = lambda; + } else { + if (angle(lambda, lambda1) > angle(lambda0$1, lambda1)) + lambda0$1 = lambda; + } + } + } + } else { + ranges.push(range = [lambda0$1 = lambda, lambda1 = lambda]); + } + if (phi < phi0) + phi0 = phi; + if (phi > phi1) + phi1 = phi; + p0 = p, lambda2 = lambda; + } + + function boundsLineStart() { + boundsStream.point = linePoint; + } + + function boundsLineEnd() { + range[0] = lambda0$1, range[1] = lambda1; + boundsStream.point = boundsPoint; + p0 = null; + } + + function boundsRingPoint(lambda, phi) { + if (p0) { + var delta = lambda - lambda2; + deltaSum.add(abs(delta) > 180 ? delta + (delta > 0 ? 360 : -360) : delta); + } else { + lambda00$1 = lambda, phi00$1 = phi; + } + areaStream.point(lambda, phi); + linePoint(lambda, phi); + } + + function boundsRingStart() { + areaStream.lineStart(); + } + + function boundsRingEnd() { + boundsRingPoint(lambda00$1, phi00$1); + areaStream.lineEnd(); + if (abs(deltaSum) > epsilon$2) + lambda0$1 = -(lambda1 = 180); + range[0] = lambda0$1, range[1] = lambda1; + p0 = null; + } + +// Finds the left-right distance between two longitudes. +// This is almost the same as (lambda1 - lambda0 + 360°) % 360°, except that we want +// the distance between ±180° to be 360°. + function angle(lambda0, lambda1) { + return (lambda1 -= lambda0) < 0 ? lambda1 + 360 : lambda1; + } + + function rangeCompare(a, b) { + return a[0] - b[0]; + } + + function rangeContains(range, x) { + return range[0] <= range[1] ? range[0] <= x && x <= range[1] : x < range[0] || range[1] < x; + } + + function bounds(feature) { + var i, n, a, b, merged, deltaMax, delta; + + phi1 = lambda1 = -(lambda0$1 = phi0 = Infinity); + ranges = []; + geoStream(feature, boundsStream); + + // First, sort ranges by their minimum longitudes. + if (n = ranges.length) { + ranges.sort(rangeCompare); + + // Then, merge any ranges that overlap. + for (i = 1, a = ranges[0], merged = [a]; i < n; ++i) { + b = ranges[i]; + if (rangeContains(a, b[0]) || rangeContains(a, b[1])) { + if (angle(a[0], b[1]) > angle(a[0], a[1])) + a[1] = b[1]; + if (angle(b[0], a[1]) > angle(a[0], a[1])) + a[0] = b[0]; + } else { + merged.push(a = b); + } + } + + // Finally, find the largest gap between the merged ranges. + // The final bounding box will be the inverse of this gap. + for (deltaMax = -Infinity, n = merged.length - 1, i = 0, a = merged[n]; i <= n; a = b, ++i) { + b = merged[i]; + if ((delta = angle(a[1], b[0])) > deltaMax) + deltaMax = delta, lambda0$1 = b[0], lambda1 = a[1]; + } + } + + ranges = range = null; + + return lambda0$1 === Infinity || phi0 === Infinity + ? [[NaN, NaN], [NaN, NaN]] + : [[lambda0$1, phi0], [lambda1, phi1]]; + } + + var W0, W1, + X0, Y0, Z0, + X1, Y1, Z1, + X2, Y2, Z2, + lambda00$2, phi00$2, // first point + x0, y0, z0; // previous point + + var centroidStream = { + sphere: noop$2, + point: centroidPoint, + lineStart: centroidLineStart, + lineEnd: centroidLineEnd, + polygonStart: function () { + centroidStream.lineStart = centroidRingStart; + centroidStream.lineEnd = centroidRingEnd; + }, + polygonEnd: function () { + centroidStream.lineStart = centroidLineStart; + centroidStream.lineEnd = centroidLineEnd; + } + }; + +// Arithmetic mean of Cartesian vectors. + function centroidPoint(lambda, phi) { + lambda *= radians, phi *= radians; + var cosPhi = cos$1(phi); + centroidPointCartesian(cosPhi * cos$1(lambda), cosPhi * sin$1(lambda), sin$1(phi)); + } + + function centroidPointCartesian(x, y, z) { + ++W0; + X0 += (x - X0) / W0; + Y0 += (y - Y0) / W0; + Z0 += (z - Z0) / W0; + } + + function centroidLineStart() { + centroidStream.point = centroidLinePointFirst; + } + + function centroidLinePointFirst(lambda, phi) { + lambda *= radians, phi *= radians; + var cosPhi = cos$1(phi); + x0 = cosPhi * cos$1(lambda); + y0 = cosPhi * sin$1(lambda); + z0 = sin$1(phi); + centroidStream.point = centroidLinePoint; + centroidPointCartesian(x0, y0, z0); + } + + function centroidLinePoint(lambda, phi) { + lambda *= radians, phi *= radians; + var cosPhi = cos$1(phi), + x = cosPhi * cos$1(lambda), + y = cosPhi * sin$1(lambda), + z = sin$1(phi), + 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); + W1 += w; + X1 += w * (x0 + (x0 = x)); + Y1 += w * (y0 + (y0 = y)); + Z1 += w * (z0 + (z0 = z)); + centroidPointCartesian(x0, y0, z0); + } + + function centroidLineEnd() { + centroidStream.point = centroidPoint; + } + +// See J. E. Brock, The Inertia Tensor for a Spherical Triangle, +// J. Applied Mechanics 42, 239 (1975). + function centroidRingStart() { + centroidStream.point = centroidRingPointFirst; + } + + function centroidRingEnd() { + centroidRingPoint(lambda00$2, phi00$2); + centroidStream.point = centroidPoint; + } + + function centroidRingPointFirst(lambda, phi) { + lambda00$2 = lambda, phi00$2 = phi; + lambda *= radians, phi *= radians; + centroidStream.point = centroidRingPoint; + var cosPhi = cos$1(phi); + x0 = cosPhi * cos$1(lambda); + y0 = cosPhi * sin$1(lambda); + z0 = sin$1(phi); + centroidPointCartesian(x0, y0, z0); + } + + function centroidRingPoint(lambda, phi) { + lambda *= radians, phi *= radians; + var cosPhi = cos$1(phi), + x = cosPhi * cos$1(lambda), + y = cosPhi * sin$1(lambda), + z = sin$1(phi), + cx = y0 * z - z0 * y, + cy = z0 * x - x0 * z, + cz = x0 * y - y0 * x, + m = sqrt(cx * cx + cy * cy + cz * cz), + w = asin(m), // line weight = angle + v = m && -w / m; // area weight multiplier + X2 += v * cx; + Y2 += v * cy; + Z2 += v * cz; + W1 += w; + X1 += w * (x0 + (x0 = x)); + Y1 += w * (y0 + (y0 = y)); + Z1 += w * (z0 + (z0 = z)); + centroidPointCartesian(x0, y0, z0); + } + + function centroid(object) { + W0 = W1 = + X0 = Y0 = Z0 = + X1 = Y1 = Z1 = + X2 = Y2 = Z2 = 0; + geoStream(object, centroidStream); + + var x = X2, + y = Y2, + z = Z2, + m = x * x + y * y + z * z; + + // If the area-weighted ccentroid is undefined, fall back to length-weighted ccentroid. + if (m < epsilon2$1) { + x = X1, y = Y1, z = Z1; + // If the feature has zero length, fall back to arithmetic mean of point vectors. + if (W1 < epsilon$2) + x = X0, y = Y0, z = Z0; + m = x * x + y * y + z * z; + // If the feature still has an undefined ccentroid, then return. + if (m < epsilon2$1) + return [NaN, NaN]; + } + + return [atan2(y, x) * degrees$1, asin(z / sqrt(m)) * degrees$1]; + } + + function constant$8(x) { + return function () { + return x; + }; + } + + function compose(a, b) { + + function compose(x, y) { + return x = a(x, y), b(x[0], x[1]); + } + + if (a.invert && b.invert) + compose.invert = function (x, y) { + return x = b.invert(x, y), x && a.invert(x[0], x[1]); + }; + + return compose; + } + + function rotationIdentity(lambda, phi) { + return [abs(lambda) > pi$3 ? lambda + Math.round(-lambda / tau$3) * tau$3 : lambda, phi]; + } + + rotationIdentity.invert = rotationIdentity; + + function rotateRadians(deltaLambda, deltaPhi, deltaGamma) { + return (deltaLambda %= tau$3) ? (deltaPhi || deltaGamma ? compose(rotationLambda(deltaLambda), rotationPhiGamma(deltaPhi, deltaGamma)) + : rotationLambda(deltaLambda)) + : (deltaPhi || deltaGamma ? rotationPhiGamma(deltaPhi, deltaGamma) + : rotationIdentity); + } + + function forwardRotationLambda(deltaLambda) { + return function (lambda, phi) { + return lambda += deltaLambda, [lambda > pi$3 ? lambda - tau$3 : lambda < -pi$3 ? lambda + tau$3 : lambda, phi]; + }; + } + + function rotationLambda(deltaLambda) { + var rotation = forwardRotationLambda(deltaLambda); + rotation.invert = forwardRotationLambda(-deltaLambda); + return rotation; + } + + function rotationPhiGamma(deltaPhi, deltaGamma) { + var cosDeltaPhi = cos$1(deltaPhi), + sinDeltaPhi = sin$1(deltaPhi), + cosDeltaGamma = cos$1(deltaGamma), + sinDeltaGamma = sin$1(deltaGamma); + + function rotation(lambda, phi) { + var cosPhi = cos$1(phi), + x = cos$1(lambda) * cosPhi, + y = sin$1(lambda) * cosPhi, + z = sin$1(phi), + k = z * cosDeltaPhi + x * sinDeltaPhi; + return [ + atan2(y * cosDeltaGamma - k * sinDeltaGamma, x * cosDeltaPhi - z * sinDeltaPhi), + asin(k * cosDeltaGamma + y * sinDeltaGamma) + ]; + } + + rotation.invert = function (lambda, phi) { + var cosPhi = cos$1(phi), + x = cos$1(lambda) * cosPhi, + y = sin$1(lambda) * cosPhi, + z = sin$1(phi), + k = z * cosDeltaGamma - y * sinDeltaGamma; + return [ + atan2(y * cosDeltaGamma + z * sinDeltaGamma, x * cosDeltaPhi + k * sinDeltaPhi), + asin(k * cosDeltaPhi - x * sinDeltaPhi) + ]; + }; + + return rotation; + } + + function rotation(rotate) { + rotate = rotateRadians(rotate[0] * radians, rotate[1] * radians, rotate.length > 2 ? rotate[2] * radians : 0); + + function forward(coordinates) { + coordinates = rotate(coordinates[0] * radians, coordinates[1] * radians); + return coordinates[0] *= degrees$1, coordinates[1] *= degrees$1, coordinates; + } + + forward.invert = function (coordinates) { + coordinates = rotate.invert(coordinates[0] * radians, coordinates[1] * radians); + return coordinates[0] *= degrees$1, coordinates[1] *= degrees$1, coordinates; + }; + + return forward; + } + +// Generates a circle centered at [0°, 0°], with a given radius and precision. + function circleStream(stream, radius, delta, direction, t0, t1) { + if (!delta) + return; + var cosRadius = cos$1(radius), + sinRadius = sin$1(radius), + step = direction * delta; + if (t0 == null) { + t0 = radius + direction * tau$3; + t1 = radius - step / 2; + } else { + t0 = circleRadius(cosRadius, t0); + t1 = circleRadius(cosRadius, t1); + if (direction > 0 ? t0 < t1 : t0 > t1) + t0 += direction * tau$3; + } + for (var point, t = t0; direction > 0 ? t > t1 : t < t1; t -= step) { + point = spherical([cosRadius, -sinRadius * cos$1(t), -sinRadius * sin$1(t)]); + stream.point(point[0], point[1]); + } + } + +// Returns the signed angle of a cartesian point relative to [cosRadius, 0, 0]. + function circleRadius(cosRadius, point) { + point = cartesian(point), point[0] -= cosRadius; + cartesianNormalizeInPlace(point); + var radius = acos(-point[1]); + return ((-point[2] < 0 ? -radius : radius) + tau$3 - epsilon$2) % tau$3; + } + + function circle() { + var center = constant$8([0, 0]), + radius = constant$8(90), + precision = constant$8(6), + ring, + rotate, + stream = {point: point}; + + function point(x, y) { + ring.push(x = rotate(x, y)); + x[0] *= degrees$1, x[1] *= degrees$1; + } + + function circle() { + var c = center.apply(this, arguments), + r = radius.apply(this, arguments) * radians, + p = precision.apply(this, arguments) * radians; + ring = []; + rotate = rotateRadians(-c[0] * radians, -c[1] * radians, 0).invert; + circleStream(stream, r, p, 1); + c = {type: "Polygon", coordinates: [ring]}; + ring = rotate = null; + return c; + } + + circle.center = function (_) { + return arguments.length ? (center = typeof _ === "function" ? _ : constant$8([+_[0], +_[1]]), circle) : center; + }; + + circle.radius = function (_) { + return arguments.length ? (radius = typeof _ === "function" ? _ : constant$8(+_), circle) : radius; + }; + + circle.precision = function (_) { + return arguments.length ? (precision = typeof _ === "function" ? _ : constant$8(+_), circle) : precision; + }; + + return circle; + } + + function clipBuffer() { + var lines = [], + line; + return { + point: function (x, y) { + line.push([x, y]); + }, + lineStart: function () { + lines.push(line = []); + }, + lineEnd: noop$2, + rejoin: function () { + if (lines.length > 1) + lines.push(lines.pop().concat(lines.shift())); + }, + result: function () { + var result = lines; + lines = []; + line = null; + return result; + } + }; + } + + function pointEqual(a, b) { + return abs(a[0] - b[0]) < epsilon$2 && abs(a[1] - b[1]) < epsilon$2; + } + + function Intersection(point, points, other, entry) { + this.x = point; + this.z = points; + this.o = other; // another intersection + this.e = entry; // is an entry? + this.v = false; // visited + this.n = this.p = null; // next & previous + } + +// A generalized polygon clipping algorithm: given a polygon that has been cut +// into its visible line segments, and rejoins the segments by interpolating +// along the clip edge. + function clipRejoin(segments, compareIntersection, startInside, interpolate, stream) { + var subject = [], + clip = [], + i, + n; + + segments.forEach(function (segment) { + if ((n = segment.length - 1) <= 0) + return; + var n, p0 = segment[0], p1 = segment[n], x; + + // If the first and last points of a segment are coincident, then treat as a + // closed ring. TODO if all rings are closed, then the winding order of the + // exterior ring should be checked. + if (pointEqual(p0, p1)) { + stream.lineStart(); + for (i = 0; i < n; ++i) + stream.point((p0 = segment[i])[0], p0[1]); + stream.lineEnd(); + return; + } + + subject.push(x = new Intersection(p0, segment, null, true)); + clip.push(x.o = new Intersection(p0, null, x, false)); + subject.push(x = new Intersection(p1, segment, null, false)); + clip.push(x.o = new Intersection(p1, null, x, true)); + }); + + if (!subject.length) + return; + + clip.sort(compareIntersection); + link$1(subject); + link$1(clip); + + for (i = 0, n = clip.length; i < n; ++i) { + clip[i].e = startInside = !startInside; + } + + var start = subject[0], + points, + point; + + while (1) { + // Find first unvisited intersection. + var current = start, + isSubject = true; + while (current.v) + if ((current = current.n) === start) + return; + points = current.z; + stream.lineStart(); + do { + current.v = current.o.v = true; + if (current.e) { + if (isSubject) { + for (i = 0, n = points.length; i < n; ++i) + stream.point((point = points[i])[0], point[1]); + } else { + interpolate(current.x, current.n.x, 1, stream); + } + current = current.n; + } else { + if (isSubject) { + points = current.p.z; + for (i = points.length - 1; i >= 0; --i) + stream.point((point = points[i])[0], point[1]); + } else { + interpolate(current.x, current.p.x, -1, stream); + } + current = current.p; + } + current = current.o; + points = current.z; + isSubject = !isSubject; + } while (!current.v); + stream.lineEnd(); + } + } + + function link$1(array) { + if (!(n = array.length)) + return; + var n, + i = 0, + a = array[0], + b; + while (++i < n) { + a.n = b = array[i]; + b.p = a; + a = b; + } + a.n = b = array[0]; + b.p = a; + } + + var sum$1 = adder(); + + function longitude(point) { + if (abs(point[0]) <= pi$3) + return point[0]; + else + return sign(point[0]) * ((abs(point[0]) + pi$3) % tau$3 - pi$3); + } + + function polygonContains(polygon, point) { + var lambda = longitude(point), + phi = point[1], + sinPhi = sin$1(phi), + normal = [sin$1(lambda), -cos$1(lambda), 0], + angle = 0, + winding = 0; + + sum$1.reset(); + + if (sinPhi === 1) + phi = halfPi$2 + epsilon$2; + else if (sinPhi === -1) + phi = -halfPi$2 - epsilon$2; + + for (var i = 0, n = polygon.length; i < n; ++i) { + if (!(m = (ring = polygon[i]).length)) + continue; + var ring, + m, + point0 = ring[m - 1], + lambda0 = longitude(point0), + phi0 = point0[1] / 2 + quarterPi, + sinPhi0 = sin$1(phi0), + cosPhi0 = cos$1(phi0); + + for (var j = 0; j < m; ++j, lambda0 = lambda1, sinPhi0 = sinPhi1, cosPhi0 = cosPhi1, point0 = point1) { + var point1 = ring[j], + lambda1 = longitude(point1), + phi1 = point1[1] / 2 + quarterPi, + sinPhi1 = sin$1(phi1), + cosPhi1 = cos$1(phi1), + delta = lambda1 - lambda0, + sign = delta >= 0 ? 1 : -1, + absDelta = sign * delta, + antimeridian = absDelta > pi$3, + k = sinPhi0 * sinPhi1; + + sum$1.add(atan2(k * sign * sin$1(absDelta), cosPhi0 * cosPhi1 + k * cos$1(absDelta))); + angle += antimeridian ? delta + sign * tau$3 : delta; + + // Are the longitudes either side of the point’s meridian (lambda), + // and are the latitudes smaller than the parallel (phi)? + if (antimeridian ^ lambda0 >= lambda ^ lambda1 >= lambda) { + var arc = cartesianCross(cartesian(point0), cartesian(point1)); + cartesianNormalizeInPlace(arc); + var intersection = cartesianCross(normal, arc); + cartesianNormalizeInPlace(intersection); + var phiArc = (antimeridian ^ delta >= 0 ? -1 : 1) * asin(intersection[2]); + if (phi > phiArc || phi === phiArc && (arc[0] || arc[1])) { + winding += antimeridian ^ delta >= 0 ? 1 : -1; + } + } + } + } + + // First, determine whether the South pole is inside or outside: + // + // It is inside if: + // * the polygon winds around it in a clockwise direction. + // * the polygon does not (cumulatively) wind around it, but has a negative + // (counter-clockwise) area. + // + // Second, count the (signed) number of times a segment crosses a lambda + // from the point to the South pole. If it is zero, then the point is the + // same side as the South pole. + + return (angle < -epsilon$2 || angle < epsilon$2 && sum$1 < -epsilon$2) ^ (winding & 1); + } + + function clip(pointVisible, clipLine, interpolate, start) { + return function (sink) { + var line = clipLine(sink), + ringBuffer = clipBuffer(), + ringSink = clipLine(ringBuffer), + polygonStarted = false, + polygon, + segments, + ring; + + var clip = { + point: point, + lineStart: lineStart, + lineEnd: lineEnd, + polygonStart: function () { + clip.point = pointRing; + clip.lineStart = ringStart; + clip.lineEnd = ringEnd; + segments = []; + polygon = []; + }, + polygonEnd: function () { + clip.point = point; + clip.lineStart = lineStart; + clip.lineEnd = lineEnd; + segments = merge(segments); + var startInside = polygonContains(polygon, start); + if (segments.length) { + if (!polygonStarted) + sink.polygonStart(), polygonStarted = true; + clipRejoin(segments, compareIntersection, startInside, interpolate, sink); + } else if (startInside) { + if (!polygonStarted) + sink.polygonStart(), polygonStarted = true; + sink.lineStart(); + interpolate(null, null, 1, sink); + sink.lineEnd(); + } + if (polygonStarted) + sink.polygonEnd(), polygonStarted = false; + segments = polygon = null; + }, + sphere: function () { + sink.polygonStart(); + sink.lineStart(); + interpolate(null, null, 1, sink); + sink.lineEnd(); + sink.polygonEnd(); + } + }; + + function point(lambda, phi) { + if (pointVisible(lambda, phi)) + sink.point(lambda, phi); + } + + function pointLine(lambda, phi) { + line.point(lambda, phi); + } + + function lineStart() { + clip.point = pointLine; + line.lineStart(); + } + + function lineEnd() { + clip.point = point; + line.lineEnd(); + } + + function pointRing(lambda, phi) { + ring.push([lambda, phi]); + ringSink.point(lambda, phi); + } + + function ringStart() { + ringSink.lineStart(); + ring = []; + } + + function ringEnd() { + pointRing(ring[0][0], ring[0][1]); + ringSink.lineEnd(); + + var clean = ringSink.clean(), + ringSegments = ringBuffer.result(), + i, n = ringSegments.length, m, + segment, + point; + + ring.pop(); + polygon.push(ring); + ring = null; + + if (!n) + return; + + // No intersections. + if (clean & 1) { + segment = ringSegments[0]; + if ((m = segment.length - 1) > 0) { + if (!polygonStarted) + sink.polygonStart(), polygonStarted = true; + sink.lineStart(); + for (i = 0; i < m; ++i) + sink.point((point = segment[i])[0], point[1]); + sink.lineEnd(); + } + return; + } + + // Rejoin connected segments. + // TODO reuse ringBuffer.rejoin()? + if (n > 1 && clean & 2) + ringSegments.push(ringSegments.pop().concat(ringSegments.shift())); + + segments.push(ringSegments.filter(validSegment)); + } + + return clip; + }; + } + + function validSegment(segment) { + return segment.length > 1; + } + +// Intersections are sorted along the clip edge. For both antimeridian cutting +// and circle clipping, the same comparison is used. + function compareIntersection(a, b) { + return ((a = a.x)[0] < 0 ? a[1] - halfPi$2 - epsilon$2 : halfPi$2 - a[1]) + - ((b = b.x)[0] < 0 ? b[1] - halfPi$2 - epsilon$2 : halfPi$2 - b[1]); + } + + var clipAntimeridian = clip( + function () { + return true; + }, + clipAntimeridianLine, + clipAntimeridianInterpolate, + [-pi$3, -halfPi$2] + ); + +// Takes a line and cuts into visible segments. Return values: 0 - there were +// intersections or the line was empty; 1 - no intersections; 2 - there were +// intersections, and the first and last segments should be rejoined. + function clipAntimeridianLine(stream) { + var lambda0 = NaN, + phi0 = NaN, + sign0 = NaN, + clean; // no intersections + + return { + lineStart: function () { + stream.lineStart(); + clean = 1; + }, + point: function (lambda1, phi1) { + var sign1 = lambda1 > 0 ? pi$3 : -pi$3, + delta = abs(lambda1 - lambda0); + if (abs(delta - pi$3) < epsilon$2) { // line crosses a pole + stream.point(lambda0, phi0 = (phi0 + phi1) / 2 > 0 ? halfPi$2 : -halfPi$2); + stream.point(sign0, phi0); + stream.lineEnd(); + stream.lineStart(); + stream.point(sign1, phi0); + stream.point(lambda1, phi0); + clean = 0; + } else if (sign0 !== sign1 && delta >= pi$3) { // line crosses antimeridian + if (abs(lambda0 - sign0) < epsilon$2) + lambda0 -= sign0 * epsilon$2; // handle degeneracies + if (abs(lambda1 - sign1) < epsilon$2) + lambda1 -= sign1 * epsilon$2; + phi0 = clipAntimeridianIntersect(lambda0, phi0, lambda1, phi1); + stream.point(sign0, phi0); + stream.lineEnd(); + stream.lineStart(); + stream.point(sign1, phi0); + clean = 0; + } + stream.point(lambda0 = lambda1, phi0 = phi1); + sign0 = sign1; + }, + lineEnd: function () { + stream.lineEnd(); + lambda0 = phi0 = NaN; + }, + clean: function () { + return 2 - clean; // if intersections, rejoin first and last segments + } + }; + } + + function clipAntimeridianIntersect(lambda0, phi0, lambda1, phi1) { + var cosPhi0, + cosPhi1, + sinLambda0Lambda1 = sin$1(lambda0 - lambda1); + return abs(sinLambda0Lambda1) > epsilon$2 + ? atan((sin$1(phi0) * (cosPhi1 = cos$1(phi1)) * sin$1(lambda1) + - sin$1(phi1) * (cosPhi0 = cos$1(phi0)) * sin$1(lambda0)) + / (cosPhi0 * cosPhi1 * sinLambda0Lambda1)) + : (phi0 + phi1) / 2; + } + + function clipAntimeridianInterpolate(from, to, direction, stream) { + var phi; + if (from == null) { + phi = direction * halfPi$2; + stream.point(-pi$3, phi); + stream.point(0, phi); + stream.point(pi$3, phi); + stream.point(pi$3, 0); + stream.point(pi$3, -phi); + stream.point(0, -phi); + stream.point(-pi$3, -phi); + stream.point(-pi$3, 0); + stream.point(-pi$3, phi); + } else if (abs(from[0] - to[0]) > epsilon$2) { + var lambda = from[0] < to[0] ? pi$3 : -pi$3; + phi = direction * lambda / 2; + stream.point(-lambda, phi); + stream.point(0, phi); + stream.point(lambda, phi); + } else { + stream.point(to[0], to[1]); + } + } + + function clipCircle(radius) { + var cr = cos$1(radius), + delta = 6 * radians, + smallRadius = cr > 0, + notHemisphere = abs(cr) > epsilon$2; // TODO optimise for this common case + + function interpolate(from, to, direction, stream) { + circleStream(stream, radius, delta, direction, from, to); + } + + function visible(lambda, phi) { + return cos$1(lambda) * cos$1(phi) > cr; + } + + // Takes a line and cuts into visible segments. Return values used for polygon + // clipping: 0 - there were intersections or the line was empty; 1 - no + // intersections 2 - there were intersections, and the first and last segments + // should be rejoined. + function clipLine(stream) { + var point0, // previous point + c0, // code for previous point + v0, // visibility of previous point + v00, // visibility of first point + clean; // no intersections + return { + lineStart: function () { + v00 = v0 = false; + clean = 1; + }, + point: function (lambda, phi) { + var point1 = [lambda, phi], + point2, + v = visible(lambda, phi), + c = smallRadius + ? v ? 0 : code(lambda, phi) + : v ? code(lambda + (lambda < 0 ? pi$3 : -pi$3), phi) : 0; + if (!point0 && (v00 = v0 = v)) + stream.lineStart(); + // Handle degeneracies. + // TODO ignore if not clipping polygons. + if (v !== v0) { + point2 = intersect(point0, point1); + if (!point2 || pointEqual(point0, point2) || pointEqual(point1, point2)) { + point1[0] += epsilon$2; + point1[1] += epsilon$2; + v = visible(point1[0], point1[1]); + } + } + if (v !== v0) { + clean = 0; + if (v) { + // outside going in + stream.lineStart(); + point2 = intersect(point1, point0); + stream.point(point2[0], point2[1]); + } else { + // inside going out + point2 = intersect(point0, point1); + stream.point(point2[0], point2[1]); + stream.lineEnd(); + } + point0 = point2; + } else if (notHemisphere && point0 && smallRadius ^ v) { + var t; + // If the codes for two points are different, or are both zero, + // and there this segment intersects with the small circle. + if (!(c & c0) && (t = intersect(point1, point0, true))) { + clean = 0; + if (smallRadius) { + stream.lineStart(); + stream.point(t[0][0], t[0][1]); + stream.point(t[1][0], t[1][1]); + stream.lineEnd(); + } else { + stream.point(t[1][0], t[1][1]); + stream.lineEnd(); + stream.lineStart(); + stream.point(t[0][0], t[0][1]); + } + } + } + if (v && (!point0 || !pointEqual(point0, point1))) { + stream.point(point1[0], point1[1]); + } + point0 = point1, v0 = v, c0 = c; + }, + lineEnd: function () { + if (v0) + stream.lineEnd(); + point0 = null; + }, + // Rejoin first and last segments if there were intersections and the first + // and last points were visible. + clean: function () { + return clean | ((v00 && v0) << 1); + } + }; + } + + // Intersects the great circle between a and b with the clip circle. + function intersect(a, b, two) { + var pa = cartesian(a), + pb = cartesian(b); + + // We have two planes, n1.p = d1 and n2.p = d2. + // Find intersection line p(t) = c1 n1 + c2 n2 + t (n1 ⨯ n2). + var n1 = [1, 0, 0], // normal + n2 = cartesianCross(pa, pb), + n2n2 = cartesianDot(n2, n2), + n1n2 = n2[0], // cartesianDot(n1, n2), + determinant = n2n2 - n1n2 * n1n2; + + // Two polar points. + if (!determinant) + return !two && a; + + var c1 = cr * n2n2 / determinant, + c2 = -cr * n1n2 / determinant, + n1xn2 = cartesianCross(n1, n2), + A = cartesianScale(n1, c1), + B = cartesianScale(n2, c2); + cartesianAddInPlace(A, B); + + // Solve |p(t)|^2 = 1. + var u = n1xn2, + w = cartesianDot(A, u), + uu = cartesianDot(u, u), + t2 = w * w - uu * (cartesianDot(A, A) - 1); + + if (t2 < 0) + return; + + var t = sqrt(t2), + q = cartesianScale(u, (-w - t) / uu); + cartesianAddInPlace(q, A); + q = spherical(q); + + if (!two) + return q; + + // Two intersection points. + var lambda0 = a[0], + lambda1 = b[0], + phi0 = a[1], + phi1 = b[1], + z; + + if (lambda1 < lambda0) + z = lambda0, lambda0 = lambda1, lambda1 = z; + + var delta = lambda1 - lambda0, + polar = abs(delta - pi$3) < epsilon$2, + meridian = polar || delta < epsilon$2; + + if (!polar && phi1 < phi0) + z = phi0, phi0 = phi1, phi1 = z; + + // Check that the first point is between a and b. + if (meridian + ? polar + ? phi0 + phi1 > 0 ^ q[1] < (abs(q[0] - lambda0) < epsilon$2 ? phi0 : phi1) + : phi0 <= q[1] && q[1] <= phi1 + : delta > pi$3 ^ (lambda0 <= q[0] && q[0] <= lambda1)) { + var q1 = cartesianScale(u, (-w + t) / uu); + cartesianAddInPlace(q1, A); + return [q, spherical(q1)]; + } + } + + // Generates a 4-bit vector representing the location of a point relative to + // the small circle's bounding box. + function code(lambda, phi) { + var r = smallRadius ? radius : pi$3 - radius, + code = 0; + if (lambda < -r) + code |= 1; // left + else if (lambda > r) + code |= 2; // right + if (phi < -r) + code |= 4; // below + else if (phi > r) + code |= 8; // above + return code; + } + + return clip(visible, clipLine, interpolate, smallRadius ? [0, -radius] : [-pi$3, radius - pi$3]); + } + + function clipLine(a, b, x0, y0, x1, y1) { + var ax = a[0], + ay = a[1], + bx = b[0], + by = b[1], + t0 = 0, + t1 = 1, + dx = bx - ax, + dy = by - ay, + r; + + r = x0 - ax; + if (!dx && r > 0) + return; + r /= dx; + if (dx < 0) { + if (r < t0) + return; + if (r < t1) + t1 = r; + } else if (dx > 0) { + if (r > t1) + return; + if (r > t0) + t0 = r; + } + + r = x1 - ax; + if (!dx && r < 0) + return; + r /= dx; + if (dx < 0) { + if (r > t1) + return; + if (r > t0) + t0 = r; + } else if (dx > 0) { + if (r < t0) + return; + if (r < t1) + t1 = r; + } + + r = y0 - ay; + if (!dy && r > 0) + return; + r /= dy; + if (dy < 0) { + if (r < t0) + return; + if (r < t1) + t1 = r; + } else if (dy > 0) { + if (r > t1) + return; + if (r > t0) + t0 = r; + } + + r = y1 - ay; + if (!dy && r < 0) + return; + r /= dy; + if (dy < 0) { + if (r > t1) + return; + if (r > t0) + t0 = r; + } else if (dy > 0) { + if (r < t0) + return; + if (r < t1) + t1 = r; + } + + if (t0 > 0) + a[0] = ax + t0 * dx, a[1] = ay + t0 * dy; + if (t1 < 1) + b[0] = ax + t1 * dx, b[1] = ay + t1 * dy; + return true; + } + + var clipMax = 1e9, clipMin = -clipMax; + +// TODO Use d3-polygon’s polygonContains here for the ring check? +// TODO Eliminate duplicate buffering in clipBuffer and polygon.push? + + function clipRectangle(x0, y0, x1, y1) { + + function visible(x, y) { + return x0 <= x && x <= x1 && y0 <= y && y <= y1; + } + + function interpolate(from, to, direction, stream) { + var a = 0, a1 = 0; + if (from == null + || (a = corner(from, direction)) !== (a1 = corner(to, direction)) + || comparePoint(from, to) < 0 ^ direction > 0) { + do + stream.point(a === 0 || a === 3 ? x0 : x1, a > 1 ? y1 : y0); + while ((a = (a + direction + 4) % 4) !== a1); + } else { + stream.point(to[0], to[1]); + } + } + + function corner(p, direction) { + return abs(p[0] - x0) < epsilon$2 ? direction > 0 ? 0 : 3 + : abs(p[0] - x1) < epsilon$2 ? direction > 0 ? 2 : 1 + : abs(p[1] - y0) < epsilon$2 ? direction > 0 ? 1 : 0 + : direction > 0 ? 3 : 2; // abs(p[1] - y1) < epsilon + } + + function compareIntersection(a, b) { + return comparePoint(a.x, b.x); + } + + function comparePoint(a, b) { + var ca = corner(a, 1), + cb = corner(b, 1); + return ca !== cb ? ca - cb + : ca === 0 ? b[1] - a[1] + : ca === 1 ? a[0] - b[0] + : ca === 2 ? a[1] - b[1] + : b[0] - a[0]; + } + + return function (stream) { + var activeStream = stream, + bufferStream = clipBuffer(), + segments, + polygon, + ring, + x__, y__, v__, // first point + x_, y_, v_, // previous point + first, + clean; + + var clipStream = { + point: point, + lineStart: lineStart, + lineEnd: lineEnd, + polygonStart: polygonStart, + polygonEnd: polygonEnd + }; + + function point(x, y) { + if (visible(x, y)) + activeStream.point(x, y); + } + + function polygonInside() { + var winding = 0; + + for (var i = 0, n = polygon.length; i < n; ++i) { + for (var ring = polygon[i], j = 1, m = ring.length, point = ring[0], a0, a1, b0 = point[0], b1 = point[1]; j < m; ++j) { + a0 = b0, a1 = b1, point = ring[j], b0 = point[0], b1 = point[1]; + if (a1 <= y1) { + if (b1 > y1 && (b0 - a0) * (y1 - a1) > (b1 - a1) * (x0 - a0)) + ++winding; + } else { + if (b1 <= y1 && (b0 - a0) * (y1 - a1) < (b1 - a1) * (x0 - a0)) + --winding; + } + } + } + + return winding; + } + + // Buffer geometry within a polygon and then clip it en masse. + function polygonStart() { + activeStream = bufferStream, segments = [], polygon = [], clean = true; + } + + function polygonEnd() { + var startInside = polygonInside(), + cleanInside = clean && startInside, + visible = (segments = merge(segments)).length; + if (cleanInside || visible) { + stream.polygonStart(); + if (cleanInside) { + stream.lineStart(); + interpolate(null, null, 1, stream); + stream.lineEnd(); + } + if (visible) { + clipRejoin(segments, compareIntersection, startInside, interpolate, stream); + } + stream.polygonEnd(); + } + activeStream = stream, segments = polygon = ring = null; + } + + function lineStart() { + clipStream.point = linePoint; + if (polygon) + polygon.push(ring = []); + first = true; + v_ = false; + x_ = y_ = NaN; + } + + // TODO rather than special-case polygons, simply handle them separately. + // Ideally, coincident intersection points should be jittered to avoid + // clipping issues. + function lineEnd() { + if (segments) { + linePoint(x__, y__); + if (v__ && v_) + bufferStream.rejoin(); + segments.push(bufferStream.result()); + } + clipStream.point = point; + if (v_) + activeStream.lineEnd(); + } + + function linePoint(x, y) { + var v = visible(x, y); + if (polygon) + ring.push([x, y]); + if (first) { + x__ = x, y__ = y, v__ = v; + first = false; + if (v) { + activeStream.lineStart(); + activeStream.point(x, y); + } + } else { + if (v && v_) + activeStream.point(x, y); + else { + var a = [x_ = Math.max(clipMin, Math.min(clipMax, x_)), y_ = Math.max(clipMin, Math.min(clipMax, y_))], + b = [x = Math.max(clipMin, Math.min(clipMax, x)), y = Math.max(clipMin, Math.min(clipMax, y))]; + if (clipLine(a, b, x0, y0, x1, y1)) { + if (!v_) { + activeStream.lineStart(); + activeStream.point(a[0], a[1]); + } + activeStream.point(b[0], b[1]); + if (!v) + activeStream.lineEnd(); + clean = false; + } else if (v) { + activeStream.lineStart(); + activeStream.point(x, y); + clean = false; + } + } + } + x_ = x, y_ = y, v_ = v; + } + + return clipStream; + }; + } + + function extent$1() { + var x0 = 0, + y0 = 0, + x1 = 960, + y1 = 500, + cache, + cacheStream, + clip; + + return clip = { + stream: function (stream) { + return cache && cacheStream === stream ? cache : cache = clipRectangle(x0, y0, x1, y1)(cacheStream = stream); + }, + extent: function (_) { + return arguments.length ? (x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1], cache = cacheStream = null, clip) : [[x0, y0], [x1, y1]]; + } + }; + } + + var lengthSum = adder(), + lambda0$2, + sinPhi0$1, + cosPhi0$1; + + var lengthStream = { + sphere: noop$2, + point: noop$2, + lineStart: lengthLineStart, + lineEnd: noop$2, + polygonStart: noop$2, + polygonEnd: noop$2 + }; + + function lengthLineStart() { + lengthStream.point = lengthPointFirst; + lengthStream.lineEnd = lengthLineEnd; + } + + function lengthLineEnd() { + lengthStream.point = lengthStream.lineEnd = noop$2; + } + + function lengthPointFirst(lambda, phi) { + lambda *= radians, phi *= radians; + lambda0$2 = lambda, sinPhi0$1 = sin$1(phi), cosPhi0$1 = cos$1(phi); + lengthStream.point = lengthPoint; + } + + function lengthPoint(lambda, phi) { + lambda *= radians, phi *= radians; + var sinPhi = sin$1(phi), + cosPhi = cos$1(phi), + delta = abs(lambda - lambda0$2), + cosDelta = cos$1(delta), + sinDelta = sin$1(delta), + x = cosPhi * sinDelta, + y = cosPhi0$1 * sinPhi - sinPhi0$1 * cosPhi * cosDelta, + z = sinPhi0$1 * sinPhi + cosPhi0$1 * cosPhi * cosDelta; + lengthSum.add(atan2(sqrt(x * x + y * y), z)); + lambda0$2 = lambda, sinPhi0$1 = sinPhi, cosPhi0$1 = cosPhi; + } + + function length$1(object) { + lengthSum.reset(); + geoStream(object, lengthStream); + return +lengthSum; + } + + var coordinates = [null, null], + object$1 = {type: "LineString", coordinates: coordinates}; + + function distance(a, b) { + coordinates[0] = a; + coordinates[1] = b; + return length$1(object$1); + } + + var containsObjectType = { + Feature: function (object, point) { + return containsGeometry(object.geometry, point); + }, + FeatureCollection: function (object, point) { + var features = object.features, i = -1, n = features.length; + while (++i < n) + if (containsGeometry(features[i].geometry, point)) + return true; + return false; + } + }; + + var containsGeometryType = { + Sphere: function () { + return true; + }, + Point: function (object, point) { + return containsPoint(object.coordinates, point); + }, + MultiPoint: function (object, point) { + var coordinates = object.coordinates, i = -1, n = coordinates.length; + while (++i < n) + if (containsPoint(coordinates[i], point)) + return true; + return false; + }, + LineString: function (object, point) { + return containsLine(object.coordinates, point); + }, + MultiLineString: function (object, point) { + var coordinates = object.coordinates, i = -1, n = coordinates.length; + while (++i < n) + if (containsLine(coordinates[i], point)) + return true; + return false; + }, + Polygon: function (object, point) { + return containsPolygon(object.coordinates, point); + }, + MultiPolygon: function (object, point) { + var coordinates = object.coordinates, i = -1, n = coordinates.length; + while (++i < n) + if (containsPolygon(coordinates[i], point)) + return true; + return false; + }, + GeometryCollection: function (object, point) { + var geometries = object.geometries, i = -1, n = geometries.length; + while (++i < n) + if (containsGeometry(geometries[i], point)) + return true; + return false; + } + }; + + function containsGeometry(geometry, point) { + return geometry && containsGeometryType.hasOwnProperty(geometry.type) + ? containsGeometryType[geometry.type](geometry, point) + : false; + } + + function containsPoint(coordinates, point) { + return distance(coordinates, point) === 0; + } + + function containsLine(coordinates, point) { + var ao, bo, ab; + for (var i = 0, n = coordinates.length; i < n; i++) { + bo = distance(coordinates[i], point); + if (bo === 0) + return true; + if (i > 0) { + ab = distance(coordinates[i], coordinates[i - 1]); + if ( + ab > 0 && + ao <= ab && + bo <= ab && + (ao + bo - ab) * (1 - Math.pow((ao - bo) / ab, 2)) < epsilon2$1 * ab + ) + return true; + } + ao = bo; + } + return false; + } + + function containsPolygon(coordinates, point) { + return !!polygonContains(coordinates.map(ringRadians), pointRadians(point)); + } + + function ringRadians(ring) { + return ring = ring.map(pointRadians), ring.pop(), ring; + } + + function pointRadians(point) { + return [point[0] * radians, point[1] * radians]; + } + + function contains$1(object, point) { + return (object && containsObjectType.hasOwnProperty(object.type) + ? containsObjectType[object.type] + : containsGeometry)(object, point); + } + + function graticuleX(y0, y1, dy) { + var y = sequence(y0, y1 - epsilon$2, dy).concat(y1); + return function (x) { + return y.map(function (y) { + return [x, y]; + }); + }; + } + + function graticuleY(x0, x1, dx) { + var x = sequence(x0, x1 - epsilon$2, dx).concat(x1); + return function (y) { + return x.map(function (x) { + return [x, y]; + }); + }; + } + + function graticule() { + var x1, x0, X1, X0, + y1, y0, Y1, Y0, + dx = 10, dy = dx, DX = 90, DY = 360, + x, y, X, Y, + precision = 2.5; + + function graticule() { + return {type: "MultiLineString", coordinates: lines()}; + } + + function lines() { + return sequence(ceil(X0 / DX) * DX, X1, DX).map(X) + .concat(sequence(ceil(Y0 / DY) * DY, Y1, DY).map(Y)) + .concat(sequence(ceil(x0 / dx) * dx, x1, dx).filter(function (x) { + return abs(x % DX) > epsilon$2; + }).map(x)) + .concat(sequence(ceil(y0 / dy) * dy, y1, dy).filter(function (y) { + return abs(y % DY) > epsilon$2; + }).map(y)); + } + + graticule.lines = function () { + return lines().map(function (coordinates) { + return {type: "LineString", coordinates: coordinates}; + }); + }; + + graticule.outline = function () { + return { + type: "Polygon", + coordinates: [ + X(X0).concat( + Y(Y1).slice(1), + X(X1).reverse().slice(1), + Y(Y0).reverse().slice(1)) + ] + }; + }; + + graticule.extent = function (_) { + if (!arguments.length) + return graticule.extentMinor(); + return graticule.extentMajor(_).extentMinor(_); + }; + + graticule.extentMajor = function (_) { + if (!arguments.length) + return [[X0, Y0], [X1, Y1]]; + X0 = +_[0][0], X1 = +_[1][0]; + Y0 = +_[0][1], Y1 = +_[1][1]; + if (X0 > X1) + _ = X0, X0 = X1, X1 = _; + if (Y0 > Y1) + _ = Y0, Y0 = Y1, Y1 = _; + return graticule.precision(precision); + }; + + graticule.extentMinor = function (_) { + if (!arguments.length) + return [[x0, y0], [x1, y1]]; + x0 = +_[0][0], x1 = +_[1][0]; + y0 = +_[0][1], y1 = +_[1][1]; + if (x0 > x1) + _ = x0, x0 = x1, x1 = _; + if (y0 > y1) + _ = y0, y0 = y1, y1 = _; + return graticule.precision(precision); + }; + + graticule.step = function (_) { + if (!arguments.length) + return graticule.stepMinor(); + return graticule.stepMajor(_).stepMinor(_); + }; + + graticule.stepMajor = function (_) { + if (!arguments.length) + return [DX, DY]; + DX = +_[0], DY = +_[1]; + return graticule; + }; + + graticule.stepMinor = function (_) { + if (!arguments.length) + return [dx, dy]; + dx = +_[0], dy = +_[1]; + return graticule; + }; + + graticule.precision = function (_) { + if (!arguments.length) + return precision; + precision = +_; + x = graticuleX(y0, y1, 90); + y = graticuleY(x0, x1, precision); + X = graticuleX(Y0, Y1, 90); + Y = graticuleY(X0, X1, precision); + return graticule; + }; + + return graticule + .extentMajor([[-180, -90 + epsilon$2], [180, 90 - epsilon$2]]) + .extentMinor([[-180, -80 - epsilon$2], [180, 80 + epsilon$2]]); + } + + function graticule10() { + return graticule()(); + } + + function interpolate$1(a, b) { + var x0 = a[0] * radians, + y0 = a[1] * radians, + x1 = b[0] * radians, + y1 = b[1] * radians, + cy0 = cos$1(y0), + sy0 = sin$1(y0), + cy1 = cos$1(y1), + sy1 = sin$1(y1), + kx0 = cy0 * cos$1(x0), + ky0 = cy0 * sin$1(x0), + kx1 = cy1 * cos$1(x1), + ky1 = cy1 * sin$1(x1), + d = 2 * asin(sqrt(haversin(y1 - y0) + cy0 * cy1 * haversin(x1 - x0))), + k = sin$1(d); + + var interpolate = d ? function (t) { + var B = sin$1(t *= d) / k, + A = sin$1(d - t) / k, + x = A * kx0 + B * kx1, + y = A * ky0 + B * ky1, + z = A * sy0 + B * sy1; + return [ + atan2(y, x) * degrees$1, + atan2(z, sqrt(x * x + y * y)) * degrees$1 + ]; + } : function () { + return [x0 * degrees$1, y0 * degrees$1]; + }; + + interpolate.distance = d; + + return interpolate; + } + + function identity$4(x) { + return x; + } + + var areaSum$1 = adder(), + areaRingSum$1 = adder(), + x00, + y00, + x0$1, + y0$1; + + var areaStream$1 = { + point: noop$2, + lineStart: noop$2, + lineEnd: noop$2, + polygonStart: function () { + areaStream$1.lineStart = areaRingStart$1; + areaStream$1.lineEnd = areaRingEnd$1; + }, + polygonEnd: function () { + areaStream$1.lineStart = areaStream$1.lineEnd = areaStream$1.point = noop$2; + areaSum$1.add(abs(areaRingSum$1)); + areaRingSum$1.reset(); + }, + result: function () { + var area = areaSum$1 / 2; + areaSum$1.reset(); + return area; + } + }; + + function areaRingStart$1() { + areaStream$1.point = areaPointFirst$1; + } + + function areaPointFirst$1(x, y) { + areaStream$1.point = areaPoint$1; + x00 = x0$1 = x, y00 = y0$1 = y; + } + + function areaPoint$1(x, y) { + areaRingSum$1.add(y0$1 * x - x0$1 * y); + x0$1 = x, y0$1 = y; + } + + function areaRingEnd$1() { + areaPoint$1(x00, y00); + } + + var x0$2 = Infinity, + y0$2 = x0$2, + x1 = -x0$2, + y1 = x1; + + var boundsStream$1 = { + point: boundsPoint$1, + lineStart: noop$2, + lineEnd: noop$2, + polygonStart: noop$2, + polygonEnd: noop$2, + result: function () { + var bounds = [[x0$2, y0$2], [x1, y1]]; + x1 = y1 = -(y0$2 = x0$2 = Infinity); + return bounds; + } + }; + + function boundsPoint$1(x, y) { + if (x < x0$2) + x0$2 = x; + if (x > x1) + x1 = x; + if (y < y0$2) + y0$2 = y; + if (y > y1) + y1 = y; + } + +// TODO Enforce positive area for exterior, negative area for interior? + + var X0$1 = 0, + Y0$1 = 0, + Z0$1 = 0, + X1$1 = 0, + Y1$1 = 0, + Z1$1 = 0, + X2$1 = 0, + Y2$1 = 0, + Z2$1 = 0, + x00$1, + y00$1, + x0$3, + y0$3; + + var centroidStream$1 = { + point: centroidPoint$1, + lineStart: centroidLineStart$1, + lineEnd: centroidLineEnd$1, + polygonStart: function () { + centroidStream$1.lineStart = centroidRingStart$1; + centroidStream$1.lineEnd = centroidRingEnd$1; + }, + polygonEnd: function () { + centroidStream$1.point = centroidPoint$1; + centroidStream$1.lineStart = centroidLineStart$1; + centroidStream$1.lineEnd = centroidLineEnd$1; + }, + result: function () { + var centroid = Z2$1 ? [X2$1 / Z2$1, Y2$1 / Z2$1] + : Z1$1 ? [X1$1 / Z1$1, Y1$1 / Z1$1] + : Z0$1 ? [X0$1 / Z0$1, Y0$1 / Z0$1] + : [NaN, NaN]; + X0$1 = Y0$1 = Z0$1 = + X1$1 = Y1$1 = Z1$1 = + X2$1 = Y2$1 = Z2$1 = 0; + return centroid; + } + }; + + function centroidPoint$1(x, y) { + X0$1 += x; + Y0$1 += y; + ++Z0$1; + } + + function centroidLineStart$1() { + centroidStream$1.point = centroidPointFirstLine; + } + + function centroidPointFirstLine(x, y) { + centroidStream$1.point = centroidPointLine; + centroidPoint$1(x0$3 = x, y0$3 = y); + } + + function centroidPointLine(x, y) { + var dx = x - x0$3, dy = y - y0$3, z = sqrt(dx * dx + dy * dy); + X1$1 += z * (x0$3 + x) / 2; + Y1$1 += z * (y0$3 + y) / 2; + Z1$1 += z; + centroidPoint$1(x0$3 = x, y0$3 = y); + } + + function centroidLineEnd$1() { + centroidStream$1.point = centroidPoint$1; + } + + function centroidRingStart$1() { + centroidStream$1.point = centroidPointFirstRing; + } + + function centroidRingEnd$1() { + centroidPointRing(x00$1, y00$1); + } + + function centroidPointFirstRing(x, y) { + centroidStream$1.point = centroidPointRing; + centroidPoint$1(x00$1 = x0$3 = x, y00$1 = y0$3 = y); + } + + function centroidPointRing(x, y) { + var dx = x - x0$3, + dy = y - y0$3, + z = sqrt(dx * dx + dy * dy); + + X1$1 += z * (x0$3 + x) / 2; + Y1$1 += z * (y0$3 + y) / 2; + Z1$1 += z; + + z = y0$3 * x - x0$3 * y; + X2$1 += z * (x0$3 + x); + Y2$1 += z * (y0$3 + y); + Z2$1 += z * 3; + centroidPoint$1(x0$3 = x, y0$3 = y); + } + + function PathContext(context) { + this._context = context; + } + + PathContext.prototype = { + _radius: 4.5, + pointRadius: function (_) { + return this._radius = _, 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 (x, y) { + switch (this._point) { + case 0: + { + this._context.moveTo(x, y); + this._point = 1; + break; + } + case 1: + { + this._context.lineTo(x, y); + break; + } + default: + { + this._context.moveTo(x + this._radius, y); + this._context.arc(x, y, this._radius, 0, tau$3); + break; + } + } + }, + result: noop$2 + }; + + var lengthSum$1 = adder(), + lengthRing, + x00$2, + y00$2, + x0$4, + y0$4; + + var lengthStream$1 = { + point: noop$2, + lineStart: function () { + lengthStream$1.point = lengthPointFirst$1; + }, + lineEnd: function () { + if (lengthRing) + lengthPoint$1(x00$2, y00$2); + lengthStream$1.point = noop$2; + }, + polygonStart: function () { + lengthRing = true; + }, + polygonEnd: function () { + lengthRing = null; + }, + result: function () { + var length = +lengthSum$1; + lengthSum$1.reset(); + return length; + } + }; + + function lengthPointFirst$1(x, y) { + lengthStream$1.point = lengthPoint$1; + x00$2 = x0$4 = x, y00$2 = y0$4 = y; + } + + function lengthPoint$1(x, y) { + x0$4 -= x, y0$4 -= y; + lengthSum$1.add(sqrt(x0$4 * x0$4 + y0$4 * y0$4)); + x0$4 = x, y0$4 = y; + } + + function PathString() { + this._string = []; + } + + PathString.prototype = { + _radius: 4.5, + _circle: circle$1(4.5), + pointRadius: function (_) { + if ((_ = +_) !== this._radius) + this._radius = _, 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 (x, y) { + switch (this._point) { + case 0: + { + this._string.push("M", x, ",", y); + this._point = 1; + break; + } + case 1: + { + this._string.push("L", x, ",", y); + break; + } + default: + { + if (this._circle == null) + this._circle = circle$1(this._radius); + this._string.push("M", x, ",", y, this._circle); + break; + } + } + }, + result: function () { + if (this._string.length) { + var result = this._string.join(""); + this._string = []; + return result; + } else { + return null; + } + } + }; + + function circle$1(radius) { + return "m0," + radius + + "a" + radius + "," + radius + " 0 1,1 0," + -2 * radius + + "a" + radius + "," + radius + " 0 1,1 0," + 2 * radius + + "z"; + } + + function index$1(projection, context) { + var pointRadius = 4.5, + projectionStream, + contextStream; + + function path(object) { + if (object) { + if (typeof pointRadius === "function") + contextStream.pointRadius(+pointRadius.apply(this, arguments)); + geoStream(object, projectionStream(contextStream)); + } + return contextStream.result(); + } + + path.area = function (object) { + geoStream(object, projectionStream(areaStream$1)); + return areaStream$1.result(); + }; + + path.measure = function (object) { + geoStream(object, projectionStream(lengthStream$1)); + return lengthStream$1.result(); + }; + + path.bounds = function (object) { + geoStream(object, projectionStream(boundsStream$1)); + return boundsStream$1.result(); + }; + + path.centroid = function (object) { + geoStream(object, projectionStream(centroidStream$1)); + return centroidStream$1.result(); + }; + + path.projection = function (_) { + return arguments.length ? (projectionStream = _ == null ? (projection = null, identity$4) : (projection = _).stream, path) : projection; + }; + + path.context = function (_) { + if (!arguments.length) + return context; + contextStream = _ == null ? (context = null, new PathString) : new PathContext(context = _); + if (typeof pointRadius !== "function") + contextStream.pointRadius(pointRadius); + return path; + }; + + path.pointRadius = function (_) { + if (!arguments.length) + return pointRadius; + pointRadius = typeof _ === "function" ? _ : (contextStream.pointRadius(+_), +_); + return path; + }; + + return path.projection(projection).context(context); + } + + function transform(methods) { + return { + stream: transformer(methods) + }; + } + + function transformer(methods) { + return function (stream) { + var s = new TransformStream; + for (var key in methods) + s[key] = methods[key]; + s.stream = stream; + return s; + }; + } + + function TransformStream() {} + + TransformStream.prototype = { + constructor: TransformStream, + point: function (x, y) { + this.stream.point(x, y); + }, + 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 fit(projection, fitBounds, object) { + var clip = projection.clipExtent && projection.clipExtent(); + projection.scale(150).translate([0, 0]); + if (clip != null) + projection.clipExtent(null); + geoStream(object, projection.stream(boundsStream$1)); + fitBounds(boundsStream$1.result()); + if (clip != null) + projection.clipExtent(clip); + return projection; + } + + function fitExtent(projection, extent, object) { + return fit(projection, function (b) { + var w = extent[1][0] - extent[0][0], + h = extent[1][1] - extent[0][1], + k = Math.min(w / (b[1][0] - b[0][0]), h / (b[1][1] - b[0][1])), + x = +extent[0][0] + (w - k * (b[1][0] + b[0][0])) / 2, + y = +extent[0][1] + (h - k * (b[1][1] + b[0][1])) / 2; + projection.scale(150 * k).translate([x, y]); + }, object); + } + + function fitSize(projection, size, object) { + return fitExtent(projection, [[0, 0], size], object); + } + + function fitWidth(projection, width, object) { + return fit(projection, function (b) { + var w = +width, + k = w / (b[1][0] - b[0][0]), + x = (w - k * (b[1][0] + b[0][0])) / 2, + y = -k * b[0][1]; + projection.scale(150 * k).translate([x, y]); + }, object); + } + + function fitHeight(projection, height, object) { + return fit(projection, function (b) { + var h = +height, + k = h / (b[1][1] - b[0][1]), + x = -k * b[0][0], + y = (h - k * (b[1][1] + b[0][1])) / 2; + projection.scale(150 * k).translate([x, y]); + }, object); + } + + var maxDepth = 16, // maximum depth of subdivision + cosMinDistance = cos$1(30 * radians); // cos(minimum angular distance) + + function resample(project, delta2) { + return +delta2 ? resample$1(project, delta2) : resampleNone(project); + } + + function resampleNone(project) { + return transformer({ + point: function (x, y) { + x = project(x, y); + this.stream.point(x[0], x[1]); + } + }); + } + + function resample$1(project, delta2) { + + function resampleLineTo(x0, y0, lambda0, a0, b0, c0, x1, y1, lambda1, a1, b1, c1, depth, stream) { + var dx = x1 - x0, + dy = y1 - y0, + d2 = dx * dx + dy * dy; + if (d2 > 4 * delta2 && depth--) { + var a = a0 + a1, + b = b0 + b1, + c = c0 + c1, + m = sqrt(a * a + b * b + c * c), + phi2 = asin(c /= m), + lambda2 = abs(abs(c) - 1) < epsilon$2 || abs(lambda0 - lambda1) < epsilon$2 ? (lambda0 + lambda1) / 2 : atan2(b, a), + p = project(lambda2, phi2), + x2 = p[0], + y2 = p[1], + dx2 = x2 - x0, + dy2 = y2 - y0, + dz = dy * dx2 - dx * dy2; + if (dz * dz / d2 > delta2 // perpendicular projected distance + || abs((dx * dx2 + dy * dy2) / d2 - 0.5) > 0.3 // midpoint close to an end + || a0 * a1 + b0 * b1 + c0 * c1 < cosMinDistance) { // angular distance + resampleLineTo(x0, y0, lambda0, a0, b0, c0, x2, y2, lambda2, a /= m, b /= m, c, depth, stream); + stream.point(x2, y2); + resampleLineTo(x2, y2, lambda2, a, b, c, x1, y1, lambda1, a1, b1, c1, depth, stream); + } + } + } + return function (stream) { + var lambda00, x00, y00, a00, b00, c00, // first point + lambda0, x0, y0, a0, b0, c0; // previous point + + var resampleStream = { + point: point, + lineStart: lineStart, + lineEnd: lineEnd, + polygonStart: function () { + stream.polygonStart(); + resampleStream.lineStart = ringStart; + }, + polygonEnd: function () { + stream.polygonEnd(); + resampleStream.lineStart = lineStart; + } + }; + + function point(x, y) { + x = project(x, y); + stream.point(x[0], x[1]); + } + + function lineStart() { + x0 = NaN; + resampleStream.point = linePoint; + stream.lineStart(); + } + + function linePoint(lambda, phi) { + var c = cartesian([lambda, phi]), p = project(lambda, phi); + 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); + stream.point(x0, y0); + } + + function lineEnd() { + resampleStream.point = point; + stream.lineEnd(); + } + + function ringStart() { + lineStart(); + resampleStream.point = ringPoint; + resampleStream.lineEnd = ringEnd; + } + + function ringPoint(lambda, phi) { + linePoint(lambda00 = lambda, phi), x00 = x0, y00 = y0, a00 = a0, b00 = b0, c00 = c0; + resampleStream.point = linePoint; + } + + function ringEnd() { + resampleLineTo(x0, y0, lambda0, a0, b0, c0, x00, y00, lambda00, a00, b00, c00, maxDepth, stream); + resampleStream.lineEnd = lineEnd; + lineEnd(); + } + + return resampleStream; + }; + } + + var transformRadians = transformer({ + point: function (x, y) { + this.stream.point(x * radians, y * radians); + } + }); + + function transformRotate(rotate) { + return transformer({ + point: function (x, y) { + var r = rotate(x, y); + return this.stream.point(r[0], r[1]); + } + }); + } + + function scaleTranslate(k, dx, dy, sx, sy) { + function transform(x, y) { + x *= sx; + y *= sy; + return [dx + k * x, dy - k * y]; + } + transform.invert = function (x, y) { + return [(x - dx) / k * sx, (dy - y) / k * sy]; + }; + return transform; + } + + function scaleTranslateRotate(k, dx, dy, sx, sy, alpha) { + var cosAlpha = cos$1(alpha), + sinAlpha = sin$1(alpha), + a = cosAlpha * k, + b = sinAlpha * k, + ai = cosAlpha / k, + bi = sinAlpha / k, + ci = (sinAlpha * dy - cosAlpha * dx) / k, + fi = (sinAlpha * dx + cosAlpha * dy) / k; + function transform(x, y) { + x *= sx; + y *= sy; + return [a * x - b * y + dx, dy - b * x - a * y]; + } + transform.invert = function (x, y) { + return [sx * (ai * x - bi * y + ci), sy * (fi - bi * x - ai * y)]; + }; + return transform; + } + + function projection(project) { + return projectionMutator(function () { + return project; + })(); + } + + function projectionMutator(projectAt) { + var project, + k = 150, // scale + x = 480, y = 250, // translate + lambda = 0, phi = 0, // center + deltaLambda = 0, deltaPhi = 0, deltaGamma = 0, rotate, // pre-rotate + alpha = 0, // post-rotate angle + sx = 1, // reflectX + sy = 1, // reflectX + theta = null, preclip = clipAntimeridian, // pre-clip angle + x0 = null, y0, x1, y1, postclip = identity$4, // post-clip extent + delta2 = 0.5, // precision + projectResample, + projectTransform, + projectRotateTransform, + cache, + cacheStream; + + function projection(point) { + return projectRotateTransform(point[0] * radians, point[1] * radians); + } + + function invert(point) { + point = projectRotateTransform.invert(point[0], point[1]); + return point && [point[0] * degrees$1, point[1] * degrees$1]; + } + + projection.stream = function (stream) { + return cache && cacheStream === stream ? cache : cache = transformRadians(transformRotate(rotate)(preclip(projectResample(postclip(cacheStream = stream))))); + }; + + projection.preclip = function (_) { + return arguments.length ? (preclip = _, theta = undefined, reset()) : preclip; + }; + + projection.postclip = function (_) { + return arguments.length ? (postclip = _, x0 = y0 = x1 = y1 = null, reset()) : postclip; + }; + + projection.clipAngle = function (_) { + return arguments.length ? (preclip = +_ ? clipCircle(theta = _ * radians) : (theta = null, clipAntimeridian), reset()) : theta * degrees$1; + }; + + projection.clipExtent = function (_) { + return arguments.length ? (postclip = _ == null ? (x0 = y0 = x1 = y1 = null, identity$4) : clipRectangle(x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1]), reset()) : x0 == null ? null : [[x0, y0], [x1, y1]]; + }; + + projection.scale = function (_) { + return arguments.length ? (k = +_, recenter()) : k; + }; + + projection.translate = function (_) { + return arguments.length ? (x = +_[0], y = +_[1], recenter()) : [x, y]; + }; + + projection.center = function (_) { + return arguments.length ? (lambda = _[0] % 360 * radians, phi = _[1] % 360 * radians, recenter()) : [lambda * degrees$1, phi * degrees$1]; + }; + + projection.rotate = function (_) { + return arguments.length ? (deltaLambda = _[0] % 360 * radians, deltaPhi = _[1] % 360 * radians, deltaGamma = _.length > 2 ? _[2] % 360 * radians : 0, recenter()) : [deltaLambda * degrees$1, deltaPhi * degrees$1, deltaGamma * degrees$1]; + }; + + projection.angle = function (_) { + return arguments.length ? (alpha = _ % 360 * radians, recenter()) : alpha * degrees$1; + }; + + projection.reflectX = function (_) { + return arguments.length ? (sx = _ ? -1 : 1, recenter()) : sx < 0; + }; + + projection.reflectY = function (_) { + return arguments.length ? (sy = _ ? -1 : 1, recenter()) : sy < 0; + }; + + projection.precision = function (_) { + return arguments.length ? (projectResample = resample(projectTransform, delta2 = _ * _), reset()) : sqrt(delta2); + }; + + projection.fitExtent = function (extent, object) { + return fitExtent(projection, extent, object); + }; + + projection.fitSize = function (size, object) { + return fitSize(projection, size, object); + }; + + projection.fitWidth = function (width, object) { + return fitWidth(projection, width, object); + }; + + projection.fitHeight = function (height, object) { + return fitHeight(projection, height, object); + }; + + function recenter() { + var center = scaleTranslateRotate(k, 0, 0, sx, sy, alpha).apply(null, project(lambda, phi)), + transform = (alpha ? scaleTranslateRotate : scaleTranslate)(k, x - center[0], y - center[1], sx, sy, alpha); + rotate = rotateRadians(deltaLambda, deltaPhi, deltaGamma); + projectTransform = compose(project, transform); + projectRotateTransform = compose(rotate, projectTransform); + projectResample = resample(projectTransform, delta2); + return reset(); + } + + function reset() { + cache = cacheStream = null; + return projection; + } + + return function () { + project = projectAt.apply(this, arguments); + projection.invert = project.invert && invert; + return recenter(); + }; + } + + function conicProjection(projectAt) { + var phi0 = 0, + phi1 = pi$3 / 3, + m = projectionMutator(projectAt), + p = m(phi0, phi1); + + p.parallels = function (_) { + return arguments.length ? m(phi0 = _[0] * radians, phi1 = _[1] * radians) : [phi0 * degrees$1, phi1 * degrees$1]; + }; + + return p; + } + + function cylindricalEqualAreaRaw(phi0) { + var cosPhi0 = cos$1(phi0); + + function forward(lambda, phi) { + return [lambda * cosPhi0, sin$1(phi) / cosPhi0]; + } + + forward.invert = function (x, y) { + return [x / cosPhi0, asin(y * cosPhi0)]; + }; + + return forward; + } + + function conicEqualAreaRaw(y0, y1) { + var sy0 = sin$1(y0), n = (sy0 + sin$1(y1)) / 2; + + // Are the parallels symmetrical around the Equator? + if (abs(n) < epsilon$2) + return cylindricalEqualAreaRaw(y0); + + var c = 1 + sy0 * (2 * n - sy0), r0 = sqrt(c) / n; + + function project(x, y) { + var r = sqrt(c - 2 * n * sin$1(y)) / n; + return [r * sin$1(x *= n), r0 - r * cos$1(x)]; + } + + project.invert = function (x, y) { + var r0y = r0 - y, + l = atan2(x, abs(r0y)) * sign(r0y); + if (r0y * n < 0) + l -= pi$3 * sign(x) * sign(r0y); + return [l / n, asin((c - (x * x + r0y * r0y) * n * n) / (2 * n))]; + }; + + return project; + } + + function conicEqualArea() { + return conicProjection(conicEqualAreaRaw) + .scale(155.424) + .center([0, 33.6442]); + } + + function albers() { + return conicEqualArea() + .parallels([29.5, 45.5]) + .scale(1070) + .translate([480, 250]) + .rotate([96, 0]) + .center([-0.6, 38.7]); + } + +// The projections must have mutually exclusive clip regions on the sphere, +// as this will avoid emitting interleaving lines and polygons. + function multiplex(streams) { + var n = streams.length; + return { + point: function (x, y) { + var i = -1; + while (++i < n) + streams[i].point(x, y); + }, + sphere: function () { + var i = -1; + while (++i < n) + streams[i].sphere(); + }, + lineStart: function () { + var i = -1; + while (++i < n) + streams[i].lineStart(); + }, + lineEnd: function () { + var i = -1; + while (++i < n) + streams[i].lineEnd(); + }, + polygonStart: function () { + var i = -1; + while (++i < n) + streams[i].polygonStart(); + }, + polygonEnd: function () { + var i = -1; + while (++i < n) + streams[i].polygonEnd(); + } + }; + } + +// A composite projection for the United States, configured by default for +// 960×500. The projection also works quite well at 960×600 if you change the +// scale to 1285 and adjust the translate accordingly. The set of standard +// parallels for each region comes from USGS, which is published here: +// http://egsc.usgs.gov/isb/pubs/MapProjections/projections.html#albers + function albersUsa() { + var cache, + cacheStream, + lower48 = albers(), lower48Point, + alaska = conicEqualArea().rotate([154, 0]).center([-2, 58.5]).parallels([55, 65]), alaskaPoint, // EPSG:3338 + hawaii = conicEqualArea().rotate([157, 0]).center([-3, 19.9]).parallels([8, 18]), hawaiiPoint, // ESRI:102007 + point, pointStream = {point: function (x, y) { + point = [x, y]; + }}; + + function albersUsa(coordinates) { + var x = coordinates[0], y = coordinates[1]; + return point = null, + (lower48Point.point(x, y), point) + || (alaskaPoint.point(x, y), point) + || (hawaiiPoint.point(x, y), point); + } + + albersUsa.invert = function (coordinates) { + var k = lower48.scale(), + t = lower48.translate(), + x = (coordinates[0] - t[0]) / k, + y = (coordinates[1] - t[1]) / k; + return (y >= 0.120 && y < 0.234 && x >= -0.425 && x < -0.214 ? alaska + : y >= 0.166 && y < 0.234 && x >= -0.214 && x < -0.115 ? hawaii + : lower48).invert(coordinates); + }; + + albersUsa.stream = function (stream) { + return cache && cacheStream === stream ? cache : cache = multiplex([lower48.stream(cacheStream = stream), alaska.stream(stream), hawaii.stream(stream)]); + }; + + albersUsa.precision = function (_) { + if (!arguments.length) + return lower48.precision(); + lower48.precision(_), alaska.precision(_), hawaii.precision(_); + return reset(); + }; + + albersUsa.scale = function (_) { + if (!arguments.length) + return lower48.scale(); + lower48.scale(_), alaska.scale(_ * 0.35), hawaii.scale(_); + return albersUsa.translate(lower48.translate()); + }; + + albersUsa.translate = function (_) { + if (!arguments.length) + return lower48.translate(); + var k = lower48.scale(), x = +_[0], y = +_[1]; + + lower48Point = lower48 + .translate(_) + .clipExtent([[x - 0.455 * k, y - 0.238 * k], [x + 0.455 * k, y + 0.238 * k]]) + .stream(pointStream); + + alaskaPoint = alaska + .translate([x - 0.307 * k, y + 0.201 * k]) + .clipExtent([[x - 0.425 * k + epsilon$2, y + 0.120 * k + epsilon$2], [x - 0.214 * k - epsilon$2, y + 0.234 * k - epsilon$2]]) + .stream(pointStream); + + hawaiiPoint = hawaii + .translate([x - 0.205 * k, y + 0.212 * k]) + .clipExtent([[x - 0.214 * k + epsilon$2, y + 0.166 * k + epsilon$2], [x - 0.115 * k - epsilon$2, y + 0.234 * k - epsilon$2]]) + .stream(pointStream); + + return reset(); + }; + + albersUsa.fitExtent = function (extent, object) { + return fitExtent(albersUsa, extent, object); + }; + + albersUsa.fitSize = function (size, object) { + return fitSize(albersUsa, size, object); + }; + + albersUsa.fitWidth = function (width, object) { + return fitWidth(albersUsa, width, object); + }; + + albersUsa.fitHeight = function (height, object) { + return fitHeight(albersUsa, height, object); + }; + + function reset() { + cache = cacheStream = null; + return albersUsa; + } + + return albersUsa.scale(1070); + } + + function azimuthalRaw(scale) { + return function (x, y) { + var cx = cos$1(x), + cy = cos$1(y), + k = scale(cx * cy); + return [ + k * cy * sin$1(x), + k * sin$1(y) + ]; + } + } + + function azimuthalInvert(angle) { + return function (x, y) { + var z = sqrt(x * x + y * y), + c = angle(z), + sc = sin$1(c), + cc = cos$1(c); + return [ + atan2(x * sc, z * cc), + asin(z && y * sc / z) + ]; + } + } + + var azimuthalEqualAreaRaw = azimuthalRaw(function (cxcy) { + return sqrt(2 / (1 + cxcy)); + }); + + azimuthalEqualAreaRaw.invert = azimuthalInvert(function (z) { + return 2 * asin(z / 2); + }); + + function azimuthalEqualArea() { + return projection(azimuthalEqualAreaRaw) + .scale(124.75) + .clipAngle(180 - 1e-3); + } + + var azimuthalEquidistantRaw = azimuthalRaw(function (c) { + return (c = acos(c)) && c / sin$1(c); + }); + + azimuthalEquidistantRaw.invert = azimuthalInvert(function (z) { + return z; + }); + + function azimuthalEquidistant() { + return projection(azimuthalEquidistantRaw) + .scale(79.4188) + .clipAngle(180 - 1e-3); + } + + function mercatorRaw(lambda, phi) { + return [lambda, log(tan((halfPi$2 + phi) / 2))]; + } + + mercatorRaw.invert = function (x, y) { + return [x, 2 * atan(exp(y)) - halfPi$2]; + }; + + function mercator() { + return mercatorProjection(mercatorRaw) + .scale(961 / tau$3); + } + + function mercatorProjection(project) { + var m = projection(project), + center = m.center, + scale = m.scale, + translate = m.translate, + clipExtent = m.clipExtent, + x0 = null, y0, x1, y1; // clip extent + + m.scale = function (_) { + return arguments.length ? (scale(_), reclip()) : scale(); + }; + + m.translate = function (_) { + return arguments.length ? (translate(_), reclip()) : translate(); + }; + + m.center = function (_) { + return arguments.length ? (center(_), reclip()) : center(); + }; + + m.clipExtent = function (_) { + 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]]; + }; + + function reclip() { + var k = pi$3 * scale(), + t = m(rotation(m.rotate()).invert([0, 0])); + return clipExtent(x0 == null + ? [[t[0] - k, t[1] - k], [t[0] + k, t[1] + k]] : project === mercatorRaw + ? [[Math.max(t[0] - k, x0), y0], [Math.min(t[0] + k, x1), y1]] + : [[x0, Math.max(t[1] - k, y0)], [x1, Math.min(t[1] + k, y1)]]); + } + + return reclip(); + } + + function tany(y) { + return tan((halfPi$2 + y) / 2); + } + + function conicConformalRaw(y0, y1) { + var cy0 = cos$1(y0), + n = y0 === y1 ? sin$1(y0) : log(cy0 / cos$1(y1)) / log(tany(y1) / tany(y0)), + f = cy0 * pow(tany(y0), n) / n; + + if (!n) + return mercatorRaw; + + function project(x, y) { + if (f > 0) { + if (y < -halfPi$2 + epsilon$2) + y = -halfPi$2 + epsilon$2; + } else { + if (y > halfPi$2 - epsilon$2) + y = halfPi$2 - epsilon$2; + } + var r = f / pow(tany(y), n); + return [r * sin$1(n * x), f - r * cos$1(n * x)]; + } + + project.invert = function (x, y) { + var fy = f - y, r = sign(n) * sqrt(x * x + fy * fy), + l = atan2(x, abs(fy)) * sign(fy); + if (fy * n < 0) + l -= pi$3 * sign(x) * sign(fy); + return [l / n, 2 * atan(pow(f / r, 1 / n)) - halfPi$2]; + }; + + return project; + } + + function conicConformal() { + return conicProjection(conicConformalRaw) + .scale(109.5) + .parallels([30, 30]); + } + + function equirectangularRaw(lambda, phi) { + return [lambda, phi]; + } + + equirectangularRaw.invert = equirectangularRaw; + + function equirectangular() { + return projection(equirectangularRaw) + .scale(152.63); + } + + function conicEquidistantRaw(y0, y1) { + var cy0 = cos$1(y0), + n = y0 === y1 ? sin$1(y0) : (cy0 - cos$1(y1)) / (y1 - y0), + g = cy0 / n + y0; + + if (abs(n) < epsilon$2) + return equirectangularRaw; + + function project(x, y) { + var gy = g - y, nx = n * x; + return [gy * sin$1(nx), g - gy * cos$1(nx)]; + } + + project.invert = function (x, y) { + var gy = g - y, + l = atan2(x, abs(gy)) * sign(gy); + if (gy * n < 0) + l -= pi$3 * sign(x) * sign(gy); + return [l / n, g - sign(n) * sqrt(x * x + gy * gy)]; + }; + + return project; + } + + function conicEquidistant() { + return conicProjection(conicEquidistantRaw) + .scale(131.154) + .center([0, 13.9389]); + } + + var A1 = 1.340264, + A2 = -0.081106, + A3 = 0.000893, + A4 = 0.003796, + M = sqrt(3) / 2, + iterations = 12; + + function equalEarthRaw(lambda, phi) { + var l = asin(M * sin$1(phi)), l2 = l * l, l6 = l2 * l2 * l2; + return [ + lambda * cos$1(l) / (M * (A1 + 3 * A2 * l2 + l6 * (7 * A3 + 9 * A4 * l2))), + l * (A1 + A2 * l2 + l6 * (A3 + A4 * l2)) + ]; + } + + equalEarthRaw.invert = function (x, y) { + var l = y, l2 = l * l, l6 = l2 * l2 * l2; + for (var i = 0, delta, fy, fpy; i < iterations; ++i) { + fy = l * (A1 + A2 * l2 + l6 * (A3 + A4 * l2)) - y; + fpy = A1 + 3 * A2 * l2 + l6 * (7 * A3 + 9 * A4 * l2); + l -= delta = fy / fpy, l2 = l * l, l6 = l2 * l2 * l2; + if (abs(delta) < epsilon2$1) + break; + } + return [ + M * x * (A1 + 3 * A2 * l2 + l6 * (7 * A3 + 9 * A4 * l2)) / cos$1(l), + asin(sin$1(l) / M) + ]; + }; + + function equalEarth() { + return projection(equalEarthRaw) + .scale(177.158); + } + + function gnomonicRaw(x, y) { + var cy = cos$1(y), k = cos$1(x) * cy; + return [cy * sin$1(x) / k, sin$1(y) / k]; + } + + gnomonicRaw.invert = azimuthalInvert(atan); + + function gnomonic() { + return projection(gnomonicRaw) + .scale(144.049) + .clipAngle(60); + } + + function identity$5() { + var k = 1, tx = 0, ty = 0, sx = 1, sy = 1, // scale, translate and reflect + alpha = 0, ca, sa, // angle + x0 = null, y0, x1, y1, // clip extent + kx = 1, ky = 1, + transform = transformer({ + point: function (x, y) { + var p = projection([x, y]); + this.stream.point(p[0], p[1]); + } + }), + postclip = identity$4, + cache, + cacheStream; + + function reset() { + kx = k * sx; + ky = k * sy; + cache = cacheStream = null; + return projection; + } + + function projection(p) { + var x = p[0] * kx, y = p[1] * ky; + if (alpha) { + var t = y * ca - x * sa; + x = x * ca + y * sa; + y = t; + } + return [x + tx, y + ty]; + } + projection.invert = function (p) { + var x = p[0] - tx, y = p[1] - ty; + if (alpha) { + var t = y * ca + x * sa; + x = x * ca - y * sa; + y = t; + } + return [x / kx, y / ky]; + }; + projection.stream = function (stream) { + return cache && cacheStream === stream ? cache : cache = transform(postclip(cacheStream = stream)); + }; + projection.postclip = function (_) { + return arguments.length ? (postclip = _, x0 = y0 = x1 = y1 = null, reset()) : postclip; + }; + projection.clipExtent = function (_) { + return arguments.length ? (postclip = _ == null ? (x0 = y0 = x1 = y1 = null, identity$4) : clipRectangle(x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1]), reset()) : x0 == null ? null : [[x0, y0], [x1, y1]]; + }; + projection.scale = function (_) { + return arguments.length ? (k = +_, reset()) : k; + }; + projection.translate = function (_) { + return arguments.length ? (tx = +_[0], ty = +_[1], reset()) : [tx, ty]; + }; + projection.angle = function (_) { + return arguments.length ? (alpha = _ % 360 * radians, sa = sin$1(alpha), ca = cos$1(alpha), reset()) : alpha * degrees$1; + }; + projection.reflectX = function (_) { + return arguments.length ? (sx = _ ? -1 : 1, reset()) : sx < 0; + }; + projection.reflectY = function (_) { + return arguments.length ? (sy = _ ? -1 : 1, reset()) : sy < 0; + }; + projection.fitExtent = function (extent, object) { + return fitExtent(projection, extent, object); + }; + projection.fitSize = function (size, object) { + return fitSize(projection, size, object); + }; + projection.fitWidth = function (width, object) { + return fitWidth(projection, width, object); + }; + projection.fitHeight = function (height, object) { + return fitHeight(projection, height, object); + }; + + return projection; + } + + function naturalEarth1Raw(lambda, phi) { + var phi2 = phi * phi, phi4 = phi2 * phi2; + return [ + lambda * (0.8707 - 0.131979 * phi2 + phi4 * (-0.013791 + phi4 * (0.003971 * phi2 - 0.001529 * phi4))), + phi * (1.007226 + phi2 * (0.015085 + phi4 * (-0.044475 + 0.028874 * phi2 - 0.005916 * phi4))) + ]; + } + + naturalEarth1Raw.invert = function (x, y) { + var phi = y, i = 25, delta; + do { + var phi2 = phi * phi, phi4 = phi2 * phi2; + phi -= delta = (phi * (1.007226 + phi2 * (0.015085 + phi4 * (-0.044475 + 0.028874 * phi2 - 0.005916 * phi4))) - y) / + (1.007226 + phi2 * (0.015085 * 3 + phi4 * (-0.044475 * 7 + 0.028874 * 9 * phi2 - 0.005916 * 11 * phi4))); + } while (abs(delta) > epsilon$2 && --i > 0); + return [ + x / (0.8707 + (phi2 = phi * phi) * (-0.131979 + phi2 * (-0.013791 + phi2 * phi2 * phi2 * (0.003971 - 0.001529 * phi2)))), + phi + ]; + }; + + function naturalEarth1() { + return projection(naturalEarth1Raw) + .scale(175.295); + } + + function orthographicRaw(x, y) { + return [cos$1(y) * sin$1(x), sin$1(y)]; + } + + orthographicRaw.invert = azimuthalInvert(asin); + + function orthographic() { + return projection(orthographicRaw) + .scale(249.5) + .clipAngle(90 + epsilon$2); + } + + function stereographicRaw(x, y) { + var cy = cos$1(y), k = 1 + cos$1(x) * cy; + return [cy * sin$1(x) / k, sin$1(y) / k]; + } + + stereographicRaw.invert = azimuthalInvert(function (z) { + return 2 * atan(z); + }); + + function stereographic() { + return projection(stereographicRaw) + .scale(250) + .clipAngle(142); + } + + function transverseMercatorRaw(lambda, phi) { + return [log(tan((halfPi$2 + phi) / 2)), -lambda]; + } + + transverseMercatorRaw.invert = function (x, y) { + return [-y, 2 * atan(exp(x)) - halfPi$2]; + }; + + function transverseMercator() { + var m = mercatorProjection(transverseMercatorRaw), + center = m.center, + rotate = m.rotate; + + m.center = function (_) { + return arguments.length ? center([-_[1], _[0]]) : (_ = center(), [_[1], -_[0]]); + }; + + m.rotate = function (_) { + return arguments.length ? rotate([_[0], _[1], _.length > 2 ? _[2] + 90 : 90]) : (_ = rotate(), [_[0], _[1], _[2] - 90]); + }; + + return rotate([0, 0, 90]) + .scale(159.155); + } + + function defaultSeparation(a, b) { + return a.parent === b.parent ? 1 : 2; + } + + function meanX(children) { + return children.reduce(meanXReduce, 0) / children.length; + } + + function meanXReduce(x, c) { + return x + c.x; + } + + function maxY(children) { + return 1 + children.reduce(maxYReduce, 0); + } + + function maxYReduce(y, c) { + return Math.max(y, c.y); + } + + function leafLeft(node) { + var children; + while (children = node.children) + node = children[0]; + return node; + } + + function leafRight(node) { + var children; + while (children = node.children) + node = children[children.length - 1]; + return node; + } + + function cluster() { + var separation = defaultSeparation, + dx = 1, + dy = 1, + nodeSize = false; + + function cluster(root) { + var previousNode, + x = 0; + + // First walk, computing the initial x & y values. + root.eachAfter(function (node) { + var children = node.children; + if (children) { + node.x = meanX(children); + node.y = maxY(children); + } else { + node.x = previousNode ? x += separation(node, previousNode) : 0; + node.y = 0; + previousNode = node; + } + }); + + var left = leafLeft(root), + right = leafRight(root), + x0 = left.x - separation(left, right) / 2, + x1 = right.x + separation(right, left) / 2; + + // Second walk, normalizing x & y to the desired size. + return root.eachAfter(nodeSize ? function (node) { + node.x = (node.x - root.x) * dx; + node.y = (root.y - node.y) * dy; + } : function (node) { + node.x = (node.x - x0) / (x1 - x0) * dx; + node.y = (1 - (root.y ? node.y / root.y : 1)) * dy; + }); + } + + cluster.separation = function (x) { + return arguments.length ? (separation = x, cluster) : separation; + }; + + cluster.size = function (x) { + return arguments.length ? (nodeSize = false, dx = +x[0], dy = +x[1], cluster) : (nodeSize ? null : [dx, dy]); + }; + + cluster.nodeSize = function (x) { + return arguments.length ? (nodeSize = true, dx = +x[0], dy = +x[1], cluster) : (nodeSize ? [dx, dy] : null); + }; + + return cluster; + } + + function count(node) { + var sum = 0, + children = node.children, + i = children && children.length; + if (!i) + sum = 1; + else + while (--i >= 0) + sum += children[i].value; + node.value = sum; + } + + function node_count() { + return this.eachAfter(count); + } + + function node_each(callback) { + var node = this, current, next = [node], children, i, n; + do { + current = next.reverse(), next = []; + while (node = current.pop()) { + callback(node), children = node.children; + if (children) + for (i = 0, n = children.length; i < n; ++i) { + next.push(children[i]); + } + } + } while (next.length); + return this; + } + + function node_eachBefore(callback) { + var node = this, nodes = [node], children, i; + while (node = nodes.pop()) { + callback(node), children = node.children; + if (children) + for (i = children.length - 1; i >= 0; --i) { + nodes.push(children[i]); + } + } + return this; + } + + function node_eachAfter(callback) { + var node = this, nodes = [node], next = [], children, i, n; + while (node = nodes.pop()) { + next.push(node), children = node.children; + if (children) + for (i = 0, n = children.length; i < n; ++i) { + nodes.push(children[i]); + } + } + while (node = next.pop()) { + callback(node); + } + return this; + } + + function node_sum(value) { + return this.eachAfter(function (node) { + var sum = +value(node.data) || 0, + children = node.children, + i = children && children.length; + while (--i >= 0) + sum += children[i].value; + node.value = sum; + }); + } + + function node_sort(compare) { + return this.eachBefore(function (node) { + if (node.children) { + node.children.sort(compare); + } + }); + } + + function node_path(end) { + var start = this, + ancestor = leastCommonAncestor(start, end), + nodes = [start]; + while (start !== ancestor) { + start = start.parent; + nodes.push(start); + } + var k = nodes.length; + while (end !== ancestor) { + nodes.splice(k, 0, end); + end = end.parent; + } + return nodes; + } + + function leastCommonAncestor(a, b) { + if (a === b) + return a; + var aNodes = a.ancestors(), + bNodes = b.ancestors(), + c = null; + a = aNodes.pop(); + b = bNodes.pop(); + while (a === b) { + c = a; + a = aNodes.pop(); + b = bNodes.pop(); + } + return c; + } + + function node_ancestors() { + var node = this, nodes = [node]; + while (node = node.parent) { + nodes.push(node); + } + return nodes; + } + + function node_descendants() { + var nodes = []; + this.each(function (node) { + nodes.push(node); + }); + return nodes; + } + + function node_leaves() { + var leaves = []; + this.eachBefore(function (node) { + if (!node.children) { + leaves.push(node); + } + }); + return leaves; + } + + function node_links() { + var root = this, links = []; + root.each(function (node) { + if (node !== root) { // Don’t include the root’s parent, if any. + links.push({source: node.parent, target: node}); + } + }); + return links; + } + + function hierarchy(data, children) { + var root = new Node(data), + valued = +data.value && (root.value = data.value), + node, + nodes = [root], + child, + childs, + i, + n; + + if (children == null) + children = defaultChildren; + + while (node = nodes.pop()) { + if (valued) + node.value = +node.data.value; + if ((childs = children(node.data)) && (n = childs.length)) { + node.children = new Array(n); + for (i = n - 1; i >= 0; --i) { + nodes.push(child = node.children[i] = new Node(childs[i])); + child.parent = node; + child.depth = node.depth + 1; + } + } + } + + return root.eachBefore(computeHeight); + } + + function node_copy() { + return hierarchy(this).eachBefore(copyData); + } + + function defaultChildren(d) { + return d.children; + } + + function copyData(node) { + node.data = node.data.data; + } + + function computeHeight(node) { + var height = 0; + do + node.height = height; + while ((node = node.parent) && (node.height < ++height)); + } + + function Node(data) { + this.data = data; + this.depth = + this.height = 0; + this.parent = null; + } + + Node.prototype = hierarchy.prototype = { + constructor: Node, + count: node_count, + each: node_each, + eachAfter: node_eachAfter, + eachBefore: node_eachBefore, + sum: node_sum, + sort: node_sort, + path: node_path, + ancestors: node_ancestors, + descendants: node_descendants, + leaves: node_leaves, + links: node_links, + copy: node_copy + }; + + var slice$4 = Array.prototype.slice; + + function shuffle$1(array) { + var m = array.length, + t, + i; + + while (m) { + i = Math.random() * m-- | 0; + t = array[m]; + array[m] = array[i]; + array[i] = t; + } + + return array; + } + + function enclose(circles) { + var i = 0, n = (circles = shuffle$1(slice$4.call(circles))).length, B = [], p, e; + + while (i < n) { + p = circles[i]; + if (e && enclosesWeak(e, p)) + ++i; + else + e = encloseBasis(B = extendBasis(B, p)), i = 0; + } + + return e; + } + + function extendBasis(B, p) { + var i, j; + + if (enclosesWeakAll(p, B)) + return [p]; + + // If we get here then B must have at least one element. + for (i = 0; i < B.length; ++i) { + if (enclosesNot(p, B[i]) + && enclosesWeakAll(encloseBasis2(B[i], p), B)) { + return [B[i], p]; + } + } + + // If we get here then B must have at least two elements. + for (i = 0; i < B.length - 1; ++i) { + for (j = i + 1; j < B.length; ++j) { + if (enclosesNot(encloseBasis2(B[i], B[j]), p) + && enclosesNot(encloseBasis2(B[i], p), B[j]) + && enclosesNot(encloseBasis2(B[j], p), B[i]) + && enclosesWeakAll(encloseBasis3(B[i], B[j], p), B)) { + return [B[i], B[j], p]; + } + } + } + + // If we get here then something is very wrong. + throw new Error; + } + + function enclosesNot(a, b) { + var dr = a.r - b.r, dx = b.x - a.x, dy = b.y - a.y; + return dr < 0 || dr * dr < dx * dx + dy * dy; + } + + function enclosesWeak(a, b) { + var dr = a.r - b.r + 1e-6, dx = b.x - a.x, dy = b.y - a.y; + return dr > 0 && dr * dr > dx * dx + dy * dy; + } + + function enclosesWeakAll(a, B) { + for (var i = 0; i < B.length; ++i) { + if (!enclosesWeak(a, B[i])) { + return false; + } + } + return true; + } + + function encloseBasis(B) { + switch (B.length) { + case 1: + return encloseBasis1(B[0]); + case 2: + return encloseBasis2(B[0], B[1]); + case 3: + return encloseBasis3(B[0], B[1], B[2]); + } + } + + function encloseBasis1(a) { + return { + x: a.x, + y: a.y, + r: a.r + }; + } + + function encloseBasis2(a, b) { + var x1 = a.x, y1 = a.y, r1 = a.r, + x2 = b.x, y2 = b.y, r2 = b.r, + x21 = x2 - x1, y21 = y2 - y1, r21 = r2 - r1, + l = Math.sqrt(x21 * x21 + y21 * y21); + return { + x: (x1 + x2 + x21 / l * r21) / 2, + y: (y1 + y2 + y21 / l * r21) / 2, + r: (l + r1 + r2) / 2 + }; + } + + function encloseBasis3(a, b, c) { + var x1 = a.x, y1 = a.y, r1 = a.r, + x2 = b.x, y2 = b.y, r2 = b.r, + x3 = c.x, y3 = c.y, r3 = c.r, + a2 = x1 - x2, + a3 = x1 - x3, + b2 = y1 - y2, + b3 = y1 - y3, + c2 = r2 - r1, + c3 = r3 - r1, + d1 = x1 * x1 + y1 * y1 - r1 * r1, + d2 = d1 - x2 * x2 - y2 * y2 + r2 * r2, + d3 = d1 - x3 * x3 - y3 * y3 + r3 * r3, + ab = a3 * b2 - a2 * b3, + xa = (b2 * d3 - b3 * d2) / (ab * 2) - x1, + xb = (b3 * c2 - b2 * c3) / ab, + ya = (a3 * d2 - a2 * d3) / (ab * 2) - y1, + yb = (a2 * c3 - a3 * c2) / ab, + A = xb * xb + yb * yb - 1, + B = 2 * (r1 + xa * xb + ya * yb), + C = xa * xa + ya * ya - r1 * r1, + r = -(A ? (B + Math.sqrt(B * B - 4 * A * C)) / (2 * A) : C / B); + return { + x: x1 + xa + xb * r, + y: y1 + ya + yb * r, + r: r + }; + } + + function place(b, a, c) { + var dx = b.x - a.x, x, a2, + dy = b.y - a.y, y, b2, + d2 = dx * dx + dy * dy; + if (d2) { + a2 = a.r + c.r, a2 *= a2; + b2 = b.r + c.r, b2 *= b2; + if (a2 > b2) { + x = (d2 + b2 - a2) / (2 * d2); + y = Math.sqrt(Math.max(0, b2 / d2 - x * x)); + c.x = b.x - x * dx - y * dy; + c.y = b.y - x * dy + y * dx; + } else { + x = (d2 + a2 - b2) / (2 * d2); + y = Math.sqrt(Math.max(0, a2 / d2 - x * x)); + c.x = a.x + x * dx - y * dy; + c.y = a.y + x * dy + y * dx; + } + } else { + c.x = a.x + c.r; + c.y = a.y; + } + } + + function intersects(a, b) { + var dr = a.r + b.r - 1e-6, dx = b.x - a.x, dy = b.y - a.y; + return dr > 0 && dr * dr > dx * dx + dy * dy; + } + + function score(node) { + var a = node._, + b = node.next._, + ab = a.r + b.r, + dx = (a.x * b.r + b.x * a.r) / ab, + dy = (a.y * b.r + b.y * a.r) / ab; + return dx * dx + dy * dy; + } + + function Node$1(circle) { + this._ = circle; + this.next = null; + this.previous = null; + } + + function packEnclose(circles) { + if (!(n = circles.length)) + return 0; + + var a, b, c, n, aa, ca, i, j, k, sj, sk; + + // Place the first circle. + a = circles[0], a.x = 0, a.y = 0; + if (!(n > 1)) + return a.r; + + // Place the second circle. + b = circles[1], a.x = -b.r, b.x = a.r, b.y = 0; + if (!(n > 2)) + return a.r + b.r; + + // Place the third circle. + place(b, a, c = circles[2]); + + // Initialize the front-chain using the first three circles a, b and c. + a = new Node$1(a), b = new Node$1(b), c = new Node$1(c); + a.next = c.previous = b; + b.next = a.previous = c; + c.next = b.previous = a; + + // Attempt to place each remaining circle… + pack: for (i = 3; i < n; ++i) { + place(a._, b._, c = circles[i]), c = new Node$1(c); + + // Find the closest intersecting circle on the front-chain, if any. + // “Closeness” is determined by linear distance along the front-chain. + // “Ahead” or “behind” is likewise determined by linear distance. + j = b.next, k = a.previous, sj = b._.r, sk = a._.r; + do { + if (sj <= sk) { + if (intersects(j._, c._)) { + b = j, a.next = b, b.previous = a, --i; + continue pack; + } + sj += j._.r, j = j.next; + } else { + if (intersects(k._, c._)) { + a = k, a.next = b, b.previous = a, --i; + continue pack; + } + sk += k._.r, k = k.previous; + } + } while (j !== k.next); + + // Success! Insert the new circle c between a and b. + c.previous = a, c.next = b, a.next = b.previous = b = c; + + // Compute the new closest circle pair to the centroid. + aa = score(a); + while ((c = c.next) !== b) { + if ((ca = score(c)) < aa) { + a = c, aa = ca; + } + } + b = a.next; + } + + // Compute the enclosing circle of the front chain. + a = [b._], c = b; + while ((c = c.next) !== b) + a.push(c._); + c = enclose(a); + + // Translate the circles to put the enclosing circle around the origin. + for (i = 0; i < n; ++i) + a = circles[i], a.x -= c.x, a.y -= c.y; + + return c.r; + } + + function siblings(circles) { + packEnclose(circles); + return circles; + } + + function optional(f) { + return f == null ? null : required(f); + } + + function required(f) { + if (typeof f !== "function") + throw new Error; + return f; + } + + function constantZero() { + return 0; + } + + function constant$9(x) { + return function () { + return x; + }; + } + + function defaultRadius$1(d) { + return Math.sqrt(d.value); + } + + function index$2() { + var radius = null, + dx = 1, + dy = 1, + padding = constantZero; + + function pack(root) { + root.x = dx / 2, root.y = dy / 2; + if (radius) { + root.eachBefore(radiusLeaf(radius)) + .eachAfter(packChildren(padding, 0.5)) + .eachBefore(translateChild(1)); + } else { + root.eachBefore(radiusLeaf(defaultRadius$1)) + .eachAfter(packChildren(constantZero, 1)) + .eachAfter(packChildren(padding, root.r / Math.min(dx, dy))) + .eachBefore(translateChild(Math.min(dx, dy) / (2 * root.r))); + } + return root; + } + + pack.radius = function (x) { + return arguments.length ? (radius = optional(x), pack) : radius; + }; + + pack.size = function (x) { + return arguments.length ? (dx = +x[0], dy = +x[1], pack) : [dx, dy]; + }; + + pack.padding = function (x) { + return arguments.length ? (padding = typeof x === "function" ? x : constant$9(+x), pack) : padding; + }; + + return pack; + } + + function radiusLeaf(radius) { + return function (node) { + if (!node.children) { + node.r = Math.max(0, +radius(node) || 0); + } + }; + } + + function packChildren(padding, k) { + return function (node) { + if (children = node.children) { + var children, + i, + n = children.length, + r = padding(node) * k || 0, + e; + + if (r) + for (i = 0; i < n; ++i) + children[i].r += r; + e = packEnclose(children); + if (r) + for (i = 0; i < n; ++i) + children[i].r -= r; + node.r = e + r; + } + }; + } + + function translateChild(k) { + return function (node) { + var parent = node.parent; + node.r *= k; + if (parent) { + node.x = parent.x + k * node.x; + node.y = parent.y + k * node.y; + } + }; + } + + function roundNode(node) { + node.x0 = Math.round(node.x0); + node.y0 = Math.round(node.y0); + node.x1 = Math.round(node.x1); + node.y1 = Math.round(node.y1); + } + + function treemapDice(parent, x0, y0, x1, y1) { + var nodes = parent.children, + node, + i = -1, + n = nodes.length, + k = parent.value && (x1 - x0) / parent.value; + + while (++i < n) { + node = nodes[i], node.y0 = y0, node.y1 = y1; + node.x0 = x0, node.x1 = x0 += node.value * k; + } + } + + function partition() { + var dx = 1, + dy = 1, + padding = 0, + round = false; + + function partition(root) { + var n = root.height + 1; + root.x0 = + root.y0 = padding; + root.x1 = dx; + root.y1 = dy / n; + root.eachBefore(positionNode(dy, n)); + if (round) + root.eachBefore(roundNode); + return root; + } + + function positionNode(dy, n) { + return function (node) { + if (node.children) { + treemapDice(node, node.x0, dy * (node.depth + 1) / n, node.x1, dy * (node.depth + 2) / n); + } + var x0 = node.x0, + y0 = node.y0, + x1 = node.x1 - padding, + y1 = node.y1 - padding; + if (x1 < x0) + x0 = x1 = (x0 + x1) / 2; + if (y1 < y0) + y0 = y1 = (y0 + y1) / 2; + node.x0 = x0; + node.y0 = y0; + node.x1 = x1; + node.y1 = y1; + }; + } + + partition.round = function (x) { + return arguments.length ? (round = !!x, partition) : round; + }; + + partition.size = function (x) { + return arguments.length ? (dx = +x[0], dy = +x[1], partition) : [dx, dy]; + }; + + partition.padding = function (x) { + return arguments.length ? (padding = +x, partition) : padding; + }; + + return partition; + } + + var keyPrefix$1 = "$", // Protect against keys like “__proto__”. + preroot = {depth: -1}, + ambiguous = {}; + + function defaultId(d) { + return d.id; + } + + function defaultParentId(d) { + return d.parentId; + } + + function stratify() { + var id = defaultId, + parentId = defaultParentId; + + function stratify(data) { + var d, + i, + n = data.length, + root, + parent, + node, + nodes = new Array(n), + nodeId, + nodeKey, + nodeByKey = {}; + + for (i = 0; i < n; ++i) { + d = data[i], node = nodes[i] = new Node(d); + if ((nodeId = id(d, i, data)) != null && (nodeId += "")) { + nodeKey = keyPrefix$1 + (node.id = nodeId); + nodeByKey[nodeKey] = nodeKey in nodeByKey ? ambiguous : node; + } + } + + for (i = 0; i < n; ++i) { + node = nodes[i], nodeId = parentId(data[i], i, data); + if (nodeId == null || !(nodeId += "")) { + if (root) + throw new Error("multiple roots"); + root = node; + } else { + parent = nodeByKey[keyPrefix$1 + nodeId]; + if (!parent) + throw new Error("missing: " + nodeId); + if (parent === ambiguous) + throw new Error("ambiguous: " + nodeId); + if (parent.children) + parent.children.push(node); + else + parent.children = [node]; + node.parent = parent; + } + } + + if (!root) + throw new Error("no root"); + root.parent = preroot; + root.eachBefore(function (node) { + node.depth = node.parent.depth + 1; + --n; + }).eachBefore(computeHeight); + root.parent = null; + if (n > 0) + throw new Error("cycle"); + + return root; + } + + stratify.id = function (x) { + return arguments.length ? (id = required(x), stratify) : id; + }; + + stratify.parentId = function (x) { + return arguments.length ? (parentId = required(x), stratify) : parentId; + }; + + return stratify; + } + + function defaultSeparation$1(a, b) { + return a.parent === b.parent ? 1 : 2; + } + +// function radialSeparation(a, b) { +// return (a.parent === b.parent ? 1 : 2) / a.depth; +// } + +// This function is used to traverse the left contour of a subtree (or +// subforest). It returns the successor of v on this contour. This successor is +// either given by the leftmost child of v or by the thread of v. The function +// returns null if and only if v is on the highest level of its subtree. + function nextLeft(v) { + var children = v.children; + return children ? children[0] : v.t; + } + +// This function works analogously to nextLeft. + function nextRight(v) { + var children = v.children; + return children ? children[children.length - 1] : v.t; + } + +// Shifts the current subtree rooted at w+. This is done by increasing +// prelim(w+) and mod(w+) by shift. + function moveSubtree(wm, wp, shift) { + var change = shift / (wp.i - wm.i); + wp.c -= change; + wp.s += shift; + wm.c += change; + wp.z += shift; + wp.m += shift; + } + +// All other shifts, applied to the smaller subtrees between w- and w+, are +// performed by this function. To prepare the shifts, we have to adjust +// change(w+), shift(w+), and change(w-). + function executeShifts(v) { + var shift = 0, + change = 0, + children = v.children, + i = children.length, + w; + while (--i >= 0) { + w = children[i]; + w.z += shift; + w.m += shift; + shift += w.s + (change += w.c); + } + } + +// If vi-’s ancestor is a sibling of v, returns vi-’s ancestor. Otherwise, +// returns the specified (default) ancestor. + function nextAncestor(vim, v, ancestor) { + return vim.a.parent === v.parent ? vim.a : ancestor; + } + + function TreeNode(node, i) { + this._ = node; + this.parent = null; + this.children = null; + this.A = null; // default ancestor + this.a = this; // ancestor + this.z = 0; // prelim + this.m = 0; // mod + this.c = 0; // change + this.s = 0; // shift + this.t = null; // thread + this.i = i; // number + } + + TreeNode.prototype = Object.create(Node.prototype); + + function treeRoot(root) { + var tree = new TreeNode(root, 0), + node, + nodes = [tree], + child, + children, + i, + n; + + while (node = nodes.pop()) { + if (children = node._.children) { + node.children = new Array(n = children.length); + for (i = n - 1; i >= 0; --i) { + nodes.push(child = node.children[i] = new TreeNode(children[i], i)); + child.parent = node; + } + } + } + + (tree.parent = new TreeNode(null, 0)).children = [tree]; + return tree; + } + +// Node-link tree diagram using the Reingold-Tilford "tidy" algorithm + function tree() { + var separation = defaultSeparation$1, + dx = 1, + dy = 1, + nodeSize = null; + + function tree(root) { + var t = treeRoot(root); + + // Compute the layout using Buchheim et al.’s algorithm. + t.eachAfter(firstWalk), t.parent.m = -t.z; + t.eachBefore(secondWalk); + + // If a fixed node size is specified, scale x and y. + if (nodeSize) + root.eachBefore(sizeNode); + + // If a fixed tree size is specified, scale x and y based on the extent. + // Compute the left-most, right-most, and depth-most nodes for extents. + else { + var left = root, + right = root, + bottom = root; + root.eachBefore(function (node) { + if (node.x < left.x) + left = node; + if (node.x > right.x) + right = node; + if (node.depth > bottom.depth) + bottom = node; + }); + var s = left === right ? 1 : separation(left, right) / 2, + tx = s - left.x, + kx = dx / (right.x + s + tx), + ky = dy / (bottom.depth || 1); + root.eachBefore(function (node) { + node.x = (node.x + tx) * kx; + node.y = node.depth * ky; + }); + } + + return root; + } + + // Computes a preliminary x-coordinate for v. Before that, FIRST WALK is + // applied recursively to the children of v, as well as the function + // APPORTION. After spacing out the children by calling EXECUTE SHIFTS, the + // node v is placed to the midpoint of its outermost children. + function firstWalk(v) { + var children = v.children, + siblings = v.parent.children, + w = v.i ? siblings[v.i - 1] : null; + if (children) { + executeShifts(v); + var midpoint = (children[0].z + children[children.length - 1].z) / 2; + if (w) { + v.z = w.z + separation(v._, w._); + v.m = v.z - midpoint; + } else { + v.z = midpoint; + } + } else if (w) { + v.z = w.z + separation(v._, w._); + } + v.parent.A = apportion(v, w, v.parent.A || siblings[0]); + } + + // Computes all real x-coordinates by summing up the modifiers recursively. + function secondWalk(v) { + v._.x = v.z + v.parent.m; + v.m += v.parent.m; + } + + // The core of the algorithm. Here, a new subtree is combined with the + // previous subtrees. Threads are used to traverse the inside and outside + // contours of the left and right subtree up to the highest common level. The + // vertices used for the traversals are vi+, vi-, vo-, and vo+, where the + // superscript o means outside and i means inside, the subscript - means left + // subtree and + means right subtree. For summing up the modifiers along the + // contour, we use respective variables si+, si-, so-, and so+. Whenever two + // nodes of the inside contours conflict, we compute the left one of the + // greatest uncommon ancestors using the function ANCESTOR and call MOVE + // SUBTREE to shift the subtree and prepare the shifts of smaller subtrees. + // Finally, we add a new thread (if necessary). + function apportion(v, w, ancestor) { + if (w) { + var vip = v, + vop = v, + vim = w, + vom = vip.parent.children[0], + sip = vip.m, + sop = vop.m, + sim = vim.m, + som = vom.m, + shift; + while (vim = nextRight(vim), vip = nextLeft(vip), vim && vip) { + vom = nextLeft(vom); + vop = nextRight(vop); + vop.a = v; + shift = vim.z + sim - vip.z - sip + separation(vim._, vip._); + if (shift > 0) { + moveSubtree(nextAncestor(vim, v, ancestor), v, shift); + sip += shift; + sop += shift; + } + sim += vim.m; + sip += vip.m; + som += vom.m; + sop += vop.m; + } + if (vim && !nextRight(vop)) { + vop.t = vim; + vop.m += sim - sop; + } + if (vip && !nextLeft(vom)) { + vom.t = vip; + vom.m += sip - som; + ancestor = v; + } + } + return ancestor; + } + + function sizeNode(node) { + node.x *= dx; + node.y = node.depth * dy; + } + + tree.separation = function (x) { + return arguments.length ? (separation = x, tree) : separation; + }; + + tree.size = function (x) { + return arguments.length ? (nodeSize = false, dx = +x[0], dy = +x[1], tree) : (nodeSize ? null : [dx, dy]); + }; + + tree.nodeSize = function (x) { + return arguments.length ? (nodeSize = true, dx = +x[0], dy = +x[1], tree) : (nodeSize ? [dx, dy] : null); + }; + + return tree; + } + + function treemapSlice(parent, x0, y0, x1, y1) { + var nodes = parent.children, + node, + i = -1, + n = nodes.length, + k = parent.value && (y1 - y0) / parent.value; + + while (++i < n) { + node = nodes[i], node.x0 = x0, node.x1 = x1; + node.y0 = y0, node.y1 = y0 += node.value * k; + } + } + + var phi = (1 + Math.sqrt(5)) / 2; + + function squarifyRatio(ratio, parent, x0, y0, x1, y1) { + var rows = [], + nodes = parent.children, + row, + nodeValue, + i0 = 0, + i1 = 0, + n = nodes.length, + dx, dy, + value = parent.value, + sumValue, + minValue, + maxValue, + newRatio, + minRatio, + alpha, + beta; + + while (i0 < n) { + dx = x1 - x0, dy = y1 - y0; + + // Find the next non-empty node. + do + sumValue = nodes[i1++].value; + while (!sumValue && i1 < n); + minValue = maxValue = sumValue; + alpha = Math.max(dy / dx, dx / dy) / (value * ratio); + beta = sumValue * sumValue * alpha; + minRatio = Math.max(maxValue / beta, beta / minValue); + + // Keep adding nodes while the aspect ratio maintains or improves. + for (; i1 < n; ++i1) { + sumValue += nodeValue = nodes[i1].value; + if (nodeValue < minValue) + minValue = nodeValue; + if (nodeValue > maxValue) + maxValue = nodeValue; + beta = sumValue * sumValue * alpha; + newRatio = Math.max(maxValue / beta, beta / minValue); + if (newRatio > minRatio) { + sumValue -= nodeValue; + break; + } + minRatio = newRatio; + } + + // Position and record the row orientation. + rows.push(row = {value: sumValue, dice: dx < dy, children: nodes.slice(i0, i1)}); + if (row.dice) + treemapDice(row, x0, y0, x1, value ? y0 += dy * sumValue / value : y1); + else + treemapSlice(row, x0, y0, value ? x0 += dx * sumValue / value : x1, y1); + value -= sumValue, i0 = i1; + } + + return rows; + } + + var squarify = (function custom(ratio) { + + function squarify(parent, x0, y0, x1, y1) { + squarifyRatio(ratio, parent, x0, y0, x1, y1); + } + + squarify.ratio = function (x) { + return custom((x = +x) > 1 ? x : 1); + }; + + return squarify; + })(phi); + + function index$3() { + var tile = squarify, + round = false, + dx = 1, + dy = 1, + paddingStack = [0], + paddingInner = constantZero, + paddingTop = constantZero, + paddingRight = constantZero, + paddingBottom = constantZero, + paddingLeft = constantZero; + + function treemap(root) { + root.x0 = + root.y0 = 0; + root.x1 = dx; + root.y1 = dy; + root.eachBefore(positionNode); + paddingStack = [0]; + if (round) + root.eachBefore(roundNode); + return root; + } + + function positionNode(node) { + var p = paddingStack[node.depth], + x0 = node.x0 + p, + y0 = node.y0 + p, + x1 = node.x1 - p, + y1 = node.y1 - p; + if (x1 < x0) + x0 = x1 = (x0 + x1) / 2; + if (y1 < y0) + y0 = y1 = (y0 + y1) / 2; + node.x0 = x0; + node.y0 = y0; + node.x1 = x1; + node.y1 = y1; + if (node.children) { + p = paddingStack[node.depth + 1] = paddingInner(node) / 2; + x0 += paddingLeft(node) - p; + y0 += paddingTop(node) - p; + x1 -= paddingRight(node) - p; + y1 -= paddingBottom(node) - p; + if (x1 < x0) + x0 = x1 = (x0 + x1) / 2; + if (y1 < y0) + y0 = y1 = (y0 + y1) / 2; + tile(node, x0, y0, x1, y1); + } + } + + treemap.round = function (x) { + return arguments.length ? (round = !!x, treemap) : round; + }; + + treemap.size = function (x) { + return arguments.length ? (dx = +x[0], dy = +x[1], treemap) : [dx, dy]; + }; + + treemap.tile = function (x) { + return arguments.length ? (tile = required(x), treemap) : tile; + }; + + treemap.padding = function (x) { + return arguments.length ? treemap.paddingInner(x).paddingOuter(x) : treemap.paddingInner(); + }; + + treemap.paddingInner = function (x) { + return arguments.length ? (paddingInner = typeof x === "function" ? x : constant$9(+x), treemap) : paddingInner; + }; + + treemap.paddingOuter = function (x) { + return arguments.length ? treemap.paddingTop(x).paddingRight(x).paddingBottom(x).paddingLeft(x) : treemap.paddingTop(); + }; + + treemap.paddingTop = function (x) { + return arguments.length ? (paddingTop = typeof x === "function" ? x : constant$9(+x), treemap) : paddingTop; + }; + + treemap.paddingRight = function (x) { + return arguments.length ? (paddingRight = typeof x === "function" ? x : constant$9(+x), treemap) : paddingRight; + }; + + treemap.paddingBottom = function (x) { + return arguments.length ? (paddingBottom = typeof x === "function" ? x : constant$9(+x), treemap) : paddingBottom; + }; + + treemap.paddingLeft = function (x) { + return arguments.length ? (paddingLeft = typeof x === "function" ? x : constant$9(+x), treemap) : paddingLeft; + }; + + return treemap; + } + + function binary(parent, x0, y0, x1, y1) { + var nodes = parent.children, + i, n = nodes.length, + sum, sums = new Array(n + 1); + + for (sums[0] = sum = i = 0; i < n; ++i) { + sums[i + 1] = sum += nodes[i].value; + } + + partition(0, n, parent.value, x0, y0, x1, y1); + + function partition(i, j, value, x0, y0, x1, y1) { + if (i >= j - 1) { + var node = nodes[i]; + node.x0 = x0, node.y0 = y0; + node.x1 = x1, node.y1 = y1; + return; + } + + var valueOffset = sums[i], + valueTarget = (value / 2) + valueOffset, + k = i + 1, + hi = j - 1; + + while (k < hi) { + var mid = k + hi >>> 1; + if (sums[mid] < valueTarget) + k = mid + 1; + else + hi = mid; + } + + if ((valueTarget - sums[k - 1]) < (sums[k] - valueTarget) && i + 1 < k) + --k; + + var valueLeft = sums[k] - valueOffset, + valueRight = value - valueLeft; + + if ((x1 - x0) > (y1 - y0)) { + var xk = (x0 * valueRight + x1 * valueLeft) / value; + partition(i, k, valueLeft, x0, y0, xk, y1); + partition(k, j, valueRight, xk, y0, x1, y1); + } else { + var yk = (y0 * valueRight + y1 * valueLeft) / value; + partition(i, k, valueLeft, x0, y0, x1, yk); + partition(k, j, valueRight, x0, yk, x1, y1); + } + } + } + + function sliceDice(parent, x0, y0, x1, y1) { + (parent.depth & 1 ? treemapSlice : treemapDice)(parent, x0, y0, x1, y1); + } + + var resquarify = (function custom(ratio) { + + function resquarify(parent, x0, y0, x1, y1) { + if ((rows = parent._squarify) && (rows.ratio === ratio)) { + var rows, + row, + nodes, + i, + j = -1, + n, + m = rows.length, + value = parent.value; + + while (++j < m) { + row = rows[j], nodes = row.children; + for (i = row.value = 0, n = nodes.length; i < n; ++i) + row.value += nodes[i].value; + if (row.dice) + treemapDice(row, x0, y0, x1, y0 += (y1 - y0) * row.value / value); + else + treemapSlice(row, x0, y0, x0 += (x1 - x0) * row.value / value, y1); + value -= row.value; + } + } else { + parent._squarify = rows = squarifyRatio(ratio, parent, x0, y0, x1, y1); + rows.ratio = ratio; + } + } + + resquarify.ratio = function (x) { + return custom((x = +x) > 1 ? x : 1); + }; + + return resquarify; + })(phi); + + function area$2(polygon) { + var i = -1, + n = polygon.length, + a, + b = polygon[n - 1], + area = 0; + + while (++i < n) { + a = b; + b = polygon[i]; + area += a[1] * b[0] - a[0] * b[1]; + } + + return area / 2; + } + + function centroid$1(polygon) { + var i = -1, + n = polygon.length, + x = 0, + y = 0, + a, + b = polygon[n - 1], + c, + k = 0; + + while (++i < n) { + a = b; + b = polygon[i]; + k += c = a[0] * b[1] - b[0] * a[1]; + x += (a[0] + b[0]) * c; + y += (a[1] + b[1]) * c; + } + + return k *= 3, [x / k, y / k]; + } + +// Returns the 2D cross product of AB and AC vectors, i.e., the z-component of +// the 3D cross product in a quadrant I Cartesian coordinate system (+x is +// right, +y is up). Returns a positive value if ABC is counter-clockwise, +// negative if clockwise, and zero if the points are collinear. + function cross$1(a, b, c) { + return (b[0] - a[0]) * (c[1] - a[1]) - (b[1] - a[1]) * (c[0] - a[0]); + } + + function lexicographicOrder(a, b) { + return a[0] - b[0] || a[1] - b[1]; + } + +// Computes the upper convex hull per the monotone chain algorithm. +// Assumes points.length >= 3, is sorted by x, unique in y. +// Returns an array of indices into points in left-to-right order. + function computeUpperHullIndexes(points) { + var n = points.length, + indexes = [0, 1], + size = 2; + + for (var i = 2; i < n; ++i) { + while (size > 1 && cross$1(points[indexes[size - 2]], points[indexes[size - 1]], points[i]) <= 0) + --size; + indexes[size++] = i; + } + + return indexes.slice(0, size); // remove popped points + } + + function hull(points) { + if ((n = points.length) < 3) + return null; + + var i, + n, + sortedPoints = new Array(n), + flippedPoints = new Array(n); + + for (i = 0; i < n; ++i) + sortedPoints[i] = [+points[i][0], +points[i][1], i]; + sortedPoints.sort(lexicographicOrder); + for (i = 0; i < n; ++i) + flippedPoints[i] = [sortedPoints[i][0], -sortedPoints[i][1]]; + + var upperIndexes = computeUpperHullIndexes(sortedPoints), + lowerIndexes = computeUpperHullIndexes(flippedPoints); + + // Construct the hull polygon, removing possible duplicate endpoints. + var skipLeft = lowerIndexes[0] === upperIndexes[0], + skipRight = lowerIndexes[lowerIndexes.length - 1] === upperIndexes[upperIndexes.length - 1], + hull = []; + + // Add upper hull in right-to-l order. + // Then add lower hull in left-to-right order. + for (i = upperIndexes.length - 1; i >= 0; --i) + hull.push(points[sortedPoints[upperIndexes[i]][2]]); + for (i = + skipLeft; i < lowerIndexes.length - skipRight; ++i) + hull.push(points[sortedPoints[lowerIndexes[i]][2]]); + + return hull; + } + + function contains$2(polygon, point) { + var n = polygon.length, + p = polygon[n - 1], + x = point[0], y = point[1], + x0 = p[0], y0 = p[1], + x1, y1, + inside = false; + + for (var i = 0; i < n; ++i) { + p = polygon[i], x1 = p[0], y1 = p[1]; + if (((y1 > y) !== (y0 > y)) && (x < (x0 - x1) * (y - y1) / (y0 - y1) + x1)) + inside = !inside; + x0 = x1, y0 = y1; + } + + return inside; + } + + function length$2(polygon) { + var i = -1, + n = polygon.length, + b = polygon[n - 1], + xa, + ya, + xb = b[0], + yb = b[1], + perimeter = 0; + + while (++i < n) { + xa = xb; + ya = yb; + b = polygon[i]; + xb = b[0]; + yb = b[1]; + xa -= xb; + ya -= yb; + perimeter += Math.sqrt(xa * xa + ya * ya); + } + + return perimeter; + } + + function defaultSource$1() { + return Math.random(); + } + + var uniform = (function sourceRandomUniform(source) { + function randomUniform(min, max) { + min = min == null ? 0 : +min; + max = max == null ? 1 : +max; + if (arguments.length === 1) + max = min, min = 0; + else + max -= min; + return function () { + return source() * max + min; + }; + } + + randomUniform.source = sourceRandomUniform; + + return randomUniform; + })(defaultSource$1); + + var normal = (function sourceRandomNormal(source) { + function randomNormal(mu, sigma) { + var x, r; + mu = mu == null ? 0 : +mu; + sigma = sigma == null ? 1 : +sigma; + return function () { + var y; + + // If available, use the second previously-generated uniform random. + if (x != null) + y = x, x = null; + + // Otherwise, generate a new x and y. + else + do { + x = source() * 2 - 1; + y = source() * 2 - 1; + r = x * x + y * y; + } while (!r || r > 1); + + return mu + sigma * y * Math.sqrt(-2 * Math.log(r) / r); + }; + } + + randomNormal.source = sourceRandomNormal; + + return randomNormal; + })(defaultSource$1); + + var logNormal = (function sourceRandomLogNormal(source) { + function randomLogNormal() { + var randomNormal = normal.source(source).apply(this, arguments); + return function () { + return Math.exp(randomNormal()); + }; + } + + randomLogNormal.source = sourceRandomLogNormal; + + return randomLogNormal; + })(defaultSource$1); + + var irwinHall = (function sourceRandomIrwinHall(source) { + function randomIrwinHall(n) { + return function () { + for (var sum = 0, i = 0; i < n; ++i) + sum += source(); + return sum; + }; + } + + randomIrwinHall.source = sourceRandomIrwinHall; + + return randomIrwinHall; + })(defaultSource$1); + + var bates = (function sourceRandomBates(source) { + function randomBates(n) { + var randomIrwinHall = irwinHall.source(source)(n); + return function () { + return randomIrwinHall() / n; + }; + } + + randomBates.source = sourceRandomBates; + + return randomBates; + })(defaultSource$1); + + var exponential$1 = (function sourceRandomExponential(source) { + function randomExponential(lambda) { + return function () { + return -Math.log(1 - source()) / lambda; + }; + } + + randomExponential.source = sourceRandomExponential; + + return randomExponential; + })(defaultSource$1); + + function initRange(domain, range) { + switch (arguments.length) { + case 0: + break; + case 1: + this.range(domain); + break; + default: + this.range(range).domain(domain); + break; + } + return this; + } + + function initInterpolator(domain, interpolator) { + switch (arguments.length) { + case 0: + break; + case 1: + this.interpolator(domain); + break; + default: + this.interpolator(interpolator).domain(domain); + break; + } + return this; + } + + var array$3 = Array.prototype; + + var map$3 = array$3.map; + var slice$5 = array$3.slice; + + var implicit = {name: "implicit"}; + + function ordinal() { + var index = map$1(), + domain = [], + range = [], + unknown = implicit; + + function scale(d) { + var key = d + "", i = index.get(key); + if (!i) { + if (unknown !== implicit) + return unknown; + index.set(key, i = domain.push(d)); + } + return range[(i - 1) % range.length]; + } + + scale.domain = function (_) { + if (!arguments.length) + return domain.slice(); + domain = [], index = map$1(); + var i = -1, n = _.length, d, key; + while (++i < n) + if (!index.has(key = (d = _[i]) + "")) + index.set(key, domain.push(d)); + return scale; + }; + + scale.range = function (_) { + return arguments.length ? (range = slice$5.call(_), scale) : range.slice(); + }; + + scale.unknown = function (_) { + return arguments.length ? (unknown = _, scale) : unknown; + }; + + scale.copy = function () { + return ordinal(domain, range).unknown(unknown); + }; + + initRange.apply(scale, arguments); + + return scale; + } + + function band() { + var scale = ordinal().unknown(undefined), + domain = scale.domain, + ordinalRange = scale.range, + range = [0, 1], + step, + bandwidth, + round = false, + paddingInner = 0, + paddingOuter = 0, + align = 0.5; + + delete scale.unknown; + + function rescale() { + var n = domain().length, + reverse = range[1] < range[0], + start = range[reverse - 0], + stop = range[1 - reverse]; + step = (stop - start) / Math.max(1, n - paddingInner + paddingOuter * 2); + if (round) + step = Math.floor(step); + start += (stop - start - step * (n - paddingInner)) * align; + bandwidth = step * (1 - paddingInner); + if (round) + start = Math.round(start), bandwidth = Math.round(bandwidth); + var values = sequence(n).map(function (i) { + return start + step * i; + }); + return ordinalRange(reverse ? values.reverse() : values); + } + + scale.domain = function (_) { + return arguments.length ? (domain(_), rescale()) : domain(); + }; + + scale.range = function (_) { + return arguments.length ? (range = [+_[0], +_[1]], rescale()) : range.slice(); + }; + + scale.rangeRound = function (_) { + return range = [+_[0], +_[1]], round = true, rescale(); + }; + + scale.bandwidth = function () { + return bandwidth; + }; + + scale.step = function () { + return step; + }; + + scale.round = function (_) { + return arguments.length ? (round = !!_, rescale()) : round; + }; + + scale.padding = function (_) { + return arguments.length ? (paddingInner = Math.min(1, paddingOuter = +_), rescale()) : paddingInner; + }; + + scale.paddingInner = function (_) { + return arguments.length ? (paddingInner = Math.min(1, _), rescale()) : paddingInner; + }; + + scale.paddingOuter = function (_) { + return arguments.length ? (paddingOuter = +_, rescale()) : paddingOuter; + }; + + scale.align = function (_) { + return arguments.length ? (align = Math.max(0, Math.min(1, _)), rescale()) : align; + }; + + scale.copy = function () { + return band(domain(), range) + .round(round) + .paddingInner(paddingInner) + .paddingOuter(paddingOuter) + .align(align); + }; + + return initRange.apply(rescale(), arguments); + } + + function pointish(scale) { + var copy = scale.copy; + + scale.padding = scale.paddingOuter; + delete scale.paddingInner; + delete scale.paddingOuter; + + scale.copy = function () { + return pointish(copy()); + }; + + return scale; + } + + function point$1() { + return pointish(band.apply(null, arguments).paddingInner(1)); + } + + function constant$a(x) { + return function () { + return x; + }; + } + + function number$2(x) { + return +x; + } + + var unit = [0, 1]; + + function identity$6(x) { + return x; + } + + function normalize(a, b) { + return (b -= (a = +a)) + ? function (x) { + return (x - a) / b; + } + : constant$a(isNaN(b) ? NaN : 0.5); + } + + function clamper(domain) { + var a = domain[0], b = domain[domain.length - 1], t; + if (a > b) + t = a, a = b, b = t; + return function (x) { + return Math.max(a, Math.min(b, x)); + }; + } + +// normalize(a, b)(x) takes a domain value x in [a,b] and returns the corresponding parameter t in [0,1]. +// interpolate(a, b)(t) takes a parameter t in [0,1] and returns the corresponding range value x in [a,b]. + function bimap(domain, range, interpolate) { + var d0 = domain[0], d1 = domain[1], r0 = range[0], r1 = range[1]; + if (d1 < d0) + d0 = normalize(d1, d0), r0 = interpolate(r1, r0); + else + d0 = normalize(d0, d1), r0 = interpolate(r0, r1); + return function (x) { + return r0(d0(x)); + }; + } + + function polymap(domain, range, interpolate) { + var j = Math.min(domain.length, range.length) - 1, + d = new Array(j), + r = new Array(j), + i = -1; + + // Reverse descending domains. + if (domain[j] < domain[0]) { + domain = domain.slice().reverse(); + range = range.slice().reverse(); + } + + while (++i < j) { + d[i] = normalize(domain[i], domain[i + 1]); + r[i] = interpolate(range[i], range[i + 1]); + } + + return function (x) { + var i = bisectRight(domain, x, 1, j) - 1; + return r[i](d[i](x)); + }; + } + + function copy(source, target) { + return target + .domain(source.domain()) + .range(source.range()) + .interpolate(source.interpolate()) + .clamp(source.clamp()) + .unknown(source.unknown()); + } + + function transformer$1() { + var domain = unit, + range = unit, + interpolate = interpolateValue, + transform, + untransform, + unknown, + clamp = identity$6, + piecewise, + output, + input; + + function rescale() { + piecewise = Math.min(domain.length, range.length) > 2 ? polymap : bimap; + output = input = null; + return scale; + } + + function scale(x) { + return isNaN(x = +x) ? unknown : (output || (output = piecewise(domain.map(transform), range, interpolate)))(transform(clamp(x))); + } + + scale.invert = function (y) { + return clamp(untransform((input || (input = piecewise(range, domain.map(transform), interpolateNumber)))(y))); + }; + + scale.domain = function (_) { + return arguments.length ? (domain = map$3.call(_, number$2), clamp === identity$6 || (clamp = clamper(domain)), rescale()) : domain.slice(); + }; + + scale.range = function (_) { + return arguments.length ? (range = slice$5.call(_), rescale()) : range.slice(); + }; + + scale.rangeRound = function (_) { + return range = slice$5.call(_), interpolate = interpolateRound, rescale(); + }; + + scale.clamp = function (_) { + return arguments.length ? (clamp = _ ? clamper(domain) : identity$6, scale) : clamp !== identity$6; + }; + + scale.interpolate = function (_) { + return arguments.length ? (interpolate = _, rescale()) : interpolate; + }; + + scale.unknown = function (_) { + return arguments.length ? (unknown = _, scale) : unknown; + }; + + return function (t, u) { + transform = t, untransform = u; + return rescale(); + }; + } + + function continuous(transform, untransform) { + return transformer$1()(transform, untransform); + } + + function tickFormat(start, stop, count, specifier) { + var step = tickStep(start, stop, count), + precision; + specifier = formatSpecifier(specifier == null ? ",f" : specifier); + switch (specifier.type) { + case "s": + { + var value = Math.max(Math.abs(start), Math.abs(stop)); + if (specifier.precision == null && !isNaN(precision = precisionPrefix(step, value))) + specifier.precision = precision; + return exports.formatPrefix(specifier, value); + } + case "": + case "e": + case "g": + case "p": + case "r": + { + if (specifier.precision == null && !isNaN(precision = precisionRound(step, Math.max(Math.abs(start), Math.abs(stop))))) + specifier.precision = precision - (specifier.type === "e"); + break; + } + case "f": + case "%": + { + if (specifier.precision == null && !isNaN(precision = precisionFixed(step))) + specifier.precision = precision - (specifier.type === "%") * 2; + break; + } + } + return exports.format(specifier); + } + + function linearish(scale) { + var domain = scale.domain; + + scale.ticks = function (count) { + var d = domain(); + return ticks(d[0], d[d.length - 1], count == null ? 10 : count); + }; + + scale.tickFormat = function (count, specifier) { + var d = domain(); + return tickFormat(d[0], d[d.length - 1], count == null ? 10 : count, specifier); + }; + + scale.nice = function (count) { + if (count == null) + count = 10; + + var d = domain(), + i0 = 0, + i1 = d.length - 1, + start = d[i0], + stop = d[i1], + step; + + if (stop < start) { + step = start, start = stop, stop = step; + step = i0, i0 = i1, i1 = step; + } + + step = tickIncrement(start, stop, count); + + if (step > 0) { + start = Math.floor(start / step) * step; + stop = Math.ceil(stop / step) * step; + step = tickIncrement(start, stop, count); + } else if (step < 0) { + start = Math.ceil(start * step) / step; + stop = Math.floor(stop * step) / step; + step = tickIncrement(start, stop, count); + } + + if (step > 0) { + d[i0] = Math.floor(start / step) * step; + d[i1] = Math.ceil(stop / step) * step; + domain(d); + } else if (step < 0) { + d[i0] = Math.ceil(start * step) / step; + d[i1] = Math.floor(stop * step) / step; + domain(d); + } + + return scale; + }; + + return scale; + } + + function linear$2() { + var scale = continuous(identity$6, identity$6); + + scale.copy = function () { + return copy(scale, linear$2()); + }; + + initRange.apply(scale, arguments); + + return linearish(scale); + } + + function identity$7(domain) { + var unknown; + + function scale(x) { + return isNaN(x = +x) ? unknown : x; + } + + scale.invert = scale; + + scale.domain = scale.range = function (_) { + return arguments.length ? (domain = map$3.call(_, number$2), scale) : domain.slice(); + }; + + scale.unknown = function (_) { + return arguments.length ? (unknown = _, scale) : unknown; + }; + + scale.copy = function () { + return identity$7(domain).unknown(unknown); + }; + + domain = arguments.length ? map$3.call(domain, number$2) : [0, 1]; + + return linearish(scale); + } + + function nice(domain, interval) { + domain = domain.slice(); + + var i0 = 0, + i1 = domain.length - 1, + x0 = domain[i0], + x1 = domain[i1], + t; + + if (x1 < x0) { + t = i0, i0 = i1, i1 = t; + t = x0, x0 = x1, x1 = t; + } + + domain[i0] = interval.floor(x0); + domain[i1] = interval.ceil(x1); + return domain; + } + + function transformLog(x) { + return Math.log(x); + } + + function transformExp(x) { + return Math.exp(x); + } + + function transformLogn(x) { + return -Math.log(-x); + } + + function transformExpn(x) { + return -Math.exp(-x); + } + + function pow10(x) { + return isFinite(x) ? +("1e" + x) : x < 0 ? 0 : x; + } + + function powp(base) { + return base === 10 ? pow10 + : base === Math.E ? Math.exp + : function (x) { + return Math.pow(base, x); + }; + } + + function logp(base) { + return base === Math.E ? Math.log + : base === 10 && Math.log10 + || base === 2 && Math.log2 + || (base = Math.log(base), function (x) { + return Math.log(x) / base; + }); + } + + function reflect(f) { + return function (x) { + return -f(-x); + }; + } + + function loggish(transform) { + var scale = transform(transformLog, transformExp), + domain = scale.domain, + base = 10, + logs, + pows; + + function rescale() { + logs = logp(base), pows = powp(base); + if (domain()[0] < 0) { + logs = reflect(logs), pows = reflect(pows); + transform(transformLogn, transformExpn); + } else { + transform(transformLog, transformExp); + } + return scale; + } + + scale.base = function (_) { + return arguments.length ? (base = +_, rescale()) : base; + }; + + scale.domain = function (_) { + return arguments.length ? (domain(_), rescale()) : domain(); + }; + + scale.ticks = function (count) { + var d = domain(), + u = d[0], + v = d[d.length - 1], + r; + + if (r = v < u) + i = u, u = v, v = i; + + var i = logs(u), + j = logs(v), + p, + k, + t, + n = count == null ? 10 : +count, + z = []; + + if (!(base % 1) && j - i < n) { + i = Math.round(i) - 1, j = Math.round(j) + 1; + if (u > 0) + for (; i < j; ++i) { + for (k = 1, p = pows(i); k < base; ++k) { + t = p * k; + if (t < u) + continue; + if (t > v) + break; + z.push(t); + } + } + else + for (; i < j; ++i) { + for (k = base - 1, p = pows(i); k >= 1; --k) { + t = p * k; + if (t < u) + continue; + if (t > v) + break; + z.push(t); + } + } + } else { + z = ticks(i, j, Math.min(j - i, n)).map(pows); + } + + return r ? z.reverse() : z; + }; + + scale.tickFormat = function (count, specifier) { + if (specifier == null) + specifier = base === 10 ? ".0e" : ","; + if (typeof specifier !== "function") + specifier = exports.format(specifier); + if (count === Infinity) + return specifier; + if (count == null) + count = 10; + var k = Math.max(1, base * count / scale.ticks().length); // TODO fast estimate? + return function (d) { + var i = d / pows(Math.round(logs(d))); + if (i * base < base - 0.5) + i *= base; + return i <= k ? specifier(d) : ""; + }; + }; + + scale.nice = function () { + return domain(nice(domain(), { + floor: function (x) { + return pows(Math.floor(logs(x))); + }, + ceil: function (x) { + return pows(Math.ceil(logs(x))); + } + })); + }; + + return scale; + } + + function log$1() { + var scale = loggish(transformer$1()).domain([1, 10]); + + scale.copy = function () { + return copy(scale, log$1()).base(scale.base()); + }; + + initRange.apply(scale, arguments); + + return scale; + } + + function transformSymlog(c) { + return function (x) { + return Math.sign(x) * Math.log1p(Math.abs(x / c)); + }; + } + + function transformSymexp(c) { + return function (x) { + return Math.sign(x) * Math.expm1(Math.abs(x)) * c; + }; + } + + function symlogish(transform) { + var c = 1, scale = transform(transformSymlog(c), transformSymexp(c)); + + scale.constant = function (_) { + return arguments.length ? transform(transformSymlog(c = +_), transformSymexp(c)) : c; + }; + + return linearish(scale); + } + + function symlog() { + var scale = symlogish(transformer$1()); + + scale.copy = function () { + return copy(scale, symlog()).constant(scale.constant()); + }; + + return initRange.apply(scale, arguments); + } + + function transformPow(exponent) { + return function (x) { + return x < 0 ? -Math.pow(-x, exponent) : Math.pow(x, exponent); + }; + } + + function transformSqrt(x) { + return x < 0 ? -Math.sqrt(-x) : Math.sqrt(x); + } + + function transformSquare(x) { + return x < 0 ? -x * x : x * x; + } + + function powish(transform) { + var scale = transform(identity$6, identity$6), + exponent = 1; + + function rescale() { + return exponent === 1 ? transform(identity$6, identity$6) + : exponent === 0.5 ? transform(transformSqrt, transformSquare) + : transform(transformPow(exponent), transformPow(1 / exponent)); + } + + scale.exponent = function (_) { + return arguments.length ? (exponent = +_, rescale()) : exponent; + }; + + return linearish(scale); + } + + function pow$1() { + var scale = powish(transformer$1()); + + scale.copy = function () { + return copy(scale, pow$1()).exponent(scale.exponent()); + }; + + initRange.apply(scale, arguments); + + return scale; + } + + function sqrt$1() { + return pow$1.apply(null, arguments).exponent(0.5); + } + + function quantile() { + var domain = [], + range = [], + thresholds = [], + unknown; + + function rescale() { + var i = 0, n = Math.max(1, range.length); + thresholds = new Array(n - 1); + while (++i < n) + thresholds[i - 1] = threshold(domain, i / n); + return scale; + } + + function scale(x) { + return isNaN(x = +x) ? unknown : range[bisectRight(thresholds, x)]; + } + + scale.invertExtent = function (y) { + var i = range.indexOf(y); + return i < 0 ? [NaN, NaN] : [ + i > 0 ? thresholds[i - 1] : domain[0], + i < thresholds.length ? thresholds[i] : domain[domain.length - 1] + ]; + }; + + scale.domain = function (_) { + if (!arguments.length) + return domain.slice(); + domain = []; + for (var i = 0, n = _.length, d; i < n; ++i) + if (d = _[i], d != null && !isNaN(d = +d)) + domain.push(d); + domain.sort(ascending); + return rescale(); + }; + + scale.range = function (_) { + return arguments.length ? (range = slice$5.call(_), rescale()) : range.slice(); + }; + + scale.unknown = function (_) { + return arguments.length ? (unknown = _, scale) : unknown; + }; + + scale.quantiles = function () { + return thresholds.slice(); + }; + + scale.copy = function () { + return quantile() + .domain(domain) + .range(range) + .unknown(unknown); + }; + + return initRange.apply(scale, arguments); + } + + function quantize$1() { + var x0 = 0, + x1 = 1, + n = 1, + domain = [0.5], + range = [0, 1], + unknown; + + function scale(x) { + return x <= x ? range[bisectRight(domain, x, 0, n)] : unknown; + } + + function rescale() { + var i = -1; + domain = new Array(n); + while (++i < n) + domain[i] = ((i + 1) * x1 - (i - n) * x0) / (n + 1); + return scale; + } + + scale.domain = function (_) { + return arguments.length ? (x0 = +_[0], x1 = +_[1], rescale()) : [x0, x1]; + }; + + scale.range = function (_) { + return arguments.length ? (n = (range = slice$5.call(_)).length - 1, rescale()) : range.slice(); + }; + + scale.invertExtent = function (y) { + var i = range.indexOf(y); + return i < 0 ? [NaN, NaN] + : i < 1 ? [x0, domain[0]] + : i >= n ? [domain[n - 1], x1] + : [domain[i - 1], domain[i]]; + }; + + scale.unknown = function (_) { + return arguments.length ? (unknown = _, scale) : scale; + }; + + scale.thresholds = function () { + return domain.slice(); + }; + + scale.copy = function () { + return quantize$1() + .domain([x0, x1]) + .range(range) + .unknown(unknown); + }; + + return initRange.apply(linearish(scale), arguments); + } + + function threshold$1() { + var domain = [0.5], + range = [0, 1], + unknown, + n = 1; + + function scale(x) { + return x <= x ? range[bisectRight(domain, x, 0, n)] : unknown; + } + + scale.domain = function (_) { + return arguments.length ? (domain = slice$5.call(_), n = Math.min(domain.length, range.length - 1), scale) : domain.slice(); + }; + + scale.range = function (_) { + return arguments.length ? (range = slice$5.call(_), n = Math.min(domain.length, range.length - 1), scale) : range.slice(); + }; + + scale.invertExtent = function (y) { + var i = range.indexOf(y); + return [domain[i - 1], domain[i]]; + }; + + scale.unknown = function (_) { + return arguments.length ? (unknown = _, scale) : unknown; + }; + + scale.copy = function () { + return threshold$1() + .domain(domain) + .range(range) + .unknown(unknown); + }; + + return initRange.apply(scale, arguments); + } + + var t0$1 = new Date, + t1$1 = new Date; + + function newInterval(floori, offseti, count, field) { + + function interval(date) { + return floori(date = arguments.length === 0 ? new Date : new Date(+date)), date; + } + + interval.floor = function (date) { + return floori(date = new Date(+date)), date; + }; + + interval.ceil = function (date) { + return floori(date = new Date(date - 1)), offseti(date, 1), floori(date), date; + }; + + interval.round = function (date) { + var d0 = interval(date), + d1 = interval.ceil(date); + return date - d0 < d1 - date ? d0 : d1; + }; + + interval.offset = function (date, step) { + return offseti(date = new Date(+date), step == null ? 1 : Math.floor(step)), date; + }; + + interval.range = function (start, stop, step) { + var range = [], previous; + start = interval.ceil(start); + step = step == null ? 1 : Math.floor(step); + if (!(start < stop) || !(step > 0)) + return range; // also handles Invalid Date + do + range.push(previous = new Date(+start)), offseti(start, step), floori(start); + while (previous < start && start < stop); + return range; + }; + + interval.filter = function (test) { + return newInterval(function (date) { + if (date >= date) + while (floori(date), !test(date)) + date.setTime(date - 1); + }, function (date, step) { + if (date >= date) { + if (step < 0) + while (++step <= 0) { + while (offseti(date, -1), !test(date)) { + } // eslint-disable-line no-empty + } + else + while (--step >= 0) { + while (offseti(date, +1), !test(date)) { + } // eslint-disable-line no-empty + } + } + }); + }; + + if (count) { + interval.count = function (start, end) { + t0$1.setTime(+start), t1$1.setTime(+end); + floori(t0$1), floori(t1$1); + return Math.floor(count(t0$1, t1$1)); + }; + + interval.every = function (step) { + step = Math.floor(step); + return !isFinite(step) || !(step > 0) ? null + : !(step > 1) ? interval + : interval.filter(field + ? function (d) { + return field(d) % step === 0; + } + : function (d) { + return interval.count(0, d) % step === 0; + }); + }; + } + + return interval; + } + + var millisecond = newInterval(function () { + // noop + }, function (date, step) { + date.setTime(+date + step); + }, function (start, end) { + return end - start; + }); + +// An optimized implementation for this simple case. + millisecond.every = function (k) { + k = Math.floor(k); + if (!isFinite(k) || !(k > 0)) + return null; + if (!(k > 1)) + return millisecond; + return newInterval(function (date) { + date.setTime(Math.floor(date / k) * k); + }, function (date, step) { + date.setTime(+date + step * k); + }, function (start, end) { + return (end - start) / k; + }); + }; + var milliseconds = millisecond.range; + + var durationSecond = 1e3; + var durationMinute = 6e4; + var durationHour = 36e5; + var durationDay = 864e5; + var durationWeek = 6048e5; + + var second = newInterval(function (date) { + date.setTime(date - date.getMilliseconds()); + }, function (date, step) { + date.setTime(+date + step * durationSecond); + }, function (start, end) { + return (end - start) / durationSecond; + }, function (date) { + return date.getUTCSeconds(); + }); + var seconds = second.range; + + var minute = newInterval(function (date) { + date.setTime(date - date.getMilliseconds() - date.getSeconds() * durationSecond); + }, function (date, step) { + date.setTime(+date + step * durationMinute); + }, function (start, end) { + return (end - start) / durationMinute; + }, function (date) { + return date.getMinutes(); + }); + var minutes = minute.range; + + var hour = newInterval(function (date) { + date.setTime(date - date.getMilliseconds() - date.getSeconds() * durationSecond - date.getMinutes() * durationMinute); + }, function (date, step) { + date.setTime(+date + step * durationHour); + }, function (start, end) { + return (end - start) / durationHour; + }, function (date) { + return date.getHours(); + }); + var hours = hour.range; + + var day = newInterval(function (date) { + date.setHours(0, 0, 0, 0); + }, function (date, step) { + date.setDate(date.getDate() + step); + }, function (start, end) { + return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationDay; + }, function (date) { + return date.getDate() - 1; + }); + var days = day.range; + + function weekday(i) { + return newInterval(function (date) { + date.setDate(date.getDate() - (date.getDay() + 7 - i) % 7); + date.setHours(0, 0, 0, 0); + }, function (date, step) { + date.setDate(date.getDate() + step * 7); + }, function (start, end) { + return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationWeek; + }); + } + + var sunday = weekday(0); + var monday = weekday(1); + var tuesday = weekday(2); + var wednesday = weekday(3); + var thursday = weekday(4); + var friday = weekday(5); + var saturday = weekday(6); + + var sundays = sunday.range; + var mondays = monday.range; + var tuesdays = tuesday.range; + var wednesdays = wednesday.range; + var thursdays = thursday.range; + var fridays = friday.range; + var saturdays = saturday.range; + + var month = newInterval(function (date) { + date.setDate(1); + date.setHours(0, 0, 0, 0); + }, function (date, step) { + date.setMonth(date.getMonth() + step); + }, function (start, end) { + return end.getMonth() - start.getMonth() + (end.getFullYear() - start.getFullYear()) * 12; + }, function (date) { + return date.getMonth(); + }); + var months = month.range; + + var year = newInterval(function (date) { + date.setMonth(0, 1); + date.setHours(0, 0, 0, 0); + }, function (date, step) { + date.setFullYear(date.getFullYear() + step); + }, function (start, end) { + return end.getFullYear() - start.getFullYear(); + }, function (date) { + return date.getFullYear(); + }); + +// An optimized implementation for this simple case. + year.every = function (k) { + return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : newInterval(function (date) { + date.setFullYear(Math.floor(date.getFullYear() / k) * k); + date.setMonth(0, 1); + date.setHours(0, 0, 0, 0); + }, function (date, step) { + date.setFullYear(date.getFullYear() + step * k); + }); + }; + var years = year.range; + + var utcMinute = newInterval(function (date) { + date.setUTCSeconds(0, 0); + }, function (date, step) { + date.setTime(+date + step * durationMinute); + }, function (start, end) { + return (end - start) / durationMinute; + }, function (date) { + return date.getUTCMinutes(); + }); + var utcMinutes = utcMinute.range; + + var utcHour = newInterval(function (date) { + date.setUTCMinutes(0, 0, 0); + }, function (date, step) { + date.setTime(+date + step * durationHour); + }, function (start, end) { + return (end - start) / durationHour; + }, function (date) { + return date.getUTCHours(); + }); + var utcHours = utcHour.range; + + var utcDay = newInterval(function (date) { + date.setUTCHours(0, 0, 0, 0); + }, function (date, step) { + date.setUTCDate(date.getUTCDate() + step); + }, function (start, end) { + return (end - start) / durationDay; + }, function (date) { + return date.getUTCDate() - 1; + }); + var utcDays = utcDay.range; + + function utcWeekday(i) { + return newInterval(function (date) { + date.setUTCDate(date.getUTCDate() - (date.getUTCDay() + 7 - i) % 7); + date.setUTCHours(0, 0, 0, 0); + }, function (date, step) { + date.setUTCDate(date.getUTCDate() + step * 7); + }, function (start, end) { + return (end - start) / durationWeek; + }); + } + + var utcSunday = utcWeekday(0); + var utcMonday = utcWeekday(1); + var utcTuesday = utcWeekday(2); + var utcWednesday = utcWeekday(3); + var utcThursday = utcWeekday(4); + var utcFriday = utcWeekday(5); + var utcSaturday = utcWeekday(6); + + var utcSundays = utcSunday.range; + var utcMondays = utcMonday.range; + var utcTuesdays = utcTuesday.range; + var utcWednesdays = utcWednesday.range; + var utcThursdays = utcThursday.range; + var utcFridays = utcFriday.range; + var utcSaturdays = utcSaturday.range; + + var utcMonth = newInterval(function (date) { + date.setUTCDate(1); + date.setUTCHours(0, 0, 0, 0); + }, function (date, step) { + date.setUTCMonth(date.getUTCMonth() + step); + }, function (start, end) { + return end.getUTCMonth() - start.getUTCMonth() + (end.getUTCFullYear() - start.getUTCFullYear()) * 12; + }, function (date) { + return date.getUTCMonth(); + }); + var utcMonths = utcMonth.range; + + var utcYear = newInterval(function (date) { + date.setUTCMonth(0, 1); + date.setUTCHours(0, 0, 0, 0); + }, function (date, step) { + date.setUTCFullYear(date.getUTCFullYear() + step); + }, function (start, end) { + return end.getUTCFullYear() - start.getUTCFullYear(); + }, function (date) { + return date.getUTCFullYear(); + }); + +// An optimized implementation for this simple case. + utcYear.every = function (k) { + return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : newInterval(function (date) { + date.setUTCFullYear(Math.floor(date.getUTCFullYear() / k) * k); + date.setUTCMonth(0, 1); + date.setUTCHours(0, 0, 0, 0); + }, function (date, step) { + date.setUTCFullYear(date.getUTCFullYear() + step * k); + }); + }; + var utcYears = utcYear.range; + + function localDate(d) { + if (0 <= d.y && d.y < 100) { + var date = new Date(-1, d.m, d.d, d.H, d.M, d.S, d.L); + date.setFullYear(d.y); + return date; + } + return new Date(d.y, d.m, d.d, d.H, d.M, d.S, d.L); + } + + function utcDate(d) { + if (0 <= d.y && d.y < 100) { + var date = new Date(Date.UTC(-1, d.m, d.d, d.H, d.M, d.S, d.L)); + date.setUTCFullYear(d.y); + return date; + } + return new Date(Date.UTC(d.y, d.m, d.d, d.H, d.M, d.S, d.L)); + } + + function newDate(y, m, d) { + return {y: y, m: m, d: d, H: 0, M: 0, S: 0, L: 0}; + } + + function formatLocale$1(locale) { + var locale_dateTime = locale.dateTime, + locale_date = locale.date, + locale_time = locale.time, + locale_periods = locale.periods, + locale_weekdays = locale.days, + locale_shortWeekdays = locale.shortDays, + locale_months = locale.months, + locale_shortMonths = locale.shortMonths; + + var periodRe = formatRe(locale_periods), + periodLookup = formatLookup(locale_periods), + weekdayRe = formatRe(locale_weekdays), + weekdayLookup = formatLookup(locale_weekdays), + shortWeekdayRe = formatRe(locale_shortWeekdays), + shortWeekdayLookup = formatLookup(locale_shortWeekdays), + monthRe = formatRe(locale_months), + monthLookup = formatLookup(locale_months), + shortMonthRe = formatRe(locale_shortMonths), + shortMonthLookup = formatLookup(locale_shortMonths); + + var formats = { + "a": formatShortWeekday, + "A": formatWeekday, + "b": formatShortMonth, + "B": formatMonth, + "c": null, + "d": formatDayOfMonth, + "e": formatDayOfMonth, + "f": formatMicroseconds, + "H": formatHour24, + "I": formatHour12, + "j": formatDayOfYear, + "L": formatMilliseconds, + "m": formatMonthNumber, + "M": formatMinutes, + "p": formatPeriod, + "q": formatQuarter, + "Q": formatUnixTimestamp, + "s": formatUnixTimestampSeconds, + "S": formatSeconds, + "u": formatWeekdayNumberMonday, + "U": formatWeekNumberSunday, + "V": formatWeekNumberISO, + "w": formatWeekdayNumberSunday, + "W": formatWeekNumberMonday, + "x": null, + "X": null, + "y": formatYear$1, + "Y": formatFullYear, + "Z": formatZone, + "%": formatLiteralPercent + }; + + var utcFormats = { + "a": formatUTCShortWeekday, + "A": formatUTCWeekday, + "b": formatUTCShortMonth, + "B": formatUTCMonth, + "c": null, + "d": formatUTCDayOfMonth, + "e": formatUTCDayOfMonth, + "f": formatUTCMicroseconds, + "H": formatUTCHour24, + "I": formatUTCHour12, + "j": formatUTCDayOfYear, + "L": formatUTCMilliseconds, + "m": formatUTCMonthNumber, + "M": formatUTCMinutes, + "p": formatUTCPeriod, + "q": formatUTCQuarter, + "Q": formatUnixTimestamp, + "s": formatUnixTimestampSeconds, + "S": formatUTCSeconds, + "u": formatUTCWeekdayNumberMonday, + "U": formatUTCWeekNumberSunday, + "V": formatUTCWeekNumberISO, + "w": formatUTCWeekdayNumberSunday, + "W": formatUTCWeekNumberMonday, + "x": null, + "X": null, + "y": formatUTCYear, + "Y": formatUTCFullYear, + "Z": formatUTCZone, + "%": formatLiteralPercent + }; + + var parses = { + "a": parseShortWeekday, + "A": parseWeekday, + "b": parseShortMonth, + "B": parseMonth, + "c": parseLocaleDateTime, + "d": parseDayOfMonth, + "e": parseDayOfMonth, + "f": parseMicroseconds, + "H": parseHour24, + "I": parseHour24, + "j": parseDayOfYear, + "L": parseMilliseconds, + "m": parseMonthNumber, + "M": parseMinutes, + "p": parsePeriod, + "q": parseQuarter, + "Q": parseUnixTimestamp, + "s": parseUnixTimestampSeconds, + "S": parseSeconds, + "u": parseWeekdayNumberMonday, + "U": parseWeekNumberSunday, + "V": parseWeekNumberISO, + "w": parseWeekdayNumberSunday, + "W": parseWeekNumberMonday, + "x": parseLocaleDate, + "X": parseLocaleTime, + "y": parseYear, + "Y": parseFullYear, + "Z": parseZone, + "%": parseLiteralPercent + }; + + // These recursive directive definitions must be deferred. + formats.x = newFormat(locale_date, formats); + formats.X = newFormat(locale_time, formats); + formats.c = newFormat(locale_dateTime, formats); + utcFormats.x = newFormat(locale_date, utcFormats); + utcFormats.X = newFormat(locale_time, utcFormats); + utcFormats.c = newFormat(locale_dateTime, utcFormats); + + function newFormat(specifier, formats) { + return function (date) { + var string = [], + i = -1, + j = 0, + n = specifier.length, + c, + pad, + format; + + if (!(date instanceof Date)) + date = new Date(+date); + + while (++i < n) { + if (specifier.charCodeAt(i) === 37) { + string.push(specifier.slice(j, i)); + if ((pad = pads[c = specifier.charAt(++i)]) != null) + c = specifier.charAt(++i); + else + pad = c === "e" ? " " : "0"; + if (format = formats[c]) + c = format(date, pad); + string.push(c); + j = i + 1; + } + } + + string.push(specifier.slice(j, i)); + return string.join(""); + }; + } + + function newParse(specifier, Z) { + return function (string) { + var d = newDate(1900, undefined, 1), + i = parseSpecifier(d, specifier, string += "", 0), + week, day$1; + if (i != string.length) + return null; + + // If a UNIX timestamp is specified, return it. + if ("Q" in d) + return new Date(d.Q); + if ("s" in d) + return new Date(d.s * 1000 + ("L" in d ? d.L : 0)); + + // If this is utcParse, never use the local timezone. + if (Z && !("Z" in d)) + d.Z = 0; + + // The am-pm flag is 0 for AM, and 1 for PM. + if ("p" in d) + d.H = d.H % 12 + d.p * 12; + + // If the month was not specified, inherit from the quarter. + if (d.m === undefined) + d.m = "q" in d ? d.q : 0; + + // Convert day-of-week and week-of-year to day-of-year. + if ("V" in d) { + if (d.V < 1 || d.V > 53) + return null; + if (!("w" in d)) + d.w = 1; + if ("Z" in d) { + week = utcDate(newDate(d.y, 0, 1)), day$1 = week.getUTCDay(); + week = day$1 > 4 || day$1 === 0 ? utcMonday.ceil(week) : utcMonday(week); + week = utcDay.offset(week, (d.V - 1) * 7); + d.y = week.getUTCFullYear(); + d.m = week.getUTCMonth(); + d.d = week.getUTCDate() + (d.w + 6) % 7; + } else { + week = localDate(newDate(d.y, 0, 1)), day$1 = week.getDay(); + week = day$1 > 4 || day$1 === 0 ? monday.ceil(week) : monday(week); + week = day.offset(week, (d.V - 1) * 7); + d.y = week.getFullYear(); + d.m = week.getMonth(); + d.d = week.getDate() + (d.w + 6) % 7; + } + } else if ("W" in d || "U" in d) { + if (!("w" in d)) + d.w = "u" in d ? d.u % 7 : "W" in d ? 1 : 0; + day$1 = "Z" in d ? utcDate(newDate(d.y, 0, 1)).getUTCDay() : localDate(newDate(d.y, 0, 1)).getDay(); + d.m = 0; + d.d = "W" in d ? (d.w + 6) % 7 + d.W * 7 - (day$1 + 5) % 7 : d.w + d.U * 7 - (day$1 + 6) % 7; + } + + // If a time zone is specified, all fields are interpreted as UTC and then + // offset according to the specified time zone. + if ("Z" in d) { + d.H += d.Z / 100 | 0; + d.M += d.Z % 100; + return utcDate(d); + } + + // Otherwise, all fields are in local time. + return localDate(d); + }; + } + + function parseSpecifier(d, specifier, string, j) { + var i = 0, + n = specifier.length, + m = string.length, + c, + parse; + + while (i < n) { + if (j >= m) + return -1; + c = specifier.charCodeAt(i++); + if (c === 37) { + c = specifier.charAt(i++); + parse = parses[c in pads ? specifier.charAt(i++) : c]; + if (!parse || ((j = parse(d, string, j)) < 0)) + return -1; + } else if (c != string.charCodeAt(j++)) { + return -1; + } + } + + return j; + } + + function parsePeriod(d, string, i) { + var n = periodRe.exec(string.slice(i)); + return n ? (d.p = periodLookup[n[0].toLowerCase()], i + n[0].length) : -1; + } + + function parseShortWeekday(d, string, i) { + var n = shortWeekdayRe.exec(string.slice(i)); + return n ? (d.w = shortWeekdayLookup[n[0].toLowerCase()], i + n[0].length) : -1; + } + + function parseWeekday(d, string, i) { + var n = weekdayRe.exec(string.slice(i)); + return n ? (d.w = weekdayLookup[n[0].toLowerCase()], i + n[0].length) : -1; + } + + function parseShortMonth(d, string, i) { + var n = shortMonthRe.exec(string.slice(i)); + return n ? (d.m = shortMonthLookup[n[0].toLowerCase()], i + n[0].length) : -1; + } + + function parseMonth(d, string, i) { + var n = monthRe.exec(string.slice(i)); + return n ? (d.m = monthLookup[n[0].toLowerCase()], i + n[0].length) : -1; + } + + function parseLocaleDateTime(d, string, i) { + return parseSpecifier(d, locale_dateTime, string, i); + } + + function parseLocaleDate(d, string, i) { + return parseSpecifier(d, locale_date, string, i); + } + + function parseLocaleTime(d, string, i) { + return parseSpecifier(d, locale_time, string, i); + } + + function formatShortWeekday(d) { + return locale_shortWeekdays[d.getDay()]; + } + + function formatWeekday(d) { + return locale_weekdays[d.getDay()]; + } + + function formatShortMonth(d) { + return locale_shortMonths[d.getMonth()]; + } + + function formatMonth(d) { + return locale_months[d.getMonth()]; + } + + function formatPeriod(d) { + return locale_periods[+(d.getHours() >= 12)]; + } + + function formatQuarter(d) { + return 1 + ~~(d.getMonth() / 3); + } + + function formatUTCShortWeekday(d) { + return locale_shortWeekdays[d.getUTCDay()]; + } + + function formatUTCWeekday(d) { + return locale_weekdays[d.getUTCDay()]; + } + + function formatUTCShortMonth(d) { + return locale_shortMonths[d.getUTCMonth()]; + } + + function formatUTCMonth(d) { + return locale_months[d.getUTCMonth()]; + } + + function formatUTCPeriod(d) { + return locale_periods[+(d.getUTCHours() >= 12)]; + } + + function formatUTCQuarter(d) { + return 1 + ~~(d.getUTCMonth() / 3); + } + + return { + format: function (specifier) { + var f = newFormat(specifier += "", formats); + f.toString = function () { + return specifier; + }; + return f; + }, + parse: function (specifier) { + var p = newParse(specifier += "", false); + p.toString = function () { + return specifier; + }; + return p; + }, + utcFormat: function (specifier) { + var f = newFormat(specifier += "", utcFormats); + f.toString = function () { + return specifier; + }; + return f; + }, + utcParse: function (specifier) { + var p = newParse(specifier += "", true); + p.toString = function () { + return specifier; + }; + return p; + } + }; + } + + var pads = {"-": "", "_": " ", "0": "0"}, + numberRe = /^\s*\d+/, // note: ignores next directive + percentRe = /^%/, + requoteRe = /[\\^$*+?|[\]().{}]/g; + + function pad$1(value, fill, width) { + var sign = value < 0 ? "-" : "", + string = (sign ? -value : value) + "", + length = string.length; + return sign + (length < width ? new Array(width - length + 1).join(fill) + string : string); + } + + function requote(s) { + return s.replace(requoteRe, "\\$&"); + } + + function formatRe(names) { + return new RegExp("^(?:" + names.map(requote).join("|") + ")", "i"); + } + + function formatLookup(names) { + var map = {}, i = -1, n = names.length; + while (++i < n) + map[names[i].toLowerCase()] = i; + return map; + } + + function parseWeekdayNumberSunday(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 1)); + return n ? (d.w = +n[0], i + n[0].length) : -1; + } + + function parseWeekdayNumberMonday(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 1)); + return n ? (d.u = +n[0], i + n[0].length) : -1; + } + + function parseWeekNumberSunday(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.U = +n[0], i + n[0].length) : -1; + } + + function parseWeekNumberISO(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.V = +n[0], i + n[0].length) : -1; + } + + function parseWeekNumberMonday(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.W = +n[0], i + n[0].length) : -1; + } + + function parseFullYear(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 4)); + return n ? (d.y = +n[0], i + n[0].length) : -1; + } + + function parseYear(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.y = +n[0] + (+n[0] > 68 ? 1900 : 2000), i + n[0].length) : -1; + } + + function parseZone(d, string, i) { + var n = /^(Z)|([+-]\d\d)(?::?(\d\d))?/.exec(string.slice(i, i + 6)); + return n ? (d.Z = n[1] ? 0 : -(n[2] + (n[3] || "00")), i + n[0].length) : -1; + } + + function parseQuarter(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 1)); + return n ? (d.q = n[0] * 3 - 3, i + n[0].length) : -1; + } + + function parseMonthNumber(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.m = n[0] - 1, i + n[0].length) : -1; + } + + function parseDayOfMonth(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.d = +n[0], i + n[0].length) : -1; + } + + function parseDayOfYear(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 3)); + return n ? (d.m = 0, d.d = +n[0], i + n[0].length) : -1; + } + + function parseHour24(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.H = +n[0], i + n[0].length) : -1; + } + + function parseMinutes(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.M = +n[0], i + n[0].length) : -1; + } + + function parseSeconds(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.S = +n[0], i + n[0].length) : -1; + } + + function parseMilliseconds(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 3)); + return n ? (d.L = +n[0], i + n[0].length) : -1; + } + + function parseMicroseconds(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 6)); + return n ? (d.L = Math.floor(n[0] / 1000), i + n[0].length) : -1; + } + + function parseLiteralPercent(d, string, i) { + var n = percentRe.exec(string.slice(i, i + 1)); + return n ? i + n[0].length : -1; + } + + function parseUnixTimestamp(d, string, i) { + var n = numberRe.exec(string.slice(i)); + return n ? (d.Q = +n[0], i + n[0].length) : -1; + } + + function parseUnixTimestampSeconds(d, string, i) { + var n = numberRe.exec(string.slice(i)); + return n ? (d.s = +n[0], i + n[0].length) : -1; + } + + function formatDayOfMonth(d, p) { + return pad$1(d.getDate(), p, 2); + } + + function formatHour24(d, p) { + return pad$1(d.getHours(), p, 2); + } + + function formatHour12(d, p) { + return pad$1(d.getHours() % 12 || 12, p, 2); + } + + function formatDayOfYear(d, p) { + return pad$1(1 + day.count(year(d), d), p, 3); + } + + function formatMilliseconds(d, p) { + return pad$1(d.getMilliseconds(), p, 3); + } + + function formatMicroseconds(d, p) { + return formatMilliseconds(d, p) + "000"; + } + + function formatMonthNumber(d, p) { + return pad$1(d.getMonth() + 1, p, 2); + } + + function formatMinutes(d, p) { + return pad$1(d.getMinutes(), p, 2); + } + + function formatSeconds(d, p) { + return pad$1(d.getSeconds(), p, 2); + } + + function formatWeekdayNumberMonday(d) { + var day = d.getDay(); + return day === 0 ? 7 : day; + } + + function formatWeekNumberSunday(d, p) { + return pad$1(sunday.count(year(d) - 1, d), p, 2); + } + + function formatWeekNumberISO(d, p) { + var day = d.getDay(); + d = (day >= 4 || day === 0) ? thursday(d) : thursday.ceil(d); + return pad$1(thursday.count(year(d), d) + (year(d).getDay() === 4), p, 2); + } + + function formatWeekdayNumberSunday(d) { + return d.getDay(); + } + + function formatWeekNumberMonday(d, p) { + return pad$1(monday.count(year(d) - 1, d), p, 2); + } + + function formatYear$1(d, p) { + return pad$1(d.getFullYear() % 100, p, 2); + } + + function formatFullYear(d, p) { + return pad$1(d.getFullYear() % 10000, p, 4); + } + + function formatZone(d) { + var z = d.getTimezoneOffset(); + return (z > 0 ? "-" : (z *= -1, "+")) + + pad$1(z / 60 | 0, "0", 2) + + pad$1(z % 60, "0", 2); + } + + function formatUTCDayOfMonth(d, p) { + return pad$1(d.getUTCDate(), p, 2); + } + + function formatUTCHour24(d, p) { + return pad$1(d.getUTCHours(), p, 2); + } + + function formatUTCHour12(d, p) { + return pad$1(d.getUTCHours() % 12 || 12, p, 2); + } + + function formatUTCDayOfYear(d, p) { + return pad$1(1 + utcDay.count(utcYear(d), d), p, 3); + } + + function formatUTCMilliseconds(d, p) { + return pad$1(d.getUTCMilliseconds(), p, 3); + } + + function formatUTCMicroseconds(d, p) { + return formatUTCMilliseconds(d, p) + "000"; + } + + function formatUTCMonthNumber(d, p) { + return pad$1(d.getUTCMonth() + 1, p, 2); + } + + function formatUTCMinutes(d, p) { + return pad$1(d.getUTCMinutes(), p, 2); + } + + function formatUTCSeconds(d, p) { + return pad$1(d.getUTCSeconds(), p, 2); + } + + function formatUTCWeekdayNumberMonday(d) { + var dow = d.getUTCDay(); + return dow === 0 ? 7 : dow; + } + + function formatUTCWeekNumberSunday(d, p) { + return pad$1(utcSunday.count(utcYear(d) - 1, d), p, 2); + } + + function formatUTCWeekNumberISO(d, p) { + var day = d.getUTCDay(); + d = (day >= 4 || day === 0) ? utcThursday(d) : utcThursday.ceil(d); + return pad$1(utcThursday.count(utcYear(d), d) + (utcYear(d).getUTCDay() === 4), p, 2); + } + + function formatUTCWeekdayNumberSunday(d) { + return d.getUTCDay(); + } + + function formatUTCWeekNumberMonday(d, p) { + return pad$1(utcMonday.count(utcYear(d) - 1, d), p, 2); + } + + function formatUTCYear(d, p) { + return pad$1(d.getUTCFullYear() % 100, p, 2); + } + + function formatUTCFullYear(d, p) { + return pad$1(d.getUTCFullYear() % 10000, p, 4); + } + + function formatUTCZone() { + return "+0000"; + } + + function formatLiteralPercent() { + return "%"; + } + + function formatUnixTimestamp(d) { + return +d; + } + + function formatUnixTimestampSeconds(d) { + return Math.floor(+d / 1000); + } + + var locale$1; + + defaultLocale$1({ + 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 defaultLocale$1(definition) { + locale$1 = formatLocale$1(definition); + exports.timeFormat = locale$1.format; + exports.timeParse = locale$1.parse; + exports.utcFormat = locale$1.utcFormat; + exports.utcParse = locale$1.utcParse; + return locale$1; + } + + var isoSpecifier = "%Y-%m-%dT%H:%M:%S.%LZ"; + + function formatIsoNative(date) { + return date.toISOString(); + } + + var formatIso = Date.prototype.toISOString + ? formatIsoNative + : exports.utcFormat(isoSpecifier); + + function parseIsoNative(string) { + var date = new Date(string); + return isNaN(date) ? null : date; + } + + var parseIso = +new Date("2000-01-01T00:00:00.000Z") + ? parseIsoNative + : exports.utcParse(isoSpecifier); + + var durationSecond$1 = 1000, + durationMinute$1 = durationSecond$1 * 60, + durationHour$1 = durationMinute$1 * 60, + durationDay$1 = durationHour$1 * 24, + durationWeek$1 = durationDay$1 * 7, + durationMonth = durationDay$1 * 30, + durationYear = durationDay$1 * 365; + + function date$1(t) { + return new Date(t); + } + + function number$3(t) { + return t instanceof Date ? +t : +new Date(+t); + } + + function calendar(year, month, week, day, hour, minute, second, millisecond, format) { + var scale = continuous(identity$6, identity$6), + invert = scale.invert, + domain = scale.domain; + + var formatMillisecond = format(".%L"), + formatSecond = format(":%S"), + formatMinute = format("%I:%M"), + formatHour = format("%I %p"), + formatDay = format("%a %d"), + formatWeek = format("%b %d"), + formatMonth = format("%B"), + formatYear = format("%Y"); + + var tickIntervals = [ + [second, 1, durationSecond$1], + [second, 5, 5 * durationSecond$1], + [second, 15, 15 * durationSecond$1], + [second, 30, 30 * durationSecond$1], + [minute, 1, durationMinute$1], + [minute, 5, 5 * durationMinute$1], + [minute, 15, 15 * durationMinute$1], + [minute, 30, 30 * durationMinute$1], + [hour, 1, durationHour$1], + [hour, 3, 3 * durationHour$1], + [hour, 6, 6 * durationHour$1], + [hour, 12, 12 * durationHour$1], + [day, 1, durationDay$1], + [day, 2, 2 * durationDay$1], + [week, 1, durationWeek$1], + [month, 1, durationMonth], + [month, 3, 3 * durationMonth], + [year, 1, durationYear] + ]; + + function tickFormat(date) { + return (second(date) < date ? formatMillisecond + : minute(date) < date ? formatSecond + : hour(date) < date ? formatMinute + : day(date) < date ? formatHour + : month(date) < date ? (week(date) < date ? formatDay : formatWeek) + : year(date) < date ? formatMonth + : formatYear)(date); + } + + function tickInterval(interval, start, stop, step) { + if (interval == null) + interval = 10; + + // If a desired tick count is specified, pick a reasonable tick interval + // based on the extent of the domain and a rough estimate of tick size. + // Otherwise, assume interval is already a time interval and use it. + if (typeof interval === "number") { + var target = Math.abs(stop - start) / interval, + i = bisector(function (i) { + return i[2]; + }).right(tickIntervals, target); + if (i === tickIntervals.length) { + step = tickStep(start / durationYear, stop / durationYear, interval); + interval = year; + } else if (i) { + i = tickIntervals[target / tickIntervals[i - 1][2] < tickIntervals[i][2] / target ? i - 1 : i]; + step = i[1]; + interval = i[0]; + } else { + step = Math.max(tickStep(start, stop, interval), 1); + interval = millisecond; + } + } + + return step == null ? interval : interval.every(step); + } + + scale.invert = function (y) { + return new Date(invert(y)); + }; + + scale.domain = function (_) { + return arguments.length ? domain(map$3.call(_, number$3)) : domain().map(date$1); + }; + + scale.ticks = function (interval, step) { + var d = domain(), + t0 = d[0], + t1 = d[d.length - 1], + r = t1 < t0, + t; + if (r) + t = t0, t0 = t1, t1 = t; + t = tickInterval(interval, t0, t1, step); + t = t ? t.range(t0, t1 + 1) : []; // inclusive stop + return r ? t.reverse() : t; + }; + + scale.tickFormat = function (count, specifier) { + return specifier == null ? tickFormat : format(specifier); + }; + + scale.nice = function (interval, step) { + var d = domain(); + return (interval = tickInterval(interval, d[0], d[d.length - 1], step)) + ? domain(nice(d, interval)) + : scale; + }; + + scale.copy = function () { + return copy(scale, calendar(year, month, week, day, hour, minute, second, millisecond, format)); + }; + + return scale; + } + + function time() { + return initRange.apply(calendar(year, month, sunday, day, hour, minute, second, millisecond, exports.timeFormat).domain([new Date(2000, 0, 1), new Date(2000, 0, 2)]), arguments); + } + + function utcTime() { + return initRange.apply(calendar(utcYear, utcMonth, utcSunday, utcDay, utcHour, utcMinute, second, millisecond, exports.utcFormat).domain([Date.UTC(2000, 0, 1), Date.UTC(2000, 0, 2)]), arguments); + } + + function transformer$2() { + var x0 = 0, + x1 = 1, + t0, + t1, + k10, + transform, + interpolator = identity$6, + clamp = false, + unknown; + + function scale(x) { + return isNaN(x = +x) ? unknown : interpolator(k10 === 0 ? 0.5 : (x = (transform(x) - t0) * k10, clamp ? Math.max(0, Math.min(1, x)) : x)); + } + + scale.domain = function (_) { + return arguments.length ? (t0 = transform(x0 = +_[0]), t1 = transform(x1 = +_[1]), k10 = t0 === t1 ? 0 : 1 / (t1 - t0), scale) : [x0, x1]; + }; + + scale.clamp = function (_) { + return arguments.length ? (clamp = !!_, scale) : clamp; + }; + + scale.interpolator = function (_) { + return arguments.length ? (interpolator = _, scale) : interpolator; + }; + + scale.unknown = function (_) { + return arguments.length ? (unknown = _, scale) : unknown; + }; + + return function (t) { + transform = t, t0 = t(x0), t1 = t(x1), k10 = t0 === t1 ? 0 : 1 / (t1 - t0); + return scale; + }; + } + + function copy$1(source, target) { + return target + .domain(source.domain()) + .interpolator(source.interpolator()) + .clamp(source.clamp()) + .unknown(source.unknown()); + } + + function sequential() { + var scale = linearish(transformer$2()(identity$6)); + + scale.copy = function () { + return copy$1(scale, sequential()); + }; + + return initInterpolator.apply(scale, arguments); + } + + function sequentialLog() { + var scale = loggish(transformer$2()).domain([1, 10]); + + scale.copy = function () { + return copy$1(scale, sequentialLog()).base(scale.base()); + }; + + return initInterpolator.apply(scale, arguments); + } + + function sequentialSymlog() { + var scale = symlogish(transformer$2()); + + scale.copy = function () { + return copy$1(scale, sequentialSymlog()).constant(scale.constant()); + }; + + return initInterpolator.apply(scale, arguments); + } + + function sequentialPow() { + var scale = powish(transformer$2()); + + scale.copy = function () { + return copy$1(scale, sequentialPow()).exponent(scale.exponent()); + }; + + return initInterpolator.apply(scale, arguments); + } + + function sequentialSqrt() { + return sequentialPow.apply(null, arguments).exponent(0.5); + } + + function sequentialQuantile() { + var domain = [], + interpolator = identity$6; + + function scale(x) { + if (!isNaN(x = +x)) + return interpolator((bisectRight(domain, x) - 1) / (domain.length - 1)); + } + + scale.domain = function (_) { + if (!arguments.length) + return domain.slice(); + domain = []; + for (var i = 0, n = _.length, d; i < n; ++i) + if (d = _[i], d != null && !isNaN(d = +d)) + domain.push(d); + domain.sort(ascending); + return scale; + }; + + scale.interpolator = function (_) { + return arguments.length ? (interpolator = _, scale) : interpolator; + }; + + scale.copy = function () { + return sequentialQuantile(interpolator).domain(domain); + }; + + return initInterpolator.apply(scale, arguments); + } + + function transformer$3() { + var x0 = 0, + x1 = 0.5, + x2 = 1, + t0, + t1, + t2, + k10, + k21, + interpolator = identity$6, + transform, + clamp = false, + unknown; + + function scale(x) { + 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)); + } + + scale.domain = function (_) { + 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]; + }; + + scale.clamp = function (_) { + return arguments.length ? (clamp = !!_, scale) : clamp; + }; + + scale.interpolator = function (_) { + return arguments.length ? (interpolator = _, scale) : interpolator; + }; + + scale.unknown = function (_) { + return arguments.length ? (unknown = _, scale) : unknown; + }; + + return function (t) { + 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); + return scale; + }; + } + + function diverging() { + var scale = linearish(transformer$3()(identity$6)); + + scale.copy = function () { + return copy$1(scale, diverging()); + }; + + return initInterpolator.apply(scale, arguments); + } + + function divergingLog() { + var scale = loggish(transformer$3()).domain([0.1, 1, 10]); + + scale.copy = function () { + return copy$1(scale, divergingLog()).base(scale.base()); + }; + + return initInterpolator.apply(scale, arguments); + } + + function divergingSymlog() { + var scale = symlogish(transformer$3()); + + scale.copy = function () { + return copy$1(scale, divergingSymlog()).constant(scale.constant()); + }; + + return initInterpolator.apply(scale, arguments); + } + + function divergingPow() { + var scale = powish(transformer$3()); + + scale.copy = function () { + return copy$1(scale, divergingPow()).exponent(scale.exponent()); + }; + + return initInterpolator.apply(scale, arguments); + } + + function divergingSqrt() { + return divergingPow.apply(null, arguments).exponent(0.5); + } + + function colors(specifier) { + var n = specifier.length / 6 | 0, colors = new Array(n), i = 0; + while (i < n) + colors[i] = "#" + specifier.slice(i * 6, ++i * 6); + return colors; + } + + var category10 = colors("1f77b4ff7f0e2ca02cd627289467bd8c564be377c27f7f7fbcbd2217becf"); + + var Accent = colors("7fc97fbeaed4fdc086ffff99386cb0f0027fbf5b17666666"); + + var Dark2 = colors("1b9e77d95f027570b3e7298a66a61ee6ab02a6761d666666"); + + var Paired = colors("a6cee31f78b4b2df8a33a02cfb9a99e31a1cfdbf6fff7f00cab2d66a3d9affff99b15928"); + + var Pastel1 = colors("fbb4aeb3cde3ccebc5decbe4fed9a6ffffcce5d8bdfddaecf2f2f2"); + + var Pastel2 = colors("b3e2cdfdcdaccbd5e8f4cae4e6f5c9fff2aef1e2cccccccc"); + + var Set1 = colors("e41a1c377eb84daf4a984ea3ff7f00ffff33a65628f781bf999999"); + + var Set2 = colors("66c2a5fc8d628da0cbe78ac3a6d854ffd92fe5c494b3b3b3"); + + var Set3 = colors("8dd3c7ffffb3bebadafb807280b1d3fdb462b3de69fccde5d9d9d9bc80bdccebc5ffed6f"); + + var Tableau10 = colors("4e79a7f28e2ce1575976b7b259a14fedc949af7aa1ff9da79c755fbab0ab"); + + function ramp(scheme) { + return rgbBasis(scheme[scheme.length - 1]); + } + + var scheme = new Array(3).concat( + "d8b365f5f5f55ab4ac", + "a6611adfc27d80cdc1018571", + "a6611adfc27df5f5f580cdc1018571", + "8c510ad8b365f6e8c3c7eae55ab4ac01665e", + "8c510ad8b365f6e8c3f5f5f5c7eae55ab4ac01665e", + "8c510abf812ddfc27df6e8c3c7eae580cdc135978f01665e", + "8c510abf812ddfc27df6e8c3f5f5f5c7eae580cdc135978f01665e", + "5430058c510abf812ddfc27df6e8c3c7eae580cdc135978f01665e003c30", + "5430058c510abf812ddfc27df6e8c3f5f5f5c7eae580cdc135978f01665e003c30" + ).map(colors); + + var BrBG = ramp(scheme); + + var scheme$1 = new Array(3).concat( + "af8dc3f7f7f77fbf7b", + "7b3294c2a5cfa6dba0008837", + "7b3294c2a5cff7f7f7a6dba0008837", + "762a83af8dc3e7d4e8d9f0d37fbf7b1b7837", + "762a83af8dc3e7d4e8f7f7f7d9f0d37fbf7b1b7837", + "762a839970abc2a5cfe7d4e8d9f0d3a6dba05aae611b7837", + "762a839970abc2a5cfe7d4e8f7f7f7d9f0d3a6dba05aae611b7837", + "40004b762a839970abc2a5cfe7d4e8d9f0d3a6dba05aae611b783700441b", + "40004b762a839970abc2a5cfe7d4e8f7f7f7d9f0d3a6dba05aae611b783700441b" + ).map(colors); + + var PRGn = ramp(scheme$1); + + var scheme$2 = new Array(3).concat( + "e9a3c9f7f7f7a1d76a", + "d01c8bf1b6dab8e1864dac26", + "d01c8bf1b6daf7f7f7b8e1864dac26", + "c51b7de9a3c9fde0efe6f5d0a1d76a4d9221", + "c51b7de9a3c9fde0eff7f7f7e6f5d0a1d76a4d9221", + "c51b7dde77aef1b6dafde0efe6f5d0b8e1867fbc414d9221", + "c51b7dde77aef1b6dafde0eff7f7f7e6f5d0b8e1867fbc414d9221", + "8e0152c51b7dde77aef1b6dafde0efe6f5d0b8e1867fbc414d9221276419", + "8e0152c51b7dde77aef1b6dafde0eff7f7f7e6f5d0b8e1867fbc414d9221276419" + ).map(colors); + + var PiYG = ramp(scheme$2); + + var scheme$3 = new Array(3).concat( + "998ec3f7f7f7f1a340", + "5e3c99b2abd2fdb863e66101", + "5e3c99b2abd2f7f7f7fdb863e66101", + "542788998ec3d8daebfee0b6f1a340b35806", + "542788998ec3d8daebf7f7f7fee0b6f1a340b35806", + "5427888073acb2abd2d8daebfee0b6fdb863e08214b35806", + "5427888073acb2abd2d8daebf7f7f7fee0b6fdb863e08214b35806", + "2d004b5427888073acb2abd2d8daebfee0b6fdb863e08214b358067f3b08", + "2d004b5427888073acb2abd2d8daebf7f7f7fee0b6fdb863e08214b358067f3b08" + ).map(colors); + + var PuOr = ramp(scheme$3); + + var scheme$4 = new Array(3).concat( + "ef8a62f7f7f767a9cf", + "ca0020f4a58292c5de0571b0", + "ca0020f4a582f7f7f792c5de0571b0", + "b2182bef8a62fddbc7d1e5f067a9cf2166ac", + "b2182bef8a62fddbc7f7f7f7d1e5f067a9cf2166ac", + "b2182bd6604df4a582fddbc7d1e5f092c5de4393c32166ac", + "b2182bd6604df4a582fddbc7f7f7f7d1e5f092c5de4393c32166ac", + "67001fb2182bd6604df4a582fddbc7d1e5f092c5de4393c32166ac053061", + "67001fb2182bd6604df4a582fddbc7f7f7f7d1e5f092c5de4393c32166ac053061" + ).map(colors); + + var RdBu = ramp(scheme$4); + + var scheme$5 = new Array(3).concat( + "ef8a62ffffff999999", + "ca0020f4a582bababa404040", + "ca0020f4a582ffffffbababa404040", + "b2182bef8a62fddbc7e0e0e09999994d4d4d", + "b2182bef8a62fddbc7ffffffe0e0e09999994d4d4d", + "b2182bd6604df4a582fddbc7e0e0e0bababa8787874d4d4d", + "b2182bd6604df4a582fddbc7ffffffe0e0e0bababa8787874d4d4d", + "67001fb2182bd6604df4a582fddbc7e0e0e0bababa8787874d4d4d1a1a1a", + "67001fb2182bd6604df4a582fddbc7ffffffe0e0e0bababa8787874d4d4d1a1a1a" + ).map(colors); + + var RdGy = ramp(scheme$5); + + var scheme$6 = new Array(3).concat( + "fc8d59ffffbf91bfdb", + "d7191cfdae61abd9e92c7bb6", + "d7191cfdae61ffffbfabd9e92c7bb6", + "d73027fc8d59fee090e0f3f891bfdb4575b4", + "d73027fc8d59fee090ffffbfe0f3f891bfdb4575b4", + "d73027f46d43fdae61fee090e0f3f8abd9e974add14575b4", + "d73027f46d43fdae61fee090ffffbfe0f3f8abd9e974add14575b4", + "a50026d73027f46d43fdae61fee090e0f3f8abd9e974add14575b4313695", + "a50026d73027f46d43fdae61fee090ffffbfe0f3f8abd9e974add14575b4313695" + ).map(colors); + + var RdYlBu = ramp(scheme$6); + + var scheme$7 = new Array(3).concat( + "fc8d59ffffbf91cf60", + "d7191cfdae61a6d96a1a9641", + "d7191cfdae61ffffbfa6d96a1a9641", + "d73027fc8d59fee08bd9ef8b91cf601a9850", + "d73027fc8d59fee08bffffbfd9ef8b91cf601a9850", + "d73027f46d43fdae61fee08bd9ef8ba6d96a66bd631a9850", + "d73027f46d43fdae61fee08bffffbfd9ef8ba6d96a66bd631a9850", + "a50026d73027f46d43fdae61fee08bd9ef8ba6d96a66bd631a9850006837", + "a50026d73027f46d43fdae61fee08bffffbfd9ef8ba6d96a66bd631a9850006837" + ).map(colors); + + var RdYlGn = ramp(scheme$7); + + var scheme$8 = new Array(3).concat( + "fc8d59ffffbf99d594", + "d7191cfdae61abdda42b83ba", + "d7191cfdae61ffffbfabdda42b83ba", + "d53e4ffc8d59fee08be6f59899d5943288bd", + "d53e4ffc8d59fee08bffffbfe6f59899d5943288bd", + "d53e4ff46d43fdae61fee08be6f598abdda466c2a53288bd", + "d53e4ff46d43fdae61fee08bffffbfe6f598abdda466c2a53288bd", + "9e0142d53e4ff46d43fdae61fee08be6f598abdda466c2a53288bd5e4fa2", + "9e0142d53e4ff46d43fdae61fee08bffffbfe6f598abdda466c2a53288bd5e4fa2" + ).map(colors); + + var Spectral = ramp(scheme$8); + + var scheme$9 = new Array(3).concat( + "e5f5f999d8c92ca25f", + "edf8fbb2e2e266c2a4238b45", + "edf8fbb2e2e266c2a42ca25f006d2c", + "edf8fbccece699d8c966c2a42ca25f006d2c", + "edf8fbccece699d8c966c2a441ae76238b45005824", + "f7fcfde5f5f9ccece699d8c966c2a441ae76238b45005824", + "f7fcfde5f5f9ccece699d8c966c2a441ae76238b45006d2c00441b" + ).map(colors); + + var BuGn = ramp(scheme$9); + + var scheme$a = new Array(3).concat( + "e0ecf49ebcda8856a7", + "edf8fbb3cde38c96c688419d", + "edf8fbb3cde38c96c68856a7810f7c", + "edf8fbbfd3e69ebcda8c96c68856a7810f7c", + "edf8fbbfd3e69ebcda8c96c68c6bb188419d6e016b", + "f7fcfde0ecf4bfd3e69ebcda8c96c68c6bb188419d6e016b", + "f7fcfde0ecf4bfd3e69ebcda8c96c68c6bb188419d810f7c4d004b" + ).map(colors); + + var BuPu = ramp(scheme$a); + + var scheme$b = new Array(3).concat( + "e0f3dba8ddb543a2ca", + "f0f9e8bae4bc7bccc42b8cbe", + "f0f9e8bae4bc7bccc443a2ca0868ac", + "f0f9e8ccebc5a8ddb57bccc443a2ca0868ac", + "f0f9e8ccebc5a8ddb57bccc44eb3d32b8cbe08589e", + "f7fcf0e0f3dbccebc5a8ddb57bccc44eb3d32b8cbe08589e", + "f7fcf0e0f3dbccebc5a8ddb57bccc44eb3d32b8cbe0868ac084081" + ).map(colors); + + var GnBu = ramp(scheme$b); + + var scheme$c = new Array(3).concat( + "fee8c8fdbb84e34a33", + "fef0d9fdcc8afc8d59d7301f", + "fef0d9fdcc8afc8d59e34a33b30000", + "fef0d9fdd49efdbb84fc8d59e34a33b30000", + "fef0d9fdd49efdbb84fc8d59ef6548d7301f990000", + "fff7ecfee8c8fdd49efdbb84fc8d59ef6548d7301f990000", + "fff7ecfee8c8fdd49efdbb84fc8d59ef6548d7301fb300007f0000" + ).map(colors); + + var OrRd = ramp(scheme$c); + + var scheme$d = new Array(3).concat( + "ece2f0a6bddb1c9099", + "f6eff7bdc9e167a9cf02818a", + "f6eff7bdc9e167a9cf1c9099016c59", + "f6eff7d0d1e6a6bddb67a9cf1c9099016c59", + "f6eff7d0d1e6a6bddb67a9cf3690c002818a016450", + "fff7fbece2f0d0d1e6a6bddb67a9cf3690c002818a016450", + "fff7fbece2f0d0d1e6a6bddb67a9cf3690c002818a016c59014636" + ).map(colors); + + var PuBuGn = ramp(scheme$d); + + var scheme$e = new Array(3).concat( + "ece7f2a6bddb2b8cbe", + "f1eef6bdc9e174a9cf0570b0", + "f1eef6bdc9e174a9cf2b8cbe045a8d", + "f1eef6d0d1e6a6bddb74a9cf2b8cbe045a8d", + "f1eef6d0d1e6a6bddb74a9cf3690c00570b0034e7b", + "fff7fbece7f2d0d1e6a6bddb74a9cf3690c00570b0034e7b", + "fff7fbece7f2d0d1e6a6bddb74a9cf3690c00570b0045a8d023858" + ).map(colors); + + var PuBu = ramp(scheme$e); + + var scheme$f = new Array(3).concat( + "e7e1efc994c7dd1c77", + "f1eef6d7b5d8df65b0ce1256", + "f1eef6d7b5d8df65b0dd1c77980043", + "f1eef6d4b9dac994c7df65b0dd1c77980043", + "f1eef6d4b9dac994c7df65b0e7298ace125691003f", + "f7f4f9e7e1efd4b9dac994c7df65b0e7298ace125691003f", + "f7f4f9e7e1efd4b9dac994c7df65b0e7298ace125698004367001f" + ).map(colors); + + var PuRd = ramp(scheme$f); + + var scheme$g = new Array(3).concat( + "fde0ddfa9fb5c51b8a", + "feebe2fbb4b9f768a1ae017e", + "feebe2fbb4b9f768a1c51b8a7a0177", + "feebe2fcc5c0fa9fb5f768a1c51b8a7a0177", + "feebe2fcc5c0fa9fb5f768a1dd3497ae017e7a0177", + "fff7f3fde0ddfcc5c0fa9fb5f768a1dd3497ae017e7a0177", + "fff7f3fde0ddfcc5c0fa9fb5f768a1dd3497ae017e7a017749006a" + ).map(colors); + + var RdPu = ramp(scheme$g); + + var scheme$h = new Array(3).concat( + "edf8b17fcdbb2c7fb8", + "ffffcca1dab441b6c4225ea8", + "ffffcca1dab441b6c42c7fb8253494", + "ffffccc7e9b47fcdbb41b6c42c7fb8253494", + "ffffccc7e9b47fcdbb41b6c41d91c0225ea80c2c84", + "ffffd9edf8b1c7e9b47fcdbb41b6c41d91c0225ea80c2c84", + "ffffd9edf8b1c7e9b47fcdbb41b6c41d91c0225ea8253494081d58" + ).map(colors); + + var YlGnBu = ramp(scheme$h); + + var scheme$i = new Array(3).concat( + "f7fcb9addd8e31a354", + "ffffccc2e69978c679238443", + "ffffccc2e69978c67931a354006837", + "ffffccd9f0a3addd8e78c67931a354006837", + "ffffccd9f0a3addd8e78c67941ab5d238443005a32", + "ffffe5f7fcb9d9f0a3addd8e78c67941ab5d238443005a32", + "ffffe5f7fcb9d9f0a3addd8e78c67941ab5d238443006837004529" + ).map(colors); + + var YlGn = ramp(scheme$i); + + var scheme$j = new Array(3).concat( + "fff7bcfec44fd95f0e", + "ffffd4fed98efe9929cc4c02", + "ffffd4fed98efe9929d95f0e993404", + "ffffd4fee391fec44ffe9929d95f0e993404", + "ffffd4fee391fec44ffe9929ec7014cc4c028c2d04", + "ffffe5fff7bcfee391fec44ffe9929ec7014cc4c028c2d04", + "ffffe5fff7bcfee391fec44ffe9929ec7014cc4c02993404662506" + ).map(colors); + + var YlOrBr = ramp(scheme$j); + + var scheme$k = new Array(3).concat( + "ffeda0feb24cf03b20", + "ffffb2fecc5cfd8d3ce31a1c", + "ffffb2fecc5cfd8d3cf03b20bd0026", + "ffffb2fed976feb24cfd8d3cf03b20bd0026", + "ffffb2fed976feb24cfd8d3cfc4e2ae31a1cb10026", + "ffffccffeda0fed976feb24cfd8d3cfc4e2ae31a1cb10026", + "ffffccffeda0fed976feb24cfd8d3cfc4e2ae31a1cbd0026800026" + ).map(colors); + + var YlOrRd = ramp(scheme$k); + + var scheme$l = new Array(3).concat( + "deebf79ecae13182bd", + "eff3ffbdd7e76baed62171b5", + "eff3ffbdd7e76baed63182bd08519c", + "eff3ffc6dbef9ecae16baed63182bd08519c", + "eff3ffc6dbef9ecae16baed64292c62171b5084594", + "f7fbffdeebf7c6dbef9ecae16baed64292c62171b5084594", + "f7fbffdeebf7c6dbef9ecae16baed64292c62171b508519c08306b" + ).map(colors); + + var Blues = ramp(scheme$l); + + var scheme$m = new Array(3).concat( + "e5f5e0a1d99b31a354", + "edf8e9bae4b374c476238b45", + "edf8e9bae4b374c47631a354006d2c", + "edf8e9c7e9c0a1d99b74c47631a354006d2c", + "edf8e9c7e9c0a1d99b74c47641ab5d238b45005a32", + "f7fcf5e5f5e0c7e9c0a1d99b74c47641ab5d238b45005a32", + "f7fcf5e5f5e0c7e9c0a1d99b74c47641ab5d238b45006d2c00441b" + ).map(colors); + + var Greens = ramp(scheme$m); + + var scheme$n = new Array(3).concat( + "f0f0f0bdbdbd636363", + "f7f7f7cccccc969696525252", + "f7f7f7cccccc969696636363252525", + "f7f7f7d9d9d9bdbdbd969696636363252525", + "f7f7f7d9d9d9bdbdbd969696737373525252252525", + "fffffff0f0f0d9d9d9bdbdbd969696737373525252252525", + "fffffff0f0f0d9d9d9bdbdbd969696737373525252252525000000" + ).map(colors); + + var Greys = ramp(scheme$n); + + var scheme$o = new Array(3).concat( + "efedf5bcbddc756bb1", + "f2f0f7cbc9e29e9ac86a51a3", + "f2f0f7cbc9e29e9ac8756bb154278f", + "f2f0f7dadaebbcbddc9e9ac8756bb154278f", + "f2f0f7dadaebbcbddc9e9ac8807dba6a51a34a1486", + "fcfbfdefedf5dadaebbcbddc9e9ac8807dba6a51a34a1486", + "fcfbfdefedf5dadaebbcbddc9e9ac8807dba6a51a354278f3f007d" + ).map(colors); + + var Purples = ramp(scheme$o); + + var scheme$p = new Array(3).concat( + "fee0d2fc9272de2d26", + "fee5d9fcae91fb6a4acb181d", + "fee5d9fcae91fb6a4ade2d26a50f15", + "fee5d9fcbba1fc9272fb6a4ade2d26a50f15", + "fee5d9fcbba1fc9272fb6a4aef3b2ccb181d99000d", + "fff5f0fee0d2fcbba1fc9272fb6a4aef3b2ccb181d99000d", + "fff5f0fee0d2fcbba1fc9272fb6a4aef3b2ccb181da50f1567000d" + ).map(colors); + + var Reds = ramp(scheme$p); + + var scheme$q = new Array(3).concat( + "fee6cefdae6be6550d", + "feeddefdbe85fd8d3cd94701", + "feeddefdbe85fd8d3ce6550da63603", + "feeddefdd0a2fdae6bfd8d3ce6550da63603", + "feeddefdd0a2fdae6bfd8d3cf16913d948018c2d04", + "fff5ebfee6cefdd0a2fdae6bfd8d3cf16913d948018c2d04", + "fff5ebfee6cefdd0a2fdae6bfd8d3cf16913d94801a636037f2704" + ).map(colors); + + var Oranges = ramp(scheme$q); + + function cividis(t) { + t = Math.max(0, Math.min(1, t)); + return "rgb(" + + 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))))))) + ", " + + 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))))))) + ", " + + 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))))))) + + ")"; + } + + var cubehelix$3 = cubehelixLong(cubehelix(300, 0.5, 0.0), cubehelix(-240, 0.5, 1.0)); + + var warm = cubehelixLong(cubehelix(-100, 0.75, 0.35), cubehelix(80, 1.50, 0.8)); + + var cool = cubehelixLong(cubehelix(260, 0.75, 0.35), cubehelix(80, 1.50, 0.8)); + + var c = cubehelix(); + + function rainbow(t) { + if (t < 0 || t > 1) + t -= Math.floor(t); + var ts = Math.abs(t - 0.5); + c.h = 360 * t - 100; + c.s = 1.5 - 1.5 * ts; + c.l = 0.8 - 0.9 * ts; + return c + ""; + } + + var c$1 = rgb(), + pi_1_3 = Math.PI / 3, + pi_2_3 = Math.PI * 2 / 3; + + function sinebow(t) { + var x; + t = (0.5 - t) * Math.PI; + c$1.r = 255 * (x = Math.sin(t)) * x; + c$1.g = 255 * (x = Math.sin(t + pi_1_3)) * x; + c$1.b = 255 * (x = Math.sin(t + pi_2_3)) * x; + return c$1 + ""; + } + + function turbo(t) { + t = Math.max(0, Math.min(1, t)); + return "rgb(" + + 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))))))) + ", " + + 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))))))) + ", " + + Math.max(0, Math.min(255, Math.round(27.2 + t * (3211.1 - t * (15327.97 - t * (27814 - t * (22569.18 - t * 6838.66))))))) + + ")"; + } + + function ramp$1(range) { + var n = range.length; + return function (t) { + return range[Math.max(0, Math.min(n - 1, Math.floor(t * n)))]; + }; + } + + var viridis = ramp$1(colors("44015444025645045745055946075a46085c460a5d460b5e470d60470e6147106347116447136548146748166848176948186a481a6c481b6d481c6e481d6f481f70482071482173482374482475482576482677482878482979472a7a472c7a472d7b472e7c472f7d46307e46327e46337f463480453581453781453882443983443a83443b84433d84433e85423f854240864241864142874144874045884046883f47883f48893e49893e4a893e4c8a3d4d8a3d4e8a3c4f8a3c508b3b518b3b528b3a538b3a548c39558c39568c38588c38598c375a8c375b8d365c8d365d8d355e8d355f8d34608d34618d33628d33638d32648e32658e31668e31678e31688e30698e306a8e2f6b8e2f6c8e2e6d8e2e6e8e2e6f8e2d708e2d718e2c718e2c728e2c738e2b748e2b758e2a768e2a778e2a788e29798e297a8e297b8e287c8e287d8e277e8e277f8e27808e26818e26828e26828e25838e25848e25858e24868e24878e23888e23898e238a8d228b8d228c8d228d8d218e8d218f8d21908d21918c20928c20928c20938c1f948c1f958b1f968b1f978b1f988b1f998a1f9a8a1e9b8a1e9c891e9d891f9e891f9f881fa0881fa1881fa1871fa28720a38620a48621a58521a68522a78522a88423a98324aa8325ab8225ac8226ad8127ad8128ae8029af7f2ab07f2cb17e2db27d2eb37c2fb47c31b57b32b67a34b67935b77937b87838b9773aba763bbb753dbc743fbc7340bd7242be7144bf7046c06f48c16e4ac16d4cc26c4ec36b50c46a52c56954c56856c66758c7655ac8645cc8635ec96260ca6063cb5f65cb5e67cc5c69cd5b6ccd5a6ece5870cf5773d05675d05477d1537ad1517cd2507fd34e81d34d84d44b86d54989d5488bd6468ed64590d74393d74195d84098d83e9bd93c9dd93ba0da39a2da37a5db36a8db34aadc32addc30b0dd2fb2dd2db5de2bb8de29bade28bddf26c0df25c2df23c5e021c8e020cae11fcde11dd0e11cd2e21bd5e21ad8e219dae319dde318dfe318e2e418e5e419e7e419eae51aece51befe51cf1e51df4e61ef6e620f8e621fbe723fde725")); + + var magma = ramp$1(colors("00000401000501010601010802010902020b02020d03030f03031204041405041606051806051a07061c08071e0907200a08220b09240c09260d0a290e0b2b100b2d110c2f120d31130d34140e36150e38160f3b180f3d19103f1a10421c10441d11471e114920114b21114e22115024125325125527125829115a2a115c2c115f2d11612f116331116533106734106936106b38106c390f6e3b0f703d0f713f0f72400f74420f75440f764510774710784910784a10794c117a4e117b4f127b51127c52137c54137d56147d57157e59157e5a167e5c167f5d177f5f187f601880621980641a80651a80671b80681c816a1c816b1d816d1d816e1e81701f81721f817320817521817621817822817922827b23827c23827e24828025828125818326818426818627818827818928818b29818c29818e2a81902a81912b81932b80942c80962c80982d80992d809b2e7f9c2e7f9e2f7fa02f7fa1307ea3307ea5317ea6317da8327daa337dab337cad347cae347bb0357bb2357bb3367ab5367ab73779b83779ba3878bc3978bd3977bf3a77c03a76c23b75c43c75c53c74c73d73c83e73ca3e72cc3f71cd4071cf4070d0416fd2426fd3436ed5446dd6456cd8456cd9466bdb476adc4869de4968df4a68e04c67e24d66e34e65e44f64e55064e75263e85362e95462ea5661eb5760ec5860ed5a5fee5b5eef5d5ef05f5ef1605df2625df2645cf3655cf4675cf4695cf56b5cf66c5cf66e5cf7705cf7725cf8745cf8765cf9785df9795df97b5dfa7d5efa7f5efa815ffb835ffb8560fb8761fc8961fc8a62fc8c63fc8e64fc9065fd9266fd9467fd9668fd9869fd9a6afd9b6bfe9d6cfe9f6dfea16efea36ffea571fea772fea973feaa74feac76feae77feb078feb27afeb47bfeb67cfeb77efeb97ffebb81febd82febf84fec185fec287fec488fec68afec88cfeca8dfecc8ffecd90fecf92fed194fed395fed597fed799fed89afdda9cfddc9efddea0fde0a1fde2a3fde3a5fde5a7fde7a9fde9aafdebacfcecaefceeb0fcf0b2fcf2b4fcf4b6fcf6b8fcf7b9fcf9bbfcfbbdfcfdbf")); + + var inferno = ramp$1(colors("00000401000501010601010802010a02020c02020e03021004031204031405041706041907051b08051d09061f0a07220b07240c08260d08290e092b10092d110a30120a32140b34150b37160b39180c3c190c3e1b0c411c0c431e0c451f0c48210c4a230c4c240c4f260c51280b53290b552b0b572d0b592f0a5b310a5c320a5e340a5f3609613809623909633b09643d09653e0966400a67420a68440a68450a69470b6a490b6a4a0c6b4c0c6b4d0d6c4f0d6c510e6c520e6d540f6d550f6d57106e59106e5a116e5c126e5d126e5f136e61136e62146e64156e65156e67166e69166e6a176e6c186e6d186e6f196e71196e721a6e741a6e751b6e771c6d781c6d7a1d6d7c1d6d7d1e6d7f1e6c801f6c82206c84206b85216b87216b88226a8a226a8c23698d23698f24699025689225689326679526679727669827669a28659b29649d29649f2a63a02a63a22b62a32c61a52c60a62d60a82e5fa92e5eab2f5ead305dae305cb0315bb1325ab3325ab43359b63458b73557b93556ba3655bc3754bd3853bf3952c03a51c13a50c33b4fc43c4ec63d4dc73e4cc83f4bca404acb4149cc4248ce4347cf4446d04545d24644d34743d44842d54a41d74b3fd84c3ed94d3dda4e3cdb503bdd513ade5238df5337e05536e15635e25734e35933e45a31e55c30e65d2fe75e2ee8602de9612bea632aeb6429eb6628ec6726ed6925ee6a24ef6c23ef6e21f06f20f1711ff1731df2741cf3761bf37819f47918f57b17f57d15f67e14f68013f78212f78410f8850ff8870ef8890cf98b0bf98c0af98e09fa9008fa9207fa9407fb9606fb9706fb9906fb9b06fb9d07fc9f07fca108fca309fca50afca60cfca80dfcaa0ffcac11fcae12fcb014fcb216fcb418fbb61afbb81dfbba1ffbbc21fbbe23fac026fac228fac42afac62df9c72ff9c932f9cb35f8cd37f8cf3af7d13df7d340f6d543f6d746f5d949f5db4cf4dd4ff4df53f4e156f3e35af3e55df2e661f2e865f2ea69f1ec6df1ed71f1ef75f1f179f2f27df2f482f3f586f3f68af4f88ef5f992f6fa96f8fb9af9fc9dfafda1fcffa4")); + + var plasma = ramp$1(colors("0d088710078813078916078a19068c1b068d1d068e20068f2206902406912605912805922a05932c05942e05952f059631059733059735049837049938049a3a049a3c049b3e049c3f049c41049d43039e44039e46039f48039f4903a04b03a14c02a14e02a25002a25102a35302a35502a45601a45801a45901a55b01a55c01a65e01a66001a66100a76300a76400a76600a76700a86900a86a00a86c00a86e00a86f00a87100a87201a87401a87501a87701a87801a87a02a87b02a87d03a87e03a88004a88104a78305a78405a78606a68707a68808a68a09a58b0aa58d0ba58e0ca48f0da4910ea3920fa39410a29511a19613a19814a099159f9a169f9c179e9d189d9e199da01a9ca11b9ba21d9aa31e9aa51f99a62098a72197a82296aa2395ab2494ac2694ad2793ae2892b02991b12a90b22b8fb32c8eb42e8db52f8cb6308bb7318ab83289ba3388bb3488bc3587bd3786be3885bf3984c03a83c13b82c23c81c33d80c43e7fc5407ec6417dc7427cc8437bc9447aca457acb4679cc4778cc4977cd4a76ce4b75cf4c74d04d73d14e72d24f71d35171d45270d5536fd5546ed6556dd7566cd8576bd9586ada5a6ada5b69db5c68dc5d67dd5e66de5f65de6164df6263e06363e16462e26561e26660e3685fe4695ee56a5de56b5de66c5ce76e5be76f5ae87059e97158e97257ea7457eb7556eb7655ec7754ed7953ed7a52ee7b51ef7c51ef7e50f07f4ff0804ef1814df1834cf2844bf3854bf3874af48849f48948f58b47f58c46f68d45f68f44f79044f79143f79342f89441f89540f9973ff9983ef99a3efa9b3dfa9c3cfa9e3bfb9f3afba139fba238fca338fca537fca636fca835fca934fdab33fdac33fdae32fdaf31fdb130fdb22ffdb42ffdb52efeb72dfeb82cfeba2cfebb2bfebd2afebe2afec029fdc229fdc328fdc527fdc627fdc827fdca26fdcb26fccd25fcce25fcd025fcd225fbd324fbd524fbd724fad824fada24f9dc24f9dd25f8df25f8e125f7e225f7e425f6e626f6e826f5e926f5eb27f4ed27f3ee27f3f027f2f227f1f426f1f525f0f724f0f921")); + + function constant$b(x) { + return function constant() { + return x; + }; + } + + var abs$1 = Math.abs; + var atan2$1 = Math.atan2; + var cos$2 = Math.cos; + var max$2 = Math.max; + var min$1 = Math.min; + var sin$2 = Math.sin; + var sqrt$2 = Math.sqrt; + + var epsilon$3 = 1e-12; + var pi$4 = Math.PI; + var halfPi$3 = pi$4 / 2; + var tau$4 = 2 * pi$4; + + function acos$1(x) { + return x > 1 ? 0 : x < -1 ? pi$4 : Math.acos(x); + } + + function asin$1(x) { + return x >= 1 ? halfPi$3 : x <= -1 ? -halfPi$3 : Math.asin(x); + } + + function arcInnerRadius(d) { + return d.innerRadius; + } + + function arcOuterRadius(d) { + return d.outerRadius; + } + + function arcStartAngle(d) { + return d.startAngle; + } + + function arcEndAngle(d) { + return d.endAngle; + } + + function arcPadAngle(d) { + return d && d.padAngle; // Note: optional! + } + + function intersect(x0, y0, x1, y1, x2, y2, x3, y3) { + var x10 = x1 - x0, y10 = y1 - y0, + x32 = x3 - x2, y32 = y3 - y2, + t = y32 * x10 - x32 * y10; + if (t * t < epsilon$3) + return; + t = (x32 * (y0 - y2) - y32 * (x0 - x2)) / t; + return [x0 + t * x10, y0 + t * y10]; + } + +// Compute perpendicular offset line of length rc. +// http://mathworld.wolfram.com/Circle-LineIntersection.html + function cornerTangents(x0, y0, x1, y1, r1, rc, cw) { + var x01 = x0 - x1, + y01 = y0 - y1, + lo = (cw ? rc : -rc) / sqrt$2(x01 * x01 + y01 * y01), + ox = lo * y01, + oy = -lo * x01, + x11 = x0 + ox, + y11 = y0 + oy, + x10 = x1 + ox, + y10 = y1 + oy, + x00 = (x11 + x10) / 2, + y00 = (y11 + y10) / 2, + dx = x10 - x11, + dy = y10 - y11, + d2 = dx * dx + dy * dy, + r = r1 - rc, + D = x11 * y10 - x10 * y11, + d = (dy < 0 ? -1 : 1) * sqrt$2(max$2(0, r * r * d2 - D * D)), + cx0 = (D * dy - dx * d) / d2, + cy0 = (-D * dx - dy * d) / d2, + cx1 = (D * dy + dx * d) / d2, + cy1 = (-D * dx + dy * d) / d2, + dx0 = cx0 - x00, + dy0 = cy0 - y00, + dx1 = cx1 - x00, + dy1 = cy1 - y00; + + // Pick the closer of the two intersection points. + // TODO Is there a faster way to determine which intersection to use? + if (dx0 * dx0 + dy0 * dy0 > dx1 * dx1 + dy1 * dy1) + cx0 = cx1, cy0 = cy1; + + return { + cx: cx0, + cy: cy0, + x01: -ox, + y01: -oy, + x11: cx0 * (r1 / r - 1), + y11: cy0 * (r1 / r - 1) + }; + } + + function arc() { + var innerRadius = arcInnerRadius, + outerRadius = arcOuterRadius, + cornerRadius = constant$b(0), + padRadius = null, + startAngle = arcStartAngle, + endAngle = arcEndAngle, + padAngle = arcPadAngle, + context = null; + + function arc() { + var buffer, + r, + r0 = +innerRadius.apply(this, arguments), + r1 = +outerRadius.apply(this, arguments), + a0 = startAngle.apply(this, arguments) - halfPi$3, + a1 = endAngle.apply(this, arguments) - halfPi$3, + da = abs$1(a1 - a0), + cw = a1 > a0; + + if (!context) + context = buffer = path(); + + // Ensure that the outer radius is always larger than the inner radius. + if (r1 < r0) + r = r1, r1 = r0, r0 = r; + + // Is it a point? + if (!(r1 > epsilon$3)) + context.moveTo(0, 0); + + // Or is it a circle or annulus? + else if (da > tau$4 - epsilon$3) { + context.moveTo(r1 * cos$2(a0), r1 * sin$2(a0)); + context.arc(0, 0, r1, a0, a1, !cw); + if (r0 > epsilon$3) { + context.moveTo(r0 * cos$2(a1), r0 * sin$2(a1)); + context.arc(0, 0, r0, a1, a0, cw); + } + } + + // Or is it a circular or annular sector? + else { + var a01 = a0, + a11 = a1, + a00 = a0, + a10 = a1, + da0 = da, + da1 = da, + ap = padAngle.apply(this, arguments) / 2, + rp = (ap > epsilon$3) && (padRadius ? +padRadius.apply(this, arguments) : sqrt$2(r0 * r0 + r1 * r1)), + rc = min$1(abs$1(r1 - r0) / 2, +cornerRadius.apply(this, arguments)), + rc0 = rc, + rc1 = rc, + t0, + t1; + + // Apply padding? Note that since r1 ≥ r0, da1 ≥ da0. + if (rp > epsilon$3) { + var p0 = asin$1(rp / r0 * sin$2(ap)), + p1 = asin$1(rp / r1 * sin$2(ap)); + if ((da0 -= p0 * 2) > epsilon$3) + p0 *= (cw ? 1 : -1), a00 += p0, a10 -= p0; + else + da0 = 0, a00 = a10 = (a0 + a1) / 2; + if ((da1 -= p1 * 2) > epsilon$3) + p1 *= (cw ? 1 : -1), a01 += p1, a11 -= p1; + else + da1 = 0, a01 = a11 = (a0 + a1) / 2; + } + + var x01 = r1 * cos$2(a01), + y01 = r1 * sin$2(a01), + x10 = r0 * cos$2(a10), + y10 = r0 * sin$2(a10); + + // Apply rounded corners? + if (rc > epsilon$3) { + var x11 = r1 * cos$2(a11), + y11 = r1 * sin$2(a11), + x00 = r0 * cos$2(a00), + y00 = r0 * sin$2(a00), + oc; + + // Restrict the corner radius according to the sector angle. + if (da < pi$4 && (oc = intersect(x01, y01, x00, y00, x11, y11, x10, y10))) { + var ax = x01 - oc[0], + ay = y01 - oc[1], + bx = x11 - oc[0], + by = y11 - oc[1], + kc = 1 / sin$2(acos$1((ax * bx + ay * by) / (sqrt$2(ax * ax + ay * ay) * sqrt$2(bx * bx + by * by))) / 2), + lc = sqrt$2(oc[0] * oc[0] + oc[1] * oc[1]); + rc0 = min$1(rc, (r0 - lc) / (kc - 1)); + rc1 = min$1(rc, (r1 - lc) / (kc + 1)); + } + } + + // Is the sector collapsed to a line? + if (!(da1 > epsilon$3)) + context.moveTo(x01, y01); + + // Does the sector’s outer ring have rounded corners? + else if (rc1 > epsilon$3) { + t0 = cornerTangents(x00, y00, x01, y01, r1, rc1, cw); + t1 = cornerTangents(x11, y11, x10, y10, r1, rc1, cw); + + context.moveTo(t0.cx + t0.x01, t0.cy + t0.y01); + + // Have the corners merged? + if (rc1 < rc) + context.arc(t0.cx, t0.cy, rc1, atan2$1(t0.y01, t0.x01), atan2$1(t1.y01, t1.x01), !cw); + + // Otherwise, draw the two corners and the ring. + else { + context.arc(t0.cx, t0.cy, rc1, atan2$1(t0.y01, t0.x01), atan2$1(t0.y11, t0.x11), !cw); + context.arc(0, 0, r1, atan2$1(t0.cy + t0.y11, t0.cx + t0.x11), atan2$1(t1.cy + t1.y11, t1.cx + t1.x11), !cw); + context.arc(t1.cx, t1.cy, rc1, atan2$1(t1.y11, t1.x11), atan2$1(t1.y01, t1.x01), !cw); + } + } + + // Or is the outer ring just a circular arc? + else + context.moveTo(x01, y01), context.arc(0, 0, r1, a01, a11, !cw); + + // Is there no inner ring, and it’s a circular sector? + // Or perhaps it’s an annular sector collapsed due to padding? + if (!(r0 > epsilon$3) || !(da0 > epsilon$3)) + context.lineTo(x10, y10); + + // Does the sector’s inner ring (or point) have rounded corners? + else if (rc0 > epsilon$3) { + t0 = cornerTangents(x10, y10, x11, y11, r0, -rc0, cw); + t1 = cornerTangents(x01, y01, x00, y00, r0, -rc0, cw); + + context.lineTo(t0.cx + t0.x01, t0.cy + t0.y01); + + // Have the corners merged? + if (rc0 < rc) + context.arc(t0.cx, t0.cy, rc0, atan2$1(t0.y01, t0.x01), atan2$1(t1.y01, t1.x01), !cw); + + // Otherwise, draw the two corners and the ring. + else { + context.arc(t0.cx, t0.cy, rc0, atan2$1(t0.y01, t0.x01), atan2$1(t0.y11, t0.x11), !cw); + context.arc(0, 0, r0, atan2$1(t0.cy + t0.y11, t0.cx + t0.x11), atan2$1(t1.cy + t1.y11, t1.cx + t1.x11), cw); + context.arc(t1.cx, t1.cy, rc0, atan2$1(t1.y11, t1.x11), atan2$1(t1.y01, t1.x01), !cw); + } + } + + // Or is the inner ring just a circular arc? + else + context.arc(0, 0, r0, a10, a00, cw); + } + + context.closePath(); + + if (buffer) + return context = null, buffer + "" || null; + } + + arc.centroid = function () { + var r = (+innerRadius.apply(this, arguments) + +outerRadius.apply(this, arguments)) / 2, + a = (+startAngle.apply(this, arguments) + +endAngle.apply(this, arguments)) / 2 - pi$4 / 2; + return [cos$2(a) * r, sin$2(a) * r]; + }; + + arc.innerRadius = function (_) { + return arguments.length ? (innerRadius = typeof _ === "function" ? _ : constant$b(+_), arc) : innerRadius; + }; + + arc.outerRadius = function (_) { + return arguments.length ? (outerRadius = typeof _ === "function" ? _ : constant$b(+_), arc) : outerRadius; + }; + + arc.cornerRadius = function (_) { + return arguments.length ? (cornerRadius = typeof _ === "function" ? _ : constant$b(+_), arc) : cornerRadius; + }; + + arc.padRadius = function (_) { + return arguments.length ? (padRadius = _ == null ? null : typeof _ === "function" ? _ : constant$b(+_), arc) : padRadius; + }; + + arc.startAngle = function (_) { + return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant$b(+_), arc) : startAngle; + }; + + arc.endAngle = function (_) { + return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant$b(+_), arc) : endAngle; + }; + + arc.padAngle = function (_) { + return arguments.length ? (padAngle = typeof _ === "function" ? _ : constant$b(+_), arc) : padAngle; + }; + + arc.context = function (_) { + return arguments.length ? ((context = _ == null ? null : _), arc) : context; + }; + + return arc; + } + + function Linear(context) { + this._context = context; + } + + Linear.prototype = { + areaStart: function () { + this._line = 0; + }, + areaEnd: function () { + this._line = NaN; + }, + lineStart: function () { + this._point = 0; + }, + lineEnd: function () { + if (this._line || (this._line !== 0 && this._point === 1)) + this._context.closePath(); + this._line = 1 - this._line; + }, + point: function (x, y) { + x = +x, y = +y; + switch (this._point) { + case 0: + this._point = 1; + this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); + break; + case 1: + this._point = 2; // proceed + default: + this._context.lineTo(x, y); + break; + } + } + }; + + function curveLinear(context) { + return new Linear(context); + } + + function x$3(p) { + return p[0]; + } + + function y$3(p) { + return p[1]; + } + + function line() { + var x = x$3, + y = y$3, + defined = constant$b(true), + context = null, + curve = curveLinear, + output = null; + + function line(data) { + var i, + n = data.length, + d, + defined0 = false, + buffer; + + if (context == null) + output = curve(buffer = path()); + + for (i = 0; i <= n; ++i) { + if (!(i < n && defined(d = data[i], i, data)) === defined0) { + if (defined0 = !defined0) + output.lineStart(); + else + output.lineEnd(); + } + if (defined0) + output.point(+x(d, i, data), +y(d, i, data)); + } + + if (buffer) + return output = null, buffer + "" || null; + } + + line.x = function (_) { + return arguments.length ? (x = typeof _ === "function" ? _ : constant$b(+_), line) : x; + }; + + line.y = function (_) { + return arguments.length ? (y = typeof _ === "function" ? _ : constant$b(+_), line) : y; + }; + + line.defined = function (_) { + return arguments.length ? (defined = typeof _ === "function" ? _ : constant$b(!!_), line) : defined; + }; + + line.curve = function (_) { + return arguments.length ? (curve = _, context != null && (output = curve(context)), line) : curve; + }; + + line.context = function (_) { + return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), line) : context; + }; + + return line; + } + + function area$3() { + var x0 = x$3, + x1 = null, + y0 = constant$b(0), + y1 = y$3, + defined = constant$b(true), + context = null, + curve = curveLinear, + output = null; + + function area(data) { + var i, + j, + k, + n = data.length, + d, + defined0 = false, + buffer, + x0z = new Array(n), + y0z = new Array(n); + + if (context == null) + output = curve(buffer = path()); + + for (i = 0; i <= n; ++i) { + if (!(i < n && defined(d = data[i], i, data)) === defined0) { + if (defined0 = !defined0) { + j = i; + output.areaStart(); + output.lineStart(); + } else { + output.lineEnd(); + output.lineStart(); + for (k = i - 1; k >= j; --k) { + output.point(x0z[k], y0z[k]); + } + output.lineEnd(); + output.areaEnd(); + } + } + if (defined0) { + x0z[i] = +x0(d, i, data), y0z[i] = +y0(d, i, data); + output.point(x1 ? +x1(d, i, data) : x0z[i], y1 ? +y1(d, i, data) : y0z[i]); + } + } + + if (buffer) + return output = null, buffer + "" || null; + } + + function arealine() { + return line().defined(defined).curve(curve).context(context); + } + + area.x = function (_) { + return arguments.length ? (x0 = typeof _ === "function" ? _ : constant$b(+_), x1 = null, area) : x0; + }; + + area.x0 = function (_) { + return arguments.length ? (x0 = typeof _ === "function" ? _ : constant$b(+_), area) : x0; + }; + + area.x1 = function (_) { + return arguments.length ? (x1 = _ == null ? null : typeof _ === "function" ? _ : constant$b(+_), area) : x1; + }; + + area.y = function (_) { + return arguments.length ? (y0 = typeof _ === "function" ? _ : constant$b(+_), y1 = null, area) : y0; + }; + + area.y0 = function (_) { + return arguments.length ? (y0 = typeof _ === "function" ? _ : constant$b(+_), area) : y0; + }; + + area.y1 = function (_) { + return arguments.length ? (y1 = _ == null ? null : typeof _ === "function" ? _ : constant$b(+_), area) : y1; + }; + + area.lineX0 = + area.lineY0 = function () { + return arealine().x(x0).y(y0); + }; + + area.lineY1 = function () { + return arealine().x(x0).y(y1); + }; + + area.lineX1 = function () { + return arealine().x(x1).y(y0); + }; + + area.defined = function (_) { + return arguments.length ? (defined = typeof _ === "function" ? _ : constant$b(!!_), area) : defined; + }; + + area.curve = function (_) { + return arguments.length ? (curve = _, context != null && (output = curve(context)), area) : curve; + }; + + area.context = function (_) { + return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), area) : context; + }; + + return area; + } + + function descending$1(a, b) { + return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN; + } + + function identity$8(d) { + return d; + } + + function pie() { + var value = identity$8, + sortValues = descending$1, + sort = null, + startAngle = constant$b(0), + endAngle = constant$b(tau$4), + padAngle = constant$b(0); + + function pie(data) { + var i, + n = data.length, + j, + k, + sum = 0, + index = new Array(n), + arcs = new Array(n), + a0 = +startAngle.apply(this, arguments), + da = Math.min(tau$4, Math.max(-tau$4, endAngle.apply(this, arguments) - a0)), + a1, + p = Math.min(Math.abs(da) / n, padAngle.apply(this, arguments)), + pa = p * (da < 0 ? -1 : 1), + v; + + for (i = 0; i < n; ++i) { + if ((v = arcs[index[i] = i] = +value(data[i], i, data)) > 0) { + sum += v; + } + } + + // Optionally sort the arcs by previously-computed values or by data. + if (sortValues != null) + index.sort(function (i, j) { + return sortValues(arcs[i], arcs[j]); + }); + else if (sort != null) + index.sort(function (i, j) { + return sort(data[i], data[j]); + }); + + // Compute the arcs! They are stored in the original data's order. + for (i = 0, k = sum ? (da - n * pa) / sum : 0; i < n; ++i, a0 = a1) { + j = index[i], v = arcs[j], a1 = a0 + (v > 0 ? v * k : 0) + pa, arcs[j] = { + data: data[j], + index: i, + value: v, + startAngle: a0, + endAngle: a1, + padAngle: p + }; + } + + return arcs; + } + + pie.value = function (_) { + return arguments.length ? (value = typeof _ === "function" ? _ : constant$b(+_), pie) : value; + }; + + pie.sortValues = function (_) { + return arguments.length ? (sortValues = _, sort = null, pie) : sortValues; + }; + + pie.sort = function (_) { + return arguments.length ? (sort = _, sortValues = null, pie) : sort; + }; + + pie.startAngle = function (_) { + return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant$b(+_), pie) : startAngle; + }; + + pie.endAngle = function (_) { + return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant$b(+_), pie) : endAngle; + }; + + pie.padAngle = function (_) { + return arguments.length ? (padAngle = typeof _ === "function" ? _ : constant$b(+_), pie) : padAngle; + }; + + return pie; + } + + var curveRadialLinear = curveRadial(curveLinear); + + function Radial(curve) { + this._curve = curve; + } + + Radial.prototype = { + areaStart: function () { + this._curve.areaStart(); + }, + areaEnd: function () { + this._curve.areaEnd(); + }, + lineStart: function () { + this._curve.lineStart(); + }, + lineEnd: function () { + this._curve.lineEnd(); + }, + point: function (a, r) { + this._curve.point(r * Math.sin(a), r * -Math.cos(a)); + } + }; + + function curveRadial(curve) { + + function radial(context) { + return new Radial(curve(context)); + } + + radial._curve = curve; + + return radial; + } + + function lineRadial(l) { + var c = l.curve; + + l.angle = l.x, delete l.x; + l.radius = l.y, delete l.y; + + l.curve = function (_) { + return arguments.length ? c(curveRadial(_)) : c()._curve; + }; + + return l; + } + + function lineRadial$1() { + return lineRadial(line().curve(curveRadialLinear)); + } + + function areaRadial() { + var a = area$3().curve(curveRadialLinear), + c = a.curve, + x0 = a.lineX0, + x1 = a.lineX1, + y0 = a.lineY0, + y1 = a.lineY1; + + a.angle = a.x, delete a.x; + a.startAngle = a.x0, delete a.x0; + a.endAngle = a.x1, delete a.x1; + a.radius = a.y, delete a.y; + a.innerRadius = a.y0, delete a.y0; + a.outerRadius = a.y1, delete a.y1; + a.lineStartAngle = function () { + return lineRadial(x0()); + }, delete a.lineX0; + a.lineEndAngle = function () { + return lineRadial(x1()); + }, delete a.lineX1; + a.lineInnerRadius = function () { + return lineRadial(y0()); + }, delete a.lineY0; + a.lineOuterRadius = function () { + return lineRadial(y1()); + }, delete a.lineY1; + + a.curve = function (_) { + return arguments.length ? c(curveRadial(_)) : c()._curve; + }; + + return a; + } + + function pointRadial(x, y) { + return [(y = +y) * Math.cos(x -= Math.PI / 2), y * Math.sin(x)]; + } + + var slice$6 = Array.prototype.slice; + + function linkSource(d) { + return d.source; + } + + function linkTarget(d) { + return d.target; + } + + function link$2(curve) { + var source = linkSource, + target = linkTarget, + x = x$3, + y = y$3, + context = null; + + function link() { + var buffer, argv = slice$6.call(arguments), s = source.apply(this, argv), t = target.apply(this, argv); + if (!context) + context = buffer = path(); + curve(context, +x.apply(this, (argv[0] = s, argv)), +y.apply(this, argv), +x.apply(this, (argv[0] = t, argv)), +y.apply(this, argv)); + if (buffer) + return context = null, buffer + "" || null; + } + + link.source = function (_) { + return arguments.length ? (source = _, link) : source; + }; + + link.target = function (_) { + return arguments.length ? (target = _, link) : target; + }; + + link.x = function (_) { + return arguments.length ? (x = typeof _ === "function" ? _ : constant$b(+_), link) : x; + }; + + link.y = function (_) { + return arguments.length ? (y = typeof _ === "function" ? _ : constant$b(+_), link) : y; + }; + + link.context = function (_) { + return arguments.length ? ((context = _ == null ? null : _), link) : context; + }; + + return link; + } + + function curveHorizontal(context, x0, y0, x1, y1) { + context.moveTo(x0, y0); + context.bezierCurveTo(x0 = (x0 + x1) / 2, y0, x0, y1, x1, y1); + } + + function curveVertical(context, x0, y0, x1, y1) { + context.moveTo(x0, y0); + context.bezierCurveTo(x0, y0 = (y0 + y1) / 2, x1, y0, x1, y1); + } + + function curveRadial$1(context, x0, y0, x1, y1) { + var p0 = pointRadial(x0, y0), + p1 = pointRadial(x0, y0 = (y0 + y1) / 2), + p2 = pointRadial(x1, y0), + p3 = pointRadial(x1, y1); + context.moveTo(p0[0], p0[1]); + context.bezierCurveTo(p1[0], p1[1], p2[0], p2[1], p3[0], p3[1]); + } + + function linkHorizontal() { + return link$2(curveHorizontal); + } + + function linkVertical() { + return link$2(curveVertical); + } + + function linkRadial() { + var l = link$2(curveRadial$1); + l.angle = l.x, delete l.x; + l.radius = l.y, delete l.y; + return l; + } + + var circle$2 = { + draw: function (context, size) { + var r = Math.sqrt(size / pi$4); + context.moveTo(r, 0); + context.arc(0, 0, r, 0, tau$4); + } + }; + + var cross$2 = { + draw: function (context, size) { + var r = Math.sqrt(size / 5) / 2; + context.moveTo(-3 * r, -r); + context.lineTo(-r, -r); + context.lineTo(-r, -3 * r); + context.lineTo(r, -3 * r); + context.lineTo(r, -r); + context.lineTo(3 * r, -r); + context.lineTo(3 * r, r); + context.lineTo(r, r); + context.lineTo(r, 3 * r); + context.lineTo(-r, 3 * r); + context.lineTo(-r, r); + context.lineTo(-3 * r, r); + context.closePath(); + } + }; + + var tan30 = Math.sqrt(1 / 3), + tan30_2 = tan30 * 2; + + var diamond = { + draw: function (context, size) { + var y = Math.sqrt(size / tan30_2), + x = y * tan30; + context.moveTo(0, -y); + context.lineTo(x, 0); + context.lineTo(0, y); + context.lineTo(-x, 0); + context.closePath(); + } + }; + + var ka = 0.89081309152928522810, + kr = Math.sin(pi$4 / 10) / Math.sin(7 * pi$4 / 10), + kx = Math.sin(tau$4 / 10) * kr, + ky = -Math.cos(tau$4 / 10) * kr; + + var star = { + draw: function (context, size) { + var r = Math.sqrt(size * ka), + x = kx * r, + y = ky * r; + context.moveTo(0, -r); + context.lineTo(x, y); + for (var i = 1; i < 5; ++i) { + var a = tau$4 * i / 5, + c = Math.cos(a), + s = Math.sin(a); + context.lineTo(s * r, -c * r); + context.lineTo(c * x - s * y, s * x + c * y); + } + context.closePath(); + } + }; + + var square = { + draw: function (context, size) { + var w = Math.sqrt(size), + x = -w / 2; + context.rect(x, x, w, w); + } + }; + + var sqrt3 = Math.sqrt(3); + + var triangle = { + draw: function (context, size) { + var y = -Math.sqrt(size / (sqrt3 * 3)); + context.moveTo(0, y * 2); + context.lineTo(-sqrt3 * y, -y); + context.lineTo(sqrt3 * y, -y); + context.closePath(); + } + }; + + var c$2 = -0.5, + s = Math.sqrt(3) / 2, + k = 1 / Math.sqrt(12), + a = (k / 2 + 1) * 3; + + var wye = { + draw: function (context, size) { + var r = Math.sqrt(size / a), + x0 = r / 2, + y0 = r * k, + x1 = x0, + y1 = r * k + r, + x2 = -x1, + y2 = y1; + context.moveTo(x0, y0); + context.lineTo(x1, y1); + context.lineTo(x2, y2); + context.lineTo(c$2 * x0 - s * y0, s * x0 + c$2 * y0); + context.lineTo(c$2 * x1 - s * y1, s * x1 + c$2 * y1); + context.lineTo(c$2 * x2 - s * y2, s * x2 + c$2 * y2); + context.lineTo(c$2 * x0 + s * y0, c$2 * y0 - s * x0); + context.lineTo(c$2 * x1 + s * y1, c$2 * y1 - s * x1); + context.lineTo(c$2 * x2 + s * y2, c$2 * y2 - s * x2); + context.closePath(); + } + }; + + var symbols = [ + circle$2, + cross$2, + diamond, + square, + star, + triangle, + wye + ]; + + function symbol() { + var type = constant$b(circle$2), + size = constant$b(64), + context = null; + + function symbol() { + var buffer; + if (!context) + context = buffer = path(); + type.apply(this, arguments).draw(context, +size.apply(this, arguments)); + if (buffer) + return context = null, buffer + "" || null; + } + + symbol.type = function (_) { + return arguments.length ? (type = typeof _ === "function" ? _ : constant$b(_), symbol) : type; + }; + + symbol.size = function (_) { + return arguments.length ? (size = typeof _ === "function" ? _ : constant$b(+_), symbol) : size; + }; + + symbol.context = function (_) { + return arguments.length ? (context = _ == null ? null : _, symbol) : context; + }; + + return symbol; + } + + function noop$3() {} + + function point$2(that, x, y) { + that._context.bezierCurveTo( + (2 * that._x0 + that._x1) / 3, + (2 * that._y0 + that._y1) / 3, + (that._x0 + 2 * that._x1) / 3, + (that._y0 + 2 * that._y1) / 3, + (that._x0 + 4 * that._x1 + x) / 6, + (that._y0 + 4 * that._y1 + y) / 6 + ); + } + + function Basis(context) { + this._context = context; + } + + Basis.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: + point$2(this, this._x1, this._y1); // proceed + 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 (x, y) { + x = +x, y = +y; + switch (this._point) { + case 0: + this._point = 1; + this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); + 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); // proceed + default: + point$2(this, x, y); + break; + } + this._x0 = this._x1, this._x1 = x; + this._y0 = this._y1, this._y1 = y; + } + }; + + function basis$2(context) { + return new Basis(context); + } + + function BasisClosed(context) { + this._context = context; + } + + BasisClosed.prototype = { + areaStart: noop$3, + areaEnd: noop$3, + 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 (x, y) { + x = +x, y = +y; + switch (this._point) { + case 0: + this._point = 1; + this._x2 = x, this._y2 = y; + break; + case 1: + this._point = 2; + this._x3 = x, this._y3 = y; + break; + 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; + default: + point$2(this, x, y); + break; + } + this._x0 = this._x1, this._x1 = x; + this._y0 = this._y1, this._y1 = y; + } + }; + + function basisClosed$1(context) { + return new BasisClosed(context); + } + + function BasisOpen(context) { + this._context = context; + } + + BasisOpen.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 (x, y) { + x = +x, y = +y; + switch (this._point) { + case 0: + this._point = 1; + break; + case 1: + this._point = 2; + break; + 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; + case 3: + this._point = 4; // proceed + default: + point$2(this, x, y); + break; + } + this._x0 = this._x1, this._x1 = x; + this._y0 = this._y1, this._y1 = y; + } + }; + + function basisOpen(context) { + return new BasisOpen(context); + } + + function Bundle(context, beta) { + this._basis = new Basis(context); + this._beta = beta; + } + + Bundle.prototype = { + lineStart: function () { + this._x = []; + this._y = []; + this._basis.lineStart(); + }, + lineEnd: function () { + var x = this._x, + y = this._y, + j = x.length - 1; + + if (j > 0) { + var x0 = x[0], + y0 = y[0], + dx = x[j] - x0, + dy = y[j] - y0, + i = -1, + t; + + while (++i <= j) { + t = i / j; + this._basis.point( + this._beta * x[i] + (1 - this._beta) * (x0 + t * dx), + this._beta * y[i] + (1 - this._beta) * (y0 + t * dy) + ); + } + } + + this._x = this._y = null; + this._basis.lineEnd(); + }, + point: function (x, y) { + this._x.push(+x); + this._y.push(+y); + } + }; + + var bundle = (function custom(beta) { + + function bundle(context) { + return beta === 1 ? new Basis(context) : new Bundle(context, beta); + } + + bundle.beta = function (beta) { + return custom(+beta); + }; + + return bundle; + })(0.85); + + function point$3(that, x, y) { + that._context.bezierCurveTo( + that._x1 + that._k * (that._x2 - that._x0), + that._y1 + that._k * (that._y2 - that._y0), + that._x2 + that._k * (that._x1 - x), + that._y2 + that._k * (that._y1 - y), + that._x2, + that._y2 + ); + } + + function Cardinal(context, tension) { + this._context = context; + this._k = (1 - tension) / 6; + } + + Cardinal.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: + point$3(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 (x, y) { + x = +x, y = +y; + switch (this._point) { + case 0: + this._point = 1; + this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); + break; + case 1: + this._point = 2; + this._x1 = x, this._y1 = y; + break; + case 2: + this._point = 3; // proceed + default: + point$3(this, x, y); + break; + } + this._x0 = this._x1, this._x1 = this._x2, this._x2 = x; + this._y0 = this._y1, this._y1 = this._y2, this._y2 = y; + } + }; + + var cardinal = (function custom(tension) { + + function cardinal(context) { + return new Cardinal(context, tension); + } + + cardinal.tension = function (tension) { + return custom(+tension); + }; + + return cardinal; + })(0); + + function CardinalClosed(context, tension) { + this._context = context; + this._k = (1 - tension) / 6; + } + + CardinalClosed.prototype = { + areaStart: noop$3, + areaEnd: noop$3, + 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 (x, y) { + x = +x, y = +y; + switch (this._point) { + case 0: + this._point = 1; + this._x3 = x, this._y3 = y; + break; + case 1: + this._point = 2; + this._context.moveTo(this._x4 = x, this._y4 = y); + break; + case 2: + this._point = 3; + this._x5 = x, this._y5 = y; + break; + default: + point$3(this, x, y); + break; + } + this._x0 = this._x1, this._x1 = this._x2, this._x2 = x; + this._y0 = this._y1, this._y1 = this._y2, this._y2 = y; + } + }; + + var cardinalClosed = (function custom(tension) { + + function cardinal(context) { + return new CardinalClosed(context, tension); + } + + cardinal.tension = function (tension) { + return custom(+tension); + }; + + return cardinal; + })(0); + + function CardinalOpen(context, tension) { + this._context = context; + this._k = (1 - tension) / 6; + } + + CardinalOpen.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 (x, y) { + x = +x, y = +y; + 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; // proceed + default: + point$3(this, x, y); + break; + } + this._x0 = this._x1, this._x1 = this._x2, this._x2 = x; + this._y0 = this._y1, this._y1 = this._y2, this._y2 = y; + } + }; + + var cardinalOpen = (function custom(tension) { + + function cardinal(context) { + return new CardinalOpen(context, tension); + } + + cardinal.tension = function (tension) { + return custom(+tension); + }; + + return cardinal; + })(0); + + function point$4(that, x, y) { + var x1 = that._x1, + y1 = that._y1, + x2 = that._x2, + y2 = that._y2; + + if (that._l01_a > epsilon$3) { + var a = 2 * that._l01_2a + 3 * that._l01_a * that._l12_a + that._l12_2a, + n = 3 * that._l01_a * (that._l01_a + that._l12_a); + x1 = (x1 * a - that._x0 * that._l12_2a + that._x2 * that._l01_2a) / n; + y1 = (y1 * a - that._y0 * that._l12_2a + that._y2 * that._l01_2a) / n; + } + + if (that._l23_a > epsilon$3) { + var b = 2 * that._l23_2a + 3 * that._l23_a * that._l12_a + that._l12_2a, + m = 3 * that._l23_a * (that._l23_a + that._l12_a); + x2 = (x2 * b + that._x1 * that._l23_2a - x * that._l12_2a) / m; + y2 = (y2 * b + that._y1 * that._l23_2a - y * that._l12_2a) / m; + } + + that._context.bezierCurveTo(x1, y1, x2, y2, that._x2, that._y2); + } + + function CatmullRom(context, alpha) { + this._context = context; + this._alpha = alpha; + } + + CatmullRom.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 (x, y) { + x = +x, y = +y; + + if (this._point) { + var x23 = this._x2 - x, + y23 = this._y2 - y; + this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha)); + } + + switch (this._point) { + case 0: + this._point = 1; + this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); + break; + case 1: + this._point = 2; + break; + case 2: + this._point = 3; // proceed + default: + point$4(this, x, y); + 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 = x; + this._y0 = this._y1, this._y1 = this._y2, this._y2 = y; + } + }; + + var catmullRom = (function custom(alpha) { + + function catmullRom(context) { + return alpha ? new CatmullRom(context, alpha) : new Cardinal(context, 0); + } + + catmullRom.alpha = function (alpha) { + return custom(+alpha); + }; + + return catmullRom; + })(0.5); + + function CatmullRomClosed(context, alpha) { + this._context = context; + this._alpha = alpha; + } + + CatmullRomClosed.prototype = { + areaStart: noop$3, + areaEnd: noop$3, + 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 (x, y) { + x = +x, y = +y; + + if (this._point) { + var x23 = this._x2 - x, + y23 = this._y2 - y; + this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha)); + } + + switch (this._point) { + case 0: + this._point = 1; + this._x3 = x, this._y3 = y; + break; + case 1: + this._point = 2; + this._context.moveTo(this._x4 = x, this._y4 = y); + break; + case 2: + this._point = 3; + this._x5 = x, this._y5 = y; + break; + default: + point$4(this, x, y); + 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 = x; + this._y0 = this._y1, this._y1 = this._y2, this._y2 = y; + } + }; + + var catmullRomClosed = (function custom(alpha) { + + function catmullRom(context) { + return alpha ? new CatmullRomClosed(context, alpha) : new CardinalClosed(context, 0); + } + + catmullRom.alpha = function (alpha) { + return custom(+alpha); + }; + + return catmullRom; + })(0.5); + + function CatmullRomOpen(context, alpha) { + this._context = context; + this._alpha = alpha; + } + + CatmullRomOpen.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 (x, y) { + x = +x, y = +y; + + if (this._point) { + var x23 = this._x2 - x, + y23 = this._y2 - y; + this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, 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; // proceed + default: + point$4(this, x, y); + 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 = x; + this._y0 = this._y1, this._y1 = this._y2, this._y2 = y; + } + }; + + var catmullRomOpen = (function custom(alpha) { + + function catmullRom(context) { + return alpha ? new CatmullRomOpen(context, alpha) : new CardinalOpen(context, 0); + } + + catmullRom.alpha = function (alpha) { + return custom(+alpha); + }; + + return catmullRom; + })(0.5); + + function LinearClosed(context) { + this._context = context; + } + + LinearClosed.prototype = { + areaStart: noop$3, + areaEnd: noop$3, + lineStart: function () { + this._point = 0; + }, + lineEnd: function () { + if (this._point) + this._context.closePath(); + }, + point: function (x, y) { + x = +x, y = +y; + if (this._point) + this._context.lineTo(x, y); + else + this._point = 1, this._context.moveTo(x, y); + } + }; + + function linearClosed(context) { + return new LinearClosed(context); + } + + function sign$1(x) { + return x < 0 ? -1 : 1; + } + +// Calculate the slopes of the tangents (Hermite-type interpolation) based on +// the following paper: Steffen, M. 1990. A Simple Method for Monotonic +// Interpolation in One Dimension. Astronomy and Astrophysics, Vol. 239, NO. +// NOV(II), P. 443, 1990. + function slope3(that, x2, y2) { + var h0 = that._x1 - that._x0, + h1 = x2 - that._x1, + s0 = (that._y1 - that._y0) / (h0 || h1 < 0 && -0), + s1 = (y2 - that._y1) / (h1 || h0 < 0 && -0), + p = (s0 * h1 + s1 * h0) / (h0 + h1); + return (sign$1(s0) + sign$1(s1)) * Math.min(Math.abs(s0), Math.abs(s1), 0.5 * Math.abs(p)) || 0; + } + +// Calculate a one-sided slope. + function slope2(that, t) { + var h = that._x1 - that._x0; + return h ? (3 * (that._y1 - that._y0) / h - t) / 2 : t; + } + +// According to https://en.wikipedia.org/wiki/Cubic_Hermite_spline#Representations +// "you can express cubic Hermite interpolation in terms of cubic Bézier curves +// with respect to the four values p0, p0 + m0 / 3, p1 - m1 / 3, p1". + function point$5(that, t0, t1) { + var x0 = that._x0, + y0 = that._y0, + x1 = that._x1, + y1 = that._y1, + dx = (x1 - x0) / 3; + that._context.bezierCurveTo(x0 + dx, y0 + dx * t0, x1 - dx, y1 - dx * t1, x1, y1); + } + + function MonotoneX(context) { + this._context = context; + } + + MonotoneX.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: + point$5(this, this._t0, slope2(this, this._t0)); + break; + } + if (this._line || (this._line !== 0 && this._point === 1)) + this._context.closePath(); + this._line = 1 - this._line; + }, + point: function (x, y) { + var t1 = NaN; + + x = +x, y = +y; + if (x === this._x1 && y === this._y1) + return; // Ignore coincident points. + switch (this._point) { + case 0: + this._point = 1; + this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); + break; + case 1: + this._point = 2; + break; + case 2: + this._point = 3; + point$5(this, slope2(this, t1 = slope3(this, x, y)), t1); + break; + default: + point$5(this, this._t0, t1 = slope3(this, x, y)); + break; + } + + this._x0 = this._x1, this._x1 = x; + this._y0 = this._y1, this._y1 = y; + this._t0 = t1; + } + }; + + function MonotoneY(context) { + this._context = new ReflectContext(context); + } + + (MonotoneY.prototype = Object.create(MonotoneX.prototype)).point = function (x, y) { + MonotoneX.prototype.point.call(this, y, x); + }; + + function ReflectContext(context) { + this._context = context; + } + + ReflectContext.prototype = { + moveTo: function (x, y) { + this._context.moveTo(y, x); + }, + closePath: function () { + this._context.closePath(); + }, + lineTo: function (x, y) { + this._context.lineTo(y, x); + }, + bezierCurveTo: function (x1, y1, x2, y2, x, y) { + this._context.bezierCurveTo(y1, x1, y2, x2, y, x); + } + }; + + function monotoneX(context) { + return new MonotoneX(context); + } + + function monotoneY(context) { + return new MonotoneY(context); + } + + function Natural(context) { + this._context = context; + } + + Natural.prototype = { + areaStart: function () { + this._line = 0; + }, + areaEnd: function () { + this._line = NaN; + }, + lineStart: function () { + this._x = []; + this._y = []; + }, + lineEnd: function () { + var x = this._x, + y = this._y, + n = x.length; + + if (n) { + this._line ? this._context.lineTo(x[0], y[0]) : this._context.moveTo(x[0], y[0]); + if (n === 2) { + this._context.lineTo(x[1], y[1]); + } else { + var px = controlPoints(x), + py = controlPoints(y); + for (var i0 = 0, i1 = 1; i1 < n; ++i0, ++i1) { + this._context.bezierCurveTo(px[0][i0], py[0][i0], px[1][i0], py[1][i0], x[i1], y[i1]); + } + } + } + + if (this._line || (this._line !== 0 && n === 1)) + this._context.closePath(); + this._line = 1 - this._line; + this._x = this._y = null; + }, + point: function (x, y) { + this._x.push(+x); + this._y.push(+y); + } + }; + +// See https://www.particleincell.com/2012/bezier-splines/ for derivation. + function controlPoints(x) { + var i, + n = x.length - 1, + m, + a = new Array(n), + b = new Array(n), + r = new Array(n); + a[0] = 0, b[0] = 2, r[0] = x[0] + 2 * x[1]; + for (i = 1; i < n - 1; ++i) + a[i] = 1, b[i] = 4, r[i] = 4 * x[i] + 2 * x[i + 1]; + a[n - 1] = 2, b[n - 1] = 7, r[n - 1] = 8 * x[n - 1] + x[n]; + for (i = 1; i < n; ++i) + m = a[i] / b[i - 1], b[i] -= m, r[i] -= m * r[i - 1]; + a[n - 1] = r[n - 1] / b[n - 1]; + for (i = n - 2; i >= 0; --i) + a[i] = (r[i] - a[i + 1]) / b[i]; + b[n - 1] = (x[n] + a[n - 1]) / 2; + for (i = 0; i < n - 1; ++i) + b[i] = 2 * x[i + 1] - a[i + 1]; + return [a, b]; + } + + function natural(context) { + return new Natural(context); + } + + function Step(context, t) { + this._context = context; + this._t = t; + } + + Step.prototype = { + areaStart: function () { + this._line = 0; + }, + areaEnd: function () { + this._line = NaN; + }, + lineStart: function () { + this._x = this._y = NaN; + this._point = 0; + }, + lineEnd: function () { + if (0 < this._t && this._t < 1 && this._point === 2) + this._context.lineTo(this._x, this._y); + if (this._line || (this._line !== 0 && this._point === 1)) + this._context.closePath(); + if (this._line >= 0) + this._t = 1 - this._t, this._line = 1 - this._line; + }, + point: function (x, y) { + x = +x, y = +y; + switch (this._point) { + case 0: + this._point = 1; + this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); + break; + case 1: + this._point = 2; // proceed + default: + { + if (this._t <= 0) { + this._context.lineTo(this._x, y); + this._context.lineTo(x, y); + } else { + var x1 = this._x * (1 - this._t) + x * this._t; + this._context.lineTo(x1, this._y); + this._context.lineTo(x1, y); + } + break; + } + } + this._x = x, this._y = y; + } + }; + + function step(context) { + return new Step(context, 0.5); + } + + function stepBefore(context) { + return new Step(context, 0); + } + + function stepAfter(context) { + return new Step(context, 1); + } + + function none$1(series, order) { + if (!((n = series.length) > 1)) + return; + for (var i = 1, j, s0, s1 = series[order[0]], n, m = s1.length; i < n; ++i) { + s0 = s1, s1 = series[order[i]]; + for (j = 0; j < m; ++j) { + s1[j][1] += s1[j][0] = isNaN(s0[j][1]) ? s0[j][0] : s0[j][1]; + } + } + } + + function none$2(series) { + var n = series.length, o = new Array(n); + while (--n >= 0) + o[n] = n; + return o; + } + + function stackValue(d, key) { + return d[key]; + } + + function stack() { + var keys = constant$b([]), + order = none$2, + offset = none$1, + value = stackValue; + + function stack(data) { + var kz = keys.apply(this, arguments), + i, + m = data.length, + n = kz.length, + sz = new Array(n), + oz; + + for (i = 0; i < n; ++i) { + for (var ki = kz[i], si = sz[i] = new Array(m), j = 0, sij; j < m; ++j) { + si[j] = sij = [0, +value(data[j], ki, j, data)]; + sij.data = data[j]; + } + si.key = ki; + } + + for (i = 0, oz = order(sz); i < n; ++i) { + sz[oz[i]].index = i; + } + + offset(sz, oz); + return sz; + } + + stack.keys = function (_) { + return arguments.length ? (keys = typeof _ === "function" ? _ : constant$b(slice$6.call(_)), stack) : keys; + }; + + stack.value = function (_) { + return arguments.length ? (value = typeof _ === "function" ? _ : constant$b(+_), stack) : value; + }; + + stack.order = function (_) { + return arguments.length ? (order = _ == null ? none$2 : typeof _ === "function" ? _ : constant$b(slice$6.call(_)), stack) : order; + }; + + stack.offset = function (_) { + return arguments.length ? (offset = _ == null ? none$1 : _, stack) : offset; + }; + + return stack; + } + + function expand(series, order) { + if (!((n = series.length) > 0)) + return; + for (var i, n, j = 0, m = series[0].length, y; j < m; ++j) { + for (y = i = 0; i < n; ++i) + y += series[i][j][1] || 0; + if (y) + for (i = 0; i < n; ++i) + series[i][j][1] /= y; + } + none$1(series, order); + } + + function diverging$1(series, order) { + if (!((n = series.length) > 0)) + return; + for (var i, j = 0, d, dy, yp, yn, n, m = series[order[0]].length; j < m; ++j) { + for (yp = yn = 0, i = 0; i < n; ++i) { + if ((dy = (d = series[order[i]][j])[1] - d[0]) > 0) { + d[0] = yp, d[1] = yp += dy; + } else if (dy < 0) { + d[1] = yn, d[0] = yn += dy; + } else { + d[0] = 0, d[1] = dy; + } + } + } + } + + function silhouette(series, order) { + if (!((n = series.length) > 0)) + return; + for (var j = 0, s0 = series[order[0]], n, m = s0.length; j < m; ++j) { + for (var i = 0, y = 0; i < n; ++i) + y += series[i][j][1] || 0; + s0[j][1] += s0[j][0] = -y / 2; + } + none$1(series, order); + } + + function wiggle(series, order) { + if (!((n = series.length) > 0) || !((m = (s0 = series[order[0]]).length) > 0)) + return; + for (var y = 0, j = 1, s0, m, n; j < m; ++j) { + for (var i = 0, s1 = 0, s2 = 0; i < n; ++i) { + var si = series[order[i]], + sij0 = si[j][1] || 0, + sij1 = si[j - 1][1] || 0, + s3 = (sij0 - sij1) / 2; + for (var k = 0; k < i; ++k) { + var sk = series[order[k]], + skj0 = sk[j][1] || 0, + skj1 = sk[j - 1][1] || 0; + s3 += skj0 - skj1; + } + s1 += sij0, s2 += s3 * sij0; + } + s0[j - 1][1] += s0[j - 1][0] = y; + if (s1) + y -= s2 / s1; + } + s0[j - 1][1] += s0[j - 1][0] = y; + none$1(series, order); + } + + function appearance(series) { + var peaks = series.map(peak); + return none$2(series).sort(function (a, b) { + return peaks[a] - peaks[b]; + }); + } + + function peak(series) { + var i = -1, j = 0, n = series.length, vi, vj = -Infinity; + while (++i < n) + if ((vi = +series[i][1]) > vj) + vj = vi, j = i; + return j; + } + + function ascending$3(series) { + var sums = series.map(sum$2); + return none$2(series).sort(function (a, b) { + return sums[a] - sums[b]; + }); + } + + function sum$2(series) { + var s = 0, i = -1, n = series.length, v; + while (++i < n) + if (v = +series[i][1]) + s += v; + return s; + } + + function descending$2(series) { + return ascending$3(series).reverse(); + } + + function insideOut(series) { + var n = series.length, + i, + j, + sums = series.map(sum$2), + order = appearance(series), + top = 0, + bottom = 0, + tops = [], + bottoms = []; + + for (i = 0; i < n; ++i) { + j = order[i]; + if (top < bottom) { + top += sums[j]; + tops.push(j); + } else { + bottom += sums[j]; + bottoms.push(j); + } + } + + return bottoms.reverse().concat(tops); + } + + function reverse(series) { + return none$2(series).reverse(); + } + + function constant$c(x) { + return function () { + return x; + }; + } + + function x$4(d) { + return d[0]; + } + + function y$4(d) { + return d[1]; + } + + function RedBlackTree() { + this._ = null; // root node + } + + function RedBlackNode(node) { + node.U = // parent node + node.C = // color - true for red, false for black + node.L = // left node + node.R = // right node + node.P = // previous node + node.N = null; // next node + } + + RedBlackTree.prototype = { + constructor: RedBlackTree, + + insert: function (after, node) { + var parent, grandpa, uncle; + + if (after) { + node.P = after; + node.N = after.N; + if (after.N) + after.N.P = node; + after.N = node; + if (after.R) { + after = after.R; + while (after.L) + after = after.L; + after.L = node; + } else { + after.R = node; + } + parent = after; + } else if (this._) { + after = RedBlackFirst(this._); + node.P = null; + node.N = after; + after.P = after.L = node; + parent = after; + } else { + node.P = node.N = null; + this._ = node; + parent = null; + } + node.L = node.R = null; + node.U = parent; + node.C = true; + + after = node; + while (parent && parent.C) { + grandpa = parent.U; + if (parent === grandpa.L) { + uncle = grandpa.R; + if (uncle && uncle.C) { + parent.C = uncle.C = false; + grandpa.C = true; + after = grandpa; + } else { + if (after === parent.R) { + RedBlackRotateLeft(this, parent); + after = parent; + parent = after.U; + } + parent.C = false; + grandpa.C = true; + RedBlackRotateRight(this, grandpa); + } + } else { + uncle = grandpa.L; + if (uncle && uncle.C) { + parent.C = uncle.C = false; + grandpa.C = true; + after = grandpa; + } else { + if (after === parent.L) { + RedBlackRotateRight(this, parent); + after = parent; + parent = after.U; + } + parent.C = false; + grandpa.C = true; + RedBlackRotateLeft(this, grandpa); + } + } + parent = after.U; + } + this._.C = false; + }, + + remove: function (node) { + if (node.N) + node.N.P = node.P; + if (node.P) + node.P.N = node.N; + node.N = node.P = null; + + var parent = node.U, + sibling, + left = node.L, + right = node.R, + next, + red; + + if (!left) + next = right; + else if (!right) + next = left; + else + next = RedBlackFirst(right); + + if (parent) { + if (parent.L === node) + parent.L = next; + else + parent.R = next; + } else { + this._ = next; + } + + if (left && right) { + red = next.C; + next.C = node.C; + next.L = left; + left.U = next; + if (next !== right) { + parent = next.U; + next.U = node.U; + node = next.R; + parent.L = node; + next.R = right; + right.U = next; + } else { + next.U = parent; + parent = next; + node = next.R; + } + } else { + red = node.C; + node = next; + } + + if (node) + node.U = parent; + if (red) + return; + if (node && node.C) { + node.C = false; + return; + } + + do { + if (node === this._) + break; + if (node === parent.L) { + sibling = parent.R; + if (sibling.C) { + sibling.C = false; + parent.C = true; + RedBlackRotateLeft(this, parent); + sibling = parent.R; + } + if ((sibling.L && sibling.L.C) + || (sibling.R && sibling.R.C)) { + if (!sibling.R || !sibling.R.C) { + sibling.L.C = false; + sibling.C = true; + RedBlackRotateRight(this, sibling); + sibling = parent.R; + } + sibling.C = parent.C; + parent.C = sibling.R.C = false; + RedBlackRotateLeft(this, parent); + node = this._; + break; + } + } else { + sibling = parent.L; + if (sibling.C) { + sibling.C = false; + parent.C = true; + RedBlackRotateRight(this, parent); + sibling = parent.L; + } + if ((sibling.L && sibling.L.C) + || (sibling.R && sibling.R.C)) { + if (!sibling.L || !sibling.L.C) { + sibling.R.C = false; + sibling.C = true; + RedBlackRotateLeft(this, sibling); + sibling = parent.L; + } + sibling.C = parent.C; + parent.C = sibling.L.C = false; + RedBlackRotateRight(this, parent); + node = this._; + break; + } + } + sibling.C = true; + node = parent; + parent = parent.U; + } while (!node.C); + + if (node) + node.C = false; + } + }; + + function RedBlackRotateLeft(tree, node) { + var p = node, + q = node.R, + parent = p.U; + + if (parent) { + if (parent.L === p) + parent.L = q; + else + parent.R = q; + } else { + tree._ = q; + } + + q.U = parent; + p.U = q; + p.R = q.L; + if (p.R) + p.R.U = p; + q.L = p; + } + + function RedBlackRotateRight(tree, node) { + var p = node, + q = node.L, + parent = p.U; + + if (parent) { + if (parent.L === p) + parent.L = q; + else + parent.R = q; + } else { + tree._ = q; + } + + q.U = parent; + p.U = q; + p.L = q.R; + if (p.L) + p.L.U = p; + q.R = p; + } + + function RedBlackFirst(node) { + while (node.L) + node = node.L; + return node; + } + + function createEdge(left, right, v0, v1) { + var edge = [null, null], + index = edges.push(edge) - 1; + edge.left = left; + edge.right = right; + if (v0) + setEdgeEnd(edge, left, right, v0); + if (v1) + setEdgeEnd(edge, right, left, v1); + cells[left.index].halfedges.push(index); + cells[right.index].halfedges.push(index); + return edge; + } + + function createBorderEdge(left, v0, v1) { + var edge = [v0, v1]; + edge.left = left; + return edge; + } + + function setEdgeEnd(edge, left, right, vertex) { + if (!edge[0] && !edge[1]) { + edge[0] = vertex; + edge.left = left; + edge.right = right; + } else if (edge.left === right) { + edge[1] = vertex; + } else { + edge[0] = vertex; + } + } + +// Liang–Barsky line clipping. + function clipEdge(edge, x0, y0, x1, y1) { + var a = edge[0], + b = edge[1], + ax = a[0], + ay = a[1], + bx = b[0], + by = b[1], + t0 = 0, + t1 = 1, + dx = bx - ax, + dy = by - ay, + r; + + r = x0 - ax; + if (!dx && r > 0) + return; + r /= dx; + if (dx < 0) { + if (r < t0) + return; + if (r < t1) + t1 = r; + } else if (dx > 0) { + if (r > t1) + return; + if (r > t0) + t0 = r; + } + + r = x1 - ax; + if (!dx && r < 0) + return; + r /= dx; + if (dx < 0) { + if (r > t1) + return; + if (r > t0) + t0 = r; + } else if (dx > 0) { + if (r < t0) + return; + if (r < t1) + t1 = r; + } + + r = y0 - ay; + if (!dy && r > 0) + return; + r /= dy; + if (dy < 0) { + if (r < t0) + return; + if (r < t1) + t1 = r; + } else if (dy > 0) { + if (r > t1) + return; + if (r > t0) + t0 = r; + } + + r = y1 - ay; + if (!dy && r < 0) + return; + r /= dy; + if (dy < 0) { + if (r > t1) + return; + if (r > t0) + t0 = r; + } else if (dy > 0) { + if (r < t0) + return; + if (r < t1) + t1 = r; + } + + if (!(t0 > 0) && !(t1 < 1)) + return true; // TODO Better check? + + if (t0 > 0) + edge[0] = [ax + t0 * dx, ay + t0 * dy]; + if (t1 < 1) + edge[1] = [ax + t1 * dx, ay + t1 * dy]; + return true; + } + + function connectEdge(edge, x0, y0, x1, y1) { + var v1 = edge[1]; + if (v1) + return true; + + var v0 = edge[0], + left = edge.left, + right = edge.right, + lx = left[0], + ly = left[1], + rx = right[0], + ry = right[1], + fx = (lx + rx) / 2, + fy = (ly + ry) / 2, + fm, + fb; + + if (ry === ly) { + if (fx < x0 || fx >= x1) + return; + if (lx > rx) { + if (!v0) + v0 = [fx, y0]; + else if (v0[1] >= y1) + return; + v1 = [fx, y1]; + } else { + if (!v0) + v0 = [fx, y1]; + else if (v0[1] < y0) + return; + v1 = [fx, y0]; + } + } else { + fm = (lx - rx) / (ry - ly); + fb = fy - fm * fx; + if (fm < -1 || fm > 1) { + if (lx > rx) { + if (!v0) + v0 = [(y0 - fb) / fm, y0]; + else if (v0[1] >= y1) + return; + v1 = [(y1 - fb) / fm, y1]; + } else { + if (!v0) + v0 = [(y1 - fb) / fm, y1]; + else if (v0[1] < y0) + return; + v1 = [(y0 - fb) / fm, y0]; + } + } else { + if (ly < ry) { + if (!v0) + v0 = [x0, fm * x0 + fb]; + else if (v0[0] >= x1) + return; + v1 = [x1, fm * x1 + fb]; + } else { + if (!v0) + v0 = [x1, fm * x1 + fb]; + else if (v0[0] < x0) + return; + v1 = [x0, fm * x0 + fb]; + } + } + } + + edge[0] = v0; + edge[1] = v1; + return true; + } + + function clipEdges(x0, y0, x1, y1) { + var i = edges.length, + edge; + + while (i--) { + if (!connectEdge(edge = edges[i], x0, y0, x1, y1) + || !clipEdge(edge, x0, y0, x1, y1) + || !(Math.abs(edge[0][0] - edge[1][0]) > epsilon$4 + || Math.abs(edge[0][1] - edge[1][1]) > epsilon$4)) { + delete edges[i]; + } + } + } + + function createCell(site) { + return cells[site.index] = { + site: site, + halfedges: [] + }; + } + + function cellHalfedgeAngle(cell, edge) { + var site = cell.site, + va = edge.left, + vb = edge.right; + if (site === vb) + vb = va, va = site; + if (vb) + return Math.atan2(vb[1] - va[1], vb[0] - va[0]); + if (site === va) + va = edge[1], vb = edge[0]; + else + va = edge[0], vb = edge[1]; + return Math.atan2(va[0] - vb[0], vb[1] - va[1]); + } + + function cellHalfedgeStart(cell, edge) { + return edge[+(edge.left !== cell.site)]; + } + + function cellHalfedgeEnd(cell, edge) { + return edge[+(edge.left === cell.site)]; + } + + function sortCellHalfedges() { + for (var i = 0, n = cells.length, cell, halfedges, j, m; i < n; ++i) { + if ((cell = cells[i]) && (m = (halfedges = cell.halfedges).length)) { + var index = new Array(m), + array = new Array(m); + for (j = 0; j < m; ++j) + index[j] = j, array[j] = cellHalfedgeAngle(cell, edges[halfedges[j]]); + index.sort(function (i, j) { + return array[j] - array[i]; + }); + for (j = 0; j < m; ++j) + array[j] = halfedges[index[j]]; + for (j = 0; j < m; ++j) + halfedges[j] = array[j]; + } + } + } + + function clipCells(x0, y0, x1, y1) { + var nCells = cells.length, + iCell, + cell, + site, + iHalfedge, + halfedges, + nHalfedges, + start, + startX, + startY, + end, + endX, + endY, + cover = true; + + for (iCell = 0; iCell < nCells; ++iCell) { + if (cell = cells[iCell]) { + site = cell.site; + halfedges = cell.halfedges; + iHalfedge = halfedges.length; + + // Remove any dangling clipped edges. + while (iHalfedge--) { + if (!edges[halfedges[iHalfedge]]) { + halfedges.splice(iHalfedge, 1); + } + } + + // Insert any border edges as necessary. + iHalfedge = 0, nHalfedges = halfedges.length; + while (iHalfedge < nHalfedges) { + end = cellHalfedgeEnd(cell, edges[halfedges[iHalfedge]]), endX = end[0], endY = end[1]; + start = cellHalfedgeStart(cell, edges[halfedges[++iHalfedge % nHalfedges]]), startX = start[0], startY = start[1]; + if (Math.abs(endX - startX) > epsilon$4 || Math.abs(endY - startY) > epsilon$4) { + halfedges.splice(iHalfedge, 0, edges.push(createBorderEdge(site, end, + Math.abs(endX - x0) < epsilon$4 && y1 - endY > epsilon$4 ? [x0, Math.abs(startX - x0) < epsilon$4 ? startY : y1] + : Math.abs(endY - y1) < epsilon$4 && x1 - endX > epsilon$4 ? [Math.abs(startY - y1) < epsilon$4 ? startX : x1, y1] + : Math.abs(endX - x1) < epsilon$4 && endY - y0 > epsilon$4 ? [x1, Math.abs(startX - x1) < epsilon$4 ? startY : y0] + : Math.abs(endY - y0) < epsilon$4 && endX - x0 > epsilon$4 ? [Math.abs(startY - y0) < epsilon$4 ? startX : x0, y0] + : null)) - 1); + ++nHalfedges; + } + } + + if (nHalfedges) + cover = false; + } + } + + // If there weren’t any edges, have the closest site cover the extent. + // It doesn’t matter which corner of the extent we measure! + if (cover) { + var dx, dy, d2, dc = Infinity; + + for (iCell = 0, cover = null; iCell < nCells; ++iCell) { + if (cell = cells[iCell]) { + site = cell.site; + dx = site[0] - x0; + dy = site[1] - y0; + d2 = dx * dx + dy * dy; + if (d2 < dc) + dc = d2, cover = cell; + } + } + + if (cover) { + var v00 = [x0, y0], v01 = [x0, y1], v11 = [x1, y1], v10 = [x1, y0]; + cover.halfedges.push( + edges.push(createBorderEdge(site = cover.site, v00, v01)) - 1, + edges.push(createBorderEdge(site, v01, v11)) - 1, + edges.push(createBorderEdge(site, v11, v10)) - 1, + edges.push(createBorderEdge(site, v10, v00)) - 1 + ); + } + } + + // Lastly delete any cells with no edges; these were entirely clipped. + for (iCell = 0; iCell < nCells; ++iCell) { + if (cell = cells[iCell]) { + if (!cell.halfedges.length) { + delete cells[iCell]; + } + } + } + } + + var circlePool = []; + + var firstCircle; + + function Circle() { + RedBlackNode(this); + this.x = + this.y = + this.arc = + this.site = + this.cy = null; + } + + function attachCircle(arc) { + var lArc = arc.P, + rArc = arc.N; + + if (!lArc || !rArc) + return; + + var lSite = lArc.site, + cSite = arc.site, + rSite = rArc.site; + + if (lSite === rSite) + return; + + var bx = cSite[0], + by = cSite[1], + ax = lSite[0] - bx, + ay = lSite[1] - by, + cx = rSite[0] - bx, + cy = rSite[1] - by; + + var d = 2 * (ax * cy - ay * cx); + if (d >= -epsilon2$2) + return; + + var ha = ax * ax + ay * ay, + hc = cx * cx + cy * cy, + x = (cy * ha - ay * hc) / d, + y = (ax * hc - cx * ha) / d; + + var circle = circlePool.pop() || new Circle; + circle.arc = arc; + circle.site = cSite; + circle.x = x + bx; + circle.y = (circle.cy = y + by) + Math.sqrt(x * x + y * y); // y bottom + + arc.circle = circle; + + var before = null, + node = circles._; + + while (node) { + if (circle.y < node.y || (circle.y === node.y && circle.x <= node.x)) { + if (node.L) + node = node.L; + else { + before = node.P; + break; + } + } else { + if (node.R) + node = node.R; + else { + before = node; + break; + } + } + } + + circles.insert(before, circle); + if (!before) + firstCircle = circle; + } + + function detachCircle(arc) { + var circle = arc.circle; + if (circle) { + if (!circle.P) + firstCircle = circle.N; + circles.remove(circle); + circlePool.push(circle); + RedBlackNode(circle); + arc.circle = null; + } + } + + var beachPool = []; + + function Beach() { + RedBlackNode(this); + this.edge = + this.site = + this.circle = null; + } + + function createBeach(site) { + var beach = beachPool.pop() || new Beach; + beach.site = site; + return beach; + } + + function detachBeach(beach) { + detachCircle(beach); + beaches.remove(beach); + beachPool.push(beach); + RedBlackNode(beach); + } + + function removeBeach(beach) { + var circle = beach.circle, + x = circle.x, + y = circle.cy, + vertex = [x, y], + previous = beach.P, + next = beach.N, + disappearing = [beach]; + + detachBeach(beach); + + var lArc = previous; + while (lArc.circle + && Math.abs(x - lArc.circle.x) < epsilon$4 + && Math.abs(y - lArc.circle.cy) < epsilon$4) { + previous = lArc.P; + disappearing.unshift(lArc); + detachBeach(lArc); + lArc = previous; + } + + disappearing.unshift(lArc); + detachCircle(lArc); + + var rArc = next; + while (rArc.circle + && Math.abs(x - rArc.circle.x) < epsilon$4 + && Math.abs(y - rArc.circle.cy) < epsilon$4) { + next = rArc.N; + disappearing.push(rArc); + detachBeach(rArc); + rArc = next; + } + + disappearing.push(rArc); + detachCircle(rArc); + + var nArcs = disappearing.length, + iArc; + for (iArc = 1; iArc < nArcs; ++iArc) { + rArc = disappearing[iArc]; + lArc = disappearing[iArc - 1]; + setEdgeEnd(rArc.edge, lArc.site, rArc.site, vertex); + } + + lArc = disappearing[0]; + rArc = disappearing[nArcs - 1]; + rArc.edge = createEdge(lArc.site, rArc.site, null, vertex); + + attachCircle(lArc); + attachCircle(rArc); + } + + function addBeach(site) { + var x = site[0], + directrix = site[1], + lArc, + rArc, + dxl, + dxr, + node = beaches._; + + while (node) { + dxl = leftBreakPoint(node, directrix) - x; + if (dxl > epsilon$4) + node = node.L; + else { + dxr = x - rightBreakPoint(node, directrix); + if (dxr > epsilon$4) { + if (!node.R) { + lArc = node; + break; + } + node = node.R; + } else { + if (dxl > -epsilon$4) { + lArc = node.P; + rArc = node; + } else if (dxr > -epsilon$4) { + lArc = node; + rArc = node.N; + } else { + lArc = rArc = node; + } + break; + } + } + } + + createCell(site); + var newArc = createBeach(site); + beaches.insert(lArc, newArc); + + if (!lArc && !rArc) + return; + + if (lArc === rArc) { + detachCircle(lArc); + rArc = createBeach(lArc.site); + beaches.insert(newArc, rArc); + newArc.edge = rArc.edge = createEdge(lArc.site, newArc.site); + attachCircle(lArc); + attachCircle(rArc); + return; + } + + if (!rArc) { // && lArc + newArc.edge = createEdge(lArc.site, newArc.site); + return; + } + + // else lArc !== rArc + detachCircle(lArc); + detachCircle(rArc); + + var lSite = lArc.site, + ax = lSite[0], + ay = lSite[1], + bx = site[0] - ax, + by = site[1] - ay, + rSite = rArc.site, + cx = rSite[0] - ax, + cy = rSite[1] - ay, + d = 2 * (bx * cy - by * cx), + hb = bx * bx + by * by, + hc = cx * cx + cy * cy, + vertex = [(cy * hb - by * hc) / d + ax, (bx * hc - cx * hb) / d + ay]; + + setEdgeEnd(rArc.edge, lSite, rSite, vertex); + newArc.edge = createEdge(lSite, site, null, vertex); + rArc.edge = createEdge(site, rSite, null, vertex); + attachCircle(lArc); + attachCircle(rArc); + } + + function leftBreakPoint(arc, directrix) { + var site = arc.site, + rfocx = site[0], + rfocy = site[1], + pby2 = rfocy - directrix; + + if (!pby2) + return rfocx; + + var lArc = arc.P; + if (!lArc) + return -Infinity; + + site = lArc.site; + var lfocx = site[0], + lfocy = site[1], + plby2 = lfocy - directrix; + + if (!plby2) + return lfocx; + + var hl = lfocx - rfocx, + aby2 = 1 / pby2 - 1 / plby2, + b = hl / plby2; + + if (aby2) + return (-b + Math.sqrt(b * b - 2 * aby2 * (hl * hl / (-2 * plby2) - lfocy + plby2 / 2 + rfocy - pby2 / 2))) / aby2 + rfocx; + + return (rfocx + lfocx) / 2; + } + + function rightBreakPoint(arc, directrix) { + var rArc = arc.N; + if (rArc) + return leftBreakPoint(rArc, directrix); + var site = arc.site; + return site[1] === directrix ? site[0] : Infinity; + } + + var epsilon$4 = 1e-6; + var epsilon2$2 = 1e-12; + var beaches; + var cells; + var circles; + var edges; + + function triangleArea(a, b, c) { + return (a[0] - c[0]) * (b[1] - a[1]) - (a[0] - b[0]) * (c[1] - a[1]); + } + + function lexicographic(a, b) { + return b[1] - a[1] + || b[0] - a[0]; + } + + function Diagram(sites, extent) { + var site = sites.sort(lexicographic).pop(), + x, + y, + circle; + + edges = []; + cells = new Array(sites.length); + beaches = new RedBlackTree; + circles = new RedBlackTree; + + while (true) { + circle = firstCircle; + if (site && (!circle || site[1] < circle.y || (site[1] === circle.y && site[0] < circle.x))) { + if (site[0] !== x || site[1] !== y) { + addBeach(site); + x = site[0], y = site[1]; + } + site = sites.pop(); + } else if (circle) { + removeBeach(circle.arc); + } else { + break; + } + } + + sortCellHalfedges(); + + if (extent) { + var x0 = +extent[0][0], + y0 = +extent[0][1], + x1 = +extent[1][0], + y1 = +extent[1][1]; + clipEdges(x0, y0, x1, y1); + clipCells(x0, y0, x1, y1); + } + + this.edges = edges; + this.cells = cells; + + beaches = + circles = + edges = + cells = null; + } + + Diagram.prototype = { + constructor: Diagram, + + polygons: function () { + var edges = this.edges; + + return this.cells.map(function (cell) { + var polygon = cell.halfedges.map(function (i) { + return cellHalfedgeStart(cell, edges[i]); + }); + polygon.data = cell.site.data; + return polygon; + }); + }, + + triangles: function () { + var triangles = [], + edges = this.edges; + + this.cells.forEach(function (cell, i) { + if (!(m = (halfedges = cell.halfedges).length)) + return; + var site = cell.site, + halfedges, + j = -1, + m, + s0, + e1 = edges[halfedges[m - 1]], + s1 = e1.left === site ? e1.right : e1.left; + + while (++j < m) { + s0 = s1; + e1 = edges[halfedges[j]]; + s1 = e1.left === site ? e1.right : e1.left; + if (s0 && s1 && i < s0.index && i < s1.index && triangleArea(site, s0, s1) < 0) { + triangles.push([site.data, s0.data, s1.data]); + } + } + }); + + return triangles; + }, + + links: function () { + return this.edges.filter(function (edge) { + return edge.right; + }).map(function (edge) { + return { + source: edge.left.data, + target: edge.right.data + }; + }); + }, + + find: function (x, y, radius) { + var that = this, i0, i1 = that._found || 0, n = that.cells.length, cell; + + // Use the previously-found cell, or start with an arbitrary one. + while (!(cell = that.cells[i1])) + if (++i1 >= n) + return null; + var dx = x - cell.site[0], dy = y - cell.site[1], d2 = dx * dx + dy * dy; + + // Traverse the half-edges to find a closer cell, if any. + do { + cell = that.cells[i0 = i1], i1 = null; + cell.halfedges.forEach(function (e) { + var edge = that.edges[e], v = edge.left; + if ((v === cell.site || !v) && !(v = edge.right)) + return; + var vx = x - v[0], vy = y - v[1], v2 = vx * vx + vy * vy; + if (v2 < d2) + d2 = v2, i1 = v.index; + }); + } while (i1 !== null); + + that._found = i0; + + return radius == null || d2 <= radius * radius ? cell.site : null; + } + }; + + function voronoi() { + var x = x$4, + y = y$4, + extent = null; + + function voronoi(data) { + return new Diagram(data.map(function (d, i) { + var s = [Math.round(x(d, i, data) / epsilon$4) * epsilon$4, Math.round(y(d, i, data) / epsilon$4) * epsilon$4]; + s.index = i; + s.data = d; + return s; + }), extent); + } + + voronoi.polygons = function (data) { + return voronoi(data).polygons(); + }; + + voronoi.links = function (data) { + return voronoi(data).links(); + }; + + voronoi.triangles = function (data) { + return voronoi(data).triangles(); + }; + + voronoi.x = function (_) { + return arguments.length ? (x = typeof _ === "function" ? _ : constant$c(+_), voronoi) : x; + }; + + voronoi.y = function (_) { + return arguments.length ? (y = typeof _ === "function" ? _ : constant$c(+_), voronoi) : y; + }; + + voronoi.extent = function (_) { + 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]]]; + }; + + voronoi.size = function (_) { + return arguments.length ? (extent = _ == null ? null : [[0, 0], [+_[0], +_[1]]], voronoi) : extent && [extent[1][0] - extent[0][0], extent[1][1] - extent[0][1]]; + }; + + return voronoi; + } + + function constant$d(x) { + return function () { + return x; + }; + } + + function ZoomEvent(target, type, transform) { + this.target = target; + this.type = type; + this.transform = transform; + } + + function Transform(k, x, y) { + this.k = k; + this.x = x; + this.y = y; + } + + Transform.prototype = { + constructor: Transform, + scale: function (k) { + return k === 1 ? this : new Transform(this.k * k, this.x, this.y); + }, + translate: function (x, y) { + return x === 0 & y === 0 ? this : new Transform(this.k, this.x + this.k * x, this.y + this.k * y); + }, + apply: function (point) { + return [point[0] * this.k + this.x, point[1] * this.k + this.y]; + }, + applyX: function (x) { + return x * this.k + this.x; + }, + applyY: function (y) { + return y * this.k + this.y; + }, + invert: function (location) { + return [(location[0] - this.x) / this.k, (location[1] - this.y) / this.k]; + }, + invertX: function (x) { + return (x - this.x) / this.k; + }, + invertY: function (y) { + return (y - this.y) / this.k; + }, + rescaleX: function (x) { + return x.copy().domain(x.range().map(this.invertX, this).map(x.invert, x)); + }, + rescaleY: function (y) { + return y.copy().domain(y.range().map(this.invertY, this).map(y.invert, y)); + }, + toString: function () { + return "translate(" + this.x + "," + this.y + ") scale(" + this.k + ")"; + } + }; + + var identity$9 = new Transform(1, 0, 0); + + transform$1.prototype = Transform.prototype; + + function transform$1(node) { + while (!node.__zoom) + if (!(node = node.parentNode)) + return identity$9; + return node.__zoom; + } + + function nopropagation$2() { + exports.event.stopImmediatePropagation(); + } + + function noevent$2() { + exports.event.preventDefault(); + exports.event.stopImmediatePropagation(); + } + +// Ignore right-click, since that should open the context menu. + function defaultFilter$2() { + return !exports.event.ctrlKey && !exports.event.button; + } + + function defaultExtent$1() { + 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 defaultTransform() { + return this.__zoom || identity$9; + } + + function defaultWheelDelta() { + return -exports.event.deltaY * (exports.event.deltaMode === 1 ? 0.05 : exports.event.deltaMode ? 1 : 0.002); + } + + function defaultTouchable$2() { + return navigator.maxTouchPoints || ("ontouchstart" in this); + } + + function defaultConstrain(transform, extent, translateExtent) { + var dx0 = transform.invertX(extent[0][0]) - translateExtent[0][0], + dx1 = transform.invertX(extent[1][0]) - translateExtent[1][0], + dy0 = transform.invertY(extent[0][1]) - translateExtent[0][1], + dy1 = transform.invertY(extent[1][1]) - translateExtent[1][1]; + return transform.translate( + dx1 > dx0 ? (dx0 + dx1) / 2 : Math.min(0, dx0) || Math.max(0, dx1), + dy1 > dy0 ? (dy0 + dy1) / 2 : Math.min(0, dy0) || Math.max(0, dy1) + ); + } + + function zoom() { + var filter = defaultFilter$2, + extent = defaultExtent$1, + constrain = defaultConstrain, + wheelDelta = defaultWheelDelta, + touchable = defaultTouchable$2, + scaleExtent = [0, Infinity], + translateExtent = [[-Infinity, -Infinity], [Infinity, Infinity]], + duration = 250, + interpolate = interpolateZoom, + listeners = dispatch("start", "zoom", "end"), + touchstarting, + touchending, + touchDelay = 500, + wheelDelay = 150, + clickDistance2 = 0; + + function zoom(selection) { + selection + .property("__zoom", defaultTransform) + .on("wheel.zoom", wheeled) + .on("mousedown.zoom", mousedowned) + .on("dblclick.zoom", dblclicked) + .filter(touchable) + .on("touchstart.zoom", touchstarted) + .on("touchmove.zoom", touchmoved) + .on("touchend.zoom touchcancel.zoom", touchended) + .style("touch-action", "none") + .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)"); + } + + zoom.transform = function (collection, transform, point) { + var selection = collection.selection ? collection.selection() : collection; + selection.property("__zoom", defaultTransform); + if (collection !== selection) { + schedule(collection, transform, point); + } else { + selection.interrupt().each(function () { + gesture(this, arguments) + .start() + .zoom(null, typeof transform === "function" ? transform.apply(this, arguments) : transform) + .end(); + }); + } + }; + + zoom.scaleBy = function (selection, k, p) { + zoom.scaleTo(selection, function () { + var k0 = this.__zoom.k, + k1 = typeof k === "function" ? k.apply(this, arguments) : k; + return k0 * k1; + }, p); + }; + + zoom.scaleTo = function (selection, k, p) { + zoom.transform(selection, function () { + var e = extent.apply(this, arguments), + t0 = this.__zoom, + p0 = p == null ? centroid(e) : typeof p === "function" ? p.apply(this, arguments) : p, + p1 = t0.invert(p0), + k1 = typeof k === "function" ? k.apply(this, arguments) : k; + return constrain(translate(scale(t0, k1), p0, p1), e, translateExtent); + }, p); + }; + + zoom.translateBy = function (selection, x, y) { + zoom.transform(selection, function () { + return constrain(this.__zoom.translate( + typeof x === "function" ? x.apply(this, arguments) : x, + typeof y === "function" ? y.apply(this, arguments) : y + ), extent.apply(this, arguments), translateExtent); + }); + }; + + zoom.translateTo = function (selection, x, y, p) { + zoom.transform(selection, function () { + var e = extent.apply(this, arguments), + t = this.__zoom, + p0 = p == null ? centroid(e) : typeof p === "function" ? p.apply(this, arguments) : p; + return constrain(identity$9.translate(p0[0], p0[1]).scale(t.k).translate( + typeof x === "function" ? -x.apply(this, arguments) : -x, + typeof y === "function" ? -y.apply(this, arguments) : -y + ), e, translateExtent); + }, p); + }; + + function scale(transform, k) { + k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], k)); + return k === transform.k ? transform : new Transform(k, transform.x, transform.y); + } + + function translate(transform, p0, p1) { + var x = p0[0] - p1[0] * transform.k, y = p0[1] - p1[1] * transform.k; + return x === transform.x && y === transform.y ? transform : new Transform(transform.k, x, y); + } + + function centroid(extent) { + return [(+extent[0][0] + +extent[1][0]) / 2, (+extent[0][1] + +extent[1][1]) / 2]; + } + + function schedule(transition, transform, point) { + transition + .on("start.zoom", function () { + gesture(this, arguments).start(); + }) + .on("interrupt.zoom end.zoom", function () { + gesture(this, arguments).end(); + }) + .tween("zoom", function () { + var that = this, + args = arguments, + g = gesture(that, args), + e = extent.apply(that, args), + p = point == null ? centroid(e) : typeof point === "function" ? point.apply(that, args) : point, + w = Math.max(e[1][0] - e[0][0], e[1][1] - e[0][1]), + a = that.__zoom, + b = typeof transform === "function" ? transform.apply(that, args) : transform, + i = interpolate(a.invert(p).concat(w / a.k), b.invert(p).concat(w / b.k)); + return function (t) { + if (t === 1) + t = b; // Avoid rounding error on end. + else { + var l = i(t), k = w / l[2]; + t = new Transform(k, p[0] - l[0] * k, p[1] - l[1] * k); + } + g.zoom(null, t); + }; + }); + } + + function gesture(that, args, clean) { + return (!clean && that.__zooming) || new Gesture(that, args); + } + + function Gesture(that, args) { + this.that = that; + this.args = args; + this.active = 0; + this.extent = extent.apply(that, args); + this.taps = 0; + } + + Gesture.prototype = { + start: function () { + if (++this.active === 1) { + this.that.__zooming = this; + this.emit("start"); + } + return this; + }, + zoom: function (key, transform) { + if (this.mouse && key !== "mouse") + this.mouse[1] = transform.invert(this.mouse[0]); + if (this.touch0 && key !== "touch") + this.touch0[1] = transform.invert(this.touch0[0]); + if (this.touch1 && key !== "touch") + this.touch1[1] = transform.invert(this.touch1[0]); + this.that.__zoom = transform; + this.emit("zoom"); + return this; + }, + end: function () { + if (--this.active === 0) { + delete this.that.__zooming; + this.emit("end"); + } + return this; + }, + emit: function (type) { + customEvent(new ZoomEvent(zoom, type, this.that.__zoom), listeners.apply, listeners, [type, this.that, this.args]); + } + }; + + function wheeled() { + if (!filter.apply(this, arguments)) + return; + var g = gesture(this, arguments), + t = this.__zoom, + k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], t.k * Math.pow(2, wheelDelta.apply(this, arguments)))), + p = mouse(this); + + // If the mouse is in the same location as before, reuse it. + // If there were recent wheel events, reset the wheel idle timeout. + if (g.wheel) { + if (g.mouse[0][0] !== p[0] || g.mouse[0][1] !== p[1]) { + g.mouse[1] = t.invert(g.mouse[0] = p); + } + clearTimeout(g.wheel); + } + + // If this wheel event won’t trigger a transform change, ignore it. + else if (t.k === k) + return; + + // Otherwise, capture the mouse point and location at the start. + else { + g.mouse = [p, t.invert(p)]; + interrupt(this); + g.start(); + } + + noevent$2(); + g.wheel = setTimeout(wheelidled, wheelDelay); + g.zoom("mouse", constrain(translate(scale(t, k), g.mouse[0], g.mouse[1]), g.extent, translateExtent)); + + function wheelidled() { + g.wheel = null; + g.end(); + } + } + + function mousedowned() { + if (touchending || !filter.apply(this, arguments)) + return; + var g = gesture(this, arguments, true), + v = select(exports.event.view).on("mousemove.zoom", mousemoved, true).on("mouseup.zoom", mouseupped, true), + p = mouse(this), + x0 = exports.event.clientX, + y0 = exports.event.clientY; + + dragDisable(exports.event.view); + nopropagation$2(); + g.mouse = [p, this.__zoom.invert(p)]; + interrupt(this); + g.start(); + + function mousemoved() { + noevent$2(); + if (!g.moved) { + var dx = exports.event.clientX - x0, dy = exports.event.clientY - y0; + g.moved = dx * dx + dy * dy > clickDistance2; + } + g.zoom("mouse", constrain(translate(g.that.__zoom, g.mouse[0] = mouse(g.that), g.mouse[1]), g.extent, translateExtent)); + } + + function mouseupped() { + v.on("mousemove.zoom mouseup.zoom", null); + yesdrag(exports.event.view, g.moved); + noevent$2(); + g.end(); + } + } + + function dblclicked() { + if (!filter.apply(this, arguments)) + return; + var t0 = this.__zoom, + p0 = mouse(this), + p1 = t0.invert(p0), + k1 = t0.k * (exports.event.shiftKey ? 0.5 : 2), + t1 = constrain(translate(scale(t0, k1), p0, p1), extent.apply(this, arguments), translateExtent); + + noevent$2(); + if (duration > 0) + select(this).transition().duration(duration).call(schedule, t1, p0); + else + select(this).call(zoom.transform, t1); + } + + function touchstarted() { + if (!filter.apply(this, arguments)) + return; + var touches = exports.event.touches, + n = touches.length, + g = gesture(this, arguments, exports.event.changedTouches.length === n), + started, i, t, p; + + nopropagation$2(); + for (i = 0; i < n; ++i) { + t = touches[i], p = touch(this, touches, t.identifier); + p = [p, this.__zoom.invert(p), t.identifier]; + if (!g.touch0) + g.touch0 = p, started = true, g.taps = 1 + !!touchstarting; + else if (!g.touch1 && g.touch0[2] !== p[2]) + g.touch1 = p, g.taps = 0; + } + + if (touchstarting) + touchstarting = clearTimeout(touchstarting); + + if (started) { + if (g.taps < 2) + touchstarting = setTimeout(function () { + touchstarting = null; + }, touchDelay); + interrupt(this); + g.start(); + } + } + + function touchmoved() { + if (!this.__zooming) + return; + var g = gesture(this, arguments), + touches = exports.event.changedTouches, + n = touches.length, i, t, p, l; + + noevent$2(); + if (touchstarting) + touchstarting = clearTimeout(touchstarting); + g.taps = 0; + for (i = 0; i < n; ++i) { + t = touches[i], p = touch(this, touches, t.identifier); + if (g.touch0 && g.touch0[2] === t.identifier) + g.touch0[0] = p; + else if (g.touch1 && g.touch1[2] === t.identifier) + g.touch1[0] = p; + } + t = g.that.__zoom; + if (g.touch1) { + var p0 = g.touch0[0], l0 = g.touch0[1], + p1 = g.touch1[0], l1 = g.touch1[1], + dp = (dp = p1[0] - p0[0]) * dp + (dp = p1[1] - p0[1]) * dp, + dl = (dl = l1[0] - l0[0]) * dl + (dl = l1[1] - l0[1]) * dl; + t = scale(t, Math.sqrt(dp / dl)); + p = [(p0[0] + p1[0]) / 2, (p0[1] + p1[1]) / 2]; + l = [(l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2]; + } else if (g.touch0) + p = g.touch0[0], l = g.touch0[1]; + else + return; + g.zoom("touch", constrain(translate(t, p, l), g.extent, translateExtent)); + } + + function touchended() { + if (!this.__zooming) + return; + var g = gesture(this, arguments), + touches = exports.event.changedTouches, + n = touches.length, i, t; + + nopropagation$2(); + if (touchending) + clearTimeout(touchending); + touchending = setTimeout(function () { + touchending = null; + }, touchDelay); + for (i = 0; i < n; ++i) { + t = touches[i]; + if (g.touch0 && g.touch0[2] === t.identifier) + delete g.touch0; + else if (g.touch1 && g.touch1[2] === t.identifier) + delete g.touch1; + } + if (g.touch1 && !g.touch0) + g.touch0 = g.touch1, delete g.touch1; + if (g.touch0) + g.touch0[1] = this.__zoom.invert(g.touch0[0]); + else { + g.end(); + // If this was a dbltap, reroute to the (optional) dblclick.zoom handler. + if (g.taps === 2) { + var p = select(this).on("dblclick.zoom"); + if (p) + p.apply(this, arguments); + } + } + } + + zoom.wheelDelta = function (_) { + return arguments.length ? (wheelDelta = typeof _ === "function" ? _ : constant$d(+_), zoom) : wheelDelta; + }; + + zoom.filter = function (_) { + return arguments.length ? (filter = typeof _ === "function" ? _ : constant$d(!!_), zoom) : filter; + }; + + zoom.touchable = function (_) { + return arguments.length ? (touchable = typeof _ === "function" ? _ : constant$d(!!_), zoom) : touchable; + }; + + zoom.extent = function (_) { + return arguments.length ? (extent = typeof _ === "function" ? _ : constant$d([[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]]), zoom) : extent; + }; + + zoom.scaleExtent = function (_) { + return arguments.length ? (scaleExtent[0] = +_[0], scaleExtent[1] = +_[1], zoom) : [scaleExtent[0], scaleExtent[1]]; + }; + + zoom.translateExtent = function (_) { + 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]]]; + }; + + zoom.constrain = function (_) { + return arguments.length ? (constrain = _, zoom) : constrain; + }; + + zoom.duration = function (_) { + return arguments.length ? (duration = +_, zoom) : duration; + }; + + zoom.interpolate = function (_) { + return arguments.length ? (interpolate = _, zoom) : interpolate; + }; + + zoom.on = function () { + var value = listeners.on.apply(listeners, arguments); + return value === listeners ? zoom : value; + }; + + zoom.clickDistance = function (_) { + return arguments.length ? (clickDistance2 = (_ = +_) * _, zoom) : Math.sqrt(clickDistance2); + }; + + return zoom; + } + + exports.FormatSpecifier = FormatSpecifier; + exports.active = active; + exports.arc = arc; + exports.area = area$3; + exports.areaRadial = areaRadial; + exports.ascending = ascending; + exports.autoType = autoType; + exports.axisBottom = axisBottom; + exports.axisLeft = axisLeft; + exports.axisRight = axisRight; + exports.axisTop = axisTop; + exports.bisect = bisectRight; + exports.bisectLeft = bisectLeft; + exports.bisectRight = bisectRight; + exports.bisector = bisector; + exports.blob = blob; + exports.brush = brush; + exports.brushSelection = brushSelection; + exports.brushX = brushX; + exports.brushY = brushY; + exports.buffer = buffer; + exports.chord = chord; + exports.clientPoint = point; + exports.cluster = cluster; + exports.color = color; + exports.contourDensity = density; + exports.contours = contours; + exports.create = create; + exports.creator = creator; + exports.cross = cross; + exports.csv = csv$1; + exports.csvFormat = csvFormat; + exports.csvFormatBody = csvFormatBody; + exports.csvFormatRow = csvFormatRow; + exports.csvFormatRows = csvFormatRows; + exports.csvFormatValue = csvFormatValue; + exports.csvParse = csvParse; + exports.csvParseRows = csvParseRows; + exports.cubehelix = cubehelix; + exports.curveBasis = basis$2; + exports.curveBasisClosed = basisClosed$1; + exports.curveBasisOpen = basisOpen; + exports.curveBundle = bundle; + exports.curveCardinal = cardinal; + exports.curveCardinalClosed = cardinalClosed; + exports.curveCardinalOpen = cardinalOpen; + exports.curveCatmullRom = catmullRom; + exports.curveCatmullRomClosed = catmullRomClosed; + exports.curveCatmullRomOpen = catmullRomOpen; + exports.curveLinear = curveLinear; + exports.curveLinearClosed = linearClosed; + exports.curveMonotoneX = monotoneX; + exports.curveMonotoneY = monotoneY; + exports.curveNatural = natural; + exports.curveStep = step; + exports.curveStepAfter = stepAfter; + exports.curveStepBefore = stepBefore; + exports.customEvent = customEvent; + exports.descending = descending; + exports.deviation = deviation; + exports.dispatch = dispatch; + exports.drag = drag; + exports.dragDisable = dragDisable; + exports.dragEnable = yesdrag; + exports.dsv = dsv; + exports.dsvFormat = dsvFormat; + exports.easeBack = backInOut; + exports.easeBackIn = backIn; + exports.easeBackInOut = backInOut; + exports.easeBackOut = backOut; + exports.easeBounce = bounceOut; + exports.easeBounceIn = bounceIn; + exports.easeBounceInOut = bounceInOut; + exports.easeBounceOut = bounceOut; + exports.easeCircle = circleInOut; + exports.easeCircleIn = circleIn; + exports.easeCircleInOut = circleInOut; + exports.easeCircleOut = circleOut; + exports.easeCubic = cubicInOut; + exports.easeCubicIn = cubicIn; + exports.easeCubicInOut = cubicInOut; + exports.easeCubicOut = cubicOut; + exports.easeElastic = elasticOut; + exports.easeElasticIn = elasticIn; + exports.easeElasticInOut = elasticInOut; + exports.easeElasticOut = elasticOut; + exports.easeExp = expInOut; + exports.easeExpIn = expIn; + exports.easeExpInOut = expInOut; + exports.easeExpOut = expOut; + exports.easeLinear = linear$1; + exports.easePoly = polyInOut; + exports.easePolyIn = polyIn; + exports.easePolyInOut = polyInOut; + exports.easePolyOut = polyOut; + exports.easeQuad = quadInOut; + exports.easeQuadIn = quadIn; + exports.easeQuadInOut = quadInOut; + exports.easeQuadOut = quadOut; + exports.easeSin = sinInOut; + exports.easeSinIn = sinIn; + exports.easeSinInOut = sinInOut; + exports.easeSinOut = sinOut; + exports.entries = entries; + exports.extent = extent; + exports.forceCenter = center$1; + exports.forceCollide = collide; + exports.forceLink = link; + exports.forceManyBody = manyBody; + exports.forceRadial = radial; + exports.forceSimulation = simulation; + exports.forceX = x$2; + exports.forceY = y$2; + exports.formatDefaultLocale = defaultLocale; + exports.formatLocale = formatLocale; + exports.formatSpecifier = formatSpecifier; + exports.geoAlbers = albers; + exports.geoAlbersUsa = albersUsa; + exports.geoArea = area$1; + exports.geoAzimuthalEqualArea = azimuthalEqualArea; + exports.geoAzimuthalEqualAreaRaw = azimuthalEqualAreaRaw; + exports.geoAzimuthalEquidistant = azimuthalEquidistant; + exports.geoAzimuthalEquidistantRaw = azimuthalEquidistantRaw; + exports.geoBounds = bounds; + exports.geoCentroid = centroid; + exports.geoCircle = circle; + exports.geoClipAntimeridian = clipAntimeridian; + exports.geoClipCircle = clipCircle; + exports.geoClipExtent = extent$1; + exports.geoClipRectangle = clipRectangle; + exports.geoConicConformal = conicConformal; + exports.geoConicConformalRaw = conicConformalRaw; + exports.geoConicEqualArea = conicEqualArea; + exports.geoConicEqualAreaRaw = conicEqualAreaRaw; + exports.geoConicEquidistant = conicEquidistant; + exports.geoConicEquidistantRaw = conicEquidistantRaw; + exports.geoContains = contains$1; + exports.geoDistance = distance; + exports.geoEqualEarth = equalEarth; + exports.geoEqualEarthRaw = equalEarthRaw; + exports.geoEquirectangular = equirectangular; + exports.geoEquirectangularRaw = equirectangularRaw; + exports.geoGnomonic = gnomonic; + exports.geoGnomonicRaw = gnomonicRaw; + exports.geoGraticule = graticule; + exports.geoGraticule10 = graticule10; + exports.geoIdentity = identity$5; + exports.geoInterpolate = interpolate$1; + exports.geoLength = length$1; + exports.geoMercator = mercator; + exports.geoMercatorRaw = mercatorRaw; + exports.geoNaturalEarth1 = naturalEarth1; + exports.geoNaturalEarth1Raw = naturalEarth1Raw; + exports.geoOrthographic = orthographic; + exports.geoOrthographicRaw = orthographicRaw; + exports.geoPath = index$1; + exports.geoProjection = projection; + exports.geoProjectionMutator = projectionMutator; + exports.geoRotation = rotation; + exports.geoStereographic = stereographic; + exports.geoStereographicRaw = stereographicRaw; + exports.geoStream = geoStream; + exports.geoTransform = transform; + exports.geoTransverseMercator = transverseMercator; + exports.geoTransverseMercatorRaw = transverseMercatorRaw; + exports.gray = gray; + exports.hcl = hcl; + exports.hierarchy = hierarchy; + exports.histogram = histogram; + exports.hsl = hsl; + exports.html = html; + exports.image = image; + exports.interpolate = interpolateValue; + exports.interpolateArray = array$1; + exports.interpolateBasis = basis$1; + exports.interpolateBasisClosed = basisClosed; + exports.interpolateBlues = Blues; + exports.interpolateBrBG = BrBG; + exports.interpolateBuGn = BuGn; + exports.interpolateBuPu = BuPu; + exports.interpolateCividis = cividis; + exports.interpolateCool = cool; + exports.interpolateCubehelix = cubehelix$2; + exports.interpolateCubehelixDefault = cubehelix$3; + exports.interpolateCubehelixLong = cubehelixLong; + exports.interpolateDate = date; + exports.interpolateDiscrete = discrete; + exports.interpolateGnBu = GnBu; + exports.interpolateGreens = Greens; + exports.interpolateGreys = Greys; + exports.interpolateHcl = hcl$2; + exports.interpolateHclLong = hclLong; + exports.interpolateHsl = hsl$2; + exports.interpolateHslLong = hslLong; + exports.interpolateHue = hue$1; + exports.interpolateInferno = inferno; + exports.interpolateLab = lab$1; + exports.interpolateMagma = magma; + exports.interpolateNumber = interpolateNumber; + exports.interpolateNumberArray = numberArray; + exports.interpolateObject = object; + exports.interpolateOrRd = OrRd; + exports.interpolateOranges = Oranges; + exports.interpolatePRGn = PRGn; + exports.interpolatePiYG = PiYG; + exports.interpolatePlasma = plasma; + exports.interpolatePuBu = PuBu; + exports.interpolatePuBuGn = PuBuGn; + exports.interpolatePuOr = PuOr; + exports.interpolatePuRd = PuRd; + exports.interpolatePurples = Purples; + exports.interpolateRainbow = rainbow; + exports.interpolateRdBu = RdBu; + exports.interpolateRdGy = RdGy; + exports.interpolateRdPu = RdPu; + exports.interpolateRdYlBu = RdYlBu; + exports.interpolateRdYlGn = RdYlGn; + exports.interpolateReds = Reds; + exports.interpolateRgb = interpolateRgb; + exports.interpolateRgbBasis = rgbBasis; + exports.interpolateRgbBasisClosed = rgbBasisClosed; + exports.interpolateRound = interpolateRound; + exports.interpolateSinebow = sinebow; + exports.interpolateSpectral = Spectral; + exports.interpolateString = interpolateString; + exports.interpolateTransformCss = interpolateTransformCss; + exports.interpolateTransformSvg = interpolateTransformSvg; + exports.interpolateTurbo = turbo; + exports.interpolateViridis = viridis; + exports.interpolateWarm = warm; + exports.interpolateYlGn = YlGn; + exports.interpolateYlGnBu = YlGnBu; + exports.interpolateYlOrBr = YlOrBr; + exports.interpolateYlOrRd = YlOrRd; + exports.interpolateZoom = interpolateZoom; + exports.interrupt = interrupt; + exports.interval = interval$1; + exports.isoFormat = formatIso; + exports.isoParse = parseIso; + exports.json = json; + exports.keys = keys; + exports.lab = lab; + exports.lch = lch; + exports.line = line; + exports.lineRadial = lineRadial$1; + exports.linkHorizontal = linkHorizontal; + exports.linkRadial = linkRadial; + exports.linkVertical = linkVertical; + exports.local = local; + exports.map = map$1; + exports.matcher = matcher; + exports.max = max; + exports.mean = mean; + exports.median = median; + exports.merge = merge; + exports.min = min; + exports.mouse = mouse; + exports.namespace = namespace; + exports.namespaces = namespaces; + exports.nest = nest; + exports.now = now; + exports.pack = index$2; + exports.packEnclose = enclose; + exports.packSiblings = siblings; + exports.pairs = pairs; + exports.partition = partition; + exports.path = path; + exports.permute = permute; + exports.pie = pie; + exports.piecewise = piecewise; + exports.pointRadial = pointRadial; + exports.polygonArea = area$2; + exports.polygonCentroid = centroid$1; + exports.polygonContains = contains$2; + exports.polygonHull = hull; + exports.polygonLength = length$2; + exports.precisionFixed = precisionFixed; + exports.precisionPrefix = precisionPrefix; + exports.precisionRound = precisionRound; + exports.quadtree = quadtree; + exports.quantile = threshold; + exports.quantize = quantize; + exports.radialArea = areaRadial; + exports.radialLine = lineRadial$1; + exports.randomBates = bates; + exports.randomExponential = exponential$1; + exports.randomIrwinHall = irwinHall; + exports.randomLogNormal = logNormal; + exports.randomNormal = normal; + exports.randomUniform = uniform; + exports.range = sequence; + exports.rgb = rgb; + exports.ribbon = ribbon; + exports.scaleBand = band; + exports.scaleDiverging = diverging; + exports.scaleDivergingLog = divergingLog; + exports.scaleDivergingPow = divergingPow; + exports.scaleDivergingSqrt = divergingSqrt; + exports.scaleDivergingSymlog = divergingSymlog; + exports.scaleIdentity = identity$7; + exports.scaleImplicit = implicit; + exports.scaleLinear = linear$2; + exports.scaleLog = log$1; + exports.scaleOrdinal = ordinal; + exports.scalePoint = point$1; + exports.scalePow = pow$1; + exports.scaleQuantile = quantile; + exports.scaleQuantize = quantize$1; + exports.scaleSequential = sequential; + exports.scaleSequentialLog = sequentialLog; + exports.scaleSequentialPow = sequentialPow; + exports.scaleSequentialQuantile = sequentialQuantile; + exports.scaleSequentialSqrt = sequentialSqrt; + exports.scaleSequentialSymlog = sequentialSymlog; + exports.scaleSqrt = sqrt$1; + exports.scaleSymlog = symlog; + exports.scaleThreshold = threshold$1; + exports.scaleTime = time; + exports.scaleUtc = utcTime; + exports.scan = scan; + exports.schemeAccent = Accent; + exports.schemeBlues = scheme$l; + exports.schemeBrBG = scheme; + exports.schemeBuGn = scheme$9; + exports.schemeBuPu = scheme$a; + exports.schemeCategory10 = category10; + exports.schemeDark2 = Dark2; + exports.schemeGnBu = scheme$b; + exports.schemeGreens = scheme$m; + exports.schemeGreys = scheme$n; + exports.schemeOrRd = scheme$c; + exports.schemeOranges = scheme$q; + exports.schemePRGn = scheme$1; + exports.schemePaired = Paired; + exports.schemePastel1 = Pastel1; + exports.schemePastel2 = Pastel2; + exports.schemePiYG = scheme$2; + exports.schemePuBu = scheme$e; + exports.schemePuBuGn = scheme$d; + exports.schemePuOr = scheme$3; + exports.schemePuRd = scheme$f; + exports.schemePurples = scheme$o; + exports.schemeRdBu = scheme$4; + exports.schemeRdGy = scheme$5; + exports.schemeRdPu = scheme$g; + exports.schemeRdYlBu = scheme$6; + exports.schemeRdYlGn = scheme$7; + exports.schemeReds = scheme$p; + exports.schemeSet1 = Set1; + exports.schemeSet2 = Set2; + exports.schemeSet3 = Set3; + exports.schemeSpectral = scheme$8; + exports.schemeTableau10 = Tableau10; + exports.schemeYlGn = scheme$i; + exports.schemeYlGnBu = scheme$h; + exports.schemeYlOrBr = scheme$j; + exports.schemeYlOrRd = scheme$k; + exports.select = select; + exports.selectAll = selectAll; + exports.selection = selection; + exports.selector = selector; + exports.selectorAll = selectorAll; + exports.set = set$2; + exports.shuffle = shuffle; + exports.stack = stack; + exports.stackOffsetDiverging = diverging$1; + exports.stackOffsetExpand = expand; + exports.stackOffsetNone = none$1; + exports.stackOffsetSilhouette = silhouette; + exports.stackOffsetWiggle = wiggle; + exports.stackOrderAppearance = appearance; + exports.stackOrderAscending = ascending$3; + exports.stackOrderDescending = descending$2; + exports.stackOrderInsideOut = insideOut; + exports.stackOrderNone = none$2; + exports.stackOrderReverse = reverse; + exports.stratify = stratify; + exports.style = styleValue; + exports.sum = sum; + exports.svg = svg; + exports.symbol = symbol; + exports.symbolCircle = circle$2; + exports.symbolCross = cross$2; + exports.symbolDiamond = diamond; + exports.symbolSquare = square; + exports.symbolStar = star; + exports.symbolTriangle = triangle; + exports.symbolWye = wye; + exports.symbols = symbols; + exports.text = text; + exports.thresholdFreedmanDiaconis = freedmanDiaconis; + exports.thresholdScott = scott; + exports.thresholdSturges = thresholdSturges; + exports.tickFormat = tickFormat; + exports.tickIncrement = tickIncrement; + exports.tickStep = tickStep; + exports.ticks = ticks; + exports.timeDay = day; + exports.timeDays = days; + exports.timeFormatDefaultLocale = defaultLocale$1; + exports.timeFormatLocale = formatLocale$1; + exports.timeFriday = friday; + exports.timeFridays = fridays; + exports.timeHour = hour; + exports.timeHours = hours; + exports.timeInterval = newInterval; + exports.timeMillisecond = millisecond; + exports.timeMilliseconds = milliseconds; + exports.timeMinute = minute; + exports.timeMinutes = minutes; + exports.timeMonday = monday; + exports.timeMondays = mondays; + exports.timeMonth = month; + exports.timeMonths = months; + exports.timeSaturday = saturday; + exports.timeSaturdays = saturdays; + exports.timeSecond = second; + exports.timeSeconds = seconds; + exports.timeSunday = sunday; + exports.timeSundays = sundays; + exports.timeThursday = thursday; + exports.timeThursdays = thursdays; + exports.timeTuesday = tuesday; + exports.timeTuesdays = tuesdays; + exports.timeWednesday = wednesday; + exports.timeWednesdays = wednesdays; + exports.timeWeek = sunday; + exports.timeWeeks = sundays; + exports.timeYear = year; + exports.timeYears = years; + exports.timeout = timeout$1; + exports.timer = timer; + exports.timerFlush = timerFlush; + exports.touch = touch; + exports.touches = touches; + exports.transition = transition; + exports.transpose = transpose; + exports.tree = tree; + exports.treemap = index$3; + exports.treemapBinary = binary; + exports.treemapDice = treemapDice; + exports.treemapResquarify = resquarify; + exports.treemapSlice = treemapSlice; + exports.treemapSliceDice = sliceDice; + exports.treemapSquarify = squarify; + exports.tsv = tsv$1; + exports.tsvFormat = tsvFormat; + exports.tsvFormatBody = tsvFormatBody; + exports.tsvFormatRow = tsvFormatRow; + exports.tsvFormatRows = tsvFormatRows; + exports.tsvFormatValue = tsvFormatValue; + exports.tsvParse = tsvParse; + exports.tsvParseRows = tsvParseRows; + exports.utcDay = utcDay; + exports.utcDays = utcDays; + exports.utcFriday = utcFriday; + exports.utcFridays = utcFridays; + exports.utcHour = utcHour; + exports.utcHours = utcHours; + exports.utcMillisecond = millisecond; + exports.utcMilliseconds = milliseconds; + exports.utcMinute = utcMinute; + exports.utcMinutes = utcMinutes; + exports.utcMonday = utcMonday; + exports.utcMondays = utcMondays; + exports.utcMonth = utcMonth; + exports.utcMonths = utcMonths; + exports.utcSaturday = utcSaturday; + exports.utcSaturdays = utcSaturdays; + exports.utcSecond = second; + exports.utcSeconds = seconds; + exports.utcSunday = utcSunday; + exports.utcSundays = utcSundays; + exports.utcThursday = utcThursday; + exports.utcThursdays = utcThursdays; + exports.utcTuesday = utcTuesday; + exports.utcTuesdays = utcTuesdays; + exports.utcWednesday = utcWednesday; + exports.utcWednesdays = utcWednesdays; + exports.utcWeek = utcSunday; + exports.utcWeeks = utcSundays; + exports.utcYear = utcYear; + exports.utcYears = utcYears; + exports.values = values; + exports.variance = variance; + exports.version = version; + exports.voronoi = voronoi; + exports.window = defaultView; + exports.xml = xml; + exports.zip = zip; + exports.zoom = zoom; + exports.zoomIdentity = identity$9; + exports.zoomTransform = transform$1; + + Object.defineProperty(exports, '__esModule', {value: true}); + + })); diff --git a/src/main/webapp/assets/js/vendors/d3.min.js b/src/main/webapp/assets/js/vendors/d3.min.js new file mode 100644 index 0000000..5f7129d --- /dev/null +++ b/src/main/webapp/assets/js/vendors/d3.min.js @@ -0,0 +1,478 @@ +(function(b,Sa){"object"===typeof exports&&"undefined"!==typeof module?Sa(exports):"function"===typeof define&&define.amd?define(["exports"],Sa):(b=b||self,Sa(b.d3=b.d3||{}))})(this,function(b){function Sa(a,c){return ac?1:a>=c?0:NaN}function Af(a){1===a.length&&(a=fo(a));return{left:function(c,d,e,g){null==e&&(e=0);null==g&&(g=c.length);for(;e>>1;0>a(c[h],d)?e=h+1:g=h}return e},right:function(c,d,e,g){null==e&&(e=0);null==g&&(g=c.length);for(;e>>1;0=g)for(h=k=g;++eg&&(h=g),k=g)for(h=k=g;++eg&&(h=g),k(g=arguments.length)?(c=a,a=0,1):3>g?1:+d;for(var e=-1,g=Math.max(0,Math.ceil((c-a)/d))|0,h=Array(g);++e=Df?10:c>=Ef?5:c>=Ff?2:1)*Math.pow(10,a):-Math.pow(10,-a)/(c>=Df?10:c>=Ef?5:c>=Ff?2:1)}function Kb(a,c,d){var e=Math.abs(c-a)/Math.max(0, +d);d=Math.pow(10,Math.floor(Math.log(e)/Math.LN10));e/=d;e>=Df?d*=10:e>=Ef?d*=5:e>=Ff&&(d*=2);return c=(c=+c)||2>e)return+d(a[0],0,a);if(1<=c)return+d(a[e-1],e-1,a);var e;c*=e-1;e=Math.floor(c);var g=+d(a[e],e,a);a=+d(a[e+1],e+1,a);return g+(a-g)*(c-e)}}function oi(a,c){var d=a.length,e=-1,g,h;if(null==c)for(;++e=g)for(h=g;++e +h&&(h=g)}else for(;++e=g)for(h=g;++eh&&(h=g);return h}function Hf(a){var c=a.length;var d=-1;for(var e=0,g,h;++d=g)for(h=g;++eg&&(h=g)}else for(;++e=g)for(h=g;++eg&&(h=g);return h} +function qi(a){if(!(h=a.length))return[];for(var c=-1,d=pi(a,ho),e=Array(d);++cc?1:a>=c?0:NaN}function yo(a){return function(){this.removeAttribute(a)}}function zo(a){return function(){this.removeAttributeNS(a.space,a.local)}}function Ao(a,c){return function(){this.setAttribute(a,c)}}function Bo(a,c){return function(){this.setAttributeNS(a.space,a.local,c)}}function Co(a,c){return function(){var d=c.apply(this,arguments);null==d?this.removeAttribute(a): +this.setAttribute(a,d)}}function Do(a,c){return function(){var d=c.apply(this,arguments);null==d?this.removeAttributeNS(a.space,a.local):this.setAttributeNS(a.space,a.local,d)}}function Mf(a){return a.ownerDocument&&a.ownerDocument.defaultView||a.document&&a||a.defaultView}function Eo(a){return function(){this.style.removeProperty(a)}}function Fo(a,c,d){return function(){this.style.setProperty(a,c,d)}}function Go(a,c,d){return function(){var e=c.apply(this,arguments);null==e?this.style.removeProperty(a): +this.style.setProperty(a,e,d)}}function Mb(a,c){return a.style.getPropertyValue(c)||Mf(a).getComputedStyle(a,null).getPropertyValue(c)}function Ho(a){return function(){delete this[a]}}function Io(a,c){return function(){this[a]=c}}function Jo(a,c){return function(){var d=c.apply(this,arguments);null==d?delete this[a]:this[a]=d}}function Nf(a){return a.classList||new ti(a)}function ti(a){this._node=a;this._names=(a.getAttribute("class")||"").trim().split(/^|\s+/)}function ui(a,c){a=Nf(a);for(var d= +-1,e=c.length;++darguments.length&&(d=c,c=Qf().changedTouches);for(var e=0,g=c?c.length:0,h;e>8&15|c>>4&240,c>>4&15|c&240,(c&15)<<4|c&15,1):8===d?Yd(c>>24&255,c>>16&255,c>>8&255,(c&255)/255):4===d?Yd(c>>12&15|c>>8&240,c>>8&15|c>>4&240,c>>4&15|c&240,((c&15)<<4|c&15)/255):null):(c=kp.exec(a))?new va(c[1],c[2],c[3],1):(c=lp.exec(a))?new va(255*c[1]/ +100,255*c[2]/100,255*c[3]/100,1):(c=mp.exec(a))?Yd(c[1],c[2],c[3],c[4]):(c=np.exec(a))?Yd(255*c[1]/100,255*c[2]/100,255*c[3]/100,c[4]):(c=op.exec(a))?Di(c[1],c[2]/100,c[3]/100,1):(c=pp.exec(a))?Di(c[1],c[2]/100,c[3]/100,c[4]):Ei.hasOwnProperty(a)?Ci(Ei[a]):"transparent"===a?new va(NaN,NaN,NaN,0):null}function Ci(a){return new va(a>>16&255,a>>8&255,a&255,1)}function Yd(a,c,d,e){0>=e&&(a=c=d=NaN);return new va(a,c,d,e)}function Sf(a){a instanceof yb||(a=zb(a));if(!a)return new va;a=a.rgb();return new va(a.r, +a.g,a.b,a.opacity)}function gc(a,c,d,e){return 1===arguments.length?Sf(a):new va(a,c,d,null==e?1:e)}function va(a,c,d,e){this.r=+a;this.g=+c;this.b=+d;this.opacity=+e}function Fi(){return"#"+Tf(this.r)+Tf(this.g)+Tf(this.b)}function Gi(){var a=this.opacity;a=isNaN(a)?1:Math.max(0,Math.min(1,a));return(1===a?"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===a?")":", "+a+")")} +function Tf(a){a=Math.max(0,Math.min(255,Math.round(a)||0));return(16>a?"0":"")+a.toString(16)}function Di(a,c,d,e){0>=e?a=c=d=NaN:0>=d||1<=d?a=c=NaN:0>=c&&(a=NaN);return new eb(a,c,d,e)}function Hi(a){if(a instanceof eb)return new eb(a.h,a.s,a.l,a.opacity);a instanceof yb||(a=zb(a));if(!a)return new eb;if(a instanceof eb)return a;a=a.rgb();var c=a.r/255,d=a.g/255,e=a.b/255,g=Math.min(c,d,e),h=Math.max(c,d,e),k=NaN,p=h-g,t=(h+g)/2;p?(k=c===h?(d-e)/p+6*(dt?h+g:2- +h-g,k*=60):p=0t?0:k;return new eb(k,p,t,a.opacity)}function Zd(a,c,d,e){return 1===arguments.length?Hi(a):new eb(a,c,d,null==e?1:e)}function eb(a,c,d,e){this.h=+a;this.s=+c;this.l=+d;this.opacity=+e}function Uf(a,c,d){return 255*(60>a?c+(d-c)*a/60:180>a?d:240>a?c+(d-c)*(240-a)/60:c)}function Ii(a){if(a instanceof Ya)return new Ya(a.l,a.a,a.b,a.opacity);if(a instanceof fb)return Ji(a);a instanceof va||(a=Sf(a));var c=Vf(a.r),d=Vf(a.g),e=Vf(a.b),g=Wf(.2225045*c+.7168786*d+.0606169*e);if(c===d&& +d===e)var h=c=g;else h=Wf((.4360747*c+.3850649*d+.1430804*e)/.96422),c=Wf((.0139322*c+.0971045*d+.7141733*e)/.82521);return new Ya(116*g-16,500*(h-g),200*(g-c),a.opacity)}function $d(a,c,d,e){return 1===arguments.length?Ii(a):new Ya(a,c,d,null==e?1:e)}function Ya(a,c,d,e){this.l=+a;this.a=+c;this.b=+d;this.opacity=+e}function Wf(a){return a>qp?Math.pow(a,1/3):a/Ki+Li}function Xf(a){return a>hc?a*a*a:Ki*(a-Li)}function Yf(a){return 255*(.0031308>=a?12.92*a:1.055*Math.pow(a,1/2.4)-.055)}function Vf(a){return.04045>= +(a/=255)?a/12.92:Math.pow((a+.055)/1.055,2.4)}function Mi(a){if(a instanceof fb)return new fb(a.h,a.c,a.l,a.opacity);a instanceof Ya||(a=Ii(a));if(0===a.a&&0===a.b)return new fb(NaN,0a.l?0:NaN,a.l,a.opacity);var c=Math.atan2(a.b,a.a)*Ni;return new fb(0>c?c+360:c,Math.sqrt(a.a*a.a+a.b*a.b),a.l,a.opacity)}function ae(a,c,d,e){return 1===arguments.length?Mi(a):new fb(a,c,d,null==e?1:e)}function fb(a,c,d,e){this.h=+a;this.c=+c;this.l=+d;this.opacity=+e}function Ji(a){if(isNaN(a.h))return new Ya(a.l, +0,0,a.opacity);var c=a.h*Oi;return new Ya(a.l,Math.cos(c)*a.c,Math.sin(c)*a.c,a.opacity)}function Za(a,c,d,e){if(1===arguments.length){var g=a;if(g instanceof Pb)g=new Pb(g.h,g.s,g.l,g.opacity);else{g instanceof va||(g=Sf(g));var h=g.g/255,k=g.b/255,p=(Pi*k+g.r/255*-1.7884503806-3.5172982438*h)/(Pi+-1.7884503806-3.5172982438);k-=p;var t=(1.97294*(h-p)- -.29227*k)/-.90649;k=(h=Math.sqrt(t*t+k*k)/(1.97294*p*(1-p)))?Math.atan2(t,k)*Ni-120:NaN;g=new Pb(0>k?k+360:k,h,p,g.opacity)}}else g=new Pb(a,c,d, +null==e?1:e);return g}function Pb(a,c,d,e){this.h=+a;this.s=+c;this.l=+d;this.opacity=+e}function Qi(a,c,d,e,g){var h=a*a,k=h*a;return((1-3*a+3*h-k)*c+(4-6*h+3*k)*d+(1+3*a+3*h-3*k)*e+k*g)/6}function Ri(a){var c=a.length-1;return function(d){var e=0>=d?d=0:1<=d?(d=1,c-1):Math.floor(d*c),g=a[e],h=a[e+1];return Qi((d-e/c)*c,0(d%=1)?++d:d)*c);return Qi((d-e/c)*c,a[(e+c-1)%c],a[e%c],a[(e+1)%c], +a[(e+2)%c])}}function be(a){return function(){return a}}function Ti(a,c){return function(d){return a+d*c}}function rp(a,c,d){return a=Math.pow(a,d),c=Math.pow(c,d)-a,d=1/d,function(e){return Math.pow(a+e*c,d)}}function ce(a,c){var d=c-a;return d?Ti(a,180d?d-360*Math.round(d/360):d):be(isNaN(a)?c:a)}function sp(a){return 1===(a=+a)?sa:function(c,d){return d-c?rp(c,d,a):be(isNaN(c)?d:c)}}function sa(a,c){var d=c-a;return d?Ti(a,d):be(isNaN(a)?c:a)}function Ui(a){return function(c){var d=c.length, +e=Array(d),g=Array(d),h=Array(d),k;for(k=0;kd&&(h=c.slice(d,h),p[k]?p[k]+=h:p[++k]=h),(e=e[0])===(g=g[0])?p[k]?p[k]+=g:p[++k]=g:(p[++k]=null,t.push({i:k,x:Ta(e,g)})),d=bg.lastIndex;dp.length?t[0]?up(t[0].x):tp(c):(c=t.length,function(a){for(var d=0,e;dp){var t=Math.log(a/g)/Rc;a=function(a){return[d+a*h,e+a*k,g*Math.exp(Rc*a*t)]}}else{var b=Math.sqrt(p);c=(a*a-g*g+4*p)/(4*g*b);a=(a*a-g*g-4*p)/(4*a*b);var m=Math.log(Math.sqrt(c*c+1)-c);t=(Math.log(Math.sqrt(a*a+1)-a)-m)/Rc;a=function(a){a*=t;var c=cj(m),p=Rc*a+m;var q=((p=Math.exp(2*p))-1)/(p+1);var z=m;p=((z=Math.exp(z))-1/z)/2;q=g/(2* +b)*(c*q-p);return[d+q*h,e+q*k,g*c/cj(Rc*a+m)]}}a.duration=1E3*t;return a}function ej(a){return function(c,d){var e=a((c=Zd(c)).h,(d=Zd(d)).h),g=sa(c.s,d.s),h=sa(c.l,d.l),k=sa(c.opacity,d.opacity);return function(a){c.h=e(a);c.s=g(a);c.l=h(a);c.opacity=k(a);return c+""}}}function fj(a){return function(c,d){var e=a((c=ae(c)).h,(d=ae(d)).h),g=sa(c.c,d.c),h=sa(c.l,d.l),k=sa(c.opacity,d.opacity);return function(a){c.h=e(a);c.c=g(a);c.l=h(a);c.opacity=k(a);return c+""}}}function gj(a){return function e(d){function g(e, +g){var h=a((e=Za(e)).h,(g=Za(g)).h),k=sa(e.s,g.s),b=sa(e.l,g.l),m=sa(e.opacity,g.opacity);return function(a){e.h=h(a);e.s=k(a);e.l=b(Math.pow(a,d));e.opacity=m(a);return e+""}}d=+d;g.gamma=e;return g}(1)}function ic(){return Qb||(hj(vp),Qb=Sc.now()+de)}function vp(){Qb=0}function Tc(){this._call=this._time=this._next=null}function ee(a,c,d){var e=new Tc;e.restart(a,c,d);return e}function ij(){ic();++jc;for(var a=fe,c;a;)0<=(c=Qb-a._time)&&a._call.call(null,c),a=a._next;--jc}function jj(){Qb=(ge=Sc.now())+ +de;jc=Uc=0;try{ij()}finally{jc=0;for(var a,c=fe,d,e=Infinity;c;)c._call?(e>c._time&&(e=c._time),a=c,c=c._next):(d=c._next,c._next=null,c=a?a._next=d:fe=d);Vc=a;cg(e);Qb=0}}function wp(){var a=Sc.now(),c=a-ge;1E3a&&(Uc=setTimeout(jj,a-Sc.now()-de)),Wc&&(Wc=clearInterval(Wc))):(Wc||(ge=Sc.now(),Wc=setInterval(wp,1E3)),jc=1,hj(jj)))}function dg(a,c,d){var e=new Tc;c=null==c?0:+c;e.restart(function(d){e.stop();a(d+c)},c, +d);return e}function he(a,c,d,e,g,h){var k=a.__transition;if(!k)a.__transition={};else if(d in k)return;xp(a,d,{name:c,index:e,group:g,on:yp,tween:zp,time:h.time,delay:h.delay,duration:h.duration,ease:h.ease,timer:null,state:0})}function eg(a,c){a=$a(a,c);if(0e.state;e.state=6;e.timer.stop();e.on.call(k?"interrupt":"cancel",a,a.__data__,e.index,e.group);delete d[h]}g&&delete a.__transition}}function Ap(a,c){var d,e;return function(){var g=mb(this,a),h=g.tween;if(h!==d){e=d=h;h=0;for(var k=e.length;h=(a*=2)?a*a:--a*(2-a)+1)/2}function gg(a){return(1>=(a*=2)?a*a*a:(a-=2)*a*a+2)/2}function oj(a){return(1-Math.cos(pj*a))/2}function qj(a){return(1>=(a*=2)?Math.pow(2,10*a-10):2-Math.pow(2,10-10*a))/2}function rj(a){return(1>=(a*=2)?1-Math.sqrt(1-a*a):Math.sqrt(1-(a-=2)*a)+1)/ +2}function Xc(a){return(a=+a)Math.abs(a[1]-Oa[1])?X=!0:fa=!0);Oa=a;Q=!0;jg();g()}function g(){J=Oa[0]-$c[0];K=Oa[1]-$c[1];switch(z){case ng:case tj:v&&(J=Math.max(r-w,Math.min(C-B,J)),ca=w+J,A=B+J);f&&(K=Math.max(D-F,Math.min(S-H,K)),Aa=F+K,M=H+K);break;case kc:0>v?(J= +Math.max(r-w,Math.min(C-w,J)),ca=w+J,A=B):0f?(K=Math.max(D-F,Math.min(S-F,K)),Aa=F+K,M=H):0v?B=A-J:0f?H=M-K:0v?B=A:0f?H=M:0v?B=A:0f?H=M:0x!==F>x&&b<(u-r)*(x-w)/(F-w)+r&&(z=-z)}q=z}if(q){h=q;break a}}h=0}if(-1!==h){g.push(a);break}}});return{type:"MultiPolygon",value:c,coordinates:e}}function d(a,c,d){function e(a){var c=[a[0][0]+t,a[0][1]+p];a=[a[1][0]+t,a[1][1]+p];var e=2*c[0]+c[1]*(g+ +1)*4,h=2*a[0]+a[1]*(g+1)*4,q,f;(q=k[e])?(f=m[h])?(delete k[q.end],delete m[f.start],q===f?(q.ring.push(a),d(q.ring)):m[q.start]=k[f.end]={start:q.start,end:f.end,ring:q.ring.concat(f.ring)}):(delete k[q.end],q.ring.push(a),k[q.end=h]=q):(q=m[h])?(f=k[e])?(delete m[q.start],delete k[f.end],q===f?(q.ring.push(a),d(q.ring)):m[f.start]=k[q.end]={start:f.start,end:q.end,ring:f.ring.concat(q.ring)}):(delete m[q.start],q.ring.unshift(c),m[q.start=e]=q):m[e]=k[h]={start:e,end:h,ring:[c,a]}}var m=[],k=[], +p;var t=p=-1;var b=a[0]>=c;for(pb[b<<1].forEach(e);++t=c;pb[z|b<<1].forEach(e)}for(pb[b<<0].forEach(e);++p=c;var E=a[p*g]>=c;for(pb[b<<1|E<<2].forEach(e);++t=c;var y=E;E=a[p*g+t+1]>=c;pb[z|b<<1|E<<2|y<<3].forEach(e)}pb[b|E<<3].forEach(e)}t=-1;E=a[p*g]>=c;for(pb[E<<2].forEach(e);++t=c,pb[E<<2|y<<3].forEach(e);pb[E<<3].forEach(e)}function e(a,c,d){a.forEach(function(a){var e=a[0],m=a[1],k=e|0,p=m|0,q=c[p* +g+k];if(0=d&&(p>=h&&(t-=a.data[p-h+k*e]),c.data[p-d+k*e]=t/Math.min(p+1,e-1+h-p,h))}function rg(a,c,d){for(var e=a.width,g=a.height,h=(d<<1)+1,k=0;k=d&&(p>=h&&(t-=a.data[k+(p-h)*e]),c.data[k+(p-d)*e]=t/Math.min(p+1,g-1+h-p,h))}function zq(a){return a[0]}function Aq(a){return a[1]}function Bq(){return 1}function Bj(a){return new Function("d", +"return {"+a.map(function(a,d){return JSON.stringify(a)+": d["+d+'] || ""'}).join(",")+"}")}function Cq(a,c){var d=Bj(a);return function(e,g){return c(d(e),g,a)}}function Cj(a){var c=Object.create(null),d=[];a.forEach(function(a){for(var e in a)e in c||d.push(c[e]=e)});return d}function La(a,c){a+="";var d=a.length;return d=g?b=!0:10===(e=a.charCodeAt(h++))?I=!0:13===e&&(I=!0,10===a.charCodeAt(h)&&++h);return a.slice(d+1,c-1).replace(/""/g,'"')}for(;h=g,I=!1;10===a.charCodeAt(g-1)&&--g;for(13===a.charCodeAt(g-1)&&--g;(t=d())!==sg;){for(var N=[];t!==Dj&&t!==sg;)N.push(t),t=d();c&&null==(N=c(N,p++))|| +e.push(N)}return e}function d(c,d){return c.map(function(c){return d.map(function(a){return g(c[a])}).join(a)})}function e(c){return c.map(g).join(a)}function g(a){if(null==a)a="";else{if(a instanceof Date){var c=a.getUTCHours();var d=a.getUTCMinutes(),e=a.getUTCSeconds(),g=a.getUTCMilliseconds();if(isNaN(a))a="Invalid Date";else{var k=a.getUTCFullYear();a=(0>k?"-"+La(-k,6):9999=(m=(k+b)/2))?k=m:b=m,(v=d>=(q=(p+z)/2))?p= +q:z=q,g=h,!(h=h[x|=v<<1]))return g[x]=e,a;var B=+a._x.call(null,h.data);var G=+a._y.call(null,h.data);if(c===B&&d===G)return e.next=h,g?g[x]=e:a._root=e,a;do g=g?g[x]=Array(4):a._root=Array(4),(x=c>=(m=(k+b)/2))?k=m:b=m,(v=d>=(q=(p+z)/2))?p=q:z=q;while((x|=v<<1)===(v=(G>=q)<<1|B>=m));return g[v]=h,g[x]=e,a}function Ca(a,c,d,e,g){this.node=a;this.x0=c;this.y0=d;this.x1=e;this.y1=g}function Hq(a){return a[0]}function Iq(a){return a[1]}function pe(a,c,d){c=new ug(null==c?Hq:c,null==d?Iq:d,NaN,NaN,NaN, +NaN);return null==a?c:c.addAll(a)}function ug(a,c,d,e,g,h){this._x=a;this._y=c;this._x0=d;this._y0=e;this._x1=g;this._y1=h;this._root=void 0}function Gj(a){for(var c={data:a.data},d=c;a=a.next;)d=d.next={data:a.data};return c}function Jq(a){return a.x+a.vx}function Kq(a){return a.y+a.vy}function Lq(a){return a.index}function Hj(a,c){a=a.get(c);if(!a)throw Error("missing: "+c);return a}function Mq(a){return a.x}function Nq(a){return a.y}function qe(a,c){if(0>(c=(a=c?a.toExponential(c-1):a.toExponential()).indexOf("e")))return null; +var d=a.slice(0,c);return[1e&&(p=Math.max(1,e-b));h.push(d.substring(g-=p,g+p));if((b+=p+1)>e)break;p=a[k=(k+1)%a.length]}return h.reverse().join(c)}}function Pq(a){return function(c){return c.replace(/[0-9]/g,function(c){return a[+c]})}}function ad(a){if(!(c=Qq.exec(a)))throw Error("invalid format: "+a);var c;return new re({fill:c[1], +align:c[2],sign:c[3],symbol:c[4],zero:c[5],width:c[6],comma:c[7],precision:c[8]&&c[8].slice(1),trim:c[9],type:c[10]})}function re(a){this.fill=void 0===a.fill?" ":a.fill+"";this.align=void 0===a.align?">":a.align+"";this.sign=void 0===a.sign?"-":a.sign+"";this.symbol=void 0===a.symbol?"":a.symbol+"";this.zero=!!a.zero;this.width=void 0===a.width?void 0:+a.width;this.comma=!!a.comma;this.precision=void 0===a.precision?void 0:+a.precision;this.trim=!!a.trim;this.type=void 0===a.type?"":a.type+""}function Ij(a, +c){c=qe(a,c);if(!c)return a+"";a=c[0];c=c[1];return 0>c?"0."+Array(-c).join("0")+a:a.length>c+1?a.slice(0,c+1)+"."+a.slice(c+1):a+Array(c-a.length+2).join("0")}function Jj(a){return a}function Kj(a){function c(a){function c(a){var c=O,e=U,g,p;if("c"===L)e=ia(a)+e,a="";else{a=+a;var q=0>a||0>1/a;a=isNaN(a)?z:ia(Math.abs(a),y);if(P){var l=a.length,x=1,v=-1;a:for(;xp||57>1)+c+a+e+q.slice(p);break; +default:a=q+c+a+e}return k(a)}a=ad(a);var m=a.fill,t=a.align,B=a.sign,G=a.symbol,I=a.zero,N=a.width,E=a.comma,y=a.precision,P=a.trim,L=a.type;"n"===L?(E=!0,L="g"):Nj[L]||(void 0===y&&(y=12),P=!0,L="g");if(I||"0"===m&&"="===t)I=!0,m="0",t="=";var O="$"===G?e:"#"===G&&/[boxX]/.test(L)?"0"+L.toLowerCase():"",U="$"===G?g:/[%p]/.test(L)?p:"",ia=Nj[L],f=/[defgprs%]/.test(L);y=void 0===y?6:/[gprs]/.test(L)?Math.max(1,Math.min(21,y)):Math.max(0,Math.min(20,y));c.toString=function(){return a+""};return c} +var d=void 0===a.grouping||void 0===a.thousands?Jj:Oq(Oj.call(a.grouping,Number),a.thousands+""),e=void 0===a.currency?"":a.currency[0]+"",g=void 0===a.currency?"":a.currency[1]+"",h=void 0===a.decimal?".":a.decimal+"",k=void 0===a.numerals?Jj:Pq(Oj.call(a.numerals,String)),p=void 0===a.percent?"%":a.percent+"",b=void 0===a.minus?"-":a.minus+"",z=void 0===a.nan?"NaN":a.nan+"";return{format:c,formatPrefix:function(a,d){var e=c((a=ad(a),a.type="f",a));a=3*Math.max(-8,Math.min(8,Math.floor(mc(d)/3))); +var g=Math.pow(10,-a),h=Lj[8+a/3];return function(a){return e(g*a)+h}}}}function Pj(a){se=Kj(a);b.format=se.format;b.formatPrefix=se.formatPrefix;return se}function Qj(a){return Math.max(0,-mc(Math.abs(a)))}function Rj(a,c){return Math.max(0,3*Math.max(-8,Math.min(8,Math.floor(mc(c)/3)))-mc(Math.abs(a)))}function Sj(a,c){a=Math.abs(a);c=Math.abs(c)-a;return Math.max(0,mc(c)-mc(a))+1}function ab(){this.reset()}function Tj(a,c,d){var e=a.s=c+d,g=e-c;a.t=c-(e-g)+(d-g)}function Uj(a){return 1 +a?Y:Math.acos(a)}function Da(a){return 1a?-ka:Math.asin(a)}function Vj(a){return(a=A(a/2))*a}function la(){}function te(a,c){if(a&&Wj.hasOwnProperty(a.type))Wj[a.type](a,c)}function vg(a,c,d){var e=-1;d=a.length-d;for(c.lineStart();++ePa&&(Pa=c)}function ck(a,c){var d=Sb([a*W,c*W]);if(oc){var e=nc(oc,d);e=nc([e[1],-e[0],0],e);ze(e);e=we(e);var g=a-Tb,h=0Pa&&(Pa=e)):(k=(k+360)%360-180,g^(h*TbPa&&(Pa=c));g?aQa(ma,na)&&(na=a):Qa(a,na)>Qa(ma,na)&&(ma=a):na>=ma?(ana&&(na=a)):a>Tb?Qa(ma,a)>Qa(ma,na)&&(na=a):Qa(a,na)>Qa(ma,na)&&(ma=a)}else Eb.push(qb=[ma=a,na=a]);cPa&&(Pa=c);oc=d;Tb=a}function dk(){rb.point=ck}function ek(){qb[0]=ma;qb[1]=na;rb.point=Ag;oc=null}function fk(a,c){if(oc){var d=a-Tb;bd.add(180(c-=a)?c+360:c}function Wq(a,c){return a[0]-c[0]}function ik(a,c){return a[0]<=a[1]?a[0]<=c&&c<=a[1]:cY?a+Math.round(-a/Ia)*Ia:a,c]}function Hg(a,c,d){return(a%=Ia)?c||d?Fg(ok(a),pk(c,d)):ok(a):c||d?pk(c,d):Gg}function qk(a){return function(c,d){return c+=a,[c>Y?c-Ia:c<-Y?c+Ia:c,d]}}function ok(a){var c=qk(a);c.invert=qk(-a);return c} +function pk(a,c){function d(a,c){var d=M(c),m=M(a)*d;a=A(a)*d;c=A(c);d=c*e+m*g;return[Ea(a*h-d*k,m*e-c*g),Da(d*h+a*k)]}var e=M(a),g=A(a),h=M(c),k=A(c);d.invert=function(a,c){var d=M(c),m=M(a)*d;a=A(a)*d;c=A(c);d=c*h-a*k;return[Ea(a*h+c*k,m*e+d*g),Da(d*e-m*g)]};return d}function rk(a){function c(c){c=a(c[0]*W,c[1]*W);return c[0]*=ha,c[1]*=ha,c}a=Hg(a[0]*W,a[1]*W,2h)g+=e*Ia;for(;0h:g-c[2]?-a:a)+Ia-1E-6)%Ia}function uk(){var a=[],c;return{point:function(a,e){c.push([a,e])},lineStart:function(){a.push(c=[])},lineEnd:la,rejoin:function(){1 +aa(a[0]-c[0])&&1E-6>aa(a[1]-c[1])}function Ie(a,c,d,e){this.x=a;this.z=c;this.o=d;this.e=e;this.v=!1;this.n=this.p=null}function vk(a,c,d,e,g){var h=[],k=[];a.forEach(function(a){if(!(0>=(c=a.length-1))){var c,d=a[0],e=a[c];if(He(d,e)){g.lineStart();for(p=0;pY;v*=N;Jg.add(Ea(v*P*A(L),B*E+v*M(L)));h+=O?y+P*Ia:y;O^q>=d^I>=d&&(m=nc(Sb(m),Sb(G)),ze(m),q=nc(g,m),ze(q),q=(O^0<=y?-1:1)*Da(q[2]),c>q||c===q&&(m[0]||m[1]))&&(k+= +O^0<=y?1:-1)}}return(-1E-6>h||1E-6>h&&-1E-6>Jg)^k&1}function yk(a,c,d,e){return function(g){function h(c,d){a(c,d)&&g.point(c,d)}function k(a,c){x.point(a,c)}function p(){y.point=k;x.lineStart()}function b(){y.point=h;x.lineEnd()}function z(a,c){E.push([a,c]);B.point(a,c)}function m(){B.lineStart();E=[]}function q(){z(E[0][0],E[0][1]);B.lineEnd();var a=B.clean(),c=v.result(),d=c.length,e;E.pop();I.push(E);E=null;if(d)if(a&1){if(d=c[0],0<(c=d.length-1)){G||(g.polygonStart(),G=!0);g.lineStart();for(a= +0;a(a=a.x)[0]?a[1]-ka-1E-6:ka-a[1])-(0>(c=c.x)[0]?c[1]-ka-1E-6:ka-c[1])}function zk(a){function c(a,c){return M(a)*M(c)>g}function d(a,c,d){var e=Sb(a),h=Sb(c),k=[1,0,0];h=nc(e,h);var m=xe(h,h);e=h[0];var p=m-e*e;if(!p)return!d&&a;m=g*m/p;p=-g*e/p;e=nc(k,h);k=ye(k,m);h=ye(h,p);zg(k,h);h=xe(k,e);m=xe(e,e);p=h*h-m*(xe(k,k)-1);if(!(0>p)){var b= +pa(p);p=ye(e,(-h-b)/m);zg(p,k);p=we(p);if(!d)return p;d=a[0];var t=c[0];a=a[1];c=c[1];if(taa(z-Y);!P&&cz?P?0aa(p[0]-d)?a:c):a<=p[1]&&p[1]<=c:z>Y^(d<=p[0]&&p[0]<=t))return c=ye(e,(-h+b)/m),zg(c,k),[p,we(c)]}}function e(c,d){var e=k?a:Y-a,g=0;c<-e?g|=1:c>e&&(g|=2);d<-e?g|=4:d>e&&(g|=8);return g}var g=M(a),h=6*W,k=0m?Y:-Y),x):0;!g&&(b=q=z)&&a.lineStart();z!==q&&(m=d(g,v),!m||He(g,m)||He(v,m))&&(v[0]+=1E-6,v[1]+=1E-6,z=c(v[0],v[1]));if(z!==q)t=0,z?(a.lineStart(),m=d(v,g),a.point(m[0],m[1])):(m=d(g,v),a.point(m[0],m[1]),a.lineEnd()),g=m;else if(p&&g&&k^z){var E;x&h||!(E=d(v,g,!0))||(t=0,k?(a.lineStart(),a.point(E[0][0],E[0][1]),a.point(E[1][0],E[1][1]),a.lineEnd()):(a.point(E[1][0],E[1][1]),a.lineEnd(),a.lineStart(),a.point(E[0][0],E[0][1])))}!z||g&&He(g,v)||a.point(v[0], +v[1]);g=v;q=z;h=x},lineEnd:function(){q&&a.lineEnd();g=null},clean:function(){return t|(b&&q)<<1}}},function(c,d,e,g){sk(g,a,h,e,c,d)},k?[0,-a]:[-Y,a-Y])}function dr(a,c,d,e,g,h){var k=a[0],p=a[1],b=0,z=1,m=c[0]-k,q=c[1]-p;d-=k;if(m||!(0m){if(dz)return;d>b&&(b=d)}d=g-k;if(m||!(0>d)){d/=m;if(0>m){if(d>z)return;d>b&&(b=d)}else if(0q){if(dz)return;d> +b&&(b=d)}d=h-p;if(q||!(0>d)){d/=q;if(0>q){if(d>z)return;d>b&&(b=d)}else if(0z&&(c[0]=k+z*m,c[1]=p+z*q);return!0}}}}}function Je(a,c,d,e){function g(g,k,m,b){var q=0,t=0;if(null==g||(q=h(g,m))!==(t=h(k,m))||0>p(g,k)^0aa(e[0]-a)?0aa(e[0]-d)?0aa(e[1]-c)?0e&&(E-y)*(e-z)>(x-z)*(a-y)&&++c:x<=e&&(E-y)*(e-z)<(x-z)*(a-y)&&--c}}d=U&&c;m=(v=Hf(v)).length;if(d||m)h.polygonStart(),d&&(h.lineStart(),g(null,null,1,h),h.lineEnd()),m&&vk(v,k,c,g,h),h.polygonEnd();b=h;v=B=G=null}};return ia}}function er(){qc.point=qc.lineEnd=la}function fr(a,c){a*=W;c*=W;Kg=a;Ke=A(c);Le=M(c);qc.point=gr}function gr(a,c){a*=W;c*=W;var d=A(c);c=M(c);var e=aa(a-Kg),g=M(e);e=A(e);e*=c;var h=Le*d-Ke*c*g;g=Ke*d+Le*c*g;Lg.add(Ea(pa(e*e+h*h),g));Kg=a;Ke=d;Le=c}function Ak(a){Lg.reset(); +bb(a,qc);return+Lg}function ed(a,c){Mg[0]=a;Mg[1]=c;return Ak(hr)}function Me(a,c){return a&&Bk.hasOwnProperty(a.type)?Bk[a.type](a,c):!1}function Ck(a,c){for(var d,e,g,h=0,k=a.length;hg&&(c=h,h=g,g=c);z>b&&(c=z,z=b,b=c);return a.precision(E)};a.extentMinor=function(c){if(!arguments.length)return[[e,p],[d,k]];e=+c[0][0];d=+c[1][0]; +p=+c[0][1];k=+c[1][1];e>d&&(c=e,e=d,d=c);p>k&&(c=p,p=k,k=c);return a.precision(E)};a.step=function(c){return arguments.length?a.stepMajor(c).stepMinor(c):a.stepMinor()};a.stepMajor=function(c){if(!arguments.length)return[x,v];x=+c[0];v=+c[1];return a};a.stepMinor=function(c){if(!arguments.length)return[m,q];m=+c[0];q=+c[1];return a};a.precision=function(c){if(!arguments.length)return E;E=+c;B=Fk(p,k,90);G=Gk(e,d,E);I=Fk(z,b,90);N=Gk(h,g,E);return a};return a.extentMajor([[-180,-89.999999],[180,89.999999]]).extentMinor([[-180, +-80.000001],[180,80.000001]])}function fd(a){return a}function jr(){sb.point=kr}function kr(a,c){sb.point=Ik;Jk=Ng=a;Kk=Og=c}function Ik(a,c){Pg.add(Og*a-Ng*c);Ng=a;Og=c}function lr(){Ik(Jk,Kk)}function Ub(a,c){Qg+=a;Rg+=c;++gd}function Lk(){Wa.point=mr}function mr(a,c){Wa.point=nr;Ub(ib=a,jb=c)}function nr(a,c){var d=a-ib,e=c-jb;d=pa(d*d+e*e);Oe+=d*(ib+a)/2;Pe+=d*(jb+c)/2;rc+=d;Ub(ib=a,jb=c)}function Mk(){Wa.point=Ub}function or(){Wa.point=pr}function qr(){Nk(Ok,Pk)}function pr(a,c){Wa.point=Nk; +Ub(Ok=ib=a,Pk=jb=c)}function Nk(a,c){var d=a-ib,e=c-jb;d=pa(d*d+e*e);Oe+=d*(ib+a)/2;Pe+=d*(jb+c)/2;rc+=d;d=jb*a-ib*c;Sg+=d*(ib+a);Tg+=d*(jb+c);hd+=3*d;Ub(ib=a,jb=c)}function Qk(a){this._context=a}function rr(a,c){id.point=Rk;Sk=jd=a;Tk=kd=c}function Rk(a,c){jd-=a;kd-=c;Ug.add(pa(jd*jd+kd*kd));jd=a;kd=c}function Uk(){this._string=[]}function Vk(a){return"m0,"+a+"a"+a+","+a+" 0 1,1 0,"+-2*a+"a"+a+","+a+" 0 1,1 0,"+2*a+"z"}function ld(a){return function(c){var d=new Vg,e;for(e in a)d[e]=a[e];d.stream= +c;return d}}function Vg(){}function Wg(a,c,d){var e=a.clipExtent&&a.clipExtent();a.scale(150).translate([0,0]);null!=e&&a.clipExtent(null);bb(d,a.stream(Qe));c(Qe.result());null!=e&&a.clipExtent(e);return a}function sc(a,c,d){return Wg(a,function(d){var e=c[1][0]-c[0][0],h=c[1][1]-c[0][1],k=Math.min(e/(d[1][0]-d[0][0]),h/(d[1][1]-d[0][1]));e=+c[0][0]+(e-k*(d[1][0]+d[0][0]))/2;d=+c[0][1]+(h-k*(d[1][1]+d[0][1]))/2;a.scale(150*k).translate([e,d])},d)}function Xg(a,c,d){return Wg(a,function(d){var e= ++c,h=e/(d[1][0]-d[0][0]);e=(e-h*(d[1][0]+d[0][0]))/2;d=-h*d[0][1];a.scale(150*h).translate([e,d])},d)}function Yg(a,c,d){return Wg(a,function(d){var e=+c,h=e/(d[1][1]-d[0][1]),k=-h*d[0][0];d=(e-h*(d[1][1]+d[0][1]))/2;a.scale(150*h).translate([k,d])},d)}function Wk(a){return ld({point:function(c,d){c=a(c,d);this.stream.point(c[0],c[1])}})}function Xk(a,c){function d(e,g,h,k,p,b,z,m,q,x,v,B,G,I){var t=z-e,E=m-g,y=t*t+E*E;if(y>4*c&&G--){var P=k+x,L=p+v,O=b+B,U=pa(P*P+L*L+O*O),ia=Da(O/=U),f=1E-6>aa(aa(O)- +1)||1E-6>aa(h-q)?(h+q)/2:Ea(L,P),l=a(f,ia);ia=l[0];l=l[1];var u=ia-e,n=l-g,r=E*u-t*n;if(r*r/y>c||.3I};c.reflectY=function(a){return arguments.length?(N=a?-1:1,e()):0>N};c.precision=function(a){if(arguments.length){var c=u;var d=f=a*a;c=(l=+d?Xk(c,d):Wk(c),g())}else c=pa(f);return c};c.fitExtent=function(a,d){return sc(c,a,d)};c.fitSize=function(a,d){return sc(c,[[0,0],a],d)};c.fitWidth=function(a,d){return Xg(c,a,d)};c.fitHeight=function(a,d){return Yg(c,a,d)}; +return function(){h=a.apply(this,arguments);c.invert=h.invert&&d;return e()}}function ah(a){var c=0,d=Y/3,e=Zg(a);a=e(c,d);a.parallels=function(a){return arguments.length?e(c=a[0]*W,d=a[1]*W):[c*ha,d*ha]};return a}function wr(a){function c(a,c){return[a*d,A(c)/d]}var d=M(a);c.invert=function(a,c){return[a/d,Da(c*d)]};return c}function Zk(a,c){function d(a,c){c=pa(h-2*g*A(c))/g;return[c*A(a*=g),k-c*M(a)]}var e=A(a),g=(e+A(c))/2;if(1E-6>aa(g))return wr(a);var h=1+e*(2*g-e),k=pa(h)/g;d.invert=function(a, +c){c=k-c;var d=Ea(a,aa(c))*Va(c);0>c*g&&(d-=Y*Va(a)*Va(c));return[d/g,Da((h-(a*a+c*c)*g*g)/(2*g))]};return d}function Re(){return ah(Zk).scale(155.424).center([0,33.6442])}function $k(){return Re().parallels([29.5,45.5]).scale(1070).translate([480,250]).rotate([96,0]).center([-.6,38.7])}function xr(a){var c=a.length;return{point:function(d,e){for(var g=-1;++gka-1E-6&&(c=ka-1E-6);c=h/bh(tc((ka+c)/2),g);return[c*A(g*a),h-c*M(g*a)]}var e=M(a),g=a===c?A(a):Se(e/M(c))/Se(tc((ka+c)/2)/tc((ka+a)/2)),h=e*bh(tc((ka+a)/2),g)/g;if(!g)return nd;d.invert=function(a,c){c=h-c;var d=Va(g)*pa(a*a+c*c),e=Ea(a,aa(c))*Va(c);0>c*g&&(e-=Y*Va(a)*Va(c));return[e/g,2*uc(bh(h/d,1/g))-ka]};return d}function od(a,c){return[a,c]}function dl(a,c){function d(a,c){c=h-c;a*=g;return[c* +A(a),h-c*M(a)]}var e=M(a),g=a===c?A(a):(e-M(c))/(c-a),h=e/g+a;if(1E-6>aa(g))return od;d.invert=function(a,c){c=h-c;var d=Ea(a,aa(c))*Va(c);0>c*g&&(d-=Y*Va(a)*Va(c));return[d/g,h-Va(g)*pa(a*a+c*c)]};return d}function ch(a,c){c=Da(Te*A(c));var d=c*c,e=d*d*d;return[a*M(c)/(Te*(1.340264+3*-.081106*d+e*(7*8.93E-4+.034164*d))),c*(1.340264+-.081106*d+e*(8.93E-4+.003796*d))]}function dh(a,c){var d=M(c),e=M(a)*d;return[d*A(a)/e,A(c)/e]}function eh(a,c){var d=c*c,e=d*d;return[a*(.8707-.131979*d+e*(-.013791+ +e*(.003971*d-.001529*e))),c*(1.007226+d*(.015085+e*(-.044475+.028874*d-.005916*e)))]}function fh(a,c){return[M(c)*A(a),A(c)]}function gh(a,c){var d=M(c),e=1+M(a)*d;return[d*A(a)/e,A(c)/e]}function hh(a,c){return[Se(tc((ka+c)/2)),-a]}function yr(a,c){return a.parent===c.parent?1:2}function zr(a,c){return a+c.x}function Ar(a,c){return Math.max(a,c.y)}function Br(a){for(var c;c=a.children;)a=c[0];return a}function Cr(a){for(var c;c=a.children;)a=c[c.length-1];return a}function Dr(a){var c=0,d=a.children, +e=d&&d.length;if(e)for(;0<=--e;)c+=d[e].value;else c=1;a.value=c}function ih(a,c){var d=new vc(a);a=+a.value&&(d.value=a.value);var e,g=[d],h,k,b,t;for(null==c&&(c=Er);e=g.pop();)if(a&&(e.value=+e.data.value),(k=c(e.data))&&(t=k.length))for(e.children=Array(t),b=t-1;0<=b;--b)g.push(h=e.children[b]=new vc(k[b])),h.parent=e,h.depth=e.depth+1;return d.eachBefore(el)}function Er(a){return a.children}function Fr(a){a.data=a.data.data}function el(a){var c=0;do a.height=c;while((a=a.parent)&&a.height<++c)} +function vc(a){this.data=a;this.depth=this.height=0;this.parent=null}function fl(a){var c=0;a=Gr.call(a);for(var d=a.length,e,g;d;)g=Math.random()*d--|0,e=a[d],a[d]=a[g],a[g]=e;d=a.length;e=[];for(var h;cd||d*de*e+a*a}function jh(a,c){for(var d=0;d +b){var t=(h+b-k)/(2*h);k=Math.sqrt(Math.max(0,b/h-t*t));d.x=a.x-t*e-k*g;d.y=a.y-t*g+k*e}else t=(h+k-b)/(2*h),k=Math.sqrt(Math.max(0,k/h-t*t)),d.x=c.x+t*e-k*g,d.y=c.y+t*g+k*e}else d.x=c.x+d.r,d.y=c.y}function jl(a,c){var d=a.r+c.r-1E-6,e=c.x-a.x;a=c.y-a.y;return 0e*e+a*a}function kl(a){var c=a._,d=a.next._,e=c.r+d.r;a=(c.x*d.r+d.x*c.r)/e;c=(c.y*d.r+d.y*c.r)/e;return a*a+c*c}function Ve(a){this._=a;this.previous=this.next=null}function ll(a){if(!(d=a.length))return 0;var c,d;var e=a[0];e.x= +0;e.y=0;if(!(1I&&(I=z);N=B*B*y;N=Math.max(I/N,N/G);if(N>E){B-=z;break}E=N}k.push(t={value:B,dice:c=Mr(a[d[e-2]],a[d[e-1]],a[g]);)--e;d[e++]=g}return d.slice(0,e)}function xc(){return Math.random()}function db(a,c){switch(arguments.length){case 0:break;case 1:this.range(a);break;default:this.range(c).domain(a)}return this}function tb(a,c){switch(arguments.length){case 0:break; +case 1:this.interpolator(a);break;default:this.interpolator(c).domain(a)}return this}function nh(){function a(a){var h=a+"",b=c.get(h);if(!b){if(g!==oh)return g;c.set(h,b=d.push(a))}return e[(b-1)%e.length]}var c=ob(),d=[],e=[],g=oh;a.domain=function(e){if(!arguments.length)return d.slice();d=[];c=ob();for(var g=-1,h=e.length,b,z;++gd&&(a=c,c=d,d=a);return function(a){return Math.max(c,Math.min(d,a))}}function Pr(a,c,d){var e=a[0];a=a[1];var g=c[0];c=c[1];at&&(b=Math.ceil(b*t)/t,p=Math.floor(p*t)/t,t=Jc(b,p,d));0t&&(e[g]=Math.ceil(b*t)/t,e[h]=Math.floor(p*t)/t,c(e));return a};return a}function wl(){var a=ul(wa,wa);a.copy=function(){return rd(a,wl())};db.apply(a,arguments);return Xb(a)}function xl(a){function c(a){return isNaN(a=+a)?d:a}var d;c.invert=c;c.domain=c.range=function(d){return arguments.length?(a=$e.call(d,qh),c):a.slice()};c.unknown=function(a){return arguments.length? +(d=a,c):d};c.copy=function(){return xl(a).unknown(d)};a=arguments.length?$e.call(a,qh):[0,1];return Xb(c)}function yl(a,c){a=a.slice();var d=0,e=a.length-1,g=a[d],h=a[e];if(ha?0:a}function Ur(a){return 10===a?Tr:a===Math.E?Math.exp:function(c){return Math.pow(a, +c)}}function Vr(a){return a===Math.E?Math.log:10===a&&Math.log10||2===a&&Math.log2||(a=Math.log(a),function(c){return Math.log(c)/a})}function Bl(a){return function(c){return-a(-c)}}function sh(a){function c(){h=Vr(g);k=Ur(g);0>e()[0]?(h=Bl(h),k=Bl(k),a(Rr,Sr)):a(zl,Al);return d}var d=a(zl,Al),e=d.domain,g=10,h,k;d.base=function(a){return arguments.length?(g=+a,c()):g};d.domain=function(a){return arguments.length?(e(a),c()):e()};d.ticks=function(a){var c=e(),d=c[0];c=c[c.length-1];var b;if(b=cc)break;a.push(G)}}}else for(;qc)break;a.push(G)}}else a=Cf(q,p,Math.min(p-q,v)).map(k);return b?a.reverse():a};d.tickFormat=function(a,c){null==c&&(c=10===g?".0e":",");"function"!==typeof c&&(c=b.format(c));if(Infinity===a)return c;null==a&&(a=10);var e=Math.max(1, +g*a/d.ticks().length);return function(a){var d=a/k(Math.round(h(a)));d*gc?-Math.pow(-c,a):Math.pow(c,a)}}function Wr(a){return 0>a?-Math.sqrt(-a):Math.sqrt(a)}function Xr(a){return 0>a?-a*a:a*a}function uh(a){var c=a(wa,wa),d=1;c.exponent=function(c){return arguments.length? +(d=+c,1===d?a(wa,wa):.5===d?a(Wr,Xr):a(Gl(d),Gl(1/d))):d};return Xb(c)}function vh(){var a=uh(Ze());a.copy=function(){return rd(a,vh()).exponent(a.exponent())};db.apply(a,arguments);return a}function Hl(){function a(){var a=0,h=Math.max(1,e.length);for(g=Array(h-1);++aa?[NaN,NaN]:[0a?[NaN,NaN]:1>a?[d,h[0]]:a>=g?[h[g-1],e]:[h[a-1],h[a]]};a.unknown=function(c){return arguments.length?(p=c,a):a};a.thresholds=function(){return h.slice()};a.copy=function(){return Il().domain([d,e]).range(b).unknown(p)};return db.apply(Xb(a),arguments)}function Jl(){function a(a){return a<= +a?d[Fb(c,a,0,g)]:e}var c=[.5],d=[0,1],e,g=1;a.domain=function(e){return arguments.length?(c=Wb.call(e),g=Math.min(c.length,d.length-1),a):c.slice()};a.range=function(e){return arguments.length?(d=Wb.call(e),g=Math.min(c.length,d.length-1),a):d.slice()};a.invertExtent=function(a){a=d.indexOf(a);return[c[a-1],c[a]]};a.unknown=function(c){return arguments.length?(e=c,a):e};a.copy=function(){return Jl().domain(c).range(d).unknown(e)};return db.apply(a,arguments)}function ra(a,c,d,e){function g(c){return a(c= +0===arguments.length?new Date:new Date(+c)),c}g.floor=function(c){return a(c=new Date(+c)),c};g.ceil=function(d){return a(d=new Date(d-1)),c(d,1),a(d),d};g.round=function(a){var c=g(a),d=g.ceil(a);return a-c= +c)for(;a(c),!d(c);)c.setTime(c-1)},function(a,e){if(a>=a)if(0>e)for(;0>=++e;)for(;c(a,-1),!d(a););else for(;0<=--e;)for(;c(a,1),!d(a););})};d&&(g.count=function(c,e){wh.setTime(+c);xh.setTime(+e);a(wh);a(xh);return Math.floor(d(wh,xh))},g.every=function(a){a=Math.floor(a);return isFinite(a)&&0a.y){var c=new Date(-1,a.m,a.d,a.H,a.M,a.S,a.L);c.setFullYear(a.y);return c}return new Date(a.y,a.m,a.d,a.H,a.M,a.S,a.L)}function zh(a){if(0<=a.y&&100> +a.y){var c=new Date(Date.UTC(-1,a.m,a.d,a.H,a.M,a.S,a.L));c.setUTCFullYear(a.y);return c}return new Date(Date.UTC(a.y,a.m,a.d,a.H,a.M,a.S,a.L))}function sd(a,c,d){return{y:a,m:c,d,H:0,M:0,S:0,L:0}}function Kl(a){function c(a,c){return function(d){var e=[],g=-1,f=0,h=a.length,b,m;for(d instanceof Date||(d=new Date(+d));++gg.V||53=h)return-1;b=c.charCodeAt(g++);if(37===b){if(b= +c.charAt(g++),b=ia[b in Ll?c.charAt(g++):b],!b||0>(e=b(a,d,e)))return-1}else if(b!=d.charCodeAt(e++))return-1}return e}var g=a.dateTime,h=a.date,b=a.time,p=a.periods,t=a.days,z=a.shortDays,m=a.months,q=a.shortMonths,x=xd(p),v=yd(p),B=xd(t),G=yd(t),I=xd(z),N=yd(z),E=xd(m),y=yd(m),P=xd(q),L=yd(q),O={a:function(a){return z[a.getDay()]},A:function(a){return t[a.getDay()]},b:function(a){return q[a.getMonth()]},B:function(a){return m[a.getMonth()]},c:null,d:Ml,e:Ml,f:Yr,H:Zr,I:$r,j:as,L:Nl,m:bs,M:cs,p:function(a){return p[+(12<= +a.getHours())]},q:function(a){return 1+~~(a.getMonth()/3)},Q:Ol,s:Pl,S:ds,u:es,U:fs,V:gs,w:hs,W:is,x:null,X:null,y:js,Y:ks,Z:ls,"%":Ql},U={a:function(a){return z[a.getUTCDay()]},A:function(a){return t[a.getUTCDay()]},b:function(a){return q[a.getUTCMonth()]},B:function(a){return m[a.getUTCMonth()]},c:null,d:Rl,e:Rl,f:ms,H:ns,I:os,j:ps,L:Sl,m:qs,M:rs,p:function(a){return p[+(12<=a.getUTCHours())]},q:function(a){return 1+~~(a.getUTCMonth()/3)},Q:Ol,s:Pl,S:ss,u:ts,U:us,V:vs,w:ws,W:xs,x:null,X:null,y:ys, +Y:zs,Z:As,"%":Ql},ia={a:function(a,c,d){return(c=I.exec(c.slice(d)))?(a.w=N[c[0].toLowerCase()],d+c[0].length):-1},A:function(a,c,d){return(c=B.exec(c.slice(d)))?(a.w=G[c[0].toLowerCase()],d+c[0].length):-1},b:function(a,c,d){return(c=P.exec(c.slice(d)))?(a.m=L[c[0].toLowerCase()],d+c[0].length):-1},B:function(a,c,d){return(c=E.exec(c.slice(d)))?(a.m=y[c[0].toLowerCase()],d+c[0].length):-1},c:function(a,c,d){return e(a,g,c,d)},d:Tl,e:Tl,f:Bs,H:Ul,I:Ul,j:Cs,L:Ds,m:Es,M:Fs,p:function(a,c,d){return(c= +x.exec(c.slice(d)))?(a.p=v[c[0].toLowerCase()],d+c[0].length):-1},q:Gs,Q:Hs,s:Is,S:Js,u:Ks,U:Ls,V:Ms,w:Ns,W:Os,x:function(a,c,d){return e(a,h,c,d)},X:function(a,c,d){return e(a,b,c,d)},y:Ps,Y:Qs,Z:Rs,"%":Ss};O.x=c(h,O);O.X=c(b,O);O.c=c(g,O);U.x=c(h,U);U.X=c(b,U);U.c=c(g,U);return{format:function(a){var d=c(a+="",O);d.toString=function(){return a};return d},parse:function(a){var c=d(a+="",!1);c.toString=function(){return a};return c},utcFormat:function(a){var d=c(a+="",U);d.toString=function(){return a}; +return d},utcParse:function(a){var c=d(a+="",!0);c.toString=function(){return a};return c}}}function da(a,c,d){var e=0>a?"-":"";a=(e?-a:a)+"";var g=a.length;return e+(g=a?-df:Math.asin(a)}function at(a){return a.innerRadius}function bt(a){return a.outerRadius}function ct(a){return a.startAngle}function dt(a){return a.endAngle}function et(a){return a&&a.padAngle}function ef(a,c,d,e,g,h,b){var k=a-d,t=c-e;b=(b?h:-h)/zc(k*k+t*t);t*=b;k*=-b;var z=a+t,m=c+k,q=d+t,x=e+k;d=(z+q)/2;e=(m+x)/2;c=q-z;a=x-m;b=c*c+a*a;h=g-h;x=z*x-q*m;var v=(0>a?-1:1)*zc(ft(0,h*h*b-x* +x));z=(x*a-c*v)/b;m=(-x*c-a*v)/b;q=(x*a+c*v)/b;c=(-x*c+a*v)/b;a=z-d;b=m-e;d=q-d;e=c-e;a*a+b*b>d*d+e*e&&(z=q,m=c);return{cx:z,cy:m,x01:-t,y01:-k,x11:z*(g/h-1),y11:m*(g/h-1)}}function fm(a){this._context=a}function ff(a){return new fm(a)}function Eh(a){return a[0]}function Fh(a){return a[1]}function Gh(){function a(a){var k,p=a.length,m,q=!1,x;null==g&&(b=h(x=Bb()));for(k=0;k<=p;++k)!(k=y;--m)z.point(N[m],E[m]);z.lineEnd();z.areaEnd()}G&&(N[c]=+d(B,c,a),E[c]=+g(B,c,a),z.point(e?+e(B,c,a):N[c],h?+h(B,c,a):E[c]))}if(I)return z=null,I+""||null}function c(){return Gh().defined(b).curve(t).context(p)}var d=Eh,e=null,g=ba(0),h=Fh,b=ba(!0),p=null,t=ff,z=null;a.x=function(c){return arguments.length?(d= +"function"===typeof c?c:ba(+c),e=null,a):d};a.x0=function(c){return arguments.length?(d="function"===typeof c?c:ba(+c),a):d};a.x1=function(c){return arguments.length?(e=null==c?null:"function"===typeof c?c:ba(+c),a):e};a.y=function(c){return arguments.length?(g="function"===typeof c?c:ba(+c),h=null,a):g};a.y0=function(c){return arguments.length?(g="function"===typeof c?c:ba(+c),a):g};a.y1=function(c){return arguments.length?(h=null==c?null:"function"===typeof c?c:ba(+c),a):h};a.lineX0=a.lineY0=function(){return c().x(d).y(g)}; +a.lineY1=function(){return c().x(d).y(h)};a.lineX1=function(){return c().x(e).y(g)};a.defined=function(c){return arguments.length?(b="function"===typeof c?c:ba(!!c),a):b};a.curve=function(c){return arguments.length?(t=c,null!=p&&(z=t(p)),a):t};a.context=function(c){return arguments.length?(null==c?p=z=null:z=t(p=c),a):p};return a}function gt(a,c){return ca?1:c>=a?0:NaN}function ht(a){return a}function hm(a){this._curve=a}function Hh(a){function c(c){return new hm(a(c))}c._curve=a;return c} +function Dd(a){var c=a.curve;a.angle=a.x;delete a.x;a.radius=a.y;delete a.y;a.curve=function(a){return arguments.length?c(Hh(a)):c()._curve};return a}function im(){return Dd(Gh().curve(jm))}function km(){var a=gm().curve(jm),c=a.curve,d=a.lineX0,e=a.lineX1,g=a.lineY0,b=a.lineY1;a.angle=a.x;delete a.x;a.startAngle=a.x0;delete a.x0;a.endAngle=a.x1;delete a.x1;a.radius=a.y;delete a.y;a.innerRadius=a.y0;delete a.y0;a.outerRadius=a.y1;delete a.y1;a.lineStartAngle=function(){return Dd(d())};delete a.lineX0; +a.lineEndAngle=function(){return Dd(e())};delete a.lineX1;a.lineInnerRadius=function(){return Dd(g())};delete a.lineY0;a.lineOuterRadius=function(){return Dd(b())};delete a.lineY1;a.curve=function(a){return arguments.length?c(Hh(a)):c()._curve};return a}function Ed(a,c){return[(c=+c)*Math.cos(a-=Math.PI/2),c*Math.sin(a)]}function it(a){return a.source}function jt(a){return a.target}function Ih(a){function c(){var c,h=Jh.call(arguments),z=d.apply(this,h),m=e.apply(this,h);k||(k=c=Bb());a(k,+g.apply(this, +(h[0]=z,h)),+b.apply(this,h),+g.apply(this,(h[0]=m,h)),+b.apply(this,h));if(c)return k=null,c+""||null}var d=it,e=jt,g=Eh,b=Fh,k=null;c.source=function(a){return arguments.length?(d=a,c):d};c.target=function(a){return arguments.length?(e=a,c):e};c.x=function(a){return arguments.length?(g="function"===typeof a?a:ba(+a),c):g};c.y=function(a){return arguments.length?(b="function"===typeof a?a:ba(+a),c):b};c.context=function(a){return arguments.length?(k=null==a?null:a,c):k};return c}function kt(a,c, +d,e,g){a.moveTo(c,d);a.bezierCurveTo(c=(c+e)/2,d,c,g,e,g)}function lt(a,c,d,e,g){a.moveTo(c,d);a.bezierCurveTo(c,d=(d+g)/2,e,d,e,g)}function mt(a,c,d,e,g){var b=Ed(c,d);c=Ed(c,d=(d+g)/2);d=Ed(e,d);e=Ed(e,g);a.moveTo(b[0],b[1]);a.bezierCurveTo(c[0],c[1],d[0],d[1],e[0],e[1])}function Hb(){}function gf(a,c,d){a._context.bezierCurveTo((2*a._x0+a._x1)/3,(2*a._y0+a._y1)/3,(a._x0+2*a._x1)/3,(a._y0+2*a._y1)/3,(a._x0+4*a._x1+c)/6,(a._y0+4*a._y1+d)/6)}function hf(a){this._context=a}function lm(a){this._context= +a}function mm(a){this._context=a}function nm(a,c){this._basis=new hf(a);this._beta=c}function jf(a,c,d){a._context.bezierCurveTo(a._x1+a._k*(a._x2-a._x0),a._y1+a._k*(a._y2-a._y0),a._x2+a._k*(a._x1-c),a._y2+a._k*(a._y1-d),a._x2,a._y2)}function Kh(a,c){this._context=a;this._k=(1-c)/6}function Lh(a,c){this._context=a;this._k=(1-c)/6}function Mh(a,c){this._context=a;this._k=(1-c)/6}function Nh(a,c,d){var e=a._x1,g=a._y1,b=a._x2,k=a._y2;if(1E-12c&&-0);a=(d-a._y1)/(c||0>e&&-0);return((0>g?-1:1)+(0>a?-1:1))*Math.min(Math.abs(g),Math.abs(a),.5*Math.abs((g*c+a*e)/(e+c)))||0}function tm(a,c){var d=a._x1-a._x0;return d?(3*(a._y1-a._y0)/d-c)/2:c}function Oh(a,c,d){var e=a._x0,g=a._x1,b=a._y1,k=(g-e)/3;a._context.bezierCurveTo(e+k,a._y0+k*c,g-k,b-k*d,g,b)}function kf(a){this._context=a}function um(a){this._context=new vm(a)}function vm(a){this._context=a}function wm(a){this._context= +a}function xm(a){var c,d=a.length-1,e=Array(d),g=Array(d),b=Array(d);e[0]=0;g[0]=2;b[0]=a[0]+2*a[1];for(c=1;cb&&(b=g,d=c);return d}function zm(a){var c=a.map(Am);return Bc(a).sort(function(a,e){return c[a]-c[e]})}function Am(a){for(var c=0,d=-1,e=a.length,g;++dm){if(cz)return;c>t&&(t=c)}c=e-p;if(m||!(0>c)){c/=m;if(0>m){if(c>z)return;c>t&&(t=c)}else if(0k){if(cz)return;c>t&&(t=c)}c=g-b;if(k||!(0>c)){c/=k;if(0>k){if(c>z)return;c>t&&(t=c)}else if(0z))return!0;0z&&(a[1]=[p+z*m,b+z*k]);return!0}}}}}function st(a,c,d,e,g){var b=a[1];if(b)return!0;var k=a[0],p=a.left,t=a.right;b=p[0];p=p[1];var z=t[0];t=t[1];var m=(b+z)/2;if(t===p){if(m=e)return;if(b>z){if(!k)k=[m,d];else if(k[1]>=g)return;b=[m,g]}else{if(!k)k= +[m,g];else if(k[1]q||1z){if(!k)k=[(d-m)/q,d];else if(k[1]>=g)return;b=[(g-m)/q,g]}else{if(!k)k=[(g-m)/q,g];else if(k[1]=e)return;b=[e,q*e+m]}else{if(!k)k=[e,q*e+m];else if(k[0]=-wt)){var z=k*k+p*p,m=e*e+t*t;p=(t*z-p*m)/g;e=(k*m-e*z)/g;k=Em.pop()||new vt;k.arc=a;k.site=c;k.x=p+d;k.y=(k.cy=e+b)+Math.sqrt(p*p+e*e);a.circle=k;a=null;for(c=Jd._;c;)if(k.yea)t=t.L;else{var m=t;var q=p;var x=m.N;x?q=Hm(x,q):(m=m.site,q=m[1]===q?m[0]:Infinity);q=k-q;if(q>ea){if(!t.R){b=t;break}t=t.R}else{z>-ea?(b=t.P,e=t):q>-ea?(b=t,e=t.N):b=e=t;break}}}Ra[g.index]={site:g,halfedges:[]};z=Fm(g);Ec.insert(b,z);if(b||e)if(b===e)Dc(b),e=Fm(b.site),Ec.insert(z,e),z.edge=e.edge=Hd(b.site,z.site),Cc(b),Cc(e);else if(e){Dc(b);Dc(e); +k=b.site;t=k[0];q=k[1];m=g[0]-t;x=g[1]-q;p=e.site;var v=p[0]-t,B=p[1]-q,G=2*(m*B-x*v),I=m*m+x*x,N=v*v+B*B;t=[(B*I-x*N)/G+t,(m*N-v*I)/G+q];of(e.edge,k,p,t);z.edge=Hd(k,g,null,t);e.edge=Hd(g,p,null,t);Cc(b);Cc(e)}else z.edge=Hd(b.site,z.site);e=d[0];b=d[1]}d=a.pop()}else if(g){p=g.arc;g=p.circle;k=g.x;t=g.cy;g=[k,t];m=p.P;q=p.N;z=[p];Qh(p);for(p=m;p.circle&&Math.abs(k-p.circle.x)ea||Math.abs(E[0][1]-E[1][1])>ea)||delete xa[b];E=Ra.length;b=!0;for(g=0;gea||Math.abs(v-B)>ea)p.splice(k,0,xa.push(Id(y,m,Math.abs(x-e)ea?[e,Math.abs(q-e)ea?[Math.abs(B-c)ea?[d,Math.abs(q-d)ea?[Math.abs(B-a)e?(e+g)/2:Math.min(0,e)||Math.max(0,g),c>b?(b+c)/2:Math.min(0,b)||Math.max(0,c))}var Km=Af(Sa),Fb=Km.right,Ft=Km.left,Lm=Array.prototype,Gt=Lm.slice,Ht=Lm.map,Df=Math.sqrt(50),Ef=Math.sqrt(10),Ff=Math.sqrt(2),If=Array.prototype.slice,po={value:function(){}};Qd.prototype=Lb.prototype={constructor:Qd,on:function(a,c){var d= +this._,e=oo(a+"",d),g,b=-1,k=e.length;if(2>arguments.length)for(;++bthis._names.indexOf(a)&&(this._names.push(a),this._node.setAttribute("class",this._names.join(" ")))},remove:function(a){a=this._names.indexOf(a); +0<=a&&(this._names.splice(a,1),this._node.setAttribute("class",this._names.join(" ")))},contains:function(a){return 0<=this._names.indexOf(a)}};var xi={};b.event=null;"undefined"!==typeof document&&("onmouseenter"in document.documentElement||(xi={mouseenter:"mouseover",mouseleave:"mouseout"}));var Of=[null];za.prototype=Nb.prototype={constructor:za,select:function(a){"function"!==typeof a&&(a=Sd(a));for(var c=this._groups,d=c.length,e=Array(d),g=0;g= +q&&(q=m+1);!(N=I[q])&&++qarguments.length){var e=this.node();return d.local?e.getAttributeNS(d.space,d.local):e.getAttribute(d)}return this.each((null==c?d.local?zo:yo:"function"===typeof c?d.local?Do:Co:d.local?Bo:Ao)(d,c))},style:function(a,c,d){return 1arguments.length){for(var e=Nf(this.node()),g=-1,b=d.length;++garguments.length){var k=this.node().__on;if(k)for(var p=0,t=k.length,z;pthis.r&&-.5<=this.g&&255.5>this.g&&-.5<=this.b&&255.5>this.b&&0<=this.opacity&&1>=this.opacity},hex:Fi,formatHex:Fi,formatRgb:Gi,toString:Gi}));fc(eb,Zd,Oc(yb,{brighter:function(a){a= +null==a?Fc:Math.pow(Fc,a);return new eb(this.h,this.s,this.l*a,this.opacity)},darker:function(a){a=null==a?.7:Math.pow(.7,a);return new eb(this.h,this.s,this.l*a,this.opacity)},rgb:function(){var a=this.h%360+360*(0>this.h),c=isNaN(a)||isNaN(this.s)?0:this.s,d=this.l;c=d+(.5>d?d:1-d)*c;d=2*d-c;return new va(Uf(240<=a?a-240:a+120,d,c),Uf(a,d,c),Uf(120>a?a+240:a-120,d,c),this.opacity)},displayable:function(){return(0<=this.s&&1>=this.s||isNaN(this.s))&&0<=this.l&&1>=this.l&&0<=this.opacity&&1>=this.opacity}, +formatHsl:function(){var a=this.opacity;a=isNaN(a)?1:Math.max(0,Math.min(1,a));return(1===a?"hsl(":"hsla(")+(this.h||0)+", "+100*(this.s||0)+"%, "+100*(this.l||0)+"%"+(1===a?")":", "+a+")")}}));var Oi=Math.PI/180,Ni=180/Math.PI,Li=4/29,hc=6/29,Ki=3*hc*hc,qp=hc*hc*hc;fc(Ya,$d,Oc(yb,{brighter:function(a){return new Ya(this.l+18*(null==a?1:a),this.a,this.b,this.opacity)},darker:function(a){return new Ya(this.l-18*(null==a?1:a),this.a,this.b,this.opacity)},rgb:function(){var a=(this.l+16)/116,c=isNaN(this.a)? +a:a+this.a/500,d=isNaN(this.b)?a:a-this.b/200;c=.96422*Xf(c);a=1*Xf(a);d=.82521*Xf(d);return new va(Yf(3.1338561*c-1.6168667*a-.4906146*d),Yf(-.9787684*c+1.9161415*a+.033454*d),Yf(.0719453*c-.2289914*a+1.4052427*d),this.opacity)}}));fc(fb,ae,Oc(yb,{brighter:function(a){return new fb(this.h,this.c,this.l+18*(null==a?1:a),this.opacity)},darker:function(a){return new fb(this.h,this.c,this.l-18*(null==a?1:a),this.opacity)},rgb:function(){return Ji(this).rgb()}}));var Pi=1.78277*-.29227-.1347134789;fc(Pb, +Za,Oc(yb,{brighter:function(a){a=null==a?Fc:Math.pow(Fc,a);return new Pb(this.h,this.s,this.l*a,this.opacity)},darker:function(a){a=null==a?.7:Math.pow(.7,a);return new Pb(this.h,this.s,this.l*a,this.opacity)},rgb:function(){var a=isNaN(this.h)?0:(this.h+120)*Oi,c=+this.l,d=isNaN(this.s)?0:this.s*c*(1-c),e=Math.cos(a);a=Math.sin(a);return new va(255*(c+d*(-.14861*e+1.78277*a)),255*(c+d*(-.29227*e+-.90649*a)),255*(c+1.97294*d*e),this.opacity)}}));var Qc=function d(c){function e(c,d){var e=g((c=gc(c)).r, +(d=gc(d)).r),b=g(c.g,d.g),h=g(c.b,d.b),m=sa(c.opacity,d.opacity);return function(d){c.r=e(d);c.g=b(d);c.b=h(d);c.opacity=m(d);return c+""}}var g=sp(c);e.gamma=d;return e}(1),dm=Ui(Ri),It=Ui(Si),ag=/[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g,bg=new RegExp(ag.source,"g"),aj=180/Math.PI,Sh={translateX:0,translateY:0,rotate:0,skewX:0,scaleX:1,scaleY:1},Ld,Th,Mm,rf,Nm=bj(function(c){if("none"===c)return Sh;Ld||(Ld=document.createElement("DIV"),Th=document.documentElement,Mm=document.defaultView);Ld.style.transform= +c;c=Mm.getComputedStyle(Th.appendChild(Ld),null).getPropertyValue("transform");Th.removeChild(Ld);c=c.slice(7,-1).split(",");return $i(+c[0],+c[1],+c[2],+c[3],+c[4],+c[5])},"px, ","px)","deg)"),Om=bj(function(c){if(null==c)return Sh;rf||(rf=document.createElementNS("http://www.w3.org/2000/svg","g"));rf.setAttribute("transform",c);if(!(c=rf.transform.baseVal.consolidate()))return Sh;c=c.matrix;return $i(c.a,c.b,c.c,c.d,c.e,c.f)},", ",")",")"),Rc=Math.SQRT2,Jt=ej(ce),Kt=ej(sa),Lt=fj(ce),Mt=fj(sa),Nt= +gj(ce),sf=gj(sa),jc=0,Uc=0,Wc=0,fe,Vc,ge=0,Qb=0,de=0,Sc="object"===typeof performance&&performance.now?performance:Date,hj="object"===typeof window&&window.requestAnimationFrame?window.requestAnimationFrame.bind(window):function(c){setTimeout(c,17)};Tc.prototype=ee.prototype={constructor:Tc,restart:function(c,d,e){if("function"!==typeof c)throw new TypeError("callback is not a function");e=(null==e?ic():+e)+(null==d?0:+d);this._next||Vc===this||(Vc?Vc._next=this:fe=this,Vc=this);this._call=c;this._time= +e;cg()},stop:function(){this._call&&(this._call=null,this._time=Infinity,cg())}};var yp=Lb("start","end","cancel","interrupt"),zp=[],Ot=Nb.prototype.constructor,Pm=0,Gc=Nb.prototype;gb.prototype=mj.prototype={constructor:gb,select:function(c){var d=this._name,e=this._id;"function"!==typeof c&&(c=Sd(c));for(var g=this._groups,b=g.length,k=Array(b),p=0;parguments.length?$a(this.node(),e).on.on(c):this.each(Sp(e,c,d))},attr:function(c,d){var e= +Lc(c),g="transform"===e?Om:kj;return this.attrTween(c,"function"===typeof d?(e.local?Hp:Gp)(e,g,fg(this,"attr."+c,d)):null==d?(e.local?Dp:Cp)(e):(e.local?Fp:Ep)(e,g,d))},attrTween:function(c,d){var e="attr."+c;if(2>arguments.length)return(e=this.tween(e))&&e._value;if(null==d)return this.tween(e,null);if("function"!==typeof d)throw Error();var g=Lc(c);return this.tween(e,(g.local?Kp:Lp)(g,d))},style:function(c,d,e){var g="transform"===(c+="")?Nm:kj;return null==d?this.styleTween(c,Up(c,g)).on("end.style."+ +c,lj(c)):"function"===typeof d?this.styleTween(c,Wp(c,g,fg(this,"style."+c,d))).each(Xp(this._id,c)):this.styleTween(c,Vp(c,g,d),e).on("end.style."+c,null)},styleTween:function(c,d,e){var g="style."+(c+="");if(2>arguments.length)return(g=this.tween(g))&&g._value;if(null==d)return this.tween(g,null);if("function"!==typeof d)throw Error();return this.tween(g,Zp(c,d,null==e?"":e))},text:function(c){return this.tween("text","function"===typeof c?aq(fg(this,"text",c)):$p(null==c?"":c+""))},textTween:function(c){var d= +"text";if(1>arguments.length)return(d=this.tween(d))&&d._value;if(null==c)return this.tween(d,null);if("function"!==typeof c)throw Error();return this.tween(d,cq(c))},remove:function(){return this.on("end.remove",Tp(this._id))},tween:function(c,d){var e=this._id;c+="";if(2>arguments.length){e=$a(this.node(),e).tween;for(var g=0,b=e.length,k;g=(b*=2)?Math.pow(b,g):2-Math.pow(2-b,g))/2}g=+g;b.exponent=h;return b}(3),pj=Math.PI,Rm=pj/2,hg=4/11,eq=6/11,dq=8/11,gq=9/11,fq=10/11,hq=21/22,ie=1/hg/hg,Rt=function k(b){function h(h){return h*h*((b+1)*h-b)}b=+b;h.overshoot=k;return h}(1.70158),St=function p(b){function k(k){return--k* +k*((b+1)*k+b)+1}b=+b;k.overshoot=p;return k}(1.70158),Sm=function t(b){function p(m){return(1>(m*=2)?m*m*((b+1)*m-b):(m-=2)*m*((b+1)*m+b)+2)/2}b=+b;p.overshoot=t;return p}(1.70158),Hc=2*Math.PI,Tt=function m(b,z){function q(m){return b*Math.pow(2,10*--m)*Math.sin((x-m)/z)}var x=Math.asin(1/(b=Math.max(1,b)))*(z/=Hc);q.amplitude=function(b){return m(b,z*Hc)};q.period=function(q){return m(b,q)};return q}(1,.3),Tm=function q(b,m){function x(q){return 1-b*Math.pow(2,-10*(q=+q))*Math.sin((q+v)/m)}var v= +Math.asin(1/(b=Math.max(1,b)))*(m/=Hc);x.amplitude=function(b){return q(b,m*Hc)};x.period=function(m){return q(b,m)};return x}(1,.3),Ut=function x(b,q){function m(m){return(0>(m=2*m-1)?b*Math.pow(2,10*m)*Math.sin((B-m)/q):2-b*Math.pow(2,-10*m)*Math.sin((B+m)/q))/2}var B=Math.asin(1/(b=Math.max(1,b)))*(q/=Hc);m.amplitude=function(b){return x(b,q*Hc)};m.period=function(m){return x(b,m)};return m}(1,.3),Uh={time:null,delay:0,duration:250,ease:gg};Nb.prototype.interrupt=function(b){return this.each(function(){Rb(this, +b)})};Nb.prototype.transition=function(b){var m;if(b instanceof gb){var x=b._id;b=b._name}else x=++Pm,(m=Uh).time=ic(),b=null==b?null:b+"";for(var v=this._groups,B=v.length,G=0;GB)throw Error("negative radius: "+B);if(null===this._x1)this._+="M"+(this._x1=b)+","+(this._y1=q);else if(1E-6y*v)+","+(this._x1=b+L*N)+","+(this._y1=q+L*E)}else this._+= +"L"+(this._x1=b)+","+(this._y1=q)},arc:function(b,q,x,v,B,G){b=+b;q=+q;x=+x;G=!!G;var m=x*Math.cos(v),N=x*Math.sin(v),E=b+m,y=q+N,P=1^G;v=G?v-B:B-v;if(0>x)throw Error("negative radius: "+x);if(null===this._x1)this._+="M"+E+","+y;else if(1E-6v&&(v=v%Wh+Wh),v>Yt?this._+="A"+x+","+x+",0,1,"+P+","+(b-m)+","+(q-N)+"A"+x+","+x+",0,1,"+P+","+(this._x1=E)+","+(this._y1=y):1E-6=Vh)+","+P+","+(this._x1= +b+x*Math.cos(B))+","+(this._y1=q+x*Math.sin(B))))},rect:function(b,q,x,v){this._+="M"+(this._x0=this._x1=+b)+","+(this._y0=this._y1=+q)+"h"+ +x+"v"+ +v+"h"+-x+"Z"},toString:function(){return this._}};le.prototype=ob.prototype={constructor:le,has:function(b){return"$"+b in this},get:function(b){return this["$"+b]},set:function(b,q){this["$"+b]=q;return this},remove:function(b){b="$"+b;return b in this&&delete this[b]},clear:function(){for(var b in this)"$"===b[0]&&delete this[b]},keys:function(){var b= +[],q;for(q in this)"$"===q[0]&&b.push(q.slice(1));return b},values:function(){var b=[],q;for(q in this)"$"===q[0]&&b.push(this[q]);return b},entries:function(){var b=[],q;for(q in this)"$"===q[0]&&b.push({key:q.slice(1),value:this[q]});return b},size:function(){var b=0,q;for(q in this)"$"===q[0]&&++b;return b},empty:function(){for(var b in this)if("$"===b[0])return!1;return!0},each:function(b){for(var m in this)"$"===m[0]&&b(this[m],m.slice(1),this)}};var $b=ob.prototype;me.prototype=yj.prototype= +{constructor:me,has:$b.has,add:function(b){b+="";this["$"+b]=b;return this},remove:$b.remove,clear:$b.clear,values:$b.keys,size:$b.size,empty:$b.empty,each:$b.each};var Aj=Array.prototype.slice,pb=[[],[[[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]]], +[]],Dj={},sg={},ac=ne(","),Zm=ac.parse,Zt=ac.parseRows,$t=ac.format,au=ac.formatBody,bu=ac.formatRows,cu=ac.formatRow,du=ac.formatValue,bc=ne("\t"),$m=bc.parse,eu=bc.parseRows,fu=bc.format,gu=bc.formatBody,hu=bc.formatRows,iu=bc.formatRow,ju=bc.formatValue,ku=(new Date("2019-01-01T00:00")).getHours()||(new Date("2019-07-01T00:00")).getHours(),lu=Ej(Zm),mu=Ej($m),nu=tg("application/xml"),ou=tg("text/html"),pu=tg("image/svg+xml"),Ja=pe.prototype=ug.prototype;Ja.copy=function(){var b=new ug(this._x, +this._y,this._x0,this._y0,this._x1,this._y1),q=this._root,x,v;if(!q)return b;if(!q.length)return b._root=Gj(q),b;for(x=[{source:q,target:b._root=Array(4)}];q=x.pop();)for(var B=0;4>B;++B)if(v=q.source[B])v.length?x.push({source:v,target:q.target[B]=Array(4)}):q.target[B]=Gj(v);return b};Ja.add=function(b){var m=+this._x.call(null,b),x=+this._y.call(null,b);return Fj(this.cover(m,x),m,x,b)};Ja.addAll=function(b){var m,x,v=b.length,B,G,I=Array(v),N=Array(v),E=Infinity,y=Infinity,P=-Infinity,L=-Infinity; +for(x=0;xP&&(P=B),GL&&(L=G));if(E>P||y>L)return this;this.cover(E,y).cover(P,L);for(x=0;xb||b>=B||v>q||q>=G;)switch(y=(qy||(I=U.y0)>P||(N=U.x1)=A)<<1|b>=U)U=L[L.length-1],L[L.length-1]=L[L.length-1-O],L[L.length-1-O]=U}else if(U=b-+this._x.call(null,O.data), +A=q-+this._y.call(null,O.data),U=U*U+A*A,U=(P=(B+I)/2))?B=P:I=P;(U=y>=(L=(G+N)/2))?G=L:N=L;if(!(m=x,x=x[O|=U<<1]))return this;if(!x.length)break;if(m[O+1&3]||m[O+2&3]||m[O+3&3]){var A=m;var f=O}}for(;x.data!==b;)if(!(v= +x,x=x.next))return this;(b=x.next)&&delete x.next;if(v)return b?v.next=b:delete v.next,this;if(!m)return this._root=b,this;b?m[O]=b:delete m[O];(x=m[0]||m[1]||m[2]||m[3])&&x===(m[3]||m[2]||m[1]||m[0])&&!x.length&&(A?A[f]=x:this._root=x);return this};Ja.removeAll=function(b){for(var m=0,x=b.length;m=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i; +ad.prototype=re.prototype;re.prototype.toString=function(){return this.fill+this.align+this.sign+this.symbol+(this.zero?"0":"")+(void 0===this.width?"":Math.max(1,this.width|0))+(this.comma?",":"")+(void 0===this.precision?"":"."+Math.max(0,this.precision|0))+(this.trim?"~":"")+this.type};var Mj,Nj={"%":function(b,q){return(100*b).toFixed(q)},b:function(b){return Math.round(b).toString(2)},c:function(b){return b+""},d:function(b){return Math.round(b).toString(10)},e:function(b,q){return b.toExponential(q)}, +f:function(b,q){return b.toFixed(q)},g:function(b,q){return b.toPrecision(q)},o:function(b){return Math.round(b).toString(8)},p:function(b,q){return Ij(100*b,q)},r:Ij,s:function(b,q){var m=qe(b,q);if(!m)return b+"";var v=m[0];m=m[1];m=m-(Mj=3*Math.max(-8,Math.min(8,Math.floor(m/3))))+1;var B=v.length;return m===B?v:m>B?v+Array(m-B+1).join("0"):0b?-1:0},pa=Math.sqrt,tc=Math.tan,Yj={Feature:function(b,q){te(b.geometry,q)},FeatureCollection:function(b,q){b=b.features;for(var m=-1,v=b.length;++mb?Ia+b:b);this.lineStart=this.lineEnd=this.point=la},sphere:function(){vf.add(Ia)}}, +ma,Ma,na,Pa,Tb,gk,hk,oc,bd=new ab,Eb,qb,rb={point:Ag,lineStart:dk,lineEnd:ek,polygonStart:function(){rb.point=fk;rb.lineStart=Uq;rb.lineEnd=Vq;bd.reset();hb.polygonStart()},polygonEnd:function(){hb.polygonEnd();rb.point=Ag;rb.lineStart=dk;rb.lineEnd=ek;0>ve?(ma=-(na=180),Ma=-(Pa=90)):1E-6bd&&(Ma=-90);qb[0]=ma;qb[1]=na},sphere:function(){ma=-(na=180);Ma=-(Pa=90)}},dd,De,Ae,Be,Ce,Ee,Fe,Ge,Cg,Dg,Eg,mk,nk,Fa,Ga,Ha,cb={sphere:la,point:Bg,lineStart:jk,lineEnd:kk,polygonStart:function(){cb.lineStart= +Zq;cb.lineEnd=ar},polygonEnd:function(){cb.lineStart=jk;cb.lineEnd=kk}};Gg.invert=Gg;var Jg=new ab,$g=yk(function(){return!0},function(b){var m=NaN,x=NaN,v=NaN,B;return{lineStart:function(){b.lineStart();B=1},point:function(q,I){var G=0aa(E-Y))b.point(m,x=0<(x+I)/2?ka:-ka),b.point(v,x),b.lineEnd(),b.lineStart(),b.point(G,x),b.point(q,x),B=0;else if(v!==G&&E>=Y){1E-6>aa(m-v)&&(m-=1E-6*v);1E-6>aa(q-G)&&(q-=1E-6*G);E=m;var y=x,P=q,L,O,U=A(E-P);x=1E-6Md&&(Md=b);qxf&&(xf=q)},lineStart:la,lineEnd:la,polygonStart:la,polygonEnd:la,result:function(){var b=[[Ic,wf],[Md,xf]];Md=xf=-(wf=Ic=Infinity);return b}},Qg=0,Rg=0,gd=0,Oe=0,Pe=0,rc=0,Sg=0,Tg=0,hd=0,Ok,Pk,ib,jb,Wa={point:Ub,lineStart:Lk, +lineEnd:Mk,polygonStart:function(){Wa.lineStart=or;Wa.lineEnd=qr},polygonEnd:function(){Wa.point=Ub;Wa.lineStart=Lk;Wa.lineEnd=Mk},result:function(){var b=hd?[Sg/hd,Tg/hd]:rc?[Oe/rc,Pe/rc]:gd?[Qg/gd,Rg/gd]:[NaN,NaN];Qg=Rg=gd=Oe=Pe=rc=Sg=Tg=hd=0;return b}};Qk.prototype={_radius:4.5,pointRadius:function(b){return this._radius=b,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(b,q){switch(this._point){case 0:this._context.moveTo(b,q);this._point=1;break;case 1:this._context.lineTo(b,q);break;default:this._context.moveTo(b+this._radius,q),this._context.arc(b,q,this._radius,0,Ia)}},result:la};var Ug=new ab,Yh,Sk,Tk,jd,kd,id={point:la,lineStart:function(){id.point=rr},lineEnd:function(){Yh&&Rk(Sk,Tk);id.point=la},polygonStart:function(){Yh=!0},polygonEnd:function(){Yh=null},result:function(){var b=+Ug;Ug.reset();return b}};Uk.prototype={_radius:4.5, +_circle:Vk(4.5),pointRadius:function(b){(b=+b)!==this._radius&&(this._radius=b,this._circle=null);return 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(b,q){switch(this._point){case 0:this._string.push("M",b,",",q);this._point=1;break;case 1:this._string.push("L",b,",",q);break;default:null==this._circle&&(this._circle=Vk(this._radius)),this._string.push("M", +b,",",q,this._circle)}},result:function(){if(this._string.length){var b=this._string.join("");this._string=[];return b}return null}};Vg.prototype={constructor:Vg,point:function(b,q){this.stream.point(b,q)},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 sr=M(30*W),vr=ld({point:function(b,q){this.stream.point(b*W,q* +W)}}),Zh=al(function(b){return pa(2/(1+b))});Zh.invert=md(function(b){return 2*Da(b/2)});var $h=al(function(b){return(b=Uj(b))&&b/A(b)});$h.invert=md(function(b){return b});nd.invert=function(b,q){return[b,2*uc(an(q))-ka]};od.invert=od;var Te=pa(3)/2;ch.invert=function(b,q){for(var m=q,v=m*m,B=v*v*v,G=0,I;12>G&&!(I=m*(1.340264+-.081106*v+B*(8.93E-4+.003796*v))-q,v=1.340264+3*-.081106*v+B*(7*8.93E-4+.034164*v),m-=I/=v,v=m*m,B=v*v*v,1E-12>aa(I));++G);return[Te*b*(1.340264+3*-.081106*v+B*(7*8.93E-4+ +.034164*v))/M(m),Da(A(m)/Te)]};dh.invert=md(uc);eh.invert=function(b,q){var m=q,v=25;do{var B=m*m;var G=B*B;m-=G=(m*(1.007226+B*(.015085+G*(-.044475+.028874*B-.005916*G)))-q)/(1.007226+B*(.045255+G*(-.311325+.259866*B-.005916*11*G)))}while(1E-6O;++O){var U=Jb*O/5,A=Math.cos(U);U=Math.sin(U);b.lineTo(U*y,-A*y);b.lineTo(A*E-U*L,U*E+A*L)}b.closePath()}},bo={draw:function(b,y){y=Math.sqrt(y);var E=-y/2;b.rect(E,E,y,y)}},ii=Math.sqrt(3),co={draw:function(b,y){y=-Math.sqrt(y/(3*ii));b.moveTo(0,2*y);b.lineTo(-ii*y,-y);b.lineTo(ii*y,-y);b.closePath()}},Xa=Math.sqrt(3)/2,ji=1/Math.sqrt(12),Rv=3*(ji/2+1),eo={draw:function(b,y){var E=Math.sqrt(y/Rv);y=E/2;var L=E*ji;E=E*ji+E;var O=-y;b.moveTo(y,L);b.lineTo(y,E);b.lineTo(O,E);b.lineTo(-.5* +y-Xa*L,Xa*y+-.5*L);b.lineTo(-.5*y-Xa*E,Xa*y+-.5*E);b.lineTo(-.5*O-Xa*E,Xa*O+-.5*E);b.lineTo(-.5*y+Xa*L,-.5*L-Xa*y);b.lineTo(-.5*y+Xa*E,-.5*E-Xa*y);b.lineTo(-.5*O+Xa*E,-.5*E-Xa*O);b.closePath()}},Sv=[hi,Xn,Zn,bo,ao,co,eo];hf.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:gf(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(b,y){b=+b;y=+y;switch(this._point){case 0:this._point=1;this._line?this._context.lineTo(b,y):this._context.moveTo(b,y);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:gf(this,b,y)}this._x0=this._x1;this._x1=b;this._y0=this._y1;this._y1=y}};lm.prototype={areaStart:Hb,areaEnd:Hb,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(b, +y){b=+b;y=+y;switch(this._point){case 0:this._point=1;this._x2=b;this._y2=y;break;case 1:this._point=2;this._x3=b;this._y3=y;break;case 2:this._point=3;this._x4=b;this._y4=y;this._context.moveTo((this._x0+4*this._x1+b)/6,(this._y0+4*this._y1+y)/6);break;default:gf(this,b,y)}this._x0=this._x1;this._x1=b;this._y0=this._y1;this._y1=y}};mm.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(b,y){b=+b;y=+y;switch(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+b)/6,L=(this._y0+4*this._y1+y)/6;this._line?this._context.lineTo(E,L):this._context.moveTo(E,L);break;case 3:this._point=4;default:gf(this,b,y)}this._x0=this._x1;this._x1=b;this._y0=this._y1;this._y1=y}};nm.prototype={lineStart:function(){this._x=[];this._y=[];this._basis.lineStart()}, +lineEnd:function(){var b=this._x,y=this._y,P=b.length-1;if(0this._t&&2===this._point&&this._context.lineTo(this._x,this._y);(this._line||0!==this._line&&1===this._point)&&this._context.closePath();0<=this._line&&(this._t=1-this._t,this._line=1-this._line)},point:function(b,l){b=+b;l=+l;switch(this._point){case 0:this._point= +1;this._line?this._context.lineTo(b,l):this._context.moveTo(b,l);break;case 1:this._point=2;default:if(0>=this._t)this._context.lineTo(this._x,l),this._context.lineTo(b,l);else{var f=this._x*(1-this._t)+b*this._t;this._context.lineTo(f,this._y);this._context.lineTo(f,l)}}this._x=b;this._y=l}};mf.prototype={constructor:mf,insert:function(b,l){var f;if(b){l.P=b;if(l.N=b.N)b.N.P=l;b.N=l;if(b.R){for(b=b.R;b.L;)b=b.L;b.L=l}else b.R=l;var n=b}else this._?(b=Cm(this._),l.P=null,l.N=b,b.P=b.L=l,n=b):(l.P= +l.N=null,this._=l,n=null);l.L=l.R=null;l.U=n;l.C=!0;for(b=l;n&&n.C;)l=n.U,n===l.L?(f=l.R)&&f.C?(n.C=f.C=!1,l.C=!0,b=l):(b===n.R&&(Fd(this,n),b=n,n=b.U),n.C=!1,l.C=!0,Gd(this,l)):(f=l.L)&&f.C?(n.C=f.C=!1,l.C=!0,b=l):(b===n.L&&(Gd(this,n),b=n,n=b.U),n.C=!1,l.C=!0,Fd(this,l)),n=b.U;this._.C=!1},remove:function(b){b.N&&(b.N.P=b.P);b.P&&(b.P.N=b.N);b.N=b.P=null;var f=b.U,u=b.L,n=b.R;var r=u?n?Cm(n):u:n;f?f.L===b?f.L=r:f.R=r:this._=r;if(u&&n){var w=r.C;r.C=b.C;r.L=u;u.U=r;r!==n?(f=r.U,r.U=b.U,b=r.R,f.L= +b,r.R=n,n.U=r):(r.U=f,f=r,b=r.R)}else w=b.C,b=r;b&&(b.U=f);if(!w)if(b&&b.C)b.C=!1;else{do{if(b===this._)break;if(b===f.L){if(b=f.R,b.C&&(b.C=!1,f.C=!0,Fd(this,f),b=f.R),b.L&&b.L.C||b.R&&b.R.C){b.R&&b.R.C||(b.L.C=!1,b.C=!0,Gd(this,b),b=f.R);b.C=f.C;f.C=b.R.C=!1;Fd(this,f);b=this._;break}}else if(b=f.L,b.C&&(b.C=!1,f.C=!0,Gd(this,f),b=f.L),b.L&&b.L.C||b.R&&b.R.C){b.L&&b.L.C||(b.R.C=!1,b.C=!0,Fd(this,b),b=f.L);b.C=f.C;f.C=b.L.C=!1;Gd(this,f);b=this._;break}b.C=!0;b=f;f=f.U}while(!b.C);b&&(b.C=!1)}}}; +var Em=[],Ph,Gm=[],ea=1E-6,wt=1E-12,Ec,Ra,Jd,xa;Rh.prototype={constructor:Rh,polygons:function(){var b=this.edges;return this.cells.map(function(f){var l=f.halfedges.map(function(l){return Dm(f,b[l])});l.data=f.site.data;return l})},triangles:function(){var b=[],l=this.edges;this.cells.forEach(function(f,n){if(u=(r=f.halfedges).length){f=f.site;var r,w=-1,u,F=l[r[u-1]];for(F=F.left===f?F.right:F.left;++w(f[0]-F[0])*(C[1]- +f[1])-(f[0]-C[0])*(F[1]-f[1])&&b.push([f.data,C.data,F.data])}}});return b},links:function(){return this.edges.filter(function(b){return b.right}).map(function(b){return{source:b.left.data,target:b.right.data}})},find:function(b,l,u){var f=this,r=f._found||0;var w=f.cells.length;for(var D;!(D=f.cells[r]);)if(++r>=w)return null;w=b-D.site[0];var F=l-D.site[1],C=w*w+F*F;do D=f.cells[w=r],r=null,D.halfedges.forEach(function(n){var w=f.edges[n];n=w.left;if(n!==D.site&&n||(n=w.right)){w=b-n[0];var u=l- +n[1];w=w*w+u*u;wJ;C||(C=b=Bb());if(HJb-1E-12)C.moveTo(H*dc(J),H*lb(J)),C.arc(0,0,H,J,K,!T),1E-12aa*aa?ua=void 0:(aa=(M*(K-Zc)-ba*(J-Ab))/aa,ua=[J+aa*ua,K+ +aa*Q]);Q=ua}Q&&(V=J-ua[0],oa=K-ua[1],Q=Ab-ua[0],M=Zc-ua[1],V=(V*Q+oa*M)/(zc(V*V+oa*oa)*zc(Q*Q+M*M)),oa=1/lb((1V?Ib:Math.acos(V))/2),ua=zc(ua[0]*ua[0]+ua[1]*ua[1]),V=gi(W,(f-ua)/(oa-1)),oa=gi(W,(H-ua)/(oa+1)))}1E-12>J,u=+F(b,l,r)+K>>J;b=+C(b,l,r);0<=n&&n>J);rg({width:Q,height:T,data:r},{width:Q,height:T,data:f},H>>J);qg({width:Q,height:T,data:f},{width:Q,height:T,data:r},H>>J);rg({width:Q,height:T,data:r},{width:Q,height:T,data:f},H>> +J);qg({width:Q,height:T,data:f},{width:Q,height:T,data:r},H>>J);rg({width:Q,height:T,data:r},{width:Q,height:T,data:f},H>>J);b=fa(f);Array.isArray(b)||(r=oi(f),b=Kb(0,r,b),b=Na(0,Math.floor(r/b)*b,b),b.shift());return zj().thresholds(b).size([Q,T])(f).map(l)}function l(b){b.value*=Math.pow(2,-2*J);b.coordinates.forEach(u);return b}function u(b){b.forEach(n)}function n(b){b.forEach(r)}function r(b){b[0]=b[0]*Math.pow(2,J)-K;b[1]=b[1]*Math.pow(2,J)-K}function w(){K=3*H;Q=R+2*K>>J;T=S+2*K>>J;return b} +var D=zq,F=Aq,C=Bq,R=960,S=500,H=20,J=2,K=3*H,Q=R+2*K>>J,T=S+2*K>>J,fa=Cb(20);b.x=function(f){return arguments.length?(D="function"===typeof f?f:Cb(+f),b):D};b.y=function(f){return arguments.length?(F="function"===typeof f?f:Cb(+f),b):F};b.weight=function(f){return arguments.length?(C="function"===typeof f?f:Cb(+f),b):C};b.size=function(b){if(!arguments.length)return[R,S];var f=Math.ceil(b[0]),l=Math.ceil(b[1]);if(!(0<=f||0<=f))throw Error("invalid size");return R=f,S=l,w()};b.cellSize=function(b){if(!arguments.length)return 1<< +J;if(!(1<=(b=+b)))throw Error("invalid cell size");return J=Math.floor(Math.log(b)/Math.LN2),w()};b.thresholds=function(f){return arguments.length?(fa="function"===typeof f?f:Array.isArray(f)?Cb(Aj.call(f)):Cb(f),b):fa};b.bandwidth=function(b){if(!arguments.length)return Math.sqrt(H*(H+1));if(!(0<=(b=+b)))throw Error("invalid bandwidth");return H=Math.round((Math.sqrt(4*b*b+1)-1)/2),w()};return b};b.contours=zj;b.create=function(b){return Ka(Rd(b).call(document.documentElement))};b.creator=Rd;b.cross= +function(b,l,u){var f=b.length,r=l.length,w=Array(f*r),D,F,C;null==u&&(u=li);for(D=C=0;Db?1:l>=b?0:NaN}; +b.deviation=ni;b.dispatch=Lb;b.drag=function(){function f(b){b.on("mousedown.drag",l).filter(H).on("touchstart.drag",r).on("touchmove.drag",w).on("touchend.drag touchcancel.drag",D).style("touch-action","none").style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}function l(){if(!Z&&C.apply(this,arguments)){var f=F("mouse",R.apply(this,arguments),Ob,this,arguments);f&&(Ka(b.event.view).on("mousemove.drag",u,!0).on("mouseup.drag",n,!0),Vd(b.event.view),b.event.stopImmediatePropagation(),A=!1,T=b.event.clientX, +fa=b.event.clientY,f("start"))}}function u(){ec();if(!A){var f=b.event.clientX-T,l=b.event.clientY-fa;A=f*f+l*l>M}J.mouse("drag")}function n(){Ka(b.event.view).on("mousemove.drag mouseup.drag",null);Wd(b.event.view,A);ec();J.mouse("end")}function r(){if(C.apply(this,arguments)){var f=b.event.changedTouches,l=R.apply(this,arguments),r=f.length,n,u;for(n=0;n=(b*=2)?1-Xc(1-b):Xc(b-1)+1)/2};b.easeBounceOut=Xc;b.easeCircle=rj;b.easeCircleIn=function(b){return 1-Math.sqrt(1-b*b)};b.easeCircleInOut=rj;b.easeCircleOut=function(b){return Math.sqrt(1- --b*b)};b.easeCubic=gg;b.easeCubicIn=function(b){return b*b*b};b.easeCubicInOut=gg;b.easeCubicOut=function(b){return--b*b*b+1};b.easeElastic=Tm;b.easeElasticIn=Tt;b.easeElasticInOut=Ut;b.easeElasticOut=Tm;b.easeExp=qj;b.easeExpIn=function(b){return Math.pow(2,10* +b-10)};b.easeExpInOut=qj;b.easeExpOut=function(b){return 1-Math.pow(2,-10*b)};b.easeLinear=function(b){return+b};b.easePoly=Qm;b.easePolyIn=Pt;b.easePolyInOut=Qm;b.easePolyOut=Qt;b.easeQuad=nj;b.easeQuadIn=function(b){return b*b};b.easeQuadInOut=nj;b.easeQuadOut=function(b){return b*(2-b)};b.easeSin=oj;b.easeSinIn=function(b){return 1-Math.cos(b*Rm)};b.easeSinInOut=oj;b.easeSinOut=function(b){return Math.sin(b*Rm)};b.entries=function(b){var f=[],u;for(u in b)f.push({key:u,value:b[u]});return f};b.extent= +Bf;b.forceCenter=function(b,l){function f(){var f,u=n.length,D=0,F=0;for(f=0;fJ.index&&(f=K-u.x-u.vx,l=Q-u.y-u.vy,r=f*f+l*l,rK+w||rQ+w||nf;++f)b[f]&&b[f].r>b.r&&(b.r=b[f].r)}function n(){if(r){var f,l=r.length;w=Array(l);for(f=0;fF;++F)(l=b[F])&&(r=Math.abs(l.value))&&(f+=l.value,n+=r,u+=r*l.x,w+=r*l.y); +b.x=u/n;b.y=w/n}else{l=b;l.x=l.data.x;l.y=l.data.y;do f+=C[l.data.index];while(l=l.next)}b.value=f}function n(b,f,l,r){if(!b.value)return!0;l=b.x-w.x;var n=b.y-w.y;f=r-f;r=l*l+n*n;if(f*f/H=S)){if(b.data!==w||b.next)0===l&&(l=Db(),r+=l*l),0===n&&(n=Db(),r+=n*n),rf&&-.425<=n&&-.214>n?D:.166<=f&&.234>f&&-.214<=n&&-.115>n?C:r).invert(b)};b.stream=function(b){return u&&n===b?u:u=xr([r.stream(n=b),D.stream(b),C.stream(b)])};b.precision=function(b){if(!arguments.length)return r.precision();r.precision(b);D.precision(b);C.precision(b);return l()};b.scale=function(f){if(!arguments.length)return r.scale();r.scale(f);D.scale(.35*f);C.scale(f);return b.translate(r.translate())};b.translate=function(b){if(!arguments.length)return r.translate(); +var f=r.scale(),n=+b[0],u=+b[1];w=r.translate(b).clipExtent([[n-.455*f,u-.238*f],[n+.455*f,u+.238*f]]).stream(H);F=D.translate([n-.307*f,u+.201*f]).clipExtent([[n-.425*f+1E-6,u+.12*f+1E-6],[n-.214*f-1E-6,u+.234*f-1E-6]]).stream(H);R=C.translate([n-.205*f,u+.212*f]).clipExtent([[n-.214*f+1E-6,u+.166*f+1E-6],[n-.115*f-1E-6,u+.234*f-1E-6]]).stream(H);return l()};b.fitExtent=function(f,l){return sc(b,f,l)};b.fitSize=function(f,l){return sc(b,[[0,0],f],l)};b.fitWidth=function(f,l){return Xg(b,f,l)};b.fitHeight= +function(f,l){return Yg(b,f,l)};return b.scale(1070)};b.geoArea=function(b){vf.reset();bb(b,hb);return 2*vf};b.geoAzimuthalEqualArea=function(){return kb(Zh).scale(124.75).clipAngle(179.999)};b.geoAzimuthalEqualAreaRaw=Zh;b.geoAzimuthalEquidistant=function(){return kb($h).scale(79.4188).clipAngle(179.999)};b.geoAzimuthalEquidistantRaw=$h;b.geoBounds=function(b){var f,u,n;Pa=na=-(ma=Ma=Infinity);Eb=[];bb(b,rb);if(f=Eb.length){Eb.sort(Wq);b=1;var r=Eb[0];for(u=[r];bQa(r[0],r[1])&&(r[1]=w[1]),Qa(w[0],r[1])>Qa(r[0],r[1])&&(r[0]=w[0])):u.push(r=w)}var D=-Infinity;f=u.length-1;b=0;for(r=u[f];b<=f;r=w,++b)w=u[b],(n=Qa(r[1],w[0]))>D&&(D=n,ma=w[0],na=r[1])}Eb=qb=null;return Infinity===ma||Infinity===Ma?[[NaN,NaN],[NaN,NaN]]:[[ma,Ma],[na,Pa]]};b.geoCentroid=function(b){dd=De=Ae=Be=Ce=Ee=Fe=Ge=Cg=Dg=Eg=0;bb(b,cb);b=Cg;var f=Dg,u=Eg,n=b*b+f*f+u*u;return 1E-12>n&&(b=Ee,f=Fe,u=Ge,1E-6>De&&(b=Ae,f=Be,u=Ce),n=b*b+f*f+u*u,1E-12>n)?[NaN,NaN]:[Ea(f,b)*ha, +Da(u/pa(n))*ha]};b.geoCircle=function(){function b(){var b=l.apply(this,arguments),f=u.apply(this,arguments)*W,R=n.apply(this,arguments)*W;r=[];w=Hg(-b[0]*W,-b[1]*W,0).invert;sk(D,f,R,1);b={type:"Polygon",coordinates:[r]};r=w=null;return b}var l=pc([0,0]),u=pc(90),n=pc(6),r,w,D={point:function(b,f){r.push(b=w(b,f));b[0]*=ha;b[1]*=ha}};b.center=function(f){return arguments.length?(l="function"===typeof f?f:pc([+f[0],+f[1]]),b):l};b.radius=function(f){return arguments.length?(u="function"===typeof f? +f:pc(+f),b):u};b.precision=function(f){return arguments.length?(n="function"===typeof f?f:pc(+f),b):n};return b};b.geoClipAntimeridian=$g;b.geoClipCircle=zk;b.geoClipExtent=function(){var b=0,l=0,u=960,n=500,r,w,D;return D={stream:function(f){return r&&w===f?r:r=Je(b,l,u,n)(w=f)},extent:function(f){return arguments.length?(b=+f[0][0],l=+f[0][1],u=+f[1][0],n=+f[1][1],r=w=null,D):[[b,l],[u,n]]}}};b.geoClipRectangle=Je;b.geoConicConformal=function(){return ah(cl).scale(109.5).parallels([30,30])};b.geoConicConformalRaw= +cl;b.geoConicEqualArea=Re;b.geoConicEqualAreaRaw=Zk;b.geoConicEquidistant=function(){return ah(dl).scale(131.154).center([0,13.9389])};b.geoConicEquidistantRaw=dl;b.geoContains=function(b,l){return(b&&bn.hasOwnProperty(b.type)?bn[b.type]:Me)(b,l)};b.geoDistance=ed;b.geoEqualEarth=function(){return kb(ch).scale(177.158)};b.geoEqualEarthRaw=ch;b.geoEquirectangular=function(){return kb(od).scale(152.63)};b.geoEquirectangularRaw=od;b.geoGnomonic=function(){return kb(dh).scale(144.049).clipAngle(60)}; +b.geoGnomonicRaw=dh;b.geoGraticule=Hk;b.geoGraticule10=function(){return Hk()()};b.geoIdentity=function(){function b(){Q=u*w;T=u*D;Z=V=null;return l}function l(b){var f=b[0]*Q;b=b[1]*T;if(F){var l=b*C-f*R;f=f*C+b*R;b=l}return[f+n,b+r]}var u=1,n=0,r=0,w=1,D=1,F=0,C,R,S=null,H,J,K,Q=1,T=1,fa=ld({point:function(b,f){b=l([b,f]);this.stream.point(b[0],b[1])}}),X=fd,Z,V;l.invert=function(b){var f=b[0]-n;b=b[1]-r;if(F){var l=b*C+f*R;f=f*C-b*R;b=l}return[f/Q,b/T]};l.stream=function(b){return Z&&V===b?Z:Z= +fa(X(V=b))};l.postclip=function(f){return arguments.length?(X=f,S=H=J=K=null,b()):X};l.clipExtent=function(f){return arguments.length?(X=null==f?(S=H=J=K=null,fd):Je(S=+f[0][0],H=+f[0][1],J=+f[1][0],K=+f[1][1]),b()):null==S?null:[[S,H],[J,K]]};l.scale=function(f){return arguments.length?(u=+f,b()):u};l.translate=function(f){return arguments.length?(n=+f[0],r=+f[1],b()):[n,r]};l.angle=function(f){return arguments.length?(F=f%360*W,R=A(F),C=M(F),b()):F*ha};l.reflectX=function(f){return arguments.length? +(w=f?-1:1,b()):0>w};l.reflectY=function(f){return arguments.length?(D=f?-1:1,b()):0>D};l.fitExtent=function(b,f){return sc(l,b,f)};l.fitSize=function(b,f){return sc(l,[[0,0],b],f)};l.fitWidth=function(b,f){return Xg(l,b,f)};l.fitHeight=function(b,f){return Yg(l,b,f)};return l};b.geoInterpolate=function(b,l){var f=b[0]*W,n=b[1]*W;b=l[0]*W;l=l[1]*W;var r=M(n),w=A(n),D=M(l),F=A(l),C=r*M(f),R=r*A(f),S=D*M(b),H=D*A(b),J=2*Da(pa(Vj(l-n)+r*D*Vj(b-f))),K=A(J);b=J?function(b){var f=A(b*=J)/K,l=A(J-b)/K;b= +l*C+f*S;var r=l*R+f*H;f=l*w+f*F;return[Ea(r,b)*ha,Ea(f,pa(b*b+r*r))*ha]}:function(){return[f*ha,n*ha]};b.distance=J;return b};b.geoLength=Ak;b.geoMercator=function(){return bl(nd).scale(961/Ia)};b.geoMercatorRaw=nd;b.geoNaturalEarth1=function(){return kb(eh).scale(175.295)};b.geoNaturalEarth1Raw=eh;b.geoOrthographic=function(){return kb(fh).scale(249.5).clipAngle(90.000001)};b.geoOrthographicRaw=fh;b.geoPath=function(b,l){function f(b){b&&("function"===typeof n&&w.pointRadius(+n.apply(this,arguments)), +bb(b,r(w)));return w.result()}var n=4.5,r,w;f.area=function(b){bb(b,r(sb));return sb.result()};f.measure=function(b){bb(b,r(id));return id.result()};f.bounds=function(b){bb(b,r(Qe));return Qe.result()};f.centroid=function(b){bb(b,r(Wa));return Wa.result()};f.projection=function(l){return arguments.length?(r=null==l?(b=null,fd):(b=l).stream,f):b};f.context=function(b){if(!arguments.length)return l;w=null==b?(l=null,new Uk):new Qk(l=b);"function"!==typeof n&&w.pointRadius(n);return f};f.pointRadius= +function(b){if(!arguments.length)return n;n="function"===typeof b?b:(w.pointRadius(+b),+b);return f};return f.projection(b).context(l)};b.geoProjection=kb;b.geoProjectionMutator=Zg;b.geoRotation=rk;b.geoStereographic=function(){return kb(gh).scale(250).clipAngle(142)};b.geoStereographicRaw=gh;b.geoStream=bb;b.geoTransform=function(b){return{stream:ld(b)}};b.geoTransverseMercator=function(){var b=bl(hh),l=b.center,u=b.rotate;b.center=function(b){return arguments.length?l([-b[1],b[0]]):(b=l(),[b[1], +-b[0]])};b.rotate=function(b){return arguments.length?u([b[0],b[1],2R;)A.pop(),--H;var J=Array(H+1);for(f=0;f<=H;++f){var K=J[f]=[];K.x0=0b||1=u.length)return null!=r&&f.sort(r),null!=w?w(f):f;for(var C=-1,F=f.length,A=u[l++],R,S,M=ob(),X,Z=n();++Cu.length)return b;var r=n[f-1];if(null!=w&&f>=u.length)var C=b.entries();else C=[],b.each(function(b,r){C.push({key:r,values:l(b,f)})});return null!=r?C.sort(function(b,f){return r(b.key,f.key)}):C}var u=[],n=[],r,w,D;return D={object:function(f){return b(f, +0,vq,wq)},map:function(f){return b(f,0,wj,xj)},entries:function(f){return l(b(f,0,wj,xj),0)},key:function(b){u.push(b);return D},sortKeys:function(b){n[u.length-1]=b;return D},sortValues:function(b){r=b;return D},rollup:function(b){w=b;return D}}};b.now=ic;b.pack=function(){function b(b){b.x=u/2;b.y=n/2;l?b.eachBefore(ml(l)).eachAfter(kh(r,.5)).eachBefore(nl(1)):b.eachBefore(ml(Hr)).eachAfter(kh(Vb,1)).eachAfter(kh(r,b.r/Math.min(u,n))).eachBefore(nl(Math.min(u,n)/(2*b.r)));return b}var l=null,u= +1,n=1,r=Vb;b.radius=function(f){return arguments.length?(l=null==f?null:We(f),b):l};b.size=function(f){return arguments.length?(u=+f[0],n=+f[1],b):[u,n]};b.padding=function(f){return arguments.length?(r="function"===typeof f?f:wc(+f),b):r};return b};b.packEnclose=fl;b.packSiblings=function(b){ll(b);return b};b.pairs=function(b,l){null==l&&(l=li);for(var f=0,n=b.length-1,r=b[0],w=Array(0>n?0:n);fQ?-1:1),X;for(f=0;fn?0:n);fl!==D>l&&r<(w-F)*(l-n)/(D-n)+F&&(C=!C),w=F,D=n;return C};b.polygonHull=function(b){if(3>(u=b.length))return null;var f,u,n=Array(u),r=Array(u);for(f=0;fl(w=b[n],D)||0!==l(D,D))D=w,r=n;if(0===l(D,D))return r}};b.schemeAccent=Wu;b.schemeBlues=Qn;b.schemeBrBG=vn;b.schemeBuGn=En;b.schemeBuPu=Fn;b.schemeCategory10=Vu;b.schemeDark2=Xu;b.schemeGnBu=Gn;b.schemeGreens=Rn;b.schemeGreys=Sn;b.schemeOrRd=Hn;b.schemeOranges=Vn;b.schemePRGn=wn;b.schemePaired=Yu;b.schemePastel1=Zu;b.schemePastel2=$u;b.schemePiYG=xn;b.schemePuBu=Jn;b.schemePuBuGn= +In;b.schemePuOr=yn;b.schemePuRd=Kn;b.schemePurples=Tn;b.schemeRdBu=zn;b.schemeRdGy=An;b.schemeRdPu=Ln;b.schemeRdYlBu=Bn;b.schemeRdYlGn=Cn;b.schemeReds=Un;b.schemeSet1=av;b.schemeSet2=bv;b.schemeSet3=cv;b.schemeSpectral=Dn;b.schemeTableau10=dv;b.schemeYlGn=Nn;b.schemeYlGnBu=Mn;b.schemeYlOrBr=On;b.schemeYlOrRd=Pn;b.select=Ka;b.selectAll=function(b){return"string"===typeof b?new za([document.querySelectorAll(b)],[document.documentElement]):new za([null==b?[]:b],Of)};b.selection=Nb;b.selector=Sd;b.selectorAll= +Kf;b.set=yj;b.shuffle=function(b,l,u){u=(null==u?b.length:u)-(l=null==l?0:+l);for(var f,r;u;)r=Math.random()*u--|0,f=b[u+l],b[u+l]=b[r+l],b[r+l]=f;return b};b.stack=function(){function b(b){var f=l.apply(this,arguments),w,C=b.length,A=f.length,S=Array(A);for(w=0;ww?(r[1]=F,r[0]=F+=w):(r[0]=0,r[1]= +w)};b.stackOffsetExpand=function(b,l){if(0<(n=b.length)){for(var f,n,r=0,w=b[0].length,D;rF.x&&(F=b);b.depth>J.depth&&(J=b)});f=C===F?1:r(C,F)/2;var K=f-C.x,Q=w/(F.x+f+K),T=D/(J.depth||1);b.eachBefore(function(b){b.x=(b.x+K)*Q;b.y=b.depth*T})}return b}function l(b){var f=b.children,l=b.parent.children,n=b.i?l[b.i-1]:null; +if(f){for(var u=0,w=0,C=b.children,D=C.length,A;0<=--D;)A=C[D],A.z+=u,A.m+=u,u+=A.s+(w+=A.c);f=(f[0].z+f[f.length-1].z)/2;n?(b.z=n.z+r(b._,n._),b.m=b.z-f):b.z=f}else n&&(b.z=n.z+r(b._,n._));f=b.parent;l=b.parent.A||l[0];if(n){w=u=b;C=u.parent.children[0];D=u.m;A=w.m;for(var F=n.m,M=C.m,W;n=mh(n),u=lh(u),n&&u;){C=lh(C);w=mh(w);w.a=b;W=n.z+F-u.z-D+r(n._,u._);if(0=l-1)b=A[b],b.x0=r,b.y0=u,b.x1=w,b.y1=D;else{for(var C=S[b],F=n/2+C,H=b+1,J=l-1;H>>1;S[K]D-u?(n=(r*F+w*C)/n,f(b,H,C,r,u,n,D),f(H,l,F,n,u,w,D)):(n=(u*F+D*C)/n,f(b,H, +C,r,u,w,n),f(H,l,F,r,n,w,D))}}var A=b.children,F,C=A.length,M,S=Array(C+1);for(S[0]=M=F=0;Fha}f.zoom("mouse",T(u(f.that.__zoom,f.mouse[0]=Ob(f.that),f.mouse[1]),f.extent,Y))},!0).on("mouseup.zoom",function(){l.on("mousemove.zoom mouseup.zoom",null);Wd(b.event.view,f.moved);Kd();f.end()},!0),n=Ob(this),r=b.event.clientX,A=b.event.clientY;Vd(b.event.view);b.event.stopImmediatePropagation();f.mouse=[n,this.__zoom.invert(n)];Rb(this);f.start()}}function M(){if(K.apply(this,arguments)){var n=this.__zoom, +w=Ob(this),A=n.invert(w);n=T(u(l(n,n.k*(b.event.shiftKey?.5:2)),w,A),Q.apply(this,arguments),Y);Kd();0n.taps&&(da=setTimeout(function(){da=null},500)),Rb(this),n.start())}}function H(){if(this.__zooming){var f=w(this,arguments),n=b.event.changedTouches,r=n.length,A;Kd();da&&(da=clearTimeout(da));for(A=f.taps=0;A to be set while inserting or modifying + + \ No newline at end of file diff --git a/src/main/webapp/assets/js/views/agendas.vue b/src/main/webapp/assets/js/views/agendas.vue new file mode 100644 index 0000000..baadb02 --- /dev/null +++ b/src/main/webapp/assets/js/views/agendas.vue @@ -0,0 +1,204 @@ + + + + + + + \ No newline at end of file diff --git a/src/main/webapp/assets/js/views/createDebate.vue b/src/main/webapp/assets/js/views/createDebate.vue new file mode 100644 index 0000000..24cd605 --- /dev/null +++ b/src/main/webapp/assets/js/views/createDebate.vue @@ -0,0 +1,283 @@ + + + diff --git a/src/main/webapp/assets/js/views/debate.vue b/src/main/webapp/assets/js/views/debate.vue new file mode 100644 index 0000000..95b785a --- /dev/null +++ b/src/main/webapp/assets/js/views/debate.vue @@ -0,0 +1,615 @@ + + + \ No newline at end of file diff --git a/src/main/webapp/assets/js/views/debates.vue b/src/main/webapp/assets/js/views/debates.vue new file mode 100644 index 0000000..ca7a75b --- /dev/null +++ b/src/main/webapp/assets/js/views/debates.vue @@ -0,0 +1,91 @@ + + + \ No newline at end of file diff --git a/src/main/webapp/assets/js/views/document.vue b/src/main/webapp/assets/js/views/document.vue new file mode 100644 index 0000000..4ace7bf --- /dev/null +++ b/src/main/webapp/assets/js/views/document.vue @@ -0,0 +1,110 @@ + + + diff --git a/src/main/webapp/assets/js/views/documents.vue b/src/main/webapp/assets/js/views/documents.vue new file mode 100644 index 0000000..71625ac --- /dev/null +++ b/src/main/webapp/assets/js/views/documents.vue @@ -0,0 +1,140 @@ + + + \ No newline at end of file diff --git a/src/main/webapp/assets/js/views/home.vue b/src/main/webapp/assets/js/views/home.vue new file mode 100644 index 0000000..e15826f --- /dev/null +++ b/src/main/webapp/assets/js/views/home.vue @@ -0,0 +1,154 @@ +. + + \ No newline at end of file diff --git a/src/main/webapp/assets/js/views/restitution.vue b/src/main/webapp/assets/js/views/restitution.vue new file mode 100644 index 0000000..bc500c9 --- /dev/null +++ b/src/main/webapp/assets/js/views/restitution.vue @@ -0,0 +1,97 @@ + + + \ No newline at end of file diff --git a/src/main/webapp/assets/js/views/sondage.vue b/src/main/webapp/assets/js/views/sondage.vue new file mode 100644 index 0000000..f6fd2b0 --- /dev/null +++ b/src/main/webapp/assets/js/views/sondage.vue @@ -0,0 +1,285 @@ + + + diff --git a/src/main/webapp/assets/js/views/sondages.vue b/src/main/webapp/assets/js/views/sondages.vue new file mode 100644 index 0000000..c4c3d53 --- /dev/null +++ b/src/main/webapp/assets/js/views/sondages.vue @@ -0,0 +1,472 @@ + + + + + + + \ No newline at end of file diff --git a/src/main/webapp/assets/js/views/team.vue b/src/main/webapp/assets/js/views/team.vue new file mode 100644 index 0000000..e178b31 --- /dev/null +++ b/src/main/webapp/assets/js/views/team.vue @@ -0,0 +1,79 @@ + + + \ No newline at end of file diff --git a/src/main/webapp/assets/js/views/teams.vue b/src/main/webapp/assets/js/views/teams.vue new file mode 100644 index 0000000..8e2be3a --- /dev/null +++ b/src/main/webapp/assets/js/views/teams.vue @@ -0,0 +1,208 @@ + + + \ No newline at end of file diff --git a/src/main/webapp/assets/js/views/updateTags.vue b/src/main/webapp/assets/js/views/updateTags.vue new file mode 100644 index 0000000..6334594 --- /dev/null +++ b/src/main/webapp/assets/js/views/updateTags.vue @@ -0,0 +1,63 @@ + + + \ No newline at end of file diff --git a/src/main/webapp/assets/js/vueCfg.js b/src/main/webapp/assets/js/vueCfg.js new file mode 100644 index 0000000..57031e8 --- /dev/null +++ b/src/main/webapp/assets/js/vueCfg.js @@ -0,0 +1,63 @@ +/***** Register Vue components *****/ +Vue.component('base-layout', vueLoader('layouts/baseLayout')); +Vue.component('grid-layout', vueLoader('layouts/gridLayout')); +Vue.component('modal-layout', vueLoader('layouts/modalLayout')); +Vue.component('tabs-layout', vueLoader('layouts/tabsLayout')); +Vue.component('institution-select', vueLoader('components/widgets/institutionSelect')); +Vue.component('tooltiped', vueLoader('components/widgets/tooltiped')); +Vue.component('documented', vueLoader('components/widgets/documented')); +Vue.component('search-box', vueLoader('components/widgets/searchBox')); +Vue.component('action-button', vueLoader('components/widgets/actionButton')); +Vue.component('toggle-action-button', vueLoader('components/widgets/toggleActionButton')); +Vue.component('text-input', vueLoader('components/widgets/textInput')); + +const VueModal = { + data() { + return { + callback: false + }; + }, + methods: { + open(callback) { + if (callback) { + this.callback = callback; + } + this.$children[0].open = true; + this.$emit('open'); + if (this.afterOpen) { + this.afterOpen( ); + } + }, + close(returnValue = false) { + this.$children[0].open = false; + this.$emit('close'); + if (this.callback) { + this.callback(returnValue); + } + if (this.afterClose) { + this.afterClose( ); + } + }, + isOpen() { + return this.$children[0].open; + } + } +}; + +const VueGrid = { + methods: { + getRowById(id) { + let row = this.$children[0].$refs[id]; + if (Array.isArray(row)) { + return row[0]; + } + return row; + }, + selectRow(id) { + let row = this.getRowById(id); + let el = row.querySelector("[tabindex]"); + el.focus(); + scrollCenter(document.documentElement, el); + } + } +}; diff --git a/src/main/webapp/assets/js/vueCfg.min.js b/src/main/webapp/assets/js/vueCfg.min.js new file mode 100644 index 0000000..560fe14 --- /dev/null +++ b/src/main/webapp/assets/js/vueCfg.min.js @@ -0,0 +1,4 @@ +Vue.component("base-layout",vueLoader("layouts/baseLayout"));Vue.component("grid-layout",vueLoader("layouts/gridLayout"));Vue.component("modal-layout",vueLoader("layouts/modalLayout"));Vue.component("tabs-layout",vueLoader("layouts/tabsLayout"));Vue.component("institution-select",vueLoader("components/widgets/institutionSelect"));Vue.component("tooltiped",vueLoader("components/widgets/tooltiped"));Vue.component("documented",vueLoader("components/widgets/documented"));Vue.component("search-box",vueLoader("components/widgets/searchBox")); +Vue.component("action-button",vueLoader("components/widgets/actionButton"));Vue.component("toggle-action-button",vueLoader("components/widgets/toggleActionButton"));Vue.component("text-input",vueLoader("components/widgets/textInput")); +const VueModal={data(){return{callback:!1}},methods:{open(a){a&&(this.callback=a);this.$children[0].open=!0;this.$emit("open");this.afterOpen&&this.afterOpen()},close(a=!1){this.$children[0].open=!1;this.$emit("close");this.callback&&this.callback(a);this.afterClose&&this.afterClose()},isOpen(){return this.$children[0].open}}},VueGrid={methods:{getRowById(a){a=this.$children[0].$refs[a];return Array.isArray(a)?a[0]:a},selectRow(a){a=this.getRowById(a).querySelector("[tabindex]");a.focus();scrollCenter(document.documentElement, +a)}}}; \ No newline at end of file diff --git a/src/main/webapp/index.jsp b/src/main/webapp/index.jsp new file mode 100644 index 0000000..d859dbd --- /dev/null +++ b/src/main/webapp/index.jsp @@ -0,0 +1,350 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> +<%@ page language="java" import="java.util.*" %> +<%@ page import = "java.util.ResourceBundle" %> +<% ResourceBundle resource = ResourceBundle.getBundle("application"); + String productionMode = resource.getString("production"); + String serverRoot = resource.getString("reverse-proxy"); + if (serverRoot.length() == 0) { + serverRoot = request.getRequestURL().substring(0, request.getRequestURL().length() - "/index.jsp".length()); + } + boolean canMail = resource.getString("smtp.server").length() > 0;%> + + + + + + + + + + + Plateforme AREN + + + + + + <% if (productionMode.equals("true")) {%> + + + + + + + + + + + + + + + + + + + + + <% } else { %> + + + + + + + + + + + + + + + + + + + + + <% }%> + + + + +
+ + +
+
+
+ +
+ +
+ + + + + + + + + + + + +
+ + + + + \ No newline at end of file