From 74595b87ae13c423676ada72524a96ffcce14d57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andrej=20Rama=C5=A1euski?= Date: Fri, 13 Dec 2019 14:34:51 +0100 Subject: [PATCH] Initial commit --- account/account.ftl | 88 + account/applications.ftl | 96 + account/federatedIdentity.ftl | 44 + account/log.ftl | 35 + account/messages/messages_ca.properties | 147 + account/messages/messages_cs.properties | 171 + account/messages/messages_de.properties | 147 + account/messages/messages_en.properties | 185 + account/messages/messages_es.properties | 147 + account/messages/messages_fr.properties | 152 + account/messages/messages_it.properties | 153 + account/messages/messages_ja.properties | 153 + account/messages/messages_lt.properties | 153 + account/messages/messages_nl.properties | 133 + account/messages/messages_no.properties | 165 + account/messages/messages_pt_BR.properties | 149 + account/messages/messages_ru.properties | 155 + account/messages/messages_sv.properties | 150 + account/messages/messages_zh_CN.properties | 166 + account/password.ftl | 33 + account/resources/css/style.css | 161 + account/resources/css/style.css.map | 7 + account/resources/css/style.sass | 165 + account/resources/img/logo.svg | 48 + account/resources/js/fontawesome_all.js | 5 + account/sessions.ftl | 46 + account/template.ftl | 75 + account/theme.properties | 3 + account/totp.ftl | 67 + admin/index.ftl | 118 + admin/messages/admin-messages_ca.properties | 466 + admin/messages/admin-messages_de.properties | 0 admin/messages/admin-messages_en.properties | 1382 +++ admin/messages/admin-messages_es.properties | 467 + admin/messages/admin-messages_fr.properties | 142 + admin/messages/admin-messages_it.properties | 0 admin/messages/admin-messages_ja.properties | 1228 +++ admin/messages/admin-messages_lt.properties | 1218 +++ admin/messages/admin-messages_nl.properties | 0 admin/messages/admin-messages_no.properties | 1125 +++ .../messages/admin-messages_pt_BR.properties | 1097 +++ admin/messages/admin-messages_ru.properties | 1273 +++ .../messages/admin-messages_zh_CN.properties | 1228 +++ admin/messages/messages_ca.properties | 8 + admin/messages/messages_en.properties | 28 + admin/messages/messages_es.properties | 8 + admin/messages/messages_fr.properties | 8 + admin/messages/messages_it.properties | 0 admin/messages/messages_ja.properties | 25 + admin/messages/messages_lt.properties | 24 + admin/messages/messages_nl.properties | 27 + admin/messages/messages_no.properties | 14 + admin/messages/messages_pt_BR.properties | 18 + admin/messages/messages_ru.properties | 26 + admin/messages/messages_zh_CN.properties | 26 + admin/resources/js/app.js | 2958 ++++++ admin/resources/js/authz/authz-app.js | 543 ++ admin/resources/js/authz/authz-controller.js | 2654 +++++ admin/resources/js/authz/authz-services.js | 204 + admin/resources/js/controllers/clients.js | 2340 +++++ admin/resources/js/controllers/groups.js | 503 + admin/resources/js/controllers/realm.js | 2842 ++++++ admin/resources/js/controllers/roles.js | 48 + admin/resources/js/controllers/users.js | 1504 +++ admin/resources/js/loaders.js | 536 ++ admin/resources/js/services.js | 1830 ++++ .../authentication-flow-bindings.html | 83 + .../partials/authentication-flows.html | 69 + .../partials/authenticator-config.html | 55 + .../authz/mgmt/broker-permissions.html | 40 + .../authz/mgmt/client-permissions.html | 39 + .../authz/mgmt/client-role-permissions.html | 40 + .../authz/mgmt/group-permissions.html | 39 + .../authz/mgmt/realm-role-permissions.html | 39 + .../authz/mgmt/users-permissions.html | 35 + ...esource-server-policy-resource-detail.html | 91 + .../resource-server-policy-scope-detail.html | 94 + .../resource-server-permission-list.html | 127 + ...source-server-policy-aggregate-detail.html | 81 + .../resource-server-policy-client-detail.html | 91 + .../resource-server-policy-drools-detail.html | 124 + .../resource-server-policy-group-detail.html | 124 + .../resource-server-policy-js-detail.html | 67 + .../resource-server-policy-role-detail.html | 166 + .../resource-server-policy-time-detail.html | 117 + .../resource-server-policy-user-detail.html | 91 + ...esource-server-policy-evaluate-result.html | 66 + .../resource-server-policy-evaluate.html | 267 + .../policy/resource-server-policy-list.html | 128 + .../authz/resource-server-detail.html | 63 + .../resource-server-export-settings.html | 35 + .../partials/authz/resource-server-list.html | 49 + .../resource-server-resource-detail.html | 73 + .../authz/resource-server-resource-list.html | 148 + .../authz/resource-server-scope-detail.html | 43 + .../authz/resource-server-scope-list.html | 111 + admin/resources/partials/brute-force.html | 114 + admin/resources/partials/claims.html | 62 + .../partials/client-clustering-node.html | 37 + .../resources/partials/client-clustering.html | 76 + .../partials/client-credentials-generic.html | 14 + .../client-credentials-jwt-key-export.html | 60 + .../client-credentials-jwt-key-import.html | 65 + .../partials/client-credentials-jwt.html | 74 + .../partials/client-credentials-secret.html | 17 + .../partials/client-credentials.html | 38 + admin/resources/partials/client-detail.html | 402 + admin/resources/partials/client-import.html | 46 + .../client-initial-access-create.html | 63 + .../partials/client-initial-access.html | 55 + .../partials/client-installation.html | 36 + admin/resources/partials/client-keys.html | 149 + admin/resources/partials/client-list.html | 56 + .../partials/client-mappers-add.html | 53 + admin/resources/partials/client-mappers.html | 67 + .../partials/client-offline-sessions.html | 59 + .../client-protocol-mapper-detail.html | 13 + .../partials/client-reg-policies.html | 106 + .../partials/client-reg-policy-detail.html | 68 + .../client-reg-trusted-host-create.html | 55 + .../client-reg-trusted-host-detail.html | 64 + .../client-registration-access-token.html | 18 + .../resources/partials/client-revocation.html | 30 + .../partials/client-role-detail.html | 140 + .../resources/partials/client-role-list.html | 41 + .../partials/client-saml-key-export.html | 66 + .../partials/client-saml-key-import.html | 65 + .../resources/partials/client-saml-keys.html | 66 + .../partials/client-scope-mappings.html | 137 + .../client-service-account-roles.html | 111 + admin/resources/partials/client-sessions.html | 57 + .../partials/client-template-detail.html | 55 + .../partials/client-template-list.html | 46 + .../partials/client-template-mappers-add.html | 53 + .../partials/client-template-mappers.html | 53 + ...lient-template-protocol-mapper-detail.html | 13 + .../client-template-scope-mappings.html | 117 + admin/resources/partials/create-client.html | 85 + .../resources/partials/create-execution.html | 31 + .../partials/create-flow-execution.html | 55 + admin/resources/partials/create-flow.html | 43 + admin/resources/partials/create-group.html | 25 + admin/resources/partials/default-groups.html | 80 + admin/resources/partials/defense-headers.html | 64 + admin/resources/partials/forbidden.html | 7 + .../resources/partials/group-attributes.html | 41 + admin/resources/partials/group-detail.html | 28 + admin/resources/partials/group-list.html | 50 + admin/resources/partials/group-members.html | 48 + .../partials/group-role-mappings.html | 102 + admin/resources/partials/home.html | 4 + .../identity-provider-mapper-detail.html | 68 + .../partials/identity-provider-mappers.html | 49 + admin/resources/partials/menu.html | 26 + .../modal/realm-events-admin-auth.html | 8 + .../realm-events-admin-representation.html | 3 + .../partials/modal/role-selector.html | 40 + ...unregistered-required-action-selector.html | 21 + admin/resources/partials/modal/view-key.html | 18 + .../resources/partials/modal/view-object.html | 3 + admin/resources/partials/notfound.html | 7 + admin/resources/partials/otp-policy.html | 80 + admin/resources/partials/pagenotfound.html | 7 + admin/resources/partials/partial-export.html | 34 + admin/resources/partials/partial-import.html | 130 + admin/resources/partials/password-policy.html | 51 + .../partials/protocol-mapper-detail.html | 79 + .../partials/realm-cache-settings.html | 30 + admin/resources/partials/realm-create.html | 45 + .../partials/realm-default-roles.html | 82 + admin/resources/partials/realm-detail.html | 56 + .../partials/realm-events-admin.html | 134 + .../partials/realm-events-config.html | 104 + admin/resources/partials/realm-events.html | 124 + .../realm-identity-provider-bitbucket.html | 130 + .../realm-identity-provider-export.html | 23 + .../realm-identity-provider-facebook-ext.html | 0 .../realm-identity-provider-facebook.html | 1 + .../realm-identity-provider-github-ext.html | 0 .../realm-identity-provider-github.html | 1 + .../realm-identity-provider-gitlab.html | 130 + .../realm-identity-provider-google-ext.html | 7 + .../realm-identity-provider-google.html | 1 + ...realm-identity-provider-keycloak-oidc.html | 1 + .../realm-identity-provider-linkedin-ext.html | 0 .../realm-identity-provider-linkedin.html | 1 + ...realm-identity-provider-microsoft-ext.html | 0 .../realm-identity-provider-microsoft.html | 1 + .../realm-identity-provider-oidc.html | 299 + ...lm-identity-provider-openshift-v3-ext.html | 7 + .../realm-identity-provider-openshift-v3.html | 154 + .../realm-identity-provider-paypal-ext.html | 7 + .../realm-identity-provider-paypal.html | 1 + .../realm-identity-provider-saml.html | 277 + .../realm-identity-provider-social.html | 138 + ...m-identity-provider-stackoverflow-ext.html | 7 + ...realm-identity-provider-stackoverflow.html | 1 + .../realm-identity-provider-twitter-ext.html | 0 .../realm-identity-provider-twitter.html | 1 + .../partials/realm-identity-provider.html | 81 + .../partials/realm-keys-generic.html | 68 + admin/resources/partials/realm-keys-list.html | 56 + .../partials/realm-keys-providers.html | 67 + admin/resources/partials/realm-keys.html | 35 + admin/resources/partials/realm-list.html | 20 + .../partials/realm-login-settings.html | 87 + .../resources/partials/realm-role-users.html | 50 + admin/resources/partials/realm-smtp.html | 98 + .../partials/realm-theme-settings.html | 97 + admin/resources/partials/realm-tokens.html | 227 + .../resources/partials/required-actions.html | 34 + admin/resources/partials/role-detail.html | 135 + admin/resources/partials/role-list.html | 53 + admin/resources/partials/role-mappings.html | 101 + .../partials/server-info-providers.html | 55 + admin/resources/partials/server-info.html | 112 + admin/resources/partials/session-realm.html | 32 + .../partials/session-revocation.html | 30 + admin/resources/partials/user-attributes.html | 41 + admin/resources/partials/user-consents.html | 54 + .../resources/partials/user-credentials.html | 104 + admin/resources/partials/user-detail.html | 150 + .../user-federated-identity-detail.html | 53 + .../user-federated-identity-list.html | 41 + admin/resources/partials/user-federation.html | 67 + .../partials/user-group-membership.html | 85 + admin/resources/partials/user-list.html | 69 + .../partials/user-offline-sessions.html | 35 + admin/resources/partials/user-sessions.html | 43 + .../partials/user-storage-generic.html | 239 + .../partials/user-storage-kerberos.html | 257 + .../user-storage-ldap-mapper-detail.html | 64 + .../partials/user-storage-ldap-mappers.html | 46 + .../resources/partials/user-storage-ldap.html | 479 + admin/resources/partials/user-storage.html | 43 + .../templates/authz/kc-authz-modal.html | 11 + .../authz/kc-tabs-resource-server.html | 14 + .../templates/kc-component-config.html | 68 + admin/resources/templates/kc-copy.html | 18 + admin/resources/templates/kc-dropdown.html | 12 + admin/resources/templates/kc-menu.html | 63 + .../resources/templates/kc-modal-message.html | 10 + admin/resources/templates/kc-modal.html | 11 + admin/resources/templates/kc-paging.html | 25 + .../templates/kc-provider-config.html | 43 + admin/resources/templates/kc-switch.html | 12 + .../templates/kc-tabs-authentication.html | 7 + .../templates/kc-tabs-client-role.html | 13 + .../templates/kc-tabs-client-template.html | 20 + admin/resources/templates/kc-tabs-client.html | 59 + .../templates/kc-tabs-group-list.html | 11 + admin/resources/templates/kc-tabs-group.html | 17 + .../templates/kc-tabs-identity-provider.html | 17 + admin/resources/templates/kc-tabs-ldap.html | 12 + admin/resources/templates/kc-tabs-realm.html | 19 + admin/resources/templates/kc-tabs-role.html | 15 + .../templates/kc-tabs-user-storage.html | 11 + admin/resources/templates/kc-tabs-user.html | 18 + admin/resources/templates/kc-tabs-users.html | 11 + admin/theme.properties | 1 + email/html/email-test.ftl | 5 + email/html/email-verification.ftl | 5 + email/html/event-login_error.ftl | 5 + email/html/event-remove_totp.ftl | 5 + email/html/event-update_password.ftl | 5 + email/html/event-update_totp.ftl | 5 + email/html/executeActions.ftl | 8 + email/html/identity-provider-link.ftl | 5 + email/html/password-reset.ftl | 5 + email/messages/messages_ca.properties | 21 + email/messages/messages_cs.properties | 42 + email/messages/messages_de.properties | 24 + email/messages/messages_en.properties | 33 + email/messages/messages_es.properties | 21 + email/messages/messages_fr.properties | 21 + email/messages/messages_it.properties | 24 + email/messages/messages_ja.properties | 25 + email/messages/messages_lt.properties | 24 + email/messages/messages_nl.properties | 27 + email/messages/messages_no.properties | 24 + email/messages/messages_pt_BR.properties | 19 + email/messages/messages_ru.properties | 25 + email/messages/messages_sv.properties | 25 + email/messages/messages_zh_CN.properties | 25 + email/text/email-test.ftl | 1 + email/text/email-verification.ftl | 1 + email/text/event-login_error.ftl | 1 + email/text/event-remove_totp.ftl | 1 + email/text/event-update_password.ftl | 1 + email/text/event-update_totp.ftl | 1 + email/text/executeActions.ftl | 4 + email/text/identity-provider-link.ftl | 1 + email/text/password-reset.ftl | 1 + email/theme.properties | 1 + login/code.ftl | 21 + login/error.ftl | 15 + login/info.ftl | 25 + login/login-config-totp.ftl | 29 + login/login-idp-link-confirm.ftl | 18 + login/login-idp-link-email.ftl | 21 + login/login-oauth-grant.ftl | 67 + login/login-page-expired.ftl | 16 + login/login-reset-password.ftl | 30 + login/login-totp.ftl | 27 + login/login-update-password.ftl | 53 + login/login-update-profile.ftl | 60 + login/login-verify-email.ftl | 18 + login/login-x509-info.ftl | 58 + login/login.ftl | 96 + login/messages/messages_ca.properties | 200 + login/messages/messages_cs.properties | 272 + login/messages/messages_de.properties | 195 + login/messages/messages_en.properties | 285 + login/messages/messages_es.properties | 200 + login/messages/messages_fr.properties | 214 + login/messages/messages_it.properties | 216 + login/messages/messages_ja.properties | 218 + login/messages/messages_lt.properties | 218 + login/messages/messages_nl.properties | 224 + login/messages/messages_no.properties | 231 + login/messages/messages_pt_BR.properties | 214 + login/messages/messages_ru.properties | 220 + login/messages/messages_sv.properties | 216 + login/messages/messages_zh_CN.properties | 234 + login/register.ftl | 123 + login/resources/css/firasans_opensans.css | 42 + login/resources/css/lightGrey.png | Bin 0 -> 4618 bytes .../css/mem5YaGs126MiZpBA-UN7rgOUuhs.ttf | Bin 0 -> 28192 bytes .../css/mem5YaGs126MiZpBA-UNirkOUuhs.ttf | Bin 0 -> 27496 bytes .../css/mem8YaGs126MiZpBA-UFVZ0e.ttf | Bin 0 -> 26488 bytes login/resources/css/style.css | 8508 +++++++++++++++++ .../css/va9B4kDNxMZdWfMOD5VnLK3eRhf_.ttf | Bin 0 -> 58232 bytes .../css/va9B4kDNxMZdWfMOD5VnZKveRhf_.ttf | Bin 0 -> 53604 bytes .../css/va9E4kDNxMZdWfMOD5Vvl4jO.ttf | Bin 0 -> 54032 bytes .../css/va9f4kDNxMZdWfMOD5VvkrBiQyf4VFw.ttf | Bin 0 -> 54300 bytes login/resources/fonts/fontawesome-webfont.ttf | Bin 0 -> 165548 bytes .../resources/fonts/fontawesome-webfont.woff | Bin 0 -> 98024 bytes .../resources/fonts/fontawesome-webfont.woff2 | Bin 0 -> 77160 bytes login/resources/img/brand/logo_napis.svg | 48 + .../resources/img/brand/logo_napis_white.png | Bin 0 -> 16011 bytes login/resources/js/fontawesome_all.js | 14 + login/template.ftl | 234 + login/terms.ftl | 20 + login/theme.properties | 12 + 344 files changed, 54858 insertions(+) create mode 100644 account/account.ftl create mode 100644 account/applications.ftl create mode 100644 account/federatedIdentity.ftl create mode 100644 account/log.ftl create mode 100644 account/messages/messages_ca.properties create mode 100644 account/messages/messages_cs.properties create mode 100644 account/messages/messages_de.properties create mode 100644 account/messages/messages_en.properties create mode 100644 account/messages/messages_es.properties create mode 100644 account/messages/messages_fr.properties create mode 100644 account/messages/messages_it.properties create mode 100644 account/messages/messages_ja.properties create mode 100644 account/messages/messages_lt.properties create mode 100644 account/messages/messages_nl.properties create mode 100644 account/messages/messages_no.properties create mode 100644 account/messages/messages_pt_BR.properties create mode 100644 account/messages/messages_ru.properties create mode 100644 account/messages/messages_sv.properties create mode 100644 account/messages/messages_zh_CN.properties create mode 100644 account/password.ftl create mode 100644 account/resources/css/style.css create mode 100644 account/resources/css/style.css.map create mode 100644 account/resources/css/style.sass create mode 100644 account/resources/img/logo.svg create mode 100644 account/resources/js/fontawesome_all.js create mode 100644 account/sessions.ftl create mode 100644 account/template.ftl create mode 100644 account/theme.properties create mode 100644 account/totp.ftl create mode 100644 admin/index.ftl create mode 100644 admin/messages/admin-messages_ca.properties create mode 100644 admin/messages/admin-messages_de.properties create mode 100644 admin/messages/admin-messages_en.properties create mode 100644 admin/messages/admin-messages_es.properties create mode 100644 admin/messages/admin-messages_fr.properties create mode 100644 admin/messages/admin-messages_it.properties create mode 100644 admin/messages/admin-messages_ja.properties create mode 100644 admin/messages/admin-messages_lt.properties create mode 100644 admin/messages/admin-messages_nl.properties create mode 100644 admin/messages/admin-messages_no.properties create mode 100644 admin/messages/admin-messages_pt_BR.properties create mode 100644 admin/messages/admin-messages_ru.properties create mode 100644 admin/messages/admin-messages_zh_CN.properties create mode 100644 admin/messages/messages_ca.properties create mode 100644 admin/messages/messages_en.properties create mode 100644 admin/messages/messages_es.properties create mode 100644 admin/messages/messages_fr.properties create mode 100644 admin/messages/messages_it.properties create mode 100644 admin/messages/messages_ja.properties create mode 100644 admin/messages/messages_lt.properties create mode 100644 admin/messages/messages_nl.properties create mode 100644 admin/messages/messages_no.properties create mode 100644 admin/messages/messages_pt_BR.properties create mode 100644 admin/messages/messages_ru.properties create mode 100644 admin/messages/messages_zh_CN.properties create mode 100644 admin/resources/js/app.js create mode 100644 admin/resources/js/authz/authz-app.js create mode 100644 admin/resources/js/authz/authz-controller.js create mode 100644 admin/resources/js/authz/authz-services.js create mode 100644 admin/resources/js/controllers/clients.js create mode 100644 admin/resources/js/controllers/groups.js create mode 100644 admin/resources/js/controllers/realm.js create mode 100644 admin/resources/js/controllers/roles.js create mode 100644 admin/resources/js/controllers/users.js create mode 100644 admin/resources/js/loaders.js create mode 100644 admin/resources/js/services.js create mode 100644 admin/resources/partials/authentication-flow-bindings.html create mode 100644 admin/resources/partials/authentication-flows.html create mode 100644 admin/resources/partials/authenticator-config.html create mode 100644 admin/resources/partials/authz/mgmt/broker-permissions.html create mode 100644 admin/resources/partials/authz/mgmt/client-permissions.html create mode 100644 admin/resources/partials/authz/mgmt/client-role-permissions.html create mode 100644 admin/resources/partials/authz/mgmt/group-permissions.html create mode 100644 admin/resources/partials/authz/mgmt/realm-role-permissions.html create mode 100644 admin/resources/partials/authz/mgmt/users-permissions.html create mode 100644 admin/resources/partials/authz/permission/provider/resource-server-policy-resource-detail.html create mode 100644 admin/resources/partials/authz/permission/provider/resource-server-policy-scope-detail.html create mode 100644 admin/resources/partials/authz/permission/resource-server-permission-list.html create mode 100644 admin/resources/partials/authz/policy/provider/resource-server-policy-aggregate-detail.html create mode 100644 admin/resources/partials/authz/policy/provider/resource-server-policy-client-detail.html create mode 100644 admin/resources/partials/authz/policy/provider/resource-server-policy-drools-detail.html create mode 100644 admin/resources/partials/authz/policy/provider/resource-server-policy-group-detail.html create mode 100644 admin/resources/partials/authz/policy/provider/resource-server-policy-js-detail.html create mode 100644 admin/resources/partials/authz/policy/provider/resource-server-policy-role-detail.html create mode 100644 admin/resources/partials/authz/policy/provider/resource-server-policy-time-detail.html create mode 100644 admin/resources/partials/authz/policy/provider/resource-server-policy-user-detail.html create mode 100644 admin/resources/partials/authz/policy/resource-server-policy-evaluate-result.html create mode 100644 admin/resources/partials/authz/policy/resource-server-policy-evaluate.html create mode 100644 admin/resources/partials/authz/policy/resource-server-policy-list.html create mode 100644 admin/resources/partials/authz/resource-server-detail.html create mode 100644 admin/resources/partials/authz/resource-server-export-settings.html create mode 100644 admin/resources/partials/authz/resource-server-list.html create mode 100644 admin/resources/partials/authz/resource-server-resource-detail.html create mode 100644 admin/resources/partials/authz/resource-server-resource-list.html create mode 100644 admin/resources/partials/authz/resource-server-scope-detail.html create mode 100644 admin/resources/partials/authz/resource-server-scope-list.html create mode 100644 admin/resources/partials/brute-force.html create mode 100644 admin/resources/partials/claims.html create mode 100644 admin/resources/partials/client-clustering-node.html create mode 100644 admin/resources/partials/client-clustering.html create mode 100644 admin/resources/partials/client-credentials-generic.html create mode 100644 admin/resources/partials/client-credentials-jwt-key-export.html create mode 100644 admin/resources/partials/client-credentials-jwt-key-import.html create mode 100644 admin/resources/partials/client-credentials-jwt.html create mode 100644 admin/resources/partials/client-credentials-secret.html create mode 100644 admin/resources/partials/client-credentials.html create mode 100644 admin/resources/partials/client-detail.html create mode 100644 admin/resources/partials/client-import.html create mode 100644 admin/resources/partials/client-initial-access-create.html create mode 100644 admin/resources/partials/client-initial-access.html create mode 100644 admin/resources/partials/client-installation.html create mode 100644 admin/resources/partials/client-keys.html create mode 100644 admin/resources/partials/client-list.html create mode 100644 admin/resources/partials/client-mappers-add.html create mode 100644 admin/resources/partials/client-mappers.html create mode 100644 admin/resources/partials/client-offline-sessions.html create mode 100644 admin/resources/partials/client-protocol-mapper-detail.html create mode 100644 admin/resources/partials/client-reg-policies.html create mode 100644 admin/resources/partials/client-reg-policy-detail.html create mode 100644 admin/resources/partials/client-reg-trusted-host-create.html create mode 100644 admin/resources/partials/client-reg-trusted-host-detail.html create mode 100644 admin/resources/partials/client-registration-access-token.html create mode 100644 admin/resources/partials/client-revocation.html create mode 100644 admin/resources/partials/client-role-detail.html create mode 100644 admin/resources/partials/client-role-list.html create mode 100644 admin/resources/partials/client-saml-key-export.html create mode 100644 admin/resources/partials/client-saml-key-import.html create mode 100644 admin/resources/partials/client-saml-keys.html create mode 100644 admin/resources/partials/client-scope-mappings.html create mode 100644 admin/resources/partials/client-service-account-roles.html create mode 100644 admin/resources/partials/client-sessions.html create mode 100644 admin/resources/partials/client-template-detail.html create mode 100644 admin/resources/partials/client-template-list.html create mode 100644 admin/resources/partials/client-template-mappers-add.html create mode 100644 admin/resources/partials/client-template-mappers.html create mode 100644 admin/resources/partials/client-template-protocol-mapper-detail.html create mode 100644 admin/resources/partials/client-template-scope-mappings.html create mode 100644 admin/resources/partials/create-client.html create mode 100644 admin/resources/partials/create-execution.html create mode 100644 admin/resources/partials/create-flow-execution.html create mode 100644 admin/resources/partials/create-flow.html create mode 100644 admin/resources/partials/create-group.html create mode 100644 admin/resources/partials/default-groups.html create mode 100644 admin/resources/partials/defense-headers.html create mode 100644 admin/resources/partials/forbidden.html create mode 100644 admin/resources/partials/group-attributes.html create mode 100644 admin/resources/partials/group-detail.html create mode 100644 admin/resources/partials/group-list.html create mode 100644 admin/resources/partials/group-members.html create mode 100644 admin/resources/partials/group-role-mappings.html create mode 100644 admin/resources/partials/home.html create mode 100644 admin/resources/partials/identity-provider-mapper-detail.html create mode 100644 admin/resources/partials/identity-provider-mappers.html create mode 100644 admin/resources/partials/menu.html create mode 100644 admin/resources/partials/modal/realm-events-admin-auth.html create mode 100644 admin/resources/partials/modal/realm-events-admin-representation.html create mode 100644 admin/resources/partials/modal/role-selector.html create mode 100644 admin/resources/partials/modal/unregistered-required-action-selector.html create mode 100644 admin/resources/partials/modal/view-key.html create mode 100644 admin/resources/partials/modal/view-object.html create mode 100644 admin/resources/partials/notfound.html create mode 100644 admin/resources/partials/otp-policy.html create mode 100644 admin/resources/partials/pagenotfound.html create mode 100644 admin/resources/partials/partial-export.html create mode 100644 admin/resources/partials/partial-import.html create mode 100644 admin/resources/partials/password-policy.html create mode 100644 admin/resources/partials/protocol-mapper-detail.html create mode 100644 admin/resources/partials/realm-cache-settings.html create mode 100644 admin/resources/partials/realm-create.html create mode 100644 admin/resources/partials/realm-default-roles.html create mode 100644 admin/resources/partials/realm-detail.html create mode 100644 admin/resources/partials/realm-events-admin.html create mode 100644 admin/resources/partials/realm-events-config.html create mode 100644 admin/resources/partials/realm-events.html create mode 100644 admin/resources/partials/realm-identity-provider-bitbucket.html create mode 100644 admin/resources/partials/realm-identity-provider-export.html create mode 100644 admin/resources/partials/realm-identity-provider-facebook-ext.html create mode 100644 admin/resources/partials/realm-identity-provider-facebook.html create mode 100644 admin/resources/partials/realm-identity-provider-github-ext.html create mode 100644 admin/resources/partials/realm-identity-provider-github.html create mode 100644 admin/resources/partials/realm-identity-provider-gitlab.html create mode 100644 admin/resources/partials/realm-identity-provider-google-ext.html create mode 100644 admin/resources/partials/realm-identity-provider-google.html create mode 100644 admin/resources/partials/realm-identity-provider-keycloak-oidc.html create mode 100644 admin/resources/partials/realm-identity-provider-linkedin-ext.html create mode 100644 admin/resources/partials/realm-identity-provider-linkedin.html create mode 100644 admin/resources/partials/realm-identity-provider-microsoft-ext.html create mode 100644 admin/resources/partials/realm-identity-provider-microsoft.html create mode 100644 admin/resources/partials/realm-identity-provider-oidc.html create mode 100644 admin/resources/partials/realm-identity-provider-openshift-v3-ext.html create mode 100644 admin/resources/partials/realm-identity-provider-openshift-v3.html create mode 100644 admin/resources/partials/realm-identity-provider-paypal-ext.html create mode 100644 admin/resources/partials/realm-identity-provider-paypal.html create mode 100644 admin/resources/partials/realm-identity-provider-saml.html create mode 100644 admin/resources/partials/realm-identity-provider-social.html create mode 100644 admin/resources/partials/realm-identity-provider-stackoverflow-ext.html create mode 100644 admin/resources/partials/realm-identity-provider-stackoverflow.html create mode 100644 admin/resources/partials/realm-identity-provider-twitter-ext.html create mode 100644 admin/resources/partials/realm-identity-provider-twitter.html create mode 100644 admin/resources/partials/realm-identity-provider.html create mode 100644 admin/resources/partials/realm-keys-generic.html create mode 100644 admin/resources/partials/realm-keys-list.html create mode 100644 admin/resources/partials/realm-keys-providers.html create mode 100644 admin/resources/partials/realm-keys.html create mode 100644 admin/resources/partials/realm-list.html create mode 100644 admin/resources/partials/realm-login-settings.html create mode 100644 admin/resources/partials/realm-role-users.html create mode 100644 admin/resources/partials/realm-smtp.html create mode 100644 admin/resources/partials/realm-theme-settings.html create mode 100644 admin/resources/partials/realm-tokens.html create mode 100644 admin/resources/partials/required-actions.html create mode 100644 admin/resources/partials/role-detail.html create mode 100644 admin/resources/partials/role-list.html create mode 100644 admin/resources/partials/role-mappings.html create mode 100644 admin/resources/partials/server-info-providers.html create mode 100644 admin/resources/partials/server-info.html create mode 100644 admin/resources/partials/session-realm.html create mode 100644 admin/resources/partials/session-revocation.html create mode 100644 admin/resources/partials/user-attributes.html create mode 100644 admin/resources/partials/user-consents.html create mode 100644 admin/resources/partials/user-credentials.html create mode 100644 admin/resources/partials/user-detail.html create mode 100644 admin/resources/partials/user-federated-identity-detail.html create mode 100644 admin/resources/partials/user-federated-identity-list.html create mode 100644 admin/resources/partials/user-federation.html create mode 100644 admin/resources/partials/user-group-membership.html create mode 100644 admin/resources/partials/user-list.html create mode 100644 admin/resources/partials/user-offline-sessions.html create mode 100644 admin/resources/partials/user-sessions.html create mode 100644 admin/resources/partials/user-storage-generic.html create mode 100644 admin/resources/partials/user-storage-kerberos.html create mode 100644 admin/resources/partials/user-storage-ldap-mapper-detail.html create mode 100644 admin/resources/partials/user-storage-ldap-mappers.html create mode 100644 admin/resources/partials/user-storage-ldap.html create mode 100644 admin/resources/partials/user-storage.html create mode 100644 admin/resources/templates/authz/kc-authz-modal.html create mode 100644 admin/resources/templates/authz/kc-tabs-resource-server.html create mode 100644 admin/resources/templates/kc-component-config.html create mode 100644 admin/resources/templates/kc-copy.html create mode 100644 admin/resources/templates/kc-dropdown.html create mode 100644 admin/resources/templates/kc-menu.html create mode 100644 admin/resources/templates/kc-modal-message.html create mode 100644 admin/resources/templates/kc-modal.html create mode 100644 admin/resources/templates/kc-paging.html create mode 100644 admin/resources/templates/kc-provider-config.html create mode 100644 admin/resources/templates/kc-switch.html create mode 100644 admin/resources/templates/kc-tabs-authentication.html create mode 100644 admin/resources/templates/kc-tabs-client-role.html create mode 100644 admin/resources/templates/kc-tabs-client-template.html create mode 100644 admin/resources/templates/kc-tabs-client.html create mode 100644 admin/resources/templates/kc-tabs-group-list.html create mode 100644 admin/resources/templates/kc-tabs-group.html create mode 100644 admin/resources/templates/kc-tabs-identity-provider.html create mode 100644 admin/resources/templates/kc-tabs-ldap.html create mode 100644 admin/resources/templates/kc-tabs-realm.html create mode 100644 admin/resources/templates/kc-tabs-role.html create mode 100644 admin/resources/templates/kc-tabs-user-storage.html create mode 100644 admin/resources/templates/kc-tabs-user.html create mode 100644 admin/resources/templates/kc-tabs-users.html create mode 100644 admin/theme.properties create mode 100644 email/html/email-test.ftl create mode 100644 email/html/email-verification.ftl create mode 100644 email/html/event-login_error.ftl create mode 100644 email/html/event-remove_totp.ftl create mode 100644 email/html/event-update_password.ftl create mode 100644 email/html/event-update_totp.ftl create mode 100644 email/html/executeActions.ftl create mode 100644 email/html/identity-provider-link.ftl create mode 100644 email/html/password-reset.ftl create mode 100644 email/messages/messages_ca.properties create mode 100644 email/messages/messages_cs.properties create mode 100644 email/messages/messages_de.properties create mode 100644 email/messages/messages_en.properties create mode 100644 email/messages/messages_es.properties create mode 100644 email/messages/messages_fr.properties create mode 100644 email/messages/messages_it.properties create mode 100644 email/messages/messages_ja.properties create mode 100644 email/messages/messages_lt.properties create mode 100644 email/messages/messages_nl.properties create mode 100644 email/messages/messages_no.properties create mode 100644 email/messages/messages_pt_BR.properties create mode 100644 email/messages/messages_ru.properties create mode 100644 email/messages/messages_sv.properties create mode 100644 email/messages/messages_zh_CN.properties create mode 100644 email/text/email-test.ftl create mode 100644 email/text/email-verification.ftl create mode 100644 email/text/event-login_error.ftl create mode 100644 email/text/event-remove_totp.ftl create mode 100644 email/text/event-update_password.ftl create mode 100644 email/text/event-update_totp.ftl create mode 100644 email/text/executeActions.ftl create mode 100644 email/text/identity-provider-link.ftl create mode 100644 email/text/password-reset.ftl create mode 100644 email/theme.properties create mode 100644 login/code.ftl create mode 100644 login/error.ftl create mode 100644 login/info.ftl create mode 100644 login/login-config-totp.ftl create mode 100644 login/login-idp-link-confirm.ftl create mode 100644 login/login-idp-link-email.ftl create mode 100644 login/login-oauth-grant.ftl create mode 100644 login/login-page-expired.ftl create mode 100644 login/login-reset-password.ftl create mode 100644 login/login-totp.ftl create mode 100644 login/login-update-password.ftl create mode 100644 login/login-update-profile.ftl create mode 100644 login/login-verify-email.ftl create mode 100644 login/login-x509-info.ftl create mode 100644 login/login.ftl create mode 100644 login/messages/messages_ca.properties create mode 100644 login/messages/messages_cs.properties create mode 100644 login/messages/messages_de.properties create mode 100644 login/messages/messages_en.properties create mode 100644 login/messages/messages_es.properties create mode 100644 login/messages/messages_fr.properties create mode 100644 login/messages/messages_it.properties create mode 100644 login/messages/messages_ja.properties create mode 100644 login/messages/messages_lt.properties create mode 100644 login/messages/messages_nl.properties create mode 100644 login/messages/messages_no.properties create mode 100644 login/messages/messages_pt_BR.properties create mode 100644 login/messages/messages_ru.properties create mode 100644 login/messages/messages_sv.properties create mode 100644 login/messages/messages_zh_CN.properties create mode 100644 login/register.ftl create mode 100644 login/resources/css/firasans_opensans.css create mode 100644 login/resources/css/lightGrey.png create mode 100644 login/resources/css/mem5YaGs126MiZpBA-UN7rgOUuhs.ttf create mode 100644 login/resources/css/mem5YaGs126MiZpBA-UNirkOUuhs.ttf create mode 100644 login/resources/css/mem8YaGs126MiZpBA-UFVZ0e.ttf create mode 100644 login/resources/css/style.css create mode 100644 login/resources/css/va9B4kDNxMZdWfMOD5VnLK3eRhf_.ttf create mode 100644 login/resources/css/va9B4kDNxMZdWfMOD5VnZKveRhf_.ttf create mode 100644 login/resources/css/va9E4kDNxMZdWfMOD5Vvl4jO.ttf create mode 100644 login/resources/css/va9f4kDNxMZdWfMOD5VvkrBiQyf4VFw.ttf create mode 100644 login/resources/fonts/fontawesome-webfont.ttf create mode 100644 login/resources/fonts/fontawesome-webfont.woff create mode 100644 login/resources/fonts/fontawesome-webfont.woff2 create mode 100644 login/resources/img/brand/logo_napis.svg create mode 100644 login/resources/img/brand/logo_napis_white.png create mode 100644 login/resources/js/fontawesome_all.js create mode 100644 login/template.ftl create mode 100644 login/terms.ftl create mode 100644 login/theme.properties diff --git a/account/account.ftl b/account/account.ftl new file mode 100644 index 0000000..759220d --- /dev/null +++ b/account/account.ftl @@ -0,0 +1,88 @@ +<#import "template.ftl" as layout> +<@layout.mainLayout active='account' bodyClass='user'; section> + +
+
+

${msg("account")}

+
+
+ * ${msg("requiredFields")} +
+
+ +
+ + + + <#if !realm.registrationEmailAsUsername> +
+
+ +
+ +
+ disabled="disabled" value="${(account.username!'')}"/> +
+
+ + +
+
+ +
+ +
+ +
+
+ +
+
+ +
+ +
+ +
+
+ +
+
+ +
+ +
+ +
+
+ + <#switch account.attributes.type!> + <#case "member"> +
+
+ +
+ +
+ +
+
+ <#break> + + + + + + \ No newline at end of file diff --git a/account/applications.ftl b/account/applications.ftl new file mode 100644 index 0000000..941994b --- /dev/null +++ b/account/applications.ftl @@ -0,0 +1,96 @@ +<#import "template.ftl" as layout> +<@layout.mainLayout active='applications' bodyClass='applications'; section> + +
+
+

${msg("applications")}

+
+
+ +
+ + + + + + + + + + + + + + + + + <#list applications.applications as application> + + + + + + + + + + + + + + + +
${msg("application")}${msg("availablePermissions")}${msg("grantedPermissions")}${msg("grantedPersonalInfo")}${msg("additionalGrants")}${msg("action")}
+ <#if application.effectiveUrl?has_content> + <#if application.client.name??>${advancedMsg(application.client.name)}<#else>${application.client.clientId} + <#if application.effectiveUrl?has_content> + + <#list application.realmRolesAvailable as role> + <#if role.description??>${advancedMsg(role.description)}<#else>${advancedMsg(role.name)} + <#if role_has_next>, + + <#list application.resourceRolesAvailable?keys as resource> + <#if application.realmRolesAvailable?has_content>, + <#list application.resourceRolesAvailable[resource] as clientRole> + <#if clientRole.roleDescription??>${advancedMsg(clientRole.roleDescription)}<#else>${advancedMsg(clientRole.roleName)} + ${msg("inResource")} <#if clientRole.clientName??>${advancedMsg(clientRole.clientName)}<#else>${clientRole.clientId} + <#if clientRole_has_next>, + + + + <#if application.client.consentRequired> + <#list application.realmRolesGranted as role> + <#if role.description??>${advancedMsg(role.description)}<#else>${advancedMsg(role.name)} + <#if role_has_next>, + + <#list application.resourceRolesGranted?keys as resource> + <#if application.realmRolesGranted?has_content>, + <#list application.resourceRolesGranted[resource] as clientRole> + <#if clientRole.roleDescription??>${advancedMsg(clientRole.roleDescription)}<#else>${advancedMsg(clientRole.roleName)} + ${msg("inResource")} <#if clientRole.clientName??>${advancedMsg(clientRole.clientName)}<#else>${clientRole.clientId} + <#if clientRole_has_next>, + + + <#else> + ${msg("fullAccess")} + + + <#if application.client.consentRequired> + <#list application.claimsGranted as claim> + ${advancedMsg(claim)}<#if claim_has_next>, + + <#else> + ${msg("fullAccess")} + + + <#list application.additionalGrants as grant> + ${advancedMsg(grant)}<#if grant_has_next>, + + + <#if (application.client.consentRequired && application.claimsGranted?has_content) || application.additionalGrants?has_content> + + +
+
+ + diff --git a/account/federatedIdentity.ftl b/account/federatedIdentity.ftl new file mode 100644 index 0000000..7bccd6b --- /dev/null +++ b/account/federatedIdentity.ftl @@ -0,0 +1,44 @@ +<#import "template.ftl" as layout> +<@layout.mainLayout active='social' bodyClass='social'; section> + +
+
+

${msg("federatedIdentitiesHtmlTitle")}

+
+
+ +
+ <#list federatedIdentity.identities as identity> +
+
+ +
+
+ +
+
+ <#if identity.connected> + <#if federatedIdentity.removeLinkPossible> +
+ + + + +
+ + <#else> +
+ + + +
+ +
+
+ +
+
+ +
+ + diff --git a/account/log.ftl b/account/log.ftl new file mode 100644 index 0000000..29046cf --- /dev/null +++ b/account/log.ftl @@ -0,0 +1,35 @@ +<#import "template.ftl" as layout> +<@layout.mainLayout active='log' bodyClass='log'; section> + +
+
+

${msg("accountLogHtmlTitle")}

+
+
+ + + + + + + + + + + + + + <#list log.events as event> + + + + + + + + + + +
${msg("date")}${msg("event")}${msg("ip")}${msg("client")}${msg("details")}
${event.date?datetime}${event.event}${event.ipAddress}${event.client!}<#list event.details as detail>${detail.key} = ${detail.value} <#if detail_has_next>,
+ + \ No newline at end of file diff --git a/account/messages/messages_ca.properties b/account/messages/messages_ca.properties new file mode 100644 index 0000000..a1b8f91 --- /dev/null +++ b/account/messages/messages_ca.properties @@ -0,0 +1,147 @@ +doSave=Desa +doCancel=Cancel\u00B7la +doLogOutAllSessions=Desconnecta de totes les sessions +doRemove=Elimina +doAdd=Afegeix +doSignOut=Desconnectar + +editAccountHtmlTitle=Edita compte +federatedIdentitiesHtmlTitle=Identitats federades +accountLogHtmlTitle=Registre del compte +changePasswordHtmlTitle=Canvia contrasenya +sessionsHtmlTitle=Sessions +accountManagementTitle=Gesti\u00F3 de Compte Keycloak +authenticatorTitle=Autenticador +applicationsHtmlTitle=Aplicacions + +authenticatorCode=Codi d''un sol \u00FAs +email=Email +firstName=Nom +givenName=Nom de pila +fullName=Nom complet +lastName=Cognoms +familyName=Cognom +password=Contrasenya +passwordConfirm=Confirma la contrasenya +passwordNew=Nova contrasenya +username=Usuari +address=Adre\u00E7a +street=Carrer +locality=Ciutat o Municipi +region=Estat, Prov\u00EDncia, o Regi\u00F3 +postal_code=Postal code +country=Pa\u00EDs +emailVerified=Email verificat +gssDelegationCredential=GSS Delegation Credential + +role_admin=Administrador +role_realm-admin=Administrador del domini +role_create-realm=Crear domini +role_view-realm=Veure domini +role_view-users=Veure usuaris +role_view-applications=Veure aplicacions +role_view-clients=Veure clients +role_view-events=Veure events +role_view-identity-providers=Veure prove\u00EFdors d''identitat +role_manage-realm=Gestionar domini +role_manage-users=Gestinar usuaris +role_manage-applications=Gestionar aplicacions +role_manage-identity-providers=Gestionar prove\u00EFdors d''identitat +role_manage-clients=Gestionar clients +role_manage-events=Gestionar events +role_view-profile=Veure perfil +role_manage-account=Gestionar compte +role_read-token=Llegir token +role_offline-access=Acc\u00E9s sense connexi\u00F3 +client_account=Compte +client_security-admin-console=Consola d''Administraci\u00F3 de Seguretat +client_realm-management=Gesti\u00F3 de domini +client_broker=Broker + + +requiredFields=Camps obligatoris +allFieldsRequired=Tots els camps obligatoris + +backToApplication=« Torna a l''aplicaci\u00F3 +backTo=Torna a {0} + +date=Data +event=Event +ip=IP +client=Client +clients=Clients +details=Detalls +started=Iniciat +lastAccess=\u00DAltim acc\u00E9s +expires=Expira +applications=Aplicacions + +account=Compte +federatedIdentity=Identitat federada +authenticator=Autenticador +sessions=Sessions +log=Registre + +application=Aplicaci\u00F3 +availablePermissions=Permisos disponibles +grantedPermissions=Permisos concedits +grantedPersonalInfo=Informaci\u00F3 personal concedida +additionalGrants=Permisos addicionals +action=Acci\u00F3 +inResource=a +fullAccess=Acc\u00E9s total +offlineToken=Codi d''autoritzaci\u00F3 offline +revoke=Revocar perm\u00EDs + +configureAuthenticators=Autenticadors configurats +mobile=M\u00F2bil +totpStep1=Instal\u00B7la
FreeOTP o Google Authenticator al teu tel\u00E8fon m\u00F2bil. Les dues aplicacions estan disponibles a Google Play i en l''App Store d''Apple. +totpStep2=Obre l''aplicaci\u00F3 i escaneja el codi o introdueix la clau. +totpStep3=Introdueix el codi \u00FAnic que et mostra l''aplicaci\u00F3 d''autenticaci\u00F3 i fes clic a Envia per finalitzar la configuraci\u00F3 + +missingUsernameMessage=Si us plau indica el teu usuari. +missingFirstNameMessage=Si us plau indica el nom. +invalidEmailMessage=Email no v\u00E0lid +missingLastNameMessage=Si us plau indica els teus cognoms. +missingEmailMessage=Si us plau indica l''email. +missingPasswordMessage=Si us plau indica la contrasenya. +notMatchPasswordMessage=Les contrasenyes no coincideixen. + +missingTotpMessage=Si us plau indica el teu codi d''autenticaci\u00F3 +invalidPasswordExistingMessage=La contrasenya actual no \u00E9s correcta. +invalidPasswordConfirmMessage=La confirmaci\u00F3 de contrasenya no coincideix. +invalidTotpMessage=El c\u00F3digo de autenticaci\u00F3n no es v\u00E1lido. + +usernameExistsMessage=L''usuari ja existeix +emailExistsMessage=L''email ja existeix + +readOnlyUserMessage=No pots actualitzar el teu usuari perqu\u00E8 el teu compte \u00E9s de nom\u00E9s lectura. +readOnlyPasswordMessage=No pots actualitzar la contrasenya perqu\u00E8 el teu compte \u00E9s de nom\u00E9s lectura. + +successTotpMessage=Aplicaci\u00F3 d''autenticaci\u00F3 m\u00F2bil configurada. +successTotpRemovedMessage=Aplicaci\u00F3 d''autenticaci\u00F3 m\u00F2bil eliminada. + +successGrantRevokedMessage=Perm\u00EDs revocat correctament + +accountUpdatedMessage=El teu compte s''ha actualitzat. +accountPasswordUpdatedMessage=La contrasenya s''ha actualitzat. + +missingIdentityProviderMessage=Prove\u00EFdor d''identitat no indicat. +invalidFederatedIdentityActionMessage=Acci\u00F3 no v\u00E0lida o no indicada. +identityProviderNotFoundMessage=No s''ha trobat un prove\u00EFdor d''identitat. +federatedIdentityLinkNotActiveMessage=Aquesta identitat ja no est\u00E0 activa +federatedIdentityRemovingLastProviderMessage=No pots eliminar l''\u00FAltima identitat federada perqu\u00E8 no tens fixada una contrasenya. +identityProviderRedirectErrorMessage=Error en la redirecci\u00F3 al prove\u00EFdor d''identitat +identityProviderRemovedMessage=Prove\u00EFdor d''identitat esborrat correctament. + +accountDisabledMessage=El compte est\u00E0 desactivada, contacteu amb l''administrador. + +accountTemporarilyDisabledMessage=El compte est\u00E0 temporalment desactivat, contacta amb l''administrador o intenta-ho de nou m\u00E9s tard. +invalidPasswordMinLengthMessage=Contrasenya incorrecta: longitud m\u00EDnima {0}. +invalidPasswordMinLowerCaseCharsMessage=Contrasenya incorrecta: ha de contenir almenys {0} lletres min\u00FAscules. +invalidPasswordMinDigitsMessage=Contrase\u00F1a incorrecta: debe contener al menos {0} caracteres num\u00E9ricos. +invalidPasswordMinUpperCaseCharsMessage=Contrasenya incorrecta: ha de contenir almenys {0} lletres maj\u00FAscules. +invalidPasswordMinSpecialCharsMessage=Contrasenya incorrecta: ha de contenir almenys {0} car\u00E0cters especials. +invalidPasswordNotUsernameMessage=Contrasenya incorrecta: no pot ser igual al nom d''usuari. +invalidPasswordRegexPatternMessage=Contrasenya incorrecta: no compleix l''expressi\u00F3 regular. +invalidPasswordHistoryMessage=Contrasenya incorrecta: no pot ser igual a cap de les \u00FAltimes {0} contrasenyes. \ No newline at end of file diff --git a/account/messages/messages_cs.properties b/account/messages/messages_cs.properties new file mode 100644 index 0000000..6887956 --- /dev/null +++ b/account/messages/messages_cs.properties @@ -0,0 +1,171 @@ +# encoding: UTF-8 +doSave=Uložit +doCancel=Zrušit +doLogOutAllSessions=Odhlásit ze všech zařízení +doRemove=Odebrat +doAdd=Přidat +doSignOut=Odhlásit se + +editAccountHtmlTitle=Edit Account +federatedIdentitiesHtmlTitle=Propojené identity +accountLogHtmlTitle=Account Log +changePasswordHtmlTitle=Změna hesla +sessionsHtmlTitle=Zařízení +accountManagementTitle=Účet u Pirátské strany +authenticatorTitle=Dvoufaktorové ověření + +authenticatorCode=Jednorázový kód +email=E-mail +firstName=Jméno +givenName=Křestní jméno +fullName=Celé jméno +lastName=Příjmení +familyName=Rodinné jméno +password=Heslo +passwordConfirm=Potvrzení hesla +passwordNew=Nové heslo +username=Uživatelské jméno +address=Adresa +street=Ulice +locality=Město +region=Stát +postal_code=PSČ +country=Země +emailVerified=E-mail ověřený +gssDelegationCredential=GSS Delegation Credential + +role_admin=Admin +role_realm-admin=Realm Admin +role_create-realm=Create realm +role_view-realm=View realm +role_view-users=View users +role_view-applications=View applications +role_view-clients=View clients +role_view-events=View events +role_view-identity-providers=View identity providers +role_manage-realm=Manage realm +role_manage-users=Manage users +role_manage-applications=Manage applications +role_manage-identity-providers=Manage identity providers +role_manage-clients=Manage clients +role_manage-events=Manage events +role_view-profile=Zobrazit profil +role_manage-account=Spravovat účet +role_manage-account-links=Spravovat odkazy účtu +role_read-token=Číst token +role_offline-access=Offline přístup +role_uma_authorization=Získávat oprávnění +client_account=Účet +client_security-admin-console=Security Admin Console +client_admin-cli=Admin CLI +client_realm-management=Realm Management +client_broker=Broker + + +requiredFields=Povinná pole +allFieldsRequired=Všechna pole jsou povinná + +backToApplication=« Back to application +backTo=Back to {0} + +date=Datum +event=Událost +ip=IP adresa +client=Klient +clients=Klienti +details=Details +started=První přístup +lastAccess=Poslední přístup +expires=Vyprší +applications=Aplikace + +account=Účet +federatedIdentity=Propojené identity +authenticator=Dvoufaktorové ověření +sessions=Zařízení +log=Log + +application=Aplikace +availablePermissions=Dostupná oprávnění +grantedPermissions=Udělená oprávnění +grantedPersonalInfo=Udělené osobní informace +additionalGrants=Additional Grants +action=Action +inResource=in +fullAccess=Plný přístup +offlineToken=Offline token +revoke=Zrušit povolení + +configureAuthenticators=Nastavené generátory klíčů +mobile=Telefon +totpStep1=Nainstalujte si do telefonu FreeOTP nebo Google Authenticator. Obě aplikace jsou dostupné v Google Play a Apple App Store. +totpStep2=Otevřete aplikaci a naskenujte čárový kód nebo zadejte klíč. +totpStep3=Zadejte jednorázový kód poskytnutý aplikací a klikněte na Uložit. + +missingUsernameMessage=Please specify username. +missingFirstNameMessage=Please specify first name. +invalidEmailMessage=Invalid email address. +missingLastNameMessage=Please specify last name. +missingEmailMessage=Please specify email. +missingPasswordMessage=Please specify password. +notMatchPasswordMessage=Passwords don''t match. + +missingTotpMessage=Please specify authenticator code. +invalidPasswordExistingMessage=Invalid existing password. +invalidPasswordConfirmMessage=Password confirmation doesn''t match. +invalidTotpMessage=Invalid authenticator code. + +usernameExistsMessage=Username already exists. +emailExistsMessage=Email already exists. + +readOnlyUserMessage=You can''t update your account as it is read only. +readOnlyUsernameMessage=You can''t update your username as it is read only. +readOnlyPasswordMessage=You can''t update your password as your account is read only. + +successTotpMessage=Mobile authenticator configured. +successTotpRemovedMessage=Mobile authenticator removed. + +successGrantRevokedMessage=Grant revoked successfully. + +accountUpdatedMessage=Your account has been updated. +accountPasswordUpdatedMessage=Your password has been updated. + +missingIdentityProviderMessage=Identity provider not specified. +invalidFederatedIdentityActionMessage=Invalid or missing action. +identityProviderNotFoundMessage=Specified identity provider not found. +federatedIdentityLinkNotActiveMessage=This identity is not active anymore. +federatedIdentityRemovingLastProviderMessage=You can''t remove last federated identity as you don''t have password. +identityProviderRedirectErrorMessage=Failed to redirect to identity provider. +identityProviderRemovedMessage=Identity provider removed successfully. +identityProviderAlreadyLinkedMessage=Federated identity returned by {0} is already linked to another user. +staleCodeAccountMessage=The page expired. Please try one more time. +consentDenied=Consent denied. + +accountDisabledMessage=Account is disabled, contact admin. + +accountTemporarilyDisabledMessage=Account is temporarily disabled, contact admin or try again later. +invalidPasswordMinLengthMessage=Invalid password: minimum length {0}. +invalidPasswordMinLowerCaseCharsMessage=Invalid password: must contain at least {0} lower case characters. +invalidPasswordMinDigitsMessage=Invalid password: must contain at least {0} numerical digits. +invalidPasswordMinUpperCaseCharsMessage=Invalid password: must contain at least {0} upper case characters. +invalidPasswordMinSpecialCharsMessage=Invalid password: must contain at least {0} special characters. +invalidPasswordNotUsernameMessage=Invalid password: must not be equal to the username. +invalidPasswordRegexPatternMessage=Invalid password: fails to match regex pattern(s). +invalidPasswordHistoryMessage=Invalid password: must not be equal to any of last {0} passwords. +invalidPasswordBlacklistedMessage=Invalid password: password is blacklisted. +invalidPasswordGenericMessage=Invalid password: new password doesn''t match password policies. + +locale_ca=Catal\u00E0 +locale_de=Deutsch +locale_en=English +locale_es=Espa\u00F1ol +locale_fr=Fran\u00e7ais +locale_it=Italian +locale_ja=\u65E5\u672C\u8A9E +locale_nl=Nederlands +locale_no=Norsk +locale_lt=Lietuvi\u0173 +locale_pt-BR=Portugu\u00EAs (Brasil) +locale_ru=\u0420\u0443\u0441\u0441\u043A\u0438\u0439 +locale_sv=Svenska +locale_zh-CN=\u4e2d\u6587\u7b80\u4f53 diff --git a/account/messages/messages_de.properties b/account/messages/messages_de.properties new file mode 100644 index 0000000..3391323 --- /dev/null +++ b/account/messages/messages_de.properties @@ -0,0 +1,147 @@ +doLogOutAllSessions=Alle Sitzungen abmelden +doSave=Speichern +doCancel=Abbrechen +doRemove=Entfernen +doAdd=Hinzuf\u00FCgen +doSignOut=Abmelden + +editAccountHtmlTitle=Benutzerkonto bearbeiten +federatedIdentitiesHtmlTitle=F\u00F6derierte Identit\u00E4ten +accountLogHtmlTitle=Benutzerkonto Log +changePasswordHtmlTitle=Passwort \u00C4ndern +sessionsHtmlTitle=Sitzungen +accountManagementTitle=Keycloak Benutzerkontoverwaltung +authenticatorTitle=Authenticator +applicationsHtmlTitle=Applikationen + +authenticatorCode=One-time Code +email=E-Mail +firstName=Vorname +givenName=Vorname +fullName=Voller Name +lastName=Nachname +familyName=Nachname +password=Passwort +passwordConfirm=Passwortbest\u00E4tigung +passwordNew=Neues Passwort +username=Benutzernamen +address=Adresse +street=Stra\u00DFe +region=Staat, Provinz, Region +postal_code=PLZ +locality=Stadt oder Ortschaft +country=Land +emailVerified=E-Mail verifiziert +gssDelegationCredential=GSS delegierte Berechtigung + +role_admin=Admin +role_realm-admin=Realm Admin +role_create-realm=Realm erstellen +role_view-realm=Realm ansehen +role_view-users=Benutzer ansehen +role_view-applications=Applikationen ansehen +role_view-clients=Clients ansehen +role_view-events=Events ansehen +role_view-identity-providers=Identity Provider ansehen +role_manage-realm=Realm verwalten +role_manage-users=Benutzer verwalten +role_manage-applications=Applikationen verwalten +role_manage-identity-providers=Identity Provider verwalten +role_manage-clients=Clients verwalten +role_manage-events=Events verwalten +role_view-profile=Profile ansehen +role_manage-account=Profile verwalten +role_read-token=Token lesen +role_offline-access=Offline-Zugriff +client_account=Konto +client_realm-management=Realm-Management +client_broker=Broker + + +requiredFields=Erforderliche Felder +allFieldsRequired=Alle Felder sind erforderlich + +backToApplication=« Zur\u00FCck zur Applikation +backTo=Zur\u00FCck zu {0} + +date=Datum +event=Ereignis +ip=IP +client=Client +clients=Clients +details=Details +started=Startdatum +lastAccess=Letzter Zugriff +expires=Ablaufdatum +applications=Applikationen + +account=Benutzerkonto +federatedIdentity=F\u00F6derierte Identit\u00E4t +authenticator=Authenticator +sessions=Sitzungen +log=Log + +application=Applikation +availablePermissions=verf\u00FCgbare Berechtigungen +grantedPermissions=gew\u00E4hrte Berechtigungen +grantedPersonalInfo=gew\u00E4hrte pers\u00F6nliche Informationen +additionalGrants=zus\u00E4tzliche Berechtigungen +action=Aktion +inResource=in +fullAccess=Vollzugriff +offlineToken=Offline-Token +revoke=Berechtigung widerrufen + +configureAuthenticators=Authenticatoren konfigurieren +mobile=Mobile +totpStep1=Installieren Sie FreeOTP oder Google Authenticator auf Ihrem Smartphone. +totpStep2=\u00D6ffnen Sie die Applikation und scannen Sie den Barcode oder geben Sie den Code ein. +totpStep3=Geben Sie den von der Applikation generierten One-time Code ein und klicken Sie auf Speichern. + +missingUsernameMessage=Bitte geben Sie einen Benutzernamen ein. +missingFirstNameMessage=Bitte geben Sie einen Vornamen ein. +missingEmailMessage=Bitte geben Sie eine E-Mail Adresse ein. +missingLastNameMessage=Bitte geben Sie einen Nachnamen ein. +missingPasswordMessage=Bitte geben Sie ein Passwort ein. +notMatchPasswordMessage=Passw\u00F6rter sind nicht identisch. + +missingTotpMessage=Bitte geben Sie den One-time Code ein. +invalidPasswordExistingMessage=Das aktuelle Passwort is ung\u00FCltig. +invalidPasswordConfirmMessage=Die Passwortbest\u00E4tigung ist nicht identisch. +invalidTotpMessage=Ung\u00FCltiger One-time Code. +invalidEmailMessage=Ung\u00FCltige E-Mail Adresse. +invalidPasswordBlacklistedMessage=Passwort ist nicht erlaubt. + +usernameExistsMessage=Der Benutzername existiert bereits. +emailExistsMessage=Die E-Mail-Adresse existiert bereits. + +readOnlyUserMessage=Sie k\u00F6nnen dieses Benutzerkonto nicht \u00E4ndern, da es schreibgesch\u00FCtzt ist. +readOnlyPasswordMessage=Sie k\u00F6nnen dieses Passwort nicht \u00E4ndern, da es schreibgesch\u00FCtzt ist. + +successTotpMessage=Mobile Authentifizierung eingerichtet. +successTotpRemovedMessage=Mobile Authentifizierung entfernt. + +successGrantRevokedMessage=Berechtigung erfolgreich widerrufen. + +accountUpdatedMessage=Ihr Benutzerkonto wurde aktualisiert. +accountPasswordUpdatedMessage=Ihr Passwort wurde aktualisiert. + +missingIdentityProviderMessage=Identity Provider nicht angegeben. +invalidFederatedIdentityActionMessage=Ung\u00FCltige oder fehlende Aktion. +identityProviderNotFoundMessage=Angegebener Identity Provider nicht gefunden. +federatedIdentityLinkNotActiveMessage=Diese Identit\u00E4t ist nicht mehr aktiv. +federatedIdentityRemovingLastProviderMessage=Sie k\u00F6nnen den letzten Eintrag nicht entfernen, da Sie kein Passwort haben. +identityProviderRedirectErrorMessage=Fehler bei der Weiterleitung zum Identity Provider. +identityProviderRemovedMessage=Identity Provider erfolgreich entfernt. + +accountDisabledMessage=Benutzerkonto ist gesperrt, bitte kontaktieren Sie den Admin. + +accountTemporarilyDisabledMessage=Benutzerkonto ist tempor\u00E4r gesperrt, bitte kontaktieren Sie den Admin oder versuchen Sie es sp\u00E4ter noch einmal. +invalidPasswordMinLengthMessage=Ung\u00FCltiges Passwort\: Minimall\u00E4nge {0}. +invalidPasswordMinDigitsMessage=Ung\u00FCltiges Passwort\: muss mindestens {0} Zahl(en) beinhalten. +invalidPasswordMinLowerCaseCharsMessage=Ung\u00FCltiges Passwort\: muss mindestens {0} Kleinbuchstaben beinhalten. +invalidPasswordMinUpperCaseCharsMessage=Ung\u00FCltiges Passwort\: muss mindestens {0} Grossbuchstaben beinhalten. +invalidPasswordMinSpecialCharsMessage=Ung\u00FCltiges Passwort\: muss mindestens {0} Spezialzeichen beinhalten. +invalidPasswordNotUsernameMessage=Ung\u00FCltiges Passwort\: darf nicht gleich sein wie Benutzername. +invalidPasswordRegexPatternMessage=Ung\u00FCltiges Passwort\: nicht Regex-Muster (n) entsprechen. +invalidPasswordHistoryMessage=Ung\u00FCltiges Passwort: darf nicht einem der letzten {0} Passw\u00F6rter entsprechen. \ No newline at end of file diff --git a/account/messages/messages_en.properties b/account/messages/messages_en.properties new file mode 100644 index 0000000..40b3ab6 --- /dev/null +++ b/account/messages/messages_en.properties @@ -0,0 +1,185 @@ +# encoding: UTF-8 +locale_ca=Catal\u00E0 +locale_cs=Česky +locale_de=Deutsch +locale_en=English +locale_es=Espa\u00F1ol +locale_fr=Fran\u00e7ais +locale_it=Italian +locale_ja=\u65E5\u672C\u8A9E +locale_nl=Nederlands +locale_no=Norsk +locale_lt=Lietuvi\u0173 +locale_pt-BR=Portugu\u00EAs (Brasil) +locale_ru=\u0420\u0443\u0441\u0441\u043A\u0438\u0439 +locale_sv=Svenska +locale_zh-CN=\u4e2d\u6587\u7b80\u4f53 +doSave=Save +doCancel=Cancel +doLogOutAllSessions=Log out all sessions +doRemove=Remove +doAdd=Add +doSignOut=Sign Out + +editAccountHtmlTitle=Edit Account +federatedIdentitiesHtmlTitle=Federated Identities +accountLogHtmlTitle=Account Log +changePasswordHtmlTitle=Change Password +sessionsHtmlTitle=Sessions +accountManagementTitle=Keycloak Account Management +authenticatorTitle=Authenticator +applicationsHtmlTitle=Applications + +authenticatorCode=One-time code +email=Email +firstName=First name +givenName=Given name +fullName=Full name +lastName=Last name +familyName=Family name +password=Password +passwordConfirm=Confirmation +passwordNew=New Password +username=Username +address=Address +street=Street +locality=City or Locality +region=State, Province, or Region +postal_code=Zip or Postal code +country=Country +emailVerified=Email verified +gssDelegationCredential=GSS Delegation Credential + +role_admin=Admin +role_realm-admin=Realm Admin +role_create-realm=Create realm +role_view-realm=View realm +role_view-users=View users +role_view-applications=View applications +role_view-clients=View clients +role_view-events=View events +role_view-identity-providers=View identity providers +role_manage-realm=Manage realm +role_manage-users=Manage users +role_manage-applications=Manage applications +role_manage-identity-providers=Manage identity providers +role_manage-clients=Manage clients +role_manage-events=Manage events +role_view-profile=View profile +role_manage-account=Manage account +role_manage-account-links=Manage account links +role_read-token=Read token +role_offline-access=Offline access +role_uma_authorization=Obtain permissions +client_account=Account +client_security-admin-console=Security Admin Console +client_admin-cli=Admin CLI +client_realm-management=Realm Management +client_broker=Broker + + +requiredFields=Required fields +allFieldsRequired=All fields required + +backToApplication=« Back to application +backTo=Back to {0} + +date=Date +event=Event +ip=IP +client=Client +clients=Clients +details=Details +started=Started +lastAccess=Last Access +expires=Expires +applications=Applications + +account=Account +federatedIdentity=Federated Identity +authenticator=Authenticator +sessions=Sessions +log=Log + +application=Application +availablePermissions=Available Permissions +grantedPermissions=Granted Permissions +grantedPersonalInfo=Granted Personal Info +additionalGrants=Additional Grants +action=Action +inResource=in +fullAccess=Full Access +offlineToken=Offline Token +revoke=Revoke Grant + +configureAuthenticators=Configured Authenticators +mobile=Mobile +totpStep1=Install one of the following applications on your mobile +totpStep2=Open the application and scan the barcode +totpStep3=Enter the one-time code provided by the application and click Save to finish the setup. + +totpManualStep2=Open the application and enter the key +totpManualStep3=Use the following configuration values if the application allows setting them +totpUnableToScan=Unable to scan? +totpScanBarcode=Scan barcode? + +totp.totp=Time-based +totp.hotp=Counter-based + +totpType=Type +totpAlgorithm=Algorithm +totpDigits=Digits +totpInterval=Interval + +missingUsernameMessage=Please specify username. +missingFirstNameMessage=Please specify first name. +invalidEmailMessage=Invalid email address. +missingLastNameMessage=Please specify last name. +missingEmailMessage=Please specify email. +missingPasswordMessage=Please specify password. +notMatchPasswordMessage=Passwords don''t match. + +missingTotpMessage=Please specify authenticator code. +invalidPasswordExistingMessage=Invalid existing password. +invalidPasswordConfirmMessage=Password confirmation doesn''t match. +invalidTotpMessage=Invalid authenticator code. + +usernameExistsMessage=Username already exists. +emailExistsMessage=Email already exists. + +readOnlyUserMessage=You can''t update your account as it is read only. +readOnlyUsernameMessage=You can''t update your username as it is read only. +readOnlyPasswordMessage=You can''t update your password as your account is read only. + +successTotpMessage=Mobile authenticator configured. +successTotpRemovedMessage=Mobile authenticator removed. + +successGrantRevokedMessage=Grant revoked successfully. + +accountUpdatedMessage=Your account has been updated. +accountPasswordUpdatedMessage=Your password has been updated. + +missingIdentityProviderMessage=Identity provider not specified. +invalidFederatedIdentityActionMessage=Invalid or missing action. +identityProviderNotFoundMessage=Specified identity provider not found. +federatedIdentityLinkNotActiveMessage=This identity is not active anymore. +federatedIdentityRemovingLastProviderMessage=You can''t remove last federated identity as you don''t have password. +identityProviderRedirectErrorMessage=Failed to redirect to identity provider. +identityProviderRemovedMessage=Identity provider removed successfully. +identityProviderAlreadyLinkedMessage=Federated identity returned by {0} is already linked to another user. +staleCodeAccountMessage=The page expired. Please try one more time. +consentDenied=Consent denied. + +accountDisabledMessage=Account is disabled, contact admin. + +accountTemporarilyDisabledMessage=Account is temporarily disabled, contact admin or try again later. +invalidPasswordMinLengthMessage=Invalid password: minimum length {0}. +invalidPasswordMinLowerCaseCharsMessage=Invalid password: must contain at least {0} lower case characters. +invalidPasswordMinDigitsMessage=Invalid password: must contain at least {0} numerical digits. +invalidPasswordMinUpperCaseCharsMessage=Invalid password: must contain at least {0} upper case characters. +invalidPasswordMinSpecialCharsMessage=Invalid password: must contain at least {0} special characters. +invalidPasswordNotUsernameMessage=Invalid password: must not be equal to the username. +invalidPasswordRegexPatternMessage=Invalid password: fails to match regex pattern(s). +invalidPasswordHistoryMessage=Invalid password: must not be equal to any of last {0} passwords. +invalidPasswordBlacklistedMessage=Invalid password: password is blacklisted. +invalidPasswordGenericMessage=Invalid password: new password doesn''t match password policies. diff --git a/account/messages/messages_es.properties b/account/messages/messages_es.properties new file mode 100644 index 0000000..fd36e59 --- /dev/null +++ b/account/messages/messages_es.properties @@ -0,0 +1,147 @@ +doSave=Guardar +doCancel=Cancelar +doLogOutAllSessions=Desconectar de todas las sesiones +doRemove=Eliminar +doAdd=A\u00F1adir +doSignOut=Desconectar + +editAccountHtmlTitle=Editar cuenta +federatedIdentitiesHtmlTitle=Identidades federadas +accountLogHtmlTitle=Registro de la cuenta +changePasswordHtmlTitle=Cambiar contrase\u00F1a +sessionsHtmlTitle=Sesiones +accountManagementTitle=Gesti\u00F3n de Cuenta Keycloak +authenticatorTitle=Autenticador +applicationsHtmlTitle=Aplicaciones + +authenticatorCode=C\u00F3digo de un solo uso +email=Email +firstName=Nombre +givenName=Nombre de pila +fullName=Nombre completo +lastName=Apellidos +familyName=Apellido +password=Contrase\u00F1a +passwordConfirm=Confirma la contrase\u00F1a +passwordNew=Nueva contrase\u00F1a +username=Usuario +address=Direcci\u00F3n +street=Calle +locality=Ciudad o Municipio +region=Estado, Provincia, o Regi\u00F3n +postal_code=C\u00F3digo Postal +country=Pa\u00EDs +emailVerified=Email verificado +gssDelegationCredential=GSS Delegation Credential + +role_admin=Administrador +role_realm-admin=Administrador del dominio +role_create-realm=Crear dominio +role_view-realm=Ver dominio +role_view-users=Ver usuarios +role_view-applications=Ver aplicaciones +role_view-clients=Ver clientes +role_view-events=Ver eventos +role_view-identity-providers=Ver proveedores de identidad +role_manage-realm=Gestionar dominio +role_manage-users=Gestionar usuarios +role_manage-applications=Gestionar aplicaciones +role_manage-identity-providers=Gestionar proveedores de identidad +role_manage-clients=Gestionar clientes +role_manage-events=Gestionar eventos +role_view-profile=Ver perfil +role_manage-account=Gestionar cuenta +role_read-token=Leer token +role_offline-access=Acceso sin conexi\u00F3n +client_account=Cuenta +client_security-admin-console=Consola de Administraci\u00F3n de Seguridad +client_realm-management=Gesti\u00F3n de dominio +client_broker=Broker + + +requiredFields=Campos obligatorios +allFieldsRequired=Todos los campos obligatorios + +backToApplication=« Volver a la aplicaci\u00F3n +backTo=Volver a {0} + +date=Fecha +event=Evento +ip=IP +client=Cliente +clients=Clientes +details=Detalles +started=Iniciado +lastAccess=\u00DAltimo acceso +expires=Expira +applications=Aplicaciones + +account=Cuenta +federatedIdentity=Identidad federada +authenticator=Autenticador +sessions=Sesiones +log=Regisro + +application=Aplicaci\u00F3n +availablePermissions=Permisos disponibles +grantedPermissions=Permisos concedidos +grantedPersonalInfo=Informaci\u00F3n personal concedida +additionalGrants=Permisos adicionales +action=Acci\u00F3n +inResource=en +fullAccess=Acceso total +offlineToken=C\u00F3digo de autorizaci\u00F3n offline +revoke=Revocar permiso + +configureAuthenticators=Autenticadores configurados +mobile=M\u00F3vil +totpStep1=Instala FreeOTP o Google Authenticator en tu tel\u00E9fono m\u00F3vil. Ambas aplicaciones est\u00E1n disponibles en Google Play y en la App Store de Apple. +totpStep2=Abre la aplicaci\u00F3n y escanea el c\u00F3digo o introduce la clave. +totpStep3=Introduce el c\u00F3digo \u00FAnico que te muestra la aplicaci\u00F3n de autenticaci\u00F3n y haz clic en Enviar para finalizar la configuraci\u00F3n + +missingUsernameMessage=Por favor indica tu usuario. +missingFirstNameMessage=Por favor indica el nombre. +invalidEmailMessage=Email no v\u00E1lido +missingLastNameMessage=Por favor indica tus apellidos. +missingEmailMessage=Por favor indica el email. +missingPasswordMessage=Por favor indica tu contrase\u00F1a. +notMatchPasswordMessage=Las contrase\u00F1as no coinciden. + +missingTotpMessage=Por favor indica tu c\u00F3digo de autenticaci\u00F3n +invalidPasswordExistingMessage=La contrase\u00F1a actual no es correcta. +invalidPasswordConfirmMessage=La confirmaci\u00F3n de contrase\u00F1a no coincide. +invalidTotpMessage=El c\u00F3digo de autenticaci\u00F3n no es v\u00E1lido. + +usernameExistsMessage=El usuario ya existe +emailExistsMessage=El email ya existe + +readOnlyUserMessage=No puedes actualizar tu usuario porque tu cuenta es de solo lectura. +readOnlyPasswordMessage=No puedes actualizar tu contrase\u00F1a porque tu cuenta es de solo lectura. + +successTotpMessage=Aplicaci\u00F3n de autenticaci\u00F3n m\u00F3vil configurada. +successTotpRemovedMessage=Aplicaci\u00F3n de autenticaci\u00F3n m\u00F3vil eliminada. + +successGrantRevokedMessage=Permiso revocado correctamente + +accountUpdatedMessage=Tu cuenta se ha actualizado. +accountPasswordUpdatedMessage=Tu contrase\u00F1a se ha actualizado. + +missingIdentityProviderMessage=Proveedor de identidad no indicado. +invalidFederatedIdentityActionMessage=Acci\u00F3n no v\u00E1lida o no indicada. +identityProviderNotFoundMessage=No se encontr\u00F3 un proveedor de identidad. +federatedIdentityLinkNotActiveMessage=Esta identidad ya no est\u00E1 activa +federatedIdentityRemovingLastProviderMessage=No puedes eliminar la \u00FAltima identidad federada porque no tienes fijada una contrase\u00F1a. +identityProviderRedirectErrorMessage=Error en la redirecci\u00F3n al proveedor de identidad +identityProviderRemovedMessage=Proveedor de identidad borrado correctamente. + +accountDisabledMessage=La cuenta est\u00E1 desactivada, contacta con el administrador. + +accountTemporarilyDisabledMessage=La cuenta est\u00E1 temporalmente desactivada, contacta con el administrador o int\u00E9ntalo de nuevo m\u00E1s tarde. +invalidPasswordMinLengthMessage=Contrase\u00F1a incorrecta: longitud m\u00EDnima {0}. +invalidPasswordMinLowerCaseCharsMessage=Contrase\u00F1a incorrecta: debe contener al menos {0} letras min\u00FAsculas. +invalidPasswordMinDigitsMessage=Contrase\u00F1a incorrecta: debe contener al menos {0} caracteres num\u00E9ricos. +invalidPasswordMinUpperCaseCharsMessage=Contrase\u00F1a incorrecta: debe contener al menos {0} letras may\u00FAsculas. +invalidPasswordMinSpecialCharsMessage=Contrase\u00F1a incorrecta: debe contener al menos {0} caracteres especiales. +invalidPasswordNotUsernameMessage=Contrase\u00F1a incorrecta: no puede ser igual al nombre de usuario. +invalidPasswordRegexPatternMessage=Contrase\u00F1a incorrecta: no cumple la expresi\u00F3n regular. +invalidPasswordHistoryMessage=Contrase\u00F1a incorrecta: no puede ser igual a ninguna de las \u00FAltimas {0} contrase\u00F1as. \ No newline at end of file diff --git a/account/messages/messages_fr.properties b/account/messages/messages_fr.properties new file mode 100644 index 0000000..3cdc016 --- /dev/null +++ b/account/messages/messages_fr.properties @@ -0,0 +1,152 @@ +# TIPS to encode UTF-8 to ISO +# native2ascii -encoding ISO8859_1 srcFile > dstFile + +doSave=Sauvegarder +doCancel=Annuler +doLogOutAllSessions=D\u00e9connexion de toutes les sessions +doRemove=Supprimer +doAdd=Ajouter +doSignOut=D\u00e9connexion + +editAccountHtmlTitle=\u00c9dition du compte +federatedIdentitiesHtmlTitle=Identit\u00e9s f\u00e9d\u00e9r\u00e9es +accountLogHtmlTitle=Acc\u00e8s au compte +changePasswordHtmlTitle=Changer de mot de passe +sessionsHtmlTitle=Sessions +accountManagementTitle=Gestion de Compte Keycloak +authenticatorTitle=Authentification +applicationsHtmlTitle=Applications + +authenticatorCode=Mot de passe unique +email=Courriel +firstName=Pr\u00e9nom +givenName=Pr\u00e9nom +fullName=Nom Complet +lastName=Nom +familyName=Nom de Famille +password=Mot de passe +passwordConfirm=Confirmation +passwordNew=Nouveau mot de passe +username=Compte +address=Adresse +street=Rue +locality=Ville ou Localit\u00e9 +region=\u00c9tat, Province ou R\u00e9gion +postal_code=Code Postal +country=Pays +emailVerified=Courriel v\u00e9rifi\u00e9 +gssDelegationCredential=Accr\u00e9ditation de d\u00e9l\u00e9gation GSS + +role_admin=Administrateur +role_realm-admin=Administrateur du domaine +role_create-realm=Cr\u00e9er un domaine +role_view-realm=Voir un domaine +role_view-users=Voir les utilisateurs +role_view-applications=Voir les applications +role_view-clients=Voir les clients +role_view-events=Voir les \u00e9v\u00e9nements +role_view-identity-providers=Voir les fournisseurs d''identit\u00e9s +role_manage-realm=G\u00e9rer le domaine +role_manage-users=G\u00e9rer les utilisateurs +role_manage-applications=G\u00e9rer les applications +role_manage-identity-providers=G\u00e9rer les fournisseurs d''identit\u00e9s +role_manage-clients=G\u00e9rer les clients +role_manage-events=G\u00e9rer les \u00e9v\u00e9nements +role_view-profile=Voir le profil +role_manage-account=G\u00e9rer le compte +role_read-token=Lire le jeton d''authentification +role_offline-access=Acc\u00e8s hors-ligne +client_account=Compte +client_security-admin-console=Console d''administration de la s\u00e9curit\u00e9 +client_admin-cli=Admin CLI +client_realm-management=Gestion du domaine +client_broker=Broker + + +requiredFields=Champs obligatoires +allFieldsRequired=Tous les champs sont obligatoires + +backToApplication=« Revenir \u00e0 l''application +backTo=Revenir \u00e0 {0} + +date=Date +event=Ev\u00e9nement +ip=IP +client=Client +clients=Clients +details=D\u00e9tails +started=D\u00e9but +lastAccess=Dernier acc\u00e8s +expires=Expiration +applications=Applications + +account=Compte +federatedIdentity=Identit\u00e9 f\u00e9d\u00e9r\u00e9e +authenticator=Authentification +sessions=Sessions +log=Connexion + +application=Application +availablePermissions=Permissions disponibles +grantedPermissions=Permissions accord\u00e9es +grantedPersonalInfo=Informations personnelles accord\u00e9es +additionalGrants=Droits additionnels +action=Action +inResource=dans +fullAccess=Acc\u00e8s complet +offlineToken=Jeton d''authentification hors-ligne +revoke=R\u00e9voquer un droit + +configureAuthenticators=Authentifications configur\u00e9es. +mobile=T\u00e9l\u00e9phone mobile +totpStep1=Installez FreeOTP ou bien Google Authenticator sur votre mobile. Ces deux applications sont disponibles sur Google Play et Apple App Store. +totpStep2=Ouvrez l''application et scannez le code-barres ou entrez la clef. +totpStep3=Entrez le code \u00e0 usage unique fourni par l''application et cliquez sur Sauvegarder pour terminer. + +missingUsernameMessage=Veuillez entrer votre nom d''utilisateur. +missingFirstNameMessage=Veuillez entrer votre pr\u00e9nom. +invalidEmailMessage=Courriel invalide. +missingLastNameMessage=Veuillez entrer votre nom. +missingEmailMessage=Veuillez entrer votre courriel. +missingPasswordMessage=Veuillez entrer votre mot de passe. +notMatchPasswordMessage=Les mots de passe ne sont pas identiques + +missingTotpMessage=Veuillez entrer le code d''authentification. +invalidPasswordExistingMessage=Mot de passe existant invalide. +invalidPasswordConfirmMessage=Le mot de passe de confirmation ne correspond pas. +invalidTotpMessage=Le code d''authentification est invalide. + +usernameExistsMessage=Le nom d''utilisateur existe d\u00e9j\u00e0. +emailExistsMessage=Le courriel existe d\u00e9j\u00e0. + +readOnlyUserMessage=Vous ne pouvez pas mettre \u00e0 jour votre compte car il est en lecture seule. +readOnlyPasswordMessage=Vous ne pouvez pas mettre \u00e0 jour votre mot de passe car votre compte est en lecture seule. + +successTotpMessage=L''authentification via t\u00e9l\u00e9phone mobile est configur\u00e9e. +successTotpRemovedMessage=L''authentification via t\u00e9l\u00e9phone mobile est supprim\u00e9e. + +successGrantRevokedMessage=Droit r\u00e9voqu\u00e9 avec succ\u00e8s. + +accountUpdatedMessage=Votre compte a \u00e9t\u00e9 mis \u00e0 jour. +accountPasswordUpdatedMessage=Votre mot de passe a \u00e9t\u00e9 mis \u00e0 jour. + +missingIdentityProviderMessage=Le fournisseur d''identit\u00e9 n''est pas sp\u00e9cifi\u00e9. +invalidFederatedIdentityActionMessage=Action manquante ou invalide. +identityProviderNotFoundMessage=Le fournisseur d''identit\u00e9 sp\u00e9cifi\u00e9 n''est pas trouv\u00e9. +federatedIdentityLinkNotActiveMessage=Cette identit\u00e9 n''est plus active dor\u00e9navant. +federatedIdentityRemovingLastProviderMessage=Vous ne pouvez pas supprimer votre derni\u00e8re f\u00e9d\u00e9ration d''identit\u00e9 sans avoir de mot de passe sp\u00e9cifi\u00e9. +identityProviderRedirectErrorMessage=Erreur de redirection vers le fournisseur d''identit\u00e9. +identityProviderRemovedMessage=Le fournisseur d''identit\u00e9 a \u00e9t\u00e9 supprim\u00e9 correctement. +identityProviderAlreadyLinkedMessage=Le fournisseur d''identit\u00e9 retourn\u00e9 par {0} est d\u00e9j\u00e0 li\u00e9 \u00e0 un autre utilisateur. + +accountDisabledMessage=Ce compte est d\u00e9sactiv\u00e9, veuillez contacter votre administrateur. + +accountTemporarilyDisabledMessage=Ce compte est temporairement d\u00e9sactiv\u00e9, veuillez contacter votre administrateur ou r\u00e9essayez plus tard. +invalidPasswordMinLengthMessage=Mot de passe invalide: longueur minimale {0}. +invalidPasswordMinLowerCaseCharsMessage=Mot de passe invalide: doit contenir au moins {0} lettre(s) en minuscule. +invalidPasswordMinDigitsMessage=Mot de passe invalide: doit contenir au moins {0} chiffre(s). +invalidPasswordMinUpperCaseCharsMessage=Mot de passe invalide: doit contenir au moins {0} lettre(s) en majuscule. +invalidPasswordMinSpecialCharsMessage=Mot de passe invalide: doit contenir au moins {0} caract\u00e8re(s) sp\u00e9ciaux. +invalidPasswordNotUsernameMessage=Mot de passe invalide: ne doit pas \u00eatre identique au nom d''utilisateur. +invalidPasswordRegexPatternMessage=Mot de passe invalide: ne valide pas l''expression rationnelle. +invalidPasswordHistoryMessage=Mot de passe invalide: ne doit pas \u00eatre \u00e9gal aux {0} derniers mots de passe. diff --git a/account/messages/messages_it.properties b/account/messages/messages_it.properties new file mode 100644 index 0000000..611bed1 --- /dev/null +++ b/account/messages/messages_it.properties @@ -0,0 +1,153 @@ +doSave=Salva +doCancel=Annulla +doLogOutAllSessions=Effettua il blog out da tutte le sessioni +doRemove=Elimina +doAdd=Aggiungi +doSignOut=Esci + +editAccountHtmlTitle=Modifica Account +federatedIdentitiesHtmlTitle=Federated Identities +accountLogHtmlTitle=Account Log +changePasswordHtmlTitle=Cambia Password +sessionsHtmlTitle=Sessioni +accountManagementTitle=Keycloak Account Management +authenticatorTitle=Authenticator +applicationsHtmlTitle=Applicazioni + +authenticatorCode=Codice One-time +email=Email +firstName=Nome +givenName=Nome +fullName=Nome Completo +lastName=Cognome +familyName=Cognome +password=Password +passwordConfirm=Conferma Password +passwordNew=Nuova Password +username=Username +address=Indirizzo +street=Via +locality=Citt\u00e0 o Localit\u00e0 +region=Stato, Provincia, o Regione +postal_code=CAP +country=Paese +emailVerified=Email verificata +gssDelegationCredential=Credenziali GSS Delegation + +role_admin=Admin +role_realm-admin=Realm Admin +role_create-realm=Crea realm +role_view-realm=Visualizza realm +role_view-users=Visualizza utenti +role_view-applications=Visualizza applicazioni +role_view-clients=Visualizza client +role_view-events=Visualizza eventi +role_view-identity-providers=Visualizza identity provider +role_manage-realm=Gestisci realm +role_manage-users=Gestisci utenti +role_manage-applications=Gestisci applicazioni +role_manage-identity-providers=Gestisci identity provider +role_manage-clients=Gestisci i client +role_manage-events=Gestisci eventi +role_view-profile=Visualizza profilo +role_manage-account=Gestisci account +role_read-token=Leggi token +role_offline-access=Accesso offline +role_uma_authorization=Ottieni permessi +client_account=Account +client_security-admin-console=Security Admin Console +client_admin-cli=Admin CLI +client_realm-management=Gestione Realm +client_broker=Broker + + +requiredFields=Campi obbligatori +allFieldsRequired=Tutti campi obbligatori + +backToApplication=« Torna all''applicazione +backTo=Torna a {0} + +date=Data +event=Evento +ip=IP +client=Client +clients=Clients +details=Dettagli +started=Iniziato +lastAccess=Ultimo accesso +expires=Scade +applications=Applicazioni + +account=Account +federatedIdentity=Federated Identity +authenticator=Authenticator +sessions=Sessioni +log=Log + +application=Applicazione +availablePermissions=Permessi disponibili +grantedPermissions=Permessi concessi +grantedPersonalInfo=Informazioni Personali concesse +additionalGrants=Concessioni addizionali +action=Azione +inResource=in +fullAccess=Accesso completo +offlineToken=Token offline +revoke=Revoca concessione + +configureAuthenticators=Configura Authenticators +mobile=Mobile +totpStep1=Installa FreeOTP o Google Authenticator sul tuo dispositivo mobile. +totpStep2=Apri l''applicazione e scansiona il barcode o scrivi la chiave. +totpStep3=Scrivi il codice one-time fornito dall''applicazione e clicca Salva per completare il setup. + +missingUsernameMessage=Inserisci la username. +missingFirstNameMessage=Inserisci il nome. +invalidEmailMessage=Indirizzo email non valido. +missingLastNameMessage=Inserisci il cognome. +missingEmailMessage=Inserisci l''indirizzo email. +missingPasswordMessage=Inserisci la password. +notMatchPasswordMessage=Le password non corrispondono. + +missingTotpMessage=Inserisci il codice di autenticazione. +invalidPasswordExistingMessage=Password esistente non valida. +invalidPasswordConfirmMessage=La password di conferma non coincide. +invalidTotpMessage=Codice di autenticazione non valido. + +usernameExistsMessage=Username gi\u00e0 esistente. +emailExistsMessage=Email gi\u00e0 esistente. + +readOnlyUserMessage=Non puoi aggiornare il tuo account dal momento che \u00e8 in modalit\u00e0 sola lettura. +readOnlyPasswordMessage=Non puoi aggiornare il tuo account dal momento che \u00e8 in modalit\u00e0 sola lettura. + +successTotpMessage=Mobile authenticator configurato. +successTotpRemovedMessage=Mobile authenticator eliminato. + +successGrantRevokedMessage=Concessione revocata correttamente. + +accountUpdatedMessage=Il tuo account \u00e8 stato aggiornato. +accountPasswordUpdatedMessage=La tua password \u00e8 stata aggiornata. + +missingIdentityProviderMessage=Identity provider non specificata. +invalidFederatedIdentityActionMessage=Azione non valida o mancante. +identityProviderNotFoundMessage=L''identity provider specificato non \u00e8 stato trovato. +federatedIdentityLinkNotActiveMessage=Questo identity non \u00e8 pi\u00f9 attivo. +federatedIdentityRemovingLastProviderMessage=Non puoi rimuovere l''ultimo federated identity dal momento che non hai pi\u00f9 la password. +identityProviderRedirectErrorMessage=Il reindirizzamento all''identity provider \u00e8 fallito. +identityProviderRemovedMessage=Identity provider eliminato correttamente. +identityProviderAlreadyLinkedMessage=Federated identity ritornata da {0} \u00e8 gi\u00e0 collegata ad un altro utente. +staleCodeAccountMessage=La pagina \u00e8 scaduta. Riprova di nuovo. +consentDenied=Permesso negato. + +accountDisabledMessage=Account disabilitato, contatta l''amministratore. + +accountTemporarilyDisabledMessage=L''account \u00e8 temporaneamente disabilitato, contatta l''amministratore o riprova pi\u00f9 tardi. +invalidPasswordMinLengthMessage=Password non valida: lunghezza minima {0}. +invalidPasswordMinLowerCaseCharsMessage=Password non valida: deve contenere almeno {0} caratteri minuscoli. +invalidPasswordMinDigitsMessage=Password non valida: deve contenere almeno {0} numeri. +invalidPasswordMinUpperCaseCharsMessage=Password non valida: deve contenere almeno {0} caratteri maiuscoli. +invalidPasswordMinSpecialCharsMessage=Password non valida: deve contenere almeno {0} caratteri speciali. +invalidPasswordNotUsernameMessage=Password non valida: non deve essere uguale alla username. +invalidPasswordRegexPatternMessage=Password non valida: fallito il match con una o pi\u00f9 espressioni regolari. +invalidPasswordHistoryMessage=Password non valida: non deve essere uguale a nessuna delle ultime {0} password. +invalidPasswordGenericMessage=Password non valida: la nuova password non rispetta le indicazioni previste. diff --git a/account/messages/messages_ja.properties b/account/messages/messages_ja.properties new file mode 100644 index 0000000..ae4d270 --- /dev/null +++ b/account/messages/messages_ja.properties @@ -0,0 +1,153 @@ +# encoding: utf-8 +doSave=保存 +doCancel=キャンセル +doLogOutAllSessions=全セッションからログアウト +doRemove=削除 +doAdd=追加 +doSignOut=サインアウト + +editAccountHtmlTitle=アカウントの編集 +federatedIdentitiesHtmlTitle=Federated Identities +accountLogHtmlTitle=アカウントログ +changePasswordHtmlTitle=パスワード変更 +sessionsHtmlTitle=セッション +accountManagementTitle=Keycloak アカウント管理 +authenticatorTitle=Authenticator +applicationsHtmlTitle=アプリケーション + +authenticatorCode=ワンタイムコード +email=Eメール +firstName=名 +givenName=名 +fullName=氏名 +lastName=姓 +familyName=姓 +password=パスワード +passwordConfirm=新しいパスワード (確認) +passwordNew=新しいパスワード +username=ユーザー名 +address=住所 +street=番地 +locality=市区町村 +region=都道府県 +postal_code=郵便番号 +country=国 +emailVerified=確認済みEメール +gssDelegationCredential=GSS 代行クレデンシャル + +role_admin=管理者 +role_realm-admin=レルムの管理 +role_create-realm=レルムの作成 +role_view-realm=レルムの参照 +role_view-users=ユーザーの参照 +role_view-applications=アプリケーションの参照 +role_view-clients=クライアントの参照 +role_view-events=イベントの参照 +role_view-identity-providers=アイデンティティ プロバイダーの参照 +role_manage-realm=レルムの管理 +role_manage-users=ユーザーの管理 +role_manage-applications=アプリケーションの管理 +role_manage-identity-providers=アイデンティティ プロバイダーの管理 +role_manage-clients=クライアントの管理 +role_manage-events=イベントの管理 +role_view-profile=プロフィールの参照 +role_manage-account=アカウントの管理 +role_read-token=トークンの参照 +role_offline-access=オフラインアクセス +role_uma_authorization=アクセス権の取得 +client_account=アカウント +client_security-admin-console=セキュリティ管理コンソール +client_admin-cli=管理 CLI +client_realm-management=レルム管理 +client_broker=ブローカー + + +requiredFields=必須 +allFieldsRequired=全ての入力項目が必須 + +backToApplication=« アプリケーションに戻る +backTo={0} に戻る + +date=日付 +event=イベント +ip=IP +client=クライアント +clients=クライアント +details=詳細 +started=開始 +lastAccess=最終アクセス +expires=有効期限 +applications=アプリケーション + +account=アカウント +federatedIdentity=Federated Identity +authenticator=Authenticator +sessions=セッション +log=ログ + +application=アプリケーション +availablePermissions=使用可能なアクセス権 +grantedPermissions=許可されたアクセス権 +grantedPersonalInfo=許可された個人情報 +additionalGrants=追加の許可 +action=アクション +inResource=in +fullAccess=フルアクセス +offlineToken=オフライントークン +revoke=許可の取り消し + +configureAuthenticators=設定済みの Authenticator +mobile=モバイル +totpStep1=FreeOTP または Google Authenticator (Google認証システム) をご自身のデバイスにインストールしてください。これらのアプリケーションは Google Play と Apple App Store で入手できます。 +totpStep2=アプリケーションを開きバーコードをスキャンするかキーを入力してください。 +totpStep3=アプリケーションで提供されたワンタイムコードを入力して保存をクリックし、セットアップを完了してください。 + +missingUsernameMessage=ユーザー名を入力してください。 +missingFirstNameMessage=名を入力してください。 +invalidEmailMessage=無効なメールアドレスです。 +missingLastNameMessage=姓を入力してください。 +missingEmailMessage=Eメールを入力してください。 +missingPasswordMessage=パスワードを入力してください。 +notMatchPasswordMessage=パスワードが一致していません。 + +missingTotpMessage=Authenticator コードを入力してください。 +invalidPasswordExistingMessage=無効な既存のパスワードです。 +invalidPasswordConfirmMessage=新しいパスワード (確認) と一致していません。 +invalidTotpMessage=無効な Authenticator コードです。 + +usernameExistsMessage=既に存在するユーザー名です。 +emailExistsMessage=既に存在するEメールです。 + +readOnlyUserMessage=リードオンリーのためアカウントを更新することはできません。 +readOnlyPasswordMessage=リードオンリーのためパスワードを更新することはできません。 + +successTotpMessage=モバイル Authenticator が設定されました。 +successTotpRemovedMessage=モバイル Authenticator が削除されました。 + +successGrantRevokedMessage=許可が正常に取り消しされました。 + +accountUpdatedMessage=アカウントが更新されました。 +accountPasswordUpdatedMessage=パスワードが更新されました。 + +missingIdentityProviderMessage=アイデンティティ プロバイダーが指定されていません。 +invalidFederatedIdentityActionMessage=無効または存在しないアクションです。 +identityProviderNotFoundMessage=指定されたアイデンティティ プロバイダーが見つかりません。 +federatedIdentityLinkNotActiveMessage=このアイデンティティは有効ではありません。 +federatedIdentityRemovingLastProviderMessage=パスワードがないため最後の Federated Identity を削除できません。 +identityProviderRedirectErrorMessage=アイデンティティ プロバイダーへのリダイレクトに失敗しました。 +identityProviderRemovedMessage=アイデンティティ プロバイダーが正常に削除されました。 +identityProviderAlreadyLinkedMessage={0}から返された Federated Identity は既に他のユーザーに関連付けされています。 +staleCodeAccountMessage=有効期限切れです。再度お試しください。 +consentDenied=同意が拒否されました。 + +accountDisabledMessage=アカウントが無効です。管理者に連絡してください。 + +accountTemporarilyDisabledMessage=アカウントが一時的に無効です。管理者に連絡、またはしばらく時間をおいてから再度お試しください。 +invalidPasswordMinLengthMessage=無効なパスワード: 最小 {0} の長さが必要です。 +invalidPasswordMinLowerCaseCharsMessage=無効なパスワード: 少なくとも {0} 文字の小文字を含む必要があります。 +invalidPasswordMinDigitsMessage=無効なパスワード: 少なくとも {0} 文字の数字を含む必要があります。 +invalidPasswordMinUpperCaseCharsMessage=無効なパスワード: 少なくとも {0} 文字の大文字を含む必要があります。 +invalidPasswordMinSpecialCharsMessage=無効なパスワード: 少なくとも {0} 文字の特殊文字を含む必要があります。 +invalidPasswordNotUsernameMessage=無効なパスワード: ユーザー名と同じパスワードは禁止されています。 +invalidPasswordRegexPatternMessage=無効なパスワード: 正規表現パターンと一致しません。 +invalidPasswordHistoryMessage=無効なパスワード: 最近の {0} パスワードのいずれかと同じパスワードは禁止されています。 \ No newline at end of file diff --git a/account/messages/messages_lt.properties b/account/messages/messages_lt.properties new file mode 100644 index 0000000..1660d72 --- /dev/null +++ b/account/messages/messages_lt.properties @@ -0,0 +1,153 @@ +doSave=Saugoti +doCancel=At\u0161aukti + +doLogOutAllSessions=Atjungti visas sesijas +doRemove=\u0160alinti +doAdd=Prid\u0117ti +doSignOut=Atsijungti + +editAccountHtmlTitle=Redaguoti paskyr\u0105 +federatedIdentitiesHtmlTitle=Susietos paskyros +accountLogHtmlTitle=Paskyros \u017Eurnalas +changePasswordHtmlTitle=Keisti slapta\u017Eod\u012F +sessionsHtmlTitle=Prisijungimo sesijos +accountManagementTitle=Keycloak Naudotoj\u0173 Administravimas +authenticatorTitle=Autentifikatorius +applicationsHtmlTitle=Programos + +authenticatorCode=Vienkartinis kodas +email=El. pa\u0161tas +firstName=Vardas +givenName=Pavard\u0117 +fullName=Pilnas vardas +lastName=Pavard\u0117 +familyName=Pavard\u0117 +password=Slapta\u017Eodis +passwordConfirm=Pakartotas slapta\u017Eodis +passwordNew=Naujas slapta\u017Eodis +username=Naudotojo vardas +address=Adresas +street=Gatv\u0117 +locality=Miestas arba vietov\u0117 +region=Rajonas +postal_code=Pa\u0161to kodas +country=\u0160alis +emailVerified=El. pa\u0161to adresas patvirtintas +gssDelegationCredential=GSS prisijungimo duomen\u0173 delegavimas + +role_admin=Administratorius +role_realm-admin=Srities administravimas +role_create-realm=Kurti srit\u012F +role_view-realm=Per\u017Ei\u016Br\u0117ti srit\u012F +role_view-users=Per\u017Ei\u016Br\u0117ti naudotojus +role_view-applications=Per\u017Ei\u016Br\u0117ti programas +role_view-clients=Per\u017Ei\u016Br\u0117ti klientines programas +role_view-events=Per\u017Ei\u016Br\u0117ti \u012Fvyki\u0173 \u017Eurnal\u0105 +role_view-identity-providers=Per\u017Ei\u016Br\u0117ti tapatyb\u0117s teik\u0117jus +role_manage-realm=Valdyti sritis +role_manage-users=Valdyti naudotojus +role_manage-applications=Valdyti programas +role_manage-identity-providers=Valdyti tapatyb\u0117s teik\u0117jus +role_manage-clients=Valdyti programas +role_manage-events=Valdyti \u012Fvykius +role_view-profile=Per\u017Ei\u016Br\u0117ti paskyr\u0105 +role_manage-account=Valdyti paskyr\u0105 +role_read-token=Skaityti prieigos rak\u0161\u0105 +role_offline-access=Darbas neprisijungus +role_uma_authorization=\u012Egauti UMA autorizavimo teises +client_account=Paskyra +client_security-admin-console=Saugumo administravimo konsol\u0117 +client_admin-cli=Administravimo CLI +client_realm-management=Srities valdymas +client_broker=Tarpininkas + + +requiredFields=Privalomi laukai +allFieldsRequired=Visi laukai yra privalomi + +backToApplication=« Gr\u012F\u017Eti \u012F program\u0105 +backTo=Atgal \u012F {0} + +date=Data +event=\u012Evykis +ip=IP +client=Klientas +clients=Klientai +details=Detaliau +started=Suk\u016Brimo laikas +lastAccess=V\u0117liausia prieiga +expires=Galioja iki +applications=Programos + +account=Paskyra +federatedIdentity=Susieta tapatyb\u0117 +authenticator=Autentifikatorius +sessions=Sesijos +log=\u012Evykiai + +application=Programa +availablePermissions=Galimos teis\u0117s +grantedPermissions=\u012Egalintos teis\u0117s +grantedPersonalInfo=\u012Egalinta asmenin\u0117 informacija +additionalGrants=Papildomi \u012Fgaliojimai +action=Veiksmas +inResource=yra +fullAccess=Pilna prieiga +offlineToken=Re\u017Eimo neprisijungus raktas (token) +revoke=At\u0161aukti \u012Fgaliojim\u0105 + +configureAuthenticators=Sukonfig\u016Bruotas autentifikatorius +mobile=Mobilus +totpStep1=\u012Ediekite FreeOTP arba Google Authenticator savo \u012Frenginyje. Program\u0117l\u0117s prieinamos Google Play ir Apple App Store. +totpStep2=Atidarykite program\u0117l\u0119 ir nuskenuokite barkod\u0105 arba \u012Fveskite kod\u0105. +totpStep3=\u012Eveskite program\u0117l\u0117je sugeneruot\u0105 vien\u0105 kart\u0105 galiojant\u012F kod\u0105 ir paspauskite Saugoti nor\u0117dami prisijungti. + +missingUsernameMessage=Pra\u0161ome \u012Fvesti naudotojo vard\u0105. +missingFirstNameMessage=Pra\u0161ome \u012Fvesti vard\u0105. +invalidEmailMessage=Neteisingas el. pa\u0161to adresas. +missingLastNameMessage=Pra\u0161ome \u012Fvesti pavard\u0119. +missingEmailMessage=Pra\u0161ome \u012Fvesti el. pa\u0161to adres\u0105. +missingPasswordMessage=Pra\u0161ome \u012Fvesti slapta\u017Eod\u012F. +notMatchPasswordMessage=Slapta\u017Eod\u017Eiai nesutampa. + +missingTotpMessage=Pra\u0161ome \u012Fvesti autentifikacijos kod\u0105. +invalidPasswordExistingMessage=Neteisingas dabartinis slapta\u017Eodis. +invalidPasswordConfirmMessage=Pakartotas slapta\u017Eodis nesutampa. +invalidTotpMessage=Neteisingas autentifikacijos kodas. + +usernameExistsMessage=Toks naudotojas jau egzistuoja. +emailExistsMessage=El. pa\u0161to adresas jau egzistuoja. + +readOnlyUserMessage=Tik skaitymui sukonfig\u016Bruotos paskyros duomen\u0173 atnaujinti neleid\u017Eiama. +readOnlyPasswordMessage=Tik skaitymui sukonfig\u016Bruotos paskyros slapta\u017Eod\u017Eio atnaujinti neleid\u017Eiama. + +successTotpMessage=Mobilus autentifikatorius sukonfig\u016Bruotas. +successTotpRemovedMessage=Mobilus autentifikatorius pa\u0161alintas. + +successGrantRevokedMessage=\u012Egalinimas pa\u0161alintas s\u0117kmingai. + +accountUpdatedMessage=J\u016Bs\u0173 paskyros duomenys s\u0117kmingai atnaujinti. +accountPasswordUpdatedMessage=J\u016Bs\u0173 paskyros slapta\u017Eodis pakeistas. + +missingIdentityProviderMessage=Nenurodytas tapatyb\u0117s teik\u0117jas. +invalidFederatedIdentityActionMessage=Neteisingas arba ne\u017Einomas veiksmas. +identityProviderNotFoundMessage=Nurodytas tapatyb\u0117s teik\u0117jas nerastas. +federatedIdentityLinkNotActiveMessage=Nurodyta susieta tapatyb\u0117 neaktyvi. +federatedIdentityRemovingLastProviderMessage=J\u016Bs negalite pa\u0161alinti paskutinio tapatyb\u0117s teik\u0117jo s\u0105sajos, nes J\u016Bs neturite nusistat\u0119 paskyros slapta\u017Eod\u017Eio. +identityProviderRedirectErrorMessage=Klaida nukreipiant \u012F tapatyb\u0117s teik\u0117jo puslap\u012F. +identityProviderRemovedMessage=Tapatyb\u0117s teik\u0117jas s\u0117kmingai pa\u0161alintas. +identityProviderAlreadyLinkedMessage=Susieta tapatyb\u0117 i\u0161 {0} jau susieta su kita paskyra. +staleCodeAccountMessage=Puslapio galiojimas baig\u0117si. Bandykite dar kart\u0105. +consentDenied=Prieiga draud\u017Eiama. + +accountDisabledMessage=Paskyros galiojimas sustabdytas, kreipkit\u0117s \u012F administratori\u0173. + +accountTemporarilyDisabledMessage=Paskyros galiojimas laikinai sustabdytas. Kreipkit\u0117s \u012F administratori\u0173 arba pabandykite v\u0117liau. +invalidPasswordMinLengthMessage=Per trumpas slapta\u017Eodis: ma\u017Eiausias ilgis {0}. +invalidPasswordMinLowerCaseCharsMessage=Neteisingas slapta\u017Eodis: privaloma \u012Fvesti {0} ma\u017E\u0105j\u0105 raid\u0119. +invalidPasswordMinDigitsMessage=Neteisingas slapta\u017Eodis: privaloma \u012Fvesti {0} skaitmen\u012F. +invalidPasswordMinUpperCaseCharsMessage=Neteisingas slapta\u017Eodis: privaloma \u012Fvesti {0} did\u017Ei\u0105j\u0105 raid\u0119. +invalidPasswordMinSpecialCharsMessage=Neteisingas slapta\u017Eodis: privaloma \u012Fvesti {0} special\u0173 simbol\u012F. +invalidPasswordNotUsernameMessage=Neteisingas slapta\u017Eodis: slapta\u017Eodis negali sutapti su naudotojo vardu. +invalidPasswordRegexPatternMessage=Neteisingas slapta\u017Eodis: slapta\u017Eodis netenkina regex taisykl\u0117s(i\u0173). +invalidPasswordHistoryMessage=Neteisingas slapta\u017Eodis: slapta\u017Eodis negali sutapti su prie\u0161 tai buvusiais {0} slapta\u017Eod\u017Eiais. \ No newline at end of file diff --git a/account/messages/messages_nl.properties b/account/messages/messages_nl.properties new file mode 100644 index 0000000..f0882fb --- /dev/null +++ b/account/messages/messages_nl.properties @@ -0,0 +1,133 @@ +doSave=Opslaan +doCancel=Annuleer +doLogOutAllSessions=Alle sessies uitloggen +doRemove=Verwijder +doAdd=Voeg toe +doSignOut=Afmelden +editAccountHtmlTitle=Bewerk account +federatedIdentitiesHtmlTitle=Federated Identities +accountLogHtmlTitle=Account log +changePasswordHtmlTitle=Verander wachtwoord +sessionsHtmlTitle=Sessies +accountManagementTitle=Keycloak Accountbeheer +authenticatorTitle=Authenticator +applicationsHtmlTitle=Toepassingen +authenticatorCode=Eenmalige code +email=E-mailadres +firstName=Voornaam +givenName=Voornaam +fullName=Volledige naam +lastName=Achternaam +familyName=Achternaam +password=Wachtwoord +passwordConfirm=Bevestiging +passwordNew=Nieuw Wachtwoord +username=Gebruikersnaam +address=Adres +street=Straat +locality=Stad of plaats +region=Staat, provincie of regio +postal_code=Postcode +country=Land +emailVerified=E-mailadres geverifieerd +gssDelegationCredential=GSS gedelegeerde aanmeldgegevens +role_admin=Beheer +role_realm-admin=Realmbeheer +role_create-realm=Creëer realm +role_view-realm=Bekijk realm +role_view-users=Bekijk gebruikers +role_view-applications=Bekijk toepassingen +role_view-clients=Bekijk clients +role_view-events=Bekijk gebeurtenissen +role_view-identity-providers=Bekijk identity providers +role_manage-realm=Beheer realm +role_manage-users=Beheer gebruikers +role_manage-applications=Beheer toepassingen +role_manage-identity-providers=Beheer identity providers +role_manage-clients=Beheer clients +role_manage-events=Beheer gebeurtenissen +role_view-profile=Bekijk profiel +role_manage-account=Beheer account +role_manage-account-links=Beheer accountkoppelingen +role_read-token=Lees token +role_offline-access=Offline toegang +role_uma_authorization=Verkrijg UMA rechten +client_account=Account +client_security-admin-console=Console Veligheidsbeheer +client_admin-cli=Beheer CLI +client_realm-management=Realmbeheer +client_broker=Broker +requiredFields=Verplichte velden +allFieldsRequired=Alle velden verplicht +backToApplication=« Terug naar toepassing +backTo=Terug naar {0} +date=Datum +event=Gebeurtenis +ip=IP +client=Client +clients=Clients +details=Details +started=Gestart +lastAccess=Laatste toegang +expires=Vervalt +applications=Toepassingen +account=Account +federatedIdentity=Federated Identity +authenticator=Authenticator +sessions=Sessies +log=Log +application=Toepassing +availablePermissions=Beschikbare rechten +grantedPermissions=Gegunde rechten +grantedPersonalInfo=Gegunde Persoonsgegevens +additionalGrants=Verdere vergunningen +action=Actie +inResource=in +fullAccess=Volledige toegang +offlineToken=Offline Token +revoke=Vergunning intrekken +configureAuthenticators=Ingestelde authenticators +mobile=Mobiel nummer +totpStep1=Installeer FreeOTP of Google Authenticator op uw apparaat. Beide toepassingen zijn beschikbaar in Google Play en de Apple App Store. +totpStep2=Open de toepassing en scan de QR-code of voer de sleutel in. +totpStep3=Voer de door de toepassing gegeven eenmalige code in en klik op Opslaan om de configuratie af te ronden. +missingUsernameMessage=Gebruikersnaam ontbreekt. +missingFirstNameMessage=Voornaam onbreekt. +invalidEmailMessage=Ongeldig e-mailadres. +missingLastNameMessage=Achternaam ontbreekt. +missingEmailMessage=E-mailadres ontbreekt. +missingPasswordMessage=Wachtwoord ontbreekt. +notMatchPasswordMessage=Wachtwoorden komen niet overeen. +missingTotpMessage=Authenticatiecode ontbreekt. +invalidPasswordExistingMessage=Ongeldig bestaand wachtwoord. +invalidPasswordConfirmMessage=Wachtwoordbevestiging komt niet overeen. +invalidTotpMessage=Ongeldige authenticatiecode. +emailExistsMessage=E-mailadres bestaat reeds. +readOnlyUserMessage=U kunt uw account niet bijwerken aangezien het account alleen-lezen is. +readOnlyPasswordMessage=U kunt uw wachtwoord niet wijzigen omdat uw account alleen-lezen is. +successTotpMessage=Mobiele authenticator geconfigureerd. +successTotpRemovedMessage=Mobiele authenticator verwijderd. +successGrantRevokedMessage=Vergunning succesvol ingetrokken +accountUpdatedMessage=Uw account is gewijzigd. +accountPasswordUpdatedMessage=Uw wachtwoord is gewijzigd. +missingIdentityProviderMessage=Geen identity provider aangegeven. +invalidFederatedIdentityActionMessage=Ongeldige of ontbrekende actie op federated identity. +identityProviderNotFoundMessage=Gespecificeerde identity provider niet gevonden. +federatedIdentityLinkNotActiveMessage=Deze federated identity is niet langer geldig. +federatedIdentityRemovingLastProviderMessage=U kunt de laatste federated identity provider niet verwijderen aangezien u dan niet langer zou kunnen inloggen. +identityProviderRedirectErrorMessage=Kon niet herverwijzen naar identity provider. +identityProviderRemovedMessage=Identity provider met succes verwijderd. +identityProviderAlreadyLinkedMessage=Door {0} teruggegeven federated identity is al gekoppeld aan een andere gebruiker. +staleCodeAccountMessage=De pagina is verlopen. Probeer het nogmaals. +consentDenied=Toestemming geweigerd +accountDisabledMessage=Account is gedeactiveerd. Contacteer de beheerder. +accountTemporarilyDisabledMessage=Account is tijdelijk deactiveerd, neem contact op met de beheerder of probeer het later opnieuw. +invalidPasswordMinLengthMessage=Ongeldig wachtwoord: de minimale lengte is {0} karakters. +invalidPasswordMinLowerCaseCharsMessage=Ongeldig wachtwoord: het moet minstens {0} kleine letters bevatten. +invalidPasswordMinDigitsMessage=Ongeldig wachtwoord: het moet minstens {0} getallen bevatten. +invalidPasswordMinUpperCaseCharsMessage=Ongeldig wachtwoord: het moet minstens {0} hoofdletters bevatten. +invalidPasswordMinSpecialCharsMessage=Ongeldig wachtwoord: het moet minstens {0} speciale karakters bevatten. +invalidPasswordNotUsernameMessage=Ongeldig wachtwoord: het mag niet overeenkomen met de gebruikersnaam. +invalidPasswordRegexPatternMessage=Ongeldig wachtwoord: het voldoet niet aan het door de beheerder ingestelde patroon. +invalidPasswordHistoryMessage=Ongeldig wachtwoord: het mag niet overeen komen met een van de laatste {0} wachtwoorden. +invalidPasswordGenericMessage=Ongeldig wachtwoord: het nieuwe wachtwoord voldoet niet aan het wachtwoordbeleid. diff --git a/account/messages/messages_no.properties b/account/messages/messages_no.properties new file mode 100644 index 0000000..2147735 --- /dev/null +++ b/account/messages/messages_no.properties @@ -0,0 +1,165 @@ +doSave=Lagre +doCancel=Avbryt +doLogOutAllSessions=Logg ut av alle sesjoner +doRemove=Fjern +doAdd=Legg til +doSignOut=Logg ut + +editAccountHtmlTitle=Rediger konto +federatedIdentitiesHtmlTitle=Federerte identiteter +accountLogHtmlTitle=Kontologg +changePasswordHtmlTitle=Endre passord +sessionsHtmlTitle=Sesjoner +accountManagementTitle=Keycloak kontoadministrasjon +authenticatorTitle=Autentikator +applicationsHtmlTitle=Applikasjoner + +authenticatorCode=Engangskode +email=E-post +firstName=Fornavn +givenName=Fornavn +fullName=Fullt navn +lastName=Etternavn +familyName=Etternavn +password=Passord +passwordConfirm=Bekreftelse +passwordNew=Nytt passord +username=Brukernavn +address=Adresse +street=Gate-/veinavn + husnummer +locality=By +region=Fylke +postal_code=Postnummer +country=Land +emailVerified=E-post bekreftet +gssDelegationCredential=GSS legitimasjonsdelegering + +role_admin=Administrator +role_realm-admin=Administrator for sikkerhetsdomene +role_create-realm=Opprette sikkerhetsdomene +role_view-realm=Se sikkerhetsdomene +role_view-users=Se brukere +role_view-applications=Se applikasjoner +role_view-clients=Se klienter +role_view-events=Se hendelser +role_view-identity-providers=Se identitetsleverand\u00F8rer +role_manage-realm=Administrere sikkerhetsdomene +role_manage-users=Administrere brukere +role_manage-applications=Administrere applikasjoner +role_manage-identity-providers=Administrere identitetsleverand\u00F8rer +role_manage-clients=Administrere klienter +role_manage-events=Administrere hendelser +role_view-profile=Se profil +role_manage-account=Administrere konto +role_read-token=Lese token +role_offline-access=Frakoblet tilgang +role_uma_authorization=Skaffe tillatelser +client_account=Konto +client_security-admin-console=Sikkerhetsadministrasjonskonsoll +client_admin-cli=Kommandolinje-grensesnitt for administrator +client_realm-management=Sikkerhetsdomene-administrasjon +client_broker=Broker + + +requiredFields=Obligatoriske felt +allFieldsRequired=Alle felt m\u00E5 fylles ut + +backToApplication=« Tilbake til applikasjonen +backTo=Tilbake til {0} + +date=Dato +event=Hendelse +ip=IP +client=Klient +clients=Klienter +details=Detaljer +started=Startet +lastAccess=Sist benyttet +expires=Utl\u00F8per +applications=Applikasjoner + +account=Konto +federatedIdentity=Federert identitet +authenticator=Autentikator +sessions=Sesjoner +log=Logg + +application=Applikasjon +availablePermissions=Tilgjengelige rettigheter +grantedPermissions=Innvilgede rettigheter +grantedPersonalInfo=Innvilget personlig informasjon +additionalGrants=Ekstra rettigheter +action=Handling +inResource=i +fullAccess=Full tilgang +offlineToken=Offline token +revoke=Opphev rettighet + +configureAuthenticators=Konfigurerte autentikatorer +mobile=Mobiltelefon +totpStep1=Installer FreeOTP eller Google Authenticator p\u00E5 din enhet. Begge applikasjoner er tilgjengelige p\u00E5 Google Play og Apple App Store. +totpStep2=\u00C5pne applikasjonen og skann strekkoden eller skriv inn koden. +totpStep3=Skriv inn engangskoden gitt av applikasjonen og klikk Lagre for \u00E5 fullf\u00F8re. + +missingUsernameMessage=Vennligst oppgi brukernavn. +missingFirstNameMessage=Vennligst oppgi fornavn. +invalidEmailMessage=Ugyldig e-postadresse. +missingLastNameMessage=Vennligst oppgi etternavn. +missingEmailMessage=Vennligst oppgi e-postadresse. +missingPasswordMessage=Vennligst oppgi passord. +notMatchPasswordMessage=Passordene er ikke like. + +missingTotpMessage=Vennligst oppgi engangskode. +invalidPasswordExistingMessage=Ugyldig eksisterende passord. +invalidPasswordConfirmMessage=Passordene er ikke like. +invalidTotpMessage=Ugyldig engangskode. + +usernameExistsMessage=Brukernavnet finnes allerede. +emailExistsMessage=E-postadressen finnes allerede. + +readOnlyUserMessage=Du kan ikke oppdatere kontoen din ettersom den er skrivebeskyttet. +readOnlyPasswordMessage=Du kan ikke oppdatere passordet ditt ettersom kontoen din er skrivebeskyttet. + +successTotpMessage=Autentikator for mobiltelefon er konfigurert. +successTotpRemovedMessage=Autentikator for mobiltelefon er fjernet. + +successGrantRevokedMessage=Vellykket oppheving av rettighet. + +accountUpdatedMessage=Kontoen din har blitt oppdatert. +accountPasswordUpdatedMessage=Ditt passord har blitt oppdatert. + +missingIdentityProviderMessage=Identitetsleverand\u00F8r er ikke spesifisert. +invalidFederatedIdentityActionMessage=Ugyldig eller manglende handling. +identityProviderNotFoundMessage=Spesifisert identitetsleverand\u00F8r ikke funnet. +federatedIdentityLinkNotActiveMessage=Denne identiteten er ikke lenger aktiv. +federatedIdentityRemovingLastProviderMessage=Du kan ikke fjerne siste federerte identitet ettersom du ikke har et passord. +identityProviderRedirectErrorMessage=Redirect til identitetsleverand\u00F8r feilet. +identityProviderRemovedMessage=Fjerning av identitetsleverand\u00F8r var vellykket. +identityProviderAlreadyLinkedMessage=Federert identitet returnert av {0} er allerede koblet til en annen bruker. +staleCodeAccountMessage=Siden har utl\u00F8pt. Vennligst pr\u00F8v en gang til. +consentDenied=Samtykke avsl\u00E5tt. + +accountDisabledMessage=Konto er deaktivert, kontakt administrator. + +accountTemporarilyDisabledMessage=Konto er midlertidig deaktivert, kontakt administrator eller pr\u00F8v igjen senere. +invalidPasswordMinLengthMessage=Ugyldig passord: minimum lengde {0}. +invalidPasswordMinLowerCaseCharsMessage=Ugyldig passord: m\u00E5 inneholde minimum {0} sm\u00E5 bokstaver. +invalidPasswordMinDigitsMessage=Ugyldig passord: m\u00E5 inneholde minimum {0} sifre. +invalidPasswordMinUpperCaseCharsMessage=Ugyldig passord: m\u00E5 inneholde minimum {0} store bokstaver. +invalidPasswordMinSpecialCharsMessage=Ugyldig passord: m\u00E5 inneholde minimum {0} spesialtegn. +invalidPasswordNotUsernameMessage=Ugyldig passord: kan ikke v\u00E6re likt brukernavn. +invalidPasswordRegexPatternMessage=Ugyldig passord: tilfredsstiller ikke kravene for passord-m\u00F8nster. +invalidPasswordHistoryMessage=Ugyldig passord: kan ikke v\u00E6re likt noen av de {0} foreg\u00E5ende passordene. + +locale_ca=Catal\u00E0 +locale_de=Deutsch +locale_en=English +locale_es=Espa\u00F1ol +locale_fr=Fran\u00e7ais +locale_it=Italian +locale_ja=\u65E5\u672C\u8A9E +locale_no=Norsk +locale_nl=Nederlands +locale_pt-BR=Portugu\u00EAs (Brasil) +locale_ru=\u0420\u0443\u0441\u0441\u043A\u0438\u0439 +locale_zh-CN=\u4e2d\u6587\u7b80\u4f53 diff --git a/account/messages/messages_pt_BR.properties b/account/messages/messages_pt_BR.properties new file mode 100644 index 0000000..80e8515 --- /dev/null +++ b/account/messages/messages_pt_BR.properties @@ -0,0 +1,149 @@ +doSave=Salvar +doCancel=Cancelar +doLogOutAllSessions=Sair de todas as sess\u00F5es +doRemove=Remover +doAdd=Adicionar +doSignOut=Sair + +editAccountHtmlTitle=Editar Conta +federatedIdentitiesHtmlTitle=Identidades Federadas +accountLogHtmlTitle=Log da conta +changePasswordHtmlTitle=Alterar senha +sessionsHtmlTitle=Sess\u00F5es +accountManagementTitle=Gerenciamento de Conta +authenticatorTitle=Autenticator +applicationsHtmlTitle=Aplicativos + +authenticatorCode=C\u00F3digo autenticador +email=E-mail +firstName=Primeiro nome +givenName=Primeiro nome +fullName=Nome completo +lastName=Sobrenome +familyName=Sobrenome +password=Senha +passwordConfirm=Confirma\u00E7\u00E3o +passwordNew=Nova senha +username=Nome de us\u00FAario +address=Endere\u00E7o +street=Logradouro +locality=Cidade ou Localidade +region=Estado +postal_code=CEP +country=Pa\u00EDs +emailVerified=E-mail verificado +gssDelegationCredential=GSS Delega\u00E7\u00E3o de Credencial + +role_admin=Admin +role_realm-admin=Realm Admin +role_create-realm=Cria realm +role_view-realm=Visualiza realm +role_view-users=Visualiza usu\u00E1rios +role_view-applications=Visualiza aplica\u00E7\u00F5es +role_view-clients=Visualiza clientes +role_view-events=Visualiza eventos +role_view-identity-providers=Visualiza provedores de identidade +role_manage-realm=Gerencia realm +role_manage-users=Gerencia usu\u00E1rios +role_manage-applications=Gerencia aplica\u00E7\u00F5es +role_manage-identity-providers=Gerencia provedores de identidade +role_manage-clients=Gerencia clientes +role_manage-events=Gerencia eventos +role_view-profile=Visualiza perfil +role_manage-account=Gerencia conta +role_read-token=L\u00EA token +role_offline-access=Acesso Offline +role_uma_authorization=Obter permiss\u00F5es +client_account=Conta +client_security-admin-console=Console de Administra\u00E7\u00E3o de Seguran\u00E7a +client_admin-cli=Admin CLI +client_realm-management=Gerenciamento de Realm +client_broker=Broker + +requiredFields=Campos obrigat\u00F3rios +allFieldsRequired=Todos os campos s\u00E3o obrigat\u00F3rios + +backToApplication=« Voltar para aplica\u00E7\u00E3o +backTo=Voltar para {0} + +date=Data +event=Evento +ip=IP +client=Cliente +clients=Clientes +details=Detalhes +started=Iniciado +lastAccess=\u00DAltimo acesso +expires=Expira +applications=Aplicativos + +account=Conta +federatedIdentity=Identidade Federada +authenticator=Autenticador +sessions=Sess\u00F5es +log=Log + +application=Aplicativo +availablePermissions=Permiss\u00F5es Dispon\u00EDveis +grantedPermissions=Permiss\u00F5es Concedidas +grantedPersonalInfo=Informa\u00E7\u00F5es Pessoais Concedidas +additionalGrants=Concess\u00F5es Adicionais +action=A\u00E7\u00E3o +inResource=em +fullAccess=Acesso Completo +offlineToken=Offline Token +revoke=Revogar Concess\u00F5es + +configureAuthenticators=Autenticadores Configurados +mobile=Mobile +totpStep1=Instalar FreeOTP ou Google Authenticator em seu dispositivo. Ambas aplica\u00E7\u00F5es est\u00E3o dispon\u00EDveis no Google Play e na Apple App Store. +totpStep2=Abra o aplicativo e escaneie o c\u00F3digo de barras ou entre com o c\u00F3digo. +totpStep3=Digite o c\u00F3digo fornecido pelo aplicativo e clique em Salvar para concluir a configura\u00E7\u00E3o. + +missingUsernameMessage=Por favor, especifique o nome de usu\u00E1rio. +missingFirstNameMessage=Por favor, informe o primeiro nome. +invalidEmailMessage=E-mail inv\u00E1lido. +missingLastNameMessage=Por favor, informe o sobrenome. +missingEmailMessage=Por favor, informe o e-mail. +missingPasswordMessage=Por favor, informe a senha. +notMatchPasswordMessage=As senhas n\u00E3o coincidem. + +missingTotpMessage=Por favor, informe o c\u00F3digo autenticador. +invalidPasswordExistingMessage=Senha atual inv\u00E1lida. +invalidPasswordConfirmMessage=A senha de confirma\u00E7\u00E3o n\u00E3o coincide. +invalidTotpMessage=C\u00F3digo autenticador inv\u00E1lido. + +usernameExistsMessage=Este nome de usu\u00E1rio j\u00E1 existe. +emailExistsMessage=Este e-mail j\u00E1 existe. + +readOnlyUserMessage=Voc\u00EA n\u00E3o pode atualizar sua conta, uma vez que \u00E9 apenas de leitura +readOnlyPasswordMessage=Voc\u00EA n\u00E3o pode atualizar sua senha, sua conta \u00E9 somente leitura + +successTotpMessage=Autenticador mobile configurado. +successTotpRemovedMessage=Autenticador mobile removido. + +successGrantRevokedMessage=Concess\u00F5es revogadas com sucesso. + +accountUpdatedMessage=Sua conta foi atualizada +accountPasswordUpdatedMessage=Sua senha foi atualizada + +missingIdentityProviderMessage=Provedor de identidade n\u00E3o especificado +invalidFederatedIdentityActionMessage=A\u00E7\u00E3o inv\u00E1lida ou ausente +identityProviderNotFoundMessage=O provedor de identidade especificado n\u00E3o foi encontrado +federatedIdentityLinkNotActiveMessage=Esta identidade n\u00E3o est\u00E1 mais em atividade +federatedIdentityRemovingLastProviderMessage=Voc\u00EA n\u00E3o pode remover a \u00FAltima identidade federada como voc\u00EA n\u00E3o tem senha +identityProviderRedirectErrorMessage=Falha ao redirecionar para o provedor de identidade +identityProviderRemovedMessage=Provedor de identidade removido com sucesso +identityProviderAlreadyLinkedMessage=Identidade federada retornado por {0} j\u00E1 est\u00E1 ligado a outro usu\u00E1rio. + +accountDisabledMessage=Conta desativada, contate o administrador + +accountTemporarilyDisabledMessage=A conta est\u00E1 temporariamente indispon\u00EDvel, contate o administrador ou tente novamente mais tarde +invalidPasswordMinLengthMessage=Senha inv\u00E1lida\: comprimento m\u00EDnimo {0} +invalidPasswordMinLowerCaseCharsMessage=Senha inv\u00E1lida\: deve conter pelo menos {0} caractere(s) min\u00FAsculo +invalidPasswordMinDigitsMessage=Senha inv\u00E1lida\: deve conter pelo menos {0} n\u00FAmero(s) +invalidPasswordMinUpperCaseCharsMessage=Senha inv\u00E1lida\: deve conter pelo menos {0} caractere(s) mai\u00FAsculo +invalidPasswordMinSpecialCharsMessage=Senha inv\u00E1lida\: deve conter pelo menos {0} caractere(s) especial +invalidPasswordNotUsernameMessage=Senha inv\u00E1lida\: n\u00E3o deve ser igual ao nome de usu\u00E1rio +invalidPasswordRegexPatternMessage=Senha inv\u00E1lida\: n\u00E3o corresponde ao padr\u00E3o da express\u00E3o regular. +invalidPasswordHistoryMessage=Senha inv\u00E1lida\: n\u00E3o pode ser igual a qualquer uma das {0} \u00FAltimas senhas. \ No newline at end of file diff --git a/account/messages/messages_ru.properties b/account/messages/messages_ru.properties new file mode 100644 index 0000000..7d47a55 --- /dev/null +++ b/account/messages/messages_ru.properties @@ -0,0 +1,155 @@ +# encoding: utf-8 +doSave=Сохранить +doCancel=Отмена +doLogOutAllSessions=Выйти из всех сессий +doRemove=Удалить +doAdd=Добавить +doSignOut=Выход + +editAccountHtmlTitle=Изменение учетной записи +federatedIdentitiesHtmlTitle=Федеративные идентификаторы +accountLogHtmlTitle=Лог учетной записи +changePasswordHtmlTitle=Смена пароля +sessionsHtmlTitle=Сессии +accountManagementTitle=Управление учетной записью +authenticatorTitle=Аутентификатор +applicationsHtmlTitle=Приложения + +authenticatorCode=Одноразовый код +email=E-mail +firstName=Имя +givenName=Имя +fullName=Полное имя +lastName=Фамилия +familyName=Фамилия +password=Пароль +passwordConfirm=Подтверждение пароля +passwordNew=Новый пароль +username=Имя пользователя +address=Адрес +street=Улица +locality=Город +region=Регион +postal_code=Почтовый индекс +country=Страна +emailVerified=E-mail подтвержден +gssDelegationCredential=Делегирование учетных данных через GSS + +role_admin=Администратор +role_realm-admin=Администратор realm +role_create-realm=Создать realm +role_view-realm=Просмотр realm +role_view-users=Просмотр пользователей +role_view-applications=Просмотр приложений +role_view-clients=Просмотр клиентов +role_view-events=Просмотр событий +role_view-identity-providers=Просмотр провайдеров учетных записей +role_manage-realm=Управление realm +role_manage-users=Управление пользователями +role_manage-applications=Управление приложениями +role_manage-identity-providers=Управление провайдерами учетных записей +role_manage-clients=Управление клиентами +role_manage-events=Управление событиями +role_view-profile=Просмотр профиля +role_manage-account=Управление учетной записью +role_read-token=Чтение токена +role_offline-access=Доступ оффлайн +role_uma_authorization=Получение разрешений +client_account=Учетная запись +client_security-admin-console=Консоль администратора безопасности +client_admin-cli=Командный интерфейс администратора +client_realm-management=Управление Realm +client_broker=Брокер + + +requiredFields=Обязательные поля +allFieldsRequired=Все поля обязательны + +backToApplication=« Назад в приложение +backTo=Назад в {0} + +date=Дата +event=Событие +ip=IP +client=Клиент +clients=Клиенты +details=Детали +started=Начата +lastAccess=Последний доступ +expires=Истекает +applications=Приложения + +account=Учетная запись +federatedIdentity=Федеративный идентификатор +authenticator=Аутентификатор +sessions=Сессии +log=Журнал + +application=Приложение +availablePermissions=Доступные разрешения +grantedPermissions=Согласованные разрешения +grantedPersonalInfo=Согласованная персональная информация +additionalGrants=Дополнительные согласования +action=Действие +inResource=в +fullAccess=Полный доступ +offlineToken=Оффлайн токен +revoke=Отозвать согласование + +configureAuthenticators=Сконфигурированные аутентификаторы +mobile=Мобильное приложение +totpStep1=Установите FreeOTP или Google Authenticator. Оба приложения доступны на Google Play и в Apple App Store. +totpStep2=Откройте приложение и просканируйте баркод, либо введите ключ. +totpStep3=Введите одноразовый код, выданный приложением, и нажмите сохранить для завершения установки. + +missingUsernameMessage=Введите имя пользователя. +missingFirstNameMessage=Введите имя. +invalidEmailMessage=Введите корректный E-mail. +missingLastNameMessage=Введите фамилию. +missingEmailMessage=Введите E-mail. +missingPasswordMessage=Введите пароль. +notMatchPasswordMessage=Пароли не совпадают. + +missingTotpMessage=Введите код аутентификатора. +invalidPasswordExistingMessage=Существующий пароль неверный. +invalidPasswordConfirmMessage=Подтверждение пароля не совпадает. +invalidTotpMessage=Неверный код аутентификатора. + +usernameExistsMessage=Имя пользователя уже существует. +emailExistsMessage=E-mail уже существует. + +readOnlyUserMessage=Вы не можете обновить информацию вашей учетной записи, т.к. она доступна только для чтения. +readOnlyPasswordMessage=Вы не можете обновить пароль вашей учетной записи, т.к. он доступен только для чтения. + +successTotpMessage=Аутентификатор в мобильном приложении сконфигурирован. +successTotpRemovedMessage=Аутентификатор в мобильном приложении удален. + +successGrantRevokedMessage=Согласование отозвано успешно. + +accountUpdatedMessage=Ваша учетная запись обновлена. +accountPasswordUpdatedMessage=Ваша пароль обновлен. + +missingIdentityProviderMessage=Провайдер учетных записей не задан. +invalidFederatedIdentityActionMessage=Некорректное или недопустимое действие. +identityProviderNotFoundMessage=Заданный провайдер учетных записей не найден. +federatedIdentityLinkNotActiveMessage=Идентификатор больше не активен. +federatedIdentityRemovingLastProviderMessage=Вы не можете удалить последний федеративный идентификатор, т.к. Вы не имеете пароля. +identityProviderRedirectErrorMessage=Ошибка перенаправления в провайдер учетных записей. +identityProviderRemovedMessage=Провайдер учетных записей успешно удален. +identityProviderAlreadyLinkedMessage=Федеративный идентификатор, возвращенный {0} уже используется другим пользователем. +staleCodeAccountMessage=Страница устарела. Попробуйте еще раз. +consentDenied=В согласовании отказано. + +accountDisabledMessage=Учетная запись заблокирована, обратитесь к администратору. + +accountTemporarilyDisabledMessage=Учетная запись временно заблокирована, обратитесь к администратору или попробуйте позже. +invalidPasswordMinLengthMessage=Некорректный пароль: длина пароля должна быть не менее {0} символа(ов). +invalidPasswordMinLowerCaseCharsMessage=Некорректный пароль: пароль должен содержать не менее {0} символа(ов) в нижнем регистре. +invalidPasswordMinDigitsMessage=Некорректный пароль: пароль должен содержать не менее {0} цифр(ы). +invalidPasswordMinUpperCaseCharsMessage=Некорректный пароль: пароль должен содержать не менее {0} символа(ов) в верхнем регистре. +invalidPasswordMinSpecialCharsMessage=Некорректный пароль: пароль должен содержать не менее {0} спецсимвола(ов). +invalidPasswordNotUsernameMessage=Некорректный пароль: пароль не должен совпадать с именем пользователя. +invalidPasswordRegexPatternMessage=Некорректный пароль: пароль не удовлетворяет регулярному выражению. +invalidPasswordHistoryMessage=Некорректный пароль: пароль не должен совпадать с последним(и) {0} паролями. +invalidPasswordGenericMessage=Некорректный пароль: новый пароль не соответствует правилам пароля. + diff --git a/account/messages/messages_sv.properties b/account/messages/messages_sv.properties new file mode 100644 index 0000000..cc134cd --- /dev/null +++ b/account/messages/messages_sv.properties @@ -0,0 +1,150 @@ +# encoding: utf-8 +doSave=Spara +doCancel=Avbryt +doLogOutAllSessions=Logga ut från samtliga sessioner +doRemove=Ta bort +doAdd=Lägg till +doSignOut=Logga ut + +editAccountHtmlTitle=Redigera konto +federatedIdentitiesHtmlTitle=Federerade identiteter +accountLogHtmlTitle=Kontologg +changePasswordHtmlTitle=Byt lösenord +sessionsHtmlTitle=Sessioner +accountManagementTitle=Kontohantering för Keycloak +authenticatorTitle=Autentiserare +applicationsHtmlTitle=Applikationer + +authenticatorCode=Engångskod +email=E-post +firstName=Förnamn +lastName=Efternamn +password=Lösenord +passwordConfirm=Bekräftelse +passwordNew=Nytt lösenord +username=Användarnamn +address=Adress +street=Gata +locality=Postort +region=Stat, Provins eller Region +postal_code=Postnummer +country=Land +emailVerified=E-post verifierad +gssDelegationCredential=GSS Delegation Credential + +role_admin=Administratör +role_realm-admin=Realm-administratör +role_create-realm=Skapa realm +role_view-realm=Visa realm +role_view-users=Visa användare +role_view-applications=Visa applikationer +role_view-clients=Visa klienter +role_view-events=Visa event +role_view-identity-providers=Visa identitetsleverantörer +role_manage-realm=Hantera realm +role_manage-users=Hantera användare +role_manage-applications=Hantera applikationer +role_manage-identity-providers=Hantera identitetsleverantörer +role_manage-clients=Hantera klienter +role_manage-events=Hantera event +role_view-profile=Visa profil +role_manage-account=Hantera konto +role_read-token=Läs element +role_offline-access=Åtkomst offline +role_uma_authorization=Erhåll tillstånd +client_account=Konto +client_security-admin-console=Säkerhetsadministratörskonsol +client_admin-cli=Administratörs-CLI +client_realm-management=Realmhantering + + +requiredFields=Obligatoriska fält +allFieldsRequired=Samtliga fält krävs + +backToApplication=« Tillbaka till applikationen +backTo=Tillbaka till {0} + +date=Datum +event=Event +ip=IP +client=Klient +clients=Klienter +details=Detaljer +started=Startade +lastAccess=Senast åtkomst +expires=Upphör +applications=Applikationer + +account=Konto +federatedIdentity=Federerad identitet +authenticator=Autentiserare +sessions=Sessioner +log=Logg + +application=Applikation +availablePermissions=Tillgängliga rättigheter +grantedPermissions=Beviljade rättigheter +grantedPersonalInfo=Medgiven personlig information +additionalGrants=Ytterligare medgivanden +action=Åtgärd +inResource=i +fullAccess=Fullständig åtkomst +offlineToken=Offline token +revoke=Upphäv rättighet + +configureAuthenticators=Konfigurerade autentiserare +mobile=Mobil +totpStep1=Installera FreeOTP eller Google Authenticator på din enhet. Båda applikationerna finns tillgängliga på Google Play och Apple App Store. +totpStep2=Öppna applikationen och skanna streckkoden eller skriv i nyckeln. +totpStep3=Fyll i engångskoden som tillhandahålls av applikationen och klicka på Spara för att avsluta inställningarna. + +missingUsernameMessage=Vänligen ange användarnamn. +missingFirstNameMessage=Vänligen ange förnamn. +invalidEmailMessage=Ogiltig e-postadress. +missingLastNameMessage=Vänligen ange efternamn. +missingEmailMessage=Vänligen ange e-post. +missingPasswordMessage=Vänligen ange lösenord. +notMatchPasswordMessage=Lösenorden matchar inte. + +missingTotpMessage=Vänligen ange autentiseringskoden. +invalidPasswordExistingMessage=Det nuvarande lösenordet är ogiltigt. +invalidPasswordConfirmMessage=Lösenordsbekräftelsen matchar inte. +invalidTotpMessage=Autentiseringskoden är ogiltig. + +usernameExistsMessage=Användarnamnet finns redan. +emailExistsMessage=E-posten finns redan. + +readOnlyUserMessage=Du kan inte uppdatera ditt konto eftersom det är skrivskyddat. +readOnlyPasswordMessage=Du kan inte uppdatera ditt lösenord eftersom ditt konto är skrivskyddat. + +successTotpMessage=Mobilautentiseraren är inställd. +successTotpRemovedMessage=Mobilautentiseraren är borttagen. + +successGrantRevokedMessage=Upphävandet av rättigheten lyckades. + +accountUpdatedMessage=Ditt konto har uppdaterats. +accountPasswordUpdatedMessage=Ditt lösenord har uppdaterats. + +missingIdentityProviderMessage=Identitetsleverantör är inte angiven. +invalidFederatedIdentityActionMessage=Åtgärden är ogiltig eller saknas. +identityProviderNotFoundMessage=Angiven identitetsleverantör hittas inte. +federatedIdentityLinkNotActiveMessage=Den här identiteten är inte längre aktiv. +federatedIdentityRemovingLastProviderMessage=Du kan inte ta bort senaste federerade identiteten eftersom du inte har ett lösenord. +identityProviderRedirectErrorMessage=Misslyckades med att omdirigera till identitetsleverantör. +identityProviderRemovedMessage=Borttagningen av identitetsleverantören lyckades. +identityProviderAlreadyLinkedMessage=Den federerade identiteten som returnerades av {0} är redan länkad till en annan användare. +staleCodeAccountMessage=Sidan har upphört att gälla. Vänligen försök igen. +consentDenied=Samtycket förnekades. + +accountDisabledMessage=Kontot är inaktiverat, kontakta administratör. + +accountTemporarilyDisabledMessage=Kontot är tillfälligt inaktiverat, kontakta administratör eller försök igen senare. +invalidPasswordMinLengthMessage=Ogiltigt lösenord. Minsta längd är {0}. +invalidPasswordMinLowerCaseCharsMessage=Ogiltigt lösenord: måste innehålla minst {0} små bokstäver. +invalidPasswordMinDigitsMessage=Ogiltigt lösenord: måste innehålla minst {0} siffror. +invalidPasswordMinUpperCaseCharsMessage=Ogiltigt lösenord: måste innehålla minst {0} stora bokstäver. +invalidPasswordMinSpecialCharsMessage=Ogiltigt lösenord: måste innehålla minst {0} specialtecken. +invalidPasswordNotUsernameMessage=Ogiltigt lösenord: Får inte vara samma som användarnamnet. +invalidPasswordRegexPatternMessage=Ogiltigt lösenord: matchar inte kravet för lösenordsmönster. +invalidPasswordHistoryMessage=Ogiltigt lösenord: Får inte vara samma som de senaste {0} lösenorden. +invalidPasswordGenericMessage=Ogiltigt lösenord: Det nya lösenordet stämmer inte med lösenordspolicyn. \ No newline at end of file diff --git a/account/messages/messages_zh_CN.properties b/account/messages/messages_zh_CN.properties new file mode 100644 index 0000000..9e9a8a6 --- /dev/null +++ b/account/messages/messages_zh_CN.properties @@ -0,0 +1,166 @@ +# encoding: utf-8 +doSave=保存 +doCancel=取消 +doLogOutAllSessions=登出所有会话 +doRemove=删除 +doAdd=添加 +doSignOut=登出 + +editAccountHtmlTitle=编辑账户 +federatedIdentitiesHtmlTitle=链接的身份 +accountLogHtmlTitle=账户日志 +changePasswordHtmlTitle=更改密码 +sessionsHtmlTitle=会话 +accountManagementTitle=Keycloak账户管理 +authenticatorTitle=认证者 +applicationsHtmlTitle=应用 + +authenticatorCode=一次性认证码 +email=电子邮件 +firstName=名 +givenName=姓 +fullName=全名 +lastName=姓 +familyName=姓 +password=密码 +passwordConfirm=确认 +passwordNew=新密码 +username=用户名 +address=地址 +street=街道 +locality=城市住所 +region=省,自治区,直辖市 +postal_code=邮政编码 +country=国家 +emailVerified=验证过的Email +gssDelegationCredential=GSS Delegation Credential + +role_admin=管理员 +role_realm-admin=域管理员 +role_create-realm=创建域 +role_view-realm=查看域 +role_view-users=查看用户 +role_view-applications=查看应用 +role_view-clients=查看客户 +role_view-events=查看事件 +role_view-identity-providers=查看身份提供者 +role_manage-realm=管理域 +role_manage-users=管理用户 +role_manage-applications=管理应用 +role_manage-identity-providers=管理身份提供者 +role_manage-clients=管理客户 +role_manage-events=管理事件 +role_view-profile=查看用户信息 +role_manage-account=管理账户 +role_read-token=读取 token +role_offline-access=离线访问 +role_uma_authorization=获取授权 +client_account=账户 +client_security-admin-console=安全管理终端 +client_admin-cli=管理命令行 +client_realm-management=域管理 +client_broker=代理 + + +requiredFields=必填项 +allFieldsRequired=所有项必填 + +backToApplication=« 回到应用 +backTo=回到 {0} + +date=日期 +event=事件 +ip=IP +client=客户端 +clients=客户端 +details=详情 +started=开始 +lastAccess=最后一次访问 +expires=过期时间 +applications=应用 + +account=账户 +federatedIdentity=关联身份 +authenticator=认证方 +sessions=会话 +log=日志 + +application=应用 +availablePermissions=可用权限 +grantedPermissions=授予权限 +grantedPersonalInfo=授权的个人信息 +additionalGrants=可授予的权限 +action=操作 +inResource=in +fullAccess=所有权限 +offlineToken=离线 token +revoke=收回授权 + +configureAuthenticators=配置的认证者 +mobile=手机 +totpStep1=在你的设备上安装 FreeOTP 或者 Google Authenticator.两个应用可以从 Google Play 和 Apple App Store下载。 +totpStep2=打开应用扫描二维码输入验证码 +totpStep3=输入应用提供的一次性验证码单击保存 + +missingUsernameMessage=请指定用户名 +missingFirstNameMessage=请指定名 +invalidEmailMessage=无效的电子邮箱地址 +missingLastNameMessage=请指定姓 +missingEmailMessage=请指定邮件地址 +missingPasswordMessage=请输入密码 +notMatchPasswordMessage=密码不匹配 + +missingTotpMessage=请指定认证者代码 +invalidPasswordExistingMessage=无效的旧密码 +invalidPasswordConfirmMessage=确认密码不相符 +invalidTotpMessage=无效的认证码 + +usernameExistsMessage=用户名已经存在 +emailExistsMessage=电子邮箱已经存在 + +readOnlyUserMessage=无法修改账户,因为它是只读的。 +readOnlyPasswordMessage=不可以更该账户因为它是只读的。 + +successTotpMessage=手机认证者配置完毕 +successTotpRemovedMessage=手机认证者已删除 + +successGrantRevokedMessage=授权成功回收 + +accountUpdatedMessage=您的账户已经更新 +accountPasswordUpdatedMessage=您的密码已经修改 + +missingIdentityProviderMessage=身份提供者未指定 +invalidFederatedIdentityActionMessage=无效或者缺少操作 +identityProviderNotFoundMessage=指定的身份提供者未找到 +federatedIdentityLinkNotActiveMessage=这个身份不再使用了。 +federatedIdentityRemovingLastProviderMessage=你不可以移除最后一个身份提供者因为你没有设置密码 +identityProviderRedirectErrorMessage=尝试重定向到身份提供商失败 +identityProviderRemovedMessage=身份提供商成功删除 +identityProviderAlreadyLinkedMessage=链接的身份 {0} 已经连接到已有用户。 +staleCodeAccountMessage=页面过期。请再试一次。 +consentDenied=不同意 + +accountDisabledMessage=账户已经关闭,请联系管理员 + +accountTemporarilyDisabledMessage=账户暂时关闭,请联系管理员或稍后再试。 +invalidPasswordMinLengthMessage=无效的密码:最短长度 {0}. +invalidPasswordMinLowerCaseCharsMessage=无效的密码: 至少包含 {0} 小写字母。 +invalidPasswordMinDigitsMessage=无效的密码: 至少包含 {0} 数字。 +invalidPasswordMinUpperCaseCharsMessage=无效的密码: 至少包含 {0} 大写字母 +invalidPasswordMinSpecialCharsMessage=无效的密码: 至少包含 {0} 个特殊字符 +invalidPasswordNotUsernameMessage=无效的密码: 不能与用户名相同 +invalidPasswordRegexPatternMessage=无效的密码: 无法与正则表达式匹配 +invalidPasswordHistoryMessage=无效的密码: 不能与之前的{0} 个旧密码相同 +locale_ca=Català +locale_de=Deutsch +locale_en=English +locale_es=Español +locale_fr=Français +locale_it=Italian +locale_ja=日本語 +locale_nl=Nederlands +locale_no=Norsk +locale_lt=Lietuvių +locale_pt-BR=Português (Brasil) +locale_ru=Русский +locale_zh-CN=中文简体 diff --git a/account/password.ftl b/account/password.ftl new file mode 100644 index 0000000..79a132c --- /dev/null +++ b/account/password.ftl @@ -0,0 +1,33 @@ +<#import "template.ftl" as layout> +<@layout.mainLayout active='password' bodyClass='password'; section> +

${msg("changePasswordHtmlTitle")}

+
+ <#if password.passwordSet> +
+ + +
+ + + + +
+ + +
+ +
+ + +
+ +
+ +
+
+ + \ No newline at end of file diff --git a/account/resources/css/style.css b/account/resources/css/style.css new file mode 100644 index 0000000..59cca20 --- /dev/null +++ b/account/resources/css/style.css @@ -0,0 +1,161 @@ +nav { + position: fixed; + left: 0; + top: 0; + width: 250px; + height: 100%; + display: flex; + flex-direction: column; } + nav .sso-menu-switch { + color: white; + border: 1px solid white; + position: absolute; + right: 10px; + top: 10px; + font-size: 24px; + padding: 5px 15px; + display: none; } + nav header { + background: #343434; + text-align: center; + padding: 20px 0; } + nav header h1 { + margin: 0; } + nav .nav-current { + background: #343434; + display: flex; + justify-content: space-between; + align-items: center; } + nav .nav-current-item { + display: flex; + align-items: center; + color: white; + font-size: 16px; + margin: 5px 8px; } + nav .nav-current-item.logout { + font-size: 20px; } + nav .nav-current-subitem { + margin-left: 5px; + font-size: 12px; } + nav ul.nav-links { + margin: 0; + padding: 0; + list-style-type: none; + flex-grow: 1; + border-right: 5px solid #f3f3f3; } + nav ul.nav-links li { + box-sizing: border-box; + border-left: 0 solid transparent; + transition: 0.2s border-left-width; } + nav ul.nav-links li a { + display: block; + padding: 5px 8px; + text-decoration: none; + text-transform: uppercase; + color: #343434; } + nav ul.nav-links li:hover { + border-left: 4px solid transparent; } + nav ul.nav-links li.active { + border-left: 4px solid #f3c289; } + nav ul.nav-links li.active a { + color: #f3c289; } + nav .nav-created-by { + border-right: 5px solid #f3f3f3; + box-sizing: border-box; + padding: 8px; } + +.container { + position: absolute; + left: 250px; + right: 0; + top: 0; + box-sizing: border-box; + padding: 10px 15px; } + +.form-group { + box-sizing: border-box; + flex-basis: calc(50% - 10px); } + +form { + font-size: 14px; + display: flex; + flex-wrap: wrap; + justify-content: space-between; } + +input { + display: block; + line-height: normal; + box-sizing: border-box; + height: 2.4375rem; + padding: 0.5rem; + border: 1px solid #cacaca; + margin: 0 0 1rem; + font-family: inherit; + font-size: 1rem; + color: #0a0a0a; + background-color: #fefefe; + box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.1); + border-radius: 0; + transition: box-shadow 0.5s, border-color 0.25s ease-in-out; + -webkit-appearance: none; + -moz-appearance: none; } + input:focus { + border: 1px solid #8a8a8a; + background-color: #fefefe; + outline: none; + box-shadow: 0 0 5px #cacaca; + transition: box-shadow 0.5s, border-color 0.25s ease-in-out; } + +.sso-form-buttons { + display: flex; + flex-direction: row; + flex-wrap: wrap; + width: 100%; } + +.sso-form-buttons-flexibile { + width: auto; } + +.sso-form-button { + border: none; + color: white; + background: #f3c289; + padding: 10px 8px; + margin: 0 4px; + -webkit-appearance: none; + transition: 0.2s background; } + .sso-form-button:hover { + background: #be9568; + color: white; } + .sso-form-button:first-child { + margin-left: 0; } + .sso-form-button:last-child { + margin-right: 0; } + +.sso-form-button-primary { + background: #5cb85c; + flex-grow: 1; } + .sso-form-button-primary:hover { + background: #499249; } + +@media screen and (max-width: 968px) { + nav { + position: relative; + width: 100%; + height: auto; } + nav .sso-menu-switch { + display: block; } + nav .nav-links { + height: 0; + overflow: hidden; } + nav .nav-links.nav-links-shown { + height: auto; } + + .container { + position: relative; + width: 100%; + left: 0; } + + .form-group { + flex-basis: calc(100%); } } + +/*# sourceMappingURL=style.css.map */ diff --git a/account/resources/css/style.css.map b/account/resources/css/style.css.map new file mode 100644 index 0000000..2317ed8 --- /dev/null +++ b/account/resources/css/style.css.map @@ -0,0 +1,7 @@ +{ +"version": 3, +"mappings": "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", +"sources": ["style.sass"], +"names": [], +"file": "style.css" +} \ No newline at end of file diff --git a/account/resources/css/style.sass b/account/resources/css/style.sass new file mode 100644 index 0000000..9adcd30 --- /dev/null +++ b/account/resources/css/style.sass @@ -0,0 +1,165 @@ +nav + position: fixed + left: 0 + top: 0 + width: 250px + height: 100% + display: flex + flex-direction: column + .sso-menu-switch + color: white + border: 1px solid white + position: absolute + right: 10px + top: 10px + font-size: 24px + padding: 5px 15px + display: none + + header + background: #343434 + text-align: center + padding: 20px 0 + h1 + margin: 0 + .nav-current + background: #343434 + display: flex + justify-content: space-between + align-items: center + &-item + display: flex + align-items: center + color: white + font-size: 16px + margin: 5px 8px + &.logout + font-size: 20px + &-subitem + margin-left: 5px + font-size: 12px + + ul.nav-links + margin: 0 + padding: 0 + list-style-type: none + flex-grow: 1 + border-right: 5px solid #f3f3f3 + li + box-sizing: border-box + border-left: 0 solid transparent + transition: 0.2s border-left-width + a + display: block + padding: 5px 8px + text-decoration: none + text-transform: uppercase + color: #343434 + &:hover + border-left: 4px solid transparent + &.active + border-left: 4px solid #f3c289 + a + color: #f3c289 + + .nav-created-by + border-right: 5px solid #f3f3f3 + box-sizing: border-box + padding: 8px + +.container + position: absolute + left: 250px + right: 0 + top: 0 + box-sizing: border-box + padding: 10px 15px + +.form-group + box-sizing: border-box + flex-basis: calc(50% - 10px) + +form + font-size: 14px + display: flex + flex-wrap: wrap + justify-content: space-between + +input + display: block + line-height: normal + box-sizing: border-box + height: 2.4375rem + padding: .5rem + border: 1px solid #cacaca + margin: 0 0 1rem + font-family: inherit + font-size: 1rem + color: #0a0a0a + background-color: #fefefe + box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.1) + border-radius: 0 + transition: box-shadow 0.5s, border-color 0.25s ease-in-out + -webkit-appearance: none + -moz-appearance: none + &:focus + border: 1px solid #8a8a8a + background-color: #fefefe + outline: none + box-shadow: 0 0 5px #cacaca + transition: box-shadow 0.5s, border-color 0.25s ease-in-out + +.sso-form-buttons + display: flex + flex-direction: row + flex-wrap: wrap + width: 100% + +.sso-form-buttons-flexibile + width: auto + +.sso-form-button + border: none + color: white + background: #f3c289 + padding: 10px 8px + margin: 0 4px + -webkit-appearance: none + transition: 0.2s background + &:hover + background: #be9568 + color: white + + &:first-child + margin-left: 0 + + &:last-child + margin-right: 0 + +.sso-form-button-primary + background: #5cb85c + flex-grow: 1 + &:hover + background: #499249 + +@media screen and (max-width: 968px) + + nav + position: relative + width: 100% + height: auto + .sso-menu-switch + display: block + .nav-links + height: 0 + overflow: hidden + &.nav-links-shown + height: auto + + .container + position: relative + width: 100% + left: 0 + + .form-group + flex-basis: calc(100%) \ No newline at end of file diff --git a/account/resources/img/logo.svg b/account/resources/img/logo.svg new file mode 100644 index 0000000..a6dfc81 --- /dev/null +++ b/account/resources/img/logo.svg @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/account/resources/js/fontawesome_all.js b/account/resources/js/fontawesome_all.js new file mode 100644 index 0000000..3dbd3be --- /dev/null +++ b/account/resources/js/fontawesome_all.js @@ -0,0 +1,5 @@ +/*! + * Font Awesome Free 5.0.1 by @fontawesome - http://fontawesome.com + * License - http://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + */ +!function(){"use strict";function c(c){"function"==typeof s.hooks.addPack?s.hooks.addPack(c,m):s.styles[c]=r({},s.styles[c]||{},m)}var l={};try{"undefined"!=typeof window&&(l=window)}catch(c){}var h=(l.navigator||{}).userAgent,v=void 0===h?"":h,z=l,e=(~v.indexOf("MSIE")||v.indexOf("Trident/"),[1,2,3,4,5,6,7,8,9,10]),a=e.concat([11,12,13,14,15,16,17,18,19,20]),m=(["xs","sm","lg","fw","ul","li","border","pull-left","pull-right","spin","pulse","rotate-90","rotate-180","rotate-270","flip-horizontal","flip-vertical","stack","stack-1x","stack-2x","inverse","layers","layers-text","layers-counter"].concat(e.map(function(c){return c+"x"})).concat(a.map(function(c){return"w-"+c})),{"500px":[448,512,[],"f26e","M103.3 344.3c-6.5-14.2-6.9-18.3 7.4-23.1 25.6-8 8 9.2 43.2 49.2h.3v-93.9c1.2-50.2 44-92.2 97.7-92.2 53.9 0 97.7 43.5 97.7 96.8 0 63.4-60.8 113.2-128.5 93.3-10.5-4.2-2.1-31.7 8.5-28.6 53 0 89.4-10.1 89.4-64.4 0-61-77.1-89.6-116.9-44.6-23.5 26.4-17.6 42.1-17.6 157.6 50.7 31 118.3 22 160.4-20.1 24.8-24.8 38.5-58 38.5-93 0-35.2-13.8-68.2-38.8-93.3-24.8-24.8-57.8-38.5-93.3-38.5s-68.8 13.8-93.5 38.5c-.3.3-16 16.5-21.2 23.9l-.5.6c-3.3 4.7-6.3 9.1-20.1 6.1-6.9-1.7-14.3-5.8-14.3-11.8V20c0-5 3.9-10.5 10.5-10.5h241.3c8.3 0 8.3 11.6 8.3 15.1 0 3.9 0 15.1-8.3 15.1H130.3v132.9h.3c104.2-109.8 282.8-36 282.8 108.9 0 178.1-244.8 220.3-310.1 62.8zm63.3-260.8c-.5 4.2 4.6 24.5 14.6 20.6C306 56.6 384 144.5 390.6 144.5c4.8 0 22.8-15.3 14.3-22.8-93.2-89-234.5-57-238.3-38.2zM393 414.7C283 524.6 94 475.5 61 310.5c0-12.2-30.4-7.4-28.9 3.3 24 173.4 246 256.9 381.6 121.3 6.9-7.8-12.6-28.4-20.7-20.4zM213.6 306.6c0 4 4.3 7.3 5.5 8.5 3 3 6.1 4.4 8.5 4.4 3.8 0 2.6.2 22.3-19.5 19.6 19.3 19.1 19.5 22.3 19.5 5.4 0 18.5-10.4 10.7-18.2L265.6 284l18.2-18.2c6.3-6.8-10.1-21.8-16.2-15.7L249.7 268c-18.6-18.8-18.4-19.5-21.5-19.5-5 0-18 11.7-12.4 17.3L234 284c-18.1 17.9-20.4 19.2-20.4 22.6z"],"accessible-icon":[448,512,[],"f368","M423.9 255.8L411 413.1c-3.3 40.7-63.9 35.1-60.6-4.9l10-122.5-41.1 2.3c10.1 20.7 15.8 43.9 15.8 68.5 0 41.2-16.1 78.7-42.3 106.5l-39.3-39.3c57.9-63.7 13.1-167.2-74-167.2-25.9 0-49.5 9.9-67.2 26L73 243.2c22-20.7 50.1-35.1 81.4-40.2l75.3-85.7-42.6-24.8-51.6 46c-30 26.8-70.6-18.5-40.5-45.4l68-60.7c9.8-8.8 24.1-10.2 35.5-3.6 0 0 139.3 80.9 139.5 81.1 16.2 10.1 20.7 36 6.1 52.6L285.7 229l106.1-5.9c18.5-1.1 33.6 14.4 32.1 32.7zm-64.9-154c28.1 0 50.9-22.8 50.9-50.9C409.9 22.8 387.1 0 359 0c-28.1 0-50.9 22.8-50.9 50.9 0 28.1 22.8 50.9 50.9 50.9zM179.6 456.5c-80.6 0-127.4-90.6-82.7-156.1l-39.7-39.7C36.4 287 24 320.3 24 356.4c0 130.7 150.7 201.4 251.4 122.5l-39.7-39.7c-16 10.9-35.3 17.3-56.1 17.3z"],accusoft:[640,512,[],"f369","M482.2 372.1C476.5 365.2 250 75 242.3 65.5c-13.7-17.2 0-16.8 19.2-16.9 9.7-.1 106.3-.6 116.5-.6 24.1-.1 28.7.6 38.4 12.8 2.1 2.7 205.1 245.8 207.2 248.3 5.5 6.7 15.2 19.1 7.2 23.4-2.4 1.3-114.6 47.7-117.8 48.9-10.1 4-17.5 6.8-30.8-9.3m114.7-5.6s-115 50.4-117.5 51.6c-16 7.3-26.9-3.2-36.7-14.6l-57.1-74c-5.4-.9-60.4-9.6-65.3-9.3-3.1.2-9.6.8-14.4 2.9-4.9 2.1-145.2 52.8-150.2 54.7-5.1 2-11.4 3.6-11.1 7.6.2 2.5 2 2.6 4.6 3.5 2.7.8 300.9 67.6 308 69.1 15.6 3.3 38.5 10.5 53.6 1.7 2.1-1.2 123.8-76.4 125.8-77.8 5.4-4 4.3-6.8-1.7-8.2-2.3-.3-24.6-4.7-38-7.2m-326-181.3s-12 1.6-25 15.1c-9 9.3-242.1 239.1-243.4 240.9-7 10 1.6 6.8 15.7 1.7.8 0 114.5-36.6 114.5-36.6.5-.6-.1-.1.6-.6-.4-5.1-.8-26.2-1-27.7-.6-5.2 2.2-6.9 7-8.9l92.6-33.8c.6-.8 88.5-81.7 90.2-83.3v-1l-51.2-65.8"],adn:[496,512,[],"f170","M248 167.5l64.9 98.8H183.1l64.9-98.8zM496 256c0 136.9-111.1 248-248 248S0 392.9 0 256 111.1 8 248 8s248 111.1 248 248zm-99.8 82.7L248 115.5 99.8 338.7h30.4l33.6-51.7h168.6l33.6 51.7h30.2z"],adversal:[512,512,[],"f36a","M482.1 32H28.7C5.8 32 0 37.9 0 60.9v390.2C0 474.4 5.8 480 28.7 480h453.4c24.4 0 29.9-5.2 29.9-29.7V62.2c0-24.6-5.4-30.2-29.9-30.2zM178.4 220.3c-27.5-20.2-72.1-8.7-84.2 23.4-4.3 11.1-9.3 9.5-17.5 8.3-9.7-1.5-17.2-3.2-22.5-5.5-28.8-11.4 8.6-55.3 24.9-64.3 41.1-21.4 83.4-22.2 125.3-4.8 40.9 16.8 34.5 59.2 34.5 128.5 2.7 25.8-4.3 58.3 9.3 88.8 1.9 4.4.4 7.9-2.7 10.7-8.4 6.7-39.3 2.2-46.6-7.4-1.9-2.2-1.8-3.6-3.9-6.2-3.6-3.9-7.3-2.2-11.9 1-57.4 36.4-140.3 21.4-147-43.3-3.1-29.3 12.4-57.1 39.6-71 38.2-19.5 112.2-11.8 114-30.9 1.1-10.2-1.9-20.1-11.3-27.3zm286.7 222c0 15.1-11.1 9.9-17.8 9.9H52.4c-7.4 0-18.2 4.8-17.8-10.7.4-13.9 10.5-9.1 17.1-9.1 132.3-.4 264.5-.4 396.8 0 6.8 0 16.6-4.4 16.6 9.9zm3.8-340.5v291c0 5.7-.7 13.9-8.1 13.9-12.4-.4-27.5 7.1-36.1-5.6-5.8-8.7-7.8-4-12.4-1.2-53.4 29.7-128.1 7.1-144.4-85.2-6.1-33.4-.7-67.1 15.7-100 11.8-23.9 56.9-76.1 136.1-30.5v-71c0-26.2-.1-26.2 26-26.2 3.1 0 6.6.4 9.7 0 10.1-.8 13.6 4.4 13.6 14.3-.1.2-.1.3-.1.5zm-51.5 232.3c-19.5 47.6-72.9 43.3-90 5.2-15.1-33.3-15.5-68.2.4-101.5 16.3-34.1 59.7-35.7 81.5-4.8 20.6 28.8 14.9 84.6 8.1 101.1zm-294.8 35.3c-7.5-1.3-33-3.3-33.7-27.8-.4-13.9 7.8-23 19.8-25.8 24.4-5.9 49.3-9.9 73.7-14.7 8.9-2 7.4 4.4 7.8 9.5 1.4 33-26.1 59.2-67.6 58.8z"],affiliatetheme:[512,512,[],"f36b","M159.7 237.4C108.4 308.3 43.1 348.2 14 326.6-15.2 304.9 2.8 230 54.2 159.1c51.3-70.9 116.6-110.8 145.7-89.2 29.1 21.6 11.1 96.6-40.2 167.5zm351.2-57.3C437.1 303.5 319 367.8 246.4 323.7c-25-15.2-41.3-41.2-49-73.8-33.6 64.8-92.8 113.8-164.1 133.2 49.8 59.3 124.1 96.9 207 96.9 150 0 271.6-123.1 271.6-274.9.1-8.5-.3-16.8-1-25z"],algolia:[448,512,[],"f36c","M229.3 182.6c-49.3 0-89.2 39.9-89.2 89.2 0 49.3 39.9 89.2 89.2 89.2s89.2-39.9 89.2-89.2c0-49.3-40-89.2-89.2-89.2zm62.7 56.6l-58.9 30.6c-1.8.9-3.8-.4-3.8-2.3V201c0-1.5 1.3-2.7 2.7-2.6 26.2 1 48.9 15.7 61.1 37.1.7 1.3.2 3-1.1 3.7zM389.1 32H58.9C26.4 32 0 58.4 0 90.9V421c0 32.6 26.4 59 58.9 59H389c32.6 0 58.9-26.4 58.9-58.9V90.9C448 58.4 421.6 32 389.1 32zm-202.6 84.7c0-10.8 8.7-19.5 19.5-19.5h45.3c10.8 0 19.5 8.7 19.5 19.5v15.4c0 1.8-1.7 3-3.3 2.5-12.3-3.4-25.1-5.1-38.1-5.1-13.5 0-26.7 1.8-39.4 5.5-1.7.5-3.4-.8-3.4-2.5v-15.8zm-84.4 37l9.2-9.2c7.6-7.6 19.9-7.6 27.5 0l7.7 7.7c1.1 1.1 1 3-.3 4-6.2 4.5-12.1 9.4-17.6 14.9-5.4 5.4-10.4 11.3-14.8 17.4-1 1.3-2.9 1.5-4 .3l-7.7-7.7c-7.6-7.5-7.6-19.8 0-27.4zm127.2 244.8c-70 0-126.6-56.7-126.6-126.6s56.7-126.6 126.6-126.6c70 0 126.6 56.6 126.6 126.6 0 69.8-56.7 126.6-126.6 126.6z"],amazon:[448,512,[],"f270","M257.2 162.7c-48.7 1.8-169.5 15.5-169.5 117.5 0 109.5 138.3 114 183.5 43.2 6.5 10.2 35.4 37.5 45.3 46.8l56.8-56S341 288.9 341 261.4V114.3C341 89 316.5 32 228.7 32 140.7 32 94 87 94 136.3l73.5 6.8c16.3-49.5 54.2-49.5 54.2-49.5 40.7-.1 35.5 29.8 35.5 69.1zm0 86.8c0 80-84.2 68-84.2 17.2 0-47.2 50.5-56.7 84.2-57.8v40.6zm136 163.5c-7.7 10-70 67-174.5 67S34.2 408.5 9.7 379c-6.8-7.7 1-11.3 5.5-8.3C88.5 415.2 203 488.5 387.7 401c7.5-3.7 13.3 2 5.5 12zm39.8 2.2c-6.5 15.8-16 26.8-21.2 31-5.5 4.5-9.5 2.7-6.5-3.8s19.3-46.5 12.7-55c-6.5-8.3-37-4.3-48-3.2-10.8 1-13 2-14-.3-2.3-5.7 21.7-15.5 37.5-17.5 15.7-1.8 41-.8 46 5.7 3.7 5.1 0 27.1-6.5 43.1z"],amilia:[448,512,[],"f36d","M240.1 32c-61.9 0-131.5 16.9-184.2 55.4-5.1 3.1-9.1 9.2-7.2 19.4 1.1 5.1 5.1 27.4 10.2 39.6 4.1 10.2 14.2 10.2 20.3 6.1 32.5-22.3 96.5-47.7 152.3-47.7 57.9 0 58.9 28.4 58.9 73.1v38.5C203 227.7 78.2 251 46.7 264.2 11.2 280.5 16.3 357.7 16.3 376s15.2 104 124.9 104c47.8 0 113.7-20.7 153.3-42.1v25.4c0 3 2.1 8.2 6.1 9.1 3.1 1 50.7 2 59.9 2s62.5.3 66.5-.7c4.1-1 5.1-6.1 5.1-9.1V168c-.1-80.3-57.9-136-192-136zm-87.9 327.7c0-12.2-3-42.7 18.3-52.9 24.3-13.2 75.1-29.4 119.8-33.5V380c-21.4 13.2-48.7 24.4-79.1 24.4-52.8 0-58.9-33.5-59-44.7"],android:[448,512,[],"f17b","M89.6 204.5v115.8c0 15.4-12.1 27.7-27.5 27.7-15.3 0-30.1-12.4-30.1-27.7V204.5c0-15.1 14.8-27.5 30.1-27.5 15.1 0 27.5 12.4 27.5 27.5zm10.8 157c0 16.4 13.2 29.6 29.6 29.6h19.9l.3 61.1c0 36.9 55.2 36.6 55.2 0v-61.1h37.2v61.1c0 36.7 55.5 36.8 55.5 0v-61.1h20.2c16.2 0 29.4-13.2 29.4-29.6V182.1H100.4v179.4zm248-189.1H99.3c0-42.8 25.6-80 63.6-99.4l-19.1-35.3c-2.8-4.9 4.3-8 6.7-3.8l19.4 35.6c34.9-15.5 75-14.7 108.3 0L297.5 34c2.5-4.3 9.5-1.1 6.7 3.8L285.1 73c37.7 19.4 63.3 56.6 63.3 99.4zm-170.7-55.5c0-5.7-4.6-10.5-10.5-10.5-5.7 0-10.2 4.8-10.2 10.5s4.6 10.5 10.2 10.5c5.9 0 10.5-4.8 10.5-10.5zm113.4 0c0-5.7-4.6-10.5-10.2-10.5-5.9 0-10.5 4.8-10.5 10.5s4.6 10.5 10.5 10.5c5.6 0 10.2-4.8 10.2-10.5zm94.8 60.1c-15.1 0-27.5 12.1-27.5 27.5v115.8c0 15.4 12.4 27.7 27.5 27.7 15.4 0 30.1-12.4 30.1-27.7V204.5c0-15.4-14.8-27.5-30.1-27.5z"],angellist:[448,512,[],"f209","M347.1 215.4c11.7-32.6 45.4-126.9 45.4-157.1 0-26.6-15.7-48.9-43.7-48.9-44.6 0-84.6 131.7-97.1 163.1C242 144 196.6 0 156.6 0c-31.1 0-45.7 22.9-45.7 51.7 0 35.3 34.2 126.8 46.6 162-6.3-2.3-13.1-4.3-20-4.3-23.4 0-48.3 29.1-48.3 52.6 0 8.9 4.9 21.4 8 29.7-36.9 10-51.1 34.6-51.1 71.7C46 435.6 114.4 512 210.6 512c118 0 191.4-88.6 191.4-202.9 0-43.1-6.9-82-54.9-93.7zM311.7 108c4-12.3 21.1-64.3 37.1-64.3 8.6 0 10.9 8.9 10.9 16 0 19.1-38.6 124.6-47.1 148l-34-6 33.1-93.7zM142.3 48.3c0-11.9 14.5-45.7 46.3 47.1l34.6 100.3c-15.6-1.3-27.7-3-35.4 1.4-10.9-28.8-45.5-119.7-45.5-148.8zM140 244c29.3 0 67.1 94.6 67.1 107.4 0 5.1-4.9 11.4-10.6 11.4-20.9 0-76.9-76.9-76.9-97.7.1-7.7 12.7-21.1 20.4-21.1zm184.3 186.3c-29.1 32-66.3 48.6-109.7 48.6-59.4 0-106.3-32.6-128.9-88.3-17.1-43.4 3.8-68.3 20.6-68.3 11.4 0 54.3 60.3 54.3 73.1 0 4.9-7.7 8.3-11.7 8.3-16.1 0-22.4-15.5-51.1-51.4-29.7 29.7 20.5 86.9 58.3 86.9 26.1 0 43.1-24.2 38-42 3.7 0 8.3.3 11.7-.6 1.1 27.1 9.1 59.4 41.7 61.7 0-.9 2-7.1 2-7.4 0-17.4-10.6-32.6-10.6-50.3 0-28.3 21.7-55.7 43.7-71.7 8-6 17.7-9.7 27.1-13.1 9.7-3.7 20-8 27.4-15.4-1.1-11.2-5.7-21.1-16.9-21.1-27.7 0-120.6 4-120.6-39.7 0-6.7.1-13.1 17.4-13.1 32.3 0 114.3 8 138.3 29.1 18.1 16.1 24.3 113.2-31 174.7zm-98.6-126c9.7 3.1 19.7 4 29.7 6-7.4 5.4-14 12-20.3 19.1-2.8-8.5-6.2-16.8-9.4-25.1z"],angrycreative:[640,512,[],"f36e","M640 238.2l-3.2 28.2-34.5 2.3-2 18.1 34.5-2.3-3.2 28.2-34.4 2.2-2.3 20.1 34.4-2.2-3 26.1-64.7 4.1 12.7-113.2L527 365.2l-31.9 2-23.8-117.8 30.3-2 13.6 79.4 31.7-82.4 93.1-6.2zM426.8 371.5l28.3-1.8L468 249.6l-28.4 1.9-12.8 120zM162 388.1l-19.4-36-3.5 37.4-28.2 1.7 2.7-29.1c-11 18-32 34.3-56.9 35.8C23.9 399.9-3 377 .3 339.7c2.6-29.3 26.7-62.8 67.5-65.4 37.7-2.4 47.6 23.2 51.3 28.8l2.8-30.8 38.9-2.5c20.1-1.3 38.7 3.7 42.5 23.7l2.6-26.6 64.8-4.2-2.7 27.9-36.4 2.4-1.7 17.9 36.4-2.3-2.7 27.9-36.4 2.3-1.9 19.9 36.3-2.3-2.1 20.8 55-117.2 23.8-1.6L370.4 369l8.9-85.6-22.3 1.4 2.9-27.9 75-4.9-3 28-24.3 1.6-9.7 91.9-58 3.7-4.3-15.6-39.4 2.5-8 16.3-126.2 7.7zm-44.3-70.2l-26.4 1.7C84.6 307.2 76.9 303 65 303.8c-19 1.2-33.3 17.5-34.6 33.3-1.4 16 7.3 32.5 28.7 31.2 12.8-.8 21.3-8.6 28.9-18.9l27-1.7 2.7-29.8zm56.1-7.7c1.2-12.9-7.6-13.6-26.1-12.4l-2.7 28.5c14.2-.9 27.5-2.1 28.8-16.1zm21.1 70.8l5.8-60c-5 13.5-14.7 21.1-27.9 26.6l22.1 33.4zm135.4-45l-7.9-37.8-15.8 39.3 23.7-1.5zm-170.1-74.6l-4.3-17.5-39.6 2.6-8.1 18.2-31.9 2.1 57-121.9 23.9-1.6 30.7 102 9.9-104.7 27-1.8 37.8 63.6 6.5-66.6 28.5-1.9-4 41.2c7.4-13.5 22.9-44.7 63.6-47.5 40.5-2.8 52.4 29.3 53.4 30.3l3.3-32 39.3-2.7c12.7-.9 27.8.3 36.3 9.7l-4.4-11.9 32.2-2.2 12.9 43.2 23-45.7 31-2.2-43.6 78.4-4.8 44.3-28.4 1.9 4.8-44.3-15.8-43c1 22.3-9.2 40.1-32 49.6l25.2 38.8-36.4 2.4-19.2-36.8-4 38.3-28.4 1.9 3.3-31.5c-6.7 9.3-19.7 35.4-59.6 38-26.2 1.7-45.6-10.3-55.4-39.2l-4 40.3-25 1.6-37.6-63.3-6.3 66.2-56.8 3.7zm276.6-82.1c10.2-.7 17.5-2.1 21.6-4.3 4.5-2.4 7-6.4 7.6-12.1.6-5.3-.6-8.8-3.4-10.4-3.6-2.1-10.6-2.8-22.9-2l-2.9 28.8zM327.7 214c5.6 5.9 12.7 8.5 21.3 7.9 4.7-.3 9.1-1.8 13.3-4.1 5.5-3 10.6-8 15.1-14.3l-34.2 2.3 2.4-23.9 63.1-4.3 1.2-12-31.2 2.1c-4.1-3.7-7.8-6.6-11.1-8.1-4-1.7-8.1-2.8-12.2-2.5-8 .5-15.3 3.6-22 9.2-7.7 6.4-12 14.5-12.9 24.4-1.1 9.6 1.4 17.3 7.2 23.3zm-201.3 8.2l23.8-1.6-8.3-37.6-15.5 39.2z"],angular:[415,512,[],"f420","M169.7 268.1h76.2l-38.1-91.6-38.1 91.6zM207.8 32L0 106.4l31.8 275.7 176 97.9 176-97.9 31.8-275.7L207.8 32zM338 373.8h-48.6l-26.2-65.4H152.6l-26.2 65.4H77.7L207.8 81.5 338 373.8z"],"app-store":[512,512,[],"f36f","M255.9 120.9l9.1-15.7c5.6-9.8 18.1-13.1 27.9-7.5 9.8 5.6 13.1 18.1 7.5 27.9l-87.5 151.5h63.3c20.5 0 32 24.1 23.1 40.8H113.8c-11.3 0-20.4-9.1-20.4-20.4 0-11.3 9.1-20.4 20.4-20.4h52l66.6-115.4-20.8-36.1c-5.6-9.8-2.3-22.2 7.5-27.9 9.8-5.6 22.2-2.3 27.9 7.5l8.9 15.7zm-78.7 218l-19.6 34c-5.6 9.8-18.1 13.1-27.9 7.5-9.8-5.6-13.1-18.1-7.5-27.9l14.6-25.2c16.4-5.1 29.8-1.2 40.4 11.6zm168.9-61.7h53.1c11.3 0 20.4 9.1 20.4 20.4 0 11.3-9.1 20.4-20.4 20.4h-29.5l19.9 34.5c5.6 9.8 2.3 22.2-7.5 27.9-9.8 5.6-22.2 2.3-27.9-7.5-33.5-58.1-58.7-101.6-75.4-130.6-17.1-29.5-4.9-59.1 7.2-69.1 13.4 23 33.4 57.7 60.1 104zM256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8zm216 248c0 118.7-96.1 216-216 216-118.7 0-216-96.1-216-216 0-118.7 96.1-216 216-216 118.7 0 216 96.1 216 216z"],"app-store-ios":[448,512,[],"f370","M400 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zM127 384.5c-5.5 9.6-17.8 12.8-27.3 7.3-9.6-5.5-12.8-17.8-7.3-27.3l14.3-24.7c16.1-4.9 29.3-1.1 39.6 11.4L127 384.5zm138.9-53.9H84c-11 0-20-9-20-20s9-20 20-20h51l65.4-113.2-20.5-35.4c-5.5-9.6-2.2-21.8 7.3-27.3 9.6-5.5 21.8-2.2 27.3 7.3l8.9 15.4 8.9-15.4c5.5-9.6 17.8-12.8 27.3-7.3 9.6 5.5 12.8 17.8 7.3 27.3l-85.8 148.6h62.1c20.2 0 31.5 23.7 22.7 40zm98.1 0h-29l19.6 33.9c5.5 9.6 2.2 21.8-7.3 27.3-9.6 5.5-21.8 2.2-27.3-7.3-32.9-56.9-57.5-99.7-74-128.1-16.7-29-4.8-58 7.1-67.8 13.1 22.7 32.7 56.7 58.9 102h52c11 0 20 9 20 20 0 11.1-9 20-20 20z"],apper:[640,512,[],"f371","M42.1 239.1c22.2 0 29 2.8 33.5 14.6h.8v-22.9c0-11.3-4.8-15.4-17.9-15.4-11.3 0-14.4 2.5-15.1 12.8H4.8c.3-13.9 1.5-19.1 5.8-24.4C17.9 195 29.5 192 56.7 192c33 0 47.1 5 53.9 18.9 2 4.3 4 15.6 4 23.7v76.3H76.3l1.3-19.1h-1c-5.3 15.6-13.6 20.4-35.5 20.4-30.3 0-41.1-10.1-41.1-37.3 0-25.2 12.3-35.8 42.1-35.8zm17.1 48.1c13.1 0 16.9-3 16.9-13.4 0-9.1-4.3-11.6-19.6-11.6-13.1 0-17.9 3-17.9 12.1-.1 10.4 3.7 12.9 20.6 12.9zm77.8-94.9h38.3l-1.5 20.6h.8c9.1-17.1 15.9-20.9 37.5-20.9 14.4 0 24.7 3 31.5 9.1 9.8 8.6 12.8 20.4 12.8 48.1 0 30-3 43.1-12.1 52.9-6.8 7.3-16.4 10.1-33.2 10.1-20.4 0-29.2-5.5-33.8-21.2h-.8v70.3H137v-169zm80.9 60.7c0-27.5-3.3-32.5-20.7-32.5-16.9 0-20.7 5-20.7 28.7 0 28 3.5 33.5 21.2 33.5 16.4 0 20.2-5.6 20.2-29.7zm57.9-60.7h38.3l-1.5 20.6h.8c9.1-17.1 15.9-20.9 37.5-20.9 14.4 0 24.7 3 31.5 9.1 9.8 8.6 12.8 20.4 12.8 48.1 0 30-3 43.1-12.1 52.9-6.8 7.3-16.4 10.1-33.3 10.1-20.4 0-29.2-5.5-33.8-21.2h-.8v70.3h-39.5v-169zm80.9 60.7c0-27.5-3.3-32.5-20.7-32.5-16.9 0-20.7 5-20.7 28.7 0 28 3.5 33.5 21.2 33.5 16.4 0 20.2-5.6 20.2-29.7zm53.8-3.8c0-25.4 3.3-37.8 12.3-45.8 8.8-8.1 22.2-11.3 45.1-11.3 42.8 0 55.7 12.8 55.7 55.7v11.1h-75.3c-.3 2-.3 4-.3 4.8 0 16.9 4.5 21.9 20.1 21.9 13.9 0 17.9-3 17.9-13.9h37.5v2.3c0 9.8-2.5 18.9-6.8 24.7-7.3 9.8-19.6 13.6-44.3 13.6-27.5 0-41.6-3.3-50.6-12.3-8.5-8.5-11.3-21.3-11.3-50.8zm76.4-11.6c-.3-1.8-.3-3.3-.3-3.8 0-12.3-3.3-14.6-19.6-14.6-14.4 0-17.1 3-18.1 15.1l-.3 3.3h38.3zm55.6-45.3h38.3l-1.8 19.9h.7c6.8-14.9 14.4-20.2 29.7-20.2 10.8 0 19.1 3.3 23.4 9.3 5.3 7.3 6.8 14.4 6.8 34 0 1.5 0 5 .2 9.3h-35c.3-1.8.3-3.3.3-4 0-15.4-2-19.4-10.3-19.4-6.3 0-10.8 3.3-13.1 9.3-1 3-1 4.3-1 12.3v68h-38.3V192.3z"],apple:[448,512,[],"f179","M247.2 137.6c-6.2 1.9-15.3 3.5-27.9 4.6 1.1-56.7 29.9-96.6 88-110.1 9.3 41.6-26.1 94.1-60.1 105.5zm121.3 72.7c6.4-9.4 16.6-19.9 30.6-31.7-22.3-27.6-48.1-44.3-85.1-44.3-35.4 0-65.2 18.2-87 18.2-18.5 0-51.9-16.1-84.5-16.1-69.6 0-106.5 68.1-106.5 139C36 354.2 95.7 480 156.2 480c23.8 0 45.2-18 73.5-18 29.3 0 52.8 17.2 80.3 17.2 46 0 88.6-77.5 102-119.7-46.8-14.3-84.4-90.2-43.5-149.2z"],"apple-pay":[640,512,[],"f415","M116.9 158.5c-7.5 8.9-19.5 15.9-31.5 14.9-1.5-12 4.4-24.8 11.3-32.6 7.5-9.1 20.6-15.6 31.3-16.1 1.2 12.4-3.7 24.7-11.1 33.8m10.9 17.2c-17.4-1-32.3 9.9-40.5 9.9-8.4 0-21-9.4-34.8-9.1-17.9.3-34.5 10.4-43.6 26.5-18.8 32.3-4.9 80 13.3 106.3 8.9 13 19.5 27.3 33.5 26.8 13.3-.5 18.5-8.6 34.5-8.6 16.1 0 20.8 8.6 34.8 8.4 14.5-.3 23.6-13 32.5-26 10.1-14.8 14.3-29.1 14.5-29.9-.3-.3-28-10.9-28.3-42.9-.3-26.8 21.9-39.5 22.9-40.3-12.5-18.6-32-20.6-38.8-21.1m100.4-36.2v194.9h30.3v-66.6h41.9c38.3 0 65.1-26.3 65.1-64.3s-26.4-64-64.1-64h-73.2zm30.3 25.5h34.9c26.3 0 41.3 14 41.3 38.6s-15 38.8-41.4 38.8h-34.8V165zm162.2 170.9c19 0 36.6-9.6 44.6-24.9h.6v23.4h28v-97c0-28.1-22.5-46.3-57.1-46.3-32.1 0-55.9 18.4-56.8 43.6h27.3c2.3-12 13.4-19.9 28.6-19.9 18.5 0 28.9 8.6 28.9 24.5v10.8l-37.8 2.3c-35.1 2.1-54.1 16.5-54.1 41.5.1 25.2 19.7 42 47.8 42zm8.2-23.1c-16.1 0-26.4-7.8-26.4-19.6 0-12.3 9.9-19.4 28.8-20.5l33.6-2.1v11c0 18.2-15.5 31.2-36 31.2zm102.5 74.6c29.5 0 43.4-11.3 55.5-45.4L640 193h-30.8l-35.6 115.1h-.6L537.4 193h-31.6L557 334.9l-2.8 8.6c-4.6 14.6-12.1 20.3-25.5 20.3-2.4 0-7-.3-8.9-.5v23.4c1.8.4 9.3.7 11.6.7z"],asymmetrik:[576,512,[],"f372","M517.5 309.2c38.8-40 58.1-80 58.5-116.1.8-65.5-59.4-118.2-169.4-135C277.9 38.4 118.1 73.6 0 140.5 52 114 110.6 92.3 170.7 82.3c74.5-20.5 153-25.4 221.3-14.8C544.5 91.3 588.8 195 490.8 299.2c-10.2 10.8-22 21.1-35 30.6L304.9 103.4 114.7 388.9c-65.6-29.4-76.5-90.2-19.1-151.2 20.8-22.2 48.3-41.9 79.5-58.1 20-12.2 39.7-22.6 62-30.7-65.1 20.3-122.7 52.9-161.6 92.9-27.7 28.6-41.4 57.1-41.7 82.9-.5 35.1 23.4 65.1 68.4 83l-34.5 51.7h101.6l22-34.4c22.2 1 45.3 0 68.6-2.7l-22.8 37.1h135.5L340 406.3c18.6-5.3 36.9-11.5 54.5-18.7l45.9 71.8H542L468.6 349c18.5-12.1 35-25.5 48.9-39.8zm-187.6 80.5l-25-40.6-32.7 53.3c-23.4 3.5-46.7 5.1-69.2 4.4l101.9-159.3 78.7 123c-17.2 7.4-35.3 13.9-53.7 19.2z"],audible:[640,512,[],"f373","M640 199.9v54l-320 200L0 254v-54l320 200 320-200.1zm-194.5 72l47.1-29.4c-37.2-55.8-100.7-92.6-172.7-92.6-72 0-135.5 36.7-172.6 92.4h.3c2.5-2.3 5.1-4.5 7.7-6.7 89.7-74.4 219.4-58.1 290.2 36.3zm-220.1 18.8c16.9-11.9 36.5-18.7 57.4-18.7 34.4 0 65.2 18.4 86.4 47.6l45.4-28.4c-20.9-29.9-55.6-49.5-94.8-49.5-38.9 0-73.4 19.4-94.4 49zM103.6 161.1c131.8-104.3 318.2-76.4 417.5 62.1l.7 1 48.8-30.4C517.1 112.1 424.8 58.1 319.9 58.1c-103.5 0-196.6 53.5-250.5 135.6 9.9-10.5 22.7-23.5 34.2-32.6zm467 32.7z"],autoprefixer:[640,512,[],"f41c","M318.4 16l-161 480h77.5l25.4-81.4h119.5L405 496h77.5L318.4 16zm-40.3 341.9l41.2-130.4h1.5l40.9 130.4h-83.6zM640 405l-10-31.4L462.1 358l19.4 56.5L640 405zm-462.1-47L10 373.7 0 405l158.5 9.4 19.4-56.4z"],avianex:[512,512,[],"f374","M453.1 32h-312c-38.9 0-76.2 31.2-83.3 69.7L1.2 410.3C-5.9 448.8 19.9 480 58.9 480h312c38.9 0 76.2-31.2 83.3-69.7l56.7-308.5c7-38.6-18.8-69.8-57.8-69.8zm-58.2 347.3l-32 13.5-115.4-110c-14.7 10-29.2 19.5-41.7 27.1l22.1 64.2-17.9 12.7-40.6-61-52.4-48.1 15.7-15.4 58 31.1c9.3-10.5 20.8-22.6 32.8-34.9L203 228.9l-68.8-99.8 18.8-28.9 8.9-4.8L265 207.8l4.9 4.5c19.4-18.8 33.8-32.4 33.8-32.4 7.7-6.5 21.5-2.9 30.7 7.9 9 10.5 10.6 24.7 2.7 31.3-1.8 1.3-15.5 11.4-35.3 25.6l4.5 7.3 94.9 119.4-6.3 7.9z"],aviato:[640,512,[],"f421","M107.2 283.5l-19-41.8H36.1l-19 41.8H0l62.2-131.4 62.2 131.4h-17.2zm-45-98.1l-19.6 42.5h39.2l-19.6-42.5zm112.7 102.4l-62.2-131.4h17.1l45.1 96 45.1-96h17l-62.1 131.4zm80.6-4.3V156.4H271v127.1h-15.5zm209.1-115.6v115.6h-17.3V167.9h-41.2v-11.5h99.6v11.5h-41.1zM640 218.8c0 9.2-1.7 17.8-5.1 25.8-3.4 8-8.2 15.1-14.2 21.1-6 6-13.1 10.8-21.1 14.2-8 3.4-16.6 5.1-25.8 5.1s-17.8-1.7-25.8-5.1c-8-3.4-15.1-8.2-21.1-14.2-6-6-10.8-13-14.2-21.1-3.4-8-5.1-16.6-5.1-25.8s1.7-17.8 5.1-25.8c3.4-8 8.2-15.1 14.2-21.1 6-6 13-8.4 21.1-11.9 8-3.4 16.6-5.1 25.8-5.1s17.8 1.7 25.8 5.1c8 3.4 15.1 5.8 21.1 11.9 6 6 10.7 13.1 14.2 21.1 3.4 8 5.1 16.6 5.1 25.8zm-15.5 0c0-7.3-1.3-14-3.9-20.3-2.6-6.3-6.2-11.7-10.8-16.3-4.6-4.6-10-8.2-16.2-10.9-6.2-2.7-12.8-4-19.8-4s-13.6 1.3-19.8 4c-6.2 2.7-11.6 6.3-16.2 10.9-4.6 4.6-8.2 10-10.8 16.3-2.6 6.3-3.9 13.1-3.9 20.3 0 7.3 1.3 14 3.9 20.3 2.6 6.3 6.2 11.7 10.8 16.3 4.6 4.6 10 8.2 16.2 10.9 6.2 2.7 12.8 4 19.8 4s13.6-1.3 19.8-4c6.2-2.7 11.6-6.3 16.2-10.9 4.6-4.6 8.2-10 10.8-16.3 2.6-6.3 3.9-13.1 3.9-20.3zm-94.8 96.7v-6.3l88.9-10-242.9 13.4c.6-2.2 1.1-4.6 1.4-7.2.3-2 .5-4.2.6-6.5l64.8-8.1-64.9 1.9c0-.4-.1-.7-.1-1.1-2.8-17.2-25.5-23.7-25.5-23.7l-1.1-26.3h23.8l19 41.8h17.1L348.6 152l-62.2 131.4h17.1l19-41.8h23.6L345 268s-22.7 6.5-25.5 23.7c-.1.3-.1.7-.1 1.1l-64.9-1.9 64.8 8.1c.1 2.3.3 4.4.6 6.5.3 2.6.8 5 1.4 7.2L78.4 299.2l88.9 10v6.3c-5.9.9-10.5 6-10.5 12.2 0 6.8 5.6 12.4 12.4 12.4 6.8 0 12.4-5.6 12.4-12.4 0-6.2-4.6-11.3-10.5-12.2v-5.8l80.3 9v5.4c-5.7 1.1-9.9 6.2-9.9 12.1 0 6.8 5.6 10.2 12.4 10.2 6.8 0 12.4-3.4 12.4-10.2 0-6-4.3-11-9.9-12.1v-4.9l28.4 3.2v23.7h-5.9V360h5.9v-6.6h5v6.6h5.9v-13.8h-5.9V323l38.3 4.3c8.1 11.4 19 13.6 19 13.6l-.1 6.7-5.1.2-.1 12.1h4.1l.1-5h5.2l.1 5h4.1l-.1-12.1-5.1-.2-.1-6.7s10.9-2.1 19-13.6l38.3-4.3v23.2h-5.9V360h5.9v-6.6h5v6.6h5.9v-13.8h-5.9v-23.7l28.4-3.2v4.9c-5.7 1.1-9.9 6.2-9.9 12.1 0 6.8 5.6 10.2 12.4 10.2 6.8 0 12.4-3.4 12.4-10.2 0-6-4.3-11-9.9-12.1v-5.4l80.3-9v5.8c-5.9.9-10.5 6-10.5 12.2 0 6.8 5.6 12.4 12.4 12.4 6.8 0 12.4-5.6 12.4-12.4-.2-6.3-4.7-11.4-10.7-12.3zm-200.8-87.6l19.6-42.5 19.6 42.5h-17.9l-1.7-40.3-1.7 40.3h-17.9z"],aws:[512,512,[],"f375","M261.2 136.1c-14 57.5-13.1 54.4-25.8 107-1.6 6.5-4.1 8.4-10.7 8.5h-14.4c-5.8-.1-8.2-1.6-9.9-7.3-12.3-39.4-28.8-94.1-39.9-130.7-4.1-13.5-1.4-13.2 9.3-12.9 3.7.1 7.3 0 11 0 5.1.1 7.7 2 9.1 7.1 3.6 12.9 6 22.8 26.6 104.1.4 1.6.9 3.1 1.4 4.6h1.1c.5-2 1.1-3.9 1.6-5.9 7.8-32.9 15.5-65.9 23.3-98.8 2.4-10.2 6.7-11.2 17-11.2h7.6c6.9.1 9 1.5 10.7 8.3 6 23.4 23.5 101.8 26.7 110.4 5.1-18.3-1.8 7.9 28.5-109 2.1-8.1 4.1-9.7 12.3-9.7h12.7c5.4.1 7 1.8 5.7 7.1-2.4 9.5-2.9 9.9-41.3 132.9-3.1 9.9-4.2 10.8-14.6 10.8h-10.6c-7.3 0-9.2-1.3-11-8.4-4.3-16.2-23.3-95.7-26.4-106.9zM125.4 247.3c4.2 5.8 8.1 6.3 14.1 2.4l6.3-4.2c6.8-4.5 7.3-6.3 3.6-13.5-4.3-8.4-6.4-17.3-6.3-26.9 0-3.1.6-55.7-.9-66.8-2.7-19.3-12.5-32.8-31.7-38.7-10.7-3.4-21.7-3.3-32.7-3-15.1.4-29.4 4.6-42.8 11.4-1.8.9-3.7 3.1-4.1 4.9-.8 3.9-1.1 8.1-.7 12.1.6 5.9 2.6 7 8.2 5.1 5.1-1.7 10-3.9 15.1-5.4 14.5-4.4 29.2-6.4 44.1-1.7 7.1 2.2 11.7 6.9 14.3 13.8 3 7.9 2.4 16.1 2.4 24.2 0 5.5-.1 5.5-5.5 4.5-13.9-2.6-27.7-5-41.9-3.1-15.2 2.1-28.6 7.3-38.2 20-9.1 12-10 25.6-7.4 39.5 2.8 15 11.8 25.7 26.4 30.4 20.6 6.7 40.1 3.3 57.7-9.5 3.8-2.8 7.2-6.2 11.1-9.5 3.1 5 5.8 9.7 8.9 14zm-15.3-61.6c3 .4 4.5 1.9 4.3 5.1-.2 3.8.1 7.6-.3 11.4-1.2 11.7-7.7 19.7-17.9 24.9-8.2 4.2-16.9 5.8-26.1 5-15.2-1.3-21-13.1-19.6-26.3C51.8 193.2 59 186.2 72 184c13.8-2.4 16-1.1 38.1 1.7zm348.8 65.1c21.3-8.6 32.9-26.2 29.2-50-2.2-14.6-11.8-24.2-25.2-29.5-14.7-5.9-33.8-10.3-48.1-18.2-4.4-2.4-7.4-6.3-7.6-11.9-.4-11.1 4.2-17.2 15.4-19.8 9.3-2.1 18.8-2.2 28.1-.4 7.3 1.4 14.3 4.2 21.4 6.3 2.8.9 5.9 2.1 7.8-1.6 3.8-7.3.4-18.7-7.3-21.8-22.5-9-45.5-11.6-68.2-1.6-14.6 6.4-24.6 17.4-26 34.2-1.6 19.3 6.9 33.4 24.1 41.7 7.7 3.7 16.1 5.9 24.2 8.9 8.1 3 16.2 5.8 24.1 9.1 12.3 5.3 11.6 24.2 1.2 30-27.7 15.3-64.9-2.4-69.2-3.8-3.3-1.1-5.3.2-6.3 3.7-3 11.3.7 18.8 11.6 22.7 21.7 7.9 49.6 10.5 70.8 2zM296 413.5c50.8-5.8 98.7-20.8 142.7-47 8-4.7 15.5-10.3 23.1-15.7 7.3-5.2 3.2-18.4-11.3-12.2-54.4 23.2-111.2 36.1-170.2 38.9-30.5 1.5-60.8-.3-91.1-4.7-63.1-9.2-122.4-29.2-177.6-61.2-2.1-1.2-4.2-2.5-6.5-3-4.9-1.1-7.7 4.7-2.4 9.7 24 22.1 50.3 40.8 79.1 55.7 53.7 27.7 110.5 42.7 171.2 42 14.4-.8 28.8-.9 43-2.5zm174.7-92.2c14.8.8 19.4 5.9 15.7 20.2-3.8 14.8-9.3 29.2-13.9 43.8-.9 2.9-4.2 6.3-.8 8.8 3.7 2.6 6.5-1 9-3.3 10.2-9.5 17.4-21 22.5-33.8 5.4-13.4 9.3-27.2 8.7-41.9-.2-6.2-1.8-8.8-7.8-10.5-5.4-1.5-11-2.8-16.5-3.2-21.6-1.8-42.5.5-62 10.6-3.1 1.6-6 3.7-8.7 5.9-1.1.9-3.2 5.3 2.4 6.1 1.9.3 3.9-.1 5.9-.3 16.9-1.6 28.6-3.3 45.5-2.4z"],bandcamp:[496,512,[],"f2d5","M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm48.2 326.1h-181L199.9 178h181l-84.7 156.1z"],behance:[576,512,[],"f1b4","M232 237.2c31.8-15.2 48.4-38.2 48.4-74 0-70.6-52.6-87.8-113.3-87.8H0v354.4h171.8c64.4 0 124.9-30.9 124.9-102.9 0-44.5-21.1-77.4-64.7-89.7zM77.9 135.9H151c28.1 0 53.4 7.9 53.4 40.5 0 30.1-19.7 42.2-47.5 42.2h-79v-82.7zm83.3 233.7H77.9V272h84.9c34.3 0 56 14.3 56 50.6 0 35.8-25.9 47-57.6 47zm358.5-240.7H376V94h143.7v34.9zM576 305.2c0-75.9-44.4-139.2-124.9-139.2-78.2 0-131.3 58.8-131.3 135.8 0 79.9 50.3 134.7 131.3 134.7 61.3 0 101-27.6 120.1-86.3H509c-6.7 21.9-34.3 33.5-55.7 33.5-41.3 0-63-24.2-63-65.3h185.1c.3-4.2.6-8.7.6-13.2zM390.4 274c2.3-33.7 24.7-54.8 58.5-54.8 35.4 0 53.2 20.8 56.2 54.8H390.4z"],"behance-square":[512,512,[],"f1b5","M186.5 293c0 19.3-14 25.4-31.2 25.4h-45.1v-52.9h46c18.6.1 30.3 7.8 30.3 27.5zm-7.7-82.3c0-17.7-13.7-21.9-28.9-21.9h-39.6v44.8H153c15.1 0 25.8-6.6 25.8-22.9zm132.3 23.2c-18.3 0-30.5 11.4-31.7 29.7h62.2c-1.7-18.5-11.3-29.7-30.5-29.7zM448 80v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V80c0-26.5 21.5-48 48-48h352c26.5 0 48 21.5 48 48zM271.7 185h77.8v-18.9h-77.8V185zm-43 110.3c0-24.1-11.4-44.9-35-51.6 17.2-8.2 26.2-17.7 26.2-37 0-38.2-28.5-47.5-61.4-47.5H68v192h93.1c34.9-.2 67.6-16.9 67.6-55.9zM380 280.5c0-41.1-24.1-75.4-67.6-75.4-42.4 0-71.1 31.8-71.1 73.6 0 43.3 27.3 73 71.1 73 33.2 0 54.7-14.9 65.1-46.8h-33.7c-3.7 11.9-18.6 18.1-30.2 18.1-22.4 0-34.1-13.1-34.1-35.3h100.2c.1-2.3.3-4.8.3-7.2z"],bimobject:[448,512,[],"f378","M416 32H32C14.4 32 0 46.4 0 64v384c0 17.6 14.4 32 32 32h384c17.6 0 32-14.4 32-32V64c0-17.6-14.4-32-32-32zm-64 257.4c0 49.4-11.4 82.6-103.8 82.6h-16.9c-44.1 0-62.4-14.9-70.4-38.8h-.9V368H96V136h64v74.7h1.1c4.6-30.5 39.7-38.8 69.7-38.8h17.3c92.4 0 103.8 33.1 103.8 82.5v35zm-64-28.9v22.9c0 21.7-3.4 33.8-38.4 33.8h-45.3c-28.9 0-44.1-6.5-44.1-35.7v-19c0-29.3 15.2-35.7 44.1-35.7h45.3c35-.2 38.4 12 38.4 33.7z"],bitbucket:[512,512,[],"f171","M23.1 32C14.2 31.9 7 38.9 6.9 47.8c0 .9.1 1.8.2 2.8L74.9 462c1.7 10.4 10.7 18 21.2 18.1h325.1c7.9.1 14.7-5.6 16-13.4l67.8-416c1.4-8.7-4.5-16.9-13.2-18.3-.9-.1-1.8-.2-2.8-.2L23.1 32zm285.3 297.3H204.6l-28.1-146.8h157l-25.1 146.8z"],bitcoin:[512,512,[],"f379","M504 256c0 136.967-111.033 248-248 248S8 392.967 8 256 119.033 8 256 8s248 111.033 248 248zm-141.651-35.33c4.937-32.999-20.191-50.739-54.55-62.573l11.146-44.702-27.213-6.781-10.851 43.524c-7.154-1.783-14.502-3.464-21.803-5.13l10.929-43.81-27.198-6.781-11.153 44.686c-5.922-1.349-11.735-2.682-17.377-4.084l.031-.14-37.53-9.37-7.239 29.062s20.191 4.627 19.765 4.913c11.022 2.751 13.014 10.044 12.68 15.825l-12.696 50.925c.76.194 1.744.473 2.829.907-.907-.225-1.876-.473-2.876-.713l-17.796 71.338c-1.349 3.348-4.767 8.37-12.471 6.464.271.395-19.78-4.937-19.78-4.937l-13.51 31.147 35.414 8.827c6.588 1.651 13.045 3.379 19.4 5.006l-11.262 45.213 27.182 6.781 11.153-44.733a1038.209 1038.209 0 0 0 21.687 5.627l-11.115 44.523 27.213 6.781 11.262-45.128c46.404 8.781 81.299 5.239 95.986-36.727 11.836-33.79-.589-53.281-25.004-65.991 17.78-4.098 31.174-15.792 34.747-39.949zm-62.177 87.179c-8.41 33.79-65.308 15.523-83.755 10.943l14.944-59.899c18.446 4.603 77.6 13.717 68.811 48.956zm8.417-87.667c-7.673 30.736-55.031 15.12-70.393 11.292l13.548-54.327c15.363 3.828 64.836 10.973 56.845 43.035z"],bity:[496,512,[],"f37a","M78.4 67.2C173.8-22 324.5-24 421.5 71c14.3 14.1-6.4 37.1-22.4 21.5-84.8-82.4-215.8-80.3-298.9-3.2-16.3 15.1-36.5-8.3-21.8-22.1zm98.9 418.6c19.3 5.7 29.3-23.6 7.9-30C73 421.9 9.4 306.1 37.7 194.8c5-19.6-24.9-28.1-30.2-7.1-32.1 127.4 41.1 259.8 169.8 298.1zm148.1-2c121.9-40.2 192.9-166.9 164.4-291-4.5-19.7-34.9-13.8-30 7.9 24.2 107.7-37.1 217.9-143.2 253.4-21.2 7-10.4 36 8.8 29.7zm-62.9-79l.2-71.8c0-8.2-6.6-14.8-14.8-14.8-8.2 0-14.8 6.7-14.8 14.8l-.2 71.8c0 8.2 6.6 14.8 14.8 14.8s14.8-6.6 14.8-14.8zm71-269c2.1 90.9 4.7 131.9-85.5 132.5-92.5-.7-86.9-44.3-85.5-132.5 0-21.8-32.5-19.6-32.5 0v71.6c0 69.3 60.7 90.9 118 90.1 57.3.8 118-20.8 118-90.1v-71.6c0-19.6-32.5-21.8-32.5 0z"],"black-tie":[448,512,[],"f27e","M0 32v448h448V32H0zm316.5 325.2L224 445.9l-92.5-88.7 64.5-184-64.5-86.6h184.9L252 173.2l64.5 184z"],blackberry:[512,512,[],"f37b","M166 116.9c0 23.4-16.4 49.1-72.5 49.1H23.4l21-88.8h67.8c42.1 0 53.8 23.3 53.8 39.7zm126.2-39.7h-67.8L205.7 166h70.1c53.8 0 70.1-25.7 70.1-49.1.1-16.4-11.6-39.7-53.7-39.7zM88.8 208.1H21L0 296.9h70.1c56.1 0 72.5-23.4 72.5-49.1 0-16.3-11.7-39.7-53.8-39.7zm180.1 0h-67.8l-18.7 88.8h70.1c53.8 0 70.1-23.4 70.1-49.1 0-16.3-11.7-39.7-53.7-39.7zm189.3-53.8h-67.8l-18.7 88.8h70.1c53.8 0 70.1-23.4 70.1-49.1.1-16.3-11.6-39.7-53.7-39.7zm-28 137.9h-67.8L343.7 381h70.1c56.1 0 70.1-23.4 70.1-49.1 0-16.3-11.6-39.7-53.7-39.7zM240.8 346H173l-18.7 88.8h70.1c56.1 0 70.1-25.7 70.1-49.1.1-16.3-11.6-39.7-53.7-39.7z"],blogger:[448,512,[],"f37c","M162.4 196c4.8-4.9 6.2-5.1 36.4-5.1 27.2 0 28.1.1 32.1 2.1 5.8 2.9 8.3 7 8.3 13.6 0 5.9-2.4 10-7.6 13.4-2.8 1.8-4.5 1.9-31.1 2.1-16.4.1-29.5-.2-31.5-.8-10.3-2.9-14.1-17.7-6.6-25.3zm61.4 94.5c-53.9 0-55.8.2-60.2 4.1-3.5 3.1-5.7 9.4-5.1 13.9.7 4.7 4.8 10.1 9.2 12 2.2 1 14.1 1.7 56.3 1.2l47.9-.6 9.2-1.5c9-5.1 10.5-17.4 3.1-24.4-5.3-4.7-5-4.7-60.4-4.7zm223.4 130.1c-3.5 28.4-23 50.4-51.1 57.5-7.2 1.8-9.7 1.9-172.9 1.8-157.8 0-165.9-.1-172-1.8-8.4-2.2-15.6-5.5-22.3-10-5.6-3.8-13.9-11.8-17-16.4-3.8-5.6-8.2-15.3-10-22C.1 423 0 420.3 0 256.3 0 93.2 0 89.7 1.8 82.6 8.1 57.9 27.7 39 53 33.4c7.3-1.6 332.1-1.9 340-.3 21.2 4.3 37.9 17.1 47.6 36.4 7.7 15.3 7-1.5 7.3 180.6.2 115.8 0 164.5-.7 170.5zm-85.4-185.2c-1.1-5-4.2-9.6-7.7-11.5-1.1-.6-8-1.3-15.5-1.7-12.4-.6-13.8-.8-17.8-3.1-6.2-3.6-7.9-7.6-8-18.3 0-20.4-8.5-39.4-25.3-56.5-12-12.2-25.3-20.5-40.6-25.1-3.6-1.1-11.8-1.5-39.2-1.8-42.9-.5-52.5.4-67.1 6.2-27 10.7-46.3 33.4-53.4 62.4-1.3 5.4-1.6 14.2-1.9 64.3-.4 62.8 0 72.1 4 84.5 9.7 30.7 37.1 53.4 64.6 58.4 9.2 1.7 122.2 2.1 133.7.5 20.1-2.7 35.9-10.8 50.7-25.9 10.7-10.9 17.4-22.8 21.8-38.5 3.2-10.9 2.9-88.4 1.7-93.9z"],"blogger-b":[448,512,[],"f37d","M446.6 222.7c-1.8-8-6.8-15.4-12.5-18.5-1.8-1-13-2.2-25-2.7-20.1-.9-22.3-1.3-28.7-5-10.1-5.9-12.8-12.3-12.9-29.5-.1-33-13.8-63.7-40.9-91.3-19.3-19.7-40.9-33-65.5-40.5-5.9-1.8-19.1-2.4-63.3-2.9-69.4-.8-84.8.6-108.4 10C45.9 59.5 14.7 96.1 3.3 142.9 1.2 151.7.7 165.8.2 246.8c-.6 101.5.1 116.4 6.4 136.5 15.6 49.6 59.9 86.3 104.4 94.3 14.8 2.7 197.3 3.3 216 .8 32.5-4.4 58-17.5 81.9-41.9 17.3-17.7 28.1-36.8 35.2-62.1 4.9-17.6 4.5-142.8 2.5-151.7zm-322.1-63.6c7.8-7.9 10-8.2 58.8-8.2 43.9 0 45.4.1 51.8 3.4 9.3 4.7 13.4 11.3 13.4 21.9 0 9.5-3.8 16.2-12.3 21.6-4.6 2.9-7.3 3.1-50.3 3.3-26.5.2-47.7-.4-50.8-1.2-16.6-4.7-22.8-28.5-10.6-40.8zm191.8 199.8l-14.9 2.4-77.5.9c-68.1.8-87.3-.4-90.9-2-7.1-3.1-13.8-11.7-14.9-19.4-1.1-7.3 2.6-17.3 8.2-22.4 7.1-6.4 10.2-6.6 97.3-6.7 89.6-.1 89.1-.1 97.6 7.8 12.1 11.3 9.5 31.2-4.9 39.4z"],bluetooth:[448,512,[],"f293","M292.6 171.1L249.7 214l-.3-86 43.2 43.1m-43.2 219.8l43.1-43.1-42.9-42.9-.2 86zM416 259.4C416 465 344.1 512 230.9 512S32 465 32 259.4 115.4 0 228.6 0 416 53.9 416 259.4zm-158.5 0l79.4-88.6L211.8 36.5v176.9L138 139.6l-27 26.9 92.7 93-92.7 93 26.9 26.9 73.8-73.8 2.3 170 127.4-127.5-83.9-88.7z"],"bluetooth-b":[320,512,[],"f294","M196.48 260.023l92.626-103.333L143.125 0v206.33l-86.111-86.111-31.406 31.405 108.061 108.399L25.608 368.422l31.406 31.405 86.111-86.111L145.84 512l148.552-148.644-97.912-103.333zm40.86-102.996l-49.977 49.978-.338-100.295 50.315 50.317zM187.363 313.04l49.977 49.978-50.315 50.316.338-100.294z"],btc:[384,512,[],"f15a","M310.204 242.638c27.73-14.18 45.377-39.39 41.28-81.3-5.358-57.351-52.458-76.573-114.85-81.929V0h-48.528v77.203c-12.605 0-25.525.315-38.444.63V0h-48.528v79.409c-17.842.539-38.622.276-97.37 0v51.678c38.314-.678 58.417-3.14 63.023 21.427v217.429c-2.925 19.492-18.524 16.685-53.255 16.071L3.765 443.68c88.481 0 97.37.315 97.37.315V512h48.528v-67.06c13.234.315 26.154.315 38.444.315V512h48.528v-68.005c81.299-4.412 135.647-24.894 142.895-101.467 5.671-61.446-23.32-88.862-69.326-99.89zM150.608 134.553c27.415 0 113.126-8.507 113.126 48.528 0 54.515-85.71 48.212-113.126 48.212v-96.74zm0 251.776V279.821c32.772 0 133.127-9.138 133.127 53.255-.001 60.186-100.355 53.253-133.127 53.253z"],buromobelexperte:[448,512,[],"f37f","M0 32v128h128V32H0zm120 120H8V40h112v112zm40-120v128h128V32H160zm120 120H168V40h112v112zm40-120v128h128V32H320zm120 120H328V40h112v112zM0 192v128h128V192H0zm120 120H8V200h112v112zm40-120v128h128V192H160zm120 120H168V200h112v112zm40-120v128h128V192H320zm120 120H328V200h112v112zM0 352v128h128V352H0zm120 120H8V360h112v112zm40-120v128h128V352H160zm120 120H168V360h112v112zm40-120v128h128V352H320z"],buysellads:[448,512,[],"f20d","M224 150.7l42.9 160.7h-85.8L224 150.7zM448 80v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V80c0-26.5 21.5-48 48-48h352c26.5 0 48 21.5 48 48zm-65.3 325.3l-94.5-298.7H159.8L65.3 405.3H156l111.7-91.6 24.2 91.6h90.8z"],"cc-amex":[576,512,[],"f1f3","M576 255.4c-37.9-.2-44.2-.9-54.5 5v-5c-45.3 0-53.5-1.7-64.9 5.2v-5.2h-78.2v5.1c-11.4-6.5-21.4-5.1-75.7-5.1v5.6c-6.3-3.7-14.5-5.6-24.3-5.6h-58c-3.5 3.8-12.5 13.7-15.7 17.2-12.7-14.1-10.5-11.6-15.5-17.2h-83.1v92.3h82c3.3-3.5 12.9-13.9 16.1-17.4 12.7 14.3 10.3 11.7 15.4 17.4h48.9c0-14.7.1-8.3.1-23 11.5.2 24.3-.2 34.3-6.2 0 13.9-.1 17.1-.1 29.2h39.6c0-18.5.1-7.4.1-25.3 6.2 0 7.7 0 9.4.1.1 1.3 0 0 0 25.2 152.8 0 145.9 1.1 156.7-4.5v4.5c34.8 0 54.8 2.2 67.5-6.1V432c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V228.3h26.6c4.2-10.1 2.2-5.3 6.4-15.3h19.2c4.2 10 2.2 5.2 6.4 15.3h52.9v-11.4c2.2 5 1.1 2.5 5.1 11.4h29.5c2.4-5.5 2.6-5.8 5.1-11.4v11.4h135.5v-25.1c6.4 0 8-.1 9.8.2 0 0-.2 10.9.1 24.8h66.5v-8.9c7.4 5.9 17.4 8.9 29.7 8.9h26.8c4.2-10.1 2.2-5.3 6.4-15.3h19c6.5 15 .2.5 6.6 15.3h52.8v-21.9c11.8 19.7 7.8 12.9 13.2 21.9h41.6v-92h-39.9v18.4c-12.2-20.2-6.3-10.4-11.2-18.4h-43.3v20.6c-6.2-14.6-4.6-10.8-8.8-20.6h-32.4c-.4 0-2.3.2-2.3-.3h-27.6c-12.8 0-23.1 3.2-30.7 9.3v-9.3h-39.9v5.3c-10.8-6.1-20.7-5.1-64.4-5.3-.1 0-11.6-.1-11.6 0h-103c-2.5 6.1-6.8 16.4-12.6 30-2.8-6-11-23.8-13.9-30h-46V157c-7.4-17.4-4.7-11-9-21.1H22.9c-3.4 7.9-13.7 32-23.1 53.9V80c0-26.5 21.5-48 48-48h480c26.5 0 48 21.5 48 48v175.4zm-186.6-80.6c-.3.2-1.4 2.2-1.4 7.6 0 6 .9 7.7 1.1 7.9.2.1 1.1.5 3.4.5l7.3-16.9c-1.1 0-2.1-.1-3.1-.1-5.6 0-7 .7-7.3 1zm-19.9 130.9c9.2 3.3 11 9.5 11 18.4l-.1 13.8h-16.6l.1-11.5c0-11.8-3.8-13.8-14.8-13.8h-17.6l-.1 25.3h-16.6l.1-69.3h39.4c13 0 27.1 2.3 27.1 18.7-.1 7.6-4.2 15.3-11.9 18.4zm-6.3-15.4c0-6.4-5.6-7.4-10.7-7.4h-21v15.6h20.7c5.6 0 11-1.3 11-8.2zm181.7-7.1H575v-14.6h-32.9c-12.8 0-23.8 6.6-23.8 20.7 0 33 42.7 12.8 42.7 27.4 0 5.1-4.3 6.4-8.4 6.4h-32l-.1 14.8h32c8.4 0 17.6-1.8 22.5-8.9v-25.8c-10.5-13.8-39.3-1.3-39.3-13.5 0-5.8 4.6-6.5 9.2-6.5zm-99.2-.3v-14.3h-55.2l-.1 69.3h55.2l.1-14.3-38.6-.3v-13.8H445v-14.1h-37.8v-12.5h38.5zm42.2 40.1h-32.2l-.1 14.8h32.2c14.8 0 26.2-5.6 26.2-22 0-33.2-42.9-11.2-42.9-26.3 0-5.6 4.9-6.4 9.2-6.4h30.4v-14.6h-33.2c-12.8 0-23.5 6.6-23.5 20.7 0 33 42.7 12.5 42.7 27.4-.1 5.4-4.7 6.4-8.8 6.4zm-78.1-158.7c-17.4-.3-33.2-4.1-33.2 19.7 0 11.8 2.8 19.9 16.1 19.9h7.4l23.5-54.5h24.8l27.9 65.4v-65.4h25.3l29.1 48.1v-48.1h16.9v69H524l-31.2-51.9v51.9h-33.7l-6.6-15.3h-34.3l-6.4 15.3h-19.2c-22.8 0-33-11.8-33-34 0-23.3 10.5-35.3 34-35.3h16.1v15.2zm14.3 24.5h22.8l-11.2-27.6-11.6 27.6zm-72.6-39.6h-16.9v69.3h16.9v-69.3zm-38.1 37.3c9.5 3.3 11 9.2 11 18.4v13.5h-16.6c-.3-14.8 3.6-25.1-14.8-25.1h-18v25.1h-16.4v-69.3l39.1.3c13.3 0 27.4 2 27.4 18.4.1 8-4.3 15.7-11.7 18.7zm-6.7-15.3c0-6.4-5.6-7.4-10.7-7.4h-21v15.3h20.7c5.7 0 11-1.3 11-7.9zm-59.5-7.4v-14.6h-55.5v69.3h55.5v-14.3h-38.9v-13.8h37.8v-14.1h-37.8v-12.5h38.9zm-84.6 54.7v-54.2l-24 54.2H124l-24-54.2v54.2H66.2l-6.4-15.3H25.3l-6.4 15.3H1l29.7-69.3h24.5l28.1 65.7v-65.7h27.1l21.7 47 19.7-47h27.6v69.3h-16.8zM53.9 188.8l-11.5-27.6-11.2 27.6h22.7zm253 102.5c0 27.9-30.4 23.3-49.3 23.3l-.1 23.3h-32.2l-20.4-23-21.3 23h-65.4l.1-69.3h66.5l20.5 22.8 21-22.8H279c15.6 0 27.9 5.4 27.9 22.7zm-112.7 11.8l-17.9-20.2h-41.7v12.5h36.3v14.1h-36.3v13.8h40.6l19-20.2zM241 276l-25.3 27.4 25.3 28.1V276zm48.3 15.3c0-6.1-4.6-8.4-10.2-8.4h-21.5v17.6h21.2c5.9 0 10.5-2.8 10.5-9.2z"],"cc-apple-pay":[576,512,[],"f416","M302.2 218.4c0 17.2-10.5 27.1-29 27.1h-24.3v-54.2h24.4c18.4 0 28.9 9.8 28.9 27.1zm47.5 62.6c0 8.3 7.2 13.7 18.5 13.7 14.4 0 25.2-9.1 25.2-21.9v-7.7l-23.5 1.5c-13.3.9-20.2 5.8-20.2 14.4zM576 79v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V79c0-26.5 21.5-48 48-48h480c26.5 0 48 21.5 48 48zM127.8 197.2c8.4.7 16.8-4.2 22.1-10.4 5.2-6.4 8.6-15 7.7-23.7-7.4.3-16.6 4.9-21.9 11.3-4.8 5.5-8.9 14.4-7.9 22.8zm60.6 74.5c-.2-.2-19.6-7.6-19.8-30-.2-18.7 15.3-27.7 16-28.2-8.8-13-22.4-14.4-27.1-14.7-12.2-.7-22.6 6.9-28.4 6.9-5.9 0-14.7-6.6-24.3-6.4-12.5.2-24.2 7.3-30.5 18.6-13.1 22.6-3.4 56 9.3 74.4 6.2 9.1 13.7 19.1 23.5 18.7 9.3-.4 13-6 24.2-6 11.3 0 14.5 6 24.3 5.9 10.2-.2 16.5-9.1 22.8-18.2 6.9-10.4 9.8-20.4 10-21zm135.4-53.4c0-26.6-18.5-44.8-44.9-44.8h-51.2v136.4h21.2v-46.6h29.3c26.8 0 45.6-18.4 45.6-45zm90 23.7c0-19.7-15.8-32.4-40-32.4-22.5 0-39.1 12.9-39.7 30.5h19.1c1.6-8.4 9.4-13.9 20-13.9 13 0 20.2 6 20.2 17.2v7.5l-26.4 1.6c-24.6 1.5-37.9 11.6-37.9 29.1 0 17.7 13.7 29.4 33.4 29.4 13.3 0 25.6-6.7 31.2-17.4h.4V310h19.6v-68zM516 210.9h-21.5l-24.9 80.6h-.4l-24.9-80.6H422l35.9 99.3-1.9 6c-3.2 10.2-8.5 14.2-17.9 14.2-1.7 0-4.9-.2-6.2-.3v16.4c1.2.4 6.5.5 8.1.5 20.7 0 30.4-7.9 38.9-31.8L516 210.9z"],"cc-diners-club":[576,512,[],"f24c","M239.7 79.9c-96.9 0-175.8 78.6-175.8 175.8 0 96.9 78.9 175.8 175.8 175.8 97.2 0 175.8-78.9 175.8-175.8 0-97.2-78.6-175.8-175.8-175.8zm-39.9 279.6c-41.7-15.9-71.4-56.4-71.4-103.8s29.7-87.9 71.4-104.1v207.9zm79.8.3V151.6c41.7 16.2 71.4 56.7 71.4 104.1s-29.7 87.9-71.4 104.1zM528 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h480c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zM329.7 448h-90.3c-106.2 0-193.8-85.5-193.8-190.2C45.6 143.2 133.2 64 239.4 64h90.3c105 0 200.7 79.2 200.7 193.8 0 104.7-95.7 190.2-200.7 190.2z"],"cc-discover":[576,512,[],"f1f2","M83 212.1c0 7.9-3.2 15.5-8.9 20.7-4.9 4.4-11.6 6.4-21.9 6.4H48V185h4.2c10.3 0 16.7 1.7 21.9 6.6 5.7 5 8.9 12.6 8.9 20.5zM504.8 184h-4.9v24.9h4.7c10.3 0 15.8-4.4 15.8-12.8 0-7.9-5.5-12.1-15.6-12.1zM576 80v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V80c0-26.5 21.5-48 48-48h480c26.5 0 48 21.5 48 48zM428 253h45.3v-13.8H444V217h28.3v-13.8H444V185h29.3v-14H428v82zm-86.2-82l35 84.2h8.6l35.5-84.2h-17.5l-22.2 55.2-21.9-55.2h-17.5zm-83 41.6c0 24.6 19.9 44.6 44.6 44.6 24.6 0 44.6-19.9 44.6-44.6 0-24.6-19.9-44.6-44.6-44.6-24.6 0-44.6 19.9-44.6 44.6zm-68-.5c0 32.5 33.6 52.5 63.3 38.2v-19c-19.3 19.3-46.8 5.8-46.8-19.2 0-23.7 26.7-39.1 46.8-19v-19c-30.2-15-63.3 6.8-63.3 38zm-33.9 28.3c-7.6 0-13.8-3.7-17.5-10.8l-10.3 9.9c17.8 26.1 56.6 18.2 56.6-11.3 0-13.1-5.4-19-23.6-25.6-9.6-3.4-12.3-5.9-12.3-10.3 0-8.7 14.5-14.1 24.9-2.5l8.4-10.8c-19.1-17.1-49.7-8.9-49.7 14.3 0 11.3 5.2 17.2 20.2 22.7 25.7 9.1 14.7 24.4 3.3 24.4zm-57.4-28.3c0-24.1-18-41.1-44.1-41.1H32v82h23.4c30.9 0 44.1-22.4 44.1-40.9zm23.4-41.1h-16v82h16v-82zM544 288c-33.3 20.8-226.4 124.4-416 160h401c8.2 0 15-6.8 15-15V288zm0-35l-25.9-34.5c12.1-2.5 18.7-10.6 18.7-23.2 0-28.5-30.3-24.4-52.9-24.4v82h16v-32.8h2.2l22.2 32.8H544z"],"cc-jcb":[576,512,[],"f24b","M431.5 244.3V212c41.2 0 38.5.2 38.5.2 7.3 1.3 13.3 7.3 13.3 16 0 8.8-6 14.5-13.3 15.8-1.2.4-3.3.3-38.5.3zm42.8 20.2c-2.8-.7-3.3-.5-42.8-.5v35c39.6 0 40 .2 42.8-.5 7.5-1.5 13.5-8 13.5-17 0-8.7-6-15.5-13.5-17zM576 80v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V80c0-26.5 21.5-48 48-48h480c26.5 0 48 21.5 48 48zM182 192.3h-57c0 67.1 10.7 109.7-35.8 109.7-19.5 0-38.8-5.7-57.2-14.8v28c30 8.3 68 8.3 68 8.3 97.9 0 82-47.7 82-131.2zm178.5 4.5c-63.4-16-165-14.9-165 59.3 0 77.1 108.2 73.6 165 59.2V287C312.9 311.7 253 309 253 256s59.8-55.6 107.5-31.2v-28zM544 286.5c0-18.5-16.5-30.5-38-32v-.8c19.5-2.7 30.3-15.5 30.3-30.2 0-19-15.7-30-37-31 0 0 6.3-.3-120.3-.3v127.5h122.7c24.3.1 42.3-12.9 42.3-33.2z"],"cc-mastercard":[576,512,[],"f1f1","M482.9 410.3c0 6.8-4.6 11.7-11.2 11.7-6.8 0-11.2-5.2-11.2-11.7 0-6.5 4.4-11.7 11.2-11.7 6.6 0 11.2 5.2 11.2 11.7zm-310.8-11.7c-7.1 0-11.2 5.2-11.2 11.7 0 6.5 4.1 11.7 11.2 11.7 6.5 0 10.9-4.9 10.9-11.7-.1-6.5-4.4-11.7-10.9-11.7zm117.5-.3c-5.4 0-8.7 3.5-9.5 8.7h19.1c-.9-5.7-4.4-8.7-9.6-8.7zm107.8.3c-6.8 0-10.9 5.2-10.9 11.7 0 6.5 4.1 11.7 10.9 11.7 6.8 0 11.2-4.9 11.2-11.7 0-6.5-4.4-11.7-11.2-11.7zm105.9 26.1c0 .3.3.5.3 1.1 0 .3-.3.5-.3 1.1-.3.3-.3.5-.5.8-.3.3-.5.5-1.1.5-.3.3-.5.3-1.1.3-.3 0-.5 0-1.1-.3-.3 0-.5-.3-.8-.5-.3-.3-.5-.5-.5-.8-.3-.5-.3-.8-.3-1.1 0-.5 0-.8.3-1.1 0-.5.3-.8.5-1.1.3-.3.5-.3.8-.5.5-.3.8-.3 1.1-.3.5 0 .8 0 1.1.3.5.3.8.3 1.1.5s.2.6.5 1.1zm-2.2 1.4c.5 0 .5-.3.8-.3.3-.3.3-.5.3-.8 0-.3 0-.5-.3-.8-.3 0-.5-.3-1.1-.3h-1.6v3.5h.8V426h.3l1.1 1.4h.8l-1.1-1.3zM576 81v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V81c0-26.5 21.5-48 48-48h480c26.5 0 48 21.5 48 48zM64 220.6c0 76.5 62.1 138.5 138.5 138.5 27.2 0 53.9-8.2 76.5-23.1-72.9-59.3-72.4-171.2 0-230.5-22.6-15-49.3-23.1-76.5-23.1-76.4-.1-138.5 62-138.5 138.2zm224 108.8c70.5-55 70.2-162.2 0-217.5-70.2 55.3-70.5 162.6 0 217.5zm-142.3 76.3c0-8.7-5.7-14.4-14.7-14.7-4.6 0-9.5 1.4-12.8 6.5-2.4-4.1-6.5-6.5-12.2-6.5-3.8 0-7.6 1.4-10.6 5.4V392h-8.2v36.7h8.2c0-18.9-2.5-30.2 9-30.2 10.2 0 8.2 10.2 8.2 30.2h7.9c0-18.3-2.5-30.2 9-30.2 10.2 0 8.2 10 8.2 30.2h8.2v-23zm44.9-13.7h-7.9v4.4c-2.7-3.3-6.5-5.4-11.7-5.4-10.3 0-18.2 8.2-18.2 19.3 0 11.2 7.9 19.3 18.2 19.3 5.2 0 9-1.9 11.7-5.4v4.6h7.9V392zm40.5 25.6c0-15-22.9-8.2-22.9-15.2 0-5.7 11.9-4.8 18.5-1.1l3.3-6.5c-9.4-6.1-30.2-6-30.2 8.2 0 14.3 22.9 8.3 22.9 15 0 6.3-13.5 5.8-20.7.8l-3.5 6.3c11.2 7.6 32.6 6 32.6-7.5zm35.4 9.3l-2.2-6.8c-3.8 2.1-12.2 4.4-12.2-4.1v-16.6h13.1V392h-13.1v-11.2h-8.2V392h-7.6v7.3h7.6V416c0 17.6 17.3 14.4 22.6 10.9zm13.3-13.4h27.5c0-16.2-7.4-22.6-17.4-22.6-10.6 0-18.2 7.9-18.2 19.3 0 20.5 22.6 23.9 33.8 14.2l-3.8-6c-7.8 6.4-19.6 5.8-21.9-4.9zm59.1-21.5c-4.6-2-11.6-1.8-15.2 4.4V392h-8.2v36.7h8.2V408c0-11.6 9.5-10.1 12.8-8.4l2.4-7.6zm10.6 18.3c0-11.4 11.6-15.1 20.7-8.4l3.8-6.5c-11.6-9.1-32.7-4.1-32.7 15 0 19.8 22.4 23.8 32.7 15l-3.8-6.5c-9.2 6.5-20.7 2.6-20.7-8.6zm66.7-18.3H408v4.4c-8.3-11-29.9-4.8-29.9 13.9 0 19.2 22.4 24.7 29.9 13.9v4.6h8.2V392zm33.7 0c-2.4-1.2-11-2.9-15.2 4.4V392h-7.9v36.7h7.9V408c0-11 9-10.3 12.8-8.4l2.4-7.6zm40.3-14.9h-7.9v19.3c-8.2-10.9-29.9-5.1-29.9 13.9 0 19.4 22.5 24.6 29.9 13.9v4.6h7.9v-51.7zm7.6-75.1v4.6h.8V302h1.9v-.8h-4.6v.8h1.9zm6.6 123.8c0-.5 0-1.1-.3-1.6-.3-.3-.5-.8-.8-1.1-.3-.3-.8-.5-1.1-.8-.5 0-1.1-.3-1.6-.3-.3 0-.8.3-1.4.3-.5.3-.8.5-1.1.8-.5.3-.8.8-.8 1.1-.3.5-.3 1.1-.3 1.6 0 .3 0 .8.3 1.4 0 .3.3.8.8 1.1.3.3.5.5 1.1.8.5.3 1.1.3 1.4.3.5 0 1.1 0 1.6-.3.3-.3.8-.5 1.1-.8.3-.3.5-.8.8-1.1.3-.6.3-1.1.3-1.4zm3.2-124.7h-1.4l-1.6 3.5-1.6-3.5h-1.4v5.4h.8v-4.1l1.6 3.5h1.1l1.4-3.5v4.1h1.1v-5.4zm4.4-80.5c0-76.2-62.1-138.3-138.5-138.3-27.2 0-53.9 8.2-76.5 23.1 72.1 59.3 73.2 171.5 0 230.5 22.6 15 49.5 23.1 76.5 23.1 76.4.1 138.5-61.9 138.5-138.4z"],"cc-paypal":[576,512,[],"f1f4","M186.3 258.2c0 12.2-9.7 21.5-22 21.5-9.2 0-16-5.2-16-15 0-12.2 9.5-22 21.7-22 9.3 0 16.3 5.7 16.3 15.5zM80.5 209.7h-4.7c-1.5 0-3 1-3.2 2.7l-4.3 26.7 8.2-.3c11 0 19.5-1.5 21.5-14.2 2.3-13.4-6.2-14.9-17.5-14.9zm284 0H360c-1.8 0-3 1-3.2 2.7l-4.2 26.7 8-.3c13 0 22-3 22-18-.1-10.6-9.6-11.1-18.1-11.1zM576 80v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V80c0-26.5 21.5-48 48-48h480c26.5 0 48 21.5 48 48zM128.3 215.4c0-21-16.2-28-34.7-28h-40c-2.5 0-5 2-5.2 4.7L32 294.2c-.3 2 1.2 4 3.2 4h19c2.7 0 5.2-2.9 5.5-5.7l4.5-26.6c1-7.2 13.2-4.7 18-4.7 28.6 0 46.1-17 46.1-45.8zm84.2 8.8h-19c-3.8 0-4 5.5-4.2 8.2-5.8-8.5-14.2-10-23.7-10-24.5 0-43.2 21.5-43.2 45.2 0 19.5 12.2 32.2 31.7 32.2 9 0 20.2-4.9 26.5-11.9-.5 1.5-1 4.7-1 6.2 0 2.3 1 4 3.2 4H200c2.7 0 5-2.9 5.5-5.7l10.2-64.3c.3-1.9-1.2-3.9-3.2-3.9zm40.5 97.9l63.7-92.6c.5-.5.5-1 .5-1.7 0-1.7-1.5-3.5-3.2-3.5h-19.2c-1.7 0-3.5 1-4.5 2.5l-26.5 39-11-37.5c-.8-2.2-3-4-5.5-4h-18.7c-1.7 0-3.2 1.8-3.2 3.5 0 1.2 19.5 56.8 21.2 62.1-2.7 3.8-20.5 28.6-20.5 31.6 0 1.8 1.5 3.2 3.2 3.2h19.2c1.8-.1 3.5-1.1 4.5-2.6zm159.3-106.7c0-21-16.2-28-34.7-28h-39.7c-2.7 0-5.2 2-5.5 4.7l-16.2 102c-.2 2 1.3 4 3.2 4h20.5c2 0 3.5-1.5 4-3.2l4.5-29c1-7.2 13.2-4.7 18-4.7 28.4 0 45.9-17 45.9-45.8zm84.2 8.8h-19c-3.8 0-4 5.5-4.3 8.2-5.5-8.5-14-10-23.7-10-24.5 0-43.2 21.5-43.2 45.2 0 19.5 12.2 32.2 31.7 32.2 9.3 0 20.5-4.9 26.5-11.9-.3 1.5-1 4.7-1 6.2 0 2.3 1 4 3.2 4H484c2.7 0 5-2.9 5.5-5.7l10.2-64.3c.3-1.9-1.2-3.9-3.2-3.9zm47.5-33.3c0-2-1.5-3.5-3.2-3.5h-18.5c-1.5 0-3 1.2-3.2 2.7l-16.2 104-.3.5c0 1.8 1.5 3.5 3.5 3.5h16.5c2.5 0 5-2.9 5.2-5.7L544 191.2v-.3zm-90 51.8c-12.2 0-21.7 9.7-21.7 22 0 9.7 7 15 16.2 15 12 0 21.7-9.2 21.7-21.5.1-9.8-6.9-15.5-16.2-15.5z"],"cc-stripe":[576,512,[],"f1f5","M396.9 256.5c0 19.1-8.8 33.4-21.9 33.4-8.3 0-13.3-3-16.8-6.7l-.2-52.8c3.7-4.1 8.8-7 17-7 12.9-.1 21.9 14.5 21.9 33.1zM576 80v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V80c0-26.5 21.5-48 48-48h480c26.5 0 48 21.5 48 48zM122.2 281.1c0-42.3-54.3-34.7-54.3-50.7 0-5.5 4.6-7.7 12.1-7.7 10.8 0 24.5 3.3 35.3 9.1v-33.4c-11.8-4.7-23.5-6.5-35.3-6.5-28.8 0-48 15-48 40.2 0 39.3 54 32.9 54 49.9 0 6.6-5.7 8.7-13.6 8.7-11.8 0-26.9-4.9-38.9-11.3v33.9c13.2 5.7 26.6 8.1 38.8 8.1 29.6-.2 49.9-14.7 49.9-40.3zm68.9-86.9h-27v-30.8l-34.7 7.4-.2 113.9c0 21 15.8 36.5 36.9 36.5 11.6 0 20.2-2.1 24.9-4.7v-28.9c-4.5 1.8-27 8.3-27-12.6v-50.5h27v-30.3zm73.8 0c-4.7-1.7-21.3-4.8-29.6 10.5l-2.2-10.5h-30.7v124.5h35.5v-84.4c8.4-11 22.6-8.9 27.1-7.4v-32.7zm44.2 0h-35.7v124.5h35.7V194.2zm0-47.3l-35.7 7.6v28.9l35.7-7.6v-28.9zm122.7 108.8c0-41.3-23.5-63.8-48.4-63.8-13.9 0-22.9 6.6-27.8 11.1l-1.8-8.8h-31.3V360l35.5-7.5.1-40.2c5.1 3.7 12.7 9 25.1 9 25.4-.1 48.6-20.5 48.6-65.6zm112.2 1.2c0-36.4-17.6-65.1-51.3-65.1-33.8 0-54.3 28.7-54.3 64.9 0 42.8 24.2 64.5 58.8 64.5 17 0 29.7-3.9 39.4-9.2v-28.6c-9.7 4.9-20.8 7.9-34.9 7.9-13.8 0-26-4.9-27.6-21.5h69.5c.1-2 .4-9.4.4-12.9zm-51.6-36.1c-8.9 0-18.7 6.7-18.7 22.7h36.7c0-16-9.3-22.7-18-22.7z"],"cc-visa":[576,512,[],"f1f0","M470.1 231.3s7.6 37.2 9.3 45H446c3.3-8.9 16-43.5 16-43.5-.2.3 3.3-9.1 5.3-14.9l2.8 13.4zM576 80v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V80c0-26.5 21.5-48 48-48h480c26.5 0 48 21.5 48 48zM152.5 331.2L215.7 176h-42.5l-39.3 106-4.3-21.5-14-71.4c-2.3-9.9-9.4-12.7-18.2-13.1H32.7l-.7 3.1c15.8 4 29.9 9.8 42.2 17.1l35.8 135h42.5zm94.4.2L272.1 176h-40.2l-25.1 155.4h40.1zm139.9-50.8c.2-17.7-10.6-31.2-33.7-42.3-14.1-7.1-22.7-11.9-22.7-19.2.2-6.6 7.3-13.4 23.1-13.4 13.1-.3 22.7 2.8 29.9 5.9l3.6 1.7 5.5-33.6c-7.9-3.1-20.5-6.6-36-6.6-39.7 0-67.6 21.2-67.8 51.4-.3 22.3 20 34.7 35.2 42.2 15.5 7.6 20.8 12.6 20.8 19.3-.2 10.4-12.6 15.2-24.1 15.2-16 0-24.6-2.5-37.7-8.3l-5.3-2.5-5.6 34.9c9.4 4.3 26.8 8.1 44.8 8.3 42.2.1 69.7-20.8 70-53zM528 331.4L495.6 176h-31.1c-9.6 0-16.9 2.8-21 12.9l-59.7 142.5H426s6.9-19.2 8.4-23.3H486c1.2 5.5 4.8 23.3 4.8 23.3H528z"],centercode:[512,512,[],"f380","M329.2 268.6c-3.8 35.2-35.4 60.6-70.6 56.8-35.2-3.8-60.6-35.4-56.8-70.6 3.8-35.2 35.4-60.6 70.6-56.8 35.1 3.8 60.6 35.4 56.8 70.6zm-85.8 235.1C96.7 496-8.2 365.5 10.1 224.3c11.2-86.6 65.8-156.9 139.1-192 161-77.1 349.7 37.4 354.7 216.6 4.1 147-118.4 262.2-260.5 254.8zm179.9-180c27.9-118-160.5-205.9-237.2-234.2-57.5 56.3-69.1 188.6-33.8 344.4 68.8 15.8 169.1-26.4 271-110.2z"],chrome:[496,512,[],"f268","M131.5 217.5L55.1 100.1c47.6-59.2 119-91.8 192-92.1 42.3-.3 85.5 10.5 124.8 33.2 43.4 25.2 76.4 61.4 97.4 103L264 133.4c-58.1-3.4-113.4 29.3-132.5 84.1zm32.9 38.5c0 46.2 37.4 83.6 83.6 83.6s83.6-37.4 83.6-83.6-37.4-83.6-83.6-83.6-83.6 37.3-83.6 83.6zm314.9-89.2L339.6 174c37.9 44.3 38.5 108.2 6.6 157.2L234.1 503.6c46.5 2.5 94.4-7.7 137.8-32.9 107.4-62 150.9-192 107.4-303.9zM133.7 303.6L40.4 120.1C14.9 159.1 0 205.9 0 256c0 124 90.8 226.7 209.5 244.9l63.7-124.8c-57.6 10.8-113.2-20.8-139.5-72.5z"],cloudscale:[448,512,[],"f383","M318.1 154l-9.4 7.6c-22.5-19.3-51.5-33.6-83.3-33.6C153.8 128 96 188.8 96 260.3c0 6.6.4 13.1 1.4 19.4-2-56 41.8-97.4 92.6-97.4 24.2 0 46.2 9.4 62.6 24.7l-25.2 20.4c-8.3-.9-16.8 1.8-23.1 8.1-11.1 11-11.1 28.9 0 40 11.1 11 28.9 11 40 0 6.3-6.3 9-14.9 8.1-23.1l75.2-88.8c6.3-6.5-3.3-15.9-9.5-9.6zm-83.8 111.5c-5.6 5.5-14.6 5.5-20.2 0-5.6-5.6-5.6-14.6 0-20.2s14.6-5.6 20.2 0 5.6 14.7 0 20.2zM224 32C100.5 32 0 132.5 0 256s100.5 224 224 224 224-100.5 224-224S347.5 32 224 32zm0 384c-88.2 0-160-71.8-160-160S135.8 96 224 96s160 71.8 160 160-71.8 160-160 160z"],cloudsmith:[332,512,[],"f384","M332.5 419.9c0 46.4-37.6 84.1-84 84.1s-84-37.7-84-84.1 37.6-84 84-84 84 37.6 84 84zm-84-243.9c46.4 0 80-37.6 80-84s-33.6-84-80-84-88 37.6-88 84-29.6 76-76 76-84 41.6-84 88 37.6 80 84 80 84-33.6 84-80 33.6-80 80-80z"],cloudversify:[616,512,[],"f385","M148.6 304c8.2 68.5 67.4 115.5 146 111.3 51.2 43.3 136.8 45.8 186.4-5.6 69.2 1.1 118.5-44.6 131.5-99.5 14.8-62.5-18.2-132.5-92.1-155.1-33-88.1-131.4-101.5-186.5-85-57.3 17.3-84.3 53.2-99.3 109.7-7.8 2.7-26.5 8.9-45 24.1 11.7 0 15.2 8.9 15.2 19.5v20.4c0 10.7-8.7 19.5-19.5 19.5h-20.2c-10.7 0-19.5-6-19.5-16.7V240H98.8C95 240 88 244.3 88 251.9v40.4c0 6.4 5.3 11.8 11.7 11.8h48.9zm227.4 8c-10.7 46.3 21.7 72.4 55.3 86.8C324.1 432.6 259.7 348 296 288c-33.2 21.6-33.7 71.2-29.2 92.9-17.9-12.4-53.8-32.4-57.4-79.8-3-39.9 21.5-75.7 57-93.9C297 191.4 369.9 198.7 400 248c-14.1-48-53.8-70.1-101.8-74.8 30.9-30.7 64.4-50.3 114.2-43.7 69.8 9.3 133.2 82.8 67.7 150.5 35-16.3 48.7-54.4 47.5-76.9l10.5 19.6c11.8 22 15.2 47.6 9.4 72-9.2 39-40.6 68.8-79.7 76.5-32.1 6.3-83.1-5.1-91.8-59.2zM128 208H88.2c-8.9 0-16.2-7.3-16.2-16.2v-39.6c0-8.9 7.3-16.2 16.2-16.2H128c8.9 0 16.2 7.3 16.2 16.2v39.6c0 8.9-7.3 16.2-16.2 16.2zM10.1 168C4.5 168 0 163.5 0 157.9v-27.8c0-5.6 4.5-10.1 10.1-10.1h27.7c5.5 0 10.1 4.5 10.1 10.1v27.8c0 5.6-4.5 10.1-10.1 10.1H10.1zM168 142.7v-21.4c0-5.1 4.2-9.3 9.3-9.3h21.4c5.1 0 9.3 4.2 9.3 9.3v21.4c0 5.1-4.2 9.3-9.3 9.3h-21.4c-5.1 0-9.3-4.2-9.3-9.3zM56 235.5v25c0 6.3-5.1 11.5-11.4 11.5H19.4C13.1 272 8 266.8 8 260.5v-25c0-6.3 5.1-11.5 11.4-11.5h25.1c6.4 0 11.5 5.2 11.5 11.5z"],codepen:[512,512,[],"f1cb","M502.285 159.704l-234-156c-7.987-4.915-16.511-4.96-24.571 0l-234 156C3.714 163.703 0 170.847 0 177.989v155.999c0 7.143 3.714 14.286 9.715 18.286l234 156.022c7.987 4.915 16.511 4.96 24.571 0l234-156.022c6-3.999 9.715-11.143 9.715-18.286V177.989c-.001-7.142-3.715-14.286-9.716-18.285zM278 63.131l172.286 114.858-76.857 51.429L278 165.703V63.131zm-44 0v102.572l-95.429 63.715-76.857-51.429L234 63.131zM44 219.132l55.143 36.857L44 292.846v-73.714zm190 229.715L61.714 333.989l76.857-51.429L234 346.275v102.572zm22-140.858l-77.715-52 77.715-52 77.715 52-77.715 52zm22 140.858V346.275l95.429-63.715 76.857 51.429L278 448.847zm190-156.001l-55.143-36.857L468 219.132v73.714z"],codiepie:[472,512,[],"f284","M422.5 202.9c30.7 0 33.5 53.1-.3 53.1h-10.8v44.3h-26.6v-97.4h37.7zM472 352.6C429.9 444.5 350.4 504 248 504 111 504 0 393 0 256S111 8 248 8c97.4 0 172.8 53.7 218.2 138.4l-186 108.8L472 352.6zm-38.5 12.5l-60.3-30.7c-27.1 44.3-70.4 71.4-122.4 71.4-82.5 0-149.2-66.7-149.2-148.9 0-82.5 66.7-149.2 149.2-149.2 48.4 0 88.9 23.5 116.9 63.4l59.5-34.6c-40.7-62.6-104.7-100-179.2-100-121.2 0-219.5 98.3-219.5 219.5S126.8 475.5 248 475.5c78.6 0 146.5-42.1 185.5-110.4z"],connectdevelop:[576,512,[],"f20e","M550.5 241l-50.089-86.786c1.071-2.142 1.875-4.553 1.875-7.232 0-8.036-6.696-14.733-14.732-15.001l-55.447-95.893c.536-1.607 1.071-3.214 1.071-4.821 0-8.571-6.964-15.268-15.268-15.268-4.821 0-8.839 2.143-11.786 5.625H299.518C296.839 18.143 292.821 16 288 16s-8.839 2.143-11.518 5.625H170.411C167.464 18.143 163.447 16 158.625 16c-8.303 0-15.268 6.696-15.268 15.268 0 1.607.536 3.482 1.072 4.821l-55.983 97.233c-5.356 2.41-9.107 7.5-9.107 13.661 0 .535.268 1.071.268 1.607l-53.304 92.143c-7.232 1.339-12.59 7.5-12.59 15 0 7.232 5.089 13.393 12.054 15l55.179 95.358c-.536 1.607-.804 2.946-.804 4.821 0 7.232 5.089 13.393 12.054 14.732l51.697 89.732c-.536 1.607-1.071 3.482-1.071 5.357 0 8.571 6.964 15.268 15.268 15.268 4.821 0 8.839-2.143 11.518-5.357h106.875C279.161 493.857 283.447 496 288 496s8.839-2.143 11.518-5.357h107.143c2.678 2.946 6.696 4.821 10.982 4.821 8.571 0 15.268-6.964 15.268-15.268 0-1.607-.267-2.946-.803-4.285l51.697-90.268c6.964-1.339 12.054-7.5 12.054-14.732 0-1.607-.268-3.214-.804-4.821l54.911-95.358c6.964-1.339 12.322-7.5 12.322-15-.002-7.232-5.092-13.393-11.788-14.732zM153.535 450.732l-43.66-75.803h43.66v75.803zm0-83.839h-43.66c-.268-1.071-.804-2.142-1.339-3.214l44.999-47.41v50.624zm0-62.411l-50.357 53.304c-1.339-.536-2.679-1.34-4.018-1.607L43.447 259.75c.535-1.339.535-2.679.535-4.018s0-2.41-.268-3.482l51.965-90c2.679-.268 5.357-1.072 7.768-2.679l50.089 51.965v92.946zm0-102.322l-45.803-47.41c1.339-2.143 2.143-4.821 2.143-7.767 0-.268-.268-.804-.268-1.072l43.928-15.804v72.053zm0-80.625l-43.66 15.804 43.66-75.536v59.732zm326.519 39.108l.804 1.339L445.5 329.125l-63.75-67.232 98.036-101.518.268.268zM291.75 355.107l11.518 11.786H280.5l11.25-11.786zm-.268-11.25l-83.303-85.446 79.553-84.375 83.036 87.589-79.286 82.232zm5.357 5.893l79.286-82.232 67.5 71.25-5.892 28.125H313.714l-16.875-17.143zM410.411 44.393c1.071.536 2.142 1.072 3.482 1.34l57.857 100.714v.536c0 2.946.803 5.624 2.143 7.767L376.393 256l-83.035-87.589L410.411 44.393zm-9.107-2.143L287.732 162.518l-57.054-60.268 166.339-60h4.287zm-123.483 0c2.678 2.678 6.16 4.285 10.179 4.285s7.5-1.607 10.179-4.285h75L224.786 95.821 173.893 42.25h103.928zm-116.249 5.625l1.071-2.142a33.834 33.834 0 0 0 2.679-.804l51.161 53.84-54.911 19.821V47.875zm0 79.286l60.803-21.964 59.732 63.214-79.553 84.107-40.982-42.053v-83.304zm0 92.678L198 257.607l-36.428 38.304v-76.072zm0 87.858l42.053-44.464 82.768 85.982-17.143 17.678H161.572v-59.196zm6.964 162.053c-1.607-1.607-3.482-2.678-5.893-3.482l-1.071-1.607v-89.732h99.91l-91.607 94.821h-1.339zm129.911 0c-2.679-2.41-6.428-4.285-10.447-4.285s-7.767 1.875-10.447 4.285h-96.429l91.607-94.821h38.304l91.607 94.821H298.447zm120-11.786l-4.286 7.5c-1.339.268-2.41.803-3.482 1.339l-89.196-91.875h114.376l-17.412 83.036zm12.856-22.232l12.858-60.803h21.964l-34.822 60.803zm34.822-68.839h-20.357l4.553-21.16 17.143 18.214c-.535.803-1.071 1.874-1.339 2.946zm66.161-107.411l-55.447 96.697c-1.339.535-2.679 1.071-4.018 1.874l-20.625-21.964 34.554-163.928 45.803 79.286c-.267 1.339-.803 2.678-.803 4.285 0 1.339.268 2.411.536 3.75z"],contao:[512,512,[],"f26d","M45.4 305c14.4 67.1 26.4 129 68.2 175H34c-18.7 0-34-15.2-34-34V66c0-18.7 15.2-34 34-34h57.7C77.9 44.6 65.6 59.2 54.8 75.6c-45.4 70-27 146.8-9.4 229.4zM478 32h-90.2c21.4 21.4 39.2 49.5 52.7 84.1l-137.1 29.3c-14.9-29-37.8-53.3-82.6-43.9-24.6 5.3-41 19.3-48.3 34.6-8.8 18.7-13.2 39.8 8.2 140.3 21.1 100.2 33.7 117.7 49.5 131.2 12.9 11.1 33.4 17 58.3 11.7 44.5-9.4 55.7-40.7 57.4-73.2l137.4-29.6c3.2 71.5-18.7 125.2-57.4 163.6H478c18.7 0 34-15.2 34-34V66c0-18.8-15.2-34-34-34z"],cpanel:[640,512,[],"f388","M52.9 213.7h40l-6.2 23.6c-1.9 6.5-7.4 10.9-14.3 10.9H53.8c-24.9 0-24.7 37.4 0 37.4h11.3c4.2 0 7.6 3.9 6.4 8.3L64.4 320H52c-33.5 0-59-31.4-50.3-65.2 7.3-27 28.3-41.1 51.2-41.1M73.1 320L108 189.9c1.8-6.4 7.2-10.9 14.3-10.9h37c24.1 0 45.4 16.4 51 41.2 6.6 29.1-14.5 65.3-51.7 65.3h-32l6.4-23.8c1.8-6.2 7.3-10.8 14.3-10.8h10.3c12.4 0 20.8-11.7 18.3-22.6-2.1-9.2-9.9-14.8-18.3-14.8h-19.8L112 309.2c-1.9 6.2-7.4 10.7-14.2 10.7l-24.7.1m220.6-69.4c.3-1 1.9-5.3-2.1-5.3h-57.5c-9.7 0-16.6-8.9-14.2-18.5l3.5-13.4h77.9c18.8 0 33.3 17.6 28.5 36.8l-14 51.8c-2.8 10.6-12.2 17.8-23.4 17.8l-57.5-.2c-42.9 0-38.5-63.8.7-63.8H284l-3.5 13.2c-1.9 6.2-7.4 10.8-14.2 10.8h-21.6c-5.3 0-5.3 7.9 0 7.9h34.9c4.6 0 5.1-3.9 5.5-5.3l8.6-31.8m103.1-36.9c34.4 0 59.3 32.3 50.3 65.4l-8.8 33.1c-1.2 4.9-5.7 7.8-10.3 7.8h-19.1c-4.5 0-7.6-4-6.4-8.3l10.6-40c3.3-11.6-5.6-23.4-18.1-23.4h-19.8l-17.2 64c-1.2 4.8-5.6 7.8-10.4 7.8h-18.9c-4.2 0-7.6-3.9-6.4-8.3l26.2-98h48.3M498 251.6l-8 30c-.9 3.3 1.5 6.7 5.1 6.7h73.3l-5.7 21c-1.9 6.2-7.4 10.7-14.2 10.7h-66.7c-20 0-33.3-19-28.3-36.7l10.8-40c4.8-17.6 20.7-29.6 38.6-29.6h47.3c19 0 33.2 17.7 28.3 36.8l-3.2 12c-2.9 11-12.7 17.6-23.2 17.6h-53.4l3.5-13c1.6-6.2 7.2-10.8 14.2-10.8H538c2 0 3.3-1 3.9-3l.7-2.6c.7-2.7-1.3-5.1-3.9-5.1h-32.9c-4.1 0-6.9 2.1-7.8 6zm70.2 68.4l35.6-133.1c1.2-4.7 5.5-7.9 10.4-7.9h18.9c4.5 0 7.7 4 6.5 8.3l-26.5 98.2c-5.1 20.7-24.2 34.5-44.9 34.5"],"creative-commons":[512,512,[],"f25e","M255.547 8C392.884 8 504 114.439 504 256.004 504 405.979 381.106 504 255.562 504 122.319 504 8 394.557 8 256.004 8 124.825 113.486 8 255.547 8zm.899 44.734c-120.341 0-203.727 100.568-203.727 203.278 0 106.515 88.984 202.394 203.727 202.394 101.528 0 202.821-79.442 202.821-202.387-.001-114.773-91.773-203.285-202.821-203.285zm-3.108 162.093l-33.225 17.275c-5.395-11.203-15.25-19.926-27.459-19.926-22.134 0-33.217 14.609-33.217 43.842 0 23.842 9.446 43.842 33.217 43.842 14.469 0 24.653-7.091 30.566-21.259l30.551 15.5c-12.813 23.899-36.887 38.975-65.101 38.975-43.162 0-73.959-27.272-73.959-77.052 0-49.541 32.706-77.059 72.634-77.059 30.714-.013 52.701 11.946 65.993 35.862zm143.044 0l-32.775 17.275c-5.517-11.482-15.324-19.926-27.9-19.926-22.142 0-33.225 14.609-33.225 43.842 0 23.906 9.502 43.842 33.225 43.842 14.454 0 24.645-7.091 30.543-21.259l31 15.5c-13.363 23.869-37.451 38.975-65.086 38.975-43.439 0-73.959-26.988-73.959-77.052 0-49.523 32.698-77.059 72.626-77.059 30.706-.013 52.569 11.946 65.551 35.862z"],css3:[512,512,[],"f13c","M480 32l-64 368-223.3 80L0 400l19.6-94.8h82l-8 40.6L210 390.2l134.1-44.4 18.8-97.1H29.5l16-82h333.7l10.5-52.7H56.3l16.3-82H480z"],"css3-alt":[384,512,[],"f38b","M0 32l34.9 395.8L192 480l157.1-52.2L384 32H0zm313.1 80l-4.8 47.3L193 208.6l-.3.1h111.5l-12.8 146.6-98.2 28.7-98.8-29.2-6.4-73.9h48.9l3.2 38.3 52.6 13.3 54.7-15.4 3.7-61.6-166.3-.5v-.1l-.2.1-3.6-46.3L193.1 162l6.5-2.7H76.7L70.9 112h242.2z"],cuttlefish:[440,512,[],"f38c","M344 305.5c-17.5 31.6-57.4 54.5-96 54.5-56.6 0-104-47.4-104-104s47.4-104 104-104c38.6 0 78.5 22.9 96 54.5 13.7-50.9 41.7-93.3 87-117.8C385.7 39.1 320.5 8 248 8 111 8 0 119 0 256s111 248 248 248c72.5 0 137.7-31.1 183-80.7-45.3-24.5-73.3-66.9-87-117.8z"],"d-and-d":[576,512,[],"f38d","M82.5 98.9c-.6-17.2 2-33.8 12.7-48.2.3 7.4 1.2 14.5 4.2 21.6 5.9-27.5 19.7-49.3 42.3-65.5-1.9 5.9-3.5 11.8-3 17.7 8.7-7.4 18.8-17.8 44.4-22.7 14.7-2.8 29.7-2 42.1 1 38.5 9.3 61 34.3 69.7 72.3 5.3 23.1.7 45-8.3 66.4-5.2 12.4-12 24.4-20.7 35.1-2-1.9-3.9-3.8-5.8-5.6-42.8-40.8-26.8-25.2-37.4-37.4-1.1-1.2-1-2.2-.1-3.6 8.3-13.5 11.8-28.2 10-44-1.1-9.8-4.3-18.9-11.3-26.2-14.5-15.3-39.2-15-53.5.6-11.4 12.5-14.1 27.4-10.9 43.6.2 1.3.4 2.7 0 3.9-3.4 13.7-4.6 27.6-2.5 41.6.1.5.1 1.1.1 1.6 0 .3-.1.5-.2 1.1-21.8-11-36-28.3-43.2-52.2-8.3 17.8-11.1 35.5-6.6 54.1-15.6-15.2-21.3-34.3-22-55.2zm469.6 123.2c-11.6-11.6-25-20.4-40.1-26.6-12.8-5.2-26-7.9-39.9-7.1-10 .6-19.6 3.1-29 6.4-2.5.9-5.1 1.6-7.7 2.2-4.9 1.2-7.3-3.1-4.7-6.8 3.2-4.6 3.4-4.2 15-12 .6-.4 1.2-.8 2.2-1.5h-2.5c-.6 0-1.2.2-1.9.3-19.3 3.3-30.7 15.5-48.9 29.6-10.4 8.1-13.8 3.8-12-.5 1.4-3.5 3.3-6.7 5.1-10 1-1.8 2.3-3.4 3.5-5.1-.2-.2-.5-.3-.7-.5-27 18.3-46.7 42.4-57.7 73.3.3.3.7.6 1 .9.3-.6.5-1.2.9-1.7 10.4-12.1 22.8-21.8 36.6-29.8 18.2-10.6 37.5-18.3 58.7-20.2 4.3-.4 8.7-.1 13.1-.1-1.8.7-3.5.9-5.3 1.1-18.5 2.4-35.5 9-51.5 18.5-30.2 17.9-54.5 42.2-75.1 70.4-.3.4-.4.9-.7 1.3 14.5 5.3 24 17.3 36.1 25.6.2-.1.3-.2.4-.4l1.2-2.7c12.2-26.9 27-52.3 46.7-74.5 16.7-18.8 38-25.3 62.5-20 5.9 1.3 11.4 4.4 17.2 6.8 2.3-1.4 5.1-3.2 8-4.7 8.4-4.3 17.4-7 26.7-9 14.7-3.1 29.5-4.9 44.5-1.3v-.5c-.5-.4-1.2-.8-1.7-1.4zM316.7 397.6c-39.4-33-22.8-19.5-42.7-35.6-.8.9 0-.2-1.9 3-11.2 19.1-25.5 35.3-44 47.6-10.3 6.8-21.5 11.8-34.1 11.8-21.6 0-38.2-9.5-49.4-27.8-12-19.5-13.3-40.7-8.2-62.6 7.8-33.8 30.1-55.2 38.6-64.3-18.7-6.2-33 1.7-46.4 13.9.8-13.9 4.3-26.2 11.8-37.3-24.3 10.6-45.9 25-64.8 43.9-.3-5.8 5.4-43.7 5.6-44.7.3-2.7-.6-5.3-3-7.4-24.2 24.7-44.5 51.8-56.1 84.6 7.4-5.9 14.9-11.4 23.6-16.2-8.3 22.3-19.6 52.8-7.8 101.1 4.6 19 11.9 36.8 24.1 52.3 2.9 3.7 6.3 6.9 9.5 10.3.2-.2.4-.3.6-.5-1.4-7-2.2-14.1-1.5-21.9 2.2 3.2 3.9 6 5.9 8.6 12.6 16 28.7 27.4 47.2 35.6 25 11.3 51.1 13.3 77.9 8.6 54.9-9.7 90.7-48.6 116-98.8 1-1.8.6-2.9-.9-4.2zm172-46.4c-9.5-3.1-22.2-4.2-28.7-2.9 9.9 4 14.1 6.6 18.8 12 12.6 14.4 10.4 34.7-5.4 45.6-11.7 8.1-24.9 10.5-38.9 9.1-1.2-.1-2.3-.4-3-.6 2.8-3.7 6-7 8.1-10.8 9.4-16.8 5.4-42.1-8.7-56.1-2.1-2.1-4.6-3.9-7-5.9-.3 1.3-.1 2.1.1 2.8 4.2 16.6-8.1 32.4-24.8 31.8-7.6-.3-13.9-3.8-19.6-8.5-19.5-16.1-39.1-32.1-58.5-48.3-5.9-4.9-12.5-8.1-20.1-8.7-4.6-.4-9.3-.6-13.9-.9-5.9-.4-8.8-2.8-10.4-8.4-.9-3.4-1.5-6.8-2.2-10.2-1.5-8.1-6.2-13-14.3-14.2-4.4-.7-8.9-1-13.3-1.5-13-1.4-19.8-7.4-22.6-20.3-5 11-1.6 22.4 7.3 29.9 4.5 3.8 9.3 7.3 13.8 11.2 4.6 3.8 7.4 8.7 7.9 14.8.4 4.7.8 9.5 1.8 14.1 2.2 10.6 8.9 18.4 17 25.1 16.5 13.7 33 27.3 49.5 41.1 17.9 15 13.9 32.8 13 56-.9 22.9 12.2 42.9 33.5 51.2 1 .4 2 .6 3.6 1.1-15.7-18.2-10.1-44.1.7-52.3.3 2.2.4 4.3.9 6.4 9.4 44.1 45.4 64.2 85 56.9 16-2.9 30.6-8.9 42.9-19.8 2-1.8 3.7-4.1 5.9-6.5-19.3 4.6-35.8.1-50.9-10.6.7-.3 1.3-.3 1.9-.3 21.3 1.8 40.6-3.4 57-17.4 19.5-16.6 26.6-42.9 17.4-66-8.3-20.1-23.6-32.3-43.8-38.9zM99.4 179.3c-5.3-9.2-13.2-15.6-22.1-21.3 13.7-.5 26.6.2 39.6 3.7-7-12.2-8.5-24.7-5-38.7 5.3 11.9 13.7 20.1 23.6 26.8 19.7 13.2 35.7 19.6 46.7 30.2 3.4 3.3 6.3 7.1 9.6 10.9-.8-2.1-1.4-4.1-2.2-6-5-10.6-13-18.6-22.6-25-1.8-1.2-2.8-2.5-3.4-4.5-3.3-12.5-3-25.1-.7-37.6 1-5.5 2.8-10.9 4.5-16.3.8-2.4 2.3-4.6 4-6.6.6 6.9 0 25.5 19.6 46 10.8 11.3 22.4 21.9 33.9 32.7 9 8.5 18.3 16.7 25.5 26.8 1.1 1.6 2.2 3.3 3.8 4.7-5-13-14.2-24.1-24.2-33.8-9.6-9.3-19.4-18.4-29.2-27.4-3.3-3-4.6-6.7-5.1-10.9-1.2-10.4 0-20.6 4.3-30.2.5-1 1.1-2 1.9-3.3.5 4.2.6 7.9 1.4 11.6 4.8 23.1 20.4 36.3 49.3 63.5 10 9.4 19.3 19.2 25.6 31.6 4.8 9.3 7.3 19 5.7 29.6-.1.6.5 1.7 1.1 2 6.2 2.6 10 6.9 9.7 14.3 7.7-2.6 12.5-8 16.4-14.5 4.2 20.2-9.1 50.3-27.2 58.7.4-4.5 5-23.4-16.5-27.7-6.8-1.3-12.8-1.3-22.9-2.1 4.7-9 10.4-20.6.5-22.4-24.9-4.6-52.8 1.9-57.8 4.6 8.2.4 16.3 1 23.5 3.3-2 6.5-4 12.7-5.8 18.9-1.9 6.5 2.1 14.6 9.3 9.6 1.2-.9 2.3-1.9 3.3-2.7-3.1 17.9-2.9 15.9-2.8 18.3.3 10.2 9.5 7.8 15.7 7.3-2.5 11.8-29.5 27.3-45.4 25.8 7-4.7 12.7-10.3 15.9-17.9-6.5.8-12.9 1.6-19.2 2.4l-.3-.9c4.7-3.4 8-7.8 10.2-13.1 8.7-21.1-3.6-38-25-39.9-9.1-.8-17.8.8-25.9 5.5 6.2-15.6 17.2-26.6 32.6-34.5-15.2-4.3-8.9-2.7-24.6-6.3 14.6-9.3 30.2-13.2 46.5-14.6-5.2-3.2-48.1-3.6-70.2 20.9 7.9 1.4 15.5 2.8 23.2 4.2-23.8 7-44 19.7-62.4 35.6 1.1-4.8 2.7-9.5 3.3-14.3.6-4.5.8-9.2.1-13.6-1.5-9.4-8.9-15.1-19.7-16.3-7.9-.9-15.6.1-23.3 1.3-.9.1-1.7.3-2.9 0 15.8-14.8 36-21.7 53.1-33.5 6-4.5 6.8-8.2 3-14.9zm128.4 26.8c3.3 16 12.6 25.5 23.8 24.3-4.6-11.3-12.1-19.5-23.8-24.3z"],dashcube:[384,512,[],"f210","M288.1 97.5H85.5C37.6 97.5 0 138.1 0 185.2v215.1C0 447.7 37.6 480 85.5 480h213c47.9 0 85.5-32.3 85.5-79.7V0l-95.9 97.5zm-161.9 293c-16.6 0-30.4-14.2-30.4-30.8v-134c0-16.6 13.8-30.5 30.4-30.5h131.9c16.6 0 30 13.9 30 30.5v115.7l47.9 49H126.2z"],delicious:[448,512,[],"f1a5","M446.5 68c-.4-1.5-.9-3-1.4-4.5-.9-2.5-2-4.8-3.3-7.1-1.4-2.4-3-4.8-4.7-6.9-2.1-2.5-4.4-4.8-6.9-6.8-1.1-.9-2.2-1.7-3.3-2.5-1.3-.9-2.6-1.7-4-2.4-1.8-1-3.6-1.8-5.5-2.5-1.7-.7-3.5-1.3-5.4-1.7-3.8-1-7.9-1.5-12-1.5H48C21.5 32 0 53.5 0 80v352c0 4.1.5 8.2 1.5 12 2 7.7 5.8 14.6 11 20.3 1 1.1 2.1 2.2 3.3 3.3 5.7 5.2 12.6 9 20.3 11 3.8 1 7.9 1.5 12 1.5h352c26.5 0 48-21.5 48-48V80c-.1-4.1-.6-8.2-1.6-12zM416 432c0 8.8-7.2 16-16 16H224V256H32V80c0-8.8 7.2-16 16-16h176v192h192v176z"],deploydog:[512,512,[],"f38e","M382.2 136h51.7v239.6h-51.7v-20.7c-19.8 24.8-52.8 24.1-73.8 14.7-26.2-11.7-44.3-38.1-44.3-71.8 0-29.8 14.8-57.9 43.3-70.8 20.2-9.1 52.7-10.6 74.8 12.9V136zm-64.7 161.8c0 18.2 13.6 33.5 33.2 33.5 19.8 0 33.2-16.4 33.2-32.9 0-17.1-13.7-33.2-33.2-33.2-19.6 0-33.2 16.4-33.2 32.6zM188.5 136h51.7v239.6h-51.7v-20.7c-19.8 24.8-52.8 24.1-73.8 14.7-26.2-11.7-44.3-38.1-44.3-71.8 0-29.8 14.8-57.9 43.3-70.8 20.2-9.1 52.7-10.6 74.8 12.9V136zm-64.7 161.8c0 18.2 13.6 33.5 33.2 33.5 19.8 0 33.2-16.4 33.2-32.9 0-17.1-13.7-33.2-33.2-33.2-19.7 0-33.2 16.4-33.2 32.6zM448 96c17.5 0 32 14.4 32 32v256c0 17.5-14.4 32-32 32H64c-17.5 0-32-14.4-32-32V128c0-17.5 14.4-32 32-32h384m0-32H64C28.8 64 0 92.8 0 128v256c0 35.2 28.8 64 64 64h384c35.2 0 64-28.8 64-64V128c0-35.2-28.8-64-64-64z"],deskpro:[480,512,[],"f38f","M205.9 512l31.1-38.4c12.3-.2 25.6-1.4 36.5-6.6 38.9-18.6 38.4-61.9 38.3-63.8-.1-5-.8-4.4-28.9-37.4H362c-.2 50.1-7.3 68.5-10.2 75.7-9.4 23.7-43.9 62.8-95.2 69.4-8.7 1.1-32.8 1.2-50.7 1.1zm200.4-167.7c38.6 0 58.5-13.6 73.7-30.9l-175.5-.3-17.4 31.3 119.2-.1zm-43.6-223.9v168.3h-73.5l-32.7 55.5H250c-52.3 0-58.1-56.5-58.3-58.9-1.2-13.2-21.3-11.6-20.1 1.8 1.4 15.8 8.8 40 26.4 57.1h-91c-25.5 0-110.8-26.8-107-114V16.9C0 .9 9.7.3 15 .1h82c.2 0 .3.1.5.1 4.3-.4 50.1-2.1 50.1 43.7 0 13.3 20.2 13.4 20.2 0 0-18.2-5.5-32.8-15.8-43.7h84.2c108.7-.4 126.5 79.4 126.5 120.2zm-132.5 56l64 29.3c13.3-45.5-42.2-71.7-64-29.3z"],deviantart:[320,512,[],"f1bd","M320 93.2l-98.2 179.1 7.4 9.5H320v127.7H159.1l-13.5 9.2-43.7 84c-.3 0-8.6 8.6-9.2 9.2H0v-93.2l93.2-179.4-7.4-9.2H0V102.5h156l13.5-9.2 43.7-84c.3 0 8.6-8.6 9.2-9.2H320v93.1z"],digg:[512,512,[],"f1a6","M81.7 172.3H0v174.4h132.7V96h-51v76.3zm0 133.4H50.9v-92.3h30.8v92.3zm297.2-133.4v174.4h81.8v28.5h-81.8V416H512V172.3H378.9zm81.8 133.4h-30.8v-92.3h30.8v92.3zm-235.6 41h82.1v28.5h-82.1V416h133.3V172.3H225.1v174.4zm51.2-133.3h30.8v92.3h-30.8v-92.3zM153.3 96h51.3v51h-51.3V96zm0 76.3h51.3v174.4h-51.3V172.3z"],"digital-ocean":[512,512,[],"f391","M256 504v-96.1c101.8 0 180.8-100.9 141.7-208-14.3-39.6-46.1-71.4-85.8-85.7-107.1-38.8-208.1 39.9-208.1 141.7H8C8 93.7 164.9-32.8 335 20.3c74.2 23.3 133.6 82.4 156.6 156.6C544.8 347.2 418.6 504 256 504zm.3-191.4h-95.6v95.6h95.6v-95.6zm-95.6 95.6H87v73.6h73.7v-73.6zM87 346.6H25.4v61.6H87v-61.6z"],discord:[448,512,[],"f392","M297.216 243.2c0 15.616-11.52 28.416-26.112 28.416-14.336 0-26.112-12.8-26.112-28.416s11.52-28.416 26.112-28.416c14.592 0 26.112 12.8 26.112 28.416zm-119.552-28.416c-14.592 0-26.112 12.8-26.112 28.416s11.776 28.416 26.112 28.416c14.592 0 26.112-12.8 26.112-28.416.256-15.616-11.52-28.416-26.112-28.416zM448 52.736V512c-64.494-56.994-43.868-38.128-118.784-107.776l13.568 47.36H52.48C23.552 451.584 0 428.032 0 398.848V52.736C0 23.552 23.552 0 52.48 0h343.04C424.448 0 448 23.552 448 52.736zm-72.96 242.688c0-82.432-36.864-149.248-36.864-149.248-36.864-27.648-71.936-26.88-71.936-26.88l-3.584 4.096c43.52 13.312 63.744 32.512 63.744 32.512-60.811-33.329-132.244-33.335-191.232-7.424-9.472 4.352-15.104 7.424-15.104 7.424s21.248-20.224 67.328-33.536l-2.56-3.072s-35.072-.768-71.936 26.88c0 0-36.864 66.816-36.864 149.248 0 0 21.504 37.12 78.08 38.912 0 0 9.472-11.52 17.152-21.248-32.512-9.728-44.8-30.208-44.8-30.208 3.766 2.636 9.976 6.053 10.496 6.4 43.21 24.198 104.588 32.126 159.744 8.96 8.96-3.328 18.944-8.192 29.44-15.104 0 0-12.8 20.992-46.336 30.464 7.68 9.728 16.896 20.736 16.896 20.736 56.576-1.792 78.336-38.912 78.336-38.912z"],discourse:[448,512,[],"f393","M225.9 32C103.3 32 0 130.5 0 252.1 0 256 .1 480 .1 480l225.8-.2c122.7 0 222.1-102.3 222.1-223.9C448 134.3 348.6 32 225.9 32zM224 384c-19.4 0-37.9-4.3-54.4-12.1L88.5 392l22.9-75c-9.8-18.1-15.4-38.9-15.4-61 0-70.7 57.3-128 128-128s128 57.3 128 128-57.3 128-128 128z"],dochub:[416,512,[],"f394","M397.9 160H256V19.6L397.9 160zM304 192v130c0 66.8-36.5 100.1-113.3 100.1H96V84.8h94.7c12 0 23.1.8 33.1 2.5v-84C212.9 1.1 201.4 0 189.2 0H0v512h189.2C329.7 512 400 447.4 400 318.1V192h-96z"],docker:[640,512,[],"f395","M349.9 236.3h-66.1v-59.4h66.1v59.4zm0-204.3h-66.1v60.7h66.1V32zm78.2 144.8H362v59.4h66.1v-59.4zm-156.3-72.1h-66.1v60.1h66.1v-60.1zm78.1 0h-66.1v60.1h66.1v-60.1zm276.8 100c-14.4-9.7-47.6-13.2-73.1-8.4-3.3-24-16.7-44.9-41.1-63.7l-14-9.3-9.3 14c-18.4 27.8-23.4 73.6-3.7 103.8-8.7 4.7-25.8 11.1-48.4 10.7H2.4c-8.7 50.8 5.8 116.8 44 162.1 37.1 43.9 92.7 66.2 165.4 66.2 157.4 0 273.9-72.5 328.4-204.2 21.4.4 67.6.1 91.3-45.2 1.5-2.5 6.6-13.2 8.5-17.1l-13.3-8.9zm-511.1-27.9h-66v59.4h66.1v-59.4zm78.1 0h-66.1v59.4h66.1v-59.4zm78.1 0h-66.1v59.4h66.1v-59.4zm-78.1-72.1h-66.1v60.1h66.1v-60.1z"],draft2digital:[480,512,[],"f396","M369.9 425.4V371l47.1 27.2-47.1 27.2zM82.4 380.6c25.5-27.3 97.7-104.7 150.9-170 35.1-43.1 40.3-82.4 28.4-112.7-7.4-18.8-17.5-30.2-24.3-35.7 45.3 2.1 68 23.4 82.2 38.3 0 0 42.4 48.2 5.8 113.3-37 65.9-110.9 147.5-128.5 166.7H82.4zm51.8-219.2c0 12.4-10 22.4-22.4 22.4-12.4 0-22.4-10-22.4-22.4 0-12.4 10-22.4 22.4-22.4 12.4 0 22.4 10.1 22.4 22.4M336 315.9v64.7h-91.3c30.8-35 81.8-95.9 111.8-149.3 35.2-62.6 16.1-123.4-12.8-153.3-4.4-4.6-62.2-62.9-166-41.2-59.1 12.4-89.4 43.4-104.3 67.3-13.1 20.9-17 39.8-18.2 47.7-5.5 33 19.4 67.1 56.7 67.1 31.7 0 57.3-25.7 57.3-57.4 0-27.1-19.7-52.1-48-56.8 1.8-7.3 17.7-21.1 26.3-24.7 41.1-17.3 78 5.2 83.3 33.5 8.3 44.3-37.1 90.4-69.7 127.6C84.5 328.1 18.3 396.8 0 415.9l336-.1V480l144-81.9-144-82.2z"],dribbble:[512,512,[],"f17d","M256 8C119.252 8 8 119.252 8 256s111.252 248 248 248 248-111.252 248-248S392.748 8 256 8zm163.97 114.366c29.503 36.046 47.369 81.957 47.835 131.955-6.984-1.477-77.018-15.682-147.502-6.818-5.752-14.041-11.181-26.393-18.617-41.614 78.321-31.977 113.818-77.482 118.284-83.523zM396.421 97.87c-3.81 5.427-35.697 48.286-111.021 76.519-34.712-63.776-73.185-116.168-79.04-124.008 67.176-16.193 137.966 1.27 190.061 47.489zm-230.48-33.25c5.585 7.659 43.438 60.116 78.537 122.509-99.087 26.313-186.36 25.934-195.834 25.809C62.38 147.205 106.678 92.573 165.941 64.62zM44.17 256.323c0-2.166.043-4.322.108-6.473 9.268.19 111.92 1.513 217.706-30.146 6.064 11.868 11.857 23.915 17.174 35.949-76.599 21.575-146.194 83.527-180.531 142.306C64.794 360.405 44.17 310.73 44.17 256.323zm81.807 167.113c22.127-45.233 82.178-103.622 167.579-132.756 29.74 77.283 42.039 142.053 45.189 160.638-68.112 29.013-150.015 21.053-212.768-27.882zm248.38 8.489c-2.171-12.886-13.446-74.897-41.152-151.033 66.38-10.626 124.7 6.768 131.947 9.055-9.442 58.941-43.273 109.844-90.795 141.978z"],"dribbble-square":[448,512,[],"f397","M90.2 228.2c8.9-42.4 37.4-77.7 75.7-95.7 3.6 4.9 28 38.8 50.7 79-64 17-120.3 16.8-126.4 16.7zM314.6 154c-33.6-29.8-79.3-41.1-122.6-30.6 3.8 5.1 28.6 38.9 51 80 48.6-18.3 69.1-45.9 71.6-49.4zM140.1 364c40.5 31.6 93.3 36.7 137.3 18-2-12-10-53.8-29.2-103.6-55.1 18.8-93.8 56.4-108.1 85.6zm98.8-108.2c-3.4-7.8-7.2-15.5-11.1-23.2C159.6 253 93.4 252.2 87.4 252c0 1.4-.1 2.8-.1 4.2 0 35.1 13.3 67.1 35.1 91.4 22.2-37.9 67.1-77.9 116.5-91.8zm34.9 16.3c17.9 49.1 25.1 89.1 26.5 97.4 30.7-20.7 52.5-53.6 58.6-91.6-4.6-1.5-42.3-12.7-85.1-5.8zm-20.3-48.4c4.8 9.8 8.3 17.8 12 26.8 45.5-5.7 90.7 3.4 95.2 4.4-.3-32.3-11.8-61.9-30.9-85.1-2.9 3.9-25.8 33.2-76.3 53.9zM448 80v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V80c0-26.5 21.5-48 48-48h352c26.5 0 48 21.5 48 48zm-64 176c0-88.2-71.8-160-160-160S64 167.8 64 256s71.8 160 160 160 160-71.8 160-160z"],dropbox:[528,512,[],"f16b","M264.4 116.3l-132 84.3 132 84.3-132 84.3L0 284.1l132.3-84.3L0 116.3 132.3 32l132.1 84.3zM131.6 395.7l132-84.3 132 84.3-132 84.3-132-84.3zm132.8-111.6l132-84.3-132-83.6L395.7 32 528 116.3l-132.3 84.3L528 284.8l-132.3 84.3-131.3-85z"],drupal:[448,512,[],"f1a9","M319.5 114.7c-22.2-14-43.5-19.5-64.7-33.5-13-8.8-31.3-30-46.5-48.3-2.7 29.3-11.5 41.2-22 49.5-21.3 17-34.8 22.2-53.5 32.3C117 123 32 181.5 32 290.5 32 399.7 123.8 480 225.8 480 327.5 480 416 406 416 294c0-112.3-83-171-96.5-179.3zm2.5 325.6c-20.1 20.1-90.1 28.7-116.7 4.2-4.8-4.8.3-12 6.5-12 0 0 17 13.3 51.5 13.3 27 0 46-7.7 54.5-14 6.1-4.6 8.4 4.3 4.2 8.5zm-54.5-52.6c8.7-3.6 29-3.8 36.8 1.3 4.1 2.8 16.1 18.8 6.2 23.7-8.4 4.2-1.2-15.7-26.5-15.7-14.7 0-19.5 5.2-26.7 11-7 6-9.8 8-12.2 4.7-6-8.2 15.9-22.3 22.4-25zM360 405c-15.2-1-45.5-48.8-65-49.5-30.9-.9-104.1 80.7-161.3 42-38.8-26.6-14.6-104.8 51.8-105.2 49.5-.5 83.8 49 108.5 48.5 21.3-.3 61.8-41.8 81.8-41.8 48.7 0 23.3 109.3-15.8 106z"],dyalog:[416,512,[],"f399","M0 32v119.2h64V96h107.2C284.6 96 352 176.2 352 255.9 352 332 293.4 416 171.2 416H0v64h171.2C331.9 480 416 367.3 416 255.9c0-58.7-22.1-113.4-62.3-154.3C308.9 56 245.7 32 171.2 32H0z"],earlybirds:[480,512,[],"f39a","M313.2 47.5c1.2-13 21.3-14 36.6-8.7.9.3 26.2 9.7 19 15.2-27.9-7.4-56.4 18.2-55.6-6.5zm-201 6.9c30.7-8.1 62 20 61.1-7.1-1.3-14.2-23.4-15.3-40.2-9.6-1 .3-28.7 10.5-20.9 16.7zM319.4 160c-8.8 0-16 7.2-16 16s7.2 16 16 16 16-7.2 16-16-7.2-16-16-16zm-159.7 0c-8.8 0-16 7.2-16 16s7.2 16 16 16 16-7.2 16-16-7.2-16-16-16zm318.5 163.2c-9.9 24-40.7 11-63.9-1.2-13.5 69.1-58.1 111.4-126.3 124.2.3.9-2-.1 24 1 33.6 1.4 63.8-3.1 97.4-8-19.8-13.8-11.4-37.1-9.8-38.1 1.4-.9 14.7 1.7 21.6 11.5 8.6-12.5 28.4-14.8 30.2-13.6 1.6 1.1 6.6 20.9-6.9 34.6 4.7-.9 8.2-1.6 9.8-2.1 2.6-.8 17.7 11.3 3.1 13.3-14.3 2.3-22.6 5.1-47.1 10.8-45.9 10.7-85.9 11.8-117.7 12.8l1 11.6c3.8 18.1-23.4 24.3-27.6 6.2.8 17.9-27.1 21.8-28.4-1l-.5 5.3c-.7 18.4-28.4 17.9-28.3-.6-7.5 13.5-28.1 6.8-26.4-8.5l1.2-12.4c-36.7.9-59.7 3.1-61.8 3.1-20.9 0-20.9-31.6 0-31.6 2.4 0 27.7 1.3 63.2 2.8-61.1-15.5-103.7-55-114.9-118.2-25 12.8-57.5 26.8-68.2.8-10.5-25.4 21.5-42.6 66.8-73.4.7-6.6 1.6-13.3 2.7-19.8-14.4-19.6-11.6-36.3-16.1-60.4-16.8 2.4-23.2-9.1-23.6-23.1.3-7.3 2.1-14.9 2.4-15.4 1.1-1.8 10.1-2 12.7-2.6 6-31.7 50.6-33.2 90.9-34.5 19.7-21.8 45.2-41.5 80.9-48.3C203.3 29 215.2 8.5 216.2 8c1.7-.8 21.2 4.3 26.3 23.2 5.2-8.8 18.3-11.4 19.6-10.7 1.1.6 6.4 15-4.9 25.9 40.3 3.5 72.2 24.7 96 50.7 36.1 1.5 71.8 5.9 77.1 34 2.7.6 11.6.8 12.7 2.6.3.5 2.1 8.1 2.4 15.4-.5 13.9-6.8 25.4-23.6 23.1-3.2 17.3-2.7 32.9-8.7 47.7 2.4 11.7 4 23.8 4.8 36.4 37 25.4 70.3 42.5 60.3 66.9zM207.4 159.9c.9-44-37.9-42.2-78.6-40.3-21.7 1-38.9 1.9-45.5 13.9-11.4 20.9 5.9 92.9 23.2 101.2 9.8 4.7 73.4 7.9 86.3-7.1 8.2-9.4 15-49.4 14.6-67.7zm52 58.3c-4.3-12.4-6-30.1-15.3-32.7-2-.5-9-.5-11 0-10 2.8-10.8 22.1-17 37.2 15.4 0 19.3 9.7 23.7 9.7 4.3 0 6.3-11.3 19.6-14.2zm135.7-84.7c-6.6-12.1-24.8-12.9-46.5-13.9-40.2-1.9-78.2-3.8-77.3 40.3-.5 18.3 5 58.3 13.2 67.8 13 14.9 76.6 11.8 86.3 7.1 15.8-7.6 36.5-78.9 24.3-101.3z"],edge:[512,512,[],"f282","M25.714 228.163c.111-.162.23-.323.342-.485-.021.162-.045.323-.065.485h-.277zm460.572 15.508c0-44.032-7.754-84.465-28.801-122.405C416.498 47.879 343.912 8.001 258.893 8.001 118.962 7.724 40.617 113.214 26.056 227.679c42.429-61.312 117.073-121.376 220.375-124.966 0 0 109.666 0 99.419 104.957H169.997c6.369-37.386 18.554-58.986 34.339-78.926-75.048 34.893-121.85 96.096-120.742 188.315.83 71.448 50.124 144.836 120.743 171.976 83.357 31.847 192.776 7.2 240.132-21.324V363.307c-80.864 56.494-270.871 60.925-272.255-67.572h314.073v-52.064z"],ember:[640,512,[],"f423","M639.9 311.7c-1.1-10.7-10.7-6.8-10.7-6.8s-15.6 12.1-29.3 10.7c-13.7-1.3-9.4-32-9.4-32s3-28.1-5.1-30.4c-8.1-2.4-18 7.3-18 7.3s-12.4 13.7-18.3 31.2l-1.6.5s1.9-30.6-.3-37.6c-1.6-3.5-16.4-3.2-18.8 3-2.4 6.2-14.2 49.2-15 67.2 0 0-23.1 19.6-43.3 22.8-20.2 3.2-25-9.4-25-9.4s54.8-15.3 52.9-59.1c-1.9-43.8-44.2-27.6-49-24-4.6 3.5-29.4 18.4-36.6 59.7-.2 1.4-.7 7.5-.7 7.5s-21.2 14.2-33 18c0 0 33-55.6-7.3-80.9-18.3-11-32.8 12.1-32.8 12.1s54.5-60.7 42.5-112c-5.8-24.4-18-27.1-29.2-23.1-17 6.7-23.5 16.7-23.5 16.7s-22 32-27.1 79.5-12.6 105.1-12.6 105.1-10.5 10.2-20.2 10.7-5.4-28.7-5.4-28.7 7.5-44.6 7-52.1-1.1-11.6-9.9-14.2c-8.9-2.7-18.5 8.6-18.5 8.6s-25.5 38.7-27.7 44.6l-1.3 2.4-1.3-1.6s18-52.7.8-53.5-28.5 18.8-28.5 18.8-19.6 32.8-20.4 36.5l-1.3-1.6s8.1-38.2 6.4-47.6c-1.6-9.4-10.5-7.5-10.5-7.5s-11.3-1.3-14.2 5.9c-3 7.3-13.7 55.3-15 70.7 0 0-28.2 20.2-46.8 20.4s-16.7-11.8-16.7-11.8 68-23.3 49.4-69.2c-8.3-11.8-18-15.5-31.7-15.3-13.7.3-30.3 8.6-41.3 33.3-5.3 11.8-6.8 23-7.8 31.5 0 0-12.3 2.4-18.8-2.9-6.4-5.4-10 0-10 0s-11.2 13.9-.1 18.2c11 4.3 28.1 6.1 28.1 6.1 1.6 7.5 6.2 19.5 19.6 29.7 20.2 15.3 58.8-1.3 58.8-1.3l15.9-8.8s.5 14.6 12.1 16.7c11.6 2.1 16.4 1 36.5-47.9 11.8-25 12.6-23.6 12.6-23.6l1.3-.3s-9.1 46.8-5.6 59.7c3.5 12.9 18.8 11.6 18.8 11.6s8.3 2.4 15-21.2c6.7-23.6 19.6-49.9 19.6-49.9h1.6s-5.6 48.1 3 63.7c8.6 15.6 30.9 5.3 30.9 5.3s15.6-7.8 18-10.2c0 0 18.5 15.8 44.6 12.9 58.3-11.5 79.1-25.9 79.1-25.9s10 24.4 41.1 26.7c35.5 2.7 54.8-18.6 54.8-18.6s-.3 13.5 12.1 18.6c12.4 5.1 20.7-22.8 20.7-22.8l20.7-57.2h1.9s1.1 37.3 21.5 43.2c20.4 5.9 47-13.7 47-13.7s6.4-3.7 5.3-14.4zm-578 5.3c.8-32 21.8-45.9 29-39 7.3 7 4.6 22-9.1 31.4-13.7 9.5-19.9 7.6-19.9 7.6zm272.8-123.9s19.1-49.7 23.6-25.5-40 96.2-40 96.2c.5-16.1 16.4-70.7 16.4-70.7zm22.8 138.4c-12.6 33-43.3 19.6-43.3 19.6s-3.5-11.8 6.4-44.9 33.3-20.2 33.3-20.2 16.2 12.5 3.6 45.5zm84.6-14.5s-3-10.5 8.1-30.6c11-20.2 19.6-9.1 19.6-9.1s9.4 10.2-1.3 25.5c-10.8 15.3-26.4 14.2-26.4 14.2z"],empire:[496,512,[],"f1d1","M287.6 54.2c-10.8-2.2-22.1-3.3-33.5-3.6V32.4c78.1 2.2 146.1 44 184.6 106.6l-15.8 9.1c-6.1-9.7-12.7-18.8-20.2-27.1l-18 15.5c-26-29.6-61.4-50.7-101.9-58.4l4.8-23.9zM53.4 322.4l23-7.7c-6.4-18.3-10-38.2-10-58.7s3.3-40.4 9.7-58.7l-22.7-7.7c3.6-10.8 8.3-21.3 13.6-31l-15.8-9.1C34 181 24.1 217.5 24.1 256s10 75 27.1 106.6l15.8-9.1c-5.3-10-9.7-20.3-13.6-31.1zM213.1 434c-40.4-8-75.8-29.1-101.9-58.7l-18 15.8c-7.5-8.6-14.4-17.7-20.2-27.4l-16 9.4c38.5 62.3 106.8 104.3 184.9 106.6v-18.3c-11.3-.3-22.7-1.7-33.5-3.6l4.7-23.8zM93.3 120.9l18 15.5c26-29.6 61.4-50.7 101.9-58.4l-4.7-23.8c10.8-2.2 22.1-3.3 33.5-3.6V32.4C163.9 34.6 95.9 76.4 57.4 139l15.8 9.1c6-9.7 12.6-18.9 20.1-27.2zm309.4 270.2l-18-15.8c-26 29.6-61.4 50.7-101.9 58.7l4.7 23.8c-10.8 1.9-22.1 3.3-33.5 3.6v18.3c78.1-2.2 146.4-44.3 184.9-106.6l-16.1-9.4c-5.7 9.7-12.6 18.8-20.1 27.4zM496 256c0 137-111 248-248 248S0 393 0 256 111 8 248 8s248 111 248 248zm-12.2 0c0-130.1-105.7-235.8-235.8-235.8S12.2 125.9 12.2 256 117.9 491.8 248 491.8 483.8 386.1 483.8 256zm-39-106.6l-15.8 9.1c5.3 9.7 10 20.2 13.6 31l-22.7 7.7c6.4 18.3 9.7 38.2 9.7 58.7s-3.6 40.4-10 58.7l23 7.7c-3.9 10.8-8.3 21-13.6 31l15.8 9.1C462 331 471.9 294.5 471.9 256s-9.9-75-27.1-106.6zm-183 177.7c16.3-3.3 30.4-11.6 40.7-23.5l51.2 44.8c11.9-13.6 21.3-29.3 27.1-46.8l-64.2-22.1c2.5-7.5 3.9-15.2 3.9-23.5s-1.4-16.1-3.9-23.5l64.5-22.1c-6.1-17.4-15.5-33.2-27.4-46.8l-51.2 44.8c-10.2-11.9-24.4-20.5-40.7-23.8l13.3-66.4c-8.6-1.9-17.7-2.8-27.1-2.8-9.4 0-18.5.8-27.1 2.8l13.3 66.4c-16.3 3.3-30.4 11.9-40.7 23.8l-51.2-44.8c-11.9 13.6-21.3 29.3-27.4 46.8l64.5 22.1c-2.5 7.5-3.9 15.2-3.9 23.5s1.4 16.1 3.9 23.5l-64.2 22.1c5.8 17.4 15.2 33.2 27.1 46.8l51.2-44.8c10.2 11.9 24.4 20.2 40.7 23.5l-13.3 66.7c8.6 1.7 17.7 2.8 27.1 2.8 9.4 0 18.5-1.1 27.1-2.8l-13.3-66.7z"],envira:[448,512,[],"f299","M0 32c477.6 0 366.6 317.3 367.1 366.3L448 480h-26l-70.4-71.2c-39 4.2-124.4 34.5-214.4-37C47 300.3 52 214.7 0 32zm79.7 46c-49.7-23.5-5.2 9.2-5.2 9.2 45.2 31.2 66 73.7 90.2 119.9 31.5 60.2 79 139.7 144.2 167.7 65 28 34.2 12.5 6-8.5-28.2-21.2-68.2-87-91-130.2-31.7-60-61-118.6-144.2-158.1z"],erlang:[640,512,[],"f39d","M21.7 193c-.1 86.8 29 159.5 78.7 212.1H0V.1h87.2C45.7 50.3 21.6 116.2 21.7 193zM640 .1h-83.6c31.4 42.7 48.7 97.5 46.2 162.7.5 6 .5 11.7 0 24.1H230.2c-.2 109.7 38.9 194.9 138.6 195.3 68.5-.3 118-51 151.9-106.1l96.4 48.2c-17.4 30.9-36.5 57.8-57.9 80.8H640V.1zm-80.8 405h-.2.2zM556.1.1h.3l-.1-.1-.2.1zM325.4 9.8c-45.9.1-85.1 33.5-89.2 83.2h169.9C405 43.3 371.6 9.9 325.4 9.8z"],etsy:[384,512,[],"f2d7","M384 348c-1.75 10.75-13.75 110-15.5 132-117.879-4.299-219.895-4.743-368.5 0v-25.5c45.457-8.948 60.627-8.019 61-35.25 1.793-72.322 3.524-244.143 0-322-1.029-28.46-12.13-26.765-61-36v-25.5c73.886 2.358 255.933 8.551 362.999-3.75-3.5 38.25-7.75 126.5-7.75 126.5H332C320.947 115.665 313.241 68 277.25 68h-137c-10.25 0-10.75 3.5-10.75 9.75V241.5c58 .5 88.5-2.5 88.5-2.5 29.77-.951 27.56-8.502 40.75-65.251h25.75c-4.407 101.351-3.91 61.829-1.75 160.25H257c-9.155-40.086-9.065-61.045-39.501-61.5 0 0-21.5-2-88-2v139c0 26 14.25 38.25 44.25 38.25H263c63.636 0 66.564-24.996 98.751-99.75H384z"],expeditedssl:[496,512,[],"f23e","M248 43.4C130.6 43.4 35.4 138.6 35.4 256S130.6 468.6 248 468.6 460.6 373.4 460.6 256 365.4 43.4 248 43.4zm-97.4 132.9c0-53.7 43.7-97.4 97.4-97.4s97.4 43.7 97.4 97.4v26.6c0 5-3.9 8.9-8.9 8.9h-17.7c-5 0-8.9-3.9-8.9-8.9v-26.6c0-82.1-124-82.1-124 0v26.6c0 5-3.9 8.9-8.9 8.9h-17.7c-5 0-8.9-3.9-8.9-8.9v-26.6zM389.7 380c0 9.7-8 17.7-17.7 17.7H124c-9.7 0-17.7-8-17.7-17.7V238.3c0-9.7 8-17.7 17.7-17.7h248c9.7 0 17.7 8 17.7 17.7V380zm-248-137.3v132.9c0 2.5-1.9 4.4-4.4 4.4h-8.9c-2.5 0-4.4-1.9-4.4-4.4V242.7c0-2.5 1.9-4.4 4.4-4.4h8.9c2.5 0 4.4 1.9 4.4 4.4zm141.7 48.7c0 13-7.2 24.4-17.7 30.4v31.6c0 5-3.9 8.9-8.9 8.9h-17.7c-5 0-8.9-3.9-8.9-8.9v-31.6c-10.5-6.1-17.7-17.4-17.7-30.4 0-19.7 15.8-35.4 35.4-35.4s35.5 15.8 35.5 35.4zM248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 478.3C121 486.3 17.7 383 17.7 256S121 25.7 248 25.7 478.3 129 478.3 256 375 486.3 248 486.3z"],facebook:[448,512,[],"f09a","M448 56.7v398.5c0 13.7-11.1 24.7-24.7 24.7H309.1V306.5h58.2l8.7-67.6h-67v-43.2c0-19.6 5.4-32.9 33.5-32.9h35.8v-60.5c-6.2-.8-27.4-2.7-52.2-2.7-51.6 0-87 31.5-87 89.4v49.9h-58.4v67.6h58.4V480H24.7C11.1 480 0 468.9 0 455.3V56.7C0 43.1 11.1 32 24.7 32h398.5c13.7 0 24.8 11.1 24.8 24.7z"],"facebook-f":[264,512,[],"f39e","M76.7 512V283H0v-91h76.7v-71.7C76.7 42.4 124.3 0 193.8 0c33.3 0 61.9 2.5 70.2 3.6V85h-48.2c-37.8 0-45.1 18-45.1 44.3V192H256l-11.7 91h-73.6v229"],"facebook-messenger":[448,512,[],"f39f","M224 32C15.9 32-77.5 278 84.6 400.6V480l75.7-42c142.2 39.8 285.4-59.9 285.4-198.7C445.8 124.8 346.5 32 224 32zm23.4 278.1L190 250.5 79.6 311.6l121.1-128.5 57.4 59.6 110.4-61.1-121.1 128.5z"],"facebook-square":[448,512,[],"f082","M448 80v352c0 26.5-21.5 48-48 48h-85.3V302.8h60.6l8.7-67.6h-69.3V192c0-19.6 5.4-32.9 33.5-32.9H384V98.7c-6.2-.8-27.4-2.7-52.2-2.7-51.6 0-87 31.5-87 89.4v49.9H184v67.6h60.9V480H48c-26.5 0-48-21.5-48-48V80c0-26.5 21.5-48 48-48h352c26.5 0 48 21.5 48 48z"],firefox:[480,512,[],"f269","M478.1 235.3c-.7-4.5-1.4-7.1-1.4-7.1s-1.8 2-4.7 5.9c-.9-10.7-2.8-21.2-5.8-31.6-3.7-12.9-8.5-25.4-14.5-37.4-3.8-8-8.2-15.6-13.3-22.8-1.8-2.7-3.7-5.4-5.6-7.9-8.8-14.4-19-23.3-30.7-40-7.6-12.8-12.9-26.9-15.4-41.6-3.2 8.9-5.7 18-7.4 27.3-12.1-12.2-22.5-20.8-28.9-26.7C319.4 24.2 323 9.1 323 9.1S264.7 74.2 289.9 142c8.7 23 23.8 43.1 43.4 57.9 24.4 20.2 50.8 36 64.7 76.6-11.2-21.3-28.1-39.2-48.8-51.5 6.2 14.7 9.4 30.6 9.3 46.5 0 61-49.6 110.5-110.6 110.4-8.3 0-16.5-.9-24.5-2.8-9.5-1.8-18.7-4.9-27.4-9.3-12.9-7.8-24-18.1-32.8-30.3l-.2-.3 2 .7c4.6 1.6 9.2 2.8 14 3.7 18.7 4 38.3 1.7 55.6-6.6 17.5-9.7 28-16.9 36.6-14h.2c8.4 2.7 15-5.5 9-14-10.4-13.4-27.4-20-44.2-17-17.5 2.5-33.5 15-56.4 2.9-1.5-.8-2.9-1.6-4.3-2.5-1.6-.9 4.9 1.3 3.4.3-5-2.5-9.8-5.4-14.4-8.6-.3-.3 3.5 1.1 3.1.8-5.9-4-11-9.2-15-15.2-4.1-7.4-4.5-16.4-1-24.1 2.1-3.8 5.4-6.9 9.3-8.7 3 1.5 4.8 2.6 4.8 2.6s-1.3-2.5-2.1-3.8c.3-.1.5 0 .8-.2 2.6 1.1 8.3 4 11.4 5.8 2.1 1.1 3.8 2.7 5.2 4.7 0 0 1-.5.3-2.7-1.1-2.7-2.9-5-5.4-6.6h.2c2.3 1.2 4.5 2.6 6.6 4.1 1.9-4.4 2.8-9.2 2.6-14 .2-2.6-.2-5.3-1.1-7.8-.8-1.6.5-2.2 1.9-.5-.2-1.3-.7-2.5-1.2-3.7v-.1s.8-1.1 1.2-1.5c1-1 2.1-1.9 3.4-2.7 7.2-4.5 14.8-8.4 22.7-11.6 6.4-2.8 11.7-4.9 12.8-5.6 1.6-1 3.1-2.2 4.5-3.5 5.3-4.5 9-10.8 10.2-17.7.1-.9.2-1.8.3-2.8v-1.5c-.9-3.5-6.9-6.1-38.4-9.1-11.1-1.8-20-10.1-22.5-21.1v.1c-.4 1.1-.9 2.3-1.3 3.5.4-1.2.8-2.3 1.3-3.5v-.2c6-15.7 16.8-29.1 30.8-38.3.8-.7-3.2.2-2.4-.5 2.7-1.3 5.4-2.5 8.2-3.5 1.4-.6-6-3.4-12.6-2.7-4 .2-8 1.2-11.7 2.8 1.6-1.3 6.2-3.1 5.1-3.1-8.4 1.6-16.5 4.7-23.9 9 0-.8.1-1.5.5-2.2-5.9 2.5-11 6.5-15 11.5.1-.9.2-1.8.2-2.7-2.7 2-5.2 4.3-7.3 6.9l-.1.1c-17.4-6.7-36.3-8.3-54.6-4.7l-.2-.1h.2c-3.8-3.1-7.1-6.7-9.7-10.9l-.2.1-.4-.2c-1.2-1.8-2.4-3.8-3.7-6-.9-1.6-1.8-3.4-2.7-5.2 0-.1-.1-.2-.2-.2-.4 0-.6 1.7-.9 1.3v-.1c-3.2-8.3-4.7-17.2-4.4-26.2l-.2.1c-5.1 3.5-9 8.6-11.1 14.5-.9 2.1-1.6 3.3-2.2 4.5v-.5c.1-1.1.6-3.3.5-3.1-.1.2-.2.3-.3.4-1.5 1.7-2.9 3.7-3.9 5.8-.9 1.9-1.7 3.9-2.3 5.9-.1.3 0-.3 0-1s.1-2 0-1.7l-.3.7c-6.7 14.9-10.9 30.8-12.4 47.1-.4 2.8-.6 5.6-.5 8.3v.2c-4.8 5.2-9 11-12.7 17.1-12.1 20.4-21.1 42.5-26.8 65.6 4-8.8 8.8-17.2 14.3-25.1C5.5 228.5 0 257.4 0 286.6c1.8-8.6 4.2-17 7-25.3-1.7 34.5 4.9 68.9 19.4 100.3 19.4 43.5 51.6 80 92.3 104.7 16.6 11.2 34.7 19.9 53.8 25.8 2.5.9 5.1 1.8 7.7 2.7-.8-.3-1.6-.7-2.4-1 22.6 6.8 46.2 10.3 69.8 10.3 83.7 0 111.3-31.9 113.8-35 4.1-3.7 7.5-8.2 9.9-13.3 1.6-.7 3.2-1.4 4.9-2.1l1-.5 1.9-.9c12.6-5.9 24.5-13.4 35.3-22.1 16.3-11.7 27.9-28.7 32.9-48.1 3-7.1 3.1-15 .4-22.2.9-1.4 1.7-2.8 2.7-4.3 18-28.9 28.2-61.9 29.6-95.9v-2.8c0-7.3-.6-14.5-1.9-21.6z"],"first-order":[448,512,[],"f2b0","M12.9 229.2c.1-.1.2-.3.3-.4 0 .1 0 .3-.1.4h-.2zM224 96.6c-7.1 0-14.6.6-21.4 1.7l3.7 67.4-22-64c-14.3 3.7-27.7 9.4-40 16.6l29.4 61.4-45.1-50.9c-11.4 8.9-21.7 19.1-30.6 30.9l50.6 45.4-61.1-29.7c-7.1 12.3-12.9 25.7-16.6 40l64.3 22.6-68-4c-.9 7.1-1.4 14.6-1.4 22s.6 14.6 1.4 21.7l67.7-4-64 22.6c3.7 14.3 9.4 27.7 16.6 40.3l61.1-29.7L97.7 352c8.9 11.7 19.1 22.3 30.9 30.9l44.9-50.9-29.5 61.4c12.3 7.4 25.7 13.1 40 16.9l22.3-64.6-4 68c7.1 1.1 14.6 1.7 21.7 1.7 7.4 0 14.6-.6 21.7-1.7l-4-68.6 22.6 65.1c14.3-4 27.7-9.4 40-16.9L274.9 332l44.9 50.9c11.7-8.9 22-19.1 30.6-30.9l-50.6-45.1 61.1 29.4c7.1-12.3 12.9-25.7 16.6-40.3l-64-22.3 67.4 4c1.1-7.1 1.4-14.3 1.4-21.7s-.3-14.9-1.4-22l-67.7 4 64-22.3c-3.7-14.3-9.1-28-16.6-40.3l-60.9 29.7 50.6-45.4c-8.9-11.7-19.1-22-30.6-30.9l-45.1 50.9 29.4-61.1c-12.3-7.4-25.7-13.1-40-16.9L241.7 166l4-67.7c-7.1-1.2-14.3-1.7-21.7-1.7zM443.4 128v256L224 512 4.6 384V128L224 0l219.4 128zm-17.1 10.3L224 20.9 21.7 138.3v235.1L224 491.1l202.3-117.7V138.3zM224 37.1l187.7 109.4v218.9L224 474.9 36.3 365.4V146.6L224 37.1zm0 50.9c-92.3 0-166.9 75.1-166.9 168 0 92.6 74.6 167.7 166.9 167.7 92 0 166.9-75.1 166.9-167.7 0-92.9-74.9-168-166.9-168z"],firstdraft:[384,512,[],"f3a1","M384 192h-64v128H192v128H0v-25.6h166.4v-128h128v-128H384V192zm-25.6 38.4v128h-128v128H64V512h192V384h128V230.4h-25.6zm25.6 192h-89.6V512H320v-64h64v-25.6zM0 0v384h128V256h128V128h128V0H0z"],flickr:[448,512,[],"f16e","M400 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zM144.5 319c-35.1 0-63.5-28.4-63.5-63.5s28.4-63.5 63.5-63.5 63.5 28.4 63.5 63.5-28.4 63.5-63.5 63.5zm159 0c-35.1 0-63.5-28.4-63.5-63.5s28.4-63.5 63.5-63.5 63.5 28.4 63.5 63.5-28.4 63.5-63.5 63.5z"],fly:[384,512,[],"f417","M197.8 427.8c12.9 11.7 33.7 33.3 33.2 50.7 0 .8-.1 1.6-.1 2.5-1.8 19.8-18.8 31.1-39.1 31-25-.1-39.9-16.8-38.7-35.8 1-16.2 20.5-36.7 32.4-47.6 2.3-2.1 2.7-2.7 5.6-3.6 3.4 0 3.9.3 6.7 2.8zM331.9 67.3c-16.3-25.7-38.6-40.6-63.3-52.1C243.1 4.5 214-.2 192 0c-44.1 0-71.2 13.2-81.1 17.3C57.3 45.2 26.5 87.2 28 158.6c7.1 82.2 97 176 155.8 233.8 1.7 1.6 4.5 4.5 6.2 5.1l3.3.1c2.1-.7 1.8-.5 3.5-2.1 52.3-49.2 140.7-145.8 155.9-215.7 7-39.2 3.1-72.5-20.8-112.5zM186.8 351.9c-28-51.1-65.2-130.7-69.3-189-3.4-47.5 11.4-131.2 69.3-136.7v325.7zM328.7 180c-16.4 56.8-77.3 128-118.9 170.3C237.6 298.4 275 217 277 158.4c1.6-45.9-9.8-105.8-48-131.4 88.8 18.3 115.5 98.1 99.7 153z"],"font-awesome":[448,512,[],"f2b4","M397.8 32H50.2C22.7 32 0 54.7 0 82.2v347.6C0 457.3 22.7 480 50.2 480h347.6c27.5 0 50.2-22.7 50.2-50.2V82.2c0-27.5-22.7-50.2-50.2-50.2zm-45.4 284.3c0 4.2-3.6 6-7.8 7.8-16.7 7.2-34.6 13.7-53.8 13.7-26.9 0-39.4-16.7-71.7-16.7-23.3 0-47.8 8.4-67.5 17.3-1.2.6-2.4.6-3.6 1.2V385c0 1.8 0 3.6-.6 4.8v1.2c-2.4 8.4-10.2 14.3-19.1 14.3-11.3 0-20.3-9-20.3-20.3V166.4c-7.8-6-13.1-15.5-13.1-26.3 0-18.5 14.9-33.5 33.5-33.5 18.5 0 33.5 14.9 33.5 33.5 0 10.8-4.8 20.3-13.1 26.3v18.5c1.8-.6 3.6-1.2 5.4-2.4 18.5-7.8 40.6-14.3 61.5-14.3 22.7 0 40.6 6 60.9 13.7 4.2 1.8 8.4 2.4 13.1 2.4 22.7 0 47.8-16.1 53.8-16.1 4.8 0 9 3.6 9 7.8v140.3z"],"font-awesome-alt":[448,512,[],"f35c","M397.8 67.8c7.8 0 14.3 6.6 14.3 14.3v347.6c0 7.8-6.6 14.3-14.3 14.3H50.2c-7.8 0-14.3-6.6-14.3-14.3V82.2c0-7.8 6.6-14.3 14.3-14.3h347.6m0-35.9H50.2C22.7 32 0 54.7 0 82.2v347.6C0 457.3 22.7 480 50.2 480h347.6c27.5 0 50.2-22.7 50.2-50.2V82.2c0-27.5-22.7-50.2-50.2-50.2zm-58.5 139.2c-6 0-29.9 15.5-52.6 15.5-4.2 0-8.4-.6-12.5-2.4-19.7-7.8-37-13.7-59.1-13.7-20.3 0-41.8 6.6-59.7 13.7-1.8.6-3.6 1.2-4.8 1.8v-17.9c7.8-6 12.5-14.9 12.5-25.7 0-17.9-14.3-32.3-32.3-32.3s-32.3 14.3-32.3 32.3c0 10.2 4.8 19.7 12.5 25.7v212.1c0 10.8 9 19.7 19.7 19.7 9 0 16.1-6 18.5-13.7V385c.6-1.8.6-3 .6-4.8V336c1.2 0 2.4-.6 3-1.2 19.7-8.4 43-16.7 65.7-16.7 31.1 0 43 16.1 69.3 16.1 18.5 0 36.4-6.6 52-13.7 4.2-1.8 7.2-3.6 7.2-7.8V178.3c1.8-4.1-2.3-7.1-7.7-7.1z"],"font-awesome-flag":[448,512,[],"f425","M444.373 359.424c0 7.168-6.144 10.24-13.312 13.312-28.672 12.288-59.392 23.552-92.16 23.552-46.08 0-67.584-28.672-122.88-28.672-39.936 0-81.92 14.336-115.712 29.696-2.048 1.024-4.096 1.024-6.144 2.048v77.824c0 21.405-16.122 34.816-33.792 34.816-19.456 0-34.816-15.36-34.816-34.816V102.4C12.245 92.16 3.029 75.776 3.029 57.344 3.029 25.6 28.629 0 60.373 0s57.344 25.6 57.344 57.344c0 18.432-8.192 34.816-22.528 45.056v31.744c4.124-1.374 58.768-28.672 114.688-28.672 65.27 0 97.676 27.648 126.976 27.648 38.912 0 81.92-27.648 92.16-27.648 8.192 0 15.36 6.144 15.36 13.312v240.64z"],fonticons:[448,512,[],"f280","M0 32v448h448V32H0zm167.4 196h67.4l-11.1 37.3H168v112.9c0 5.8-2 6.7 3.2 7.3l43.5 4.1v25.1H84V389l21.3-2c5.2-.6 6.7-2.3 6.7-7.9V267.7c0-2.3-2.9-2.3-5.8-2.3H84V228h28v-21c0-49.6 26.5-70 77.3-70 34.1 0 64.7 8.2 64.7 52.8l-50.7 6.1c.3-18.7-4.4-23-16.3-23-18.4 0-19 9.9-19 27.4v23.3c0 2.4-3.5 4.4-.6 4.4zM364 414.7H261.3v-25.1l20.4-2.6c5.2-.6 7.6-1.7 7.6-7.3V271.8c0-4.1-2.9-6.7-6.7-7.9l-24.2-6.4 6.7-29.5h80.2v151.7c0 5.8-2.6 6.4 2.9 7.3l15.7 2.6v25.1zm-21.9-255.5l9 33.2-7.3 7.3-31.2-16.6-31.2 16.6-7.3-7.3 9-33.2-21.8-24.2 3.5-9.6h27.7l15.5-28h9.3l15.5 28h27.7l3.5 9.6-21.9 24.2z"],"fonticons-fi":[384,512,[],"f3a2","M114.4 224h92.4l-15.2 51.2h-76.4V433c0 8-2.8 9.2 4.4 10l59.6 5.6V483H0v-35.2l29.2-2.8c7.2-.8 9.2-3.2 9.2-10.8V278.4c0-3.2-4-3.2-8-3.2H0V224h38.4v-28.8c0-68 36.4-96 106-96 46.8 0 88.8 11.2 88.8 72.4l-69.6 8.4c.4-25.6-6-31.6-22.4-31.6-25.2 0-26 13.6-26 37.6v32c0 3.2-4.8 6-.8 6zM384 483H243.2v-34.4l28-3.6c7.2-.8 10.4-2.4 10.4-10V287c0-5.6-4-9.2-9.2-10.8l-33.2-8.8 9.2-40.4h110v208c0 8-3.6 8.8 4 10l21.6 3.6V483zm-30-347.2l12.4 45.6-10 10-42.8-22.8-42.8 22.8-10-10 12.4-45.6-30-36.4 4.8-10h38L307.2 51H320l21.2 38.4h38l4.8 13.2-30 33.2z"],"fort-awesome":[448,512,[],"f286","M412 284h-24c-2.25 0-4 1.75-4 4v28h-32V160c0-2.25-1.75-4-4-4h-24c-2.25 0-4 1.75-4 4v28h-32v-28c0-2.25-1.75-4-4-4h-24c-2.25 0-4 1.75-4 4v28h-32v-28c0-5.25-7-4-10.25-4v-33.25c7.25-1.75 15-3 22.5-3 9.501 0 18.251 3.75 27.5 3.75 4 0 24.25-1 24.25-7V64c0-2.25-1.75-4-4-4-4.5 0-13.25 3.75-21 3.75-8.499 0-18.25-3.75-28.501-3.75-7 0-14 1-20.75 2.5v-4.25c4.75-2.25 8-7.25 8-12.5 0-18.149-27.499-18.167-27.499 0 0 5.25 3.25 10.25 8 12.5V156c-3.25 0-10.25-1.25-10.25 4v28h-32v-28c0-2.25-1.75-4-4-4h-24c-2.25 0-4 1.75-4 4v28H96v-28c0-2.25-1.75-4-4-4H68c-2.25 0-4 1.75-4 4v156H32v-28c0-2.25-1.75-4-4-4H4c-2.25 0-4 1.75-4 4v192h160v-84c0-63.507 96-63.525 96 0v84h160V288c0-2.25-1.75-4-4-4zm-252-4.001c0 2.25-1.75 4-4 4h-24c-2.25 0-4-1.75-4-4V224c0-2.25 1.75-4 4-4h24c2.25 0 4 1.75 4 4v55.999zm128 0c0 2.25-1.75 4-4 4h-24c-2.25 0-4-1.75-4-4V224c0-2.25 1.75-4 4-4h24c2.25 0 4 1.75 4 4v55.999z"],"fort-awesome-alt":[512,512,[],"f3a3","M211.7 241.1v51.7c0 2.1-1.6 3.7-3.7 3.7h-22.2c-2.1 0-3.7-1.6-3.7-3.7v-51.7c0-2.1 1.6-3.7 3.7-3.7H208c2.1 0 3.7 1.6 3.7 3.7zm114.5-3.7H304c-2.1 0-3.7 1.6-3.7 3.7v51.7c0 2.1 1.6 3.7 3.7 3.7h22.2c2.1 0 3.7-1.6 3.7-3.7v-51.7c-.1-2.1-1.7-3.7-3.7-3.7zm-29.1 263.2c-.9.1-1.7.3-2.6.4-1 .2-2.1.3-3.1.5-.9.1-1.8.3-2.8.4-1 .1-2 .3-3 .4-1 .1-2 .2-2.9.3-1 .1-1.9.2-2.9.3-1 .1-2.1.2-3.1.3-.9.1-1.8.2-2.7.2-1.1.1-2.3.1-3.4.2-.8 0-1.7.1-2.5.1-1.3.1-2.6.1-3.9.1-.7 0-1.4.1-2.1.1-2 0-4 .1-6 .1s-4 0-6-.1c-.7 0-1.4 0-2.1-.1-1.3 0-2.6-.1-3.9-.1-.8 0-1.7-.1-2.5-.1-1.1-.1-2.3-.1-3.4-.2-.9-.1-1.8-.1-2.7-.2-1-.1-2.1-.2-3.1-.3-1-.1-1.9-.2-2.9-.3-1-.1-2-.2-2.9-.3-1-.1-2-.2-3-.4-.9-.1-1.8-.3-2.8-.4-1-.1-2.1-.3-3.1-.5-.9-.1-1.7-.3-2.6-.4-65.6-10.9-122.5-47.7-160-99.4-.2-.2-.3-.5-.5-.7-.8-1.1-1.6-2.2-2.3-3.3-.3-.4-.6-.8-.8-1.2-.7-1.1-1.4-2.1-2.1-3.2-.3-.5-.6-.9-.9-1.4-.7-1.1-1.4-2.1-2-3.2-.3-.5-.6-.9-.9-1.4-.7-1.1-1.3-2.2-2-3.3-.2-.4-.5-.8-.7-1.2-2.4-4-4.6-8.1-6.8-12.2-.1-.2-.2-.3-.3-.5-.6-1.1-1.1-2.2-1.7-3.3-.3-.6-.6-1.1-.8-1.7-.5-1-1-2.1-1.5-3.1-.3-.7-.6-1.3-.9-2-.5-1-.9-2-1.4-3l-.9-2.1c-.4-1-.9-2-1.3-3-.3-.7-.6-1.5-.9-2.2l-1.2-3c-.3-.8-.6-1.5-.9-2.3-.4-1-.8-2-1.1-3-.3-.9-.6-1.8-1-2.8-.6-1.6-1.1-3.3-1.7-4.9-.3-.9-.6-1.8-.9-2.8-.3-.9-.5-1.8-.8-2.7-.3-.9-.6-1.9-.8-2.8-.3-.9-.5-1.8-.8-2.7-.3-1-.5-1.9-.8-2.9-.2-.9-.5-1.8-.7-2.7-.3-1-.5-2-.7-3-.2-.9-.4-1.7-.6-2.6-.2-1.1-.5-2.2-.7-3.2-.2-.8-.3-1.6-.5-2.4-.3-1.3-.5-2.7-.8-4-.1-.6-.2-1.1-.3-1.7l-.9-5.7c-.1-.6-.2-1.3-.3-1.9-.2-1.3-.4-2.6-.5-3.9-.1-.8-.2-1.5-.3-2.3-.1-1.2-.3-2.4-.4-3.6-.1-.8-.2-1.6-.2-2.4-.1-1.2-.2-2.4-.3-3.5-.1-.8-.1-1.6-.2-2.4-.1-1.2-.2-2.4-.2-3.7 0-.8-.1-1.5-.1-2.3-.1-1.3-.1-2.7-.2-4 0-.7 0-1.3-.1-2 0-2-.1-4-.1-6 0-53.5 16.9-103 45.8-143.6 2.3-3.2 4.7-6.4 7.1-9.5 4.9-6.2 10.1-12.3 15.6-18 2.7-2.9 5.5-5.7 8.4-8.4 2.9-2.7 5.8-5.4 8.8-8 4.5-3.9 9.1-7.6 13.9-11.2 1.6-1.2 3.2-2.4 4.8-3.5C140 34.2 171.7 20.1 206 13c16.1-3.3 32.9-5 50-5s33.8 1.7 50 5c34.3 7 66 21.1 93.6 40.7 1.6 1.2 3.2 2.3 4.8 3.5 4.8 3.6 9.4 7.3 13.9 11.2 12 10.4 23 21.9 32.8 34.4 2.5 3.1 4.8 6.3 7.1 9.5C487.1 153 504 202.5 504 256c0 2 0 4-.1 6 0 .7 0 1.3-.1 2 0 1.3-.1 2.7-.2 4 0 .8-.1 1.5-.1 2.3-.1 1.2-.1 2.4-.2.7-.1.8-.1 1.6-.2 2.4-.1 1.2-.2 2.4-.3 3.5-.1.8-.2 1.6-.2 2.4-.1 1.2-.3 2.4-.4 3.6-.1.8-.2 1.5-.3 2.3-.2 1.3-.4 2.6-.5 3.9-.1.6-.2 1.3-.3 1.9l-.9 5.7c-.1.6-.2 1.1-.3 1.7-.2 1.3-.5 2.7-.8 4-.2.8-.3 1.6-.5 2.4-.2 1.1-.5 2.2-.7 3.2-.2.9-.4 1.7-.6 2.6-.2 1-.5 2-.7 3-.2.9-.5 1.8-.7 2.7-.3 1-.5 1.9-.8 2.9-.2.9-.5 1.8-.8 2.7-.3.9-.6 1.9-.8 2.8-.3.9-.5 1.8-.8 2.7-.3.9-.6 1.8-.9 2.8-.5 1.6-1.1 3.3-1.7 4.9-.3.9-.6 1.8-1 2.8-.4 1-.7 2-1.1 3-.3.8-.6 1.5-.9 2.3l-1.2 3c-.3.7-.6 1.5-.9 2.2-.4 1-.8 2-1.3 3l-.9 2.1c-.4 1-.9 2-1.4 3-.3.7-.6 1.3-.9 2-.5 1-1 2.1-1.5 3.1-.3.6-.6 1.1-.8 1.7-.6 1.1-1.1 2.2-1.7 3.3-.1.2-.2.3-.3.5-2.2 4.1-4.4 8.2-6.8 12.2-.2.4-.5.8-.7 1.2-.7 1.1-1.3 2.2-2 3.3-.3.5-.6.9-.9 1.4-.7 1.1-1.4 2.1-2 3.2-.3.5-.6.9-.9 1.4-.7 1.1-1.4 2.1-2.1 3.2-.3.4-.6.8-.8 1.2-.8 1.1-1.5 2.2-2.3 3.3-.2.2-.3.5-.5.7-37.6 54.7-94.5 91.4-160.1 102.4zm117.3-86.2c13-13 24.2-27.4 33.6-42.9v-71.3c0-2.1-1.6-3.7-3.7-3.7h-22.2c-2.1 0-3.7 1.6-3.7 3.7V326h-29.5V182c0-2.1-1.6-3.7-3.7-3.7h-22.1c-2.1 0-3.7 1.6-3.7 3.7v25.9h-29.5V182c0-2.1-1.6-3.7-3.7-3.7H304c-2.1 0-3.7 1.6-3.7 3.7v25.9h-29.5V182c0-4.8-6.5-3.7-9.5-3.7v-30.7c6.7-1.6 13.8-2.8 20.8-2.8 8.8 0 16.8 3.5 25.4 3.5 3.7 0 22.4-.9 22.4-6.5V93.4c0-2.1-1.6-3.7-3.7-3.7-4.2 0-12.2 3.5-19.4 3.5-7.9 0-16.9-3.5-26.3-3.5-6.5 0-12.9.9-19.2 2.3v-3.9c4.4-2.1 7.4-6.7 7.4-11.5 0-16.8-25.4-16.8-25.4 0 0 4.8 3 9.5 7.4 11.5v90.2c-3 0-9.5-1.1-9.5 3.7v25.9h-29.5V182c0-2.1-1.6-3.7-3.7-3.7h-22.2c-2.1 0-3.7 1.6-3.7 3.7v25.9h-29.5V182c0-2.1-1.6-3.7-3.7-3.7h-22.1c-2.1 0-3.7 1.6-3.7 3.7v144H93.5v-25.8c0-2.1-1.6-3.7-3.7-3.7H67.7c-2.1 0-3.7 1.6-3.7 3.7v71.3c9.4 15.5 20.6 29.9 33.6 42.9 20.6 20.6 44.5 36.7 71.2 48 13.9 5.9 28.2 10.3 42.9 13.2v-75.8c0-58.6 88.6-58.6 88.6 0v75.8c14.7-2.9 29-7.4 42.9-13.2 26.7-11.3 50.6-27.4 71.2-48"],forumbee:[448,512,[],"f211","M5.8 309.7C2 292.7 0 275.5 0 258.3 0 135 99.8 35 223.1 35c16.6 0 33.3 2 49.3 5.5C149 87.5 51.9 186 5.8 309.7zm392.9-189.2C385 103 369 87.8 350.9 75.2c-149.6 44.3-266.3 162.1-309.7 312 12.5 18.1 28 35.6 45.2 49 43.1-151.3 161.2-271.7 312.3-315.7zm15.8 252.7c15.2-25.1 25.4-53.7 29.5-82.8-79.4 42.9-145 110.6-187.6 190.3 30-4.4 58.9-15.3 84.6-31.3 35 13.1 70.9 24.3 107 33.6-9.3-36.5-20.4-74.5-33.5-109.8zm29.7-145.5c-2.6-19.5-7.9-38.7-15.8-56.8C290.5 216.7 182 327.5 137.1 466c18.1 7.6 37 12.5 56.6 15.2C240 367.1 330.5 274.4 444.2 227.7z"],foursquare:[368,512,[],"f180","M323.1 3H49.9C12.4 3 0 31.3 0 49.1v433.8c0 20.3 12.1 27.7 18.2 30.1 6.2 2.5 22.8 4.6 32.9-7.1C180 356.5 182.2 354 182.2 354c3.1-3.4 3.4-3.1 6.8-3.1h83.4c35.1 0 40.6-25.2 44.3-39.7l48.6-243C373.8 25.8 363.1 3 323.1 3zm-16.3 73.8l-11.4 59.7c-1.2 6.5-9.5 13.2-16.9 13.2H172.1c-12 0-20.6 8.3-20.6 20.3v13c0 12 8.6 20.6 20.6 20.6h90.4c8.3 0 16.6 9.2 14.8 18.2-1.8 8.9-10.5 53.8-11.4 58.8-.9 4.9-6.8 13.5-16.9 13.5h-73.5c-13.5 0-17.2 1.8-26.5 12.6 0 0-8.9 11.4-89.5 108.3-.9.9-1.8.6-1.8-.3V75.9c0-7.7 6.8-16.6 16.6-16.6h219c8.2 0 15.6 7.7 13.5 17.5z"],"free-code-camp":[576,512,[],"f2c5","M69.3 144.5c-41 68.5-36.4 163 1 227C92.5 409.7 120 423.9 120 438c0 6.8-6 13-12.8 13C87.7 451 8 375.5 8 253.2c0-111.5 78-186 97.1-186 6 0 14.9 4.8 14.9 11.1 0 12.7-28.3 28.6-50.7 66.2zm195.8 213.8c4.5 1.8 12.3 5.2 12.3-1.2 0-2.7-2.2-2.9-4.3-3.6-8.5-3.4-14-7.7-19.1-15.2-8.2-12.1-10.1-24.2-10.1-38.6 0-32.1 44.2-37.9 44.2-70 0-12.3-7.7-15.9-7.7-19.3 0-2.2.7-2.2 2.9-2.2 8 0 19.1 13.3 22.5 19.8 2.2 4.6 2.4 6 2.4 11.1 0 7-.7 14.2-.7 21.3 0 27 31.9 19.8 31.9 6.8 0-6-3.6-11.6-3.6-17.4 0-.7 0-1.2.7-1.2 3.4 0 9.4 7.7 11.1 10.1 5.8 8.9 8.5 20.8 8.5 31.4 0 32.4-29.5 49-29.5 56 0 1 2.9 7.7 12.1 1.9 29.7-15.1 53.1-47.6 53.1-89.8 0-33.6-8.7-57.7-32.1-82.6-3.9-4.1-16.4-16.9-22.5-16.9-8.2 0 7.2 18.6 7.2 31.2 0 7.2-4.8 12.3-12.3 12.3-11.6 0-14.5-25.4-15.9-33.3-5.8-33.8-12.8-58.2-46.4-74.1-10.4-5-36.5-11.8-36.5-2.2 0 2.4 2.7 4.1 4.6 5.1 9.2 5.6 19.6 21.4 19.6 38.2 0 46.1-57.7 88.2-57.7 136.2-.2 40.3 28.1 72.6 65.3 86.2zM470.4 67c-6 0-14.4 6.5-14.4 12.6 0 8.7 12.1 19.6 17.6 25.4 81.6 85.1 78.6 214.3 17.6 291-7 8.9-35.3 35.3-35.3 43.5 0 5.1 8.2 11.4 13.2 11.4 25.4 0 98.8-80.8 98.8-185.7C568 145.9 491.8 67 470.4 67zm-42.3 323.1H167c-9.4 0-15.5 7.5-15.5 16.4 0 8.5 7 15.5 15.5 15.5h261.1c9.4 0 11.9-7.5 11.9-16.4 0-8.5-3.5-15.5-11.9-15.5z"],freebsd:[448,512,[],"f3a4","M303.7 96.2c11.1-11.1 115.5-77 139.2-53.2 23.7 23.7-42.1 128.1-53.2 139.2-11.1 11.1-39.4.9-63.1-22.9-23.8-23.7-34.1-52-22.9-63.1zM109.9 68.1C73.6 47.5 22 24.6 5.6 41.1c-16.6 16.6 7.1 69.4 27.9 105.7 18.5-32.2 44.8-59.3 76.4-78.7zM406.7 174c3.3 11.3 2.7 20.7-2.7 26.1-20.3 20.3-87.5-27-109.3-70.1-18-32.3-11.1-53.4 14.9-48.7 5.7-3.6 12.3-7.6 19.6-11.6-29.8-15.5-63.6-24.3-99.5-24.3-119.1 0-215.6 96.5-215.6 215.6 0 119 96.5 215.6 215.6 215.6S445.3 380.1 445.3 261c0-38.4-10.1-74.5-27.7-105.8-3.9 7-7.6 13.3-10.9 18.8z"],"get-pocket":[448,512,[],"f265","M407.6 64h-367C18.5 64 0 82.5 0 104.6v135.2C0 364.5 99.7 464 224.2 464c124 0 223.8-99.5 223.8-224.2V104.6c0-22.4-17.7-40.6-40.4-40.6zm-162 268.5c-12.4 11.8-31.4 11.1-42.4 0C89.5 223.6 88.3 227.4 88.3 209.3c0-16.9 13.8-30.7 30.7-30.7 17 0 16.1 3.8 105.2 89.3 90.6-86.9 88.6-89.3 105.5-89.3 16.9 0 30.7 13.8 30.7 30.7 0 17.8-2.9 15.7-114.8 123.2z"],gg:[512,512,[],"f260","M179.2 230.4l102.4 102.4-102.4 102.4L0 256 179.2 76.8l44.8 44.8-25.6 25.6-19.2-19.2-128 128 128 128 51.5-51.5-77.1-76.5 25.6-25.6zM332.8 76.8L230.4 179.2l102.4 102.4 25.6-25.6-77.1-76.5 51.5-51.5 128 128-128 128-19.2-19.2-25.6 25.6 44.8 44.8L512 256 332.8 76.8z"],"gg-circle":[512,512,[],"f261","M257 8C120 8 9 119 9 256s111 248 248 248 248-111 248-248S394 8 257 8zm-49.5 374.8L81.8 257.1l125.7-125.7 35.2 35.4-24.2 24.2-11.1-11.1-77.2 77.2 77.2 77.2 26.6-26.6-53.1-52.9 24.4-24.4 77.2 77.2-75 75.2zm99-2.2l-35.2-35.2 24.1-24.4 11.1 11.1 77.2-77.2-77.2-77.2-26.5 26.5 53.1 52.9-24.4 24.4-77.2-77.2 75-75L432.2 255 306.5 380.6z"],git:[448,512,[],"f1d3","M18.8 221.7c0 25.3 16.2 60 41.5 68.5v1c-18.8 8.3-24 50.6 1 65.8v1C34 367 16 384.3 16 414.2c0 51.5 48.8 65.8 91.5 65.8 52 0 90.7-18.7 90.7-76 0-70.5-101-44.5-101-82.8 0-13.5 7.2-18.7 19.7-21.3 41.5-7.7 67.5-40 67.5-82.2 0-7.3-1.5-14.2-4-21 6.7-1.5 13.2-3.3 19.7-5.5v-50.5c-17.2 6.8-35.7 11.8-54.5 11.8-53.8-31-126.8 1.3-126.8 69.2zm87.7 163.8c17 0 41.2 3 41.2 25 0 21.8-19.5 26.3-37.7 26.3-17.3 0-43.3-2.7-43.3-25.2.1-22.3 22.1-26.1 39.8-26.1zM103.3 256c-22 0-31.3-13-31.3-33.8 0-49.3 61-48.8 61-.5 0 20.3-8 34.3-29.7 34.3zM432 305.5v49c-13.3 7.3-30.5 9.8-45.5 9.8-53.5 0-59.8-42.2-59.8-85.7v-87.7h.5v-1c-7 0-7.3-1.6-24 1v-47.5h24c0-22.3.3-31-1.5-41.2h56.7c-2 13.8-1.5 27.5-1.5 41.2h51v47.5s-19.3-1-51-1V281c0 14.8 3.3 32.8 21.8 32.8 9.8 0 21.3-2.8 29.3-8.3zM286 68.7c0 18.7-14.5 36.2-33.8 36.2-19.8 0-34.5-17.2-34.5-36.2 0-19.3 14.5-36.7 34.5-36.7C272 32 286 50 286 68.7zm-6.2 74.5c-1.8 14.6-1.6 199.8 0 217.8h-55.5c1.6-18.1 1.8-203 0-217.8h55.5z"],"git-square":[448,512,[],"f1d2","M140.1 348.5c12.1 0 29.5 2.1 29.5 17.9 0 15.5-13.9 18.8-27 18.8-12.3 0-30.9-2-30.9-18s15.7-18.7 28.4-18.7zm-24.7-116.6c0 14.8 6.6 24.1 22.3 24.1 15.5 0 21.2-10 21.2-24.5.1-34.4-43.5-34.8-43.5.4zM448 80v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V80c0-26.5 21.5-48 48-48h352c26.5 0 48 21.5 48 48zm-241 93.7c-12.3 4.8-25.5 8.4-38.9 8.4-38.5-22.1-90.7.9-90.7 49.5 0 18 11.6 42.9 29.6 48.9v.7c-13.4 5.9-17.1 36.1.7 47v.7c-19.5 6.4-32.3 18.8-32.3 40.2 0 36.8 34.8 47 65.4 47 37.1 0 64.8-13.4 64.8-54.3 0-50.4-72.1-31.8-72.1-59.1 0-9.6 5.2-13.4 14.1-15.2 29.6-5.5 48.2-28.6 48.2-58.7 0-5.2-1.1-10.2-2.9-15 4.8-1.1 9.5-2.3 14.1-3.9v-36.2zm56.8 1.8h-39.6c1.3 10.6 1.1 142.6 0 155.5h39.6c-1.1-12.8-1.2-145.1 0-155.5zm4.5-53.3c0-13.4-10-26.2-24.1-26.2-14.3 0-24.6 12.5-24.6 26.2 0 13.6 10.5 25.9 24.6 25.9 13.7 0 24.1-12.5 24.1-25.9zm104.3 53.3h-36.4c0-9.8-.4-19.6 1.1-29.5h-40.5c1.3 7.3 1.1 13.6 1.1 29.5h-17.1v33.9c11.9-1.9 12.1-.7 17.1-.7v.7h-.4v62.7c0 31.1 4.5 61.2 42.7 61.2 10.7 0 23-1.8 32.5-7v-35c-5.7 3.9-13.9 5.9-20.9 5.9-13.2 0-15.5-12.9-15.5-23.4v-65.2c22.7 0 36.4.7 36.4.7v-33.8z"],github:[496,512,[],"f09b","M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"],"github-alt":[480,512,[],"f113","M186.1 328.7c0 20.9-10.9 55.1-36.7 55.1s-36.7-34.2-36.7-55.1 10.9-55.1 36.7-55.1 36.7 34.2 36.7 55.1zM480 278.2c0 31.9-3.2 65.7-17.5 95-37.9 76.6-142.1 74.8-216.7 74.8-75.8 0-186.2 2.7-225.6-74.8-14.6-29-20.2-63.1-20.2-95 0-41.9 13.9-81.5 41.5-113.6-5.2-15.8-7.7-32.4-7.7-48.8 0-21.5 4.9-32.3 14.6-51.8 45.3 0 74.3 9 108.8 36 29-6.9 58.8-10 88.7-10 27 0 54.2 2.9 80.4 9.2 34-26.7 63-35.2 107.8-35.2 9.8 19.5 14.6 30.3 14.6 51.8 0 16.4-2.6 32.7-7.7 48.2 27.5 32.4 39 72.3 39 114.2zm-64.3 50.5c0-43.9-26.7-82.6-73.5-82.6-18.9 0-37 3.4-56 6-14.9 2.3-29.8 3.2-45.1 3.2-15.2 0-30.1-.9-45.1-3.2-18.7-2.6-37-6-56-6-46.8 0-73.5 38.7-73.5 82.6 0 87.8 80.4 101.3 150.4 101.3h48.2c70.3 0 150.6-13.4 150.6-101.3zm-82.6-55.1c-25.8 0-36.7 34.2-36.7 55.1s10.9 55.1 36.7 55.1 36.7-34.2 36.7-55.1-10.9-55.1-36.7-55.1z"],"github-square":[448,512,[],"f092","M400 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zM277.3 415.7c-8.4 1.5-11.5-3.7-11.5-8 0-5.4.2-33 .2-55.3 0-15.6-5.2-25.5-11.3-30.7 37-4.1 76-9.2 76-73.1 0-18.2-6.5-27.3-17.1-39 1.7-4.3 7.4-22-1.7-45-13.9-4.3-45.7 17.9-45.7 17.9-13.2-3.7-27.5-5.6-41.6-5.6-14.1 0-28.4 1.9-41.6 5.6 0 0-31.8-22.2-45.7-17.9-9.1 22.9-3.5 40.6-1.7 45-10.6 11.7-15.6 20.8-15.6 39 0 63.6 37.3 69 74.3 73.1-4.8 4.3-9.1 11.7-10.6 22.3-9.5 4.3-33.8 11.7-48.3-13.9-9.1-15.8-25.5-17.1-25.5-17.1-16.2-.2-1.1 10.2-1.1 10.2 10.8 5 18.4 24.2 18.4 24.2 9.7 29.7 56.1 19.7 56.1 19.7 0 13.9.2 36.5.2 40.6 0 4.3-3 9.5-11.5 8-66-22.1-112.2-84.9-112.2-158.3 0-91.8 70.2-161.5 162-161.5S388 165.6 388 257.4c.1 73.4-44.7 136.3-110.7 158.3zm-98.1-61.1c-1.9.4-3.7-.4-3.9-1.7-.2-1.5 1.1-2.8 3-3.2 1.9-.2 3.7.6 3.9 1.9.3 1.3-1 2.6-3 3zm-9.5-.9c0 1.3-1.5 2.4-3.5 2.4-2.2.2-3.7-.9-3.7-2.4 0-1.3 1.5-2.4 3.5-2.4 1.9-.2 3.7.9 3.7 2.4zm-13.7-1.1c-.4 1.3-2.4 1.9-4.1 1.3-1.9-.4-3.2-1.9-2.8-3.2.4-1.3 2.4-1.9 4.1-1.5 2 .6 3.3 2.1 2.8 3.4zm-12.3-5.4c-.9 1.1-2.8.9-4.3-.6-1.5-1.3-1.9-3.2-.9-4.1.9-1.1 2.8-.9 4.3.6 1.3 1.3 1.8 3.3.9 4.1zm-9.1-9.1c-.9.6-2.6 0-3.7-1.5s-1.1-3.2 0-3.9c1.1-.9 2.8-.2 3.7 1.3 1.1 1.5 1.1 3.3 0 4.1zm-6.5-9.7c-.9.9-2.4.4-3.5-.6-1.1-1.3-1.3-2.8-.4-3.5.9-.9 2.4-.4 3.5.6 1.1 1.3 1.3 2.8.4 3.5zm-6.7-7.4c-.4.9-1.7 1.1-2.8.4-1.3-.6-1.9-1.7-1.5-2.6.4-.6 1.5-.9 2.8-.4 1.3.7 1.9 1.8 1.5 2.6z"],gitkraken:[592,512,[],"f3a6","M565.7 118.1c-2.3-6.1-9.3-9.2-15.3-6.6-5.7 2.4-8.5 8.9-6.3 14.6 10.9 29 16.9 60.5 16.9 93.3 0 134.6-100.3 245.7-230.2 262.7V358.4c7.9-1.5 15.5-3.6 23-6.2v104c106.7-25.9 185.9-122.1 185.9-236.8 0-91.8-50.8-171.8-125.8-213.3-5.7-3.2-13-.9-15.9 5-2.7 5.5-.6 12.2 4.7 15.1 67.9 37.6 113.9 110 113.9 193.2 0 93.3-57.9 173.1-139.8 205.4v-92.2c14.2-4.5 24.9-17.7 24.9-33.5 0-13.1-6.8-24.4-17.3-30.5 8.3-79.5 44.5-58.6 44.5-83.9V170c0-38-87.9-161.8-129-164.7-2.5-.2-5-.2-7.6 0C251.1 8.3 163.2 132 163.2 170v14.8c0 25.3 36.3 4.3 44.5 83.9-10.6 6.1-17.3 17.4-17.3 30.5 0 15.8 10.6 29 24.8 33.5v92.2c-81.9-32.2-139.8-112-139.8-205.4 0-83.1 46-155.5 113.9-193.2 5.4-3 7.4-9.6 4.7-15.1-2.9-5.9-10.1-8.2-15.9-5-75 41.5-125.8 121.5-125.8 213.3 0 114.7 79.2 210.8 185.9 236.8v-104c7.6 2.5 15.1 4.6 23 6.2v123.7C131.4 465.2 31 354.1 31 219.5c0-32.8 6-64.3 16.9-93.3 2.2-5.8-.6-12.2-6.3-14.6-6-2.6-13 .4-15.3 6.6C14.5 149.7 8 183.8 8 219.5c0 155.1 122.6 281.6 276.3 287.8V361.4c6.8.4 15 .5 23.4 0v145.8C461.4 501.1 584 374.6 584 219.5c0-35.7-6.5-69.8-18.3-101.4zM365.9 275.5c13 0 23.7 10.5 23.7 23.7 0 13.1-10.6 23.7-23.7 23.7-13 0-23.7-10.5-23.7-23.7 0-13.1 10.6-23.7 23.7-23.7zm-139.8 47.3c-13.2 0-23.7-10.7-23.7-23.7s10.5-23.7 23.7-23.7c13.1 0 23.7 10.6 23.7 23.7 0 13-10.5 23.7-23.7 23.7z"],gitlab:[512,512,[],"f296","M29.782 199.732L256 493.714 8.074 309.699c-6.856-5.142-9.712-13.996-7.141-21.993l28.849-87.974zm75.405-174.806c-3.142-8.854-15.709-8.854-18.851 0L29.782 199.732h131.961L105.187 24.926zm56.556 174.806L256 493.714l94.257-293.982H161.743zm349.324 87.974l-28.849-87.974L256 493.714l247.926-184.015c6.855-5.142 9.711-13.996 7.141-21.993zm-85.404-262.78c-3.142-8.854-15.709-8.854-18.851 0l-56.555 174.806h131.961L425.663 24.926z"],gitter:[384,512,[],"f426","M66.4 322.5H16V0h50.4v322.5zM166.9 76.1h-50.4V512h50.4V76.1zm100.6 0h-50.4V512h50.4V76.1zM368 76h-50.4v247H368V76z"],glide:[448,512,[],"f2a5","M252.8 148.6c0 8.8-1.6 17.7-3.4 26.4-5.8 27.8-11.6 55.8-17.3 83.6-1.4 6.3-8.3 4.9-13.7 4.9-23.8 0-30.5-26-30.5-45.5 0-29.3 11.2-68.1 38.5-83.1 4.3-2.5 9.2-4.2 14.1-4.2 11.4 0 12.3 8.3 12.3 17.9zM448 80v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V80c0-26.5 21.5-48 48-48h352c26.5 0 48 21.5 48 48zm-64 187c0-5.1-20.8-37.7-25.5-39.5-2.2-.9-7.2-2.3-9.6-2.3-23.1 0-38.7 10.5-58.2 21.5l-.5-.5c4.3-29.4 14.6-57.2 14.6-87.4 0-44.6-23.8-62.7-67.5-62.7-71.7 0-108 70.8-108 123.5 0 54.7 32 85 86.3 85 7.5 0 6.9-.6 6.9 2.3-10.5 80.3-56.5 82.9-56.5 58.9 0-24.4 28-36.5 28.3-38-.2-7.6-29.3-17.2-36.7-17.2-21.1 0-32.7 33-32.7 50.6 0 32.3 20.4 54.7 53.3 54.7 48.2 0 83.4-49.7 94.3-91.7 9.4-37.7 7-39.4 12.3-42.1 20-10.1 35.8-16.8 58.4-16.8 11.1 0 19 2.3 36.7 5.2 1.8.1 4.1-1.7 4.1-3.5z"],"glide-g":[448,512,[],"f2a6","M407.1 211.2c-3.5-1.4-11.6-3.8-15.4-3.8-37.1 0-62.2 16.8-93.5 34.5l-.9-.9c7-47.3 23.5-91.9 23.5-140.4C320.8 29.1 282.6 0 212.4 0 97.3 0 39 113.7 39 198.4 39 286.3 90.3 335 177.6 335c12 0 11-1 11 3.8-16.9 128.9-90.8 133.1-90.8 94.6 0-39.2 45-58.6 45.5-61-.3-12.2-47-27.6-58.9-27.6-33.9.1-52.4 51.2-52.4 79.3C32 476 64.8 512 117.5 512c77.4 0 134-77.8 151.4-145.4 15.1-60.5 11.2-63.3 19.7-67.6 32.2-16.2 57.5-27 93.8-27 17.8 0 30.5 3.7 58.9 8.4 2.9 0 6.7-2.9 6.7-5.8 0-8-33.4-60.5-40.9-63.4zm-175.3-84.4c-9.3 44.7-18.6 89.6-27.8 134.3-2.3 10.2-13.3 7.8-22 7.8-38.3 0-49-41.8-49-73.1 0-47 18-109.3 61.8-133.4 7-4.1 14.8-6.7 22.6-6.7 18.6 0 20 13.3 20 28.7-.1 14.3-2.7 28.5-5.6 42.4z"],gofore:[400,512,[],"f3a7","M324 319.8h-13.2v34.7c-24.5 23.1-56.3 35.8-89.9 35.8-73.2 0-132.4-60.2-132.4-134.4 0-74.1 59.2-134.4 132.4-134.4 35.3 0 68.6 14 93.6 39.4l62.3-63.3C335 55.3 279.7 32 220.7 32 98 32 0 132.6 0 256c0 122.5 97 224 220.7 224 63.2 0 124.5-26.2 171-82.5-2-27.6-13.4-77.7-67.7-77.7zm-12.1-112.5H205.6v89H324c33.5 0 60.5 15.1 76 41.8v-30.6c0-65.2-40.4-100.2-88.1-100.2z"],goodreads:[448,512,[],"f3a8","M299.9 191.2c5.1 37.3-4.7 79-35.9 100.7-22.3 15.5-52.8 14.1-70.8 5.7-37.1-17.3-49.5-58.6-46.8-97.2 4.3-60.9 40.9-87.9 75.3-87.5 46.9-.2 71.8 31.8 78.2 78.3zM448 88v336c0 30.9-25.1 56-56 56H56c-30.9 0-56-25.1-56-56V88c0-30.9 25.1-56 56-56h336c30.9 0 56 25.1 56 56zM330 313.2s-.1-34-.1-217.3h-29v40.3c-.8.3-1.2-.5-1.6-1.2-9.6-20.7-35.9-46.3-76-46-51.9.4-87.2 31.2-100.6 77.8-4.3 14.9-5.8 30.1-5.5 45.6 1.7 77.9 45.1 117.8 112.4 115.2 28.9-1.1 54.5-17 69-45.2.5-1 1.1-1.9 1.7-2.9.2.1.4.1.6.2.3 3.8.2 30.7.1 34.5-.2 14.8-2 29.5-7.2 43.5-7.8 21-22.3 34.7-44.5 39.5-17.8 3.9-35.6 3.8-53.2-1.2-21.5-6.1-36.5-19-41.1-41.8-.3-1.6-1.3-1.3-2.3-1.3h-26.8c.8 10.6 3.2 20.3 8.5 29.2 24.2 40.5 82.7 48.5 128.2 37.4 49.9-12.3 67.3-54.9 67.4-106.3z"],"goodreads-g":[384,512,[],"f3a9","M42.6 403.3h2.8c12.7 0 25.5 0 38.2.1 1.6 0 3.1-.4 3.6 2.1 7.1 34.9 30 54.6 62.9 63.9 26.9 7.6 54.1 7.8 81.3 1.8 33.8-7.4 56-28.3 68-60.4 8-21.5 10.7-43.8 11-66.5.1-5.8.3-47-.2-52.8l-.9-.3c-.8 1.5-1.7 2.9-2.5 4.4-22.1 43.1-61.3 67.4-105.4 69.1-103 4-169.4-57-172-176.2-.5-23.7 1.8-46.9 8.3-69.7C58.3 47.7 112.3.6 191.6 0c61.3-.4 101.5 38.7 116.2 70.3.5 1.1 1.3 2.3 2.4 1.9V10.6h44.3c0 280.3.1 332.2.1 332.2-.1 78.5-26.7 143.7-103 162.2-69.5 16.9-159 4.8-196-57.2-8-13.5-11.8-28.3-13-44.5zM188.9 36.5c-52.5-.5-108.5 40.7-115 133.8-4.1 59 14.8 122.2 71.5 148.6 27.6 12.9 74.3 15 108.3-8.7 47.6-33.2 62.7-97 54.8-154-9.7-71.1-47.8-120-119.6-119.7z"],google:[488,512,[],"f1a0","M488 261.8C488 403.3 391.1 504 248 504 110.8 504 0 393.2 0 256S110.8 8 248 8c66.8 0 123 24.5 166.3 64.9l-67.5 64.9C258.5 52.6 94.3 116.6 94.3 256c0 86.5 69.1 156.6 153.7 156.6 98.2 0 135-70.4 140.8-106.9H248v-85.3h236.1c2.3 12.7 3.9 24.9 3.9 41.4z"],"google-drive":[512,512,[],"f3aa","M339 314.9L175.4 32h161.2l163.6 282.9H339zm-137.5 23.6L120.9 480h310.5L512 338.5H201.5zM154.1 67.4L0 338.5 80.6 480 237 208.8 154.1 67.4z"],"google-play":[512,512,[],"f3ab","M325.3 234.3L104.6 13l280.8 161.2-60.1 60.1zM47 0C34 6.8 25.3 19.2 25.3 35.3v441.3c0 16.1 8.7 28.5 21.7 35.3l256.6-256L47 0zm425.2 225.6l-58.9-34.1-65.7 64.5 65.7 64.5 60.1-34.1c18-14.3 18-46.5-1.2-60.8zM104.6 499l280.8-161.2-60.1-60.1L104.6 499z"],"google-plus":[496,512,[],"f2b3","M248 8C111.1 8 0 119.1 0 256s111.1 248 248 248 248-111.1 248-248S384.9 8 248 8zm-70.7 372c-68.8 0-124-55.5-124-124s55.2-124 124-124c31.3 0 60.1 11 83 32.3l-33.6 32.6c-13.2-12.9-31.3-19.1-49.4-19.1-42.9 0-77.2 35.5-77.2 78.1s34.2 78.1 77.2 78.1c32.6 0 64.9-19.1 70.1-53.3h-70.1v-42.6h116.9c1.3 6.8 1.9 13.6 1.9 20.7 0 70.8-47.5 121.2-118.8 121.2zm230.2-106.2v35.5H372v-35.5h-35.5v-35.5H372v-35.5h35.5v35.5h35.2v35.5h-35.2z"],"google-plus-g":[640,512,[],"f0d5","M386.061 228.496c1.834 9.692 3.143 19.384 3.143 31.956C389.204 370.205 315.599 448 204.8 448c-106.084 0-192-85.915-192-192s85.916-192 192-192c51.864 0 95.083 18.859 128.611 50.292l-52.126 50.03c-14.145-13.621-39.028-29.599-76.485-29.599-65.484 0-118.92 54.221-118.92 121.277 0 67.056 53.436 121.277 118.92 121.277 75.961 0 104.513-54.745 108.965-82.773H204.8v-66.009h181.261zm185.406 6.437V179.2h-56.001v55.733h-55.733v56.001h55.733v55.733h56.001v-55.733H627.2v-56.001h-55.733z"],"google-plus-square":[448,512,[],"f0d4","M400 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zM164 356c-55.3 0-100-44.7-100-100s44.7-100 100-100c27 0 49.5 9.8 67 26.2l-27.1 26.1c-7.4-7.1-20.3-15.4-39.8-15.4-34.1 0-61.9 28.2-61.9 63.2 0 34.9 27.8 63.2 61.9 63.2 39.6 0 54.4-28.5 56.8-43.1H164v-34.4h94.4c1 5 1.6 10.1 1.6 16.6 0 57.1-38.3 97.6-96 97.6zm220-81.8h-29v29h-29.2v-29h-29V245h29v-29H355v29h29v29.2z"],"google-wallet":[448,512,[],"f1ee","M156.8 126.8c37.6 60.6 64.2 113.1 84.3 162.5-8.3 33.8-18.8 66.5-31.3 98.3-13.2-52.3-26.5-101.3-56-148.5 6.5-36.4 2.3-73.6 3-112.3zM109.3 200H16.1c-6.5 0-10.5 7.5-6.5 12.7C51.8 267 81.3 330.5 101.3 400h103.5c-16.2-69.7-38.7-133.7-82.5-193.5-3-4-8-6.5-13-6.5zm47.8-88c68.5 108 130 234.5 138.2 368H409c-12-138-68.4-265-143.2-368H157.1zm251.8-68.5c-1.8-6.8-8.2-11.5-15.2-11.5h-88.3c-5.3 0-9 5-7.8 10.3 13.2 46.5 22.3 95.5 26.5 146 48.2 86.2 79.7 178.3 90.6 270.8 15.8-60.5 25.3-133.5 25.3-203 0-73.6-12.1-145.1-31.1-212.6z"],gratipay:[496,512,[],"f184","M248 8C111.1 8 0 119.1 0 256s111.1 248 248 248 248-111.1 248-248S384.9 8 248 8zm114.6 226.4l-113 152.7-112.7-152.7c-8.7-11.9-19.1-50.4 13.6-72 28.1-18.1 54.6-4.2 68.5 11.9 15.9 17.9 46.6 16.9 61.7 0 13.9-16.1 40.4-30 68.1-11.9 32.9 21.6 22.6 60 13.8 72z"],grav:[512,512,[],"f2d6","M301.1 212c4.4 4.4 4.4 11.9 0 16.3l-9.7 9.7c-4.4 4.7-11.9 4.7-16.6 0l-10.5-10.5c-4.4-4.7-4.4-11.9 0-16.6l9.7-9.7c4.4-4.4 11.9-4.4 16.6 0l10.5 10.8zm-30.2-19.7c3-3 3-7.8 0-10.5-2.8-3-7.5-3-10.5 0-2.8 2.8-2.8 7.5 0 10.5 3.1 2.8 7.8 2.8 10.5 0zm-26 5.3c-3 2.8-3 7.5 0 10.2 2.8 3 7.5 3 10.5 0 2.8-2.8 2.8-7.5 0-10.2-3-3-7.7-3-10.5 0zm72.5-13.3c-19.9-14.4-33.8-43.2-11.9-68.1 21.6-24.9 40.7-17.2 59.8.8 11.9 11.3 29.3 24.9 17.2 48.2-12.5 23.5-45.1 33.2-65.1 19.1zm47.7-44.5c-8.9-10-23.3 6.9-15.5 16.1 7.4 9 32.1 2.4 15.5-16.1zM504 256c0 137-111 248-248 248S8 393 8 256 119 8 256 8s248 111 248 248zm-66.2 42.6c2.5-16.1-20.2-16.6-25.2-25.7-13.6-24.1-27.7-36.8-54.5-30.4 11.6-8 23.5-6.1 23.5-6.1.3-6.4 0-13-9.4-24.9 3.9-12.5.3-22.4.3-22.4 15.5-8.6 26.8-24.4 29.1-43.2 3.6-31-18.8-59.2-49.8-62.8-22.1-2.5-43.7 7.7-54.3 25.7-23.2 40.1 1.4 70.9 22.4 81.4-14.4-1.4-34.3-11.9-40.1-34.3-6.6-25.7 2.8-49.8 8.9-61.4 0 0-4.4-5.8-8-8.9 0 0-13.8 0-24.6 5.3 11.9-15.2 25.2-14.4 25.2-14.4 0-6.4-.6-14.9-3.6-21.6-5.4-11-23.8-12.9-31.7 2.8.1-.2.3-.4.4-.5-5 11.9-1.1 55.9 16.9 87.2-2.5 1.4-9.1 6.1-13 10-21.6 9.7-56.2 60.3-56.2 60.3-28.2 10.8-77.2 50.9-70.6 79.7.3 3 1.4 5.5 3 7.5-2.8 2.2-5.5 5-8.3 8.3-11.9 13.8-5.3 35.2 17.7 24.4 15.8-7.2 29.6-20.2 36.3-30.4 0 0-5.5-5-16.3-4.4 27.7-6.6 34.3-9.4 46.2-9.1 8 3.9 8-34.3 8-34.3 0-14.7-2.2-31-11.1-41.5 12.5 12.2 29.1 32.7 28 60.6-.8 18.3-15.2 23-15.2 23-9.1 16.6-43.2 65.9-30.4 106 0 0-9.7-14.9-10.2-22.1-17.4 19.4-46.5 52.3-24.6 64.5 26.6 14.7 108.8-88.6 126.2-142.3 34.6-20.8 55.4-47.3 63.9-65 22 43.5 95.3 94.5 101.1 59z"],gripfire:[384,512,[],"f3ac","M171.8 503.8c0-5.3 4.8-12.2 4.8-22.3 0-15.2-13-39.9-78.1-86.6C64.2 365.8 32 336.4 32 286.6 32 171.9 179.1 110.1 179.1 18c0-3.3-.2-6.7-.6-10 5.1 2.4 39.1 43.3 39.1 90.4 0 80.5-105.1 129.2-105.1 203 0 26.9 16.6 47.2 32.6 69.5 22.5 30.2 44.2 56.9 44.2 86.5-.1 14.5-4.4 29.7-17.5 46.4zm146-241.4c1.5 8.4 2.2 16.6 2.2 24.6 0 51.8-29.4 97.5-67.3 136.8-1 1-2.2 2.4-3.2 2.4-3.6 0-35.5-41.6-35.5-53.2 0 0 41.8-55.7 41.8-96.9 0-10.8-2.7-21.7-9.1-33.4-1.5 32.3-55.7 87.7-58.1 87.7-2.7 0-17.9-22-17.9-42.1 0-5.3 1-10.7 3.2-15.8 2.4-5.5 56.6-72 56.6-116.7 0-6.2-1-12-3.4-17.1l-4-7.2c16.7 6.5 82.6 64.1 94.7 130.9"],grunt:[384,512,[],"f3ad","M61.3 189.3c-1.1 10 5.2 19.1 5.2 19.1.7-7.5 2.2-12.8 4-16.6.4 10.3 3.2 23.5 12.8 34.1 6.9 7.6 35.6 23.3 54.9 6.1 1 2.4 2.1 5.3 3 8.5 2.9 10.3-2.7 25.3-2.7 25.3s15.1-17.1 13.9-32.5c10.8-.5 21.4-8.4 21.1-19.5 0 0-18.9 10.4-35.5-8.8-9.7-11.2-40.9-42-83.1-31.8 4.3 1 8.9 2.4 13.5 4.1h-.1c-4.2 2-6.5 7.1-7 12zm28.3-1.8c19.5 11 37.4 25.7 44.9 37-5.7 3.3-21.7 10.4-38-1.7-10.3-7.6-9.8-26.2-6.9-35.3zm79.2 233.7c2.2 2.3 1.5 5.3.9 6.8-1.1 2.7-5.5 11.6-13 19.8-2.7 2.9-6.6 4.6-11 4.6-4.3 0-8.7-1.6-11.8-4.3-2.3-2.1-10.2-9.5-13.7-18.6-1.3-3.4-1-6.1.9-8.1 1.3-1.3 4-2.9 9.5-2.9H160c4.1 0 7 .9 8.8 2.7zm62.9-187.9c-1.2 15.5 13.9 32.5 13.9 32.5s-5.6-15-2.7-25.3c.9-3.2 2-6 3-8.5 19.3 17.3 48 1.5 54.8-6.1 9.6-10.6 12.3-23.8 12.8-34.1 1.8 3.8 3.4 9.1 4 16.6 0 0 6.4-9.1 5.2-19.1-.6-5-2.9-10-7-11.8h-.1c4.6-1.8 9.2-3.2 13.5-4.1-42.3-10.2-73.4 20.6-83.1 31.8-16.7 19.2-35.5 8.8-35.5 8.8-.2 10.9 10.4 18.9 21.2 19.3zm17.8-8.8c7.5-11.4 25.4-26 44.9-37 3 9.1 3.4 27.7-7 35.4-16.3 12.1-32.2 5-37.9 1.6-.1.1 0 0 0 0zM263 421.4c1.9 1.9 2.2 4.6.9 7.9-3.5 8.9-11.4 16.1-13.7 18.1-3.1 2.6-7.4 4.2-11.8 4.2s-8.3-1.6-11-4.5c-7.5-8-12-16.7-13-19.3-.6-1.5-1.3-4.4.9-6.7 1.7-1.8 4.7-2.7 8.9-2.7h29.4c5.4.1 8.1 1.7 9.4 3zm-98.3-251.5c9.9 6 18.8 8.1 27.3 8.3 8.5-.2 17.4-2.3 27.3-8.3 0 0-14.5 17.7-27.2 17.8h-.2c-12.7-.2-27.2-17.8-27.2-17.8zm184.5 147.4c-2.4 17.9-13 33.8-24.6 43.7-3.1-22.7-3.7-55.5-3.7-62.4 0-14.7 9.5-24.5 12.2-26.1 2.5-1.5 5.4-3 8.3-4.6 18-9.6 40.4-21.6 40.4-43.7 0-16.2-9.3-23.2-15.4-27.8-.8-.6-1.5-1.1-2.2-1.7-2.1-1.7-3.7-3-4.3-4.4-4.4-9.8-3.6-34.2-1.7-37.6.6-.6 16.7-20.9 11.8-39.2-2-7.4-6.9-13.3-14.1-17-5.3-2.7-11.9-4.2-19.5-4.5-.1-2-.5-3.9-.9-5.9-.6-2.6-1.1-5.3-.9-8.1.4-4.7.8-9 2.2-11.3 8.4-13.3 28.8-17.6 29-17.6l12.3-2.4-8.1-9.5c-.1-.2-17.3-17.5-46.3-17.5-7.9 0-16 1.3-24.1 3.9-24.2 7.8-42.9 30.5-49.4 39.3-3.1-1-6.3-1.9-9.6-2.7-4.2-15.8 9-38.5 9-38.5s-13.6-3-33.7 15.2c-2.6-6.5-8.1-20.5-1.8-37.2C184.6 10.1 177.2 26 175 40.4c-7.6-5.4-6.7-23.1-7.2-27.6-7.5.9-29.2 21.9-28.2 48.3-2 .5-3.9 1.1-5.9 1.7-6.5-8.8-25.1-31.5-49.4-39.3-7.9-2.2-16-3.5-23.9-3.5-29 0-46.1 17.3-46.3 17.5L6 46.9l12.3 2.4c.2 0 20.6 4.3 29 17.6 1.4 2.2 1.8 6.6 2.2 11.3.2 2.8-.4 5.5-.9 8.1-.4 1.9-.8 3.9-.9 5.9-7.7.3-14.2 1.8-19.5 4.5-7.2 3.7-12.1 9.6-14.1 17-5 18.2 11.2 38.5 11.8 39.2 1.9 3.4 2.7 27.8-1.7 37.6-.6 1.4-2.2 2.7-4.3 4.4-.7.5-1.4 1.1-2.2 1.7-6.1 4.6-15.4 11.7-15.4 27.8 0 22.1 22.4 34.1 40.4 43.7 3 1.6 5.8 3.1 8.3 4.6 2.7 1.6 12.2 11.4 12.2 26.1 0 6.9-.6 39.7-3.7 62.4-11.6-9.9-22.2-25.9-24.6-43.8 0 0-29.2 22.6-20.6 70.8 5.2 29.5 23.2 46.1 47 54.7 8.8 19.1 29.4 45.7 67.3 49.6C143 504.3 163 512 192.2 512h.2c29.1 0 49.1-7.7 63.6-19.5 37.9-3.9 58.5-30.5 67.3-49.6 23.8-8.7 41.7-25.2 47-54.7 8.2-48.4-21.1-70.9-21.1-70.9zM305.7 37.7c5.6-1.8 11.6-2.7 17.7-2.7 11 0 19.9 3 24.7 5-3.1 1.4-6.4 3.2-9.7 5.3-2.4-.4-5.6-.8-9.2-.8-10.5 0-20.5 3.1-28.7 8.9-12.3 8.7-18 16.9-20.7 22.4-2.2-1.3-4.5-2.5-7.1-3.7-1.6-.8-3.1-1.5-4.7-2.2 6.1-9.1 19.9-26.5 37.7-32.2zm21 18.2c-.8 1-1.6 2.1-2.3 3.2-3.3 5.2-3.9 11.6-4.4 17.8-.5 6.4-1.1 12.5-4.4 17-4.2.8-8.1 1.7-11.5 2.7-2.3-3.1-5.6-7-10.5-11.2 1.4-4.8 5.5-16.1 13.5-22.5 5.6-4.3 12.2-6.7 19.6-7zM45.6 45.3c-3.3-2.2-6.6-4-9.7-5.3 4.8-2 13.7-5 24.7-5 6.1 0 12 .9 17.7 2.7 17.8 5.8 31.6 23.2 37.7 32.1-1.6.7-3.2 1.4-4.8 2.2-2.5 1.2-4.9 2.5-7.1 3.7-2.6-5.4-8.3-13.7-20.7-22.4-8.3-5.8-18.2-8.9-28.8-8.9-3.4.1-6.6.5-9 .9zm44.7 40.1c-4.9 4.2-8.3 8-10.5 11.2-3.4-.9-7.3-1.9-11.5-2.7C65 89.5 64.5 83.4 64 77c-.5-6.2-1.1-12.6-4.4-17.8-.7-1.1-1.5-2.2-2.3-3.2 7.4.3 14 2.6 19.5 7 8 6.3 12.1 17.6 13.5 22.4zM58.1 259.9c-2.7-1.6-5.6-3.1-8.4-4.6-14.9-8-30.2-16.3-30.2-30.5 0-11.1 4.3-14.6 8.9-18.2l.5-.4c.7-.6 1.4-1.2 2.2-1.8-.9 7.2-1.9 13.3-2.7 14.9 0 0 12.1-15 15.7-44.3 1.4-11.5-1.1-34.3-5.1-43 .2 4.9 0 9.8-.3 14.4-.4-.8-.8-1.6-1.3-2.2-3.2-4-11.8-17.5-9.4-26.6.9-3.5 3.1-6 6.7-7.8 3.8-1.9 8.8-2.9 15.1-2.9 12.3 0 25.9 3.7 32.9 6 25.1 8 55.4 30.9 64.1 37.7.2.2.4.3.4.3l5.6 3.9-3.5-5.8c-.2-.3-19.1-31.4-53.2-46.5 2-2.9 7.4-8.1 21.6-15.1 21.4-10.5 46.5-15.8 74.3-15.8 27.9 0 52.9 5.3 74.3 15.8 14.2 6.9 19.6 12.2 21.6 15.1-34 15.1-52.9 46.2-53.1 46.5l-3.5 5.8 5.6-3.9s.2-.1.4-.3c8.7-6.8 39-29.8 64.1-37.7 7-2.2 20.6-6 32.9-6 6.3 0 11.3 1 15.1 2.9 3.5 1.8 5.7 4.4 6.7 7.8 2.5 9.1-6.1 22.6-9.4 26.6-.5.6-.9 1.3-1.3 2.2-.3-4.6-.5-9.5-.3-14.4-4 8.8-6.5 31.5-5.1 43 3.6 29.3 15.7 44.3 15.7 44.3-.8-1.6-1.8-7.7-2.7-14.9.7.6 1.5 1.2 2.2 1.8l.5.4c4.6 3.7 8.9 7.1 8.9 18.2 0 14.2-15.4 22.5-30.2 30.5-2.9 1.5-5.7 3.1-8.4 4.6-8.7 5-18 16.7-19.1 34.2-.9 14.6.9 49.9 3.4 75.9-12.4 4.8-26.7 6.4-39.7 6.8-2-4.1-3.9-8.5-5.5-13.1-.7-2-19.6-51.1-26.4-62.2 5.5 39 17.5 73.7 23.5 89.6-3.5-.5-7.3-.7-11.7-.7h-117c-4.4 0-8.3.3-11.7.7 6-15.9 18.1-50.6 23.5-89.6-6.8 11.2-25.7 60.3-26.4 62.2-1.6 4.6-3.5 9-5.5 13.1-13-.4-27.2-2-39.7-6.8 2.5-26 4.3-61.2 3.4-75.9-.9-17.4-10.3-29.2-19-34.2zM34.8 404.6c-12.1-20-8.7-54.1-3.7-59.1 10.9 34.4 47.2 44.3 74.4 45.4-2.7 4.2-5.2 7.6-7 10l-1.4 1.4c-7.2 7.8-8.6 18.5-4.1 31.8-22.7-.1-46.3-9.8-58.2-29.5zm45.7 43.5c6 1.1 12.2 1.9 18.6 2.4 3.5 8 7.4 15.9 12.3 23.1-14.4-5.9-24.4-16-30.9-25.5zM192 498.2c-60.6-.1-78.3-45.8-84.9-64.7-3.7-10.5-3.4-18.2.9-23.1 2.9-3.3 9.5-7.2 24.6-7.2h118.8c15.1 0 21.8 3.9 24.6 7.2 4.2 4.8 4.5 12.6.9 23.1-6.6 18.8-24.3 64.6-84.9 64.7zm80.6-24.6c4.9-7.2 8.8-15.1 12.3-23.1 6.4-.5 12.6-1.3 18.6-2.4-6.5 9.5-16.5 19.6-30.9 25.5zm76.6-69c-12 19.7-35.6 29.3-58.1 29.7 4.5-13.3 3.1-24.1-4.1-31.8-.4-.5-.9-1-1.4-1.5-1.8-2.4-4.3-5.8-7-10 27.2-1.2 63.5-11 74.4-45.4 5 5 8.4 39.1-3.8 59z"],gulp:[256,512,[],"f3ae","M209.8 391.1l-14.1 24.6-4.6 80.2c0 8.9-28.3 16.1-63.1 16.1s-63.1-7.2-63.1-16.1l-5.8-79.4-14.9-25.4c41.2 17.3 126 16.7 165.6 0zm-196-253.3l13.6 125.5c5.9-20 20.8-47 40-55.2 6.3-2.7 12.7-2.7 18.7.9 5.2 3 9.6 9.3 10.1 11.8 1.2 6.5-2 9.1-4.5 9.1-3 0-5.3-4.6-6.8-7.3-4.1-7.3-10.3-7.6-16.9-2.8-6.9 5-12.9 13.4-17.1 20.7-5.1 8.8-9.4 18.5-12 28.2-1.5 5.6-2.9 14.6-.6 19.9 1 2.2 2.5 3.6 4.9 3.6 5 0 12.3-6.6 15.8-10.1 4.5-4.5 10.3-11.5 12.5-16l5.2-15.5c2.6-6.8 9.9-5.6 9.9 0 0 10.2-3.7 13.6-10 34.7-5.8 19.5-7.6 25.8-7.6 25.8-.7 2.8-3.4 7.5-6.3 7.5-1.2 0-2.1-.4-2.6-1.2-1-1.4-.9-5.3-.8-6.3.2-3.2 6.3-22.2 7.3-25.2-2 2.2-4.1 4.4-6.4 6.6-5.4 5.1-14.1 11.8-21.5 11.8-3.4 0-5.6-.9-7.7-2.4l7.6 79.6c2 5 39.2 17.1 88.2 17.1 49.1 0 86.3-12.2 88.2-17.1l10.9-94.6c-5.7 5.2-12.3 11.6-19.6 14.8-5.4 2.3-17.4 3.8-17.4-5.7 0-5.2 9.1-14.8 14.4-21.5 1.4-1.7 4.7-5.9 4.7-8.1 0-2.9-6-2.2-11.7 2.5-3.2 2.7-6.2 6.3-8.7 9.7-4.3 6-6.6 11.2-8.5 15.5-6.2 14.2-4.1 8.6-9.1 22-5 13.3-4.2 11.8-5.2 14-.9 1.9-2.2 3.5-4 4.5-1.9 1-4.5.9-6.1-.3-.9-.6-1.3-1.9-1.3-3.7 0-.9.1-1.8.3-2.7 1.5-6.1 7.8-18.1 15-34.3 1.6-3.7 1-2.6.8-2.3-6.2 6-10.9 8.9-14.4 10.5-5.8 2.6-13 2.6-14.5-4.1-.1-.4-.1-.8-.2-1.2-11.8 9.2-24.3 11.7-20-8.1-4.6 8.2-12.6 14.9-22.4 14.9-4.1 0-7.1-1.4-8.6-5.1-2.3-5.5 1.3-14.9 4.6-23.8 1.7-4.5 4-9.9 7.1-16.2 1.6-3.4 4.2-5.4 7.6-4.5.6.2 1.1.4 1.6.7 2.6 1.8 1.6 4.5.3 7.2-3.8 7.5-7.1 13-9.3 20.8-.9 3.3-2 9 1.5 9 2.4 0 4.7-.8 6.9-2.4 4.6-3.4 8.3-8.5 11.1-13.5 2-3.6 4.4-8.3 5.6-12.3.5-1.7 1.1-3.3 1.8-4.8 1.1-2.5 2.6-5.1 5.2-5.1 1.3 0 2.4.5 3.2 1.5 1.7 2.2 1.3 4.5.4 6.9-2 5.6-4.7 10.6-6.9 16.7-1.3 3.5-2.7 8-2.7 11.7 0 3.4 3.7 2.6 6.8 1.2 2.4-1.1 4.8-2.8 6.8-4.5 1.2-4.9.9-3.8 26.4-68.2 1.3-3.3 3.7-4.7 6.1-4.7 1.2 0 2.2.4 3.2 1.1 1.7 1.3 1.7 4.1 1 6.2-.7 1.9-.6 1.3-4.5 10.5-5.2 12.1-8.6 20.8-13.2 31.9-1.9 4.6-7.7 18.9-8.7 22.3-.6 2.2-1.3 5.8 1 5.8 5.4 0 19.3-13.1 23.1-17 .2-.3.5-.4.9-.6.6-1.9 1.2-3.7 1.7-5.5 1.4-3.8 2.7-8.2 5.3-11.3.8-1 1.7-1.6 2.7-1.6 2.8 0 4.2 1.2 4.2 4 0 1.1-.7 5.1-1.1 6.2 1.4-1.5 2.9-3 4.5-4.5 15-13.9 25.7-6.8 25.7.2 0 7.4-8.9 17.7-13.8 23.4-1.6 1.9-4.9 5.4-5 6.4 0 1.3.9 1.8 2.2 1.8 2 0 6.4-3.5 8-4.7 5-3.9 11.8-9.9 16.6-14.1l14.8-136.8c-30.5 17.1-197.6 17.2-228.3.2zm229.7-8.5c0 21-231.2 21-231.2 0 0-8.8 51.8-15.9 115.6-15.9 9 0 17.8.1 26.3.4l12.6-48.7L228.1.6c1.4-1.4 5.8-.2 9.9 3.5s6.6 7.9 5.3 9.3l-.1.1L185.9 74l-10 40.7c39.9 2.6 67.6 8.1 67.6 14.6zm-69.4 4.6c0-.8-.9-1.5-2.5-2.1l-.2.8c0 1.3-5 2.4-11.1 2.4s-11.1-1.1-11.1-2.4c0-.1 0-.2.1-.3l.2-.7c-1.8.6-3 1.4-3 2.3 0 2.1 6.2 3.7 13.7 3.7 7.7.1 13.9-1.6 13.9-3.7z"],"hacker-news":[448,512,[],"f1d4","M0 32v448h448V32H0zm21.2 197.2H21c.1-.1.2-.3.3-.4 0 .1 0 .3-.1.4zm218 53.9V384h-31.4V281.3L128 128h37.3c52.5 98.3 49.2 101.2 59.3 125.6 12.3-27 5.8-24.4 60.6-125.6H320l-80.8 155.1z"],"hacker-news-square":[448,512,[],"f3af","M400 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zM21.2 229.2H21c.1-.1.2-.3.3-.4 0 .1 0 .3-.1.4zm218 53.9V384h-31.4V281.3L128 128h37.3c52.5 98.3 49.2 101.2 59.3 125.6 12.3-27 5.8-24.4 60.6-125.6H320l-80.8 155.1z"],"hire-a-helper":[512,512,[],"f3b0","M443.1 0H71.9C67.9 37.3 37.4 67.8 0 71.7v371.5c37.4 4.9 66 32.4 71.9 68.8h372.2c3-36.4 32.5-65.8 67.9-69.8V71.7c-36.4-5.9-65-35.3-68.9-71.7zm-37 404.9c-36.3 0-18.8-2-55.1-2-35.8 0-21 2-56.1 2-5.9 0-4.9-8.2 0-9.8 22.8-7.6 22.9-10.2 24.6-12.8 10.4-15.6 5.9-83 5.9-113 0-5.3-6.4-12.8-13.8-12.8H200.4c-7.4 0-13.8 7.5-13.8 12.8 0 30-4.5 97.4 5.9 113 1.7 2.5 1.8 5.2 24.6 12.8 4.9 1.6 6 9.8 0 9.8-35.1 0-20.3-2-56.1-2-36.3 0-18.8 2-55.1 2-7.9 0-5.8-10.8 0-10.8 10.2-3.4 13.5-3.5 21.7-13.8 7.7-12.9 7.9-44.4 7.9-127.8V151.3c0-22.2-12.2-28.3-28.6-32.4-8.8-2.2-4-11.8 1-11.8 36.5 0 20.6 2 57.1 2 32.7 0 16.5-2 49.2-2 3.3 0 8.5 8.3 1 10.8-4.9 1.6-27.6 3.7-27.6 39.3 0 45.6-.2 55.8 1 68.8 0 1.3 2.3 12.8 12.8 12.8h109.2c10.5 0 12.8-11.5 12.8-12.8 1.2-13 1-23.2 1-68.8 0-35.6-22.7-37.7-27.6-39.3-7.5-2.5-2.3-10.8 1-10.8 32.7 0 16.5 2 49.2 2 36.5 0 20.6-2 57.1-2 4.9 0 9.9 9.6 1 11.8-16.4 4.1-28.6 10.3-28.6 32.4v101.2c0 83.4.1 114.9 7.9 127.8 8.2 10.2 11.4 10.4 21.7 13.8 5.8 0 7.8 10.8 0 10.8z"],hooli:[640,512,[],"f427","M508.4 352h57.9V156.7L508.4 184v168zm73.7-110.5V352H640V241.5h-57.9zm-250.7-8.9c-18.2-18.2-50.4-17.1-50.4-17.1s-32.2-1.1-50.4 17.1c-1.9 1.9-3.7 3.9-5.3 6-38.2-29.6-72.5-46.5-102.1-61.1v-20.7l-22.5 10.6c-54.4-22.1-89-18.2-97.3.1 0 0-24.9 32.8 61.9 110.9v-31c-48.8-54.6-39-76.1-35.3-79.2 13.5-11.4 37.5-8 64.4 2.1L65.2 184v63.3c13.1 14.7 30.5 31.5 53.5 50.4l4.5 3.6v-29.8c0-6.9 1.7-18.2 10.8-18.2s10.6 6.9 10.6 15V317c18 12.2 37.3 22.1 57.7 29.6v-93.9c0-18.7-13.4-37.4-40.6-37.4-15.8-.1-30.5 8.2-38.5 21.9v-54.3c41.9 20.9 83.9 46.5 99.9 58.3-10.2 14.6-9.3 28.1-9.3 43.7 0 18.7-1.4 34.3 16.8 52.5 18.2 18.2 50.4 17.1 50.4 17.1s32.3 1.1 50.4-17.1c18.2-18.2 16.7-33.8 16.7-52.5 0-18.5 1.5-34.2-16.7-52.3zm-39.7 71.9c0 3.6-1.8 12.5-10.7 12.5-8.9 0-10.7-8.9-10.7-12.5v-40.4c0-8.7 7.3-10.9 10.7-10.9 3.4 0 10.7 2.1 10.7 10.9v40.4zm185.7-71.9c-18.2-18.2-50.4-17.1-50.4-17.1s-32.3-1.1-50.4 17.1c-18.2 18.2-16.8 33.9-16.8 52.6 0 18.7-1.4 34.3 16.8 52.5 18.2 18.2 50.4 17.1 50.4 17.1s32.3 1.1 50.4-17.1c18.2-18.2 16.8-33.8 16.8-52.5-.1-18.8 1.3-34.5-16.8-52.6zm-39.8 71.9c0 3.6-1.8 12.5-10.7 12.5-8.9 0-10.7-8.9-10.7-12.5v-40.4c0-8.7 7.3-10.9 10.7-10.9 3.4 0 10.7 2.1 10.7 10.9v40.4zm173.5-73c15.9 0 28.9-12.9 28.9-28.9s-12.9-24.5-28.9-24.5c-15.9 0-28.9 8.6-28.9 24.5s12.9 28.9 28.9 28.9zM144.5 352l38.3.8c-13.2-4.6-26-10.2-38.3-16.8v16zm-21.4 0v-28.6c-6.5-4.2-13-8.7-19.4-13.6-14.8-11.2-27.5-21.7-38.5-31.5V352h57.9zm59.7.8c36.5 12.5 69.9 14.2 94.7 7.2-19.9.2-45.8-2.6-75.3-13.3v5.3l-19.4.8z"],hotjar:[448,512,[],"f3b1","M414.9 161.5C340.2 29 121.1 0 121.1 0S222.2 110.4 93 197.7C11.3 252.8-21 324.4 14 402.6c26.8 59.9 83.5 84.3 144.6 93.4-29.2-55.1-6.6-122.4-4.1-129.6 57.1 86.4 165 0 110.8-93.9 71 15.4 81.6 138.6 27.1 215.5 80.5-25.3 134.1-88.9 148.8-145.6 15.5-59.3 3.7-127.9-26.3-180.9z"],houzz:[320,512,[],"f27c","M12.2 256L160 341.1 12.2 426.6V256M160 512l147.8-85.4V256L160 341.1V512zm0-512L12.2 85.4V256L160 170.6V0zm0 170.6L307.8 256V85.4L160 170.6z"],html5:[384,512,[],"f13b","M0 32l34.9 395.8L191.5 480l157.6-52.2L384 32H0zm308.2 127.9H124.4l4.1 49.4h175.6l-13.6 148.4-97.9 27v.3h-1.1l-98.7-27.3-6-75.8h47.7L138 320l53.5 14.5 53.7-14.5 6-62.2H84.3L71.5 112.2h241.1l-4.4 47.7z"],hubspot:[512,512,[],"f3b2","M267.4 211.6c-25.1 23.7-40.8 57.3-40.8 94.6 0 29.3 9.7 56.3 26 78L203.1 434c-4.4-1.6-9.1-2.5-14-2.5-10.8 0-20.9 4.2-28.5 11.8-7.6 7.6-11.8 17.8-11.8 28.6s4.2 20.9 11.8 28.5c7.6 7.6 17.8 11.6 28.5 11.6 10.8 0 20.9-3.9 28.6-11.6 7.6-7.6 11.8-17.8 11.8-28.5 0-4.2-.6-8.2-1.9-12.1l50-50.2c22 16.9 49.4 26.9 79.3 26.9 71.9 0 130-58.3 130-130.2 0-65.2-47.7-119.2-110.2-128.7V116c17.5-7.4 28.2-23.8 28.2-42.9 0-26.1-20.9-47.9-47-47.9S311.2 47 311.2 73.1c0 19.1 10.7 35.5 28.2 42.9v61.2c-15.2 2.1-29.6 6.7-42.7 13.6-27.6-20.9-117.5-85.7-168.9-124.8 1.2-4.4 2-9 2-13.8C129.8 23.4 106.3 0 77.4 0 48.6 0 25.2 23.4 25.2 52.2c0 28.9 23.4 52.3 52.2 52.3 9.8 0 18.9-2.9 26.8-7.6l163.2 114.7zm89.5 163.6c-38.1 0-69-30.9-69-69s30.9-69 69-69 69 30.9 69 69-30.9 69-69 69z"],imdb:[448,512,[],"f2d8","M350.5 288.7c0 5.4 1.6 14.4-6.2 14.4-1.6 0-3-.8-3.8-2.4-2.2-5.1-1.1-44.1-1.1-44.7 0-3.8-1.1-12.7 4.9-12.7 7.3 0 6.2 7.3 6.2 12.7v32.7zM265 229.9c0-9.7 1.6-16-10.3-16v83.7c12.2.3 10.3-8.7 10.3-18.4v-49.3zM448 80v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V80c0-26.5 21.5-48 48-48h352c26.5 0 48 21.5 48 48zM21.3 228.8c-.1.1-.2.3-.3.4h.3v-.4zM97 192H64v127.8h33V192zm113.3 0h-43.1l-7.6 59.9c-2.7-20-5.4-40.1-8.7-59.9h-42.8v127.8h29v-84.5l12.2 84.5h20.6l11.6-86.4v86.4h28.7V192zm86.3 45.3c0-8.1.3-16.8-1.4-24.4-4.3-22.5-31.4-20.9-49-20.9h-24.6v127.8c86.1.1 75 6 75-82.5zm85.9 17.3c0-17.3-.8-30.1-22.2-30.1-8.9 0-14.9 2.7-20.9 9.2V192h-31.7v127.8h29.8l1.9-8.1c5.7 6.8 11.9 9.8 20.9 9.8 19.8 0 22.2-15.2 22.2-30.9v-36z"],instagram:[448,512,[],"f16d","M224.1 141c-63.6 0-114.9 51.3-114.9 114.9s51.3 114.9 114.9 114.9S339 319.5 339 255.9 287.7 141 224.1 141zm0 189.6c-41.1 0-74.7-33.5-74.7-74.7s33.5-74.7 74.7-74.7 74.7 33.5 74.7 74.7-33.6 74.7-74.7 74.7zm146.4-194.3c0 14.9-12 26.8-26.8 26.8-14.9 0-26.8-12-26.8-26.8s12-26.8 26.8-26.8 26.8 12 26.8 26.8zm76.1 27.2c-1.7-35.9-9.9-67.7-36.2-93.9-26.2-26.2-58-34.4-93.9-36.2-37-2.1-147.9-2.1-184.9 0-35.8 1.7-67.6 9.9-93.9 36.1s-34.4 58-36.2 93.9c-2.1 37-2.1 147.9 0 184.9 1.7 35.9 9.9 67.7 36.2 93.9s58 34.4 93.9 36.2c37 2.1 147.9 2.1 184.9 0 35.9-1.7 67.7-9.9 93.9-36.2 26.2-26.2 34.4-58 36.2-93.9 2.1-37 2.1-147.8 0-184.8zM398.8 388c-7.8 19.6-22.9 34.7-42.6 42.6-29.5 11.7-99.5 9-132.1 9s-102.7 2.6-132.1-9c-19.6-7.8-34.7-22.9-42.6-42.6-11.7-29.5-9-99.5-9-132.1s-2.6-102.7 9-132.1c7.8-19.6 22.9-34.7 42.6-42.6 29.5-11.7 99.5-9 132.1-9s102.7-2.6 132.1 9c19.6 7.8 34.7 22.9 42.6 42.6 11.7 29.5 9 99.5 9 132.1s2.7 102.7-9 132.1z"],"internet-explorer":[512,512,[],"f26b","M483.049 159.706c10.855-24.575 21.424-60.438 21.424-87.871 0-72.722-79.641-98.371-209.673-38.577-107.632-7.181-211.221 73.67-237.098 186.457 30.852-34.862 78.271-82.298 121.977-101.158C125.404 166.85 79.128 228.002 43.992 291.725 23.246 329.651 0 390.94 0 436.747c0 98.575 92.854 86.5 180.251 42.006 31.423 15.43 66.559 15.573 101.695 15.573 97.124 0 184.249-54.294 216.814-146.022H377.927c-52.509 88.593-196.819 52.996-196.819-47.436H509.9c6.407-43.581-1.655-95.715-26.851-141.162zM64.559 346.877c17.711 51.15 53.703 95.871 100.266 123.304-88.741 48.94-173.267 29.096-100.266-123.304zm115.977-108.873c2-55.151 50.276-94.871 103.98-94.871 53.418 0 101.981 39.72 103.981 94.871H180.536zm184.536-187.6c21.425-10.287 48.563-22.003 72.558-22.003 31.422 0 54.274 21.717 54.274 53.722 0 20.003-7.427 49.007-14.569 67.867-26.28-42.292-65.986-81.584-112.263-99.586z"],ioxhost:[640,512,[],"f208","M616 160h-67.3C511.2 70.7 422.9 8 320 8 183 8 72 119 72 256c0 16.4 1.6 32.5 4.7 48H24c-13.3 0-24 10.8-24 24 0 13.3 10.7 24 24 24h67.3c37.5 89.3 125.8 152 228.7 152 137 0 248-111 248-248 0-16.4-1.6-32.5-4.7-48H616c13.3 0 24-10.8 24-24 0-13.3-10.7-24-24-24zm-96 96c0 110.5-89.5 200-200 200-75.7 0-141.6-42-175.5-104H424c13.3 0 24-10.8 24-24 0-13.3-10.7-24-24-24H125.8c-3.8-15.4-5.8-31.4-5.8-48 0-110.5 89.5-200 200-200 75.7 0 141.6 42 175.5 104H216c-13.3 0-24 10.8-24 24 0 13.3 10.7 24 24 24h298.2c3.8 15.4 5.8 31.4 5.8 48zm-304-24h208c13.3 0 24 10.7 24 24 0 13.2-10.7 24-24 24H216c-13.3 0-24-10.7-24-24 0-13.2 10.7-24 24-24z"],itunes:[448,512,[],"f3b4","M223.6 80.3C129 80.3 52.5 157 52.5 251.5S129 422.8 223.6 422.8s171.2-76.7 171.2-171.2c0-94.6-76.7-171.3-171.2-171.3zm79.4 240c-3.2 13.6-13.5 21.2-27.3 23.8-12.1 2.2-22.2 2.8-31.9-5-11.8-10-12-26.4-1.4-36.8 8.4-8 20.3-9.6 38-12.8 3-.5 5.6-1.2 7.7-3.7 3.2-3.6 2.2-2 2.2-80.8 0-5.6-2.7-7.1-8.4-6.1-4 .7-91.9 17.1-91.9 17.1-5 1.1-6.7 2.6-6.7 8.3 0 116.1.5 110.8-1.2 118.5-2.1 9-7.6 15.8-14.9 19.6-8.3 4.6-23.4 6.6-31.4 5.2-21.4-4-28.9-28.7-14.4-42.9 8.4-8 20.3-9.6 38-12.8 3-.5 5.6-1.2 7.7-3.7 5-5.7.9-127 2.6-133.7.4-2.6 1.5-4.8 3.5-6.4 2.1-1.7 5.8-2.7 6.7-2.7 101-19 113.3-21.4 115.1-21.4 5.7-.4 9 3 9 8.7-.1 170.6.4 161.4-1 167.6zM345.2 32H102.8C45.9 32 0 77.9 0 134.8v242.4C0 434.1 45.9 480 102.8 480h242.4c57 0 102.8-45.9 102.8-102.8V134.8C448 77.9 402.1 32 345.2 32zM223.6 444c-106.3 0-192.5-86.2-192.5-192.5S117.3 59 223.6 59s192.5 86.2 192.5 192.5S329.9 444 223.6 444z"],"itunes-note":[384,512,[],"f3b5","M381.9 388.2c-6.4 27.4-27.2 42.8-55.1 48-24.5 4.5-44.9 5.6-64.5-10.2-23.9-20.1-24.2-53.4-2.7-74.4 17-16.2 40.9-19.5 76.8-25.8 6-1.1 11.2-2.5 15.6-7.4 6.4-7.2 4.4-4.1 4.4-163.2 0-11.2-5.5-14.3-17-12.3-8.2 1.4-185.7 34.6-185.7 34.6-10.2 2.2-13.4 5.2-13.4 16.7 0 234.7 1.1 223.9-2.5 239.5-4.2 18.2-15.4 31.9-30.2 39.5-16.8 9.3-47.2 13.4-63.4 10.4-43.2-8.1-58.4-58-29.1-86.6 17-16.2 40.9-19.5 76.8-25.8 6-1.1 11.2-2.5 15.6-7.4 10.1-11.5 1.8-256.6 5.2-270.2.8-5.2 3-9.6 7.1-12.9 4.2-3.5 11.8-5.5 13.4-5.5 204-38.2 228.9-43.1 232.4-43.1 11.5-.8 18.1 6 18.1 17.6.2 344.5 1.1 326-1.8 338.5z"],jenkins:[512,512,[],"f3b6","M487.1 425c-1.4-11.2-19-23.1-28.2-31.9-5.1-5-29-23.1-30.4-29.9-1.4-6.6 9.7-21.5 13.3-28.9 5.1-10.7 8.8-23.7 11.3-32.6 18.8-66.1 20.7-156.9-6.2-211.2-10.2-20.6-38.6-49-56.4-62.5-42-31.7-119.6-35.3-170.1-16.6-14.1 5.2-27.8 9.8-40.1 17.1-33.1 19.4-68.3 32.5-78.1 71.6-24.2 10.8-31.5 41.8-30.3 77.8.2 7 4.1 15.8 2.7 22.4-.7 3.3-5.2 7.6-6.1 9.8-11.6 27.7-2.3 64 11.1 83.7 8.1 11.9 21.5 22.4 39.2 25.2.7 10.6 3.3 19.7 8.2 30.4 3.1 6.8 14.7 19 10.4 27.7-2.2 4.4-21 13.8-27.3 17.6C89 407.2 73.7 415 54.2 429c-12.6 9-32.3 10.2-29.2 31.1 2.1 14.1 10.1 31.6 14.7 45.8.7 2 1.4 4.1 2.1 6h422c4.9-15.3 9.7-30.9 14.6-47.2 3.4-11.4 10.2-27.8 8.7-39.7zM205.9 33.7c1.8-.5 3.4.7 4.9 2.4-.2 5.2-5.4 5.1-8.9 6.8-5.4 6.7-13.4 9.8-20 17.2-6.8 7.5-14.4 27.7-23.4 30-4.5 1.1-9.7-.8-13.6-.5-10.4.7-17.7 6-28.3 7.5 13.6-29.9 56.1-54 89.3-63.4zm-104.8 93.6c13.5-14.9 32.1-24.1 54.8-25.9 11.7 29.7-8.4 65-.9 97.6 2.3 9.9 10.2 25.4-2.4 25.7.3-28.3-34.8-46.3-61.3-29.6-1.8-21.5-4.9-51.7 9.8-67.8zm36.7 200.2c-1-4.1-2.7-12.9-2.3-15.1 1.6-8.7 17.1-12.5 11-24.7-11.3-.1-13.8 10.2-24.1 11.3-26.7 2.6-45.6-35.4-44.4-58.4 1-19.5 17.6-38.2 40.1-35.8 16 1.8 21.4 19.2 24.5 34.7 9.2.5 22.5-.4 26.9-7.6-.6-17.5-8.8-31.6-8.2-47.7 1-30.3 17.5-57.6 4.8-87.4 13.6-30.9 53.5-55.3 83.1-70 36.6-18.3 94.9-3.7 129.3 15.8 19.7 11.1 34.4 32.7 48.3 50.7-19.5-5.8-36.1 4.2-33.1 20.3 16.3-14.9 44.2-.2 52.5 16.4 7.9 15.8 7.8 39.3 9 62.8 2.9 57-10.4 115.9-39.1 157.1-7.7 11-14.1 23-24.9 30.6-26 18.2-65.4 34.7-99.2 23.4-44.7-15-65-44.8-89.5-78.8.7 18.7 13.8 34.1 26.8 48.4 11.3 12.5 25 26.6 39.7 32.4-12.3-2.9-31.1-3.8-36.2 7.2-28.6-1.9-55.1-4.8-68.7-24.2-10.6-15.4-21.4-41.4-26.3-61.4zm222 124.1c4.1-3 11.1-2.9 17.4-3.6-5.4-2.7-13-3.7-19.3-2.2-.1-4.2-2-6.8-3.2-10.2 10.6-3.8 35.5-28.5 49.6-20.3 6.7 3.9 9.5 26.2 10.1 37 .4 9-.8 18-4.5 22.8-18.8-.6-35.8-2.8-50.7-7 .9-6.1-1-12.1.6-16.5zm-17.2-20c-16.8.8-26-1.2-38.3-10.8.2-.8 1.4-.5 1.5-1.4 18 8 40.8-3.3 59-4.9-7.9 5.1-14.6 11.6-22.2 17.1zm-12.1 33.2c-1.6-9.4-3.5-12-2.8-20.2 25-16.6 29.7 28.6 2.8 20.2zM226 438.6c-11.6-.7-48.1-14-38.5-23.7 9.4 6.5 27.5 4.9 41.3 7.3.8 4.4-2.8 10.2-2.8 16.4zM57.7 497.1c-4.3-12.7-9.2-25.1-14.8-36.9 30.8-23.8 65.3-48.9 102.2-63.5 2.8-1.1 23.2 25.4 26.2 27.6 16.5 11.7 37 21 56.2 30.2 1.2 8.8 3.9 20.2 8.7 35.5.7 2.3 1.4 4.7 2.2 7.2H57.7zm240.6 5.7h-.8c.3-.2.5-.4.8-.5v.5zm7.5-5.7c2.1-1.4 4.3-2.8 6.4-4.3 1.1 1.4 2.2 2.8 3.2 4.3h-9.6zm15.1-24.7c-10.8 7.3-20.6 18.3-33.3 25.2-6 3.3-27 11.7-33.4 10.2-3.6-.8-3.9-5.3-5.4-9.5-3.1-9-10.1-23.4-10.8-37-.8-17.2-2.5-46 16-42.4 14.9 2.9 32.3 9.7 43.9 16.1 7.1 3.9 11.1 8.6 21.9 9.5-.1 1.4-.1 2.8-.2 4.3-5.9 3.9-15.3 3.8-21.8 7.1 9.5.4 17 2.7 23.5 5.9-.1 3.4-.3 7-.4 10.6zm53.4 24.7h-14c-.1-3.2-2.8-5.8-6.1-5.8s-5.9 2.6-6.1 5.8h-17.4c-2.8-4.4-5.7-8.6-8.9-12.5 2.1-2.2 4-4.7 6-6.9 9 3.7 14.8-4.9 21.7-4.2 7.9.8 14.2 11.7 25.4 11l-.6 12.6zm8.7 0c.2-4 .4-7.8.6-11.5 15.6-7.3 29 1.3 35.7 11.5H383zm83.4-37c-2.3 11.2-5.8 24-9.9 37.1-.2-.1-.4-.1-.6-.1H428c.6-1.1 1.2-2.2 1.9-3.3-2.6-6.1-9-8.7-10.9-15.5 12.1-22.7 6.5-93.4-24.2-78.5 4.3-6.3 15.6-11.5 20.8-19.3 13 10.4 20.8 20.3 33.2 31.4 6.8 6 20 13.3 21.4 23.1.8 5.5-2.6 18.9-3.8 25.1zM222.2 130.5c5.4-14.9 27.2-34.7 45-32 7.7 1.2 18 8.2 12.2 17.7-30.2-7-45.2 12.6-54.4 33.1-8.1-2-4.9-13.1-2.8-18.8zm184.1 63.1c8.2-3.6 22.4-.7 29.6-5.3-4.2-11.5-10.3-21.4-9.3-37.7.5 0 1 0 1.4.1 6.8 14.2 12.7 29.2 21.4 41.7-5.7 13.5-43.6 25.4-43.1 1.2zm20.4-43zm-117.2 45.7c-6.8-10.9-19-32.5-14.5-45.3 6.5 11.9 8.6 24.4 17.8 33.3 4.1 4 12.2 9 8.2 20.2-.9 2.7-7.8 8.6-11.7 9.7-14.4 4.3-47.9.9-36.6-17.1 11.9.7 27.9 7.8 36.8-.8zm27.3 70c3.8 6.6 1.4 18.7 12.1 20.6 20.2 3.4 43.6-12.3 58.1-17.8 9-15.2-.8-20.7-8.9-30.5-16.6-20-38.8-44.8-38-74.7 6.7-4.9 7.3 7.4 8.2 9.7 8.7 20.3 30.4 46.2 46.3 63.5 3.9 4.3 10.3 8.4 11 11.2 2.1 8.2-5.4 18-4.5 23.5-21.7 13.9-45.8 29.1-81.4 25.6-7.4-6.7-10.3-21.4-2.9-31.1zm-201.3-9.2c-6.8-3.9-8.4-21-16.4-21.4-11.4-.7-9.3 22.2-9.3 35.5-7.8-7.1-9.2-29.1-3.5-40.3-6.6-3.2-9.5 3.6-13.1 5.9 4.7-34.1 49.8-15.8 42.3 20.3zm299.6 28.8c-10.1 19.2-24.4 40.4-54 41-.6-6.2-1.1-15.6 0-19.4 22.7-2.2 36.6-13.7 54-21.6zm-141.9 12.4c18.9 9.9 53.6 11 79.3 10.2 1.4 5.6 1.3 12.6 1.4 19.4-33 1.8-72-6.4-80.7-29.6zm92.2 46.7c-1.7 4.3-5.3 9.3-9.8 11.1-12.1 4.9-45.6 8.7-62.4-.3-10.7-5.7-17.5-18.5-23.4-26-2.8-3.6-16.9-12.9-.2-12.9 13.1 32.7 58 29 95.8 28.1z"],joget:[496,512,[],"f3b7","M227.5 468.7c-9-13.6-19.9-33.3-23.7-42.4-5.7-13.7-27.2-45.6 31.2-67.1 51.7-19.1 176.7-16.5 208.8-17.6-4 9-8.6 17.9-13.9 26.6-40.4 65.5-110.4 101.5-182 101.5-6.8 0-13.6-.4-20.4-1M66.1 143.9C128 43.4 259.6 12.2 360.1 74.1c74.8 46.1 111.2 130.9 99.3 212.7-24.9-.5-179.3-3.6-230.3-4.9-55.5-1.4-81.7-20.8-58.5-48.2 23.2-27.4 51.1-40.7 68.9-51.2 17.9-10.5 27.3-33.7-23.6-29.7C87.3 161.5 48.6 252.1 37.6 293c-8.8-49.7-.1-102.7 28.5-149.1m-29.2-18c-71.9 116.6-35.6 269.3 81 341.2 116.6 71.9 269.3 35.6 341.2-80.9 71.9-116.6 35.6-269.4-81-341.2-40.5-25.1-85.5-37-129.9-37C165 8 83.8 49.9 36.9 125.9m244.4 110.4c-31.5 20.5-65.3 31.3-65.3 31.3l169.5-1.6 46.5-23.4s3.6-9.5-19.1-15.5c-22.7-6-57 11.3-86.7 27.2-29.7 15.8-31.1 8.2-31.1 8.2s40.2-28.1 50.7-34.5c10.5-6.4 31.9-14 13.4-24.6-3.2-1.8-6.7-2.7-10.4-2.7-17.8 0-41.5 18.7-67.5 35.6"],joomla:[448,512,[],"f1aa","M.6 92.1C.6 58.8 27.4 32 60.4 32c30 0 54.5 21.9 59.2 50.2 32.6-7.6 67.1.6 96.5 30l-44.3 44.3c-20.5-20.5-42.6-16.3-55.4-3.5-14.3 14.3-14.3 37.9 0 52.2l99.5 99.5-44 44.3c-87.7-87.2-49.7-49.7-99.8-99.7-26.8-26.5-35-64.8-24.8-98.9C20.4 144.6.6 120.7.6 92.1zm129.5 116.4l44.3 44.3c10-10 89.7-89.7 99.7-99.8 14.3-14.3 37.6-14.3 51.9 0 12.8 12.8 17 35-3.5 55.4l44 44.3c31.2-31.2 38.5-67.6 28.9-101.2 29.2-4.1 51.9-29.2 51.9-59.5 0-33.2-26.8-60.1-59.8-60.1-30.3 0-55.4 22.5-59.5 51.6-33.8-9.9-71.7-1.5-98.3 25.1-18.3 19.1-71.1 71.5-99.6 99.9zm266.3 152.2c8.2-32.7-.9-68.5-26.3-93.9-11.8-12.2 5 4.7-99.5-99.7l-44.3 44.3 99.7 99.7c14.3 14.3 14.3 37.6 0 51.9-12.8 12.8-35 17-55.4-3.5l-44 44.3c27.6 30.2 68 38.8 102.7 28 5.5 27.4 29.7 48.1 58.9 48.1 33 0 59.8-26.8 59.8-60.1 0-30.2-22.5-55-51.6-59.1zm-84.3-53.1l-44-44.3c-87 86.4-50.4 50.4-99.7 99.8-14.3 14.3-37.6 14.3-51.9 0-13.1-13.4-16.9-35.3 3.2-55.4l-44-44.3c-30.2 30.2-38 65.2-29.5 98.3-26.7 6-46.2 29.9-46.2 58.2C0 453.2 26.8 480 59.8 480c28.6 0 52.5-19.8 58.6-46.7 32.7 8.2 68.5-.6 94.2-26 32.1-32 12.2-12.4 99.5-99.7z"],js:[448,512,[],"f3b8","M0 32v448h448V32H0zm243.8 349.4c0 43.6-25.6 63.5-62.9 63.5-33.7 0-53.2-17.4-63.2-38.5l34.3-20.7c6.6 11.7 12.6 21.6 27.1 21.6 13.8 0 22.6-5.4 22.6-26.5V237.7h42.1v143.7zm99.6 63.5c-39.1 0-64.4-18.6-76.7-43l34.3-19.8c9 14.7 20.8 25.6 41.5 25.6 17.4 0 28.6-8.7 28.6-20.8 0-14.4-11.4-19.5-30.7-28l-10.5-4.5c-30.4-12.9-50.5-29.2-50.5-63.5 0-31.6 24.1-55.6 61.6-55.6 26.8 0 46 9.3 59.8 33.7L368 290c-7.2-12.9-15-18-27.1-18-12.3 0-20.1 7.8-20.1 18 0 12.6 7.8 17.7 25.9 25.6l10.5 4.5c35.8 15.3 55.9 31 55.9 66.2 0 37.8-29.8 58.6-69.7 58.6z"],"js-square":[512,512,[],"f3b9","M432 32H80c-26.5 0-48 21.5-48 48v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zM275.8 381.4c0 43.6-25.6 63.5-62.9 63.5-33.7 0-53.2-17.4-63.2-38.5l34.3-20.7c6.6 11.7 12.6 21.6 27.1 21.6 13.8 0 22.6-5.4 22.6-26.5V237.7h42.1v143.7zm99.6 63.5c-39.1 0-64.4-18.6-76.7-43l34.3-19.8c9 14.7 20.8 25.6 41.5 25.6 17.4 0 28.6-8.7 28.6-20.8 0-14.4-11.4-19.5-30.7-28l-10.5-4.5c-30.4-12.9-50.5-29.2-50.5-63.5 0-31.6 24.1-55.6 61.6-55.6 26.8 0 46 9.3 59.8 33.7L400 290c-7.2-12.9-15-18-27.1-18-12.3 0-20.1 7.8-20.1 18 0 12.6 7.8 17.7 25.9 25.6l10.5 4.5c35.8 15.3 55.9 31 55.9 66.2 0 37.8-29.8 58.6-69.7 58.6z"],jsfiddle:[576,512,[],"f1cc","M510.634 237.462c-4.727-2.621-5.664-5.748-6.381-10.776-2.352-16.488-3.539-33.619-9.097-49.095-35.895-99.957-153.99-143.386-246.849-91.646-27.37 15.25-48.971 36.369-65.493 63.903-3.184-1.508-5.458-2.71-7.824-3.686-30.102-12.421-59.049-10.121-85.331 9.167-25.531 18.737-36.422 44.548-32.676 76.408.355 3.025-1.967 7.621-4.514 9.545-39.712 29.992-56.031 78.065-41.902 124.615 13.831 45.569 57.514 79.796 105.608 81.433 30.291 1.031 60.637.546 90.959.539 84.041-.021 168.09.531 252.12-.48 52.664-.634 96.108-36.873 108.212-87.293 11.54-48.074-11.144-97.3-56.832-122.634zm21.107 156.88c-18.23 22.432-42.343 35.253-71.28 35.65-56.874.781-113.767.23-170.652.23 0 .7-163.028.159-163.728.154-43.861-.332-76.739-19.766-95.175-59.995-18.902-41.245-4.004-90.848 34.186-116.106 9.182-6.073 12.505-11.566 10.096-23.136-5.49-26.361 4.453-47.956 26.42-62.981 22.987-15.723 47.422-16.146 72.034-3.083 10.269 5.45 14.607 11.564 22.198-2.527 14.222-26.399 34.557-46.727 60.671-61.294 97.46-54.366 228.37 7.568 230.24 132.697.122 8.15 2.412 12.428 9.848 15.894 57.56 26.829 74.456 96.122 35.142 144.497zm-87.789-80.499c-5.848 31.157-34.622 55.096-66.666 55.095-16.953-.001-32.058-6.545-44.079-17.705-27.697-25.713-71.141-74.98-95.937-93.387-20.056-14.888-41.99-12.333-60.272 3.782-49.996 44.071 15.859 121.775 67.063 77.188 4.548-3.96 7.84-9.543 12.744-12.844 8.184-5.509 20.766-.884 13.168 10.622-17.358 26.284-49.33 38.197-78.863 29.301-28.897-8.704-48.84-35.968-48.626-70.179 1.225-22.485 12.364-43.06 35.414-55.965 22.575-12.638 46.369-13.146 66.991 2.474C295.68 280.7 320.467 323.97 352.185 343.47c24.558 15.099 54.254 7.363 68.823-17.506 28.83-49.209-34.592-105.016-78.868-63.46-3.989 3.744-6.917 8.932-11.41 11.72-10.975 6.811-17.333-4.113-12.809-10.353 20.703-28.554 50.464-40.44 83.271-28.214 31.429 11.714 49.108 44.366 42.76 78.186z"],keycdn:[512,512,[],"f3ba","M63.8 409.3l60.5-59c32.1 42.8 71.1 66 126.6 67.4 30.5.7 60.3-7 86.4-22.4 5.1 5.3 18.5 19.5 20.9 22-32.2 20.7-69.6 31.1-108.1 30.2-43.3-1.1-84.6-16.7-117.7-44.4.3-.6-38.2 37.5-38.6 37.9 9.5 29.8-13.1 62.4-46.3 62.4C20.7 503.3 0 481.7 0 454.9c0-34.3 33.1-56.6 63.8-45.6zm354.9-252.4c19.1 31.3 29.6 67.4 28.7 104-1.1 44.8-19 87.5-48.6 121 .3.3 23.8 25.2 24.1 25.5 9.6-1.3 19.2 2 25.9 9.1 11.3 12 10.9 30.9-1.1 42.4-12 11.3-30.9 10.9-42.4-1.1-6.7-7-9.4-16.8-7.6-26.3-24.9-26.6-44.4-47.2-44.4-47.2 42.7-34.1 63.3-79.6 64.4-124.2.7-28.9-7.2-57.2-21.1-82.2l22.1-21zM104 53.1c6.7 7 9.4 16.8 7.6 26.3l45.9 48.1c-4.7 3.8-13.3 10.4-22.8 21.3-25.4 28.5-39.6 64.8-40.7 102.9-.7 28.9 6.1 57.2 20 82.4l-22 21.5C72.7 324 63.1 287.9 64.2 250.9c1-44.6 18.3-87.6 47.5-121.1l-25.3-26.4c-9.6 1.3-19.2-2-25.9-9.1-11.3-12-10.9-30.9 1.1-42.4C73.5 40.7 92.2 41 104 53.1zM464.9 8c26 0 47.1 22.4 47.1 48.3S490.9 104 464.9 104c-6.3.1-14-1.1-15.9-1.8l-62.9 59.7c-32.7-43.6-76.7-65.9-126.9-67.2-30.5-.7-60.3 6.8-86.2 22.4l-21.1-22C184.1 74.3 221.5 64 260 64.9c43.3 1.1 84.6 16.7 117.7 44.6l41.1-38.6c-1.5-4.7-2.2-9.6-2.2-14.5C416.5 29.7 438.9 8 464.9 8zM256.7 113.4c5.5 0 10.9.4 16.4 1.1 78.1 9.8 133.4 81.1 123.8 159.1-9.8 78.1-81.1 133.4-159.1 123.8-78.1-9.8-133.4-81.1-123.8-159.2 9.3-72.4 70.1-124.6 142.7-124.8zm-59 119.4c.6 22.7 12.2 41.8 32.4 52.2l-11 51.7h73.7l-11-51.7c20.1-10.9 32.1-29 32.4-52.2-.4-32.8-25.8-57.5-58.3-58.3-32.1.8-57.3 24.8-58.2 58.3zM256 160"],kickstarter:[448,512,[],"f3bb","M400 480H48c-26.4 0-48-21.6-48-48V80c0-26.4 21.6-48 48-48h352c26.4 0 48 21.6 48 48v352c0 26.4-21.6 48-48 48zM199.6 178.5c0-30.7-17.6-45.1-39.7-45.1-25.8 0-40 19.8-40 44.5v154.8c0 25.8 13.7 45.6 40.5 45.6 21.5 0 39.2-14 39.2-45.6v-41.8l60.6 75.7c12.3 14.9 39 16.8 55.8 0 14.6-15.1 14.8-36.8 4-50.4l-49.1-62.8 40.5-58.7c9.4-13.5 9.5-34.5-5.6-49.1-16.4-15.9-44.6-17.3-61.4 7l-44.8 64.7v-38.8z"],"kickstarter-k":[384,512,[],"f3bc","M147.3 114.4c0-56.2-32.5-82.4-73.4-82.4C26.2 32 0 68.2 0 113.4v283c0 47.3 25.3 83.4 74.9 83.4 39.8 0 72.4-25.6 72.4-83.4v-76.5l112.1 138.3c22.7 27.2 72.1 30.7 103.2 0 27-27.6 27.3-67.4 7.4-92.2l-90.8-114.8 74.9-107.4c17.4-24.7 17.5-63.1-10.4-89.8-30.3-29-82.4-31.6-113.6 12.8L147.3 185v-70.6z"],laravel:[640,512,[],"f3bd","M637.5 204.7c-4.2-4.8-62.8-78.1-73.1-90.5-10.3-12.4-15.4-10.2-21.7-9.3s-80.5 13.4-89.1 14.8c-8.6 1.5-14 4.9-8.7 12.3 4.7 6.6 53.4 75.7 64.2 90.9l-193.7 46.4L161.2 11.7C155.1 2.6 153.8-.6 139.8.1 125.9.7 19 9.6 11.4 10.2c-7.6.6-16 4-8.4 22s129 279.6 132.4 287.2c3.4 7.6 12.2 20 32.8 15 21.1-5.1 94.3-24.2 134.3-34.7 21.1 38.3 64.2 115.9 72.2 127 10.6 14.9 18 12.4 34.3 7.4 12.8-3.9 199.6-71.1 208-74.5 8.4-3.5 13.6-5.9 7.9-14.4-4.2-6.2-53.5-72.2-79.3-106.8 17.7-4.7 80.6-21.4 87.3-23.3 7.8-1.8 8.9-5.7 4.6-10.4zm-352.2 72c-2.3.5-110.8 26.5-116.6 27.8-5.8 1.3-5.8.7-6.5-1.3-.7-2-129-266.7-130.8-270-1.8-3.3-1.7-5.9 0-5.9s102.5-9 106-9.2c3.6-.2 3.2.6 4.5 2.8 0 0 142.2 245.4 144.6 249.7 2.6 4.3 1.1 5.6-1.2 6.1zm306 57.3c1.7 2.7 3.5 4.5-2 6.4-5.4 2-183.7 62.1-187.1 63.6-3.5 1.5-6.2 2-10.6-4.5-4.5-6.4-62.4-106.8-62.4-106.8l188.8-49c4.7-1.5 6.2-2.5 9.2 2.2 2.9 4.7 62.4 85.4 64.1 88.1zm12.1-134.1c-4.2.9-73.6 18.1-73.6 18.1l-56.7-77.8c-1.6-2.2-2.9-4.5 1.1-5s68.4-12.2 71.3-12.8c2.9-.7 5.4-1.5 9 3.4 3.6 4.9 52.6 67 54.5 69.4 1.8 2.3-1.4 3.8-5.6 4.7z"],lastfm:[512,512,[],"f202","M225.8 367.1l-18.8-51s-30.5 34-76.2 34c-40.5 0-69.2-35.2-69.2-91.5 0-72.1 36.4-97.9 72.1-97.9 66.5 0 74.8 53.3 100.9 134.9 18.8 56.9 54 102.6 155.4 102.6 72.7 0 122-22.3 122-80.9 0-72.9-62.7-80.6-115-92.1-25.8-5.9-33.4-16.4-33.4-34 0-19.9 15.8-31.7 41.6-31.7 28.2 0 43.4 10.6 45.7 35.8l58.6-7c-4.7-52.8-41.1-74.5-100.9-74.5-52.8 0-104.4 19.9-104.4 83.9 0 39.9 19.4 65.1 68 76.8 44.9 10.6 79.8 13.8 79.8 45.7 0 21.7-21.1 30.5-61 30.5-59.2 0-83.9-31.1-97.9-73.9-32-96.8-43.6-163-161.3-163C45.7 113.8 0 168.3 0 261c0 89.1 45.7 137.2 127.9 137.2 66.2 0 97.9-31.1 97.9-31.1z"],"lastfm-square":[448,512,[],"f203","M400 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zm-92.2 312.9c-63.4 0-85.4-28.6-97.1-64.1-16.3-51-21.5-84.3-63-84.3-22.4 0-45.1 16.1-45.1 61.2 0 35.2 18 57.2 43.3 57.2 28.6 0 47.6-21.3 47.6-21.3l11.7 31.9s-19.8 19.4-61.2 19.4c-51.3 0-79.9-30.1-79.9-85.8 0-57.9 28.6-92 82.5-92 73.5 0 80.8 41.4 100.8 101.9 8.8 26.8 24.2 46.2 61.2 46.2 24.9 0 38.1-5.5 38.1-19.1 0-19.9-21.8-22-49.9-28.6-30.4-7.3-42.5-23.1-42.5-48 0-40 32.3-52.4 65.2-52.4 37.4 0 60.1 13.6 63 46.6l-36.7 4.4c-1.5-15.8-11-22.4-28.6-22.4-16.1 0-26 7.3-26 19.8 0 11 4.8 17.6 20.9 21.3 32.7 7.1 71.8 12 71.8 57.5.1 36.7-30.7 50.6-76.1 50.6z"],leanpub:[576,512,[],"f212","M386.539 111.485l15.096 248.955-10.979-.275c-36.232-.824-71.64 8.783-102.657 27.997-31.016-19.214-66.424-27.997-102.657-27.997-45.564 0-82.07 10.705-123.516 27.723L93.117 129.6c28.546-11.803 61.484-18.115 92.226-18.115 41.173 0 73.836 13.175 102.657 42.544 27.723-28.271 59.013-41.721 98.539-42.544zM569.07 448c-25.526 0-47.485-5.215-70.542-15.645-34.31-15.645-69.993-24.978-107.871-24.978-38.977 0-74.934 12.901-102.657 40.623-27.723-27.723-63.68-40.623-102.657-40.623-37.878 0-73.561 9.333-107.871 24.978C55.239 442.236 32.731 448 8.303 448H6.93L49.475 98.859C88.726 76.626 136.486 64 181.775 64 218.83 64 256.984 71.685 288 93.095 319.016 71.685 357.17 64 394.225 64c45.289 0 93.049 12.626 132.3 34.859L569.07 448zm-43.368-44.741l-34.036-280.246c-30.742-13.999-67.248-21.41-101.009-21.41-38.428 0-74.385 12.077-102.657 38.702-28.272-26.625-64.228-38.702-102.657-38.702-33.761 0-70.267 7.411-101.009 21.41L50.298 403.259c47.211-19.487 82.894-33.486 135.045-33.486 37.604 0 70.817 9.606 102.657 29.644 31.84-20.038 65.052-29.644 102.657-29.644 52.151 0 87.834 13.999 135.045 33.486z"],less:[640,512,[],"f41d","M612.7 219c0-20.5 3.2-32.6 3.2-54.6 0-34.2-12.6-45.2-40.5-45.2h-20.5v24.2h6.3c14.2 0 17.3 4.7 17.3 22.1 0 16.3-1.6 32.6-1.6 51.5 0 24.2 7.9 33.6 23.6 37.3v1.6c-15.8 3.7-23.6 13.1-23.6 37.3 0 18.9 1.6 34.2 1.6 51.5 0 17.9-3.7 22.6-17.3 22.6v.5h-6.3V393h20.5c27.8 0 40.5-11 40.5-45.2 0-22.6-3.2-34.2-3.2-54.6 0-11 6.8-22.6 27.3-23.6v-27.3c-20.5-.7-27.3-12.3-27.3-23.3zm-105.6 32c-15.8-6.3-30.5-10-30.5-20.5 0-7.9 6.3-12.6 17.9-12.6s22.1 4.7 33.6 13.1l21-27.8c-13.1-10-31-20.5-55.2-20.5-35.7 0-59.9 20.5-59.9 49.4 0 25.7 22.6 38.9 41.5 46.2 16.3 6.3 32.1 11.6 32.1 22.1 0 7.9-6.3 13.1-20.5 13.1-13.1 0-26.3-5.3-40.5-16.3l-21 30.5c15.8 13.1 39.9 22.1 59.9 22.1 42 0 64.6-22.1 64.6-51s-22.5-41-43-47.8zm-358.9 59.4c-3.7 0-8.4-3.2-8.4-13.1V119.1H65.2c-28.4 0-41 11-41 45.2 0 22.6 3.2 35.2 3.2 54.6 0 11-6.8 22.6-27.3 23.6v27.3c20.5.5 27.3 12.1 27.3 23.1 0 19.4-3.2 31-3.2 53.6 0 34.2 12.6 45.2 40.5 45.2h20.5v-24.2h-6.3c-13.1 0-17.3-5.3-17.3-22.6s1.6-32.1 1.6-51.5c0-24.2-7.9-33.6-23.6-37.3v-1.6c15.8-3.7 23.6-13.1 23.6-37.3 0-18.9-1.6-34.2-1.6-51.5s3.7-22.1 17.3-22.1H93v150.8c0 32.1 11 53.1 43.1 53.1 10 0 17.9-1.6 23.6-3.7l-5.3-34.2c-3.1.8-4.6.8-6.2.8zM379.9 251c-16.3-6.3-31-10-31-20.5 0-7.9 6.3-12.6 17.9-12.6 11.6 0 22.1 4.7 33.6 13.1l21-27.8c-13.1-10-31-20.5-55.2-20.5-35.7 0-59.9 20.5-59.9 49.4 0 25.7 22.6 38.9 41.5 46.2 16.3 6.3 32.1 11.6 32.1 22.1 0 7.9-6.3 13.1-20.5 13.1-13.1 0-26.3-5.3-40.5-16.3l-20.5 30.5c15.8 13.1 39.9 22.1 59.9 22.1 42 0 64.6-22.1 64.6-51 .1-28.9-22.5-41-43-47.8zm-155-68.8c-38.4 0-75.1 32.1-74.1 82.5 0 52 34.2 82.5 79.3 82.5 18.9 0 39.9-6.8 56.2-17.9l-15.8-27.8c-11.6 6.8-22.6 10-34.2 10-21 0-37.3-10-41.5-34.2H290c.5-3.7 1.6-11 1.6-19.4.6-42.6-22.6-75.7-66.7-75.7zm-30 66.2c3.2-21 15.8-31 30.5-31 18.9 0 26.3 13.1 26.3 31h-56.8z"],line:[448,512,[],"f3c0","M272.1 204.2v71.1c0 1.8-1.4 3.2-3.2 3.2h-11.4c-1.1 0-2.1-.6-2.6-1.3l-32.6-44v42.2c0 1.8-1.4 3.2-3.2 3.2h-11.4c-1.8 0-3.2-1.4-3.2-3.2v-71.1c0-1.8 1.4-3.2 3.2-3.2H219c1 0 2.1.5 2.6 1.4l32.6 44v-42.2c0-1.8 1.4-3.2 3.2-3.2h11.4c1.8-.1 3.3 1.4 3.3 3.1zm-82-3.2h-11.4c-1.8 0-3.2 1.4-3.2 3.2v71.1c0 1.8 1.4 3.2 3.2 3.2h11.4c1.8 0 3.2-1.4 3.2-3.2v-71.1c0-1.7-1.4-3.2-3.2-3.2zm-27.5 59.6h-31.1v-56.4c0-1.8-1.4-3.2-3.2-3.2h-11.4c-1.8 0-3.2 1.4-3.2 3.2v71.1c0 .9.3 1.6.9 2.2.6.5 1.3.9 2.2.9h45.7c1.8 0 3.2-1.4 3.2-3.2v-11.4c0-1.7-1.4-3.2-3.1-3.2zM332.1 201h-45.7c-1.7 0-3.2 1.4-3.2 3.2v71.1c0 1.7 1.4 3.2 3.2 3.2h45.7c1.8 0 3.2-1.4 3.2-3.2v-11.4c0-1.8-1.4-3.2-3.2-3.2H301v-12h31.1c1.8 0 3.2-1.4 3.2-3.2V234c0-1.8-1.4-3.2-3.2-3.2H301v-12h31.1c1.8 0 3.2-1.4 3.2-3.2v-11.4c-.1-1.7-1.5-3.2-3.2-3.2zM448 113.7V399c-.1 44.8-36.8 81.1-81.7 81H81c-44.8-.1-81.1-36.9-81-81.7V113c.1-44.8 36.9-81.1 81.7-81H367c44.8.1 81.1 36.8 81 81.7zm-61.6 122.6c0-73-73.2-132.4-163.1-132.4-89.9 0-163.1 59.4-163.1 132.4 0 65.4 58 120.2 136.4 130.6 19.1 4.1 16.9 11.1 12.6 36.8-.7 4.1-3.3 16.1 14.1 8.8 17.4-7.3 93.9-55.3 128.2-94.7 23.6-26 34.9-52.3 34.9-81.5z"],linkedin:[448,512,[],"f08c","M416 32H31.9C14.3 32 0 46.5 0 64.3v383.4C0 465.5 14.3 480 31.9 480H416c17.6 0 32-14.5 32-32.3V64.3c0-17.8-14.4-32.3-32-32.3zM135.4 416H69V202.2h66.5V416zm-33.2-243c-21.3 0-38.5-17.3-38.5-38.5S80.9 96 102.2 96c21.2 0 38.5 17.3 38.5 38.5 0 21.3-17.2 38.5-38.5 38.5zm282.1 243h-66.4V312c0-24.8-.5-56.7-34.5-56.7-34.6 0-39.9 27-39.9 54.9V416h-66.4V202.2h63.7v29.2h.9c8.9-16.8 30.6-34.5 62.9-34.5 67.2 0 79.7 44.3 79.7 101.9V416z"],"linkedin-in":[448,512,[],"f0e1","M100.3 480H7.4V180.9h92.9V480zM53.8 140.1C24.1 140.1 0 115.5 0 85.8 0 56.1 24.1 32 53.8 32c29.7 0 53.8 24.1 53.8 53.8 0 29.7-24.1 54.3-53.8 54.3zM448 480h-92.7V334.4c0-34.7-.7-79.2-48.3-79.2-48.3 0-55.7 37.7-55.7 76.7V480h-92.8V180.9h89.1v40.8h1.3c12.4-23.5 42.7-48.3 87.9-48.3 94 0 111.3 61.9 111.3 142.3V480z"],linode:[448,512,[],"f2b8","M437.4 226.3c-.3-.9-.9-1.4-1.4-2l-70-38.6c-.9-.6-2-.6-3.1 0l-58.9 36c-.9.6-1.4 1.7-1.4 2.6l-.9 31.4-24-16c-.9-.6-2.3-.6-3.1 0L240 260.9l-1.4-35.1c0-.9-.6-2-1.4-2.3l-36-24.3 33.7-17.4c1.1-.6 1.7-1.7 1.7-2.9l-5.7-132.3c0-.9-.9-2-1.7-2.6L138.6.3c-.9-.3-1.7-.3-2.3-.3L12.6 38.6c-1.4.6-2.3 2-2 3.7L38 175.4c.9 3.4 34 27.4 38.6 30.9l-26.9 12.9c-1.4.9-2 2.3-1.7 3.4l20.6 100.3c.6 2.9 23.7 23.1 27.1 26.3l-17.4 10.6c-.9.6-1.7 2-1.4 3.1 1.4 7.1 15.4 77.7 16.9 79.1l65.1 69.1c.6.6 1.4.6 2.3.9.6 0 1.1-.3 1.7-.6l83.7-66.9c.9-.6 1.1-1.4 1.1-2.3l-2-46 28 23.7c1.1.9 2.9.9 4 0l66.9-53.4c.9-.6 1.1-1.4 1.1-2.3l2.3-33.4 20.3 14c1.1.9 2.6.9 3.7 0l54.6-43.7c.6-.3 1.1-1.1 1.1-2 .9-6.5 10.3-70.8 9.7-72.8zm-204.8 4.8l4 92.6-90.6 61.2-14-96.6 100.6-57.2zm-7.7-180l5.4 126-106.6 55.4L104 97.7l120.9-46.6zM44 173.1L18 48l79.7 49.4 19.4 132.9L44 173.1zm30.6 147.8L55.7 230l70 58.3 13.7 93.4-64.8-60.8zm24.3 117.7l-13.7-67.1 61.7 60.9 9.7 67.4-57.7-61.2zm64.5 64.5l-10.6-70.9 85.7-61.4 3.1 70-78.2 62.3zm82-115.1c0-3.4.9-22.9-2-25.1l-24.3-20 22.3-14.9c2.3-1.7 1.1-5.7 1.1-8l29.4 22.6.6 68.3-27.1-22.9zm94.3-25.4l-60.9 48.6-.6-68.6 65.7-46.9-4.2 66.9zm27.7-25.7l-19.1-13.4 2-34c.3-.9-.3-2-1.1-2.6L308 259.7l.6-30 64.6 40.6-5.8 66.6zm54.6-39.8l-48.3 38.3 5.7-65.1 51.1-36.6-8.5 63.4z"],linux:[448,512,[],"f17c","M196.1 123.6c-.2-1.4 1.9-2.3 3.2-2.9 1.7-.7 3.9-1 5.5-.1.4.2.8.7.6 1.1-.4 1.2-2.4 1-3.5 1.6-1 .5-1.8 1.7-3 1.7-1 .1-2.7-.4-2.8-1.4zm24.7-.3c1 .5 1.8 1.7 3 1.7 1.1 0 2.8-.4 2.9-1.5.2-1.4-1.9-2.3-3.2-2.9-1.7-.7-3.9-1-5.5-.1-.4.2-.8.7-.6 1.1.3 1.3 2.3 1.1 3.4 1.7zm214.7 310.2c-.5 8.2-6.5 13.8-13.9 18.3-14.9 9-37.3 15.8-50.9 32.2l-2.6-2.2 2.6 2.2c-14.2 16.9-31.7 26.6-48.3 27.9-16.5 1.3-32-6.3-40.3-23v-.1c-1.1-2.1-1.9-4.4-2.5-6.7-21.5 1.2-40.2-5.3-55.1-4.1-22 1.2-35.8 6.5-48.3 6.6-4.8 10.6-14.3 17.6-25.9 20.2-16 3.7-36.1 0-55.9-10.4l1.6-3-1.6 3c-18.5-9.8-42-8.9-59.3-12.5-8.7-1.8-16.3-5-20.1-12.3-3.7-7.3-3-17.3 2.2-31.7 1.7-5.1.4-12.7-.8-20.8-.6-3.9-1.2-7.9-1.2-11.8 0-4.3.7-8.5 2.8-12.4 4.5-8.5 11.8-12.1 18.5-14.5 6.7-2.4 12.8-4 17-8.3 5.2-5.5 10.1-14.4 16.6-20.2-2.6-17.2.2-35.4 6.2-53.3 12.6-37.9 39.2-74.2 58.1-96.7 16.1-22.9 20.8-41.3 22.5-64.7C158 103.4 132.4-.2 234.8 0c80.9.1 76.3 85.4 75.8 131.3-.3 30.1 16.3 50.5 33.4 72 15.2 18 35.1 44.3 46.5 74.4 9.3 24.6 12.9 51.8 3.7 79.1 1.4.5 2.8 1.2 4.1 2 1.4.8 2.7 1.8 4 2.9 6.6 5.6 8.7 14.3 10.5 22.4 1.9 8.1 3.6 15.7 7.2 19.7 11.1 12.4 15.9 21.5 15.5 29.7zM220.8 109.1c3.6.9 8.9 2.4 13 4.4-2.1-12.2 4.5-23.5 11.8-23 8.9.3 13.9 15.5 9.1 27.3-.8 1.9-2.8 3.4-3.9 4.6 6.7 2.3 11 4.1 12.6 4.9 7.9-9.5 10.8-26.2 4.3-40.4-9.8-21.4-34.2-21.8-44 .4-3.2 7.2-3.9 14.9-2.9 21.8zm-46.2 18.8c7.8-5.7 6.9-4.7 5.9-5.5-8-6.9-6.6-27.4 1.8-28.1 6.3-.5 10.8 10.7 9.6 19.6 3.1-2.1 6.7-3.6 10.2-4.6 1.7-19.3-9-33.5-19.1-33.5-18.9 0-24 37.5-8.4 52.1zm-9.4 20.9c1.5 4.9 6.1 10.5 14.7 15.3 7.8 4.6 12 11.5 20 15 2.6 1.1 5.7 1.9 9.6 2.1 18.4 1.1 27.1-11.3 38.2-14.9 11.7-3.7 20.1-11 22.7-18.1 3.2-8.5-2.1-14.7-10.5-18.2-11.3-4.9-16.3-5.2-22.6-9.3-10.3-6.6-18.8-8.9-25.9-8.9-14.4 0-23.2 9.8-27.9 14.2-.5.5-7.9 5.9-14.1 10.5-4.2 3.3-5.6 7.4-4.2 12.3zm-33.5 252.8L112.1 366c-6.8-9.2-13.8-14.8-21.9-16-7.7-1.2-12.6 1.4-17.7 6.9-4.8 5.1-8.8 12.3-14.3 18-7.8 6.5-9.3 6.2-19.6 9.9-6.3 2.2-11.3 4.6-14.8 11.3-2.7 5-2.1 12.2-.9 20 1.2 7.9 3 16.3.6 23.9v.2c-5 13.7-5 21.7-2.6 26.4 7.9 15.4 46.6 6.1 76.5 21.9 31.4 16.4 72.6 17.1 75.3-18 2.1-20.5-31.5-49-41-68.9zm153.9 35.8c3.2-11 6.3-21.3 6.8-29 .8-15.2 1.6-28.7 4.4-39.9 3.1-12.6 9.3-23.1 21.4-27.3 2.3-21.1 18.7-21.1 38.3-12.5 18.9 8.5 26 16 22.8 26.1 1 0 2-.1 4.2 0 5.2-16.9-14.3-28-30.7-34.8 2.9-12 2.4-24.1-.4-35.7-6-25.3-22.6-47.8-35.2-59-2.3-.1-2.1 1.9 2.6 6.5 11.6 10.7 37.1 49.2 23.3 84.9-3.9-1-7.6-1.5-10.9-1.4-5.3-29.1-17.5-53.2-23.6-64.6-11.5-21.4-29.5-65.3-37.2-95.7-4.5 6.4-12.4 11.9-22.3 15-4.7 1.5-9.7 5.5-15.9 9-13.9 8-30 8.8-42.4-1.2-4.5-3.6-8-7.6-12.6-10.3-1.6-.9-5.1-3.3-6.2-4.1-2 37.8-27.3 85.3-39.3 112.7-8.3 19.7-13.2 40.8-13.8 61.5-21.8-29.1-5.9-66.3 2.6-82.4 9.5-17.6 11-22.5 8.7-20.8-8.6 14-22 36.3-27.2 59.2-2.7 11.9-3.2 24 .3 35.2 3.5 11.2 11.1 21.5 24.6 29.9 0 0 24.8 14.3 38.3 32.5 7.4 10 9.7 18.7 7.4 24.9-2.5 6.7-9.6 8.9-16.7 8.9 4.8 6 10.3 13 14.4 19.6 37.6 25.7 82.2 15.7 114.3-7.2zM415 408.5c-10-11.3-7.2-33.1-17.1-41.6-6.9-6-13.6-5.4-22.6-5.1-7.7 8.8-25.8 19.6-38.4 16.3-11.5-2.9-18-16.3-18.8-29.5-.3.2-.7.3-1 .5-7.1 3.9-11.1 10.8-13.7 21.1-2.5 10.2-3.4 23.5-4.2 38.7-.7 11.8-6.2 26.4-9.9 40.6-3.5 13.2-5.8 25.2-1.1 36.3 7.2 14.5 19.5 20.4 33.7 19.3 14.2-1.1 30.4-9.8 43.6-25.5 22-26.6 62.3-29.7 63.2-46.5.3-5.1-3.1-13-13.7-24.6zM173.3 148.7c2 1.9 4.7 4.5 8 7.1 6.6 5.2 15.8 10.6 27.3 10.6 11.6 0 22.5-5.9 31.8-10.8 4.9-2.6 10.9-7 14.8-10.4 3.9-3.4 5.9-6.3 3.1-6.6-2.8-.3-2.6 2.6-6 5.1-4.4 3.2-9.7 7.4-13.9 9.8-7.4 4.2-19.5 10.2-29.9 10.2-10.4 0-18.7-4.8-24.9-9.7-3.1-2.5-5.7-5-7.7-6.9-1.5-1.4-1.9-4.6-4.3-4.9-1.4-.1-1.8 3.7 1.7 6.5z"],lyft:[512,512,[],"f3c3","M0 81.1h77.8v208.7c0 33.1 15 52.8 27.2 61-12.7 11.1-51.2 20.9-80.2-2.8C7.8 334 0 310.7 0 289V81.1zm485.9 173.5v-22h23.8v-76.8h-26.1c-10.1-46.3-51.2-80.7-100.3-80.7-56.6 0-102.7 46-102.7 102.7V357c16 2.3 35.4-.3 51.7-14 17.1-14 24.8-37.2 24.8-59v-6.7h38.8v-76.8h-38.8v-23.3c0-34.6 52.2-34.6 52.2 0v77.1c0 56.6 46 102.7 102.7 102.7v-76.5c-14.5 0-26.1-11.7-26.1-25.9zm-294.3-99v113c0 15.4-23.8 15.4-23.8 0v-113H91v132.7c0 23.8 8 54 45 63.9 37 9.8 58.2-10.6 58.2-10.6-2.1 13.4-14.5 23.3-34.9 25.3-15.5 1.6-35.2-3.6-45-7.8v70.3c25.1 7.5 51.5 9.8 77.6 4.7 47.1-9.1 76.8-48.4 76.8-100.8V155.1h-77.1v.5z"],magento:[448,512,[],"f3c4","M445.7 127.9V384l-63.4 36.5V164.7L223.8 73.1 65.2 164.7l.4 255.9L2.3 384V128.1L224.2 0l221.5 127.9zM255.6 420.5L224 438.9l-31.8-18.2v-256l-63.3 36.6.1 255.9 94.9 54.9 95.1-54.9v-256l-63.4-36.6v255.9z"],maxcdn:[512,512,[],"f136","M461.1 442.7h-97.4L415.6 200c2.3-10.2.9-19.5-4.4-25.7-5-6.1-13.7-9.6-24.2-9.6h-49.3l-59.5 278h-97.4l59.5-278h-83.4l-59.5 278H0l59.5-278-44.6-95.4H387c39.4 0 75.3 16.3 98.3 44.9 23.3 28.6 31.8 67.4 23.6 105.9l-47.8 222.6z"],medapps:[320,512,[],"f3c6","M118.3 238.4c3.5-12.5 6.9-33.6 13.2-33.6 8.3 1.8 9.6 23.4 18.6 36.6 4.6-23.5 5.3-85.1 14.1-86.7 9-.7 19.7 66.5 22 77.5 9.9 4.1 48.9 6.6 48.9 6.6 1.9 7.3-24 7.6-40 7.8-4.6 14.8-5.4 27.7-11.4 28-4.7.2-8.2-28.8-17.5-49.6l-9.4 65.5c-4.4 13-15.5-22.5-21.9-39.3-3.3-.1-62.4-1.6-47.6-7.8l31-5zM228 448c21.2 0 21.2-32 0-32H92c-21.2 0-21.2 32 0 32h136zm-24 64c21.2 0 21.2-32 0-32h-88c-21.2 0-21.2 32 0 32h88zm34.2-141.5c3.2-18.9 5.2-36.4 11.9-48.8 7.9-14.7 16.1-28.1 24-41 24.6-40.4 45.9-75.2 45.9-125.5C320 69.6 248.2 0 160 0S0 69.6 0 155.2c0 50.2 21.3 85.1 45.9 125.5 7.9 12.9 16 26.3 24 41 6.7 12.5 8.7 29.8 11.9 48.9 3.5 21 36.1 15.7 32.6-5.1-3.6-21.7-5.6-40.7-15.3-58.6C66.5 246.5 33 211.3 33 155.2 33 87.3 90 32 160 32s127 55.3 127 123.2c0 56.1-33.5 91.3-66.1 151.6-9.7 18-11.7 37.4-15.3 58.6-3.4 20.6 29 26.4 32.6 5.1z"],medium:[448,512,[],"f23a","M0 32v448h448V32H0zm372.2 106.1l-24 23c-2.1 1.6-3.1 4.2-2.7 6.7v169.3c-.4 2.6.6 5.2 2.7 6.7l23.5 23v5.1h-118V367l24.3-23.6c2.4-2.4 2.4-3.1 2.4-6.7V199.8l-67.6 171.6h-9.1L125 199.8v115c-.7 4.8 1 9.7 4.4 13.2l31.6 38.3v5.1H71.2v-5.1l31.6-38.3c3.4-3.5 4.9-8.4 4.1-13.2v-133c.4-3.7-1-7.3-3.8-9.8L75 138.1V133h87.3l67.4 148L289 133.1h83.2v5z"],"medium-m":[512,512,[],"f3c7","M71.5 142.3c.6-5.9-1.7-11.8-6.1-15.8L20.3 72.1V64h140.2l108.4 237.7L364.2 64h133.7v8.1l-38.6 37c-3.3 2.5-5 6.7-4.3 10.8v272c-.7 4.1 1 8.3 4.3 10.8l37.7 37v8.1H307.3v-8.1l39.1-37.9c3.8-3.8 3.8-5 3.8-10.8V171.2L241.5 447.1h-14.7L100.4 171.2v184.9c-1.1 7.8 1.5 15.6 7 21.2l50.8 61.6v8.1h-144v-8L65 377.3c5.4-5.6 7.9-13.5 6.5-21.2V142.3z"],medrt:[544,512,[],"f3c8","M113.7 256c0 121.8 83.9 222.8 193.5 241.1-18.7 4.5-38.2 6.9-58.2 6.9C111.4 504 0 393 0 256S111.4 8 248.9 8c20.1 0 39.6 2.4 58.2 6.9C197.5 33.2 113.7 134.2 113.7 256m297.4 100.3c-77.7 55.4-179.6 47.5-240.4-14.6 5.5 14.1 12.7 27.7 21.7 40.5 61.6 88.2 182.4 109.3 269.7 47 87.3-62.3 108.1-184.3 46.5-272.6-9-12.9-19.3-24.3-30.5-34.2 37.4 78.8 10.7 178.5-67 233.9m-218.8-244c-1.4 1-2.7 2.1-4 3.1 64.3-17.8 135.9 4 178.9 60.5 35.7 47 42.9 106.6 24.4 158 56.7-56.2 67.6-142.1 22.3-201.8-50-65.5-149.1-74.4-221.6-19.8M296 224c-4.4 0-8-3.6-8-8v-40c0-4.4-3.6-8-8-8h-48c-4.4 0-8 3.6-8 8v40c0 4.4-3.6 8-8 8h-40c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8h40c4.4 0 8 3.6 8 8v40c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8v-40c0-4.4 3.6-8 8-8h40c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8h-40z"],meetup:[512,512,[],"f2e0","M99 414.3c1.1 5.7-2.3 11.1-8 12.3-5.4 1.1-10.9-2.3-12-8-1.1-5.4 2.3-11.1 7.7-12.3 5.4-1.2 11.1 2.3 12.3 8zm143.1 71.4c-6.3 4.6-8 13.4-3.7 20 4.6 6.6 13.4 8.3 20 3.7 6.3-4.6 8-13.4 3.4-20-4.2-6.5-13.1-8.3-19.7-3.7zm-86-462.3c6.3-1.4 10.3-7.7 8.9-14-1.1-6.6-7.4-10.6-13.7-9.1-6.3 1.4-10.3 7.7-9.1 14 1.4 6.6 7.6 10.6 13.9 9.1zM34.4 226.3c-10-6.9-23.7-4.3-30.6 6-6.9 10-4.3 24 5.7 30.9 10 7.1 23.7 4.6 30.6-5.7 6.9-10.4 4.3-24.1-5.7-31.2zm272-170.9c10.6-6.3 13.7-20 7.7-30.3-6.3-10.6-19.7-14-30-7.7s-13.7 20-7.4 30.6c6 10.3 19.4 13.7 29.7 7.4zm-191.1 58c7.7-5.4 9.4-16 4.3-23.7s-15.7-9.4-23.1-4.3c-7.7 5.4-9.4 16-4.3 23.7 5.1 7.8 15.6 9.5 23.1 4.3zm372.3 156c-7.4 1.7-12.3 9.1-10.6 16.9 1.4 7.4 8.9 12.3 16.3 10.6 7.4-1.4 12.3-8.9 10.6-16.6-1.5-7.4-8.9-12.3-16.3-10.9zm39.7-56.8c-1.1-5.7-6.6-9.1-12-8-5.7 1.1-9.1 6.9-8 12.6 1.1 5.4 6.6 9.1 12.3 8 5.4-1.5 9.1-6.9 7.7-12.6zM447 138.9c-8.6 6-10.6 17.7-4.9 26.3 5.7 8.6 17.4 10.6 26 4.9 8.3-6 10.3-17.7 4.6-26.3-5.7-8.7-17.4-10.9-25.7-4.9zm-6.3 139.4c26.3 43.1 15.1 100-26.3 129.1-17.4 12.3-37.1 17.7-56.9 17.1-12 47.1-69.4 64.6-105.1 32.6-1.1.9-2.6 1.7-3.7 2.9-39.1 27.1-92.3 17.4-119.4-22.3-9.7-14.3-14.6-30.6-15.1-46.9-65.4-10.9-90-94-41.1-139.7-28.3-46.9.6-107.4 53.4-114.9C151.6 70 234.1 38.6 290.1 82c67.4-22.3 136.3 29.4 130.9 101.1 41.1 12.6 52.8 66.9 19.7 95.2zm-70 74.3c-3.1-20.6-40.9-4.6-43.1-27.1-3.1-32 43.7-101.1 40-128-3.4-24-19.4-29.1-33.4-29.4-13.4-.3-16.9 2-21.4 4.6-2.9 1.7-6.6 4.9-11.7-.3-6.3-6-11.1-11.7-19.4-12.9-12.3-2-17.7 2-26.6 9.7-3.4 2.9-12 12.9-20 9.1-3.4-1.7-15.4-7.7-24-11.4-16.3-7.1-40 4.6-48.6 20-12.9 22.9-38 113.1-41.7 125.1-8.6 26.6 10.9 48.6 36.9 47.1 11.1-.6 18.3-4.6 25.4-17.4 4-7.4 41.7-107.7 44.6-112.6 2-3.4 8.9-8 14.6-5.1 5.7 3.1 6.9 9.4 6 15.1-1.1 9.7-28 70.9-28.9 77.7-3.4 22.9 26.9 26.6 38.6 4 3.7-7.1 45.7-92.6 49.4-98.3 4.3-6.3 7.4-8.3 11.7-8 3.1 0 8.3.9 7.1 10.9-1.4 9.4-35.1 72.3-38.9 87.7-4.6 20.6 6.6 41.4 24.9 50.6 11.4 5.7 62.5 15.7 58.5-11.1zm5.7 92.3c-10.3 7.4-12.9 22-5.7 32.6 7.1 10.6 21.4 13.1 32 6 10.6-7.4 13.1-22 6-32.6-7.4-10.6-21.7-13.5-32.3-6z"],microsoft:[448,512,[],"f3ca","M0 32h214.6v214.6H0V32zm233.4 0H448v214.6H233.4V32zM0 265.4h214.6V480H0V265.4zm233.4 0H448V480H233.4V265.4z"],mix:[416,512,[],"f3cb","M0 64v348.9c0 56.2 88 58.1 88 0V174.3c7.9-52.9 88-50.4 88 6.5v175.3c0 57.9 96 58 96 0V240c5.3-54.7 88-52.5 88 4.3v23.8c0 59.9 88 56.6 88 0V64H0z"],mixcloud:[640,512,[],"f289","M424.43 219.729C416.124 134.727 344.135 68 256.919 68c-72.266 0-136.224 46.516-159.205 114.074-54.545 8.029-96.63 54.822-96.63 111.582 0 62.298 50.668 112.966 113.243 112.966h289.614c52.329 0 94.969-42.362 94.969-94.693 0-45.131-32.118-83.063-74.48-92.2zm-20.489 144.53H114.327c-39.04 0-70.881-31.564-70.881-70.604s31.841-70.604 70.881-70.604c18.827 0 36.548 7.475 49.838 20.766 19.963 19.963 50.133-10.227 30.18-30.18-14.675-14.398-32.672-24.365-52.053-29.349 19.935-44.3 64.79-73.926 114.628-73.926 69.496 0 125.979 56.483 125.979 125.702 0 13.568-2.215 26.857-6.369 39.594-8.943 27.517 32.133 38.939 40.147 13.29 2.769-8.306 4.984-16.889 6.369-25.472 19.381 7.476 33.502 26.303 33.502 48.453 0 28.795-23.535 52.33-52.607 52.33zm235.069-52.33c0 44.024-12.737 86.386-37.102 122.657-4.153 6.092-10.798 9.414-17.72 9.414-16.317 0-27.127-18.826-17.443-32.949 19.381-29.349 29.903-63.682 29.903-99.122s-10.521-69.773-29.903-98.845c-15.655-22.831 19.361-47.24 35.163-23.534 24.366 35.993 37.102 78.356 37.102 122.379zm-70.88 0c0 31.565-9.137 62.021-26.857 88.325-4.153 6.091-10.798 9.136-17.72 9.136-17.201 0-27.022-18.979-17.443-32.948 13.013-19.104 19.658-41.255 19.658-64.513 0-22.981-6.645-45.408-19.658-64.512-15.761-22.986 19.008-47.095 35.163-23.535 17.719 26.026 26.857 56.483 26.857 88.047z"],mizuni:[496,512,[],"f3cc","M248 8C111 8 0 119.1 0 256c0 137 111 248 248 248s248-111 248-248C496 119.1 385 8 248 8zm-80 351.9c-31.4 10.6-58.8 27.3-80 48.2V136c0-22.1 17.9-40 40-40s40 17.9 40 40v223.9zm120-9.9c-12.9-2-26.2-3.1-39.8-3.1-13.8 0-27.2 1.1-40.2 3.1V136c0-22.1 17.9-40 40-40s40 17.9 40 40v214zm120 57.7c-21.2-20.8-48.6-37.4-80-48V136c0-22.1 17.9-40 40-40s40 17.9 40 40v271.7z"],modx:[448,512,[],"f285","M356 241.8l36.7 23.7V480l-133-83.8L356 241.8zM440 75H226.3l-23 37.8 153.5 96.5L440 75zm-89 142.8L55.2 32v214.5l46 29L351 217.8zM97 294.2L8 437h213.7l125-200.5L97 294.2z"],monero:[496,512,[],"f3d0","M352 384h108.4C417 455.9 338.1 504 248 504S79 455.9 35.6 384H144V256.2L248 361l104-105v128zM88 336V128l159.4 159.4L408 128v208h74.8c8.5-25.1 13.2-52 13.2-80C496 119 385 8 248 8S0 119 0 256c0 28 4.6 54.9 13.2 80H88z"],napster:[496,512,[],"f3d2","M298.3 373.6c-14.2 13.6-31.3 24.1-50.4 30.5-19-6.4-36.2-16.9-50.3-30.5h100.7zm44-199.6c20-16.9 43.6-29.2 69.6-36.2V299c0 219.4-328 217.6-328 .3V137.7c25.9 6.9 49.6 19.6 69.5 36.4 56.8-40 132.5-39.9 188.9-.1zm-208.8-58.5c64.4-60 164.3-60.1 228.9-.2-7.1 3.5-13.9 7.3-20.6 11.5-58.7-30.5-129.2-30.4-187.9.1-6.3-4-13.9-8.2-20.4-11.4zM43.8 93.2v69.3c-58.4 36.5-58.4 121.1.1 158.3 26.4 245.1 381.7 240.3 407.6 1.5l.3-1.7c58.7-36.3 58.9-121.7.2-158.2V93.2c-17.3.5-34 3-50.1 7.4-82-91.5-225.5-91.5-307.5.1-16.3-4.4-33.1-7-50.6-7.5zM259.2 352s36-.3 61.3-1.5c10.2-.5 21.1-4 25.5-6.5 26.3-15.1 25.4-39.2 26.2-47.4-79.5-.6-99.9-3.9-113 55.4zm-135.5-55.3c.8 8.2-.1 32.3 26.2 47.4 4.4 2.5 15.2 6 25.5 6.5 25.3 1.1 61.3 1.5 61.3 1.5-13.2-59.4-33.7-56.1-113-55.4zm169.1 123.4c-3.2-5.3-6.9-7.3-6.9-7.3-24.8 7.3-52.2 6.9-75.9 0 0 0-2.9 1.5-6.4 6.6-2.8 4.1-3.7 9.6-3.7 9.6 29.1 17.6 67.1 17.6 96.2 0-.1-.1-.3-4-3.3-8.9z"],"nintendo-switch":[448,512,[],"f418","M95.9 33.5c-44.6 8-80.5 41-91.8 84.4C0 133.6-.3 142.8.2 264.4.4 376 .5 378.6 2.4 387.3c10.3 46.5 43.3 79.6 90.3 90.5 6.1 1.4 13.9 1.7 64.1 1.9 51.9.4 57.3.3 58.7-1.1 1.4-1.4 1.5-19.3 1.5-222.2 0-150.5-.3-221.3-.9-222.6-.9-1.7-2.5-1.8-56.9-1.7-44.2.1-57.5.4-63.3 1.4zm83.9 222.6V444l-37.8-.5c-34.8-.4-38.5-.6-45.5-2.3-29.9-7.7-52-30.7-58.3-60.7-2-9.4-2-240.1-.1-249.3 5.6-26.1 23.7-47.7 48-57.4 12.2-4.9 17.9-5.5 57.6-5.6l35.9-.1v188zm-75.9-131.2c-5.8 1.1-14.7 5.6-19.5 9.7-9.7 8.4-14.6 20.4-13.8 34.5.4 7.3.8 9.3 3.8 15.2 4.4 9 10.9 15.6 19.9 20 6.2 3.1 7.8 3.4 15.9 3.7 7.3.3 9.9 0 14.8-1.7 20.1-6.8 32.3-26.3 28.8-46.4-3.9-23.7-26.6-39.7-49.9-35zm158.2-92.3c-.4.3-.6 100.8-.6 223.5 0 202.3.1 222.8 1.5 223.4 2.5.9 74.5.6 83.4-.4 37.7-4.3 71-27.2 89-61.2 2.3-4.4 5.4-11.7 7-16.2 5.8-17.4 5.7-12.8 5.7-146.1 0-106.4-.2-122.3-1.5-129-9.2-48.3-46.1-84.8-94.5-93.1-6.5-1.1-16.5-1.4-48.8-1.4-22.4-.1-40.9.2-41.2.5zm99.1 202.1c14.5 3.8 26.3 14.8 31.2 28.9 3.1 8.7 3 21.5-.1 29.5-5.7 14.7-16.8 25-31.1 28.8-23.2 6-47.9-8-54.6-31-2-7-1.9-18.9.4-26.2 6.9-22.7 31-36.1 54.2-30z"],node:[640,512,[],"f419","M316.3 452c-2.1 0-4.2-.6-6.1-1.6L291 439c-2.9-1.6-1.5-2.2-.5-2.5 3.8-1.3 4.6-1.6 8.7-4 .4-.2 1-.1 1.4.1l14.8 8.8c.5.3 1.3.3 1.8 0L375 408c.5-.3.9-.9.9-1.6v-66.7c0-.7-.3-1.3-.9-1.6l-57.8-33.3c-.5-.3-1.2-.3-1.8 0l-57.8 33.3c-.6.3-.9 1-.9 1.6v66.7c0 .6.4 1.2.9 1.5l15.8 9.1c8.6 4.3 13.9-.8 13.9-5.8v-65.9c0-.9.7-1.7 1.7-1.7h7.3c.9 0 1.7.7 1.7 1.7v65.9c0 11.5-6.2 18-17.1 18-3.3 0-6 0-13.3-3.6l-15.2-8.7c-3.7-2.2-6.1-6.2-6.1-10.5v-66.7c0-4.3 2.3-8.4 6.1-10.5l57.8-33.4c3.7-2.1 8.5-2.1 12.1 0l57.8 33.4c3.7 2.2 6.1 6.2 6.1 10.5v66.7c0 4.3-2.3 8.4-6.1 10.5l-57.8 33.4c-1.7 1.1-3.8 1.7-6 1.7zm46.7-65.8c0-12.5-8.4-15.8-26.2-18.2-18-2.4-19.8-3.6-19.8-7.8 0-3.5 1.5-8.1 14.8-8.1 11.9 0 16.3 2.6 18.1 10.6.2.8.8 1.3 1.6 1.3h7.5c.5 0 .9-.2 1.2-.5.3-.4.5-.8.4-1.3-1.2-13.8-10.3-20.2-28.8-20.2-16.5 0-26.3 7-26.3 18.6 0 12.7 9.8 16.1 25.6 17.7 18.9 1.9 20.4 4.6 20.4 8.3 0 6.5-5.2 9.2-17.4 9.2-15.3 0-18.7-3.8-19.8-11.4-.1-.8-.8-1.4-1.7-1.4h-7.5c-.9 0-1.7.7-1.7 1.7 0 9.7 5.3 21.3 30.6 21.3 18.5 0 29-7.2 29-19.8zm54.5-50.1c0 6.1-5 11.1-11.1 11.1s-11.1-5-11.1-11.1c0-6.3 5.2-11.1 11.1-11.1 6-.1 11.1 4.8 11.1 11.1zm-1.8 0c0-5.2-4.2-9.3-9.4-9.3-5.1 0-9.3 4.1-9.3 9.3 0 5.2 4.2 9.4 9.3 9.4 5.2-.1 9.4-4.3 9.4-9.4zm-4.5 6.2h-2.6c-.1-.6-.5-3.8-.5-3.9-.2-.7-.4-1.1-1.3-1.1h-2.2v5h-2.4v-12.5h4.3c1.5 0 4.4 0 4.4 3.3 0 2.3-1.5 2.8-2.4 3.1 1.7.1 1.8 1.2 2.1 2.8.1 1 .3 2.7.6 3.3zm-2.8-8.8c0-1.7-1.2-1.7-1.8-1.7h-2v3.5h1.9c1.6 0 1.9-1.1 1.9-1.8zM137.3 191c0-2.7-1.4-5.1-3.7-6.4l-61.3-35.3c-1-.6-2.2-.9-3.4-1h-.6c-1.2 0-2.3.4-3.4 1L3.7 184.6C1.4 185.9 0 188.4 0 191l.1 95c0 1.3.7 2.5 1.8 3.2 1.1.7 2.5.7 3.7 0L42 268.3c2.3-1.4 3.7-3.8 3.7-6.4v-44.4c0-2.6 1.4-5.1 3.7-6.4l15.5-8.9c1.2-.7 2.4-1 3.7-1 1.3 0 2.6.3 3.7 1l15.5 8.9c2.3 1.3 3.7 3.8 3.7 6.4v44.4c0 2.6 1.4 5.1 3.7 6.4l36.4 20.9c1.1.7 2.6.7 3.7 0 1.1-.6 1.8-1.9 1.8-3.2l.2-95zM472.5 87.3v176.4c0 2.6-1.4 5.1-3.7 6.4l-61.3 35.4c-2.3 1.3-5.1 1.3-7.4 0l-61.3-35.4c-2.3-1.3-3.7-3.8-3.7-6.4v-70.8c0-2.6 1.4-5.1 3.7-6.4l61.3-35.4c2.3-1.3 5.1-1.3 7.4 0l15.3 8.8c1.7 1 3.9-.3 3.9-2.2v-94c0-2.8 3-4.6 5.5-3.2l36.5 20.4c2.3 1.2 3.8 3.7 3.8 6.4zm-46 128.9c0-.7-.4-1.3-.9-1.6l-21-12.2c-.6-.3-1.3-.3-1.9 0l-21 12.2c-.6.3-.9.9-.9 1.6v24.3c0 .7.4 1.3.9 1.6l21 12.1c.6.3 1.3.3 1.8 0l21-12.1c.6-.3.9-.9.9-1.6v-24.3zm209.8-.7c2.3-1.3 3.7-3.8 3.7-6.4V192c0-2.6-1.4-5.1-3.7-6.4l-60.9-35.4c-2.3-1.3-5.1-1.3-7.4 0l-61.3 35.4c-2.3 1.3-3.7 3.8-3.7 6.4v70.8c0 2.7 1.4 5.1 3.7 6.4l60.9 34.7c2.2 1.3 5 1.3 7.3 0l36.8-20.5c2.5-1.4 2.5-5 0-6.4L550 241.6c-1.2-.7-1.9-1.9-1.9-3.2v-22.2c0-1.3.7-2.5 1.9-3.2l19.2-11.1c1.1-.7 2.6-.7 3.7 0l19.2 11.1c1.1.7 1.9 1.9 1.9 3.2v17.4c0 2.8 3.1 4.6 5.6 3.2l36.7-21.3zM559 219c-.4.3-.7.7-.7 1.2v13.6c0 .5.3 1 .7 1.2l11.8 6.8c.4.3 1 .3 1.4 0L584 235c.4-.3.7-.7.7-1.2v-13.6c0-.5-.3-1-.7-1.2l-11.8-6.8c-.4-.3-1-.3-1.4 0L559 219zm-254.2 43.5v-70.4c0-2.6-1.6-5.1-3.9-6.4l-61.1-35.2c-2.1-1.2-5-1.4-7.4 0l-61.1 35.2c-2.3 1.3-3.9 3.7-3.9 6.4v70.4c0 2.8 1.9 5.2 4 6.4l61.2 35.2c2.4 1.4 5.2 1.3 7.4 0l61-35.2c1.8-1 3.1-2.7 3.6-4.7.1-.5.2-1.1.2-1.7zm-74.3-124.9l-.8.5h1.1l-.3-.5zm76.2 130.2l-.4-.7v.9l.4-.2z"],"node-js":[448,512,[],"f3d3","M224 480c-6 0-12-1.6-17.2-4.6L151.9 443c-8.2-4.6-4.2-6.2-1.5-7.1 10.9-3.8 13.1-4.7 24.8-11.3 1.2-.7 2.8-.4 4.1.3l42.1 25c1.5.8 3.7.8 5.1 0l164.2-94.8c1.5-.9 2.5-2.6 2.5-4.4V161.2c0-1.9-1-3.6-2.5-4.5L226.5 62c-1.5-.9-3.5-.9-5.1 0l-164 94.7c-1.6.9-2.6 2.7-2.6 4.5v189.5c0 1.8 1 3.5 2.6 4.4l45 26c24.4 12.2 39.3-2.2 39.3-16.6V177.4c0-2.6 2.1-4.7 4.8-4.7h20.8c2.6 0 4.8 2.1 4.8 4.7v187.1c0 32.6-17.7 51.2-48.6 51.2-9.5 0-17 0-37.8-10.3l-43.1-24.8C32 374.5 25.4 363 25.4 350.7V161.2c0-12.3 6.6-23.8 17.2-29.9l164.2-94.9c10.4-5.9 24.2-5.9 34.5 0l164.2 94.9c10.6 6.1 17.2 17.6 17.2 29.9v189.5c0 12.3-6.6 23.8-17.2 29.9l-164.2 94.8c-5.3 3-11.3 4.6-17.3 4.6zm132.5-186.8c0-35.5-24-44.9-74.4-51.6-51-6.7-56.2-10.2-56.2-22.2 0-9.9 4.4-23 42.2-23 33.7 0 46.2 7.3 51.3 30 .4 2.1 2.4 3.7 4.6 3.7h21.3c1.3 0 2.6-.6 3.5-1.5.9-1 1.4-2.3 1.3-3.7-3.3-39.2-29.3-57.4-81.9-57.4-46.8 0-74.7 19.8-74.7 52.9 0 35.9 27.8 45.9 72.7 50.3 53.8 5.3 57.9 13.1 57.9 23.7 0 18.3-14.7 26.2-49.3 26.2-43.4 0-53-10.9-56.2-32.5-.4-2.3-2.3-4-4.7-4h-21.2c-2.6 0-4.7 2.1-4.7 4.7 0 27.7 15.1 60.6 86.9 60.6 51.8.1 81.6-20.4 81.6-56.2z"],npm:[576,512,[],"f3d4","M288 288h-32v-64h32v64zm288-128v192H288v32H160v-32H0V160h576zm-416 32H32v128h64v-96h32v96h32V192zm160 0H192v160h64v-32h64V192zm224 0H352v128h64v-96h32v96h32v-96h32v96h32V192z"],ns8:[640,512,[],"f3d5","M187.1 159.9l-34.2 113.7-54.5-113.7H49L0 320h44.9L76 213.5 126.6 320h56.9L232 159.9h-44.9zm452.5-.9c-2.9-18-23.9-28.1-42.1-31.3-44.6-7.8-101.9 16.3-88.5 58.8v.1c-43.8 8.7-74.3 26.8-94.2 48.2-3-9.8-13.6-16.6-34-16.6h-87.6c-9.3 0-12.9-2.3-11.5-7.4 1.6-5.5 1.9-6.8 3.7-12.2 2.1-6.4 7.8-7.1 13.3-7.1h133.5l9.7-31.5c-139.7 0-144.5-.5-160.1 1.2-12.3 1.3-23.5 4.8-30.6 15-6.8 9.9-14.4 35.6-17.6 47.1-5.4 19.4-.6 28.6 32.8 28.6h87.3c7.8 0 8.8 2.7 7.7 6.6-1.1 4.4-2.8 10-4.5 14.6-1.6 4.2-4.7 7.4-13.8 7.4H216.3L204.7 320c139.9 0 145.3-.6 160.9-2.3 6.6-.7 13-2.1 18.5-4.9.2 3.7.5 7.3 1.2 10.8 5.4 30.5 27.4 52.3 56.8 59.5 48.6 11.9 108.7-16.8 135.1-68 18.7-36.2 14.1-76.2-3.4-105.5h.1c29.6-5.9 70.3-22 65.7-50.6zM530.7 263.7c-5.9 29.5-36.6 47.8-61.6 43.9-30.9-4.8-38.5-39.5-14.1-64.8 16.2-16.8 45.2-24 68.5-26.9 6.7 14.1 10.3 32 7.2 47.8zm21.8-83.1c-4.2-6-9.8-18.5-2.5-26.3 6.7-7.2 20.9-10.1 31.8-7.7 15.3 3.4 19.7 15.9 4.9 24.4-10.7 6.1-23.6 8.1-34.2 9.6z"],nutritionix:[400,512,[],"f3d6","M88 8.1S221.4-.1 209 112.5c0 0 19.1-74.9 103-40.6 0 0-17.7 74-88 56 0 0 14.6-54.6 66.1-56.6 0 0-39.9-10.3-82.1 48.8 0 0-19.8-94.5-93.6-99.7 0 0 75.2 19.4 77.6 107.5 0 .1-106.4 7-104-119.8zm312 315.6c0 48.5-9.7 95.3-32 132.3-42.2 30.9-105 48-168 48-62.9 0-125.8-17.1-168-48C9.7 419 0 372.2 0 323.7 0 275.3 17.7 229 40 192c42.2-30.9 97.1-48.6 160-48.6 63 0 117.8 17.6 160 48.6 22.3 37 40 83.3 40 131.7zM120 428c0-15.5-12.5-28-28-28s-28 12.5-28 28 12.5 28 28 28 28-12.5 28-28zm0-66.2c0-15.5-12.5-28-28-28s-28 12.5-28 28 12.5 28 28 28 28-12.5 28-28zm0-66.2c0-15.5-12.5-28-28-28s-28 12.5-28 28 12.5 28 28 28 28-12.5 28-28zM192 428c0-15.5-12.5-28-28-28s-28 12.5-28 28 12.5 28 28 28 28-12.5 28-28zm0-66.2c0-15.5-12.5-28-28-28s-28 12.5-28 28 12.5 28 28 28 28-12.5 28-28zm0-66.2c0-15.5-12.5-28-28-28s-28 12.5-28 28 12.5 28 28 28 28-12.5 28-28zM264 428c0-15.5-12.5-28-28-28s-28 12.5-28 28 12.5 28 28 28 28-12.5 28-28zm0-66.2c0-15.5-12.5-28-28-28s-28 12.5-28 28 12.5 28 28 28 28-12.5 28-28zm0-66.2c0-15.5-12.5-28-28-28s-28 12.5-28 28 12.5 28 28 28 28-12.5 28-28zM336 428c0-15.5-12.5-28-28-28s-28 12.5-28 28 12.5 28 28 28 28-12.5 28-28zm0-66.2c0-15.5-12.5-28-28-28s-28 12.5-28 28 12.5 28 28 28 28-12.5 28-28zm0-66.2c0-15.5-12.5-28-28-28s-28 12.5-28 28 12.5 28 28 28 28-12.5 28-28zm24-39.6c-4.8-22.3-7.4-36.9-16-56-38.8-19.9-90.5-32-144-32S94.8 180.1 56 200c-8.8 19.5-11.2 33.9-16 56 42.2-7.9 98.7-14.8 160-14.8s117.8 6.9 160 14.8z"],odnoklassniki:[320,512,[],"f263","M275.1 334c-27.4 17.4-65.1 24.3-90 26.9l20.9 20.6 76.3 76.3c27.9 28.6-17.5 73.3-45.7 45.7-19.1-19.4-47.1-47.4-76.3-76.6L84 503.4c-28.2 27.5-73.6-17.6-45.4-45.7 19.4-19.4 47.1-47.4 76.3-76.3l20.6-20.6c-24.6-2.6-62.9-9.1-90.6-26.9-32.6-21-46.9-33.3-34.3-59 7.4-14.6 27.7-26.9 54.6-5.7 0 0 36.3 28.9 94.9 28.9s94.9-28.9 94.9-28.9c26.9-21.1 47.1-8.9 54.6 5.7 12.4 25.7-1.9 38-34.5 59.1zM30.3 129.7C30.3 58 88.6 0 160 0s129.7 58 129.7 129.7c0 71.4-58.3 129.4-129.7 129.4s-129.7-58-129.7-129.4zm66 0c0 35.1 28.6 63.7 63.7 63.7s63.7-28.6 63.7-63.7c0-35.4-28.6-64-63.7-64s-63.7 28.6-63.7 64z"],"odnoklassniki-square":[448,512,[],"f264","M184.2 177.1c0-22.1 17.9-40 39.8-40s39.8 17.9 39.8 40c0 22-17.9 39.8-39.8 39.8s-39.8-17.9-39.8-39.8zM448 80v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V80c0-26.5 21.5-48 48-48h352c26.5 0 48 21.5 48 48zm-305.1 97.1c0 44.6 36.4 80.9 81.1 80.9s81.1-36.2 81.1-80.9c0-44.8-36.4-81.1-81.1-81.1s-81.1 36.2-81.1 81.1zm174.5 90.7c-4.6-9.1-17.3-16.8-34.1-3.6 0 0-22.7 18-59.3 18s-59.3-18-59.3-18c-16.8-13.2-29.5-5.5-34.1 3.6-7.9 16.1 1.1 23.7 21.4 37 17.3 11.1 41.2 15.2 56.6 16.8l-12.9 12.9c-18.2 18-35.5 35.5-47.7 47.7-17.6 17.6 10.7 45.8 28.4 28.6l47.7-47.9c18.2 18.2 35.7 35.7 47.7 47.9 17.6 17.2 46-10.7 28.6-28.6l-47.7-47.7-13-12.9c15.5-1.6 39.1-5.9 56.2-16.8 20.4-13.3 29.3-21 21.5-37z"],opencart:[640,512,[],"f23d","M423.3 440.7c0 25.3-20.3 45.6-45.6 45.6s-45.8-20.3-45.8-45.6 20.6-45.8 45.8-45.8c25.4 0 45.6 20.5 45.6 45.8zm-253.9-45.8c-25.3 0-45.6 20.6-45.6 45.8s20.3 45.6 45.6 45.6 45.8-20.3 45.8-45.6-20.5-45.8-45.8-45.8zm291.7-270C158.9 124.9 81.9 112.1 0 25.7c34.4 51.7 53.3 148.9 373.1 144.2 333.3-5 130 86.1 70.8 188.9 186.7-166.7 319.4-233.9 17.2-233.9z"],openid:[448,512,[],"f19b","M271.5 432l-68 32C88.5 453.7 0 392.5 0 318.2c0-71.5 82.5-131 191.7-144.3v43c-71.5 12.5-124 53-124 101.3 0 51 58.5 93.3 135.7 103v-340l68-33.2v384zM448 291l-131.3-28.5 36.8-20.7c-19.5-11.5-43.5-20-70-24.8v-43c46.2 5.5 87.7 19.5 120.3 39.3l35-19.8L448 291z"],opera:[496,512,[],"f26a","M313.9 32.7c-170.2 0-252.6 223.8-147.5 355.1 36.5 45.4 88.6 75.6 147.5 75.6 36.3 0 70.3-11.1 99.4-30.4-43.8 39.2-101.9 63-165.3 63-3.9 0-8 0-11.9-.3C104.6 489.6 0 381.1 0 248 0 111 111 0 248 0h.8c63.1.3 120.7 24.1 164.4 63.1-29-19.4-63.1-30.4-99.3-30.4zm101.8 397.7c-40.9 24.7-90.7 23.6-132-5.8 56.2-20.5 97.7-91.6 97.7-176.6 0-84.7-41.2-155.8-97.4-176.6 41.8-29.2 91.2-30.3 132.9-5 105.9 98.7 105.5 265.7-1.2 364z"],"optin-monster":[576,512,[],"f23c","M550.671 450.303c0 11.62-15.673 19.457-32.158 14.863-12.16-3.243-31.346-17.565-36.211-27.294-5.674-11.62 4.054-32.698 18.916-30.806 15.674 1.621 49.453 25.401 49.453 43.237zM372.86 75.223c-3.783-72.151-100.796-79.718-125.928-23.51 44.588-24.321 90.257-15.673 125.928 23.51zM74.795 407.066c-15.673 1.621-49.452 25.401-49.452 43.237 0 11.62 15.673 19.457 32.157 14.863 12.16-3.243 31.076-17.565 35.94-27.294 5.946-11.62-3.782-32.698-18.645-30.806zm497.765 14.322c1.081 3.513 1.892 7.026 1.892 10.809.81 31.616-44.317 64.045-73.503 65.125-17.295.81-34.59-8.377-42.696-23.51-113.497 4.053-226.994 4.864-340.22 0-8.377 15.133-25.672 24.05-42.967 23.51-28.915-1.081-74.043-33.509-73.503-65.125.27-3.783.811-7.296 1.892-10.809-5.566-9.463-4.845-15.282 5.405-11.62 3.243-5.134 7.026-9.458 11.08-13.782-2.57-10.917 1.27-14.094 11.079-9.188 4.594-3.243 9.998-6.485 15.944-9.188 0-15.757 11.839-11.131 17.295-5.675 12.467-1.78 20.129.709 26.753 5.675v-19.726c-12.987 0-40.641-11.375-45.94-36.212-4.974-20.725 2.607-38.075 25.132-47.56.81-5.945 8.107-14.052 14.862-15.944 7.567-1.892 12.431 4.594 14.052 10.269 7.425 0 17.757 1.465 21.078 8.107 5.405-.541 11.079-1.352 16.484-1.892-2.432-1.892-5.134-3.513-8.107-4.594-5.134-8.917-13.782-11.079-24.591-11.62 0-.81 0-1.621.27-2.702-19.727-.541-44.048-5.675-54.857-17.835-21.321-23.638-15.935-83.577 12.16-103.498 8.377-5.675 21.618-.811 22.699 9.728 2.425 20.598.399 26.833 26.212 25.942 8.107-7.836 16.755-14.592 26.483-19.997-14.862-1.352-28.914 1.621-43.778 3.783 12.752-12.48 23.953-25.442 56.748-42.427 23.511-11.89 49.993-20.808 76.205-23.239-18.646-7.837-39.993-11.891-59.721-16.484 76.475-16.214 174.569-22.159 244.289 37.562 18.105 15.403 32.427 36.211 42.696 59.992 39.799 4.853 36.47-5.581 38.643-25.132 1.081-10.269 14.322-15.403 22.699-9.458 14.862 10.539 22.159 30.806 24.59 48.101 2.162 17.835.27 41.345-12.43 55.127-10.809 12.16-34.32 17.565-53.776 18.105v2.703c-11.08.27-20.268 2.432-25.673 11.62-2.972 1.081-5.674 2.703-8.377 4.594 5.675.54 11.35 1.351 16.755 1.891 1.869-5.619 12.535-8.377 21.077-8.377 1.621-5.405 6.756-11.89 14.052-10.269s14.052 9.998 14.863 15.944c10.809 4.324 22.159 12.16 25.131 25.672 1.892 8.107 1.621 15.133.27 21.888-5.726 25.262-33.361 36.212-45.939 36.212 0 6.756 0 13.241-.27 19.726 8.01-6.006 16.367-7.158 26.752-5.675 5.919-5.919 17.565-9.41 17.565 5.675 5.675 2.703 11.349 5.945 15.944 9.188 10.1-5.051 13.669-.539 10.809 9.188 4.053 4.323 8.107 8.917 11.079 13.782 10.136-3.62 11.021 2.078 5.409 11.62zm-73.773-254.016c17.295 6.756 26.212 22.159 30.265 35.67 1.081-10.539-2.702-39.453-13.782-51.073-7.296-7.296-14.052-5.134-14.052.81.001 6.216-1.35 11.62-2.431 14.593zm-18.646 12.43c12.971 15.673 17.024 41.615 12.7 62.963 10.809-2.162 20.537-6.215 26.212-12.16 1.892-2.162 3.783-4.864 4.864-7.566-1.081-21.348-10.269-42.697-29.725-48.912-3.242 3.243-9.187 4.864-14.051 5.675zm-21.889.811c7.567 20.537 12.431 42.696 14.322 64.585 3.513 0 7.567-.27 11.62-.811 5.945-24.321-.27-51.614-14.052-63.504-3.783 0-8.107 0-11.89-.27zM77.768 167.372c-1.081-2.973-2.432-8.377-2.432-14.593 0-5.945-7.026-8.107-14.052-.81-11.35 11.62-14.863 40.534-13.782 51.073 4.053-13.512 12.971-28.915 30.266-35.67zm5.675 75.394c-4.324-21.348-.27-47.291 12.701-62.963-4.865-.811-10.809-2.432-14.052-5.675-19.457 6.215-28.375 27.563-29.726 48.912 1.351 2.702 2.972 5.404 4.864 7.566 5.675 6.215 15.403 9.998 26.213 12.16zm41.345-61.073c-5.134 1.081-9.998 2.973-14.862 4.865l-12.16 5.134v-.27c-7.296 14.052-9.999 34.319-5.405 52.965 4.594.541 8.647.811 12.7.811 2.432-22.159 9.188-43.778 19.727-63.505zm88.095-23.239c0 42.155 34.319 76.205 76.205 76.205s76.205-34.05 76.205-76.205c0-41.886-34.319-75.935-76.205-75.935s-76.205 34.049-76.205 75.935zm152.41 97.283c9.969 50.608 3.299 64.692 16.484 58.099 15.944-8.107 22.699-39.183 22.97-57.019-12.971-.81-26.213-.81-39.454-1.08zm-71.611-.541v-.27c-.27 5.134.27 38.103 4.324 41.075 11.079 5.405 39.453 4.594 51.073 1.081 5.405-1.621 2.432-37.022 1.621-41.886-18.916-.27-38.102-.27-57.018 0zm-14.053 0v-.27c-19.456.27-38.642.27-57.829.811-1.892 9.187-4.594 48.911 1.892 51.614 12.971 5.675 41.616 5.134 54.586 1.621 4.595-2.432 2.433-45.399 1.351-53.776zm-85.662 57.56c5.405 2.432 8.647 2.432 9.728-4.324 1.892-8.647 2.432-36.752 4.865-52.155-12.16.27-24.591.811-36.752 1.621-5.405 19.727.27 45.129 22.159 54.858zm-65.666-11.08c43.778 47.02 92.689 85.663 155.923 106.47 67.558-19.186 115.659-59.991 163.219-107.011-11.095-4.315-7.715-10.363-7.296-11.62-8.918-.81-17.835-1.892-26.483-2.702-9.458 32.968-35.94 52.965-46.75 31.616-2.702-5.134-3.513-11.62-4.594-16.754-3.783 8.377-13.242 8.107-24.591 8.918-13.241 1.081-31.617 1.351-44.048-2.972-2.972 12.971-11.079 12.971-26.752 14.322-14.052 1.352-48.642 4.054-54.857-10.809-1.081 28.644-35.13 9.998-45.129-7.026-3.243-5.675-5.405-11.35-7.026-17.565-7.837.81-15.673 1.621-23.511 2.702 2.443 3.663 1.549 9.052-8.105 12.431zM115.6 453.545c-5.674-23.239-18.646-49.722-33.508-54.046-22.429-6.756-68.909 23.51-66.207 54.586 12.701 19.457 39.994 35.67 59.181 36.481 17.835.81 35.94-11.08 39.724-28.914.539-2.432.81-5.134.81-8.107zm7.296-5.944c33.509-19.457 69.179-35.671 105.931-47.02-38.643-20.537-68.098-47.831-97.283-77.016-2.162 1.352-5.134 2.432-7.836 3.513-1.637 4.91 8.718 5.33 5.405 12.431-2.162 4.054-8.648 7.567-15.133 9.188-2.161 2.702-5.134 4.864-7.836 6.485h-.27c-.27 13.511-.27 27.024.27 40.535 8.939 15.964 15.426 33.314 16.752 51.884zm320.764 12.7c-36.752-21.348-74.044-41.345-115.659-52.965-13.782 6.215-27.833 11.349-42.155 15.403-2.162.811-2.162.811-4.324 0-11.89-3.783-23.239-8.107-34.859-13.241-40.265 11.62-77.286 29.185-112.416 50.803h-.27v.27c.27 0 .27 0 .27-.27 103.227 4.054 206.455 3.513 309.413 0zm27.023-64.045l-.27.27c.541-13.782.811-27.563.811-41.345-2.973-1.621-5.675-4.054-8.107-6.756-6.485-1.351-12.971-5.134-15.133-8.918-1.892-4.053 1.351-7.566 5.945-10.269-.27-.541-.541-1.621-.541-2.432-2.972-.811-5.405-1.892-7.567-3.243-31.616 29.455-65.396 56.749-103.498 76.746 38.914 11.62 75.935 28.104 111.875 47.561 1.05-14.692 7.231-35.749 16.485-51.614zm23.24 3.244c-14.593 4.323-27.834 30.806-33.509 54.046 0 23.826 21.278 37.897 40.534 37.022 19.186-.811 46.48-17.024 59.181-36.481 2.973-31.077-43.507-61.344-66.206-54.587zM290.709 134.133c.045 0 .089.003.134.003.046 0 .09-.003.136-.003h-.27zm0 96.743c28.645 0 51.884-21.618 51.884-48.371 0-36.092-40.507-58.079-72.151-44.318 9.458 2.972 16.484 11.62 16.484 21.618 0 23.257-33.291 31.955-46.48 11.35-7.297 34.067 19.368 59.721 50.263 59.721zM68.039 474.083c.54 6.486 12.16 12.701 21.618 9.458 6.756-2.703 14.593-10.539 17.295-16.214 2.973-7.026-1.081-19.997-9.728-18.375-8.917 1.621-29.725 16.754-29.185 25.131zm410.75-25.131c-8.377-1.621-12.431 11.349-9.458 18.375 2.432 5.675 10.269 13.511 17.295 16.214 9.187 3.243 21.078-2.972 21.348-9.458.811-8.377-20.267-23.51-29.185-25.131z"],osi:[495,512,[],"f41a","M0 259.2C2.3 123.4 97.4 26.8 213.8 11.1c138.8-18.6 255.6 75.8 278 201.1 21.3 118.8-44 230-151.6 274-9.3 3.8-14.4 1.7-18-7.7-17.8-46.3-35.6-92.7-53.4-139-3.1-8.1-1-13.2 7-16.8 24.2-11 39.3-29.4 43.3-55.8 6.4-42.4-24.5-78.7-64.5-82.2-39-3.4-71.8 23.7-77.5 59.7-5.2 33 11.1 63.7 41.9 77.7 9.6 4.4 11.5 8.6 7.8 18.4-17.9 46.6-35.8 93.2-53.7 139.9-2.6 6.9-8.3 9.3-15.5 6.5-52.6-20.3-101.4-61-130.8-119C1.9 318.7 1.6 280.2 0 259.2zm20.9-1.9c.4 6.6.6 14.3 1.3 22.1 6.3 71.9 49.6 143.5 131 183.1 3.2 1.5 4.4.8 5.6-2.3 14.9-39.1 29.9-78.2 45-117.3 1.3-3.3.6-4.8-2.4-6.7-31.6-19.9-47.3-48.5-45.6-86 1-21.6 9.3-40.5 23.8-56.3 30-32.7 77-39.8 115.5-17.6 31.9 18.4 49.5 53.8 45.2 90.4-3.6 30.6-19.3 53.9-45.7 69.8-2.7 1.6-3.5 2.9-2.3 6 15.2 39.2 30.2 78.4 45.2 117.7 1.2 3.1 2.4 3.8 5.6 2.3 35.5-16.6 65.2-40.3 88.1-72 34.8-48.2 49.1-101.9 42.3-161C459.8 112 354.1 14.7 218 31.5 111.9 44.5 22.7 134 20.9 257.3z"],page4:[496,512,[],"f3d7","M248 504C111 504 0 393 0 256S111 8 248 8c20.9 0 41.3 2.6 60.7 7.5L42.3 392H248v112zm0-143.6V146.8L98.6 360.4H248zm96 31.6v92.7c45.7-19.2 84.5-51.7 111.4-92.7H344zm57.4-138.2l-21.2 8.4 21.2 8.3v-16.7zm-20.3 54.5c-6.7 0-8 6.3-8 12.9v7.7h16.2v-10c0-5.9-2.3-10.6-8.2-10.6zM496 256c0 37.3-8.2 72.7-23 104.4H344V27.3C433.3 64.8 496 153.1 496 256zM360.4 143.6h68.2V96h-13.9v32.6h-13.9V99h-13.9v29.6h-12.7V96h-13.9v47.6zm68.1 185.3H402v-11c0-15.4-5.6-25.2-20.9-25.2-15.4 0-20.7 10.6-20.7 25.9v25.3h68.2v-15zm0-103l-68.2 29.7V268l68.2 29.5v-16.6l-14.4-5.7v-26.5l14.4-5.9v-16.9zm-4.8-68.5h-35.6V184H402v-12.2h11c8.6 15.8 1.3 35.3-18.6 35.3-22.5 0-28.3-25.3-15.5-37.7l-11.6-10.6c-16.2 17.5-12.2 63.9 27.1 63.9 34 0 44.7-35.9 29.3-65.3z"],pagelines:[384,512,[],"f18c","M384 312.7c-55.1 136.7-187.1 54-187.1 54-40.5 81.8-107.4 134.4-184.6 134.7-16.1 0-16.6-24.4 0-24.4 64.4-.3 120.5-42.7 157.2-110.1-41.1 15.9-118.6 27.9-161.6-82.2 109-44.9 159.1 11.2 178.3 45.5 9.9-24.4 17-50.9 21.6-79.7 0 0-139.7 21.9-149.5-98.1 119.1-47.9 152.6 76.7 152.6 76.7 1.6-16.7 3.3-52.6 3.3-53.4 0 0-106.3-73.7-38.1-165.2 124.6 43 61.4 162.4 61.4 162.4.5 1.6.5 23.8 0 33.4 0 0 45.2-89 136.4-57.5-4.2 134-141.9 106.4-141.9 106.4-4.4 27.4-11.2 53.4-20 77.5 0 0 83-91.8 172-20z"],palfed:[560,512,[],"f3d8","M376.9 194.1c0-47.4-55.2-44.2-95.4-29.8-1.3 39.4-2.5 80.7-3 119.8.7 2.8 2.6 6.2 15.1 6.2 36.7-.1 83.3-42.9 83.3-96.2zm-194.5 72.2c.2 0 6.5-2.7 11.2-2.7 26.6 0 20.7 44.1-14.4 44.1-21.5 0-37.1-18.1-37.1-43 0-42 42.9-95.6 100.7-126.5 1-12.4 3-22 10.5-28.2 11.2-9 26.6-3.5 29.5 11.1 72.2-22.2 135.2 1 135.2 72 0 77.9-79.3 152.6-140.1 138.2-.1 39.4.9 74.4 2.7 100v.2c.2 3.4.6 12.5-5.3 19.1-9.6 10.6-33.4 10-36.4-22.3-4.1-44.4.2-206.1 1.4-242.5-21.5 15-58.5 50.3-58.5 75.9.1 2.4.3 3.9.6 4.6zM0 181.3s-.1 37.4 38.4 37.4h30l22.4 217.2s0 44.3 44.7 44.3h288.9s44.7-.4 44.7-44.3l22.4-217.2h30s38.4 1.2 38.4-37.4c0 0 .1-37.4-38.4-37.4h-30.1c-7.3-25.6-30.2-74.3-119.4-74.3h-28V50.5s-2.7-18.4-21.1-18.4h-85.8s-21.1 0-21.1 18.4v19.1h-28.1s-105 4.2-120.5 74.3h-29S0 142.7 0 181.3z"],patreon:[512,512,[],"f3d9","M489.6 200.2c0 92.5-75.2 167.7-167.7 167.7-92.7 0-168.2-75.2-168.2-167.7 0-92.7 75.5-168.2 168.2-168.2 92.5 0 167.7 75.4 167.7 168.2zM22.4 480h82.1V32H22.4v448z"],paypal:[384,512,[],"f1ed","M111.4 295.9c-3.5 19.2-17.4 108.7-21.5 134-.3 1.8-1 2.5-3 2.5H12.3c-7.6 0-13.1-6.6-12.1-13.9L58.8 46.6c1.5-9.6 10.1-16.9 20-16.9 152.3 0 165.1-3.7 204 11.4 60.1 23.3 65.6 79.5 44 140.3-21.5 62.6-72.5 89.5-140.1 90.3-43.4.7-69.5-7-75.3 24.2zM357.1 152c-1.8-1.3-2.5-1.8-3 1.3-2 11.4-5.1 22.5-8.8 33.6-39.9 113.8-150.5 103.9-204.5 103.9-6.1 0-10.1 3.3-10.9 9.4-22.6 140.4-27.1 169.7-27.1 169.7-1 7.1 3.5 12.9 10.6 12.9h63.5c8.6 0 15.7-6.3 17.4-14.9.7-5.4-1.1 6.1 14.4-91.3 4.6-22 14.3-19.7 29.3-19.7 71 0 126.4-28.8 142.9-112.3 6.5-34.8 4.6-71.4-23.8-92.6z"],periscope:[448,512,[],"f3da","M370 63.6C331.4 22.6 280.5 0 226.6 0 111.9 0 18.5 96.2 18.5 214.4c0 75.1 57.8 159.8 82.7 192.7C137.8 455.5 192.6 512 226.6 512c41.6 0 112.9-94.2 120.9-105 24.6-33.1 82-118.3 82-192.6 0-56.5-21.1-110.1-59.5-150.8zM226.6 493.9c-42.5 0-190-167.3-190-279.4 0-107.4 83.9-196.3 190-196.3 100.8 0 184.7 89 184.7 196.3.1 112.1-147.4 279.4-184.7 279.4zM338 206.8c0 59.1-51.1 109.7-110.8 109.7-100.6 0-150.7-108.2-92.9-181.8v.4c0 24.5 20.1 44.4 44.8 44.4 24.7 0 44.8-19.9 44.8-44.4 0-18.2-11.1-33.8-26.9-40.7 76.6-19.2 141 39.3 141 112.4z"],phabricator:[496,512,[],"f3db","M323 262.1l-.1-13s21.7-19.8 21.1-21.2l-9.5-20c-.6-1.4-29.5-.5-29.5-.5l-9.4-9.3s.2-28.5-1.2-29.1l-20.1-9.2c-1.4-.6-20.7 21-20.7 21l-13.1-.2s-20.5-21.4-21.9-20.8l-20 8.3c-1.4.5.2 28.9.2 28.9l-9.1 9.1s-29.2-.9-29.7.4l-8.1 19.8c-.6 1.4 21 21 21 21l.1 12.9s-21.7 19.8-21.1 21.2l9.5 20c.6 1.4 29.5.5 29.5.5l9.4 9.3s-.2 31.8 1.2 32.3l20.1 8.3c1.4.6 20.7-23.5 20.7-23.5l13.1.2s20.5 23.8 21.8 23.3l20-7.5c1.4-.6-.2-32.1-.2-32.1l9.1-9.1s29.2.9 29.7-.5l8.1-19.8c.7-1.1-20.9-20.7-20.9-20.7zm-44.9-8.7c.7 17.1-12.8 31.6-30.1 32.4-17.3.8-32.1-12.5-32.8-29.6-.7-17.1 12.8-31.6 30.1-32.3 17.3-.8 32.1 12.5 32.8 29.5zm201.2-37.9l-97-97-.1.1c-75.1-73.3-195.4-72.8-269.8 1.6-50.9 51-27.8 27.9-95.7 95.3-22.3 22.3-22.3 58.7 0 81 69.9 69.4 46.4 46 97.4 97l.1-.1c75.1 73.3 195.4 72.9 269.8-1.6 51-50.9 27.9-27.9 95.3-95.3 22.3-22.3 22.3-58.7 0-81zM140.4 363.8c-59.6-59.5-59.6-156 0-215.5 59.5-59.6 156-59.5 215.6 0 59.5 59.5 59.6 156 0 215.6-59.6 59.5-156 59.4-215.6-.1z"],"phoenix-framework":[640,512,[],"f3dc","M213.2 339.2c3.8-.1 22.9-1.4 25.6-2.2-2.4-2.7-43.6-1-68.1-49.7-4.3-8.7-7.5-17.6-6.4-27.6 2.9-25.5 32.9-30 52.1-18.5 36 21.6 63.4 91.5 113.8 97.6 37.1 4.5 84.7-17 108.3-45.4-.6-.1-.8-.2-1-.1-.4.1-.8.2-1.1.3-33.4 12.1-94.4 9.7-134.8-14.8-37.7-22.8-53.2-58.8-51.9-74.7 1.8-21.4 22.9-23.2 36-19.6 14.4 4 24.4 17.6 39 27.4 15.6 10.4 33 13.7 51.3 10.3 14.9-2.7 34.4-12.3 36.5-14.5-1.1-.1-1.8-.1-2.5-.2-6.2-.6-12.4-.8-18.6-1.7C280.1 189.3 262.5 42 138.7 32.5c-44.4-3.4-99.6 8.1-136.5 35-.8.6-1.5 1.2-2.2 1.8.1.2.1.3.2.5.8-.1 1.6-.1 2.4-.2 6.3-1 12.5-.8 18.8.3 23.9 4.3 47.8 23.1 56 76.6 5.3 34.3-.7 50.9 8 86.2 18.9 77.2 91 107.8 127.8 106.5zM75.4 59.5c-.9-1-.9-1.2-1.3-2 12.1-2.6 24.3-4.1 36.7-4.8-1.1 14.7-22.3 21.4-35.4 6.8zm197.2 350.9c-42.9 1.2-92.1-26.8-123.7-61.5-4.6-5-16.8-20.3-18.6-23.4l.4-.4c6.6 4.1 25.7 18.7 54.9 27.1 24.2 7 48.1 6.3 71.7-3.3 22.7-9.3 41-.5 43.1 2.9-18.5 3.8-20.1 4.4-24.1 7.9-5.1 4.4-4.6 11.7 7 17.2 26.2 12.4 63-2.8 97.3 25.4 2.4 2 8.1 7.8 10.1 10.7-.1.2-.3.3-.4.5-4.8-1.5-16.5-7.5-40.2-9.3-24.7-2-46.3 5.4-77.5 6.2zm175-252.2c16.4-5.2 41.4-13.4 66.6-3.3 16.1 6.5 26.2 18.7 32.1 34.7 3.5 9.4 5.1 19.7 5.1 28.8-.2 0-.4 0-.6.1-.2-.4-.4-.9-.5-1.3-5-22-29.9-43.8-67.7-29.9-50.2 18.6-130.5 9.7-177.2-48-.7-.9-2.4-1.7-1.3-3.2.1-.2 2.1.6 3 1.3 18.1 13.5 38.3 21.9 60.4 26.2 30.6 5.9 54.7 2.6 80.1-5.4zm102.8 117.6c-32.4.2-33.8 50.2-103.7 64.4-18.3 3.7-38.7 4.6-45 4.2v-.4c2.8-1.5 14.7-2.6 29.7-16.6 7.9-7.3 15.3-15.2 22.8-22.9 19.6-20.3 41.5-42.3 82-39 23.1 1.8 29.3 8.2 36.2 12.7.3.2.4.5.7.9-.5 0-.7.1-.9 0-7-2.7-14.3-3.3-21.8-3.3zm-12.3-24.2c-.1.2-.1.4-.2.6-29-4.4-48.1-7.9-68.6 4-17 9.9-31.5 20.6-62.1 24.4-27.1 3.4-45.2 2.4-66.2-8-.3-.2-.6-.4-1-.6 0-.2.1-.3.1-.5 24.9 3.8 36.5 5.2 55.6-5.9 22.4-12.9 40.2-26.7 71.4-31 29.6-3.9 51.3 2.7 71 17zM269 91.9c-.6-.6-1.1-1.2-2.1-2.3 7.6 0 29.7-1.2 53.4 8.4 19.7 8 32.3 21.1 50.3 33 11.1 7.3 23.5 9.3 36.5 8.1 4.3-.4 8.5-1.2 12.8-1.7.4-.1.9 0 1.5.3-.6.4-1.2.9-1.8 1.2-8.1 4-16.7 6.3-25.6 7.2-26.1 2.6-50.4-3.7-73.5-15.4-19.4-10-36.5-23-51.5-38.8zm371.8 238.7c-3.5 3.1-22.7 11.6-42.8 5.3-12.3-3.9-19.5-14.9-31.6-24.1-10-7.6-20.9-7.9-28.2-8.4.6-.8.9-1.2 1.2-1.4 14.8-9.2 30.5-12.2 47.4-6.5 12.5 4.2 19.3 13.5 30.4 24.2 10.8 10.4 21 9.9 23.2 10.5.1-.1.2.1.4.4zM428 467.8c2.2 1.2 1.6 1.5 1.5 2-18.5-1.4-33.9-7.6-46.8-22.2-21.8-24.7-41.8-27.9-48.7-29.7.5-.2.8-.4 1.1-.4 13.1.1 26.2.7 39 3.9 25.3 6.4 35 25.4 41.6 35.4 3.2 4.7 7.4 8.3 12.3 11z"],"pied-piper":[640,512,[],"f2ae","M640 24.9c-80.8 53.6-89.4 92.5-96.4 104.4-6.7 12.2-11.7 60.3-23.3 83.6-11.7 23.6-54.2 42.2-66.1 50-11.7 7.8-28.3 38.1-41.9 64.2-108.1-4.4-167.4 38.8-259.2 93.6 29.4-9.7 43.3-16.7 43.3-16.7 94.2-36 139.3-68.3 281.1-49.2 1.1 0 1.9.6 2.8.8 3.9 2.2 5.3 6.9 3.1 10.8l-53.9 95.8c-2.5 4.7-7.8 7.2-13.1 6.1-126.8-23.8-226.9 17.3-318.9 18.6C24.1 488 0 453.4 0 451.8c0-1.1.6-1.7 1.7-1.7 0 0 38.3 0 103.1-15.3C178.4 294.5 244 245.4 315.4 245.4c0 0 71.7 0 90.6 61.9 22.8-39.7 28.3-49.2 28.3-49.2 5.3-9.4 35-77.2 86.4-141.4 51.5-64 90.4-79.9 119.3-91.8z"],"pied-piper-alt":[576,512,[],"f1a8","M242 187c6.3-11.8 13.2-17 25.9-21.8 27.3-10.3 40.2-30.5 58.9-51.1 11.9 8.4 12 24.6 31.6 23v21.8l6.3.3c37.4-14.4 74.7-30.2 106.6-54.6 48.3-36.8 52.9-50 81.3-100l2-2.6c-.6 14.1-6.3 27.3-12.4 39.9-30.5 63.8-78.7 100.3-146.8 116.7-12.4 2.9-26.4 3.2-37.6 8.9 1.4 9.8 13.2 18.1 13.2 23 0 3.4-5.5 7.2-7.5 8.6-11.2-12.9-16.1-19.3-22.7-22.1-7.6-3.5-63.9-6.4-98.8 10zm137.9 256.9c-19 0-64.1 9.5-79.9 19.8l6.9 45.1c35.7 6.1 70.1 3.6 106-9.8-4.8-10-23.5-55.1-33-55.1zM244 246c-3.2-2-6.3-2.9-10.1-2.9-6.6 0-12.6 3.2-19.3 3.7l1.7 4.9L244 246zm-12.6 31.8l24.1 61.2 21-13.8-31.3-50.9-13.8 3.5zM555.5 0l-.6 1.1-.3.9.6-.6.3-1.4zm-59.2 382.1c-33.9-56.9-75.3-118.4-150-115.5l-.3-6c-1.1-13.5 32.8 3.2 35.1-31l-14.4 7.2c-19.8-45.7-8.6-54.3-65.5-54.3-14.7 0-26.7 1.7-41.4 4.6 2.9 18.6 2.2 36.7-10.9 50.3l19.5 5.5c-1.7 3.2-2.9 6.3-2.9 9.8 0 21 42.8 2.9 42.8 33.6 0 18.4-36.8 60.1-54.9 60.1-8 0-53.7-50-53.4-60.1l.3-4.6 52.3-11.5c13-2.6 12.3-22.7-2.9-22.7-3.7 0-43.1 9.2-49.4 10.6-2-5.2-7.5-14.1-13.8-14.1-3.2 0-6.3 3.2-9.5 4-9.2 2.6-31 2.9-21.5 20.1L15.9 298.5c-5.5 1.1-8.9 6.3-8.9 11.8 0 6 5.5 10.9 11.5 10.9 8 0 131.3-28.4 147.4-32.2 2.6 3.2 4.6 6.3 7.8 8.6 20.1 14.4 59.8 85.9 76.4 85.9 24.1 0 58-22.4 71.3-41.9 3.2-4.3 6.9-7.5 12.4-6.9.6 13.8-31.6 34.2-33 43.7-1.4 10.2-1 35.2-.3 41.1 26.7 8.1 52-3.6 77.9-2.9 4.3-21 10.6-41.9 9.8-63.5l-.3-9.5c-1.4-34.2-10.9-38.5-34.8-58.6-1.1-1.1-2.6-2.6-3.7-4 2.2-1.4 1.1-1 4.6-1.7 88.5 0 56.3 183.6 111.5 229.9 33.1-15 72.5-27.9 103.5-47.2-29-25.6-52.6-45.7-72.7-79.9zm-196.2 46v27.3l11.8-3.4-2.9-23.8h-8.9zm76.1 2.9c0-1.4-.6-3.2-.9-4.6-26.8 0-36.9 3.8-59.5 6.3l2 12.4c9-1.5 58.4-6.6 58.4-14.1z"],"pied-piper-pp":[448,512,[],"f1a7","M205.3 174.6c0 21.1-14.2 38.1-31.7 38.1-7.1 0-12.8-1.2-17.2-3.7v-68c4.4-2.7 10.1-4.2 17.2-4.2 17.5 0 31.7 16.9 31.7 37.8zm52.6 67c-7.1 0-12.8 1.5-17.2 4.2v68c4.4 2.5 10.1 3.7 17.2 3.7 17.4 0 31.7-16.9 31.7-37.8 0-21.1-14.3-38.1-31.7-38.1zM448 80v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V80c0-26.5 21.5-48 48-48h352c26.5 0 48 21.5 48 48zM185 255.1c41 0 74.2-35.6 74.2-79.6 0-44-33.2-79.6-74.2-79.6-12 0-24.1 3.2-34.6 8.8h-45.7V311l51.8-10.1v-50.6c8.6 3.1 18.1 4.8 28.5 4.8zm158.4 25.3c0-44-33.2-79.6-73.9-79.6-3.2 0-6.4.2-9.6.7-3.7 12.5-10.1 23.8-19.2 33.4-13.8 15-32.2 23.8-51.8 24.8V416l51.8-10.1v-50.6c8.6 3.2 18.2 4.7 28.7 4.7 40.8 0 74-35.6 74-79.6z"],pinterest:[496,512,[],"f0d2","M496 256c0 137-111 248-248 248-25.6 0-50.2-3.9-73.4-11.1 10.1-16.5 25.2-43.5 30.8-65 3-11.6 15.4-59 15.4-59 8.1 15.4 31.7 28.5 56.8 28.5 74.8 0 128.7-68.8 128.7-154.3 0-81.9-66.9-143.2-152.9-143.2-107 0-163.9 71.8-163.9 150.1 0 36.4 19.4 81.7 50.3 96.1 4.7 2.2 7.2 1.2 8.3-3.3.8-3.4 5-20.3 6.9-28.1.6-2.5.3-4.7-1.7-7.1-10.1-12.5-18.3-35.3-18.3-56.6 0-54.7 41.4-107.6 112-107.6 60.9 0 103.6 41.5 103.6 100.9 0 67.1-33.9 113.6-78 113.6-24.3 0-42.6-20.1-36.7-44.8 7-29.5 20.5-61.3 20.5-82.6 0-19-10.2-34.9-31.4-34.9-24.9 0-44.9 25.7-44.9 60.2 0 22 7.4 36.8 7.4 36.8s-24.5 103.8-29 123.2c-5 21.4-3 51.6-.9 71.2C65.4 450.9 0 361.1 0 256 0 119 111 8 248 8s248 111 248 248z"],"pinterest-p":[384,512,[],"f231","M204 6.5C101.4 6.5 0 74.9 0 185.6 0 256 39.6 296 63.6 296c9.9 0 15.6-27.6 15.6-35.4 0-9.3-23.7-29.1-23.7-67.8 0-80.4 61.2-137.4 140.4-137.4 68.1 0 118.5 38.7 118.5 109.8 0 53.1-21.3 152.7-90.3 152.7-24.9 0-46.2-18-46.2-43.8 0-37.8 26.4-74.4 26.4-113.4 0-66.2-93.9-54.2-93.9 25.8 0 16.8 2.1 35.4 9.6 50.7-13.8 59.4-42 147.9-42 209.1 0 18.9 2.7 37.5 4.5 56.4 3.4 3.8 1.7 3.4 6.9 1.5 50.4-69 48.6-82.5 71.4-172.8 12.3 23.4 44.1 36 69.3 36 106.2 0 153.9-103.5 153.9-196.8C384 71.3 298.2 6.5 204 6.5z"],"pinterest-square":[448,512,[],"f0d3","M448 80v352c0 26.5-21.5 48-48 48H154.4c9.8-16.4 22.4-40 27.4-59.3 3-11.5 15.3-58.4 15.3-58.4 8 15.3 31.4 28.2 56.3 28.2 74.1 0 127.4-68.1 127.4-152.7 0-81.1-66.2-141.8-151.4-141.8-106 0-162.2 71.1-162.2 148.6 0 36 19.2 80.8 49.8 95.1 4.7 2.2 7.1 1.2 8.2-3.3.8-3.4 5-20.1 6.8-27.8.6-2.5.3-4.6-1.7-7-10.1-12.3-18.3-34.9-18.3-56 0-54.2 41-106.6 110.9-106.6 60.3 0 102.6 41.1 102.6 99.9 0 66.4-33.5 112.4-77.2 112.4-24.1 0-42.1-19.9-36.4-44.4 6.9-29.2 20.3-60.7 20.3-81.8 0-53-75.5-45.7-75.5 25 0 21.7 7.3 36.5 7.3 36.5-31.4 132.8-36.1 134.5-29.6 192.6l2.2.8H48c-26.5 0-48-21.5-48-48V80c0-26.5 21.5-48 48-48h352c26.5 0 48 21.5 48 48z"],playstation:[576,512,[],"f3df","M570.9 372.3c-11.3 14.2-38.8 24.3-38.8 24.3L327 470.2v-54.3l150.9-53.8c17.1-6.1 19.8-14.8 5.8-19.4-13.9-4.6-39.1-3.3-56.2 2.9L327 381.1v-56.4c23.2-7.8 47.1-13.6 75.7-16.8 40.9-4.5 90.9.6 130.2 15.5 44.2 14 49.2 34.7 38 48.9zm-224.4-92.5v-139c0-16.3-3-31.3-18.3-35.6-11.7-3.8-19 7.1-19 23.4v347.9l-93.8-29.8V32c39.9 7.4 98 24.9 129.2 35.4C424.1 94.7 451 128.7 451 205.2c0 74.5-46 102.8-104.5 74.6zM43.2 410.2c-45.4-12.8-53-39.5-32.3-54.8 19.1-14.2 51.7-24.9 51.7-24.9l134.5-47.8v54.5l-96.8 34.6c-17.1 6.1-19.7 14.8-5.8 19.4 13.9 4.6 39.1 3.3 56.2-2.9l46.4-16.9v48.8c-51.6 9.3-101.4 7.3-153.9-10z"],"product-hunt":[512,512,[],"f288","M326.3 218.8c0 20.5-16.7 37.2-37.2 37.2h-70.3v-74.4h70.3c20.5 0 37.2 16.7 37.2 37.2zM504 256c0 137-111 248-248 248S8 393 8 256 119 8 256 8s248 111 248 248zm-128.1-37.2c0-47.9-38.9-86.8-86.8-86.8H169.2v248h49.6v-74.4h70.3c47.9 0 86.8-38.9 86.8-86.8z"],pushed:[432,512,[],"f3e1","M407 111.9l-98.5-9 14-33.4c10.4-23.5-10.8-40.4-28.7-37L22.5 76.9c-15.1 2.7-26 18.3-21.4 36.6l105.1 348.3c6.5 21.3 36.7 24.2 47.7 7l35.3-80.8 235.2-231.3c16.4-16.8 4.3-42.9-17.4-44.8zM297.6 53.6c5.1-.7 7.5 2.5 5.2 7.4L286 100.9 108.6 84.6l189-31zM22.7 107.9c-3.1-5.1 1-10 6.1-9.1l248.7 22.7-96.9 230.7L22.7 107.9zM136 456.4c-2.6 4-7.9 3.1-9.4-1.2L43.5 179.7l127.7 197.6c-7 15-35.2 79.1-35.2 79.1zm272.8-314.5L210.1 337.3l89.7-213.7 106.4 9.7c4 1.1 5.7 5.3 2.6 8.6z"],python:[448,512,[],"f3e2","M167.8 36.4c-45.2 8-53.4 24.7-53.4 55.6v40.7h106.9v13.6h-147c-31.1 0-58.3 18.7-66.8 54.2-9.8 40.7-10.2 66.1 0 108.6 7.6 31.6 25.7 54.2 56.8 54.2H101v-48.8c0-35.3 30.5-66.4 66.8-66.4h106.8c29.7 0 53.4-24.5 53.4-54.3V91.9c0-29-24.4-50.7-53.4-55.6-35.8-5.9-74.7-5.6-106.8.1zm-6.7 28.4c11 0 20.1 9.2 20.1 20.4s-9 20.3-20.1 20.3c-11.1 0-20.1-9.1-20.1-20.3.1-11.3 9-20.4 20.1-20.4zm185.2 81.4v47.5c0 36.8-31.2 67.8-66.8 67.8H172.7c-29.2 0-53.4 25-53.4 54.3v101.8c0 29 25.2 46 53.4 54.3 33.8 9.9 66.3 11.7 106.8 0 26.9-7.8 53.4-23.5 53.4-54.3v-40.7H226.2v-13.6h160.2c31.1 0 42.6-21.7 53.4-54.2 11.2-33.5 10.7-65.7 0-108.6-7.7-30.9-22.3-54.2-53.4-54.2h-40.1zM286.2 404c11.1 0 20.1 9.1 20.1 20.3 0 11.3-9 20.4-20.1 20.4-11 0-20.1-9.2-20.1-20.4.1-11.3 9.1-20.3 20.1-20.3z"],qq:[448,512,[],"f1d6","M433.754 420.445c-11.526 1.393-44.86-52.741-44.86-52.741 0 31.345-16.136 72.247-51.051 101.786 16.842 5.192 54.843 19.167 45.803 34.421-7.316 12.343-125.51 7.881-159.632 4.037-34.122 3.844-152.316 8.306-159.632-4.037-9.045-15.25 28.918-29.214 45.783-34.415-34.92-29.539-51.059-70.445-51.059-101.792 0 0-33.334 54.134-44.859 52.741-5.37-.65-12.424-29.644 9.347-99.704 10.261-33.024 21.995-60.478 40.144-105.779C60.683 98.063 108.982.006 224 0c113.737.006 163.156 96.133 160.264 214.963 18.118 45.223 29.912 72.85 40.144 105.778 21.768 70.06 14.716 99.053 9.346 99.704z"],quora:[448,512,[],"f2c4","M440.5 386.7h-29.3c-1.5 13.5-10.5 30.8-33 30.8-20.5 0-35.3-14.2-49.5-35.8 44.2-34.2 74.7-87.5 74.7-153C403.5 111.2 306.8 32 205 32 105.3 32 7.3 111.7 7.3 228.7c0 134.1 131.3 221.6 249 189C276 451.3 302 480 351.5 480c81.8 0 90.8-75.3 89-93.3zM297 329.2C277.5 300 253.3 277 205.5 277c-30.5 0-54.3 10-69 22.8l12.2 24.3c6.2-3 13-4 19.8-4 35.5 0 53.7 30.8 69.2 61.3-10 3-20.7 4.2-32.7 4.2-75 0-107.5-53-107.5-156.7C97.5 124.5 130 71 205 71c76.2 0 108.7 53.5 108.7 157.7.1 41.8-5.4 75.6-16.7 100.5z"],ravelry:[512,512,[],"f2d9","M407.4 61.5C331.6 22.1 257.8 31 182.9 66c-11.3 5.2-15.5 10.6-19.9 19-10.3 19.2-16.2 37.4-19.9 52.7-21.2 25.6-36.4 56.1-43.3 89.9-10.6 18-20.9 41.4-23.1 71.4 0 0-.7 7.6-.5 7.9-35.3-4.6-76.2-27-76.2-27 9.1 14.5 61.3 32.3 76.3 37.9 0 0 1.7 98 64.5 131.2-11.3-17.2-13.3-20.2-13.3-20.2S94.8 369 100.4 324.7c.7 0 1.5.2 2.2.2 23.9 87.4 103.2 151.4 196.9 151.4 6.2 0 12.1-.2 18-.7 14 1.5 27.6.5 40.1-3.9 6.9-2.2 13.8-6.4 20.2-10.8 70.2-39.1 100.9-82 123.1-147.7 5.4-16 8.1-35.5 9.8-52.2 8.7-82.3-30.6-161.6-103.3-199.5zM138.8 163.2s-1.2 12.3-.7 19.7c-3.4 2.5-10.1 8.1-18.2 16.7 5.2-12.8 11.3-25.1 18.9-36.4zm-31.2 121.9c4.4-17.2 13.3-39.1 29.8-55.1 0 0 1.7 48 15.8 90.1l-41.4-6.9c-2.2-9.2-3.5-18.5-4.2-28.1zm7.9 42.8c14.8 3.2 34 7.6 43.1 9.1 27.3 76.8 108.3 124.3 108.3 124.3 1 .5 1.7.7 2.7 1-73.1-11.6-132.7-64.7-154.1-134.4zM386 444.1c-14.5 4.7-36.2 8.4-64.7 3.7 0 0-91.1-23.1-127.5-107.8 38.2.7 52.4-.2 78-3.9 39.4-5.7 79-16.2 115-33 11.8-5.4 11.1-19.4 9.6-29.8-2-12.8-11.1-12.1-21.4-4.7 0 0-82 58.6-189.8 53.7-18.7-32-26.8-110.8-26.8-110.8 41.4-35.2 83.2-59.6 168.4-52.4.2-6.4 3-27.1-20.4-28.1 0 0-93.5-11.1-146 33.5 2.5-16.5 5.9-29.3 11.1-39.4 34.2-30.8 79-49.5 128.3-49.5 106.4 0 193 87.1 193 194.5-.2 76-43.8 142-106.8 174z"],react:[512,512,[],"f41b","M418.2 177.2c-5.4-1.8-10.8-3.5-16.2-5.1.9-3.7 1.7-7.4 2.5-11.1 12.3-59.6 4.2-107.5-23.1-123.3-26.3-15.1-69.2.6-112.6 38.4-4.3 3.7-8.5 7.6-12.5 11.5-2.7-2.6-5.5-5.2-8.3-7.7-45.5-40.4-91.1-57.4-118.4-41.5-26.2 15.2-34 60.3-23 116.7 1.1 5.6 2.3 11.1 3.7 16.7-6.4 1.8-12.7 3.8-18.6 5.9C38.3 196.2 0 225.4 0 255.6c0 31.2 40.8 62.5 96.3 81.5 4.5 1.5 9 3 13.6 4.3-1.5 6-2.8 11.9-4 18-10.5 55.5-2.3 99.5 23.9 114.6 27 15.6 72.4-.4 116.6-39.1 3.5-3.1 7-6.3 10.5-9.7 4.4 4.3 9 8.4 13.6 12.4 42.8 36.8 85.1 51.7 111.2 36.6 27-15.6 35.8-62.9 24.4-120.5-.9-4.4-1.9-8.9-3-13.5 3.2-.9 6.3-1.9 9.4-2.9 57.7-19.1 99.5-50 99.5-81.7 0-30.3-39.4-59.7-93.8-78.4zM282.9 92.3c37.2-32.4 71.9-45.1 87.7-36 16.9 9.7 23.4 48.9 12.8 100.4-.7 3.4-1.4 6.7-2.3 10-22.2-5-44.7-8.6-67.3-10.6-13-18.6-27.2-36.4-42.6-53.1 3.9-3.7 7.7-7.2 11.7-10.7zm-130 189.1c4.6 8.8 9.3 17.5 14.3 26.1 5.1 8.7 10.3 17.4 15.8 25.9-15.6-1.7-31.1-4.2-46.4-7.5 4.4-14.4 9.9-29.3 16.3-44.5zm0-50.6c-6.3-14.9-11.6-29.5-16-43.6 14.4-3.2 29.7-5.8 45.6-7.8-5.3 8.3-10.5 16.8-15.4 25.4-4.9 8.5-9.7 17.2-14.2 26zm11.4 25.3c6.6-13.8 13.8-27.3 21.4-40.6 7.6-13.3 15.8-26.2 24.4-38.9 15-1.1 30.3-1.7 45.9-1.7 15.6 0 31 .6 45.9 1.7 8.5 12.6 16.6 25.5 24.3 38.7 7.7 13.2 14.9 26.7 21.7 40.4-6.7 13.8-13.9 27.4-21.6 40.8-7.6 13.3-15.7 26.2-24.2 39-14.9 1.1-30.4 1.6-46.1 1.6-15.7 0-30.9-.5-45.6-1.4-8.7-12.7-16.9-25.7-24.6-39-7.7-13.3-14.8-26.8-21.5-40.6zm180.6 51.2c5.1-8.8 9.9-17.7 14.6-26.7 6.4 14.5 12 29.2 16.9 44.3-15.5 3.5-31.2 6.2-47 8 5.4-8.4 10.5-17 15.5-25.6zm14.4-76.5c-4.7-8.8-9.5-17.6-14.5-26.2-4.9-8.5-10-16.9-15.3-25.2 16.1 2 31.5 4.7 45.9 8-4.6 14.8-10 29.2-16.1 43.4zM256.2 118.3c10.5 11.4 20.4 23.4 29.6 35.8-19.8-.9-39.7-.9-59.5 0 9.8-12.9 19.9-24.9 29.9-35.8zM140.2 57c16.8-9.8 54.1 4.2 93.4 39 2.5 2.2 5 4.6 7.6 7-15.5 16.7-29.8 34.5-42.9 53.1-22.6 2-45 5.5-67.2 10.4-1.3-5.1-2.4-10.3-3.5-15.5-9.4-48.4-3.2-84.9 12.6-94zm-24.5 263.6c-4.2-1.2-8.3-2.5-12.4-3.9-21.3-6.7-45.5-17.3-63-31.2-10.1-7-16.9-17.8-18.8-29.9 0-18.3 31.6-41.7 77.2-57.6 5.7-2 11.5-3.8 17.3-5.5 6.8 21.7 15 43 24.5 63.6-9.6 20.9-17.9 42.5-24.8 64.5zm116.6 98c-16.5 15.1-35.6 27.1-56.4 35.3-11.1 5.3-23.9 5.8-35.3 1.3-15.9-9.2-22.5-44.5-13.5-92 1.1-5.6 2.3-11.2 3.7-16.7 22.4 4.8 45 8.1 67.9 9.8 13.2 18.7 27.7 36.6 43.2 53.4-3.2 3.1-6.4 6.1-9.6 8.9zm24.5-24.3c-10.2-11-20.4-23.2-30.3-36.3 9.6.4 19.5.6 29.5.6 10.3 0 20.4-.2 30.4-.7-9.2 12.7-19.1 24.8-29.6 36.4zm130.7 30c-.9 12.2-6.9 23.6-16.5 31.3-15.9 9.2-49.8-2.8-86.4-34.2-4.2-3.6-8.4-7.5-12.7-11.5 15.3-16.9 29.4-34.8 42.2-53.6 22.9-1.9 45.7-5.4 68.2-10.5 1 4.1 1.9 8.2 2.7 12.2 4.9 21.6 5.7 44.1 2.5 66.3zm18.2-107.5c-2.8.9-5.6 1.8-8.5 2.6-7-21.8-15.6-43.1-25.5-63.8 9.6-20.4 17.7-41.4 24.5-62.9 5.2 1.5 10.2 3.1 15 4.7 46.6 16 79.3 39.8 79.3 58 0 19.6-34.9 44.9-84.8 61.4zM256 210.2c25.3 0 45.8 20.5 45.8 45.8 0 25.3-20.5 45.8-45.8 45.8-25.3 0-45.8-20.5-45.8-45.8 0-25.3 20.5-45.8 45.8-45.8"],rebel:[512,512,[],"f1d0","M256.5 504C117.2 504 9 387.8 13.2 249.9 16 170.7 56.4 97.7 129.7 49.5c.3 0 1.9-.6 1.1.8-5.8 5.5-111.3 129.8-14.1 226.4 49.8 49.5 90 2.5 90 2.5 38.5-50.1-.6-125.9-.6-125.9-10-24.9-45.7-40.1-45.7-40.1l28.8-31.8c24.4 10.5 43.2 38.7 43.2 38.7.8-29.6-21.9-61.4-21.9-61.4L255.1 8l44.3 50.1c-20.5 28.8-21.9 62.6-21.9 62.6 13.8-23 43.5-39.3 43.5-39.3l28.5 31.8c-27.4 8.9-45.4 39.9-45.4 39.9-15.8 28.5-27.1 89.4.6 127.3 32.4 44.6 87.7-2.8 87.7-2.8 102.7-91.9-10.5-225-10.5-225-6.1-5.5.8-2.8.8-2.8 50.1 36.5 114.6 84.4 116.2 204.8C500.9 400.2 399 504 256.5 504z"],"red-river":[448,512,[],"f3e3","M353.2 32H94.8C42.4 32 0 74.4 0 126.8v258.4C0 437.6 42.4 480 94.8 480h258.4c52.4 0 94.8-42.4 94.8-94.8V126.8c0-52.4-42.4-94.8-94.8-94.8zM144.9 200.9v56.3c0 27-21.9 48.9-48.9 48.9V151.9c0-13.2 10.7-23.9 23.9-23.9h154.2c0 27-21.9 48.9-48.9 48.9h-56.3c-12.3-.6-24.6 11.6-24 24zm176.3 72h-56.3c-12.3-.6-24.6 11.6-24 24v56.3c0 27-21.9 48.9-48.9 48.9V247.9c0-13.2 10.7-23.9 23.9-23.9h154.2c0 27-21.9 48.9-48.9 48.9z"],reddit:[512,512,[],"f1a1","M201.5 305.5c-13.8 0-24.9-11.1-24.9-24.6 0-13.8 11.1-24.9 24.9-24.9 13.6 0 24.6 11.1 24.6 24.9 0 13.6-11.1 24.6-24.6 24.6zM504 256c0 137-111 248-248 248S8 393 8 256 119 8 256 8s248 111 248 248zm-132.3-41.2c-9.4 0-17.7 3.9-23.8 10-22.4-15.5-52.6-25.5-86.1-26.6l17.4-78.3 55.4 12.5c0 13.6 11.1 24.6 24.6 24.6 13.8 0 24.9-11.3 24.9-24.9s-11.1-24.9-24.9-24.9c-9.7 0-18 5.8-22.1 13.8l-61.2-13.6c-3-.8-6.1 1.4-6.9 4.4l-19.1 86.4c-33.2 1.4-63.1 11.3-85.5 26.8-6.1-6.4-14.7-10.2-24.1-10.2-34.9 0-46.3 46.9-14.4 62.8-1.1 5-1.7 10.2-1.7 15.5 0 52.6 59.2 95.2 132 95.2 73.1 0 132.3-42.6 132.3-95.2 0-5.3-.6-10.8-1.9-15.8 31.3-16 19.8-62.5-14.9-62.5zM302.8 331c-18.2 18.2-76.1 17.9-93.6 0-2.2-2.2-6.1-2.2-8.3 0-2.5 2.5-2.5 6.4 0 8.6 22.8 22.8 87.3 22.8 110.2 0 2.5-2.2 2.5-6.1 0-8.6-2.2-2.2-6.1-2.2-8.3 0zm7.7-75c-13.6 0-24.6 11.1-24.6 24.9 0 13.6 11.1 24.6 24.6 24.6 13.8 0 24.9-11.1 24.9-24.6 0-13.8-11-24.9-24.9-24.9z"],"reddit-alien":[512,512,[],"f281","M440.3 203.5c-15 0-28.2 6.2-37.9 15.9-35.7-24.7-83.8-40.6-137.1-42.3L293 52.3l88.2 19.8c0 21.6 17.6 39.2 39.2 39.2 22 0 39.7-18.1 39.7-39.7s-17.6-39.7-39.7-39.7c-15.4 0-28.7 9.3-35.3 22l-97.4-21.6c-4.9-1.3-9.7 2.2-11 7.1L246.3 177c-52.9 2.2-100.5 18.1-136.3 42.8-9.7-10.1-23.4-16.3-38.4-16.3-55.6 0-73.8 74.6-22.9 100.1-1.8 7.9-2.6 16.3-2.6 24.7 0 83.8 94.4 151.7 210.3 151.7 116.4 0 210.8-67.9 210.8-151.7 0-8.4-.9-17.2-3.1-25.1 49.9-25.6 31.5-99.7-23.8-99.7zM129.4 308.9c0-22 17.6-39.7 39.7-39.7 21.6 0 39.2 17.6 39.2 39.7 0 21.6-17.6 39.2-39.2 39.2-22 .1-39.7-17.6-39.7-39.2zm214.3 93.5c-36.4 36.4-139.1 36.4-175.5 0-4-3.5-4-9.7 0-13.7 3.5-3.5 9.7-3.5 13.2 0 27.8 28.5 120 29 149 0 3.5-3.5 9.7-3.5 13.2 0 4.1 4 4.1 10.2.1 13.7zm-.8-54.2c-21.6 0-39.2-17.6-39.2-39.2 0-22 17.6-39.7 39.2-39.7 22 0 39.7 17.6 39.7 39.7-.1 21.5-17.7 39.2-39.7 39.2z"],"reddit-square":[448,512,[],"f1a2","M283.2 345.5c2.7 2.7 2.7 6.8 0 9.2-24.5 24.5-93.8 24.6-118.4 0-2.7-2.4-2.7-6.5 0-9.2 2.4-2.4 6.5-2.4 8.9 0 18.7 19.2 81 19.6 100.5 0 2.4-2.3 6.6-2.3 9 0zm-91.3-53.8c0-14.9-11.9-26.8-26.5-26.8-14.9 0-26.8 11.9-26.8 26.8 0 14.6 11.9 26.5 26.8 26.5 14.6 0 26.5-11.9 26.5-26.5zm90.7-26.8c-14.6 0-26.5 11.9-26.5 26.8 0 14.6 11.9 26.5 26.5 26.5 14.9 0 26.8-11.9 26.8-26.5 0-14.9-11.9-26.8-26.8-26.8zM448 80v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V80c0-26.5 21.5-48 48-48h352c26.5 0 48 21.5 48 48zm-99.7 140.6c-10.1 0-19 4.2-25.6 10.7-24.1-16.7-56.5-27.4-92.5-28.6l18.7-84.2 59.5 13.4c0 14.6 11.9 26.5 26.5 26.5 14.9 0 26.8-12.2 26.8-26.8 0-14.6-11.9-26.8-26.8-26.8-10.4 0-19.3 6.2-23.8 14.9l-65.7-14.6c-3.3-.9-6.5 1.5-7.4 4.8l-20.5 92.8c-35.7 1.5-67.8 12.2-91.9 28.9-6.5-6.8-15.8-11-25.9-11-37.5 0-49.8 50.4-15.5 67.5-1.2 5.4-1.8 11-1.8 16.7 0 56.5 63.7 102.3 141.9 102.3 78.5 0 142.2-45.8 142.2-102.3 0-5.7-.6-11.6-2.1-17 33.6-17.2 21.2-67.2-16.1-67.2z"],rendact:[496,512,[],"f3e4","M248 8C111 8 0 119 0 256s111 248 248 248c18.6 0 36.7-2.1 54.1-5.9-5.6-7.4-10.8-14.4-15.9-21.3-12.4 2.1-25.2 3.3-38.3 3.3C124.3 480 24 379.7 24 256S124.3 32 248 32s224 100.3 224 224c0 71-33 134.2-84.5 175.3-25.9 18.8-39.1 21.4-83.5-44.2-78.7-112.9-48-71.1-73.7-108.3 72.8 8.9 228.5-72 168.6-168.6C314-26.8 15 93.8 59.7 226.4c3.2 9.8 14.4 38.6 45.6 38.6 2 0 2.6-.6 2-1.7-4.4-8.7-20.1-9.8-20.1-37.4 0-40.5 40.5-89.6 100.3-120 66.1-32.3 131.9-30.2 158.2 5.4 27.2 38.3-20.9 119.2-120.4 136.9 7.5-9.4 57-75.2 62.8-84 22.7-34.6 23.6-49 14-59.2-15.5-16.9-29.5-10.3-50.7-11.7-10.8-.9-113.7 181.2-136.4 216.9-5.9 9-21.2 34.1-21.2 50.9 0 21.3 2.8 51.4 20.6 51.4 10.6 0 8-18.7 8-26.6 0-12.9 27.4-49.4 74.8-104.6 20.4 36.1 57.7 114.3 130.2 209.7 98-33.1 168.5-125.8 168.5-235C496 119 385 8 248 8z"],renren:[512,512,[],"f18b","M214 169.1c0 110.4-61 205.4-147.6 247.4C30 373.2 8 317.7 8 256.6 8 133.9 97.1 32.2 214 12.5v156.6zM255 504c-42.9 0-83.3-11-118.5-30.4C193.7 437.5 239.9 382.9 255 319c15.5 63.9 61.7 118.5 118.8 154.7C338.7 493 298.3 504 255 504zm190.6-87.5C359 374.5 298 279.6 298 169.1V12.5c116.9 19.7 206 121.4 206 244.1 0 61.1-22 116.6-58.4 159.9z"],replyd:[448,512,[],"f3e6","M320 480H128C57.6 480 0 422.4 0 352V160C0 89.6 57.6 32 128 32h192c70.4 0 128 57.6 128 128v192c0 70.4-57.6 128-128 128zM193.4 273.2c-6.1-2-11.6-3.1-16.4-3.1-7.2 0-13.5 1.9-18.9 5.6-5.4 3.7-9.6 9-12.8 15.8h-1.1l-4.2-18.3h-28v138.9h36.1v-89.7c1.5-5.4 4.4-9.8 8.7-13.2 4.3-3.4 9.8-5.1 16.2-5.1 4.6 0 9.8 1 15.6 3.1l4.8-34zm115.2 103.4c-3.2 2.4-7.7 4.8-13.7 7.1-6 2.3-12.8 3.5-20.4 3.5-12.2 0-21.1-3-26.5-8.9-5.5-5.9-8.5-14.7-9-26.4h83.3c.9-4.8 1.6-9.4 2.1-13.9.5-4.4.7-8.6.7-12.5 0-10.7-1.6-19.7-4.7-26.9-3.2-7.2-7.3-13-12.5-17.2-5.2-4.3-11.1-7.3-17.8-9.2-6.7-1.8-13.5-2.8-20.6-2.8-21.1 0-37.5 6.1-49.2 18.3s-17.5 30.5-17.5 55c0 22.8 5.2 40.7 15.6 53.7 10.4 13.1 26.8 19.6 49.2 19.6 10.7 0 20.9-1.5 30.4-4.6 9.5-3.1 17.1-6.8 22.6-11.2l-12-23.6zm-21.8-70.3c3.8 5.4 5.3 13.1 4.6 23.1h-51.7c.9-9.4 3.7-17 8.2-22.6 4.5-5.6 11.5-8.5 21-8.5 8.2-.1 14.1 2.6 17.9 8zm79.9 2.5c4.1 3.9 9.4 5.8 16.1 5.8 7 0 12.6-1.9 16.7-5.8s6.1-9.1 6.1-15.6-2-11.6-6.1-15.4c-4.1-3.8-9.6-5.7-16.7-5.7-6.7 0-12 1.9-16.1 5.7-4.1 3.8-6.1 8.9-6.1 15.4s2 11.7 6.1 15.6zm0 100.5c4.1 3.9 9.4 5.8 16.1 5.8 7 0 12.6-1.9 16.7-5.8s6.1-9.1 6.1-15.6-2-11.6-6.1-15.4c-4.1-3.8-9.6-5.7-16.7-5.7-6.7 0-12 1.9-16.1 5.7-4.1 3.8-6.1 8.9-6.1 15.4 0 6.6 2 11.7 6.1 15.6z"],resolving:[496,512,[],"f3e7","M281.2 278.2c46-13.3 49.6-23.5 44-43.4L314 195.5c-6.1-20.9-18.4-28.1-71.1-12.8L54.7 236.8l28.6 98.6 197.9-57.2zM248.5 8C131.4 8 33.2 88.7 7.2 197.5l221.9-63.9c34.8-10.2 54.2-11.7 79.3-8.2 36.3 6.1 52.7 25 61.4 55.2l10.7 37.8c8.2 28.1 1 50.6-23.5 73.6-19.4 17.4-31.2 24.5-61.4 33.2L203 351.8l220.4 27.1 9.7 34.2-48.1 13.3-286.8-37.3 23 80.2c36.8 22 80.3 34.7 126.3 34.7 137 0 248.5-111.4 248.5-248.3C497 119.4 385.5 8 248.5 8zM38.3 388.6L0 256.8c0 48.5 14.3 93.4 38.3 131.8z"],rocketchat:[448,512,[],"f3e8","M448 256.2c0-87.2-99.6-153.3-219.8-153.3-18.8 0-37.3 1.6-55.3 4.8-11.1-10.5-24.2-20-38-27.4C61.2 44.2 0 79.4 0 79.4s56.9 47.1 47.6 88.3c-52.3 52.3-52.5 124.1 0 176.6C56.9 385.6 0 432.6 0 432.6s61.2 35.2 134.9-.8c13.8-7.5 26.9-16.9 38-27.4 18 3.2 36.5 4.8 55.3 4.8 120.3-.1 219.8-65.8 219.8-153zm-219.7 124c-23.7 0-46.3-2.8-67.3-7.8-21.3 25.8-68.1 61.7-113.6 50.1 14.8-16 36.7-43.1 32-87.6-27.3-21.4-43.6-48.7-43.6-78.5 0-68.4 86.2-123.9 192.5-123.9S420.8 188 420.8 256.4c0 68.3-86.2 123.8-192.5 123.8zm25.6-123.9c0 14.2-11.5 25.8-25.6 25.8-14.1 0-25.6-11.5-25.6-25.8 0-14.2 11.5-25.8 25.6-25.8 14.1 0 25.6 11.6 25.6 25.8zm88.9 0c0 14.2-11.4 25.8-25.6 25.8-14.1 0-25.6-11.5-25.6-25.8 0-14.2 11.4-25.8 25.6-25.8 14.1 0 25.6 11.6 25.6 25.8zm-177.9 0c0 14.2-11.4 25.8-25.6 25.8-14.1 0-25.6-11.5-25.6-25.8 0-14.2 11.4-25.8 25.6-25.8 14.2 0 25.6 11.6 25.6 25.8z"],rockrms:[496,512,[],"f3e9","M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm157.4 419.5h-90l-112-131.3c-17.9-20.4-3.9-56.1 26.6-56.1h75.3l-84.6-99.3-84.3 98.9h-90L193.5 67.2c14.4-18.4 41.3-17.3 54.5 0l157.7 185.1c19 22.8 2 57.2-27.6 56.1-.6 0-74.2.2-74.2.2l101.5 118.9z"],safari:[512,512,[],"f267","M236.9 256.8c0-9.1 6.6-17.7 16.3-17.7 8.9 0 17.4 6.4 17.4 16.1 0 9.1-6.4 17.7-16.1 17.7-9 0-17.6-6.7-17.6-16.1zM504 256c0 137-111 248-248 248S8 393 8 256 119 8 256 8s248 111 248 248zm-26.6 0c0-122.3-99.1-221.4-221.4-221.4S34.6 133.7 34.6 256 133.7 477.4 256 477.4 477.4 378.3 477.4 256zm-72.5 96.6c0 3.6 13 10.2 16.3 12.2-27.4 41.5-69.8 71.4-117.9 83.3l-4.4-18.5c-.3-2.5-1.9-2.8-4.2-2.8-1.9 0-3 2.8-2.8 4.2l4.4 18.8c-13.3 2.8-26.8 4.2-40.4 4.2-36.3 0-72-10.2-103-29.1 1.7-2.8 12.2-18 12.2-20.2 0-1.9-1.7-3.6-3.6-3.6-3.9 0-12.2 16.6-14.7 19.9-41.8-27.7-72-70.6-83.6-119.6l19.1-4.2c2.2-.6 2.8-2.2 2.8-4.2 0-1.9-2.8-3-4.4-2.8L62 294.5c-2.5-12.7-3.9-25.5-3.9-38.5 0-37.1 10.5-73.6 30.2-104.9 2.8 1.7 16.1 10.8 18.3 10.8 1.9 0 3.6-1.4 3.6-3.3 0-3.9-14.7-11.3-18-13.6 28.2-41.2 71.1-70.9 119.8-81.9l4.2 18.5c.6 2.2 2.2 2.8 4.2 2.8s3-2.8 2.8-4.4L219 61.7c12.2-2.2 24.6-3.6 37.1-3.6 37.1 0 73.3 10.5 104.9 30.2-1.9 2.8-10.8 15.8-10.8 18 0 1.9 1.4 3.6 3.3 3.6 3.9 0 11.3-14.4 13.3-17.7 41 27.7 70.3 70 81.7 118.2l-15.5 3.3c-2.5.6-2.8 2.2-2.8 4.4 0 1.9 2.8 3 4.2 2.8l15.8-3.6c2.5 12.7 3.9 25.7 3.9 38.7 0 36.3-10 72-28.8 102.7-2.8-1.4-14.4-9.7-16.6-9.7-2.1 0-3.8 1.7-3.8 3.6zm-33.2-242.2c-13 12.2-134.2 123.7-137.6 129.5l-96.6 160.5c12.7-11.9 134.2-124 137.3-129.3l96.9-160.7z"],sass:[640,512,[],"f41e","M551.1 291.9c-22.4.1-41.8 5.5-58 13.5-5.9-11.9-12-22.3-13-30.1-1.2-9.1-2.5-14.5-1.1-25.3s7.7-26.1 7.6-27.2c-.1-1.1-1.4-6.6-14.3-6.7-12.9-.1-24 2.5-25.3 5.9-1.3 3.4-3.8 11.1-5.3 19.1-2.3 11.7-25.8 53.5-39.1 75.3-4.4-8.5-8.1-16-8.9-22-1.2-9.1-2.5-14.5-1.1-25.3s7.7-26.1 7.6-27.2c-.1-1.1-1.4-6.6-14.3-6.7-12.9-.1-24 2.5-25.3 5.9-1.3 3.4-2.7 11.4-5.3 19.1-2.6 7.7-33.9 77.3-42.1 95.4-4.2 9.2-7.8 16.6-10.4 21.6s-.2.3-.4.9c-2.2 4.3-3.5 6.7-3.5 6.7v.1c-1.7 3.2-3.6 6.1-4.5 6.1-.6 0-1.9-8.4.3-19.9 4.7-24.2 15.8-61.8 15.7-63.1-.1-.7 2.1-7.2-7.3-10.7-9.1-3.3-12.4 2.2-13.2 2.2-.8 0-1.4 2-1.4 2s10.1-42.4-19.4-42.4c-18.4 0-44 20.2-56.6 38.5-7.9 4.3-25 13.6-43 23.5-6.9 3.8-14 7.7-20.7 11.4-.5-.5-.9-1-1.4-1.5-35.8-38.2-101.9-65.2-99.1-116.5 1-18.7 7.5-67.8 127.1-127.4 98-48.8 176.4-35.4 189.9-5.6 19.4 42.5-41.9 121.6-143.7 133-38.8 4.3-59.2-10.7-64.3-16.3-5.3-5.9-6.1-6.2-8.1-5.1-3.3 1.8-1.2 7 0 10.1 3 7.9 15.5 21.9 36.8 28.9 18.7 6.1 64.2 9.5 119.2-11.8C367 196.5 415.1 130.2 401 74.7 386.6 18.3 293.1-.2 204.6 31.2 151.9 49.9 94.9 79.3 53.9 117.6 5.2 163.2-2.6 202.9.6 219.5c11.4 58.9 92.6 97.3 125.1 125.7-1.6.9-3.1 1.7-4.5 2.5-16.3 8.1-78.2 40.5-93.7 74.7-17.5 38.8 2.9 66.6 16.3 70.4 41.8 11.6 84.6-9.3 107.6-43.6s20.2-79.1 9.6-99.5c-.1-.3-.3-.5-.4-.8 4.2-2.5 8.5-5 12.8-7.5 8.3-4.9 16.4-9.4 23.5-13.3-4 10.8-6.9 23.8-8.4 42.6-1.8 22 7.3 50.5 19.1 61.7 5.2 4.9 11.5 5 15.4 5 13.8 0 20-11.4 26.9-25 8.5-16.6 16-35.9 16-35.9s-9.4 52.2 16.3 52.2c9.4 0 18.8-12.1 23-18.3v.1s.2-.4.7-1.2c1-1.5 1.5-2.4 1.5-2.4v-.3c3.8-6.5 12.1-21.4 24.6-46 16.2-31.8 31.7-71.5 31.7-71.5s1.4 9.7 6.2 25.8c2.8 9.5 8.7 19.9 13.4 30-3.8 5.2-6.1 8.2-6.1 8.2s0 .1.1.2c-3 4-6.4 8.3-9.9 12.5-12.8 15.2-28 32.6-30 37.6-2.4 5.9-1.8 10.3 2.8 13.7 3.4 2.6 9.4 3 15.7 2.5 11.5-.8 19.6-3.6 23.5-5.4 6.2-2.2 13.4-5.7 20.2-10.6 12.5-9.2 20.1-22.4 19.4-39.8-.4-9.6-3.5-19.2-7.3-28.2 1.1-1.6 2.3-3.3 3.4-5 19.8-28.9 35.1-60.6 35.1-60.6s1.4 9.7 6.2 25.8c2.4 8.1 7.1 17 11.4 25.7-18.6 15.1-30.1 32.6-34.1 44.1-7.4 21.3-1.6 30.9 9.3 33.1 4.9 1 11.9-1.3 17.1-3.5 6.5-2.2 14.3-5.7 21.6-11.1 12.5-9.2 24.6-22.1 23.8-39.6-.3-7.9-2.5-15.8-5.4-23.4 15.7-6.6 36.1-10.2 62.1-7.2 55.7 6.5 66.6 41.3 64.5 55.8-2.1 14.6-13.8 22.6-17.7 25-3.9 2.4-5.1 3.3-4.8 5.1.5 2.6 2.3 2.5 5.6 1.9 4.6-.8 29.2-11.8 30.3-38.7 1.6-34-31.1-71.4-89-71.1zM121.8 436.6c-18.4 20.1-44.2 27.7-55.3 21.3C54.6 451 59.3 421.4 82 400c13.8-13 31.6-25 43.4-32.4 2.7-1.6 6.6-4 11.4-6.9.8-.5 1.2-.7 1.2-.7.9-.6 1.9-1.1 2.9-1.7 8.3 30.4.3 57.2-19.1 78.3zm134.4-91.4c-6.4 15.7-19.9 55.7-28.1 53.6-7-1.8-11.3-32.3-1.4-62.3 5-15.1 15.6-33.1 21.9-40.1 10.1-11.3 21.2-14.9 23.8-10.4 3.5 5.9-12.2 49.4-16.2 59.2zm111 53c-2.7 1.4-5.2 2.3-6.4 1.6-.9-.5 1.1-2.4 1.1-2.4s13.9-14.9 19.4-21.7c3.2-4 6.9-8.7 10.9-13.9 0 .5.1 1 .1 1.6-.1 17.9-17.3 30-25.1 34.8zm85.6-19.5c-2-1.4-1.7-6.1 5-20.7 2.6-5.7 8.6-15.3 19-24.5 1.2 3.8 1.9 7.4 1.9 10.8-.1 22.5-16.2 30.9-25.9 34.4z"],schlix:[448,512,[],"f3ea","M350.5 157.7l-54.2-46.1 73.4-39 78.3 44.2-97.5 40.9zM192 122.1l45.7-28.2 34.7 34.6-55.4 29-25-35.4zm-65.1 6.6l31.9-22.1L176 135l-36.7 22.5-12.4-28.8zm-23.3 88.2l-8.8-34.8 29.6-18.3 13.1 35.3-33.9 17.8zm-21.2-83.7l23.9-18.1 8.9 24-26.7 18.3-6.1-24.2zM59 206.5l-3.6-28.4 22.3-15.5 6.1 28.7L59 206.5zm-30.6 16.6l20.8-12.8 3.3 33.4-22.9 12-1.2-32.6zM1.4 268l19.2-10.2.4 38.2-21 8.8L1.4 268zm59.1 59.3l-28.3 8.3-1.6-46.8 25.1-10.7 4.8 49.2zM99 263.2l-31.1 13-5.2-40.8L90.1 221l8.9 42.2zM123.2 377l-41.6 5.9-8.1-63.5 35.2-10.8 14.5 68.4zm28.5-139.9l21.2 57.1-46.2 13.6-13.7-54.1 38.7-16.6zm85.7 230.5l-70.9-3.3-24.3-95.8 55.2-8.6 40 107.7zm-84.9-279.7l42.2-22.4 28 45.9-50.8 21.3-19.4-44.8zm41 94.9l61.3-18.7 52.8 86.6-79.8 11.3-34.3-79.2zm51.4-85.6l67.3-28.8 65.5 65.4-88.6 26.2-44.2-62.8z"],scribd:[384,512,[],"f28a","M42.3 252.7c-16.1-19-24.7-45.9-24.8-79.9 0-100.4 75.2-153.1 167.2-153.1 98.6-1.6 156.8 49 184.3 70.6l-50.5 72.1-37.3-24.6 26.9-38.6c-36.5-24-79.4-36.5-123-35.8-50.7-.8-111.7 27.2-111.7 76.2 0 18.7 11.2 20.7 28.6 15.6 23.3-5.3 41.9.6 55.8 14 26.4 24.3 23.2 67.6-.7 91.9-29.2 29.5-85.2 27.3-114.8-8.4zm317.7 5.9c-15.5-18.8-38.9-29.4-63.2-28.6-38.1-2-71.1 28-70.5 67.2-.7 16.8 6 33 18.4 44.3 14.1 13.9 33 19.7 56.3 14.4 17.4-5.1 28.6-3.1 28.6 15.6 0 4.3-.5 8.5-1.4 12.7-16.7 40.9-59.5 64.4-121.4 64.4-51.9.2-102.4-16.4-144.1-47.3l33.7-39.4-35.6-27.4L0 406.3l15.4 13.8c52.5 46.8 120.4 72.5 190.7 72.2 51.4 0 94.4-10.5 133.6-44.1 57.1-51.4 54.2-149.2 20.3-189.6z"],searchengin:[460,512,[],"f3eb","M220.6 130.3l-67.2 28.2V43.2L98.7 233.5l54.7-24.2v130.3l67.2-209.3zm-83.2-96.7l-1.3 4.7-15.2 52.9C80.6 106.7 52 145.8 52 191.5c0 52.3 34.3 95.9 83.4 105.5v53.6C57.5 340.1 0 272.4 0 191.6c0-80.5 59.8-147.2 137.4-158zm311.4 447.2c-11.2 11.2-23.1 12.3-28.6 10.5-5.4-1.8-27.1-19.9-60.4-44.4-33.3-24.6-33.6-35.7-43-56.7-9.4-20.9-30.4-42.6-57.5-52.4l-9.7-14.7c-24.7 16.9-53 26.9-81.3 28.7l2.1-6.6 15.9-49.5c46.5-11.9 80.9-54 80.9-104.2 0-54.5-38.4-102.1-96-107.1V32.3C254.4 37.4 320 106.8 320 191.6c0 33.6-11.2 64.7-29 90.4l14.6 9.6c9.8 27.1 31.5 48 52.4 57.4s32.2 9.7 56.8 43c24.6 33.2 42.7 54.9 44.5 60.3s.7 17.3-10.5 28.5zm-9.9-17.9c0-4.4-3.6-8-8-8s-8 3.6-8 8 3.6 8 8 8 8-3.6 8-8z"],sellcast:[448,512,[],"f2da","M353.4 32H94.7C42.6 32 0 74.6 0 126.6v258.7C0 437.4 42.6 480 94.7 480h258.7c52.1 0 94.7-42.6 94.7-94.6V126.6c0-52-42.6-94.6-94.7-94.6zm-50 316.4c-27.9 48.2-89.9 64.9-138.2 37.2-22.9 39.8-54.9 8.6-42.3-13.2l15.7-27.2c5.9-10.3 19.2-13.9 29.5-7.9 18.6 10.8-.1-.1 18.5 10.7 27.6 15.9 63.4 6.3 79.4-21.3 15.9-27.6 6.3-63.4-21.3-79.4-17.8-10.2-.6-.4-18.6-10.6-24.6-14.2-3.4-51.9 21.6-37.5 18.6 10.8-.1-.1 18.5 10.7 48.4 28 65.1 90.3 37.2 138.5zm21.8-208.8c-17 29.5-16.3 28.8-19 31.5-6.5 6.5-16.3 8.7-26.5 3.6-18.6-10.8.1.1-18.5-10.7-27.6-15.9-63.4-6.3-79.4 21.3s-6.3 63.4 21.3 79.4c0 0 18.5 10.6 18.6 10.6 24.6 14.2 3.4 51.9-21.6 37.5-18.6-10.8.1.1-18.5-10.7-48.2-27.8-64.9-90.1-37.1-138.4 27.9-48.2 89.9-64.9 138.2-37.2l4.8-8.4c14.3-24.9 52-3.3 37.7 21.5z"],sellsy:[640,512,[],"f213","M539.71 237.308c3.064-12.257 4.29-24.821 4.29-37.384C544 107.382 468.618 32 376.076 32c-77.22 0-144.634 53.012-163.02 127.781-15.322-13.176-34.934-20.53-55.157-20.53-46.271 0-83.962 37.69-83.962 83.961 0 7.354.92 15.015 3.065 22.369-42.9 20.225-70.785 63.738-70.785 111.234C6.216 424.843 61.68 480 129.401 480h381.198c67.72 0 123.184-55.157 123.184-123.184.001-56.384-38.916-106.025-94.073-119.508zM199.88 401.554c0 8.274-7.048 15.321-15.321 15.321H153.61c-8.274 0-15.321-7.048-15.321-15.321V290.626c0-8.273 7.048-15.321 15.321-15.321h30.949c8.274 0 15.321 7.048 15.321 15.321v110.928zm89.477 0c0 8.274-7.048 15.321-15.322 15.321h-30.949c-8.274 0-15.321-7.048-15.321-15.321V270.096c0-8.274 7.048-15.321 15.321-15.321h30.949c8.274 0 15.322 7.048 15.322 15.321v131.458zm89.477 0c0 8.274-7.047 15.321-15.321 15.321h-30.949c-8.274 0-15.322-7.048-15.322-15.321V238.84c0-8.274 7.048-15.321 15.322-15.321h30.949c8.274 0 15.321 7.048 15.321 15.321v162.714zm87.027 0c0 8.274-7.048 15.321-15.322 15.321h-28.497c-8.274 0-15.321-7.048-15.321-15.321V176.941c0-8.579 7.047-15.628 15.321-15.628h28.497c8.274 0 15.322 7.048 15.322 15.628v224.613z"],servicestack:[496,512,[],"f3ec","M88 216c81.7 10.2 273.7 102.3 304 232H0c99.5-8.1 184.5-137 88-232zm32-152c32.3 35.6 47.7 83.9 46.4 133.6C249.3 231.3 373.7 321.3 400 448h96C455.3 231.9 222.8 79.5 120 64z"],shirtsinbulk:[448,512,[],"f214","M395.208 221.583H406v33.542h-10.792v-33.542zm0-9.625H406v-33.542h-10.792v33.542zm0 86.333H406V264.75h-10.792v33.541zM358.75 135.25h-33.542v10.5h33.542v-10.5zm36.458 206.208H406v-33.542h-10.792v33.542zM311.5 135.25h-33.542v10.5H311.5v-10.5zm-47.25 0H231v10.5h33.25v-10.5zm-47.25 0h-33.25v10.5H217v-10.5zm178.208 33.542H406V135.25h-33.542v10.5h22.75v23.042zm-255.792 259l30.625 13.417 4.375-9.917-30.625-13.417-4.375 9.917zM179.083 445l30.334 13.708 4.374-9.916-30.333-13.417-4.375 9.625zm216.125-60.375H406v-33.542h-10.792v33.542zm-334.833 8.167L91 406.208l4.375-9.624-30.625-13.709-4.375 9.917zm39.666 17.499l30.625 13.417 4.375-9.917-30.625-13.416-4.375 9.916zm132.417 38.501l4.375 9.916L267.459 445l-4.375-9.625-30.626 13.417zm118.417-52.208l4.375 9.624 30.624-13.416-4.374-9.917-30.625 13.709zM311.5 413.791l4.375 9.917 30.625-13.417-4.374-9.916-30.626 13.416zm-39.667 17.501l4.375 9.917 30.625-13.417-4.375-9.917-30.625 13.417zM311.5 46.583h-33.542v10.5H311.5v-10.5zm94.209 0h-33.251v10.5h33.251v-10.5zm-188.709 0h-33.25v10.5H217v-10.5zm141.75 0h-33.542v10.5h33.542v-10.5zm-94.5 0H231v10.5h33.25v-10.5zM448 3.708v406l-226.334 98.584L0 409.708v-406h448zm-29.166 116.958H29.166V390.75l192.792 85.75 196.875-85.75V120.666zm0-87.791H29.166V91.5h389.667V32.875zM75.542 46.583H42.291v10.5h33.251v-10.5zm94.5 0H136.5v10.5h33.542v-10.5zm-47.251 0H89.25v10.5h33.542v-10.5zm7.584 236.542c0-50.167 41.125-91.292 91.292-91.292 50.458 0 91.292 41.125 91.292 91.292 0 50.458-40.833 91.292-91.292 91.292-50.167-.001-91.292-40.834-91.292-91.292zm120.75 18.084c0 13.125-23.917 14.291-32.666 14.291-12.25 0-29.75-2.625-35.875-14.875h-.875L172.666 319c14.876 9.333 29.167 12.25 47.25 12.25 19.542 0 51.042-5.833 51.042-31.209 0-48.125-78.458-16.333-78.458-37.916 0-13.125 20.708-14.875 29.75-14.875 10.791 0 29.166 3.208 35.583 13.124h.875l8.751-16.916c-15.167-6.125-27.417-11.959-44.334-11.959-20.125 0-49.583 6.417-49.583 31.792 0 44.334 77.583 11.959 77.583 37.918zM122.791 135.25H89.25v10.5h33.542v-10.5zm-69.999 10.5h22.75v-10.5H42v33.542h10.792V145.75zm0 32.666H42v33.542h10.792v-33.542zm117.25-43.166H136.5v10.5h33.542v-10.5zm-117.25 86.333H42v33.542h10.792v-33.542zm0 86.334H42v33.542h10.792v-33.542zm0-43.167H42v33.542h10.792V264.75zm0 86.333H42v33.542h10.792v-33.542z"],simplybuilt:[512,512,[],"f215","M481.2 64h-106c-14.5 0-26.6 11.8-26.6 26.3v39.6H163.3V90.3c0-14.5-12-26.3-26.6-26.3h-106C16.1 64 4.3 75.8 4.3 90.3v331.4c0 14.5 11.8 26.3 26.6 26.3h450.4c14.8 0 26.6-11.8 26.6-26.3V90.3c-.2-14.5-12-26.3-26.7-26.3zM149.8 355.8c-36.6 0-66.4-29.7-66.4-66.4 0-36.9 29.7-66.6 66.4-66.6 36.9 0 66.6 29.7 66.6 66.6 0 36.7-29.7 66.4-66.6 66.4zm212.4 0c-36.9 0-66.6-29.7-66.6-66.6 0-36.6 29.7-66.4 66.6-66.4 36.6 0 66.4 29.7 66.4 66.4 0 36.9-29.8 66.6-66.4 66.6z"],sistrix:[448,512,[],"f3ee","M448 449L301.2 300.2c20-27.9 31.9-62.2 31.9-99.2 0-93.1-74.7-168.9-166.5-168.9C74.7 32 0 107.8 0 200.9s74.7 168.9 166.5 168.9c39.8 0 76.3-14.2 105-37.9l146 148.1 30.5-31zM166.5 330.8c-70.6 0-128.1-58.3-128.1-129.9S95.9 71 166.5 71s128.1 58.3 128.1 129.9-57.4 129.9-128.1 129.9z"],skyatlas:[576,512,[],"f216","M545.7 318.5c0 56.2-44.8 97.5-100.2 97.5-141.5 0-167.6-212.9-306.7-212.9-125.2 0-125.4 180.9 4.8 180.9 36.2 0 77.5-15.2 106.8-36.2 4.8-3.5 14.4-13.9 19.5-13.9s9.3 4.3 9.3 9.3c0 6.7-11.2 16.3-16 20.5-34.9 30.4-85.5 52.2-131.9 52.2C60.2 416 0 365.6 0 292.4s57.6-127.1 130.3-127.1c158 0 189.7 209.7 308.5 209.7 85.2 0 80.8-119.1 2.9-119.1-14.9 0-29.8 9.9-40 9.9-7.2 0-13.6-6.1-13.6-13.3 0-9.9 4.5-20.2 4.5-30.9 0-56.8-43.4-97.8-99.7-97.8-45.3 0-68.2 31.4-75.7 31.4-5.3 0-9.6-4.3-9.6-9.6 0-4.8 3.5-8.8 6.7-12.3C235.9 108.8 269.5 96 302 96c67.7 0 118.6 49.8 118.6 117.5 0 5.9-.3 11.7-1.1 17.6 10.1-2.7 20.5-4 30.6-4 51.9 0 95.6 38.6 95.6 91.4z"],skype:[448,512,[],"f17e","M424.7 299.8c2.9-14 4.7-28.9 4.7-43.8 0-113.5-91.9-205.3-205.3-205.3-14.9 0-29.7 1.7-43.8 4.7C161.3 40.7 137.7 32 112 32 50.2 32 0 82.2 0 144c0 25.7 8.7 49.3 23.3 68.2-2.9 14-4.7 28.9-4.7 43.8 0 113.5 91.9 205.3 205.3 205.3 14.9 0 29.7-1.7 43.8-4.7 19 14.6 42.6 23.3 68.2 23.3 61.8 0 112-50.2 112-112 .1-25.6-8.6-49.2-23.2-68.1zm-194.6 91.5c-65.6 0-120.5-29.2-120.5-65 0-16 9-30.6 29.5-30.6 31.2 0 34.1 44.9 88.1 44.9 25.7 0 42.3-11.4 42.3-26.3 0-18.7-16-21.6-42-28-62.5-15.4-117.8-22-117.8-87.2 0-59.2 58.6-81.1 109.1-81.1 55.1 0 110.8 21.9 110.8 55.4 0 16.9-11.4 31.8-30.3 31.8-28.3 0-29.2-33.5-75-33.5-25.7 0-42 7-42 22.5 0 19.8 20.8 21.8 69.1 33 41.4 9.3 90.7 26.8 90.7 77.6 0 59.1-57.1 86.5-112 86.5z"],slack:[448,512,[],"f198","M244.2 217.5l19.3 57.7-59.8 20-19.3-57.7 59.8-20zm41.4 243.7C131.6 507.4 65 471.6 18.8 317.6S8.4 97 162.4 50.8C316.4 4.6 383 40.4 429.2 194.4c46.2 154 10.4 220.6-143.6 266.8zM366.2 265c-3.9-12.2-17.2-18.6-29.4-14.7l-29 9.7-19.3-57.7 29-9.7c12.2-3.9 18.6-17.2 14.7-29.4-3.9-12.2-17.2-18.6-29.4-14.7l-29 9.7-10-30.1c-3.9-12.2-17.2-18.6-29.4-14.7-12.2 3.9-18.6 17.2-14.7 29.4l10 30.1-59.8 20.1-10-30.1c-3.9-12.2-17.2-18.6-29.4-14.7-12.2 3.9-18.6 17.2-14.7 29.4l10 30.1-29 9.7c-12.2 3.9-18.6 17.2-14.7 29.4 3.2 9.3 12.2 15.4 21.5 15.8 4.3.6 7.7-1 36.9-10.7l19.3 57.7-29 9.7c-12.2 3.9-18.6 17.2-14.7 29.4 3.2 9.3 12.2 15.4 21.5 15.8 4.3.6 7.7-1 36.9-10.7l10 30.1c3.7 10.8 15.8 18.6 29.4 14.7 12.2-3.9 18.6-17.2 14.7-29.4l-10-30.1 59.8-20.1 10 30.1c3.7 10.8 15.8 18.6 29.4 14.7 12.2-3.9 18.6-17.2 14.7-29.4l-10-30.1 29-9.7c12.2-4.2 18.6-17.5 14.7-29.6z"],"slack-hash":[448,512,[],"f3ef","M446.2 270.4c-6.2-19-26.9-29.1-46-22.9l-45.4 15.1-30.3-90 45.4-15.1c19.1-6.2 29.1-26.8 23-45.9-6.2-19-26.9-29.1-46-22.9l-45.4 15.1-15.7-47c-6.2-19-26.9-29.1-46-22.9-19.1 6.2-29.1 26.8-23 45.9l15.7 47-93.4 31.2-15.7-47c-6.2-19-26.9-29.1-46-22.9-19.1 6.2-29.1 26.8-23 45.9l15.7 47-45.3 15c-19.1 6.2-29.1 26.8-23 45.9 5 14.5 19.1 24 33.6 24.6 6.8 1 12-1.6 57.7-16.8l30.3 90L78 354.8c-19 6.2-29.1 26.9-23 45.9 5 14.5 19.1 24 33.6 24.6 6.8 1 12-1.6 57.7-16.8l15.7 47c5.9 16.9 24.7 29 46 22.9 19.1-6.2 29.1-26.8 23-45.9l-15.7-47 93.6-31.3 15.7 47c5.9 16.9 24.7 29 46 22.9 19.1-6.2 29.1-26.8 23-45.9l-15.7-47 45.4-15.1c19-6 29.1-26.7 22.9-45.7zm-254.1 47.2l-30.3-90.2 93.5-31.3 30.3 90.2-93.5 31.3z"],slideshare:[512,512,[],"f1e7","M249.429 211.436c0 31.716-27.715 57.717-61.717 57.717-34.001 0-61.716-26.001-61.716-57.717 0-32.001 27.715-57.716 61.716-57.716 34.001 0 61.717 25.715 61.717 57.716zm254.294 50.002c-18.286 22.573-53.144 50.288-106.289 72.003C453.722 525.163 260 555.735 263.143 457.446c0 1.714-.286-52.859-.286-93.432-4.285-.858-8.571-2-13.714-3.143 0 40.858-.286 98.289-.286 96.575C252 555.735 58.278 525.163 114.566 333.441c-53.145-21.715-88.003-49.43-106.29-72.003-9.143-13.714.858-28.287 16.001-17.715 2 1.428 4.285 2.857 6.285 4.285V49.716C30.563 22.287 51.135 0 76.565 0h359.157c25.429 0 46.002 22.287 46.002 49.716v198.293l6-4.285c15.143-10.573 25.143 4 15.999 17.714zm-46.572-189.15c0-32.858-10.572-45.716-40.859-45.716H98.566c-31.716 0-40.573 10.858-40.573 45.716v192.293c67.717 35.43 125.72 29.144 157.435 28.001 13.429-.286 22.001 2.286 27.144 7.715 1.689 1.687 10.023 9.446 20.287 17.143 1.143-15.715 10.001-25.715 33.716-24.858 32.287 1.428 91.718 7.715 160.577-29.716V72.288zM331.146 153.72c-34.002 0-61.716 25.715-61.716 57.716 0 31.716 27.715 57.717 61.716 57.717 34.287 0 61.716-26.001 61.716-57.717 0-32.001-27.429-57.716-61.716-57.716z"],snapchat:[496,512,[],"f2ab","M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm169.5 338.9c-3.5 8.1-18.1 14-44.8 18.2-1.4 1.9-2.5 9.8-4.3 15.9-1.1 3.7-3.7 5.9-8.1 5.9h-.2c-6.2 0-12.8-2.9-25.8-2.9-17.6 0-23.7 4-37.4 13.7-14.5 10.3-28.4 19.1-49.2 18.2-21 1.6-38.6-11.2-48.5-18.2-13.8-9.7-19.8-13.7-37.4-13.7-12.5 0-20.4 3.1-25.8 3.1-5.4 0-7.5-3.3-8.3-6-1.8-6.1-2.9-14.1-4.3-16-13.8-2.1-44.8-7.5-45.5-21.4-.2-3.6 2.3-6.8 5.9-7.4 46.3-7.6 67.1-55.1 68-57.1 0-.1.1-.2.2-.3 2.5-5 3-9.2 1.6-12.5-3.4-7.9-17.9-10.7-24-13.2-15.8-6.2-18-13.4-17-18.3 1.6-8.5 14.4-13.8 21.9-10.3 5.9 2.8 11.2 4.2 15.7 4.2 3.3 0 5.5-.8 6.6-1.4-1.4-23.9-4.7-58 3.8-77.1C183.1 100 230.7 96 244.7 96c.6 0 6.1-.1 6.7-.1 34.7 0 68 17.8 84.3 54.3 8.5 19.1 5.2 53.1 3.8 77.1 1.1.6 2.9 1.3 5.7 1.4 4.3-.2 9.2-1.6 14.7-4.2 4-1.9 9.6-1.6 13.6 0 6.3 2.3 10.3 6.8 10.4 11.9.1 6.5-5.7 12.1-17.2 16.6-1.4.6-3.1 1.1-4.9 1.7-6.5 2.1-16.4 5.2-19 11.5-1.4 3.3-.8 7.5 1.6 12.5.1.1.1.2.2.3.9 2 21.7 49.5 68 57.1 4 1 7.1 5.5 4.9 10.8z"],"snapchat-ghost":[512,512,[],"f2ac","M510.846 392.673c-5.211 12.157-27.239 21.089-67.36 27.318-2.064 2.786-3.775 14.686-6.507 23.956-1.625 5.566-5.623 8.869-12.128 8.869l-.297-.005c-9.395 0-19.203-4.323-38.852-4.323-26.521 0-35.662 6.043-56.254 20.588-21.832 15.438-42.771 28.764-74.027 27.399-31.646 2.334-58.025-16.908-72.871-27.404-20.714-14.643-29.828-20.582-56.241-20.582-18.864 0-30.736 4.72-38.852 4.72-8.073 0-11.213-4.922-12.422-9.04-2.703-9.189-4.404-21.263-6.523-24.13-20.679-3.209-67.31-11.344-68.498-32.15a10.627 10.627 0 0 1 8.877-11.069c69.583-11.455 100.924-82.901 102.227-85.934.074-.176.155-.344.237-.515 3.713-7.537 4.544-13.849 2.463-18.753-5.05-11.896-26.872-16.164-36.053-19.796-23.715-9.366-27.015-20.128-25.612-27.504 2.437-12.836 21.725-20.735 33.002-15.453 8.919 4.181 16.843 6.297 23.547 6.297 5.022 0 8.212-1.204 9.96-2.171-2.043-35.936-7.101-87.29 5.687-115.969C158.122 21.304 229.705 15.42 250.826 15.42c.944 0 9.141-.089 10.11-.089 52.148 0 102.254 26.78 126.723 81.643 12.777 28.65 7.749 79.792 5.695 116.009 1.582.872 4.357 1.942 8.599 2.139 6.397-.286 13.815-2.389 22.069-6.257 6.085-2.846 14.406-2.461 20.48.058l.029.01c9.476 3.385 15.439 10.215 15.589 17.87.184 9.747-8.522 18.165-25.878 25.018-2.118.835-4.694 1.655-7.434 2.525-9.797 3.106-24.6 7.805-28.616 17.271-2.079 4.904-1.256 11.211 2.46 18.748.087.168.166.342.239.515 1.301 3.03 32.615 74.46 102.23 85.934 6.427 1.058 11.163 7.877 7.725 15.859z"],"snapchat-square":[448,512,[],"f2ad","M400 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zm-6.5 314.9c-3.5 8.1-18.1 14-44.8 18.2-1.4 1.9-2.5 9.8-4.3 15.9-1.1 3.7-3.7 5.9-8.1 5.9h-.2c-6.2 0-12.8-2.9-25.8-2.9-17.6 0-23.7 4-37.4 13.7-14.5 10.3-28.4 19.1-49.2 18.2-21 1.6-38.6-11.2-48.5-18.2-13.8-9.7-19.8-13.7-37.4-13.7-12.5 0-20.4 3.1-25.8 3.1-5.4 0-7.5-3.3-8.3-6-1.8-6.1-2.9-14.1-4.3-16-13.8-2.1-44.8-7.5-45.5-21.4-.2-3.6 2.3-6.8 5.9-7.4 46.3-7.6 67.1-55.1 68-57.1 0-.1.1-.2.2-.3 2.5-5 3-9.2 1.6-12.5-3.4-7.9-17.9-10.7-24-13.2-15.8-6.2-18-13.4-17-18.3 1.6-8.5 14.4-13.8 21.9-10.3 5.9 2.8 11.2 4.2 15.7 4.2 3.3 0 5.5-.8 6.6-1.4-1.4-23.9-4.7-58 3.8-77.1C159.1 100 206.7 96 220.7 96c.6 0 6.1-.1 6.7-.1 34.7 0 68 17.8 84.3 54.3 8.5 19.1 5.2 53.1 3.8 77.1 1.1.6 2.9 1.3 5.7 1.4 4.3-.2 9.2-1.6 14.7-4.2 4-1.9 9.6-1.6 13.6 0 6.3 2.3 10.3 6.8 10.4 11.9.1 6.5-5.7 12.1-17.2 16.6-1.4.6-3.1 1.1-4.9 1.7-6.5 2.1-16.4 5.2-19 11.5-1.4 3.3-.8 7.5 1.6 12.5.1.1.1.2.2.3.9 2 21.7 49.5 68 57.1 4 1 7.1 5.5 4.9 10.8z"],soundcloud:[640,512,[],"f1be","M111.4 256.3l5.8 65-5.8 68.3c-.3 2.5-2.2 4.4-4.4 4.4s-4.2-1.9-4.2-4.4l-5.6-68.3 5.6-65c0-2.2 1.9-4.2 4.2-4.2 2.2 0 4.1 2 4.4 4.2zm21.4-45.6c-2.8 0-4.7 2.2-5 5l-5 105.6 5 68.3c.3 2.8 2.2 5 5 5 2.5 0 4.7-2.2 4.7-5l5.8-68.3-5.8-105.6c0-2.8-2.2-5-4.7-5zm25.5-24.1c-3.1 0-5.3 2.2-5.6 5.3l-4.4 130 4.4 67.8c.3 3.1 2.5 5.3 5.6 5.3 2.8 0 5.3-2.2 5.3-5.3l5.3-67.8-5.3-130c0-3.1-2.5-5.3-5.3-5.3zM7.2 283.2c-1.4 0-2.2 1.1-2.5 2.5L0 321.3l4.7 35c.3 1.4 1.1 2.5 2.5 2.5s2.2-1.1 2.5-2.5l5.6-35-5.6-35.6c-.3-1.4-1.1-2.5-2.5-2.5zm23.6-21.9c-1.4 0-2.5 1.1-2.5 2.5l-6.4 57.5 6.4 56.1c0 1.7 1.1 2.8 2.5 2.8s2.5-1.1 2.8-2.5l7.2-56.4-7.2-57.5c-.3-1.4-1.4-2.5-2.8-2.5zm25.3-11.4c-1.7 0-3.1 1.4-3.3 3.3L47 321.3l5.8 65.8c.3 1.7 1.7 3.1 3.3 3.1 1.7 0 3.1-1.4 3.1-3.1l6.9-65.8-6.9-68.1c0-1.9-1.4-3.3-3.1-3.3zm25.3-2.2c-1.9 0-3.6 1.4-3.6 3.6l-5.8 70 5.8 67.8c0 2.2 1.7 3.6 3.6 3.6s3.6-1.4 3.9-3.6l6.4-67.8-6.4-70c-.3-2.2-2-3.6-3.9-3.6zm241.4-110.9c-1.1-.8-2.8-1.4-4.2-1.4-2.2 0-4.2.8-5.6 1.9-1.9 1.7-3.1 4.2-3.3 6.7v.8l-3.3 176.7 1.7 32.5 1.7 31.7c.3 4.7 4.2 8.6 8.9 8.6s8.6-3.9 8.6-8.6l3.9-64.2-3.9-177.5c-.4-3-2-5.8-4.5-7.2zm-26.7 15.3c-1.4-.8-2.8-1.4-4.4-1.4s-3.1.6-4.4 1.4c-2.2 1.4-3.6 3.9-3.6 6.7l-.3 1.7-2.8 160.8s0 .3 3.1 65.6v.3c0 1.7.6 3.3 1.7 4.7 1.7 1.9 3.9 3.1 6.4 3.1 2.2 0 4.2-1.1 5.6-2.5 1.7-1.4 2.5-3.3 2.5-5.6l.3-6.7 3.1-58.6-3.3-162.8c-.3-2.8-1.7-5.3-3.9-6.7zm-111.4 22.5c-3.1 0-5.8 2.8-5.8 6.1l-4.4 140.6 4.4 67.2c.3 3.3 2.8 5.8 5.8 5.8 3.3 0 5.8-2.5 6.1-5.8l5-67.2-5-140.6c-.2-3.3-2.7-6.1-6.1-6.1zm376.7 62.8c-10.8 0-21.1 2.2-30.6 6.1-6.4-70.8-65.8-126.4-138.3-126.4-17.8 0-35 3.3-50.3 9.4-6.1 2.2-7.8 4.4-7.8 9.2v249.7c0 5 3.9 8.6 8.6 9.2h218.3c43.3 0 78.6-35 78.6-78.3.1-43.6-35.2-78.9-78.5-78.9zm-296.7-60.3c-4.2 0-7.5 3.3-7.8 7.8l-3.3 136.7 3.3 65.6c.3 4.2 3.6 7.5 7.8 7.5 4.2 0 7.5-3.3 7.5-7.5l3.9-65.6-3.9-136.7c-.3-4.5-3.3-7.8-7.5-7.8zm-53.6-7.8c-3.3 0-6.4 3.1-6.4 6.7l-3.9 145.3 3.9 66.9c.3 3.6 3.1 6.4 6.4 6.4 3.6 0 6.4-2.8 6.7-6.4l4.4-66.9-4.4-145.3c-.3-3.6-3.1-6.7-6.7-6.7zm26.7 3.4c-3.9 0-6.9 3.1-6.9 6.9L227 321.3l3.9 66.4c.3 3.9 3.1 6.9 6.9 6.9s6.9-3.1 6.9-6.9l4.2-66.4-4.2-141.7c0-3.9-3-6.9-6.9-6.9z"],speakap:[448,512,[],"f3f3","M352 32H96C43.2 32 0 75.2 0 128v256c0 52.8 43.2 96 96 96h256c52.8 0 96-43.2 96-96V128c0-52.8-43.2-96-96-96zM221 382.9c-39.6 0-81.9-17.8-81.9-53.7V302H179v17.8c0 15.1 19.5 24.5 41.9 24.5 24.2 0 41.3-10.4 41.3-29.5 0-23.8-27.2-31.9-54.7-42.6-31.9-12.4-63.1-26.2-63.1-69.1 0-48 38.6-66.4 79.9-66.4 37.6 0 75.5 14.1 75.5 41.9v31.2h-39.9v-16.1c0-12.1-17.8-18.5-35.6-18.5-19.5 0-35.6 8.1-35.6 26.2 0 22.1 22.5 29.2 47 38.9 35.9 12.4 71.1 27.2 71.1 71.5.1 48.6-40.8 71.1-85.8 71.1z"],spotify:[496,512,[],"f1bc","M248 8C111.1 8 0 119.1 0 256s111.1 248 248 248 248-111.1 248-248S384.9 8 248 8zm100.7 364.9c-4.2 0-6.8-1.3-10.7-3.6-62.4-37.6-135-39.2-206.7-24.5-3.9 1-9 2.6-11.9 2.6-9.7 0-15.8-7.7-15.8-15.8 0-10.3 6.1-15.2 13.6-16.8 81.9-18.1 165.6-16.5 237 26.2 6.1 3.9 9.7 7.4 9.7 16.5s-7.1 15.4-15.2 15.4zm26.9-65.6c-5.2 0-8.7-2.3-12.3-4.2-62.5-37-155.7-51.9-238.6-29.4-4.8 1.3-7.4 2.6-11.9 2.6-10.7 0-19.4-8.7-19.4-19.4s5.2-17.8 15.5-20.7c27.8-7.8 56.2-13.6 97.8-13.6 64.9 0 127.6 16.1 177 45.5 8.1 4.8 11.3 11 11.3 19.7-.1 10.8-8.5 19.5-19.4 19.5zm31-76.2c-5.2 0-8.4-1.3-12.9-3.9-71.2-42.5-198.5-52.7-280.9-29.7-3.6 1-8.1 2.6-12.9 2.6-13.2 0-23.3-10.3-23.3-23.6 0-13.6 8.4-21.3 17.4-23.9 35.2-10.3 74.6-15.2 117.5-15.2 73 0 149.5 15.2 205.4 47.8 7.8 4.5 12.9 10.7 12.9 22.6 0 13.6-11 23.3-23.2 23.3z"],"stack-exchange":[448,512,[],"f18d","M43.5 322.8h361.1V342c0 33-25.7 59.5-57.2 59.5h-16.6L254.9 480v-78.5H100.6c-31.5 0-57.2-26.5-57.2-59.5v-19.2zm0-20.7h361.1v-74.4H43.5v74.4zm0-95.7h361.1V132H43.5v74.4zM347.4 32H100.6c-31.5 0-57.2 26.5-57.2 59.2v19.5h361.1V91.2c0-32.7-25.6-59.2-57.1-59.2z"],"stack-overflow":[384,512,[],"f16c","M293.7 300l-181.2-84.5 16.7-36.5 181.3 84.7-16.8 36.3zm48-76L188.2 95.7l-25.5 30.8 153.5 128.3 25.5-30.8zm39.6-31.7L262 32l-32 24 119.3 160.3 32-24zM290.7 311L95 269.7 86.8 309l195.7 41 8.2-39zm31.6 129H42.7V320h-40v160h359.5V320h-40v120zm-39.8-80h-200v39.7h200V360z"],staylinked:[440,512,[],"f3f5","M201.6 127.4c4.1-3.2 10.3-3 13.8.5l170 167.3-2.7-2.7 44.3 41.3c3.7 3.5 3.3 9-.7 12.2l-198 163.9c-9.9 7.6-17.3.8-17.3.8L2.3 314.6c-3.5-3.5-3-9 1.2-12.2l45.8-34.9c4.2-3.2 10.4-3 13.9.5l151.9 147.5c3.7 3.5 10 3.7 14.2.4l93.2-74c4.1-3.2 4.5-8.7.9-12.2l-84-81.3c-3.6-3.5-9.9-3.7-14-.5l-.1.1c-4.1 3.2-10.4 3-14-.5l-68.1-64.3c-3.5-3.5-3.1-9 1.1-12.2l57.3-43.6m14.8 257.3c3.7 3.5 10.1 3.7 14.3.4l50.2-38.8-.3-.3 7.7-6c4.2-3.2 4.6-8.7.9-12.2l-57.1-54.4c-3.6-3.5-10-3.7-14.2-.5l-.1.1c-4.2 3.2-10.5 3.1-14.2-.4L109 180.8c-3.6-3.5-3.1-8.9 1.1-12.2l92.2-71.5c4.1-3.2 10.3-3 13.9.5l160.4 159c3.7 3.5 10 3.7 14.1.5l45.8-35.8c4.1-3.2 4.4-8.7.7-12.2L226.7 2.5c-1.5-1.2-8-5.5-16.3 1.1L3.6 165.7c-4.2 3.2-4.8 8.7-1.2 12.2l42.3 41.7"],steam:[496,512,[],"f1b6","M496 256c0 137-111.2 248-248.4 248-113.8 0-209.6-76.3-239-180.4l95.2 39.3c6.4 32.1 34.9 56.4 68.9 56.4 39.2 0 71.9-32.4 70.2-73.5l84.5-60.2c52.1 1.3 95.8-40.9 95.8-93.5 0-51.6-42-93.5-93.7-93.5s-93.7 42-93.7 93.5v1.2L176.6 279c-15.5-.9-30.7 3.4-43.5 12.1L0 236.1C10.2 108.4 117.1 8 247.6 8 384.8 8 496 119 496 256zM155.7 384.3l-30.5-12.6a52.79 52.79 0 0 0 27.2 25.8c26.9 11.2 57.8-1.6 69-28.4 5.4-13 5.5-27.3.1-40.3-5.4-13-15.5-23.2-28.5-28.6-12.9-5.4-26.7-5.2-38.9-.6l31.5 13c19.8 8.2 29.2 30.9 20.9 50.7-8.3 19.9-31 29.2-50.8 21zm173.8-129.9c-34.4 0-62.4-28-62.4-62.3s28-62.3 62.4-62.3 62.4 28 62.4 62.3-27.9 62.3-62.4 62.3zm.1-15.6c25.9 0 46.9-21 46.9-46.8 0-25.9-21-46.8-46.9-46.8s-46.9 21-46.9 46.8c.1 25.8 21.1 46.8 46.9 46.8z"],"steam-square":[448,512,[],"f1b7","M185.2 356.5c7.7-18.5-1-39.7-19.6-47.4l-29.5-12.2c11.4-4.3 24.3-4.5 36.4.5 12.2 5.1 21.6 14.6 26.7 26.7 5 12.2 5 25.6-.1 37.7-10.5 25.1-39.4 37-64.6 26.5-11.6-4.8-20.4-13.6-25.4-24.2l28.5 11.8c18.6 7.8 39.9-.9 47.6-19.4zM400 32H48C21.5 32 0 53.5 0 80v160.7l116.6 48.1c12-8.2 26.2-12.1 40.7-11.3l55.4-80.2v-1.1c0-48.2 39.3-87.5 87.6-87.5s87.6 39.3 87.6 87.5c0 49.2-40.9 88.7-89.6 87.5l-79 56.3c1.6 38.5-29.1 68.8-65.7 68.8-31.8 0-58.5-22.7-64.5-52.7L0 319.2V432c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zm-99.7 222.5c-32.2 0-58.4-26.1-58.4-58.3s26.2-58.3 58.4-58.3 58.4 26.2 58.4 58.3-26.2 58.3-58.4 58.3zm.1-14.6c24.2 0 43.9-19.6 43.9-43.8 0-24.2-19.6-43.8-43.9-43.8-24.2 0-43.9 19.6-43.9 43.8 0 24.2 19.7 43.8 43.9 43.8z"],"steam-symbol":[448,512,[],"f3f6","M395.5 177.5c0 33.8-27.5 61-61 61-33.8 0-61-27.3-61-61s27.3-61 61-61c33.5 0 61 27.2 61 61zm52.5.2c0 63-51 113.8-113.7 113.8L225 371.3c-4 43-40.5 76.8-84.5 76.8-40.5 0-74.7-28.8-83-67L0 358V250.7L97.2 290c15.1-9.2 32.2-13.3 52-11.5l71-101.7c.5-62.3 51.5-112.8 114-112.8C397 64 448 115 448 177.7zM203 363c0-34.7-27.8-62.5-62.5-62.5-4.5 0-9 .5-13.5 1.5l26 10.5c25.5 10.2 38 39 27.7 64.5-10.2 25.5-39.2 38-64.7 27.5-10.2-4-20.5-8.3-30.7-12.2 10.5 19.7 31.2 33.2 55.2 33.2 34.7 0 62.5-27.8 62.5-62.5zm207.5-185.3c0-42-34.3-76.2-76.2-76.2-42.3 0-76.5 34.2-76.5 76.2 0 42.2 34.3 76.2 76.5 76.2 41.9.1 76.2-33.9 76.2-76.2z"],"sticker-mule":[576,512,[],"f3f7","M353.1 509.8c-5.9 2.9-32.1 3.2-36.5-.5-4.1-3-2.2-11.9-1.5-15 2.2-15-2.5-7.9-9.8-11.5-3.1-1.5-4.1-5.5-4.6-10-.5-1.5-1-2.5-1.5-3.5-1.7-10.7 6.8-33.6 8.2-43.4 4.9-23.7-.7-37.2 1.5-46.9 3.7-16.2 4.1-3.5 4.1-29.9-1.4-25.9 3.3-36.9.5-38.9-14.8 0-64.3 10.7-112.2 2-46.1-8.9-59.4-29-65.4-30.9-10.3-4.5-23.2.5-27.3 7-.1.1-35 70.6-39.6 87.8-6.2 20.5-.5 47.4 4.1 66.8 0 .1 4.5 14.6 10.3 19.5 2.1 1.5 5.1 2.5 7.2 4.5 2.8 2.7 9.4 15.2 9.8 16 2.6 4.5 3.6 8-1.5 10.5-3.6 2-9.3 2.5-14.4 2.5-2.6.5-1.5 3.5-3.1 5-2.9 2.8-20.7 6.1-29.9 2.5-2.6-1-5.7-3-6.2-5-1.5-4 2.1-9-1-12.5-4.5-2.9-13.1-2-17-12-2.2-5.4-2.6-7.6-2.6-49.4 0-9.7-5.9-38.7-8.2-46.9-1.5-5.5-1.5-11.5 0-16 .3-.9 4.1-4.6 4.1-13-1-1.5-4.6-.5-5.1-1.5-10.4-80.6-5.9-79-7.7-98.3-1.5-16-10.9-43.9-6.7-64.3.5-2.4 3.4-21 24.2-38.9 31-26.7 48.4-38.3 159-11.5 1.1.4 66.3 21.1 110.7-9 15.5-11.3 28.8-11.3 35.5-16 .1-.1 61.7-52.1 87-65.3 47.2-29.4 69.9-16.7 75.1-18 4.7-1 13.4-25.8 17-25.8 5.5 0 1.6 20.2 3.6 25.9.5 2 3.6 5 6.2 5 2.3 0 1.7-.8 10.3-5 8.4-5.4 14.9-17.6 20.6-17 11.7 1.6-19 41.6-19 46.9 0 2 .2.8 4.6 9.5 2.6 5.5 4.6 13.5 6.2 20 8.3 29.7 5.7 14.6 13.4 36.9 20.2 50.1 20.6 45.2 20.6 52.9 0 7.5-4.1 11-7.2 16.5-1.5 3-4.6 7.5-7.2 8-2.7.7 7-1.5-13.4 2.5-7.2 1-13.4-4.5-14.9-9.5-1.6-4.7 2.8-10.1-11.8-22.9-10.3-10-21.1-11.3-31.9-17-9.8-5.7-11.9 1-18 8-18 22.9-34 46.9-52 69.8-11.8 15-24.2 30.4-33.5 47.4-3.9 6.8-9.5 28.1-10.3 29.9-6.2 17.7-5.5 25.8-16.5 68.3-3.1 10-5.7 21.4-8.7 32.4-2.2 6.8-7.4 49.3-.5 59.4 2.1 3.5 8.7 4.5 11.3 8 .1.1 9.6 18.2 9.3 20 0 6.1-9.4 5.6-11.3 6.5-4.8 2.9-3.8 5.9-6.4 7.4"],strava:[369,512,[],"f428","M301.6 292l-43.9 88.2-44.6-88.2h-67.6l112.2 220 111.5-220h-67.6zM151.4 0L0 292h89.2l62.2-116.1L213.1 292h88.5L151.4 0z"],stripe:[640,512,[],"f429","M640 233.6c0-45.5-22-81.4-64.2-81.4s-67.9 35.9-67.9 81.1c0 53.5 30.3 78.2 73.5 78.2 21.2 0 37.1-4.8 49.2-11.5v-33.4c-12.1 6.1-26 9.8-43.6 9.8-17.3 0-32.5-6.1-34.5-26.9h86.9c.2-2.3.6-11.6.6-15.9m-87.9-16.8c0-20 12.3-28.4 23.4-28.4 10.9 0 22.5 8.4 22.5 28.4h-45.9zm-112.9-64.6c-17.4 0-28.6 8.2-34.8 13.9l-2.3-11H363v204.8l44.4-9.4.1-50.2c6.4 4.7 15.9 11.2 31.4 11.2 31.8 0 60.8-23.2 60.8-79.6.1-51.6-29.3-79.7-60.5-79.7m-10.6 122.5c-10.4 0-16.6-3.8-20.9-8.4l-.3-66c4.6-5.1 11-8.8 21.2-8.8 16.2 0 27.4 18.2 27.4 41.4.1 23.9-10.9 41.8-27.4 41.8M346.4 96v36.2l-44.6 9.5v-36.2l44.6-9.5m-44.5 59.2h44.6v153.2h-44.6V155.2zm-47.8 13.1c10.4-19.1 31.1-15.2 37.1-13.1V196c-5.7-1.8-23.4-4.5-33.9 9.3v103.1H213V155.2h38.4l2.7 13.1m-89-13.1h33.7V193h-33.7v63.2c0 26.2 28 18 33.7 15.7v33.8c-5.9 3.2-16.6 5.9-31.2 5.9-26.3 0-46.1-17-46.1-43.3l.2-142.4 43.3-9.2.1 38.5zM44.9 200.3c0 20 67.9 10.5 67.9 63.4 0 32-25.4 47.8-62.3 47.8-15.3 0-32-3-48.5-10.1v-40c14.9 8.1 33.9 14.2 48.6 14.2 9.9 0 17-2.7 17-10.9 0-21.2-67.5-13.2-67.5-62.4 0-31.4 24-50.2 60-50.2 14.7 0 29.4 2.3 44.1 8.1V202c-13.5-7.3-30.7-11.4-44.2-11.4-9.3.1-15.1 2.8-15.1 9.7"],"stripe-s":[362,512,[],"f42a","M144.3 154.6c0-22.3 18.6-30.9 48.4-30.9 43.4 0 98.5 13.3 141.9 36.7V26.1C287.3 7.2 240.1 0 192.8 0 77.1 0 0 60.4 0 161.4c0 157.9 216.8 132.3 216.8 200.4 0 26.4-22.9 34.9-54.7 34.9-47.2 0-108.2-19.5-156.1-45.5v128.5c53 22.8 106.8 32.4 156 32.4 118.6 0 200.3-51 200.3-153.6 0-170.2-218-139.7-218-203.9"],studiovinari:[512,512,[],"f3f8","M480.3 187.7l4.2 28v28l-25.1 44.1-39.8 78.4-56.1 67.5-79.1 37.8-17.7 24.5-7.7 12-9.6 4s17.3-63.6 19.4-63.6c2.1 0 20.3.7 20.3.7l66.7-38.6-92.5 26.1-55.9 36.8-22.8 28-6.6 1.4 20.8-73.6 6.9-5.5 20.7 12.9 88.3-45.2 56.8-51.5 14.8-68.4-125.4 23.3 15.2-18.2-173.4-53.3 81.9-10.5-166-122.9L133.5 108 32.2 0l252.9 126.6-31.5-38L378 163 234.7 64l18.7 38.4-49.6-18.1L158.3 0l194.6 122L310 66.2l108 96.4 12-8.9-21-16.4 4.2-37.8L451 89.1l29.2 24.7 11.5 4.2-7 6.2 8.5 12-13.1 7.4-10.3 20.2 10.5 23.9z"],stumbleupon:[512,512,[],"f1a4","M502.9 266v69.7c0 62.1-50.3 112.4-112.4 112.4-61.8 0-112.4-49.8-112.4-111.3v-70.2l34.3 16 51.1-15.2V338c0 14.7 12 26.5 26.7 26.5S417 352.7 417 338v-72h85.9zm-224.7-58.2l34.3 16 51.1-15.2V173c0-60.5-51.1-109-112.1-109-60.8 0-112.1 48.2-112.1 108.2v162.4c0 14.9-12 26.7-26.7 26.7S86 349.5 86 334.6V266H0v69.7C0 397.7 50.3 448 112.4 448c61.6 0 112.4-49.5 112.4-110.8V176.9c0-14.7 12-26.7 26.7-26.7s26.7 12 26.7 26.7v30.9z"],"stumbleupon-circle":[496,512,[],"f1a3","M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8zm0 177.5c-9.8 0-17.8 8-17.8 17.8v106.9c0 40.9-33.9 73.9-74.9 73.9-41.4 0-74.9-33.5-74.9-74.9v-46.5h57.3v45.8c0 10 8 17.8 17.8 17.8s17.8-7.9 17.8-17.8V200.1c0-40 34.2-72.1 74.7-72.1 40.7 0 74.7 32.3 74.7 72.6v23.7l-34.1 10.1-22.9-10.7v-20.6c.1-9.6-7.9-17.6-17.7-17.6zm167.6 123.6c0 41.4-33.5 74.9-74.9 74.9-41.2 0-74.9-33.2-74.9-74.2V263l22.9 10.7 34.1-10.1v47.1c0 9.8 8 17.6 17.8 17.6s17.8-7.9 17.8-17.6v-48h57.3c-.1 45.9-.1 46.4-.1 46.4z"],superpowers:[448,512,[],"f2dd","M448 32c-83.3 11-166.8 22-250 33-92 12.5-163.3 86.7-169 180-3.3 55.5 18 109.5 57.8 148.2L0 480c83.3-11 166.5-22 249.8-33 91.8-12.5 163.3-86.8 168.7-179.8 3.5-55.5-18-109.5-57.7-148.2L448 32zm-79.7 232.3c-4.2 79.5-74 139.2-152.8 134.5-79.5-4.7-140.7-71-136.3-151 4.5-79.2 74.3-139.3 153-134.5 79.3 4.7 140.5 71 136.1 151z"],supple:[640,512,[],"f3f9","M640 262.5c0 64.1-109 116.1-243.5 116.1-24.8 0-48.6-1.8-71.1-5 7.7.4 15.5.6 23.4.6 134.5 0 243.5-56.9 243.5-127.1 0-29.4-19.1-56.4-51.2-78 60 21.1 98.9 55.1 98.9 93.4zM47.7 227.9c-.1-70.2 108.8-127.3 243.3-127.6 7.9 0 15.6.2 23.3.5-22.5-3.2-46.3-4.9-71-4.9C108.8 96.3-.1 148.5 0 212.6c.1 38.3 39.1 72.3 99.3 93.3-32.3-21.5-51.5-48.6-51.6-78zm60.2 39.9s10.5 13.2 29.3 13.2c17.9 0 28.4-11.5 28.4-25.1 0-28-40.2-25.1-40.2-39.7 0-5.4 5.3-9.1 12.5-9.1 5.7 0 11.3 2.6 11.3 6.6v3.9h14.2v-7.9c0-12.1-15.4-16.8-25.4-16.8-16.5 0-28.5 10.2-28.5 24.1 0 26.6 40.2 25.4 40.2 39.9 0 6.6-5.8 10.1-12.3 10.1-11.9 0-20.7-10.1-20.7-10.1l-8.8 10.9zm120.8-73.6v54.4c0 11.3-7.1 17.8-17.8 17.8-10.7 0-17.8-6.5-17.8-17.7v-54.5h-15.8v55c0 18.9 13.4 31.9 33.7 31.9 20.1 0 33.4-13 33.4-31.9v-55h-15.7zm34.4 85.4h15.8v-29.5h15.5c16 0 27.2-11.5 27.2-28.1s-11.2-27.8-27.2-27.8h-39.1v13.4h7.8v72zm15.8-43v-29.1h12.9c8.7 0 13.7 5.7 13.7 14.4 0 8.9-5.1 14.7-14 14.7h-12.6zm57 43h15.8v-29.5h15.5c16 0 27.2-11.5 27.2-28.1s-11.2-27.8-27.2-27.8h-39.1v13.4h7.8v72zm15.7-43v-29.1h12.9c8.7 0 13.7 5.7 13.7 14.4 0 8.9-5 14.7-14 14.7h-12.6zm57.1 34.8c0 5.8 2.4 8.2 8.2 8.2h37.6c5.8 0 8.2-2.4 8.2-8.2v-13h-14.3v5.2c0 1.7-1 2.6-2.6 2.6h-18.6c-1.7 0-2.6-1-2.6-2.6v-61.2c0-5.7-2.4-8.2-8.2-8.2H401v13.4h5.2c1.7 0 2.6 1 2.6 2.6v61.2zm63.4 0c0 5.8 2.4 8.2 8.2 8.2H519c5.7 0 8.2-2.4 8.2-8.2v-13h-14.3v5.2c0 1.7-1 2.6-2.6 2.6h-19.7c-1.7 0-2.6-1-2.6-2.6v-20.3h27.7v-13.4H488v-22.4h19.2c1.7 0 2.6 1 2.6 2.6v5.2H524v-13c0-5.7-2.5-8.2-8.2-8.2h-51.6v13.4h7.8v63.9zm58.9-76v5.9h1.6v-5.9h2.7v-1.2h-7v1.2h2.7zm5.7-1.2v7.1h1.5v-5.7l2.3 5.7h1.3l2.3-5.7v5.7h1.5v-7.1h-2.3l-2.1 5.1-2.1-5.1h-2.4z"],telegram:[496,512,[],"f2c6","M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm121.8 169.9l-40.7 191.8c-3 13.6-11.1 16.9-22.4 10.5l-62-45.7-29.9 28.8c-3.3 3.3-6.1 6.1-12.5 6.1l4.4-63.1 114.9-103.8c5-4.4-1.1-6.9-7.7-2.5l-142 89.4-61.2-19.1c-13.3-4.2-13.6-13.3 2.8-19.7l239.1-92.2c11.1-4 20.8 2.7 17.2 19.5z"],"telegram-plane":[448,512,[],"f3fe","M446.7 98.6l-67.6 318.8c-5.1 22.5-18.4 28.1-37.3 17.5l-103-75.9-49.7 47.8c-5.5 5.5-10.1 10.1-20.7 10.1l7.4-104.9 190.9-172.5c8.3-7.4-1.8-11.5-12.9-4.1L117.8 284 16.2 252.2c-22.1-6.9-22.5-22.1 4.6-32.7L418.2 66.4c18.4-6.9 34.5 4.1 28.5 32.2z"],"tencent-weibo":[384,512,[],"f1d5","M72.3 495.8c1.4 19.9-27.6 22.2-29.7 2.9C31 368.8 73.7 259.2 144 185.5c-15.6-34 9.2-77.1 50.6-77.1 30.3 0 55.1 24.6 55.1 55.1 0 44-49.5 70.8-86.9 45.1-65.7 71.3-101.4 169.8-90.5 287.2zM192 .1C66.1.1-12.3 134.3 43.7 242.4 52.4 259.8 79 246.9 70 229 23.7 136.4 91 29.8 192 29.8c75.4 0 136.9 61.4 136.9 136.9 0 90.8-86.9 153.9-167.7 133.1-19.1-4.1-25.6 24.4-6.6 29.1 110.7 23.2 204-60 204-162.3C358.6 74.7 284 .1 192 .1z"],themeisle:[512,512,[],"f2b2","M208 88.286c0-10 6.286-21.714 17.715-21.714 11.142 0 17.714 11.714 17.714 21.714 0 10.285-6.572 21.714-17.714 21.714C214.286 110 208 98.571 208 88.286zm304 160c0 36.001-11.429 102.286-36.286 129.714-22.858 24.858-87.428 61.143-120.857 70.572l-1.143.286v32.571c0 16.286-12.572 30.571-29.143 30.571-10 0-19.429-5.714-24.572-14.286-5.427 8.572-14.856 14.286-24.856 14.286-10 0-19.429-5.714-24.858-14.286-5.142 8.572-14.571 14.286-24.57 14.286-10.286 0-19.429-5.714-24.858-14.286-5.143 8.572-14.571 14.286-24.571 14.286-18.857 0-29.429-15.714-29.429-32.857-16.286 12.285-35.715 19.428-56.571 19.428-22 0-43.429-8.285-60.286-22.857 10.285-.286 20.571-2.286 30.285-5.714-20.857-5.714-39.428-18.857-52-36.286 21.37 4.645 46.209 1.673 67.143-11.143-22-22-56.571-58.857-68.572-87.428C1.143 321.714 0 303.714 0 289.429c0-49.714 20.286-160 86.286-160 10.571 0 18.857 4.858 23.143 14.857a158.792 158.792 0 0 1 12-15.428c2-2.572 5.714-5.429 7.143-8.286 7.999-12.571 11.714-21.142 21.714-34C182.571 45.428 232 17.143 285.143 17.143c6 0 12 .285 17.714 1.143C313.714 6.571 328.857 0 344.572 0c14.571 0 29.714 6 40 16.286.857.858 1.428 2.286 1.428 3.428 0 3.714-10.285 13.429-12.857 16.286 4.286 1.429 15.714 6.858 15.714 12 0 2.857-2.857 5.143-4.571 7.143 31.429 27.714 49.429 67.143 56.286 108 4.286-5.143 10.285-8.572 17.143-8.572 10.571 0 20.857 7.144 28.571 14.001C507.143 187.143 512 221.714 512 248.286zM188 89.428c0 18.286 12.571 37.143 32.286 37.143 19.714 0 32.285-18.857 32.285-37.143 0-18-12.571-36.857-32.285-36.857-19.715 0-32.286 18.858-32.286 36.857zM237.714 194c0-19.714 3.714-39.143 8.571-58.286-52.039 79.534-13.531 184.571 68.858 184.571 21.428 0 42.571-7.714 60-20 2-7.429 3.714-14.857 3.714-22.572 0-14.286-6.286-21.428-20.572-21.428-4.571 0-9.143.857-13.429 1.714-63.343 12.668-107.142 3.669-107.142-63.999zm-41.142 254.858c0-11.143-8.858-20.857-20.286-20.857-11.429 0-20 9.715-20 20.857v32.571c0 11.143 8.571 21.142 20 21.142 11.428 0 20.286-9.715 20.286-21.142v-32.571zm49.143 0c0-11.143-8.572-20.857-20-20.857-11.429 0-20.286 9.715-20.286 20.857v32.571c0 11.143 8.857 21.142 20.286 21.142 11.428 0 20-10 20-21.142v-32.571zm49.713 0c0-11.143-8.857-20.857-20.285-20.857-11.429 0-20.286 9.715-20.286 20.857v32.571c0 11.143 8.857 21.142 20.286 21.142 11.428 0 20.285-9.715 20.285-21.142v-32.571zm49.715 0c0-11.143-8.857-20.857-20.286-20.857-11.428 0-20.286 9.715-20.286 20.857v32.571c0 11.143 8.858 21.142 20.286 21.142 11.429 0 20.286-10 20.286-21.142v-32.571zM421.714 286c-30.857 59.142-90.285 102.572-158.571 102.572-96.571 0-160.571-84.572-160.571-176.572 0-16.857 2-33.429 6-49.714-20 33.715-29.714 72.572-29.714 111.429 0 60.286 24.857 121.715 71.429 160.857 5.143-9.714 14.857-16.286 26-16.286 10 0 19.428 5.714 24.571 14.286 5.429-8.571 14.571-14.286 24.858-14.286 10 0 19.428 5.714 24.571 14.286 5.429-8.571 14.857-14.286 24.858-14.286 10 0 19.428 5.714 24.857 14.286 5.143-8.571 14.571-14.286 24.572-14.286 10.857 0 20.857 6.572 25.714 16 43.427-36.286 68.569-92 71.426-148.286zm10.572-99.714c0-53.714-34.571-105.714-92.572-105.714-30.285 0-58.571 15.143-78.857 36.857C240.862 183.812 233.41 254 302.286 254c28.805 0 97.357-28.538 84.286 36.857 28.857-26 45.714-65.714 45.714-104.571z"],trello:[448,512,[],"f181","M392 32H56C25.1 32 0 57.1 0 88v336c0 30.9 25.1 56 56 56h336c30.9 0 56-25.1 56-56V88c0-30.9-25.1-56-56-56zM194.9 371.4c0 14.8-12 26.9-26.9 26.9H85.1c-14.8 0-26.9-12-26.9-26.9V117.1c0-14.8 12-26.9 26.9-26.9H168c14.8 0 26.9 12 26.9 26.9v254.3zm194.9-112c0 14.8-12 26.9-26.9 26.9H280c-14.8 0-26.9-12-26.9-26.9V117.1c0-14.8 12-26.9 26.9-26.9h82.9c14.8 0 26.9 12 26.9 26.9v142.3z"],tripadvisor:[576,512,[],"f262","M166.4 280.521c0 13.236-10.73 23.966-23.966 23.966s-23.966-10.73-23.966-23.966 10.73-23.966 23.966-23.966 23.966 10.729 23.966 23.966zm264.962-23.956c-13.23 0-23.956 10.725-23.956 23.956 0 13.23 10.725 23.956 23.956 23.956 13.23 0 23.956-10.725 23.956-23.956-.001-13.231-10.726-23.956-23.956-23.956zm89.388 139.49c-62.667 49.104-153.276 38.109-202.379-24.559l-30.979 46.325-30.683-45.939c-48.277 60.39-135.622 71.891-197.885 26.055-64.058-47.158-77.759-137.316-30.601-201.374A186.762 186.762 0 0 0 0 139.416l90.286-.05a358.48 358.48 0 0 1 197.065-54.03 350.382 350.382 0 0 1 192.181 53.349l96.218.074a185.713 185.713 0 0 0-28.352 57.649c46.793 62.747 34.964 151.37-26.648 199.647zM259.366 281.761c-.007-63.557-51.535-115.075-115.092-115.068C80.717 166.7 29.2 218.228 29.206 281.785c.007 63.557 51.535 115.075 115.092 115.068 63.513-.075 114.984-51.539 115.068-115.052v-.04zm28.591-10.455c5.433-73.44 65.51-130.884 139.12-133.022a339.146 339.146 0 0 0-139.727-27.812 356.31 356.31 0 0 0-140.164 27.253c74.344 1.582 135.299 59.424 140.771 133.581zm251.706-28.767c-21.992-59.634-88.162-90.148-147.795-68.157-59.634 21.992-90.148 88.162-68.157 147.795v.032c22.038 59.607 88.198 90.091 147.827 68.113 59.615-22.004 90.113-88.162 68.125-147.783zm-326.039 37.975v.115c-.057 39.328-31.986 71.163-71.314 71.106-39.328-.057-71.163-31.986-71.106-71.314.057-39.328 31.986-71.163 71.314-71.106 39.259.116 71.042 31.94 71.106 71.199zm-24.512 0v-.084c-.051-25.784-20.994-46.645-46.778-46.594-25.784.051-46.645 20.994-46.594 46.777.051 25.784 20.994 46.645 46.777 46.594 25.726-.113 46.537-20.968 46.595-46.693zm313.423 0v.048c-.02 39.328-31.918 71.194-71.247 71.173s-71.194-31.918-71.173-71.247c.02-39.328 31.918-71.194 71.247-71.173 39.29.066 71.121 31.909 71.173 71.199zm-24.504-.008c-.009-25.784-20.918-46.679-46.702-46.67-25.784.009-46.679 20.918-46.67 46.702.009 25.784 20.918 46.678 46.702 46.67 25.765-.046 46.636-20.928 46.67-46.693v-.009z"],tumblr:[320,512,[],"f173","M309.8 480.3c-13.6 14.5-50 31.7-97.4 31.7-120.8 0-147-88.8-147-140.6v-144H17.9c-5.5 0-10-4.5-10-10v-68c0-7.2 4.5-13.6 11.3-16 62-21.8 81.5-76 84.3-117.1.8-11 6.5-16.3 16.1-16.3h70.9c5.5 0 10 4.5 10 10v115.2h83c5.5 0 10 4.4 10 9.9v81.7c0 5.5-4.5 10-10 10h-83.4V360c0 34.2 23.7 53.6 68 35.8 4.8-1.9 9-3.2 12.7-2.2 3.5.9 5.8 3.4 7.4 7.9l22 64.3c1.8 5 3.3 10.6-.4 14.5z"],"tumblr-square":[448,512,[],"f174","M400 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zm-82.3 364.2c-8.5 9.1-31.2 19.8-60.9 19.8-75.5 0-91.9-55.5-91.9-87.9v-90h-29.7c-3.4 0-6.2-2.8-6.2-6.2v-42.5c0-4.5 2.8-8.5 7.1-10 38.8-13.7 50.9-47.5 52.7-73.2.5-6.9 4.1-10.2 10-10.2h44.3c3.4 0 6.2 2.8 6.2 6.2v72h51.9c3.4 0 6.2 2.8 6.2 6.2v51.1c0 3.4-2.8 6.2-6.2 6.2h-52.1V321c0 21.4 14.8 33.5 42.5 22.4 3-1.2 5.6-2 8-1.4 2.2.5 3.6 2.1 4.6 4.9l13.8 40.2c1 3.2 2 6.7-.3 9.1z"],twitch:[448,512,[],"f1e8","M40.1 32L10 108.9v314.3h107V480h60.2l56.8-56.8h87l117-117V32H40.1zm357.8 254.1L331 353H224l-56.8 56.8V353H76.9V72.1h321v214zM331 149v116.9h-40.1V149H331zm-107 0v116.9h-40.1V149H224z"],twitter:[512,512,[],"f099","M459.37 151.716c.325 4.548.325 9.097.325 13.645 0 138.72-105.583 298.558-298.558 298.558-59.452 0-114.68-17.219-161.137-47.106 8.447.974 16.568 1.299 25.34 1.299 49.055 0 94.213-16.568 130.274-44.832-46.132-.975-84.792-31.188-98.112-72.772 6.498.974 12.995 1.624 19.818 1.624 9.421 0 18.843-1.3 27.614-3.573-48.081-9.747-84.143-51.98-84.143-102.985v-1.299c13.969 7.797 30.214 12.67 47.431 13.319-28.264-18.843-46.781-51.005-46.781-87.391 0-19.492 5.197-37.36 14.294-52.954 51.655 63.675 129.3 105.258 216.365 109.807-1.624-7.797-2.599-15.918-2.599-24.04 0-57.828 46.782-104.934 104.934-104.934 30.213 0 57.502 12.67 76.67 33.137 23.715-4.548 46.456-13.32 66.599-25.34-7.798 24.366-24.366 44.833-46.132 57.827 21.117-2.273 41.584-8.122 60.426-16.243-14.292 20.791-32.161 39.308-52.628 54.253z"],"twitter-square":[448,512,[],"f081","M400 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zm-48.9 158.8c.2 2.8.2 5.7.2 8.5 0 86.7-66 186.6-186.6 186.6-37.2 0-71.7-10.8-100.7-29.4 5.3.6 10.4.8 15.8.8 30.7 0 58.9-10.4 81.4-28-28.8-.6-53-19.5-61.3-45.5 10.1 1.5 19.2 1.5 29.6-1.2-30-6.1-52.5-32.5-52.5-64.4v-.8c8.7 4.9 18.9 7.9 29.6 8.3a65.447 65.447 0 0 1-29.2-54.6c0-12.2 3.2-23.4 8.9-33.1 32.3 39.8 80.8 65.8 135.2 68.6-9.3-44.5 24-80.6 64-80.6 18.9 0 35.9 7.9 47.9 20.7 14.8-2.8 29-8.3 41.6-15.8-4.9 15.2-15.2 28-28.8 36.1 13.2-1.4 26-5.1 37.8-10.2-8.9 13.1-20.1 24.7-32.9 34z"],typo3:[433,512,[],"f42b","M330.8 341c-7 2.3-11.6 2.3-18.5 2.3-57.2 0-140.6-198.5-140.6-264.9 0-24.7 5.4-32.4 13.9-39.4-69.5 8.5-149.3 34-176.3 66.4-5.4 7.7-9.3 20.8-9.3 37.1C0 246 106.8 480 184.1 480c36.3 0 97.3-59.5 146.7-139M294.5 32c71.8 0 138.8 11.6 138.8 52.5 0 82.6-52.5 182.3-78.8 182.3-47.9 0-101.7-132.1-101.7-198.5 0-30.9 11.6-36.3 41.7-36.3"],uber:[448,512,[],"f402","M414.1 32H33.9C15.2 32 0 47.2 0 65.9V446c0 18.8 15.2 34 33.9 34H414c18.7 0 33.9-15.2 33.9-33.9V65.9C448 47.2 432.8 32 414.1 32zM237.6 391.1C163 398.6 96.4 344.2 88.9 269.6h94.4V290c0 3.7 3 6.8 6.8 6.8H258c3.7 0 6.8-3 6.8-6.8v-67.9c0-3.7-3-6.8-6.8-6.8h-67.9c-3.7 0-6.8 3-6.8 6.8v20.4H88.9c7-69.4 65.4-122.2 135.1-122.2 69.7 0 128.1 52.8 135.1 122.2 7.5 74.5-46.9 141.1-121.5 148.6z"],uikit:[448,512,[],"f403","M443.9 128v256L218 512 0 384V169.7l87.6 45.1v117l133.5 75.5 135.8-75.5v-151l-101.1-57.6 87.6-53.1L443.9 128zM308.6 49.1L223.8 0l-88.6 54.8 86 47.3 87.4-53z"],uniregistry:[384,512,[],"f404","M281.1 220.1H384v-14.8H281.1v14.8zm0-37.1H384v-12.4H281.1V183zm0 74.2H384v-17.3H281.1v17.3zm-157.7 86.7H8.5c2.6 8.5 5.8 16.8 9.6 24.8h138.3c-12.9-5.7-24.1-14.2-33-24.8m145.7-12.4h109.7c1.8-7.3 3.1-14.7 3.9-22.3H278.3c-2.1 7.9-5.2 15.4-9.2 22.3m-41.5 37.1H367c3.7-8 5.8-16.2 8.5-24.8h-115c-8.8 10.7-20.1 19.2-32.9 24.8M384 32H281.1v2.5H384V32zM192 480c39.5 0 76.2-11.8 106.8-32.2H85.3C115.8 468.2 152.5 480 192 480m89.1-334.2H384V136H281.1v9.8zm0-37.1H384v-7.4H281.1v7.4zm0-37.1H384v-4.9H281.1v4.9zm-178.2 99H0V183h102.9v-12.4zM38.8 405.7h305.3c6.7-8.5 12.6-17.6 17.8-27.2H23c5.2 9.6 9.2 18.7 15.8 27.2m64.1-118.8v-12.4H0v12.4c0 2.5 0 5 .1 7.4h103.1c-.2-2.4-.3-4.9-.3-7.4m178.2 0c0 2.5-.1 5-.4 7.4h103.1c.1-2.5.2-4.9.2-7.4v-12.4H281.1v12.4zm-203 156h227.7c11.8-8.7 22.7-18.6 32.2-29.7H44.9c9.6 11 21.4 21 33.2 29.7m24.8-376.2H0v4.9h102.9v-4.9zm0-34.7H0v2.5h102.9V32zm0 173.3H0v14.8h102.9v-14.8zm0 34.6H0v17.3h102.9v-17.3zm0-103.9H0v9.9h102.9V136zm0-34.7H0v7.4h102.9v-7.4zm2.8 207.9H1.3c.9 7.6 2.2 15 3.9 22.3h109.7c-4-6.9-7.2-14.4-9.2-22.3"],untappd:[640,512,[],"f405","M401.3 49.9c-79.8 160.1-84.6 152.5-87.9 173.2l-5.2 32.8c-1.9 12-6.6 23.5-13.7 33.4L145.6 497.1c-7.6 10.6-20.4 16.2-33.4 14.6-40.3-5-77.8-32.2-95.3-68.5-5.7-11.8-4.5-25.8 3.1-36.4l148.9-207.9c7.1-9.9 16.4-18 27.2-23.7l29.3-15.5c18.5-9.8 9.7-11.9 135.6-138.9 1-4.8 1-7.3 3.6-8 3-.7 6.6-1 6.3-4.6l-.4-4.6c-.2-1.9 1.3-3.6 3.2-3.6 4.5-.1 13.2 1.2 25.6 10 12.3 8.9 16.4 16.8 17.7 21.1.6 1.8-.6 3.7-2.4 4.2l-4.5 1.1c-3.4.9-2.5 4.4-2.3 7.4.1 2.8-2.3 3.6-6.5 6.1zM230.1 36.4c3.4.9 2.5 4.4 2.3 7.4-.2 2.7 2.1 3.5 6.4 6 7.9 15.9 15.3 30.5 22.2 44 .7 1.3 2.3 1.5 3.3.5 11.2-12 24.6-26.2 40.5-42.6 1.3-1.4 1.4-3.5.1-4.9-8-8.2-16.5-16.9-25.6-26.1-1-4.7-1-7.3-3.6-8-3-.8-6.6-1-6.3-4.6.3-3.3 1.4-8.1-2.8-8.2-4.5-.1-13.2 1.1-25.6 10-12.3 8.9-16.4 16.8-17.7 21.1-1.4 4.2 3.6 4.6 6.8 5.4zM620 406.7L471.2 198.8c-13.2-18.5-26.6-23.4-56.4-39.1-11.2-5.9-14.2-10.9-30.5-28.9-1-1.1-2.9-.9-3.6.5-46.3 88.8-47.1 82.8-49 94.8-1.7 10.7-1.3 20 .3 29.8 1.9 12 6.6 23.5 13.7 33.4l148.9 207.9c7.6 10.6 20.2 16.2 33.1 14.7 40.3-4.9 78-32 95.7-68.6 5.4-11.9 4.3-25.9-3.4-36.6z"],usb:[640,512,[],"f287","M641.5 256c0 3.1-1.7 6.1-4.5 7.5L547.9 317c-1.4.8-2.8 1.4-4.5 1.4-1.4 0-3.1-.3-4.5-1.1-2.8-1.7-4.5-4.5-4.5-7.8v-35.6H295.7c25.3 39.6 40.5 106.9 69.6 106.9H392V354c0-5 3.9-8.9 8.9-8.9H490c5 0 8.9 3.9 8.9 8.9v89.1c0 5-3.9 8.9-8.9 8.9h-89.1c-5 0-8.9-3.9-8.9-8.9v-26.7h-26.7c-75.4 0-81.1-142.5-124.7-142.5H140.3c-8.1 30.6-35.9 53.5-69 53.5C32 327.3 0 295.3 0 256s32-71.3 71.3-71.3c33.1 0 61 22.8 69 53.5 39.1 0 43.9 9.5 74.6-60.4C255 88.7 273 95.7 323.8 95.7c7.5-20.9 27-35.6 50.4-35.6 29.5 0 53.5 23.9 53.5 53.5s-23.9 53.5-53.5 53.5c-23.4 0-42.9-14.8-50.4-35.6H294c-29.1 0-44.3 67.4-69.6 106.9h310.1v-35.6c0-3.3 1.7-6.1 4.5-7.8 2.8-1.7 6.4-1.4 8.9.3l89.1 53.5c2.8 1.1 4.5 4.1 4.5 7.2z"],ussunnah:[512,512,[],"f407","M156.8 285.1l5.7 14.4h-8.2c-1.3-3.2-3.1-7.7-3.8-9.5-2.5-6.3-1.1-8.4 0-10 1.9-2.7 3.2-4.4 3.6-5.2 0 2.2.8 5.7 2.7 10.3zm297.3 18.8c-2.1 13.8-5.7 27.1-10.5 39.7l43 23.4-44.8-18.8c-5.3 13.2-12 25.6-19.9 37.2l34.2 30.2-36.8-26.4c-8.4 11.8-18 22.6-28.7 32.3l24.9 34.7-28.1-31.8c-11 9.6-23.1 18-36.1 25.1l15.7 37.2-19.3-35.3c-13.1 6.8-27 12.1-41.6 15.9l6.7 38.4-10.5-37.4c-14.3 3.4-29.2 5.3-44.5 5.4L256 512l-1.9-38.4c-15.3-.1-30.2-2-44.5-5.3L199 505.6l6.7-38.2c-14.6-3.7-28.6-9.1-41.7-15.8l-19.2 35.1 15.6-37c-13-7-25.2-15.4-36.2-25.1l-27.9 31.6 24.7-34.4c-10.7-9.7-20.4-20.5-28.8-32.3l-36.5 26.2 33.9-29.9c-7.9-11.6-14.6-24.1-20-37.3l-44.4 18.7L67.8 344c-4.8-12.7-8.4-26.1-10.5-39.9l-51 9 50.3-14.2c-1.1-8.5-1.7-17.1-1.7-25.9 0-4.7.2-9.4.5-14.1L0 256l56-2.8c1.3-13.1 3.8-25.8 7.5-38.1L6.4 199l58.9 10.4c4-12 9.1-23.5 15.2-34.4l-55.1-30 58.3 24.6C90 159 97.2 149.2 105.3 140L55.8 96.4l53.9 38.7c8.1-8.6 17-16.5 26.6-23.6l-40-55.6 45.6 51.6c9.5-6.6 19.7-12.3 30.3-17.2l-27.3-64.9 33.8 62.1c10.5-4.4 21.4-7.9 32.7-10.4L199 6.4l19.5 69.2c11-2.1 22.3-3.2 33.8-3.4L256 0l3.6 72.2c11.5.2 22.8 1.4 33.8 3.5L313 6.4l-12.4 70.7c11.3 2.6 22.2 6.1 32.6 10.5l33.9-62.2-27.4 65.1c10.6 4.9 20.7 10.7 30.2 17.2l45.8-51.8-40.1 55.9c9.5 7.1 18.4 15 26.5 23.6l54.2-38.9-49.7 43.9c8 9.1 15.2 18.9 21.5 29.4l58.7-24.7-55.5 30.2c6.1 10.9 11.1 22.3 15.1 34.3l59.3-10.4-57.5 16.2c3.7 12.2 6.2 24.9 7.5 37.9L512 256l-56 2.8c.3 4.6.5 9.3.5 14.1 0 8.7-.6 17.3-1.6 25.8l50.7 14.3-51.5-9.1zm-21.8-31c0-97.5-79-176.5-176.5-176.5s-176.5 79-176.5 176.5 79 176.5 176.5 176.5 176.5-79 176.5-176.5zm-24 0c0 84.3-68.3 152.6-152.6 152.6s-152.6-68.3-152.6-152.6 68.3-152.6 152.6-152.6 152.6 68.3 152.6 152.6zM195 241c0 2.1 1.3 3.8 3.6 5.1 3.3 1.9 6.2 4.6 8.2 8.2 2.8-5.7 4.3-9.5 4.3-11.2 0-2.2-1.1-4.4-3.2-7-2.1-2.5-3.2-5.2-3.3-7.7-6.5 6.8-9.6 10.9-9.6 12.6zm-40.7-19c0 2.1 1.3 3.8 3.6 5.1 3.5 1.9 6.2 4.6 8.2 8.2 2.8-5.7 4.3-9.5 4.3-11.2 0-2.2-1.1-4.4-3.2-7-2.1-2.5-3.2-5.2-3.3-7.7-6.5 6.8-9.6 10.9-9.6 12.6zm-19 0c0 2.1 1.3 3.8 3.6 5.1 3.3 1.9 6.2 4.6 8.2 8.2 2.8-5.7 4.3-9.5 4.3-11.2 0-2.2-1.1-4.4-3.2-7-2.1-2.5-3.2-5.2-3.3-7.7-6.4 6.8-9.6 10.9-9.6 12.6zm204.9 87.9c-8.4-3-8.7-6.8-8.7-15.6V182c-8.2 12.5-14.2 18.6-18 18.6 6.3 14.4 9.5 23.9 9.5 28.3v64.3c0 2.2-2.2 6.5-4.7 6.5h-18c-2.8-7.5-10.2-26.9-15.3-40.3-2 2.5-7.2 9.2-10.7 13.7 2.4 1.6 4.1 3.6 5.2 6.3 2.6 6.7 6.4 16.5 7.9 20.2h-9.2c-3.9-10.4-9.6-25.4-11.8-31.1-2 2.5-7.2 9.2-10.7 13.7 2.4 1.6 4.1 3.6 5.2 6.3.8 2 2.8 7.3 4.3 10.9H256c-1.5-4.1-5.6-14.6-8.4-22-2 2.5-7.2 9.2-10.7 13.7 2.5 1.6 4.3 3.6 5.2 6.3.2.6.5 1.4.6 1.7H225c-4.6-13.9-11.4-27.7-11.4-34.1 0-2.2.3-5.1 1.1-8.2-8.8 10.8-14 15.9-14 25 0 7.5 10.4 28.3 10.4 33.3 0 1.7-.5 3.3-1.4 4.9-9.6-12.7-15.5-20.7-18.8-20.7h-12l-11.2-28c-3.8-9.6-5.7-16-5.7-18.8 0-3.8.5-7.7 1.7-12.2-1 1.3-3.7 4.7-5.5 7.1-.8-2.1-3.1-7.7-4.6-11.5-2.1 2.5-7.5 9.1-11.2 13.6.9 2.3 3.3 8.1 4.9 12.2-2.5 3.3-9.1 11.8-13.6 17.7-4 5.3-5.8 13.3-2.7 21.8 2.5 6.7 2 7.9-1.7 14.1H191c5.5 0 14.3 14 15.5 22 13.2-16 15.4-19.6 16.8-21.6h107c3.9 0 7.2-1.9 9.9-5.8zm20.1-26.6V181.7c-9 12.5-15.9 18.6-20.7 18.6 7.1 14.4 10.7 23.9 10.7 28.3v66.3c0 17.5 8.6 20.4 24 20.4 8.1 0 12.5-.8 13.7-2.7-4.3-1.6-7.6-2.5-9.9-3.3-8.1-3.2-17.8-7.4-17.8-26z"],vaadin:[448,512,[],"f408","M224.5 140.7c1.5-17.6 4.9-52.7 49.8-52.7h98.6c20.7 0 32.1-7.8 32.1-21.6V54.1c0-12.2 9.3-22.1 21.5-22.1S448 41.9 448 54.1v36.5c0 42.9-21.5 62-66.8 62H280.7c-30.1 0-33 14.7-33 27.1 0 1.3-.1 2.5-.2 3.7-.7 12.3-10.9 22.2-23.4 22.2s-22.7-9.8-23.4-22.2c-.1-1.2-.2-2.4-.2-3.7 0-12.3-3-27.1-33-27.1H66.8c-45.3 0-66.8-19.1-66.8-62V54.1C0 41.9 9.4 32 21.6 32s21.5 9.9 21.5 22.1v12.3C43.1 80.2 54.5 88 75.2 88h98.6c44.8 0 48.3 35.1 49.8 52.7h.9zM224 456c11.5 0 21.4-7 25.7-16.3 1.1-1.8 97.1-169.6 98.2-171.4 11.9-19.6-3.2-44.3-27.2-44.3-13.9 0-23.3 6.4-29.8 20.3L224 362l-66.9-117.7c-6.4-13.9-15.9-20.3-29.8-20.3-24 0-39.1 24.6-27.2 44.3 1.1 1.9 97.1 169.6 98.2 171.4 4.3 9.3 14.2 16.3 25.7 16.3z"],viacoin:[384,512,[],"f237","M384 32h-64l-80.7 192h-94.5L64 32H0l48 112H0v48h68.5l13.8 32H0v48h102.8L192 480l89.2-208H384v-48h-82.3l13.8-32H384v-48h-48l48-112zM192 336l-27-64h54l-27 64z"],viadeo:[448,512,[],"f2a9","M276.2 150.5v.7C258.3 98.6 233.6 47.8 205.4 0c43.3 29.2 67 100 70.8 150.5zm32.7 121.7c7.6 18.2 11 37.5 11 57 0 77.7-57.8 141-137.8 139.4l3.8-.3c74.2-46.7 109.3-118.6 109.3-205.1 0-38.1-6.5-75.9-18.9-112 1 11.7 1 23.7 1 35.4 0 91.8-18.1 241.6-116.6 280C95 455.2 49.4 398 49.4 329.2c0-75.6 57.4-142.3 135.4-142.3 16.8 0 33.7 3.1 49.1 9.6 1.7-15.1 6.5-29.9 13.4-43.3-19.9-7.2-41.2-10.7-62.5-10.7-161.5 0-238.7 195.9-129.9 313.7 67.9 74.6 192 73.9 259.8 0 56.6-61.3 60.9-142.4 36.4-201-12.7 8-27.1 13.9-42.2 17zM418.1 11.7c-31 66.5-81.3 47.2-115.8 80.1-12.4 12-20.6 34-20.6 50.5 0 14.1 4.5 27.1 12 38.8 47.4-11 98.3-46 118.2-90.7-.7 5.5-4.8 14.4-7.2 19.2-20.3 35.7-64.6 65.6-99.7 84.9 14.8 14.4 33.7 25.8 55 25.8 79 0 110.1-134.6 58.1-208.6z"],"viadeo-square":[448,512,[],"f2aa","M400 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zM280.7 381.2c-42.4 46.2-120 46.6-162.4 0-68-73.6-19.8-196.1 81.2-196.1 13.3 0 26.6 2.1 39.1 6.7-4.3 8.4-7.3 17.6-8.4 27.1-9.7-4.1-20.2-6-30.7-6-48.8 0-84.6 41.7-84.6 88.9 0 43 28.5 78.7 69.5 85.9 61.5-24 72.9-117.6 72.9-175 0-7.3 0-14.8-.6-22.1-11.2-32.9-26.6-64.6-44.2-94.5 27.1 18.3 41.9 62.5 44.2 94.1v.4c7.7 22.5 11.8 46.2 11.8 70 0 54.1-21.9 99-68.3 128.2l-2.4.2c50 1 86.2-38.6 86.2-87.2 0-12.2-2.1-24.3-6.9-35.7 9.5-1.9 18.5-5.6 26.4-10.5 15.3 36.6 12.6 87.3-22.8 125.6zM309 233.7c-13.3 0-25.1-7.1-34.4-16.1 21.9-12 49.6-30.7 62.3-53 1.5-3 4.1-8.6 4.5-12-12.5 27.9-44.2 49.8-73.9 56.7-4.7-7.3-7.5-15.5-7.5-24.3 0-10.3 5.2-24.1 12.9-31.6 21.6-20.5 53-8.5 72.4-50 32.5 46.2 13.1 130.3-36.3 130.3z"],viber:[512,512,[],"f409","M430.7 49.9C418 38.2 366.6.9 252.1.4c0 0-135.1-8.1-200.9 52.3C14.6 89.3 1.7 142.9.3 209.4c-1.4 66.5-3.1 191.1 117 224.9h.1l-.1 51.6s-.8 20.9 13 25.1c16.6 5.2 26.4-10.7 42.3-27.8 8.7-9.4 20.7-23.2 29.8-33.7 82.2 6.9 145.3-8.9 152.5-11.2 16.6-5.4 110.5-17.4 125.7-142 15.8-128.5-7.6-209.7-49.9-246.4zM444.6 287c-12.9 104-89 110.6-103 115.1-6 1.9-61.5 15.7-131.2 11.2 0 0-52 62.7-68.2 79-5.3 5.3-11.1 4.8-11-5.7 0-6.9.4-85.7.4-85.7-.1 0-.1 0 0 0C29.9 372.7 35.8 266.6 37 211.1c1.1-55.5 11.6-101 42.6-131.6C135.3 29 250 36.5 250 36.5c96.9.4 143.3 29.6 154.1 39.4 35.7 30.6 53.9 103.8 40.5 211.1zm-138.9-80.8c.4 8.6-12.5 9.2-12.9.6-1.1-22-11.4-32.7-32.6-33.9-8.6-.5-7.8-13.4.7-12.9 27.9 1.5 43.4 17.5 44.8 46.2zm20.3 11.3c1-42.4-25.5-75.6-75.8-79.3-8.5-.6-7.6-13.5.9-12.9 58 4.2 88.9 44.1 87.8 92.5-.2 8.6-13.1 8.2-12.9-.3zm46.9 13.4c.1 8.6-12.9 8.7-12.9.1-.6-81.5-54.9-125.9-120.8-126.4-8.5-.1-8.5-12.9 0-12.9 73.8.5 133.1 51.4 133.7 139.2zM361.7 329v.2c-10.8 19-31 40-51.8 33.3l-.2-.3c-21.1-5.9-70.8-31.5-102.2-56.5-16.2-12.8-31-27.9-42.4-42.4-10.3-12.9-20.7-28.2-30.8-46.6-21.3-38.5-26-55.7-26-55.7-6.7-20.8 14.2-41 33.3-51.8h.2c9.2-4.8 18-3.2 23.9 3.9 0 0 12.4 14.8 17.7 22.1 5 6.8 11.7 17.7 15.2 23.8 6.1 10.9 2.3 22-3.7 26.6l-12 9.6c-6.1 4.9-5.3 14-5.3 14s17.8 67.3 84.3 84.3c0 0 9.1.8 14-5.3l9.6-12c4.6-6 15.7-9.8 26.6-3.7 14.7 8.3 33.4 21.2 45.8 32.9 7 5.7 8.6 14.4 3.8 23.6z"],vimeo:[448,512,[],"f40a","M403.2 32H44.8C20.1 32 0 52.1 0 76.8v358.4C0 459.9 20.1 480 44.8 480h358.4c24.7 0 44.8-20.1 44.8-44.8V76.8c0-24.7-20.1-44.8-44.8-44.8zM377 180.8c-1.4 31.5-23.4 74.7-66 129.4-44 57.2-81.3 85.8-111.7 85.8-18.9 0-34.8-17.4-47.9-52.3-25.5-93.3-36.4-148-57.4-148-2.4 0-10.9 5.1-25.4 15.2l-15.2-19.6c37.3-32.8 72.9-69.2 95.2-71.2 25.2-2.4 40.7 14.8 46.5 51.7 20.7 131.2 29.9 151 67.6 91.6 13.5-21.4 20.8-37.7 21.8-48.9 3.5-33.2-25.9-30.9-45.8-22.4 15.9-52.1 46.3-77.4 91.2-76 33.3.9 49 22.5 47.1 64.7z"],"vimeo-square":[448,512,[],"f194","M400 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zm-16.2 149.6c-1.4 31.1-23.2 73.8-65.3 127.9-43.5 56.5-80.3 84.8-110.4 84.8-18.7 0-34.4-17.2-47.3-51.6-25.2-92.3-35.9-146.4-56.7-146.4-2.4 0-10.8 5-25.1 15.1L64 192c36.9-32.4 72.1-68.4 94.1-70.4 24.9-2.4 40.2 14.6 46 51.1 20.5 129.6 29.6 149.2 66.8 90.5 13.4-21.2 20.6-37.2 21.5-48.3 3.4-32.8-25.6-30.6-45.2-22.2 15.7-51.5 45.8-76.5 90.1-75.1 32.9 1 48.4 22.4 46.5 64z"],"vimeo-v":[448,512,[],"f27d","M447.8 153.6c-2 43.6-32.4 103.3-91.4 179.1-60.9 79.2-112.4 118.8-154.6 118.8-26.1 0-48.2-24.1-66.3-72.3C100.3 250 85.3 174.3 56.2 174.3c-3.4 0-15.1 7.1-35.2 21.1L0 168.2c51.6-45.3 100.9-95.7 131.8-98.5 34.9-3.4 56.3 20.5 64.4 71.5 28.7 181.5 41.4 208.9 93.6 126.7 18.7-29.6 28.8-52.1 30.2-67.6 4.8-45.9-35.8-42.8-63.3-31 22-72.1 64.1-107.1 126.2-105.1 45.8 1.2 67.5 31.1 64.9 89.4z"],vine:[384,512,[],"f1ca","M384 254.7v52.1c-18.4 4.2-36.9 6.1-52.1 6.1-36.9 77.4-103 143.8-125.1 156.2-14 7.9-27.1 8.4-42.7-.8C137 452 34.2 367.7 0 102.7h74.5C93.2 261.8 139 343.4 189.3 404.5c27.9-27.9 54.8-65.1 75.6-106.9-49.8-25.3-80.1-80.9-80.1-145.6 0-65.6 37.7-115.1 102.2-115.1 114.9 0 106.2 127.9 81.6 181.5 0 0-46.4 9.2-63.5-20.5 3.4-11.3 8.2-30.8 8.2-48.5 0-31.3-11.3-46.6-28.4-46.6-18.2 0-30.8 17.1-30.8 50 .1 79.2 59.4 118.7 129.9 101.9z"],vk:[576,512,[],"f189","M545 117.7c3.7-12.5 0-21.7-17.8-21.7h-58.9c-15 0-21.9 7.9-25.6 16.7 0 0-30 73.1-72.4 120.5-13.7 13.7-20 18.1-27.5 18.1-3.7 0-9.4-4.4-9.4-16.9V117.7c0-15-4.2-21.7-16.6-21.7h-92.6c-9.4 0-15 7-15 13.5 0 14.2 21.2 17.5 23.4 57.5v86.8c0 19-3.4 22.5-10.9 22.5-20 0-68.6-73.4-97.4-157.4-5.8-16.3-11.5-22.9-26.6-22.9H38.8c-16.8 0-20.2 7.9-20.2 16.7 0 15.6 20 93.1 93.1 195.5C160.4 378.1 229 416 291.4 416c37.5 0 42.1-8.4 42.1-22.9 0-66.8-3.4-73.1 15.4-73.1 8.7 0 23.7 4.4 58.7 38.1 40 40 46.6 57.9 69 57.9h58.9c16.8 0 25.3-8.4 20.4-25-11.2-34.9-86.9-106.7-90.3-111.5-8.7-11.2-6.2-16.2 0-26.2.1-.1 72-101.3 79.4-135.6z"],vnv:[640,512,[],"f40b","M104.9 352c-34.1 0-46.4-30.4-46.4-30.4L2.6 210.1S-7.8 192 13 192h32.8c10.4 0 13.2 8.7 18.8 18.1l36.7 74.5s5.2 13.1 21.1 13.1 21.1-13.1 21.1-13.1l36.7-74.5c5.6-9.5 8.4-18.1 18.8-18.1h32.8c20.8 0 10.4 18.1 10.4 18.1l-55.8 111.5S174.2 352 140 352h-35.1zm395 0c-34.1 0-46.4-30.4-46.4-30.4l-55.9-111.5S387.2 192 408 192h32.8c10.4 0 13.2 8.7 18.8 18.1l36.7 74.5s5.2 13.1 21.1 13.1 21.1-13.1 21.1-13.1l36.8-74.5c5.6-9.5 8.4-18.1 18.8-18.1H627c20.8 0 10.4 18.1 10.4 18.1l-55.9 111.5S569.3 352 535.1 352h-35.2zM337.6 192c34.1 0 46.4 30.4 46.4 30.4l55.9 111.5s10.4 18.1-10.4 18.1h-32.8c-10.4 0-13.2-8.7-18.8-18.1l-36.7-74.5s-5.2-13.1-21.1-13.1c-15.9 0-21.1 13.1-21.1 13.1l-36.7 74.5c-5.6 9.4-8.4 18.1-18.8 18.1h-32.9c-20.8 0-10.4-18.1-10.4-18.1l55.9-111.5s12.2-30.4 46.4-30.4h35.1z"],vuejs:[448,512,[],"f41f","M356.9 64.3H280l-56 88.6-48-88.6H0L224 448 448 64.3h-91.1zm-301.2 32h53.8L224 294.5 338.4 96.3h53.8L224 384.5 55.7 96.3z"],weibo:[512,512,[],"f18a","M407 177.6c7.6-24-13.4-46.8-37.4-41.7-22 4.8-28.8-28.1-7.1-32.8 50.1-10.9 92.3 37.1 76.5 84.8-6.8 21.2-38.8 10.8-32-10.3zM214.8 446.7C108.5 446.7 0 395.3 0 310.4c0-44.3 28-95.4 76.3-143.7C176 67 279.5 65.8 249.9 161c-4 13.1 12.3 5.7 12.3 6 79.5-33.6 140.5-16.8 114 51.4-3.7 9.4 1.1 10.9 8.3 13.1 135.7 42.3 34.8 215.2-169.7 215.2zm143.7-146.3c-5.4-55.7-78.5-94-163.4-85.7-84.8 8.6-148.8 60.3-143.4 116s78.5 94 163.4 85.7c84.8-8.6 148.8-60.3 143.4-116zM347.9 35.1c-25.9 5.6-16.8 43.7 8.3 38.3 72.3-15.2 134.8 52.8 111.7 124-7.4 24.2 29.1 37 37.4 12 31.9-99.8-55.1-195.9-157.4-174.3zm-78.5 311c-17.1 38.8-66.8 60-109.1 46.3-40.8-13.1-58-53.4-40.3-89.7 17.7-35.4 63.1-55.4 103.4-45.1 42 10.8 63.1 50.2 46 88.5zm-86.3-30c-12.9-5.4-30 .3-38 12.9-8.3 12.9-4.3 28 8.6 34 13.1 6 30.8.3 39.1-12.9 8-13.1 3.7-28.3-9.7-34zm32.6-13.4c-5.1-1.7-11.4.6-14.3 5.4-2.9 5.1-1.4 10.6 3.7 12.9 5.1 2 11.7-.3 14.6-5.4 2.8-5.2 1.1-10.9-4-12.9z"],weixin:[576,512,[],"f1d7","M372.3 167.6c6.4 0 12.6.3 18.8 1.1C374.4 90.3 290.3 32 194.7 32 87.6 32 0 104.8 0 197.4c0 53.4 29.3 97.5 77.9 131.6l-19.3 58.6 68-34.1c24.4 4.8 43.8 9.7 68.2 9.7 6.2 0 12.1-.3 18.3-.8-4-12.9-6.2-26.6-6.2-40.8-.1-84.9 73-154 165.4-154zm-104.5-52.9c14.5 0 24.2 9.7 24.2 24.4 0 14.5-9.7 24.2-24.2 24.2-14.8 0-29.3-9.7-29.3-24.2 0-14.7 14.5-24.4 29.3-24.4zm-136.5 48.6c-14.5 0-29.3-9.7-29.3-24.2 0-14.8 14.8-24.4 29.3-24.4 14.8 0 24.4 9.7 24.4 24.4.1 14.6-9.6 24.2-24.4 24.2zm418.8 156.1c0-77.9-77.9-141.3-165.4-141.3-92.7 0-165.4 63.4-165.4 141.3S292 460.7 384.6 460.7c19.3 0 38.9-5.1 58.6-9.9l53.4 29.3-14.8-48.6c39.3-29.4 68.3-68.3 68.3-112.1zm-219.2-24.5c-9.7 0-19.3-9.7-19.3-19.6 0-9.7 9.7-19.3 19.3-19.3 14.8 0 24.4 9.7 24.4 19.3 0 10-9.6 19.6-24.4 19.6zm107.2 0c-9.7 0-19.3-9.7-19.3-19.6 0-9.7 9.7-19.3 19.3-19.3 14.5 0 24.4 9.7 24.4 19.3 0 10-9.9 19.6-24.4 19.6z"],whatsapp:[448,512,[],"f232","M380.9 97.1C339 55.1 283.2 32 223.9 32c-122.4 0-222 99.6-222 222 0 39.1 10.2 77.3 29.6 111L0 480l117.7-30.9c32.4 17.7 68.9 27 106.1 27h.1c122.3 0 224.1-99.6 224.1-222 0-59.3-25.2-115-67.1-157zm-157 341.6c-33.2 0-65.7-8.9-94-25.7l-6.7-4-69.8 18.3L72 359.2l-4.4-7c-18.5-29.4-28.2-63.3-28.2-98.2 0-101.7 82.8-184.5 184.6-184.5 49.3 0 95.6 19.2 130.4 54.1 34.8 34.9 56.2 81.2 56.1 130.5 0 101.8-84.9 184.6-186.6 184.6zm101.2-138.2c-5.5-2.8-32.8-16.2-37.9-18-5.1-1.9-8.8-2.8-12.5 2.8-3.7 5.6-14.3 18-17.6 21.8-3.2 3.7-6.5 4.2-12 1.4-32.6-16.3-54-29.1-75.5-66-5.7-9.8 5.7-9.1 16.3-30.3 1.8-3.7.9-6.9-.5-9.7-1.4-2.8-12.5-30.1-17.1-41.2-4.5-10.8-9.1-9.3-12.5-9.5-3.2-.2-6.9-.2-10.6-.2-3.7 0-9.7 1.4-14.8 6.9-5.1 5.6-19.4 19-19.4 46.3 0 27.3 19.9 53.7 22.6 57.4 2.8 3.7 39.1 59.7 94.8 83.8 35.2 15.2 49 16.5 66.6 13.9 10.7-1.6 32.8-13.4 37.4-26.4 4.6-13 4.6-24.1 3.2-26.4-1.3-2.5-5-3.9-10.5-6.6z"],"whatsapp-square":[448,512,[],"f40c","M224 122.8c-72.7 0-131.8 59.1-131.9 131.8 0 24.9 7 49.2 20.2 70.1l3.1 5-13.3 48.6 49.9-13.1 4.8 2.9c20.2 12 43.4 18.4 67.1 18.4h.1c72.6 0 133.3-59.1 133.3-131.8 0-35.2-15.2-68.3-40.1-93.2-25-25-58-38.7-93.2-38.7zm77.5 188.4c-3.3 9.3-19.1 17.7-26.7 18.8-12.6 1.9-22.4.9-47.5-9.9-39.7-17.2-65.7-57.2-67.7-59.8-2-2.6-16.2-21.5-16.2-41s10.2-29.1 13.9-33.1c3.6-4 7.9-5 10.6-5 2.6 0 5.3 0 7.6.1 2.4.1 5.7-.9 8.9 6.8 3.3 7.9 11.2 27.4 12.2 29.4s1.7 4.3.3 6.9c-7.6 15.2-15.7 14.6-11.6 21.6 15.3 26.3 30.6 35.4 53.9 47.1 4 2 6.3 1.7 8.6-1 2.3-2.6 9.9-11.6 12.5-15.5 2.6-4 5.3-3.3 8.9-2 3.6 1.3 23.1 10.9 27.1 12.9s6.6 3 7.6 4.6c.9 1.9.9 9.9-2.4 19.1zM400 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zM223.9 413.2c-26.6 0-52.7-6.7-75.8-19.3L64 416l22.5-82.2c-13.9-24-21.2-51.3-21.2-79.3C65.4 167.1 136.5 96 223.9 96c42.4 0 82.2 16.5 112.2 46.5 29.9 30 47.9 69.8 47.9 112.2 0 87.4-72.7 158.5-160.1 158.5z"],whmcs:[448,512,[],"f40d","M448 161v-21.3l-28.5-8.8-2.2-10.4 20.1-20.7L427 80.4l-29 7.5-7.2-7.5 7.5-28.2-19.1-11.6-21.3 21-10.7-3.2-7-26.4h-22.6l-6.2 26.4-12.1 3.2-19.7-21-19.4 11 8.1 27.7-8.1 8.4-28.5-7.5-11 19.1 20.7 21-2.9 10.4-28.5 7.8-.3 21.7 28.8 7.5 2.4 12.1-20.1 19.9 10.4 18.5 29.6-7.5 7.2 8.6-8.1 26.9 19.9 11.6 19.4-20.4 11.6 2.9 6.7 28.5 22.6.3 6.7-28.8 11.6-3.5 20.7 21.6 20.4-12.1-8.8-28 7.8-8.1 28.8 8.8 10.3-20.1-20.9-18.8 2.2-12.1 29.1-7zm-119.2 45.2c-31.3 0-56.8-25.4-56.8-56.8s25.4-56.8 56.8-56.8 56.8 25.4 56.8 56.8c0 31.5-25.4 56.8-56.8 56.8zm72.3 16.4l46.9 14.5V277l-55.1 13.4-4.1 22.7 38.9 35.3-19.2 37.9-54-16.7-14.6 15.2 16.7 52.5-38.3 22.7-38.9-40.5-21.7 6.6-12.6 54-42.4-.5-12.6-53.6-21.7-5.6-36.4 38.4-37.4-21.7 15.2-50.5-13.7-16.1-55.5 14.1-19.7-34.8 37.9-37.4-4.8-22.8-54-14.1.5-40.9L54 219.9l5.7-19.7-38.9-39.4L41.5 125l53.6 14.1 15.2-15.7-15.2-52 36.4-20.7 36.8 39.4L191 84l11.6-52H245l11.6 45.9L234 72l-6.3-1.7-3.3 5.7-11 19.1-3.3 5.6 4.6 4.6 17.2 17.4-.3 1-23.8 6.5-6.2 1.7-.1 6.4-.2 12.9C153.8 161.6 118 204 118 254.7c0 58.3 47.3 105.7 105.7 105.7 50.5 0 92.7-35.4 103.2-82.8l13.2.2 6.9.1 1.6-6.7 5.6-24 1.9-.6 17.1 17.8 4.7 4.9 5.8-3.4 20.4-12.1 5.8-3.5-2-6.5-6.8-21.2z"],"wikipedia-w":[640,512,[],"f266","M640 51.2l-.3 12.2c-28.1.8-45 15.8-55.8 40.3-25 57.8-103.3 240-155.3 358.6H415l-81.9-193.1c-32.5 63.6-68.3 130-99.2 193.1-.3.3-15 0-15-.3C172 352.3 122.8 243.4 75.8 133.4 64.4 106.7 26.4 63.4.2 63.7c0-3.1-.3-10-.3-14.2h161.9v13.9c-19.2 1.1-52.8 13.3-43.3 34.2 21.9 49.7 103.6 240.3 125.6 288.6 15-29.7 57.8-109.2 75.3-142.8-13.9-28.3-58.6-133.9-72.8-160-9.7-17.8-36.1-19.4-55.8-19.7V49.8l142.5.3v13.1c-19.4.6-38.1 7.8-29.4 26.1 18.9 40 30.6 68.1 48.1 104.7 5.6-10.8 34.7-69.4 48.1-100.8 8.9-20.6-3.9-28.6-38.6-29.4.3-3.6 0-10.3.3-13.6 44.4-.3 111.1-.3 123.1-.6v13.6c-22.5.8-45.8 12.8-58.1 31.7l-59.2 122.8c6.4 16.1 63.3 142.8 69.2 156.7L559.2 91.8c-8.6-23.1-36.4-28.1-47.2-28.3V49.6l127.8 1.1.2.5z"],windows:[448,512,[],"f17a","M0 93.7l183.6-25.3v177.4H0V93.7zm0 324.6l183.6 25.3V268.4H0v149.9zm203.8 28L448 480V268.4H203.8v177.9zm0-380.6v180.1H448V32L203.8 65.7z"],wordpress:[512,512,[],"f19a","M61.7 169.4l101.5 278C92.2 413 43.3 340.2 43.3 256c0-30.9 6.6-60.1 18.4-86.6zm337.9 75.9c0-26.3-9.4-44.5-17.5-58.7-10.8-17.5-20.9-32.4-20.9-49.9 0-19.6 14.8-37.8 35.7-37.8.9 0 1.8.1 2.8.2-37.9-34.7-88.3-55.9-143.7-55.9-74.3 0-139.7 38.1-177.8 95.9 5 .2 9.7.3 13.7.3 22.2 0 56.7-2.7 56.7-2.7 11.5-.7 12.8 16.2 1.4 17.5 0 0-11.5 1.3-24.3 2l77.5 230.4L249.8 247l-33.1-90.8c-11.5-.7-22.3-2-22.3-2-11.5-.7-10.1-18.2 1.3-17.5 0 0 35.1 2.7 56 2.7 22.2 0 56.7-2.7 56.7-2.7 11.5-.7 12.8 16.2 1.4 17.5 0 0-11.5 1.3-24.3 2l76.9 228.7 21.2-70.9c9-29.4 16-50.5 16-68.7zm-139.9 29.3l-63.8 185.5c19.1 5.6 39.2 8.7 60.1 8.7 24.8 0 48.5-4.3 70.6-12.1-.6-.9-1.1-1.9-1.5-2.9l-65.4-179.2zm183-120.7c.9 6.8 1.4 14 1.4 21.9 0 21.6-4 45.8-16.2 76.2l-65 187.9C426.2 403 468.7 334.5 468.7 256c0-37-9.4-71.8-26-102.1zM504 256c0 136.8-111.3 248-248 248C119.2 504 8 392.7 8 256 8 119.2 119.2 8 256 8c136.7 0 248 111.2 248 248zm-11.4 0c0-130.5-106.2-236.6-236.6-236.6C125.5 19.4 19.4 125.5 19.4 256S125.6 492.6 256 492.6c130.5 0 236.6-106.1 236.6-236.6z"],"wordpress-simple":[512,512,[],"f411","M256 8C119.3 8 8 119.2 8 256c0 136.7 111.3 248 248 248s248-111.3 248-248C504 119.2 392.7 8 256 8zM33 256c0-32.3 6.9-63 19.3-90.7l106.4 291.4C84.3 420.5 33 344.2 33 256zm223 223c-21.9 0-43-3.2-63-9.1l66.9-194.4 68.5 187.8c.5 1.1 1 2.1 1.6 3.1-23.1 8.1-48 12.6-74 12.6zm30.7-327.5c13.4-.7 25.5-2.1 25.5-2.1 12-1.4 10.6-19.1-1.4-18.4 0 0-36.1 2.8-59.4 2.8-21.9 0-58.7-2.8-58.7-2.8-12-.7-13.4 17.7-1.4 18.4 0 0 11.4 1.4 23.4 2.1l34.7 95.2L200.6 393l-81.2-241.5c13.4-.7 25.5-2.1 25.5-2.1 12-1.4 10.6-19.1-1.4-18.4 0 0-36.1 2.8-59.4 2.8-4.2 0-9.1-.1-14.4-.3C109.6 73 178.1 33 256 33c58 0 110.9 22.2 150.6 58.5-1-.1-1.9-.2-2.9-.2-21.9 0-37.4 19.1-37.4 39.6 0 18.4 10.6 33.9 21.9 52.3 8.5 14.8 18.4 33.9 18.4 61.5 0 19.1-7.3 41.2-17 72.1l-22.2 74.3-80.7-239.6zm81.4 297.2l68.1-196.9c12.7-31.8 17-57.2 17-79.9 0-8.2-.5-15.8-1.5-22.9 17.4 31.8 27.3 68.2 27.3 107 0 82.3-44.6 154.1-110.9 192.7z"],wpbeginner:[512,512,[],"f297","M462.799 322.374C519.01 386.682 466.961 480 370.944 480c-39.602 0-78.824-17.687-100.142-50.04-6.887.356-22.702.356-29.59 0C219.848 462.381 180.588 480 141.069 480c-95.49 0-148.348-92.996-91.855-157.626C-29.925 190.523 80.479 32 256.006 32c175.632 0 285.87 158.626 206.793 290.374zm-339.647-82.972h41.529v-58.075h-41.529v58.075zm217.18 86.072v-23.839c-60.506 20.915-132.355 9.198-187.589-33.971l.246 24.897c51.101 46.367 131.746 57.875 187.343 32.913zm-150.753-86.072h166.058v-58.075H189.579v58.075z"],wpexplorer:[512,512,[],"f2de","M512 256c0 141.2-114.7 256-256 256C114.8 512 0 397.3 0 256S114.7 0 256 0s256 114.7 256 256zm-32 0c0-123.2-100.3-224-224-224C132.5 32 32 132.5 32 256s100.5 224 224 224 224-100.5 224-224zM160.9 124.6l86.9 37.1-37.1 86.9-86.9-37.1 37.1-86.9zm110 169.1l46.6 94h-14.6l-50-100-48.9 100h-14l51.1-106.9-22.3-9.4 6-14 68.6 29.1-6 14.3-16.5-7.1zm-11.8-116.3l68.6 29.4-29.4 68.3L230 246l29.1-68.6zm80.3 42.9l54.6 23.1-23.4 54.3-54.3-23.1 23.1-54.3z"],wpforms:[448,512,[],"f298","M448 75.2v361.7c0 24.3-19 43.2-43.2 43.2H43.2C19.3 480 0 461.4 0 436.8V75.2C0 51.1 18.8 32 43.2 32h361.7c24 0 43.1 18.8 43.1 43.2zm-37.3 361.6V75.2c0-3-2.6-5.8-5.8-5.8h-9.3L285.3 144 224 94.1 162.8 144 52.5 69.3h-9.3c-3.2 0-5.8 2.8-5.8 5.8v361.7c0 3 2.6 5.8 5.8 5.8h361.7c3.2.1 5.8-2.7 5.8-5.8zM150.2 186v37H76.7v-37h73.5zm0 74.4v37.3H76.7v-37.3h73.5zm11.1-147.3l54-43.7H96.8l64.5 43.7zm210 72.9v37h-196v-37h196zm0 74.4v37.3h-196v-37.3h196zm-84.6-147.3l64.5-43.7H232.8l53.9 43.7zM371.3 335v37.3h-99.4V335h99.4z"],xbox:[512,512,[],"f412","M369.9 318.2c44.3 54.3 64.7 98.8 54.4 118.7-7.9 15.1-56.7 44.6-92.6 55.9-29.6 9.3-68.4 13.3-100.4 10.2-38.2-3.7-76.9-17.4-110.1-39C93.3 445.8 87 438.3 87 423.4c0-29.9 32.9-82.3 89.2-142.1 32-33.9 76.5-73.7 81.4-72.6 9.4 2.1 84.3 75.1 112.3 109.5zM188.6 143.8c-29.7-26.9-58.1-53.9-86.4-63.4-15.2-5.1-16.3-4.8-28.7 8.1-29.2 30.4-53.5 79.7-60.3 122.4-5.4 34.2-6.1 43.8-4.2 60.5 5.6 50.5 17.3 85.4 40.5 120.9 9.5 14.6 12.1 17.3 9.3 9.9-4.2-11-.3-37.5 9.5-64 14.3-39 53.9-112.9 120.3-194.4zm311.6 63.5C483.3 127.3 432.7 77 425.6 77c-7.3 0-24.2 6.5-36 13.9-23.3 14.5-41 31.4-64.3 52.8C367.7 197 427.5 283.1 448.2 346c6.8 20.7 9.7 41.1 7.4 52.3-1.7 8.5-1.7 8.5 1.4 4.6 6.1-7.7 19.9-31.3 25.4-43.5 7.4-16.2 15-40.2 18.6-58.7 4.3-22.5 3.9-70.8-.8-93.4zM141.3 43C189 40.5 251 77.5 255.6 78.4c.7.1 10.4-4.2 21.6-9.7 63.9-31.1 94-25.8 107.4-25.2-63.9-39.3-152.7-50-233.9-11.7-23.4 11.1-24 11.9-9.4 11.2z"],xing:[384,512,[],"f168","M162.7 210c-1.8 3.3-25.2 44.4-70.1 123.5-4.9 8.3-10.8 12.5-17.7 12.5H9.8c-7.7 0-12.1-7.5-8.5-14.4l69-121.3c.2 0 .2-.1 0-.3l-43.9-75.6c-4.3-7.8.3-14.1 8.5-14.1H100c7.3 0 13.3 4.1 18 12.2l44.7 77.5zM382.6 46.1l-144 253v.3L330.2 466c3.9 7.1.2 14.1-8.5 14.1h-65.2c-7.6 0-13.6-4-18-12.2l-92.4-168.5c3.3-5.8 51.5-90.8 144.8-255.2 4.6-8.1 10.4-12.2 17.5-12.2h65.7c8 0 12.3 6.7 8.5 14.1z"],"xing-square":[448,512,[],"f169","M400 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zM140.4 320.2H93.8c-5.5 0-8.7-5.3-6-10.3l49.3-86.7c.1 0 .1-.1 0-.2l-31.4-54c-3-5.6.2-10.1 6-10.1h46.6c5.2 0 9.5 2.9 12.9 8.7l31.9 55.3c-1.3 2.3-18 31.7-50.1 88.2-3.5 6.2-7.7 9.1-12.6 9.1zm219.7-214.1L257.3 286.8v.2l65.5 119c2.8 5.1.1 10.1-6 10.1h-46.6c-5.5 0-9.7-2.9-12.9-8.7l-66-120.3c2.3-4.1 36.8-64.9 103.4-182.3 3.3-5.8 7.4-8.7 12.5-8.7h46.9c5.7-.1 8.8 4.7 6 10z"],"y-combinator":[448,512,[],"f23b","M448 32v448H0V32h448zM236 287.5L313.5 142h-32.7L235 233c-4.7 9.3-9 18.3-12.8 26.8L210 233l-45.2-91h-35l76.7 143.8v94.5H236v-92.8z"],yahoo:[360,512,[],"f19e","M204.9 288l3.5 195.5c-11.3-2-20.9-3.5-28.7-3.5-7.5 0-17 1.5-28.7 3.5l3.5-195.5C105.7 203.7 56.5 113.1 0 28.5 10.6 31.3 20.4 32 29.5 32c8 0 18.1-.7 30.3-3.5 36.4 64.2 72.9 123.2 119.9 200.4 33.2-54.7 80.9-128.1 119.9-200.4 9.8 2.6 19.6 3.5 29.2 3.5 10.2 0 20.6-.9 31.1-3.5C329.4 71.1 243 221.3 204.9 288z"],yandex:[256,512,[],"f413","M153.1 315.8L65.7 512H2l96-209.8c-45.1-22.9-75.2-64.4-75.2-141.1C22.7 53.7 90.8 0 171.7 0H254v512h-55.1V315.8h-45.8zm45.8-269.3h-29.4c-44.4 0-87.4 29.4-87.4 114.6 0 82.3 39.4 108.8 87.4 108.8h29.4V46.5z"],"yandex-international":[320,512,[],"f414","M129.5 512V345.9L18.5 48h55.8l81.8 229.7L250.2 0h51.3L180.8 347.8V512h-51.3z"],yelp:[384,512,[],"f1e9","M136.9 328c-1 .3-109.2 35.7-115.8 35.7-15.2-.9-18.5-16.2-19.9-31.2-1.5-14.2-1.4-29.8.3-46.8 1.9-18.8 5.5-45.1 24.2-44 4.8 0 67.1 25.9 112.7 44.4 17.1 6.8 18.6 35.8-1.5 41.9zm57.9-113.9c1.8 38.2-25.5 48.5-47.2 14.3L41.3 60.4c-1.5-6.6.3-12.4 5.3-17.4C62.2 26.5 146 3.2 168.1 8.9c7.5 1.9 12.1 6.1 13.8 12.6 1.3 8.3 11.5 167.4 12.9 192.6zm-1.4 164.8c0 4.6.2 116.4-1.7 121.5-2.3 6-7 9.7-14.3 11.2-10.1 1.7-27.1-1.9-51-10.7-22-8.1-56.7-21.5-49.3-42.5 2.8-6.9 51.4-62.8 77.3-93.6 12-15.2 39.8-5.5 39 14.1zm180.2-117.8c-5.6 3.7-110.8 28.2-118.1 30.6l.3-.6c-18.1 4.7-35.4-18.5-23.3-34.6 3.7-3.7 65.9-92.4 72.8-97 5.2-3.6 11.3-3.8 18.3-.6 18.4 8.8 55.1 63.1 57.4 84.6-.1 2.9 1.2 11.7-7.4 17.6zm10.1 130.7c-2.7 20.6-44.5 73.4-63.8 81-6.9 2.6-12.9 2-17.7-2-5-3.5-61.8-97.1-64.9-102.3-10.9-16.2 6.8-39.8 25.6-33.2 0 0 110.5 35.7 114.7 39.4 5.2 4.1 7.2 9.8 6.1 17.1z"],yoast:[448,512,[],"f2b1","M91.265 96h186.043l-7.008 18.878H91.265c-39.658 0-71.889 31.556-71.889 70.292v205.373c0 35.401 24.882 70.311 84.001 70.311V480H91.265C41.165 480 0 439.83 0 390.544V185.17C0 135.937 40.709 96 91.265 96zm229.114-56h66.49C243.146 418.092 241.192 438.918 202.18 479.331c-20.779 21.646-49.294 31.719-78.328 32.669v-51.146c49.234-7.662 64.606-49.855 64.606-75.284 0-20.078.577-12.645-82.117-223.219h61.386l50.354 156.58L320.379 40zM448 181.465V480H233.963c6.635-9.621 10.679-16.277 12.112-19.413h182.529V181.465c0-32.543-17.097-51.945-48.194-62.914l6.733-17.578C428.763 114.636 448 144.059 448 181.465z"],youtube:[576,512,[],"f167","M549.655 124.083c-6.281-23.65-24.787-42.276-48.284-48.597C458.781 64 288 64 288 64S117.22 64 74.629 75.486c-23.497 6.322-42.003 24.947-48.284 48.597-11.412 42.867-11.412 132.305-11.412 132.305s0 89.438 11.412 132.305c6.281 23.65 24.787 41.5 48.284 47.821C117.22 448 288 448 288 448s170.78 0 213.371-11.486c23.497-6.321 42.003-24.171 48.284-47.821 11.412-42.867 11.412-132.305 11.412-132.305s0-89.438-11.412-132.305zm-317.51 213.508V175.185l142.739 81.205-142.739 81.201z"]}),t=z||{};t.___FONT_AWESOME___||(t.___FONT_AWESOME___={}),t.___FONT_AWESOME___.styles||(t.___FONT_AWESOME___.styles={}),t.___FONT_AWESOME___.hooks||(t.___FONT_AWESOME___.hooks={}),t.___FONT_AWESOME___.shims||(t.___FONT_AWESOME___.shims=[]);var s=t.___FONT_AWESOME___,r=Object.assign||function(c){for(var l=1;l-1;z--){var e=h[z],a=(e.tagName||"").toUpperCase();["STYLE","LINK"].indexOf(a)>-1&&(v=e)}return K.head.insertBefore(l,v),c}}function v(){return++Cc}function z(c){for(var l=[],h=(c||[]).length>>>0;h--;)l[h]=c[h];return l}function e(c){return c.classList?z(c.classList):(c.getAttribute("class")||"").split(" ").filter(function(c){return c})}function a(c,h){var v=h.split("-"),z=v[0],e=v.slice(1).join("-");return z!==c||""===e||l(e)?null:e}function m(c){return(""+c).replace(/&/g,"&").replace(/"/g,""").replace(/'/g,"'").replace(//g,">")}function t(c){return Object.keys(c||{}).reduce(function(l,h){return l+(h+'="')+m(c[h])+'" '},"").trim()}function s(c){return Object.keys(c||{}).reduce(function(l,h){return l+(h+": ")+c[h]+";"},"")}function r(c){return c.size!==Vc.size||c.x!==Vc.x||c.y!==Vc.y||c.rotate!==Vc.rotate||c.flipX||c.flipY}function f(c){var l=c.transform,h=c.containerWidth,v=c.iconWidth;return{outer:{transform:"translate("+h/2+" 256)"},inner:{transform:"translate("+32*l.x+", "+32*l.y+") "+" "+("scale("+l.size/16*(l.flipX?-1:1)+", "+l.size/16*(l.flipY?-1:1)+") ")+" "+("rotate("+l.rotate+" 0 0)")},path:{transform:"translate("+v/2*-1+" -256)"}}}function M(c){var l=c.transform,h=c.width,v=void 0===h?$:h,z=c.height,e=void 0===z?$:z,a=c.startCentered,m=void 0!==a&&a,t="";return t+=m&&Z?"translate("+(l.x/oc-v/2)+"em, "+(l.y/oc-e/2)+"em) ":m?"translate(calc(-50% + "+l.x/oc+"em), calc(-50% + "+l.y/oc+"em)) ":"translate("+l.x/oc+"em, "+l.y/oc+"em) ",t+="scale("+l.size/oc*(l.flipX?-1:1)+", "+l.size/oc*(l.flipY?-1:1)+") ",t+="rotate("+l.rotate+"deg) "}function i(c){var l,h=c.icons,z=h.main,e=h.mask,a=c.prefix,m=c.iconName,t=c.transform,s=c.symbol,r=c.title,f=c.extra,M=e.found?e:z,i=M.width,n=M.height,H="fa-w-"+Math.ceil(i/n*16),o=[Hc.replacementClass,m?Hc.familyPrefix+"-"+m:"",H].concat(f.classes).join(" "),V={children:[],attributes:fc({},f.attributes,(l={},rc(l,cc,""),rc(l,"data-prefix",a),rc(l,"data-icon",m),rc(l,"class",o),rc(l,"role","img"),rc(l,"xmlns","http://www.w3.org/2000/svg"),rc(l,"viewBox","0 0 "+i+" "+n),l))};r&&V.children.push({tag:"title",attributes:{id:V.attributes["aria-labelledby"]||"title-"+v()},children:[r]});var C=fc({},V,{prefix:a,iconName:m,main:z,mask:e,transform:t,symbol:s,styles:f.styles}),L=e.found&&z.found?uc(C):dc(C),u=L.children,d=L.attributes;return C.children=u,C.attributes=d,s?gc(C):pc(C)}function n(c){var l,h=c.content,v=c.width,z=c.height,e=c.transform,a=c.title,m=c.extra,t=fc({},m.attributes,a?{title:a}:{},(l={},rc(l,cc,""),rc(l,"class",m.classes.join(" ")),l)),f=fc({},m.styles);r(e)&&(f.transform=M({transform:e,startCentered:!0,width:v,height:z}),f["-webkit-transform"]=f.transform);var i=s(f);i.length>0&&(t.style=i);var n=[];return n.push({tag:"span",attributes:t,children:[h]}),a&&n.push({tag:"span",attributes:{class:"sr-only"},children:[a]}),n}function H(c,l){return Nc[c][l]}function o(c,l){return qc[c][l]}function V(c){return Tc[c]||{prefix:null,iconName:null}}function C(c){return c.reduce(function(c,l){var h=a(Hc.familyPrefix,l);if(Fc[l])c.prefix=l;else if(h){var v="fa"===c.prefix?V(h):{};c.iconName=v.iconName||h,c.prefix=v.prefix||c.prefix}else l!==Hc.replacementClass&&0!==l.indexOf("fa-w-")&&c.rest.push(l);return c},Wc())}function L(c,l,h){if(c&&c[l]&&c[l][h])return{prefix:l,iconName:h,icon:c[l][h]}}function u(c){var l=c.tag,h=c.attributes,v=void 0===h?{}:h,z=c.children,e=void 0===z?[]:z;return"string"==typeof c?m(c):"<"+l+" "+t(v)+">"+e.map(u).join("")+""}function d(c){var l=c.getAttribute?c.getAttribute("class"):null;return!!l&&(!!~l.toString().indexOf(Hc.replacementClass)||~l.toString().indexOf("fa-layers-text"))}function p(){return!0===Hc.autoReplaceSvg?Ic.replace:Ic[Hc.autoReplaceSvg]||Ic.replace}function g(c,l){var h="function"==typeof l?l:Pc;0===c.length?h():(U.requestAnimationFrame||function(c){return c()})(function(){var l=p(),v=kc.begin("mutate");c.map(l),v(),h()})}function b(c){Rc=!0,c(),Rc=!1}function w(c){if(G){var l=c.treeCallback,h=c.nodeCallback,v=c.pseudoElementsCallback,a=new G(function(c){Rc||z(c).forEach(function(c){if("childList"===c.type&&c.addedNodes.length>0&&!d(c.addedNodes[0])&&(Hc.searchPseudoElements&&v(c.target),l(c.target)),"attributes"===c.type&&"class"===c.attributeName&&c.target.parentNode&&Hc.searchPseudoElements&&v(c.target.parentNode),"attributes"===c.type&&d(c.target)&&~ac.indexOf(c.attributeName))if("class"===c.attributeName){var z=C(e(c.target)),a=z.prefix,m=z.iconName;a&&c.target.setAttribute("data-prefix",a),m&&c.target.setAttribute("data-icon",m)}else h(c.target)})});K.getElementsByTagName&&a.observe(K.getElementsByTagName("body")[0],{childList:!0,attributes:!0,characterData:!0,subtree:!0})}}function y(c){for(var l="",h=0;h1&&void 0!==arguments[1]?arguments[1]:null,h=K.documentElement.classList,v=function(c){return h.add(hc+"-"+c)},e=function(c){return h.remove(hc+"-"+c)},a=Object.keys(ll),m=["."+hl+":not(["+cc+"])"].concat(a.map(function(c){return"."+c+":not(["+cc+"])"})).join(", ");if(0!==m.length){var t=z(c.querySelectorAll(m));if(t.length>0){v("pending"),e("complete");var s=kc.begin("onTree"),r=t.reduce(function(c,l){try{var h=O(l);h&&c.push(h)}catch(c){vc||c instanceof _&&console.error(c)}return c},[]);s(),g(r,function(){v("active"),v("complete"),e("pending"),"function"==typeof l&&l()})}}}function q(c){var l=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,h=O(c);h&&g([h],l)}function T(c){return{found:!0,width:c[0],height:c[1],icon:{tag:"path",attributes:{fill:"currentColor",d:c.slice(4)[0]}}}}function j(){Hc.autoAddCss&&(sl||h(tl()),sl=!0)}function F(c,l){return Object.defineProperty(c,"abstract",{get:l}),Object.defineProperty(c,"html",{get:function(){return c.abstract.map(function(c){return u(c)})}}),Object.defineProperty(c,"node",{get:function(){if(K.createElement){var l=K.createElement("div");return l.innerHTML=c.html,l.children}}}),c}function W(c){var l=c.prefix,h=void 0===l?"fa":l,v=c.iconName;if(v)return L(rl.definitions,h,v)||L(wc.styles,h,v)}var P=function(){},I={},R={},B=null,X={mark:P,measure:P};try{"undefined"!=typeof window&&(I=window),"undefined"!=typeof document&&(R=document),"undefined"!=typeof MutationObserver&&(B=MutationObserver),"undefined"!=typeof performance&&(X=performance)}catch(c){}var Y=(I.navigator||{}).userAgent,D=void 0===Y?"":Y,U=I,K=R,G=B,J=X,Q=!!U.document,Z=~D.indexOf("MSIE")||~D.indexOf("Trident/"),$=16,cc="data-fa-processed",lc="data-fa-pseudo-element",hc="fontawesome-i2svg",vc=function(){try{return!0}catch(c){return!1}}(),zc=[1,2,3,4,5,6,7,8,9,10],ec=zc.concat([11,12,13,14,15,16,17,18,19,20]),ac=["class","data-prefix","data-icon","data-fa-transform","data-fa-mask"],mc=["xs","sm","lg","fw","ul","li","border","pull-left","pull-right","spin","pulse","rotate-90","rotate-180","rotate-270","flip-horizontal","flip-vertical","stack","stack-1x","stack-2x","inverse","layers","layers-text","layers-counter"].concat(zc.map(function(c){return c+"x"})).concat(ec.map(function(c){return"w-"+c})),tc=function(c,l){if(!(c instanceof l))throw new TypeError("Cannot call a class as a function")},sc=function(){function c(c,l){for(var h=0;h=0||Object.prototype.hasOwnProperty.call(c,v)&&(h[v]=c[v]);return h},ic=function(c){if(Array.isArray(c)){for(var l=0,h=Array(c.length);l0&&(h.style=e),r(z)){var a=f({transform:z,containerWidth:v.width,iconWidth:v.width});l.push({tag:"g",attributes:fc({},a.outer),children:[{tag:"g",attributes:fc({},a.inner),children:[{tag:v.icon.tag,children:v.icon.children,attributes:fc({},v.icon.attributes,a.path)}]}]})}else l.push(v.icon);return{children:l,attributes:h}},pc=function(c){var l=c.children,h=c.main,v=c.mask,z=c.attributes,e=c.styles,a=c.transform;if(r(a)&&h.found&&!v.found){var m={x:h.width/h.height/2,y:.5};z.style=s(fc({},e,{"transform-origin":m.x+a.x/16+"em "+(m.y+a.y/16)+"em"}))}return[{tag:"svg",attributes:z,children:l}]},gc=function(c){var l=c.prefix,h=c.iconName,v=c.children,z=c.attributes,e=c.symbol,a=!0===e?l+"-"+Hc.familyPrefix+"-"+h:e;return[{tag:"svg",attributes:{style:"display: none;"},children:[{tag:"symbol",attributes:fc({},z,{id:a}),children:v}]}]},bc=U||{};bc.___FONT_AWESOME___||(bc.___FONT_AWESOME___={}),bc.___FONT_AWESOME___.styles||(bc.___FONT_AWESOME___.styles={}),bc.___FONT_AWESOME___.hooks||(bc.___FONT_AWESOME___.hooks={}),bc.___FONT_AWESOME___.shims||(bc.___FONT_AWESOME___.shims=[]);var wc=bc.___FONT_AWESOME___,yc=function(){},Sc=Hc.measurePerformance&&J&&J.mark&&J.measure?J:{mark:yc,measure:yc},_c=function(c){Sc.mark('FA "5.0.1" '+c+" ends"),Sc.measure('FA "5.0.1" '+c,'FA "5.0.1" '+c+" begins",'FA "5.0.1" '+c+" ends")},kc={begin:function(c){return Sc.mark('FA "5.0.1" '+c+" begins"),function(){return _c(c)}},end:_c},Ac=function(c,l){return function(h,v,z,e){return c.call(l,h,v,z,e)}},xc=function(c,l,h,v){var z,e,a,m=Object.keys(c),t=m.length,s=void 0!==v?Ac(l,v):l;for(void 0===h?(z=1,a=c[m[0]]):(z=0,a=h);z0&&(c[v]=z.join(":").trim()),c},{})),h},Xc=function(c){var l=c.getAttribute("data-prefix"),h=c.getAttribute("data-icon"),v=void 0!==c.innerText?c.innerText.trim():"",z=C(e(c));return l&&h&&(z.prefix=l,z.iconName=h),z.prefix&&v.length>1?z.iconName=o(z.prefix,c.innerText):z.prefix&&1===v.length&&(z.iconName=H(z.prefix,y(c.innerText))),z},Yc=function(c){var l={size:16,x:0,y:0,flipX:!1,flipY:!1,rotate:0};return c?c.toLowerCase().split(" ").reduce(function(c,l){var h=l.toLowerCase().split("-"),v=h[0],z=h.slice(1).join("-");if(v&&"h"===z)return c.flipX=!0,c;if(v&&"v"===z)return c.flipY=!0,c;if(z=parseFloat(z),isNaN(z))return c;switch(v){case"grow":c.size=c.size+z;break;case"shrink":c.size=c.size-z;break;case"left":c.x=c.x-z;break;case"right":c.x=c.x+z;break;case"up":c.y=c.y-z;break;case"down":c.y=c.y+z;break;case"rotate":c.rotate=c.rotate+z}return c},l):l},Dc=function(c){return Yc(c.getAttribute("data-fa-transform"))},Uc=function(c){var l=c.getAttribute("data-fa-symbol");return null!==l&&(""===l||l)},Kc=function(c){var l=z(c.attributes).reduce(function(c,l){return"class"!==c.name&&"style"!==c.name&&(c[l.name]=l.value),c},{}),h=c.getAttribute("title");return Hc.autoA11y&&(h?l["aria-labelledby"]=Hc.replacementClass+"-title-"+v():l["aria-hidden"]="true"),l},Gc=function(c){var l=c.getAttribute("data-fa-mask");return l?C(l.split(" ").map(function(c){return c.trim()})):Wc()};_.prototype=Object.create(Error.prototype),_.prototype.constructor=_;var Jc={fill:"currentColor"},Qc={attributeType:"XML",repeatCount:"indefinite",dur:"2s"},Zc={tag:"path",attributes:fc({},Jc,{d:"M156.5,447.7l-12.6,29.5c-18.7-9.5-35.9-21.2-51.5-34.9l22.7-22.7C127.6,430.5,141.5,440,156.5,447.7z M40.6,272H8.5 c1.4,21.2,5.4,41.7,11.7,61.1L50,321.2C45.1,305.5,41.8,289,40.6,272z M40.6,240c1.4-18.8,5.2-37,11.1-54.1l-29.5-12.6 C14.7,194.3,10,216.7,8.5,240H40.6z M64.3,156.5c7.8-14.9,17.2-28.8,28.1-41.5L69.7,92.3c-13.7,15.6-25.5,32.8-34.9,51.5 L64.3,156.5z M397,419.6c-13.9,12-29.4,22.3-46.1,30.4l11.9,29.8c20.7-9.9,39.8-22.6,56.9-37.6L397,419.6z M115,92.4 c13.9-12,29.4-22.3,46.1-30.4l-11.9-29.8c-20.7,9.9-39.8,22.6-56.8,37.6L115,92.4z M447.7,355.5c-7.8,14.9-17.2,28.8-28.1,41.5 l22.7,22.7c13.7-15.6,25.5-32.9,34.9-51.5L447.7,355.5z M471.4,272c-1.4,18.8-5.2,37-11.1,54.1l29.5,12.6 c7.5-21.1,12.2-43.5,13.6-66.8H471.4z M321.2,462c-15.7,5-32.2,8.2-49.2,9.4v32.1c21.2-1.4,41.7-5.4,61.1-11.7L321.2,462z M240,471.4c-18.8-1.4-37-5.2-54.1-11.1l-12.6,29.5c21.1,7.5,43.5,12.2,66.8,13.6V471.4z M462,190.8c5,15.7,8.2,32.2,9.4,49.2h32.1 c-1.4-21.2-5.4-41.7-11.7-61.1L462,190.8z M92.4,397c-12-13.9-22.3-29.4-30.4-46.1l-29.8,11.9c9.9,20.7,22.6,39.8,37.6,56.9 L92.4,397z M272,40.6c18.8,1.4,36.9,5.2,54.1,11.1l12.6-29.5C317.7,14.7,295.3,10,272,8.5V40.6z M190.8,50 c15.7-5,32.2-8.2,49.2-9.4V8.5c-21.2,1.4-41.7,5.4-61.1,11.7L190.8,50z M442.3,92.3L419.6,115c12,13.9,22.3,29.4,30.5,46.1 l29.8-11.9C470,128.5,457.3,109.4,442.3,92.3z M397,92.4l22.7-22.7c-15.6-13.7-32.8-25.5-51.5-34.9l-12.6,29.5 C370.4,72.1,384.4,81.5,397,92.4z"})},$c=fc({},Qc,{attributeName:"opacity"}),cl={tag:"g",children:[Zc,{tag:"circle",attributes:fc({},Jc,{cx:"256",cy:"364",r:"28"}),children:[{tag:"animate",attributes:fc({},Qc,{attributeName:"r",values:"28;14;28;28;14;28;"})},{tag:"animate",attributes:fc({},$c,{values:"1;0;1;1;0;1;"})}]},{tag:"path",attributes:fc({},Jc,{opacity:"1",d:"M263.7,312h-16c-6.6,0-12-5.4-12-12c0-71,77.4-63.9,77.4-107.8c0-20-17.8-40.2-57.4-40.2c-29.1,0-44.3,9.6-59.2,28.7 c-3.9,5-11.1,6-16.2,2.4l-13.1-9.2c-5.6-3.9-6.9-11.8-2.6-17.2c21.2-27.2,46.4-44.7,91.2-44.7c52.3,0,97.4,29.8,97.4,80.2 c0,67.6-77.4,63.5-77.4,107.8C275.7,306.6,270.3,312,263.7,312z"}),children:[{tag:"animate",attributes:fc({},$c,{values:"1;0;0;0;0;1;"})}]},{tag:"path",attributes:fc({},Jc,{opacity:"0",d:"M232.5,134.5l7,168c0.3,6.4,5.6,11.5,12,11.5h9c6.4,0,11.7-5.1,12-11.5l7-168c0.3-6.8-5.2-12.5-12-12.5h-23 C237.7,122,232.2,127.7,232.5,134.5z"}),children:[{tag:"animate",attributes:fc({},$c,{values:"0;0;1;1;0;0;"})}]}]},ll=wc.styles,hl="fa-layers-text",vl=/Font Awesome 5 (Solid|Regular|Light|Brands)/,zl={Solid:"fas",Regular:"far",Light:"fal",Brands:"fab"},el=[],al=(K.documentElement.doScroll?/^loaded|^c/:/^loaded|^i|^c/).test(K.readyState);al||K.addEventListener("DOMContentLoaded",function c(){K.removeEventListener("DOMContentLoaded",c),al=1,el.map(function(c){return c()})});var ml=function(c){K&&(al?setTimeout(c,0):el.push(c))},tl=function(){var c="svg-inline--fa",l=Hc.familyPrefix,h=Hc.replacementClass,v="svg:not(:root).svg-inline--fa{overflow:visible}.svg-inline--fa{display:inline-block;font-size:inherit;height:1em;overflow:visible;vertical-align:-.125em}.svg-inline--fa.fa-lg{vertical-align:-.225em}.svg-inline--fa.fa-w-1{width:.0625em}.svg-inline--fa.fa-w-2{width:.125em}.svg-inline--fa.fa-w-3{width:.1875em}.svg-inline--fa.fa-w-4{width:.25em}.svg-inline--fa.fa-w-5{width:.3125em}.svg-inline--fa.fa-w-6{width:.375em}.svg-inline--fa.fa-w-7{width:.4375em}.svg-inline--fa.fa-w-8{width:.5em}.svg-inline--fa.fa-w-9{width:.5625em}.svg-inline--fa.fa-w-10{width:.625em}.svg-inline--fa.fa-w-11{width:.6875em}.svg-inline--fa.fa-w-12{width:.75em}.svg-inline--fa.fa-w-13{width:.8125em}.svg-inline--fa.fa-w-14{width:.875em}.svg-inline--fa.fa-w-15{width:.9375em}.svg-inline--fa.fa-w-16{width:1em}.svg-inline--fa.fa-w-17{width:1.0625em}.svg-inline--fa.fa-w-18{width:1.125em}.svg-inline--fa.fa-w-19{width:1.1875em}.svg-inline--fa.fa-w-20{width:1.25em}.svg-inline--fa.fa-pull-left{margin-right:.3em;width:auto}.svg-inline--fa.fa-pull-right{margin-left:.3em;width:auto}.svg-inline--fa.fa-border{height:1.5em}.svg-inline--fa.fa-li{width:2em}.svg-inline--fa.fa-fw{width:1.25em}.fa-layers svg.svg-inline--fa{bottom:0;left:0;margin:auto;position:absolute;right:0;top:0}.fa-layers{display:inline-block;height:1em;position:relative;text-align:center;vertical-align:-12.5%;width:1em}.fa-layers svg.svg-inline--fa{-webkit-transform-origin:center center;transform-origin:center center}.fa-layers-counter,.fa-layers-text{display:inline-block;position:absolute;text-align:center}.fa-layers-text{left:50%;top:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);-webkit-transform-origin:center center;transform-origin:center center}.fa-layers-counter{background-color:#ff253a;border-radius:1em;color:#fff;height:1.5em;line-height:1;max-width:5em;min-width:1.5em;overflow:hidden;padding:.25em;right:0;text-overflow:ellipsis;top:0;-webkit-transform:scale(.25);transform:scale(.25);-webkit-transform-origin:top right;transform-origin:top right}.fa-layers-bottom-right{bottom:0;right:0;top:auto;-webkit-transform:scale(.25);transform:scale(.25);-webkit-transform-origin:bottom right;transform-origin:bottom right}.fa-layers-bottom-left{bottom:0;left:0;right:auto;top:auto;-webkit-transform:scale(.25);transform:scale(.25);-webkit-transform-origin:bottom left;transform-origin:bottom left}.fa-layers-top-right{right:0;top:0;-webkit-transform:scale(.25);transform:scale(.25);-webkit-transform-origin:top right;transform-origin:top right}.fa-layers-top-left{left:0;right:auto;top:0;-webkit-transform:scale(.25);transform:scale(.25);-webkit-transform-origin:top left;transform-origin:top left}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-.0667em}.fa-xs{font-size:.75em}.fa-sm{font-size:.875em}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:2.5em;padding-left:0}.fa-ul>li{position:relative}.fa-li{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.fa-border{border:solid .08em #eee;border-radius:.1em;padding:.2em .25em .15em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.fab.fa-pull-left,.fal.fa-pull-left,.far.fa-pull-left,.fas.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fab.fa-pull-right,.fal.fa-pull-right,.far.fa-pull-right,.fas.fa-pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.fa-rotate-90{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-webkit-transform:scale(-1,1);transform:scale(-1,1)}.fa-flip-vertical{-webkit-transform:scale(1,-1);transform:scale(1,-1)}.fa-flip-horizontal.fa-flip-vertical{-webkit-transform:scale(-1,-1);transform:scale(-1,-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-rotate-90{-webkit-filter:none;filter:none}.fa-stack{display:inline-block;height:2em;position:relative;width:2em}.fa-stack-1x,.fa-stack-2x{bottom:0;left:0;margin:auto;position:absolute;right:0;top:0}.svg-inline--fa.fa-stack-1x{height:1em;width:1em}.svg-inline--fa.fa-stack-2x{height:2em;width:2em}.fa-inverse{color:#fff}.sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}";if("fa"!==l||h!==c){var z=new RegExp("\\.fa\\-","g"),e=new RegExp("\\."+c,"g");v=v.replace(z,"."+l+"-").replace(e,"."+h)}return v},sl=!1,rl=new(function(){function c(){tc(this,c),this.definitions={}}return sc(c,[{key:"add",value:function(){for(var c=this,l=arguments.length,h=Array(l),v=0;v0&&void 0!==arguments[0]?arguments[0]:{};j();var l=c.node,h=void 0===l?K:l,v=c.callback,z=void 0===v?function(){}:v;Hc.searchPseudoElements&&E(h),N(h,z)},css:tl,insertCss:function(){h(tl())}},library:rl,parse:{transform:function(c){return Yc(c)}},findIconDefinition:W,icon:function(c){return function(l){var h=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},v=(l||{}).icon?l:W(l||{}),z=h.mask;return z&&(z=(z||{}).icon?z:W(z||{})),c(v,fc({},h,{mask:z}))}}(function(c){var l=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},h=l.transform,z=void 0===h?Vc:h,e=l.symbol,a=void 0!==e&&e,m=l.mask,t=void 0===m?null:m,s=l.title,r=void 0===s?null:s,f=l.classes,M=void 0===f?[]:f,n=l.attributes,H=void 0===n?{}:n,o=l.styles,V=void 0===o?{}:o;if(c){var C=c.prefix,L=c.iconName,u=c.icon;return F(fc({type:"icon"},c),function(){return j(),Hc.autoA11y&&(r?H["aria-labelledby"]=Hc.replacementClass+"-title-"+v():H["aria-hidden"]="true"),i({icons:{main:T(u),mask:t?T(t.icon):{found:!1,width:null,height:null,icon:{}}},prefix:C,iconName:L,transform:fc({},Vc,z),symbol:a,title:r,extra:{attributes:H,styles:V,classes:M}})})}}),text:function(c){var l=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},h=l.transform,v=void 0===h?Vc:h,z=l.title,e=void 0===z?null:z,a=l.classes,m=void 0===a?[]:a,t=l.attributes,s=void 0===t?{}:t,r=l.styles,f=void 0===r?{}:r;return F({type:"text",content:c},function(){return j(),n({content:c,transform:fc({},Vc,v),title:e,extra:{attributes:s,styles:f,classes:[Hc.familyPrefix+"-layers-text"].concat(ic(m))}})})},layer:function(c){return F({type:"layer"},function(){j();var l=[];return c(function(c){l=Array.isArray(c)?c.map(function(c){l=l.concat(c.abstract)}):l.concat(c.abstract)}),[{tag:"span",attributes:{class:Hc.familyPrefix+"-layers"},children:l}]})}};Object.defineProperty(fl,"config",{get:function(){Hc.autoReplaceSvg,Hc.observeMutations,Hc.showMissingIcons;return Mc(Hc,["autoReplaceSvg","observeMutations","showMissingIcons"])},set:function(l){c(l)}}),function(c){try{c()}catch(c){}}(function(){var c=function(){Hc.autoReplaceSvg&&fl.dom.i2svg({node:K})};Q&&(U.FontAwesome||(U.FontAwesome=fl),ml(function(){Object.keys(wc.styles).length>0&&c(),Hc.observeMutations&&"function"==typeof MutationObserver&&w({treeCallback:N,nodeCallback:q,pseudoElementsCallback:E})})),wc.hooks=fc({},wc.hooks,{addPack:function(l,h){wc.styles[l]=fc({},wc.styles[l]||{},h),jc(),c()},addShims:function(l){var h;(h=wc.shims).push.apply(h,ic(l)),jc(),c()}})})}(); \ No newline at end of file diff --git a/account/sessions.ftl b/account/sessions.ftl new file mode 100644 index 0000000..fb24885 --- /dev/null +++ b/account/sessions.ftl @@ -0,0 +1,46 @@ +<#import "template.ftl" as layout> +<@layout.mainLayout active='sessions' bodyClass='sessions'; section> + +
+
+

${msg("sessionsHtmlTitle")}

+
+
+ + + + + + + + + + + + + + <#list sessions.sessions as session> + + + + + + + + + + +
${msg("ip")}${msg("started")}${msg("lastAccess")}${msg("expires")}${msg("clients")}
${session.ipAddress}${session.started?datetime}${session.lastAccess?datetime}${session.expires?datetime} + <#list session.clients as client> + ${client}
+ +
+ +
+ +
+ +
+
+ + diff --git a/account/template.ftl b/account/template.ftl new file mode 100644 index 0000000..6e0d1e6 --- /dev/null +++ b/account/template.ftl @@ -0,0 +1,75 @@ +<#macro mainLayout active bodyClass> + + + + + + + + ${msg("accountManagementTitle")} + + + + + + + <#if properties.styles?has_content> + <#list properties.styles?split(' ') as style> + + + + <#if properties.scripts?has_content> + <#list properties.scripts?split(' ') as script> + + + + + + + + + +
+ <#if message?has_content> +
+ <#if message.type=='success' > + <#if message.type=='error' > + ${message.summary?no_esc} +
+ + + <#nested "content"> +
+ + + + diff --git a/account/theme.properties b/account/theme.properties new file mode 100644 index 0000000..824957a --- /dev/null +++ b/account/theme.properties @@ -0,0 +1,3 @@ +locales=ca,de,en,es,fr,it,ja,lt,nl,no,pt-BR,ru,sv,zh-CN + +styles=css/style.css \ No newline at end of file diff --git a/account/totp.ftl b/account/totp.ftl new file mode 100644 index 0000000..72cb647 --- /dev/null +++ b/account/totp.ftl @@ -0,0 +1,67 @@ +<#import "template.ftl" as layout> +<@layout.mainLayout active='totp' bodyClass='totp'; section> + + <#if totp.enabled> +

${msg("authenticatorTitle")}

+ + + + + + + + + + + + +
${msg("configureAuthenticators")}
${msg("mobile")} +
+ + +
+
+ <#else> +

${msg("authenticatorTitle")}

+ +
    +
  1. +

    ${msg("totpStep1")?no_esc}

    +
  2. +
  3. +

    ${msg("totpStep2")}

    +

    Figure: Barcode

    +

    ${totp.totpSecretEncoded}

    +
  4. +
  5. +

    ${msg("totpStep3")}

    +
  6. +
+ +
+ +
+
+ +
+ +
+ + +
+
+ +
+ + +
+
+ + + diff --git a/admin/index.ftl b/admin/index.ftl new file mode 100644 index 0000000..397c4b0 --- /dev/null +++ b/admin/index.ftl @@ -0,0 +1,118 @@ + + + + + + + + + + + + <#if properties.styles?has_content> + <#list properties.styles?split(' ') as style> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <#if properties.scripts?has_content> + <#list properties.scripts?split(' ') as script> + + + + + + + + +
+
+
+
+
+ + + +
Loading...
+ + + \ No newline at end of file diff --git a/admin/messages/admin-messages_ca.properties b/admin/messages/admin-messages_ca.properties new file mode 100644 index 0000000..0025c88 --- /dev/null +++ b/admin/messages/admin-messages_ca.properties @@ -0,0 +1,466 @@ +# Common messages +enabled=Habilitat +name=Nom +save=Desar +cancel=Cancel\u00B7la +onText=SI +offText=NO +client=Client +clients=Clients +clear=Neteja +selectOne=Selecciona un... + +true=S\u00ED +false=No + + +# Realm settings +realm-detail.enabled.tooltip=Els usuaris i clients nom\u00E9s poden accedir a un domini si est\u00E0 habilitat +registrationAllowed=Registre d''usuari +registrationAllowed.tooltip=Habilitar/deshabilitar la p\u00E0gina de registre. Un enlla\u00E7 per al registre es mostrar\u00E0 tamb\u00E9 a la p\u00E0gina d''inici de sessi\u00F3. +registrationEmailAsUsername=Email com a nom d''usuari +registrationEmailAsUsername.tooltip=Si est\u00E0 habilitat el nom d''usuari queda ocult del formulari de registre i l''email es fa servir com a nom d''usuari per als nous usuaris. +editUsernameAllowed=Edita el nom d''usuari +editUsernameAllowed.tooltip=Si est\u00E0 habilitat, el nom d''usuari \u00E9s editable, altrament \u00E9s de nom\u00E9s lectura. +resetPasswordAllowed=Oblit contrasenya +resetPasswordAllowed.tooltip=Mostra un enlla\u00E7 a la p\u00E0gina d''inici de sessi\u00F3 perqu\u00E8 l''usuari faci clic quan ha oblidat les seves credencials. +rememberMe=Mantenir connectat +rememberMe.tooltip=Mostra la casella de selecci\u00F3 en la p\u00E0gina d''inici de sessi\u00F3 per a permetre a l''usuari estar connectat entre reinicis del navegador fins que la sessi\u00F3 expiri. +verifyEmail=Verificar email +verifyEmail.tooltip=For\u00E7ar l''usuari a verificar la seva adre\u00E7a de correu electr\u00F2nic la primera vegada que inici\u00EF sessi\u00F3. +sslRequired=Sol\u00B7licitar SSL +sslRequired.option.all=totes les peticions +sslRequired.option.external=peticions externes +sslRequired.option.none=cap +sslRequired.tooltip=\u00C9s HTTP obligatori? ''cap'' significa que HTTPS no \u00E9s obligatori per cap direcic\u00F3n IP de client, ''peticions externes'' indica que localhost i les adreces IP privades poden accedir sense HTTPS, ''totes les peticions'' vol dir que HTTPS \u00E9s obligatori per a totes les adreces IP. +publicKey=Clau p\u00FAblica +gen-new-keys=Generar noves claus +certificate=Certificat +host=Host +smtp-host=Host SMTP +port=Port +smtp-port=Port SMTP (per defecte 25) +from=Des de +sender-email-addr=Email del emissor +enable-ssl=Habilitar SSL +enable-start-tls=Habilitar StartTLS +enable-auth=Habilitar autenticaci\u00F3 +username=Usuari +login-username=Usuari +password=Contrasenya +login-password=Contrasenya +login-theme=Tema d''inici de sessi\u00F3 +select-one=Selecciona un... +login-theme.tooltip=Selecciona el tema per a les p\u00E0gines d''inici de sessi\u00F3, TOTP, permisos, registre i recordatori de contrasenya. +account-theme=Tema de compte +account-theme.tooltip=Selecciona el tema per a les p\u00E0gines de gesti\u00F3 del compte d''usuari. +admin-console-theme=Tema de consola d''administraci\u00F3 +select-theme-admin-console=Selecciona el tema per a la consola d''administraci\u00F3. +email-theme=Tema d''email +select-theme-email=Selecciona el tema per als correus electr\u00F2nics que s\u00F3n enviats pel servidor. +i18n-enabled=Internacionalitzaci\u00F3 activa +supported-locales=Idiomes suportats +supported-locales.placeholder=Indica l''idioma i prem Intro +default-locale=Idioma per defecte +realm-cache-enabled=Cach\u00E9 de domini habilitada +realm-cache-enabled.tooltip=Activar/desactivar la cach\u00E9 per al domini, client i dades de rols. +user-cache-enabled=Cach\u00E9 d''usuari habilitada +user-cache-enabled.tooltip=Habilitar/deshabilitar la cach\u00E9 d''usuaris i d''assignacions d''usuaris a rols. +revoke-refresh-token=Revocar el token d''actualitzaci\u00F3 +revoke-refresh-token.tooltip=Si est\u00E0 activat els tokens d''actualitzaci\u00F3 nom\u00E9s poden usar-se una vegada. En un altre cas els tokens d''actualitzaci\u00F3 no es revoquen quan s''utilitzen i poden ser usat m\u00FAltiples vegades. +sso-session-idle=Sessions SSO inactives +seconds=Segons +minutes=Minuts +hours=Hores +days=Dies +sso-session-max=Temps m\u00E0xim sessi\u00F3 SSO +sso-session-idle.tooltip=Temps m\u00E0xim que una sessi\u00F3 pot estar inactiva abans que expiri. Els tokens i sessions de navegador s\u00F3n invalidades quan la sessi\u00F3 expira. +sso-session-max.tooltip=Temps m\u00E0xim abans que una sessi\u00F3 expiri. Els tokens i sessions de navegador s\u00F3n invalidats quan una sessi\u00F3 expira. +offline-session-idle=Inactivitat de sessi\u00F3 sense connexi\u00F3 +offline-session-idle.tooltip=Temps m\u00E0xim inactiu d''una sessi\u00F3 sense connexi\u00F3 abans que expiri. Necessites fer servi un token sense connexi\u00F3 per refrescar almenys una vegada dins d'aquest per\u00EDode, en un altre cas la sessi\u00F3 sense connexi\u00F3 expirar\u00E0. +access-token-lifespan=Durada del token d''acc\u00E9s +access-token-lifespan.tooltip=Temps m\u00E0xim abans que un token d''acc\u00E9s expiri. Es recomana que aquest valor sigui curt en relaci\u00F3 al temps m\u00E0xim de SSO +client-login-timeout=Temps m\u00E0xim d''autenticaci\u00F3 +client-login-timeout.tooltip=Temps m\u00E0xim que un client t\u00E9 per finalitzar el protocol d''obtenci\u00F3 del token d''acc\u00E9s. Hauria de ser normalment de l''ordre d''1 minut. +login-timeout=Temps m\u00E0xim de desconnexi\u00F3 +login-timeout.tooltip=Temps m\u00E0xim que un usuari t\u00E9 per completar l''inici de sessi\u00F3. Es recomana que sigui relativament alt. 30 minuts o m\u00E9s. +login-action-timeout=Temps m\u00E0xim d''acci\u00F3 en l''inici de sessi\u00F3 +login-action-timeout.tooltip=Temps m\u00E0xim que un usuari t\u00E9 per completar accions relacionades amb l''inici de sessi\u00F3, com l''actualitzaci\u00F3 de contrasenya o configuraci\u00F3 de TOTP. \u00C9s recomanat que sigui relativament alt. 5 minuts o m\u00E9s. +headers=Cap\u00E7aleres +brute-force-detection=Detecci\u00F3 d''atacs per for\u00E7a bruta +x-frame-options=X-Frame-Options +click-label-for-info=Fes clic a l''enlla\u00E7 de l''etiqueta per obtenir m\u00E9s informaci\u00F3. El valor per defecte evita que les p\u00E0gines siguin incloses des d'iframes externs. +content-sec-policy=Content-Security-Policy +max-login-failures=Nombre m\u00E0xim d''errors d''inici de sessi\u00F3 +max-login-failures.tooltip=Indica quants errors es permeten abans que es dispari una espera. +wait-increment=Increment d''espera +wait-increment.tooltip=Quan s''ha arribat al llindar d''error, quant de temps ha d''estar un usuari bloquejat? +quick-login-check-millis=Temps en mil\u00B7lisegons entre inicis de sessi\u00F3 r\u00E0pids +quick-login-check-millis.tooltip=Si ocorren errors de forma concurrent i molt r\u00E0pida, bloquejar a l''usuari. +min-quick-login-wait=Temps m\u00EDnim entre errors de connexi\u00F3 r\u00E0pids +min-quick-login-wait.tooltip=Quant de temps s''ha d''esperar despr\u00E9s d''un error en un intent r\u00E0pid d''identificaci\u00F3 +max-wait=Espera m\u00E0xima +max-wait.tooltip=Temps m\u00E0xim que un usuari queda bloquejat. +failure-reset-time=Reinici del comptador d''errors +failure-reset-time.tooltip=Quan s''ha de reiniciar el comptador d''errors? +realm-tab-login=Inici de sessi\u00F3 +realm-tab-keys=Claus +realm-tab-email=Email +realm-tab-themes=Temes +realm-tab-cache=Cach\u00E9 +realm-tab-tokens=Tokens +realm-tab-security-defenses=Defenses de seguretat +realm-tab-general=General +add-realm=Afegir domini + +#Session settings +realm-sessions=Sessions de domini +revocation=Revocaci\u00F3 +logout-all=Desconnectar tot +active-sessions=Sessions actives +sessions=Sessions +not-before=No abans de +not-before.tooltip=Revocar qualsevol token em\u00E8s abans d''aquesta data. +set-to-now=Fixar a ara +push=Push +push.tooltip=Per a cada client que t\u00E9 un URL d''administraci\u00F3, notificar les noves pol\u00EDtiques de revocaci\u00F3. + +#Protocol Mapper +usermodel.prop.label=Propietat +usermodel.prop.tooltip=Nom del m\u00E8tode de propietat en la interf\u00EDcie UserModel. Per exemple, un valor de ''email'' faria refer\u00E8ncia al m\u00E8tode UserModel.getEmail(). +usermodel.attr.label=Atribut d''usuari +usermodel.attr.tooltip=Nom de l''atribut d''usuari emmagatzemat que \u00E9s el nom de l''atribut dins el map UserModel.attribute. +userSession.modelNote.label=Nota sessi\u00F3 usuari +userSession.modelNote.tooltip=Nom de la nota emmagatzemada en la sessi\u00F3 d''usuari dins del mapa UserSessionModel.note +multivalued.label=Valors m\u00FAltiples +multivalued.tooltip=Indica si l''atribut suporta m\u00FAltiples valors. Si est\u00E0 habilitat, la llista de tots els valors d''aquest atribut es fixar\u00E0 com a reclamaci\u00F3. Si est\u00E0 deshabilitat, nom\u00E9s el primer valor ser\u00E0 fixat com a reclamaci\u00F3. +selectRole.label=Selecciona rol +selectRole.tooltip=Introdueix el rol a la caixa de text de l''esquerra, o fes clic a aquest bot\u00F3 per navegar i buscar el rol que vols. +tokenClaimName.label=Nom de reclam del token +tokenClaimName.tooltip=Nom del reclam a inserir en el testimoni. Pot ser un nom complet com ''address.street''. En aquest cas, es crear\u00E0 un objecte JSON niat. +jsonType.label=Tipus JSON de reclamaci\u00F3 +jsonType.tooltip=El tipus de JSON que hauria de fer-se servir per omplir la petici\u00F3 de JSON en el token. long, int, boolean i String s\u00F3n valors v\u00E0lids +includeInIdToken.label=Afegir al token d''ID +includeInAccessToken.label=Afegir al token d''acc\u00E9s +includeInAccessToken.tooltip=S''hauria d'afegir la identitat reclamada al token d''acc\u00E9s? + + +# client details +clients.tooltip=Els clients s\u00F3n aplicacions de navegador de confian\u00E7a i serveis web d''un domini. Aquests clients poden sol\u00B7licitar un inici de sessi\u00F3. Tamb\u00E9 pots definir rols espec\u00EDfics de client. +search.placeholder=Cercar... +create=Crea +import=Importar +client-id=ID Client +base-url=URL Base +actions=Accions +not-defined=No definit +edit=Edita +delete=Esborra +no-results=Sense resultats +no-clients-available=No hi ha clients disponibles +add-client=Afegir Client +select-file=Selecciona arxiu +view-details=Veure detalls +clear-import=Neteja importaci\u00F3 +client-id.tooltip=Indica l''identificador (ID) referenciat en URIs i tokens. Per exemple ''my-client'' +client.name.tooltip=Indica el nom visible del client. Per exemple ''My Client''. Tamb\u00E9 suporta claus per valors localitzats. Per exemple: ${my_client} +client.enabled.tooltip=Els clients deshabilitats no poden iniciar una identificaci\u00F3 o obtenir codis d''acc\u00E9s. +consent-required=Consentiment necessari +consent-required.tooltip=Si est\u00E0 habilitat, els usuaris han de consentir l''acc\u00E9s del client. +direct-grants-only=Nom\u00E9s permisos directes +direct-grants-only.tooltip=Quan est\u00E0 habilitat, el client nom\u00E9s pot obtenir permisos de l''API REST. +client-protocol=Protocol del Client +client-protocol.tooltip=''OpenID connect'' permet als clients verificar la identitat de l''usuari final basat en l''autenticaci\u00F3 realitzada per un servidor d''autoritzaci\u00F3. ''SAML'' habilita l''autenticaci\u00F3 i autoritzaci\u00F3 d''escenaris basats en web incloent cross-domain i single sign-on (SSO) i utilitza tokens de seguretat que contenen afirmacions per passar informaci\u00F3. +access-type=Tipus d''acc\u00E9s +access-type.tooltip=Els clients ''Confidential'' necessiten un secret per iniciar el protocol d''identificaci\u00F3. Els clients ''Public'' no requereixen un secret. Els clients 'Bearer-only' s\u00F3n serveis web que mai inicien un login. +service-accounts-enabled=Comptes de servei habilitades +service-accounts-enabled.tooltip=Permetre autenticar aquest client contra Keycloak i rebre un token d''acc\u00E9s dedicat per a aquest client. +include-authnstatement=Incloure AuthnStatement +include-authnstatement.tooltip=Hauria d''incloure''s una declaraci\u00F3 especificant el m\u00E8tode i la marca de temps en la resposta d''inici de sessi\u00F3? +sign-documents=Signar documents +sign-documents.tooltip=Hauria el domini de signar els documents SAML? +sign-assertions=Signar assercions +sign-assertions.tooltip=Haurien de signar-se les assercions en documents SAML? Aquest ajust no \u00E9s necessari si el document ja s''est\u00E0 signant. +signature-algorithm=Algorisme de signatura +signature-algorithm.tooltip=L''algorisme de signatura usat per signar els documents. +canonicalization-method=M\u00E8tode de canonicalitzaci\u00F3 +canonicalization-method.tooltip=M\u00E8tode de canonicalitzaci\u00F3 per a les signatures XML +encrypt-assertions=Xifrar afirmacions +encrypt-assertions.tooltip=Haurien de xifrar-se les afirmacions SAML amb la clau p\u00FAblica del client fent servir AES? +client-signature-required=Signatura de Client requerida +client-signature-required.tooltip=Signar\u00E0 el client les seves peticions i respostes SAML? I haurien de ser validades? +force-post-binding=For\u00E7ar enlla\u00E7os POST +force-post-binding.tooltip=Fer servir sempre POST per a les respostes +front-channel-logout=Desconnexi\u00F3 en primer pla (Front Channel) +front-channel-logout.tooltip=Quan est\u00E0 activat, la desconnexi\u00F3 requereix una redirecci\u00F3 del navegador cap al client. Quan no est\u00E0 activat, el servidor realitza una invovaci\u00F3n de desconnexi\u00F3 en segon pla. +force-name-id-format=For\u00E7ar format NameID +force-name-id-format.tooltip=Ignorar la petici\u00F3 de subjecte NameID i fer servir la configurada a la consola d''administraci\u00F3. +name-id-format=Format de NameID +name-id-format.tooltip=El format de NameID que es far\u00E0 servir per al t\u00EDtol +root-url=URL arrel +root-url.tooltip=URL arrel afegida a les URL relatives +valid-redirect-uris=URIs de redirecci\u00F3 v\u00E0lides +valid-redirect-uris.tooltip=Patr\u00F3 d''URI v\u00E0lida per a la qual un navegador pot sol\u00B7licitar la redirecci\u00F3 despr\u00E9s d''un inici o tancament de sessi\u00F3 completat. Es permeten comodins simples p.ex. ''http://example.com/*''. Tamb\u00E9 es poden indicar rutes relatives p.ex. ''/my/relative/path/*''. Les rutes relatives generaran un URI de redirecci\u00F3 fent servir el host i port de la petici\u00F3. Per SAML, s''han de fixar patrons d''URI v\u00E0lids si vols confiar en l''URL del servei del consumidor indicada en la petici\u00F3 d''inici de sessi\u00F3. +base-url.tooltip=URL per defecte per utilitzar quan el servidor d''autoritzaci\u00F3 necessita redirigir o enviar de tornada al client. +admin-url=URL d''administraci\u00F3 +admin-url.tooltip=URL a la interf\u00EDcie d''administraci\u00F3 del client. Fixa aquest valor si el client suporta l''adaptador de REST. Aquesta API REST permet al servidor d''autenticaci\u00F3 enviar al client pol\u00EDtiques de revocaci\u00F3 i altres tasques administratives. Normalment es fixa a l''URL base del client. +master-saml-processing-url=URL principal de processament SAML +master-saml-processing-url.tooltip=Si est\u00E0 configurada, aquesta URL es fara servir per a cada enlla\u00E7 al prove\u00EFdor del servei del consumidor d''assercions i serveis de desconnexi\u00F3 \u00FAnics. Pot ser sobreescrit de forma individual per a cada enlla\u00E7 i servei en el punt final de configuraci\u00F3 fina de SAML. +idp-sso-url-ref=Nom de la URL d''un SSO iniciat per l''IDP +idp-sso-url-ref.tooltip=Nom del fragment de l''URL per referenciar al client quan vols un SSO iniciat per l''IDP. Deixant aix\u00F2 buit desactiva els SSO iniciats per l''IDP. L''URL referenciada des del navegador ser\u00E0: {server-root}/realms/{realm}/protocol/saml/clients/{client-url-name} +idp-sso-relay-state=Estat de retransmissi\u00F3 d''un SSO iniciat per l''IDP +idp-sso-relay-state.tooltip=Estat de retransmissi\u00F3 que vols enviar amb una petici\u00F3 SAML quan s''inicia un SSO iniciat per l''IDP +web-origins=Or\u00EDgens web +web-origins.tooltip=Or\u00EDgens CORS permesos. Per permetre tots els or\u00EDgens d''URIs de redirecci\u00F3 v\u00E0lides afegeix ''+''. Per permetre tots els or\u00EDgens afegeix ''*''. +fine-saml-endpoint-conf=Fine Grain SAML Endpoint Configuration +fine-saml-endpoint-conf.tooltip=Expandeix aquesta secci\u00F3 per configurar les URL exactes per Assertion Consumer i Single Logout Service. +assertion-consumer-post-binding-url=Assertion Consumer Service POST Binding URL +assertion-consumer-post-binding-url.tooltip=SAML POST Binding URL for the client''s assertion consumer service (login responses). You can leave this blank if you do not have a URL for this binding. +assertion-consumer-redirect-binding-url=Assertion Consumer Service Redirect Binding URL +assertion-consumer-redirect-binding-url.tooltip=Assertion Consumer Service Redirect Binding URL +logout-service-post-binding-url=URL d''enlla\u00E7 SAML POST per a la desconnexi\u00F3 +logout-service-post-binding-url.tooltip=URL d''enlla\u00E7 SAML POST per a la desconnexi\u00F3 \u00FAnica del client. Pots deixar-ho en blanc si est\u00E0s fent servir un enlla\u00E7 diferent. +logout-service-redir-binding-url=URL d''enlla\u00E7 SAML de redirecci\u00F3 per a la desconnexi\u00F3 +logout-service-redir-binding-url.tooltip=URL d''enlla\u00E7 SAML de redirecci\u00F3 per a la desconnexi\u00F3 \u00FAnica del client. Pots deixar-ho en blanc si est\u00E0s fent servir un enlla\u00E7 diferent. + +# client import +import-client=Importar Client +format-option=Format +select-format=Selecciona un format +import-file=Arxiu d''Importaci\u00F3 + +# client tabs +settings=Ajustos +credentials=Credencials +saml-keys=Claus SAML +roles=Rols +mappers=Assignadors +mappers.tooltip=Els assignadors de protocols realitzen transformacions en tokens i documents. Poden fer coses com assignar dades d''usuari en peticions de protocol, o simplement transformar qualsevol petici\u00F3 entre el client i el servidor d''autenticaci\u00F3. +scope=\u00C0mbit +scope.tooltip=Les assignacions d''\u00E0mbit et permeten restringir que assignacions de rols d''usuari s''inclouen en el testimoni d''acc\u00E9s sol\u00B7licitat pel client. +sessions.tooltip=Veure sessions actives per a aquest client. Permet veure quins usuaris estan actius i quan es van identificar. +offline-access=Acc\u00E9s sense connexi\u00F3 +offline-access.tooltip=Veure sessions sense connexi\u00F3 per aquest client. Et permet veure que usuaris han sol\u00B7licitat tokens sense connexi\u00F3 i quan els van sol\u00B7licitar. Per revocar tots els tokens del client, accedeix a la pestanya de Revocaci\u00F3 i fixa el valor \"No abans de\" a \"now\". +clustering=Clustering +installation=Instal\u00B7laci\u00F3 +installation.tooltip=Eina d''ajuda per generar la configuraci\u00F3 de diversos formats d''adaptadors de client que pots descarregar o copiar i enganxar per configurar teus clients. +service-account-roles=Rols de compte de servei +service-account-roles.tooltip=Permetre autenticar assignacions de rol per el compte de servei dedicat a aquest client. + +# client credentials +client-authenticator=Client autenticador +client-authenticator.tooltip=Client autenticador usat per autenticar aquest client contra el servidor Keycloak +certificate.tooltip=Certificat de client per validar els JWT emesos per aquest client i signats amb la clau privada del client del teu magatzem de claus. +no-client-certificate-configured=No s''ha configurat el certificat de client +gen-new-keys-and-cert=Generar noves claus i certificat +import-certificate=Importar Certificat +gen-client-private-key=Generar clau privada de client +generate-private-key=Generar clau privada +archive-format=Format d''Arxiu +archive-format.tooltip=Format d''arxiu Java keystore o PKCS12 +key-alias=\u00C0lies de clau +key-alias.tooltip=\u00C0lies de l''arxiu de la teva clau privada i certificat. +key-password=Contrasenya de la clau +key-password.tooltip=Contrasenya per accedir a la clau privada continguda en l''arxiu +store-password=Contrasenya del magatzem +store-password.tooltip=Contrasenya per accedir a l''arxiu +generate-and-download=Generar i descarregar +client-certificate-import=Importaci\u00F3 de certificat de client +import-client-certificate=Importar Certificat de Client +jwt-import.key-alias.tooltip=\u00C0lies de l''arxiu del teu certificat. +secret=Secret +regenerate-secret=Regenerar secret +add-role=Afegir rol +role-name=Nom de rol +composite=Compost +description=Descripci\u00F3 +no-client-roles-available=No hi ha rols de client disponibles +scope-param-required=Par\u00E0metre d''\u00E0mbit obligatori +scope-param-required.tooltip=Aquest rol nom\u00E9s ser\u00E0 concedit si el par\u00E0metre d''\u00E0mbit amb el nom del rol \u00E9s usat durant la petici\u00F3 d''autoritzaci\u00F3/obtenci\u00F3 de token. +composite-roles=Rols compostos +composite-roles.tooltip=Quan aquest paper \u00E9s assignat/desassignat a un usuari qualsevol rol associat amb ell ser\u00E0 assignat/desassignat de forma impl\u00EDcita. +realm-roles=Rols de domini +available-roles=Rols Disponibles +add-selected=Afegeix seleccionat +associated-roles=Rols Associats +composite.associated-realm-roles.tooltip=Rols a nivell de domini associats amb aquest rol compost. +composite.available-realm-roles.tooltip=Rols a nivell de domini disponibles en aquest paper compost. +remove-selected=Esborrar seleccionats +client-roles=Rols de Client +select-client-to-view-roles=Selecciona el client per veure els seus rols +available-roles.tooltip=Rols d''aquest client que pots associar a aquest rol compost. +client.associated-roles.tooltip=Rols de client associats amb aquest rol compost. +add-builtin=Afegeix Builtin +category=Categoria +type=Tipus +no-mappers-available=No hi ha assignadors disponibles +add-builtin-protocol-mappers=Afegeix Builtin Protocol Mappers +add-builtin-protocol-mapper=Afegeix Builtin Protocol Mapper +scope-mappings=Assignacions d''\u00E0mbit +full-scope-allowed=Permet tots els \u00E0mbits +full-scope-allowed.tooltip=Permet deshabilitar totes les restriccions. +scope.available-roles.tooltip=Rols de domini que poden ser assignats a l''\u00E0mbit +assigned-roles=Rols Assignats +assigned-roles.tooltip=Rols a nivell de domini assignats a aquest \u00E0mbit. +effective-roles=Rols efectius +realm.effective-roles.tooltip=Rols de domini assignats que poden haver estat heretats d''un rol compost. +select-client-roles.tooltip=Selecciona el client per veure els seus rols +assign.available-roles.tooltip=Rols de clients disponibles per ser assignats. +client.assigned-roles.tooltip=Rols de client assignats +client.effective-roles.tooltip=Rols de client assignats que poden haver estat heretats des d''un rol compost. +basic-configuration=Configuraci\u00F3 b\u00E0sica +node-reregistration-timeout=Temps d''espera de re-registre de node +node-reregistration-timeout.tooltip=Indica el m\u00E0xim interval de temps perqu\u00E8 els nodes del cl\u00FAster registrats es tornin a registrar. Si el node del cl\u00FAster no envia una petici\u00F3 de re-registre a Keycloak dins d''aquest interval, ser\u00E0 desregistrat de Keycloak +registered-cluster-nodes=Registrar nodes de cl\u00FAster +register-node-manually=Registrar node manualment +test-cluster-availability=Provar disponibilitat del cl\u00FAster +last-registration=\u00DAltim registre +node-host=Host del node +no-registered-cluster-nodes=No hi ha nodes de cl\u00FAster registrats disponibles +cluster-nodes=Nodes de cl\u00FAster +add-node=Afegir Node +active-sessions.tooltip=Nombre total de sessions actives per a aquest client. +show-sessions=Mostrar sessions +show-sessions.tooltip=Advert\u00E8ncia, aquesta \u00E9s una operaci\u00F3 potencialment costosa depenent del nombre de sessions actives. +user=Usuari +from-ip=Des de IP +session-start=Inici de sessi\u00F3 +first-page=Primera p\u00E0gina +previous-page=P\u00E0gina Anterior +next-page=P\u00E0gina seg\u00FCent +client-revoke.not-before.tooltip=Revocar tots els tokens emesos abans d''aquesta data per a aquest client. +client-revoke.push.tooltip=Si l''URL d''administraci\u00F3 est\u00E0 configurada per a aquest client, envia aquesta pol\u00EDtica a aquest client. +select-a-format=Selecciona un format +download=Descarrega +offline-tokens=Tokens sense connexi\u00F3 +offline-tokens.tooltip=Nombre total de tokens sense connexi\u00F3 d''aquest client. +show-offline-tokens=Mostrar tokens sense connexi\u00F3 +show-offline-tokens.tooltip=Advert\u00E8ncia, aquesta \u00E9s una operaci\u00F3 potencialment costosa depenent del nombre de tokens sense connexi\u00F3. +token-issued=Token expedit +last-access=\u00DAltim Acc\u00E9s +last-refresh=\u00DAltima actualitzaci\u00F3 +key-export=Exportar clau +key-import=Importar clau +export-saml-key=Exporta clau SAML +import-saml-key=Importar clau SAML +realm-certificate-alias=\u00C0lies del certificat del domini +realm-certificate-alias.tooltip=El certificat del domini \u00E9s emmagatzemat en arxiu. Aquest \u00E9s l''\u00E0lies a aquest. +signing-key=Clau de firma +saml-signing-key=Clau de firma SAML. +private-key=Clau Privada +generate-new-keys=Generar noves claus +export=Exporta +encryption-key=Clau de xifrat +saml-encryption-key.tooltip=Clau de xifrat de SAML +service-accounts=Comptes de servei +service-account.available-roles.tooltip=Rols de domini que poden ser assignats al compte del servei. +service-account.assigned-roles.tooltip=Rols de domini assignats al compte del servei. +service-account-is-not-enabled-for=El compte del servei no est\u00E0 habilitada per {{client}} +create-protocol-mappers=Crea assignadors de protocol +create-protocol-mapper=Crea assignador de protocol +protocol=Protocol +protocol.tooltip=Protocol. +id=ID +mapper.name.tooltip=Nom de l''assignador. +mapper.consent-required.tooltip=Quan es concedeix acc\u00E9s temporal, \u00E9s necessari el consentiment de l''usuari per a proporcinar aquestes dades al client? +consent-text=Text del consentiment +consent-text.tooltip=Text per mostrar a la p\u00E0gina de consentiment. +mapper-type=Tipus d''assignador + +# realm identity providers +identity-providers=Prove\u00EFdors d''identitat +table-of-identity-providers=Taula de prove\u00EFdors d''identitat +add-provider.placeholder=Afegir prove\u00EFdor... +provider=Prove\u00EFdor +gui-order=Ordre en la interf\u00EDcie gr\u00E0fica (GUI) +redirect-uri=URI de redirecci\u00F3 +redirect-uri.tooltip=L''URI de redirecci\u00F3 usada per configurar el prove\u00EFdor d''identitat. +alias=\u00C0lies +identity-provider.alias.tooltip=L''\u00E0lies que identifica de forma \u00FAnica un prove\u00EFdor d''identitat, es far servir tamb\u00E9 per construir la URI de redirecci\u00F3. +identity-provider.enabled.tooltip=Habilita/deshabilita aquest prove\u00EFdor d''identitat. +authenticate-by-default=Autenticar per defecte +identity-provider.authenticate-by-default.tooltip=Indica si aquest prove\u00EFdor hauria de ser provat per defecte per autenticacaci\u00F3n fins i tot abans de mostrar la p\u00E0gina d''inici de sessi\u00F3. +store-tokens=Emmagatzemar tokens +identity-provider.store-tokens.tooltip=Habilitar/deshabilitar si els tokens han de ser emmagatzemats despr\u00E9s d''autenticar als usuaris. +stored-tokens-readable=Tokens emmagatzemats llegibles +identity-provider.stored-tokens-readable.tooltip=Habilitar/deshabilitar si els nous usuaris poden llegir els tokens emmagatzemats. Aix\u00F2 assigna el rol ''broker.read-token''. +update-profile-on-first-login=Actualitzar perfil al primer inici de sessi\u00F3 +on=Activat +on-missing-info=Si falta informaci\u00F3 +off=Desactivat +update-profile-on-first-login.tooltip=Defineix condicions sota les quals un usuari ha de actualitzar el seu perfil durant el primer inici de sessi\u00F3. +trust-email=Confiar en l''email +trust-email.tooltip=Si est\u00E0 habilitat, l''email rebut d''aquest prove\u00EFdor no es verificar\u00E0 encara que la verificaci\u00F3 estigui habilitada per al domini. +gui-order.tooltip=N\u00FAmero que defineix l''ordre del prove\u00EFdor en la interf\u00EDcie gr\u00E0fica (GUI) (ex. a la p\u00E0gina d''inici de sessi\u00F3) +openid-connect-config=Configuraci\u00F3 d''OpenID Connect +openid-connect-config.tooltip=Configuraci\u00F3 d''OIDC SP i IDP externs +authorization-url=URL d''autoritzaci\u00F3 +authorization-url.tooltip=La URL d''autoritzaci\u00F3. +token-url=Token URL +token-url.tooltip=L''URL del token. +logout-url=URL de desconnexi\u00F3 +identity-provider.logout-url.tooltip=Punt de tancament de sessi\u00F3 per utilitzar en la desconnexi\u00F3 d''usuaris des d''un prove\u00EFdor d''identitat (IDP) extern. +backchannel-logout=Backchannel Logout +backchannel-logout.tooltip=Does the external IDP support backchannel logout? +user-info-url=URL d''informaci\u00F3 d''usuari +user-info-url.tooltip=L''URL d''informaci\u00F3 d''usuari. Opcional. +identity-provider.client-id.tooltip=El client o identificador de client registrat en el prove\u00EFdor d''identitat. +client-secret=Secret de Client +show-secret=Mostrar secret +hide-secret=Amaga secret +client-secret.tooltip=El client o el secret de client registrat en el prove\u00EFdor d''identitat. +issuer=Emissor +issuer.tooltip=L''identificador de l''emissor per a l''emissor de la resposta. Si no s''indica, no es realitzar\u00E0 cap validaci\u00F3. +default-scopes=\u00C0mbits per defecte +identity-provider.default-scopes.tooltip=Els \u00E0mbits que s''enviaran quan es sol\u00B7liciti autoritzaci\u00F3. Pot ser una llista d''\u00E0mbits separats per espais. El valor per defecte \u00E9s ''openid''. +prompt=Prompt +unspecified.option=no especificat +none.option=cap +consent.option=consentiment +login.option=login +select-account.option=select_account +prompt.tooltip=Indica si el servidor d''autoritzaci\u00F3 sol\u00B7licita a l''usuari final per reautenticaci\u00F3n i consentiment. +validate-signatures=Validar signatures +identity-provider.validate-signatures.tooltip=Habilitar/deshabilitar la validaci\u00F3 de signatures de prove\u00EFdors d''identitat (IDP) externs +validating-public-key=Validant clau p\u00FAblica +identity-provider.validating-public-key.tooltip=La clau p\u00FAblica en format PEM que ha de fer-se servir per verificar les signatures de prove\u00EFdors d''identitat (IDP) externs. +import-external-idp-config=Importar configuraci\u00F3 externa d''IDP +import-external-idp-config.tooltip=Et permet carregar metadades d''un prove\u00EFdor d''identitat (IDP) extern d''un arxiu de coniguraci\u00F3n o descarregar des d''una URL. +import-from-url=Importar des d''URL +identity-provider.import-from-url.tooltip=Importa metadades des d''un descriptor d''un prove\u00EFdor d''identitat (IDP) remot. +import-from-file=Importa des d''arxiu +identity-provider.import-from-file.tooltip=Importa metadades des d''un descriptor d''un prove\u00EFdor d''identitat (IDP) descarregat. +saml-config=Configuraci\u00F3 SAML +identity-provider.saml-config.tooltip=Configuraci\u00F3 de prove\u00EFdor SAML i IDP extern +single-signon-service-url=URL de servei de connexi\u00F3 \u00FAnic (SSO) +saml.single-signon-service-url.tooltip=L''URL que s''ha de fer servir per enviar peticions d''autenticaci\u00F3 (SAML AuthnRequest). +single-logout-service-url=URL de servei de desconnexi\u00F3 \u00FAnic +saml.single-logout-service-url.tooltip=L''URL que ha de fer-se servir per enviar peticions de desconnexi\u00F3. +nameid-policy-format=Format de pol\u00EDtica NameID +nameid-policy-format.tooltip=Indica la refer\u00E8ncia a la URI corresponent a un format de NameID. El valor per defecte \u00E9s urn:oasis:names:tc:SAML:2.0:nameid-format:persistent. +http-post-binding-response=HTTP-POST enlla\u00E7 de resposta +http-post-binding-response.tooltip=Indica si es respon a les peticions fent servir HTTP-POST. Si no est\u00E0 activat, es far servir HTTP-REDIRECT. +http-post-binding-for-authn-request=HTTP-POST per AuthnRequest +http-post-binding-for-authn-request.tooltip=Indica si AuthnRequest ha de ser enviat usant HTTP-POST. Si no est\u00E0 activat es fa HTTP-REDIRECT. +want-authn-requests-signed=Signar AuthnRequests +want-authn-requests-signed.tooltip=Indica si el prove\u00EFdor d''identitat espera rebre signades les AuthnRequest. +force-authentication=For\u00E7ar autenticaci\u00F3 +identity-provider.force-authentication.tooltip=Indica si el prove\u00EFdor d''identitat ha d'autenticar en presentar directament les credencials en lloc de dependre d''un context de seguretat previ. +validate-signature=Validar signatura +saml.validate-signature.tooltip=Habilitar/deshabilitar la validaci\u00F3 de signatura en respostes SAML. +validating-x509-certificate=Validant certificat X509 +validating-x509-certificate.tooltip=El certificat en format PEM que ha de fer-se servir per comprovar les signatures. +saml.import-from-url.tooltip=Importar metadades des d''un descriptor d'entitat remot d''un IDP de SAML +social.client-id.tooltip=L''identificador del client registrat amb el prove\u00EFdor d''identitat. +social.client-secret.tooltip=El secret del client registrat amb el prove\u00EFdor d''identitat. +social.default-scopes.tooltip=\u00C0mbits que s''enviaran quan es sol\u00B7liciti autoritzaci\u00F3. Veure la documentaci\u00F3 per als possibles valors, separador i valor per defecte. +key=Clau +stackoverflow.key.tooltip=La clau obtinguda en el registre del client de Stack Overflow. + +realms=Dominis +realm=Domini + +identity-provider-mappers=Assignadors de prove\u00EFdors d''identitat (IDP) +create-identity-provider-mapper=Crea assignador de prove\u00EFdor d''identitat (IDP) +add-identity-provider-mapper=Afegeix assignador de prove\u00EFdor d''identitat +client.description.tooltip=Indica la descripci\u00F3 del client. Per exemple ''My Client for TimeSheets''. Tamb\u00E9 suporta claus per a valors localitzats. Per exemple: ${my_client_description} diff --git a/admin/messages/admin-messages_de.properties b/admin/messages/admin-messages_de.properties new file mode 100644 index 0000000..e69de29 diff --git a/admin/messages/admin-messages_en.properties b/admin/messages/admin-messages_en.properties new file mode 100644 index 0000000..66b1943 --- /dev/null +++ b/admin/messages/admin-messages_en.properties @@ -0,0 +1,1382 @@ +consoleTitle=Keycloak Admin Console + +# Common messages +enabled=Enabled +hidden=Hidden +link-only-column=Link only +name=Name +displayName=Display name +displayNameHtml=HTML Display name +save=Save +cancel=Cancel +onText=ON +offText=OFF +client=Client +clients=Clients +clear=Clear +selectOne=Select One... + +true=True +false=False + +endpoints=Endpoints + +# Realm settings +realm-detail.enabled.tooltip=Users and clients can only access a realm if it's enabled +realm-detail.oidc-endpoints.tooltip=Shows the configuration of the OpenID Connect endpoints +registrationAllowed=User registration +registrationAllowed.tooltip=Enable/disable the registration page. A link for registration will show on login page too. +registrationEmailAsUsername=Email as username +registrationEmailAsUsername.tooltip=If enabled then username field is hidden from registration form and email is used as username for new user. +editUsernameAllowed=Edit username +editUsernameAllowed.tooltip=If enabled, the username field is editable, readonly otherwise. +resetPasswordAllowed=Forgot password +resetPasswordAllowed.tooltip=Show a link on login page for user to click on when they have forgotten their credentials. +rememberMe=Remember Me +rememberMe.tooltip=Show checkbox on login page to allow user to remain logged in between browser restarts until session expires. +loginWithEmailAllowed=Login with email +loginWithEmailAllowed.tooltip=Allow users to log in with their email address. +duplicateEmailsAllowed=Duplicate emails +duplicateEmailsAllowed.tooltip=Allow multiple users to have the same email address. Changing this setting will also clear the users cache. It is recommended to manually update email constraints of existing users in the database after switching off support for duplicate email addresses. +verifyEmail=Verify email +verifyEmail.tooltip=Require the user to verify their email address the first time they login. +sslRequired=Require SSL +sslRequired.option.all=all requests +sslRequired.option.external=external requests +sslRequired.option.none=none +sslRequired.tooltip=Is HTTPS required? 'None' means HTTPS is not required for any client IP address. 'External requests' means localhost and private IP addresses can access without HTTPS. 'All requests' means HTTPS is required for all IP addresses. +publicKeys=Public keys +publicKey=Public key +privateKey=Private key +gen-new-keys=Generate new keys +certificate=Certificate +host=Host +smtp-host=SMTP Host +port=Port +smtp-port=SMTP Port (defaults to 25) +from=From +fromDisplayName=From Display Name +fromDisplayName.tooltip=A user-friendly name for the 'From' address (optional). +replyTo=Reply To +replyToDisplayName=Reply To Display Name +replyToDisplayName.tooltip=A user-friendly name for the 'Reply-To' address (optional). +envelopeFrom=Envelope From +envelopeFrom.tooltip=An email address used for bounces (optional). +sender-email-addr=Sender Email Address +sender-email-addr-display=Display Name for Sender Email Address +reply-to-email-addr=Reply To Email Address +reply-to-email-addr-display=Display Name for Reply To Email Address +sender-envelope-email-addr=Sender Envelope Email Address +enable-ssl=Enable SSL +enable-start-tls=Enable StartTLS +enable-auth=Enable Authentication +username=Username +login-username=Login Username +password=Password +login-password=Login Password +login-theme=Login Theme +login-theme.tooltip=Select theme for login, TOTP, grant, registration, and forgot password pages. +account-theme=Account Theme +account-theme.tooltip=Select theme for user account management pages. +admin-console-theme=Admin Console Theme +select-theme-admin-console=Select theme for admin console. +email-theme=Email Theme +select-theme-email=Select theme for emails that are sent by the server. +i18n-enabled=Internationalization Enabled +supported-locales=Supported Locales +supported-locales.placeholder=Type a locale and enter +default-locale=Default Locale +realm-cache-clear=Realm Cache +realm-cache-clear.tooltip=Clears all entries from the realm cache (this will clear entries for all realms) +user-cache-clear=User Cache +user-cache-clear.tooltip=Clears all entries from the user cache (this will clear entries for all realms) +keys-cache-clear=Keys Cache +keys-cache-clear.tooltip=Clears all entries from the cache of external public keys. These are keys of external clients or identity providers. (this wil clear entries for all realms) +revoke-refresh-token=Revoke Refresh Token +revoke-refresh-token.tooltip=If enabled a refresh token can only be used up to 'Refresh Token Max Reuse' and is revoked when a different token is used. Otherwise refresh tokens are not revoked when used and can be used multiple times. +refresh-token-max-reuse=Refresh Token Max Reuse +refresh-token-max-reuse.tooltip=Maximum number of times a refresh token can be reused. When a different token is used, revokation is immediate. +sso-session-idle=SSO Session Idle +seconds=Seconds +minutes=Minutes +hours=Hours +days=Days +sso-session-max=SSO Session Max +sso-session-idle.tooltip=Time a session is allowed to be idle before it expires. Tokens and browser sessions are invalidated when a session is expired. +sso-session-max.tooltip=Max time before a session is expired. Tokens and browser sessions are invalidated when a session is expired. +offline-session-idle=Offline Session Idle +offline-session-idle.tooltip=Time an offline session is allowed to be idle before it expires. You need to use offline token to refresh at least once within this period, otherwise offline session will expire. +access-token-lifespan=Access Token Lifespan +access-token-lifespan.tooltip=Max time before an access token is expired. This value is recommended to be short relative to the SSO timeout. +access-token-lifespan-for-implicit-flow=Access Token Lifespan For Implicit Flow +access-token-lifespan-for-implicit-flow.tooltip=Max time before an access token issued during OpenID Connect Implicit Flow is expired. This value is recommended to be shorter than SSO timeout. There is no possibility to refresh token during implicit flow, that's why there is separate timeout different to 'Access Token Lifespan'. +action-token-generated-by-admin-lifespan=Default Admin-Initiated Action Lifespan +action-token-generated-by-admin-lifespan.tooltip=Maximum time before an action permit sent to a user by admin is expired. This value is recommended to be long to allow admins send e-mails for users that are currently offline. The default timeout can be overridden right before issuing the token. +action-token-generated-by-user-lifespan=User-Initiated Action Lifespan +action-token-generated-by-user-lifespan.tooltip=Maximum time before an action permit sent by a user (e.g. forgot password e-mail) is expired. This value is recommended to be short because it is expected that the user would react to self-created action quickly. + +action-token-generated-by-user.execute-actions=Execute Actions +action-token-generated-by-user.idp-verify-account-via-email=IdP Account E-mail Verification +action-token-generated-by-user.reset-credentials=Forgot Password +action-token-generated-by-user.verify-email=E-mail Verification +action-token-generated-by-user.tooltip=Override default settings of maximum time before an action permit sent by a user (e.g. forgot password e-mail) is expired for specific action. This value is recommended to be short because it is expected that the user would react to self-created action quickly. +action-token-generated-by-user.reset=Reset +action-token-generated-by-user.operation=Override User-Initiated Action Lifespan + +client-login-timeout=Client login timeout +client-login-timeout.tooltip=Max time an client has to finish the access token protocol. This should normally be 1 minute. +login-timeout=Login timeout +login-timeout.tooltip=Max time a user has to complete a login. This is recommended to be relatively long. 30 minutes or more. +login-action-timeout=Login action timeout +login-action-timeout.tooltip=Max time a user has to complete login related actions like update password or configure totp. This is recommended to be relatively long. 5 minutes or more. +headers=Headers +brute-force-detection=Brute Force Detection +x-frame-options=X-Frame-Options +x-frame-options-tooltip=Default value prevents pages from being included via non-origin iframes (click label for more information) +content-sec-policy=Content-Security-Policy +content-sec-policy-tooltip=Default value prevents pages from being included via non-origin iframes (click label for more information) +content-type-options=X-Content-Type-Options +content-type-options-tooltip=Default value prevents Internet Explorer and Google Chrome from MIME-sniffing a response away from the declared content-type (click label for more information) +robots-tag=X-Robots-Tag +robots-tag-tooltip=Prevent pages from appearing in search engines (click label for more information) +x-xss-protection=X-XSS-Protection +x-xss-protection-tooltip=This header configures the Cross-site scripting (XSS) filter in your browser. Using the default behavior, the browser will prevent rendering of the page when a XSS attack is detected (click label for more information) +strict-transport-security=HTTP Strict Transport Security (HSTS) +strict-transport-security-tooltip=The Strict-Transport-Security HTTP header tells browsers to always use HTTPS. Once a browser sees this header, it will only visit the site over HTTPS for the time specified (1 year) at max-age, including the subdomains. +permanent-lockout=Permanent Lockout +permanent-lockout.tooltip=Lock the user permanently when the user exceeds the maximum login failures. +max-login-failures=Max Login Failures +max-login-failures.tooltip=How many failures before wait is triggered. +wait-increment=Wait Increment +wait-increment.tooltip=When failure threshold has been met, how much time should the user be locked out? +quick-login-check-millis=Quick Login Check Milli Seconds +quick-login-check-millis.tooltip=If a failure happens concurrently too quickly, lock out the user. +min-quick-login-wait=Minimum Quick Login Wait +min-quick-login-wait.tooltip=How long to wait after a quick login failure. +max-wait=Max Wait +max-wait.tooltip=Max time a user will be locked out. +failure-reset-time=Failure Reset Time +failure-reset-time.tooltip=When will failure count be reset? +realm-tab-login=Login +realm-tab-keys=Keys +realm-tab-email=Email +realm-tab-themes=Themes +realm-tab-cache=Cache +realm-tab-tokens=Tokens +realm-tab-client-registration=Client Registration +realm-tab-security-defenses=Security Defenses +realm-tab-general=General +add-realm=Add realm + +#Session settings +realm-sessions=Realm Sessions +revocation=Revocation +logout-all=Logout all +active-sessions=Active Sessions +sessions=Sessions +not-before=Not Before +not-before.tooltip=Revoke any tokens issued before this date. +set-to-now=Set to now +push=Push +push.tooltip=For every client that has an admin URL, notify them of the new revocation policy. + +#Protocol Mapper +usermodel.prop.label=Property +usermodel.prop.tooltip=Name of the property method in the UserModel interface. For example, a value of 'email' would reference the UserModel.getEmail() method. +usermodel.attr.label=User Attribute +usermodel.attr.tooltip=Name of stored user attribute which is the name of an attribute within the UserModel.attribute map. +userSession.modelNote.label=User Session Note +userSession.modelNote.tooltip=Name of stored user session note within the UserSessionModel.note map. +multivalued.label=Multivalued +multivalued.tooltip=Indicates if attribute supports multiple values. If true, then the list of all values of this attribute will be set as claim. If false, then just first value will be set as claim +selectRole.label=Select Role +selectRole.tooltip=Enter role in the textbox to the left, or click this button to browse and select the role you want. +tokenClaimName.label=Token Claim Name +tokenClaimName.tooltip=Name of the claim to insert into the token. This can be a fully qualified name like 'address.street'. In this case, a nested json object will be created. +jsonType.label=Claim JSON Type +jsonType.tooltip=JSON type that should be used to populate the json claim in the token. long, int, boolean, and String are valid values. +includeInIdToken.label=Add to ID token +includeInIdToken.tooltip=Should the claim be added to the ID token? +includeInAccessToken.label=Add to access token +includeInAccessToken.tooltip=Should the claim be added to the access token? +includeInUserInfo.label=Add to userinfo +includeInUserInfo.tooltip=Should the claim be added to the userinfo? +usermodel.clientRoleMapping.clientId.label=Client ID +usermodel.clientRoleMapping.clientId.tooltip=Client ID for role mappings +usermodel.clientRoleMapping.rolePrefix.label=Client Role prefix +usermodel.clientRoleMapping.rolePrefix.tooltip=A prefix for each client role (optional). +usermodel.realmRoleMapping.rolePrefix.label=Realm Role prefix +usermodel.realmRoleMapping.rolePrefix.tooltip=A prefix for each Realm Role (optional). +sectorIdentifierUri.label=Sector Identifier URI +sectorIdentifierUri.tooltip=Providers that use pairwise sub values and support Dynamic Client Registration SHOULD use the sector_identifier_uri parameter. It provides a way for a group of websites under common administrative control to have consistent pairwise sub values independent of the individual domain names. It also provides a way for Clients to change redirect_uri domains without having to reregister all of their users. +pairwiseSubAlgorithmSalt.label=Salt +pairwiseSubAlgorithmSalt.tooltip=Salt used when calculating the pairwise subject identifier. If left blank, a salt will be generated. +addressClaim.street.label=User Attribute Name for Street +addressClaim.street.tooltip=Name of User Attribute, which will be used to map to 'street_address' subclaim inside 'address' token claim. Defaults to 'street' . +addressClaim.locality.label=User Attribute Name for Locality +addressClaim.locality.tooltip=Name of User Attribute, which will be used to map to 'locality' subclaim inside 'address' token claim. Defaults to 'locality' . +addressClaim.region.label=User Attribute Name for Region +addressClaim.region.tooltip=Name of User Attribute, which will be used to map to 'region' subclaim inside 'address' token claim. Defaults to 'region' . +addressClaim.postal_code.label=User Attribute Name for Postal Code +addressClaim.postal_code.tooltip=Name of User Attribute, which will be used to map to 'postal_code' subclaim inside 'address' token claim. Defaults to 'postal_code' . +addressClaim.country.label=User Attribute Name for Country +addressClaim.country.tooltip=Name of User Attribute, which will be used to map to 'country' subclaim inside 'address' token claim. Defaults to 'country' . +addressClaim.formatted.label=User Attribute Name for Formatted Address +addressClaim.formatted.tooltip=Name of User Attribute, which will be used to map to 'formatted' subclaim inside 'address' token claim. Defaults to 'formatted' . + +# client details +clients.tooltip=Clients are trusted browser apps and web services in a realm. These clients can request a login. You can also define client specific roles. +search.placeholder=Search... +create=Create +import=Import +client-id=Client ID +base-url=Base URL +actions=Actions +not-defined=Not defined +edit=Edit +delete=Delete +no-results=No results +no-clients-available=No clients available +add-client=Add Client +select-file=Select file +view-details=View details +clear-import=Clear import +client-id.tooltip=Specifies ID referenced in URI and tokens. For example 'my-client'. For SAML this is also the expected issuer value from authn requests +client.name.tooltip=Specifies display name of the client. For example 'My Client'. Supports keys for localized values as well. For example\: ${my_client} +client.enabled.tooltip=Disabled clients cannot initiate a login or have obtain access tokens. +consent-required=Consent Required +consent-required.tooltip=If enabled users have to consent to client access. +client-protocol=Client Protocol +client-protocol.tooltip='OpenID connect' allows Clients to verify the identity of the End-User based on the authentication performed by an Authorization Server.'SAML' enables web-based authentication and authorization scenarios including cross-domain single sign-on (SSO) and uses security tokens containing assertions to pass information. +access-type=Access Type +access-type.tooltip='Confidential' clients require a secret to initiate login protocol. 'Public' clients do not require a secret. 'Bearer-only' clients are web services that never initiate a login. +standard-flow-enabled=Standard Flow Enabled +standard-flow-enabled.tooltip=This enables standard OpenID Connect redirect based authentication with authorization code. In terms of OpenID Connect or OAuth2 specifications, this enables support of 'Authorization Code Flow' for this client. +implicit-flow-enabled=Implicit Flow Enabled +implicit-flow-enabled.tooltip=This enables support for OpenID Connect redirect based authentication without authorization code. In terms of OpenID Connect or OAuth2 specifications, this enables support of 'Implicit Flow' for this client. +direct-access-grants-enabled=Direct Access Grants Enabled +direct-access-grants-enabled.tooltip=This enables support for Direct Access Grants, which means that client has access to username/password of user and exchange it directly with Keycloak server for access token. In terms of OAuth2 specification, this enables support of 'Resource Owner Password Credentials Grant' for this client. +service-accounts-enabled=Service Accounts Enabled +service-accounts-enabled.tooltip=Allows you to authenticate this client to Keycloak and retrieve access token dedicated to this client. In terms of OAuth2 specification, this enables support of 'Client Credentials Grant' for this client. +include-authnstatement=Include AuthnStatement +include-authnstatement.tooltip=Should a statement specifying the method and timestamp be included in login responses? +include-onetimeuse-condition=Include OneTimeUse Condition +include-onetimeuse-condition.tooltip=Should a OneTimeUse Condition be included in login responses? +sign-documents=Sign Documents +sign-documents.tooltip=Should SAML documents be signed by the realm? +sign-documents-redirect-enable-key-info-ext=Optimize REDIRECT signing key lookup +sign-documents-redirect-enable-key-info-ext.tooltip=When signing SAML documents in REDIRECT binding for SP that is secured by Keycloak adapter, should the ID of the signing key be included in SAML protocol message in element? This optimizes validation of the signature as the validating party uses a single key instead of trying every known key for validation. +sign-assertions=Sign Assertions +sign-assertions.tooltip=Should assertions inside SAML documents be signed? This setting isn't needed if document is already being signed. +signature-algorithm=Signature Algorithm +signature-algorithm.tooltip=The signature algorithm to use to sign documents. +canonicalization-method=Canonicalization Method +canonicalization-method.tooltip=Canonicalization Method for XML signatures. +encrypt-assertions=Encrypt Assertions +encrypt-assertions.tooltip=Should SAML assertions be encrypted with client's public key using AES? +client-signature-required=Client Signature Required +client-signature-required.tooltip=Will the client sign their saml requests and responses? And should they be validated? +force-post-binding=Force POST Binding +force-post-binding.tooltip=Always use POST binding for responses. +front-channel-logout=Front Channel Logout +front-channel-logout.tooltip=When true, logout requires a browser redirect to client. When false, server performs a background invocation for logout. +force-name-id-format=Force Name ID Format +force-name-id-format.tooltip=Ignore requested NameID subject format and use admin console configured one. +name-id-format=Name ID Format +name-id-format.tooltip=The name ID format to use for the subject. +root-url=Root URL +root-url.tooltip=Root URL appended to relative URLs +valid-redirect-uris=Valid Redirect URIs +valid-redirect-uris.tooltip=Valid URI pattern a browser can redirect to after a successful login or logout. Simple wildcards are allowed i.e. 'http://example.com/*'. Relative path can be specified too i.e. /my/relative/path/*. Relative paths are relative to the client root URL, or if none is specified the auth server root URL is used. For SAML, you must set valid URI patterns if you are relying on the consumer service URL embedded with the login request. +base-url.tooltip=Default URL to use when the auth server needs to redirect or link back to the client. +admin-url=Admin URL +admin-url.tooltip=URL to the admin interface of the client. Set this if the client supports the adapter REST API. This REST API allows the auth server to push revocation policies and other adminstrative tasks. Usually this is set to the base URL of the client. +master-saml-processing-url=Master SAML Processing URL +master-saml-processing-url.tooltip=If configured, this URL will be used for every binding to both the SP's Assertion Consumer and Single Logout Services. This can be individually overiden for each binding and service in the Fine Grain SAML Endpoint Configuration. +idp-sso-url-ref=IDP Initiated SSO URL Name +idp-sso-url-ref.tooltip=URL fragment name to reference client when you want to do IDP Initiated SSO. Leaving this empty will disable IDP Initiated SSO. The URL you will reference from your browser will be: {server-root}/realms/{realm}/protocol/saml/clients/{client-url-name} +idp-sso-relay-state=IDP Initiated SSO Relay State +idp-sso-relay-state.tooltip=Relay state you want to send with SAML request when you want to do IDP Initiated SSO. +web-origins=Web Origins +web-origins.tooltip=Allowed CORS origins. To permit all origins of Valid Redirect URIs add '+'. To permit all origins add '*'. +fine-oidc-endpoint-conf=Fine Grain OpenID Connect Configuration +fine-oidc-endpoint-conf.tooltip=Expand this section to configure advanced settings of this client related to OpenID Connect protocol +user-info-signed-response-alg=User Info Signed Response Algorithm +user-info-signed-response-alg.tooltip=JWA algorithm used for signed User Info Endpoint response. If set to 'unsigned', then User Info Response won't be signed and will be returned in application/json format. +request-object-signature-alg=Request Object Signature Algorithm +request-object-signature-alg.tooltip=JWA algorithm, which client needs to use when sending OIDC request object specified by 'request' or 'request_uri' parameters. If set to 'any', then Request object can be signed by any algorithm (including 'none' ). +fine-saml-endpoint-conf=Fine Grain SAML Endpoint Configuration +fine-saml-endpoint-conf.tooltip=Expand this section to configure exact URLs for Assertion Consumer and Single Logout Service. +assertion-consumer-post-binding-url=Assertion Consumer Service POST Binding URL +assertion-consumer-post-binding-url.tooltip=SAML POST Binding URL for the client's assertion consumer service (login responses). You can leave this blank if you do not have a URL for this binding. +assertion-consumer-redirect-binding-url=Assertion Consumer Service Redirect Binding URL +assertion-consumer-redirect-binding-url.tooltip=SAML Redirect Binding URL for the client's assertion consumer service (login responses). You can leave this blank if you do not have a URL for this binding. +logout-service-post-binding-url=Logout Service POST Binding URL +logout-service-post-binding-url.tooltip=SAML POST Binding URL for the client's single logout service. You can leave this blank if you are using a different binding +logout-service-redir-binding-url=Logout Service Redirect Binding URL +logout-service-redir-binding-url.tooltip=SAML Redirect Binding URL for the client's single logout service. You can leave this blank if you are using a different binding. +saml-signature-keyName-transformer=SAML Signature Key Name +saml-signature-keyName-transformer.tooltip=Signed SAML documents contain identification of signing key in KeyName element. For Keycloak / RH-SSO counterparty, use KEY_ID, for MS AD FS use CERT_SUBJECT, for others check and use NONE if no other option works. + +# client import +import-client=Import Client +format-option=Format Option +select-format=Select a Format +import-file=Import File + +# client tabs +settings=Settings +credentials=Credentials +saml-keys=SAML Keys +roles=Roles +mappers=Mappers +mappers.tooltip=Protocol mappers perform transformation on tokens and documents. They can do things like map user data into protocol claims, or just transform any requests going between the client and auth server. +scope=Scope +scope.tooltip=Scope mappings allow you to restrict which user role mappings are included within the access token requested by the client. +sessions.tooltip=View active sessions for this client. Allows you to see which users are active and when they logged in. +offline-access=Offline Access +offline-access.tooltip=View offline sessions for this client. Allows you to see which users retrieve offline token and when they retrieve it. To revoke all tokens for the client, go to Revocation tab and set not before value to now. +clustering=Clustering +installation=Installation +installation.tooltip=Helper utility for generating various client adapter configuration formats which you can download or cut and paste to configure your clients. +service-account-roles=Service Account Roles +service-account-roles.tooltip=Allows you to authenticate role mappings for the service account dedicated to this client. + +# client credentials +client-authenticator=Client Authenticator +client-authenticator.tooltip=Client Authenticator used for authentication this client against Keycloak server +certificate.tooltip=Client Certificate for validate JWT issued by client and signed by Client private key from your keystore. +publicKey.tooltip=Public Key for validate JWT issued by client and signed by Client private key. +no-client-certificate-configured=No client certificate configured +gen-new-keys-and-cert=Generate new keys and certificate +import-certificate=Import Certificate +gen-client-private-key=Generate Client Private Key +generate-private-key=Generate Private Key +kid=Kid +kid.tooltip=KID (Key ID) of the client public key from imported JWKS. +use-jwks-url=Use JWKS URL +use-jwks-url.tooltip=If the switch is on, then client public keys will be downloaded from given JWKS URL. This allows great flexibility because new keys will be always re-downloaded again when client generates new keypair. If the switch is off, then public key (or certificate) from the Keycloak DB is used, so when client keypair changes, you always need to import new key (or certificate) to the Keycloak DB as well. +jwks-url=JWKS URL +jwks-url.tooltip=URL where client keys in JWK format are stored. See JWK specification for more details. If you use keycloak client adapter with "jwt" credential, then you can use URL of your app with '/k_jwks' suffix. For example 'http://www.myhost.com/myapp/k_jwks' . +archive-format=Archive Format +archive-format.tooltip=Java keystore or PKCS12 archive format. +key-alias=Key Alias +key-alias.tooltip=Archive alias for your private key and certificate. +key-password=Key Password +key-password.tooltip=Password to access the private key in the archive +store-password=Store Password +store-password.tooltip=Password to access the archive itself +generate-and-download=Generate and Download +client-certificate-import=Client Certificate Import +import-client-certificate=Import Client Certificate +jwt-import.key-alias.tooltip=Archive alias for your certificate. +secret=Secret +regenerate-secret=Regenerate Secret +registrationAccessToken=Registration access token +registrationAccessToken.regenerate=Regenerate registration access token +registrationAccessToken.tooltip=The registration access token provides access for clients to the client registration service. +add-role=Add Role +role-name=Role Name +composite=Composite +description=Description +no-client-roles-available=No client roles available +scope-param-required=Scope Param Required +scope-param-required.tooltip=This role will only be granted if scope parameter with role name is used during authorization/token request. +composite-roles=Composite Roles +composite-roles.tooltip=When this role is (un)assigned to a user any role associated with it will be (un)assigned implicitly. +realm-roles=Realm Roles +available-roles=Available Roles +add-selected=Add selected +associated-roles=Associated Roles +composite.associated-realm-roles.tooltip=Realm level roles associated with this composite role. +composite.available-realm-roles.tooltip=Realm level roles that you can associate to this composite role. +remove-selected=Remove selected +client-roles=Client Roles +select-client-to-view-roles=Select client to view roles for client +available-roles.tooltip=Roles from this client that you can associate to this composite role. +client.associated-roles.tooltip=Client roles associated with this composite role. +add-builtin=Add Builtin +category=Category +type=Type +no-mappers-available=No mappers available +add-builtin-protocol-mappers=Add Builtin Protocol Mappers +add-builtin-protocol-mapper=Add Builtin Protocol Mapper +scope-mappings=Scope Mappings +full-scope-allowed=Full Scope Allowed +full-scope-allowed.tooltip=Allows you to disable all restrictions. +scope.available-roles.tooltip=Realm level roles that can be assigned to scope. +assigned-roles=Assigned Roles +assigned-roles.tooltip=Realm level roles assigned to scope. +effective-roles=Effective Roles +realm.effective-roles.tooltip=Assigned realm level roles that may have been inherited from a composite role. +select-client-roles.tooltip=Select client to view roles for client +assign.available-roles.tooltip=Client roles available to be assigned. +client.assigned-roles.tooltip=Assigned client roles. +client.effective-roles.tooltip=Assigned client roles that may have been inherited from a composite role. +basic-configuration=Basic configuration +node-reregistration-timeout=Node Re-registration Timeout +node-reregistration-timeout.tooltip=Interval to specify max time for registered clients cluster nodes to re-register. If cluster node won't send re-registration request to Keycloak within this time, it will be unregistered from Keycloak +registered-cluster-nodes=Registered cluster nodes +register-node-manually=Register node manually +test-cluster-availability=Test cluster availability +last-registration=Last registration +node-host=Node host +no-registered-cluster-nodes=No registered cluster nodes available +cluster-nodes=Cluster Nodes +add-node=Add Node +active-sessions.tooltip=Total number of active user sessions for this client. +show-sessions=Show Sessions +show-sessions.tooltip=Warning, this is a potentially expensive operation depending on number of active sessions. +user=User +from-ip=From IP +session-start=Session Start +first-page=First Page +previous-page=Previous Page +next-page=Next Page +client-revoke.not-before.tooltip=Revoke any tokens issued before this date for this client. +client-revoke.push.tooltip=If admin URL is configured for this client, push this policy to that client. +select-a-format=Select a Format +download=Download +offline-tokens=Offline Tokens +offline-tokens.tooltip=Total number of offline tokens for this client. +show-offline-tokens=Show Offline Tokens +show-offline-tokens.tooltip=Warning, this is a potentially expensive operation depending on number of offline tokens. +token-issued=Token Issued +last-access=Last Access +last-refresh=Last Refresh +key-export=Key Export +key-import=Key Import +export-saml-key=Export SAML Key +import-saml-key=Import SAML Key +realm-certificate-alias=Realm Certificate Alias +realm-certificate-alias.tooltip=Realm certificate is stored in archive too. This is the alias to it. +signing-key=Signing Key +saml-signing-key=SAML Signing Key. +private-key=Private Key +generate-new-keys=Generate new keys +export=Export +encryption-key=Encryption Key +saml-encryption-key.tooltip=SAML Encryption Key. +service-accounts=Service Accounts +service-account.available-roles.tooltip=Realm level roles that can be assigned to service account. +service-account.assigned-roles.tooltip=Realm level roles assigned to service account. +service-account-is-not-enabled-for=Service account is not enabled for {{client}} +create-protocol-mappers=Create Protocol Mappers +create-protocol-mapper=Create Protocol Mapper +protocol=Protocol +protocol.tooltip=Protocol... +id=ID +mapper.name.tooltip=Name of the mapper. +mapper.consent-required.tooltip=When granting temporary access, must the user consent to providing this data to the client? +consent-text=Consent Text +consent-text.tooltip=Text to display on consent page. +mapper-type=Mapper Type +mapper-type.tooltip=Type of the mapper +# realm identity providers +identity-providers=Identity Providers +table-of-identity-providers=Table of identity providers +add-provider.placeholder=Add provider... +provider=Provider +gui-order=GUI order +first-broker-login-flow=First Login Flow +post-broker-login-flow=Post Login Flow +redirect-uri=Redirect URI +redirect-uri.tooltip=The redirect uri to use when configuring the identity provider. +alias=Alias +display-name=Display Name +identity-provider.alias.tooltip=The alias uniquely identifies an identity provider and it is also used to build the redirect uri. +identity-provider.display-name.tooltip=Friendly name for Identity Providers. +identity-provider.enabled.tooltip=Enable/disable this identity provider. +authenticate-by-default=Authenticate by Default +identity-provider.authenticate-by-default.tooltip=Indicates if this provider should be tried by default for authentication even before displaying login screen. +store-tokens=Store Tokens +identity-provider.store-tokens.tooltip=Enable/disable if tokens must be stored after authenticating users. +stored-tokens-readable=Stored Tokens Readable +identity-provider.stored-tokens-readable.tooltip=Enable/disable if new users can read any stored tokens. This assigns the broker.read-token role. +disableUserInfo=Disable User Info +identity-provider.disableUserInfo.tooltip=Disable usage of User Info service to obtain additional user information? Default is to use this OIDC service. +userIp=Use userIp Param +identity-provider.google-userIp.tooltip=Set 'userIp' query parameter when invoking on Google's User Info service. This will use the user's ip address. Useful if Google is throttling access to the User Info service. +sandbox=Target Sandbox +identity-provider.paypal-sandbox.tooltip=Target PayPal's sandbox environment +update-profile-on-first-login=Update Profile on First Login +on=On +on-missing-info=On missing info +off=Off +update-profile-on-first-login.tooltip=Define conditions under which a user has to update their profile during first-time login. +trust-email=Trust Email +trust-email.tooltip=If enabled then email provided by this provider is not verified even if verification is enabled for the realm. +link-only=Account Linking Only +link-only.tooltip=If true, users cannot log in through this provider. They can only link to this provider. This is useful if you don't want to allow login from the provider, but want to integrate with a provider +hide-on-login-page=Hide on Login Page +hide-on-login-page.tooltip=If hidden, then login with this provider is possible only if requested explicitly, e.g. using the 'kc_idp_hint' parameter. +gui-order.tooltip=Number defining order of the provider in GUI (eg. on Login page). +first-broker-login-flow.tooltip=Alias of authentication flow, which is triggered after first login with this identity provider. Term 'First Login' means that there is not yet existing Keycloak account linked with the authenticated identity provider account. +post-broker-login-flow.tooltip=Alias of authentication flow, which is triggered after each login with this identity provider. Useful if you want additional verification of each user authenticated with this identity provider (for example OTP). Leave this empty if you don't want any additional authenticators to be triggered after login with this identity provider. Also note, that authenticator implementations must assume that user is already set in ClientSession as identity provider already set it. +openid-connect-config=OpenID Connect Config +openid-connect-config.tooltip=OIDC SP and external IDP configuration. +authorization-url=Authorization URL +authorization-url.tooltip=The Authorization Url. +token-url=Token URL +token-url.tooltip=The Token URL. +loginHint=Pass login_hint +loginHint.tooltip=Pass login_hint to identity provider. +logout-url=Logout URL +identity-provider.logout-url.tooltip=End session endpoint to use to logout user from external IDP. +backchannel-logout=Backchannel Logout +backchannel-logout.tooltip=Does the external IDP support backchannel logout? +user-info-url=User Info URL +user-info-url.tooltip=The User Info Url. This is optional. +identity-provider.client-id.tooltip=The client or client identifier registered within the identity provider. +client-secret=Client Secret +show-secret=Show secret +hide-secret=Hide secret +client-secret.tooltip=The client or client secret registered within the identity provider. +issuer=Issuer +issuer.tooltip=The issuer identifier for the issuer of the response. If not provided, no validation will be performed. +default-scopes=Default Scopes +identity-provider.default-scopes.tooltip=The scopes to be sent when asking for authorization. It can be a space-separated list of scopes. Defaults to 'openid'. +prompt=Prompt +unspecified.option=unspecified +none.option=none +consent.option=consent +login.option=login +select-account.option=select_account +prompt.tooltip=Specifies whether the Authorization Server prompts the End-User for reauthentication and consent. +validate-signatures=Validate Signatures +identity-provider.validate-signatures.tooltip=Enable/disable signature validation of external IDP signatures. +identity-provider.use-jwks-url.tooltip=If the switch is on, then identity provider public keys will be downloaded from given JWKS URL. This allows great flexibility because new keys will be always re-downloaded again when identity provider generates new keypair. If the switch is off, then public key (or certificate) from the Keycloak DB is used, so when identity provider keypair changes, you always need to import new key to the Keycloak DB as well. +identity-provider.jwks-url.tooltip=URL where identity provider keys in JWK format are stored. See JWK specification for more details. If you use external keycloak identity provider, then you can use URL like 'http://broker-keycloak:8180/auth/realms/test/protocol/openid-connect/certs' assuming your brokered keycloak is running on 'http://broker-keycloak:8180' and it's realm is 'test' . +validating-public-key=Validating Public Key +identity-provider.validating-public-key.tooltip=The public key in PEM format that must be used to verify external IDP signatures. +validating-public-key-id=Validating Public Key Id +identity-provider.validating-public-key-id.tooltip=Explicit ID of the validating public key given above if the key ID. Leave blank if the key above should be used always, regardless of key ID specified by external IDP; set it if the key should only be used for verifying if key ID from external IDP matches. +import-external-idp-config=Import External IDP Config +import-external-idp-config.tooltip=Allows you to load external IDP metadata from a config file or to download it from a URL. +import-from-url=Import from URL +identity-provider.import-from-url.tooltip=Import metadata from a remote IDP discovery descriptor. +import-from-file=Import from file +identity-provider.import-from-file.tooltip=Import metadata from a downloaded IDP discovery descriptor. +saml-config=SAML Config +identity-provider.saml-config.tooltip=SAML SP and external IDP configuration. +single-signon-service-url=Single Sign-On Service URL +saml.single-signon-service-url.tooltip=The Url that must be used to send authentication requests (SAML AuthnRequest). +single-logout-service-url=Single Logout Service URL +saml.single-logout-service-url.tooltip=The Url that must be used to send logout requests. +nameid-policy-format=NameID Policy Format +nameid-policy-format.tooltip=Specifies the URI reference corresponding to a name identifier format. Defaults to urn:oasis:names:tc:SAML:2.0:nameid-format:persistent. +http-post-binding-response=HTTP-POST Binding Response +http-post-binding-response.tooltip=Indicates whether to respond to requests using HTTP-POST binding. If false, HTTP-REDIRECT binding will be used. +http-post-binding-for-authn-request=HTTP-POST Binding for AuthnRequest +http-post-binding-for-authn-request.tooltip=Indicates whether the AuthnRequest must be sent using HTTP-POST binding. If false, HTTP-REDIRECT binding will be used. +http-post-binding-logout=HTTP-POST Binding Logout +http-post-binding-logout.tooltip=Indicates whether to respond to requests using HTTP-POST binding. If false, HTTP-REDIRECT binding will be used. +want-authn-requests-signed=Want AuthnRequests Signed +want-authn-requests-signed.tooltip=Indicates whether the identity provider expects a signed AuthnRequest. +want-assertions-signed=Want Assertions Signed +want-assertions-signed.tooltip=Indicates whether this service provider expects a signed Assertion. +want-assertions-encrypted=Want Assertions Encrypted +want-assertions-encrypted.tooltip=Indicates whether this service provider expects an encrypted Assertion. +force-authentication=Force Authentication +identity-provider.force-authentication.tooltip=Indicates whether the identity provider must authenticate the presenter directly rather than rely on a previous security context. +validate-signature=Validate Signature +saml.validate-signature.tooltip=Enable/disable signature validation of SAML responses. +validating-x509-certificate=Validating X509 Certificates +validating-x509-certificate.tooltip=The certificate in PEM format that must be used to check for signatures. Multiple certificates can be entered, separated by comma (,). +saml.import-from-url.tooltip=Import metadata from a remote IDP SAML entity descriptor. +social.client-id.tooltip=The client identifier registered with the identity provider. +social.client-secret.tooltip=The client secret registered with the identity provider. +social.default-scopes.tooltip=The scopes to be sent when asking for authorization. See documentation for possible values, separator and default value'. +key=Key +stackoverflow.key.tooltip=The Key obtained from Stack Overflow client registration. +openshift.base-url=Base Url +openshift.base-url.tooltip=Base Url to Openshift Online API +gitlab-application-id=Application Id +gitlab-application-secret=Application Secret +gitlab.application-id.tooltip=Application Id for the application you created in your GitLab Applications account menu +gitlab.application-secret.tooltip=Secret for the application that you created in your GitLab Applications account menu +gitlab.default-scopes.tooltip=Scopes to ask for on login. Will always ask for openid. Additionally adds api if you do not specify anything. + +bitbucket-consumer-key=Consumer Key +bitbucket-consumer-secret=Consumer Secret +bitbucket.key.tooltip=Bitbucket OAuth Consumer Key +bitbucket.secret.tooltip=Bitbucket OAuth Consumer Secret +bitbucket.default-scopes.tooltip=Scopes to ask for on login. If you do not specify anything, scope defaults to 'email'. + +# User federation +sync-ldap-roles-to-keycloak=Sync LDAP Roles To Keycloak +sync-keycloak-roles-to-ldap=Sync Keycloak Roles To LDAP +sync-ldap-groups-to-keycloak=Sync LDAP Groups To Keycloak +sync-keycloak-groups-to-ldap=Sync Keycloak Groups To LDAP + +realms=Realms +realm=Realm + +identity-provider-mappers=Identity Provider Mappers +create-identity-provider-mapper=Create Identity Provider Mapper +add-identity-provider-mapper=Add Identity Provider Mapper +client.description.tooltip=Specifies description of the client. For example 'My Client for TimeSheets'. Supports keys for localized values as well. For example\: ${my_client_description} + +expires=Expires +expiration=Expiration +expiration.tooltip=Specifies how long the token should be valid +count=Count +count.tooltip=Specifies how many clients can be created using the token +remainingCount=Remaining Count +created=Created +back=Back +initial-access-tokens=Initial Access Tokens +add-initial-access-tokens=Add Initial Access Token +initial-access-token=Initial Access Token +initial-access.copyPaste.tooltip=Copy/paste the initial access token before navigating away from this page as it's not posible to retrieve later +continue=Continue +initial-access-token.confirm.title=Copy Initial Access Token +initial-access-token.confirm.text=Please copy and paste the initial access token before confirming as it can't be retrieved later +no-initial-access-available=No Initial Access Tokens available + +client-reg-policies=Client Registration Policies +client-reg-policy.name.tooltip=Display Name of the policy +anonymous-policies=Anonymous Access Policies +anonymous-policies.tooltip=Those Policies are used when Client Registration Service is invoked by unauthenticated request. This means request doesn't contain Initial Access Token nor Bearer Token. +auth-policies=Authenticated Access Policies +auth-policies.tooltip=Those Policies are used when Client Registration Service is invoked by authenticated request. This means request contains Initial Access Token or Bearer Token. +policy-name=Policy Name +no-client-reg-policies-configured=No Client Registration Policies +trusted-hosts.label=Trusted Hosts +trusted-hosts.tooltip=List of Hosts, which are trusted and are allowed to invoke Client Registration Service and/or be used as values of Client URIs. You can use hostnames or IP addresses. If you use star at the beginning (for example '*.example.com' ) then whole domain example.com will be trusted. +host-sending-registration-request-must-match.label=Host Sending Client Registration Request Must Match +host-sending-registration-request-must-match.tooltip=If on, then any request to Client Registration Service is allowed just if it was sent from some trusted host or domain. +client-uris-must-match.label=Client URIs Must Match +client-uris-must-match.tooltip=If on, then all Client URIs (Redirect URIs and others) are allowed just if they match some trusted host or domain. +allowed-protocol-mappers.label=Allowed Protocol Mappers +allowed-protocol-mappers.tooltip=Whitelist of allowed protocol mapper providers. If there is an attempt to register client, which contains some protocol mappers, which were not whitelisted, then registration request will be rejected. +consent-required-for-all-mappers.label=Consent Required For Mappers +consent-required-for-all-mappers.tooltip=If on, then all newly registered protocol mappers will automatically have consentRequired switch on. This means that user will need to approve consent screen. NOTE: Consent screen is shown just if client has consentRequired switch on. So it's usually good to use this switch together with consent-required policy. +allowed-client-templates.label=Allowed Client Templates +allowed-client-templates.tooltip=Whitelist of the client templates, which can be used on newly registered client. Attempt to register client with some client template, which is not whitelisted, will be rejected. By default, the whitelist is empty, so there are not any client templates are allowed. +max-clients.label=Max Clients Per Realm +max-clients.tooltip=It won't be allowed to register new client if count of existing clients in realm is same or bigger than configured limit. + +client-templates=Client Templates +client-templates.tooltip=Client templates allow you to define common configuration that is shared between multiple clients + +groups=Groups + +group.add-selected.tooltip=Realm roles that can be assigned to the group. +group.assigned-roles.tooltip=Realm roles mapped to the group +group.effective-roles.tooltip=All realm role mappings. Some roles here might be inherited from a mapped composite role. +group.available-roles.tooltip=Assignable roles from this client. +group.assigned-roles-client.tooltip=Role mappings for this client. +group.effective-roles-client.tooltip=Role mappings for this client. Some roles here might be inherited from a mapped composite role. + +default-roles=Default Roles +no-realm-roles-available=No realm roles available + +users=Users +user.add-selected.tooltip=Realm roles that can be assigned to the user. +user.assigned-roles.tooltip=Realm roles mapped to the user +user.effective-roles.tooltip=All realm role mappings. Some roles here might be inherited from a mapped composite role. +user.available-roles.tooltip=Assignable roles from this client. +user.assigned-roles-client.tooltip=Role mappings for this client. +user.effective-roles-client.tooltip=Role mappings for this client. Some roles here might be inherited from a mapped composite role. +default.available-roles.tooltip=Realm level roles that can be assigned. +realm-default-roles=Realm Default Roles +realm-default-roles.tooltip=Realm level roles assigned to new users. +default.available-roles-client.tooltip=Roles from this client that are assignable as a default. +client-default-roles=Client Default Roles +client-default-roles.tooltip=Roles from this client assigned as a default role. +composite.available-roles.tooltip=Realm level roles that you can associate to this composite role. +composite.associated-roles.tooltip=Realm level roles associated with this composite role. +composite.available-roles-client.tooltip=Roles from this client that you can associate to this composite role. +composite.associated-roles-client.tooltip=Client roles associated with this composite role. +partial-import=Partial Import +partial-import.tooltip=Partial import allows you to import users, clients, and other resources from a previously exported json file. + +file=File +exported-json-file=Exported json file +import-from-realm=Import from realm +import-users=Import users +import-groups=Import groups +import-clients=Import clients +import-identity-providers=Import identity providers +import-realm-roles=Import realm roles +import-client-roles=Import client roles +if-resource-exists=If a resource exists +fail=Fail +skip=Skip +overwrite=Overwrite +if-resource-exists.tooltip=Specify what should be done if you try to import a resource that already exists. + +partial-export=Partial Export +partial-export.tooltip=Partial export allows you to export realm configuration, and other associated resources into a json file. +export-groups-and-roles=Export groups and roles +export-clients=Export clients + +action=Action +role-selector=Role Selector +realm-roles.tooltip=Realm roles that can be selected. + +select-a-role=Select a role +select-realm-role=Select realm role +client-roles.tooltip=Client roles that can be selected. +select-client-role=Select client role + +client-template=Client Template +client-template.tooltip=Client template this client inherits configuration from +client-saml-endpoint=Client SAML Endpoint +add-client-template=Add client template + +manage=Manage +authentication=Authentication +user-federation=User Federation +user-storage=User Storage +events=Events +realm-settings=Realm Settings +configure=Configure +select-realm=Select realm +add=Add + +client-template.name.tooltip=Name of the client template. Must be unique in the realm +client-template.description.tooltip=Description of the client template +client-template.protocol.tooltip=Which SSO protocol configuration is being supplied by this client template + +add-user-federation-provider=Add user federation provider +add-user-storage-provider=Add user storage provider +required-settings=Required Settings +provider-id=Provider ID +console-display-name=Console Display Name +console-display-name.tooltip=Display name of provider when linked in admin console. +priority=Priority +priority.tooltip=Priority of provider when doing a user lookup. Lowest first. +sync-settings=Sync Settings +periodic-full-sync=Periodic Full Sync +periodic-full-sync.tooltip=Does periodic full synchronization of provider users to Keycloak should be enabled or not +full-sync-period=Full Sync Period +full-sync-period.tooltip=Period for full synchronization in seconds +periodic-changed-users-sync=Periodic Changed Users Sync +periodic-changed-users-sync.tooltip=Does periodic synchronization of changed or newly created provider users to Keycloak should be enabled or not +changed-users-sync-period=Changed Users Sync Period +changed-users-sync-period.tooltip=Period for synchronization of changed or newly created provider users in seconds +synchronize-changed-users=Synchronize changed users +synchronize-all-users=Synchronize all users +remove-imported-users=Remove imported +unlink-users=Unlink users +kerberos-realm=Kerberos Realm +kerberos-realm.tooltip=Name of kerberos realm. For example FOO.ORG +server-principal=Server Principal +server-principal.tooltip=Full name of server principal for HTTP service including server and domain name. For example HTTP/host.foo.org@FOO.ORG +keytab=KeyTab +keytab.tooltip=Location of Kerberos KeyTab file containing the credentials of server principal. For example /etc/krb5.keytab +debug=Debug +debug.tooltip=Enable/disable debug logging to standard output for Krb5LoginModule. +allow-password-authentication=Allow Password Authentication +allow-password-authentication.tooltip=Enable/disable possibility of username/password authentication against Kerberos database +edit-mode=Edit Mode +edit-mode.tooltip=READ_ONLY means that password updates are not allowed and user always authenticates with Kerberos password. UNSYNCED means user can change his password in Keycloak database and this one will be used instead of Kerberos password then +ldap.edit-mode.tooltip=READ_ONLY is a read only LDAP store. WRITABLE means data will be synced back to LDAP on demand. UNSYNCED means user data will be imported, but not synced back to LDAP. +update-profile-first-login=Update Profile First Login +update-profile-first-login.tooltip=Update profile on first login +sync-registrations=Sync Registrations +ldap.sync-registrations.tooltip=Should newly created users be created within LDAP store? Priority effects which provider is chose to sync the new user. +import-enabled=Import Users +ldap.import-enabled.tooltip=If true, LDAP users will be imported into Keycloak DB and synced via the configured sync policies. +vendor=Vendor +ldap.vendor.tooltip=LDAP vendor (provider) +username-ldap-attribute=Username LDAP attribute +ldap-attribute-name-for-username=LDAP attribute name for username +username-ldap-attribute.tooltip=Name of LDAP attribute, which is mapped as Keycloak username. For many LDAP server vendors it can be 'uid'. For Active directory it can be 'sAMAccountName' or 'cn'. The attribute should be filled for all LDAP user records you want to import from LDAP to Keycloak. +rdn-ldap-attribute=RDN LDAP attribute +ldap-attribute-name-for-user-rdn=LDAP attribute name for user RDN +rdn-ldap-attribute.tooltip=Name of LDAP attribute, which is used as RDN (top attribute) of typical user DN. Usually it's the same as Username LDAP attribute, however it's not required. For example for Active directory it's common to use 'cn' as RDN attribute when username attribute might be 'sAMAccountName'. +uuid-ldap-attribute=UUID LDAP attribute +ldap-attribute-name-for-uuid=LDAP attribute name for UUID +uuid-ldap-attribute.tooltip=Name of LDAP attribute, which is used as unique object identifier (UUID) for objects in LDAP. For many LDAP server vendors it's 'entryUUID' however some are different. For example for Active directory it should be 'objectGUID'. If your LDAP server really doesn't support the notion of UUID, you can use any other attribute, which is supposed to be unique among LDAP users in tree. For example 'uid' or 'entryDN'. +user-object-classes=User Object Classes +ldap-user-object-classes.placeholder=LDAP User Object Classes (div. by comma) + +ldap-connection-url=LDAP connection URL +ldap-users-dn=LDAP Users DN +ldap-bind-dn=LDAP Bind DN +ldap-bind-credentials=LDAP Bind Credentials +ldap-filter=LDAP Filter +ldap.user-object-classes.tooltip=All values of LDAP objectClass attribute for users in LDAP divided by comma. For example: 'inetOrgPerson, organizationalPerson' . Newly created Keycloak users will be written to LDAP with all those object classes and existing LDAP user records are found just if they contain all those object classes. + +connection-url=Connection URL +ldap.connection-url.tooltip=Connection URL to your LDAP server +test-connection=Test connection +users-dn=Users DN +ldap.users-dn.tooltip=Full DN of LDAP tree where your users are. This DN is parent of LDAP users. It could be for example 'ou=users,dc=example,dc=com' assuming that your typical user will have DN like 'uid=john,ou=users,dc=example,dc=com' +authentication-type=Authentication Type +ldap.authentication-type.tooltip=LDAP Authentication type. Right now just 'none' (anonymous LDAP authentication) or 'simple' (Bind credential + Bind password authentication) mechanisms are available +bind-dn=Bind DN +ldap.bind-dn.tooltip=DN of LDAP admin, which will be used by Keycloak to access LDAP server +bind-credential=Bind Credential +ldap.bind-credential.tooltip=Password of LDAP admin +test-authentication=Test authentication +custom-user-ldap-filter=Custom User LDAP Filter +ldap.custom-user-ldap-filter.tooltip=Additional LDAP Filter for filtering searched users. Leave this empty if you don't need additional filter. Make sure that it starts with '(' and ends with ')' +search-scope=Search Scope +ldap.search-scope.tooltip=For one level, we search for users just in DNs specified by User DNs. For subtree, we search in whole of their subtree. See LDAP documentation for more details +use-truststore-spi=Use Truststore SPI +ldap.use-truststore-spi.tooltip=Specifies whether LDAP connection will use the truststore SPI with the truststore configured in standalone.xml/domain.xml. 'Always' means that it will always use it. 'Never' means that it won't use it. 'Only for ldaps' means that it will use if your connection URL use ldaps. Note even if standalone.xml/domain.xml is not configured, the default Java cacerts or certificate specified by 'javax.net.ssl.trustStore' property will be used. +validate-password-policy=Validate Password Policy +connection-pooling=Connection Pooling +ldap-connection-timeout=Connection Timeout +ldap.connection-timeout.tooltip=LDAP Connection Timeout in milliseconds +ldap-read-timeout=Read Timeout +ldap.read-timeout.tooltip=LDAP Read Timeout in milliseconds. This timeout applies for LDAP read operations +ldap.validate-password-policy.tooltip=Does Keycloak should validate the password with the realm password policy before updating it +ldap.connection-pooling.tooltip=Does Keycloak should use connection pooling for accessing LDAP server +ldap.pagination.tooltip=Does the LDAP server support pagination. +kerberos-integration=Kerberos Integration +allow-kerberos-authentication=Allow Kerberos authentication +ldap.allow-kerberos-authentication.tooltip=Enable/disable HTTP authentication of users with SPNEGO/Kerberos tokens. The data about authenticated users will be provisioned from this LDAP server +use-kerberos-for-password-authentication=Use Kerberos For Password Authentication +ldap.use-kerberos-for-password-authentication.tooltip=Use Kerberos login module for authenticate username/password against Kerberos server instead of authenticating against LDAP server with Directory Service API +batch-size=Batch Size +ldap.batch-size.tooltip=Count of LDAP users to be imported from LDAP to Keycloak within single transaction. +ldap.periodic-full-sync.tooltip=Does periodic full synchronization of LDAP users to Keycloak should be enabled or not +ldap.periodic-changed-users-sync.tooltip=Does periodic synchronization of changed or newly created LDAP users to Keycloak should be enabled or not +ldap.changed-users-sync-period.tooltip=Period for synchronization of changed or newly created LDAP users in seconds +user-federation-mappers=User Federation Mappers +create-user-federation-mapper=Create user federation mapper +add-user-federation-mapper=Add user federation mapper +provider-name=Provider Name +no-user-federation-providers-configured=No user federation providers configured +no-user-storage-providers-configured=No user storage providers configured +add-identity-provider=Add identity provider +add-identity-provider-link=Add identity provider link +identity-provider=Identity Provider +identity-provider-user-id=Identity Provider User ID +identity-provider-user-id.tooltip=Unique ID of the user on the Identity Provider side +identity-provider-username=Identity Provider Username +identity-provider-username.tooltip=Username on the Identity Provider side +pagination=Pagination + +browser-flow=Browser Flow +browser-flow.tooltip=Select the flow you want to use for browser authentication. +registration-flow=Registration Flow +registration-flow.tooltip=Select the flow you want to use for registration. +direct-grant-flow=Direct Grant Flow +direct-grant-flow.tooltip=Select the flow you want to use for direct grant authentication. +reset-credentials=Reset Credentials +reset-credentials.tooltip=Select the flow you want to use when the user has forgotten their credentials. +client-authentication=Client Authentication +client-authentication.tooltip=Select the flow you want to use for authentication of clients. +docker-auth=Docker Authentication +docker-auth.tooptip=Select the flow you want to use for authenticatoin against a docker client. +new=New +copy=Copy +add-execution=Add execution +add-flow=Add flow +auth-type=Auth Type +requirement=Requirement +config=Config +no-executions-available=No executions available +authentication-flows=Authentication Flows +create-authenticator-config=Create authenticator config +authenticator.alias.tooltip=Name of the configuration +otp-type=OTP Type +time-based=Time Based +counter-based=Counter Based +otp-type.tooltip=totp is Time-Based One Time Password. 'hotp' is a counter base one time password in which the server keeps a counter to hash against. +otp-hash-algorithm=OTP Hash Algorithm +otp-hash-algorithm.tooltip=What hashing algorithm should be used to generate the OTP. +number-of-digits=Number of Digits +otp.number-of-digits.tooltip=How many digits should the OTP have? +look-ahead-window=Look Ahead Window +otp.look-ahead-window.tooltip=How far ahead should the server look just in case the token generator and server are out of time sync or counter sync? +initial-counter=Initial Counter +otp.initial-counter.tooltip=What should the initial counter value be? +otp-token-period=OTP Token Period +otp-token-period.tooltip=How many seconds should an OTP token be valid? Defaults to 30 seconds. +table-of-password-policies=Table of Password Policies +add-policy.placeholder=Add policy... +policy-type=Policy Type +policy-value=Policy Value +admin-events=Admin Events +admin-events.tooltip=Displays saved admin events for the realm. Events are related to admin account, for example a realm creation. To enable persisted events go to config. +login-events=Login Events +filter=Filter +update=Update +reset=Reset +operation-types=Operation Types +resource-types=Resource Types +select-operations.placeholder=Select operations... +select-resource-types.placeholder=Select resource types... +resource-path=Resource Path +resource-path.tooltip=Filter by resource path. Supports wildcard '*' (for example 'users/*'). +date-(from)=Date (From) +date-(to)=Date (To) +authentication-details=Authentication Details +ip-address=IP Address +time=Time +operation-type=Operation Type +resource-type=Resource Type +auth=Auth +representation=Representation +register=Register +required-action=Required Action +default-action=Default Action +auth.default-action.tooltip=If enabled, any new user will have this required action assigned to it. +no-required-actions-configured=No required actions configured +defaults-to-id=Defaults to id +flows=Flows +bindings=Bindings +required-actions=Required Actions +password-policy=Password Policy +otp-policy=OTP Policy +user-groups=User Groups +default-groups=Default Groups +groups.default-groups.tooltip=Set of groups that new users will automatically join. +cut=Cut +paste=Paste + +create-group=Create group +create-authenticator-execution=Create Authenticator Execution +create-form-action-execution=Create Form Action Execution +create-top-level-form=Create Top Level Form +flow.alias.tooltip=Specifies display name for the flow. +top-level-flow-type=Top Level Flow Type +flow.generic=generic +flow.client=client +top-level-flow-type.tooltip=What kind of top level flow is it? Type 'client' is used for authentication of clients (applications) when generic is for users and everything else +create-execution-flow=Create Execution Flow +flow-type=Flow Type +flow.form.type=form +flow.generic.type=generic +flow-type.tooltip=What kind of form is it +form-provider=Form Provider +default-groups.tooltip=Newly created or registered users will automatically be added to these groups +select-a-type.placeholder=select a type +available-groups=Available Groups +available-groups.tooltip=Select a group you want to add as a default. +value=Value +table-of-group-members=Table of group members +table-of-role-members=Table of role members +last-name=Last Name +first-name=First Name +email=Email +toggle-navigation=Toggle navigation +manage-account=Manage account +sign-out=Sign Out +server-info=Server Info +resource-not-found=Resource not found... +resource-not-found.instruction=We could not find the resource you are looking for. Please make sure the URL you entered is correct. +go-to-the-home-page=Go to the home page » +page-not-found=Page not found... +page-not-found.instruction=We could not find the page you are looking for. Please make sure the URL you entered is correct. +events.tooltip=Displays saved events for the realm. Events are related to user accounts, for example a user login. To enable persisted events go to config. +select-event-types.placeholder=Select event types... +events-config.tooltip=Displays configuration options to enable persistence of user and admin events. +select-an-action.placeholder=Select an action... +event-listeners.tooltip=Configure what listeners receive events for the realm. +login.save-events.tooltip=If enabled login events are saved to the database which makes events available to the admin and account management consoles. +clear-events.tooltip=Deletes all events in the database. +events.expiration.tooltip=Sets the expiration for events. Expired events are periodically deleted from the database. +admin-events-settings=Admin Events Settings +save-events=Save Events +admin.save-events.tooltip=If enabled admin events are saved to the database which makes events available to the admin console. +saved-types.tooltip=Configure what event types are saved. +include-representation=Include Representation +include-representation.tooltip=Include JSON representation for create and update requests. +clear-admin-events.tooltip=Deletes all admin events in the database. +server-version=Server Version +server-profile=Server Profile +server-disabled=Server Disabled Features +info=Info +providers=Providers +server-time=Server Time +server-uptime=Server Uptime +memory=Memory +total-memory=Total Memory +free-memory=Free Memory +used-memory=Used Memory +system=System +current-working-directory=Current Working Directory +java-version=Java Version +java-vendor=Java Vendor +java-runtime=Java Runtime +java-vm=Java VM +java-vm-version=Java VM Version +java-home=Java Home +user-name=User Name +user-timezone=User Timezone +user-locale=User Locale +system-encoding=System Encoding +operating-system=Operating System +os-architecture=OS Architecture +spi=SPI +granted-roles=Granted Roles +granted-protocol-mappers=Granted Protocol Mappers +additional-grants=Additional Grants +consent-created-date=Created +consent-last-updated-date=Last updated +revoke=Revoke +new-password=New Password +password-confirmation=Password Confirmation +reset-password=Reset Password +credentials.temporary.tooltip=If enabled user is required to change password on next login +remove-totp=Remove TOTP +credentials.remove-totp.tooltip=Remove one time password generator for user. +reset-actions=Reset Actions +credentials.reset-actions.tooltip=Set of actions to execute when sending the user a Reset Actions Email. 'Verify email' sends an email to the user to verify their email address. 'Update profile' requires user to enter in new personal information. 'Update password' requires user to enter in a new password. 'Configure TOTP' requires setup of a mobile password generator. +reset-actions-email=Reset Actions Email +send-email=Send email +credentials.reset-actions-email.tooltip=Sends an email to user with an embedded link. Clicking on link will allow the user to execute the reset actions. They will not have to login prior to this. For example, set the action to update password, click this button, and the user will be able to change their password without logging in. +add-user=Add user +created-at=Created At +user-enabled=User Enabled +user-enabled.tooltip=A disabled user cannot login. +user-temporarily-locked=User Temporarily Locked +user-temporarily-locked.tooltip=The user may have been locked due to failing to login too many times. +unlock-user=Unlock user +federation-link=Federation Link +email-verified=Email Verified +email-verified.tooltip=Has the user's email been verified? +required-user-actions=Required User Actions +required-user-actions.tooltip=Require an action when the user logs in. 'Verify email' sends an email to the user to verify their email address. 'Update profile' requires user to enter in new personal information. 'Update password' requires user to enter in a new password. 'Configure TOTP' requires setup of a mobile password generator. +locale=Locale +select-one.placeholder=Select one... +impersonate=Impersonate +impersonate-user=Impersonate user +impersonate-user.tooltip=Login as this user. If user is in same realm as you, your current login session will be logged out before you are logged in as this user. +identity-provider-alias=Identity Provider Alias +provider-user-id=Provider User ID +provider-username=Provider Username +no-identity-provider-links-available=No identity provider links available +group-membership=Group Membership +leave=Leave +group-membership.tooltip=Groups user is a member of. Select a listed group and click the Leave button to leave the group. +membership.available-groups.tooltip=Groups a user can join. Select a group and click the join button. +table-of-realm-users=Table of Realm Users +view-all-users=View all users +view-all-groups=View all groups +unlock-users=Unlock users +no-users-available=No users available +users.instruction=Please enter a search, or click on view all users +consents=Consents +started=Started +logout-all-sessions=Logout all sessions +logout=Logout +new-name=New Name +ok=Ok +attributes=Attributes +role-mappings=Role Mappings +members=Members +details=Details +identity-provider-links=Identity Provider Links +register-required-action=Register required action +gender=Gender +address=Address +phone=Phone +profile-url=Profile URL +picture-url=Picture URL +website=Website +import-keys-and-cert=Import keys and cert +import-keys-and-cert.tooltip=Upload the client's key pair and cert. +upload-keys=Upload Keys +download-keys-and-cert=Download keys and cert +no-value-assigned.placeholder=No value assigned +remove=Remove +no-group-members=No group members +no-role-members=No role members +temporary=Temporary +join=Join +event-type=Event Type +events-config=Events Config +event-listeners=Event Listeners +login-events-settings=Login Events Settings +clear-events=Clear events +saved-types=Saved Types +clear-admin-events=Clear admin events +clear-changes=Clear changes +error=Error + +# Authz +# Authz Common +authz-authorization=Authorization +authz-owner=Owner +authz-uri=URI +authz-scopes=Scopes +authz-resource=Resource +authz-resource-type=Resource Type +authz-resources=Resources +authz-scope=Scope +authz-authz-scopes=Authorization Scopes +authz-policies=Policies +authz-permissions=Permissions +authz-users=Users in Role +authz-evaluate=Evaluate +authz-icon-uri=Icon URI +authz-icon-uri.tooltip=An URI pointing to an icon. +authz-select-scope=Select a scope +authz-select-resource=Select a resource +authz-associated-policies=Associated Policies +authz-any-resource=Any resource +authz-any-scope=Any scope +authz-any-role=Any role +authz-policy-evaluation=Policy Evaluation +authz-select-client=Select a client +authz-select-user=Select an user +authz-entitlements=Entitlements +authz-no-resources=No resources +authz-result=Result +authz-authorization-services-enabled=Authorization Enabled +authz-authorization-services-enabled.tooltip=Enable/Disable fine-grained authorization support for a client +authz-required=Required +authz-show-details=Show Details +authz-hide-details=Hide Details +authz-associated-permissions=Associated Permissions +authz-no-permission-associated=No permissions associated + +# Authz Settings +authz-import-config.tooltip=Import a JSON file containing authorization settings for this resource server. + +authz-policy-enforcement-mode=Policy Enforcement Mode +authz-policy-enforcement-mode.tooltip=The policy enforcement mode dictates how policies are enforced when evaluating authorization requests. 'Enforcing' means requests are denied by default even when there is no policy associated with a given resource. 'Permissive' means requests are allowed even when there is no policy associated with a given resource. 'Disabled' completely disables the evaluation of policies and allows access to any resource. +authz-policy-enforcement-mode-enforcing=Enforcing +authz-policy-enforcement-mode-permissive=Permissive +authz-policy-enforcement-mode-disabled=Disabled + +authz-remote-resource-management=Remote Resource Management +authz-remote-resource-management.tooltip=Should resources be managed remotely by the resource server? If false, resources can be managed only from this admin console. + +authz-export-settings=Export Settings +authz-export-settings.tooltip=Export and download all authorization settings for this resource server. + +# Authz Resource List +authz-no-resources-available=No resources available. +authz-no-scopes-assigned=No scopes assigned. +authz-no-type-defined=No type defined. +authz-no-uri-defined=No URI defined. +authz-no-permission-assigned=No permission assigned. +authz-no-policy-assigned=No policy assigned. +authz-create-permission=Create permission + +# Authz Resource Detail +authz-add-resource=Add Resource +authz-resource-name.tooltip=An unique name for this resource. The name can be used to uniquely identify a resource, useful when querying for a specific resource. +authz-resource-owner.tooltip=The owner of this resource. +authz-resource-type.tooltip=The type of this resource. It can be used to group different resource instances with the same type. +authz-resource-uri.tooltip=An URI that can also be used to uniquely identify this resource. +authz-resource-scopes.tooltip=The scopes associated with this resource. + +# Authz Scope List +authz-add-scope=Add Scope +authz-no-scopes-available=No scopes available. + +# Authz Scope Detail +authz-scope-name.tooltip=An unique name for this scope. The name can be used to uniquely identify a scope, useful when querying for a specific scope. + +# Authz Policy List +authz-all-types=All types +authz-create-policy=Create policy +authz-no-policies-available=No policies available. + +# Authz Policy Detail +authz-policy-name.tooltip=The name of this policy. +authz-policy-description.tooltip=A description for this policy. +authz-policy-logic=Logic +authz-policy-logic-positive=Positive +authz-policy-logic-negative=Negative +authz-policy-logic.tooltip=The logic dictates how the policy decision should be made. If 'Positive', the resulting effect (permit or deny) obtained during the evaluation of this policy will be used to perform a decision. If 'Negative', the resulting effect will be negated, in other words, a permit becomes a deny and vice-versa. +authz-policy-apply-policy=Apply Policy +authz-policy-apply-policy.tooltip=Specifies all the policies that must be applied to the scopes defined by this policy or permission. +authz-policy-decision-strategy=Decision Strategy +authz-policy-decision-strategy.tooltip=The decision strategy dictates how the policies associated with a given permission are evaluated and how a final decision is obtained. 'Affirmative' means that at least one policy must evaluate to a positive decision in order for the final decision to be also positive. 'Unanimous' means that all policies must evaluate to a positive decision in order for the final decision to be also positive. 'Consensus' means that the number of positive decisions must be greater than the number of negative decisions. If the number of positive and negative is the same, the final decision will be negative. +authz-policy-decision-strategy-affirmative=Affirmative +authz-policy-decision-strategy-unanimous=Unanimous +authz-policy-decision-strategy-consensus=Consensus +authz-select-a-policy=Select a policy + +# Authz Role Policy Detail +authz-add-role-policy=Add Role Policy +authz-no-roles-assigned=No roles assigned. +authz-policy-role-realm-roles.tooltip=Specifies the *realm* roles allowed by this policy. +authz-policy-role-clients.tooltip=Selects a client in order to filter the client roles that can be applied to this policy. +authz-policy-role-client-roles.tooltip=Specifies the client roles allowed by this policy. + +# Authz User Policy Detail +authz-add-user-policy=Add User Policy +authz-no-users-assigned=No users assigned. +authz-policy-user-users.tooltip=Specifies which user(s) are allowed by this policy. + +# Authz Client Policy Detail +authz-add-client-policy=Add Client Policy +authz-no-clients-assigned=No clients assigned. +authz-policy-client-clients.tooltip=Specifies which client(s) are allowed by this policy. + +# Authz Time Policy Detail +authz-add-time-policy=Add Time Policy +authz-policy-time-not-before.tooltip=Defines the time before which the policy MUST NOT be granted. Only granted if current date/time is after or equal to this value. +authz-policy-time-not-on-after=Not On or After +authz-policy-time-not-on-after.tooltip=Defines the time after which the policy MUST NOT be granted. Only granted if current date/time is before or equal to this value. +authz-policy-time-day-month=Day of Month +authz-policy-time-day-month.tooltip=Defines the day of month which the policy MUST be granted. You can also provide a range by filling the second field. In this case, permission is granted only if current day of month is between or equal to the two values you provided. +authz-policy-time-month=Month +authz-policy-time-month.tooltip=Defines the month which the policy MUST be granted. You can also provide a range by filling the second field. In this case, permission is granted only if current month is between or equal to the two values you provided. +authz-policy-time-year=Year +authz-policy-time-year.tooltip=Defines the year which the policy MUST be granted. You can also provide a range by filling the second field. In this case, permission is granted only if current year is between or equal to the two values you provided. +authz-policy-time-hour=Hour +authz-policy-time-hour.tooltip=Defines the hour which the policy MUST be granted. You can also provide a range by filling the second field. In this case, permission is granted only if current hour is between or equal to the two values you provided. +authz-policy-time-minute=Minute +authz-policy-time-minute.tooltip=Defines the minute which the policy MUST be granted. You can also provide a range by filling the second field. In this case, permission is granted only if current minute is between or equal to the two values you provided. + +# Authz Drools Policy Detail +authz-add-drools-policy=Add Rules Policy +authz-policy-drools-maven-artifact-resolve=Resolve +authz-policy-drools-maven-artifact=Policy Maven Artifact +authz-policy-drools-maven-artifact.tooltip=A Maven GAV pointing to an artifact from where the rules would be loaded from. Once you have provided the GAV, you can click *Resolve* to load both *Module* and *Session* fields. +authz-policy-drools-module=Module +authz-policy-drools-module.tooltip=The module used by this policy. You must provide a module in order to select a specific session from where rules will be loaded from. +authz-policy-drools-session=Session +authz-policy-drools-session.tooltip=The session used by this policy. The session provides all the rules to evaluate when processing the policy. +authz-policy-drools-update-period=Update Period +authz-policy-drools-update-period.tooltip=Specifies an interval for scanning for artifact updates. + +# Authz JS Policy Detail +authz-add-js-policy=Add JavaScript Policy +authz-policy-js-code=Code +authz-policy-js-code.tooltip=The JavaScript code providing the conditions for this policy. + + +# Authz Aggregated Policy Detail +authz-aggregated=Aggregated +authz-add-aggregated-policy=Add Aggregated Policy + +# Authz Group Policy Detail +authz-add-group-policy=Add Group Policy +authz-no-groups-assigned=No groups assigned. +authz-policy-group-claim=Groups Claim +authz-policy-group-claim.tooltip=A claim to use as the source for user's group. If the claim is present it must be an array of strings. +authz-policy-group-groups.tooltip=Specifies the groups allowed by this policy. + +# Authz Permission List +authz-no-permissions-available=No permissions available. + +# Authz Permission Detail +authz-permission-name.tooltip=The name of this permission. +authz-permission-description.tooltip=A description for this permission. + +# Authz Resource Permission Detail +authz-add-resource-permission=Add Resource Permission +authz-permission-resource-apply-to-resource-type=Apply to Resource Type +authz-permission-resource-apply-to-resource-type.tooltip=Specifies if this permission would be applied to all resources with a given type. In this case, this permission will be evaluated for all instances of a given resource type. +authz-permission-resource-resource.tooltip=Specifies that this permission must be applied to a specific resource instance. +authz-permission-resource-type.tooltip=Specifies that this permission must be applied to all resources instances of a given type. + +# Authz Scope Permission Detail +authz-add-scope-permission=Add Scope Permission +authz-permission-scope-resource.tooltip=Restrict the scopes to those associated with the selected resource. If not selected all scopes would be available. +authz-permission-scope-scope.tooltip=Specifies that this permission must be applied to one or more scopes. + +# Authz Evaluation +authz-evaluation-identity-information=Identity Information +authz-evaluation-identity-information.tooltip=The available options to configure the identity information that will be used when evaluating policies. +authz-evaluation-client.tooltip=Select the client making this authorization request. If not provided, authorization requests would be done based on the client you are in. +authz-evaluation-user.tooltip=Select an user whose identity is going to be used to query permissions from the server. +authz-evaluation-role.tooltip=Select the roles you want to associate with the selected user. +authz-evaluation-new=New Evaluation +authz-evaluation-re-evaluate=Re-Evaluate +authz-evaluation-previous=Previous Evaluation +authz-evaluation-contextual-info=Contextual Information +authz-evaluation-contextual-info.tooltip=The available options to configure any contextual information that will be used when evaluating policies. +authz-evaluation-contextual-attributes=Contextual Attributes +authz-evaluation-contextual-attributes.tooltip=Any attribute provided by a running environment or execution context. +authz-evaluation-permissions.tooltip=The available options to configure the permissions to which policies will be applied. +authz-evaluation-evaluate=Evaluate +authz-evaluation-any-resource-with-scopes=Any resource with scope(s) +authz-evaluation-no-result=Could not obtain any result for the given authorization request. Check if the provided resource(s) or scope(s) are associated with any policy. +authz-evaluation-no-policies-resource=No policies were found for this resource. +authz-evaluation-result.tooltip=The overall result for this permission request. +authz-evaluation-scopes.tooltip=The list of allowed scopes. +authz-evaluation-policies.tooltip=Details about which policies were evaluated and their decisions. +authz-evaluation-authorization-data=Response +authz-evaluation-authorization-data.tooltip=Represents a token carrying authorization data as a result of the processing of an authorization request. This representation is basically what Keycloak issues to clients asking for permissions. Check the 'authorization' claim for the permissions that were granted based on the current authorization request. +authz-show-authorization-data=Show Authorization Data + +kid=KID +keys=Keys +all=All +status=Status +keystore=Keystore +keystores=Keystores +add-keystore=Add Keystore +add-keystore.placeholder=Add keystore... +view=View +active=Active + +Sunday=Sunday +Monday=Monday +Tuesday=Tuesday +Wednesday=Wednesday +Thursday=Thursday +Friday=Friday +Saturday=Saturday + +user-storage-cache-policy=Cache Settings +userStorage.cachePolicy=Cache Policy +userStorage.cachePolicy.option.DEFAULT=DEFAULT +userStorage.cachePolicy.option.EVICT_WEEKLY=EVICT_WEEKLY +userStorage.cachePolicy.option.EVICT_DAILY=EVICT_DAILY +userStorage.cachePolicy.option.MAX_LIFESPAN=MAX_LIFESPAN +userStorage.cachePolicy.option.NO_CACHE=NO_CACHE +userStorage.cachePolicy.tooltip=Cache Policy for this storage provider. 'DEFAULT' is whatever the default settings are for the global user cache. 'EVICT_DAILY' is a time of day every day that the user cache will be invalidated. 'EVICT_WEEKLY' is a day of the week and time the cache will be invalidated. 'MAX-LIFESPAN' is the time in milliseconds that will be the lifespan of a cache entry. +userStorage.cachePolicy.evictionDay=Eviction Day +userStorage.cachePolicy.evictionDay.tooltip=Day of the week the entry will become invalid on +userStorage.cachePolicy.evictionHour=Eviction Hour +userStorage.cachePolicy.evictionHour.tooltip=Hour of day the entry will become invalid on. +userStorage.cachePolicy.evictionMinute=Eviction Minute +userStorage.cachePolicy.evictionMinute.tooltip=Minute of day the entry will become invalid on. +userStorage.cachePolicy.maxLifespan=Max Lifespan +userStorage.cachePolicy.maxLifespan.tooltip=Max lifespan of a user cache entry in milliseconds. +user-origin-link=Storage Origin +user-origin.tooltip=UserStorageProvider the user was loaded from +user-link.tooltip=UserStorageProvider this locally stored user was imported from. + +disable=Disable +disableable-credential-types=Disableable Types +credentials.disableable.tooltip=List of credential types that you can disable +disable-credential-types=Disable Credential Types +credentials.disable.tooltip=Click button to disable selected credential types +credential-types=Credential Types +manage-user-password=Manage Password +disable-credentials=Disable Credentials +credential-reset-actions=Credential Reset +credential-reset-actions-timeout=Expires In +credential-reset-actions-timeout.tooltip=Maximum time before the action permit expires. +ldap-mappers=LDAP Mappers +create-ldap-mapper=Create LDAP mapper +map-role-mgmt-scope-description=Policies that decide if an admin can map this role to a user or group +manage-authz-users-scope-description=Policies that decide if an admin can manage all users in the realm +view-authz-users-scope-description=Policies that decide if an admin can view all users in realm +permissions-enabled-role=Permissions Enabled +permissions-enabled-role.tooltip=Whether or not to enable fine grain permissions for managing this role. Disabling will delete all current permissions that have been set up. +manage-permissions-role.tooltip=Fine grain permissions for managing roles. For example, you can define different policies for who is allowed to map a role. +lookup=Lookup +manage-permissions-users.tooltip=Fine grain permssions for managing all users in realm. You can define different policies for who is allowed to manage users in the realm. +permissions-enabled-users=Permissions Enabled +permissions-enabled-users.tooltip=Whether or not to enable fine grain permissions for managing users. Disabling will delete all current permissions that have been set up. +manage-permissions-client.tooltip=Fine grain permssions for admins that want to manage this client or apply roles defined by this client. +manage-permissions-group.tooltip=Fine grain permssions for admins that want to manage this group or the members of this group. +manage-authz-group-scope-description=Policies that decide if an admin can manage this group +view-authz-group-scope-description=Policies that decide if an admin can view this group +view-members-authz-group-scope-description=Policies that decide if an admin can manage the members of this group +token-exchange-authz-client-scope-description=Policies that decide which clients are allowed exchange tokens for a token that is targeted to this client. +token-exchange-authz-idp-scope-description=Policies that decide which clients are allowed exchange tokens for an external token minted by this identity provider. +manage-authz-client-scope-description=Policies that decide if an admin can manage this client +configure-authz-client-scope-description=Reduced management permissions for admin. Cannot set scope, template, or protocol mappers. +view-authz-client-scope-description=Policies that decide if an admin can view this client +map-roles-authz-client-scope-description=Policies that decide if an admin can map roles defined by this client +map-roles-client-scope-authz-client-scope-description=Policies that decide if an admin can apply roles defined by this client to the client scope of another client +map-roles-composite-authz-client-scope-description=Policies that decide if an admin can apply roles defined by this client as a composite to another role +map-role-authz-role-scope-description=Policies that decide if an admin can map this role to a user or group +map-role-client-scope-authz-role-scope-description=Policies that decide if an admin can apply this role to the client scope of a client +map-role-composite-authz-role-scope-description=Policies that decide if an admin can apply this role as a composite to another role +manage-group-membership-authz-users-scope-description=Policies that decide if an admin can manage group membership for all users in the realm. This is used in conjunction with specific group policy +impersonate-authz-users-scope-description=Policies that decide if admin can impersonate other users +map-roles-authz-users-scope-description=Policies that decide if admin can map roles for all users +user-impersonated-authz-users-scope-description=Policies that decide which users can be impersonated. These policies are applied to the user being impersonated. +manage-membership-authz-group-scope-description=Policies that decide if admin can add or remove users from this group +manage-members-authz-group-scope-description=Policies that decide if an admin can manage the members of this group diff --git a/admin/messages/admin-messages_es.properties b/admin/messages/admin-messages_es.properties new file mode 100644 index 0000000..f5cab83 --- /dev/null +++ b/admin/messages/admin-messages_es.properties @@ -0,0 +1,467 @@ +# Common messages +enabled=Habilitado +name=Nombre +save=Guardar +cancel=Cancelar +onText=SI +offText=NO +client=Cliente +clients=Clientes +clear=Limpiar +selectOne=Selecciona uno... + +true=S\u00ED +false=No + + +# Realm settings +realm-detail.enabled.tooltip=Los usuarios y clientes solo pueden acceder a un dominio si est\u00E1 habilitado +registrationAllowed=Registro de usuario +registrationAllowed.tooltip=Habilitar/deshabilitar la p\u00E1gina de registro. Un enlace para el registro se mostrar\u00E1 tambi\u00E9n en la p\u00E1gina de inicio de sesi\u00F3n. +registrationEmailAsUsername=Email como nombre de usuario +registrationEmailAsUsername.tooltip=Si est\u00E1 habilitado el nombre de usuario queda oculto del formulario de registro y el email se usa como nombre de usuario para los nuevos usuarios. +editUsernameAllowed=Editar nombre de usuario +editUsernameAllowed.tooltip=Si est\u00E1 habilitado, el nombre de usuario es editable, en otro caso es de solo lectura. +resetPasswordAllowed=Olvido contrase\u00F1a +resetPasswordAllowed.tooltip=Muestra un enlace en la p\u00E1gina de inicio de sesi\u00F3n para que el usuario haga clic cuando ha olvidado sus credenciales. +rememberMe=Seguir conectado +rememberMe.tooltip=Muestra la casilla de selecci\u00F3n en la p\u00E1gina de inicio de sesi\u00F3n para permitir al usuario permanecer conectado entre reinicios del navegador hasta que la sesi\u00F3n expire. +verifyEmail=Verificar email +verifyEmail.tooltip=Forzar al usuario a verificar su direcci\u00F3n de email la primera vez que inicie sesi\u00F3n. +sslRequired=Solicitar SSL +sslRequired.option.all=todas las peticiones +sslRequired.option.external=peticiones externas +sslRequired.option.none=ninguna +sslRequired.tooltip=\u00BFEs HTTP obligatorio? ''ninguna'' significa que HTTPS no es obligatorio para ninguna direcic\u00F3n IP de cliente, ''peticiones externas'' indica que localhost y las direcciones IP privadas pueden acceder sin HTTPS, ''todas las peticiones'' significa que HTTPS es obligatorio para todas las direcciones IP. +publicKey=Clave p\u00FAblica +gen-new-keys=Generar nuevas claves +certificate=Certificado +host=Host +smtp-host=Host SMTP +port=Puerto +smtp-port=Puerto SMTP (por defecto 25) +from=De +sender-email-addr=Email del emisor +enable-ssl=Habilitar SSL +enable-start-tls=Habilitar StartTLS +enable-auth=Habilitar autenticaci\u00F3n +username=Usuario +login-username=Usuario +password=Contrase\u00F1a +login-password=Contrase\u00F1a +login-theme=Tema de inicio de sesi\u00F3n +select-one=Selecciona uno... +login-theme.tooltip=Selecciona el tema para las p\u00E1ginas de inicio de sesi\u00F3n, TOTP, permisos, registro y recordatorio de contrase\u00F1a. +account-theme=Tema de cuenta +account-theme.tooltip=Selecciona el tema para las p\u00E1ginas de gesti\u00F3n de la cuenta de usuario. +admin-console-theme=Tema de consola de administraci\u00F3n +select-theme-admin-console=Selecciona el tema para la consola de administraci\u00F3n. +email-theme=Tema de email +select-theme-email=Selecciona el tema para los emails que son enviados por el servidor. +i18n-enabled=Internacionalizaci\u00F3n activa +supported-locales=Idiomas soportados +supported-locales.placeholder=Indica el idioma y pulsa Intro +default-locale=Idioma por defecto +realm-cache-enabled=Cach\u00E9 de dominio habilitada +realm-cache-enabled.tooltip=Activar/desactivar la cach\u00E9 para el dominio, cliente y datos de roles. +user-cache-enabled=Cach\u00E9 de usuario habilitada +user-cache-enabled.tooltip=Habilitar/deshabilitar la cach\u00E9 de usuarios y de asignaciones de usuarios a roles. +revoke-refresh-token=Revocar el token de actualizaci\u00F3n +revoke-refresh-token.tooltip=Si est\u00E1 activado los tokens de actualizaci\u00F3n solo pueden usarse una vez. En otro caso los tokens de actualizaci\u00F3n no se revocan cuando se utilizan y pueden ser usado m\u00FAltiples veces. +sso-session-idle=Sesiones SSO inactivas +seconds=Segundos +minutes=Minutos +hours=Horas +days=D\u00EDas +sso-session-max=Tiempo m\u00E1ximo sesi\u00F3n SSO +sso-session-idle.tooltip=Tiempo m\u00E1ximo que una sesi\u00F3n puede estar inactiva antes de que expire. Los tokens y sesiones de navegador son invalidadas cuando la sesi\u00F3n expira. +sso-session-max.tooltip=Tiempo m\u00E1ximo antes de que una sesi\u00F3n expire. Los tokens y sesiones de navegador son invalidados cuando una sesi\u00F3n expira. +offline-session-idle=Inactividad de sesi\u00F3n sin conexi\u00F3n +offline-session-idle.tooltip=Tiempo m\u00E1ximo inactivo de una sesi\u00F3n sin conexi\u00F3n antes de que expire. Necesitas usar un token sin conexi\u00F3n para refrescar al menos una vez dentro de este periodo, en otro caso la sesi\u00F3n sin conexi\u00F3n expirar\u00E1. +access-token-lifespan=Duraci\u00F3n del token de acceso +access-token-lifespan.tooltip=Tiempo m\u00E1ximo antes de que un token de acceso expire. Se recomienda que este valor sea corto en relaci\u00F3n al tiempo m\u00E1ximo de SSO +client-login-timeout=Tiempo m\u00E1ximo de autenticaci\u00F3n +client-login-timeout.tooltip=Tiempo m\u00E1ximo que un cliente tiene para finalizar el protocolo de obtenci\u00F3n del token de acceso. Deber\u00EDa ser normalmente del orden de 1 minuto. +login-timeout=Tiempo m\u00E1ximo de desconexi\u00F3n +login-timeout.tooltip=Tiempo m\u00E1ximo que un usuario tiene para completar el inicio de sesi\u00F3n. Se recomienda que sea relativamente alto. 30 minutos o m\u00E1s. +login-action-timeout=Tiempo m\u00E1ximo de acci\u00F3n en el inicio de sesi\u00F3n +login-action-timeout.tooltip=Tiempo m\u00E1ximo que un usuario tiene para completar acciones relacionadas con el inicio de sesi\u00F3n, como la actualizaci\u00F3n de contrase\u00F1a o configuraci\u00F3n de TOTP. Es recomendado que sea relativamente alto. 5 minutos o m\u00E1s. +headers=Cabeceras +brute-force-detection=Detecci\u00F3n de ataques por fuerza bruta +x-frame-options=X-Frame-Options +click-label-for-info=Haz clic en el enlace de la etiqueta para obtener m\u00E1s informaci\u00F3n. El valor por defecto evita que las p\u00E1ginas sean incluidas desde iframes externos. +content-sec-policy=Content-Security-Policy +max-login-failures=N\u00FAmero m\u00E1ximo de fallos de inicio de sesi\u00F3n +max-login-failures.tooltip=Indica cuantos fallos se permiten antes de que se dispare una espera. +wait-increment=Incremento de espera +wait-increment.tooltip=Cuando se ha alcanzado el umbral de fallo, \u00BFcuanto tiempo debe estar un usuario bloqueado? +quick-login-check-millis=Tiempo en milisegundos entre inicios de sesi\u00F3n r\u00E1pidos +quick-login-check-millis.tooltip=Si ocurren errores de forma concurrente y muy r\u00E1pida, bloquear al usuario. +min-quick-login-wait=Tiempo m\u00EDnimo entre fallos de conexi\u00F3n r\u00E1pidos +min-quick-login-wait.tooltip=Cuanto tiempo se debe esperar tras un fallo en un intento r\u00E1pido de identificaci\u00F3n +max-wait=Espera m\u00E1xima +max-wait.tooltip=Tiempo m\u00E1ximo que un usuario quedar\u00E1 bloqueado. +failure-reset-time=Reinicio del contador de errores +failure-reset-time.tooltip=\u00BFCuando se debe reiniciar el contador de errores? +realm-tab-login=Inicio de sesi\u00F3n +realm-tab-keys=Claves +realm-tab-email=Email +realm-tab-themes=Temas +realm-tab-cache=Cach\u00E9 +realm-tab-tokens=Tokens +realm-tab-security-defenses=Defensas de seguridad +realm-tab-general=General +add-realm=A\u00F1adir dominio + +#Session settings +realm-sessions=Sesiones de dominio +revocation=Revocaci\u00F3n +logout-all=Desconectar todo +active-sessions=Sesiones activas +sessions=Sesiones +not-before=No antes de +not-before.tooltip=Revocar cualquier token emitido antes de esta fecha. +set-to-now=Fijar a ahora +push=Push +push.tooltip=Para cada cliente que tiene una URL de administraci\u00F3n, notificarlos las nuevas pol\u00EDticas de revocaci\u00F3n. + +#Protocol Mapper +usermodel.prop.label=Propiedad +usermodel.prop.tooltip=Nombre del m\u00E9todo de propiedad en la interfaz UserModel. Por ejemplo, un valor de ''email'' referenciar\u00EDa al m\u00E9todo UserModel.getEmail(). +usermodel.attr.label=Atributo de usuario +usermodel.attr.tooltip=Nombre del atributo de usuario almacenado que es el nombre del atributo dentro del map UserModel.attribute. +userSession.modelNote.label=Nota sesi\u00F3n usuario +userSession.modelNote.tooltip=Nombre de la nota almacenada en la sesi\u00F3n de usuario dentro del mapa UserSessionModel.note +multivalued.label=Valores m\u00FAltiples +multivalued.tooltip=Indica si el atributo soporta m\u00FAltiples valores. Si est\u00E1 habilitado, la lista de todos los valores de este atributo se fijar\u00E1 como reclamaci\u00F3n. Si est\u00E1 deshabilitado, solo el primer valor ser\u00E1 fijado como reclamaci\u00F3n. +selectRole.label=Selecciona rol +selectRole.tooltip=Introduce el rol en la caja de texto de la izquierda, o haz clic en este bot\u00F3n para navegar y buscar el rol que quieres. +tokenClaimName.label=Nombre de reclamo del token +tokenClaimName.tooltip=Nombre del reclamo a insertar en el token. Puede ser un nombre completo como ''address.street''. En este caso, se crear\u00E1 un objeto JSON anidado. +jsonType.label=Tipo JSON de reclamaci\u00F3n +jsonType.tooltip=El tipo de JSON que deber\u00EDa ser usado para rellenar la petici\u00F3n de JSON en el token. long, int, boolean y String son valores v\u00E1lidos +includeInIdToken.label=A\u00F1adir al token de ID +includeInAccessToken.label=A\u00F1adir al token de acceso +includeInAccessToken.tooltip=\u00BFDeber\u00EDa a\u00F1adirse la identidad reclamada al token de acceso? + + +# client details +clients.tooltip=Los clientes son aplicaciones de navegador de confianza y servicios web de un dominio. Estos clientes pueden solicitar un inicio de sesi\u00F3n. Tambi\u00E9n puedes definir roles espec\u00EDficos de cliente. +search.placeholder=Buscar... +create=Crear +import=Importar +client-id=ID Cliente +base-url=URL Base +actions=Acciones +not-defined=No definido +edit=Editar +delete=Borrar +no-results=Sin resultados +no-clients-available=No hay clientes disponibles +add-client=A\u00F1adir Cliente +select-file=Selecciona archivo +view-details=Ver detalles +clear-import=Limpiar importaci\u00F3n +client-id.tooltip=Indica el identificador (ID) referenciado en URIs y tokens. Por ejemplo ''my-client'' +client.name.tooltip=Indica el nombre visible del cliente. Por ejemplo ''My Client''. Tambi\u00E9n soporta claves para valores localizados. Por ejemplo: ${my_client} +client.enabled.tooltip=Los clientes deshabilitados no pueden iniciar una identificaci\u00F3n u obtener c\u00F3digos de acceso. +consent-required=Consentimiento necesario +consent-required.tooltip=Si est\u00E1 habilitado, los usuarios tienen que consentir el acceso del cliente. +direct-grants-only=Solo permisos directos +direct-grants-only.tooltip=Cuando est\u00E1 habilitado, el cliente solo puede obtener permisos de la API REST. +client-protocol=Protocolo del Cliente +client-protocol.tooltip=''OpenID connect'' permite a los clientes verificar la identidad del usuario final basado en la autenticaci\u00F3n realizada por un servidor de autorizaci\u00F3n. ''SAML'' habilita la autenticaci\u00F3n y autorizaci\u00F3n de escenarios basados en web incluyendo cross-domain y single sign-on (SSO) y utiliza tokens de seguridad que contienen afirmaciones para pasar informaci\u00F3n. +access-type=Tipo de acceso +access-type.tooltip=Los clientes ''Confidential'' necesitan un secreto para iniciar el protocolo de identificaci\u00F3n. Los clientes ''Public'' no requieren un secreto. Los clientes ''Bearer-only'' son servicios web que nunca inician un login. +service-accounts-enabled=Cuentas de servicio habilitadas +service-accounts-enabled.tooltip=Permitir autenticar este cliente contra Keycloak y recibir un token de acceso dedicado para este cliente. +include-authnstatement=Incluir AuthnStatement +include-authnstatement.tooltip=\u00BFDeber\u00EDa incluirse una declaraci\u00F3n especificando el m\u00E9todo y la marca de tiempo en la respuesta de inicio de sesi\u00F3n? +sign-documents=Firmar documentos +sign-documents.tooltip=\u00BFDeber\u00EDa el dominio firmar los documentos SAML? +sign-assertions=Firmar aserciones +sign-assertions.tooltip=\u00BFDeber\u00EDan firmarse las aserciones en documentos SAML? Este ajuste no es necesario si el documento ya est\u00E1 siendo firmado. +signature-algorithm=Algoritmo de firma +signature-algorithm.tooltip=El algoritmo de firma usado para firmar los documentos. +canonicalization-method=M\u00E9todo de canonicalizaci\u00F3n +canonicalization-method.tooltip=M\u00E9todo de canonicalizaci\u00F3n para las firmas XML +encrypt-assertions=Cifrar afirmaciones +encrypt-assertions.tooltip=\u00BFDeber\u00EDan cifrarse las afirmaciones SAML con la clave p\u00FAblica del cliente usando AES? +client-signature-required=Firma de Cliente requerida +client-signature-required.tooltip=\u00BFFirmar\u00E1 el cliente sus peticiones y respuestas SAML? \u00BFY deber\u00EDan ser validadas? +force-post-binding=Forzar enlaces POST +force-post-binding.tooltip=Usar siempre POST para las respuestas +front-channel-logout=Desonexi\u00F3n en primer plano (Front Channel) +front-channel-logout.tooltip=Cuando est\u00E1 activado, la desconexi\u00F3n require una redirecci\u00F3n del navegador hacia el cliente. Cuando no est\u00E1 activado, el servidor realiza una invovaci\u00F3n de desconexi\u00F3n en segundo plano. +force-name-id-format=Forzar formato NameID +force-name-id-format.tooltip=Ignorar la petici\u00F3n de sujeto NameID y usar la configurada en la consola de administraci\u00F3n. +name-id-format=Formato de NameID +name-id-format.tooltip=El formato de NameID que se usar\u00E1 para el t\u00EDtulo +root-url=URL ra\u00EDz +root-url.tooltip=URL ra\u00EDz a\u00F1adida a las URLs relativas +valid-redirect-uris=URIs de redirecci\u00F3n v\u00E1lidas +valid-redirect-uris.tooltip=Patr\u00F3n de URI v\u00E1lida para la cual un navegador puede solicitar la redirecci\u00F3n tras un inicio o cierre de sesi\u00F3n completado. Se permiten comodines simples p.ej. ''http://example.com/*''. Tambi\u00E9n se pueden indicar rutas relativas p.ej. ''/my/relative/path/*''. Las rutas relativas generar\u00E1n una URI de redirecci\u00F3n usando el host y puerto de la petici\u00F3n. Para SAML, se deben fijar patrones de URI v\u00E1lidos si quieres confiar en la URL del servicio del consumidor indicada en la petici\u00F3n de inicio de sesi\u00F3n. +base-url.tooltip=URL por defecto para usar cuando el servidor de autorizaci\u00F3n necesita redirigir o enviar de vuelta al cliente. +admin-url=URL de administraci\u00F3n +admin-url.tooltip=URL a la interfaz de administraci\u00F3n del cliente. Fija este valor si el cliente soporta el adaptador de REST. Esta API REST permite al servidor de autenticaci\u00F3n enviar al cliente pol\u00EDticas de revocaci\u00F3n y otras tareas administrativas. Normalment se fija a la URL base del cliente. +master-saml-processing-url=URL principal de procesamiento SAML +master-saml-processing-url.tooltip=Si est\u00E1 configurada, esta URL se usar\u00E1 para cada enlace al proveedor del servicio del consumidor de aserciones y servicios de desconexi\u00F3n \u00FAnicos. Puede ser sobreescrito de forma individual para cada enlace y servicio en el punto final de configuraci\u00F3n fina de SAML. +idp-sso-url-ref=Nombre de la URL de un SSO iniciado por el IDP +idp-sso-url-ref.tooltip=Nombre del fragmento de la URL para referenciar al cliente cuando quieres un SSO iniciado por el IDP. Dejando esto vac\u00EDo deshabilita los SSO iniciados por el IDP. La URL referenciada desde el navegador ser\u00E1: {server-root}/realms/{realm}/protocol/saml/clients/{client-url-name} +idp-sso-relay-state=Estado de retransmisi\u00F3n de un SSO iniciado por el IDP +idp-sso-relay-state.tooltip=Estado de retransmisi\u00F3n que quieres enviar con una petici\u00F3n SAML cuando se inicia un SSO iniciado por el IDP +web-origins=Or\u00EDgenes web +web-origins.tooltip=Or\u00EDgenes CORS permitidos. Para permitir todos los or\u00EDgenes de URIs de redirecci\u00F3n v\u00E1lidas a\u00F1ade ''+''. Para permitir todos los or\u00EDgenes a\u00F1ade ''*''. +fine-saml-endpoint-conf=Fine Grain SAML Endpoint Configuration +fine-saml-endpoint-conf.tooltip=Expande esta secci\u00F3n para configurar las URL exactas para Assertion Consumer y Single Logout Service. +assertion-consumer-post-binding-url=Assertion Consumer Service POST Binding URL +assertion-consumer-post-binding-url.tooltip=SAML POST Binding URL for the client''s assertion consumer service (login responses). You can leave this blank if you do not have a URL for this binding. +assertion-consumer-redirect-binding-url=Assertion Consumer Service Redirect Binding URL +assertion-consumer-redirect-binding-url.tooltip=Assertion Consumer Service Redirect Binding URL +logout-service-post-binding-url=URL de enlace SAML POST para la desconexi\u00F3n +logout-service-post-binding-url.tooltip=URL de enlace SAML POST para la desconexi\u00F3n \u00FAnica del cliente. Puedes dejar esto en blanco si est\u00E1s usando un enlace distinto. +logout-service-redir-binding-url=URL de enlace SAML de redirecci\u00F3n para la desconexi\u00F3n +logout-service-redir-binding-url.tooltip=URL de enlace SAML de redirecci\u00F3n para la desconexi\u00F3n \u00FAnica del cliente. Puedes dejar esto en blanco si est\u00E1s usando un enlace distinto. + +# client import +import-client=Importar Cliente +format-option=Formato +select-format=Selecciona un formato +import-file=Archivo de Importaci\u00F3n + +# client tabs +settings=Ajustes +credentials=Credenciales +saml-keys=Claves SAML +roles=Roles +mappers=Asignadores +mappers.tooltip=Los asignadores de protocolos realizan transformaciones en tokens y documentos. Pueden hacer cosas como asignar datos de usuario en peticiones de protocolo, o simplemente transformar cualquier petici\u00F3n entre el cliente y el servidor de autenticaci\u00F3n. +scope=\u00C1mbito +scope.tooltip=Las asignaciones de \u00E1mbito te permiten restringir que asignaciones de roles de usuario se incluyen en el token de acceso solicitado por el cliente. +sessions.tooltip=Ver sesiones activas para este cliente. Permite ver qu\u00E9 usuarios est\u00E1n activos y cuando se identificaron. +offline-access=Acceso sin conexi\u00F3n +offline-access.tooltip=Ver sesiones sin conexi\u00F3n para este cliente. Te permite ver que usuarios han solicitado tokens sin conexi\u00F3n y cuando los solicitaron. Para revocar todos los tokens del cliente, accede a la pesta\u00F1a de Revocaci\u00F3n y fija el valor \"No antes de\" a \"now\". +clustering=Clustering +installation=Instalaci\u00F3n +installation.tooltip=Herramienta de ayuda para generar la configuraci\u00F3n de varios formatos de adaptadores de cliente que puedes descargar o copiar y pegar para configurar tus clientes. +service-account-roles=Roles de cuenta de servicio +service-account-roles.tooltip=Permitir autenticar asignaciones de rol para la cuenta de servicio dedicada a este cliente. + +# client credentials +client-authenticator=Cliente autenticador +client-authenticator.tooltip=Cliente autenticador usado para autenticar este cliente contra el servidor Keycloak +certificate.tooltip=Certificado de clinete para validar los JWT emitidos por este cliente y firmados con la clave privada del cliente de tu almac\u00E9n de claves. +no-client-certificate-configured=No se ha configurado el certificado de cliente +gen-new-keys-and-cert=Generar nuevas claves y certificado +import-certificate=Importar Certificado +gen-client-private-key=Generar clave privada de cliente +generate-private-key=Generar clave privada +archive-format=Formato de Archivo +archive-format.tooltip=Formato de archivo Java keystore o PKCS12 +key-alias=Alias de clave +key-alias.tooltip=Alias del archivo de tu clave privada y certificado. +key-password=Contrase\u00F1a de la clave +key-password.tooltip=Contrase\u00F1a para acceder a la clave privada contenida en el archivo +store-password=Contrase\u00F1a del almac\u00E9n +store-password.tooltip=Contrase\u00F1a para acceder al archivo +generate-and-download=Generar y descargar +client-certificate-import=Importaci\u00F3n de certificado de cliente +import-client-certificate=Importar Certificado de Cliente +jwt-import.key-alias.tooltip=Alias del archivo de tu certificado. +secret=Secreto +regenerate-secret=Regenerar secreto +add-role=A\u00F1adir rol +role-name=Nombre de rol +composite=Compuesto +description=Descripci\u00F3n +no-client-roles-available=No hay roles de cliente disponibles +scope-param-required=Par\u00E1metro de \u00E1mbito obligatorio +scope-param-required.tooltip=Este rol solo ser\u00E1 concedido si el par\u00E1metro de \u00E1mbito con el nombre del rol es usado durante la petici\u00F3n de autorizaci\u00F3n/obtenci\u00F3n de token. +composite-roles=Roles compuestos +composite-roles.tooltip=Cuando este rol es asignado/desasignado a un usuario cualquier rol asociado con \u00E9l ser\u00E1 asignado/desasignado de forma impl\u00EDcita. +realm-roles=Roles de dominio +available-roles=Roles Disponibles +add-selected=A\u00F1adir seleccionado +associated-roles=Roles Asociados +composite.associated-realm-roles.tooltip=Roles a nivel de dominio asociados con este rol compuesto. +composite.available-realm-roles.tooltip=Roles a nivel de dominio disponibles en este rol compuesto. +remove-selected=Borrar seleccionados +client-roles=Roles de Cliente +select-client-to-view-roles=Selecciona el cliente para ver sus roles +available-roles.tooltip=Roles de este cliente que puedes asociar a este rol compuesto. +client.associated-roles.tooltip=Roles de cliente asociados con este rol compuesto. +add-builtin=A\u00F1adir Builtin +category=Categor\u00EDa +type=Tipo +no-mappers-available=No hay asignadores disponibles +add-builtin-protocol-mappers=A\u00F1adir Builtin Protocol Mappers +add-builtin-protocol-mapper=A\u00F1adir Builtin Protocol Mapper +scope-mappings=Asignaciones de \u00E1mbito +full-scope-allowed=Permitir todos los \u00E1mbitos +full-scope-allowed.tooltip=Permite deshabilitar todas las restricciones. +scope.available-roles.tooltip=Roles de dominio que pueden ser asignados al \u00E1mbito +assigned-roles=Roles Asignados +assigned-roles.tooltip=Roles a nivel de dominio asignados a este \u00E1mbito. +effective-roles=Roles Efectivos +realm.effective-roles.tooltip=Roles de dominio asignados que pueden haber sido heredados de un rol compuesto. +select-client-roles.tooltip=Selecciona el cliente para ver sus roles +assign.available-roles.tooltip=Roles de clientes disponibles para ser asignados. +client.assigned-roles.tooltip=Roles de cliente asignados +client.effective-roles.tooltip=Roles de cliente asignados que pueden haber sido heredados desde un rol compuesto. +basic-configuration=Configuraci\u00F3n b\u00E1sica +node-reregistration-timeout=Tiempo de espera de re-registro de nodo +node-reregistration-timeout.tooltip=Indica el m\u00E1ximo intervalo de tiempo para que los nodos del cluster registrados se vuelvan a registrar. Si el nodo del cluster no env\u00EDa una petici\u00F3n de re-registro a Keycloak dentro de este intervalo, ser\u00E1 desregistrado de Keycloak +registered-cluster-nodes=Registrar nodos de cluster +register-node-manually=Registrar nodo manualmente +test-cluster-availability=Probar disponibilidad del cluster +last-registration=\u00DAltimo registro +node-host=Host del nodo +no-registered-cluster-nodes=No hay nodos de cluster registrados disponibles +cluster-nodes=Nodos de cl\u00FAster +add-node=A\u00F1adir Nodo +active-sessions.tooltip=N\u00FAmero total de sesiones activas para este cliente. +show-sessions=Mostrar sesiones +show-sessions.tooltip=Advertencia, esta es una operaci\u00F3n potencialmente costosa dependiendo del n\u00FAmero de sesiones activas. +user=Usuario +from-ip=Desde IP +session-start=Inicio de sesi\u00F3n +first-page=Primera p\u00E1gina +previous-page=P\u00E1gina Anterior +next-page=P\u00E1gina siguiente +client-revoke.not-before.tooltip=Revocar todos los tokens emitidos antes de esta fecha para este cliente. +client-revoke.push.tooltip=Si la URL de administraci\u00F3n est\u00E1 configurada para este cliente, env\u00EDa esta pol\u00EDtica a este cliente. +select-a-format=Selecciona un formato +download=Descargar +offline-tokens=Tokens sin conexi\u00F3n +offline-tokens.tooltip=N\u00FAmero total de tokens sin conexi\u00F3n de este cliente. +show-offline-tokens=Mostrar tokens sin conexi\u00F3n +show-offline-tokens.tooltip=Advertencia, esta es una operaci\u00F3n potencialmente costosa dependiendo del n\u00FAmero de tokens sin conexi\u00F3n. +token-issued=Token expedido +last-access=\u00DAltimo Acceso +last-refresh=\u00DAltima actualizaci\u00F3n +key-export=Exportar clave +key-import=Importar clave +export-saml-key=Exportar clave SAML +import-saml-key=Importar clave SAML +realm-certificate-alias=Alias del certificado del dominio +realm-certificate-alias.tooltip=El certificado del dominio es almacenado en archivo. Este es el alias al mismo. +signing-key=Clave de firma +saml-signing-key=Clave de firma SAML. +private-key=Clave Privada +generate-new-keys=Generar nuevas claves +export=Exportar +encryption-key=Clave de cifrado +saml-encryption-key.tooltip=Clave de cifrado de SAML +service-accounts=Cuentas de servicio +service-account.available-roles.tooltip=Roles de dominio que pueden ser asignados a la cuenta del servicio. +service-account.assigned-roles.tooltip=Roles de dominio asignados a la cuenta del servicio. +service-account-is-not-enabled-for=La cuenta del servicio no est\u00E1 habilitada para {{client}} +create-protocol-mappers=Crear asignadores de protocolo +create-protocol-mapper=Crear asignador de protocolo +protocol=Protocolo +protocol.tooltip=Protocolo. +id=ID +mapper.name.tooltip=Nombre del asignador. +mapper.consent-required.tooltip=Cuando se concede acceso temporal, \u00BFes necesario el consentimiento del usuario para proporcinar estos datos al cliente? +consent-text=Texto del consentimiento +consent-text.tooltip=Texto para mostrar en la p\u00E1gina de consentimiento. +mapper-type=Tipo de asignador + +# realm identity providers +identity-providers=Proveedores de identidad +table-of-identity-providers=Tabla de proveedores de identidad +add-provider.placeholder=A\u00F1adir proveedor... +provider=Proveedor +gui-order=Orden en la interfaz gr\u00E1fica (GUI) +redirect-uri=URI de redirecci\u00F3n +redirect-uri.tooltip=La URI de redirecci\u00F3n usada para configurar el proveedor de identidad. +alias=Alias +identity-provider.alias.tooltip=El alias que identifica de forma \u00FAnica un proveedor de identidad, se usa tambi\u00E9n para construir la URI de redirecci\u00F3n. +identity-provider.enabled.tooltip=Habilita/deshabilita este proveedor de identidad. +authenticate-by-default=Autenticar por defecto +identity-provider.authenticate-by-default.tooltip=Indica si este proveedor deber\u00EDa ser probado por defecto para autenticacaci\u00F3n incluso antes de mostrar la p\u00E1gina de inicio de sesi\u00F3n. +store-tokens=Almacenar tokens +identity-provider.store-tokens.tooltip=Habiltar/deshabilitar si los tokens deben ser almacenados despu\u00E9s de autenticar a los usuarios. +stored-tokens-readable=Tokens almacenados legibles +identity-provider.stored-tokens-readable.tooltip=Habilitar/deshabilitar si los nuevos usuarios pueden leer los tokens almacenados. Esto asigna el rol ''broker.read-token''. +update-profile-on-first-login=Actualizar perfil en el primer inicio de sesi\u00F3n +on=Activado +on-missing-info=Si falta informaci\u00F3n +off=Desactivado +update-profile-on-first-login.tooltip=Define condiciones bajo las cuales un usuario tiene que actualizar su perfil durante el primer inicio de sesi\u00F3n. +trust-email=Confiar en el email +trust-email.tooltip=Si est\u00E1 habilitado, el email recibido de este proveedor no se verificar\u00E1 aunque la verificaci\u00F3n est\u00E9 habilitada para el dominio. +gui-order.tooltip=N\u00FAmero que define el orden del proveedor en la interfaz gr\u00E1fica (GUI) (ej. en la p\u00E1gina de inicio de sesi\u00F3n) +openid-connect-config=Configuraci\u00F3n de OpenID Connect +openid-connect-config.tooltip=Configuraci\u00F3n de OIDC SP e IDP externos +authorization-url=URL de autorizaci\u00F3n +authorization-url.tooltip=La URL de autorizaci\u00F3n. +token-url=Token URL +token-url.tooltip=La URL del token. +logout-url=URL de desconexi\u00F3n +identity-provider.logout-url.tooltip=Punto de cierre de sesi\u00F3n para usar en la desconexi\u00F3n de usuarios desde un proveedor de identidad (IDP) externo. +backchannel-logout=Backchannel Logout +backchannel-logout.tooltip=Does the external IDP support backchannel logout? +user-info-url=URL de informaci\u00F3n de usuario +user-info-url.tooltip=La URL de informaci\u00F3n de usuario. Opcional. +identity-provider.client-id.tooltip=El cliente o identificador de cliente registrado en el proveedor de identidad. +client-secret=Secreto de Cliente +show-secret=Mostrar secreto +hide-secret=Ocultar secreto +client-secret.tooltip=El cliente o el secreto de cliente registrado en el proveedor de identidad. +issuer=Emisor +issuer.tooltip=El identificador del emisor para el emisor de la respuesta. Si no se indica, no se realizar\u00E1 ninguna validaci\u00F3n. +default-scopes=\u00C1mbitos por defecto +identity-provider.default-scopes.tooltip=Los \u00E1mbitos que se enviar\u00E1n cuando se solicite autorizaci\u00F3n. Puede ser una lista de \u00E1mbitos separados por espacios. El valor por defecto es ''openid''. +prompt=Prompt +unspecified.option=no especificado +none.option=ninguno +consent.option=consentimiento +login.option=login +select-account.option=select_account +prompt.tooltip=Indica si el servidor de autorizaci\u00F3n solicita al usuario final para reautenticaci\u00F3n y consentimiento. +validate-signatures=Validar firmas +identity-provider.validate-signatures.tooltip=Habilitar/deshabilitar la validaci\u00F3n de firmas de proveedores de identidad (IDP) externos +validating-public-key=Validando clave p\u00FAblica +identity-provider.validating-public-key.tooltip=La clave p\u00FAblica en formato PEM que debe usarse para verificar las firmas de proveedores de identidad (IDP) externos. +import-external-idp-config=Importar configuraci\u00F3n externa de IDP +import-external-idp-config.tooltip=Te permite cargar metadatos de un proveedor de identidad (IDP) externo de un archivo de coniguraci\u00F3n o descargarlo desde una URL. +import-from-url=Importar desde URL +identity-provider.import-from-url.tooltip=Importar metadatos desde un descriptor de un proveedor de identidad (IDP) remoto. +import-from-file=Importar desde archivo +identity-provider.import-from-file.tooltip=Importar metadatos desde un descriptor de un proveedor de identidad (IDP) descargado. +saml-config=Configuraci\u00F3n SAML +identity-provider.saml-config.tooltip=Configuraci\u00F3n de proveedor SAML e IDP externo +single-signon-service-url=URL de servicio de conexi\u00F3n \u00FAnico (SSO) +saml.single-signon-service-url.tooltip=La URL que debe ser usada para enviar peticiones de autenticaci\u00F3n (SAML AuthnRequest). +single-logout-service-url=URL de servicio de desconexi\u00F3n \u00FAnico +saml.single-logout-service-url.tooltip=La URL que debe usarse para enviar peticiones de desconexi\u00F3n. +nameid-policy-format=Formato de pol\u00EDtica NameID +nameid-policy-format.tooltip=Indica la referencia a la URI correspondiente a un formato de NameID. El valor por defecto es urn:oasis:names:tc:SAML:2.0:nameid-format:persistent. +http-post-binding-response=HTTP-POST enlace de respuesta +http-post-binding-response.tooltip=Indica si se reponde a las peticiones usando HTTP-POST. Si no est\u00E1 activado, se usa HTTP-REDIRECT. +http-post-binding-for-authn-request=HTTP-POST para AuthnRequest +http-post-binding-for-authn-request.tooltip=Indica si AuthnRequest debe ser enviada usando HTTP-POST. Si no est\u00E1 activado se hace HTTP-REDIRECT. +want-authn-requests-signed=Firmar AuthnRequests +want-authn-requests-signed.tooltip=Indica si el proveedor de identidad espera recibir firmadas las AuthnRequest. +force-authentication=Forzar autenticaci\u00F3n +identity-provider.force-authentication.tooltip=Indica si el proveedor de identidad debe autenticar al presentar directamente las credenciales en lugar de depender de un contexto de seguridad previo. +validate-signature=Validar firma +saml.validate-signature.tooltip=Habilitar/deshabilitar la validaci\u00F3n de firma en respuestas SAML. +validating-x509-certificate=Validando certificado X509 +validating-x509-certificate.tooltip=El certificado en formato PEM que debe usarse para comprobar las firmas. +saml.import-from-url.tooltip=Importar metadatos desde un descriptor de entidad remoto de un IDP de SAML +social.client-id.tooltip=El identificador del cliente registrado con el proveedor de identidad. +social.client-secret.tooltip=El secreto del cliente registrado con el proveedor de identidad. +social.default-scopes.tooltip=\u00C1mbitos que se enviar\u00E1n cuando se solicite autorizaci\u00F3n. Ver la documentaci\u00F3n para los posibles valores, separador y valor por defecto. +key=Clave +stackoverflow.key.tooltip=La clave obtenida en el registro del cliente de Stack Overflow. + +realms=Dominios +realm=Dominio + +identity-provider-mappers=Asignadores de proveedores de identidad (IDP) +create-identity-provider-mapper=Crear asignador de proveedor de identidad (IDP) +add-identity-provider-mapper=A\u00F1adir asignador de proveedor de identidad +client.description.tooltip=Indica la descripci\u00F3n del cliente. Por ejemplo ''My Client for TimeSheets''. Tambi\u00E9n soporta claves para valores localizados. Por ejemplo: ${my_client_description} +content-type-options= diff --git a/admin/messages/admin-messages_fr.properties b/admin/messages/admin-messages_fr.properties new file mode 100644 index 0000000..525dceb --- /dev/null +++ b/admin/messages/admin-messages_fr.properties @@ -0,0 +1,142 @@ +consoleTitle=Keycloak Admin Console + +# Common messages +enabled=Actif +name=Nom +displayName=Display name +displayNameHtml=HTML Display name +save=Sauver +cancel=Annuler +onText=Oui +offText=Non +client=Client +clients=Clients +clear=Effacer +selectOne=Select One... + +manage=G\u00e9rer +authentication=Authentification +user-federation=Regroupement Utilisateur +user-storage=Stockage Utilisateur +events=\u00c9v\u00e8nements +realm-settings=Configurations du domaine +configure=Configurer +select-realm=Choisir un domaine +add=Ajouter + +true=Vrai +false=Faux + +endpoints=Endpoints + +# Realm settings +realm-detail.enabled.tooltip=Les utilisateurs et les clients peuvent acc\u00e9der au domaine si celui-ci est actif +realm-detail.oidc-endpoints.tooltip=Affiche les configurations de l''endpoint OpenID Connect +registrationAllowed=Enregistrement d''utilisateur +registrationAllowed.tooltip=Activer/d\u00e9sactiver la page d''enregistrement. Un lien pour l''enregistrement sera visible sur la page de connexion. +registrationEmailAsUsername=Courriel comme nom d''utilisateur +registrationEmailAsUsername.tooltip=Si actif, le champ du nom de l''utilisateur est cach\u00e9 pendant l''enregistrement ; le courriel est utilis\u00e9 comme nom d''utilisateur. +editUsernameAllowed=\u00c9ditez le nom de l''utilisateur +editUsernameAllowed.tooltip=Si actif, le champ du nom de l''utilisateur est modifiable. +resetPasswordAllowed=Mot de passe oubli\u00e9 +resetPasswordAllowed.tooltip=Affiche un lien sur la page de connexion pour les utilisateurs ayant oubli\u00e9 leurs accr\u00e9ditations. +rememberMe=Se souvenir de moi +rememberMe.tooltip=Affiche une case \u00e0 cocher sur la page de connexion pour permettre aux utilisateurs de rester connect\u00e9s entre deux red\u00e9marrages de leur navigateur, jusqu''\u00e0 expiration de la session. +verifyEmail=V\u00e9rification du courriel +verifyEmail.tooltip=Force l''utilisateur \u00e0 v\u00e9rifier son courriel lors de la premi\u00e8re connexion. +loginWithEmailAllowed=Authentification avec courriel +loginWithEmailAllowed.tooltip=Autorise l''utilisateur \u00e0 s''authentifier avec son adresse de courriel. +duplicateEmailsAllowed=Doublon courriel +duplicateEmailsAllowed.tooltip=Autorise plusieurs utilisateurs \u00e0 avoir la m\u00eame adresse de courriel. Changer cette configuration va vider le cache. Il est recommand\u00e9 de mettre \u00e0 jour manuellement les contraintes sur le courriel dans la base de donn\u00e9es apr\u00e8s la d\u00e9sactivation du support des doublons. +sslRequired=SSL requis +sslRequired.option.all=toutes les requ\u00eates +sslRequired.option.external=les requ\u00eates externes +sslRequired.option.none=aucun +sslRequired.tooltip=Niveau d''exigence HTTPS \: ''aucun'' signifie que le HTTPS n''est requis pour aucune adresse IP cliente. ''les requ\u00eates externes'' signifie que localhost et les adresses IP priv\u00e9es peuvent acc\u00e9der sans HTTPS. ''toutes les requ\u00eates'' signifie que le protocole HTTPS est obligatoire pour toutes les adresses IP. +publicKey=Clef publique +gen-new-keys=Cr\u00e9ation de nouvelle clef +certificate=Certificat +host=H\u00f4te +smtp-host=H\u00f4te SMTP +port=Port +smtp-port=Port SMTP (25 par d\u00e9faut) +from=De +sender-email-addr=Courriel de l''exp\u00e9diteur +enable-ssl=Activer SSL/TLS +enable-start-tls=Activer StartTLS +enable-auth=Activer l''authentification +username=Nom de l''utilisateur +login-username=Connexion de l''utilisateur +password=Mot de passe +login-password=Mot de passe +login-theme=Th\u00e8me de connexion +select-one=S\u00e9lectionnez-en un... +login-theme.tooltip=S\u00e9lectionnez le th\u00e8me pour les pages de connexion, de mot de passe \u00e0 usage unique bas\u00e9 sur le temps, des droits, de l''enregistrement, et du mot passe oubli\u00e9. +account-theme=Th\u00e8me du compte +account-theme.tooltip=S\u00e9lectionnez le th\u00e8me pour la gestion des comptes. +admin-console-theme=Th\u00e8me de la console d''administration +select-theme-admin-console=S\u00e9lectionnez le th\u00e8me de la console d''administration. +email-theme=Th\u00e8me pour le courriel +select-theme-email=S\u00e9lectionnez le th\u00e8me pour les courriels envoy\u00e9es par le serveur. +i18n-enabled=Internationalisation activ\u00e9e +supported-locales=Locales support\u00e9es +supported-locales.placeholder=Entrez la locale et validez +default-locale=Locale par d\u00e9faut +realm-cache-enabled=Cache du domaine activ\u00e9 +realm-cache-enabled.tooltip=Activer/D\u00e9sactiver le cache pour le domaine, client et donn\u00e9es. +user-cache-enabled=Cache utilisateur activ\u00e9 +user-cache-enabled.tooltip=Activer/D\u00e9sactiver le cache utilisateur, et le cache de relation entre utilisateurs et r\u00f4les. +sso-session-idle=Sessions SSO inactives +seconds=Secondes +minutes=Minutes +hours=Heures +days=Jours +sso-session-max=Maximum de sessions SSO +sso-session-idle.tooltip=Temps d''inactivit\u00e9 autoris\u00e9 avant expiration de la session. Les jetons et les sessions navigateurs sont invalid\u00e9es quand la session expire. +sso-session-max.tooltip=Dur\u00e9e maximale avant que la session n''expire. Les jetons et les sessions navigateurs sont invalid\u00e9es quand la session expire. +access-token-lifespan=Dur\u00e9e de vie du jeton d''acc\u00e8s +access-token-lifespan.tooltip=Dur\u00e9e maximale avant que le jeton d''acc\u00e8s n''expire. Cette valeur devrait \u00eatre relativement plus petite que la dur\u00e9e d''inactivit\u00e9 (timeout) du SSO. +client-login-timeout=Dur\u00e9e d''inactivit\u00e9 de connexion (timeout) +client-login-timeout.tooltip=Dur\u00e9e maximale qu''a un client pour finir le protocole du jeton d''acc\u00e8s. Devrait \u00eatre de l''ordre de la minute (1 min). +login-timeout=Dur\u00e9e d''inactivit\u00e9 de connexion +login-timeout.tooltip=Dur\u00e9e maximale autoris\u00e9e pour finaliser la connexion. Devrait \u00eatre relativement long \: 30 minutes, voire plus. +login-action-timeout=Dur\u00e9e d''inactivit\u00e9 des actions de connexions +login-action-timeout.tooltip=Dur\u00e9e maximale qu''a un utilisateur pour finir ses actions concernant la mise \u00e0 jour de son mot de passe ou bien de la configuration du mot de passe \u00e0 usage unique (TOTP). Devrait \u00eatre relativement long \: 5 minutes, voire plus. +headers=En-t\u00eates +brute-force-detection=D\u00e9tection des attaques par force brute +x-frame-options=X-Frame-Options +click-label-for-info=Cliquer sur le label pour plus d''information. Les valeurs par d\u00e9faut \u00e9vitent que les pages soient incluses dans des iframes \u00e9trang\u00e8res. +content-sec-policy=Content-Security-Policy +max-login-failures=Nombre maximal d''erreurs de connexion +max-login-failures.tooltip=Nombre d''erreurs avant de d\u00e9clencher le temps d''attente. +wait-increment=Temps d''attente +wait-increment.tooltip=Quand le seuil des erreurs est atteint, combien de temps l''utilisateur est-il bloqu\u00e9 ? +quick-login-check-millis=Nombre de millisecondes entre deux connexions +quick-login-check-millis.tooltip=Si une erreur apparait trop rapidement, bloquer le compte utilisateur. +min-quick-login-wait=Dur\u00e9e minimale d''attente entre deux connexions +min-quick-login-wait.tooltip=Dur\u00e9e d''attente demand\u00e9e apr\u00e8s une erreur entre deux connexions. +max-wait=Dur\u00e9e maximale d''attente +max-wait.tooltip=Dur\u00e9e maximale de blocage du compte utilisateur +failure-reset-time=Dur\u00e9e de remise \u00e0 z\u00e9ro des erreurs +failure-reset-time.tooltip=Quand les erreurs sont-elles remises \u00e0 z\u00e9ro ? +realm-tab-login=Connexion +realm-tab-keys=Clefs +realm-tab-email=Courriels +realm-tab-themes=Th\u00e8mes +realm-tab-cache=Cache +realm-tab-tokens=Jetons +realm-tab-security-defenses=Mesures de s\u00e9curit\u00e9 +realm-tab-general=G\u00e9n\u00e9ral +add-realm=Ajouter un domaine + +#Session settings +realm-sessions=Sessions du domaine +revocation=R\u00e9vocation +logout-all=D\u00e9connexion globale +active-sessions=Sessions actives +sessions=Sessions +not-before=Pas avant +not-before.tooltip=R\u00e9voquer tous les jetons demand\u00e9s avant cette date. +set-to-now=Mettre \u00e0 maintenant +push=Appuyer +push.tooltip=Pour tous les clients ayant une URL d''administration, les notifier de la politique de r\u00e9vocation. diff --git a/admin/messages/admin-messages_it.properties b/admin/messages/admin-messages_it.properties new file mode 100644 index 0000000..e69de29 diff --git a/admin/messages/admin-messages_ja.properties b/admin/messages/admin-messages_ja.properties new file mode 100644 index 0000000..32fc72a --- /dev/null +++ b/admin/messages/admin-messages_ja.properties @@ -0,0 +1,1228 @@ +# encoding: utf-8 +consoleTitle=Keycloak 管理コンソール + +# Common messages +enabled=有効 +name=名前 +displayName=表示名 +displayNameHtml=HTML 表示名 +save=保存 +cancel=キャンセル +onText=オン +offText=オフ +client=クライアント +clients=クライアント +clear=クリア +selectOne=1つ選択... + +true=はい +false=いいえ + +endpoints=エンドポイント + +# Realm settings +realm-detail.enabled.tooltip=有効の場合は、ユーザーとクライアントはこのレルムのみアクセス可能になります +realm-detail.oidc-endpoints.tooltip=OpenID Connect エンドポイントの設定を表示します。 +registrationAllowed=ユーザー登録 +registrationAllowed.tooltip=登録ページの有効/無効。ログインページに登録のリンクも表示されるようになります。 +registrationEmailAsUsername=Eメールをユーザー名とする +registrationEmailAsUsername.tooltip=有効の場合は、登録フォームにおいてユーザー名フィールドが非表示なり、Eメールが新規ユーザーのユーザー名として使われます。 +editUsernameAllowed=ユーザー名の編集 +editUsernameAllowed.tooltip=有効の場合はユーザー名フィールドが編集可能になり、そうでない場合は読み取り専用になります。 +resetPasswordAllowed=パスワード忘れ +resetPasswordAllowed.tooltip=クレデンシャルを忘れてしまった場合にクリックするリンクをログインページに表示します。 +rememberMe=ログイン状態の保存 +rememberMe.tooltip=セッションの有効期限が切れるまではブラウザーの再起動でもログイン状態を保存するチェックボックスをログインページに表示します。 +verifyEmail=Eメールの確認 +verifyEmail.tooltip=初回ログイン時にメールアドレスの確認をユーザーに要求します。 +sslRequired=SSL の要求 +sslRequired.option.all=全てのリクエスト +sslRequired.option.external=外部リクエスト +sslRequired.option.none=なし +sslRequired.tooltip=HTTPS は必須ですか? 「なし」 は HTTPS がどのクライアント IP アドレスにも要求されないことを意味します。 「外部リクエスト」 はローカルホストとプライベート IP アドレスは HTTPS なしでアクセスできることを意味します。 「すべてのリクエスト」 は HTTPS がすべての IP アドレスに要求されることを意味します。 +publicKey=公開鍵 +privateKey=秘密鍵 +gen-new-keys=新しい鍵を生成する +certificate=証明書 +host=ホスト +smtp-host=SMTP ホスト +port=ポート +smtp-port=SMTP ポート (デフォルトは25) +from=差出人 +sender-email-addr=送信者のメールアドレス +enable-ssl=SSL の有効 +enable-start-tls=StartTLS の有効 +enable-auth=認証の有効 +username=ユーザー名 +login-username=ログインユーザー名 +password=パスワード +login-password=ログインパスワード +login-theme=ログインテーマ +login-theme.tooltip=ログイン、TOTP、グラント、登録、パスワード忘れ画面のテーマを選択します。 +account-theme=アカウントテーマ +account-theme.tooltip=ユーザーアカウント管理画面のテーマを選択します。 +admin-console-theme=管理コンソールテーマ +select-theme-admin-console=管理コンソールのテーマを選択します。 +email-theme=Eメールテーマ +select-theme-email=サーバーから送信されるEメールのテーマを選択します。 +i18n-enabled=国際化の有効 +supported-locales=サポートされるロケール +supported-locales.placeholder=ロケールを入力し Enter キーを押してください +default-locale=デフォルトロケール +realm-cache-clear=レルムキャッシュ +realm-cache-clear.tooltip=レルムキャッシュからすべてのエントリをクリアする (すべてのレルムのエントリをクリアします) +user-cache-clear=ユーザーキャッシュ +user-cache-clear.tooltip=ユーザーキャッシュからすべてのエントリを削除します (すべてのレルムのエントリをクリアします) +revoke-refresh-token=リフレッシュトークンの取り消し +revoke-refresh-token.tooltip=有効の場合は、リフレッシュトークンは1回のみ使用可能になります。無効の場合は、リフレッシュトークンは使用されても取り消しされず、何度でも使用可能になります。 +sso-session-idle=SSO セッションアイドル +seconds=秒 +minutes=分 +hours=時 +days=日 +sso-session-max=SSO セッション最大 +sso-session-idle.tooltip=セッションの有効期限が切れるまでのアイドル時間です。セッションが有効期限切れの際はトークンとブラウザーセッションは無効化されます。 +sso-session-max.tooltip=セッションの有効期限が切れるまでの最大時間です。セッションが有効期限切れの際はトークンとブラウザーセッションは無効化されます。 +offline-session-idle=オフラインセッションアイドル +offline-session-idle.tooltip=セッションの有効期限が切れるまでのオフライン時間です。この期限内に少なくとも1回はオフライントークンを使用してリフレッシュしないと、オフラインセッションは有効期限切れとなります。 +access-token-lifespan=アクセストークン生存期間 +access-token-lifespan.tooltip=アクセストークンが有効期限切れとなる最大時間です。この値は SSO タイムアウトと比べて短くすることをお勧めします。 +access-token-lifespan-for-implicit-flow=Implicit Flow におけるアクセストークン生存期間 +access-token-lifespan-for-implicit-flow.tooltip=OpenID Connect Implicit Flow で発行されたアクセストークンが有効期限切れとなる最大時間です。この値は SSO タイムアウトより短くすることをお勧めします。 Implicit Flow ではトークンを更新することはありませんので、 「アクセストークン生存期間」 とは異なる別々のタイムアウト設定を設けています。 +client-login-timeout=クライアントのログインタイムアウト +client-login-timeout.tooltip=クライアントがアクセストークンプロトコルを完了するまでの最大時間です。これは通常は1分にすべきです。 +login-timeout=ログインタイムアウト +login-timeout.tooltip=ユーザーがログインを完了するまでの最大時間です。これは30分以上と比較的長くすることをお勧めします。 +login-action-timeout=ログインアクションタイムアウト +login-action-timeout.tooltip=ユーザーがパスワードの更新や TOTP の設定のようなログインに関係するアクションを完了するまでの最大時間です。これは5分以上と比較的長くすることをお勧めします。 +headers=ヘッダー +brute-force-detection=ブルートフォースの検出 +x-frame-options=X-Frame-Options +x-frame-options-tooltip=デフォルト値では別のオリジンの IFrame からの読み込みを防ぎます (詳細はラベルをクリックしてください) +content-sec-policy=Content-Security-Policy +content-sec-policy-tooltip=デフォルト値では別のオリジンの IFrame からの読み込みを防ぎます (詳細はラベルをクリックしてください) +content-type-options=X-Content-Type-Options +content-type-options-tooltip=デフォルト値では Internet Explorer と Google Chrome に対して、宣言された content-type を避けてレスポンスの MIME-sniffing を行うことを防ぎます (詳細はラベルをクリックしてください) +max-login-failures=最大ログイン失敗回数 +max-login-failures.tooltip=検出するまでの失敗回数です。 +wait-increment=連続失敗時の待機時間 +wait-increment.tooltip=失敗回数が閾値に達した場合、どれくらいの時間ユーザーはロックアウトされるか設定します。 +quick-login-check-millis=クイックログイン試行間のミリ秒数チェック +quick-login-check-millis.tooltip=クイックログイン失敗があまりにも頻繁に発生した場合は、ユーザーをロックアウトします。 +min-quick-login-wait=クイックログイン失敗時の最小待機時間 +min-quick-login-wait.tooltip=クイックログイン失敗後にどれくらいの時間待機するか設定します。 +max-wait=最大待機時間 +max-wait.tooltip=ユーザーがロックアウトされる最大待機時間を設定します。 +failure-reset-time=ログイン失敗回数のリセット時間 +failure-reset-time.tooltip=いつ失敗回数がリセットされるか設定します。 +realm-tab-login=ログイン +realm-tab-keys=鍵 +realm-tab-email=Eメール +realm-tab-themes=テーマ +realm-tab-cache=キャッシュ +realm-tab-tokens=トークン +realm-tab-client-registration=クライアント登録 +realm-tab-security-defenses=セキュリティ防御 +realm-tab-general=一般 +add-realm=レルムの追加 + +#Session settings +realm-sessions=レルムセッション +revocation=取り消し +logout-all=すべてログアウトする +active-sessions=有効なセッション +sessions=セッション +not-before=この日時より前 +not-before.tooltip=この日時より前に発行されたトークンを取り消します。 +set-to-now=現在日時を設定 +push=プッシュ +push.tooltip=管理URLを持つすべてのクライアントに対して、新しい取り消しポリシーを通知します。 + +#Protocol Mapper +usermodel.prop.label=プロパティ +usermodel.prop.tooltip=UserModel インタフェースのプロパティメソッドの名前です。例えば、 「email」 の値は UserModel.getEmail() メソッドを参照しています。 +usermodel.attr.label=ユーザー属性 +usermodel.attr.tooltip=格納されるユーザー属性名、UserMode.attribute マップ内の属性名です。 +userSession.modelNote.label=ユーザーセッションノート +userSession.modelNote.tooltip=UserSessionModel.note マップ内のユーザーセッションノート名です。 +multivalued.label=マルチバリュー +multivalued.tooltip=属性がマルチバリューをサポートしているかどうかを示します。サポートしている場合は、この属性のすべての値リストがクレームとして設定されます。サポートしていない場合は、最初の値だけがクレームとして設定されます。 +selectRole.label=ロールの選択 +selectRole.tooltip=左側にあるテキストボックスにロールを入力するか、ブラウズして必要なロールを選択するためにこのボタンをクリックしてください。 +tokenClaimName.label=トークンクレーム名 +tokenClaimName.tooltip=トークン内に挿入するクレームの名前を設定します。 「address.street」 のように完全修飾名で設定します。この場合、ネストされた JSON オブジェクトが作成されます。 +jsonType.label=クレーム JSON タイプ +jsonType.tooltip=トークンへの JSON クレーム の追加で使用される JSON タイプを設定します。 long、int、boolean、String が有効な値です。 +includeInIdToken.label=ID トークンに追加 +includeInIdToken.tooltip=クレームを ID トークンに追加すべきかどうかを設定します。 +includeInAccessToken.label=アクセストークンに追加 +includeInAccessToken.tooltip=クレームをアクセストークンに追加すべきかどうかを設定します。 +includeInUserInfo.label=UserInfo に追加 +includeInUserInfo.tooltip=クレームを UserInfo に追加すべきかどうかを設定します。 +usermodel.clientRoleMapping.clientId.label=クライアント ID +usermodel.clientRoleMapping.clientId.tooltip=ロールマッピング用のクライアント ID +usermodel.clientRoleMapping.rolePrefix.label=クライアントロールのプレフィックス +usermodel.clientRoleMapping.rolePrefix.tooltip=各クライアントロールのプレフィックスを設定します (オプション)。 +usermodel.realmRoleMapping.rolePrefix.label=レルムロールのプレフィックス +usermodel.realmRoleMapping.rolePrefix.tooltip=各レルムロールのプレフィックスを設定します (オプション)。 +sectorIdentifierUri.label=Sector Identifier URI +sectorIdentifierUri.tooltip=pairwise sub 値を使用し、かつ Dynamic Client Registration をサポートするプロバイダーは、sector_identifier_uri パラメータを使用すべきです (SHOULD)。これは、共通の管理下にある Web サイト群に対し、個々のドメイン名とは独立して parwise sub 値の一貫性を保持する方法を提供します。また、クライアントに対し、すべてのユーザーを再登録させることなしに redirect_uri を変更する方法も提供します。 +pairwiseSubAlgorithmSalt.label=ソルト +pairwiseSubAlgorithmSalt.tooltip=pairwise subject identifier を計算する際に使用するソルトを設定します。空白のままにするとソルトは生成されます。 + + + +# client details +clients.tooltip=クライアントとはレルム内の信頼されたブラウザーアプリケーションや Web サービスです。これらのクライアントはログインを要求することができます。また、クライアント固有のロールを定義することができます。 +search.placeholder=検索... +create=作成 +import=インポート +client-id=クライアント ID +base-url=ベース URL +actions=アクション +not-defined=未定義 +edit=編集 +delete=削除 +no-results=結果がありません +no-clients-available=使用可能なクライアントはありません +add-client=クライアントの追加 +select-file=ファイルを選択 +view-details=詳細を参照 +clear-import=インポートをクリア +client-id.tooltip=URI とトークンで参照される ID を指定します。例えば 「my-client」 です。 SAML においては 期待される AuthnRequest の Issuer の値になります。 +client.name.tooltip=クライアントの表示名を指定します。例えば、 「My Client」 です。ローカライズ用のキーもサポートしています。例\: ${my_client} +client.enabled.tooltip=無効なクライアントはログインを開始したり、アクセストークンを取得したりすることはできません。 +consent-required=同意が必要 +consent-required.tooltip=有効の場合は、ユーザーはクライアントアクセスに同意する必要があります。 +client-protocol=クライアントプロトコル +client-protocol.tooltip=「OpenID Connect」 は、認可サーバーによって実行される認証を元にして、エンドユーザーのアイデンティティを確認するクライアントです。 「SAML」 は、クロスドメインのシングルサインオン (SSO) を含むWeb ベースの認証と認可シナリオを可能にし、情報を渡すためにアサーションを含むセキュリティトークンを使用します。 +access-type=アクセスタイプ +access-type.tooltip=「Confidential」 クライアントはログインプロトコルの開始するためにシークレットを必要とします。 「Public」 クライアントはシークレットを必要としません。 「Bearer-only」 クライアントはログインを開始することはない Web サービスです。 +standard-flow-enabled=Standard Flow の有効 +standard-flow-enabled.tooltip=OpenID Connect の標準的な、認可コードによるリダイレクトベースの認証を有効にします。 OpenID Connect または OAuth2 の仕様における 「Authorization Code Flow」 のサポートを有効にします。 +implicit-flow-enabled=Implicit Flow の有効 +implicit-flow-enabled.tooltip=OpenID Connect の認可コードなしのリダイレクトベース認証のサポートを有効にします。OpenID Connect または OAuth2 の仕様における 「Implicit Flow」 のサポートを有効にします。 +direct-access-grants-enabled=ダイレクトアクセスグラントの有効 +direct-access-grants-enabled.tooltip=ダイレクトアクセスグラントのサポートを有効にします。これは、アクセストークンの取得のために Keycloak サーバーとユーザーのユーザー名/パスワードで直接アクセスを行います。OAuth2 の仕様における 「リソースオーナーパスワードクレデンシャルグラント」 のサポートを有効にします。 +service-accounts-enabled=サービスアカウントの有効 +service-accounts-enabled.tooltip=Keycloak にこのクライアントを認証し、このクライアント専用のアクセストークンの取得ができるようになります。OAuth2 の仕様における 「クライアントクレデンシャルグラント」 のサポートを有効にします。 +include-authnstatement=AuthnStatement を含める +include-authnstatement.tooltip=認証方式とタイムスタンプを含めたステートメントをログインレスポンスに含めるべきか設定します。 +sign-documents=ドキュメントを署名する +sign-documents.tooltip=SAML ドキュメントをレルムで署名すべきか設定します。 +sign-documents-redirect-enable-key-info-ext=REDIRECT 署名鍵検索の最適化 +sign-documents-redirect-enable-key-info-ext.tooltip=Keycloak アダプターによって保護された SP の REDIRECT Binding で SAML ドキュメントに署名する際、署名キーの ID を 要素の SAML プロトコルメッセージに含める必要がありますか? これにより、検証のために既知のすべてのキーを試行する代わりに単一のキーを使用するため、署名の検証が最適化されます。 +sign-assertions=アサーションを署名する +sign-assertions.tooltip=SAML ドキュメント内のアサーションを署名すべきか設定します。もしドキュメントが既に署名済みの場合は、この設定は不要です。 +signature-algorithm=署名アルゴリズム +signature-algorithm.tooltip=ドキュメントの署名に使用する署名アルゴリズムです。 +canonicalization-method=正規化方式 +canonicalization-method.tooltip=XML署名の正規化方式 (Canonicalization Method) を設定します。 +encrypt-assertions=アサーションを暗号化する +encrypt-assertions.tooltip=SAML アサーションをクライアントの公開鍵で AES を使い暗号化すべきか設定します。 +client-signature-required=クライアント署名が必須 +client-signature-required.tooltip=クライアントは SAML リクエストとレスポンスを署名しますか? それらを検証すべきか設定します。 +force-post-binding=POST Binding を強制 +force-post-binding.tooltip=レスポンスに常に POST Binding を使用します。 +front-channel-logout=フロントチャンネルログアウト +front-channel-logout.tooltip=有効の場合は、ログアウトはクライアントへのブラウザーリダイレクトが必要になります。無効の場合は、サーバーはログアウトのバックグラウンド呼び出しを行います。 +force-name-id-format=Name ID フォーマットを強制 +force-name-id-format.tooltip=要求された NameID サブジェクトフォーマットを無視し、管理コンソールで設定された物を使用します。 +name-id-format=Name ID フォーマット +name-id-format.tooltip=サブジェクトに使用する Name ID フォーマットを設定します。 +root-url=ルート URL +root-url.tooltip=相対 URL に追加するルート URL を設定します。 +valid-redirect-uris=有効なリダイレクト URI +valid-redirect-uris.tooltip=ログインまたはログインの成功後にブラウザーがリダイレクト可能とする、有効な URI パターンを設定します。単純なワイルドカード、つまり 「http://example.com/*」 が使用可能です。相対パス、つまり 「/my/relative/path/*」 も指定可能です。相対パスはクライアントのルート URL を基準とします。または、未指定の場合は認証サーバーのルート URL が使用されます。SAML では、ログインリクエストに埋め込まれたコンシューマサービスの URL に依存している場合は、有効な URI パターンを設定する必要があります。 +base-url.tooltip=認証サーバーがクライアントへのリダイレクトまたは戻るリンクを必要とする際に使用するデフォルト URL を設定します。 +admin-url=管理 URL +admin-url.tooltip=クライアントの管理インタフェースの URL を設定します。クライアントがアダプターの REST API をサポートしている場合に設定してください。この REST API により、認証サーバーは取り消しポリシーや他の管理タスクをプッシュすることができます。通常、クライアントのベース URL を設定します。 +master-saml-processing-url=SAML を処理するマスター URL +master-saml-processing-url.tooltip=設定された場合は、この URL が SP のアサーションコンシューマおよびシングルログアウトサービスの両方の Binding に使われます。これは、SAML エンドポイントの詳細設定にある各 Binding やサービスの設定にて個別に上書きすることができます。 +idp-sso-url-ref=IDP Initiated SSO の URL Name +idp-sso-url-ref.tooltip=IDP Initiated SSO を行う際にクライアントを参照するための URL フラグメント名を設定します。空にすると IDP Initiated SSO は無効になります。ブラウザーから参照する URL は 「{server-root}/realms/{realm}/protocol/saml/clients/{client-url-name}」 になります。 +idp-sso-relay-state=IDP Initiated SSO の RelayState +idp-sso-relay-state.tooltip=IDP Initiated SSO を行う際の SAML リクエストで送信したい RelayState を設定します。 +web-origins=Web オリジン +web-origins.tooltip=許可される CORS オリジンを設定します。有効なリダイレクト URI のすべてのオリジンを許可するには 「+」 を追加してください。すべてのオリジンを許可するには 「*」 を追加してください。 +fine-oidc-endpoint-conf=OpenID Connect の詳細設定 +fine-oidc-endpoint-conf.tooltip=このセクションを展開して、OpenID Connect プロトコルに関連するこのクライアントの高度な設定を行います。 +user-info-signed-response-alg=署名付き User Info レスポンスのアルゴリズム +user-info-signed-response-alg.tooltip=署名付き User Info エンドポイントのレスポンスに使用する JWA アルゴリズムを設定します。「unsigned」 に設定した場合は、User Info レスポンスは署名されず、application/json 形式で返されます。 +request-object-signature-alg=リクエストオブジェクトの署名アルゴリズム +request-object-signature-alg.tooltip=クライアントが 「request」 または 「request_uri」 パラメータで指定された OIDC リクエストオブジェクトを送信する際に使用する必要がある、JWA アルゴリズムを設定します。「any」 に設定した場合は、リクエストオブジェクトは任意のアルゴリズム (「none」 を含む) で署名されます。 +fine-saml-endpoint-conf=SAML エンドポイントの詳細設定 +fine-saml-endpoint-conf.tooltip=アサーションコンシューマおよびシングルログアウトサービスの正確な URL を設定するにはこのセクションを開きます。 +assertion-consumer-post-binding-url=アサーションコンシューマサービスの POST Binding URL +assertion-consumer-post-binding-url.tooltip=アサーションコンシューマサービス (ログインレスポンス) の SAML POST Binding URL を設定します。この Binding のための URL がない場合は空でよいです。 +assertion-consumer-redirect-binding-url=アサーションコンシューマサービスの Redirect Binding URL +assertion-consumer-redirect-binding-url.tooltip=アサーションコンシューマサービス (ログインレスポンス) の SAML Redirect Binding URL を設定します。この Binding のための URL がない場合は空でよいです。 +logout-service-post-binding-url=ログアウトサービスの POST Binding URL +logout-service-post-binding-url.tooltip=シングルログアウトサービスの SAML POST Binding URLを設定します。異なる Binding を使用している場合は空でよいです。 +logout-service-redir-binding-url=ログアウトサービスの Redirect Binding URL +logout-service-redir-binding-url.tooltip=シングルログアウトサービスの SAML Redirect Binding URLを設定します。異なる Binding を使用している場合は空でよいです。 + +# client import +import-client=クライアントのインポート +format-option=フォーマットオプション +select-format=フォーマットを選択 +import-file=ファイルをインポート + +# client tabs +settings=設定 +credentials=クレデンシャル +saml-keys=SAML 鍵 +roles=ロール +mappers=マッパー +mappers.tooltip=プロトコルマッパーはトークンやドキュメントの変換を行います。ユーザーデータをプロトコルのクレームにマッピングしたり、クライアントと認証サーバー間の任意のリクエストを単に変換したりすることができます。 +scope=スコープ +scope.tooltip=スコープマッピングはクライアントに要求されたアクセストークン内に含まれるユーザーのロールマッピングを制限することができます。 +sessions.tooltip=このクライアントの有効なセッションを参照します。どのユーザーがアクティブでいつログインしたかを見ることができます。 +offline-access=オフラインアクセス +offline-access.tooltip=このクライアントのオフラインセッションを参照します。オフライントークンをどのユーザーがいつ取得したかを見ることができます。このクライアントのすべてのトークンを取り消すには、取り消しタブを開き、 「この日時より前」 に現在日時を設定してください。 +clustering=クラスタリング +installation=インストール +installation.tooltip=様々なクライアントアダプターの設定フォーマットを生成するヘルパーユーティリティです。生成したものをダウンロードまたはカットアンドペーストしてクライアントに設定することができます。 +service-account-roles=サービスアカウントロール +service-account-roles.tooltip=このクライアント専用のサービスアカウントのロールマッピングを認証できるようにします。 + +# client credentials +client-authenticator=クライアント認証 +client-authenticator.tooltip=Keycloak サーバーに対してこのクライアントの認証に使用するクライアント認証方式を設定します。 +certificate.tooltip=クライアントで発行され、キーストアの秘密鍵で署名された JWT を検証するためのクライアント証明書です。 +publicKey.tooltip=クライアントで発行され、秘密鍵で署名された JWT を検証するための公開鍵です。 +no-client-certificate-configured=クライアント証明書が設定されていません +gen-new-keys-and-cert=新しい鍵と証明書を生成 +import-certificate=証明書をインポート +gen-client-private-key=クライアントの秘密鍵の生成 +generate-private-key=秘密鍵の生成 +kid=Kid +kid.tooltip=インポートされた JWKS のクライアントの公開鍵の KID (Key ID) を設定します。 +use-jwks-url=JWKS URL の使用 +use-jwks-url.tooltip=有効とした場合は、クライアントの公開鍵が指定の JWKS URL からダウンロードされます。 これにより、クライアントが新しい鍵ペアを生成した際に、新しい鍵が常に再ダウンロードされるため、柔軟性が向上します。無効とした場合は、Keycloak DB の公開鍵 (または証明書) が使用されるため、クライアントの鍵ペアが変更された際には、常に新しい鍵 (または証明書) を Keycloak DB にもインポートする必要があります。 +jwks-url=JWKS URL +jwks-url.tooltip=JWK 形式のクライアント鍵が格納されている URL を設定します。詳細は JWK の仕様を参照してください。「jwt」 クレデンシャルを持つ keycloak クライアントアダプターを使用している場合は、アプリケーションに「/k_jwks」という接尾辞を付けた URL を使用することができます。例えば、「http://www.myhost.com/myapp/k_jwks」 です。 +archive-format=アーカイブ形式 +archive-format.tooltip=Java キーストアまたは PKCS12 アーカイブ形式 +key-alias=キーエイリアス +key-alias.tooltip=秘密鍵と証明書のアーカイブエイリアスです。 +key-password=鍵のパスワード +key-password.tooltip=アーカイブ内の秘密鍵にアクセスするためのパスワード +store-password=ストアのパスワード +store-password.tooltip=アーカイブ自身にアクセスするためのパスワード +generate-and-download=生成 & ダウンロード +client-certificate-import=クライアント証明書のインポート +import-client-certificate=クライアント証明書のインポート +jwt-import.key-alias.tooltip=証明書のアーカイブエイリアスです。 +secret=シークレット +regenerate-secret=シークレットの再生成 +registrationAccessToken=登録用アクセストークン +registrationAccessToken.regenerate=登録用アクセストークンの再生成 +registrationAccessToken.tooltip=登録用アクセストークンにより、クライアントはクライアント登録サービスにアクセスできます。 +add-role=ロールの追加 +role-name=ロール名 +composite=複合 +description=説明 +no-client-roles-available=使用可能なクライアントロールはありません。 +scope-param-required=スコープパラメータが必要 +scope-param-required.tooltip=認可/トークンリクエストの間にロール名のスコープパラメータが使用された場合のみ与えられます。 +composite-roles=複合ロール +composite-roles.tooltip=このロールがユーザーにアサイン(アサイン解除)された際に、関連するロールが暗黙的にアサイン(アサイン解除)されます。 +realm-roles=レルムロール +available-roles=使用可能なロール +add-selected=選択したものを追加 +associated-roles=関連ロール +composite.associated-realm-roles.tooltip=この複合ロールに関連付けされているレルムレベルのロールです。 +composite.available-realm-roles.tooltip=この複合ロールに関連付け可能なレルムレベルのロールです。 +remove-selected=選択されたものを削除 +client-roles=クライアントロール +select-client-to-view-roles=ロールを参照するにはクライアントを選択してください +available-roles.tooltip=この複合ロール関連付け可能なこのクライアントのロールです。 +client.associated-roles.tooltip=この複合ロールに関連付けされているクライアントロールです。 +add-builtin=ビルトインを追加 +category=カテゴリ +type=タイプ +no-mappers-available=使用可能なマッパーはありません +add-builtin-protocol-mappers=ビルトインプロトコルマッパーを追加 +add-builtin-protocol-mapper=ビルトインプロトコルマッパーを追加 +scope-mappings=スコープマッピング +full-scope-allowed=フルスコープを許可 +full-scope-allowed.tooltip=全ての制限の無効を許可します。 +scope.available-roles.tooltip=スコープにアサイン可能なレルムレベルのロールです。 +assigned-roles=アサイン済みロール +assigned-roles.tooltip=スコープにアサイン済みのレルムレベルのロールです。 +effective-roles=有効なロール +realm.effective-roles.tooltip=複合ロールの継承も含めたアサイン済みのレルムレベルのロールです。 +select-client-roles.tooltip=ロールを参照するにはクライアントを選択してください +assign.available-roles.tooltip=アサイン可能なクライアントロールです。 +client.assigned-roles.tooltip=アサイン済みクライアントロールです。 +client.effective-roles.tooltip=複合ロールより引き継いでいるロールも含めたアサイン済みのクライアントロールです。 +basic-configuration=基本設定 +node-reregistration-timeout=ノード再登録のタイムアウト +node-reregistration-timeout.tooltip=登録されたクライアントをクラスターノードへ再登録する際の最大時間間隔を設定します。クラスターノードがこの時間内に Keycloak に再登録リクエストを送信しない場合は、Keycloak から登録解除されます。 +registered-cluster-nodes=登録済みクラスターノード +register-node-manually=ノードを手動で登録 +test-cluster-availability=クラスターの可用性をテスト +last-registration=最終登録 +node-host=ノードホスト +no-registered-cluster-nodes=使用可能な登録済みクラスターノードがありません +cluster-nodes=クラスターノード +add-node=ノードを追加 +active-sessions.tooltip=このクライントの有効なユーザーセッションの合計数です。 +show-sessions=セッションを表示 +show-sessions.tooltip=有効なセッション数に応じて高負荷なオペレーションになる恐れがありますので注意してください。 +user=ユーザー +from-ip=From IP +session-start=セッション開始 +first-page=最初のページ +previous-page=前のページ +next-page=次のページ +client-revoke.not-before.tooltip=この日時より前に発行されたこのクライアント用のトークンを取り消します。 +client-revoke.push.tooltip=管理 URL がこのクライアントに設定されている場合は、クライアントにポリシーをプッシュします。 +select-a-format=フォーマットを選択 +download=ダウンロード +offline-tokens=オフライントークン +offline-tokens.tooltip=このクライアントのオフライントークンの合計数です。 +show-offline-tokens=オフライントークンを表示 +show-offline-tokens.tooltip=オフライントークン数に応じて高負荷なオペレーションになる恐れがありますので注意してください。 +token-issued=発行済みトークン +last-access=最終アクセス +last-refresh=最終リフレッシュ +key-export=鍵をエクスポート +key-import=鍵をインポート +export-saml-key=SAML 鍵をエクスポート +import-saml-key=SAML 鍵をインポート +realm-certificate-alias=レルム証明書エイリアス +realm-certificate-alias.tooltip=レルム証明書もアーカイブに格納されます。これはそのエイリアスとなります。 +signing-key=署名鍵 +saml-signing-key=SAML 署名鍵です。 +private-key=秘密鍵 +generate-new-keys=新しい鍵を生成 +export=エクスポート +encryption-key=暗号化鍵 +saml-encryption-key.tooltip=SAML 暗号化鍵です。 +service-accounts=サービスアカウント +service-account.available-roles.tooltip=サービスアカウントにアサイン可能なレルムレベルのロールです。 +service-account.assigned-roles.tooltip=サービスアカウントにアサイン済みのレルムレベルのロールです。 +service-account-is-not-enabled-for={{client}} のサービスアカウントは有効ではありません +create-protocol-mappers=プロトコルマッパーを作成 +create-protocol-mapper=プロトコルマッパーを作成 +protocol=プロトコル +protocol.tooltip=プロトコルです。 +id=ID +mapper.name.tooltip=マッパーの名前です。 +mapper.consent-required.tooltip=一時的なアクセスを許可する際に、クライアントへの提供データにユーザーの同意を必要とするか設定します。 +consent-text=同意のテキスト +consent-text.tooltip=同意ページに表示するテキストです。 +mapper-type=マッパータイプ +mapper-type.tooltip=マッパーのタイプです。 +# realm identity providers +identity-providers=アイデンティティ プロバイダー +table-of-identity-providers=アイデンティティ プロバイダーの一覧表 +add-provider.placeholder=プロバイダーを追加... +provider=プロバイダー +gui-order=GUI 順序 +first-broker-login-flow=初回ログインフロー +post-broker-login-flow=ログイン後のフロー +redirect-uri=リダイレクト URI +redirect-uri.tooltip=アイデンティティ プロバイダーの設定で使用するリダイレクト URIです。 +alias=エイリアス +display-name=表示名 +identity-provider.alias.tooltip=エイリアスは一意にアイデンティティ プロバイダーを識別するもので、リダイレクト URI の構築にも使用されます。 +identity-provider.display-name.tooltip=アイデンティティ プロバイダーの分かりやすい名前を設定します。 +identity-provider.enabled.tooltip=このアイデンティティ プロバイダーの有効/無効を設定します。 +authenticate-by-default=デフォルトで認証 +identity-provider.authenticate-by-default.tooltip=ログイン画面の表示前に、このプロバイダーでデフォルトで認証試行すべきかどうかを示しています。 +store-tokens=トークンの格納 +identity-provider.store-tokens.tooltip=ユーザー認証後のトークン格納の有効/無効を設定します。 +stored-tokens-readable=読み取り可能なトークンを格納 +identity-provider.stored-tokens-readable.tooltip=新しいユーザーが格納されたトークンを読み取り可能かどうかの有効/無効設定です。broker.read-token ロールをアサインします。 +disableUserInfo=User Info の無効 +identity-provider.disableUserInfo.tooltip=追加のユーザー情報を取得する User Info サービスの使用を無効にしますか? デフォルトではこの OIDC サービスを使用します。 +userIp=userIp パラメータの使用 +identity-provider.google-userIp.tooltip=Googleの User Info サービスの呼び出し時に「userIp」クエリパラメータを設定します。これはユーザーの IP アドレスを使用します。Google が User Info サービスへのアクセスを制限している場合に役立ちます。 +update-profile-on-first-login=初回ログイン時にプロフィールを更新 +on=オン +on-missing-info=情報不足の場合 +off=オフ +update-profile-on-first-login.tooltip=初回ログイン時にどのユーザーがプロフィールの更新を必要とするか条件を定義します。 +trust-email=Eメールを信頼 +trust-email.tooltip=有効とした場合は、このレルムでEメールの確認が有効となっている場合でも、このプロバイダーが提供するEメールは確認されなくなります。 +gui-order.tooltip=GUI (例. ログインページ上) でのプロバイダーの表示順序を決める番号を設定します。 +first-broker-login-flow.tooltip=このアイデンティティ プロバイダーでの初回ログイン後に起動させる認証フローのエイリアスです。 「初回ログイン」 という用語は、認証したアイデンティティ プロバイダーアカウントに関連付けられた Keycloak アカウントがまだ存在しない状態であることを意味します。 +post-broker-login-flow.tooltip=このアイデンティティ プロバイダーでの各ログイン後に起動させる認証フローのエイリアスです。このアイデンティティ プロバイダーで認証された各ユーザーの追加の確認 (例えば OTP) を行いたい場合に便利です。このアイデンティティ プロバイダーによるログイン後に追加の Authenticator の起動を行いたくない場合は、空のままとしてください。また、Authenticator の実装では、ClientSession にはアイデンティティ プロバイダーによりユーザーが既に設定されていることに注意してください。 +openid-connect-config=OpenID Connect の設定 +openid-connect-config.tooltip=OIDC SP と 外部 IDP の設定です。 +authorization-url=認可 URL +authorization-url.tooltip=認可 URL を設定します。 +token-url=トークン URL +token-url.tooltip=トークン URL を設定します。 +logout-url=ログアウト URL +identity-provider.logout-url.tooltip=外部 IDP からユーザーのログアウトに使用するセッション終了エンドポイントを設定します。 +backchannel-logout=バックチャンネルログアウト +backchannel-logout.tooltip=外部 IDP がバックチャンネルログアウトをサポートするどうかを設定します。 +user-info-url=UserInfo URL +user-info-url.tooltip=UserInfo の URL を設定します。これはオプションです。 +identity-provider.client-id.tooltip=アイデンティティ プロバイダーで登録されているクライアントまたはクライアント識別子を設定します。 +client-secret=クライアントシークレット +show-secret=シークレットを表示する +hide-secret=シークレットを隠す +client-secret.tooltip=アイデンティティ プロバイダーで登録されているクライアントまたはクライアントシークレットを設定します。 +issuer=発行者 (Issuer) +issuer.tooltip=レスポンス内の発行者の識別子 (Issuer Identifier) を設定します。未設定の場合は、検証は実行されません。 +default-scopes=デフォルトスコープ +identity-provider.default-scopes.tooltip=認可要求の際に送信されるスコープです。スペース区切りでスコープのリストを設定します。デフォルトは 「openid」 です。 +prompt=プロンプト (prompt) +unspecified.option=未定義 +none.option=none +consent.option=consent +login.option=login +select-account.option=select_account +prompt.tooltip=認証サーバーは再認証や同意をエンドユーザーに促すかどうかを指定します。 +validate-signatures=署名検証 +identity-provider.validate-signatures.tooltip=外部 IDP の署名検証の有効/無効を設定します。 +identity-provider.use-jwks-url.tooltip=有効とした場合は、アイデンティティ プロバイダーの公開鍵が指定された JWKS URL からダウンロードされます。アイデンティティ プロバイダーが新しい鍵ペアを生成する際に、新しい鍵が常に再ダウンロードされるため、柔軟性が大幅に向上します。無効とした場合は、Keycloak DB の公開鍵 (または証明書) が使用されるため、アイデンティティ プロバイダーの鍵ペアが変更された際には、常に Keycloak DB に新しい鍵をインポートする必要があります。 +identity-provider.jwks-url.tooltip=JWK 形式のアイデンティティ プロバイダーの鍵が格納されている URL を設定します。詳細は JWK の仕様を参照してください。外部の Keycloak アイデンティティ プロバイダーを使用する場合は、ブローカーの Keycloak が 「http://broker-keycloak:8180」 で実行されておりレルムが 「test」 と仮定すると、「http://broker-keycloak:8180/auth/realms/test/protocol/openid-connect/certs」 のような URL を使用することができます。 +validating-public-key=検証用の公開鍵 +identity-provider.validating-public-key.tooltip=外部 IDP の署名検証に使用する PEM 形式の公開鍵を設定します。 +import-external-idp-config=外部 IDP 設定のインポート +import-external-idp-config.tooltip=外部 IDP メタデータを設定ファイルよりロード、または URL よりダウンロードして設定します。 +import-from-url=URL よりインポート +identity-provider.import-from-url.tooltip=リモート IDP ディスカバリディスクリプタよりメタデータをインポートします。 +import-from-file=ファイルよりインポート +identity-provider.import-from-file.tooltip=ダウンロードした IDP ディスカバリディスクリプタよりメタデータをインポートします。 +saml-config=SAML 設定 +identity-provider.saml-config.tooltip=SAML SP と 外部 IDP の設定です。 +single-signon-service-url=シングルサインオンサービスの URL +saml.single-signon-service-url.tooltip=認証リクエスト (SAML AuthnRequest) の送信に使用する URL を設定します。 +single-logout-service-url=シングルログアウトサービスの URL +saml.single-logout-service-url.tooltip=ログアウトリクエストの送信に使用する URL を設定します。 +nameid-policy-format=Name ID ポリシーフォーマット +nameid-policy-format.tooltip=Name ID フォーマットに対応する URI リファレンスを指定します。デフォルトは urn:oasis:names:tc:SAML:2.0:nameid-format:persistent になります。 +http-post-binding-response=HTTP-POST Binding レスポンス +http-post-binding-response.tooltip=HTTP-POST Binding を使用してリクエストに応答するかどうかを設定します。オフの場合は、HTTP-REDIRECT Binding が使用されます。 +http-post-binding-for-authn-request=AuthnRequest の HTTP-POST Binding +http-post-binding-for-authn-request.tooltip=HTTP-POST Binding を使用して AuthnRequest を送信するかどうかを設定します。オフの場合は、HTTP-REDIRECT Binding が使用されます。 +want-authn-requests-signed=AuthnRequest の署名が必要 +want-authn-requests-signed.tooltip=アイデンティティ プロバイダーが署名された AuthnRequest を必要とするかどうかを設定します。 +force-authentication=認証を強制 +identity-provider.force-authentication.tooltip=アイデンティティ プロバイダーが以前のセキュリティコンテキストに頼るのではなく、プレゼンターを直接認証すべきかどうかを設定します。 +validate-signature=署名検証 +saml.validate-signature.tooltip=SAML レスポンスの署名検証の有効/無効を設定します。 +validating-x509-certificate=検証用の X509 証明書 +validating-x509-certificate.tooltip=署名の確認に使用する PEM 形式の証明書を設定します。 +saml.import-from-url.tooltip=リモート IDP の SAML エンティティディスクリプタからメタデータをインポートします。 +social.client-id.tooltip=アイデンティティ プロバイダーで登録されているクライアント識別子を設定します。 +social.client-secret.tooltip=アイデンティティ プロバイダーで登録されているクライアントシークレットを設定します。 +social.default-scopes.tooltip=認可要求の際に送信されるスコープを設定します。設定可能な値、区切り文字、デフォルト値はドキュメントを参照してください。 +key=Key +stackoverflow.key.tooltip=Stack Overflow のクライアント登録で取得した Key を設定します。 + +# User federation +sync-ldap-roles-to-keycloak=LDAP ロールを Keycloak に同期 +sync-keycloak-roles-to-ldap=Keycloak ロールを LDAP に同期 +sync-ldap-groups-to-keycloak=LDAP グループを Keycloak に同期 +sync-keycloak-groups-to-ldap=Keycloak グループを LDAP に同期 + +realms=レルム +realm=レルム + +identity-provider-mappers=アイデンティティ プロバイダー マッパー +create-identity-provider-mapper=アイデンティティ プロバイダー マッパーを作成 +add-identity-provider-mapper=アイデンティティ プロバイダー マッパーを追加 +client.description.tooltip=クライアントの説明を指定します。例えば 「タイムシート用のクライアント」 です。ローカライズ用のキーもサポートしています。例\: ${my_client_description} + +expires=有効期限 +expiration=有効期限 +expiration.tooltip=トークンの有効期間を指定します。 +count=カウント +count.tooltip=このトークンを利用してクライアントをいくつ作成可能か指定します。 +remainingCount=残りのカウント +created=作成日時 +back=戻る +initial-access-tokens=初期アクセストークン +add-initial-access-tokens=初期アクセストークンを追加 +initial-access-token=初期アクセストークン +initial-access.copyPaste.tooltip=後からは取得することはできませんので、このページから離れる前に初期アクセストークンをコピー/ペーストしてください。 +continue=続ける +initial-access-token.confirm.title=初期アクセストークンのコピー +initial-access-token.confirm.text=後からは取得することはできませんので、初期アクセストークンのコピー & ペーストを行ってください +no-initial-access-available=使用可能な初期アクセストークンはありません + +client-reg-policies=クライアント登録ポリシー +client-reg-policy.name.tooltip=ポリシーの表示名を設定します。 +anonymous-policies=Anonymous アクセスのポリシー +anonymous-policies.tooltip=これらのポリシーはクライアント登録サービスが未認証リクエストによって呼び出された際に使用されます。これは、リクエストには初期アクセストークンも Bearer トークンも含まれないことを意味します。 +auth-policies=認証済みアクセスのポリシー +auth-policies.tooltip=これらのポリシーは認証されたリクエストによってクライアント登録サービスが呼び出された際に使用されます。これは、リクエストに初期アクセストークンまたは Bearer トークンが含まれていることを意味します。 +policy-name=ポリシー名 +no-client-reg-policies-configured=クライアント登録ポリシーはありません。 +trusted-hosts.label=信頼されたホスト +trusted-hosts.tooltip=信頼され、クライアント登録サービスを呼び出すことが許可されている、および/またはクライアント URI の値として使用されているホストのリストを設定します。ホスト名または IP アドレスを使用して設定します。スター (例えば 「* .example.com」) を使用すると、example.com のドメイン全体が信頼されます。 +host-sending-registration-request-must-match.label=クライアント登録リクエストを送信するホストの一致が必須 +host-sending-registration-request-must-match.tooltip=有効とした場合は、信頼されたホストまたはドメインから送信されたクライアント登録サービスへのリクエストは許可されます。 +client-uris-must-match.label=クライアント URI の一致が必須 +client-uris-must-match.tooltip=有効とした場合は、すべてのクライアント URI (リダイレクト URI など) は、信頼されたホストまたはドメインと一致する場合にのみ許可されます。 +allowed-protocol-mappers.label=許可されたプロトコルマッパー +allowed-protocol-mappers.tooltip=許可されたプロトコルマッパープロバイダーのホワイトリストを設定します。ホワイトリストに登録されていないプロトコルマッパーを含むクライアントを登録しようとすると、登録リクエストは拒否されます。 +consent-required-for-all-mappers.label=マッパーの同意が必要 +consent-required-for-all-mappers.tooltip=有効とした場合は、新たに登録されたすべてのプロトコルマッパーは自動的に 「同意が必要」 が有効となります。これは、ユーザーが同意画面で承認する必要があることを意味します。注記: 同意画面は、クライアントが 「同意が必要」 を有効にしている場合にのみ表示されます。そのため、通常は同意が必要なポリシーとともに使用します。 +allowed-client-templates.label=許可されたクライアントテンプレート +allowed-client-templates.tooltip=新規に登録されたクライアントで使用できるクライアントテンプレートのホワイトリストを設定します。ホワイトリストに登録されていないクライアントテンプレートをクライアントに登録しようとすると拒否されます。デフォルトではホワイトリストは空白のため、クライアントテンプレートは許可されていません。 +max-clients.label=レルムあたりの最大クライアント数 +max-clients.tooltip=レルム内の既存のクライアントの数が設定された制限と同じかそれ以上の場合は、新しいクライアントを登録することはできません。 + +client-templates=クライアントテンプレート +client-templates.tooltip=クライアントテンプレートでは、複数のクライアントで共有する共通設定を定義することができます。 + +groups=グループ + +group.add-selected.tooltip=グループにアサイン可能なレルムロールです。 +group.assigned-roles.tooltip=グループにマッピングされたレルムロールです。 +group.effective-roles.tooltip=マッピングされているすべてのレルムロールです。複合ロールより引き継いでいるロールも含みます。 +group.available-roles.tooltip=このクライアントよりアサイン可能なロールです。 +group.assigned-roles-client.tooltip=マッピングされたこのクライアントのロールです。 +group.effective-roles-client.tooltip=マッピングされたこのクライアントのロールです。複合ロールより引き継いでいるロールも含みます。 + +default-roles=デフォルトロール +no-realm-roles-available=使用可能なレルムロールはありません + +users=ユーザー +user.add-selected.tooltip=ユーザーにアサイン可能なレルムロールです。 +user.assigned-roles.tooltip=ユーザーにマッピングされたレルムロールです。 +user.effective-roles.tooltip=マッピングされているすべてのレルムロールです。複合ロールより引き継いでいるロールも含みます。 +user.available-roles.tooltip=このクライアントよりアサイン可能なロールです。 +user.assigned-roles-client.tooltip=マッピングされたこのクライアントのロールです。 +user.effective-roles-client.tooltip=マッピングされたこのクライアントのロールです。複合ロールより引き継いでいるロールも含みます。 +default.available-roles.tooltip=アサイン可能なレルムレベルのロールです。 +realm-default-roles=レルムのデフォルトロール +realm-default-roles.tooltip=ユーザーにアサインされたレルムレベルのロールです。 +default.available-roles-client.tooltip=デフォルトでアサイン可能なこのクライアントのロールです。 +client-default-roles=クライアントのデフォルトロール +client-default-roles.tooltip=デフォルトロールとしてアサインされたこのクライアントのロールです。 +composite.available-roles.tooltip=この複合ロールに関連付け可能なレルムレベルのロールです。 +composite.associated-roles.tooltip=この複合ロールに関連付けされているレルムレベルのロールです。 +composite.available-roles-client.tooltip=この複合ロールに関連付け可能なこのクライアントのロールです。 +composite.associated-roles-client.tooltip=この複合ロールに関連付けされているクライアントロールです。 +partial-import=部分インポート +partial-import.tooltip=部分インポートでは、以前にエクスポートした JSON ファイルよりユーザー、クライアント、およびその他のリソースをインポートすることができます。 + +file=ファイル +exported-json-file=エクスポートされた JSON ファイル +import-from-realm=レルムからインポート +import-users=ユーザーをインポート +import-groups=グループをインポート +import-clients=クライアントをインポート +import-identity-providers=アイデンティティ プロバイダーをインポート +import-realm-roles=レルムロールをインポート +import-client-roles=クライアントロールをインポート +if-resource-exists=リソースが存在する場合 +fail=失敗 +skip=スキップ +overwrite=上書き +if-resource-exists.tooltip=既に存在するリソースをインポートしようとした場合にどうすべきかを指定します。 + +action=アクション +role-selector=ロールの選択 +realm-roles.tooltip=選択可能なレルムロールです。 + +select-a-role=ロールを選択してください +select-realm-role=レルムロールを選択 +client-roles.tooltip=選択可能なクライアントロールです。 +select-client-role=クライアントロールを選択 + +client-template=クライアントテンプレート +client-template.tooltip=設定を引き継ぐクライアントテンプレートを選択します。 +client-saml-endpoint=クライアント SAML エンドポイント +add-client-template=クライアントテンプレートを追加 + +manage=管理 +authentication=認証 +user-federation=ユーザーフェデレーション +user-storage=ユーザーストレージ +events=イベント +realm-settings=レルムの設定 +configure=設定 +select-realm=レルムの選択 +add=追加 + +client-template.name.tooltip=クライアントテンプレートの名前です。レルム内でユニークにする必要があります。 +client-template.description.tooltip=クライアントテンプレートの説明です。 +client-template.protocol.tooltip=このクライアントテンプレートにより、どの SSO プロトコルが提供されるか設定します。 + +add-user-federation-provider=ユーザー フェデレーション プロバイダーの追加 +add-user-storage-provider=ユーザー ストレージ プロバイダーの追加 +required-settings=必要な設定 +provider-id=プロバイダー ID +console-display-name=コンソール表示名 +console-display-name.tooltip=管理コンソール内でのリンク表示名を設定します。 +priority=優先度 +priority.tooltip=ユーザーを検索する際のプロバイダーの優先度を設定します。低い順となります。 +sync-settings=同期の設定 +periodic-full-sync=定期的なフル同期 +periodic-full-sync.tooltip=プロバイダーユーザーの Keycloak への定期的なフル同期を有効または無効とすべきかを設定します。 +full-sync-period=フル同期の周期 +full-sync-period.tooltip=フル同期の周期を秒で設定します。 +periodic-changed-users-sync=定期的な変更ユーザーの同期 +periodic-changed-users-sync.tooltip=変更または新規作成されたプロバイダーユーザーの Keycloak への定期的な同期を有効または無効とすべきか設定します。 +changed-users-sync-period=変更ユーザーの同期周期 +changed-users-sync-period.tooltip=変更または新規作成されたプロバイダーユーザーの同期周期を秒で設定します。 +synchronize-changed-users=変更ユーザーを同期 +synchronize-all-users=すべてのユーザーを同期 +kerberos-realm=Kerberos レルム +kerberos-realm.tooltip=Kerberos レルムの名前を設定します。例えば、 FOO.ORG です。 +server-principal=サーバープリンシパル +server-principal.tooltip=サーバー、ドメイン名を含む HTTP サービスのサービスプリンシパルのフルネームを設定します。例えば、 HTTP/host.foo.org@FOO.ORG です。 +keytab=KeyTab +keytab.tooltip=サーバープリンシパルのクレデンシャルを含む Kerberos の KeyTab ファイルを設定します。例えば、/etc/krb5.keytab です。 +debug=デバッグ +debug.tooltip=Krb5LoginModule の標準出力へのデバッグロギングの有効/無効を設定します。 +allow-password-authentication=パスワード認証を許可 +allow-password-authentication.tooltip=Kerberos データベースに対するユーザー名/パスワード認証の有効/無効を設定します。 +edit-mode=編集モード +edit-mode.tooltip=READ_ONLY は、パスワード更新は許可されずユーザーは常に Kerberos のパスワードで認証することを意味します。UNSYNCED は、ユーザーは Keycloak データベース内の自分のパスワードを変更可能であり、Kerberos のパスワードの代わりに使用されることを意味します。 +ldap.edit-mode.tooltip=READ_ONLY は、読み取り専用の LDAP ストアです。WRITABLE は、データがオンデマンドで LDAP に書き戻しされることを意味します。UNSYNCEDは、ユーザーデータはインポートされますが、LDAP に書き戻しはされないことを意味します。 +update-profile-first-login=初回ログイン時にプロフィールを更新 +update-profile-first-login.tooltip=初回ログイン時のプロフィール更新の有効/無効を設定します。 +sync-registrations=登録の同期 +ldap.sync-registrations.tooltip=LDAP ストア内に新規作成ユーザーを作成すべきかどうかを設定します。どのプロバイダーが新しいユーザーの同期先に選択されるかは、優先度が影響します。 +vendor=ベンダー +ldap.vendor.tooltip=LDAP ベンダー (プロバイダー) +username-ldap-attribute=ユーザー名の LDAP 属性 +ldap-attribute-name-for-username=ユーザー名の LDAP 属性名 +username-ldap-attribute.tooltip=Keycloak ユーザー名にマッピングされる LDAP 属性名を設定します。多くの LDAP サーバーベンダーでは 「uid」 となります。Active Directory では 「sAMAccountName」 または 「cn」 となります。LDAP から Keycloak にインポートするすべての LDAP ユーザーのレコードで、属性は入力されているはずです。 +rdn-ldap-attribute=RDN LDAP 属性 +ldap-attribute-name-for-user-rdn=ユーザー RDN の LDAP 属性名 +rdn-ldap-attribute.tooltip=一般的なユーザー DN の RDN (top 属性) として使用される LDAP 属性名を設定します。通常は、ユーザー名の LDAP 属性 と同じですが、必須ではありません。例えば Active Directory では、ユーザー名が 「sAMAccountName」 だと RDN 属性として 「cn」 を使用するのが一般的です。 +uuid-ldap-attribute=UUID LDAP 属性 +ldap-attribute-name-for-uuid=UUID の LDAP 属性名 +uuid-ldap-attribute.tooltip=LDAP 内でオブジェクトのユニークなオブジェクト識別子 (UUID) として使用される LDAP 属性名を設定します。多くの LDAP サーバーベンダーでは 「entryUUID」 となりますが、異なる場合もあります。例えば Active Directory では、 「objectGUID」 となります。お使いの LDAP サーバーが UUID をサポートしていない場合は、ツリー内の LDAP ユーザーの中でユニークとなる他の属性を使用することができます。例えば、 「uid」 や 「entryDN」 です。 +user-object-classes=ユーザーオブジェクトクラス +ldap-user-object-classes.placeholder=LDAP のユーザーオブジェクトクラス (カンマ区切り) + +ldap-connection-url=LDAP 接続 URL +ldap-users-dn=LDAP ユーザー DN +ldap-bind-dn=LDAP Bind DN +ldap-bind-credentials=LDAP Bind のクレデンシャル +ldap-filter=LDAP フィルター +ldap.user-object-classes.tooltip=LDAP ユーザー用の すべての LDAP オブジェクトクラスをカンマ区切りで設定します。例: 「inetOrgPerson, organizationalPerson」 。新規作成された Keycloak ユーザーは、これらすべてのオブジェクトクラスを使用して LDAP に書き込まれます。また、既存の LDAP ユーザーのレコードは、これらすべてのオブジェクトクラスを含む場合だけ発見されます。 + +connection-url=接続 URL +ldap.connection-url.tooltip=お使いの LDAP サーバーへの接続 URL +test-connection=接続テスト +users-dn=ユーザー DN +ldap.users-dn.tooltip=ユーザーがいる LDAP ツリーの完全 DN を設定します。この DN は LDAP ユーザーの親になります。例えば、典型的なユーザーは 「uid=john,ou=users,dc=example,dc=com」 「ou=users,dc=example,dc=com」 のような DN となりますが、この場合は 「ou=users,dc=example,dc=com」 となります。 +authentication-type=認証タイプ +ldap.authentication-type.tooltip=LDAP 認証タイプを設定します。今のところ、 「none」 (Anonymous LDAP 認証) または 「simple」 (クレデンシャルによる Bind + パスワード認証による Bind) メカニズムが用意されています。 +bind-dn=Bind DN +ldap.bind-dn.tooltip=Keycloak が LDAP サーバーにアクセスするために使用する LDAP 管理者の DN を設定します。 +bind-credential=Bind のクレデンシャル +ldap.bind-credential.tooltip=LDAP 管理者のパスワードを設定します。 +test-authentication=認証テスト +custom-user-ldap-filter=カスタムユーザー LDAP フィルター +ldap.custom-user-ldap-filter.tooltip=ユーザー検索のフィルタリングを行う LDAP フィルターを設定します。追加のフィルターが必要ない場合は空のままにしてください。設定は、 「(」 から始まり 「)」 で終わることを確認してください。 +search-scope=検索スコープ +ldap.search-scope.tooltip=One Level では、ユーザー DN で指定された DN 内のユーザーのみを検索します。subtree では、サブツリー全体を検索します。より詳細については LDAP のドキュメントを参照してください。 +use-truststore-spi=トラストストア SPI を使用 +ldap.use-truststore-spi.tooltip=LDAP 接続で、standalone.xml/domain.xml で設定されたトラストストアの トラストストア SPI を使用するかどうかを指定します。 「Always」 は常に使用することを意味します。 「Never」 は使用しないことを意味します。 「Only for ldaps」 は、接続 URL が ldaps の場合に使用することを意味します。standalone.xml/domain.xml で設定されていない場合でも、デフォルトの Java CA 証明書 (cacerts) や 「javax.net.ssl.trustStore」 プロパティで指定された証明書が使用される点に注意してください。 +connection-pooling=接続プーリング +ldap.connection-pooling.tooltip=Keycloak は LDAP サーバーへのアクセスで接続プールを使用するかどうかを設定します。 +ldap.pagination.tooltip=LDAP サーバーはページネーションをサポートするかどうかを設定します。 +kerberos-integration=Kerberos と統合 +allow-kerberos-authentication=Kerberos 認証を許可 +ldap.allow-kerberos-authentication.tooltip=SPNEGO/Kerberos のトークンを持つユーザーの HTTP 認証を有効/無効にします。認証されたユーザーに関するデータはこの LDAP サーバーよりプロビジョニングされます。 +use-kerberos-for-password-authentication=パスワード認証に Kerberos を使用 +ldap.use-kerberos-for-password-authentication.tooltip=LDAP サーバーに対してディレクトリサービスの API で認証する代わりに、Kerberos に対して ユーザー名/パスワード認証する Kerberos ログインモジュールを使用します。 +batch-size=バッチサイズ +ldap.batch-size.tooltip=1トランザクションで LDAP から Keycloak にインポートされる LDAP ユーザー数を設定します。 +ldap.periodic-full-sync.tooltip=Keycloak への LDAP ユーザーの定期的なフル同期を有効/無効にします。 +ldap.periodic-changed-users-sync.tooltip=Keycloak への 変更または新規作成された LDAP ユーザーの定期的な同期を有効/無効にします。 +ldap.changed-users-sync-period.tooltip=変更または新規作成された LDAP ユーザーの同期周期を秒で設定します。 +user-federation-mappers=ユーザーフェデレーションのマッパー +create-user-federation-mapper=ユーザーフェデレーション マッパーの作成 +add-user-federation-mapper=ユーザーフェデレーション マッパーの追加 +provider-name=プロバイダー名 +no-user-federation-providers-configured=設定されているユーザーフェデレーション プロバイダーはありません +no-user-storage-providers-configured=設定されているユーザーストレージ プロバイダーはありません +add-identity-provider=アイデンティティ プロバイダーの登録 +add-identity-provider-link=アイデンティティ プロバイダーのリンク登録 +identity-provider=アイデンティティ プロバイダー +identity-provider-user-id=アイデンティティ プロバイダーのユーザー ID +identity-provider-user-id.tooltip=アイデンティティ プロバイダー側のユーザーのユニーク ID です。 +identity-provider-username=アイデンティティ プロバイダーのユーザー名 +identity-provider-username.tooltip=アイデンティティ プロバイダー側のユーザー名です。 +pagination=ページネーション + +browser-flow=ブラウザーフロー +browser-flow.tooltip=ブラウザー認証で使用したいフローを選択してください。 +registration-flow=登録フロー +registration-flow.tooltip=登録で使用したいフローを選択してください。 +direct-grant-flow=ダイレクトグラントフロー +direct-grant-flow.tooltip=ダイレクトグラント認証で使用したいフローを選択してください。 +reset-credentials=クレデンシャルのリセット +reset-credentials.tooltip=ユーザーがクレデンシャルを忘れた際に使用したいフローを選択してください。 +client-authentication=クライアント認証 +client-authentication.tooltip=クライアント認証で使用したいフローを選択してください。 +new=新規作成 +copy=コピー +add-execution=Execution を追加 +add-flow=フローを追加 +auth-type=認証タイプ +requirement=必要条件 +config=設定 +no-executions-available=使用可能な Execution がありません +authentication-flows=認証フロー +create-authenticator-config=認証設定の作成 +authenticator.alias.tooltip=この設定の名前を設定します。 +otp-type=OTP タイプ +time-based=タイムベース +counter-based=カウンターベース +otp-type.tooltip=TOTP はタイムベースのワンタイムパスワードです。 「hotp」 は、サーバーでハッシュに対してカウンターを保持するカウンターベースのワンタイムパスワードです。 +otp-hash-algorithm=OTP ハッシュアルゴリズム +otp-hash-algorithm.tooltip=OTP を生成するのにどのハッシュアルゴリズムを使用するか設定します。 +number-of-digits=桁数 +otp.number-of-digits.tooltip=OTP の桁数を設定します。 +look-ahead-window=先読みウィンドウ +otp.look-ahead-window.tooltip=トークンジェネレーターとサーバーが時刻同期またはカウンター同期していないことを考慮してどれくらい先読みを行うか設定します。 +initial-counter=初期カウンター +otp.initial-counter.tooltip=初期カウンターの値は何とするか設定します。 +otp-token-period=OTP トークンの期間 +otp-token-period.tooltip=OTP トークンは何秒有効とするか設定します。デフォルトは30秒です。 +table-of-password-policies=パスワードポリシーの一覧表 +add-policy.placeholder=ポリシーを追加... +policy-type=ポリシーのタイプ +policy-value=ポリシーの値 +admin-events=管理イベント +admin-events.tooltip=保存されたレルムの管理イベントを表示します。管理イベントは、アカウント管理に関連したイベント、例えばレルムの作成などです。イベントの保存を有効にするには設定へ移動してください。 +login-events=ログインイベント +filter=フィルター +update=更新 +reset=リセット +operation-types=操作タイプ +resource-types=リソースタイプ +select-operations.placeholder=操作を選択... +select-resource-types.placeholder=リソースタイプを選択... +resource-path=リソースパス +resource-path.tooltip=リソースパスでフィルターします。ワイルドカード 「*」 はパスの単一部分と一致し、 「**」 は複数部分と一致します。例えば、 「realms/*/clients/asbc」 はすべてのレルム内の ID asbc を持つクライアントとマッチし、 「realms/master/**」 は master レルム内のすべてにマッチします。 +date-(from)=日付 (From) +date-(to)=日付 (To) +authentication-details=認証の詳細 +ip-address=IP アドレス +time=日時 +operation-type=操作タイプ +resource-type=リソースタイプ +auth=認証 +representation=Representation +register=登録 +required-action=Required アクション +default-action=デフォルトアクション +auth.default-action.tooltip=有効の場合は、新規ユーザーにはこの Required アクションがアサインされます。 +no-required-actions-configured=設定された Required アクションはありません +defaults-to-id=ID がデフォルトになります +flows=フロー +bindings=バインディング +required-actions=Required アクション +password-policy=パスワードポリシー +otp-policy=OTP ポリシー +user-groups=ユーザーグループ +default-groups=デフォルトグループ +groups.default-groups.tooltip=新規ユーザーが自動的に参加するグループのセットを設定します。 +cut=カット +paste=ペースト + +create-group=グループの作成 +create-authenticator-execution=認証 Execution の作成 +create-form-action-execution=フォームアクション Execution の作成 +create-top-level-form=トップレベルフォームの作成 +flow.alias.tooltip=フローの表示名を指定します。 +top-level-flow-type=トップレベルフロータイプ +flow.generic=generic +flow.client=client +top-level-flow-type.tooltip=どの種類のトップレベルフローを作成しますか? 「client」 タイプは、クライアント (アプリケーション) の認証で使用します。 「generic」 はユーザーと他のすべてで使用します。 +create-execution-flow=Execution フローの作成 +flow-type=フロータイプ +flow.form.type=form +flow.generic.type=generic +flow-type.tooltip=どの種類のフォームかを設定します。 +form-provider=フォームプロバイダー +default-groups.tooltip=新規作成または登録されたユーザーは自動的にこれらのグループに追加されます。 +select-a-type.placeholder=タイプを選択してください +available-groups=使用可能なグループ +available-groups.tooltip=デフォルトとして追加したいグループを選択してください。 +value=値 +table-of-group-members=グループメンバーの一覧表 +last-name=姓 +first-name=名 +email=Eメール +toggle-navigation=ナビゲーションの切り替え +manage-account=アカウントの管理 +sign-out=サインアウト +server-info=サーバー情報 +resource-not-found=リソースが見つかりません... +resource-not-found.instruction=お探しのリソースが見つかりませんでした。入力された URL が正しいかご確認ください。 +go-to-the-home-page=ホームページへ移動 » +page-not-found=ページが見つかりません... +page-not-found.instruction=お探しのページが見つかりませんでした。入力された URL が正しいかご確認ください。 +events.tooltip=保存されたレルムのイベントを表示します。イベントは、ユーザーアカウントに関連したイベント、例えばログインなどです。イベントの保存を有効にするには設定へ移動してください。 +select-event-types.placeholder=イベントタイプを選択... +events-config.tooltip=ユーザーと管理イベントの保存を有効にする設定オプションを表示します。 +select-an-action.placeholder=アクションを選択... +event-listeners.tooltip=どのリスナーがレルムのイベントを受け取るか設定します。 +login.save-events.tooltip=有効の場合は、ログインイベントがデータベースに保存され、管理コンソールとアカウント管理で使用することができます。 +clear-events.tooltip=データベース内のすべてのイベントを削除します。 +events.expiration.tooltip=イベントの有効期限を設定します。期限切れのイベントはデータベースから定期的に削除されます。 +admin-events-settings=管理イベントの設定 +save-events=イベントの保存 +admin.save-events.tooltip=有効の場合は、管理イベントがデータベースに保存され、管理コンソールで使用可能になります。 +saved-types.tooltip=どのイベントタイプが保存されるかを設定します。 +include-representation=Representation を含める +include-representation.tooltip=作成または更新リクエストの JSON Representation を含めるかどうかを設定します。 +clear-admin-events.tooltip=データベース内のすべての管理イベントを削除します。 +server-version=サーバーのバージョン +server-profile=サーバープロファイル +info=情報 +providers=プロバイダー +server-time=サーバーの時刻 +server-uptime=サーバーの稼働時間 +memory=メモリー +total-memory=メモリーの総容量 +free-memory=空きメモリー +used-memory=使用メモリー +system=システム +current-working-directory=現在の作業ディレクトリ +java-version=Java バージョン +java-vendor=Java ベンダー +java-runtime=Java ランタイム +java-vm=Java VM +java-vm-version=Java VM バージョン +java-home=Java ホーム +user-name=ユーザー名 +user-timezone=ユーザータイムゾーン +user-locale=ユーザーロケール +system-encoding=システムエンコーディング +operating-system=オペレーションシステム +os-architecture=OS アーキテクチャ +spi=SPI +granted-roles=許可されたロール +granted-protocol-mappers=許可されたプロトコルマッパー +additional-grants=追加の許可 +consent-created-date=作成日 +consent-last-updated-date=最終更新日 +revoke=取り消し +new-password=新しいパスワード +password-confirmation=新しいパスワード (確認) +reset-password=パスワードをリセット +credentials.temporary.tooltip=有効の場合は、ユーザーは次のログイン時にパスワードの変更が必要となります。 +remove-totp=TOTP の削除 +credentials.remove-totp.tooltip=ユーザーのワンタイムパスワードジェネレーターを削除します。 +reset-actions=リセットアクション +credentials.reset-actions.tooltip=ユーザーにリセットアクションEメールを送信する際に実行するアクションを設定します。 「Verify email」 は、メールアドレスの確認のためにユーザーにEメールを送信します。 「Update profile」 は、新しい個人情報の入力を必要とします。 「Update password」 は、新しいパスワードの入力を必要とします。 「Configure TOTP」 は、モバイルのパスワードジェネレーターのセットアップを必要とします。 +reset-actions-email=リセットアクションEメール +send-email=Eメールを送信 +credentials.reset-actions-email.tooltip=リンクを記載したEメールをユーザーに送信します。リンクをクリックすることで、ユーザーはリセットアクションを実行できます。ユーザーはリセットの前にログインする必要はありません。例えば、 「Update Password」 アクションを設定してこのボタンをクリックすると、ユーザーはログインなしにパスワードの変更が可能になります。 +add-user=ユーザーの追加 +created-at=作成日 +user-enabled=ユーザーの有効 +user-enabled.tooltip=無効ユーザーはログインすることができません。 +user-temporarily-locked=ユーザーの一時的なロック +user-temporarily-locked.tooltip=ユーザーは何度もログインに失敗してロックされている可能性があります。 +unlock-user=ユーザーをアンロック +federation-link=フェデレーション リンク +email-verified=確認済みのEメール +email-verified.tooltip=ユーザーのEメールは確認済みかどうか設定します。 +required-user-actions=必要なユーザーアクション +required-user-actions.tooltip=ユーザーがログイン時に必要となるアクションを設定します。 「Verify email」 は、メールアドレスの確認のためにユーザーにEメールを送信します。 「Update profile」 は、新しい個人情報の入力を必要とします。 「Update password」 は、新しいパスワードの入力を必要とします。 「Configure TOTP」 は、モバイルのパスワードジェネレーターのセットアップを必要とします。 +locale=ロケール +select-one.placeholder=1つ選択... +impersonate=代理ログイン +impersonate-user=ユーザーの代理 +impersonate-user.tooltip=このユーザーとしてログインします。同じレルム内のユーザーの場合は、このユーザーでログインする前に、現在のログインセッションがログアウトされます。 +identity-provider-alias=アイデンティティ プロバイダーのエイリアス +provider-user-id=プロバイダーのユーザー ID +provider-username=プロバイダーのユーザー名 +no-identity-provider-links-available=使用可能なアイデンティティ プロバイダーのリンクはありません +group-membership=グループメンバーシップ +leave=外す +group-membership.tooltip=メンバーであるグループです。グループから外すには、リストのグループを選択して 「外す」 ボタンをクリックしてください。 +membership.available-groups.tooltip=ユーザーが参加可能なグループです。グループを選択して 「参加」 ボタンをクリックしてください。 +table-of-realm-users=レルムユーザーの一覧表 +view-all-users=すべてのユーザーを参照 +unlock-users=ユーザーのアンロック +no-users-available=使用可能なユーザーはおりません +users.instruction=検索を入力するか、 「すべてのユーザーを参照」 をクリックしてください +consents=同意 +started=開始 +logout-all-sessions=すべてのセッションをログアウト +logout=ログアウト +new-name=新しい名前 +ok=OK +attributes=属性 +role-mappings=ロールマッピング +members=メンバー +details=詳細 +identity-provider-links=アイデンティティ プロバイダーのリンク +register-required-action=Required アクションの登録 +gender=性別 +address=住所 +phone=電話番号 +profile-url=プロフィール URL +picture-url=画像 URL +website=Web サイト +import-keys-and-cert=鍵と証明書をインポート +import-keys-and-cert.tooltip=クライアントの鍵ペアと証明書をアップロードします。 +upload-keys=鍵をアップロード +download-keys-and-cert=鍵と証明書をダウンロード +no-value-assigned.placeholder=アサイン済みの値はありません +remove=削除 +no-group-members=グループメンバーはおりません +temporary=一時的 +join=参加 +event-type=イベントタイプ +events-config=イベント設定 +event-listeners=イベントリスナー +login-events-settings=ログインイベントの設定 +clear-events=イベントのクリア +saved-types=保存タイプ +clear-admin-events=管理イベントのクリア +clear-changes=変更をクリア +error=エラー + +# Authz +# Authz Common +authz-authorization=認可 +authz-owner=オーナー +authz-uri=URI +authz-scopes=スコープ +authz-resource=リソース +authz-resource-type=リソースタイプ +authz-resources=リソース +authz-scope=スコープ +authz-authz-scopes=認可スコープ +authz-policies=ポリシー +authz-permissions=アクセス権 +authz-evaluate=評価 +authz-icon-uri=アイコン URI +authz-icon-uri.tooltip=アイコンを指す URI を設定します。 +authz-select-scope=スコープを選択 +authz-select-resource=リソースを選択 +authz-associated-policies=関連ポリシー +authz-any-resource=任意のリソース +authz-any-scope=任意のスコープ +authz-any-role=任意のロール +authz-policy-evaluation=ポリシー評価 +authz-select-client=クライアントを選択 +authz-select-user=ユーザーを選択 +authz-entitlements=エンタイトルメント +authz-no-resources=リソースはありません +authz-result=結果 +authz-authorization-services-enabled=認可の有効 +authz-authorization-services-enabled.tooltip=きめ細かい認可のサポートを有効/無効にします。 +authz-required=必須 + +# Authz Settings +authz-import-config.tooltip=リソースサーバーの認可設定を含む JSON ファイルをインポートします。 + +authz-policy-enforcement-mode=ポリシー施行モード +authz-policy-enforcement-mode.tooltip=ポリシー施行モードは、認可リクエストを評価する際に適用される方法を決定します。 「Enforcing」 は、与えられたリソースに関連するポリシーが存在しない場合でも、リクエストはデフォルトで拒否されることを意味します。 「Permissive」 は、与えられたリソースに関連するポリシーが存在しない場合でも、リクエストは許可されることを意味します。 「Disabled」 は、完全にポリシーの評価を無効にし、任意のリソースへのアクセスを許可します。 +authz-policy-enforcement-mode-enforcing=Enforcing +authz-policy-enforcement-mode-permissive=Permissive +authz-policy-enforcement-mode-disabled=Disabled + +authz-remote-resource-management=リモートリソース管理 +authz-remote-resource-management.tooltip=リソースは、リソースサーバーによりリモートで管理すべきかどうかを設定します。 オフの場合は、リソースはこの管理コンソールだけで管理されます。 + +authz-export-settings=エクスポート設定 +authz-export-settings.tooltip=このリソースサーバーのすべての認可設定をエクスポートしダウンロードします。 + +# Authz Resource List +authz-no-resources-available=使用可能なリソースはありません。 +authz-no-scopes-assigned=アサイン済みのスコープはありません。 +authz-no-type-defined=定義されたタイプはありません。 +authz-no-permission-assigned=アサイン済みのアクセス権はありません。 +authz-no-policy-assigned=アサイン済みのポリシーはありません。 +authz-create-permission=アクセス権を作成 + +# Authz Resource Detail +authz-add-resource=リソースの追加 +authz-resource-name.tooltip=このリソースのユニークな名前を設定します。名前はリソースの一意な識別に使用され、特定のリソースを照会する際に使用することができます。 +authz-resource-owner.tooltip=このリソースのオーナーです。 +authz-resource-type.tooltip=このリソースのタイプを設定します。異なるリソースインスタンスを同じタイプにグルーピングすることができます。 +authz-resource-uri.tooltip=このリソースを一意に識別する URI を設定します。 +authz-resource-scopes.tooltip=このリソースに関連付けるスコープを設定します。 + +# Authz Scope List +authz-add-scope=スコープの追加 +authz-no-scopes-available=使用可能なスコープはありません。 + +# Authz Scope Detail +authz-scope-name.tooltip=このスコープのユニークな名前を設定します。名前はスコープの一意な識別に使用され、特定のスコープを照会する際に使用することができます。 + +# Authz Policy List +authz-all-types=すべてのタイプ +authz-create-policy=ポリシーを作成 +authz-no-policies-available=使用可能なポリシーはありません。 + +# Authz Policy Detail +authz-policy-name.tooltip=このポリシーの名前を設定します。 +authz-policy-description.tooltip=このポリシーの説明を設定します。 +authz-policy-logic=ロジック +authz-policy-logic-positive=Positive +authz-policy-logic-negative=Negative +authz-policy-logic.tooltip=ロジックは、ポリシーの判定方法を決定します。 「Positive」 の場合は、このポリシーの評価中に得られた結果 (許可または拒否) が判定の実行に使用されます。 「Negative」 の場合は、結果は反転されます。言い換えれば、許可は拒否とその反対になります。 +authz-policy-apply-policy=ポリシーの適用 +authz-policy-apply-policy.tooltip=このポリシーやアクセス権で定義されたスコープに適用するすべてのポリシーを設定します。 +authz-policy-decision-strategy=判定戦略 +authz-policy-decision-strategy.tooltip=判定戦略は、ポリシーの評価方法と最終的な判定方法を決定します。 「Affirmative」 は、最終判定が positive となるためには、少なくとも1つのポリシーが positive と評価する必要がある、ということを意味します。 「Unanimous」 は、全体の判定が positive となるためには、すべてのポリシーが positive と評価する必要がある、ということを意味します。 「Consensus」 は、positive の数が nagative の数より多くなければならないことを意味します。positive と negative の数が同じ場合は、最終的な判定は negative になります。 +authz-policy-decision-strategy-affirmative=Affirmative +authz-policy-decision-strategy-unanimous=Unanimous +authz-policy-decision-strategy-consensus=Consensus +authz-select-a-policy=ポリシーを選択 + +# Authz Role Policy Detail +authz-add-role-policy=ロールポリシーの追加 +authz-no-roles-assigned=アサイン済みのロールはありません。 +authz-policy-role-realm-roles.tooltip=このポリシーで許可されるレルムロールを指定してください。 +authz-policy-role-clients.tooltip=このポリシーに適用されるクライアントロールをフィルタリングするために、クライアントを選択してください。 +authz-policy-role-client-roles.tooltip=このポリシーで許可されるクライアントロールを指定してください。 + +# Authz User Policy Detail +authz-add-user-policy=ユーザーポリシーの追加 +authz-no-users-assigned=アサイン済みのユーザーはおりません。 +authz-policy-user-users.tooltip=どのユーザーがこのポリシーで許可されるか指定してください。 + +# Authz Time Policy Detail +authz-add-time-policy=タイムポリシーの追加 +authz-policy-time-not-before.tooltip=ポリシーを許可しない日時を定義します。現在日時がこの値より後か、等しい場合にのみ許可されます。 +authz-policy-time-not-on-after=この日時より後 +authz-policy-time-not-on-after.tooltip=ポリシーを許可しない日時を定義します。現在日時がこの値より前か、等しい場合にのみ許可されます。 +authz-policy-time-day-month=月の日 +authz-policy-time-day-month.tooltip=ポリシーが許可される月の日を定義します。2番目のフィールドに値を入力して範囲を指定することもできます。この場合、現在の日が指定した2つの値の間にあるか、等しい場合のみ許可されます。 +authz-policy-time-month=月 +authz-policy-time-month.tooltip=ポリシーが許可される月を定義します。2番目のフィールドに値を入力して範囲を指定することもできます。この場合、現在の月が指定した2つの値の間にあるか、等しい場合のみ許可されます。 +authz-policy-time-year=年 +authz-policy-time-year.tooltip=ポリシーが許可される年を定義します。2番目のフィールドに値を入力して範囲を指定することもできます。この場合、現在の年が指定した2つの値の間にあるか、等しい場合のみ許可されます。 +authz-policy-time-hour=時 +authz-policy-time-hour.tooltip=ポリシーが許可される時を定義します。2番目のフィールドに値を入力して範囲を指定することもできます。この場合、現在の時が指定した2つの値の間にあるか、等しい場合のみ許可されます。 +authz-policy-time-minute=分 +authz-policy-time-minute.tooltip=ポリシーが許可される分を定義します。2番目のフィールドに値を入力して範囲を指定することもできます。この場合、現在の分が指定した2つの値の間にあるか、等しい場合のみ許可されます。 + +# Authz Drools Policy Detail +authz-add-drools-policy=Rules ポリシーの追加 +authz-policy-drools-maven-artifact-resolve=解決 +authz-policy-drools-maven-artifact=ポリシー Maven アーティファクト +authz-policy-drools-maven-artifact.tooltip=ルールの読み込む先となるアーティファクトを示す Maven GAV を設定します。GAV を提供し 「解決」 をクリックすることで、 「モジュール」 と 「セッション」 フィールドを読み込みます。 +authz-policy-drools-module=モジュール +authz-policy-drools-module.tooltip=このポリシーで使用されるモジュールです。ルールの読み込み先から特定のセッションを選択するにはモジュールを提供する必要があります。 +authz-policy-drools-session=セッション +authz-policy-drools-session.tooltip=このポリシーで使用されるセッションです。セッションは、ポリシーを処理する際に評価するすべてのルールを提供します。 +authz-policy-drools-update-period=更新周期 +authz-policy-drools-update-period.tooltip=アーティファクトの更新をスキャンする間隔を指定します。 + +# Authz JS Policy Detail +authz-add-js-policy=JavaScript ポリシーの追加 +authz-policy-js-code=コード +authz-policy-js-code.tooltip=このポリシーの条件を提供する JavaScript コードを設定します。 + + +# Authz Aggregated Policy Detail +authz-aggregated=集約 +authz-add-aggregated-policy=集約ポリシーの追加 + +# Authz Permission List +authz-no-permissions-available=使用可能なアクセス権はありません。 + +# Authz Permission Detail +authz-permission-name.tooltip=このアクセス権の名前を設定します。 +authz-permission-description.tooltip=このアクセス権の説明を設定します。 + +# Authz Resource Permission Detail +authz-add-resource-permission=リソースアクセス権の追加 +authz-permission-resource-apply-to-resource-type=リソースタイプに適用 +authz-permission-resource-apply-to-resource-type.tooltip=このアクセス権が、特定タイプの全リソースに適用されるかどうかを指定します。この場合、アクセス権は特定リソースタイプの全インスタンスに対して評価されます。 +authz-permission-resource-resource.tooltip=このアクセス権が適用されるリソースインスタンスを指定します。 +authz-permission-resource-type.tooltip=このアクセス権が適用されるリソースタイプを指定します。 + +# Authz Scope Permission Detail +authz-add-scope-permission=スコープアクセス権の追加 +authz-permission-scope-resource.tooltip=選択されたリソースに関連するスコープに制限します。選択されていない場合は、すべてのスコープが使用可能になります。 +authz-permission-scope-scope.tooltip=このアクセス権は1つまたは複数のスコープに適用されるように指定してください。 + +# Authz Evaluation +authz-evaluation-identity-information=アイデンティティ情報 +authz-evaluation-identity-information.tooltip=ポリシーの評価の際に使用されるアイデンティティ情報の設定オプションです。 +authz-evaluation-client.tooltip=認可リクエストを作成するクライアントを選択してください。提供されない場合は、認可リクエストは今いるページのクライアントで行われることになります。 +authz-evaluation-user.tooltip=アクセス権を照会するために使用するユーザーのアイデンティティを選択してください。 +authz-evaluation-role.tooltip=選択されたユーザーに関連付けたいロールを選択してください。 +authz-evaluation-new=新規に評価 +authz-evaluation-re-evaluate=再評価 +authz-evaluation-previous=前の評価 +authz-evaluation-contextual-info=コンテキスト情報 +authz-evaluation-contextual-info.tooltip=ポリシーの評価の際に使用されるコンテキスト情報の設定オプションです。 +authz-evaluation-contextual-attributes=コンテキスト属性 +authz-evaluation-contextual-attributes.tooltip=実行環境や実行コンテキストによって提供される任意の属性を設定します。 +authz-evaluation-permissions.tooltip=ポリシーが適用されるようにアクセス権を設定するオプションです。 +authz-evaluation-evaluate=評価 +authz-evaluation-any-resource-with-scopes=スコープを持つ任意のリソース +authz-evaluation-no-result=認可リクエストから結果を得ることができませんでした。提供されたリソースまたはスコープが、ポリシーと関連付けられているかどうかを確認してください。 +authz-evaluation-no-policies-resource=このリソースのポリシーが見つかりませんでした。 +authz-evaluation-result.tooltip=このアクセス権のリクエストの全体的な結果です。 +authz-evaluation-scopes.tooltip=許可されたスコープリストです。 +authz-evaluation-policies.tooltip=どのポリシーが評価され判定されたか詳細を表示しています。 +authz-evaluation-authorization-data=レスポンス +authz-evaluation-authorization-data.tooltip=認可リクエストの処理の結果として送信された認可データのトークンを表示します。これは、許可を求めたクライアントに対して Keycloak が発行する基本的なものです。現在の認可リクエストで付与されたアクセス権については 「authorization」 クレームを確認してください。 +authz-show-authorization-data=認可データを表示 + +kid=KID +keys=鍵 +all=すべて +status=ステータス +keystore=キーストア +keystores=キーストア +add-keystore=キーストアの追加 +add-keystore.placeholder=キーストアの追加... +view=ビュー +active=アクティブ + +Sunday=日 +Monday=月 +Tuesday=火 +Wednesday=水 +Thursday=木 +Friday=金 +Saturday=土 + +user-storage-cache-policy=キャッシュ設定 +userStorage.cachePolicy=キャッシュポリシー +userStorage.cachePolicy.option.DEFAULT=DEFAULT +userStorage.cachePolicy.option.EVICT_WEEKLY=EVICT_WEEKLY +userStorage.cachePolicy.option.EVICT_DAILY=EVICT_DAILY +userStorage.cachePolicy.option.MAX_LIFESPAN=MAX_LIFESPAN +userStorage.cachePolicy.option.NO_CACHE=NO_CACHE +userStorage.cachePolicy.tooltip=このストレージ プロバイダーのキャッシュポリシーを設定します。「DEFAULT」 はグローバルユーザーキャッシュのデフォルト設定と同じになります。「EVICT_DAILY」 は日次でユーザーキャッシュが無効になります。「EVICT_WEEKLY」 は週次でキャッシュが無効になります。「MAX-LIFESPAN」 はキャッシュエントリの生存期間をミリ秒単位で設定します。 +userStorage.cachePolicy.evictionDay=エビクションの日 +userStorage.cachePolicy.evictionDay.tooltip=エントリが無効になる日の曜日を設定します。 +userStorage.cachePolicy.evictionHour=エビクションの時 +userStorage.cachePolicy.evictionHour.tooltip=エントリが無効になる日の時を設定します。 +userStorage.cachePolicy.evictionMinute=エビクションの分 +userStorage.cachePolicy.evictionMinute.tooltip=エントリが無効になる日の分を設定します。 +userStorage.cachePolicy.maxLifespan=最大生存期間 +userStorage.cachePolicy.maxLifespan.tooltip=ユーザーキャッシュエントリの最大生存期間をミリ秒単位で設定します。 +user-origin-link=ストレージオリジン + +disable=無効 +disableable-credential-types=無効化可能なタイプ +credentials.disableable.tooltip=無効にできるクレデンシャルタイプのリストを設定します。 +disable-credential-types=クレデンシャルタイプを無効化 +credentials.disable.tooltip=選択したクレデンシャルタイプを無効にするには、ボタンをクリックします。 +credential-types=クレデンシャルタイプ +manage-user-password=パスワードの管理 +disable-credentials=クレデンシャルの無効化 +credential-reset-actions=クレデンシャルのリセット +ldap-mappers=LDAP マッパー +create-ldap-mapper=LDAP マッパーの作成 + + + + + + diff --git a/admin/messages/admin-messages_lt.properties b/admin/messages/admin-messages_lt.properties new file mode 100644 index 0000000..ad7b220 --- /dev/null +++ b/admin/messages/admin-messages_lt.properties @@ -0,0 +1,1218 @@ +consoleTitle=Keycloak administravimo konsol\u0117 + +# Common messages +enabled=\u012Egalintas +name=Pavadinimas +displayName=Rodomas pavadinimas +displayNameHtml=Rodomas pavadinimas HTML formatu +save=Saugoti +cancel=At\u0161aukti +onText=ON +offText=OFF +client=Klientas +clients=Klientai +clear=I\u0161valyti +selectOne=Pasirinkite vien\u0105... + +true=Taip +false=Ne + +endpoints=Prieigos adresai + +# Realm settings +realm-detail.enabled.tooltip=Naudotojai ir programos prie srities gali prieiti tik tuomet, kai ji \u012Fgalinta +realm-detail.oidc-endpoints.tooltip=Atidaromas langas su OpenID Connect prieigos URL adresais +registrationAllowed=Naudotoj\u0173 registracija +registrationAllowed.tooltip=\u012Egalina naudotoj\u0173 registravimosi s\u0105saj\u0105. Prisijungimo lange rodoma nuoroda \u012F registravimosi puslap\u012F. +registrationEmailAsUsername=El. pa\u0161tas kaip naudojo vardas +registrationEmailAsUsername.tooltip=Jei \u012Fgalintas tuomet naudotojo vardo laukas registravimosi lange yra slepiamas ir naujai besiregistruojantiems naudotojams el. pa\u0161to adresas naudojamas kaip naudotojo vardas. +editUsernameAllowed=Naudotojo vardo redagavimas +editUsernameAllowed.tooltip=Jei \u012Fgalintas, tuomet naudotojas gali keisti savo naudotojo vard\u0105. +resetPasswordAllowed=Slapta\u017Eod\u017Eio priminimas +resetPasswordAllowed.tooltip=Prisijungimo lange rodoma nuoroda pamir\u0161to slapta\u017Eod\u017Eio atk\u016Brimui. +rememberMe=Prisiminti mane +rememberMe.tooltip=Prisijungimo lange rodyti pasirinkim\u0105 leid\u017Eiant\u012F naudotojui likti prisijungus netgi tuomet, kai nar\u0161ykl\u0117 yra i\u0161jungiama/\u012Fjungiama tol, kol nepasibaigia prisijungimo sesija. +verifyEmail=El. pa\u0161to patvirtinimas +verifyEmail.tooltip=Reikalauti naudotojo patvirtinti el. pa\u0161to adres\u0105 pirmojo prisijungimo metu. +sslRequired=Reikalauti SSL +sslRequired.option.all=visoms u\u017Eklausoms +sslRequired.option.external=i\u0161orin\u0117ms u\u017Eklausoms +sslRequired.option.none=niekada +sslRequired.tooltip=Ar HTTPS privalomas? 'niekada' - HTTPS nereikalaujamas. 'i\u0161orin\u0117ms u\u017Eklausoms' - jungiantis i\u0161 localhost ar serverio IP adres\u0173 galima prieiti ir per HTTP. 'visoms u\u017Eklausoms' - HTTPS reikalaujamas jungiantis i\u0161 vis\u0173 IP adres\u0173. +publicKey=Vie\u0161as raktas +privateKey=Privatus raktas +gen-new-keys=Generuoti naujus raktus +certificate=Sertifikatas +host=Serveris +smtp-host=SMTP serveris +port=Prievadas +smtp-port=SMTP prievadas (numatyta reik\u0161m\u0117 25) +from=Nuo +sender-email-addr=Siunt\u0117jo el. pa\u0161to adresas +enable-ssl=\u012Egalinti SSL +enable-start-tls=\u012Egalinti StartTLS +enable-auth=\u012Egalinti autentifikacij\u0105 +username=Naudotojo vardas +login-username=Prisijungimui naudojamas naudotojo vardas +password=Slapta\u017Eodis +login-password=Prisijungimui naudojamas slapta\u017Eodis +login-theme=Prisijungimo lango tema +login-theme.tooltip=Pasirinkite kaip atrodys J\u016Bs\u0173 prisijungimo, TOTP, teisi\u0173 suteikimo, naudotoj\u0173 registracijos ir slapta\u017Eod\u017Ei\u0173 priminimo langai. +account-theme=Naudotojo profilio tema +account-theme.tooltip=Pasirinkite kaip atrodys naudotojo profilio valdymo langai. +admin-console-theme=Administravimo konsol\u0117s tema +select-theme-admin-console=Pasirinkite kaip atrodys administravimo konsol\u0117s langai. +email-theme=El. pa\u0161to tema +select-theme-email=Pasirinkite kaip atrodys siun\u010Diami el. pa\u0161to lai\u0161kai. +i18n-enabled=Daugiakalbyst\u0117s palaikymas +supported-locales=Palaikomos kalbos +supported-locales.placeholder=Pasirinkite arba \u012Fra\u0161ykite kalbos pavadinim\u0105 +default-locale=Numatyta kalba +realm-cache-clear=Srities pod\u0117lis +realm-cache-clear.tooltip=I\u0161 vis\u0173 sri\u010Di\u0173 pa\u0161alinama visa pod\u0117lyje (cache) esanti informacija +user-cache-clear=Naudotoj\u0173 pod\u0117lis +user-cache-clear.tooltip=I\u0161 vis\u0173 sri\u010Di\u0173 pa\u0161alinama visa naudotoj\u0173 pod\u0117lyje (cache) esanti informacija +revoke-refresh-token=Prieigos rakt\u0105 naudoti tik kart\u0105 +revoke-refresh-token.tooltip=Jei \u012Fgalintas, tuomet atnaujinimo raktai (Refresh Token) gali b\u016Bti naudojami tik vien\u0105 kart\u0105. Kitu atveju - atnaujinimo raktai gali b\u016Bti pernaudojami daugel\u012F kart\u0173. +sso-session-idle=SSO sesijos neveikimo laikas +seconds=Sekund\u0117s +minutes=Minut\u0117s +hours=Valandos +days=Dienos +sso-session-max=SSO sesijos maksimalus laikas +sso-session-idle.tooltip=Laikas, po kurio neaktyvi sesija bus u\u017Ebaigta. Sesijos pasibaigimo metu visi raktai (Tokens) ir nar\u0161ykli\u0173 sesijos sunaikinamos. +sso-session-max.tooltip=Laikas, po kurio prisijungimo sesija yra sunaikinama. Sesijos pasibaigimo metu visi raktai (Tokens) ir nar\u0161ykli\u0173 sesijos sunaikinamos. +offline-session-idle=Neprisijungusios sesijos neveikimo laikas +offline-session-idle.tooltip=Darbo neprisijungus sesijos neveikimo laikas, po kurio neaktyvi sesija bus u\u017Ebaigta. Darbo neprisijungus metu, prisijungimo raktai turi b\u016Bti atnaujinami bent kart\u0105 per nurodyt\u0105 period\u0105. Kitu atveju sesijos galiojmas bus sustabdytas. +access-token-lifespan=Prisijungimo rakto galiojimo laikas +access-token-lifespan.tooltip=Laikas, po kurio prisijungimui naudojamas raktas (Access Token) nustoja galioti. Rekomenduojama, kad \u0161ios reik\u0161m\u0117s galiojimas b\u016Bt\u0173 reliatyviai trumpas palyginus su SSO galiojimo laiku. +access-token-lifespan-for-implicit-flow=Prisijungimo rakto galiojimo laikas (Implicit Flow) +access-token-lifespan-for-implicit-flow.tooltip=Laikas, po kurio prisijungimui naudojamas OpenID Connect Implicit Flow raktas nustoja galioti. Rekomenduojama, kad \u0161ios reik\u0161m\u0117s galiojimas b\u016Bt\u0173 reliatyviai trumpas palyginus su SSO galiojimo laiku. \u0160is parametras skiriasi nuo 'Prisijungimo rakto galiojimo laikas', nes n\u0117ra galimyb\u0117s atnaujinti prieigos rakto naudojant OpenID Connect Implicit Flow. +client-login-timeout=Kliento prisijungimui skirtas laikas +client-login-timeout.tooltip=Laikas, per kur\u012F klientas turi u\u017Ebaigti prisijungimo proces\u0105. Normaliu atveju reik\u0161m\u0117 tur\u0117t\u0173 b\u016Bti 1 minut\u0117. +login-timeout=Naudotojo prisijungimui skirtas laikas +login-timeout.tooltip=Laikas, per kur\u012F naudotojas turi u\u017Ebaigti prisijungimo proces\u0105. Rekomenduojamas pakankamai ilgas laiko tarpas. Pvz. 30 minu\u010Di\u0173 ar daugiau. +login-action-timeout=Naudotojo prisijungimo veiksmui skirtas laikas +login-action-timeout.tooltip=Laikas, per kur\u012F naudotojas turi u\u017Ebaigti su prisijungimu susijus\u012F veiksm\u0105. Pavyzd\u017Eiui atnaujinti slapta\u017Eod\u012F ar sukonfig\u016Bruoti TOTP. Rekomenduojamas laikas - 5 minut\u0117s ar daugiau. +headers=Antra\u0161t\u0117s +brute-force-detection=Grubios j\u0117gos ataka +x-frame-options=X-Frame-Options +x-frame-options-tooltip=Numatyta reik\u0161m\u0117 draud\u017Eia puslapius naudoti kitose svetain\u0117se per iframe (paspauskite antra\u0161t\u0119 nor\u0117dami gauti daugiau informacijos) +content-sec-policy=Content-Security-Policy +content-sec-policy-tooltip=Numatyta reik\u0161m\u0117 draud\u017Eia puslapius naudoti kitose svetain\u0117se per iframe (paspauskite antra\u0161t\u0119 nor\u0117dami gauti daugiau informacijos) +content-type-options=X-Content-Type-Options +content-type-options-tooltip=Numatyta reik\u0161m\u0117 draud\u017Eia Internet Explorer ir Google Chrome atlikti priimti kitokias MIME reik\u0161mes (MIME-sniffing) nei deklaruotas turinio tipas (content-type) (paspauskite antra\u0161t\u0119 nor\u0117dami gauti daugiau informacijos) +max-login-failures=Maksimalus bandym\u0173 prisijungim\u0173 skai\u010Dius +max-login-failures.tooltip=Pasiekus maksimal\u0173 nes\u0117kming\u0173 bandym\u0173 prisijungti skai\u010Di\u0173 \u012Fjungiamas specialus r\u0117\u017Eimas, kuomet laukimo intervalas yra didinamas po kiekvieno sekan\u010Dio neteisingo bandymo. +wait-increment=Laukimo laiko didinimas po +wait-increment.tooltip=Laikas, kur\u012F naudotojo prisijungimai yra draud\u017Eiami, kai n\u0117s\u0117kming\u0173 bandym\u0173 skai\u010Dius pasiekia nustatyt\u0105 rib\u0105 +quick-login-check-millis=Per greito bandymo prisijungti laikas milisekund\u0117mis +quick-login-check-millis.tooltip=Jei n\u0117s\u0117kmingi bandymai prisijungti seka vienas kit\u0105 per greitai, tuomet naudotojo paskyra yra u\u017Erakinama. +min-quick-login-wait=Per greito bandymo prisijungti u\u017Erakinimo laikas +min-quick-login-wait.tooltip=Laikas, kur\u012F naudotojo prisijungimai yra draud\u017Eiami, kai n\u0117s\u0117kmingi bandymai prisijungti seka vienas kit\u0105 per greitai. +max-wait=Maksimalus u\u017Erakinimo laikas +max-wait.tooltip=Maksimalus laikas, kuomet naudotojo paskyra yra u\u017Erakinama po nes\u0117kming\u0173 bandym\u0173 prisijungti. +failure-reset-time=Pamir\u0161ti nepavykusius prisijungimus po +failure-reset-time.tooltip=Laikas, po kurio nepavyk\u0119 prisijungimai bus pamir\u0161ti +realm-tab-login=Prisijungimas +realm-tab-keys=Raktai +realm-tab-email=El. pa\u0161tas +realm-tab-themes=Temos +realm-tab-cache=Pod\u0117lis +realm-tab-tokens=Raktai +realm-tab-client-registration=Klient\u0173 registracija +realm-tab-security-defenses=Saugos priemon\u0117s +realm-tab-general=Bendra informacija +add-realm=Prid\u0117ti srit\u012F + +#Session settings +realm-sessions=Srities sesijos +revocation=At\u0161aukimai +logout-all=Atjungti visus +active-sessions=Aktyvios sesijos +sessions=Sesijos +not-before=Ne anks\u010Diau +not-before.tooltip=At\u0161aukti visus raktus i\u0161duotus prie\u0161 nurodyt\u0105 dat\u0105. +set-to-now=Parinkti dabartin\u0119 dat\u0105 +push=Informuoti apie at\u0161aukim\u0105 +push.tooltip=Visus klientus, kurie turi administravimo URL, informuoti apie nauj\u0105 rakt\u0173 at\u0161aukimo taisykl\u0119. + +#Protocol Mapper +usermodel.prop.label=Atributas +usermodel.prop.tooltip=S\u0105sajos UserModel atributo metodo pavadinimas. Pavyzd\u017Eiui reik\u0161m\u0117 'email' atitinka UserMode.getEmail() metod\u0105. +usermodel.attr.label=Naudotojo atributas +usermodel.attr.tooltip=I\u0161saugoto naudotojo atributo pavadinimas kuris naudojamas UserModel.attribute rinkinyje. +userSession.modelNote.label=Naudotojo sesijos pastaba +userSession.modelNote.tooltip=I\u0161saugotos naudotojo sesijos pastaba, kuri saugoma UserSessionModel.note rinkinyje. +multivalued.label=Daugiareik\u0161mis +multivalued.tooltip=Nurodo, kad atributas gali tur\u0117ti daugiau nei vien\u0105 reik\u0161m\u0119. Jei pa\u017Eym\u0117tas, tuomet visos reik\u0161m\u0117s nustatomos kaip privalomos. Kitu atveju privaloma tik pirmoji reik\u0161m\u0117. +selectRole.label=Parinkite rol\u0119 +selectRole.tooltip=Kair\u0117je pus\u0117je esan\u010Diame laukelyje \u012Fveskite rol\u0117s pavadinim\u0105 arba paspauskite Rinktis nor\u0117dami nurodyti pageidaujam\u0105 rol\u0119. +tokenClaimName.label=Reikalaujamo rakto pavadinimas +tokenClaimName.tooltip=\u012E rakt\u0105 \u012Fterpiamas privalomas atributas. Galite nurodyte piln\u0105 keli\u0105 iki atributo, pavyzd\u017Eiui 'address.street'. Pateiktu atveju bus sukuriamas sud\u0117tinis (nested) JSON objektas. +jsonType.label=Privalomo atributo JSON tipas +jsonType.tooltip=Naudojamas JSON lauko tipas, kuris turi b\u016Bti u\u017Epildomas rakto privalomoje JSON informacijoje. Galimi tipai: long, int, boolean ir String. +includeInIdToken.label=Prid\u0117ti prie ID rakto +includeInIdToken.tooltip=Ar privaloma informacija turi b\u016Bti pridedama prie ID rakto? +includeInAccessToken.label=Prid\u0117ti prie prieigos rakto +includeInAccessToken.tooltip=Ar privaloma informacija turi b\u016Bti pridedama prie prieigos rakto? +includeInUserInfo.label=Prid\u0117ti prie naudotojo informacijos +includeInUserInfo.tooltip=Ar privaloma informacija turi b\u016Bti pridedama prie naudotojo informacijos? +usermodel.clientRoleMapping.clientId.label=Kliento ID +usermodel.clientRoleMapping.clientId.tooltip=Kliento ID naudojamas roli\u0173 atribut\u0173 susiejime +usermodel.clientRoleMapping.rolePrefix.label=Kliento rol\u0117s prefiksas +usermodel.clientRoleMapping.rolePrefix.tooltip=Prefiksas, pridedamas prie\u0161 kiekvien\u0105 kliento rol\u0119 (neprivalomas) +usermodel.realmRoleMapping.rolePrefix.label=Srities rol\u0117s prefiksas +usermodel.realmRoleMapping.rolePrefix.tooltip=Prefiksas, pridedamas prie\u0161 kiekvien\u0105 srities rol\u0119 (neprivalomas) +sectorIdentifierUri.label=Sektoriaus identifikatoriaus URI +sectorIdentifierUri.tooltip=Paslaug\u0173 teik\u0117jai, kurie naudoja porines subreik\u0161mes ir palaiko dinamin\u0119 klient\u0173 registracij\u0105 (Dynamic Client Registration) tur\u0117t\u0173 naudoti sector_identifier_uri parametr\u0105. Teikiamas funkcionalumas leid\u017Eia svetaini\u0173 grup\u0117ms, valdomoms centralizuotos administravimo panel\u0117s, tur\u0117ti pastovias porines subreik\u0161mes nepriklausomas nuo domeno vard\u0173. Tokiu b\u016Bdu klientai gali keisti domen\u0173 redirect_uri neperregistruojant vis\u0173 naudotoj\u0173. +pairwiseSubAlgorithmSalt.label=Druska +pairwiseSubAlgorithmSalt.tooltip=Druska naudojama porinio objekto identifikatoriaus skai\u010Diavimo metu. Jei paliekama tu\u0161\u010Dia reik\u0161m\u0117, tuomet druskos reik\u0161m\u0117 bus automatik\u0161ai sugeneruota. + +# client details +clients.tooltip=Klientai - tai srities nar\u0161ykl\u0117s program\u0117l\u0117s arba tinklin\u0117s paslaugos, kuriomis pasitikima. Klientai gali jungtis prie sistemos. Klientams galima nurodyti specifines roles. +search.placeholder=Ie\u0161koti... +create=Sukurti +import=Importuoti +client-id=Kliento ID +base-url=Pagrindinis URL +actions=Veiksmai +not-defined=Nenurodyta +edit=Redaguoti +delete=Trinti +no-results=Rezultat\u0173 n\u0117ra +no-clients-available=N\u0117ra sukonfig\u016Bruot\u0173 klient\u0173 +add-client=Prid\u0117ti klient\u0105 +select-file=Parinkti rinkmen\u0105 +view-details=Per\u017Ei\u016Br\u0117ti detaliau +clear-import=I\u0161valyti importuojamas rinkmenas +client-id.tooltip=Identifikatorius, naudojamas URI adresuose ir prieigos raktuose. Pavyzd\u017Eiui 'my-client'. SAML protokolo atveju, \u0161i\u0105 reik\u0161m\u0119 tikimasi gauti kaip authn u\u017Eklausos siunt\u0117j\u0105 +client.name.tooltip=Reik\u0161m\u0117, kuri rodoma naudotojams. Pavyzd\u017Eiui 'My Client'. Galimos lokalizuotos reik\u0161m\u0117s - pavyzd\u017Eiui\: ${my_client} +client.enabled.tooltip=Klientai, kurie n\u0117ra \u012Fgalinti, negali inicijuoti prisijungimo arba gauti prieigos raktus. +consent-required=Reikalingas patvirtinimas +consent-required.tooltip=Jei \u012Fgalinta, tuomet naudotojai privalo patvirtinti, kad pageidauja prisijungti prie kliento (programos). +client-protocol=Kliento protokolas +client-protocol.tooltip='OpenID connect' leid\u017Eia klientams tikrinti galutinio naudotojo tapatyb\u0119 remiantis autorizacijos serverio atlikta autentifikacija. 'SAML' \u012Fgalina \u017Einiatinklio, \u012Fskaitant skirting\u0173 domen\u0173 atvejus, vieningos autentifikacijos ir autorizacijos scenarijus perduodant informacij\u0105 saugiose \u017Einut\u0117se. +access-type=Prieigos tipas +access-type.tooltip='Konfidencialus' klientai nor\u0117dami inicijuoti prisijungimo protokol\u0105 privalo perduoti slapt\u0105 kod\u0105. 'Vie\u0161as' klientai neprivalo perduoti slapto kodo. 'Tik ne\u0161\u0117jas' klientai - tai tinklin\u0117s paslaugos, kurios niekada neinicijuoja prisijungimo. +standard-flow-enabled=\u012Egalinta standartin\u0117 seka +standard-flow-enabled.tooltip=\u012Egalina standartin\u012F OpenID Connect nukreipim\u0105, kuomet autentifikacijos metu yra perduodamas autorizacijos kodas. OpenID Connect arba OAuth2 specifikacijos terminais tai rei\u0161kia 'Authorization Code Flow' \u012Fgalinim\u0105 \u0161iam klientui. +implicit-flow-enabled=\u012Egalinta i\u0161reik\u0161tin\u0117 seka +implicit-flow-enabled.tooltip=\u012Egalina OpenID Connect nukreipim\u0105, kuomet autentifikacijos metu n\u0117ra perduodamas autorizacijos kodas. OpenID Connect arba OAuth2 specifikacijos terminais tai rei\u0161kia 'Implicit Flow' \u012Fgalinim\u0105 \u0161iam klientui. +direct-access-grants-enabled=\u012Egalintas tiesiogin\u0117s prieigos suteikimas +direct-access-grants-enabled.tooltip=\u012Egalina tiesiogin\u012F prieigos suteikim\u0105, kuomet klientas turi prieig\u0105 prie naudotojo vardo ir slapta\u017Eod\u017Eio ir prieigos rakt\u0173 gavimui \u0161iais duomenimis gali tiesiogiai apsikeisti su Keycloak serveriu. OAuth2 specifikacijos terminais, \u0161iam klientui \u012Fgalinimas 'Resource Owner Password Credentials Grant'. +service-accounts-enabled=\u012Egalintas paslaugos naudotojas +service-accounts-enabled.tooltip=\u012Egalina klient\u0105 autentifikuotis su Keycloak serveriu ir gauti dedikuot\u0105 prieigos rakt\u0105 skirt\u0105 \u0161iam klientui. OAuth2 specifikacijos terminais, tai rei\u0161kia 'Client Credentials Grant' teis\u0119 \u0161iam klientui. +include-authnstatement=\u012Etraukti AuthnStatement +include-authnstatement.tooltip=Ar prisijungimo b\u016Bdas ir laikas \u0161ur\u0117t\u0173 b\u016Bti \u012Ftraukiami \u012F prisijungimo operacijos atsakym\u0105? +sign-documents=Pasira\u0161yti dokumentus +sign-documents.tooltip=Ar SAML dokumentai turi b\u016Bt\u012F pasira\u0161omi \u0161ios srities? +sign-documents-redirect-enable-key-info-ext=Optimizuoti REDIRECT pasira\u0161ymo rakto paie\u0161k\u0105 +sign-documents-redirect-enable-key-info-ext.tooltip=Ar privalo b\u016Bti itrauktas pasira\u0161ymo rakto ID \u012F SAML protokolo \u017Einut\u0117s element\u0105 kuomet pasira\u0161omi Keycloak REDIRECT SP s\u0105sajos dokumentai? Tokiu b\u016Bdu tikrinan\u010Dioji pus\u0117 optimizuoja tikrinimo proce\u0105 naudodama tik vien\u0105 rakt\u0105 vietoj to, kad bandyt\u0173 vis\u0173 rakt\u0173 kombinacijas. +sign-assertions=Pasira\u0161yti sprendinius +sign-assertions.tooltip=Ar SAML sprendiniai SAML dokumentuose turi b\u016Bti pasira\u0161omi? \u0160is nustatymas neb\u016Btinas, kuomet naudojamas viso dokumento pasira\u0161ymas. +signature-algorithm=Para\u0161o algoritmas +signature-algorithm.tooltip=Para\u0161o algoritmas naudojamas dokument\u0173 pasira\u0161ymui. +canonicalization-method=Standartizavimo metodas +canonicalization-method.tooltip=XML para\u0161o metodas. +encrypt-assertions=U\u017Ekoduoti sprendinius +encrypt-assertions.tooltip=Ar SAML sprendiniai turi b\u016Bti u\u017Ekoduojami kliento vie\u0161uoju raktu naudojant AES? +client-signature-required=Privalomas kliento para\u0161as +client-signature-required.tooltip=Ar kliento siun\u010Diamos SAML u\u017Eklausos ir atsakymai bus pasira\u0161yti? Jei taip, tuomet ar juos privaloma tikrinti? +force-post-binding=Priverstinai naudoti POST s\u0105ry\u0161\u012F +force-post-binding.tooltip=Visuomet naudoti POST s\u0105ry\u0161\u012F siun\u010Diant atsakymus. +front-channel-logout=I\u0161registravimas per nar\u0161ykl\u0119 +front-channel-logout.tooltip=Jei \u012Fgalinta, tuomet atsijungimas atliekamas nar\u0161ykl\u0117s nukreipimu \u012F kliento puslap\u012F. Kitu atveju, atsijungimas atliekamas perduodant serveris-serveris u\u017Eklaus\u0105. +force-name-id-format=Priverstinai naudoti NameID format\u0105 +force-name-id-format.tooltip=Ignoruoti NameID tapatyb\u0117s identifikatoriaus format\u0105, naudojant administratoriaus konsol\u0117je nurodyt\u0105 format\u0105. +name-id-format=NameID formatas +name-id-format.tooltip=Koks tapatyb\u0117s identifikatoriaus formatas turi b\u016Bti naudojamas. +root-url=\u0160akninis URL +root-url.tooltip=Prie reliatyvi\u0173 nuorod\u0173 pridedamas \u0161akninis URL +valid-redirect-uris=Leid\u017Eiamos nukreipimo nuorodos +valid-redirect-uris.tooltip=Nukreipimo URI \u0161ablonas, kuomet nar\u0161yklei leid\u017Eiama nukreipti naudotoj\u0105 po s\u0117kmingos autentifikacijos ar atsijungimo metu. Leid\u017Eiami pakaitos simboliai, pvz. 'http://pavyzdys.lt/*'. Leid\u017Eiami reliatyv\u016Bs keliai pvz. /mano/reliatyvus/kelias/*. Reliatyvumas skai\u010Diuojamas nuo kliento \u0161akninio URL (jei nurodyta) arba nuo autentifikacijos serverio \u0161akninio adreso. SAML atveju, kuomet tikimasi gav\u0117jo paslaugos URL \u012Ftraukimo \u012F prisijungimo u\u017Eklaus\u0105, privaloma nurodyti teisingus URI \u0161ablonus. +base-url.tooltip=Numatytas URL, kuris turi b\u016Bti naudojamas naudotojo nukreipimui atgal \u012F klient\u0105. +admin-url=Administravimo URL +admin-url.tooltip=Kliento administravimo tinklin\u0117s s\u0105sajos URL. \u012Era\u0161yti tuomet, kai klientas palaiko adapterio REST API. \u0160is REST API leid\u017Eia autentifikacijos serveriui perduoti at\u0161aukimo ir kitas su administravimu susijusias taisykles. Da\u017Eniausiai \u0161is URL sutampa su kliento pagrindiniu URL. +master-saml-processing-url=\u0160akninis SAML apdorojimo URL +master-saml-processing-url.tooltip=Kuomet sukonfig\u016Bruotas, \u0161is URL bus naudojamas visoms, 'SP's Assertion Consumer' ir 'Single Logout Services' u\u017Eklausoms. Detalioje SAML prieigos adres\u0173 konfig\u016Bravimo skyriuje \u0161ios reik\u0161m\u0117s gali b\u016Bti atskirai pakeistos. +idp-sso-url-ref=IDP inicijuojamo SSO URL fragmento pavadinimas +idp-sso-url-ref.tooltip=Pavadinimas, kuris IDP inicijuoto SSO prisijungimo metu, perduodamas klientui per URL fragment\u0105. Palikus tu\u0161\u010Di\u0105 reik\u0161m\u0119 IDP inicjuojam\u0105 SSO prisijungimo funkcionalumas i\u0161jungiamas. \u0160is fragmentas buv naudojamas formuojant \u0161i\u0105 nuorod\u0105: {server-root}/realms/{realm}/protocol/saml/clients/{client-url-name} +idp-sso-relay-state=IDP inicijuotos SSO b\u016Bsenos perdavimas +idp-sso-relay-state.tooltip=SSO b\u016Bsenos parametro (RelayState) perdavimas kartu su IDP inicijuota SSO SAML u\u017Eklausa. +web-origins=\u0160aknin\u0117s nuorodos +web-origins.tooltip=Leid\u017Eiamos CORS nuorodos. Nor\u0117dami leisti nukreipim\u0105 \u012F teisingas nuorodas, naudokite '+'. Nor\u0117dami leisti visas nuorodas, naudokite '*'. +fine-oidc-endpoint-conf=Detalioji OpenID prisijungimo konfig\u016Bracija +fine-oidc-endpoint-conf.tooltip=Nor\u0117dami konfig\u016Bruoti kliento s\u0105sajos su OpenID prisijungimo protokolu i\u0161pl\u0117stines nuostatas, i\u0161skleiskite \u0161\u012F skyri\u0173. +user-info-signed-response-alg=Naudotojo informacijos pasira\u0161yto atsako algoritmas +user-info-signed-response-alg.tooltip=JWA algoritmas naudojamas pasira\u0161yti naudotojo informacijos prieigos ta\u0161ko atsak\u0105. Jei nustatyta 'unsigned', tuomet naudotojo informacijos atsakas nebus pasira\u0161ytas ir bus gr\u0105\u017Eintas application/json formatu. +request-object-signature-alg=U\u017Eklausos objekto para\u0161o algoritmas +request-object-signature-alg.tooltip=JWA algoritmas, kur\u012F klientas naudoja siun\u010Diant OIDC u\u017Eklausos objekt\u0105, nusakyt\u0105 'request' arba 'request_uri' parameterais. Jei nustatyta 'any', tuomet u\u017Eklausos objektas gali b\u016Bti nepasira\u0161ytas arba pasira\u0161ytas bet kuriuo algoritmu. +fine-saml-endpoint-conf=Detalioji SAML prieigos ta\u0161k\u0173 konfig\u016Bracija +fine-saml-endpoint-conf.tooltip=Nor\u0117dami konfig\u016Bruoti sprendini\u0173 pri\u0117mimo ir vieningo atsijungimo paslaugas, i\u0161skleiskite \u0161\u012F skyri\u0173. +assertion-consumer-post-binding-url=Sprendini\u0173 naudotojo paslaugos POST jungties URL +assertion-consumer-post-binding-url.tooltip=Kliento sprendini\u0173 pri\u0117mimo paslaugos (prisijungimo rezultat\u0173) SAML POST jungties URL. Jei toki\u0173 jung\u010Di\u0173 neturite, tuomet palikite tu\u0161\u010Dias reik\u0161mes. +assertion-consumer-redirect-binding-url=Sprendini\u0173 pri\u0117mimo paslaugos nukreipimo jungties URL +assertion-consumer-redirect-binding-url.tooltip=Kliento sprendinio pri\u0117mimo paslaugos SAML nukreipimo jungties URL (prisijungimo atsakymams). Jei toki\u0173 jung\u010Di\u0173 neturite, tuomet palikite tu\u0161\u010Dias reik\u0161mes. +logout-service-binding-post-url=Atsijungimo paslaugos POST jungties URL +logout-service-binding-post-url.tooltip=Kliento vieningo atsijungimo SAML POST jungties URL. Jei naudojate kitas jungtis, tuomet \u0161ias reik\u0161mes galite palikti neu\u017Epildytas. +logout-service-redir-binding-url=Atsijungimo paslaugos nukreipimo jungties URL +logout-service-redir-binding-url.tooltip=Kliento vieningo atsijungimo paslaugos SAML nukreipimo jungties. Jei naudojate kitas jungtis, tuomet \u0161ias reik\u0161mes galite palikti neu\u017Epildytas. + +# client import +import-client=\u012Ediegti programos nustatymus +format-option=Formato pasirinkimas +select-format=Pasirinkite format\u0105 +import-file=Importuoti rinkmen\u0105 + +# client tabs +settings=Nustatymai +credentials=Prisijungimo duomenys +saml-keys=SAML raktai +roles=Rol\u0117s +mappers=Atribut\u0173 atitikmenys +mappers.tooltip=Protokolo atribut\u0173 susiejimas atlieka rakt\u0173 ir dokument\u0173 transformacijas. Naudotojo duomenys gali b\u016Bti ver\u010Diami \u012F protokolo teiginius, arba tiesiog transformuoti bet kurias u\u017Eklausas perduodamas tarp kliento ir autentifikacijos serverio. +scope=Apimtis +scope.tooltip=Apimties atitikmen\u0173 parinkimas leid\u017Eia apriboti, kurios naudotojo rol\u0117s kartu su raktu bus perduodamos klientui. +sessions.tooltip=Per\u017Ei\u016Br\u0117ti \u0161io kliento aktyvias sesijas. Matysite \u0161iuo metu prisijungusius naudotojus bei j\u0173 prisijungimo laikus. +offline-access=Darbas neprisijungus +offline-access.tooltip=Per\u017Ei\u016Br\u0117ti \u0161io kliento darbo neprisijungus r\u0117\u017Eimo aktyvias sesijas. Matysite naudotojus, kuriems yra i\u0161duoti darbo neprisijungus raktai bei j\u0173 i\u0161davimo laikus. Nor\u0117dami at\u0161aukti visus \u0161iam klientui i\u0161duotus raktus, eikite \u012F at\u0161aukim\u0173 kortel\u0119 ir pasirinkite 'Parinkti dabartin\u0119 dat\u0105' +clustering=Klasteriai +installation=Diegimas +installation.tooltip=Klient\u0173 konfig\u016Bravimo pagalbin\u0117 priemon\u0117, padedanti sugeneruoti klient\u0173 adapteri\u0173 konfig\u016Bracijas, kurias galima atsisi\u0173sti, kopijuoti ar \u012Fkelti i\u0161 i\u0161karpin\u0117s +service-account-roles=Paslaugos paskyros rol\u0117s +service-account-roles.tooltip=Dedikuot\u0173 roli\u0173 priskyrimas \u0161ios paslaugos naudotojui + +# client credentials +client-authenticator=Kliento autentifikavimo priemon\u0117s +client-authenticator.tooltip=Kliento autentifikavimo priemon\u0117s naudojamos kliento autentifikavimuisi \u012F Keycloak server\u012F +certificate.tooltip=Kliento sertifikatas naudojamas kliento i\u0161duot\u0173 ir priva\u010Diu raktu pasira\u0161yt\u0173 JWT prieigos rakt\u0173 tikrinimui. +publicKey.tooltip=Kliento i\u0161duotas vie\u0161asis raktas pasira\u0161ytas kliento priva\u010Diu raktu ir skirtas JWT tikrinimui. +no-client-certificate-configured=Nesukonfig\u016Bruotas nei vienas kliento sertifikatas +gen-new-keys-and-cert=Nauj\u0173 rakt\u0173 ir sertifikat\u0173 generavimas +import-certificate=Importuoti sertifikat\u0105 +gen-client-private-key=Generuoti kliento privat\u0173 rakt\u0105 +generate-private-key=Generuoti privat\u0173 rakt\u0105 +kid=Kid +kid.tooltip=Kliento vie\u0161ojo rakto identifikatorius (Key ID) importuotas i\u0161 JWKS. +use-jwks-url=Naudoti JWKS URL +use-jwks-url.tooltip=Jei \u012Fgalinta, tuomet kliento vie\u0161asis raktas atsiun\u010Diamas i\u0161 pateiktos JWKS URL. \u012Egalinimas suteikia lankstumo, nes klientui pergeneravus raktus jie automati\u0161kai atsiun\u010Diami. Jei \u0161i nuostata i\u0161jungta, tuomet naudojamas Keycloak DB saugomas vie\u0161asis raktas (arba sertifikatas) ir klientui sugeneravus naujus raktus juos rankiniu b\u016Bdu reik\u0117s importuoti \u012F Keycloak DB. +jwks-url=JWKS URL +jwks-url.tooltip=URL, kuriuo pasiekiami kliento JWK formatu saugomi raktai. \u017Di\u016Br\u0117kite JWK specifikacij\u0105 detalesnei informacijai. Jei naudojamas kliento adapteris su "jwt" kredencialais, tuomet galite naudoti j\u016Bs\u0173 programos URL su '/k_jwks' sufiksu. Pavyzd\u017Eiui 'http://www.myhost.com/myapp/k_jwks' . +archive-format=Archyvo formatas +archive-format.tooltip=Java rakt\u0173 saugykla (keystore) arba PKCS12 formato rinkmena. +key-alias=Rakto pseudonimas +key-alias.tooltip=Privataus rakto ir sertifikato rinkmenos pseudonimas. +key-password=Rakto slapta\u017Eodis +key-password.tooltip=Slapta\u017Eod\u017Ei\u0173 saugykloje esan\u010Dio privataus rakto slapta\u017Eodis +store-password=Saugyklos slapta\u017Eodis +store-password.tooltip=Slapta\u017Eodis, reikalingas norint atidaryti slapta\u017Eod\u017Ei\u0173 saugykl\u0105 +generate-and-download=Generuoti ir atsisi\u0173sti +client-certificate-import=Kliento sertifikato importavimas +import-client-certificate=Importuoti kliento sertifikatus +jwt-import.key-alias.tooltip=Slapta\u017Eod\u017Ei\u0173 saugyklos pseudonimas +secret=Slaptas kodas +regenerate-secret=Pergeneruoti slapt\u0105 kod\u0105 +registrationAccessToken=Registracijos prieigos raktas +registrationAccessToken.regenerate=Pergeneruoti registracijos prieigos rakt\u0105 +registrationAccessToken.tooltip=Registracijos prieigos raktas klientams suteikia prieig\u0105 prie klient\u0173 registracijos paslaugos +add-role=Prid\u0117ti rol\u0119 +role-name=Rol\u0117s pavadinimas +composite=Sud\u0117tinis +description=Apra\u0161ymas +no-client-roles-available=Kliento rol\u0117s nesukonfig\u016Bruotos +scope-param-required=Privalomas taikymo srities parametras +scope-param-required.tooltip=\u0160i rol\u0117 suteikiama tik tuo atveju, kai taikymo srities parametras su rol\u0117s vardu panaudotas autorizacijos u\u017Eklausoje ar rakte. +composite-roles=Sud\u0117tin\u0117s rol\u0117s +composite-roles.tooltip=Visos susietos rol\u0117s bus automati\u0161kai priskiriamos naudotojui prisikiriant \u0161i\u0105 sud\u0117tin\u0119 rol\u0119. +realm-roles=Srities rol\u0117s +available-roles=Galimos rol\u0117s +add-selected=Prid\u0117ti pa\u017Eym\u0117tas +associated-roles=Priskirtos rol\u0117s +composite.associated-realm-roles.tooltip=Srities apmities rol\u0117s susietos su \u0161ia sud\u0117tine role. +composite.available-realm-roles.tooltip=Srities apmities rol\u0117s, kurias galima susieti su \u0161ia sud\u0117tine role. +remove-selected=Pa\u0161alinti pa\u017Eym\u0117tas +client-roles=Kliento rol\u0117s +select-client-to-view-roles=Nor\u0117dami pamatyti priskirtas roles pa\u017Eym\u0117kite klient\u0105 +available-roles.tooltip=\u0160io kliento rol\u0117s, kurios gali b\u016Bti priskiritos \u0161iai kompozicinei rolei. +client.associated-roles.tooltip=Su \u0161iuo klientu susietos sud\u0117tin\u0117s rol\u0117s. +add-builtin=Prid\u0117ti numatytuosius +category=Kategorija +type=Tipas +no-mappers-available=N\u0117ra susiet\u0173 atribut\u0173 +add-builtin-protocol-mappers=Prid\u0117ti numatytuosius protokolo atribut\u0173 susiejimus +add-builtin-protocol-mapper=Prid\u0117ti numatytuosius protokolo atribut\u0173 susiejimus +scope-mappings=atribut\u0173 susiejimo taikymo sritis +full-scope-allowed=Taikymas pilna apimtimi +full-scope-allowed.tooltip=\u012Egalinimo atveju visi apribojimai i\u0161jungiami +scope.available-roles.tooltip=Srities lygio rol\u0117s, kurios gali b\u016Bti priskiriamos \u0161iai taikymo sri\u010Diai. +assigned-roles=Priskirtos rol\u0117s +assigned-roles.tooltip=Srities lygio rol\u0117s, kurios yra priskirtos \u0161iai taikymo sri\u010Diai. +effective-roles=Aktyvios rol\u0117s +realm.effective-roles.tooltip=Priskirtos srities lygio rol\u0117s, kurios gali gali b\u016Bti paveld\u0117tos i\u0161 sud\u0117tini\u0173 roli\u0173. +select-client-roles.tooltip=Nor\u0117dami pamatyti visas roles pa\u017Eym\u0117kite klient\u0105 +assign.available-roles.tooltip=Kliento rol\u0117s, kurias galima priskirti. +client.assigned-roles.tooltip=Priskirtos kliento rol\u0117s. +client.effective-roles.tooltip=Priskirtos kliento rol\u0117s, kurios gali gali b\u016Bti paveld\u0117tos i\u0161 sud\u0117tini\u0173 roli\u0173. +basic-configuration=Pagrindin\u0117 konfig\u016Bracija +node-reregistration-timeout=Mazgo persiregistravimui skirtas laikas +node-reregistration-timeout.tooltip=Nurodykite maksimal\u0173 laiko interval\u0105, per kur\u012F mazgai privalo i\u0161 naujo prisiregistruoti. Jei mazgas neatsi\u0173s persiregistravimo u\u017Eklausos per nurodyt\u0105 laik\u0105, tuomet \u0161is mazgas bus i\u0161registruojamas i\u0161 Keycloak +registered-cluster-nodes=Registruoti klasterio mazgus +register-node-manually=Registruoti mazg\u0105 rankiniu b\u016Bdu +test-cluster-availability=Tikrinti ar mazgas prieinamas +last-registration=V\u0117liausia registracija +node-host=Mazgo serveris +no-registered-cluster-nodes=Nepriregistuotas nei vienas klasterio mazgas +cluster-nodes=Klasterio mazgai +add-node=Prid\u0117ti mazg\u0105 +active-sessions.tooltip=\u0160io kliento aktyvi\u0173 naudotoj\u0173 sesij\u0173 skai\u010Dius. +show-sessions=Rodyti sesijas +show-sessions.tooltip=D\u0117mesio, \u0161is veiksmas gali ilgai u\u017Etrukti priklausomai nuo aktyvi\u0173 sesij\u0173 skai\u010Diaus. +user=Naudotojas +from-ip=Prisijungimo IP +session-start=Sesijos prad\u017Eios laikas +first-page=Pirmas puslapis +previous-page=Atgalinis puslapis +next-page=Sekantis puslapis +client-revoke.not-before.tooltip=At\u0161aukti visus \u0161io kliento raktus i\u0161duotus prie\u0161 nurodyt\u0105 dat\u0105. +client-revoke.push.tooltip=Kuomet nurodytas administravimo URL, taisykl\u0117 perduodama klientui. +select-a-format=Formato parinkimas +download=Atsisi\u0173sti +offline-tokens=Darbo neprisijungus raktai +offline-tokens.tooltip=Rakt\u0173 skai\u010Dius, kurie naudojami darbui neprisijungus +show-offline-tokens=Rodyti raktus +show-offline-tokens.tooltip=D\u0117mesio, \u0161is veiksmas gali ilgai u\u017Etrukti priklausomai nuo aktyvi\u0173 darbo neprisijungus sesij\u0173 skai\u010Diaus. +token-issued=Rakto i\u0161davimo laikas +last-access=V\u0117liausios prieigos laikas +last-refresh=V\u0117liausio atnaujinimo laikas +key-export=Eksportuoti rakt\u0105 +key-import=Importuoti rakt\u0105 +export-saml-key=Eksportuoti SAML rakt\u0105 +import-saml-key=Importuoti SAML rakt\u0105 +realm-certificate-alias=Srities sertifikato pseudonimas +realm-certificate-alias.tooltip=Srities sertifikato, kuris taip pat saugomas saugykloje, pseudonimas. +signing-key=Pasira\u0161ymo raktas +saml-signing-key=SAML pasira\u0161ymo raktas. +private-key=Privatus raktas +generate-new-keys=Generuoti naujus raktus +export=Eksportuoti +encryption-key=U\u017Ekodavimo raktas +saml-encryption-key.tooltip=SAML u\u017Ekodavimo raktas. +service-accounts=Paslaugos naudotojo profiliai +service-account.available-roles.tooltip=\u0160ios paslaugos paskyrai galimos priskirti srities rol\u0117s +service-account.assigned-roles.tooltip=Paslaugos paskyrai priskirtos srities rol\u0117s. +service-account-is-not-enabled-for=Kliento {{client}} paslaugos paskyra ne\u012Fgalinta +create-protocol-mappers=Protokolo atitkmen\u0173 susiejimas +create-protocol-mapper=Protokolo atitkmenens susiejimas +protocol=Protokolas +protocol.tooltip=Protokolas... +id=ID +mapper.name.tooltip=Atitikmens susiejimo vardas. +mapper.consent-required.tooltip=Ar teikiant laikin\u0105 prieig\u0105 naudotojas privalo pateikti sutikim\u0105 d\u0117l duomen\u0173 perdavimo? +consent-text=Sutikimo tekstas +consent-text.tooltip=Tekstas, kuris rodomas naudotojo sutikimo puslapyje. +mapper-type=Atitikmens tipas +mapper-type.tooltip=Atitikmens tipas +# realm identity providers +identity-providers=Tapatyb\u0117s teik\u0117jai +table-of-identity-providers=Tapatyb\u0117s teik\u0117j\u0173 s\u0105ra\u0161as +add-provider.placeholder=Prid\u0117ti teik\u0117j\u0105... +provider=Teik\u0117jas +gui-order=GUI eili\u0161kumas +first-broker-login-flow=Pirmojo prisijungimo eiga +post-broker-login-flow=Sekan\u010Di\u0173 prisijungim\u0173 eiga +redirect-uri=Nukreipimo URI +redirect-uri.tooltip=Tapatyb\u0117s teik\u0117jo konfig\u016Bravimo nuoroda. +alias=Pseudonimas +display-name=Rodomas vardas +identity-provider.alias.tooltip=Pseudonimas, kuris vienareik\u0161mi\u0161kai identifikuoja tapatyb\u0117s teik\u0117j\u0105 ir yra naudojamas konstruojant nukreipimo nuorod\u0105. +identity-provider.display-name.tooltip=\u017Dmogui suprantamas, draugi\u0161kas tapatyb\u0117s teik\u0117jo pavadinimas. +identity-provider.enabled.tooltip=\u012Egalinti \u0161\u012F tapatyb\u0117s teik\u0117j\u0105. +authenticate-by-default=Autentifikuoti i\u0161 karto +identity-provider.authenticate-by-default.tooltip=Jei \u012Fgalinta, tuomet bus bandoma autentifikuoti naudotoj\u0105 prie\u0161 parodant prisijungimo lang\u0105. +store-tokens=Saugoti raktus +identity-provider.store-tokens.tooltip=Jei \u012Fgalinta, tuomet po naudotoj\u0173 prisijungimo, prieigos raktai bus i\u0161saugoti. +stored-tokens-readable=Saugoti raktus skaitomame formate +identity-provider.stored-tokens-readable.tooltip=Jei \u012Fgalinta, tuomet naudotojai gali per\u017Ei\u016Br\u0117ti i\u0161saugotus prieigos raktus. \u012Egalinama broker.read-token rol\u0117. +disableUserInfo=U\u017Edrausti naudotojo informacijos prieig\u0105 +identity-provider.disableUserInfo.tooltip=Ar u\u017Edrausti prieig\u0105 prie papildomos naudotojo profilio informacijos per User Info paslaug\u0105? Numatyta reik\u0161m\u0117 - naudoti \u0161i\u0105 OIDC paslaug\u0105. +userIp=Naudoti userIp parametr\u0105 +identity-provider.google-userIp.tooltip=Ar kvie\u010Diant Google naudotojo informacijos paslaug\u0105 naudoti 'userIp' u\u017Eklausos parametr\u0105? Nusta\u010Dius bus naudojamas naudotojo IP adresas. Nustatymas naudingas tuo atveju, jei Google ribot\u0173 u\u017Eklaus\u0173 kiek\u0161 i\u0161 vieno IP adreso. +update-profile-on-first-login=Profilio duomen\u0173 atnaujinimas pirmojo prisijungimo metu +on=On +off=Off +on-missing-info=Kuomet tr\u016Bksta informacijos +update-profile-on-first-login.tooltip=Nurodykite s\u0105lygas, kuomet naudotojas privalo atnaujinti savo profil\u012F pirmojo prisijungimo metu. +trust-email=El. pa\u0161tas patikimas +trust-email.tooltip=Jei \u012Fgalintas, tuomet \u0161io tapatyb\u0117s teik\u0117jo pateiktas el. pa\u0161to adresas laikomas patikimu ir, nepaisant bendr\u0173j\u0173 srities nustatym\u0173, n\u0117ra papildomai tikrinamas. +gui-order.tooltip=Eili\u0161kum\u0105 GUI lange (pvz. Prisijungimo langas) nurodantis skai\u010Dius +first-broker-login-flow.tooltip=Autentifikacijos eigos pseudonimas, kuris bus su\u017Eadintas \u0161io tapatyb\u0117s teik\u0117jo naudotojui prisijungus pirm\u0105 kart\u0105. Terminas 'pirmas kartas' rei\u0161kia, kad Keycloak sistemoje nebuvo saugomas naudotojo profilis susietas su autentifikuotu \u0161io tapatyb\u0117s teik\u0117jo naudotoju. +post-broker-login-flow.tooltip=Autentifikacijos eigos pseudonimas, kuris bus su\u017Eadintas po kiekvieno prisijungimo naudojant \u0161\u012F tapatyb\u0117s teik\u0117j\u0105. Naudingas tuomet, kai atlikti papildomus tikrinimus (pvz. OTP). Palikite tu\u0161\u010Di\u0105 reik\u0161m\u0119 jei nenorite su\u017Eadinti papildom\u0173 tikrinim\u0173 autentifikatoriumi jungiantis per \u0161\u012F tapatyb\u0117s teik\u0117j\u0105. Tur\u0117kite omenyje, kad autentifikatoriaus realizacijos turi daryti prielaid\u0105, kad ClientSession naudotojas yra tapatyb\u0117s teik\u0117jo nustatytas. +openid-connect-config=OpenID prisijungimo konfig\u016Bracija +openid-connect-config.tooltip=OIDC SP ir i\u0161orinio IDP konfig\u016Bracija. +authorization-url=Autorizacijos URL +authorization-url.tooltip=Autorizacijos URL adresas. +token-url=Prieigos rakt\u0173 URL +token-url.tooltip=Prieigos rakt\u0173 URL. +logout-url=Atsijungimo URL +identity-provider.logout-url.tooltip=Adresas, kuris turi b\u016Bti naudojamas norint atjungti naudotoj\u0105 nuo i\u0161orinio tapatyb\u0117s teik\u0117jo. +backchannel-logout=Foninis atjungimas +backchannel-logout.tooltip=Ar i\u0161orinis tapatyb\u0117s teik\u0117jas palaiko serveris-serveris naudotojo atjungimo b\u016Bd\u0105? +user-info-url=Naudotojo informacijos URL +user-info-url.tooltip=Naudotojo informacijos URL. Neprivalomas. +identity-provider.client-id.tooltip=Kliento identifikatorius u\u017Eregistruotas tapatyb\u0117s teik\u0117jo sistemoje. +client-secret=Kliento slaptas kodas +show-secret=Rodysi slapt\u0105 kod\u0105 +hide-secret=Sl\u0117pti slapt\u0105 kod\u0105 +client-secret.tooltip=Kliento slaptas kodas u\u017Eregistruotas tapatyb\u0117s teik\u0117jo sistemoje. +issuer=I\u0161dav\u0117jas +issuer.tooltip=I\u0161dav\u0117jo identifikatorius perduodamas i\u0161dav\u0117jo atsakyme. Tikrinimas nebus atliekamas jei reik\u0161m\u0117 tu\u0161\u010Dia. +default-scopes=Numatytosios taikymo sritys +identity-provider.default-scopes.tooltip=Taikymos sritys, kurios siun\u010Diamos autorizavimo u\u017Eklausoje. Reik\u0161m\u0117s turi b\u016Bti atskirtos tarpo simboliu. Numatyta reik\u0161m\u0117 - 'openid'. +prompt=Raginimas +unspecified.option=nenurodyta +none.option=jokio +consent.option=sutikimo tekstas +login.option=prisijungimas +select-account.option=paskyros pasirinkimas +prompt.tooltip=Nurodo, ar autorizacijos serveris galutini\u0173 naudotoj\u0173 reikalauja pakartotinai patvirtinti sutikim\u0105 ar prisijungti. +validate-signatures=Para\u0161o tikrinimas +identity-provider.validate-signatures.tooltip=\u012Egalinamas i\u0161orini\u0173 IDP para\u0161\u0173 tikrinimas. +identity-provider.use-jwks-url.tooltip=Jei \u012Fgalinta, tuomet tapatyb\u0117s teik\u0117jo vie\u0161asis raktas atsiun\u010Diamas i\u0161 pateiktos JWKS URL. \u012Egalinimas suteikia lankstumo, nes tapatyb\u0117s teik\u0117jui pergeneravus raktus jie automati\u0161kai atsiun\u010Diami. Jei \u0161i nuostata i\u0161jungta, tuomet naudojamas Keycloak DB saugomas vie\u0161asis raktas (arba sertifikatas) ir klientui sugeneravus naujus raktus juos rankiniu b\u016Bdu reik\u0117s importuoti \u012F Keycloak DB. +identity-provider.jwks-url.tooltip=URL, kuriuo pasiekiami tapatyb\u0117s teik\u0117jo JWK formatu saugomi raktai. \u017Di\u016Br\u0117kite JWK specifikacij\u0105 detalesnei informacijai. Jei naudojamas i\u0161orinis Keycloak tapatyb\u0117s teik\u0117jas, tuomet galite naudoti 'http://broker-keycloak:8180/auth/realms/test/protocol/openid-connect/certs' URL (pavyzdyje darome prielaida, kad Keycloak veikia 'http://broker-keycloak:8180' adresu ir naudojama 'test' sritis) +validating-public-key=Vie\u0161as raktas para\u0161o tikrinimui +identity-provider.validating-public-key.tooltip=PEM formato vie\u0161asis raktas, kuris turi b\u016Bti naudojamas i\u0161orinio IDP para\u0161t\u0173 tikrinimui. +import-external-idp-config=Importuoti i\u0161orinio IDP konfig\u016Bracij\u0105 +import-external-idp-config.tooltip=Leid\u017Eia \u012Fkelti konfig\u016Bracin\u0119 rinkmen\u0105 arba nurodyti atsisiuntimo URL su i\u0161orinio IDP metaduomenimis. +import-from-url=Importuoti i\u0161 URL +identity-provider.import-from-url.tooltip=Importuoti metaduomenis i\u0161 nutolusio IDP aptikimo apra\u0161o (IDP discovery descriptor). +import-from-file=Importuoti i\u0161 rinkmenos +identity-provider.import-from-file.tooltip=Importuoti metaduomenis i\u0161 rinkmenos, kuri\u0105 atsisiunt\u0117te i\u0161 IDP aptikimo apra\u0161o (IDP discovery descriptor). +saml-config=SAML konfig\u016Bracija +identity-provider.saml-config.tooltip=SAML SP ir i\u0161oriniu IDP konfig\u016Bracija. +single-signon-service-url=Vieningo prisijungimo paslaugos URL +saml.single-signon-service-url.tooltip=Adresas, kuriuo turi b\u016Bti siun\u010Diamos autentifikacijos u\u017Eklausos (SAML AuthnRequest). +single-logout-service-url=Vieningo atsijungimo paslaugos URL +saml.single-logout-service-url.tooltip=Adresas, kuriuo turi b\u016Bti siun\u010Diamos naudotojo atjungimo u\u017Eklausos. +nameid-policy-format=NameID taisykli\u0173 formatas +nameid-policy-format.tooltip=Nurodykite URI nuorod\u0105 atitinkan\u010Di\u0105 vardo identifikatoriaus format\u0105. Numatyta reik\u0161m\u0117 urn:oasis:names:tc:SAML:2.0:nameid-format:persistent. +http-post-binding-response=Si\u0173sti atsakymus HTTP-POST +http-post-binding-response.tooltip=Jei \u012Fgalinta, tuomet atsakymai siun\u010Diami HTTP-POST saistymu. Kitu atveju bus naudojamas HTTP-REDIRECT. +http-post-binding-for-authn-request=Si\u0173sti AuthnRequest HTTP-POST +http-post-binding-for-authn-request.tooltip=Jei \u012Fgalinta, tuomet AuthnRequest siun\u010Diami HTTP-POST saistymu. Kitu atveju bus naudojamas HTTP-REDIRECT. +want-authn-requests-signed=Reikalaujami pasira\u0161yt\u0173 AuthnRequests +want-authn-requests-signed.tooltip=Nurodykite, ar tapatyb\u0117s teik\u0117jas tikisi pasira\u0161yt\u0173 AuthnRequest u\u017Eklaus\u0173. +force-authentication=Priverstin\u0117 autentifikacija +identity-provider.force-authentication.tooltip=Jei \u012Fgalinta, tuomet tapatyb\u0117s teik\u0117jas privalo autentifikuoti naudotoj\u0105 i\u0161 naujo nepasitikint ankstesniu prisijungimu. +validate-signature=Para\u0161o tikrinimas +saml.validate-signature.tooltip=\u012Ejungti/i\u0161jungti SAML atsakym\u0173 para\u0161o tikrinim\u0105. +validating-x509-certificate=X509 sertifikatai tikrinimui +validating-x509-certificate.tooltip=PEM formato sertifikatai, kurie turi b\u016Bti naudojami para\u0161\u0173 tikrinimui. Reik\u0161m\u0117s skiriamos kableliais (,). +saml.import-from-url.tooltip=Importuoti metaduomenis i\u0161 nutolusio IDP SAML subjekto apra\u0161o. +social.client-id.tooltip=Kliento identifikatorius u\u017Eregistruotas tapatyb\u0117s teik\u0117jo sistemoje. +social.client-secret.tooltip=Kliento saugos kodas u\u017Eregistruotas tapatyb\u0117s teik\u0117jo sistemoje. +social.default-scopes.tooltip=Autorizacijos metu siun\u010Diamos taikymo sritys. Galim\u0173 reik\u0161mi\u0173 s\u0105ra\u0161o, skirtuko ir numatytos reik\u0161m\u0117s ie\u0161kokite tapatyb\u0117s teik\u0117jo sistemos dokumentacijoje.. +key=Raktas +stackoverflow.key.tooltip=Stack Overflow kliento registracijos metu gautas raktas. + +# User federation +sync-ldap-roles-to-keycloak=Sinchronizuoti LDAP roles \u012F Keycloak +sync-keycloak-roles-to-ldap=Sinchronizuoti Keycloak roles \u012F LDAP +sync-ldap-groups-to-keycloak=Sinchronizuoti LDAP grupes \u012F Keycloak +sync-keycloak-groups-to-ldap=Sinchronizuoti Keycloak grupes \u012F LDAP + +realms=Sritys +realm=Sritis + +identity-provider-mappers=Tapatyb\u0117s teik\u0117jo atitikmen\u0173 susiejimai +create-identity-provider-mapper=Sukurti tapatyb\u0117s teik\u0117jo atitikmens susiejim\u0105 +add-identity-provider-mapper=Prid\u0117ti tapatyb\u0117s teik\u0117jo atitikmens susiejim\u0105 +client.description.tooltip=Nurodomas kliento apra\u0161as. Pavyzd\u017Eiui 'Mano laiko lenteli\u0173 klientas'. Palaikomos lokalizuotos reik\u0161m\u0117s. Pavyzd\u017Eiui\: ${my_client_description} + +expires=Galioja iki +expiration=Galiojimas +expiration.tooltip=Nurodykite kiek laiko galios prieigos raktas +count=Kiekis +count.tooltip=Nurodykite kiek klient\u0173 gali b\u016Bti sukurti naudojant prieigos rakt\u0105 +remainingCount=Lik\u0119s kiekis +created=Sukurta +back=Atgal +initial-access-tokens=Pradiniai prieigos raktai +initial-access-tokens.tooltip=Pradiniai prieigos raktai naudojami klient\u0173 registracijoms dinaminiu b\u016Bdu. U\u017Eklausos su \u0161iais raktais gali b\u016Bti siun\u010Diami i\u0161 bet kurio serverio. +add-initial-access-tokens=Prid\u0117ti pradin\u012F prieigos rakt\u0105 +initial-access-token=Pradinis prieigos raktas +initial-access.copyPaste.tooltip=Nukopijuokite ir \u012Fklijuokite prieigos rakt\u0105 prie\u0161 i\u0161eidami i\u0161 \u0161io puslapio. V\u0117liau negal\u0117site kopijuoti \u0161i\u0173 prieigos rakt\u0173. +continue=T\u0119sti +initial-access-token.confirm.title=Kopijuoti pradinius prieigos raktus +initial-access-token.confirm.text=Pra\u0161ome \u012Fsitikinti, kad nusikopijavote pradinius prieigos raktus nes v\u0117liau prie rakt\u0173 nebegal\u0117site prieiti +no-initial-access-available=N\u0117ra galim\u0173 pradini\u0173 prieigos rak\u0161\u0173 + +client-reg-policies=Klient\u0173 registravimo taisykl\u0117s +client-reg-policy.name.tooltip=Taisykl\u0117s rodomas pavadinimas +anonymous-policies=Anonimin\u0117s prieigos taisykl\u0117s +anonymous-policies.tooltip=\u0160ios taisykl\u0117s naudojamos tuomet, kai klient\u0173 registravimo paslauga i\u0161kvie\u010Diama neautentifikuota u\u017Eklausa. T.y. u\u017Eklausa neturi nei pradini\u0173 prieigos rakt\u0173 (Initial Access Token) nei prieigos rakt\u0173 (Bearer Token). +auth-policies=Autentifikuotos prieigos taisykl\u0117s +auth-policies.tooltip=\u0160ios taisykl\u0117s naudojamos tuomet, kai klient\u0173 registravimo paslauga i\u0161kvie\u010Diama autentifikuota u\u017Eklausa. T.y. u\u017Eklausa turi pradini\u0173 prieigos rakt\u0173 (Initial Access Token) arba prieigos rakt\u0173 (Bearer Token). +policy-name=Taisykl\u0117s pavadinimas +no-client-reg-policies-configured=N\u0117ra klient\u0173 registravimo taisykli\u0173 +trusted-hosts.label=Patikimi serveriai +trusted-hosts.tooltip=Serveri\u0173 s\u0105ra\u0161as, kuriems suteikiama teis\u0117 kviesti klient\u0173 registravimo paslaug\u0105 (Client Registration Service) ir/arba naudototi \u0161ias reik\u0161mes klient\u0173 URI parametre (Client URI). Galima naudoti serveri\u0173 vardus arba IP adresus. Jei kaip pirmas simbolis naudojamas i\u0161ple\u010Diantis simbolis (pvz '*.example.com') tuomet visas domenas 'example.com' bus patikimas. +host-sending-registration-request-must-match.label=Klient\u0173 registracijos paslaugos naudotojo serverio vardas turi sutapti +host-sending-registration-request-must-match.tooltip=Jei \u0161galinta, tuomet visos klient\u0173 registravimo u\u017Eklausos leid\u017Eiamos tik tuo atveju, jei jos buvo i\u0161si\u0173stos i\u0161 to pa\u010Dio patikimo serverio ar domeno. +client-uris-must-match.label=Klient\u0173 URI turi sutapti +client-uris-must-match.tooltip=Jei \u012Fgalinta, tuomet visos klient\u0173 nuorodos (nukreipimo nuorodos ir kitos) leid\u017Eiamos tik tuo atveju, jei jos sutampa su patikimu serverio vardu arba domenu. +allowed-protocol-mappers.label=Leid\u017Eiami protokolo atitikmen\u0173 parink\u0117jai +allowed-protocol-mappers.tooltip=Nurodykite visus leid\u017Eiamus protokolo atitikmen\u0173 parink\u0117jus. Jei bandoma registruoti klient\u0105, kuris turi protokolo atitikmen\u0173 parink\u0117j\u0105 ne\u0161traukt\u0105 \u0161 leid\u017Eiam\u0173 s\u0105ra\u0161\u0105, tuomet visa registracijos u\u017Eklausa bus atmesta. +consent-required-for-all-mappers.label=Privalomas vis\u0173 atitikmen\u0173 parink\u0117j\u0173 pritarimas +consent-required-for-all-mappers.label=Consent Required For Mappers +consent-required-for-all-mappers.tooltip=Jei \u012Fgalinta, tuomet visi naujai u\u017Eregistruotiems protokolo parink\u0117jams automati\u0161kai \u012Fgalinama consentRequired opcija. Tai rei\u0161kia, kad naudotojas privalo pateikti patvirtinim\u0105. PASTABA: Patvirtinimo ekranas rodomas tik tiems klientams, kuriems \u012Fjungtas consentRequired nustatymas. Da\u017Eniausiai geriausia nustatyti \u0161i\u0105 nuostat\u0105 kartu su consent-required taisykle. +allowed-client-templates.label=Leid\u017Eiami klient\u0173 \u0161ablonai +allowed-client-templates.tooltip=Leid\u017Eiam\u0173 kliento \u0161ablon\u0173 s\u0105ra\u0161as, kuriuos galima naudoti naujai registruojamiems klientams. Bandant registruoti klient\u0105 naudojant kliento \u0161ablon\u0105, kurio n\u0117ra s\u0105ra\u0161e bus atmestas. Pradin\u0117 reik\u0161m\u0117 - tu\u0161\u010Dias s\u0105ra\u0161as, t.y. neleid\u017Eiamas nei vienas kliento \u0161ablonas. +max-clients.label=Mksimalus srities klient\u0173 skai\u010Dius +max-clients.tooltip=Nauj\u0173 klient\u0173 registracija draud\u017Eiama, jei u\u017Eregistruot\u0173 klient\u0173 skai\u010Dius yra toks pats arba didesnis nei nustatytas limitas. + +client-templates=Klient\u0173 \u0161ablonai +client-templates.tooltip=Klient\u0173 \u0161ablonai leid\u017Eia nurodyti bendr\u0105 vis\u0173 klient\u0173 konfig\u016Bracij\u0105 + +groups=Grup\u0117s + +group.add-selected.tooltip=Grupei galimos priskirti srities rol\u0117s. +group.assigned-roles.tooltip=Su \u0161ia grupe susietos srities roles +group.effective-roles.tooltip=Visos srities susietos rol\u0117s. \u0160iame s\u0105ra\u0161e taip pat rodomos visos rol\u0117s, kurios priskirtos sud\u0117tin\u0117ms rol\u0117ms. +group.available-roles.tooltip=\u0160io kliento galimos susieti rol\u0117s. +group.assigned-roles-client.tooltip=Susietos \u0161io kliento rol\u0117s. +group.effective-roles-client.tooltip=Visos \u0161io kliento susietos rol\u0117s. \u0160iame s\u0105ra\u0161e taip pat rodomos visos rol\u0117s, kurios priskirtos sud\u0117tin\u0117ms rol\u0117ms. + +default-roles=Numatytosios rol\u0117s +no-realm-roles-available=Sritis neturi roli\u0173 + +users=Naudotojai +user.add-selected.tooltip=Naudotojui galimos priskirti srities rol\u0117s. +user.assigned-roles.tooltip=Su \u0161iuo naudotoju susietos srities rol\u0117s +user.effective-roles.tooltip=Visos srities susietos rol\u0117s. \u0160iame s\u0105ra\u0161e taip pat rodomos visos rol\u0117s, kurios priskirtos sud\u0117tin\u0117ms rol\u0117ms. +user.available-roles.tooltip=\u0160io kliento galimos susieti rol\u0117s. +user.assigned-roles-client.tooltip=Susietos \u0161io kliento rol\u0117s. +user.effective-roles-client.tooltip=Visos \u0161io kliento susietos rol\u0117s. \u0160iame s\u0105ra\u0161e taip pat rodomos visos rol\u0117s, kurios priskirtos sud\u0117tin\u0117ms rol\u0117ms. +default.available-roles.tooltip=Galimos priskirti srities rol\u0117s. +realm-default-roles=Numatytosios srities rol\u0117s +realm-default-roles.tooltip=Srities rol\u0117s, kurios automati\u0161kai priskiriamos naujiems naudotojams. +default.available-roles-client.tooltip=\u0160io kliento rol\u0117s, kurios automati\u0161kai gali b\u016Bti priskiriamos naudotojams. +client-default-roles=Numatytosios kliento rol\u0117s +client-default-roles.tooltip=Kliento rol\u0117s, kurios automati\u0161kai priskiriamos naujiems naudotojams. +composite.available-roles.tooltip=Srities rol\u0117s, kurias galima susieti su \u0161ia sud\u0117tine role. +composite.associated-roles.tooltip=Srities rol\u0117s, kurios susietos su \u0161ia sud\u0117tine role. +composite.available-roles-client.tooltip=Kliento rol\u0117s, kurias galima susieti su \u0161ia sud\u0117tine role. +composite.associated-roles-client.tooltip=Kliento rol\u0117s, kurios susietos su \u0161ia sud\u0117tine role. +partial-import=Dalinis duomen\u0173 importavimas +partial-import.tooltip=Dalinis duomen\u0173 importavimas leid\u017Eia \u012Fkelti prie\u0161 tai eksportuot\u0105 JSON rinkmen\u0105 su naudotojais, klientais ir kitais resursais. + +file=Rinkmena +exported-json-file=Eksportuota JSON rinkmena +import-from-realm=\u012Ekelti i\u0161 srities +import-users=\u012Ekelti naudotojus +import-groups=\u012Ekelti grupes +import-clients=\u012Ekelti klientus +import-identity-providers=\u012Ekelti tapatyb\u0117s teik\u0117jus +import-realm-roles=\u012Ekelti srities roles +import-client-roles=\u012Ekelti klient\u0173 roles +if-resource-exists=Jei resursas egzistuoja +fail=Nevykdyti +skip=Praleisti +overwrite=Perra\u0161yti +if-resource-exists.tooltip=Nurodykite k\u0105 daryti kuomet bandoma \u012Fkelti jau egzistuojant\u012F resurs\u0105. + +action=Veiksmas +role-selector=Roli\u0173 parinkimas +realm-roles.tooltip=Srities rol\u0117s, kurias galima pasirinkti. + +select-a-role=Pasirinkti rol\u0119 +select-realm-role=Pasirinkti srities rol\u0119 +client-roles.tooltip=Kliento rol\u0117s, kurias galite pa\u017Eym\u0117ti. +select-client-role=Pasirinkti kliento rol\u0119 + +client-template=Kliento \u0161ablonas +client-template.tooltip=Kliento \u0161ablonas, i\u0161 kurio paveldima konfig\u016Bracija +client-saml-endpoint=Kliento SAML adresas +add-client-template=Kliento \u0161ablono k\u016Brimas + +manage=Valdyti +authentication=Autentifikavimas +user-federation=Naudotoj\u0173 federavimas +user-storage=Naudotoj\u0173 saugykla +events=\u012Evykiai +realm-settings=Srities nustatymai +configure=Konfig\u016Bruoti +select-realm=Pasirinkite srit\u012F +add=Prid\u0117ti + +client-template.name.tooltip=Kliento \u0161ablono pavadinimas. Privalo b\u016Bti unikalus \u0161ioje srityje +client-template.description.tooltip=Kliento \u0161ablono apra\u0161ymas +client-template.protocol.tooltip=Kurio SSO protokolo konfig\u016Bracija teikia \u0161is \u0161ablonas + +add-user-federation-provider=Prid\u0117ti naudotoj\u0173 federacijos teik\u0117ja +required-settings=Privalomi nustatymai +provider-id=Teik\u0117jo ID +console-display-name=Konsol\u0117je rodomas pavadinimas +console-display-name.tooltip=Administravimo konsol\u0117je rodomas teik\u0117jo pavadinimas. +priority=Prioritetas +priority.tooltip=Skai\u010Dius nurodantis naudotojo paie\u0161kos \u0161iame federacijos teik\u0117juje prioritet\u0105. Pirmiausia imama su ma\u017Eesniu skai\u010Diumi. +sync-settings=Sinchronizuoti nustatymus +periodic-full-sync=Pilnas periodinis sinchronizavimas +periodic-full-sync.tooltip=Ar turi b\u016Bti atliekamas periodinis pilnas teik\u0117jo naudotoj\u0173 sinchronizavimas \u012F Keycloak? +full-sync-period=Pilno sinchronizavimo intervalas +full-sync-period.tooltip=Laikas sekund\u0117mis, kas kur\u012F atliekamas pilnas naudotoj\u0173 sinchronizavimas \u012F Keycloak sistem\u0105 +periodic-changed-users-sync=Periodinis pakeitim\u0173 sinchronizavimas +periodic-changed-users-sync.tooltip=Ar turi b\u016Bti atliekamas naujai u\u017Eregistruot\u0173 naudotoj\u0173 ar naudotoj\u0173 su redaguotais profilio duomenimis periodinis sinchronizavimas \u012F Keycloak? +changed-users-sync-period=Periodinis sinchronizavimo intervalas +changed-users-sync-period.tooltip=Laikas sekund\u0117mis, kas kur\u012F atliekamas naujai u\u017Eregistruot\u0173 naudotoj\u0173 ar naudotoj\u0173 su redaguotais profilio duomenimis sinchronizavimas \u012F Keycloak +synchronize-changed-users=Sinchronizuoti naudotoj\u0173 pakeitimus +synchronize-all-users=Sinchronizuoti visus naudotojus +kerberos-realm=Kerberos sritis +kerberos-realm.tooltip=Kerberos srities pavadinimas. Pavyzd\u017Eiui FOO.ORG +server-principal=Pagrindinis serveris +server-principal.tooltip=Pilnas HTTP paslaugai skirtas pagrindinio serverio su domenu pavadinimas. Pavyzd\u017Eiui HTTP/host.foo.org@FOO.ORG +keytab=KeyTab +keytab.tooltip=Kelias iki Kerberos KeyTab rinkmenos talpinan\u010Dios prisijungimo prie pagrindinio serverio duomenis. Pavyzd\u017Eiui /etc/krb5.keytab +debug=Derinti +debug.tooltip=Ar \u012Fgalinti Krb5LoginModule veikimo prane\u0161im\u0173 ra\u0161ym\u0105 \u012F standarin\u0119 i\u0161vest\u012F derinimo r\u0117\u017Eimu? +allow-password-authentication=Leisti autentifikacij\u0105 naudojant slapta\u017Eod\u012F +allow-password-authentication.tooltip=Ar suteikti galimyb\u0119 naudotojui prisijungti prie Kerberos naudojant naudotojo vard\u0105 ir slapta\u017Eod\u012F? +edit-mode=Pakeitim\u0173 r\u0117\u017Eimas +edit-mode.tooltip=READ_ONLY rei\u0161kia, kad naudotojui neleid\u017Eiama keisti slapta\u017Eod\u017Eio ir autentifikacija visuomet bus atliekama Kerberos. UNSYNCED rei\u0161kia, kad naudotojui leid\u017Eiama keisti slapta\u017Eod\u012F saugom\u0105 Keycloak duomen\u0173 baz\u0117je ir kuris bus naudojamas autentifikacijos metu vietoj Kerberos slapta\u017Eod\u017Eio. +ldap.edit-mode.tooltip=READ_ONLY rei\u0161kia, kad LDAP saugykla bus naudojama vien tik skaitymo r\u0117\u017Eimu. WRITABLE rei\u0161kia, kad duomenys sinchronizuojami atgal \u012F LDAP pagal poreik\u012F. UNSYNCED rei\u0161kia, kad naudotoj\u0173 duomenys bus importuoti, ta\u010Diau niekuomet nesinchronizuojami atgal \u012F LDAP. +update-profile-first-login=Pirmojo prisijungimo metu atnaujinti duomenis +update-profile-first-login.tooltip=Pirmojo prisijungimo metu atnaujinti naudotojo profilio duomenis +sync-registrations=Sinchronizuoti registracijas +ldap.sync-registrations.tooltip=Ar naujai u\u017Esiregistrav\u0119 naudotojai tur\u0117t\u0173 b\u016Bti sinchonizuojami \u012F LDAP saugykl\u0105? Federavimo teik\u0117jas, \u012F kur\u012F sinchronizuojami nauji naudotojai, parenkamas pagal prioritet\u0105. Pirmiausia imami su ma\u017Eiausiu skai\u010Diumi. +vendor=Gamintojas +ldap.vendor.tooltip=LDAP gamintojas (teik\u0117jas) +username-ldap-attribute=Prisijungimo vardo LDAP atributas +ldap-attribute-name-for-username=LDAP atributo pavadinimas, kuriame saugomas naudotojo prisijungimo vardas +username-ldap-attribute.tooltip=LDAP atributas, kuris turi b\u016Bti susietas su Keycloak naudotojo prisijungimo vardu. Su daugeliu LDAP serveri\u0173 gali b\u016Bti naudojamas 'uid' atributas. ActiveDirectory gali b\u016Bti 'sAMAccountName' arba 'cn'. Reikalaujama, kad nurodytas LDAP atributas b\u016Bt\u0173 u\u017Epildytas visiems naudotojams kurie importuojami i\u0161 LDAP \u012F Keycloak. +rdn-ldap-attribute=RDN LDAP atributas +ldap-attribute-name-for-user-rdn=LDAP atributo pavadinimas, kuriame saugomas naudotojo RDN +rdn-ldap-attribute.tooltip=LDAP atributas, kuris naudojamas kaip RDN (Relative Distinguished Name) vietoj tipinio naudotojo DN (Distinguished Name). Da\u017Eniausiai reik\u0161m\u0117 sutampa su prisijungimo vardo LDAP atributu, ta\u010Diau pastarasis n\u0117ra privalomas. Pavyzd\u017Eiui ActiveDirectory da\u017Eniausiai kaip RDN atributas naudojamas 'cn' nors prisijungimo vardo atributas b\u016Bna 'sAMAccountName'. +uuid-ldap-attribute=UUID LDAP atributas +ldap-attribute-name-for-uuid=LDAP atributo pavadinimas, kuriame saugomas UUID +uuid-ldap-attribute.tooltip=LDAP atributas, kuris naudojamas kaip unikalus LDAP objekt\u0173 identifikatorius (UUID). Daugelis LDAP serveri\u0173 naudoja 'entryUUID', ta\u010Diau pasitaiko ir i\u0161im\u010Di\u0173. Pavyzd\u017Eiui ActiveDirectory naudojamas 'objectGUID' atributas. Jei j\u016Bs\u0173 LDAP serveris nepalaiko UUID atribut\u0173, tuomet galite naudoti bet kur\u012F kit\u0105 atribut\u0105 kuris u\u017Etikrina LDAP naudotoj\u0173 unikalum\u0105. Pavyzd\u017Eiui 'uid' arba 'entryDN'. +user-object-classes=Naudotoj\u0173 objekt\u0173 klas\u0117s +ldap-user-object-classes.placeholder=LDAP naudotoj\u0173 objekt\u0173 klas\u0117s (skiriamos kableliu) +ldap.user-object-classes.tooltip=LDAP atributo objectClass atskirtos kableliu reik\u0161m\u0117s skirtos LDAP naudotojo objektui. Pavyzd\u017Eiui: 'inetOrgPerson, organizationalPerson' . Naujai registruoti Keycloak naudotojai bus \u012Fra\u0161yti \u0161 LDAP su visomis nurodytomis objekt\u0173 klas\u0117mis. Egzistuojantys LDAP naudotoj\u0173 objektai randami tik tuomet, kai jie turi visas \u0161ias nurodytas objekto klases. + +ldap-connection-url=LDAP jungties URL +ldap-users-dn=LDAP naudotoj\u0173 DN +ldap-bind-dn=LDAP prisijungimo DN +ldap-bind-credentials=LDAP prisijungimo slapta\u017Eodis +ldap-filter=LDAP filtras + +connection-url=Jungties URL +ldap.connection-url.tooltip=Jungties \u012F LDAP server\u012F URL +test-connection=Tikrinti jungt\u012F +users-dn=Naudotoj\u0173 DN +ldap.users-dn.tooltip=\u0160aknin\u0117 LDAP med\u017Eio DN (Distinguished Name) kuriame saugomi naudotojai. Jei pavyzd\u017Eiui tipinio naudotojo DN yra 'uid=john,ou=users,dc=example,dc=com' tuomet \u0161io atributo reik\u0161m\u0117 tur\u0117t\u0173 b\u016Bti 'ou=users,dc=example,dc=com' +authentication-type=Autentifikacijos tipas +ldap.authentication-type.tooltip=LDAP autentifikacijos tipas. Galimi 'none' (anonimin\u0117 LDAP prieiga) arba 'simple' (Prisijungimo DN + slapta\u017Eodis autentifikacijai) autentifikacijos b\u016Bdai +bind-dn=Prisijungimo DN +ldap.bind-dn.tooltip=LDAP administratoriaus DN (Distinguished Name), kuris turi b\u016Bti naudojamas Keycloak prieiti prie LDAP serverio +bind-credential=Prisijungimo slapta\u017Eodis +ldap.bind-credential.tooltip=LDAP administratoriaus slapta\u017Eodis +test-authentication=Tikrinti autentifikacij\u0105 +custom-user-ldap-filter=Papildomas naudotoj\u0173 LDAP filtras +ldap.custom-user-ldap-filter.tooltip=Papildomas LDAP filtras, kuris turi b\u016Bti naudojamas surast\u0173 naudotoj\u0173 nufiltravimui. Palikite tu\u0161\u010Di\u0105 lauk\u0105 jei papildomas filtravimas nereikalingas. \u012Esitikinkite, kad filtras prasideda '(' ir baigiasi ')' simboliais +search-scope=Paie\u0161kos apimtis +ldap.search-scope.tooltip=Jei pasirinkta vieno lygio paie\u0161ka, tuomet naudotoj\u0173 ie\u0161koma vien tik nurodytame naudotoj\u0173 DN. Kai pasirinkta paie\u0161ka medyje, tuomet naudotoj\u0173 ie\u0161koma visose med\u017Eio \u0161akose. I\u0161samesn\u0117s informacijos ie\u0161kokite LDAP dokumentacij\u0105 +use-truststore-spi=Naudoti rakt\u0173 saugyklos SPI +ldap.use-truststore-spi.tooltip=Nurodykite, kuomet LDAP jungtis naudos standalone.xml/domain.xml sukonfig\u016Bruot\u0105 patikim\u0173 liudijim\u0173/rakt\u0173 saugyklos SPI. 'Visada' rei\u0161kia, kad bus naudojama visada. 'Niekada' rei\u0161kia, kad sukonfig\u016Bruota liudijim\u0173 saugykla nebus naudojama. 'Tik LDAP' rei\u0161kia, kad saugykla bus naudojama tik su LDAP jungtimis. Pastaba: jei standalone.xml/domain.xml nesukonfig\u016Bruotas, tuomet bus naudojama standartin\u0117 Java cacerts arba 'javax.net.ssl.trustStore' parametre nurodyta liudijim\u0173 saugykla. +connection-pooling=Jung\u010Di\u0173 buferizavimas +ldap.connection-pooling.tooltip=Ar Keycloak tur\u0117t\u0173 naudoti jung\u010Di\u0173 telkin\u012F jungiantis prie LDAP serverio? +ldap.pagination.tooltip=Ar LDAP serveris palaiko puslapiavim\u0105? +kerberos-integration=Kerberos intergacija +allow-kerberos-authentication=Leisti Kerberos autentifikacij\u0105 +ldap.allow-kerberos-authentication.tooltip=\u012Egalina HTTP naudotoj\u0173 autentifikacij\u0105 naudojant SPNEGO/Kerberos raktus. Duomenys apie prisijungus\u012F naudotoj\u0105 bus teikiama \u0161io LDAP serverio +use-kerberos-for-password-authentication=Naudoti Kerberos autentifikacijai su slapta\u017Eod\u017Eiu +ldap.use-kerberos-for-password-authentication.tooltip=Ar jungiantis su naudotojo vardu ir slapta\u017Eod\u017Eiu naudoti Kerberos server\u012F vietoj LDAP serverio Directory Service API +batch-size=Paketo dydis +ldap.batch-size.tooltip=Vienos tranzacijos metu \u012F Keycloak importuojam\u0173 LDAP naudotoj\u0173 skai\u010Dius. +ldap.periodic-full-sync.tooltip=Ar \u012Fgalinti periodin\u0119 piln\u0105 LDAP naudotoj\u0173 sinchronizacij\u0105 \u012F Keycloak? +ldap.periodic-changed-users-sync.tooltip=Ar \u012Fgalinti periodin\u0119 naujai registruot\u0173 arba su pakeistais duomenimis LDAP naudotoj\u0173 sinchronizacij\u0105 \u012F Keycloak? +ldap.changed-users-sync-period.tooltip=Intervalas sekund\u0117mis, kas kur\u012F atliekamas periodinis naujai registruot\u0173 arba su pakeistais duomenimis LDAP naudotoj\u0173 sinchronizavimas \u012F Keycloak +user-federation-mappers=Federuoto naudotojo atribut\u0173 atitikmenys +create-user-federation-mapper=Sukurti federuoto naudotojo atributo atitikmen\u012F +add-user-federation-mapper=Prid\u0117ti federuoto naudotojo atributo atitikmen\u012F +provider-name=Teik\u0117jo pavadinimas +no-user-federation-providers-configured=Nesukonfig\u016Bruotas nei vienas naudotoj\u0173 federacijos teik\u0117jas +no-user-storage-providers-configured=Nesukonfig\u016Bruota nei viena naudotoj\u0173 saugykla +add-identity-provider=Prid\u0117ti tapatyb\u0117s teik\u0117j\u0105 +add-identity-provider-link=Prid\u0117ti s\u0105saj\u0105 su tapatyb\u0117s teik\u0117ju +identity-provider=Tapatyb\u0117s teik\u0117jas +identity-provider-user-id=Tapatyb\u0117s teik\u0117jo naudotojo ID +identity-provider-user-id.tooltip=Unikalus, tapatyb\u0117s teik\u0117jo saugomas, naudotojo ID +identity-provider-username=Tapatyb\u0117s teik\u0117jo naudotojo vardas +identity-provider-username.tooltip=Tapatyb\u0117s teik\u0117jo sistemoje saugomas naudotojo vardas +pagination=Puslapiavimas + +browser-flow=Autentifikacijos seka +browser-flow.tooltip=Pasirinkite autentifikacijos nar\u0161ykl\u0117je sek\u0105 +registration-flow=Registracijos seka +registration-flow.tooltip=Pasirinkite registracijos nar\u0161ykl\u0117je sek\u0105. +direct-grant-flow=Tiesiogini\u0173 teisi\u0173 seka +direct-grant-flow.tooltip=Pasirinkite tiesiogini\u0173 teisi\u0173 sek\u0105 (direct grant authentication). +reset-credentials=Prisijungimo duomen\u0173 atk\u016Brimo seka +reset-credentials.tooltip=Pasirinkite prisijungimo duomen\u0173 priminimo nar\u0161ykl\u0117je sek\u0105 +client-authentication=Klient\u0173 autentifikacijos seka +client-authentication.tooltip=Pasirinkite klient\u0173 autentifikacijos sek\u0105. +new=Naujas +copy=Kopijuoti +add-execution=Prid\u0117ti i\u0161imt\u012F +add-flow=Prid\u0117ti sek\u0105 +auth-type=Autentifikacijos tipas +requirement=Privalomumas +config=Konfig\u016Bruoti +no-executions-available=N\u0117ra sukonfig\u016Bruot\u0173 i\u0161im\u010Di\u0173 +authentication-flows=Autentifikacijos sekos +create-authenticator-config=Sukurti autentifikatoriaus konfig\u016Bracij\u0105 +authenticator.alias.tooltip=Konfig\u016Bracijos pavadinimas +otp-type=OTP tipas +time-based=Paremtas laiku +counter-based=Paremtas skaitliuku +otp-type.tooltip='totp' paremtas ribot\u0105 laik\u0105 galiojan\u010Diu vienkartiniu slapta\u017Eod\u017Eiu. 'hotp' - ribot\u0105 kart\u0173 galiojan\u010Diu vienkartiniu slapta\u017Eod\u017Eiu. +otp-hash-algorithm=OTP mai\u0161os algoritmas +otp-hash-algorithm.tooltip=Kuris mai\u0161os algoritmas turi b\u016Bti naudojamas OTP generavimui. +number-of-digits=Skaitmen\u0173 skai\u010Dius +otp.number-of-digits.tooltip=Kiek OTP tur\u0117t\u0173 tur\u0117ti skaitmen\u0173? +look-ahead-window=Neatitikimo langas +otp.look-ahead-window.tooltip=Koks intervalas yra leid\u017Eiamas tuo atveju, kai prieigos rakt\u0173 generatoriaus ir serverio laikai arba skaitliukai nesutampa. +initial-counter=Pradin\u0117 skaitliuko reik\u0161m\u0117 +otp.initial-counter.tooltip=Kokia turi b\u016Bti pradin\u0117 skaitliuko reik\u0161m\u0117? +otp-token-period=OTP rakto galiojimo intervalas +otp-token-period.tooltip=Kiek sekund\u017Eiu galios OTP prieigos raktas? Numatyta reik\u0161m\u0117 30 sekund\u017Ei\u0173. +table-of-password-policies=Slapta\u017Eod\u017Eio taisykli\u0173 lentel\u0117 +add-policy.placeholder=Prid\u0117ti taisykl\u0119... +policy-type=Taisykl\u0117s tipas +policy-value=Taisykl\u0117s reik\u0161m\u0117 +admin-events=Administravimo \u012Fvykiai +admin-events.tooltip=Rodomi srities administravimo \u012Fvykiai susij\u0119 su administratoriaus paskyra, pvz. srities k\u016Brimas. Pasirinkite konfig\u016Bravimo skilt\u012F nor\u0117dami kad \u012Fvykiai b\u016Bt\u0173 saugomi. +login-events=Prisijungimo \u012Fvykiai +filter=Filtruoti +update=Atnaujinti +reset=I\u0161valyti +resource-types=Resurso tipas +operation-types=Veiksmas +select-operations.placeholder=Pasirinkite veiksmus... +resource-path=Resurso kelias +resource-path.tooltip=Filtravimas pagal resurso keli\u0105. Palaikomas pakaitos simbolis '*' atitinkantis vien\u0105 kelio element\u0105 ir '**' daugiau nei vien\u0105 element\u0105. Pavyzd\u017Eiui 'realms/*/clients/asbc' visose sritise randa klient\u0105 su identifikatoriumi 'asbc'. Kitas pavyzdys 'realms/master/**' randa visus veiksmus 'master' srityje. +date-(from)=Data (Nuo) +date-(to)=Data (Iki) +authentication-details=Autentifikacijos informacija +ip-address=IP adresas +time=Laikas +operation-type=Veiksmo tipas +auth=Autentifikacijos informacija +representation=Reprezentacija +register=Registracijos +required-action=Privalomi veiksmai +default-action=Numatytas veiksmas +auth.default-action.tooltip=Jei \u012Fgalintas, tuomet visi nauji naudotojai prival\u0117s atlikti pa\u017Eym\u0117tus veiksmus. +no-required-actions-configured=N\u0117ra nei vieno sukonfig\u016Bruoto privalomo veiksmo +defaults-to-id=Nenurod\u017Eius bus naudojamas identifikatorius +flows=Sekos +bindings=S\u0105ry\u0161iai +required-actions=Privalomi veiksmai +password-policy=Slapta\u017Eod\u017Ei\u0173 taisykl\u0117s +otp-policy=OTP taisykl\u0117s +user-groups=Naudotoj\u0173 grup\u0117s +default-groups=Numatytos grup\u0117s +groups.default-groups.tooltip=Nurodykite grupes, \u012F kurias automati\u0161kai \u012Ftraukiami nauji naudotojai. +cut=I\u0161kirpti +paste=\u012Eklijuoti + +create-group=Sukurti grup\u0119 +create-authenticator-execution=Sukurti autentifikatoriaus veiksmo vykdym\u0105 +create-form-action-execution=Sukurti formos veiksmo vykdym\u0105 +create-top-level-form=Sukurti auk\u0161\u010Diausio lygio form\u0105 +flow.alias.tooltip=\u012Era\u0161ykite sekos rodom\u0105 pavadinim\u0105. +top-level-flow-type=Auk\u0161\u010Diausio lygio sekos tipas +flow.generic=generic +flow.client=client +top-level-flow-type.tooltip=Kokio tipo \u0161i auk\u0161\u010Diausio lygio sritis? 'client' tipas naudojamas klient\u0173 (program\u0173) autentifikacijai. 'generic' naudojamas visais kitais atvejais. +create-execution-flow=Sukurti vykdymo sek\u0105 +flow-type=Sekos tipas +flow.form.type=form +flow-type.tooltip=Kokios r\u016B\u0161ies \u0161i forma? +form-provider=Formos teik\u0117jas +default-groups.tooltip=Naujai sukurti ar u\u017Eregistruoti naudotojai automati\u0161kai priskiriami \u0161ioms grup\u0117ms +select-a-type.placeholder=pasirinkite tip\u0105 +available-groups=Galimos grup\u0117s +available-groups.tooltip=Nurodykite grup\u0119, kuri bus numatytoji. +value=Reik\u0161m\u0117 +table-of-group-members=Grup\u0117s nari\u0173 lentel\u0117 +last-name=Pavard\u0117 +first-name=Vardas +email=El. pa\u0161tas +toggle-navigation=Perjungti navigacij\u0105 +manage-account=Valdyti paskyr\u0105 +sign-out=Atsijungti +server-info=Serverio informacija +resource-not-found=Resuras nerastas... +resource-not-found.instruction=Negalime rasti j\u016Bs\u0173 ie\u0161komo resurso. \u012Esitikinkite, kad \u012Fved\u0117te teising\u0105 URL. +go-to-the-home-page=Eiti \u012F pradin\u012F puslap\u012F » +page-not-found=Puslapis nerastas... +page-not-found.instruction=Negalime rasti j\u016Bs\u0173 ie\u0161komo puslapio. \u012Esitikinkite, kad \u012Fved\u0117te teising\u0105 URL. +events.tooltip=Rodomi srities i\u0161saugoti \u012Fvykiai. Rodomi \u012Fvykiai susij\u0119 su naudotoj\u0173 paskyromis, pavyzd\u017Eiui naudotojo prisijungimas. Nor\u0117dami keisti nustatymus pasirinkite 'Konfig\u016Bruoti' +select-event-types.placeholder=Pasirinkite \u012Fvykiu tipus... +events-config.tooltip=Rodoma naudotoj\u0173 ir administravimo \u012Fvyki\u0173 konfig\u016Bracija. +select-an-action.placeholder=Pasirinkite veiksm\u0105... +event-listeners.tooltip=Nurodykite srities \u012Fvyki\u0173 gav\u0117jus. +login.save-events.tooltip=Jei \u012Fgalinta, tuomet su prisijungimu susij\u0119 veiksmai saugomi duomen\u0173 baz\u0117je ir tampa prieinami per administravimo bei naudotojo paskyros valdymo skydus. +clear-events.tooltip=I\u0161trinti visus \u012Fvykius i\u0161 duomen\u0173 baz\u0117s. +events.expiration.tooltip=Nustato \u012Fvyki\u0173 galiojimo laik\u0105. Nebegaliojantys \u012Fvykiai periodi\u0161kai i\u0161trinami i\u0161 duomen\u0173 baz\u0117s. +admin-events-settings=Administravimo veiksm\u0173 nustatymai +save-events=Saugoti \u012Fvykius +admin.save-events.tooltip=Jei \u012Fgalinta, tuomet administravimo veiksmai saugomi duomen\u0173 baz\u0117je ir tampa prieinami per administravimo valdymo skyd\u0105. +saved-types.tooltip=Nurodykite veiksm\u0173 tipus, kurie tur\u0117t\u0173 b\u016Bti i\u0161saugoti. +include-representation=I\u0161saugoti reprezentacij\u0105 +include-representation.tooltip=I\u0161saugoti kur\u016Bmo ir redagavimo u\u017Eklaus\u0173 JSON reprezentacij\u0105. +clear-admin-events.tooltip=I\u0161trina visus su administravimu susijusius veiksmus i\u0161 duomen\u0173 baz\u0117s. +server-version=Serverio versija +server-profile=Serverio profilis +info=Informacija +providers=Teik\u0117jai +server-time=Serverio laikas +server-uptime=Serverio veikimo laikas +memory=Atmintis +total-memory=Viso atminties +free-memory=Laisva atmintis +used-memory=Naudojama atmintis +system=Sistema +current-working-directory=Darbinis katalogas +java-version=Java Version +java-vendor=Java Vendor +java-runtime=Java Runtime +java-vm=Java VM +java-vm-version=Java VM Version +java-home=Java Home +user-name=User Name +user-timezone=User Timezone +user-locale=User Locale +system-encoding=System Encoding +operating-system=Operating System +os-architecture=OS Architecture +spi=SPI +granted-roles=Suteiktos rol\u0117s +granted-protocol-mappers=Suteiktos protokolo atitikmen\u0173 s\u0105sajos +additional-grants=Papildomai suteikta +consent-created-date=Sukurta +consent-last-updated-date=Pask. kart\u0105 atnaujinta +revoke=At\u0161aukti +new-password=Naujas slapta\u017Eodis +password-confirmation=Pakartotas slapta\u017Eodis +reset-password=Pakeisti slapta\u017Eod\u012F +credentials.temporary.tooltip=Jei \u012Fgalinta, tuomet naudotojas prival\u0117s pasikeisti slapta\u017Eod\u012F sekan\u010Dio prisijungimo metu +remove-totp=\u0160alinti TOTP +credentials.remove-totp.tooltip=\u0160alinti vienkartin\u012F naudotojo slapta\u017Eod\u017Ei\u0173 generatori\u0173. +reset-actions=Atkurti veiksmus +credentials.reset-actions.tooltip=Nurodykite naudotojui el. pa\u0161tu siun\u010Diamus privalomus atlikti veiksmus. 'Patvirtinti el. pa\u0161to adres\u0105' \u012F naudotojo el. pa\u0161to adres\u0105 siun\u010Dia patvirtinimo nuorod\u0105. 'Atnaujinti profilio informacij\u0105' reikalauja naudotojo per\u017Ei\u016Br\u0117ti ir atnaujinti profilio informacij\u0105. 'Atnaujinti slapta\u017Eod\u012F' reikalauja naudotojo pasikeisti slapta\u017Eod\u012F. 'Konfig\u016Bruoti TOTP' reikalauja atnaujinti mobilaus slapta\u017Eod\u017Ei\u0173 generatoriaus konfig\u016Bracij\u0105. +reset-actions-email=Atk\u016Brimo veiksm\u0173 siuntimas +send-email=Si\u0173sti el. pa\u0161to lai\u0161k\u0105 +credentials.reset-actions-email.tooltip=Naudotojui siun\u010Diamas el. pa\u0161to lai\u0161kas su nuorodomis leid\u017Eian\u010Diomis atlikti pasirinktus veiksmus. Naudotojas atidar\u0119s siun\u010Diam\u0105 nuorod\u0105 gal\u0117s atlikti atk\u016Brimo veiksmus. Veism\u0173 atlikimui naudotoj\u0173 nebus reikalaujama prisijungti. Pavyzd\u017Eiui parinkus slapta\u017Eod\u017Eio atk\u016Brimo veiksm\u0105, naudotojas gal\u0117s neprisijung\u0119s nurodyti nauj\u0105 slapta\u017Ed\u012F. +add-user=Prid\u0117ti naudotoj\u0105 +created-at=Suk\u016Brimo data +user-enabled=Naudotojas \u012Fgalintas +user-enabled.tooltip=Ne\u012Fgalintam naudotojai neleid\u017Eiama prisijungti prie sistemos. +user-temporarily-locked=Naudotojas laikinai u\u017Erakintas +user-temporarily-locked.tooltip=Naudotojas laikintai u\u017Erakintas, nes per daug klydo prisijungiant prie sistemos. +unlock-user=Atrakinti naudotoj\u0105 +federation-link=Federacijos s\u0105saja +email-verified=El. pa\u0161tas patvirtintas +email-verified.tooltip=Ar naudotojo el. pa\u0161to adresas yra patvirtintas? +required-user-actions=Privalomi veiksmai naudotojui +required-user-actions.tooltip=Nurodykite kuriuos veiksmus po prisijungimo naudotojas privalo atlikti. 'Patvirtinti el. pa\u0161to adres\u0105' \u012F naudotojo el. pa\u0161to adres\u0105 siun\u010Dia patvirtinimo nuorod\u0105. 'Atnaujinti profilio informacij\u0105' reikalauja naudotojo per\u017Ei\u016Br\u0117ti ir atnaujinti profilio informacij\u0105. 'Atnaujinti slapta\u017Eod\u012F' reikalauja naudotojo pasikeisti slapta\u017Eod\u012F. 'Konfig\u016Bruoti TOTP' reikalauja atnaujinti mobilaus slapta\u017Eod\u017Ei\u0173 generatoriaus konfig\u016Bracij\u0105. +locale=Lokal\u0117 +select-one.placeholder=Pasirinkite... +impersonate=\u012Ek\u016Bnyti +impersonate-user=\u012Ek\u016Bnyti naudotoj\u0105 +impersonate-user.tooltip=Prisijungti kaip \u0161is naudotojas. Jei j\u016Bs\u0173 sritis sutampa su naudotojo sritimi, tuomet j\u016Bs\u0173 sesija bus baigta prie\u0161 prisijungiant \u0161iuo naudotoju. +identity-provider-alias=Tapatyb\u0117s teik\u0117jo pseudonimas +provider-user-id=Teik\u0117jo naudotojo ID +provider-username=Teik\u0117jo naudotojo vardas +no-identity-provider-links-available=N\u0117ra nei vienos tapatyb\u0117s teik\u0117jo s\u0105sajos +group-membership=Naryst\u0117 grup\u0117se +group-membership.tooltip=Visos grup\u0117s, kuri\u0173 narys yra \u0161is naudotojas. Pa\u017Eym\u0117kite grup\u0119 ir paspauskite 'Palikti' nor\u0117dami pa\u0161alinti naudotoj\u0105 i\u0161 grup\u0117s. +leave=Palikti +membership.available-groups.tooltip=Grup\u0117s, \u012F kurias galima \u012Ftraukti naudotoj\u0105. Pa\u017Eym\u0117kite grup\u0119 ir paspauskite \u012Ftraukti. +table-of-realm-users=Srities naudotoj\u0173 s\u0105ra\u0161as +view-all-users=Rodyti visus naudotojus +unlock-users=Atrakinti naudotojus +no-users-available=Naudotoj\u0173 n\u0117ra +users.instruction=\u012Eveskite paie\u0161kos kriterij\u0173 arba paspauskite rodyti visus naudotojus +consents=Sutikimai +started=Prad\u0117ta +logout-all-sessions=Atjungti visas sesijas +logout=Seanso pabaiga +new-name=Naujas pavadinimas +ok=Gerai +attributes=Atributai +role-mappings=Roli\u0173 susiejimas +members=Nariai +details=Detaliau +identity-provider-links=S\u0105sajos su tapatyb\u0117s teik\u0117jais +register-required-action=Registruoti privalom\u0105 atlikti veiksm\u0105 +gender=Lytis +address=Adresas +phone=Telefonas +profile-url=Profilio URL +picture-url=Nuotraukos URL +website=Internetin\u0117 svetain\u0117 +import-keys-and-cert=Importuoti raktus ir sertifikatus +import-keys-and-cert.tooltip=\u012Ekelti kliento rakt\u0173 por\u0105 ir sertifikat\u0105. +upload-keys=\u012Ekelti raktus +download-keys-and-cert=Atsisi\u0173sti raktus ir sertifikat\u0105 +no-value-assigned.placeholder=N\u0117ra priskirtos reik\u0161m\u0117s +remove=\u0160alinti +no-group-members=Grup\u0117 neturi nari\u0173 +temporary=Laikinas +join=Prijungti +event-type=\u012Evykio tipas +events-config=\u012Evyki\u0173 konfig\u016Bracija +event-listeners=\u012Evyki\u0173 gav\u0117jai +login-events-settings=Prisijungimo \u012Fvyki\u0173 nustatymai +clear-events=I\u0161valyti \u012Fvykius +saved-types=Saugomi tipai +clear-admin-events=I\u0161valyti administravimo \u012Fvykius +clear-changes=I\u0161valyti pasikeitimus +error=Klaida + +# Authz +# Authz Common +authz-authorization=Autorizacija +authz-owner=Savininkas +authz-uri=URI +authz-scopes=Taikymo sritys +authz-resource=Resursas +authz-resource-type=Resurso tipas +authz-resources=Resursai +authz-scope=Taikymo sritis +authz-authz-scopes=Autorizacijos taikymo sritys +authz-policies=Taisykl\u0117s +authz-permissions=Leidimai +authz-evaluate=I\u0161bandyti +authz-icon-uri=Ikonos URI +authz-icon-uri.tooltip=Ikonos paveiksliuko URI. +authz-select-scope=Parinkite taikymo srit\u012F +authz-select-resource=Parinkite resurs\u0105 +authz-associated-policies=Susietos taisykl\u0117s +authz-any-resource=Bet kuris resursas +authz-any-scope=Bet kuri taikymo sritis +authz-any-role=Bet kuri rol\u0117 +authz-policy-evaluation=I\u0161bandyti taisykl\u0119 +authz-select-client=Parinkite klient\u0105 +authz-select-user=Parinkite naudotoj\u0105 +authz-entitlements=Teis\u0117s +authz-no-resources=Resurs\u0173 n\u0117ra +authz-result=Rezultatas +authz-authorization-services-enabled=\u012Egalinti autorizacij\u0105 +authz-authorization-services-enabled.tooltip=\u012Egalinti detal\u0173 kliento autorizacijos palaikym\u0105 +authz-required=Privalomas + +# Authz Settings +authz-import-config.tooltip=Importuoti \u0161io resurs\u0173 serverio autorizacijos nustatym\u0173 JSON rinkmen\u0105. + +authz-policy-enforcement-mode=Taisykli\u0173 vykdymo r\u0117\u017Eimas +authz-policy-enforcement-mode.tooltip=Taisykli\u0173 vykdymo r\u0117\u017Eimas nusako kaip turi b\u016Bti tenkinamos autorizacijos u\u017Eklaus\u0173 taisykl\u0117s. 'Taikyti' rei\u0161kia, kad tuo atveju kai n\u0117ra sukonfig\u016Bruota nei viena su resursu susijusi taisykl\u0117, prieiga draud\u017Eiama. 'Liberalus' rei\u0161kia, kad tuo atveju kai n\u0117ra sukonfig\u016Bruota nei viena su resursu susijusi taisykl\u0117, prieiga leid\u017Eiama. 'I\u0161jungta' rei\u0161kia, kad neatliekamas taisykli\u0173 tikrinimas ir prieiga leid\u017Eiama prie vis\u0173 resurs\u0173. +authz-policy-enforcement-mode-enforcing=Taikyti +authz-policy-enforcement-mode-permissive=Liberalus +authz-policy-enforcement-mode-disabled=I\u0161jungta + +authz-remote-resource-management=Nuotolinis resurs\u0173 valdymas +authz-remote-resource-management.tooltip=Ar leid\u017Eiama nuotoliniu b\u016Bdu resurs\u0173 serveriui valdyti resursus? Jei ne\u012Fgalinta, tuomet resursai gali b\u016Bti valdomi tik per \u0161i\u0105 administravimo konsol\u0119. + +authz-export-settings=Eksportuoti nustatymus +authz-export-settings.tooltip=Eksportuoti ir atsisi\u0173sti visus \u0161io resurs\u0173 serverio autorazacijos nustatymus. + +# Authz Resource List +authz-no-resources-available=N\u0117ra galim\u0173 resurs\u0173. +authz-no-scopes-assigned=N\u0117ra susiet\u0173 taikymo sri\u010Di\u0173. +authz-no-type-defined=N\u0117ra nurodyt\u0173 tip\u0173. +authz-no-permission-assigned=Nera susiet\u0173 leidim\u0173. +authz-no-policy-assigned=N\u0117ra susiet\u0173 taisykli\u0173. +authz-create-permission=Sukurti leidim\u0105 + +# Authz Resource Detail +authz-add-resource=Prid\u0117ti resurs\u0105 +authz-resource-name.tooltip=Unikalus resurso vardas. Vardas turi unikaliai identifikuoti resurs\u0105. Naudingas, kuomet ie\u0161koma specifini\u0173 resurs\u0173. +authz-resource-owner.tooltip=\u0160io resurso savininkas. +authz-resource-type.tooltip=\u0160io resurso tipas. Reik\u0161m\u0117 leid\u017Eia sugrupuoti skirtingus resursus turin\u010Dius t\u0105 pat\u012F tip\u0105. +authz-resource-uri.tooltip=URI kuris taip pat gali b\u016Bti naudojamas vienareik\u0161mi\u0161kam resurso identifikavimui. +authz-resource-scopes.tooltip=Su \u0161iuo resursu susietos taikymo sritys. + +# Authz Scope List +authz-add-scope=Pri\u0117ti taikymo srit\u012F +authz-no-scopes-available=N\u0117ra galim\u0173 taikymo sri\u010Di\u0173. + +# Authz Scope Detail +authz-scope-name.tooltip=Unikalus taikymo srities pavadinimas. \u0160is pavadinimas gali vienareik\u0161mi\u0161kai identifikuoti taikymo srit\u012F. Naudingas kuomet ie\u0161koma \u0161ios tam tikros srities. + +# Authz Policy List +authz-all-types=Visi tipai +authz-create-policy=Sukurti taisykl\u0119 +authz-no-policies-available=N\u0117ra galim\u0173 taisykli\u0173. + +# Authz Policy Detail +authz-policy-name.tooltip=\u0160ios taisykl\u0117s pavadinimas. +authz-policy-description.tooltip=\u0160ios taisykl\u0117s apra\u0161ymas. +authz-policy-logic=Logika +authz-policy-logic-positive=Teigiama +authz-policy-logic-negative=Neigiama +authz-policy-logic.tooltip=Logika nurodo kaip turi b\u016Bti tenkinama taisykl\u0117. Jei nurodyta 'Teigiama', tuomet \u0161ios taisykl\u0117s vykdymo metu gautas rezultatas (leisti arba drausti) bus naudojamas sprendinio pri\u0117mimui. Jei nurodyta 'Neigiama', tuomet \u0161ios taisykl\u0117s vykdymo rezultatas bus paneigtas, t.y. leid\u017Eiama taps draud\u017Eiama ir atvirk\u0161\u010Diai. +authz-policy-apply-policy=Pritaikyti taisykl\u0119 +authz-policy-apply-policy.tooltip=Nurodo visas taisykles, kurios turi b\u016Bti \u012Fvertintos \u0161ios taisykl\u0117s ar leidimo taikymo sri\u010Diai. +authz-policy-decision-strategy=Sprendimo strategija +authz-policy-decision-strategy.tooltip=Sprendimo strategija nurodo kaip priimamas galutinis sprendimas, kuomet yra vykdomos visos \u0161io leidimo taisykl\u0117s. 'Pozityvi' rei\u0161kia, kad galutiniam teigiamam sprendimui turi b\u016Bti tenkinama bent viena taisykl\u0117. 'Vienbals\u0117' rei\u0161kia, kad galutiniam teigiamam sprendimui visos taisykl\u0117s turi b\u016Bti teigiamos. 'Daugumos' rei\u0161kia, kad galutinis teigiamas sprendimas bus priimtas tuomet, kai teigiam\u0173 taisykli\u0173 bus daugiau nei neigiam\u0173. Jei teigiam\u0173 ir neigiam\u0173 taisykli\u0173 skai\u010Dius yra vienodas, tuomet galutinis rezultatas bus neigiamas. +authz-policy-decision-strategy-affirmative=Pozityvi +authz-policy-decision-strategy-unanimous=Vienbals\u0117 +authz-policy-decision-strategy-consensus=Daugumos +authz-select-a-policy=Parinkite taisykl\u0119 + +# Authz Role Policy Detail +authz-add-role-policy=Prid\u0117ti rol\u0117s taisykl\u0119 +authz-no-roles-assigned=N\u0117ra susiet\u0173 roli\u0173. +authz-policy-role-realm-roles.tooltip=Nurodo kurios *srities* rol\u0117(s) tenkina \u0161i\u0105 taisykl\u0119. +authz-policy-role-clients.tooltip=Parinkite klien\u0105 nor\u0117dami rodyti tik \u0161io kliento roles. +authz-policy-role-client-roles.tooltip=Nurodo *kliento* rol\u0117(\u012Fs) kurios tenkina \u0161i\u0105 taisykl\u0119. + +# Authz User Policy Detail +authz-add-user-policy=Prid\u0117ti naudotojo taisykl\u0119 +authz-no-users-assigned=N\u0117ra susiet\u0173 naudotoj\u0173. +authz-policy-user-users.tooltip=Nurodo kurie naudotojai tenkina \u0161i\u0105 taisykl\u0119. + +# Authz Time Policy Detail +authz-add-time-policy=Prid\u0117ti laiko taisykl\u0119 +authz-policy-time-not-before.tooltip=Nurodykite laik\u0105 iki kurio \u0161i taisykl\u0117 NETENKINAMA. Teigiamas rezultatas duodamas tik tuo atveju, kuomet dabartin\u0117 data ir laikas yra v\u0117lesn\u0117 arba lygi \u0161iai reik\u0161mei. +authz-policy-time-not-on-after=Ne v\u0117liau +authz-policy-time-not-on-after.tooltip=Nurodykite laik\u0105 po kurio \u0161i taisykl\u0117 NETENKINAMA. Teigiamas rezultatas duodamas tik tuo atveju, kuomet dabartin\u0117 data ir laikas yra ankstesni arba lygi \u0161iai reik\u0161mei. +authz-policy-time-day-month=M\u0117nesio diena +authz-policy-time-day-month.tooltip=Nurodykite m\u0117nesio dien\u0105 iki kurios \u0161i taisykl\u0117 TENKINAMA. U\u017Epild\u017Eius antr\u0105j\u012F laukel\u012F, taisykl\u0117 bus TENKINAMA jei diena patenka \u012F nurodyt\u0105 interval\u0105. Reik\u0161m\u0117s nurodomos imtinai. +authz-policy-time-month=M\u0117nesis +authz-policy-time-month.tooltip=Nurodykite m\u0117nes\u012F iki kurio \u0161i taisykl\u0117 TENKINAMA. U\u017Epild\u017Eius antr\u0105j\u012F laukel\u012F, taisykl\u0117 bus TENKINAMA jei m\u0117nesis patenka \u012F nurodyt\u0105 interval\u0105. Reik\u0161m\u0117s nurodomos imtinai. +authz-policy-time-year=Metai +authz-policy-time-year.tooltip=Nurodykite metus iki kuri\u0173 \u0161i taisykl\u0117 TENKINAMA. U\u017Epild\u017Eius antr\u0105j\u012F laukel\u012F, taisykl\u0117 bus TENKINAMA jei metai patenka \u012F nurodyt\u0105 interval\u0105. Reik\u0161m\u0117s nurodomos imtinai. +authz-policy-time-hour=Valanda +authz-policy-time-hour.tooltip=Nurodykite valand\u0105 iki kurios \u0161i taisykl\u0117 TENKINAMA. U\u017Epild\u017Eius antr\u0105j\u012F laukel\u012F, taisykl\u0117 bus TENKINAMA jei valanda patenka \u012F nurodyt\u0105 interval\u0105. Reik\u0161m\u0117s nurodomos imtinai. +authz-policy-time-minute=Minut\u0117 +authz-policy-time-minute.tooltip=Nurodykite minut\u0119 iki kurios \u0161i taisykl\u0117 TENKINAMA. U\u017Epild\u017Eius antr\u0105j\u012F laukel\u012F, taisykl\u0117 bus TENKINAMA jei minut\u0117 patenka \u012F nurodyt\u0105 interval\u0105. Reik\u0161m\u0117s nurodomos imtinai. + +# Authz Drools Policy Detail +authz-add-drools-policy=Prid\u0117ti Rules taisykl\u0119 +authz-policy-drools-maven-artifact-resolve=I\u0161spr\u0119sti +authz-policy-drools-maven-artifact=Maven taisykl\u0117s artefaktas +authz-policy-drools-maven-artifact.tooltip=Nuoroda \u012F Maven GAV artifakt\u0105 kuriame apra\u0161ytos taisykl\u0117s. Kai tik nurodysite GAV, galite paspausti *I\u0161spr\u0119sti* tam kad \u012Fkelti *Modulis* ir *Sesija* laukus. +authz-policy-drools-module=Modulis +authz-policy-drools-module.tooltip=\u0160ioje taisykl\u0117je naudojamas modulis. Privalote nurodyti modul\u012F tam, kad gal\u0117tum\u0117te pasirinkti specifin\u0119 sesij\u0105 taisykli\u0173 \u012Fk\u0117limui. +authz-policy-drools-session=Sesija +authz-policy-drools-session.tooltip=\u0160ioje taisykl\u0117je naudojama sesija. Sesija teikia taisykles reikalingas \u0161ios taisykl\u0117s vykdymui. +authz-policy-drools-update-period=Atnaujinimo intervalas +authz-policy-drools-update-period.tooltip=Nurodykite laiko interval\u0105, kas kur\u012F turi b\u016Bti ie\u0161koma artefakto atnaujinim\u0173. + +# Authz JS Policy Detail +authz-add-js-policy=Prid\u0117ti JavaScript taisykl\u0119 +authz-policy-js-code=Programinis kodas +authz-policy-js-code.tooltip=JavaScript kodas kuriame apra\u0161ytos \u0161ios taisykl\u0117s s\u0105lygos. + + +# Authz Aggregated Policy Detail +authz-aggregated=Agreguota +authz-add-aggregated-policy=Prid\u0117ti agreguot\u0105 taisykl\u0119 + +# Authz Permission List +authz-no-permissions-available=N\u0117ra galim\u0173 leidim\u0173. + +# Authz Permission Detail +authz-permission-name.tooltip=\u0160io leidimo pavadinimas. +authz-permission-description.tooltip=\u0160io leidimo apra\u0161ymas. + +# Authz Resource Permission Detail +authz-add-resource-permission=Prid\u0117ti resurso leidim\u0105 +authz-permission-resource-apply-to-resource-type=Pritaikyti resurso tipui +authz-permission-resource-apply-to-resource-type.tooltip=Nurodykite ar \u0161is leidimas turi b\u016Bti pritaikomas visiems \u0161io tipo resursams. Jei \u012Fgalinta, tuomet leidimo tikrinimas bus atliekamas visiems nurodyto tipo resursams. +authz-permission-resource-resource.tooltip=Nurodykite, kad \u0161is leidimas turi b\u016Bti taikomas tik tam tikriems resursams. +authz-permission-resource-type.tooltip=Nurodykite, kad \u0161i taisykl\u0117 turi b\u016Bti taikoma visiems \u0161io tipo resursams. + +# Authz Scope Permission Detail +authz-add-scope-permission=Prid\u0117ti taikymo srities leidim\u0105 +authz-permission-scope-resource.tooltip=Pasirinkdami resur\u0105 apribosite taikymo sri\u010Di\u0173 s\u0105ra\u0161\u0105. Jei nepasirinkta, tuomet matysite visas galimas taikymo sritis. +authz-permission-scope-scope.tooltip=Nurodo, kad \u0161is leidimas turi b\u016Bti pritaikytas vienai ar daugiau taikymo sri\u010Di\u0173. + +# Authz Evaluation +authz-evaluation-identity-information=Tapatyb\u0117s informacija +authz-evaluation-identity-information.tooltip=Nurodykite tapatyb\u0117s informacij\u0105, kuri bus naudojama taisykli\u0173 vertinime. +authz-evaluation-client.tooltip=Nurodykite klient\u0105, kuris atlieka autorizacijos u\u017Eklausas. Nei nenurodyta, tuomet autorizacijos u\u017Eklausa bus vertinama naudojant dabartin\u012F klient\u0105. +authz-evaluation-user.tooltip=Nurodykite naudotoj\u0105, kurio vardu atliekamas teisi\u0173 serveryje filtravimas. +authz-evaluation-role.tooltip=Nurodykite pasirinkto naudotojo roles. +authz-evaluation-new=Papildyti u\u017Eklaus\u0105 +authz-evaluation-re-evaluate=Vertinti pakartotinai +authz-evaluation-previous=Prie\u0161 tai buv\u0119s bandymas + +authz-evaluation-contextual-info=Kontekstin\u0117 informacija +authz-evaluation-contextual-info.tooltip=Nurodykite kontekstin\u0119 informacij\u0105, kuri bus naudojama taisykli\u0173 vertinime. +authz-evaluation-contextual-attributes=Kontekstiniai atributai +authz-evaluation-contextual-attributes.tooltip=Galite pateikti vykdymo aplinkos arba vykdymo konteksto atributus. +authz-evaluation-permissions.tooltip=Nurodykite leidimus, kuriems bus taikomos taisykl\u0117s. +authz-evaluation-evaluate=Vertinti +authz-evaluation-any-resource-with-scopes=Bet kuris resursas su \u0161ia taikymo sritimi (sritimis) +authz-evaluation-no-result=Vertinant autorizacijos u\u017Eklaus\u0105 rezultat\u0173 nerasta. Patikrinkite ar egzistuoja resursai ar taikymo sritys susietos su taisykl\u0117mis. +authz-evaluation-no-policies-resource=\u0160iam resursui taisykl\u0117s nerastos. +authz-evaluation-result.tooltip=Leidim\u0173 u\u017Eklausos bendras rezultatas. +authz-evaluation-scopes.tooltip=Leid\u017Eiam\u0173 taikymo sri\u010Di\u0173 s\u0105ra\u0161as. +authz-evaluation-policies.tooltip=Informacija apie vertinime dalyvavusias taisykles ir sprendimus. +authz-evaluation-authorization-data=Atsakymas +authz-evaluation-authorization-data.tooltip=Autorizavimo u\u017Eklausos apdorojimo rezultatas su autorizacijos duomenimis. Rezultatas parodo k\u0105 Keycloak gr\u0105\u017Eina klientui pra\u0161an\u010Diam leidimo. Per\u017Ei\u016Br\u0117kite 'authorization' teigin\u012F su leidimais, kurie buvo suteikti \u0161iai autorizacijos u\u017Eklausai. +authz-show-authorization-data=Rodyti autorizacijos duomenis + +kid=KID +keys=Raktai +all=Visi +status=B\u016Bsena +keystore=Rakt\u0173 saugykla +keystores=Rakt\u0173 saugyklos +add-keystore=Prid\u0117ti rakt\u0173 saugykl\u0105 +add-keystore.placeholder=Prid\u0117ti rakt\u0173 saugykl\u0105... +view=\u017Di\u016Br\u0117ti +active=Aktyvus + +Sunday=Sekmadienis +Monday=Pirmadienis +Tuesday=Antradienis +Wednesday=Tre\u010Diadienis +Thursday=Ketvirtadienis +Friday=Penktadienis +Saturday=\u0160e\u0161tadienis + +user-storage-cache-policy=Pod\u0117lio nustatymai +userStorage.cachePolicy=Pod\u0117lio taisykl\u0117s +userStorage.cachePolicy.option.DEFAULT=DEFAULT +userStorage.cachePolicy.option.EVICT_WEEKLY=EVICT_WEEKLY +userStorage.cachePolicy.option.EVICT_DAILY=EVICT_DAILY +userStorage.cachePolicy.option.MAX_LIFESPAN=MAX_LIFESPAN +userStorage.cachePolicy.option.NO_CACHE=NO_CACHE +userStorage.cachePolicy.tooltip=Saugyklos teik\u0117jo pod\u0117lio nustatymai. 'DEFAULT' naudojami numatytieji globalaus naudotojo pod\u0117lio nustatymai. 'EVICT_DAILY' naudotoj\u0173 pod\u0117lis i\u0161valomas kiekvien\u0105 dien\u0105 numatytuoju laiku. 'EVICT_WEEKLY' naudotoj\u0173 pod\u0117lis i\u0161valomas kart\u0105 \u012F savait\u0119 numatyt\u0105 dien\u0105. 'MAX-LIFESPAN' maksimalus pod\u0117lio \u012Fra\u0161o galiojimo laikas milisekund\u0117mis. +userStorage.cachePolicy.evictionDay=I\u0161valymo diena +userStorage.cachePolicy.evictionDay.tooltip=Savait\u0117s diena, kuomet pod\u0117lio \u012Fra\u0161ai taps nebeaktual\u016Bs +userStorage.cachePolicy.evictionHour=I\u0161valymo valanda +userStorage.cachePolicy.evictionHour.tooltip=Valanda, kuomet pod\u0117lio \u012Fra\u0161ai taps nebeaktual\u016Bs. +userStorage.cachePolicy.evictionMinute=I\u0161valymo minut\u0117 +userStorage.cachePolicy.evictionMinute.tooltip=Minut\u0117, kuomet pod\u0117lio \u012Fra\u0161ai taps nebeaktual\u016Bs. +userStorage.cachePolicy.maxLifespan=Maksimalus galiojimo laikas +userStorage.cachePolicy.maxLifespan.tooltip=Maksimalus galiojimo laikas milisekund\u0117mis po kurio pod\u0117lio \u012Fra\u0161ai taps nebeaktual\u016Bs. +user-origin-link=Saugojimo kilm\u0117 + +disable=I\u0161jungti +disableable-credential-types=I\u0161jungiami tipai +credentials.disableable.tooltip=Galim\u0173 i\u0161jungti prisijungimo duomen\u0173 tip\u0173 s\u0105ra\u0161as +disable-credential-types=I\u0161jungti prisijungimo duomen\u0173 tipus +credentials.disable.tooltip=Paspauskite mygtuk\u0105 nor\u0117dami i\u0161jungti pa\u017Eym\u0117tus prisijungimo duomen\u0173 tipus +credential-types=Prisijungimo duomen\u0173 tipai +manage-user-password=Tvarkyti slapta\u017Eod\u017Eius +disable-credentials=I\u0161jungti prisijungimo duomenis +credential-reset-actions=Prisijungimo duomen\u0173 atk\u016Brimas +ldap-mappers=LDAP atitikmen\u0173 parink\u0117jai +create-ldap-mapper=Sukurti LDAP atitikmen\u0173 parink\u0117j\u0105 \ No newline at end of file diff --git a/admin/messages/admin-messages_nl.properties b/admin/messages/admin-messages_nl.properties new file mode 100644 index 0000000..e69de29 diff --git a/admin/messages/admin-messages_no.properties b/admin/messages/admin-messages_no.properties new file mode 100644 index 0000000..2dfbfb6 --- /dev/null +++ b/admin/messages/admin-messages_no.properties @@ -0,0 +1,1125 @@ +consoleTitle=Keycloak administrasjonskonsoll + +# Common messages +enabled=Aktivert +name=Navn +displayName=Vis navn +displayNameHtml=HTML vis navn +save=Lagre +cancel=Avbryt +onText=P\u00C5 +offText=AV +client=Klient +clients=Klienter +clear=T\u00F8m +selectOne=Velg en... + +true=True +false=False + +endpoints=Endepunkter + +# Realm settings +realm-detail.enabled.tooltip=Brukere og klienter har kun tilgang til et sikkerhetsdomene hvis det er aktivert +realm-detail.oidc-endpoints.tooltip=Viser konfigurasjonen av endepunkter for OpenID Connect +registrationAllowed=Registrering av bruker +registrationAllowed.tooltip=Aktiver/deaktiver registreringssiden. En lenke for registrering vil v\u00E6re synlig p\u00E5 innloggingssiden. +registrationEmailAsUsername=E-postadresse som brukernavn +registrationEmailAsUsername.tooltip=Dersom registreringssiden er aktivert, vil feltet for brukernavn v\u00E6re skjult fra registreringsskjema og e-postadresse vil bli brukt som brukernavn for nye brukere. +editUsernameAllowed=Rediger brukernavn +editUsernameAllowed.tooltip=Dersom aktivert, er feltet for brukernavn redigerbart, ellers kun lesbart. +resetPasswordAllowed=Glemt passord +resetPasswordAllowed.tooltip=Vis en lenke p\u00E5 innloggingssiden som brukere kan klikke p\u00E5 om de har glemt sine innloggingsdetaljer. +rememberMe=Husk meg +rememberMe.tooltip=Vis en avkryssingsboks p\u00E5 innloggingssiden som lar brukere forbli innlogget mellom omstart av nettleser og inntil sesjonen utl\u00F8per. +verifyEmail=Bekreft e-postadresse +verifyEmail.tooltip=Krev at bruker verifiserer sin e-postadresse f\u00F8rste gang de logger inn. +sslRequired=Krev SSL +sslRequired.option.all=Alle foresp\u00F8rsler +sslRequired.option.external=Eksterne foresp\u00F8rsler +sslRequired.option.none=Ingen +sslRequired.tooltip=Kreves HTTPS? 'Ingen' betyr at HTTPS ikke kreves for noen klienters IP-adresse. 'Ekstern foresp\u00F8rsel' betyr at localhost og private IP-adresser kan f\u00E5 tilgang uten HTTPS. 'Alle foresp\u00F8rsler' betyr at HTTPS kreves for alle IP-adresser. +publicKey=Offentlig n\u00F8kkel +privateKey=Privat n\u00F8kkel +gen-new-keys=Generer nye n\u00F8kler +certificate=Sertifikat +host=Vert +smtp-host=SMTP Vert +port=Port +smtp-port=SMTP Port (standard er 25) +from=Fra +sender-email-addr=Senders e-postadresse +enable-ssl=Aktiver SSL +enable-start-tls=Aktiver StartTLS +enable-auth=Aktiver autentisering +username=Brukernavn +login-username=Innloggingsbrukernavn +password=Passord +login-password=Innloggingspassord +login-theme=Innloggingstema +login-theme.tooltip=Velg tema for sidene: innlogging, TOTP, rettigheter, registrering, glemt passord. +account-theme=Kontotema +account-theme.tooltip=Velg tema for brukerkontoadministrasjonssider. +admin-console-theme=Administrasjonskonsolltema +select-theme-admin-console=Velg et tema for administrasjonskonsollen. +email-theme=E-posttema +select-theme-email=Velg tema for e-post sendt av server. +i18n-enabled=Internasjonalisering aktivert +supported-locales=St\u00F8ttede lokaliteter +supported-locales.placeholder=Skriv inn en lokalitet og klikk enter +default-locale=Standard lokalitet +realm-cache-clear=Cache for sikkerhetsdomenet +realm-cache-clear.tooltip=T\u00F8m sikkerhetsdomenecache (Dette vil fjerne oppf\u00F8ringer for alle sikkerhetsdomener) +user-cache-clear=Brukercache +user-cache-clear.tooltip=T\u00F8m brukercache (Dette vil fjerne oppf\u00F8ringer for alle sikkerhetsdomener) +revoke-refresh-token=Fjern refresh token +revoke-refresh-token.tooltip=Hvis aktivert kan refresh token kun bli brukt en gang. Ellers vil refresh tokens kunne bli brukt flere ganger. +sso-session-idle=Inaktiv SSO sesjon +seconds=Sekunder +minutes=Minutter +hours=Timer +days=Dager +sso-session-max=Maksimum SSO sesjon +sso-session-idle.tooltip=Tiden en sesjon er tillatt \u00E5 v\u00E6re inaktiv f\u00F8r den utl\u00F8per. Tokens og nettlesersesjoner vil bli ugyldig n\u00E5r en sesjon utl\u00F8per. +sso-session-max.tooltip=Maksimum tid f\u00F8r en sesjon utl\u00F8per. Tokens og nettlesersesjoner vil bli ugyldig n\u00E5r en sesjon utl\u00F8per. +offline-session-idle=Inaktiv sesjon i frakoblet modus +offline-session-idle.tooltip=Tiden en sesjon i frakoblet modus er tillatt \u00E5 v\u00E6re inaktiv f\u00F8r den utl\u00F8per. Du m\u00E5 bruke tokens for frakoblet modus for \u00E5 oppdatere sesjonen minst en gang i denne perioden, ellers vil sesjonen utl\u00F8pe. +access-token-lifespan=Levetid for access token +access-token-lifespan.tooltip= Maksimum tid f\u00F8r et access token utl\u00F8per. Det anbefales at denne verdien er kort i forhold til SSO timeout. +access-token-lifespan-for-implicit-flow=Access token-levetid for implicit flow +access-token-lifespan-for-implicit-flow.tooltip=Maksimum tid f\u00F8r et access token utstedt under OpenID Connect implicit flow utl\u00F8per. Det anbefales at denne er kortere enn SSO timeout. Det er ingen mulighet til \u00E5 oppdatere tokenet i l\u00F8pet av en implicit flow, derfor er det satt en separat timeout som er forskjellig fra 'Levetid for Access Token'. +client-login-timeout=Timeout av klientinnlogging +client-login-timeout.tooltip=Maksimum tid en klient har for \u00E5 fullf\u00F8re access token protokollen. Dette burde normalt v\u00E6re 1 minutt. +login-timeout=Timeout for innlogging +login-timeout.tooltip=Maksimum tid en bruker har til \u00E5 fullf\u00F8re en innlogging. Det anbefales at denne er relativt lang. 30 minutter eller mer. +login-action-timeout=Timeout for innloggingshandling. +login-action-timeout.tooltip=Maksimum tid en bruker har til \u00E5 fullf\u00F8re handlinger relatert til innlogging, som \u00E5 oppdatere passord eller konfigurere TOTP. Det anbefales at denne er relativt lang. 5 minutter eller mer. +headers=Headere +brute-force-detection=Deteksjon av Brute Force +x-frame-options=Alternativer for X-Frame +x-frame-options-tooltip=Standardverdi hindrer sider fra \u00E5 bli inkludert via non-origin iframes. (Klikk p\u00E5 etikett for mer informasjon) +content-sec-policy=Sikkerhetspolicy for innhold +content-sec-policy-tooltip=Standardverdi hindrer sider fra \u00E5 bli inkludert via non-origin iframes. (Klikk p\u00E5 etikett for mer informasjon) +content-type-options=Alternativer for X-innholdstyper +content-type-options-tooltip=Standardverdi som forhindrer Internet Explorer og Google Chrome fra \u00E5 MIME-sniffe et svar vekk fra den deklarerte innholdstypen (content-type) (Klikk p\u00E5 etikett for mer informasjon) +max-login-failures=Maksimum antall innloggingsfeil +max-login-failures.tooltip=Hvor mange feil f\u00F8r ventetid blir aktivert. +wait-increment=\u00F8kning av ventetid +wait-increment.tooltip=N\u00E5r terskelen for feil er n\u00E5dd, hvor lenge skal brukeren stenges ute? +quick-login-check-millis=Hurtig innlogging - kontroll av millisekunder +quick-login-check-millis.tooltip=Hvis en feil skjer for raskt samtidig, steng brukeren ute. +min-quick-login-wait=Minimum ventetid for hurtig innlogging +min-quick-login-wait.tooltip=Ventetid etter en hurtig innloggingsfeil. +max-wait=Maksimum ventetid +max-wait.tooltip=Maksimum tid en bruker vil v\u00E6re stengt ute. +failure-reset-time=Tid for tilbakestilling av feil. +failure-reset-time.tooltip=N\u00E5r vil teller for feil nullstilles? +realm-tab-login=Innlogging +realm-tab-keys=N\u00F8kler +realm-tab-email=E-post +realm-tab-themes=Tema +realm-tab-cache=Cache +realm-tab-tokens=Tokens +realm-tab-client-initial-access=F\u00F8rste access token +realm-tab-security-defenses=Sikkerhetsmekanismer +realm-tab-general=Generelt +add-realm=Legg til sikkerhetsdomene + +#Session settings +realm-sessions=Sikkerhetsdomenesesjoner +revocation=Oppheving +logout-all=Logg ut alle +active-sessions=Aktive sesjoner +sessions=Sesjoner +not-before=Ikke f\u00F8r +not-before.tooltip=Opphev alle tokens utstedt f\u00F8r denne datoen. +set-to-now=Sett til n\u00E5 +push=Send +push.tooltip=For enhver klient som har en administratorURL, send dem beskjed om den nye opphevingspolicyen. + +#Protocol Mapper +usermodel.prop.label=Egenskap +usermodel.prop.tooltip=Navn p\u00E5 egenskapsmetoden i UserModel-grensesnittet. For eksempel, en verdi av 'e-post' vil referere til metoden UserModel.getEmail(). +usermodel.attr.label=Brukerattributt +usermodel.attr.tooltip=Navn p\u00E5 lagret brukerattributt som er navnet p\u00E5 en attributt innenfor UserModel.attribute map. +userSession.modelNote.label=Brukersesjonsmerknad +userSession.modelNote.tooltip=Navn p\u00E5 lagret brukersesjonsmerknad innenfor UserSessionModel.note map. +multivalued.label=Flere verdier +multivalued.tooltip=Angir om en attributt st\u00F8tter flere verdier. Hvis true, vil listen med alle verdier for dette attributtet bli satt som claims. Hvis false, vil bare den f\u00F8rste verdien bli satt som claim. +selectRole.label=Velg rolle +selectRole.tooltip=Skriv inn rolle i tekstboksen til venstre, eller klikk p\u00E5 denne knappen for \u00E5 bla gjennom og velge rollen du \u00F8nsker. +tokenClaimName.label=Navn p\u00E5 token claim +tokenClaimName.tooltip=Navn p\u00E5 claim som skal legges inn i token. Denne kan v\u00E6re et fullt kvalifisert navn som 'address.street'. I dette tilfellet vil et nestet jsonobjekt bli laget. +jsonType.label=JSON-type for claims +jsonType.tooltip=JSON-type som burde bli brukt for \u00E5 fylle json claimet i tokenet. long, int, boolean og String er gyldige verdier. +includeInIdToken.label=Legg til i ID token +includeInIdToken.tooltip=Burde claim bli lagt til i ID token? +includeInAccessToken.label=Legg til i access token +includeInAccessToken.tooltip=Burde claim bli lagt til i access token? +includeInUserInfo.label=Legg til i brukerinfo +includeInUserInfo.tooltip=Burde claim bli lagt til i brukerinfo? +usermodel.clientRoleMapping.clientId.label=Klient-ID +usermodel.clientRoleMapping.clientId.tooltip=Klient-ID for \u00E5 mappe roller +usermodel.clientRoleMapping.rolePrefix.label=Prefiks for klientrolle +usermodel.clientRoleMapping.rolePrefix.tooltip=Prefiks for hver klientrolle (valgfri). +usermodel.realmRoleMapping.rolePrefix.label=Prefiks for sikkerhetsdomenerolle +usermodel.realmRoleMapping.rolePrefix.tooltip=Prefiks for hver sikkerhetsdomenerolle (valgfri). + +# client details +clients.tooltip=Klienter er betrodde nettleserapplikasjoner og web-tjenester i et sikkerhetsdomene. Disse klientene kan be om en innlogging. Du kan ogs\u00E5 definere klientspesifikke roller. +search.placeholder=S\u00F8k... +create=Opprett +import=Importer +client-id=Klient-ID +base-url=Base URL +actions=Handlinger +not-defined=Ikke definert +edit=Rediger +delete=Slett +no-results=Ingen resultater +no-clients-available=Ingen klienter er tilgjengelige +add-client=Legg til klient +select-file=Velg fil +view-details=Se detaljer +clear-import=T\u00F8m import +client-id.tooltip=Angir ID referert i URI og tokens. For eksempel 'min-klient'. For SAML er dette ogs\u00E5 forventet utgiververdi fra authn-foresp\u00F8rsler +client.name.tooltip=Angir klientnavnet som blir vist. For eksempel, 'Min klient'. St\u00F8tter n\u00F8kler for lokaliserte verdier. For eksempel\: ${my_client} +client.enabled.tooltip=Deaktiverte klienter kan ikke initiere en innlogging eller motta access tokens. +consent-required=Samtykke p\u00E5krevd +consent-required.tooltip=Hvis aktivert m\u00E5 brukere gi samtykke for at klienten skal f\u00E5 tilgang. +client-protocol=Klientprotokoll +client-protocol.tooltip='OpenID connect' tillater klienter \u00E5 verifisere identiteten til sluttbrukeren basert p\u00E5 autentisering utf\u00F8rt av en autorisasjonsserver. 'SAML' aktiverer en web-basert autentisering og autoriseringsscenarier som inkluderer cross-domain single sign-on (SSO) og som bruker security tokens som inneholder assertions for \u00E5 dele informasjon videre. +access-type=Tilgangstype +access-type.tooltip='Confidential' klienter krever en secret for \u00E5 initiere innloggingsprotokoll. 'Public' klienter krever ikke en secret. 'Bearer-only' klienter er webtjenester som aldri initierer en innlogging. +standard-flow-enabled=Standard flow aktivert +standard-flow-enabled.tooltip=Dette aktiverer standard OpenID Connect redirect-basert autentisering med autorisasjonskode. I forhold til OpenID Connect eller OAuth2 spesifikasjoner aktiverer dette st\u00F8tte for 'Authorization Code Flow' for denne klienten. +implicit-flow-enabled=Implicit flow aktivert +implicit-flow-enabled.tooltip=Dette aktiverer st\u00F8tte for OpenID Connect redirect-basert autentisering uten autorisasjonskode. I forhold til OpenID Connect eller OAuth2 spesifikasjoner aktiverer dette st\u00F8tte for 'Implicit Flow' for denne klienten. +direct-access-grants-enabled=Direct access grants aktivert +direct-access-grants-enabled.tooltip=Dette gir st\u00F8tte for Direct Access Grants, som betyr at klienten har tilgang til brukerens brukernavn/passord og kan bytte dette direkte med Keycloak-serveren for access token. I f\u00F8lge OAuth2 spesifikasjonen, aktiverer dette st\u00F8tte for 'Resource Owner Password Credentials Grant' for denne klienten. +service-accounts-enabled=Tjenestekonto aktivert +service-accounts-enabled.tooltip=Lar deg autentisere denne klienten til Keycloak og hente access token dedikert til denne klienten. I f\u00F8lge OAuth2 spesifikasjonen, aktiverer dette st\u00F8tte for 'Client Credentials Grant' for denne klienten. +include-authnstatement=Inkluder AuthnStatement +include-authnstatement.tooltip=Skal et statement som spesifiserer metoden for tidsstempel inng\u00E5 i innloggingssvaret? +sign-documents=Signer dokumenter +sign-documents.tooltip=Skal SAML dokumenter bli signert av sikkerhetsdomenet? +sign-assertions=Signer assertions +sign-assertions.tooltip=Skal assertions i SAML dokumenter bli signert? Denne innstillingen er ikke n\u00F8dvendig hvis et dokument allerede har blitt signert. +signature-algorithm=Signaturalgoritme +signature-algorithm.tooltip=Signaturalgoritmen som brukes for \u00E5 signere et dokument. +canonicalization-method=Kanoniseringsmetode +canonicalization-method.tooltip=Kanoniseringsmetode for XML signaturer. +encrypt-assertions=Krypter assertions +encrypt-assertions.tooltip=Skal SAML assertions bli kryptert med klientens offentlige n\u00F8kkel ved \u00E5 bruke AES? +client-signature-required=Klientens signatur er p\u00E5krevd +client-signature-required.tooltip=Skal klienten signere sine SAML foresp\u00F8rsler og svar? Og skal de valideres? +force-post-binding=Force POST binding +force-post-binding.tooltip=Bruk alltid POST binding for svar. +front-channel-logout=Front channel utlogging +front-channel-logout.tooltip=Hvis satt til true, krever utlogging en redirect i nettleser til klient. Hvis satt til false, vil server utf\u00F8re en bakgrunnskall for utlogging. +force-name-id-format=Force navn-ID format +force-name-id-format.tooltip=Ignorer forespurt format p\u00E5 Navn-ID emnet og bruk den som er konfigurert i administrasjonskonsollen. +name-id-format=Navn-ID format +name-id-format.tooltip=Navn-ID formatet som skal brukes for emnet. +root-url=Root URL +root-url.tooltip=Root URL lagt til relative URLer +valid-redirect-uris=Gyldig redirect URIer +valid-redirect-uris.tooltip=Gyldig URI m\u00F8nster som en nettleser kan redirecte til etter en vellykket innlogging eller utlogging. Enkle jokertegn er tillatt, for eksempel 'http://example.com/*'. Relativ sti kan ogs\u00E5 spesifiseres, for eksempel /my/relative/path/*. Relative stier er relative til klientens root URL, eller hvis ingen er spesifisert brukes root URL for autorisasjonsserveren. For SAML m\u00E5 du sette et gyldig URI m\u00F8nster hvis du er avhengig av at URL for forbrukertjenesten er integrert med foresp\u00F8rselen for p\u00E5logging. +base-url.tooltip=Standard URL som kan brukes n\u00E5r autorisasjonsserveren trenger \u00E5 redirecte eller lenke tilbake til klienten. +admin-url=Admin URL +admin-url.tooltip=URL til administratorgrensesnitt for klienten. Sett denne hvis klienten st\u00F8tter adapter REST API. Dette REST APIet tillater autorisasjonsserveren til \u00E5 sende tilbakekallingsregler og andre administrative oppgaver. Vanligvis er dette satt til klientens base URL. +master-saml-processing-url=Master SAML prosesserings URL +master-saml-processing-url.tooltip=Hvis konfigurert vil denne URLen bli brukt for hver binding til b\u00E5de SPs Assertion Consumer og Single Logout-tjenester. Denne kan bli individuelt overstyrt for hver binding og tjenester i konfigurasjonen for finkornet SAML endepunkt. +idp-sso-url-ref=IDP initiert SSO URL navn +idp-sso-url-ref.tooltip=Navn p\u00E5 URL-fragment som refererer til klienten n\u00E5r du vil gj\u00F8re en IDP initiert SSO. La denne st\u00E5 tom om du \u00F8nsker \u00E5 deaktivere IDP initiert SSO. URLen vil v\u00E6re: {server-root}/realms/{realm}/protocol/saml/clients/{client-url-name} +idp-sso-relay-state=IDP initiert SSO relay state +idp-sso-relay-state.tooltip=Relay state du \u00F8nsker \u00E5 sende med SAML foresp\u00F8rselen n\u00E5r du vil utf\u00F8re en IDP initiert SSO. +web-origins=Web origins +web-origins.tooltip=Tillat CORS origins. For \u00E5 tillate alle origins med gyldig Redirect URIer legg til '+'. For \u00E5 tillate alle origins legg til '*'. +fine-saml-endpoint-conf=Finkornet SAML endepunktskonfigurasjon +fine-saml-endpoint-conf.tooltip=Utvid denne delen til \u00E5 konfigurere n\u00F8yaktige URLer for Assertion Consumer og Single Logout-tjeneste. +assertion-consumer-post-binding-url=Assertion consumer service POST binding URL +assertion-consumer-post-binding-url.tooltip=SAML POST binding URL for klientens assertion customer service (innloggingsrespons). Du kan la denne st\u00E5 tom om du ikke \u00F8nsker en URL for denne bindingen. +assertion-consumer-redirect-binding-url=Assertion Consumer Service redirect binding URL +assertion-consumer-redirect-binding-url.tooltip=SAML redirect for klientens assertion consumer service (innloggingsrespons). Du kan la denne st\u00E5 tom om du ikke \u00F8nsker en URL for denne bindingen. +logout-service-binding-post-url=logout-tjeneste POST binding URL +logout-service-binding-post-url.tooltip=SAML POST binding URL for klientens single logout-tjeneste. Du kan la dette st\u00E5 tomt om du bruker en annen binding. +logout-service-redir-binding-url=Logout-tjeneste redirect binding URL +logout-service-redir-binding-url.tooltip=SAML redirect binding URL for klientens single logout-tjeneste. Du kan la dette st\u00E5 tomt om du bruker en annen binding. + +# client import +import-client=Importer klient +format-option=Formatalternativer +select-format=Velg et format +import-file=Importer fil + +# client tabs +settings=Innstillinger +credentials=Innloggingsdetaljer +saml-keys=SAML n\u00F8kler +roles=Roller +mappers=Mappere +mappers.tooltip=Protokollmappere som utf\u00F8rer endringer av tokens og dokumenter. De kan utf\u00F8re handlinger som \u00E5 mappe brukerdata til protokollclaims, eller bare endre foresp\u00F8rsler som blir sendt mellom klienten og autorisasjonsserver. +scope=Scope +scope.tooltip=Mapping av scope lar deg begrense hvilke rollemappinger som er inkludert i access token som klienten har bedt om. +sessions.tooltip=Viser aktive sesjoner for denne klienten. Tillater deg \u00E5 se hvilke brukere som er aktive og n\u00E5r de logget inn. +offline-access=Frakoblet tilgang +offline-access.tooltip=Viser frakoblede sesjoner for denne klienten. Tillater deg \u00E5 se hvilke brukere som henter tokens for frakoblet modus og n\u00E5r de henter den. For \u00E5 tilbakekalle alle tokens for klienten, g\u00E5 til fanen Opphev og sett verdien for Ikke f\u00F8r til n\u00E5. +clustering=Clustering +installation=Installasjon +installation.tooltip=Verkt\u00F8y for \u00E5 generere ulike konfigurasjonsformater for klientadapter som du kan laste ned eller klippe og lime inn for \u00E5 konfigurere klientene dine. +service-account-roles=Tjenestekonto-roller +service-account-roles.tooltip=Tillater deg \u00E5 autentisere rollemappinger for tjenestekontoen som er dedikert til denne klienten. + +# client credentials +client-authenticator=Klientautentikator +client-authenticator.tooltip=Klientautentikator som blir brukt for \u00E5 autentisere denne klienten mot keycloak-server +certificate.tooltip=Klientsertifikat for \u00E5 validere JWT utstedt av klienten og signert av privatn\u00F8kkel til klient fra din keystore. +publicKey.tooltip=Offentlig n\u00F8kkel for \u00E5 validere JWT utstedt av klient og signert av klientens privatn\u00F8kkel. +no-client-certificate-configured=Ingen klientsertifikat er konfigurert +gen-new-keys-and-cert=Generer nye n\u00F8kler og sertifikater +import-certificate=Importer sertifikat +gen-client-private-key=Generer privatn\u00F8kkel for klient +generate-private-key=Generer privatn\u00F8kkel +archive-format=Arkivformat +archive-format.tooltip=Java keystore eller PKCS12 arkivformat. +key-alias=N\u00F8kkelalias +key-alias.tooltip=Arkiv-alias for din privatn\u00F8kkel og sertifikater. +key-password=N\u00F8kkelpassord +key-password.tooltip=Passord for \u00E5 f\u00E5 tilgang til privatn\u00F8kler i arkivet +store-password=Lagre passord +store-password.tooltip=Passord for \u00E5 f\u00E5 tilgang til arkivet +generate-and-download=Generer og Last ned +client-certificate-import=Import av klientsertifikat +import-client-certificate=Importer klientsertifikat +jwt-import.key-alias.tooltip=Arkiv-alias for sertifikatet ditt. +secret=Secret +regenerate-secret=Regenere secret +registrationAccessToken=Access token for registrering +registrationAccessToken.regenerate=Regenerer access token for registrering +registrationAccessToken.tooltip=Access token for registrering gir klienter tilgang til registreringstjenesten for klienter. +add-role=Legg til rolle +role-name=Rollenavn +composite=Sammensatt +description=Beskrivelse +no-client-roles-available=Ingen klientroller er tilgjengelig +scope-param-required=Scope parameter p\u00E5krevd +scope-param-required.tooltip=Denne rollen vil kun bli gitt hvis parameter for scope med rollenavn blir brukt under foresp\u00F8rsel av autorisasjon/token. +composite-roles=Sammensatte roller +composite-roles.tooltip=N\u00E5r denne rollen er tildelt/ikke tildelt til en bruker, vil hvilken som helst rolle assosiert med denne bli implisitt tildelt/ikke tildelt. +realm-roles=Sikkerhetsdomeneroller +available-roles=Tilgjengelig roller +add-selected=Legg til valgte +associated-roles=Assosierte roller +composite.associated-realm-roles.tooltip=Sikkerhetsdomeneniv\u00E5-rolle knyttet til denne sammensatte rollen. +composite.available-realm-roles.tooltip=Sikkerhetsdomeneniv\u00E5-roller knyttet til denne sammensatte rollen. +remove-selected=Fjern valgte +client-roles=Klientroller +select-client-to-view-roles=Velg klient for \u00E5 se roller for klient +available-roles.tooltip=Roller fra denne klienten som du kan knytte til denne sammensatte rollen. +client.associated-roles.tooltip=Klientrolle assosiert med denne sammensatte rollen. +add-builtin=Legg til Builtin +category=Kategori +type=Type +no-mappers-available=Ingen mappere er tilgjengelig +add-builtin-protocol-mappers=Legg til Builtin protokollmappere +add-builtin-protocol-mapper=Legg til Builtin protokollmapper +scope-mappings=Scopemapping +full-scope-allowed=Tillatt med fullt scope +full-scope-allowed.tooltip=Lar deg \u00E5 deaktivere alle restriksjoner. +scope.available-roles.tooltip=Sikkerhetsdomeneniv\u00E5-roller som kan bli tildelt til scope. +assigned-roles=Tildelte roller +assigned-roles.tooltip=Sikkerhetsdomeneniv\u00E5-roller tildelt til scope. +effective-roles=Effektive roller +realm.effective-roles.tooltip=Tildelte sikkerhetsdomeneniv\u00E5-roller som kan ha blitt arvet fra en sammensatt rolle. +select-client-roles.tooltip=Velg en klient for \u00E5 se roller for klient +assign.available-roles.tooltip=Klientroller som er tilgjengelige til \u00E5 bli tildelt. +client.assigned-roles.tooltip=Tildelte klientroller. +client.effective-roles.tooltip=Tildelte klientroller som kan ha blitt arvet fra en sammensatt rolle. +basic-configuration=Basiskonfigurasjon +node-reregistration-timeout=Timeout for re-registrering av node +node-reregistration-timeout.tooltip=Intervall for \u00E5 angi maksimum tid for registrerte klienters clusternoder for \u00E5 re-registreres. Hvis en clusternode ikke sender re-regisreringsforesp\u00F8rsel til Keycloak innen dette intervallet, vil den bli uregistrert fra Keycloak. +registered-cluster-nodes=Registrerte clusternoder +register-node-manually=Register node manuelt +test-cluster-availability=Test cluster tilgjengelighet +last-registration=Siste registrering +node-host=Nodevert +no-registered-cluster-nodes=Ingen registrerte clusternoder tilgjengelig +cluster-nodes=Clusternoder +add-node=Legg til node +active-sessions.tooltip=Totalt antall aktive brukersesjoner for denne klienten. +show-sessions=Vis sesjoner +show-sessions.tooltip=Advarsel, dette er en potensielt kostbar operasjon avhengig av antall aktive sesjoner. +user=Bruker +from-ip=Fra IP +session-start=Start av sesjon +first-page=F\u00F8rste side +previous-page=Forrige side +next-page=Neste side +client-revoke.not-before.tooltip=Opphev alle token utstedt f\u00F8r denne datoen for denne klienten. +client-revoke.push.tooltip=Hvis administrator URL er konfigurert for denne klienten, dytt denne policyen p\u00E5 denne klienten. +select-a-format=Velg et format +download=Last ned +offline-tokens=Offline tokens +offline-tokens.tooltip=Totalt antall offline tokens for denne klienten. +show-offline-tokens=Vis offline tokens +show-offline-tokens.tooltip=Advarsel, dette er en potensielt kostbar operasjon avhengig av antall offline tokens. +token-issued=Utgitt token +last-access=Sist aksessert +last-refresh=Siste refresh +key-export=Eksporter n\u00F8kkel +key-import=Importer n\u00F8kkel +export-saml-key=Eksporter SAML n\u00F8kkel +import-saml-key=Importer SAML n\u00F8kkel +realm-certificate-alias=Alias for sikkerhetsdomenesertifikat +realm-certificate-alias.tooltip=Sertifikat for sikkerhetsdomenet er ogs\u00E5 lagret i arkivet. Dette er aliaset. +signing-key=Signeringsn\u00F8kkel +saml-signing-key=SAML signeringsn\u00F8kkel +private-key=Privatn\u00F8kkel +generate-new-keys=Generer nye n\u00F8kler +export=Eksporter +encryption-key=Krypteringsn\u00F8kkel +saml-encryption-key.tooltip=SAML krypteringsn\u00F8kkel. +service-accounts=Tjenestekonto-konto +service-account.available-roles.tooltip=Sikkerhetsdomeneniv\u00E5-roller som kan bli tildelt til tjeneste-konto. +service-account.assigned-roles.tooltip=Sikkerhetsdomeneniv\u00E5-roller tildelt service-konto. +service-account-is-not-enabled-for=Tjeneste-konto er ikke aktivert for {{client}} +create-protocol-mappers=Opprett protokollmappere +create-protocol-mapper=Opprett protokollmapper +protocol=Protokoll +protocol.tooltip=Protokoll... +id=ID +mapper.name.tooltip=Navn p\u00E5 mapper. +mapper.consent-required.tooltip=Ved tildeling av midlertidig tilgang m\u00E5 brukeren samtykke til \u00E5 gi denne informasjonen til klienten? +consent-text=Samtykketekst +consent-text.tooltip=Tekst som blir vist p\u00E5 side for samtykke. +mapper-type=Mappertype +mapper-type.tooltip=Type mapper +# realm identity providers +identity-providers=Identitetsleverand\u00F8r +table-of-identity-providers=Liste over identitetsleverand\u00F8rer +add-provider.placeholder=Legg til leverand\u00F8r... +provider=Leverand\u00F8r +gui-order=Rekkef\u00F8lge for brukergrensesnitt +first-broker-login-flow=Flyt for f\u00F8rste innlogging +post-broker-login-flow=Post-p\u00E5loggingsflyt +redirect-uri=Redirect URI +redirect-uri.tooltip=Redirect URI som skal brukes n\u00E5r du konfigurerer identitetsleverand\u00F8ren. +alias=Alias +identity-provider.alias.tooltip=Aliaset identifiserer en identitetsleverand\u00F8r og kan brukes for \u00E5 bygge en redirect uri. +identity-provider.enabled.tooltip=Aktiver/deaktiver denne identitetsleverand\u00F8ren. +authenticate-by-default=Autentiser som standard +identity-provider.authenticate-by-default.tooltip=Indikerer om en leverand\u00F8r burde fors\u00F8kes \u00E5 brukes om standard for autentisering selv om innloggingssiden enda ikke har blitt vist. +store-tokens=Lagre Tokens +identity-provider.store-tokens.tooltip=Aktiver/deaktiver hvis tokens m\u00E5 bli lagret etter at brukere har blitt autentisert. +stored-tokens-readable=Lagrede lesbare tokens +identity-provider.stored-tokens-readable.tooltip=Aktiver/deaktiver hvis nye brukere kan lese lagrede tokens. Dette tildeles broker.read-token rollen. +update-profile-on-first-login=Oppdater profil ved f\u00F8rste innlogging +on=P\u00E5 +on-missing-info=Ved manglende informasjon +off=Av +update-profile-on-first-login.tooltip=Definer vilk\u00E5rene en bruker m\u00E5 oppfylle for \u00E5 oppdatere sin profil ved f\u00F8rste innlogging. +trust-email=Stol p\u00E5 e-post +trust-email.tooltip=Hvis aktivert vil ikke e-post levert av denne leverand\u00F8ren bli verifisert selv om verifisering er aktivert for sikkerhetsdomenet. +gui-order.tooltip=Antall som angir rekkef\u00F8lgen av leverand\u00F8rer i brukergrensesnittet (For eksempel p\u00E5 innloggingssiden). +first-broker-login-flow.tooltip=Alias for autentiseringsflyt, som trigges etter f\u00F8rste innlogging med denne identitetsleverand\u00F8ren. Begrepet 'F\u00F8rste innlogging' betyr at det enn\u00E5 ikke eksisterer en Keycloak-konto koblet til den autentiserte kontoen til identitetsleverand\u00F8ren. +post-broker-login-flow.tooltip=Alias for autentiseringsflyt, som trigges etter hver innlogging med denne identitetsleverand\u00F8ren. Nyttig om man \u00F8nsker tilleggsverifikasjon av hver bruker autentisert med denne identitetsleverand\u00F8ren (for eksempel med engangskode/engangspassord). La denne st\u00E5 tom om du ikke \u00F8nsker at tilleggautentisering skal bli trigget etter en innlogging med denne identitetsleverand\u00F8ren. Merk ogs\u00E5 at implementasjonen av denne autentikatoren m\u00E5 anta at bruker allerede er satt i ClientSession ettersom identitetsleverand\u00F8ren allerede setter det. +openid-connect-config=OpenID Connect konfigurasjon +openid-connect-config.tooltip=OIDC SP og ekstern IDP-konfigurasjon. +authorization-url=Autorisasjons URL +authorization-url.tooltip=Autorisasjons URLen. +token-url=Token URL +token-url.tooltip=Token URLen. +logout-url=Utloggings URL +identity-provider.logout-url.tooltip=Endepunkt for avsluttende sesjon som brukes for \u00E5 logge ut bruker fra ekstern IDP. +backchannel-logout=Backchannel utlogging +backchannel-logout.tooltip=St\u00F8tter ekstern IDP backchannel utlogging? +user-info-url=Brukerinfo URL +user-info-url.tooltip=Brukerinfo URLen. Denne er valgfri. +identity-provider.client-id.tooltip=Klienten eller klientidentifikator registrert hos identitetsleverand\u00F8ren. +client-secret=Klient secret +show-secret=Vis secret +hide-secret=Skjul secret +client-secret.tooltip=Klienten eller klient secret registrert hos identitetsleverand\u00F8ren. +issuer=Utgiver +issuer.tooltip=Identifikator for utgiver av foresp\u00F8rselen. Hvis dette ikke er oppgitt vil ingen validering utf\u00F8res. +default-scopes=Standard Scopes +identity-provider.default-scopes.tooltip=Scopes som sendes n\u00E5r du ber om autorisasjon. Dette kan v\u00E6re en liste med scopes separert med mellomrom. Standard er satt til 'openid'. +prompt=Prompt +unspecified.option=uspesifisert +none.option=Ingen +consent.option=samtykke +login.option=Innlogging +select-account.option=velg_konto (select_account) +prompt.tooltip=Spesifiserer om autorisasjonsserver skal be sluttbruker om re-autentisering og samtykke. +validate-signatures=Valider signaturer +identity-provider.validate-signatures.tooltip=Aktiver/deaktiver signaturvalidering av eksterne IDP signaturer. +validating-public-key=Valider offentlig n\u00F8kkel +identity-provider.validating-public-key.tooltip=PEM format for offentlig n\u00F8kkel som m\u00E5 brukes for \u00E5 kontrollere eksterne IDP signaturer. +import-external-idp-config=Importer ekstern IDP konfigurasjon +import-external-idp-config.tooltip=Lar deg laste inn ekstern IDP metadata fra en konfigurasjonsfil eller ved \u00E5 laste det ned fra en URL. +import-from-url=Importer fra URL +identity-provider.import-from-url.tooltip=Importer metadata fra et eksternt IDP discovery descriptor. +import-from-file=Importer fra fil +identity-provider.import-from-file.tooltip=Importer metadata fra en nedlastet IDP discovery descriptor. +saml-config=SAML konfigurasjon +identity-provider.saml-config.tooltip=SAML SP og ekstern IDP konfigurasjon. +single-signon-service-url=Single sign-on service URL +saml.single-signon-service-url.tooltip=URL som m\u00E5 brukes for \u00E5 sende autentiseringsforesp\u00F8rsler (SAML AuthnRequest). +single-logout-service-url=Single utloggingstjeneste URL +saml.single-logout-service-url.tooltip=URL som m\u00E5 brukes for \u00E5 sende utloggingsforesp\u00F8rsler. +nameid-policy-format=Policy for nameid-format +nameid-policy-format.tooltip=Angir URI-referanse som tilsvarer et format for identifikator-navn. Standard er satt til urn:oasis:names:tc:SAML:2.0:nameid-format:persistent. +http-post-binding-response=HTTP-POST binding svar +http-post-binding-response.tooltip=Indikerer om man skal svare p\u00E5 foresp\u00F8rsler som bruker HTTP-POST binding eller ikke. Hvis satt til false, vil HTTP-REDIRECT binding bli brukt. +http-post-binding-for-authn-request=HTTP-POST binding for AuthnRequest +http-post-binding-for-authn-request.tooltip=Indikerer om AuthnRequests m\u00E5 bli sendt ved \u00E5 bruke en HTTP-POST binding. Hvis satt til false, vil HTTP-REDIRECT binding bli brukt. +want-authn-requests-signed=Vil ha AuthnRequests signert +want-authn-requests-signed.tooltip=Indikerer om identitetsleverand\u00F8r forventer en signert AuthnRequest. +force-authentication=Force autentisering +identity-provider.force-authentication.tooltip=Indikerer om identitetsleverand\u00F8r m\u00E5 autentisere presentat\u00F8ren direkte i stedet for \u00E5 stole p\u00E5 en tidligere sikkerhetskontekst. +validate-signature=Valider signatur +saml.validate-signature.tooltip=Aktiver/deaktiver signaturvalidering av SAML svar. +validating-x509-certificate=Validerer X509 sertifikat +validating-x509-certificate.tooltip=Sertifikatet i PEM format som m\u00E5 brukes for \u00E5 se etter signaturer. +saml.import-from-url.tooltip=Importer metadata fra et eksternt IDP SAML entity descriptor. +social.client-id.tooltip=Identifikator for klient registrert hos identitetsleverand\u00F8r. +social.client-secret.tooltip=Klient secret registrert hos identitetsleverand\u00F8r. +social.default-scopes.tooltip=Scopes som sendes n\u00E5r tillatelse for autorisasjon blir etterspurt. Se dokumentasjon for mulige verdier, separator og standardverdi. +key=N\u00F8kkel +stackoverflow.key.tooltip=N\u00F8kkelen er hentet fra klientregistrering p\u00E5 Stack Overflow. + +# User federation +sync-ldap-roles-to-keycloak=Synkroniser LDAP-roller til Keycloak +sync-keycloak-roles-to-ldap=Synkroniser Keycloak-roller til LDAP +sync-ldap-groups-to-keycloak=Synkroniser LDAP-grupper til Keycloak +sync-keycloak-groups-to-ldap=Synkroniser Keycloak-grupper til LDAP + +realms=Sikkerhetsdomener +realm=Sikkerhetsdomene + +identity-provider-mappers=Identitetsleverand\u00F8rmappere +create-identity-provider-mapper=Opprett identitetsleverand\u00F8rmappere +add-identity-provider-mapper=Legg til identitetsleverand\u00F8rmappere +client.description.tooltip=Angir beskrivelse av klienten. For eksempel\: 'Min klient for timelister'. St\u00F8tter n\u00F8kler for lokaliserte verdier. For eksempel\: ${my_client_description} + +expires=Utl\u00F8per +expiration=Holdbarhet +expiration.tooltip=Angir hvor lenge et token skal v\u00E6re gyldig +count=Teller +count.tooltip=Angir hvor mange klienter som kan bli opprettet ved \u00E5 bruke token. +remainingCount=Resterende antall +created=Opprettet +back=Tilbake +initial-access-tokens=F\u00F8rste access tokens +initial-access-tokens.tooltip=F\u00F8rste access tokens for dynamisk registrering av klienter. Foresp\u00F8rsler med disse tokens kan bli sent fra alle verter. +add-initial-access-tokens=Legg til f\u00F8rste access token +initial-access-token=F\u00F8rste access token +initial-access.copyPaste.tooltip=Kopier/lim inn f\u00F8rste access token f\u00F8r du navigerer vekk fra denne siden ettersom det ikke er mulig \u00E5 hente den senere. +continue=Fortsett +initial-access-token.confirm.title=Kopier f\u00F8rste access token +initial-access-token.confirm.text=Vennligst kopier og lim inn f\u00F8rste access token f\u00F8r du bekrefter ettersom den ikke kan hentes senere +no-initial-access-available=F\u00F8rste access token er ikke tilgjengelig + +trusted-hosts-legend=Betrodde verter for klientregistrering +trusted-hosts-legend.tooltip=Verter, som er betrodd for klientregistrering. klientregistreringsforesp\u00F8rsler fra disse vertene kan bli sent selv uten f\u00F8rste access token. Antall klientregistreringer fra denne spesifikke verten kan bli begrenset til et spesifisert antall. +no-client-trusted-hosts-available=Ingen betrodde verter er tilgjengelig +add-client-reg-trusted-host=Legg til betrodd vert +hostname=Vertsnavn +client-reg-hostname.tooltip=Vertsnavn eller IP-adresse. Klientregistreringsforesp\u00F8rsler fra denne verten/adressen vil bli betrodd og tillat til \u00E5 registrere en ny klient. +client-reg-count.tooltip=Tillat antall klientregistreringsforesp\u00F8rsler fra en spesifikk vert. Du m\u00E5 restarte denne n\u00E5r grensen er n\u00E5dd. +client-reg-remainingCount.tooltip=Gjenv\u00E6rende antall klientregistreringsforesp\u00F8rsler fra denne verten. Du m\u00E5 restarte denne n\u00E5r grensen er n\u00E5dd. +reset-remaining-count=Tilbakestill gjenst\u00E5ende antall + +client-templates=Klientmaler +client-templates.tooltip=Klientmaler tillater deg \u00E5 definere felles konfigurasjon som er delt av flere klienter. + +groups=Grupper + +group.add-selected.tooltip=Sikkerhetsdomene-roller som kan bli tildelt gruppen. +group.assigned-roles.tooltip=Sikkerhetsdomene-roller mappet til gruppen. +group.effective-roles.tooltip=Alle sikkerhetsdomene-rollemappinger. Noen roller kan ha blitt arvet fra en sammensatt rolle. +group.available-roles.tooltip=Roller som kan tildeles fra denne klienten. +group.assigned-roles-client.tooltip=Rollemapping for denne klienten. +group.effective-roles-client.tooltip=Rollemapping for denne klienten. Noen roller kan ha blitt arvet fra en mappet sammensatt rolle. + +default-roles=Standardroller +no-realm-roles-available=Ingen sikkerhetsdomener er tilgjengelig + +users=Brukere +user.add-selected.tooltip=Sikkerhetsdomene-roller som kan bli tildelt bruker. +user.assigned-roles.tooltip=Sikkerhetsdomene-roller mappet til bruker +user.effective-roles.tooltip=Alle sikkerhetsdomene-rollemappinger. Noen roller kan ha blitt arvet fra en sammensatt rolle. +user.available-roles.tooltip=Roller som kan tildeles fra denne klienten. +user.assigned-roles-client.tooltip=Rollemapping for denne klienten. +user.effective-roles-client.tooltip=Rollemapping for denne klienten. Noen roller kan ha blitt arvet fra en mappet sammensatt rolle. +default.available-roles.tooltip=Sikkerhetsdomene-roller som kan tildeles. +realm-default-roles=Standardroller for sikkerhetsdomene +realm-default-roles.tooltip=Sikkerhetsdomene-roller tildelt nye brukere. +default.available-roles-client.tooltip=Roller fra denne klienten som blir tildelt som standard. +client-default-roles=Standard klientroller +client-default-roles.tooltip=Roller fra denne klienten blir tildelt som standardrolle. +composite.available-roles.tooltip=Sikkerhetsdomene-roller knyttet til denne sammensatte rollen. +composite.associated-roles.tooltip=Sikkerhetsdomeneniv\u00E5-roller knyttet til denne sammensatte rollen. +composite.available-roles-client.tooltip=Roller fra denne klienten kan du assosiere med denne sammensatte rollen. +composite.associated-roles-client.tooltip=Klientroller knyttet til denne sammensatte rollen. +partial-import=Delvis import +partial-import.tooltip=Delvis import lar deg importere brukere, klienter og andre ressurser fra en tidligere eksportert json-fil. + +file=File +exported-json-file=Eksporter json-fil +import-from-realm=Importer fra sikkerhetsdomene +import-users=Importer brukere +import-groups=Importer grupper +import-clients=Importer klienter +import-identity-providers=Importer identitetsleverand\u00F8rer +import-realm-roles=Importer roller for sikkerhetsdomene +import-client-roles=Importer klientroller +if-resource-exists=Hvis en ressurs eksisterer +fail=Mislykkes +skip=Hopp over +overwrite=Skriv over +if-resource-exists.tooltip=Spesifiser hva som skal gj\u00F8res om du fors\u00F8ker \u00E5 importere en ressurs som allerede eksisterer. + +action=Handling +role-selector=Rollevelger +realm-roles.tooltip=Rolle for sikkerhetsdomene som kan velges. + +select-a-role=Velg en rolle +select-realm-role=Velg en rolle for sikkerhetsdomenet +client-roles.tooltip=Klientroller som kan velges. +select-client-role=Velg klientrolle + +client-template=Klientmal +client-template.tooltip=Klientmal som denne klienten arver konfigurasjonen fra +client-saml-endpoint=Endepunkt for klient-SAML +add-client-template=Legg til klientmal + +manage=H\u00E5ndter +authentication=Autentisering +user-storage=Brukerlagring +user-federation=Brukerfederering +events=Hendelser +realm-settings=Innstillinger for sikkerhetsdomene +configure=Konfigurer +select-realm=Velg sikkerhetsdomene +add=Legg til + +client-template.name.tooltip=Navn p\u00E5 klientmal. M\u00E5 v\u00E6re unik i sikkerhetsdomenet. +client-template.description.tooltip=Beskrivelse av klientmal +client-template.protocol.tooltip=Hvilken SSO protokoll-konfigurasjon som blir levert av denne klientmalen + +add-user-federation-provider=Legg til leverand\u00F8r for brukerfederering +add-user-storage-provider=Legg til brukerlagringsleverand\u00F8r +required-settings=P\u00E5krevde innstillinger +provider-id=Leverand\u00F8r-ID +console-display-name=Konsoll vis navn +console-display-name.tooltip=Viser navn p\u00E5 leverand\u00F8r n\u00E5r den er lenket i administratorkonsollen. +priority=Prioritet +priority.tooltip=Prioritet av leverand\u00F8r n\u00E5r et oppslag av bruker utf\u00F8res. Lavest f\u00F8rst. +sync-settings=Innstillinger for synkronisering +periodic-full-sync=Fullstendig periodisk synkronisering +periodic-full-sync.tooltip=Skal fullstendig periodisk synkronisering av leverand\u00F8r-brukere til Keycloak v\u00E6re aktivert eller deaktivert +full-sync-period=Fullstendig synkroniseringsperiode +full-sync-period.tooltip=Periode for fullstendig synkronisering i sekunder +periodic-changed-users-sync=Periodisk synkronisering av endrede brukere +periodic-changed-users-sync.tooltip=Skal periodisk synkronisering av endrede eller nylig opprettede leverand\u00F8r-brukere til Keycloak v\u00E6re aktivert eller deaktivert +changed-users-sync-period=Synkroniseringsperiode for endrede brukere +changed-users-sync-period.tooltip=Periode for synkronisering av endrede eller nylig opprettede leverand\u00F8r-brukere i sekunder. +synchronize-changed-users=Synkroniser endrede brukere +synchronize-all-users=Synkroniser alle brukere +kerberos-realm=Sikkerhetsdomene for Kerberos +kerberos-realm.tooltip=Navn p\u00E5 kerberos-sikkerhetsdomene. For eksempel FOO.ORG +server-principal=Server principal +server-principal.tooltip=Fullstendig navn p\u00E5 server principal for HTTP-service som inkluderer server og domenenavn. For eksempel HTTP/host.foo.org@FOO.ORG +keytab=KeyTab +keytab.tooltip=Plassering av Kerberos-keytab fil som inneholder legitimasjonsdetaljer for server principal. For eksempel /etc/krb5.keytab +debug=Feils\u00F8king +debug.tooltip=Aktiver/deaktiver logging av feils\u00F8king til standard output for Krb5LoginModule. +allow-password-authentication=Tillat autentisering med passord +allow-password-authentication.tooltip=Aktiver/deaktivert muligheten for autentisering med brukernavn/passord mot databasen til Kerberos +edit-mode=Redigeringsmodus +edit-mode.tooltip=READ_ONLY betyr at passordoppdateringer ikke er tillatt, og at bruker alltid autentiseres med et Kerberos-passord. UNSYNCED betyr at bruker kan endre sitt passord i databasen til Keycloak og at denne vil bli brukt i stedet for Kerberos-passordet. +ldap.edit-mode.tooltip=READ_ONLY er et skrivebeskyttet LDAP-lager. WRITABLE betyr at data vil bli synkronisert tilbake til LDAP p\u00E5 foresp\u00F8rsel. UNSYNCED betyr at brukerdata vil bli importert, men vil ikke bli synkronisert tilbake til LDAP. +update-profile-first-login=Oppdater profil ved f\u00F8rste innlogging +update-profile-first-login.tooltip=Oppdater profil ved f\u00F8rste innlogging +sync-registrations=Synkroniser registreringer +ldap.sync-registrations.tooltip=Skal nylig opprettede brukere bli opprettet innenfor et LDAP-lager? Prioritet p\u00E5virker hvilken leverand\u00F8r som er valgt for \u00E5 synkronisere den nye brukeren. +vendor=Leverand\u00F8r +ldap.vendor.tooltip=LDAP leverand\u00F8r (provider) +username-ldap-attribute=Brukernavn LDAP-attributt +ldap-attribute-name-for-username=LDAP-attributtnavn for brukernavn +username-ldap-attribute.tooltip=Navn p\u00E5 LDAP-attributt, som er kartlagt som et Keycloak-brukernavn. For mange LDAP-serverleverand\u00F8rer kan dette v\u00E6re 'uid'. For Active directory kan dette v\u00E6re 'sAMAccountName' eller 'cn'. Attributtet burde v\u00E6re fylt for alle LDAP-brukeroppf\u00F8ringer om du vil importere fra LDAP til Keycloak. +rdn-ldap-attribute=RDN LDAP-attributt +ldap-attribute-name-for-user-rdn=LDAP-attributtnavn for RDN-bruker +rdn-ldap-attribute.tooltip=Navn p\u00E5 LDAP-attributt, som brukes som RDN (topp-attributt) for en typisk DN-bruker. Vanligvis er dette det samme som LDAP-attributtet for brukernavn, men det er ikke p\u00E5krevd. For eksempel for Active directory er det vanlig \u00E5 bruke cn' som RDN-attributt n\u00E5r attributtet for brukernavn kan v\u00E6re 'sAMAccountName'. +uuid-ldap-attribute=UUID LDAP-attributt +ldap-attribute-name-for-uuid=LDAP-attributtnavn for UUID. +uuid-ldap-attribute.tooltip=Navn p\u00E5 LDAP-attributtet, som brukes som en unik objekt-identifikator (UUID) for objekter i LDAP. For mange LDAP-serverleverand\u00F8rer er det 'entryUUID', men noen er annerledes. For eksempel for Active directory b\u00F8r det v\u00E6re 'objectGUID'. Hvis din LDAP-server ikke st\u00F8tter UUID, kan du bruke hvilket som helst annet attributt, som er ment \u00E5 v\u00E6re unikt blant LDAP-brukere i treet. For eksempel 'uid' eller 'entryDN'. +user-object-classes=Brukerobjektklasser +ldap-user-object-classes.placeholder=Objektklasser for LDAP-bruker (separert med komma) + +ldap-connection-url=LDAP tilkoblings URL +ldap-users-dn=LDAP brukere DN +ldap-bind-dn=LDAP bind DN +ldap-bind-credentials=LDAP bind innloggingsdetaljer +ldap-filter=LDAP filter +ldap.user-object-classes.tooltip=Alle verdier av LDAP objectClass-attributtet for brukere i LDAP er separert med komma. For eksempel, 'inetOrgPerson, organizationalPerson'. Nylig opprettede Keycloak-brukere vil bli skrevet til LDAP med alle disse objektklassene og eksisterende LDAP-brukeroppf\u00F8ringer vil bli funnet om de inneholder de samme objektklassene. + +connection-url=Tilkoblings URL +ldap.connection-url.tooltip=Tilkoblings URL din til LDAP-server +test-connection=Testkobling +users-dn=DN-brukere +ldap.users-dn.tooltip=Fullstendig DN av LDAP-tre hvor dine brukere befinner seg. Denne spesifikke DN er forelder til LDAP-brukere. Den kan for eksempel v\u00E6re 'ou=users,dc=example,dc=com' hvis din typiske bruker vil ha en DN som 'uid=john,ou=users,dc=example,dc=com' +authentication-type=Autentiseringstype +ldap.authentication-type.tooltip=LDAP Autentiseringstype. For \u00F8yeblikket er kun mekanismene 'ingen' (anonym LDAP autentisering) eller 'enkel' (bind innloggingsdetaljer) tilgjengelig. +bind-dn=Bind DN +ldap.bind-dn.tooltip=DN av LDAP-administrator, som kan brukes av Keycloak for \u00E5 aksessere LDAP-server +bind-credential=Bind innloggingsdetaljer +ldap.bind-credential.tooltip=Passord for LDAP administrator +test-authentication=Testautentisering +custom-user-ldap-filter=Egendefinert filter for LDAP-bruker +ldap.custom-user-ldap-filter.tooltip=TilleggsLDAP-filter for \u00E5 filtrere s\u00F8kte brukere. La filteret v\u00E6re tomt om du ikke trenger et ekstra filter. Pass p\u00E5 at den starter med '(' og slutter med ')' +search-scope=Scope for s\u00F8k +ldap.search-scope.tooltip=For et niv\u00E5 s\u00F8ker vi etter brukere kun i DNser spesifisert av bruker-DNser. For subtre s\u00F8ker vi i hele subtreet. Se LDAP dokumentasjon for mer informasjon. +use-truststore-spi=Bruk Truststore SPI +ldap.use-truststore-spi.tooltip=Spesifiserer om LDAP-koblingen vil bruke truststore SPI med truststore konfigurert i keycloak-server.json. 'Alltid' betyr at den alltid vil brukes. 'Aldri' betyr at den ikke brukes. 'Kun for ldaps' betyr at den vil brukes hvis din koblings URL bruker ldaps. Merk at selv om keycloak-server.json ikke er konfigurert, vil default Java cacerts eller sertifikat spesifisert i 'javax.net.ssl.trustStore' bli brukt. +connection-pooling=Connection Pooling +ldap.connection-pooling.tooltip=Burde Keycloak bruke connection pooling for \u00E5 aksessere LDAP-serveren? +ldap.pagination.tooltip=St\u00F8tter LDAP-serveren paginering? +kerberos-integration=Kerberos Integrasjon +allow-kerberos-authentication=Tillat autentisering med Kerberos +ldap.allow-kerberos-authentication.tooltip=Aktiver/deaktiver HTTP autentisering av brukere med SPNEGO/Kerberos tokens. Informasjonen om autentiserte brukere vil bli klargjort fra denne LDAP-serveren. +use-kerberos-for-password-authentication=Bruk Kerberos for autentisering av passord +ldap.use-kerberos-for-password-authentication.tooltip=Bruk Kerberos-innloggingsmodul for \u00E5 autentisere brukernavn/passord mot Kerberos-server i stedet for autentisering mot LDAP-server med Directory Service API +batch-size=Batch st\u00F8rrelse +ldap.batch-size.tooltip=Antall LDAP-brukere som vil bli importert fra LDAP til Keycloak innen en enkelt transaksjon. +ldap.periodic-full-sync.tooltip=Om fullstendig periodisk synkronisering av LDAP-brukere til Keycloak vil v\u00E6re aktivert eller deaktivert. +ldap.periodic-changed-users-sync.tooltip=Om periodisk synkronisering av endret eller nylig opprettede LDAP-brukere til Keycloak vil v\u00E6re aktivert eller deaktivert. +ldap.changed-users-sync-period.tooltip=Tidsperiode for synkronisering av endrede eller nylig opprettede LDAP-brukere i sekunder. +user-federation-mappers=Mappere for brukerfederering +create-user-federation-mapper=Opprett mapper for brukerfederering +add-user-federation-mapper=Legg til mapper for brukerfederering +provider-name=Leverand\u00F8rnavn +no-user-federation-providers-configured=Ingen leverand\u00F8r for brukerfederering er konfigurert +no-user-storage-providers-configured=Ingen leverand\u00F8r for brukerlagring er konfigurert +add-identity-provider=Legg til identitetsleverand\u00F8r +add-identity-provider-link=Legg til lenke til identitetsleverand\u00F8r +identity-provider=Identitetsleverand\u00F8r +identity-provider-user-id=Bruker-ID for identitetsleverand\u00F8r +identity-provider-user-id.tooltip=Unik ID for brukeren p\u00E5 identitetsleverand\u00F8rens side +identity-provider-username=Brukernavn til identitetsleverand\u00F8r +identity-provider-username.tooltip=Brukernavn p\u00E5 identitetsleverand\u00F8rens side +pagination=Paginering + +browser-flow=Nettleserflyt +browser-flow.tooltip=Velg flyten du \u00F8nsker \u00E5 bruke for nettleser-autentisering. +registration-flow=Registreringsflyt +registration-flow.tooltip=Velg flyten du \u00F8nsker for registrering. +direct-grant-flow=Direct Grant Flyt +direct-grant-flow.tooltip=Velg flyten du \u00F8nsker \u00E5 bruke for direct grant autentisering. +reset-credentials=Tilbakestill innloggingsdetaljer +reset-credentials.tooltip=Velg flyten du \u00F8nsker \u00E5 bruke n\u00E5r brukeren har glemt sine p\u00E5loggingsdetaljer. +client-authentication=Autentisering av klient +client-authentication.tooltip=Velg flyten du \u00F8nsker \u00E5 bruke for autentisering av klienter. +new=Ny +copy=Kopi +add-execution=Legg til eksekvering +add-flow=Legg til flyt +auth-type=Type auth +requirement=Krav +config=Konfig +no-executions-available=Ingen tilgjengelig eksekvering +authentication-flows=Autentiseringsflyt +create-authenticator-config=Opprett konfig for autentikator +authenticator.alias.tooltip=Navn p\u00E5 konfigurasjonen +otp-type=Type engangskode +time-based=Tidsbasert +counter-based=Tellerbasert +otp-type.tooltip=Totp er et tidsbasert engangspassord. 'hotp' er et teller basert engangspassord hvor serveren f\u00F8lger med p\u00E5 en teller som den kan hashe mot. +otp-hash-algorithm=OTP hash-algoritme +otp-hash-algorithm.tooltip=Hva slags hashing algoritme skal brukes for \u00E5 generere OTP. +number-of-digits=Antall siffer +otp.number-of-digits.tooltip=Hvor mange sifre skal OTP ha? +look-ahead-window=Look Ahead Window +otp.look-ahead-window.tooltip=Hvor langt frem b\u00F8r serveren se i tilfelle token generator og server er ute av tidssynkronisering eller tellersynkronisering? +initial-counter=Initiell teller +otp.initial-counter.tooltip=Hva b\u00F8r den initielle tellerverdien v\u00E6re? +otp-token-period=Engangskode token +otp-token-period.tooltip=Hvor mange sekunder burde et engangskode token v\u00E6re gyldig? Standard er satt til 30 sekunder. +table-of-password-policies=Liste over policy for passord +add-policy.placeholder=Legg til policy... +policy-type=Type policy +policy-value=Verdi for policy +admin-events=administratorhendelser +admin-events.tooltip=Viser lagrede administratorhendelser for sikkerhetsdomenet. Hendelser relaterer til administratorkontoen, for eksempel opprettelse av et sikkerhetsdomene. For \u00E5 aktivere persistente hendelser g\u00E5 til konfig. +login-events=innloggingshendelser +filter=Filtrer +update=Oppdater +reset=Tilbakestill +operation-types=Operasjonstyper +resource-types=Ressurstyper +select-operations.placeholder=Velg operasjoner... +select-resource-types.placeholder=Velg ressursyper... +resource-path=Filsti for ressurs +resource-path.tooltip=Sorter etter filsti for ressurs. St\u00F8tter jokertegn '*' for \u00E5 sjekke om den er lik en del av stien, og '**' for \u00E5 sjekke flere deler. For eksempel 'realms/*/clients/asbc' vil v\u00E6re lik klient-ID asbc i alle sikkerhetsdomener, mens 'realms/master/**' er lik alt i mastersikkerhetsdomenet. +date-(from)=Dato (Fra) +date-(to)=Dato (Til) +authentication-details=Autentiseringsdetaljer +ip-address=IP-adresse +time=Tid +operation-type=Operasjonstype +resource-type=Ressurstype +auth=Auth +representation=Representasjon +register=Registrer +required-action=P\u00E5krevd handling +default-action=Standard handling +auth.default-action.tooltip=Hvis aktivert, vil enhver ny bruker bli tilordnet denne p\u00E5krevde handlingen. +no-required-actions-configured=Ingen p\u00E5krevde handlinger er konfigurert +defaults-to-id=Standardverdi er id +flows=Flyt +bindings=Bindinger +required-actions=P\u00E5krevde handlinger +password-policy=Passordpolicy +otp-policy=Policy for engangskode +user-groups=Brukergruppe +default-groups=Standardgrupper +groups.default-groups.tooltip=Sett med grupper som nye brukere automatisk vil bli medlem av. +cut=Klipp +paste=Lim inn + +create-group=Opprett gruppe +create-authenticator-execution=Opprett autentiseringsutf\u00F8relse +create-form-action-execution=Opprett skjema for handlingsutf\u00F8relse +create-top-level-form=Opprett skjema for toppniv\u00E5 +flow.alias.tooltip=Spesifiserer visningsnavn for flyten. +top-level-flow-type=Flytstype for toppniv\u00E5 +flow.generic=generisk +flow.client=klient +top-level-flow-type.tooltip=Hvilken type toppniv\u00E5 flyt er det? Type 'klient' brukes for autentisering av klienter (applikasjoner) n\u00E5r generisk brukes for brukere og alt annet +create-execution-flow=Opprett eksekveringsflyt +flow-type=Type av flyt +flow.form.type=skjema +flow-type.tooltip=Hva slags skjema det er +form-provider=Skjemaleverand\u00F8r +default-groups.tooltip=Nyopprettede eller registrerte brukere vil automatisk bli lagt til disse gruppene +select-a-type.placeholder=velg en type +available-groups=Tilgjengelige grupper +available-groups.tooltip=Velg en gruppe du \u00F8nsker \u00E5 legge til som standard. +value=Verdi +table-of-group-members=Liste over gruppemedlemmer +last-name=Etternavn +first-name=Fornavn +email=E-postadresse +toggle-navigation=Toggle navigasjon +manage-account=Administrer konto +sign-out=Logg ut +server-info=Serverinformasjon +resource-not-found=Ressurs ikke funnet... +resource-not-found.instruction=Vi kunne ikke finne ressursen du leter etter. Vennligst kontroller at nettadressen du oppga er riktig. +go-to-the-home-page=G\u00E5 til hjemmeside » +page-not-found=Side ikke funnet... +page-not-found.instruction=Vi kunne ikke finne siden du ser etter. Vennligst kontroller at nettadressen du skrev inn er riktig. +events.tooltip=Viser lagrede hendelser for sikkerhetsdomenet. Hendelser er relatert til brukerkontoer, for eksempel innlogging av bruker. For \u00E5 aktivere persistente hendelser g\u00E5 til konfig. +select-event-types.placeholder=Velg hendelsestyper... +events-config.tooltip=Viser konfigurasjonsalternativer for \u00E5 muliggj\u00F8re persistente bruker- og administratorhendelser. +select-an-action.placeholder=Velg en handling... +event-listeners.tooltip=Konfigurer hvilke lyttere som skal motta eventer fra sikkerhetsdomenet. +login.save-events.tooltip=Hvis aktivert vil innloggingshendelser bli lagret i databasen, noe som gj\u00F8r hendelsene tilgjengelige for administrator og kontoadministrasjonskonsoll. +clear-events.tooltip=Sletter alle hendelser fra databasen. +events.expiration.tooltip=Setter utl\u00F8pstid for hendelser. Utl\u00F8pte hendelser vil med jevne mellomrom bli slettet fra databasen. +admin-events-settings=Innstillinger for administratorhendelser +save-events=Lagre hendelser +admin.save-events.tooltip=Hvis aktivert vil administratorhendelser bli lagret i databasen, som vil gj\u00F8re hendelsene tilgjengelige i administrasjonskonsollen. +saved-types.tooltip=Konfigurer hvilke eventtyper som lagres. +include-representation=Inkluder representasjon +include-representation.tooltip=Inkluder JSON-representasjon for \u00E5 skape og oppdatere foresp\u00F8rsler. +clear-admin-events.tooltip=Sletter alle administratorhendelser i databasen. +server-version=Serverversjon +info=Info +providers=Leverand\u00F8rer +server-time=Servertid +server-uptime=Oppetid for server +memory=Minne +total-memory=Totalt minne +free-memory=Ledig minne +used-memory=Brukt minne +system=System +current-working-directory=Gjeldende arbeidskatalog +java-version=Java versjon +java-vendor=Java leverand\u00F8r +java-runtime=Java Runtime +java-vm=Java VM +java-vm-version=Java VM versjon +java-home=Java hjem +user-name=Brukers navn +user-timezone=Tidssone for bruker +user-locale=Lokalitet for bruker +system-encoding=Systemenkoding +operating-system=Operativsystem (OS) +os-architecture=OS arkitektur +spi=SPI +granted-roles=Tildelte roller +granted-protocol-mappers=Innvilgede protokollmappere +additional-grants=Tillegsrettigheter +consent-created-date=Opprettet +consent-last-updated-date=Sist oppdatert +revoke=Opphev +new-password=Nytt passord +password-confirmation=Passord bekreftelse +reset-password=Tilbakestill passord +credentials.temporary.tooltip=Hvis aktivert, er brukeren p\u00E5krevd til \u00E5 endre passordet ved neste innlogging +remove-totp=Fjern TOTP +credentials.remove-totp.tooltip=Fjern generator for engangspassord for bruker. +reset-actions=Tilbakestill handlinger +credentials.reset-actions.tooltip=Sett med handlinger som kan utf\u00F8res ved \u00E5 sende en bruker en Tilbakestillingshandling for E-post. 'Verifiser e-post' sender en e-post til brukeren for \u00E5 verifisere e-postadresse. 'Oppdater profil' krever at bruker legger inn personlig informasjon. 'Oppdater passord' krever at bruker skriver inn et nytt passord. 'Konfigurer TOTP' krever installasjon av en passordgenerator for mobil. +reset-actions-email=Tilbakestillingshandling for E-post. +send-email=Send e-post +credentials.reset-actions-email.tooltip=Sender en e-post til en bruker med en lenke. Ved \u00E5 klikke p\u00E5 denne lenken vil brukeren f\u00E5 lov til \u00E5 utf\u00F8re tilbakestillingshandlinger. Brukeren trenger ikke logge inn f\u00F8r dette. For eksempel, sett handlingen for \u00E5 oppdatere passord, klikk p\u00E5 denne knappen, og brukeren vil kunne endre deres passord uten \u00E5 logge inn. +add-user=Legg til bruker +created-at=Opprettet ved +user-enabled=Bruker aktivert +user-enabled.tooltip=En deaktivert bruker kan ikke logge inn. +user-temporarily-locked=Bruker er midlertidig l\u00E5st. +user-temporarily-locked.tooltip=Brukeren kan ha blitt l\u00E5st p\u00E5 grunn av at innloggingsfors\u00F8k har feilet for mange ganger. +unlock-user=L\u00E5s opp bruker +federation-link=Federeringslenke +email-verified=E-post verifisert +email-verified.tooltip=Har brukerens e-post blitt verifisert? +required-user-actions=P\u00E5krevde brukerhandlinger +required-user-actions.tooltip=Krev en handling n\u00E5r brukeren logger inn. 'Verifiser e-post' sender en e-post til brukeren for \u00E5 verifisere deres e-postadresse. 'Oppdater profil' krever at bruker legger inn personlig informasjon. 'Oppdater passord' krever at bruker skriver inn et nytt passord. 'Konfigurer TOTP' krever installasjon av en passordgenerator for mobil. +locale=Lokalitet +select-one.placeholder=Velg en... +impersonate=Utgi deg for \u00E5 v\u00E6re bruker +impersonate-user=Utgi deg for \u00E5 v\u00E6re bruker +impersonate-user.tooltip=Logg inn som denne brukeren. Hvis bruker er i samme sikkerhetsdomene som deg, vil din n\u00E5v\u00E6rende innloggede sesjon bli logget ut f\u00F8r du blir logget inn som denne brukeren. +identity-provider-alias=Alias for identitetsleverand\u00F8r +provider-user-id=Bruker-ID for leverand\u00F8r +provider-username=Brukernavn for leverand\u00F8r +no-identity-provider-links-available=Ingen lenker for identitetsleverand\u00F8r er tilgjengelig +group-membership=Gruppemedlemskap +leave=Forlat +group-membership.tooltip=Gruppen som brukeren er medlem av. Velg en gruppe p\u00E5 listen og klikk p\u00E5 'Forlat' for \u00E5 forlate gruppen. +membership.available-groups.tooltip=Grupper som brukere kan bli medlem av. Velg en gruppe og klikk p\u00E5 'Bli med' knappen. +table-of-realm-users=Liste over sikkerhetsdomenebrukere +view-all-users=Se alle brukere +unlock-users=L\u00E5s opp brukere +no-users-available=Ingen brukere tilgjengelig +users.instruction=Vennligst skriv inn et s\u00F8k, eller klikk p\u00E5 Se alle brukere +consents=Samtykke +started=Startet +logout-all-sessions=Logg ut av alle sesjoner +logout=Logg ut +new-name=Nytt navn +ok=Ok +attributes=Attributter +role-mappings=Mapping av roller +members=Medlemmer +details=Detaljer +identity-provider-links=Lenker til identitetsleverand\u00F8r +register-required-action=Registrer p\u00E5krevd handling +gender=Kj\u00F8nn +address=Adresse +phone=Telefon +profile-url=Profil URL +picture-url=Bilde URL +website=Nettsted +import-keys-and-cert=Importer n\u00F8kler og sertifikat +import-keys-and-cert.tooltip=Last opp klientens n\u00F8kkelpar og sertifikat. +upload-keys=Last opp n\u00F8kler +download-keys-and-cert=Last ned n\u00F8kler og sertifikat +no-value-assigned.placeholder=Ingen tilordnet verdi +remove=Fjern +no-group-members=Ingen gruppemedlemmer +temporary=Midlertidig +join=Bli med +event-type=Hendelsestype +events-config=Hendelseskonfigurasjon +event-listeners=Hendelseslyttere +login-events-settings=Innstillinger for innloggingshendelser +clear-events=Fjern hendelser +saved-types=Lagrede typer +clear-admin-events=Fjern administratorhendelser +clear-changes=Fjern endringer +error=Feil + +# Authz + # Authz Common +authz-authorization=Autorisasjon +authz-owner=Eier +authz-uri=URI +authz-scopes=Scope +authz-resource=Ressurs +authz-resource-type=Ressurstype +authz-resources=Ressurser +authz-scope=Scope +authz-authz-scopes=Autorisasjonsscopes +authz-policies=Policier +authz-permissions=Tillatelser +authz-evaluate=Evaluer +authz-icon-uri=Ikon URI +authz-icon-uri.tooltip=En URI som peker til et ikon. +authz-select-scope=Velg et scope +authz-select-resource=Velg en ressurs +authz-associated-policies=Assosierte policier +authz-any-resource=Enhver ressurs +authz-any-scope=Ethvert scope +authz-any-role=Enhver rolle +authz-policy-evaluation=Evaluering av policy +authz-select-client=Velg en klient +authz-select-user=Velg en bruker +authz-entitlements=Rettigheter +authz-no-resources=Ingen ressurser +authz-result=Resultat +authz-authorization-services-enabled=Autorisasjon aktivert +authz-authorization-services-enabled.tooltip=Aktiver/deaktiver finkornet autorisasjonssupport for en klient +authz-required=P\u00E5krevd + +# Authz Settings +authz-import-config.tooltip=Importer en JSON-fil som inneholder innstillinger for autorisasjon for denne ressursserveren. + +authz-policy-enforcement-mode=Modus for h\u00E5ndhevelse av policy +authz-policy-enforcement-mode.tooltip=Modus for h\u00E5ndhevelse av policy dikterer hvordan policier blir h\u00E5ndhevet n\u00E5r autorisasjonsforesp\u00F8rsler blir evaluert. 'H\u00E5ndhevende' betyr at foresp\u00F8rsler blir nektet som standard selv om det ikke er en policy knyttet til en gitt ressurs. 'Ettergivende' betyr at foresp\u00F8rsler blir tillatt selv om det ikke er en policy knyttet til en gitt ressurs. 'Deaktivert' deaktiverer fullstendig evalueringen av policier og tillater tilgang til enhver ressurs. +authz-policy-enforcement-mode-enforcing=H\u00E5ndhevende +authz-policy-enforcement-mode-permissive=Ettergivende +authz-policy-enforcement-mode-disabled=Deaktivert + +authz-remote-resource-management=H\u00E5ndtering av ekstern ressurs +authz-remote-resource-management.tooltip=Skal ressursene bli h\u00E5ndtert eksternt av ressursserveren? Hvis satt til false kan ressursene kun bli h\u00E5ndtert fra denne administratorkonsollen. + +authz-export-settings=Eksporter innstillinger +authz-export-settings.tooltip=Eksporter og last ned alle innstillinger for autorisasjon for denne ressursserveren. + + # Authz Resource List +authz-no-resources-available=Ingen tilgjengelige ressurser. +authz-no-scopes-assigned=Ingen tildelte scopes. +authz-no-type-defined=Ingen definert type. +authz-no-permission-assigned=Ingen tillatelse er tildelt. +authz-no-policy-assigned=Ingen tildelt policy. +authz-create-permission=Opprett tillatelse + + # Authz Resource Detail +authz-add-resource=Legg til ressurs +authz-resource-name.tooltip=Et unikt navn for denne ressursen. Navnet kan bli brukt til \u00E5 identifisere en ressurs og er nyttig i sp\u00F8rringer for en bestemt ressurs. +authz-resource-owner.tooltip=Eieren av denne ressursen. +authz-resource-type.tooltip=Ressurstype. Den kan brukes til \u00E5 gruppere ulike ressursinstanser av samme type. +authz-resource-uri.tooltip=En URI som ogs\u00E5 kan brukes for \u00E5 identifisere denne ressursen. +authz-resource-scopes.tooltip=Scopes assosiert med denne ressursen. + + # Authz Scope List +authz-add-scope=Legg til scope +authz-no-scopes-available=Ingen tilgjengelige scopes. + + # Authz Scope Detail +authz-scope-name.tooltip=Et unikt navn for dette scopet. Navnet kan bli brukt for \u00E5 identifisere et scope, og er nyttig i sp\u00F8rringer for en bestemt ressurs. + + # Authz Policy List +authz-all-types=Alle typer +authz-create-policy=Opprett policy +authz-no-policies-available=Ingen tilgjengelige policier. + + # Authz Policy Detail +authz-policy-name.tooltip=Navnet p\u00E5 denne policien. +authz-policy-description.tooltip=En beskrivelse av denne policien. +authz-policy-logic=Logikk +authz-policy-logic-positive=Positiv +authz-policy-logic-negative=Negativ +authz-policy-logic.tooltip=Logikken som dikterer hvordan beslutningspolicien skal utf\u00F8rres. Hvis 'Positiv', vil resulterende effekt (tillate eller nekte) oppn\u00E5dd under evalueringen av denne policien bli brukt for \u00E5 ta en beslutning. Hvis 'Negativ', vil resulterende effekt bli opphevet, med andre ord blir en tillatelse til et avslag og motsatt. +authz-policy-apply-policy=Anvend policy +authz-policy-apply-policy.tooltip=Spesifiserer alle policies som m\u00E5 bli anvendt for scopes definert av denne policien eller tillatelsen. +authz-policy-decision-strategy=Beslutningsstrategi +authz-policy-decision-strategy.tooltip=Beslutningsstrategi som dikterer hvordan policies knyttet til en gitt policy blir evaluert og hvordan endelig avgj\u00F8relse oppn\u00E5s. 'Bekreftende' betyr at minst en policy m\u00E5 evalueres til en positiv beslutning for at den samlede avgj\u00F8relsen kan bli positiv. 'Enstemmig' betyr at alle policies m\u00E5 evalueres til en positiv beslutning for at den samlede avgj\u00F8relsen kan bli positiv. 'Konsensus' betyr at antall positive beslutninger m\u00E5 v\u00E6re h\u00F8yere enn antall negative beslutninger. Hvis antallet av positive og negative er likt, blir den samlede avgj\u00F8relsen negativ. +authz-policy-decision-strategy-affirmative=Bekreftende +authz-policy-decision-strategy-unanimous=Enstemmig +authz-policy-decision-strategy-consensus=Konsensus +authz-select-a-policy=Velg en policy + + # Authz Role Policy Detail +authz-add-role-policy=Legg til policy for rolle +authz-no-roles-assigned=Ingen tildelte roller. +authz-policy-role-roles.tooltip=Spesifiser sikkerhetsdomenerolle(r) som tillates av denne policien. +authz-policy-role-clients.tooltip=Velger en klient for \u00E5 filtrere klientroller som kan bli tatt i bruk av denne policien. +authz-policy-role-client-roles.tooltip=Spesifiserer klientroller tillatt av denne policien. + + # Authz User Policy Detail +authz-add-user-policy=Legg til policy for bruker +authz-no-users-assigned=Ingen tildelte brukere. +authz-policy-user-users.tooltip=Spesifiser bruker(e) som tillates av denne policien. + + # Authz Client Policy Detail +authz-add-client-policy=Legg til policy for klient +authz-no-clients-assigned=Ingen tildelte klienter. +authz-policy-client-clients.tooltip=Spesifiser klient(er) som tillates av denne policien. + + # Authz Time Policy Detail +authz-add-time-policy=Legg til policy for tid +authz-policy-time-not-before.tooltip=Definerer tiden f\u00F8r policien M\u00C5 IKKE innvilges. Denne innvilges kun om gjeldende dato/tid er f\u00F8r eller lik denne verdien. +authz-policy-time-not-on-after=Ikke p\u00E5 eller etter +authz-policy-time-not-on-after.tooltip=Definerer tiden etter en policy M\u00C5 IKKE innvilges. Denne innvilges kun om gjeldende dato/tid er f\u00F8r eller lik denne verdien. + + # Authz Drools Policy Detail +authz-add-drools-policy=Legg til Rules policy +authz-policy-drools-maven-artifact-resolve=L\u00F8s +authz-policy-drools-maven-artifact=Policy for Maven artefakt. +authz-policy-drools-maven-artifact.tooltip=Et Maven GAV som peker til et artefakt hvor reglene vil bli lastet fra. Med en gang du har gitt GAV kan du klikke *L\u00F8s* for \u00E5 laste felter for b\u00E5de *Modul* og *Sesjon* +authz-policy-drools-module=Modul +authz-policy-drools-module.tooltip=Modulen som brukes av denne policien. Du m\u00E5 oppgi en modul for \u00E5 velge en bestemt \u00F8kt der reglene vil bli lastet fra. +authz-policy-drools-session=Sesjon +authz-policy-drools-session.tooltip=Sesjonen brukt av denne policien. Sesjonen vil gi alle regler for evaluering ved prosessering av policien. +authz-policy-drools-update-period=Oppdater periode +authz-policy-drools-update-period.tooltip=Spesifiserer et intervall for \u00E5 skanne etter oppdateringer for artefakter. + + # Authz JS Policy Detail +authz-add-js-policy=Legg til policy for JavaScript +authz-policy-js-code=Kode +authz-policy-js-code.tooltip=JavaScript-koden angir betingelsene for denne politikken. + + + # Authz Aggregated Policy Detail +authz-aggregated=Aggregert +authz-add-aggregated-policy=Legg til policy for aggregering. + + # Authz Permission List +authz-no-permissions-available=Ingen tilgjengelige tillatelser. + + # Authz Permission Detail +authz-permission-name.tooltip=Navnet p\u00E5 denne tillatelsen. +authz-permission-description.tooltip=En beskrivelse av denne tillatelsen. + + # Authz Resource Permission Detail +authz-add-resource-permission=Legg til tillatelse for ressurs. +authz-permission-resource-apply-to-resource-type=Bruk p\u00E5 ressurstype +authz-permission-resource-apply-to-resource-type.tooltip=Spesifiserer om denne tillatelsen skal gjelde for alle ressurser med en gitt type. I dette tilfellet vil tillatelsen bli evaluert for alle instanser av gitt ressurstype. +authz-permission-resource-resource.tooltip=Spesifiserer at denne tillatelsen m\u00E5 bli brukt for en spesifikk ressursinstans. +authz-permission-resource-type.tooltip=Spesifiserer at denne tillatelsen m\u00E5 bli anvendt for alle ressursinstanser for en gitt type. + + # Authz Scope Permission Detail +authz-add-scope-permission=Legg til tillatelse for scope +authz-permission-scope-resource.tooltip=Begrens scopes til de som er tilknyttet den valgte ressursen. Hvis dette ikke er valgt vil alle scopes v\u00E6re tilgjengelige. +authz-permission-scope-scope.tooltip=Spesifiserer at denne tillatelse m\u00E5 anvendes p\u00E5 en eller flere scopes. + + # Authz Evaluation +authz-evaluation-identity-information=Identitetsinformasjon +authz-evaluation-identity-information.tooltip=De tilgjengelige alternativene for \u00E5 konfigurere identitesinformasjon som vil bli brukt ved evaluering av policier. +authz-evaluation-client.tooltip=Velg klienten som vil utf\u00F8re denne autorisasjonsforesp\u00F8rselen. +authz-evaluation-user.tooltip=Velg en bruker hvis identitet vil bli brukt for \u00E5 s\u00F8ke tillatelser fra serveren. +authz-evaluation-role.tooltip=Velg en rolle som du vil knytte til den valgte brukeren. +authz-evaluation-new=Ny evaluering +authz-evaluation-re-evaluate=Re-evaluering +authz-evaluation-previous=Forrige evaluering +authz-evaluation-contextual-info=Kontekstuell informasjon +authz-evaluation-contextual-info.tooltip=Tilgjengelige valg for \u00E5 konfigurere enhver kontekstuell informasjon som vil bli brukt ved evaluering av policier. +authz-evaluation-contextual-attributes=Kontekstuelle attributter +authz-evaluation-contextual-attributes.tooltip=Ethvert attributt gitt av et kj\u00F8rende milj\u00F8 eller ved utf\u00F8relseskontekst. +authz-evaluation-permissions.tooltip=De tilgjengelige alternativene for \u00E5 konfigurere tillatelsene for hvilke policies som skal anvendes. +authz-evaluation-evaluate=Evaluer +authz-evaluation-any-resource-with-scopes=Enhver ressurs med scope(s) +authz-evaluation-no-result=Kunne ikke f\u00E5 et resultat for den gitte autorisasjonsforesp\u00F8rselen. Sjekk om de tilgjengelige ressursene er tilknyttet en policy. +authz-evaluation-no-policies-resource=Ingen policies ble funnet for denne ressursen. +authz-evaluation-result.tooltip=Det samlede resultatet for denne foresp\u00F8rselen for tillatelse. +authz-evaluation-scopes.tooltip=Liste over tillatte scopes. +authz-evaluation-policies.tooltip=Detaljer om hvilke policies som ble evaluert og deres avgj\u00F8relser. +authz-evaluation-authorization-data=Respons +authz-evaluation-authorization-data.tooltip=Representerer et token som b\u00E6rer autorisasjonsdata som et resultat av prosesseringen av en autorisasjonsforesp\u00F8rsel. Denne representasjonen er hva Keycloak sender ut til klienter som ettersp\u00F8r tillatelser. Sjekk autorisasjonsclaim for tillatelsene som ble gitt basert p\u00E5 n\u00E5v\u00E6rende autorisasjonsforesp\u00F8rsel. +authz-show-authorization-data=Vis autorisasjonsdata diff --git a/admin/messages/admin-messages_pt_BR.properties b/admin/messages/admin-messages_pt_BR.properties new file mode 100644 index 0000000..96b64d8 --- /dev/null +++ b/admin/messages/admin-messages_pt_BR.properties @@ -0,0 +1,1097 @@ +#encoding: utf-8 +consoleTitle=Console de Administração do Keycloak + +# Common messages +enabled=Habilitado +name=Nome +displayName=Nome de exibição +displayNameHtml=Nome de exibição HTML +save=Salvar +cancel=Cancelar +onText=Sim +offText=Não +client=Cliente +clients=Clientes +clear=Limpar +selectOne=Selecione Um... + +true=Sim +false=Não + +endpoints=Endpoints + +# Realm settings +realm-detail.enabled.tooltip=Usuários e clientes somente podem acessar um Realm se ele estiver habilitado +realm-detail.oidc-endpoints.tooltip=Exibe a configuração dos endpoints do OpenID Connect +registrationAllowed=Cadastro de usuário +registrationAllowed.tooltip=Habilita/desabilita a página de cadastro. Um link para a página de cadastro também será exibido na tela de login. +registrationEmailAsUsername=Email como nome de usuário +registrationEmailAsUsername.tooltip=Se habilitado o campo 'nome de usuário' será ocultado no formulário de cadastro e o e-mail será usado como nome de usuário para o novo cadastro. +editUsernameAllowed=Editar nome de usuário +editUsernameAllowed.tooltip=Se habilitado, o campo nome de usuário é editável, senão será apenas leitura. +resetPasswordAllowed=Esqueci a senha +resetPasswordAllowed.tooltip=Exibe um link na página de login para o usuário clicar quando houver esquecido suas credenciais. +rememberMe=Lembrar me +rememberMe.tooltip=Exibe um checkbox na página de login para permitir ao usuário continuar logado entre restarts do browser até que a sessão expire. +verifyEmail=Verificar e-mail +verifyEmail.tooltip=Requer que o usuário verifique seu endereço de e-mail na primeira vez que efetuar login. +sslRequired=SSL requerido +sslRequired.option.all=todas requisições +sslRequired.option.external=requisições externas +sslRequired.option.none=nunca +sslRequired.tooltip=É necessário SSL? 'Nunca' significa que HTTPS não é requerido para nenhum endereço IP cliente. 'Requisições externas' significa que localhost e IPs privados podem acessar sem HTTPS. 'Todas requisições' significa que HTTPS é requerido para todos os endereços IPs. +publicKey=Chave pública +privateKey=Chave privada +gen-new-keys=Gerar novas chaves +certificate=Certificado +host=Host +smtp-host=Host SMTP +port=Porta +smtp-port=Porta SMTP (valor padrão: 25) +from=Remetente +sender-email-addr=Endereço de e-mail do remetente +enable-ssl=Habilitar SSL +enable-start-tls=Habilitar StartTLS +enable-auth=Habilitar autenticação +username=Usuário +login-username=Nome de usuário para login +password=Senha +login-password=Senha para login +login-theme=Tema de login +login-theme.tooltip=Selecione o tema para páginas de login, TOTP, grant, cadastro e recuperar senha. +account-theme=Tema para conta +account-theme.tooltip=Selecione o tema para as páginas de administração de conta do usuário. +admin-console-theme=Tema para console de administração +select-theme-admin-console=Selecione o tema para o console de administração. +email-theme=Tema de e-mail +select-theme-email=Selecione o tema para os e-mail que são enviados pelo servidor. +i18n-enabled=Habilitar internacionalização +supported-locales=Locais disponíveis +supported-locales.placeholder=Digite um local e pressione Enter +default-locale=Local padrão +realm-cache-clear=Realm Cache +realm-cache-clear.tooltip=Remove todas as entradas do cache de realm (isto irá remover as entradas para todos os realms) +user-cache-clear=Cache de usuário +user-cache-clear.tooltip=Remove todas as entradas do cache de usuário (isto irá remover as entradas de todos os realms) +revoke-refresh-token=Revogar Token de Atualização +revoke-refresh-token.tooltip=Se habilitado os tokens de atualização podem ser utilizados somente uma vez. Caso contrário os tokens de atualização não são revogados quando utilizados e podem ser utilizados várias vezes. +sso-session-idle=Sessão SSO inativa +sso-session-idle.tooltip=Tempo que uma sessão pode ficar inativa antes de expirar. Tokens e sessões de navegador são invalidados quando uma sessão é expirada. +seconds=Segundos +minutes=Minutos +hours=Horas +days=Dias +sso-session-max=Sessão SSO Máxima +sso-session-max.tooltip=Tempo máximo antes que uma sessão seja expirada. Tokens e sessões de navegador são invalidados quando uma sessão é expirada. +offline-session-idle=Sessão Offline Inativa +offline-session-idle.tooltip=Tempo que uma sessão offline pode ficar inativa antes de expirar. Você precisa utilizar um token de atualização offline pelo menos uma vez neste período, caso contrário a sessão offline será expirada. +access-token-lifespan=Duração do Token de Acesso +access-token-lifespan.tooltip=Tempo máximo antes que um token de acesso expire. Recomenda-se que este valor seja menor em relação ao tempo de inativação do inativação do SSO. +access-token-lifespan-for-implicit-flow=Duração do token de acesso para fluxos Implícitos +access-token-lifespan-for-implicit-flow.tooltip=Tempo máximo antes que um token de acesso emitido durante o Fluxo Implícito do OpenID Connect expire. Recomenda-se que este valor seja menor em relação ao tempo de inativação do SSO. Não há posibilidade de atualizar este token durante o fluxo implícito, sendo este o motivo de existir um tempo limite diferente para a 'Duração do Token de Acesso'. +client-login-timeout=Tempo limite para login do Cliente +client-login-timeout.tooltip=Tempo máximo que um cliente tem para finalizar o procolo do token de acesso. Normalmente deve ser 1 minuto. +login-timeout=Tempo máximo do Login +login-timeout.tooltip=Tempo máximo que um usuário tempo para completar o login. É recomendado que seja relativamente longo - 30 minutos ou mais. +login-action-timeout=Tempo limite da ação de Login +login-action-timeout.tooltip=Tempo máximo que um usuário tem para completar as ações relacionadas ao login como atualizar senhas ou configurar totp. É recomendado que seja relativamente longo - 5 minutos ou mais. +headers=Cabeçalhos +brute-force-detection=Detecção de ataque de Força Bruta +x-frame-options=X-Frame-Options +x-frame-options-tooltip=O valor padrão impede páginas de serem incluídas via non-origin iframes (clique no label para mais informações) +content-sec-policy=Content-Security-Policy +content-sec-policy-tooltip=O valor padrão impede páginas de serem incluídas via non-origin iframes (clique no label para mais informações) +content-type-options=X-Content-Type-Options +content-type-options-tooltip=O valor padrão impede Internet Explorer and Google Chrome de realizarem MIME-sniffing em uma resposta diferente do content-type declarado (clique no label para mais informações) +max-login-failures=Falhas de login +max-login-failures.tooltip=Quantas falhas de login antes que a espera seja habilitada. +wait-increment=Incremento de Espera +wait-increment.tooltip=Quando a quantidade de falhas for alcançada, quanto tempo o usuário deve aguardar antes de tentar novamente? +quick-login-check-millis=Verificação de Quick Login em Milli Seconds +quick-login-check-millis.tooltip=Se uma falha ocorre concorrentemente neste período, travar a conta do usuário. +min-quick-login-wait=Espera mínima após Quick Login +min-quick-login-wait.tooltip=Quanto tempo aguardar após uma falha de quick login. +max-wait=Espera máxima +max-wait.tooltip=Tempo máximo que um usuário deverá aguardar após uma falha de quick login. +failure-reset-time=Tempo para zerar falhas +failure-reset-time.tooltip=Quando o contador de falhas será resetado? +realm-tab-login=Login +realm-tab-keys=Chaves +realm-tab-email=E-mail +realm-tab-themes=Temas +realm-tab-cache=Cache +realm-tab-tokens=Tokens +realm-tab-client-initial-access=Tokens de Acesso inicial +realm-tab-security-defenses=Defesas +realm-tab-general=Geral +add-realm=Adicionar realm + +#Session settings +realm-sessions=Sessões do Realm +revocation=Revogação +logout-all=Deslogar todos +active-sessions=Sessões Ativas +sessions=Sessões +not-before=Não antes de +not-before.tooltip=Revogar qualquer token emitido antes desta data. +set-to-now=Definir como agora +push=Enviar +push.tooltip=Para cada cliente que possui uma URL de administrador, notificá-los da nova política de revogação. + +#Protocol Mapper +usermodel.prop.label=Propriedade +usermodel.attr.label=Atributo do usuário +userSession.modelNote.label=Nota da sessão de usuário +multivalued.label=Múltiplos valores +selectRole.label=Selecione o Role +tokenClaimName.label=Nome do Token Claim +jsonType.label=Tipo JSON do Claim +includeInIdToken.label=Adicionar ao token de ID +includeInAccessToken.label=Adicionar ao token de acesso +includeInUserInfo.label=Adicionar à informação do usuário +usermodel.clientRoleMapping.clientId.label=ID do cliente +usermodel.clientRoleMapping.rolePrefix.label=Prefixo para o role de Cliente +usermodel.realmRoleMapping.rolePrefix.label=Prefixo do Realm Role + +# client details +search.placeholder=Pesquisar... +create=Criar +import=Importar +client-id=ID do cliente +base-url=URL Base +actions=Ações +not-defined=Não definido +edit=Editar +delete=Excluir +no-results=Sem resultados +no-clients-available=Nenhum cliente disponível +add-client=Adicionar cliente +select-file=Selecionar arquivo +view-details=Ver detalhes +clear-import=Cancelar importação +client-id.tooltip=Especifica o ID referenciado em URI e tokens. Por exemplo 'meu-cliente'. Para SAML também representa o valor do emissor esperado dos authn requests +client.name.tooltip=Especifica o nome de exibição do cliente. Por exemplo 'Meu Cliente'. Também aceita chaves para valores localizados. Por exemplo: ${meu_cliente} +client.description.tooltip=Especifica a descrição do cliente. Por exemplo 'Meu cliente para TimeSheets'. Também aceita chaves para valores localizados. Por exemplo: ${meu_cliente_descricao} +client.enabled.tooltip=Clientes desabilitados não podem realizar login ou obter tokens de acesso. +consent-required=Consentimento exigido +consent-required.tooltip=Se habilitado os usuários devem consentir com o acesso ao cliente. +client-protocol=Protocolo cliente +client-protocol.tooltip='OpenID connect' permite aos Clientes verificarem a identidade do usuário final baseado na autenticação realizada por um servidor de Autorização. 'SAML' permite cenários de autenticação e autorização web-based incluindo cross-domain single sign-on (SSO) e utiliza tokens de segurança contendo assertions para trafegar informações. +access-type=Tipo de acesso +access-type.tooltip=Clientes 'Confidential' requerem um secret para iniciar o protocolo de login. Clientes 'Public' não necessitam de secret. Clientes 'Bearer-only' são web services que nunca iniciam um login. +standard-flow-enabled=Fluxo padrão habilitado +standard-flow-enabled.tooltip=Isto habilita a autenticação baseada em redirecionamento com código de autorização padrão do OpenID Connect. Em termos de especificações OpenID Connect ou OAuth2, isto habilita suporte ao 'Fluxo de Código de Autorização' para este cliente. +implicit-flow-enabled=Fluxo implícito habilitado +implicit-flow-enabled.tooltip=Isto habilita suporte a autenticação baseada em redirecionamento sem código de autorização. Em tempos de especificações OpenID Connect ou OAuth2, isto habilita suporte do 'Fluxo Implícito' para este cliente. +direct-access-grants-enabled=Grants de Acesso direto habilitado +service-accounts-enabled=Contas de serviço habilitadas +include-authnstatement=Incluir AuthnStatement +sign-documents=Assinar documentos +sign-assertions=Assinar assertions +signature-algorithm=Algoritmo de assinatura +canonicalization-method=Método de Canonicalization +encrypt-assertions=Encriptar Assertions +client-signature-required=Assinatura do cliente requerida +force-post-binding=Forçar Binding via POST +front-channel-logout=Front Channel Logout +force-name-id-format=Forçar formato do NameID +name-id-format=Formato do NameID +valid-redirect-uris=URIs de redirecionamento válidas +admin-url=URL do administrador +master-saml-processing-url=URL de processamento SAML principal +idp-sso-url-ref=Nome de URL para SSO iniciado via IDP +idp-sso-relay-state=Estado de relay para SSO iniciado via IDP +fine-saml-endpoint-conf=Configuração de endpoint para configuração fina do SAML +assertion-consumer-post-binding-url=URL para conexão post para o serviço consumidor de Assertions +assertion-consumer-redirect-binding-url=URL para conexão de redirecionamento do serviço consumidor de Assertions +logout-service-post-binding-url=URL de conexão POST para o serviço de logout +logout-service-post-binding-url.tooltip=URL de conexão POST para o serviço de logout +logout-service-redir-binding-url=URL de conexão para o redirecionamento do serviço de logout + +# client import +import-client=Importar cliente +format-option=Formato +import-file=Importar arquivo + +# client tabs +settings=Configurações +credentials=Credenciais +saml-keys=Chaves SAML +roles=Roles +mappers=Mapeamentos +scope=Escopo +offline-access=Acesso offline +installation=Instalação +service-account-roles=Roles de contas de serviço + +# client credentials +client-authenticator=Autenticador do cliente +no-client-certificate-configured=Nenhum certificado cliente configurado +gen-new-keys-and-cert=Gerar novas chaves e certificados +import-certificate=Importar certificado +gen-client-private-key=Gerar chave privada do cliente +generate-private-key=Gerar chave privada +archive-format=Formato do arquivo +key-alias=Alias da chave +key-password=Senha da chave +store-password=Salvar senha +generate-and-download=Gerar e fazer download +client-certificate-import=Importar certificado do cliente +import-client-certificate=Importar certificado do cliente +secret=Segredo +regenerate-secret=Recriar segredo +registrationAccessToken=Token de acesso para registro +registrationAccessToken.regenerate=Regerar token de acesso para registro +add-role=Adicionar Role +role-name=Nome do Role +composite=Composto +description=Descrição +no-client-roles-available=Nenhum role de cliente disponível +scope-param-required=Parâmetro de escopo requerido +composite-roles=Roles compostos +realm-roles=Roles do Realm +available-roles=Roles disponíveis +add-selected=Adicionar selecionados +associated-roles=Roles associados +remove-selected=Remover selecionados +client-roles=Roles de clientes +select-client-to-view-roles=Selecione o cliente para ver os roles do cliente +add-builtin=Adicionar Builtin +category=Categoria +type=Tipo +no-mappers-available=Nenhum mapeamento disponível +add-builtin-protocol-mappers=Adicionar mapeamentos de protocolo Builtin +add-builtin-protocol-mapper=Adicionar mapeamentos de protocolo Builtin + +scope-mappings=Mapeamentos do Escopo +full-scope-allowed=Permitir Escopo completo +assigned-roles=Roles associados +effective-roles=Roles efetivos +basic-configuration=Configuração básica +node-reregistration-timeout=Tempo limite para re-registro de nó +registered-cluster-nodes=Nós de cluster registrados +register-node-manually=Registrar nó manualmente +test-cluster-availability=Testar disponibilidade do cluster +last-registration=Último registro +node-host=Host +no-registered-cluster-nodes=Nenhum nó registrado disponível +cluster-nodes=Nós do cluster +add-node=Adicionar nó +show-sessions=Exibir sessões +user=Usuário +from-ip=Do IP +session-start=Início da sessão +first-page=Primeira página +previous-page=Página anterior +next-page=Próxima página +select-a-format=Selecione um formato +download=Download +offline-tokens=Tokens offline +show-offline-tokens=Exibir tokens offline +token-issued=Token emitido +last-access=Último acesso +last-refresh=Último refresh +key-export=Exportar chave +key-import=Importar chave +export-saml-key=Exportar chave SAML +import-saml-key=Importar chave SAML +realm-certificate-alias=Alias do certificado do Realm +signing-key=Chave de assinatura +saml-signing-key=Chave de assinatura SAML +private-key=Chave privada +generate-new-keys=Gerar novas chaves +export=Exportar +encryption-key=Chave de encriptação +service-accounts=Contas de serviço +service-account-is-not-enabled-for=Contas de serviço não estão habilitadas para {{client}} +create-protocol-mappers=Criar mapeamentos de protocolo +create-protocol-mapper=Criar mapeamento de protocolo +protocol=Protocolo +protocol.tooltip=Protocolo... +id=ID +mapper.name.tooltip=Nome do mapeamento +consent-text=Texto para consentimento +mapper-type=Tipo de mapeamento +# realm identity providers +identity-providers=Provedores de identificação +table-of-identity-providers=Tabela de provedores de identidade +add-provider.placeholder=Adicionar provedor... +provider=Provedor +first-broker-login-flow=Fluxo do primeiro login +post-broker-login-flow=Fluxo pós login +redirect-uri=URI de redirecionamento +alias=Alias +authenticate-by-default=Autenticar por padrão +store-tokens=Salvar Tokens +stored-tokens-readable=Leitura de tokens salvos +trust-email=Confiar no e-mail recebido +gui-order=Ordem na tela +gui-order.tooltip=Número definindo a ordem do provedor na GUI (ex na página de Login). +openid-connect-config=Configuração OpenID Connect +authorization-url=URL de autorização +token-url=URL do Token +logout-url=URL de logout +backchannel-logout=Backchannel Logout +user-info-url=URL de informações do usuário +client-secret=Secret do Cliente +show-secret=Exibir secret +hide-secret=Esconder secret +issuer=Emissor +default-scopes=Escopos padrão +prompt=Prompt +unspecified.option=Não especificado +none.option=Nenhum +consent.option=Consentimento +login.option=Login +select-account.option=select_account +validate-signatures=Validar assinaturas +validating-public-key=Chave pública para validação +import-external-idp-config=Importar configuração de IDP externo +import-from-url=Importar de URL +import-from-file=Importar de arquivo +saml-config=Configuração SAML +single-signon-service-url=URL de serviço do Single Sign On +single-logout-service-url=URL de serviço de Single Logout +nameid-policy-format=Política de formato NameID +http-post-binding-response=Responder com HTTP-POST +http-post-binding-for-authn-request=Utilizar HTTP-POST binding para AuthnRequest +want-authn-requests-signed=Esperar AuthnRequests assinados +force-authentication=Forçar autenticação +validate-signature=Validar assinatura +validating-x509-certificate=Validar certificados X509 +key=Chave + +# User federation +sync-ldap-roles-to-keycloak=Sincronizar os roles do LDAP para o Keycloak +sync-keycloak-roles-to-ldap=Sincronizar os roles do Keycloak para o LDAP +sync-ldap-groups-to-keycloak=Sincronizar os grupos do LDAP para o Keycloak +sync-keycloak-groups-to-ldap=Sincronizar os grupos do Keycloak para o LDAP + +realms=Realms +realm=Realm + +identity-provider-mappers=Mapeamentos de provedores de identificação +create-identity-provider-mapper=Criar mapeamento de provedores de identificação +add-identity-provider-mapper=Adicionar mapeamento de provedor de identificação + +expires=Expira em +expiration=Duração +expiration.tooltip=Especifica por quanto tempo o token deve ser válido +count=Quantidade +count.tooltip=Especifica quantos clientes podem ser criados usando o token +remainingCount=Quantidade restante +created=Criado em +back=Voltar +initial-access-tokens=Tokens de acesso inicial +add-initial-access-tokens=Adicionar token de acesso inicial +initial-access-token=Token de acesso inicial +initial-access.copyPaste.tooltip=Copie/cole o token de acesso inicial antes de sair desta página pois não é possível recuperá-lo depois +continue=Continuar +initial-access-token.confirm.title=Copiar o token de acesso inicial +initial-access-token.confirm.text=Por favor copie e cole o token de acesso inicial antes de confirmar pois não é possível recuperá-lo depois + +client-templates=Modelos de cliente + +groups=Grupos + +default-roles=Roles padrão +no-realm-roles-available=Nenhum role de realm disponível + +users=Usuários +realm-default-roles=Roles padrão do Realm +client-default-roles=Roles padrão do Cliente +partial-import=Importação parcial + +file=Arquivo +exported-json-file=Arquivo json exportado +import-from-realm=Importar de realm +import-users=Importar usuários +import-groups=Importar grupos +import-clients=Importar clientes +import-identity-providers=Importar provedores de identificação +import-realm-roles=Importar roles do realm +import-client-roles=Importar roles de cliente +if-resource-exists=Se um recurso já existir +fail=Falhar +skip=Pular +overwrite=Sobrescrever + +action=Ações +role-selector=Seletor de roles + +select-a-role=Selecione um role +select-realm-role=Selecione um role de realm +select-client-role=Selecione um role de cliente + +client-template=Modelos de Cliente +client-saml-endpoint=Cliente SAML Endpoint +add-client-template=Adicionar modelo de cliente + +manage=Administração +authentication=Autenticação +user-federation=Federação de usuários +events=Eventos +realm-settings=Configurações do Realm +configure=Configuração +select-realm=Selecione um realm +add=Adicionar + + +add-user-federation-provider=Adicionar provedor de federação de usuários +required-settings=Configurações obrigatórias +provider-id=ID do provedor +console-display-name=Nome de exibição no console +priority=Prioridade +sync-settings=Configurações de sincronização +periodic-full-sync=Syncronização completa periódica +full-sync-period=Período +periodic-changed-users-sync=Sincronização periódica de usuários alterados +changed-users-sync-period=Período +synchronize-changed-users=Sincronizar usuários alterados +synchronize-all-users=Sincronizar todos os usuários +kerberos-realm=Realm do Kerberos +server-principal=Principal do servidor +keytab=KeyTab +debug=Debug +allow-password-authentication=Permitir autenticação via senha +edit-mode=Modo de edição +update-profile-first-login=Atualizar Profile no primeiro login +sync-registrations=Sincronizar contas +vendor=Vendor +username-ldap-attribute=Atributo LDAP para Username +ldap-attribute-name-for-username=Atributo LDAP para Username +rdn-ldap-attribute=Atributo LDAP para RDN +ldap-attribute-name-for-user-rdn=Atributo LDAP para RDN +uuid-ldap-attribute=Atributo LDAP para UUID +ldap-attribute-name-for-uuid=Atributo LDAP para UUID +user-object-classes=Classes do objeto User + +ldap-connection-url=URL de conexão ao LDAP +ldap-users-dn=DN dos usuários no LDAP +ldap-bind-dn=DN para bind no LDAP +ldap-bind-credentials=Credenciais para conectar ao LDAP +ldap-filter=Filtro do LDAP + +connection-url=URL de conexão +test-connection=Testar conexão +users-dn=Users DN +authentication-type=Tipo de autenticação +bind-dn=Bind DN +bind-credential=Senha para conexão +test-authentication=Testar autenticação +custom-user-ldap-filter=Filtro de usuários LDAP customizado +search-scope=Escopo de pesquisa +use-truststore-spi=Utilizar Truststore SPI +connection-pooling=Pooling de conexões +kerberos-integration=Integração com Kerberos +allow-kerberos-authentication=Permitir autenticação Kerberos +use-kerberos-for-password-authentication=Utilizar Kerberos para autenticação via senha +batch-size=Tamanho do lote +user-federation-mappers=Mapeamentos de federação de usuário +create-user-federation-mapper=Criar mapeamento de federação de usuário +add-user-federation-mapper=Adicionar mapeamento de federação de usuário +provider-name=Nome do provedor +no-user-federation-providers-configured=Nenhum federação de usuários configurada. +add-identity-provider=Adicionar provedor de identificação +add-identity-provider-link=adicionar link para provedor de identificação +identity-provider=Provedor de identificação +identity-provider-user-id=ID de usuário do provedor de identificação +identity-provider-username=Nome de usuário do provedor de identificação +pagination=Paginação + +browser-flow=Fluxo de browser +registration-flow=Fluxo de registro +direct-grant-flow=Fluxo de Direct Grant +reset-credentials=Reiniciar credenciais +client-authentication=Autenticação do cliente +new=Novo +copy=Copiar +add-execution=Adicionar execução +add-flow=Adicionar fluxo +auth-type=Tipo +requirement=Condição +config=Configuração +no-executions-available=Nenhuma execução disponível +authentication-flows=Fluxos de autenticação +create-authenticator-config=Criar configuração de autenticação +otp-type=Tipo OTP +time-based=Baseado em tempo +counter-based=Baseado em contador +otp-hash-algorithm=Algoritmo de hash OTP +number-of-digits=Quantidade de dígitos +look-ahead-window=Look Ahead Window +initial-counter=Contador inicial +otp-token-period=Período de token OTP +table-of-password-policies=Tabela de política de senhas +add-policy.placeholder=Adicionar política... +policy-type=Tipo da política +policy-value=Valor da política +admin-events=Eventos de adminstração +login-events=Eventos de login +filter=Filtro +update=Atualizar +reset=Reiniciar +operation-types=Tipos de operações +select-operations.placeholder=Selecionar operações... +resource-path=Path do recurso +date-(from)=Data (De) +date-(to)=Data (Até) +authentication-details=Detalhes para autenticação +ip-address=Endereço IP +time=Tempo +operation-type=Tipo de operação +auth=Autenticação +representation=Representação +register=Registro +required-action=Ação requerida +default-action=Ação padrão +no-required-actions-configured=Nenhuma ação requerida configurada +defaults-to-id=ID é o padrão +flows=Fluxos +bindings=Ligações +required-actions=Ações requeridas +password-policy=Política de senha +otp-policy=Política OTP +user-groups=Grupos de usuário +default-groups=Grupos Padrão +cut=Recortar +paste=Colar + +create-group=Criar grupo +create-authenticator-execution=Criar execução de autenticação +create-form-action-execution=Criar execução de ação de formulário +create-top-level-form=Criar formulário de nível superior +top-level-flow-type=Tipo do fluxo de nível superior +flow.generic=genérico +flow.client=cliente +create-execution-flow=Criar fluxo de execução +flow-type=Flow Type +flow.form.type=formulário +flow.generic.type=genérico +form-provider=Provedor de formulário +select-a-type.placeholder=selecione um tipo +available-groups=Grupos disponíveis +value=Valor +table-of-group-members=Tabela de membros do grupo +table-of-role-members=Tabela de membros do role +last-name=Sobrenome +first-name=Primeiro nome +email=E-mail +toggle-navigation=Alternar navegação +manage-account=Administrar a conta +sign-out=Sign Out +server-info=Informação do servidor +resource-not-found=Recurso não encontrado... +resource-not-found.instruction=Não foi possível encontrar o recurso solicitado. Por favor verifique se a URL solicitada está correta. +go-to-the-home-page=Ir para a página inicial » +page-not-found=Página não encontrada... +page-not-found.instruction=Não foi possível encontrar a página solicitada. Por favor verifique se a URL solicitada está correta. +select-event-types.placeholder=Selecione os tipos de eventos... +select-an-action.placeholder=Selecione uma ação... +admin-events-settings=Configuração de eventos de administração +save-events=Salvar eventos +include-representation=Incluir representação +server-version=Versão do servidor +info=Informações +providers=Provedores +server-time=Hora do servidor +server-uptime=Uptime do servidor +memory=Memória +total-memory=Memória total +free-memory=Memória livre +used-memory=Memória utilizada +system=Sistema +current-working-directory=Diretório de trabalho atual +java-version=Versão do Java +java-vendor=Java Vendor +java-runtime=Java Runtime +java-vm=Java VM +java-vm-version=Versão da Java VM +java-home=Java Home +user-name=Usuário +user-timezone=Zona horária do usuário +user-locale=Locale do usuário +system-encoding=Enconding do sistema +operating-system=Sistema operacional +os-architecture=Arquitetura do OS +spi=SPI +granted-roles=Roles concedidos +granted-protocol-mappers=Protocol Mappers concedidos +additional-grants=Concessões adicionais +revoke=Revogar +new-password=Nova senha +password-confirmation=Confirmação de senha +reset-password=Reiniciar senha +remove-totp=Remover TOTP +reset-actions=Ações para reiniciar +reset-actions-email=Ações para reiniciar e-mail +send-email=Enviar e-mail +add-user=Adicionar usuário +created-at=Criado em +user-enabled=Usuário ativo +user-temporarily-locked=Usuário temporariamente desativado +unlock-user=Liberar usuário +federation-link=Link para federação +email-verified=E-mail verificado +required-user-actions=Ações necessárias do usuário +locale=Locale +select-one.placeholder=Selecione um... +impersonate=Personificar +impersonate-user=Personificar usuário +identity-provider-alias=Alias do Provedor de Identificação +provider-user-id=Provider User ID +provider-username=Provider Username +no-identity-provider-links-available=Nenhum link para provedor de identificação disponível +group-membership=Grupos associados +leave=Sair +table-of-realm-users=Tabela de usuários do Realm +view-all-users=Exibir todos os usuários +unlock-users=Liberar usuários +no-users-available=Nenhum usuário disponível +users.instruction=Por favor faça uma pesquisa, ou clique em Exibir todos os usuários +consents=Consentimentos +started=Iniciado +logout-all-sessions=Logout todas as sessões +logout=Logout +new-name=Novo nome +ok=Ok +attributes=Atributos +role-mappings=Mapeamento de roles +members=Membros +details=Detalhes +identity-provider-links=Links de provedores de identificação. +register-required-action=Registrar ação necessária +gender=Gênero +address=Endereço +phone=Telefone +profile-url=URL do perfil +picture-url=URL da foto +website=Website +import-keys-and-cert=Importar chave e certificado +upload-keys=Carregar chaves +download-keys-and-cert=Download chave e certificado +no-value-assigned.placeholder=Nenhum valor associado +remove=Remover +no-group-members=Nenhum membro +no-role-members=Nenhum membro no role +temporary=Temporária +join=Participar +event-type=Tipo de evento +events-config=Configurar eventos +event-listeners=Listeners de eventos +login-events-settings=Configuração de eventos de login +clear-events=Limpar eventos +saved-types=Tipos salvos +clear-admin-events=Limpar eventos administrativos +clear-changes=Cancelar mudanças +error=Erro + +# Authz +# Authz Common +authz-authorization=Autorização +authz-owner=Proprietário +authz-uri=URI +authz-scopes=Escopos +authz-resource=Recurso +authz-resource-type=Tipo de recurso +authz-resources=Recursos +authz-scope=Escopo +authz-authz-scopes=Autorização de escopos +authz-policies=Políticas +authz-permissions=Permissões +authz-users=Usuários no role +authz-evaluate=Avaliar +authz-icon-uri=URI do ícone +authz-select-scope=Selecione um escopo +authz-select-resource=Selecione um recurso +authz-associated-policies=Políticas associadas +authz-any-resource=Qualquer recurso +authz-any-scope=Qualquer escopo +authz-any-role=Qualquer role +authz-policy-evaluation=Avaliação da política +authz-select-client=Selecione um cliente +authz-select-user=Selecione um usuário +authz-entitlements=Direitos +authz-no-resources=Nenhum recurso +authz-result=Resultado +authz-authorization-services-enabled=Autorização habilitada +authz-required=Obrigatório + +# Authz Settings + +authz-policy-enforcement-mode=Modo de execução da política +authz-policy-enforcement-mode-enforcing=Restritiva +authz-policy-enforcement-mode-permissive=Permissiva +authz-policy-enforcement-mode-disabled=Desabilitada + +authz-remote-resource-management=Administração remota de recursos + +authz-export-settings=Exportar configurações + +# Authz Resource List +authz-no-resources-available=Nenhum recurso disponível. +authz-no-scopes-assigned=Nenhum escopo associado. +authz-no-type-defined=Nenhum tipo definido. +authz-no-permission-assigned=Nenhuma permissão associada. +authz-no-policy-assigned=Nenhuma política associada. +authz-create-permission=Criar permissão + +# Authz Resource Detail +authz-add-resource=Adicionar recurso + +# Authz Scope List +authz-add-scope=Adicionar escopo +authz-no-scopes-available=Nenhum escopo disponível. + +# Authz Scope Detail + +# Authz Policy List +authz-all-types=Todos os tipos +authz-create-policy=Criar política +authz-no-policies-available=Nenhuma política disponível + +# Authz Policy Detail +authz-policy-logic=Lógica +authz-policy-logic-positive=Positiva +authz-policy-logic-negative=Negativa +authz-policy-apply-policy=Aplicar política +authz-policy-decision-strategy=Estratégia de decisão +authz-policy-decision-strategy-affirmative=Afirmativa +authz-policy-decision-strategy-unanimous=Unânime +authz-policy-decision-strategy-consensus=Consensual +authz-select-a-policy=Selecionar uma política + +# Authz Role Policy Detail +authz-add-role-policy=Adicionar política de Role +authz-no-roles-assigned=Nenhum role associado + +# Authz User Policy Detail +authz-add-user-policy=Adicionar política de usuário +authz-no-users-assigned=Nenhum usuário associado + +# Authz Time Policy Detail +authz-add-time-policy=Adicionar política de tempo +authz-policy-time-not-on-after=Não em ou depois + +# Authz Drools Policy Detail +authz-add-drools-policy=Adicionar política Rules +authz-policy-drools-maven-artifact-resolve=Resolver +authz-policy-drools-maven-artifact=Artefato maven de política +authz-policy-drools-module=Módulo +authz-policy-drools-session=Sessão +authz-policy-drools-update-period=Atualizar período + +# Authz JS Policy Detail +authz-add-js-policy=Adicionar política Javascript +authz-policy-js-code=Código + + +# Authz Aggregated Policy Detail +authz-aggregated=Agregado +authz-add-aggregated-policy=Adicionar política agregada + +# Authz Permission List +authz-no-permissions-available=Nenhuma permissão disponível + +# Authz Permission Detail + +# Authz Resource Permission Detail +authz-add-resource-permission=Adicionar permissão para recurso +authz-permission-resource-apply-to-resource-type=Aplicar ao tipo de recurso + +# Authz Scope Permission Detail +authz-add-scope-permission=Adicionar permissão de escopo + +# Authz Evaluation +authz-evaluation-identity-information=Informação de identidade +authz-evaluation-new=Nova avaliação +authz-evaluation-re-evaluate=Re-avaliar +authz-evaluation-previous=Avaliação anterior +authz-evaluation-contextual-info=Informação contextual +authz-evaluation-contextual-attributes=Atributos contextuais +authz-evaluation-evaluate=Avaliar +authz-evaluation-any-resource-with-scopes=Qualquer recurso com escopo(s) +authz-evaluation-no-result=Não foi possível obter nenhum resultado para o pedido de autorização provida. Verifique os recurso(s) ou escopo(s) providos estão associados com alguma política. +authz-evaluation-no-policies-resource=Nenhma política foi encontrada para este recurso. +authz-evaluation-authorization-data=Resposta +authz-show-authorization-data=Exibir dados da autorização + +usermodel.prop.tooltip=Nome do método da propriedade na interface UserModel. Por exemplo, o valor 'email' iria referenciar o método UserModel.getEmail() . +usermodel.attr.tooltip=Nome do atributo do usuário que é uma chave de atributo no mapa UserModel.attribute. +userSession.modelNote.tooltip=Nome da nota de sessão do usuário salva no mapa UserSessionModel.note. +multivalued.tooltip=Indica se um atributo suporta múltiplos valores. Se verdadeiro, então a lista de todos os valores desse atributo será definida como o claim. Se falso, então apenas o primeiro valor será utilizado. +selectRole.tooltip=Entre com o role na caixa à esquerda, ou clique neste botão para navegar e selecionar o role desejado. +tokenClaimName.tooltip=Nome do claim para inserir no token. Pode ser um nome completo (fully qualified) como 'address.street'. Neste caso, um objeto json aninhado será criado. +jsonType.tooltip=Tipo JSON que deve ser utilizado para popular o claim json no token. Os valores válidos são Long, int boolean e String. +includeInIdToken.tooltip=O claim deve ser adicionado ao token de ID? +includeInAccessToken.tooltip=O claim deve ser adicionado ao token de acesso? +includeInUserInfo.tooltip=O claim deve ser adicionado à informação do usuário? +usermodel.clientRoleMapping.clientId.tooltip=ID do cliente para mapeamentos de roles +usermodel.clientRoleMapping.rolePrefix.tooltip=Um prefixo para cada role do cliente (opcional) +usermodel.realmRoleMapping.rolePrefix.tooltip=Um prefixo para cada Realm Role (opcional). +clients.tooltip=Os clientes são aplicativos de browser e serviços web confiáveis em um realm. Esses clientes podem solicitar login. Você também pode definir roles específicos do cliente. +authz-policy-role-clients.tooltip= Selecione um cliente a fim de filtrar os roles de cliente que podem ser aplicados a esta política. +direct-access-grants-enabled.tooltip=Habilita o suporte para concessões de acesso direto (Direct Access Grants), o que significa que o cliente tem acesso ao nome de usuário/senha e negocia diretamente com o servidor Keycloak pelo token de acesso. Em termos de especificações OAuth2, habilita suporte de "Resource Owner Password Credentials Grant" para este cliente. +service-accounts-enabled.tooltip=Permite autenticar este cliente no Keycloak e recuperar tokens de acesso dedicados para este cliente. Em termos da especificações OAuth2, habilita suporte para 'Client Credentials Grants' para este cliente. +include-authnstatement.tooltip=Deve ser adicionado um statement especificando o método e timestamp nas respostas de login? +sign-documents.tooltip=Devem os documentos SAML serem assinados pelo realm? +sign-assertions.tooltip=Devem as asserções dentro dos documentos SAML serem assinadas? Esta configuração não é necessária se o documento já está sendo assinado. +signature-algorithm.tooltip=O algoritmo de assinatura a ser utilizado para assinar documentos. +canonicalization-method.tooltip=Canonicalization Method para assinaturas XML. +encrypt-assertions.tooltip=Devem as asserções SAML serem encriptadas com a chave pública do cliente usando AES? +client-signature-required.tooltip=O cliente irá assinar os pedidos e respostas saml? E eles devem ser validados? +force-post-binding.tooltip=Sempre utilizar POST para respostas. +front-channel-logout.tooltip=Quando marcado, o logout requer um redirecionamento do browser para o cliente. Caso contrário o servidor executo uma invocação em background para o logout. +force-name-id-format.tooltip=Ignora o NameID de assunto solicitado e utiliza o configurado no console de administração. +name-id-format.tooltip=O formato de Name ID para utilizar como assunto. +root-url.tooltip=URL raiz adicionada à URLs relativas +valid-redirect-uris.tooltip=Padrão de URI válido para onde um navegador pode redirecionar depois de um login bem-sucedido ou sair. Wildcards simples são permitidos, por exemplo 'http://example.com/*'. Caminhos relativos podem ser especificados também, ex: /my/relative/path/*. Caminhos relativos são relativos à URL raiz do cliente, ou se nenhum for especificado a URL raiz do servidor é usado. Para SAML, é necessário definir padrões de URI válidos se você está contando com a URL do serviço consumidor incorporada com a solicitação de login. +base-url.tooltip=URL padrão para utilizar quando o servidor de autenticação necessita redirecionar ou linkar para o cliente. +admin-url.tooltip=URL para a inteface administrativa do cliente. Defina este valor se o cliente suporta a API do adaptador REST. Esta API rest permite que o servidor de autenticação envie políticas de revogação e outras tarefas administrativas. Geralmente este valor é definido apontando para a URL base do cliente. +master-saml-processing-url.tooltip=Se configurado, esta URL será utilizada para todos os bindings do "SP's Assertion Consumer" e "Single Logout Services". Ela pode ser sobreescriva idnvidualmente para cada ligação e serviço na Configuração Detalhada do Endpoint SAML. +idp-sso-url-ref.tooltip=Nome do fragmento URL para referenciar o cliente quando você deseja um SSO iniciado por IDP. Deixar este campo vazio irá desabilitar SSO iniciado por IDP. A URL que você irá referenciar do seu browser será: {server-root}/realms/{realm}/protocol/saml/clients/{client-url-name} +idp-sso-relay-state.tooltip=O estado de Relay que você deseja enviar com um pedido SAML quando você deseja realizar SSO iniciado por IDP. +web-origins.tooltip=Permitir origens CORS. Para permitir todas as URIs de redirecionamento de origem válidas adicionar '+'. Para permitir todas as origens adicionar '*'. +fine-saml-endpoint-conf.tooltip=Expanda esta sessão para configurar URLs específics para 'Assertion Consumer' e 'Single Logout Service'. +assertion-consumer-post-binding-url.tooltip=URL de ligação SAML via post para as asserções de consumidor de serviços do cliente (respostas de login). Você pode deixar este campo em branco se você não tiver uma URL para esta ligação. +assertion-consumer-redirect-binding-url.tooltip=URL de ligação SAML de redirecionamento para as asserções de consumidor de serviços do cliente (respostas de login). Você pode deixar este campo em branco se você não tiver uma URL para esta ligação. +logout-service-binding-post-url.tooltip=URL de ligação SAML via post para o serviço de logout único do cliente. Voce pode deixar este campo em branco se estiver usando uma ligação diferente. +logout-service-redir-binding-url.tooltip=URL de ligação SAML de redirecionamento para o serviço de logout único do cliente. Voce pode deixar este campo em branco s e estiver usando uma ligação diferente. +mappers.tooltip=Mapeamentos de protocolo executam transformações em tokens e documentos. Eles podem realizar coisas como mapear dados de usuários para claims de protocolo, ou apenas transformar qualquer solicitação entre o cliente e o servidor de autenticação. +scope.tooltip=Escopos de mapeamento permitem que você restrinja quais mapeamentos de roles de usuário são inclusos nos tokens de acesso solicitado pelo cliente. +ldap.search-scope.tooltip=Para um nível nós pesquisamos somente os usuários nos DNs especificados pelo campo User DNs. Para subtree, nós pesquisamos na sub-árvore completa. Verifique a documentação do LDAP para mais detalhes. +authz-permission-scope-scope.tooltip=Define que esta permissões deve ser aplicada para um ou mais escopos. +sessions.tooltip=Exibir as sessões ativas para este cliente. Permite que você veja quais usuários estão ativos e quando eles logaram. +active-sessions.tooltip=Total de sessões de usuário ativas para este cliente. +show-sessions.tooltip=Atenção, esta é uma operação potencialmente cara dependendo do número de sessões ativas. +offline-access.tooltip=Exibe as sessões offline para este cliente. Permite que você veja quantos usuários obtém tokens offline e quando eles os obtiveram. PAra revogar todos os tokens do cliente, vá para a aba Revogações e defina o valor do campo 'não antes de' para 'agora'. +installation.tooltip=Ferramenta de auxílio para gerar vários formatos de adaptadores de cliente que você poderá fazer download depois ou copiar e colar para configurar seus cliente. +service-account-roles.tooltip=Permite que você autentique mapeamentos de roles para as contas de serviço dedicadas à este cliente. +client-authenticator.tooltip=Autenticador de Cliente usado para autenticar este cliente ao servidor Keycloak +certificate.tooltip=Certificado do cliente para validar JWT emitidos pelo cliente e assinados pela chave privada do cliente da sua keystore. +validating-x509-certificate.tooltip=O certificado em formato PEM que deve ser usado para verificar assinaturas. +archive-format.tooltip=Keystore Java ou arquivo em formato PKCS12. +key-alias.tooltip=Alias do arquivo para sua chave privada e certificado. +key-password.tooltip=Senha para acessar a chave privada no certificado. +store-password.tooltip=Senha para acessar o arquivo em si. +jwt-import.key-alias.tooltip=Alias do arquivo para o seu certificado. +registrationAccessToken.tooltip=O token de acesso para registro provê acesso aos cliente para o serviço de registro cliente. +scope-param-required.tooltip=Este role somente será concedido se os parâmetros de escopo com os nomes dos roles forem utilizados durante a autorização/solicitação de token. +composite-roles.tooltip=Quando este role é associado/removido de um usuário, qualquer role associado com ele também será adicionado/removido implicitamente. +composite.associated-realm-roles.tooltip=Roles de nível de realm associados com este role composto. +composite.available-realm-roles.tooltip=Roles de nível de realm disponíveis para este role composto. +available-roles.tooltip=Roles para este cliente que você pode associar a este role composto. +scope.available-roles.tooltip=Roles do Realm que podem ser associados a este escopo. +service-account.available-roles.tooltip=Roles do Realm que podem ser associados a contas de serviço. +client.associated-roles.tooltip=Roles do Cliente associados a este role composto. +full-scope-allowed.tooltip=Permite a você desabilitar todas as restrições. +assigned-roles.tooltip=Roles do Realm associados ao escopo. +service-account.assigned-roles.tooltip=Roles do Realm associados a conta de serviço. +group.assigned-roles.tooltip=Roles do Realm mapeados ao grupo. +realm.effective-roles.tooltip=Roles do Realm associados que podem ter sido herdados de um role composto. +select-client-roles.tooltip=Selecione o cliente para visualizar os roles de cliente. +assign.available-roles.tooltip=Roles de Cliente disponíveis para associação. +client.assigned-roles.tooltip=Roles de Cliente associados. +client.effective-roles.tooltip=Roles de cliente associados que podem ter sido herdados de um role composto. +node-reregistration-timeout.tooltip=Intervalo para especificar o tempo máximo para nós clientes de cluster registrados se re-registrarem. Se os nós do cluster não enviarem solicitações de re-registro dentro deste intervalo eles serão deregistrados do Keycloak. +client-revoke.not-before.tooltip=Revocar qualquer token emitido antes desta data para este cliente. +client-revoke.push.tooltip=Se a URL de administração estiver configurada para este cliente, envie esta política para este cliente. +offline-tokens.tooltip=Número total de tokens offline para este cliente. +show-offline-tokens.tooltip=Atenção, esta é uma operação potencialmente cara dependendo do número de tokens offline. +realm-certificate-alias.tooltip=O certificado do Realm também é guardado em arquivo. Este é o alias para ele. +saml-encryption-key.tooltip=Chave de encriptação SAML. +mapper.consent-required.tooltip=Ao conceder acesso temporário, deve o usuário consentir em prover esta informação para o cliente? +consent-text.tooltip=Texto para exibir na página de consentimento +mapper-type.tooltip=Tipo do mapeamento +redirect-uri.tooltip=A url de redirecionamento para usar quando da configuração do provedor de identidade. +identity-provider.alias.tooltip=O alias é o identificador único de um provedor de identidade e também é utilizado para construir a uri de redirecionamento. +identity-provider.enabled.tooltip=Habilita/Desabilita este provedor de identidade. +identity-provider.authenticate-by-default.tooltip=Indica se este provedor deve ser tentado por padrão para a autenticação mesmo ante de exibir a tela de login. +identity-provider.store-tokens.tooltip=Habilita/desabilita se os tokens deve ser guardados depois de autenticar os usuários. +identity-provider.stored-tokens-readable.tooltip=Habilita/desabilita se novos usuários podem ler quaisquer tokens salvo. Isto irá adicionar o role broker.read-token. +update-profile-on-first-login.tooltip=Define condições onde um usuário precisa atualizar o seu perfil durante o primeiro login. +trust-email.tooltip=Se habilitado então o e-mail provido por este provedor não será verificado mesmo que a verificação esteja habilitada para este realm. +first-broker-login-flow.tooltip=Alias do fluxo de autenticação que será invocado depois do primeiro login com este provedor de identificação. O termo 'Primeiro Login' significa que ainda não existe uma conta no Keycloak ligada a esta conta autenticada neste provedor. +post-broker-login-flow.tooltip=Alias do fluxo de autenticação que será invocado depois de cada login com esse provedor de identificação. É útil se você pretende adicionar verificações adicionais de cada usuário autenticado com este provedor (por exemplo OTP). Deixa vazio se você não deseja que nenhum autenticador adicionar seja invocado depois do login com este provedor de identificação. Note também que as implementações de autenticação devem assumir que o usuários já está definido na ClientSessioncom e com o provedor de identidade já definido. +openid-connect-config.tooltip=OIDC SP e configuração externa IDP. +authorization-url.tooltip=A URL de autorização. +token-url.tooltip=A URL do Token. +identity-provider.logout-url.tooltip='End session endpoint' para utilizar para realizar logour dos usuários do IDP externo. +backchannel-logout.tooltip=O IDP externo suporta logou via backchannel? +user-info-url.tooltip=A Url de informações de usuário. Opcional. +identity-provider.client-id.tooltip=O cliente ou identificador do cliente registrado junto ao provedor de identificação. +client-secret.tooltip=O cliente ou senha do cliente registrado junto ao provedor de identificação. +social.client-secret.tooltip=A senha do cliente registrado junto ao provedor de identificação. +issuer.tooltip=O identificador de emissor para o emissor da resposta. Se não for provido nenhuma validação será realizada. +identity-provider.default-scopes.tooltip=Os escopos que serão enviados ao solicitar autorização. Pode ser uma lista de escopos separadas por espaço. Valor padrão é 'openid'. +prompt.tooltip=Especifica se o Servidor de Autorização solicita ao Usuário Final reautenticação e consentimento. +identity-provider.validate-signatures.tooltip=Habilita/Desabilita a validação de assinatura de IDP externo. +identity-provider.validating-public-key.tooltip=A chave pública em formato PEM que deve ser usada para verificar assinaturas de IDP externos. +import-external-idp-config.tooltip=Permite que vocÊ carregue metadata de IDP externos de um arquivo de configuração ou baixando a partir de uma URL. +identity-provider.import-from-url.tooltip=Importar metadata de um descritor de descoberta remoto do IDP. +identity-provider.import-from-file.tooltip=Importar metadata fr um descritor de descoberta baixado do IDP. +identity-provider.saml-config.tooltip=SAML SP e configuração de IDP externo. +saml.single-signon-service-url.tooltip=A Url que deve ser utilizada para enviar solicitações de autenticação (SAML AuthnRequest). +saml.single-logout-service-url.tooltip=A Url que deve ser utilizada para enviar solicitações de logout. +nameid-policy-format.tooltip=Especifica a referência de URI correspondente a um formato de nome identificador. O padrão é urn:oasis:names:tc:SAML:2.0:nameid-format:persistent. +http-post-binding-response.tooltip=Indica se deve se responder a solicitações utilizando HTTP-POST. Se falso, HTTP-REDIRECT será utilizado. +http-post-binding-for-authn-request.tooltip=Indica se o AuthnRequest deve ser enviado utilizando HTTP-POST. Se falso, HTTP-REDIRECT será utilizado. +want-authn-requests-signed.tooltip=Indicate se um provedor de identificação deve experar um AuthnRequest assinado. +identity-provider.force-authentication.tooltip=Indica se um provedor de identificação deve autenticar o apresentador diretamente ao invés de confiar em um contexto de segurança anterior. +saml.validate-signature.tooltip=Habilita/Desabilita validação de assinaturas de respostas SAML. +saml.import-from-url.tooltip=Importar metadata de um descritor de entidade IDP SAML remoto. +social.client-id.tooltip=O identificador do cliente registrado com o provedor de identificação. +social.default-scopes.tooltip=Os escopos que serão enviados ao solicitar autorização. Veja a documentação para valores possíveis, separador e valores padrão. +stackoverflow.key.tooltip=A chave de cliente obtida do registro no Stack Overflow. +client-templates.tooltip=Modelos de cliente permitem que você defina configurações comuns que serão compartilhadas entre múltiplos clientes. +group.add-selected.tooltip=Roles do Realm que serão associadas ao grupo. +group.effective-roles.tooltip=Todos os mapeamentos de roles do Realm. Alguns roles exibidos podem ter sido herdados de um role composto mapeado. +group.available-roles.tooltip=Roles associáveis deste cliente. +group.assigned-roles-client.tooltip=Mapeamentos de roles para este cliente. +group.effective-roles-client.tooltip=Mapeamentos de roles para este cliente. Alguns roles exibidos podem ter sido herdados de um role composto mapeado. +user.add-selected.tooltip=Roles do Realm que podem ser associados ao usuário. +user.assigned-roles.tooltip=Roles do Realm mapeados para o usuário. +user.effective-roles.tooltip=Todos os mapeamentos de roles do Realm. Alguns roles exibidos podem ter sido herdados de um role composto mapeado. +user.available-roles.tooltip=Roles associáveis deste cliente. +user.assigned-roles-client.tooltip=Mapeamentos de roles para este cliente. +user.effective-roles-client.tooltip=Mapeamentos de Role para este cliente. Alguns roles exibidos podem ter sido herdados de um role composto mapeado. +default.available-roles.tooltip=Roles do nível de Realm que podem ser associados. +realm-default-roles.tooltip=Roles do nível de Realm associados a novos usuários. +default.available-roles-client.tooltip=Roles para este cliente que são associáveis por padrão. +client-default-roles.tooltip=Roles para este cliente que são associados como roles padrão. +composite.available-roles.tooltip=Roles do nível de Realm associáveis com este role composto. +composite.associated-roles.tooltip=Roles do nível de Realm associados com este role composto. +composite.available-roles-client.tooltip=Roles para este cliente que podem ser associados com este role composto. +composite.associated-roles-client.tooltip=Roles do cliente associados com este role composto. +partial-import.tooltip=Importação parcial permite que você importe usuários, clientes, e outros recursos de um arquivo json previamente exportado. +if-resource-exists.tooltip=Especifica o que deve ser feito se você tentar importar um recurso já existente. +realm-roles.tooltip=Roles do Realm que podem ser selecionados. +authz-policy-role-realm-roles.tooltip=Especifica quais role(s) de *realm* são permitidos por esta política. +client-roles.tooltip=Roles do cliente que podem ser selecionados. +authz-policy-role-client-roles.tooltip=Especifica quais role(s) do *cliente* são permitidos por esta política. +client-template.tooltip=Modelo de cliente do qual ete cliente herda as configurações. +client-template.name.tooltip=Nome do modelo de cliente. Deve ser único neste Realm. +client-template.description.tooltip=Descrição do modelo de cliente. +client-template.protocol.tooltip=Qual configuração de protocolo SSO será provida por este modelo de cliente. +console-display-name.tooltip=Nome de exibição do provedor quando linkado no console de administração. +priority.tooltip=Prioridade do provedor quando da busca de usuários. Valores mais baixos são utilizados primeiro. +periodic-full-sync.tooltip=Habilitar ou não a sincronização completa periódica dos usuários deste provedor. +ldap.periodic-full-sync.tooltip=Habilitar ou não a sincronização completa dos usuários do LDAP para o Keycloak. +full-sync-period.tooltip=Intervalo para a sincronização completa em segundos. +periodic-changed-users-sync.tooltip=Habilitar ou não a sincronização de usuários novos ou alterados do provedor para o Keycloak. +ldap.periodic-changed-users-sync.tooltip=Habilitar ou não a sincronização de usuários novos ou alterados do LDAP para o Keycloak. +changed-users-sync-period.tooltip=Intervalo para sincronização dos usuários alterados ou novos do provedor em segundos. +ldap.changed-users-sync-period.tooltip=Intervalo para sincronização dos usuários alterados ou novos do LDAP em segundos. +kerberos-realm.tooltip=Nome do realm kerberos. Por exemplo FOO.ORG +server-principal.tooltip=Nome completo do principal do servidor para o serviço HTTP incluindo o servidor e nome do domínio. Por exemplo HTTP/host.foo.org@FOO.ORG +keytab.tooltip=Localização do arquivo KeyTab do Kerberos contendo as credenciais do principal do servidor. Por exemplo /etc/krb5.keytab +debug.tooltip=Habilita/Desabilita log de nível debug para a saída padrão para Krb5LoginModule. +allow-password-authentication.tooltip=Habilita/Desabilita a possibilidade de autenticação via usuário/senha contra o banco Kerberos +edit-mode.tooltip=READ_ONLY significa que atualizações de senhas não são permitidas e o usuário sempre autenticará com a senha do Kerberos. UNSYNCED significa que o usuário pode alterar a senha no banco do Keycloak e essa senha será utilizda ao invés da senha do Kerberos. +ldap.edit-mode.tooltip=READ_ONLY é um LDAP somente leitura. WRITABLE significa que os dados serão sicronizados de volta para o LDAP on demand. UNSYNCED significa que os dados do usuário serão importados, mas não sicronizados de volta para o LDAP. +update-profile-first-login.tooltip=Atualizar o perfil no primeiro login +ldap.sync-registrations.tooltip=Os novos usuários criados devem ser criados no LDAP? A prioridade afeta qual provedor é utilizado para sincronizar o novo usuário. +ldap.vendor.tooltip=LDAP vendor (provedor) +username-ldap-attribute.tooltip=Nome do atributo do LDAP que será mapeado como nome do usuário no Keycloak. Para muitos servidores LDAP este valor deve ser 'uid'. Para o Active Directory pode ser 'sAMAccountName' ou 'cn'. O atributo deve ser preenchido para todos os registros de usuários do LDAP que você deseja importar do LDAP para o Keycloak. +rdn-ldap-attribute.tooltip=Nome do atributo LDAP que é utilizado como RDN (atributo topo) do DN do usuário típico. Geralmente é o mesmo que o atributo do nome do usuário, mas isto não é obrigatório. Por exemplo para o Active Directory é comum utilizar 'cn' como atributo RDN quando o atributo do nome de usuário pode ser 'sAMAccountName', +uuid-ldap-attribute.tooltip=Nome do atributo LDAP que é utilizado como identificador único do objeto(UUID) para objetos no LDAP. Para muitos servidores LDAP o valor é 'entryUUID', porém alguns são diferentes. Por exemplo para o Active Directory este valor para objetos no LDAP deve ser 'objectGUID'. Se o seu servidor LDAP realmente não suporta a noção de UUID, vocÊ pode usar qualquer outro atributo que seja único na árvore de usuários do LDAP. Por exemplo 'uid' ou 'entryDN'. +ldap.user-object-classes.tooltip=Todos os valores de objectClass para usuários no LDAP separados por vírgula. Por exemplo: 'inetOrgPerson, organizationalPerson'. Usuários criados no Keycloak serão enviados para o LDAP com todas essas classes de objetos associadas e dados de usuários do LDAP somente serão localizados se ele contiverem todas estas classes de objeto. +ldap.connection-url.tooltip=Conexão URL para o seu servidor LDAP +ldap.users-dn.tooltip=DN completo da árvore LDAP onde os usuários estão. Este DN é o pai dos usuários do LDAP. Por exemplo pode ser 'ou=users,dc=example,dc=com' entendendo que o usuário típico irá ter um DN como 'uid=john,ou=users,dc=example,dc=com'. +ldap.authentication-type.tooltip=Tipo de autenticação no LDAP. No momento apenas os mecanismos 'none' (anonymous LDAP authentication) ou 'simple' (Credencial de bind + senha para bind) estão disponíveis. +ldap.bind-dn.tooltip=DN do administrador do LDAP, que será utilizado pelo Keycloak para acessar o servidor LDAP. +ldap.bind-credential.tooltip=Senha do administrador do LDAP +ldap.custom-user-ldap-filter.tooltip=Additional LDAP Filter for filtering searched users. Leave this empty if you don't need additional filter. Make sure that it starts with '(' and ends with ')' +ldap.use-truststore-spi.tooltip=Specifies whether LDAP connection will use the truststore SPI with the truststore configured in keycloak-server.json. 'Always' means that it will always use it. 'Never' means that it won't use it. 'Only for ldaps' means that it will use if your connection URL use ldaps. Note even if keycloak-server.json is not configured, the default Java cacerts or certificate specified by 'javax.net.ssl.trustStore' property will be used. +ldap.connection-pooling.tooltip=Does Keycloak should use connection pooling for accessing LDAP server +ldap.pagination.tooltip=Does the LDAP server support pagination. +ldap.allow-kerberos-authentication.tooltip=Enable/disable HTTP authentication of users with SPNEGO/Kerberos tokens. The data about authenticated users will be provisioned from this LDAP server +ldap.use-kerberos-for-password-authentication.tooltip=Use Kerberos login module for authenticate username/password against Kerberos server instead of authenticating against LDAP server with Directory Service API +ldap.batch-size.tooltip=Count of LDAP users to be imported from LDAP to Keycloak within single transaction. +identity-provider-user-id.tooltip=Unique ID of the user on the Identity Provider side +identity-provider-username.tooltip=Username on the Identity Provider side +browser-flow.tooltip=Select the flow you want to use for browser authentication. +registration-flow.tooltip=Select the flow you want to use for registration. +direct-grant-flow.tooltip=Select the flow you want to use for direct grant authentication. +reset-credentials.tooltip=Select the flow you want to use when the user has forgotten their credentials. +client-authentication.tooltip=Select the flow you want to use for authentication of clients. +authenticator.alias.tooltip=Name of the configuration +otp-type.tooltip=totp is Time-Based One Time Password. 'hotp' is a counter base one time password in which the server keeps a counter to hash against. +otp-hash-algorithm.tooltip=What hashing algorithm should be used to generate the OTP. +otp.number-of-digits.tooltip=How many digits should the OTP have? +otp.look-ahead-window.tooltip=How far ahead should the server look just in case the token generator and server are out of time sync or counter sync? +otp.initial-counter.tooltip=What should the initial counter value be? +otp-token-period.tooltip=How many seconds should an OTP token be valid? Defaults to 30 seconds. +admin-events.tooltip=Displays saved admin events for the realm. Events are related to admin account, for example a realm creation. To enable persisted events go to config. +clear-admin-events.tooltip=Deletes all admin events in the database. +resource-path.tooltip=Filter by resource path. Supports wildcards '*' to match a single part of the path and '**' matches multiple parts. For example 'realms/*/clients/asbc' matches client with id asbc in any realm, while or 'realms/master/**' matches anything in the master realm. +auth.default-action.tooltip=If enabled, any new user will have this required action assigned to it. +groups.default-groups.tooltip=Set of groups that new users will automatically join. +flow.alias.tooltip=Specifies display name for the flow. +top-level-flow-type.tooltip=What kind of top level flow is it? Type 'client' is used for authentication of clients (applications) when generic is for users and everything else +flow-type.tooltip=What kind of form is it +default-groups.tooltip=Newly created or registered users will automatically be added to these groups +available-groups.tooltip=Select a group you want to add as a default. +membership.available-groups.tooltip=Groups a user can join. Select a group and click the join button. +events.tooltip=Displays saved events for the realm. Events are related to user accounts, for example a user login. To enable persisted events go to config. +login.save-events.tooltip=If enabled login events are saved to the database which makes events available to the admin and account management consoles. +admin.save-events.tooltip=If enabled admin events are saved to the database which makes events available to the admin console. +events-config.tooltip=Displays configuration options to enable persistence of user and admin events. +event-listeners.tooltip=Configure what listeners receive events for the realm. +clear-events.tooltip=Deletes all events in the database. +events.expiration.tooltip=Sets the expiration for events. Expired events are periodically deleted from the database. +saved-types.tooltip=Configure what event types are saved. +include-representation.tooltip=Include JSON representation for create and update requests. +credentials.temporary.tooltip=If enabled user is required to change password on next login +credentials.remove-totp.tooltip=Remove one time password generator for user. +credentials.reset-actions.tooltip=Set of actions to execute when sending the user a Reset Actions Email. 'Verify email' sends an email to the user to verify their email address. 'Update profile' requires user to enter in new personal information. 'Update password' requires user to enter in a new password. 'Configure TOTP' requires setup of a mobile password generator. +credentials.reset-actions-email.tooltip=Sends an email to user with an embedded link. Clicking on link will allow the user to execute the reset actions. They will not have to login prior to this. For example, set the action to update password, click this button, and the user will be able to change their password without logging in. +user-enabled.tooltip=A disabled user cannot login. +user-temporarily-locked.tooltip=The user may have been locked due to failing to login too many times. +email-verified.tooltip=Has the user's email been verified? +required-user-actions.tooltip=Require an action when the user logs in. 'Verify email' sends an email to the user to verify their email address. 'Update profile' requires user to enter in new personal information. 'Update password' requires user to enter in a new password. 'Configure TOTP' requires setup of a mobile password generator. +impersonate-user.tooltip=Login as this user. If user is in same realm as you, your current login session will be logged out before you are logged in as this user. +group-membership.tooltip=Groups user is a member of. Select a listed group and click the Leave button to leave the group. +import-keys-and-cert.tooltip=Upload the client's key pair and cert. +authz-icon-uri.tooltip=An URI pointing to an icon. +authz-authorization-services-enabled.tooltip=Enable/Disable fine-grained authorization support for a client +authz-import-config.tooltip=Import a JSON file containing authorization settings for this resource server. +authz-policy-enforcement-mode.tooltip=The policy enforcement mode dictates how policies are enforced when evaluating authorization requests. 'Enforcing' means requests are denied by default even when there is no policy associated with a given resource. 'Permissive' means requests are allowed even when there is no policy associated with a given resource. 'Disabled' completely disables the evaluation of policies and allow access to any resource. +authz-remote-resource-management.tooltip=Should resources be managed remotely by the resource server? If false, resources can only be managed from this admin console. +authz-export-settings.tooltip=Export and download all authorization settings for this resource server. +authz-resource-name.tooltip=An unique name for this resource. The name can be used to uniquely identify a resource, useful when querying for a specific resource. +authz-resource-owner.tooltip=The owner of this resource. +authz-resource-type.tooltip=The type of this resource. It can be used to group different resource instances with the same type. +authz-resource-uri.tooltip=An URI that can also be used to uniquely identify this resource. +authz-resource-scopes.tooltip=The scopes associated with this resource. +authz-scope-name.tooltip=An unique name for this scope. The name can be used to uniquely identify a scope, useful when querying for a specific scope. +authz-policy-name.tooltip=The name of this policy. +authz-policy-description.tooltip=A description for this policy. +authz-policy-logic.tooltip=The logic dictates how the policy decision should be made. If 'Positive', the resulting effect (permit or deny) obtained during the evaluation of this policy will be used to perform a decision. If 'Negative', the resulting effect will be negated, in other words, a permit becomes a deny and vice-versa. +authz-policy-apply-policy.tooltip=Specifies all the policies that must be applied to the scopes defined by this policy or permission. +authz-policy-decision-strategy.tooltip=The decision strategy dictates how the policies associated with a given policy are evaluated and how a final decision is obtained. 'Affirmative' means that at least one policy must evaluate to a positive decision in order to the overall decision be also positive. 'Unanimous' means that all policies must evaluate to a positive decision in order to the overall decision be also positive. 'Consensus' means that the number of positive decisions must be greater than the number of negative decisions. If the number of positive and negative is the same, the final decision will be negative. +authz-policy-user-users.tooltip=Specifies which user(s) are allowed by this policy. +authz-policy-time-not-before.tooltip=Defines the time before which the policy MUST NOT be granted. Only granted if current date/time is after or equal to this value. +authz-policy-time-not-on-after.tooltip=Defines the time after which the policy MUST NOT be granted. Only granted if current date/time is before or equal to this value. +authz-policy-drools-maven-artifact.tooltip=A Maven GAV pointing to an artifact from where the rules would be loaded from. Once you have provided the GAV, you can click *Resolve* to load both *Module* and *Session* fields. +authz-policy-drools-module.tooltip=The module used by this policy. You must provide a module in order to select a specific session from where rules will be loaded from. +authz-policy-drools-session.tooltip=The session used by this policy. The session provides all the rules to evaluate when processing the policy. +authz-policy-drools-update-period.tooltip=Specifies an interval for scanning for artifact updates. +authz-policy-js-code.tooltip=The JavaScript code providing the conditions for this policy. +authz-permission-name.tooltip=The name of this permission. +authz-permission-description.tooltip=A description for this permission. +authz-permission-resource-apply-to-resource-type.tooltip=Specifies if this permission would be applied to all resources with a given type. In this case, this permission will be evaluated for all instances of a given resource type. +authz-permission-resource-resource.tooltip=Specifies that this permission must be applied to a specific resource instance. +authz-permission-resource-type.tooltip=Specifies that this permission must be applied to all resources instances of a given type. +authz-permission-scope-resource.tooltip=Restrict the scopes to those associated with the selected resource. If not selected all scopes would be available. +authz-evaluation-identity-information.tooltip=The available options to configure the identity information that will be used when evaluating policies. +authz-evaluation-client.tooltip=Select the client making this authorization request. If not provided, authorization requests would be done based on the client you are in. +authz-evaluation-user.tooltip=Select an user whose identity is going to be used to query permissions from the server. +authz-evaluation-role.tooltip=Select the roles you want to associate with the selected user. +authz-evaluation-contextual-info.tooltip=The available options to configure any contextual information that will be used when evaluating policies. +authz-evaluation-contextual-attributes.tooltip=Any attribute provided by a running environment or execution context. +authz-evaluation-permissions.tooltip=The available options to configure the permissions to which policies will be applied. +authz-evaluation-result.tooltip=The overall result for this permission request. +authz-evaluation-scopes.tooltip=The list of allowed scopes. +authz-evaluation-policies.tooltip=Details about which policies were evaluated and their decisions. +authz-evaluation-authorization-data.tooltip=Represents a token carrying authorization data as a result of the processing of an authorization request. This representation is basically what Keycloak issues to clients asking for permissions. Check the 'authorization' claim for the permissions that were granted based on the current authorization request. diff --git a/admin/messages/admin-messages_ru.properties b/admin/messages/admin-messages_ru.properties new file mode 100644 index 0000000..08f1fb8 --- /dev/null +++ b/admin/messages/admin-messages_ru.properties @@ -0,0 +1,1273 @@ +# encoding: utf-8 +consoleTitle=Консоль администратора Keycloak +# Common messages +enabled=Включено +hidden=Скрыто +link-only-column=Только ссылки +name=Имя +displayName=Отображаемое название +displayNameHtml=Отображаемое название в HTML +save=Сохранить +cancel=Отмена +onText=ВКЛ +offText=ВЫК +client=Клиент +clients=Клиенты +clear=Очистить +selectOne=Выбрать... + +true=Да +false=Нет + +endpoints=Конечные точки + +# Realm settings +realm-detail.enabled.tooltip=Пользователи и клиенты могут получить доступ к Realm только если он включен +realm-detail.oidc-endpoints.tooltip=Показать конфигурацию конечных точек OpenID Connect +registrationAllowed=Самостоятельная регистрация пользователей +registrationAllowed.tooltip=Включить/выключить страницу регистрации. Ссылка для регистрации будет также показана на странице входа. +registrationEmailAsUsername=E-mail как имя пользователя +registrationEmailAsUsername.tooltip=Если включено, то на форме регистрации поле имени пользователя будет скрыто и в качестве имени пользователя для новых пользователей будет использоваться E-mail. +editUsernameAllowed=Редактируемое имя пользователя +editUsernameAllowed.tooltip=Если включено,то имя пользователя можно будет отредактировать, иначе оно будет доступным только для чтения. +resetPasswordAllowed=Сброс пароля +resetPasswordAllowed.tooltip=Показывает ссылку на странице входа для пользователя, по переходу на которую пользователь сможет восстановить свои данные для входа. +rememberMe=Запомнить меня +rememberMe.tooltip=Показать чекбокс на странице входа, чтобы разрешить пользователю запомнить вход в учетную запись в случае если браузерная сессия устареет. +loginWithEmailAllowed=Вход по E-mail +loginWithEmailAllowed.tooltip=Разрешает пользователям входить с помощью E-mail. +duplicateEmailsAllowed=Дублирующиеся E-mail +duplicateEmailsAllowed.tooltip=Разрешает разным пользователям иметь один и тот же E-mail. Изменение этой настройки также очистит пользовательский кэш. После выключения поддержки дублирующихся email рекомендуется вручную почистить в базе данных ограничения по E-mail существующим пользователям. +verifyEmail=Подтверждение E-mail +verifyEmail.tooltip=Требует у пользователя подтвердить свой E-mail при первом входе в учетную запись. +sslRequired=Требует SSL +sslRequired.option.all=все запросы +sslRequired.option.external=внешние запросы +sslRequired.option.none=нет +sslRequired.tooltip=Требуется ли HTTPS? 'нет' означает, что HTTPS не требуется для клиентов с любым IP адресом. 'Внешние запросы' означает, что localhost и внутренние IP адреса могут получить доступ без HTTPS. 'Все запросы' означает, что HTTPS требуется вне зависимости от IP адреса. +publicKeys=Публичные ключи +publicKey=Публичный ключ +privateKey=Приватный ключ +gen-new-keys=Сгенерировать новый ключ +certificate=Сертификат +host=Сервер +smtp-host=SMTP сервер +port=Порт +smtp-port=SMTP порт (по умолчанию 25) +from=От +sender-email-addr=E-mail отправителя +enable-ssl=Включить SSL +enable-start-tls=Включить StartTLS +enable-auth=Включить аутентификацию +username=Имя пользователя +login-username=Имя пользователя для входа +password=Пароль +login-password=Пароль для входа +login-theme=Тема страницы входа +login-theme.tooltip=Выберите тему для страниц входа, временного одноразового пароля (TOTP), выдачи разрешений, регистрации и восстановления пароля. +account-theme=Тема учетной записи +account-theme.tooltip=Выберите тему для управления учетной записью пользователя. +admin-console-theme=Тема консоли администратора +select-theme-admin-console=Выберите тему для консоли администратора. +email-theme=Тема для E-mail +select-theme-email=Выберите тему для E-mail, которые будут отсылаться с сервера. +i18n-enabled=Интернационализация +supported-locales=Поддерживаемые языки +supported-locales.placeholder=Выберите язык и нажмите Enter +default-locale=Язык по умолчанию +realm-cache-clear=Кэш Realm +realm-cache-clear.tooltip=Удалить все записи в кэше realm (удалит все записи для всех realm) +user-cache-clear=Кэш пользователей +user-cache-clear.tooltip=Очистить все записи в пользовательском кэше (это удалит записи для всех realm) +keys-cache-clear=Кэш ключей +keys-cache-clear.tooltip=Очистить все записи в кэше внешних публичных ключей. Эти ключи внешних ключей или провайдеров идентификации. (это очистит все записи для всех realm) +revoke-refresh-token=Одноразовые токены обновления +revoke-refresh-token.tooltip=Если включено, то токены обновления могут быть использованы один раз. Иначе токен отзываться не будет и может использоваться многократно. +sso-session-idle=Таймаут сессии SSO +seconds=секунд +minutes=минут +hours=часов +days=дней +sso-session-max=Ограничение сессии SSO +sso-session-idle.tooltip=Допустимое время бездействия сессии. По истечении этого времени токены и браузерные сессии становятся невалидными. +sso-session-max.tooltip=Максимальное время до того, как истечет сессия. По истечении этого времени токены и браузерные сессии становятся невалидными. +offline-session-idle=Таймаут оффлайн сессии +offline-session-idle.tooltip=Допустимое время бездействия оффлайн сессии. Вам необходимо использовать оффлайн токен для обновления хотя бы раз за этот период, иначе сессия истечет. +access-token-lifespan=Продолжительность жизни токена доступа +access-token-lifespan.tooltip=Максимальное время действия токена доступа. Значение рекомендуется устанавливать как можно ближе к таймауту SSO. +access-token-lifespan-for-implicit-flow=Продолжительность жизни токена доступа для Implicit Flow +access-token-lifespan-for-implicit-flow.tooltip=Максимальное время действия токена доступа после того как сессия токена OpenID Connect Implicit Flow истекла. Это значение рекомендуется установить как можно ближе к таймауту SSO. Нет возможности обновить токен во время Implicit Flow, поэтому этот таймаут отличается от 'Продолжительности жизни токена доступа' +client-login-timeout=Таймаут авторизации клиента +client-login-timeout.tooltip=Максимальное время клиента для завершения протокола access token. Обычно устанавливается равным 1-ой минуте. +login-timeout=Таймаут входа +login-timeout.tooltip=Максимальное время пользователя для завершения входа. Рекомендуется установить относительно большое значение (30 минут и более). +login-action-timeout=Таймаут действий по входу +login-action-timeout.tooltip=Максимальное время, за которое пользователь должен выполнить и завершить действие после входа. Например, обновление пароля или конфигурация одноразового временного пароля. Рекомендуется установить относительно большое значение (5 минут и более). +headers=Заголовки +brute-force-detection=Определение Brute Force +x-frame-options=X-Frame-Options +x-frame-options-tooltip=Значение по умолчанию не позволяет страницам быть включенными в iframe сторонних сайтов (перейдите по ссылке для получения дополнительной информации) +content-sec-policy=Content-Security-Policy +content-sec-policy-tooltip=Значение по умолчанию не позволяет страницам быть включенными в iframe сторонних сайтов (перейдите по ссылке для получения дополнительной информации) +content-type-options=X-Content-Type-Options +content-type-options-tooltip=Значение по умолчанию не позволяет браузерам Internet Explorer и Google Chrome вычислять тип содержимого в ответе от сервера дальше от объявленного типа содержимого (перейдите по ссылке для получения дополнительной информации) +max-login-failures=Максимальное количество неудачных попыток входа +max-login-failures.tooltip=Количество неудачных попыток входа до блокировки пользователя. +wait-increment=Порог ожидания +wait-increment.tooltip=Если порог ошибок превышен, сколько времени пользователь будет заблокирован? +quick-login-check-millis=Проверка количества миллисекунд между попытками входа +quick-login-check-millis.tooltip=Если попытки аутентификации происходят слишком часто, то пользователя необходимо заблокировать. +min-quick-login-wait=Минимальное ожидание быстрого входа +min-quick-login-wait.tooltip=Как долго ждать после неудачной попытки быстрого входа. +max-wait=Максимальное ожидание +max-wait.tooltip=Максимальное время, на которое пользователь будет заблокирован. +failure-reset-time=Время сброса неудачных попыток +failure-reset-time.tooltip=Через какое время счетчик неудачных попыток будет сброшен? +realm-tab-login=Вход +realm-tab-keys=Ключи +realm-tab-email=E-mail +realm-tab-themes=Темы +realm-tab-cache=Кэш +realm-tab-tokens=Токены +realm-tab-client-initial-access=Первоначальные токены доступа +realm-tab-security-defenses=Защита безопасности +realm-tab-general=Главная +add-realm=Добавить realm + +#Session settings +realm-sessions=Настройки Realm +revocation=Отзыв +logout-all=Разлогинить все сессии +active-sessions=Активные сессии +sessions=Сессии +not-before=Не ранее чем +not-before.tooltip=Отозвать любые токены, выданные ранее этой даты. +set-to-now=Установить на сейчас +push=Разослать +push.tooltip=Уведомить каждого клиента, имеющего URL администратора, о новой политике отзыва токена. + +#Protocol Mapper +usermodel.prop.label=Свойство +usermodel.prop.tooltip=Имя свойства метода в интерфейсе UserModel. Для примера, значение 'email' будет ссылкой на метод UserModel.getEmail(). +usermodel.attr.label=Атрибут пользователя +usermodel.attr.tooltip=Имя сохраненного атрибута пользователя, которое является именем атрибута, согласованным с UserModel.attribute. +userSession.modelNote.label=Заметка сессии пользователя +userSession.modelNote.tooltip=Наименование процедуры заметки сессии пользователя согласованным с UserSessionModel.note. +multivalued.label=Несколько значений +multivalued.tooltip=Отображается, если атрибут поддерживает несколько значений. Если включен, то список всех значений будет претендовать на этот атрибут. В противном случае выбираться будет только первое значение +selectRole.label=Выберите роль +selectRole.tooltip=Введите роль в текстовом поле слева, или нажмите на кнопку, чтобы выбрать желаемую роль. +tokenClaimName.label=Имя переменной в токене +tokenClaimName.tooltip=Имя переменной при добавлении ее в токен. Может быть полное имя, например 'address.street'. В таком случае будет создан вложенный json объект. +jsonType.label=Тип переменной JSON +jsonType.tooltip=Тип переменной в JSON, который должен использоваться при добавлении ее в токен. Допустимые значения long, int, boolean, и String. +includeInIdToken.label=Добавить в токен ID +includeInIdToken.tooltip=Должно ли значение быть добавлено в токен ID? +includeInAccessToken.label=Добавить в токен доступа +includeInAccessToken.tooltip=Должно ли значение быть добавлено в токен доступа? +includeInUserInfo.label=Добавить в информацию о пользователе +includeInUserInfo.tooltip=Должно ли требование быть добавлено в информацию о пользователе? +usermodel.clientRoleMapping.clientId.label=ID клиента +usermodel.clientRoleMapping.clientId.tooltip=ID клиента для сопоставления ролей +usermodel.clientRoleMapping.rolePrefix.label=Префикс ролей клиента +usermodel.clientRoleMapping.rolePrefix.tooltip=Префикс для каждой роли клиента (опционально). +usermodel.realmRoleMapping.rolePrefix.label=Префикс ролей Realm +usermodel.realmRoleMapping.rolePrefix.tooltip=Префикс для каждой роли Realm (опционально). +sectorIdentifierUri.label=Сектор идентификации URI +sectorIdentifierUri.tooltip=Провайдеры, использующие пары вспомогательных значений и поддерживающие динамическую регистрацию клиентов ДОЛЖНЫ использовать sector_identified_uri параметр. Это обеспечивает способ для группы сайтов под общим административным контролем, чтобы иметь последовательные попарные значения независимо от индивидуальных доменных имен. Это также обеспечивает способ для клиентов для изменения redirect_uri доменов, не имещющих возможности перерегистрации всех своих пользователей. +pairwiseSubAlgorithmSalt.label=Соль +pairwiseSubAlgorithmSalt.tooltip=Соль, используемая для вычисления парного субъекта идентификатора. Если поле не заполнено, то соль будет сгенерирована. +addressClaim.street.label=Имя пользовательского атрибута, обозначающего Улицу +addressClaim.street.tooltip=Имя пользовательского атрибута, которое будет использоваться для сопоставления атрибута 'street_address' внутри атрибута 'address' токена. По умолчанию 'street' . +addressClaim.locality.label=Имя пользовательского атрибута, обозначающего Местонахождение +addressClaim.locality.tooltip=Имя пользовательского атрибута, которое будет использоваться для сопоставления атрибута 'locality' внутри атрибута 'address' токена. По умолчанию 'locality' . +addressClaim.region.label=Имя пользовательского атрибута, обозначающего Регион +addressClaim.region.tooltip=Имя пользовательского атрибута, которое будет использоваться для сопоставления атрибута 'region' внутри атрибута 'address' токена. По умолчанию 'region' . +addressClaim.postal_code.label=Имя пользовательского атрибута, обозначающего Почтовый индекс +addressClaim.postal_code.tooltip=Имя пользоватеслького атрибута, котоое будет использоваться для сопоставления атрибута 'postal_code' внутри атрибута 'address' токена. По умолчанию 'postal_code' . +addressClaim.country.label=Имя пользовательского атрибута, обозначающего Страна +addressClaim.country.tooltip=Имя пользовательского атрибута, которое будет использоватлься для сопоставления атрибута 'country' внутри атрибута 'address' токена. По умолчанию 'country' . +addressClaim.formatted.label=Имя пользовательсокого атрибута, обозначающего Формитированный адрес +addressClaim.formatted.tooltip=Имя пользовательского атрибута, которое будет использоваться для сопоставления атрибута 'formatted' внутри атрибута 'address' токена. По умолчанию 'formatted' . + +# client details +clients.tooltip=Клиенты доверенных браузерных приложений и веб-сервисов в realm. Эти клиенты могут запрашивать вход. Вы также можете определить конкретные роли клиента. +search.placeholder=Поиск... +create=Создать +import=Импорт +client-id=ID клиента +base-url=Базовый URL +actions=Действия +not-defined=Не задан +edit=Редактировать +delete=Удалить +no-results=Нет результатов +no-clients-available=Нет доступных клиентов +add-client=Добавить клиента +select-file=Выберите файл +view-details=Смотреть детали +clear-import=Очистить импорт +client-id.tooltip=Задает идентификатор, указываемый в URI и в токенах. Например 'my-client'. Для SAML это также ожидаемое имя издателя для запросов аутентификации +client.name.tooltip=Задает отображаемое название клиента. Например 'My Client'. Поддерживает ключи для локализованных значений. Например\\: ${my_client} +client.enabled.tooltip=Отключенные клиенты не могут инициировать вход или иметь возможность получить токены доступа. +consent-required=Необходимо согласие +consent-required.tooltip=Если включено, пользователи должны дать согласие на доступ клиентскому приложению. +client-protocol=Протокол клиента +client-protocol.tooltip='OpenID connect' разрешает клиентам проверить личность конечного пользователя, основанного на выполнении аутентификации на Сервере Авторизации.'SAML' включает веб-сценарии аутентификации и авторизации, включая кроссдоменные центры единого управления доступом (SSO) и использующие токены безопасности, содержащие заявления на передачу информации. +access-type=Тип доступа +access-type.tooltip='Confidential' клиенты требуют секрет для инициализации протокола входа. 'Public' клиентам секрет не требуется. 'Bearer-only' клиенты и веб-сервисы никогда не инициализируют вход. +standard-flow-enabled=Standard Flow включен +standard-flow-enabled.tooltip=Включает стандартное OpenID Connect перенаправление, основанное на аутентификации с кодом авторизации. В терминах OpenID Connect или OAuth2 спецификаций включает 'Authorization Code Flow' для этого клиента. +implicit-flow-enabled=Implicit Flow включен +implicit-flow-enabled.tooltip=Включает поддержку OpenID Connect перенаправления, основанного на аутентификации без кода авторизации. В терминах OpenID Connect или OAuth2 спецификаций включает поддержку 'Implicit Flow' для этого клиента. +direct-access-grants-enabled=Direct Access Grants включен +direct-access-grants-enabled.tooltip=Включает поддержку Direct Access Grants, которая означает, что клиент имеет доступ к имени пользователя и пароля и обменивает их напрямую с сервером Keycloak на токен доступа. В терминах OAuth2 спецификации означает поддержку 'Resource Owner Password Credentials Grant' для этого клиента. +service-accounts-enabled=Service Accounts включен +service-accounts-enabled.tooltip=Разрешает Вам аутентифицировать этого клиента в Keycloak и получить токен доступа специально для этого клиента. В терминах OAuth2 спецификации включает поддержку 'Client Credentials Grant' для этого клиента. +include-authnstatement=Включать Аутентификационные Заявки +include-authnstatement.tooltip=Должны ли заявки на методы и временные метки быть включены в ответе на вход? +include-onetimeuse-condition=Включить условие одноразового использования +include-onetimeuse-condition.tooltip=Должно ли условие одноразового использования быть включено в ответе на вход? +sign-documents=Подпись документов +sign-documents.tooltip=Должны ли SAML документы быть подписаны в realm? +sign-documents-redirect-enable-key-info-ext=Оптимизация REDIRECT поиска подписанного ключа +sign-documents-redirect-enable-key-info-ext.tooltip=При подписи SAML документов при REDIRECT сопоставлении с SP, который обеспечивается безопасностью адаптера Keycloak, должен ли включать ID подписанного ключа в сообщение по протоколу SAML в элемент? Это оптимизирует валидацию сигнатуры, где в качестве проверки используется один ключ вместо попытки проверки каждого ключа во время валидации. +sign-assertions=Sign Assertions +sign-assertions.tooltip=Должны ли утверждения внутри SAML документов быть подписаны? Устанавливает отсутствие необходимости подписывать уже подписанные документы. +signature-algorithm=Алгоритм подписи +signature-algorithm.tooltip=Алгоритм, используемый для подписи документов. +canonicalization-method=Метод канонизации +canonicalization-method.tooltip=Метод канонизации для XML сигнатур. +encrypt-assertions=Зашифровка утверждений +encrypt-assertions.tooltip=Должны ли SAML утверждения быть зашифрованы публичным ключом клиента, используя AES? +client-signature-required=Подпись клиента обязательна +client-signature-required.tooltip=Будет ли клиент подписывать свои saml запросы и ответы? И должны ли они быть провалидированы? +force-post-binding=Принудительно использовать POST Binding +force-post-binding.tooltip=Всегда использовать POST Binding для ответов. +front-channel-logout=Выход с переднего канала +front-channel-logout.tooltip=Когда правила, выход требует перенаправить браузер на клиента. Если ложь, сервер выполняет фоновый режим для выхода из системы. +force-name-id-format=Принудительно использовать формат ID +force-name-id-format.tooltip=Игнорирует запрошенный формат заголовка NameID и использует сконфигурированный через консоль администратора. +name-id-format=Наименование формата ID +name-id-format.tooltip=Наименование формата ID для использования в теме. +root-url=Корневой URL +root-url.tooltip=Корневой URL добавляется к относительным URL +valid-redirect-uris=Валидация URI перенаправления +valid-redirect-uris.tooltip=Валидирует паттерн URI, на который может быть перенаправлен браузер после успешного входа или выхода. Разрешены простые ссылки, напр. 'http://example.com/*'. Также допускается использовать относительный путь, напр. '/my/relative/path/*'. Относительные пути необходимо указывать относительно корневого URL клиента, или, если он не специфицирован, корневого URL сервера авторизации. Для SAML Вы должны задать валидный паттерн URI, если Вы полагаетесь на URL сервиса потребителя, внедренного в запрос авторизации. +base-url.tooltip=Используемый URL по умолчанию. Используется в случае, если серверу требуется перенаправление или обратная ссылка на клиента. +admin-url=URL администрирования приложения +admin-url.tooltip=URL для доступа к интерфейсу администратора в заданном клиенте. Необходимо установить, если клиент поддерживает адаптер REST API. Это REST API разрешает серверу авторизации слать политики отзыва и прочие административные задачи. Обычно устанавливается значение, соответствующее базовому URL клиента. +master-saml-processing-url=Основной URL обработчика SAML +master-saml-processing-url.tooltip=Если URL сконфигурирован, то он будет каждый раз для связывания SP's Assertion Consumer и Single Logout Services. Может быть переопределен индивидуально для связывания каждого сервиса в тонкой настройке конфигурации конечных точек доступа SAML. +idp-sso-url-ref=Наименование URL для поставщика идентификации IDP, инициирующего SSO +idp-sso-url-ref.tooltip=Имя URL фрагмента, обозначающего клиента, если вы хотите, чтобы SSO был проинициирован поставщиком идентификации. Оставьте это поле пустым, чтобы отключить инициирование SSO с помощью поставщика идентификации. URL для ссылки вашего браузера может быть в следующем виде: {server-root}/realms/{realm}/protocol/saml/clients/{client-url-name} +idp-sso-relay-state=Передача состояния SSO инициирующим поставщиком идентификации +idp-sso-relay-state.tooltip=Передать состояние, которое вы хотите послать вместе с SAML запросом, которым хотите проиницировать SSO поставщиком идентификации. +web-origins=Web источники +web-origins.tooltip=Разрешает CORS источникам. Чтобы разрешить всем источники с допустимыми URI-адресами переадресации, добавьте '+'. Чтобы разрешить все источники, добавьте '*'. +fine-oidc-endpoint-conf=Тонкая настройка конфигурации OpenID Connect +fine-oidc-endpoint-conf.tooltip=Раскройте эту секцию, чтобы сконфигурировать настройки клиента, связанные с протоколом OpenID Connect +user-info-signed-response-alg=Алгоритм подписи ответа информации о пользователе +user-info-signed-response-alg.tooltip=JWA алгоритм используется для подписи ответа ресурса информации о пользователе. Если установлено в 'unsigned', то ответ инофрмации о пользователе не будет подписан и будет возвращен в формате application/json. +request-object-signature-alg=Алгоритм сигнатуры объекта запроса +request-object-signature-alg.tooltip=JWA алгоритм, который необходим клиенту для использования во время отсылки OIDC запроса объекта, специфицированного по 'request' или 'request_uri' параметрам. Если установлено в 'any', то объект запроса будет подписан любым алгоритмом (включая 'none' ). +fine-saml-endpoint-conf=Тонкая настройка конфигурации конечных точек доступа SAML +fine-saml-endpoint-conf.tooltip=Разверните эту секции, чтобы сконфигурировать точные URL-адреса для утвержденного потребителя и сервиса единого выхода. +assertion-consumer-post-binding-url=Привязка URL POST-запроса для сервиса подтверждения потребителей +assertion-consumer-post-binding-url.tooltip=URL-адрес SAML POST запроса для клиентских сервисов подтверждения потребителей (запросы входа). Вы можете оставить это поле пустым, если не имеете URL для осуществления такой приввязки. +assertion-consumer-redirect-binding-url=Привязка URL-адреса переадресации для сервиса подтверждения потребителей +assertion-consumer-redirect-binding-url.tooltip=SAML переадресация на привязанный URL для клиентского сервиса подтверждения потребителей (запросы входа). Вы можете оставить это поле пустым, если вы не имеете URL для осуществления такой привязки. +logout-service-post-binding-url=URL для выхода из сервиса в привязанном POST-методе +logout-service-post-binding-url.tooltip=SAML POST связанный URL для клиентского сервиса единого выхода. Если Вы используете другие привязки, то можете оставить это поле пустым. +logout-service-redir-binding-url=URL переадресации для выхода из сервиса +logout-service-redir-binding-url.tooltip=SAML переадресует на привязанный URL для единой точки выхода из сервиса для клиентов. Если Вы используете другие привязки, то можете остаавить это поле пустым. +saml-signature-keyName-transformer=Наименование ключа сигнатуры SAML +saml-signature-keyName-transformer.tooltip=Подписанные SAML документы содержат идентификаторы ключей подписи в элементе KeyName. Для Keycloak / RH-SSO контрагентов, используйте KEY_ID, для MS AD FS используйте CERT_SUBJECT, для остальных установите и используйте NONE если другие опции не работают. + +# client import +import-client=Импортировать клиента +format-option=Формат +select-format=Выберите формат +import-file=Импортировать файл + +# client tabs +settings=Настройки +credentials=Учетные данные +saml-keys=Ключи SAML +roles=Роли +mappers=Сопоставления +mappers.tooltip=Протокол сопоставлений, осуществляющих преобразование в токены и документы. Могут делать такие вещи как сопоставление пользовательских данных в заявки протокола, или просто преобразовать любой запрос, происходящий между клиентом и сервером аутентификации. +scope=Область +scope.tooltip=Сопоставление области позволяет вам ограничить сопоставленные роли пользователя, включаемые вместе с токеном доступа, запрошенного клиентом. +sessions.tooltip=Просмотр сессий для этого клиента. Позволяет Вам увидеть, какие пользователи активны и когда они вошли. +offline-access=Оффлайн доступ +offline-access.tooltip=Просмотр оффлайн сессий для этого клиента. Позволяет Вам увидеть, какие пользователи получали оффлайн токен и когда они его получили. Чтобы выбрать все токены для этого клиента, перейдите на вкладку отзыва и установите значение в текущее время. +clustering=Кластеризация +installation=Установка +installation.tooltip=Вспомогательная утилита для генерации различных форматов конфигурации адаптера клиента, которые Вы можете скачать или скопировать для конфигурации Ваших клиентов. +service-account-roles=Роли Service Account +service-account-roles.tooltip=Разрешают Вам аутентифицировать сопоставленные роли для сервиса учетных записей, выделенного для этого клиента. + +# client credentials +client-authenticator=Проверка подлинности клиента +client-authenticator.tooltip=Проверка подлинности клиента используется для аутентификации этого клиента вместо сервера Keycloak +certificate.tooltip=Клиентский сертификат для валидации JWT, выпущенный клиентом и подписанный клиентским приватным ключом из Вашего хранилища ключей. +publicKey.tooltip=Публичный ключ для валидации JWT, выпущенный клиентом и подписанный клиентским приватным ключом. +no-client-certificate-configured=Клиентский сертификат не сконфигурирован +gen-new-keys-and-cert=Сгенерировать новые ключи и сертификат +import-certificate=Импортировать сертификат +gen-client-private-key=Сгенерировать приватный ключ клиента +generate-private-key=Сгенерировать приватный ключ +kid=KID +kid.tooltip=KID (Key ID) публичного ключа клиента из импортированного JWKS. +use-jwks-url=Использовать JWKS URL +use-jwks-url.tooltip=Если включено, то публичные ключи клиента будут скачиваться с заданного адреса JWKS. Это дает большую гибкость, поскольку в случае, если клиент сгенерирует новую пару, то новые ключи всегда будут перезакачиваться. Если выключено, то используется публичный ключ (или сертификат) из базы Keycloak DB, так если пара клиента изменится, вам будет необходимо всегда импортировать новый ключ (или сертификат) в базу Keycloak. +jwks-url=JWKS URL +jwks-url.tooltip=URL, где клиентские ключи хранятся в формате JWK. Для дополнительных деталей смотрите спецификацию JWK. Если Вы будете использовать адаптер клиента keycloak с учетными записями "jwt", то Вы можете использовать URL вашего приложения с суффиксом '/k_jwks'. Например 'http://www.myhost.com/myapp/k_jwks' . +archive-format=Формат архивации +archive-format.tooltip=Формат архивации Java keystore или PKCS12. +key-alias=Синоним ключа +key-alias.tooltip=Синоним архива для Вашего приватного ключа и сертификата. +key-password=Пароль для ключа +key-password.tooltip=Пароль для доступа к приватного ключу в архиве +store-password=Пароль хранилища +store-password.tooltip=Пароль для доступа в сам архив +generate-and-download=Сгенерировать и скачать +client-certificate-import=Импорт сертификата клиента +import-client-certificate=Импорт сертификата клиента +jwt-import.key-alias.tooltip=Синоним архива для вашего сертификата. +secret=Секрет +regenerate-secret=Перегенерировать секрет +registrationAccessToken=Токен доступа к регистрации +registrationAccessToken.regenerate=Перегенерировать токен доступа к регистрации +registrationAccessToken.tooltip=Токен доступа к регистрации обеспечивает доступ для клиентов к сервису регистрации клиентов. +add-role=Добавить роль +role-name=Наименование роли +composite=Составная +description=Описание +no-client-roles-available=Нет доступных ролей клиента +scope-param-required=Требуется параметр области +scope-param-required.tooltip=Эта роль будет предоставлена только если параметр области с наименованием роли используется в запросах авторизации/получения токена. +composite-roles=Составные роли +composite-roles.tooltip=Когда эта роль (не)ассоциирована с любой ролью пользователей, она (не)будет неявно ассоциирована. +realm-roles=Роли Realm +available-roles=Доступные роли +add-selected=Добавить выбранное +associated-roles=Ассоциированные роли +composite.associated-realm-roles.tooltip=Роли уровня Realm, ассоциированные с составными ролями. +composite.available-realm-roles.tooltip=Роли уровня Realm, ассоциированные с этой составной ролью. +remove-selected=Удалить выбранное +client-roles=Роли клиентов +select-client-to-view-roles=Выберите клиента для просмотра его ролей +available-roles.tooltip=Роли этого клиента, которые вы можете ассоциировать с составной ролью. +client.associated-roles.tooltip=Клиентские роли, ассоциированные с составной ролью. +add-builtin=Добавить встроенные +category=Категория +type=Тип +no-mappers-available=Сопоставления не доступны +add-builtin-protocol-mappers=Добавить встроенные сопоставления протокола +add-builtin-protocol-mapper=Добавить встроенное сопоставление протокола +scope-mappings=Сопоставление областей +full-scope-allowed=Полный доступ к областям +full-scope-allowed.tooltip=Отключает все ограничения. +scope.available-roles.tooltip=Роли уровня Realm, которые могут быть присвоены области. +assigned-roles=Присвоенные роли +assigned-roles.tooltip=Роли уровня Realm, присвоенные области. +effective-roles=Назначенные роли +realm.effective-roles.tooltip=Назначенные роли уровня realm, которые могут быть унаследованы из составной роли. +select-client-roles.tooltip=Выберите клиента для просмотра его ролей +assign.available-roles.tooltip=Роли клиентов, доступные для назначения. +client.assigned-roles.tooltip=Назначенные роли клиента. +client.effective-roles.tooltip=Назначенные роли клиента, которые можно унаследовать из составной роли. +basic-configuration=Основная конфигурация +node-reregistration-timeout=Таймаут узла перерегистрации +node-reregistration-timeout.tooltip=Интервал, означающий максимальное время для узлов кластера зарегистрированных клиентов для их перерегистрации. Если узел кластера не может послать запрос перерегистрации в Keycloak за указанное время, то он будет разрегистрирован из Keycloak +registered-cluster-nodes=Зарегистрированные узлы кластера +register-node-manually=Зарегистрировать узел вручную +test-cluster-availability=Протестировать доступность кластера +last-registration=Последняя регистрация +node-host=Хост узла +no-registered-cluster-nodes=Нет доступных зарегистрированных узлов кластера +cluster-nodes=Узлы кластера +add-node=Добавить узел +active-sessions.tooltip=Общее количество активных сессий пользователей для этого клиента. +show-sessions=Показать сессии +show-sessions.tooltip=Предупреждение! В случае большого числа активных сессий это будет достаточно накладная операция. +user=Пользователь +from-ip=С IP +session-start=Сессия начата +first-page=Первая страница +previous-page=Последняя страница +next-page=Следующая страница +client-revoke.not-before.tooltip=Отозвать любые токены, выданные до указанной даты для этого клиента. +client-revoke.push.tooltip=Если URL системы администрации сконфигурирован для этого клиента, то необходимо послать политики этому клиенту. +select-a-format=Выберите формат +download=Скачать +offline-tokens=Оффлайн токены +offline-tokens.tooltip=Общее количество оффлайн токенов для этого клиента. +show-offline-tokens=Показать оффлайн токены +show-offline-tokens.tooltip=Предупреждение! В случае большого числа активных сессий это будет достаточно накладная операция. +token-issued=Токен выдан +last-access=Последний доступ +last-refresh=Последнее обновление +key-export=Экспорт ключа +key-import=Импорт ключа +export-saml-key=Экспорт SAML ключа +import-saml-key=Импорт SAML ключа +realm-certificate-alias=Синоним сертификата Realm +realm-certificate-alias.tooltip=Это синоним сертификата. Сам сертификат Realm также сохраняется в архиве. +signing-key=Ключ подписи +saml-signing-key=SAML-ключ подписи. +private-key=Приватный ключ +generate-new-keys=Сгенерировать новые ключи +export=Экспорт +encryption-key=Ключ шифрования +saml-encryption-key.tooltip=SAML ключ шифрования. +service-accounts=Учетные записи сервиса +service-account.available-roles.tooltip=Роли уровня Realm, которые могут быть присвоены учетной записи сервиса. +service-account.assigned-roles.tooltip=Роли уровня Realm, назначенные учетной записи сервиса. +service-account-is-not-enabled-for=Учетная запись сервиса не включена для {{client}} +create-protocol-mappers=Создать сопоставление протокола +create-protocol-mapper=Создать сопоставление протокола +protocol=Протокол +protocol.tooltip=Протокол... +id=ID +mapper.name.tooltip=Наименование сопоставления. +mapper.consent-required.tooltip=Необходимо ли согласие пользователя на предоставление этой информации клиенту? +consent-text=Текст согласования +consent-text.tooltip=Текст, который будет показан пользователю на странице согласования. +mapper-type=Тип сопоставления +mapper-type.tooltip=Тип сопоставления +# realm identity providers +identity-providers=Поставщики идентификации +table-of-identity-providers=Таблица поставщиков идентификации +add-provider.placeholder=Добавить поставщика... +provider=Поставщик +gui-order=Очередность в GUI +first-broker-login-flow=Сценарий первого входа +post-broker-login-flow=Сценарий после входа +redirect-uri=URI перенаправления +redirect-uri.tooltip=Этот uri перенаправления используется в том случае, если сконфигурирован поставщик идентификации. +alias=Синоним +display-name=Отображаемое название +identity-provider.alias.tooltip=Синоним уникально идентифицирует поставщика идентификации, а также используется для построения адреса переадресации. +identity-provider.display-name.tooltip=Дружелюбное имя для провайдеров идентификации. +identity-provider.enabled.tooltip=Включает/выключает этого поставщика идентификации. +authenticate-by-default=Аутентификация по умолчанию +identity-provider.authenticate-by-default.tooltip=Отображается, если поставщик должен быть использован для аутентифиакации по умолчанию даже перед отображением экрана входа. +store-tokens=Хранение токенов +identity-provider.store-tokens.tooltip=Включено/выключено хранение токенов после аутентификации пользователя. +stored-tokens-readable=Сохраненные токены доступны на чтение +identity-provider.stored-tokens-readable.tooltip=Включено/выключено чтение новыми пользователями любых сохраненных токенов. Это назначается ролью broker.read-token. +disableUserInfo=Отключить информацию о пользователе +identity-provider.disableUserInfo.tooltip=Отключить использование сервиса информации о пользователе, чтобы получить дополнительную информацию о пользователе? По умолчанию используется сервис OIDC. +userIp=Использовать параметр userIp +identity-provider.google-userIp.tooltip=Установить 'userIp' параметр запроса при вызове сервиса Google's. Будет использовать ip адрес пользователя. Полезно, если Google будет подавлять доступ к сервису информации о пользователе. +update-profile-on-first-login=Обновить профиль при первом входе +on=Вкл +on-missing-info=При пропущенной инфо +off=Вык +update-profile-on-first-login.tooltip=Определить условия, при которых пользователи должны обновлять свой профиль во время первого входа. +trust-email=Подтверждение E-mail +trust-email.tooltip=Если включено, то E-mail, предоставленный этим поставщиком не будет подтвержденным даже если подтверждение включено для realm. +link-only=Только связывание учетной записи +link-only.tooltip=Если установлено, то пользователи не смогут войти через этого провайдера. Только устанавливает связь к этому провайдеру. Используется, если вы не хотите разрешать вход через этого провайдера, но хотите с этим провайдером иметь интеграцию. +hide-on-login-page=Скрыть на странице входа +hide-on-login-page.tooltip=Если скрыто, то вход с этим провайдером возможен только при явном вызове, например при использовании параметра 'kc_idp_hint'. +gui-order.tooltip=Число, определяющее порядок поставщиков в GUI (например, на странице входа). +first-broker-login-flow.tooltip=Синоним сценария аутентификации, который срабатывает после первого входа с этого поставщика идентификации. Термин 'First Login' означает, что еще не существует учетной записи Keycloak связанной с аутентифицированной учетной записью поставщика идентификации. +post-broker-login-flow.tooltip=Синоним сценария аутентификации, который срабатывает после каждого входа из этого поставщика идентификации. Полезно, если вы ходите получить дополнительную проверку каждого пользователя, аутентифицированного в этом поставщике идентификации (например OTP). Оставьте это поле пустым, если не хотите, чтобы срабатывали дополнительные проверки аутенификации после входа пользователя с этим поставщиком идентификации. Также обратите внимание, что реализации аутентификатора должны предполагать что пользователь уже установил ClientSession также как установил ее в поставщике идентификации. +openid-connect-config=Конфигурация OpenID Connect +openid-connect-config.tooltip=OIDC SP и конфигурация внешних IDP. +authorization-url=URL авторизации +authorization-url.tooltip=Url авторизации. +token-url=URL токена +token-url.tooltip=URL токена. +logout-url=URL выхода +identity-provider.logout-url.tooltip=Конечная точка окончания сессии, используемая для выхода пользователя из внешнего IDP. +backchannel-logout=Backchannel Logout +backchannel-logout.tooltip=Поддерживает ли внешний IDP backchannel logout? +user-info-url=URL информации о пользователе +user-info-url.tooltip=Url информации о пользователе. Это поле опционально. +identity-provider.client-id.tooltip=Клиент или идентификатор клиента, зарегистрированного с помощью поставщика идентификации. +client-secret=Секрет клиента +show-secret=Показать секрет +hide-secret=Скрыть секрет +client-secret.tooltip=Клиент или секрет клиента, зарегистрированный с помощью поставщика идентификации. +issuer=Эмитент +issuer.tooltip=Идентификатор эмитента для эмитента ответа. Если не предоставлен, проверка не будет выполняться. +default-scopes=Области по умолчанию +identity-provider.default-scopes.tooltip=Области, которые будут посланы после запроса авторизации. Это может быть список областей, разделенных пробелом. По умолчанию 'openid'. +prompt=Подсказка +unspecified.option=неопределенный +none.option=нет +consent.option=согласие +login.option=вход +select-account.option=выберите_учетную_запись +prompt.tooltip=Указывает, запрашивает ли сервер авторизации у конечного пользователя переаутентификацию и согласие. +validate-signatures=Проверка подписей +identity-provider.validate-signatures.tooltip=Включить/выключить проверку подписей внешних поставщиков идентификации. +identity-provider.use-jwks-url.tooltip=Если включено, то публичные ключи поставщиков идентификации будет скачаны с заданного JWKS URL. Это дает дополнительную гибкость, так как новые ключи скачиваются каждый раз когда поставщик идентификации создает новую пару. Если выключено, то будут использованы публичные ключи (или сертификат) из базы данных Keycloak, и в случае изменений пары на поставщике идентификации вам будет необходимо каждый раз импортировать новые ключи в базу данных Keycloak. +identity-provider.jwks-url.tooltip=URL по которому поставщик идентификации хранит ключи в формате JWK. Для дополнительной информации смотрите спецификацию JWK. Если Вы используете внешнего поставщика идентификации keycloak, то Вы можете использовать URL наподобие 'http://broker-keycloak:8180/auth/realms/test/protocol/openid-connect/certs' предполагая, что ваш посредник keycloak запущен на 'http://broker-keycloak:8180' и его realm 'test' . +validating-public-key=Проверка публичного ключа +identity-provider.validating-public-key.tooltip=Публичный ключ в формате PEM, который должен использоваться для проверки подписей внешних поставщиков идентификации. +validating-public-key-id=Валидация Id публичного ключа +identity-provider.validating-public-key-id.tooltip=Явный ID проверяемого публичного ключа, выданного выше, если есть key ID. Оставьте это поле пустым если ключ выше должен быть использован всегда, независимо от key ID указанного внешнего IDP; установите это если ключ должен быть использован для проверки соответсвтия key ID внешних IDP. +import-external-idp-config=Импортировать конфигурацию внешнего IDP +import-external-idp-config.tooltip=Позволяет вам загрузить метаданные внешнего IDP из файла конфигурации или скачать его из URL. +import-from-url=Импорт из URL +identity-provider.import-from-url.tooltip=Импорт метаданных из дескриптора развертывания удаленного поставщика идентификации. +import-from-file=Импорт из файла +identity-provider.import-from-file.tooltip=Импорт метаданных со скачанного дескриптора развертывания удаленного поставщика идентификации. +saml-config=Конфигурация SAML +identity-provider.saml-config.tooltip=Конфигурация SAML SP и внешних IDP. +single-signon-service-url=Адрес сервиса единой точки входа +saml.single-signon-service-url.tooltip=Url, который должен быть использован для отправленных запросов на аутентификацию (SAML AuthnRequest). +single-logout-service-url=Адреса сервиса единого выхода +saml.single-logout-service-url.tooltip=Url, который должен быть использован для отправленных запросов на выход. +nameid-policy-format=Формат политики NameID +nameid-policy-format.tooltip=Определяет ссылку URI, соответствующую формату идентификатора имени. По умолчанию urn:oasis:names:tc:SAML:2.0:nameid-format:persistent. +http-post-binding-response=Привязанный ответ HTTP-POST +http-post-binding-response.tooltip=Указывает, следует ли отвечать на запросы, используя привязку HTTP-POST. Если нет, то будет использован HTTP-REDIRECT. +http-post-binding-for-authn-request=Привязывание HTTP-POST для AuthnRequest +http-post-binding-for-authn-request.tooltip=Указывает, должны ли AuthnRequest быть посланы, используя привязку HTTP-POST. Если нет, то будет использован HTTP-REDIRECT. +http-post-binding-logout=Привязывание HTTP-POST для выхода +http-post-binding-logout.tooltip=Указывает, необходоимо ли отвечать на завпросы, используя привязку HTTP-POST. Если не задано, то будет использован HTTP-REDIRECT. +want-authn-requests-signed=Ожидание подписи AuthnRequests +want-authn-requests-signed.tooltip=Указывает, ожидает ли поставщик идентификации подписанных AuthnRequest. +force-authentication=Принудительная аутентификация +identity-provider.force-authentication.tooltip=Указывает, должен ли поставщик идентификации аутентифицировать ведущего напрямую, а не использовать предыдущий контекст безопасности. +validate-signature=Проверка подписи +saml.validate-signature.tooltip=Включает/выключает проверку подписи ответов от SAML. +validating-x509-certificate=Проверка X509 сертификатов +validating-x509-certificate.tooltip=Сертификат в формате PEM, который должен быть использован для проверки подписи. +saml.import-from-url.tooltip=Импортировать метаданные из удаленного дескриптора сущностей IDP SAML. +social.client-id.tooltip=Идентификатор клиента, зарегистрированный с помощью поставщика идентификации. +social.client-secret.tooltip=Секрет клиента, зарегистрированный с помощью поставщика идентификации. +social.default-scopes.tooltip=Области, которые будут посланы при запросе авторизации. Смотрите документацию для возможных значений, разделителей и значений по умолчанию. +key=Ключ +stackoverflow.key.tooltip=Ключ, полученный при регистрации клиента в Stack Overflow. + +# User federation +sync-ldap-roles-to-keycloak=Синхронизировать роли LDAP с Keycloak +sync-keycloak-roles-to-ldap=Синхронизировать роли Keycloak с LDAP +sync-ldap-groups-to-keycloak=Синхронизировать группы LDAP с Keycloak +sync-keycloak-groups-to-ldap=Синхронизировать группы Keycloak с LDAP + +realms=Realms +realm=Realm + +identity-provider-mappers=Сопоставление поставщиков идентификации +create-identity-provider-mapper=Создать сопоставление поставщика учетных записей +add-identity-provider-mapper=Добавить сопоставление поставщика учетных записей +client.description.tooltip=Задает описание клиента. Например 'Мой клиент для табеля учета времени'. Поддерживает ключи для локализованных значений. Например: ${my_client_description} + +expires=Истекает +expiration=Истечение +expiration.tooltip=Определяет, как долго токен будет оставаться валидным +count=Счетчик +count.tooltip=Определяет, как много клиентов может быть создано с помощью этого токена +remainingCount=Счетчик остатка +created=Создано +back=Назад +initial-access-tokens=Токены первичного доступа +add-initial-access-tokens=Добавить токен первичного доступа +initial-access-token=Токен первичного доступа +initial-access.copyPaste.tooltip=Необходимо скопировать/вставить токен первичного доступа до того, как покинете эту страницу, т.к. в дальнейшем получить его будет невозможно +continue=Продолжить +initial-access-token.confirm.title=Скопировать токен первичного доступа +initial-access-token.confirm.text=Пожалуйста, скопируйте и вставьте токен первичного доступа до того, как сделаете подтверждение, т.к. в дальнейшем получить его будет невозможно +no-initial-access-available=Нет доступных токенов первичного доступа + +client-reg-policies=Политики регистрации клиента +client-reg-policy.name.tooltip=Отображаемое наименование политики +anonymous-policies=Политики анонимного доступа +anonymous-policies.tooltip=Эти политики будут использоваться, когда сервис регистрации клиента вызывается неаутентифицированным запросом. Это означает, что запрос не содержит ни токена первичного доступа ни Bearer токена. +auth-policies=Политики аутентифицированного доступа +auth-policies.tooltip=Эти политики будут использоваться, когда сервис регистрации клиента вызывается аутентифицированным запросом. Это означает, что запрос содержит токен первичного доступа или Bearer токен. +policy-name=Наименование политики +no-client-reg-policies-configured=Нет политик регистрации клиента +trusted-hosts.label=Доверенные хосты +trusted-hosts.tooltip=Список хостов, которым доверенно и разрешено адресоваться на сервис регистрации клиентов или/или использоваться в значения URI клиентов. Вы можете использовать имена хостов или IP адреса. Если Вы используете звезду If you use star at the beginning (for example '*.example.com' ) then whole domain example.com will be trusted. +host-sending-registration-request-must-match.label=Хост, посылающий запрос на регистрацию клиента должен совпадать +host-sending-registration-request-must-match.tooltip=Если включено, то любой запрос на сервис регистрации клиентов разрешен только если он передан из доверенного хоста или домена. +client-uris-must-match.label=URI клиента должны совпадать +client-uris-must-match.tooltip=Если включено, то все клиентские URI (URI переадресации и прочие) разрешены только если они совпадают с доверенным хостом или доменом. +allowed-protocol-mappers.label=Разрешенные сопоставления протокола +allowed-protocol-mappers.tooltip=Белый список разрешенных поставщиков сопоставления протокола. Если есть попытка регистрации клиента, который содержит какие-либо сопоставления протокола, которые не находятся в белом списке, то регистрация таких клиентов будет отклонена. +consent-required-for-all-mappers.label=Требуется согласие для сопоставлений +consent-required-for-all-mappers.tooltip=Если включено, то то все вновь зарегестрированные сопоставления протокола будут автоматически иметь включенный consentRequired. Это означает, что пользователь должен подтвердить на экране согласия. Примечание: Экран согласия отображается только если клиент имеет включенный consentRequired. Таким образом, как правило этот переключатель используется совместно с политикой согласий. +allowed-client-templates.label=Разрешить шаблоны клиента +allowed-client-templates.tooltip=Белый список шаблонов клиента, который может быть использован при регистрации нового клиента. Попытка зарегестрировать клиента с каким-либо шаблоном не из белого списка будет отклонена. По умолчанию, белый лист пустой, таким образом шаблоны клиентам не доступны. +max-clients.label=Максимальное количество клиентов для Realm +max-clients.tooltip=Не позволяет регистрировать клиентов больше установленного предельного значения. + +client-templates=Шаблоны клиентов +client-templates.tooltip=Шаблоны клиентов позволяют вам определить основную конфигурацию, которая может быть общей между несколькими клиентами + +groups=Группы + +group.add-selected.tooltip=Роли Realm, которые могут быть назначены на эту группу. +group.assigned-roles.tooltip=Роли Realm, сопоставленные на группу +group.effective-roles.tooltip=Все сопоставления realm ролей. Некоторые роли здесь могут быть унаследованы из составной роли. +group.available-roles.tooltip=Назначаемые роли этого клиента. +group.assigned-roles-client.tooltip=Сопоставление ролей этого клиента. +group.effective-roles-client.tooltip=Сопоставление ролей этого клиента. Некоторые роли здесь могут быть унаследованы из сопоставленных составных ролей. + +default-roles=Роли по умолчанию +no-realm-roles-available=Роли realm не доступны + +users=Пользователи +user.add-selected.tooltip=Роли Realm, которые могут быть назначены пользователю. +user.assigned-roles.tooltip=Роли Realm, сопоставленные пользователю +user.effective-roles.tooltip=Все соответствия ролей realm. Некоторые роли здесь могут быть унаследованы из соответствующих составных ролей. +user.available-roles.tooltip=Доступные роли для этого клиента. +user.assigned-roles-client.tooltip=Соответствие ролей для этого клиента. +user.effective-roles-client.tooltip=Соответствие ролей для этого клиента. Некоторые роли здесь могут быть унаследованы из соответствующих составных ролей. +default.available-roles.tooltip=Роли уровня Realm, которые могут быть назначены. +realm-default-roles=Роли Realm по умолчанию +realm-default-roles.tooltip=Роли уровня Realm, которые могут быть назначены новым пользователям. +default.available-roles-client.tooltip=Роли из этого клиента, которые могут быть назначены по умолчанию. +client-default-roles=Роли клиента по умолчанию +client-default-roles.tooltip=Роли из этого клиента, назначенные как роли по умолчанию. +composite.available-roles.tooltip=Роли уровня Realm связанные с этой составной ролью. +composite.associated-roles.tooltip=Роли уровня Realm, связанные с этой составной ролью. +composite.available-roles-client.tooltip=Роли из этого клиента, которые могут быть назначены с этой составной ролью. +composite.associated-roles-client.tooltip=Роли клиента, связанные с этой составной ролью. +partial-import=Частичный импорт +partial-import.tooltip=Частичный импорт позволяет импортировать пользователей, клиентов, и другие ресурсы из ранее экспортированного json-файла. + +file=File +exported-json-file=Экспортированный json файл +import-from-realm=Импортировать из realm +import-users=Импортировать пользователей +import-groups=Импортировать группы +import-clients=Импортировать клиентов +import-identity-providers=Импортировать поставщиков идентификации +import-realm-roles=Импортировать роли realm +import-client-roles=Импортировать роли клиентов +if-resource-exists=Если ресурс существует +fail=Неудача +skip=Пропустить +overwrite=Перезаписать +if-resource-exists.tooltip=Указать, что следует делать, если вы пытаетесь импортировать ресурс, который уже существует. + +action=Действие +role-selector=Селектор ролей +realm-roles.tooltip=Роли Realm, которые могут быть выбраны. + +select-a-role=Выберите роль +select-realm-role=Выберите роль realm +client-roles.tooltip=Роли клиента, которые могут быть выбраны. +select-client-role=Выберите роль клиента + +client-template=Шаблон клиента +client-template.tooltip=Шаблон клиента, определяющий наследование конфигурации этого клиента из +client-saml-endpoint=Конечная точка доступа SAML клиента +add-client-template=Добавить шаблон клиента + +manage=Управление +authentication=Аутентификация +user-federation=Федерация пользователей +user-storage=Хранилище пользователей +events=События +realm-settings=Настройки Realm +configure=Конфигурация +select-realm=Выберите realm +add=Добавить + +client-template.name.tooltip=Наименование шаблона клиента. Должно быть уникально для realm +client-template.description.tooltip=Описание шаблона клиента +client-template.protocol.tooltip=Какая конфигурация протокола SSO будет поддержана шаблоном клиента + +add-user-federation-provider=Добавить службу федерации пользователей +add-user-storage-provider=Добавить службу хранилища пользователей +required-settings=Требуемые настройки +provider-id=ID службы +console-display-name=Наименование в консоли +console-display-name.tooltip=Отображаемое имя службы, связанное с консолью администратора. +priority=Приоритет +priority.tooltip=Приоритет службы при поиске пользователя. Вперед идут более низкие значения. +sync-settings=Синхронизировать настройки +periodic-full-sync=Периодическая полная синхронизация +periodic-full-sync.tooltip=Должна ли периодическая полная синхронизация с поставщиком идентификации в Keycloak включена или нет +full-sync-period=Период полной синхронизации +full-sync-period.tooltip=Период для полной синхронизации в секундах +periodic-changed-users-sync=Периодическая синхронизация изменений пользователей +periodic-changed-users-sync.tooltip=Должна ли происходить периодическая синхронизация новых и измененных пользователей поставщика идентификации с Keycloak +changed-users-sync-period=Период синхронизации измененных пользователей +changed-users-sync-period.tooltip=Период для синхронизации измененных и новых пользователей в поставщике идентификации в секундах +synchronize-changed-users=Синхронизация измененных пользователей +synchronize-all-users=Синхронизация всех пользователей +remove-imported-users=Удалить импортированных +unlink-users=Отвязать пользователей +kerberos-realm=Kerberos Realm +kerberos-realm.tooltip=Наименование kerberos realm. Например FOO.ORG +server-principal=Основной сервер +server-principal.tooltip=Полное имя основного сервера для HTTP сервиса, включая серверное и доменное имя. Например HTTP/host.foo.org@FOO.ORG +keytab=KeyTab +keytab.tooltip=Местоположение файла KeyTab в Kerberos, содержащего учетные данные основного сервера. Например /etc/krb5.keytab +debug=Отладчик +debug.tooltip=Включить/выключить отладочные логи в стандартный вывод для Krb5LoginModule. +allow-password-authentication=Разрешить аутентификацию по паролю +allow-password-authentication.tooltip=Включить/выключить возможность аутентификации по имени/пароля вопреки базе данных Kerberos +edit-mode=Режим редактирования +edit-mode.tooltip=READ_ONLY означает, что обновление пароля не допускается и пользователь всегда аутентифицируется с паролем Kerberos. UNSYNCED означает, что пользователь может изменить свой пароль в базе данных Keycloak и тогда он будет использован вместо пароля Kerberos +ldap.edit-mode.tooltip=READ_ONLY означает доступ только на чтение из LDAP. WRITABLE означает, что данные будут обратно синхронизированы в LDAP по заявке. UNSYNCED означает, что данные пользователя будут импортированы, но не синхронизированы обратно в LDAP. +update-profile-first-login=Обновить профиль при первом входе +update-profile-first-login.tooltip=Обновить профиль при первом входе +sync-registrations=Синхронизировать регистрации +ldap.sync-registrations.tooltip=Должны ли вновь созданные пользователи быть созданы в хранилище LDAP? Приоритет определяет какой из поставщиков будет выбран для синхронизации нового пользователя. +import-enabled=Импортировать пользователей +ldap.import-enabled.tooltip=Если включено, пользователи LDAP будут импортированы в базу данных Keycloak и синхронизированы через сконфигурированные политики синхронизации. +vendor=Поставщик +ldap.vendor.tooltip=LDAP поставщик (провайдер) +username-ldap-attribute=Атрибут Username в LDAP +ldap-attribute-name-for-username=Наименование атрибута LDAP для имени пользователя +username-ldap-attribute.tooltip=Наименование LDAP атрибута, которое отображается как имя пользователя в Keycloak. Для множества серверов LDAP это может быть 'uid'. Для Active directory это может быть 'sAMAccountName' или 'cn'. Атрибут должен быть заполнен для всех LDAP записей пользователей, которые вы хотите импортировать из LDAP в Keycloak. +rdn-ldap-attribute=Атрибут RDN в LDAP +ldap-attribute-name-for-user-rdn=Наименование атрибута LDAP для пользователей RDN +rdn-ldap-attribute.tooltip=Наименование атрибутов LDAP, которое используется как RDN (верхний атрибут) обычного пользователя DN. Обычно оно такое же, как атрибут имени пользователя LDAP, однако он не обязателен. Для примера, для Active directory обычно используется 'cn' как атрибут RDN, в то время как атрибут имени пользователя может быть 'sAMAccountName'. +uuid-ldap-attribute=Атрибут UUID в LDAP +ldap-attribute-name-for-uuid=Наименование LDAP атрибута для UUID +uuid-ldap-attribute.tooltip=Наименование LDAP атрибута,которое используется как уникальный идентификатор объектов (UUID) в LDAP. Для множества LDAP серверов это 'entryUUID' однако некоторые могут отличаться. Для примера, для Active directory он должен быть 'objectGUID'. Если ваш LDAP сервер действительно не поддерживает понятие UUID, вы можете использовать любой другой атрибут, который должен быть уникальным среди пользователей в дереве LDAP. Например 'uid' или 'entryDN'. +user-object-classes=Классы объектов пользователя +ldap-user-object-classes.placeholder=Классы объектов пользователя LDAP (разделенные запятой) + +ldap-connection-url=URL соединения с LDAP +ldap-users-dn=Пользователи DN LDAP +ldap-bind-dn=Сопоставление DN LDAP +ldap-bind-credentials=Сопоставление учетных данных LDAP +ldap-filter=LDAP фильтр +ldap.user-object-classes.tooltip=Все значения из LDAP objectClass атрибутов для пользователей в LDAP, разделенные запятой. Например: 'inetOrgPerson, organizationalPerson' . Вновь созданные пользователи Keycloak будут записаны в LDAP вместе с этими классами объектов, а существующие записи пользователей LDAP будут найдены только если они содержат все эти классы объектов. + +connection-url=URL соединения +ldap.connection-url.tooltip=URL соединения с вашим сервером LDAP +test-connection=Тест соединения +users-dn=Пользователи DN +ldap.users-dn.tooltip=Полный DN из дерева LDAP где присутствуют ваши пользователи. Этот DN является родителем пользователей LDAP. Он может быть, для примера 'ou=users,dc=example,dc=com' при условии, что ваш обычный пользователь будет иметь DN похожий на'uid=john,ou=users,dc=example,dc=com' +authentication-type=Тип аутентификации +ldap.authentication-type.tooltip=Тип LDAP аутентификации. Сейчас доступны только механизмы 'none' (анонимная аутентификация LDAP) или 'simple' (Аутентификация по сопоставленным логину и паролю) +bind-dn=Сопоставление DN +ldap.bind-dn.tooltip=DN администратора LDAP, которые будут использованы Keycloak для доступа на сервер LDAP +bind-credential=Сопоставление учетных данных +ldap.bind-credential.tooltip=Пароль администратора LDAP +test-authentication=Проверка аутентификации +custom-user-ldap-filter=Пользовательский Фильтр LDAP пользователей +ldap.custom-user-ldap-filter.tooltip=Дополнительный фильтр LDAP для фильтрации искомых пользователей. Оставьте поле пустым, если не нуждаетесь в дополнительном фильтре. Убедитесь, что он начинается с '(' и заканчивается ')' +search-scope=Поиск области +ldap.search-scope.tooltip=Для одного уровня мы ищем пользователей только в DN, определенных как пользовательские DN. Для поддеревьев мы ищем полностью в их поддеревьях. Смотрите документацию LDAP для подробных деталей +use-truststore-spi=Использование доверенных сертификатов SPI +ldap.use-truststore-spi.tooltip=Определяет, будет ли соединение с LDAP использовать хранилище доверенных сертификатов SPI вместе с сертификатами, сконфигурированными в keycloak-server.json. 'Всегда' означает, что они будут использоваться всегда. 'Никогда' означает, что они никогда не будут использованы. 'Только для ldap`ов' означает, что они будут использованы вместе с вашими соединениями к ldap серверам. Обратите внимание, что если keycloak-server.json не сконфигурирован, то по умолчанию Java будет использовать cacerts или сертификат, определенный в 'javax.net.ssl.trustStore'. +connection-pooling=Пул соединений +ldap-connection-timeout=Таймаут соединения +ldap.connection-timeout.tooltip=Таймаут соединения с LDAP в миллисекундах +ldap-read-timeout=Таймаут чтения +ldap.read-timeout.tooltip=Таймаут чтения из LDAP в миллисекундах. Этот таймаут применяется к операциям чтения из LDAP +ldap.connection-pooling.tooltip=Должен ли Keycloak использовать пул соединений для доступа к LDAP серверу +ldap.pagination.tooltip=Должен ли LDAP сервер поддерживать постраничный вывод. +kerberos-integration=Интеграция с Kerberos +allow-kerberos-authentication=Разрешить аутентификацию Kerberos +ldap.allow-kerberos-authentication.tooltip=Включить/выключить аутентификацию HTTP пользователей с токенами SPNEGO/Kerberos. Данные об аутентифицированых пользователях будут предусмотрены из этого LDAP сервера +use-kerberos-for-password-authentication=Использовать Kerberos для аутентификации по паролю +ldap.use-kerberos-for-password-authentication.tooltip=Использовать модуль входа Kerberos для аутентификации по логин/пароль с сервера Kerberos вместо аутентификации на сервере LDAP с Directory Service API +batch-size=Размер пачки +ldap.batch-size.tooltip=Количество пользователей LDAP, которые будут импортированы в Keycloak за одну транзакцию. +ldap.periodic-full-sync.tooltip=Должна ли быть включена полная периодическая синхронизация пользователей LDAP в Keycloak или нет +ldap.periodic-changed-users-sync.tooltip=Должна ли быть включена периодическая синхронизация новых и измененных пользователей LDAP в Keycloak или нет +ldap.changed-users-sync-period.tooltip=Период для синхронизации измененных или вновь созданных пользователей LDAP в секундах +user-federation-mappers=Сопоставления федераций пользователей +create-user-federation-mapper=Создать отображение федерации пользователей +add-user-federation-mapper=Добавить отображение федерации пользователей +provider-name=Наименование поставщика +no-user-federation-providers-configured=Не сконфигурирован федеративный поставщик идентификации +no-user-storage-providers-configured=Не сконфигурирован поставщик хранилища учетных записей +add-identity-provider=Добавить поставщика идентификации +add-identity-provider-link=Добавить ссылку на поставщика идентификации +identity-provider=Поставщик идентификации +identity-provider-user-id=ID пользователя поставщика идентификации +identity-provider-user-id.tooltip=Уникальный ID пользователя на стороне поставщика идентификации +identity-provider-username=Имя пользователя поставщика идентификации +identity-provider-username.tooltip=Имя пользователя на стороне поставщика идентификации +pagination=Постраничный вывод + +browser-flow=Сценарий браузера +browser-flow.tooltip=Выберите сценарий, который вы хотите использовать для аутентификации через браузер. +registration-flow=Сценарий регистрации +registration-flow.tooltip=Выберите сценарий, который вы хотите использовать для регистрации пользователя. +direct-grant-flow=Сценарий Direct Grant Flow +direct-grant-flow.tooltip=Выберите сценарий, который вы хотите использоваться для аутентификации direct grant. +reset-credentials=Сбросить учетные данные +reset-credentials.tooltip=Выберите сценарий, который вы хотите использовать когда пользователь забыл свои учетные данные. +client-authentication=Аутентификация клиента +client-authentication.tooltip=Выберите сценарий, который вы хотите использовать для аутентификации клиентов. +new=Создать +copy=Копировать +add-execution=Добавить исполнение +add-flow=Добавить сценарий +auth-type=Тип аутентификации +requirement=Требования +config=Конфигурация +no-executions-available=Нет доступных выполнений +authentication-flows=Сценарии аутентификации +create-authenticator-config=Создать конфигурацию аутентификатора +authenticator.alias.tooltip=Наименование конфигурации +otp-type=Тип одноразового пароля OTP +time-based=Основан на времени +counter-based=Основан на счетчике +otp-type.tooltip=totp является Временным одноразовым паролем. 'hotp' основанный на счетчике одноразовый пароль в котором сервер хранит счетчик хеша. +otp-hash-algorithm=Алгоритм хеша OTP +otp-hash-algorithm.tooltip=Какой алгоритм хеширования должен быть использован для генерации OTP. +number-of-digits=Количество цифр +otp.number-of-digits.tooltip=Сколько цифр должен иметь OTP? +look-ahead-window=Окно вперед +otp.look-ahead-window.tooltip=Как далеко вперед сервер должен выглядеть в случае если сгенерированный токен и сервер не синхронизированы с временем или счетчиком +initial-counter=Начальное значение счетчика +otp.initial-counter.tooltip=Каким должно быть начальное значение счетчика? +otp-token-period=Период токена OTP +otp-token-period.tooltip=Сколько секунд токен OTP должен быть действителен? По умолчанию 30 секунд. +table-of-password-policies=Таблица политик пароля +add-policy.placeholder=Добавить политику... +policy-type=Тип политики +policy-value=Значение политики +admin-events=События администратора +admin-events.tooltip=Отображает сохраненные события администратора в этом realm. События, связанные с учетной записью администратора, например создание realm. Чтобы включить сохранение событий, перейдите в конфигурацию. +login-events=События входа +filter=Фильтр +update=Обновить +reset=Сбросить +operation-types=Типы операций +resource-types=Типы ресурсов +select-operations.placeholder=Выберите операции... +select-resource-types.placeholder=Выберите типы ресурсов... +resource-path=Путь к ресурсу +resource-path.tooltip=Фильтр по пути к ресурсу. Поддерживает подстановку '*' для совпадения одной части пути и '**' совпадение нескольких частей. Например 'realms/*/clients/asbc' выберет клиента с идентификатором asbc в любом realm, в то время как 'realms/master/**' не найдет ничего в master realm. +date-(from)=Дата (С) +date-(to)=Дата (По) +authentication-details=Детали аутентификации +ip-address=IP адрес +time=Время +operation-type=Тип операции +resource-type=Тип ресурса +auth=Аутентификация +representation=Представление +register=Регистрация +required-action=Требуемое действие +default-action=Действие по умолчанию +auth.default-action.tooltip=Если включено, то любому новому пользователю будет будет назначено требуемое действие. +no-required-actions-configured=Требуемые действия не сконфигурированы +defaults-to-id=По умолчанию id +flows=Сценарии +bindings=Сопоставления +required-actions=Требуемые действия +password-policy=Политики пароля +otp-policy=Политики OTP +user-groups=Группы пользователей +default-groups=Группы по умолчанию +groups.default-groups.tooltip=Устанавливает группы, в которые новые пользователи будут включены автоматически. +cut=Вырезать +paste=Вставить + +create-group=Создать группу +create-authenticator-execution=Создать исполнение аутентификатора +create-form-action-execution=Создать форму действия исполнения +create-top-level-form=Создать верхнеуровневую форму +flow.alias.tooltip=Задает отображаемое имя для сценария. +top-level-flow-type=Top Level Flow Type +flow.generic=общий +flow.client=клиент +top-level-flow-type.tooltip=Какой это тип сценария верхнего уровня? Тип "клиент" используется для аутентификации клиентов (приложений), когда "общий" для пользователей и всего остального +create-execution-flow=Создать сценарий исполнения +flow-type=Тип сценария +flow.form.type=форма +flow.generic.type=общий +flow-type.tooltip=Какого типа эта форма +form-provider=Поставщик формы +default-groups.tooltip=Вновь созданные или зарегистрированные пользователи будут автоматически добавлены к этим группам +select-a-type.placeholder=выберите тип +available-groups=Доступные группы +available-groups.tooltip=Выберите группу, которые вы хотите добавить по умолчанию. +value=Значение +table-of-group-members=Таблица членов группы +last-name=Фамилия +first-name=Имя +email=E-mail +toggle-navigation=Переключить навигацию +manage-account=Управление учетной записью +sign-out=Выход +server-info=Информация о сервере +resource-not-found=Ресурс не найден... +resource-not-found.instruction=Мы не смогли найти ресурс, который вы ищете. Пожалуйста, убедитесь, что вы ввели корректный URL. +go-to-the-home-page=Перейти на домашнюю страницу » +page-not-found=Страница не найдена... +page-not-found.instruction=Мы не смогли найти страницу, которую вы ищете. Пожалуйста, убедитесь, что URL-адрес введен правильно. +events.tooltip=Отображает сохраненные события для realm. События, связанные с учетными записями пользователей, например, вход пользователя. Для того, чтобы включить сохранение событий, перейдите в конфигурацию. +select-event-types.placeholder=Выберите тип событий... +events-config.tooltip=Отображает опции конфигурации для включения сохранения событий пользователей и администратора. +select-an-action.placeholder=Выберите действие... +event-listeners.tooltip=Настройка слушателей, получающих события для realm. +login.save-events.tooltip=Если включено, то события будут сохранены в базу данных, что сделает их доступными администратору и консоли управления учетной записью. +clear-events.tooltip=Удаляет все события из базы данных. +events.expiration.tooltip=Установить срок истечения для событий. Истекшие события периодически удаляются из базы данных. +admin-events-settings=Настройки событий администратора +save-events=Сохранять события +admin.save-events.tooltip=Если включено, то события администратора будет сохранены в базу данных, что сделает их доступными через консоль администратора. +saved-types.tooltip=Сконфигурировать, какие типы событий следует сохранять. +include-representation=Включить представление +include-representation.tooltip=Включить JSON представление для запросов на создание и обновление. +clear-admin-events.tooltip=Удалить все события администратора из базы данных. +server-version=Версия сервера +server-profile=Профиль сервера +server-disabled=Отключенные функции сервера +info=Информация +providers=Поставщики +server-time=Время на сервере +server-uptime=Аптайм сервера +memory=Память +total-memory=Всего памяти +free-memory=Свободно памяти +used-memory=Использовано памяти +system=Система +current-working-directory=Текущая рабочая директория +java-version=Версия Java +java-vendor=Поставщик Java +java-runtime=Java Runtime +java-vm=Java VM +java-vm-version=Версия Java VM +java-home=Java Home +user-name=Имя пользователя +user-timezone=Таймзона пользователя +user-locale=Язык пользователя +system-encoding=Системная кодировка +operating-system=Операционная система +os-architecture=Архитектура OS +spi=SPI +granted-roles=Предоставленные роли +granted-protocol-mappers=Сопоставления протокола предоставления +additional-grants=Дополнительные полномочия +consent-created-date=Создано +consent-last-updated-date=Обновлено +revoke=Отобрать +new-password=Новый пароль +password-confirmation=Подтверждение пароля +reset-password=Сброс пароля +credentials.temporary.tooltip=Если включено, пользователю необходимо сменить пароль при следующем входе +remove-totp=Удалить TOTP +credentials.remove-totp.tooltip=Удалить генератор одноразовых паролей из пользователя. +reset-actions=Действия сброса +credentials.reset-actions.tooltip=Набор действия для выполнения при отправке пользователю письма с указаниями по сбросу пароля. 'Подтвердить E-mail' высылает пользователю письмо для подтверждения его E-mail. 'Обновить профиль' требует от пользователя ввести новую персональную информацию. 'Обновить пароль' требует от пользователя ввести новый пароль. 'Настроить TOTP' требует установить мобильное приложение с генератором паролей. +reset-actions-email=E-mail с действиями для сброса пароля +send-email=Послать письмо +credentials.reset-actions-email.tooltip=Посылает письмо пользователю со встроенной ссылкой. Кликнув на ссылку, пользователю будет разрешено выполнить действия для сброса. Они не должны для этого входить в систему. Например, установка действия обновления пароля, щелкните по этой кнопке, и пользователь получит возможность сменить свой пароль без входа в систему. +add-user=Добавить пользователя +created-at=Создан +user-enabled=Пользователь включен +user-enabled.tooltip=Отключенные пользователи не смогут войти. +user-temporarily-locked=Пользователь временно заблокирован +user-temporarily-locked.tooltip=Пользователь может быть заблокирован в случае многократных неудачных попыток входа. +unlock-user=Разблокировать пользователя +federation-link=Ссылка федерации +email-verified=Подтверждение E-mail +email-verified.tooltip=Должен ли пользователь подтверждать свой E-mail? +required-user-actions=Требуемые действия от пользователя +required-user-actions.tooltip=Требует действий от пользователя когда он входит. 'Подтвердить E-mail' высылает письмо пользователю для подтверждения его E-mail. 'Обновить профиль' требует от пользователя ввести новую персональную информацию. 'Обновить пароль' требует от пользователя ввести новый пароль. 'Настроить TOTP' требует установить мобильное приложение генерации паролей. +locale=Язык +select-one.placeholder=Выберите... +impersonate=Имперсонировать +impersonate-user=Имперсонировать +impersonate-user.tooltip=Войти как этот пользователь. Если пользователь в том же самом realm что и вы, то ваша текущая сессия будет разлогинена перед тем как вы войдете как этот пользователь. +identity-provider-alias=Синоним поставщика идентификации +provider-user-id=ID пользователя у поставщика +provider-username=Username у поставщика +no-identity-provider-links-available=Ссылки поставщика идентификации не доступны +group-membership=Членство в группах +leave=Покинуть +group-membership.tooltip=Пользователь является членом группы. Выберите в списке группу и нажмите кнопку Покинуть, чтобы покинуть группу. +membership.available-groups.tooltip=Группы, к которым пользователь может присоединиться. Выберите группу и нажмите кнопку присоединиться. +table-of-realm-users=Таблица пользователей Realm +view-all-users=Показать всех пользователей +unlock-users=Разблокировать пользователей +no-users-available=Пользователи не доступны +users.instruction=Пожалуйста, заполните строку поиска, или нажмите посмотреть всех пользователей +consents=Согласия +started=Начато +logout-all-sessions=Выйти из всех сессий +logout=Выход +new-name=Новое имя +ok=Ок +attributes=Атрибуты +role-mappings=Сопоставление ролей +members=Члены +details=Детали +identity-provider-links=Ссылки поставщика идентификации +register-required-action=Зарегистрировать требуемое действие +gender=Пол +address=Адрес +phone=Телефон +profile-url=URL профиля +picture-url=URL изображения +website=Вебсайт +import-keys-and-cert=Импорт ключей и сертификатов +import-keys-and-cert.tooltip=Загрузить пару ключей и сертификат клиента. +upload-keys=Загрузить ключи +download-keys-and-cert=Скачать ключи и сертификат +no-value-assigned.placeholder=Значение не назначено +remove=Удалить +no-group-members=В группе нет членов +temporary=Временный +join=Присоединиться +event-type=Тип события +events-config=Конфигурация событий +event-listeners=Слушатели событий +login-events-settings=Настройки событий по входу +clear-events=Очистить события +saved-types=Сохраняемые типы событий +clear-admin-events=Очистить события администратора +clear-changes=Очистить изменения +error=Ошибка + +# Authz +# Authz Common +authz-authorization=Авторизация +authz-owner=Владелец +authz-uri=URI +authz-scopes=Области +authz-resource=Ресурс +authz-resource-type=Тип ресурса +authz-resources=Ресурсы +authz-scope=Область +authz-authz-scopes=Области авторизации +authz-policies=Политики +authz-permissions=Разрешения +authz-evaluate=Оценка +authz-icon-uri=Иконка URI +authz-icon-uri.tooltip=URI, указывающий на иконку. +authz-select-scope=Выберите область +authz-select-resource=Выберите ресурс +authz-associated-policies=Назначенные политики +authz-any-resource=Любой ресурс +authz-any-scope=Любая область +authz-any-role=Любая роль +authz-policy-evaluation=Оценки политики +authz-select-client=Выберите клиента +authz-select-user=Выберите пользователя +authz-entitlements=Права +authz-no-resources=Нет ресурсов +authz-result=Результат +authz-authorization-services-enabled=Авторизация включена +authz-authorization-services-enabled.tooltip=Включить/Выключить тонко-настраиваемую поддержку авторизации для клиента +authz-required=Требуется +authz-show-details=Показать детали +authz-hide-details=Скрыть детали +authz-associated-permissions=Назначенные разрешения +authz-no-permission-associated=Разрешения не назначены + +# Authz Settings +authz-import-config.tooltip=Импорт JSON файла, содержащего авторизационные настройки для этого сервера ресурсов. + +authz-policy-enforcement-mode=Режим применения политик +authz-policy-enforcement-mode.tooltip=Режим применения политик диктует, каким образом политики применяются при оценке запросов на авторизацию. «Обязывающая» означает, что запросы запрещены по умолчанию, даже если нет никакой политики, связанной с данным ресурсом. "Разрешающая" означает, что запросы разрешены даже если не существует политика, связанная с данным ресурсом. 'Отключено' полностью отключает оценку политики и позволяет получить доступ к любому ресурсу. +authz-policy-enforcement-mode-enforcing=Обязывающая +authz-policy-enforcement-mode-permissive=Разрешающая +authz-policy-enforcement-mode-disabled=Отключено + +authz-remote-resource-management=Удаленное управление ресурсами +authz-remote-resource-management.tooltip=Должны ли ресурсы управляться удаленно сервером ресурсов? Если нет, то ресурсы могут управляться только через консоль администратора. + +authz-export-settings=Экспортировать настройки +authz-export-settings.tooltip=Экспортировать и скачать все авторизационные настройки для этого сервера ресурсов. + +# Authz Resource List +authz-no-resources-available=Нет доступных ресурсов. +authz-no-scopes-assigned=Нет назначенных областей. +authz-no-type-defined=Нет заданных типов. +authz-no-uri-defined=Нет заданных URI. +authz-no-permission-assigned=Полномочия не назначены. +authz-no-policy-assigned=Политики не заданы. +authz-create-permission=Создать полномочия + +# Authz Resource Detail +authz-add-resource=Добавить ресурс +authz-resource-name.tooltip=Уникальное имя для этого ресурса. Имя может быть использовано для уникальной идентификации ресурса, используется при запросах конкретных ресурсов. +authz-resource-owner.tooltip=Владелец этого ресурса. +authz-resource-type.tooltip=Тип этого ресурса. Может быть использовано для группировки различных экземпляров ресурса с тем же типом. +authz-resource-uri.tooltip=URI, который также может быть использован для уникальной идентификации этого ресурса. +authz-resource-scopes.tooltip=Области, ассоциироваанные с этим ресурсом. + +# Authz Scope List +authz-add-scope=Добавить область +authz-no-scopes-available=Нет доступных областей. + +# Authz Scope Detail +authz-scope-name.tooltip=Уникальное имя для области. Имя может быть использовано для уникальной идентификации области, используется при запросах конкретных областей. + +# Authz Policy List +authz-all-types=Все типы +authz-create-policy=Создать политику +authz-no-policies-available=Нет доступных политик. + +# Authz Policy Detail +authz-policy-name.tooltip=Название этой политики. +authz-policy-description.tooltip=Описание этой политики. +authz-policy-logic=Логика +authz-policy-logic-positive=Позитивная +authz-policy-logic-negative=Негитивная +authz-policy-logic.tooltip=Логика диктует, как политика должна применяться. Если 'Позитивная', результирующий эффект (разрешение или запрещение) полученный в ходе оценки этой политики будет использован для выполнения решения. Если 'Негативная', результирующий эффект будет отрицательным, другими словами, разрешение становится запрещением и наоборот. +authz-policy-apply-policy=Применить политику +authz-policy-apply-policy.tooltip=Определяем все политики, которые должны быть применены к областям, определенным этой политикой или разрешением. +authz-policy-decision-strategy=Стратегия решения +authz-policy-decision-strategy.tooltip=Стратегия решения диктует как политики связаны с заданными разрешениями и как формируется окончательное решение. 'Утвердительная' означает, что, по крайней мере, одна политика должна дать положительную оценку для того, чтобы окончательное решение также было положительным. 'Единогласная' означает что все политики должны дать положительную оценку для того, чтобы окончательная оценка также была положительной. 'Консенсусная' означает, что количество положительных решений должно превышать количество отрицательных решений. Если количество положительных и отрицательных решений совпадает, окончательное решение будет отрицательным. +authz-policy-decision-strategy-affirmative=Утвердительная +authz-policy-decision-strategy-unanimous=Единогласная +authz-policy-decision-strategy-consensus=Консенсусная +authz-select-a-policy=Выберите политику + +# Authz Role Policy Detail +authz-add-role-policy=Добавить роль политики +authz-no-roles-assigned=Нет назначенных ролей. +authz-policy-role-realm-roles.tooltip=Задайте роли *realm*, допущенные этой политикой. +authz-policy-role-clients.tooltip=Выберите клиента в порядке, необходимом для фильтра клиентских ролей, которые могут быть применены к этой политике. +authz-policy-role-client-roles.tooltip=Задайте роли клиента, допущенные этой политикой. + +# Authz User Policy Detail +authz-add-user-policy=Добавить политику пользователей +authz-no-users-assigned=Нет назначенных пользователей. +authz-policy-user-users.tooltip=Задайте, какие пользователи допущены этой политикой. + +# Authz Client Policy Detail +authz-add-client-policy=Добавить политику клиента +authz-no-clients-assigned=Нет назначенных клиентов. +authz-policy-client-clients.tooltip=Задайте, какие клиенты допущеный этой политикой. + +# Authz Time Policy Detail +authz-add-time-policy=Добавить политики времени +authz-policy-time-not-before.tooltip=Определете время, до наступления которого политика НЕ ДОЛЖНА быть разрешена. Разрешено только если текущее время/дата больше или равны заданному значению. +authz-policy-time-not-on-after=Не после +authz-policy-time-not-on-after.tooltip=Определяет время, после которого политика НЕ ДОЛЖНА быть разрешена. Разрешено только если текущее время/дата менеьше или равны заданному значению. +authz-policy-time-day-month=День месяца +authz-policy-time-day-month.tooltip=Определяет день месяца, в который политика ДОЛЖНА быть разрешена. Вы также можете определить диапазон, заполнив второе поле. В этом случае разрешение выдается только если текущий день месяца равен или находится между заданными значениями. +authz-policy-time-month=Месяц +authz-policy-time-month.tooltip=Определяет месяц, в который политика ДОЛЖНА быть разрешена. Вы также можете определить диапазон, заполнив второе поле. В этом случае разрешение выдается только если текущий месяц равен или находится между заданными значениями. +authz-policy-time-year=Год +authz-policy-time-year.tooltip=Определяет год, в который политика ДОЛЖНА быть разрешена. Вы также можете определить диапазон, заполнив второе поле. В этом случае разрешение выдается только если текущий год равен или находится между заданными значениями. +authz-policy-time-hour=Час +authz-policy-time-hour.tooltip=Определяет час, в который политика ДОЛЖНА быть разрешена. Вы также можете определить диапазон, заполнив второе поле. В этом случае разрешение выдается только если текущий час равен или находится между заданными значениями. +authz-policy-time-minute=Минута +authz-policy-time-minute.tooltip=Определяет минуту, в которую политика ДОЛЖНА быть разрешена. Вы также можете определить диапазон, заполнив второе поле. В этом случае разрешение выдается только если текущая минута равна или находится между заданными значениями. + +# Authz Drools Policy Detail +authz-add-drools-policy=Добавить правила политики +authz-policy-drools-maven-artifact-resolve=Разрешить +authz-policy-drools-maven-artifact=Maven артифакт политики +authz-policy-drools-maven-artifact.tooltip=Maven GAV, указывающий на артифакт, из которого должны будут загружены правила. Определив GAV, Вы можете нажать *Разрешить*, чтобы заполнить *Модуль* и *Сессия* поля. +authz-policy-drools-module=Модуль +authz-policy-drools-module.tooltip=Модуль, используемый этой политикой. Вам необходимо предоставить модуль в порядке выбора конкретной сессии, из которой будут загружены правила. +authz-policy-drools-session=Сессия +authz-policy-drools-session.tooltip=Сессия, используемая этой политикой. Сессия предоставляет все правила для оценок при обработке политики. +authz-policy-drools-update-period=Период обновлений +authz-policy-drools-update-period.tooltip=Определите интервал для поиска обновлений артефакта. + +# Authz JS Policy Detail +authz-add-js-policy=Добавить политику JavaScript +authz-policy-js-code=Код +authz-policy-js-code.tooltip=Код JavaScript, предоставляющий условия для этой политики. + + +# Authz Aggregated Policy Detail +authz-aggregated=Совокупная +authz-add-aggregated-policy=Добавить совокупную политику + +# Authz Permission List +authz-no-permissions-available=Нет доступных разрешений. + +# Authz Permission Detail +authz-permission-name.tooltip=Имя этого разрешения. +authz-permission-description.tooltip=Описание этого разрешения. + +# Authz Resource Permission Detail +authz-add-resource-permission=Добавить разрешение ресурса +authz-permission-resource-apply-to-resource-type=Применить к типу ресурса +authz-permission-resource-apply-to-resource-type.tooltip=Определяет, будет ли это разрешение будет применено ко всем ресурсам с данным типом. В этом случае это разрешение будет вычисляться для всех экземпляров с заданным типом ресурса. +authz-permission-resource-resource.tooltip=Определяет, что это разрешение должно быть применено к конкретному экземпляру ресурсов. +authz-permission-resource-type.tooltip=Определяет, что это разрешение должно быть применено ко всем экземплярам ресурсов заданного типа. + +# Authz Scope Permission Detail +authz-add-scope-permission=Добавить разрешение области +authz-permission-scope-resource.tooltip=Ограничевает области, с которыми связан выбранный ресурс. Если не выбрано, все области будут доступны. +authz-permission-scope-scope.tooltip=Определяет, что разрешение должно быть применено к одной или нескольким областям. + +# Authz Evaluation +authz-evaluation-identity-information=Идентичность данных +authz-evaluation-identity-information.tooltip=Доступные области для конфигурации идентичных данных будут использованы при оценке политик. +authz-evaluation-client.tooltip=Выберите клиента, осуществляющего авторизационный запрос. Если не задан, авторизационные запросы будут основаны на том клиенте, в котором вы находитесь. +authz-evaluation-user.tooltip=Выберите пользователя, идентификационные данные которого будут использованы для запроса разрешений с сервера. +authz-evaluation-role.tooltip=Выберите роли, которые вы хотите связать с выбранным пользователем. +authz-evaluation-new=Новая оценка +authz-evaluation-re-evaluate=Переоценить +authz-evaluation-previous=Предыдущая оценка +authz-evaluation-contextual-info=Контекстная информация +authz-evaluation-contextual-info.tooltip=Достуные опции для конфигурации контекстной информации, которая будет использована при оценке политик. +authz-evaluation-contextual-attributes=Контекстные аттрибуты +authz-evaluation-contextual-attributes.tooltip=Любой аттрибут определяется запущенным окружением или контекстом исполнения. +authz-evaluation-permissions.tooltip=Доступные опции для конфигурации разрешений, к которым будет применяться политика. +authz-evaluation-evaluate=Оценка +authz-evaluation-any-resource-with-scopes=Любой ресурс с областью(ями) +authz-evaluation-no-result=Не удалось получить какой-либо результат для данного запроса авторизации. Проверьте, связаны ли назначенные ресурс(ы) или область(и) с какой-либо политикой. +authz-evaluation-no-policies-resource=Не найдено политик для этого ресурса. +authz-evaluation-result.tooltip=Общий результат для этого запроса разрешений. +authz-evaluation-scopes.tooltip=Список разрешенных областей. +authz-evaluation-policies.tooltip=Подробнее о том, какие политики были расчитаны и их разрешения. +authz-evaluation-authorization-data=Ответ +authz-evaluation-authorization-data.tooltip=Предоставляет токен, содержащий авторизационные данные как результат обработки авторизационного запроса. Это представление преимущественно отображает как Keycloak отвечает на запросы клиентов об авторизации. Проверьте требования 'авторизации' для тех разрешений, которые были выданы на основе текущего авторизационного запроса. +authz-show-authorization-data=Показать авторизационные данные + + +keys=Ключи +all=Все +status=Статус +keystore=Хранилище ключей +keystores=Хранилища ключей +add-keystore=Добавить хранилище ключей +add-keystore.placeholder=Добавить хранилище ключей... +view=Смотреть +active=Активные + +Sunday=Воскресенье +Monday=Понедельник +Tuesday=Вторник +Wednesday=Среда +Thursday=Четверг +Friday=Пятница +Saturday=Суббота + +user-storage-cache-policy=Настройки кэширования +userStorage.cachePolicy=Политики кэширования +userStorage.cachePolicy.option.DEFAULT=DEFAULT +userStorage.cachePolicy.option.EVICT_WEEKLY=EVICT_WEEKLY +userStorage.cachePolicy.option.EVICT_DAILY=EVICT_DAILY +userStorage.cachePolicy.option.MAX_LIFESPAN=MAX_LIFESPAN +userStorage.cachePolicy.option.NO_CACHE=NO_CACHE +userStorage.cachePolicy.tooltip=Политики кэширования для этого поставщика хранения. 'DEFAULT' представляет настройки по-умолчанию для глобального пользовательского кэша. 'EVICT_DAILY' время каждого дня, после которого пользовательский кэш инвалидируется. 'EVICT_WEEKLY' день и время недели после которого пользовательский кэш инвалидируется. 'MAX-LIFESPAN' время в миллисекундах, в течение которого будет существовать жизненный цикл записи в кэше. +userStorage.cachePolicy.evictionDay=День исключения +userStorage.cachePolicy.evictionDay.tooltip=День недели в который запись станет недействительной и будет исключена из кэша. +userStorage.cachePolicy.evictionHour=Час исключения +userStorage.cachePolicy.evictionHour.tooltip=Час дня, в который запись станет недействительной. +userStorage.cachePolicy.evictionMinute=Минута исключения +userStorage.cachePolicy.evictionMinute.tooltip=Минута дня, в которую запись станет недействительной. +userStorage.cachePolicy.maxLifespan=Максимальное время жизни +userStorage.cachePolicy.maxLifespan.tooltip=Максимальное время жизни записи пользовательсткого кэша в секундах. +user-origin-link=Источник хранилища +user-origin.tooltip=UserStorageProvider из которого был загружен пользователь +user-link.tooltip=UserStorageProvider из которого был импортирован локально сохраненный пользователь. + +disable=Отключено +disableable-credential-types=Отключаемые типы +credentials.disableable.tooltip=Список типов учетных данных, которые Вы можете отключить +disable-credential-types=Отключить типы учетных данных +credentials.disable.tooltip=Нажмите кнопку для отключения типов учетных данных +credential-types=Типы учетных данных +manage-user-password=Управление паролями +disable-credentials=Отключить учетные данные +credential-reset-actions=Сброс учетных данных +ldap-mappers=Сопоставления LDAP +create-ldap-mapper=Создать LDAP сопоставление diff --git a/admin/messages/admin-messages_zh_CN.properties b/admin/messages/admin-messages_zh_CN.properties new file mode 100644 index 0000000..b2b6a4a --- /dev/null +++ b/admin/messages/admin-messages_zh_CN.properties @@ -0,0 +1,1228 @@ +# encoding: utf-8 +consoleTitle=Keycloak管理界面 + +# Common messages +enabled=开启 +name=名称 +displayName=显示名称 +displayNameHtml=HTML 显示名称 +save=保存 +cancel=取消 +onText=开 +offText=关 +client=客户端 +clients=客户端 +clear=清除 +selectOne=选择一个... + +true=是 +false=否 + +endpoints=服务路径 + +# Realm settings +realm-detail.enabled.tooltip=只有当域启用时,用户和客户程序才能访问 +realm-detail.oidc-endpoints.tooltip=显示openID connect服务路径的配置 +registrationAllowed=用户注册 +registrationAllowed.tooltip=开启/关闭注册页面,注册页面的链接也会显示在登录页面 +registrationEmailAsUsername=Email当做用户名 +registrationEmailAsUsername.tooltip=当开启时注册表单的用户名域会被隐藏而且Email会作为新用户的用户名 +editUsernameAllowed=编辑用户名 +editUsernameAllowed.tooltip=如果开启,用户名域是可以编辑的。否则用户名域是只读的。 +resetPasswordAllowed=忘记密码 +resetPasswordAllowed.tooltip=当用户忘记他们的密码时,在登录界面显示一个连接给用户点击。 +rememberMe=记住我 +rememberMe.tooltip=显示一个选择框来让用户在重启浏览器时仍然处于登录状态,直到会话过期。 +verifyEmail=验证email +verifyEmail.tooltip=要求用户在首次登录时验证他们的邮箱。 +sslRequired=需要SSL +sslRequired.option.all=所有请求 +sslRequired.option.external=外部请求 +sslRequired.option.none=无 +sslRequired.tooltip=是否需要HTTPS?‘无’代表对于任何客户端IP地址都不需要HTTPS,‘外部请求’代表localhost和私有ip地址可以不通过https访问,‘所有请求’代表所有IP地址都需要通过https访问。 +publicKey=公有秘钥 +privateKey=私有秘钥 +gen-new-keys=生成新秘钥 +certificate=证书 +host=主机 +smtp-host=SMTP 主机 +port=端口号 +smtp-port=SMTP 端口号(默认25) +from=来自 +sender-email-addr=邮件发送者email地址 +enable-ssl=启用 SSL +enable-start-tls=启用 StartTLS +enable-auth=启用认证 +username=用户名 +login-username=登录用户名 +password=密码 +login-password=登录密码 +login-theme=登录主题 +login-theme.tooltip=为登录、授权、注册、忘记密码界面选择页面主题 +account-theme=账户主题 +account-theme.tooltip=为用户管理界面选择主题 +admin-console-theme=管理员控制台主题 +select-theme-admin-console=为管理员控制台选择主题 +email-theme=邮件主题 +select-theme-email=为服务器发送的邮件选择主题 +i18n-enabled=启用国际化 +supported-locales=支持的语言 +supported-locales.placeholder=输入一个locale并按回车 +default-locale=默认语言 +realm-cache-clear=域缓存 +realm-cache-clear.tooltip=从域缓存中清理所有条目(这会清理所有域的条目) +user-cache-clear=用户缓存 +user-cache-clear.tooltip=清理用户缓存的所有条目(这会清理所有域中的条目) +revoke-refresh-token=收回 Refresh Token +revoke-refresh-token.tooltip=如果开启 refresh tokens只能使用一次,否则refresh token不会被收回并且可以使用多次 +sso-session-idle=SSO会话空闲时间 +seconds=秒 +minutes=分 +hours=小时 +days=天 +sso-session-max=SSO会话最长时间 +sso-session-idle.tooltip=设置会话在过期之前可以空闲的时间长度,当会话过期时 Token 和浏览器会话都会被设置为无效。 +sso-session-max.tooltip=会话的最大时间长度,当会话过期时 Token 和浏览器会话都会被设置为无效。 +offline-session-idle=离线会话的空闲时间 +offline-session-idle.tooltip=离线会话允许的空闲时间。你需要使用离线Token在这段时间内至少刷新一次否则会话就会过期 +access-token-lifespan=Access Token 有效期 +access-token-lifespan.tooltip=access token最长有效时间,这个值推荐要比SSO超时要短一些。 +access-token-lifespan-for-implicit-flow =隐式流的访问令牌生命周期 +access-token-lifespan-for-implicit-flow.tooltip =在OpenID连接隐式流期间发出的访问令牌到期之前的最长时间。建议该值小于SSO超时。没有可能在隐式流期间刷新令牌,这就是为什么有单独的超时不同于“访问令牌寿命”。 +client-login-timeout =客户端登录超时 +client-login-timeout.tooltip =客户端必须完成访问令牌协议的最大时间。这通常是1分钟。 +login-timeout =登录超时 +login-timeout.tooltip =用户必须完成登录的最长时间。这建议比较长。 30分钟以上。 +login-action-timeout =登录操作超时 +login-action-timeout.tooltip =用户必须完成登录相关操作(如更新密码或配置totp)的最长时间。这建议比较长。 5分钟以上。 +headers =标题 +brute-force-detection=强力检测 +x-frame-options = X-Frame-Options +x-frame-options-tooltip =默认值阻止通过非源iframe包含页面(单击标签了解更多信息) +content-sec-policy = Content-Security-Policy +content-sec-policy-tooltip =默认值阻止通过非源iframe包含网页(点击标签了解更多信息) +content-type-options = X-Content-Type-Options +content-type-options-tooltip =默认值阻止Internet Explorer和Google Chrome从已声明的内容类型中嗅探响应(点击标签了解更多信息) +max-login-failures =最大登录失败 +max-login-failures.tooltip =触发等待之前的失败次数。 +wait-increment =等待增量 +wait-increment.tooltip =当满足故障阈值时,用户应该锁定多长时间? +quick-login-check-millis =快速登录检查Milli秒 +quick-login-check-millis.tooltip =如果故障同时发生太快,则锁定用户。 +min-quick-login-wait =最小快速登录等待 +min-quick-login-wait.tooltip =快速登录失败后等待多长时间。 +max-wait = Max Wait +max-wait.tooltip =用户将被锁定的最长时间。 +failure-reset-time =故障复位时间 +failure-reset-time.tooltip =何时将故障计数复位? +realm-tab-login=登录 +realm-tab-keys=秘钥 +realm-tab-email=Email +realm-tab-themes=主题 +realm-tab-cache=缓存 +realm-tab-tokens=Tokens +realm-tab-client-registration=客户端注册 +realm-tab-security-defenses=安全防护 +realm-tab-general=通用 +add-realm=添加域 + +#Session settings +realm-sessions=域会话 +revocation=回收 +logout-all=登出所有 +active-sessions=活跃的会话 +sessions=会话 +not-before=不早于 +not-before.tooltip=回收早于日期授予的token +set-to-now=设置到现在 +push=推送 +push.tooltip=对于每个拥有管理员权限的用户,通知他们新的回收策略 +#Protocol Mapper +usermodel.prop.label=属性 +usermodel.prop.tooltip=UserModel 接口中属性方法的名字. 例如, 'email' 会引用UserModel.getEmail() 方法. +usermodel.attr.label=用户属性 +usermodel.attr.tooltip=在UserModel.attribute映射中定义的存储的用户属性名。 +userSession.modelNote.label=用户会话标记 +userSession.modelNote.tooltip=用户会话标记在 UserSessionModel.note映射中的属性名。 +multivalued.label=多值的 +multivalued.tooltip=表示此值是否支持多值.如果为真,所有值会设置为已知。如果为假,只有第一个值是已知。 +selectRole.label=选择角色 +selectRole.tooltip=在左边文本框输入角色或点击这个按钮浏览并选择您想要的角色。 +tokenClaimName.label=Token申请名 +tokenClaimName.tooltip=token中加入的申请者名. 这可以是个完整的分级信息例如 'address.street'. 这种情况下,会生成一个复杂的json回复 +jsonType.label=申请 JSON 的类型 +jsonType.tooltip=用来展现申请的JSON 类型 long, int, boolean, 和 String 是有效值 +includeInIdToken.label =添加到ID令牌 +includeInIdToken.tooltip =是否应将声明添加到ID令牌? +includeInAccessToken.label =添加到访问令牌 +includeInAccessToken.tooltip =是否应该将声明添加到访问令牌? +includeInUserInfo.label =添加到userinfo +includeInUserInfo.tooltip =是否应该将声明添加到userinfo? +usermodel.clientRoleMapping.clientId.label =客户端ID +usermodel.clientRoleMapping.clientId.tooltip =角色映射的客户端ID +usermodel.clientRoleMapping.rolePrefix.label =客户端角色前缀 +usermodel.clientRoleMapping.rolePrefix.tooltip =每个客户端角色的前缀(可选)。 +usermodel.realmRoleMapping.rolePrefix.label = Realm角色前缀 +usermodel.realmRoleMapping.rolePrefix.tooltip =每个领域角色的前缀(可选)。 +sectorIdentifierUri.label =扇区标识符URI +sectorIdentifierUri.tooltip =使用成对子值和支持的提供程序动态客户端注册应使用sector_identifier_uri参数。它为一组在共同管理控制下的网站提供了一种独立于各个域名的具有一致的成对子值的方法。它还为客户端更改redirect_uri域而不必重新注册其所有用户提供了一种方法。 +pairwiseSubAlgorithmSalt.label = Salt +pairwiseSubAlgorithmSalt.tooltip =计算成对主体标识符时使用的盐。如果留空,将产生盐。 + + + +# client details +clients.tooltip=客户端是域中受信任的应用程序和web应用. 这些程序可以发起登录.您也可以定义应用的角色。 +search.placeholder=搜索... +create=创建 +import=导入 +client-id=客户端 ID +base-url=根 URL +actions=操作 +not-defined=未定义 +edit=编辑 +delete=删除 +no-results=无记录 +no-clients-available=无可用客户 +add-client=添加客户端 +select-file=选择文件 +view-details=查看详情 +clear-import=清除导入 +client-id.tooltip =指定在URI和令牌中引用的ID。例如“my-client”。对于SAML,这也是authn请求的预期发放者值 +client.name.tooltip =指定客户端的显示名称。例如“我的客户端”。支持本地化值的键。例如\\uff1a$ {my_client} +client.enabled.tooltip =禁用客户端无法启动登录或获取访问令牌。 +consent-required =同意必需 +consent-required.tooltip =如果已启用的用户必须同意客户端访问。 +client-protocol =客户端协议 +client-protocol.tooltip ='OpenID connect'允许客户端基于授权服务器执行的认证来验证最终用户的身份。'SAML'启用基于Web的身份验证和授权方案,包括跨域单点登录(SSO),并使用包含断言的安全令牌传递信息。 +access-type =访问类型 +access-type.tooltip ='机密'客户端需要一个秘密启动登录协议。 “公共”客户不需要一个秘密。 “仅承载”客户端是从不启动登录的Web服务。 +standard-flow-enabled =启用标准流程 +standard-flow-enabled.tooltip =这使标准的基于OpenID Connect重定向的身份验证与授权码。根据OpenID Connect或OAuth2规范,这将支持此客户端的“授权代码流”。 +implicit-flow-enabled =启用隐式流 +implicit-flow-enabled.tooltip =这启用对无授权代码的基于OpenID Connect重定向的身份验证的支持。根据OpenID Connect或OAuth2规范,这将支持此客户端的“隐式流”。 +direct-access-grants-enabled =启用直接访问授权 +direct-access-grants-enabled.tooltip =这启用对直接访问授权的支持,这意味着客户端可以访问用户的用户名/密码,并直接与Keycloak服务器交换访问令牌。在OAuth2规范方面,这允许支持此客户端的“资源所有者密码凭据授权”。 +service-accounts-enabled =启用服务帐户 +service-accounts-enabled.tooltip =允许您向Keycloak验证此客户端并检索专用于此客户端的访问令牌。在OAuth2规范方面,这将支持此客户端的“客户端凭据授予”。 +include-authnstatement = Include AuthnStatement +include-authnstatement.tooltip =是否应该在登录响应中包含指定方法和时间戳的语句? +sign-documents =签署文件 +sign-documents.tooltip = SAML文档是否应该由领域签名? +sign-documents-redirect-enable-key-info-ext =优化REDIRECT签名密钥查找 +sign-documents-redirect-enable-key-info-ext.tooltip =在由Keycloak适配器保护的SP的REDIRECT绑定中签名SAML文档时,如果签名密钥的ID包含在元素中的SAML协议消息中?这将优化签名的验证,因为验证方使用单个密钥,而不是尝试每个已知密钥进行验证。 +sign-assertions =符号断言 +sign-assertions.tooltip = SAML文档中的断言是否应该签名?如果文档已签署,则不需要此设置。 +signature-algorithm =签名算法 +signature-algorithm.tooltip =用于签署文档的签名算法。 +canonicalization-method =规范化方法 +canonicalization-method.tooltip = XML签名的规范化方法。 +encrypt-assertions =加密断言 +encrypt-assertions.tooltip =是否应使用AES通过客户端的公钥对SAML断言进行加密? +client-signature-required =需要客户端签名 +client-signature-required.tooltip =客户端是否签署了saml请求和响应?他们应该验证吗? +force-post-binding =强制POST绑定 +force-post-binding.tooltip =始终对POST响应使用POST绑定。 +front-channel-logout =前通道注销 +front-channel-logout.tooltip =当为true时,注销需要浏览器重定向到客户端。当为false时,服务器对注销执行后台调用。 +force-name-id-format =强制名称ID格式 +force-name-id-format.tooltip =忽略请求的NameID主题格式并使用管理控制台配置的。 +name-id-format =名称ID格式 +name-id-format.tooltip =要用于主题的名称ID格式。 +root-url =根URL +root-url.tooltip =附加到相对URL的根URL +valid-redirect-uris =有效的重定向URI +valid-redirect-uris.tooltip =浏览器可以在成功登录或注销后重定向到的有效URI模式。允许使用简单通配符,即“http://example.com/*”。也可以指定相对路径,即/ my / relative / path / *。相对路径是相对于客户端根URL的,如果没有指定,则使用auth服务器根URL。对于SAML,如果您依赖嵌入登录请求的使用者服务URL,则必须设置有效的URI模式。 +base-url.tooltip =当auth服务器需要重定向或链接回客户端时使用的默认URL。 +admin-url =管理员网址 +admin-url.tooltip =客户端管理界面的URL。如果客户端支持适配器REST API,请设置此选项。此REST API允许auth服务器推送吊销策略和其他管理任务。通常将此设置为客户端的基本URL。 +master-saml-processing-url =主SAML处理URL +master-saml-processing-url.tooltip =如果配置,此URL将用于每次绑定到SP的断言使用者和单一注销服务。这可以对细粒度SAML端点配置中的每个绑定和服务单独进行覆盖。 +idp-sso-url-ref = IDP发起的SSO URL名称 +idp-sso-url-ref.tooltip =当您想要进行IDP发起的SSO时,引用客户端的URL片段名称。留下此空将禁用IDP启动的SSO。您将从浏览器引用的URL为:{server-root} / realms / {realm} / protocol / saml / clients / {client-url-name} +idp-sso-relay-state = IDP发起的SSO中继状态 +idp-sso-relay-state.tooltip =当您想要执行IDP发起的SSO时,要使用SAML请求发送的中继状态。 +web-origins = Web起源 +web-origins.tooltip =允许的CORS起点。要允许有效重定向URI的所有来源,请添加“+”。允许所有起点添加'*'。 +fine-oidc-endpoint-conf = Fine Grain OpenID连接配置 +fine-oidc-endpoint-conf.tooltip =展开此部分以配置与OpenID Connect协议相关的此客户端的高级设置 +user-info-signed-response-alg =用户信息签名的响应算法 +user-info-signed-response-alg.tooltip =用于签名的用户信息端点响应的JWA算法。如果设置为“unsigned”,则用户信息响应将不会被签名,并将以application / json格式返回。 +request-object-signature-alg =请求对象签名算法 +request-object-signature-alg.tooltip = JWA算法,客户端在发送由'request'或'request_uri'参数指定的OIDC请求对象时需要使用。如果设置为“any”,则Request对象可以由任何算法(包括“none”)签名。 +fine-saml-endpoint-conf =细粒度SAML端点配置 +fine-saml-endpoint-conf.tooltip =展开此部分以配置Assertion Consumer和单一注销服务的确切URL。 +assertion-consumer-post-binding-url =断言使用者服务POST绑定URL +assertion-consumer-post-binding-url.tooltip = SAML POST绑定客户端断言使用者服务的URL(登录响应)。如果您没有此绑定的URL,则可以将此字段留空。 +assertion-consumer-redirect-binding-url =断言使用者服务重定向绑定URL +assertion-consumer-redirect-binding-url.tooltip = SAML重定向客户端断言使用者服务的绑定URL(登录响应)。如果您没有此绑定的URL,则可以将此字段留空。 +logout-service-post-binding-url =注销服务POST绑定URL +logout-service-post-binding-url.tooltip = SAML POST绑定客户端单一注销服务的URL。如果使用不同的绑定,则可以将此留空 +logout-service-redir-binding-url =注销服务重定向绑定URL +logout-service-redir-binding-url.tooltip = SAML重定向客户端单一注销服务的绑定URL。如果使用不同的绑定,则可以将此留空。 + +#client import +import-client =导入客户端 +format-option =格式选项 +select-format =选择格式 +import-file =导入文件 + +#client tabs +settings =设置 +credentials =凭据 +saml-keys = SAML键 +roles =角色 +mappers = Mappers +mappers.tooltip =协议映射器对令牌和文档执行转换。他们可以做一些事情,例如将用户数据映射到协议声明中,或者只是转换客户端和身份验证服务器之间的任何请求。 +scope =作用域 +scope.tooltip =作用域映射允许您限制哪些用户角色映射包含在客户端请求的访问令牌中。 +sessions.tooltip =查看此客户端的活动会话。允许您查看哪些用户处于活动状态,以及他们何时登录。 +offline-access =离线访问 +offline-access.tooltip =查看此客户端的离线会话。允许您查看哪些用户检索离线令牌以及何时检索离线令牌。要撤销客户端的所有令牌,请转到撤销选项卡,并将不早于值设置到现在。 +clustering =聚类 +installation =安装 +installation.tooltip =用于生成各种客户端适配器配置格式的帮助程序实用程序,您可以下载或剪切和粘贴以配置您的客户端。 +service-account-roles =服务帐户角色 +service-account-roles.tooltip =允许您为专用于此客户端的服务帐户验证角色映射。 + +# client credentials +client-authenticator =客户端认证器 +client-authenticator.tooltip =客户端身份验证器用于认证此客户端对Keycloak服务器 +certificate.tooltip =客户端发出的验证JWT的客户端证书,由客户端私钥从您的密钥库签名。 +publicKey.tooltip =由客户端发出并由客户端私钥签署的validate JWT的公钥。 +no-client-certificate-configured =未配置客户端证书 +gen-new-keys-and-cert =生成新密钥和证书 +import-certificate =导入证书 +gen-client-private-key =生成客户端私钥 +generate-private-key =生成私钥 +kid =孩子 +kid.tooltip =来自导入的JWKS的客户端公钥的KID(密钥ID)。 +use-jwks-url =使用JWKS URL +use-jwks-url.tooltip =如果开关打开,那么将从给定的JWKS URL下载客户端公钥。这允许很大的灵活性,因为当客户端生成新的密钥对时,新密钥将总是重新下载。如果交换机关闭,则使用来自Keycloak DB的公钥(或证书),因此当客户端密钥更改时,您总是需要将新密钥(或证书)导入到Keycloak数据库。 +jwks-url = JWKS URL +jwks-url.tooltip =存储JWK格式的客户端密钥的URL。有关更多详细信息,请参阅JWK规范。如果您使用带有“jwt”凭据的keycloak客户端适配器,那么您可以使用带有'/ k_jwks'后缀的应用程序的URL。例如“http://www.myhost.com/myapp/k_jwks”。 +archive-format =归档格式 +archive-format.tooltip = Java密钥库或PKCS12归档格式。 +key-alias =密钥别名 +key-alias.tooltip =存档您的私钥和证书的别名。 +key-password =密钥密码 +key-password.tooltip =访问存档中私钥的密码 +store-password =存储密码 +store-password.tooltip =访问归档本身的密码 +generate-and-download =生成和下载 +client-certificate-import =客户端证书导入 +import-client-certificate =导入客户端证书 +jwt-import.key-alias.tooltip =您的证书的归档别名。 +secret =秘密 +regenerate-secret =重生秘密 +registrationAccessToken =注册访问令牌 +registrationAccessToken.regenerate =重新生成注册访问令牌 +registrationAccessToken.tooltip =注册访问令牌为客户端提供对客户端注册服务的访问。 +add-role =添加角色 +role-name =角色名称 +composite = Composite +description =描述 +no-client-roles-available =没有可用的客户端角色 +scope-param-required = Scope Param必需 +scope-param-required.tooltip =只有在授权/令牌请求期间使用具有角色名称的scope参数时,才会授予此角色。 +composite-roles =复合角色 +composite-roles.tooltip =当将此角色(un)分配给用户时,与其关联的任何角色将被隐式分配(un)。 +realm-roles = Realm角色 +available-roles =可用角色 +add-selected =添加选择 +associated-roles =关联角色 +composite.associated-realm-roles.tooltip =与此组合角色关联的领域级角色。 +composite.available-realm-roles.tooltip =您可以关联到此组合角色的领域级角色。 +remove-selected =删除所选项 +client-roles =客户端角色 +select-client-to-view-roles =选择客户端以查看客户端的角色 +available-roles.tooltip =您可以与此组合角色关联的来自此客户端的角色。 +client.associated-roles.tooltip =与此组合角色关联的客户端角色。 +add-builtin =添加内置 +category = Category +type = Type +no-mappers-available =没有可用的映射器 +add-builtin-protocol-mappers =添加内置协议映射器 +add-builtin-protocol-mapper =添加内置协议映射器 +scope-mappings =范围映射 +full-scope-allowed =允许的全范围 +full-scope-allowed.tooltip =允许您禁用所有限制。 +scope.available-roles.tooltip =可以分配到范围的领域级角色。 +assigned-roles =分配的角色 +assigned-roles.tooltip =分配给范围的领域级角色。 +effective-roles =有效角色 +realm.effective-roles.tooltip =可能已从组合角色继承的分配的领域级角色。 +select-client-roles.tooltip =选择客户端以查看客户端的角色 +assign.available-roles.tooltip =可分配的客户端角色。 +client.assigned-roles.tooltip =分配的客户端角色。 +client.effective-roles.tooltip =可能已从组合角色继承的分配的客户端角色。 +basic-configuration =基本配置 +node-reregistration-timeout =节点重新注册超时 +node-reregistration-timeout.tooltip =指定注册的客户端群集节点重新注册的最大时间的间隔。如果集群节点在此时间内不会向Keycloak发送重新注册请求,则它将从Keycloak注销 +registered-cluster-nodes =注册的集群节点 +register-node-manually =手动注册节点 +test-cluster-availability =测试集群可用性 +last-registration =最后一次注册 +node-host =节点主机 +no-registered-cluster-nodes =没有注册的集群节点可用 +cluster-nodes =集群节点 +add-node =添加节点 +active-sessions.tooltip =此客户端的活动用户会话的总数。 +show-sessions =显示会话 +show-sessions.tooltip =警告,这是一个潜在昂贵的操作,取决于活动会话的数量。 +user =用户 +from-ip =从IP +session-start =会话开始 +first-page=第一页 +previous-page=上一页 +next-page =下一页 +client-revoke.not-before.tooltip =撤销此客户端在此日期之前发出的任何令牌。 +client-revoke.push.tooltip =如果为此客户端配置了管理URL,请将此策略推送到该客户端。 +select-a-format =选择格式 +download=下载 +offline-tokens =脱机令牌 +offline-tokens.tooltip =此客户端的脱机令牌的总数。 +show-offline-tokens =显示脱机令牌 +show-offline-tokens.tooltip =警告,这是一个潜在的昂贵的操作,取决于脱机令牌的数量。 +token-issued =发出的令牌 +last-access=最后访问 +last-refresh =上次刷新 +key-export =密钥导出 +key-import =密钥导入 +export-saml-key =导出SAML密钥 +import-saml-key =导入SAML密钥 +realm-certificate-alias =域证书别名 +realm-certificate-alias.tooltip = Realm证书也存储在归档中。这是它的别名。 +signing-key =签名密钥 +saml-signing-key = SAML签名密钥。 +private-key =私钥 +generate-new-keys =生成新密钥 +export =导出 +encryption-key =加密密钥 +saml-encryption-key.tooltip = SAML加密密钥。 +service-accounts =服务帐户 +service-account.available-roles.tooltip =可以分配给服务帐户的领域级角色。 +service-account.assigned-roles.tooltip =分配给服务帐户的领域级角色。 +service-account-is-not-enabled-for = {{client}}未启用服务帐户 +create-protocol-mappers =创建协议映射器 +create-protocol-mapper =创建协议映射器 +protocol =协议 +protocol.tooltip =协议... +id = ID +mapper.name.tooltip =映射器的名称。 +mapper.consent-required.tooltip =授予临时访问权限时,用户是否同意向客户端提供此数据? +consent-text =同意文本 +consent-text.tooltip =在同意页面上显示的文本。 +mapper-type =映射器类型 +mapper-type.tooltip =映射程序的类型 +# realm identity providers +identity-providers =身份提供者 +table-of-identity-providers =身份提供程序表 +add-provider.placeholder =添加提供程序... +provider =提供程序 +gui-order = GUI顺序 +first-broker-login-flow =第一登录流 +post-broker-login-flow =登录后流程 +redirect-uri =重定向URI +redirect-uri.tooltip =配置身份提供程序时要使用的重定向uri。 +alias =别名 +display-name =显示名称 +identity-provider.alias.tooltip =别名唯一标识身份提供者,它也用于构建重定向uri。 +identity-provider.display-name.tooltip =身份提供者的友好名称。 +identity-provider.enabled.tooltip =启用/禁用此身份提供程序。 +authenticate-by-default =默认验证 +identity-provider.authenticate-by-default.tooltip =指示在显示登录屏幕之前是否应默认尝试此提供程序进行身份验证。 +store-tokens =存储令牌 +identity-provider.store-tokens.tooltip =如果在验证用户后必须存储令牌,则启用/禁用。 +stored-tokens-readable=存储令牌可读 +identity-provider.stored-tokens-readable.tooltip =如果新用户可以读取任何存储的令牌,则启用/禁用。这将分配broker.read-token角色。 +disableUserInfo =禁用用户信息 +identity-provider.disableUserInfo.tooltip =禁用用户信息服务的使用以获取其他用户信息?默认是使用此OIDC服务。 +userIp =使用userIp参数 +identity-provider.google-userIp.tooltip =在Google的用户信息服务上调用时设置'userIp'查询参数。这将使用用户的IP地址。如果Google正在限制对用户信息服务的访问,则此选项非常有用。 +update-profile-on-first-login =首次登录时更新配置文件 +on =开 +on-missing-info =缺少信息 +off =关闭 +update-profile-on-first-login.tooltip =定义用户在首次登录期间必须更新其配置文件的条件。 +trust-email =信任电子邮件 +trust-email.tooltip =如果启用,则此提供商提供的电子邮件不会验证,即使已启用对领域的验证。 +gui-order.tooltip = GUI中提供者的定义顺序的数字(例如,在登录页面上)。 +first-broker-login-flow.tooltip =认证流的别名,在首次使用此身份提供者登录后触发。术语“首次登录”意味着尚未存在与认证身份提供商帐户链接的Keycloak帐户。 +post-broker-login-flow.tooltip =认证流的别名,在每次使用此身份提供程序登录后触发。如果您需要对通过此身份提供程序(例如OTP)验证的每个用户进行额外验证,这将非常有用。如果您不希望在使用此身份提供商登录后触发任何其他验证器,请将此空白留空。还要注意,认证者实现必须假定用户已经在ClientSession中设置为身份提供者已经设置。 +openid-connect-config = OpenID连接配置 +openid-connect-config.tooltip = OIDC SP和外部IDP配置。 +authorization-url =授权URL +authorization-url.tooltip =授权网址。 +token-url =令牌URL +token-url.tooltip =令牌URL。 +logout-url =注销URL +identity-provider.logout-url.tooltip =用于从外部IDP注销用户的会话终结点。 +backchannel-logout = Backchannel注销 +backchannel-logout.tooltip =外部IDP是否支持反向通道注销? +user-info-url =用户信息URL +user-info-url.tooltip =用户信息网址。这是可选的。 +identity-provider.client-id.tooltip =在身份提供者中注册的客户端或客户端标识符。 +client-secret =客户端密钥 +show-secret =显示密码 +hide-secret =隐藏秘密 +client-secret.tooltip =在身份提供程序中注册的客户端或客户端机密。 +issuer =发行人 +issuer.tooltip =响应的发行者的发行者标识符。如果未提供,将不执行验证。 +default-scopes =默认范围 +identity-provider.default-scopes.tooltip =在请求授权时要发送的作用域。它可以是以空格分隔的范围列表。默认为'openid'。 +prompt =提示 +unspecified.option =未指定 +none.option = none +consent.option =同意 +login.option = login +select-account.option = select_account +prompt.tooltip =指定授权服务器是否提示最终用户重新认证和同意。 +validate-signatures =验证签名 +identity-provider.validate-signatures.tooltip =启用/禁用外部IDP签名的签名验证。 +identity-provider.use-jwks-url.tooltip =如果交换机打开,那么将从给定的JWKS URL下载身份提供程序公钥。这允许很大的灵活性,因为当身份提供商生成新的密钥对时,新密钥将总是被重新下载。如果交换机关闭,则使用来自Keycloak DB的公钥(或证书),因此当身份提供商密钥更改时,您始终需要将新密钥导入到Keycloak数据库。 +identity-provider.jwks-url.tooltip =存储JWK格式的身份提供者密钥的URL。有关更多详细信息,请参阅JWK规范。如果你使用外部keycloak身份提供者,那么你可以使用像http:// broker-keycloak:8180 / auth / realms / test / protocol / openid-connect / certs这样的URL,假设你的代理keycloak是运行在http: / broker-keycloak:8180',它的境界是'test'。 +validating-public-key =验证公钥 +identity-provider.validating-public-key.tooltip =必须用于验证外部IDP签名的PEM格式的公钥。 +import-external-idp-config =导入外部IDP配置 +import-external-idp-config.tooltip =允许您从配置文件加载外部IDP元数据或从URL下载它。 +import-from-url =从URL导入 +identity-provider.import-from-url.tooltip =从远程IDP发现描述符导入元数据。 +import-from-file =从文件导入 +identity-provider.import-from-file.tooltip =从下载的IDP发现描述符导入元数据。 +saml-config = SAML配置 +identity-provider.saml-config.tooltip = SAML SP和外部IDP配置。 +single-signon-service-url =单点登录服务URL +saml.single-signon-service-url.tooltip =必须用于发送认证请求(SAML AuthnRequest)的URL。 +single-logout-service-url =单一注销服务URL +saml.single-logout-service-url.tooltip =必须用于发送注销请求的网址。 +nameid-policy-format = NameID策略格式 +nameid-policy-format.tooltip =指定与名称标识符格式相对应的URI引用。默认为urn:oasis:names:tc:SAML:2.0:nameid-format:persistent。 +http-post-binding-response = HTTP-POST绑定响应 +http-post-binding-response.tooltip =指示是否使用HTTP-POST绑定响应请求。如果为false,将使用HTTP-REDIRECT绑定。 +http-post-binding-for-authn-request = HTTP-POST AuthnRequest的绑定 +http-post-binding-for-authn-request.tooltip =指示是否必须使用HTTP-POST绑定发送AuthnRequest。如果为false,将使用HTTP-REDIRECT绑定。 +want-authn-requests-signed =需要AuthnRequests签名 +want-authn-requests-signed.tooltip =指示身份提供者是否期望签署AuthnRequest。 +force-authentication =强制验证 +identity-provider.force-authentication.tooltip =指示身份提供者是否必须直接认证演示者,而不是依赖以前的安全上下文。 +validate-signature =验证签名 +saml.validate-signature.tooltip =启用/禁用SAML响应的签名验证。 +validating-x509-certificate =验证X509证书 +validating-x509-certificate.tooltip =必须用于检查签名的PEM格式的证书。可以输入多个证书,用逗号(,)分隔。 +saml.import-from-url.tooltip =从远程IDP SAML实体描述符导入元数据。 +social.client-id.tooltip =向身份提供者注册的客户机标识符。 +social.client-secret.tooltip =向身份提供者注册的客户端密钥。 +social.default-scopes.tooltip =在请求授权时要发送的作用域。有关可能的值,分隔符和默认值,请参阅文档。 +key = Key +stackoverflow.key.tooltip =从Stack Overflow客户端注册获取的密钥。 + +# User federation +sync-ldap-roles-to-keycloak =将LDAP角色同步到Keycloak +sync-keycloak-roles-to-ldap =同步Keycloak到LDAP的角色 +sync-ldap-groups-to-keycloak =将LDAP组同步到Keycloak +sync-keycloak-groups-to-ldap =同步Keycloak组到LDAP + +realms =领域 +realm = Realm + +identity-provider-mappers =身份提供者映射器 +create-identity-provider-mapper =创建身份提供者映射器 +add-identity-provider-mapper =添加身份提供者映射器 +client.description.tooltip =指定客户端的描述。例如“我的客户端的时间表”。支持本地化值的键。例如\\uff1a$ {my_client_description} + +expires =到期 +expiration =到期 +expiration.tooltip =指定令牌有效的时间 +count = Count +count.tooltip =指定可以使用令牌创建多少个客户端 +remainingCount =剩余计数 +created =已创建 +back =返回 +initial-access-tokens=初始接入令牌 +add-initial-access-tokens =添加初始访问令牌 +initial-access-token=初始接入令牌 +initial-access.copyPaste.tooltip =在导航离开此页面之前复制/粘贴初始访问令牌,因为它不可能稍后检索 +continue =继续 +initial-access-token.confirm.title =复制初始访问令牌 +initial-access-token.confirm.text =在确认之前,请复制并粘贴初始访问令牌,因为以后无法检索 +no-initial-access-available =没有初始访问令牌可用 + +client-reg-policies =客户端注册策略 +client-reg-policy.name.tooltip =显示策略的名称 +anonymous-policies =匿名访问策略 +anonymous-policies.tooltip =当客户端注册服务由未经身份验证的请求调用时,使用这些策略。这意味着请求不包含初始接入令牌或承载令牌。 +auth-policies =验证的访问策略 +auth-policies.tooltip =当通过认证请求调用客户端注册服务时使用这些策略。这意味着请求包含初始接入令牌或承载令牌。 +policy-name =策略名称 +no-client-reg-policies-configured =无客户端注册策略 +trusted-hosts.label =受信任的主机 +trusted-hosts.tooltip =主机列表,它们是受信任的,并且允许调用客户端注册服务和/或用作客户端URI的值。您可以使用主机名或IP地址。如果您在开头使用星号(例如“* .example.com”),则整个域example.com将受信任。 +host-sending-registration-request-must-match.label =主机发送客户端注册请求必须匹配 +host-sending-registration-request-must-match.tooltip =如果开启,则只要客户端注册服务是从某个受信任的主机或域发送的,就允许任何请求。 +client-uris-must-match.label =客户端URI必须匹配 +client-uris-must-match.tooltip =如果启用,则所有客户端URI(重定向URI和其他)只有在它们匹配一些受信任的主机或域时才允许。 +allowed-protocol-mappers.label =允许的协议映射器 +allowed-protocol-mappers.tooltip =允许的协议映射器提供程序的白名单。如果尝试注册客户端,其中包含一些未列入白名单的协议映射器,则注册请求将被拒绝。 +consent-required-for-all-mappers.label =需要同意Mappers +consent-required-for-all-mappers.tooltip =如果打开,则所有新注册的协议映射器将自动具有consentRequired开启。这意味着用户将需要批准同意屏幕。注意:只有在客户端已启用consentRequired开关时,才会显示同意屏幕。所以通常很好地使用这个开关与需要同意的政策。 +allowed-client-templates.label =允许的客户端模板 +allowed-client-templates.tooltip =客户端模板的白名单,可以在新注册的客户端上使用。尝试向某个未列入白名单的客户端模板注册客户端将被拒绝。默认情况下,白名单为空,因此不允许任何客户端模板。 +max-clients.label =每个领域的最大客户端 +max-clients.tooltip =如果域中现有客户端的数量等于或大于配置的限制,将不允许注册新客户端。 + +client-templates =客户端模板 +client-templates.tooltip =客户机模板允许您定义在多个客户机之间共享的公共配置 + +groups =组 + +group.add-selected.tooltip =可以分配给组的领域角色。 +group.assigned-roles.tooltip =映射到组的Realm角色 +group.effective-roles.tooltip =所有领域角色映射。这里的一些角色可能从映射组合角色继承。 +group.available-roles.tooltip =可从此客户端分配角色。 +group.assigned-roles-client.tooltip =此客户端的角色映射。 +group.effective-roles-client.tooltip =此客户端的角色映射。这里的一些角色可能从映射组合角色继承。 + +default-roles =默认角色 +no-realm-roles-available =没有领域角色可用 + +users =用户 +user.add-selected.tooltip =可以分配给用户的领域角色。 +user.assigned-roles.tooltip =映射到用户的Realm角色 +user.effective-roles.tooltip =所有领域角色映射。这里的一些角色可能从映射组合角色继承。 +user.available-roles.tooltip =可从此客户端分配角色。 +user.assigned-roles-client.tooltip =此客户端的角色映射。 +user.effective-roles-client.tooltip =此客户端的角色映射。这里的一些角色可能从映射组合角色继承。 +default.available-roles.tooltip =可以分配的领域级角色。 +realm-default-roles = Realm默认角色 +realm-default-roles.tooltip =分配给新用户的领域级别角色。 +default.available-roles-client.tooltip =可作为默认值分配的来自此客户端的角色。 +client-default-roles =客户端默认角色 +client-default-roles.tooltip =来自此客户端的作为默认角色分配的角色。 +composite.available-roles.tooltip =您可以关联到此组合角色的领域级角色。 +composite.associated-roles.tooltip =与此组合角色关联的领域级角色。 +composite.available-roles-client.tooltip =您可以与此组合角色关联的角色。 +composite.associated-roles-client.tooltip =与此组合角色关联的客户端角色。 +partial-import =部分导入 +partial-import.tooltip =部分导入允许您从先前导出的json文件导入用户,客户端和其他资源。 +file = File +exported-json-file =导出的json文件 +import-from-realm =从领域导入 +import-users =导入用户 +import-groups =导入组 +import-clients =导入客户端 +import-identity-providers =导入身份提供者 +import-realm-roles =导入领域角色 +import-client-roles =导入客户端角色 +if-resource-exists =如果资源存在 +fail =失败 +skip =跳过 +overwrite =覆盖 +if-resource-exists.tooltip =指定在尝试导入已存在的资源时应该做什么。 + +action = Action +role-selector =角色选择器 +realm-roles.tooltip =可以选择的领域角色。 + +select-a-role =选择角色 +select-realm-role =选择领域角色 +client-roles.tooltip =可以选择的客户端角色。 +select-client-role =选择客户端角色 + +client-template =客户端模板 +client-template.tooltip =此客户端继承配置的客户端模板 +client-saml-endpoint =客户端SAML端点 +add-client-template =添加客户端模板 + +manage =管理 +authentication =验证 +user-federation =用户联合 +user-storage =用户存储 +events =事件 +realm-settings =领域设置 +configure =配置 +select-realm =选择领域 +add =添加 + +client-template.name.tooltip =客户端模板的名称。在领域中必须是唯一的 +client-template.description.tooltip =客户端模板的描述 +client-template.protocol.tooltip =此客户端模板提供的SSO协议配置 + +add-user-federation-provider =添加用户联合提供程序 +add-user-storage-provider =添加用户存储提供程序 +required-settings =必需的设置 +provider-id =提供商ID +console-display-name =控制台显示名称 +console-display-name.tooltip =在管理控制台中链接时显示提供程序的名称。 +priority =优先级 +priority.tooltip =执行用户查找时提供程序的优先级。最低优先。 +sync-settings =同步设置 +periodic-full-sync =周期性完全同步 +periodic-full-sync.tooltip =是否应该启用提供程序用户到Keycloak的周期性完全同步 +full-sync-period =完全同步周期 +full-sync-period.tooltip =完全同步的周期(以秒为单位) +periodic-changed-users-sync =定期更改的用户同步 +periodic-changed-users-sync.tooltip =应该启用更改的或新创建的提供程序用户到Keycloak的周期性同步 +changed-users-sync-period =更改的用户同步期间 +changed-users-sync-period.tooltip =用于同步更改的或新创建的提供程序用户的时间段(以秒为单位) +synchronize-changed-users =同步已更改的用户 +synchronize-all-users =同步所有用户 +kerberos-realm = Kerberos领域 +kerberos-realm.tooltip = kerberos域的名称。例如FOO.ORG +server-principal =服务器主体 +server-principal.tooltip = HTTP服务的服务器主体的完整名称,包括服务器和域名。例如HTTP /host.foo.org@FOO.ORG +keytab = KeyTab +keytab.tooltip =包含服务器主体的凭据的Kerberos KeyTab文件的位置。例如/etc/krb5.keytab +debug = Debug +debug.tooltip =启用/禁用调试日志到Krb5LoginModule的标准输出。 +allow-password-authentication =允许密码验证 +allow-password-authentication.tooltip =启用/禁用Kerberos数据库的用户名/密码身份验证的可能性 +edit-mode =编辑模式 +edit-mode.tooltip = READ_ONLY表示不允许更新密码,用户始终使用Kerberos密码进行身份验证。 UNSYNCED表示用户可以在Keycloak数据库中更改其密码,然后将使用此密码而不是Kerberos密码 +ldap.edit-mode.tooltip = READ_ONLY是只读LDAP存储。可写意味着数据将按需同步回LDAP。 UNSYNCED表示将导入用户数据,但不会同步回LDAP。 +update-profile-first-login =更新配置文件首次登录 +update-profile-first-login.tooltip =首次登录时更新配置文件 +sync-registrations =同步注册 +ldap.sync-registrations.tooltip =是否应在LDAP存储中创建新创建的用户?选择提供程序以同步新用户的优先级效果。 +vendor =供应商 +ldap.vendor.tooltip = LDAP供应商(提供者) +username-ldap-attribute =用户名LDAP属性 +ldap-attribute-name-for-username =用户名的LDAP属性名称 +username-ldap-attribute.tooltip = LDAP属性的名称,映射为Keycloak用户名。对于许多LDAP服务器供应商,它可以是“uid”。对于活动目录,可以是“sAMAccountName”或“cn”。应该为要从LDAP导入到Keycloak的所有LDAP用户记录填充该属性。 +rdn-ldap-attribute = RDN LDAP属性 +ldap-attribute-name-for-user-rdn =用户RDN的LDAP属性名称 +rdn-ldap-attribute.tooltip = LDAP属性的名称,用作典型用户DN的RDN(top属性)。通常它与用户名LDAP属性相同,但不是必需的。例如对于Active目录,当username属性可能是“sAMAccountName”时,通常使用“cn”作为RDN属性。 +uuid-ldap-attribute = UUID LDAP属性 +ldap-attribute-name-for-uuid = UUID的LDAP属性名称 +uuid-ldap-attribute.tooltip = LDAP属性的名称,用作LDAP中对象的唯一对象标识符(UUID)。对于许多LDAP服务器供应商,它的'entryUUID',但有些是不同的。例如对于Active目录,它应该是'objectGUID'。如果您的LDAP服务器确实不支持UUID的概念,您可以使用任何其他属性,它应该在树中的LDAP用户中是唯一的。例如“uid”或“entryDN”。 +user-object-classes =用户对象类 +ldap-user-object-classes.placeholder = LDAP用户对象类(以逗号分隔) + +ldap-connection-url = LDAP连接URL +ldap-users-dn = LDAP用户DN +ldap-bind-dn = LDAP绑定DN +ldap-bind-credentials = LDAP绑定凭据 +ldap-filter = LDAP过滤器 +ldap.user-object-classes.tooltip = LDAP中用户的LDAP objectClass属性的所有值除以逗号。例如:'inetOrgPerson,organizationalPerson'。新创建的Keycloak用户将被写入具有所有这些对象类的LDAP,并且只要现有的LDAP用户记录包含所有这些对象类,就会找到它们。 + +connection-url =连接URL +ldap.connection-url.tooltip =与LDAP服务器的连接URL +test-connection =测试连接 +users-dn =用户DN +ldap.users-dn.tooltip =用户所在的LDAP树的完整DN。此DN是LDAP用户的父级。它可以是例如'ou = users,dc = example,dc = com',假设您的典型用户将有DN像'uid = john,ou = users,dc = example,dc = com' +authentication-type =认证类型 +ldap.authentication-type.tooltip = LDAP认证类型。现在只有“无”(匿名LDAP身份验证)或“简单”(绑定凭据+绑定密码身份验证)机制可用 +bind-dn =绑定DN +ldap.bind-dn.tooltip = LDAP管理员的DN,Keycloak将使用它来访问LDAP服务器 +bind-credential =绑定凭据 +ldap.bind-credential.tooltip = LDAP管理员的密码 +test-authentication =测试验证 +custom-user-ldap-filter =自定义用户LDAP过滤器 +ldap.custom-user-ldap-filter.tooltip =用于过滤搜索用户的其他LDAP过滤器。如果您不需要额外的过滤器,请留空。确保它以'('开头,以')结束' +search-scope =搜索范围 +ldap.search-scope.tooltip =对于一个级别,我们仅在用户DN指定的DN中搜索用户。对于子树,我们搜索整个他们的子树。有关更多详细信息,请参阅LDAP文档 +use-truststore-spi =使用Truststore SPI +ldap.use-truststore-spi.tooltip =指定LDAP连接是否将使用具有在standalone.xml / domain.xml中配置的信任库的truststore SPI。 “永远”意味着它总是使用它。 “从不”意味着它不会使用它。 '只有ldaps'意味着它将使用,如果你的连接URL使用ldaps。即使未配置standalone.xml / domain.xml,也将使用由“javax.net.ssl.trustStore”属性指定的缺省Java cacerts或证书。 +connection-pooling =连接池 +ldap.connection-pooling.tooltip = Keycloak是否应该使用连接池来访问LDAP服务器 +ldap.pagination.tooltip = LDAP服务器是否支持分页。 +kerberos-integration = Kerberos集成 +allow-kerberos-authentication =允许Kerberos身份验证 +ldap.allow-kerberos-authentication.tooltip =启用/禁用具有SPNEGO / Kerberos令牌的用户的HTTP身份验证。有关已验证用户的数据将从此LDAP服务器进行配置 +use-kerberos-for-password-authentication =使用Kerberos进行密码验证 +ldap.use-kerberos-for-password-authentication.tooltip =使用Kerberos登录模块用于针对Kerberos服务器的身份验证用户名/密码,而不是使用Directory Service API对LDAP服务器进行身份验证 +batch-size =批量大小 +ldap.batch-size.tooltip =在单个事务中要从LDAP导入到Keycloak的LDAP用户的计数。 +ldap.periodic-full-sync.tooltip =是否应该启用LDAP用户到Keycloak的周期性完全同步 +ldap.periodic-changed-users-sync.tooltip =应该启用更改的或新创建的LDAP用户到Keycloak的周期性同步 +ldap.changed-users-sync-period.tooltip =用于同步更改的或新创建的LDAP用户的时间段(以秒为单位) +user-federation-mappers =用户联合映射器 +create-user-federation-mapper =创建用户联合映射器 +add-user-federation-mapper =添加用户联合映射器 +provider-name =提供程序名称 +no-user-federation-providers-configured =未配置用户联合提供程序 +no-user-storage-providers-configured =未配置用户存储提供程序 +add-identity-provider =添加身份提供者 +add-identity-provider-link =添加身份提供商链接 +identity-provider =身份提供者 +identity-provider-user-id =身份提供者用户ID +identity-provider-user-id.tooltip =身份提供者端的用户的唯一ID +identity-provider-username =身份提供者用户名 +identity-provider-username.tooltip =身份提供者端的用户名 +pagination =分页 + +browser-flow =浏览器流 +browser-flow.tooltip =选择要用于浏览器身份验证的流。 +registration-flow =注册流程 +registration-flow.tooltip =选择要用于注册的流。 +direct-grant-flow =直接授权流 +direct-grant-flow.tooltip =选择要用于直接授予身份验证的流。 +reset-credentials =重置凭据 +reset-credentials.tooltip =选择当用户忘记其凭据时要使用的流。 +client-authentication =客户端验证 +client-authentication.tooltip =选择要用于客户端身份验证的流。 +new =新 +copy =复制 +add-execution =添加执行 +add-flow =添加流 +auth-type =认证类型 +requirement=需求 +config = Config +no-executions-available =没有可用的执行 +authentication-flows =认证流 +create-authenticator-config =创建验证器配置 +authenticator.alias.tooltip =配置的名称 +otp-type = OTP类型 +time-based=基于时间的 +counter-based=基于计数器 +otp-type.tooltip = totp是基于时间的一次性密码。 'hotp'是一个计数器基本一次性密码,其中服务器保持一个计数器哈希。 +otp-hash-algorithm = OTP哈希算法 +otp-hash-algorithm.tooltip =应该使用什么散列算法来生成OTP。 +number-of-digits=位数 +otp.number-of-digits.tooltip = OTP有多少位? +look-ahead-window =向前看窗口 +otp.look-ahead-window.tooltip =如果令牌生成器和服务器不在时间同步或计数器同步,服务器应该向多远前进? +initial-counter=初始计数器 +otp.initial-counter.tooltip =初始计数器值应该是什么? +otp-token-period = OTP令牌周期 +otp-token-period.tooltip = OTP令牌有效多少秒?默认为30秒。 +table-of-password-policies =密码策略表 +add-policy.placeholder =添加策略... +policy-type =策略类型 +policy-value =策略值 +admin-events =管理事件 +admin-events.tooltip =显示领域的已保存管理事件。事件与管理员帐户相关,例如领域创建。要启用持久性事件,请转到配置。 +login-events =登录事件 +filter =过滤器 +update =更新 +reset =复位 +operation-types =操作类型 +resource-types =资源类型 +select-operations.placeholder =选择操作... +select-resource-types.placeholder =选择资源类型... +resource-path =资源路径 +resource-path.tooltip =按资源路径过滤。支持通配符'*'匹配路径的单个部分,'**'匹配多个部分。例如,“realms / * / clients / asbc”匹配任何域中具有id asbc的客户端,而“realms / master / **”匹配主域中的任何内容。 +date-(from)= Date(From) +date-(to)=日期(To) +authentication-details =验证详细信息 +ip-address = IP地址 +time=时间 +operation-type =操作类型 +resource-type =资源类型 +auth = Auth +representation =表示 +register=寄存器 +required-action =必需操作 +default-action =默认操作 +auth.default-action.tooltip =如果启用,任何新用户都将分配此必需操作。 +no-required-actions-configured =未配置所需的操作 +defaults-to-id =默认为id +flows=流量 +bindings =绑定 +required-actions =必需操作 +password-policy =密码策略 +otp-policy = OTP策略 +user-groups =用户组 +default-groups =默认组 +groups.default-groups.tooltip =新用户将自动加入的组的集合。 +cut = Cut +paste =粘贴 + +create-group =创建组 +create-authenticator-execution =创建Authenticator执行 +create-form-action-execution =创建表单操作执行 +create-top-level-form =创建顶级表单 +flow.alias.tooltip =指定流的显示名称。 +top-level-flow-type =顶级流类型 +flow.generic = generic +flow.client = client +top-level-flow-type.tooltip =什么样的顶层流是什么?类型“客户端”用于客户端(应用程序)的认证,当通用是为用户和其他 +create-execution-flow =创建执行流 +flow-type =流类型 +flow.form.type = form +flow.generic.type = generic +flow-type.tooltip =它是什么样的形式 +form-provider =表单提供程序 +default-groups.tooltip =新创建或注册的用户将自动添加到这些组 +select-a-type.placeholder =选择一个类型 +available-groups =可用组 +available-groups.tooltip =选择要添加为默认的组。 +value = Value +table-of-group-members =组成员表 +last-name =姓氏 +first-name =名字 +email =电子邮件 +toggle-navigation =切换导航 +manage-account =管理帐户 +sign-out=退出 +server-info =服务器信息 +resource-not-found =资源未找到 ... +resource-not-found.instruction =我们找不到您要找的资源。请确保您输入的网址正确无误。 +go-to-the-home-page =前往首页&raquo; +page-not-found =页面未找到 ... +page-not-found.instruction =我们找不到您要寻找的页面。请确保您输入的网址正确无误。 +events.tooltip =显示领域的已保存事件。事件与用户帐户相关,例如用户登录。要启用持久性事件,请转到配置。 +select-event-types.placeholder =选择事件类型... +events-config.tooltip =显示配置选项以启用用户和管理事件的持久性。 +select-an-action.placeholder =选择操作... +event-listeners.tooltip =配置什么侦听器接收领域的事件。 +login.save-events.tooltip =如果启用的登录事件保存到数据库,使事件可用于管理和帐户管理控制台。 +clear-events.tooltip =删除数据库中的所有事件。 +events.expiration.tooltip =设置事件的到期时间。过期事件将定期从数据库中删除。 +admin-events-settings =管理事件设置 +save-events =保存事件 +admin.save-events.tooltip =如果已启用的管理事件保存到数据库,使事件可用于管理控制台。 +saved-types.tooltip =配置保存的事件类型。 +include-representation =包含表示 +include-representation.tooltip =包含用于创建和更新请求的JSON表示。 +clear-admin-events.tooltip =删除数据库中的所有管理事件。 +server-version =服务器版本 +server-profile =服务器配置文件 +info =信息 +providers =提供者 +server-time =服务器时间 +server-uptime =服务器正常运行时间 +memory =内存 +total-memory =总内存 +free-memory =可用内存 +used-memory =使用的内存 +system = System +current-working-directory =当前工作目录 +java-version = Java版本 +java-vendor = Java供应商 +java-runtime = Java运行时 +java-vm = Java VM +java-vm-version = Java虚拟机版本 +java-home = Java首页 +user-name =用户名 +user-timezone =用户时区 +user-locale =用户区域设置 +system-encoding =系统编码 +operating-system =操作系统 +os-architecture = OS体系结构 +spi = SPI +granted-roles =授予的角色 +granted-protocol-mappers =授予的协议映射器 +additional-grants =附加赠款 +consent-created-date =创建 +consent-last-updated-date =最后更新 +revoke =撤消 +new-password =新密码 +password-confirmation =密码确认 +reset-password =重置密码 +credentials.temporary.tooltip =如果启用,用户需要在下次登录时更改密码 +remove-totp =删除TOTP +credentials.remove-totp.tooltip =为用户删除一次性密码生成器。 +reset-actions =复位操作 +credentials.reset-actions.tooltip =发送用户重置操作电子邮件时要执行的操作的集合。 “验证电子邮件”向用户发送电子邮件以验证其电子邮件地址。 “更新个人资料”要求用户输入新的个人信息。 “更新密码”要求用户输入新密码。 '配置TOTP'需要设置移动密码生成器。 +reset-actions-email =重置操作电子邮件 +send-email =发送电子邮件 +credentials.reset-actions-email.tooltip =向具有嵌入链接的用户发送电子邮件。单击链接将允许用户执行重置操作。他们不必在此之前登录。例如,将操作设置为更新密码,单击此按钮,用户将无需登录即可更改其密码。 +add-user =添加用户 +created-at =创建于 +user-enabled =用户已启用 +user-enabled.tooltip =禁用的用户无法登录。 +user-temporarily-locked =用户临时锁定 +user-temporarily-locked.tooltip =用户可能由于无法登录太多次而被锁定。 +unlock-user =解锁用户 +federation-link =联合链接 +email-verified =电子邮件验证 +email-verified.tooltip =用户的电子邮件经过验证吗? +required-user-actions =必需的用户操作 +required-user-actions.tooltip =需要用户登录时的操作。“验证电子邮件”向用户发送电子邮件以验证其电子邮件地址。 “更新个人资料”要求用户输入新的个人信息。 “更新密码”要求用户输入新密码。 '配置TOTP'需要设置移动密码生成器。 +locale =语言环境 +select-one.placeholder =选择一个... +impersonate =模拟 +impersonate-user =模拟用户 +impersonate-user.tooltip =以此用户身份登录。如果用户与您处于相同的领域,则在您以此用户身份登录之前,当前的登录会话将被注销。 +identity-provider-alias =身份提供者别名 +provider-user-id =提供程序用户ID +provider-username =提供者用户名 +no-identity-provider-links-available =没有可用的身份提供程序链接 +group-membership =组成员资格 +leave =离开 +group-membership.tooltip =组用户是的成员。选择列出的组,然后单击离开按钮退出组。 +membership.available-groups.tooltip =用户可以加入的组。选择一个组,然后单击加入按钮。 +table-of-realm-users =表的Realm用户 +view-all-users =查看所有用户 +unlock-users =解锁用户 +no-users-available =没有可用的用户 +users.instruction =请输入搜索,或点击查看所有用户 +consents=同意 +started =开始 +logout-all-sessions =注销所有会话 +logout =注销 +new-name =新名称 +ok =好的 +attributes =属性 +role-mappings =角色映射 +members =成员 +details =详细 +identity-provider-links =身份提供者链接 +register-required-action =注册所需的操作 +gender =性别 +address = Address +phone =电话 +profile-url =个人资料网址 +picture-url =图片网址 +website =网站 +import-keys-and-cert =导入密钥和证书 +import-keys-and-cert.tooltip =上传客户端的密钥对和证书。 +upload-keys =上传密钥 +download-keys-and-cert =下载密钥和证书 +no-value-assigned.placeholder =未分配值 +remove =删除 +no-group-members =没有组成员 +temporary =临时 +join =加入 +event-type =事件类型 +events-config =事件配置 +event-listeners =事件监听器 +login-events-settings =登录事件设置 +clear-events =清除事件 +saved-types =保存的类型 +clear-admin-events =清除管理事件 +clear-changes =清除更改 +error =错误 + +# Authz +# Authz Common +authz-authorization =授权 +authz-owner =所有者 +authz-uri = URI +authz-scopes =范围 +authz-resource =资源 +authz-resource-type =资源类型 +authz-resources =资源 +authz-scope =范围 +authz-authz-scopes =授权范围 +authz-policies =策略 +authz-permissions =权限 +authz-evaluate =评估 +authz-icon-uri =图标URI +authz-icon-uri.tooltip =指向图标的URI。 +authz-select-scope =选择范围 +authz-select-resource =选择资源 +authz-associated-policies =关联策略 +authz-any-resource =任何资源 +authz-any-scope =任何作用域 +authz-any-role =任何角色 +authz-policy-evaluation =政策评估 +authz-select-client =选择客户端 +authz-select-user =选择用户 +authz-entitlements =权利 +authz-no-resources =无资源 +authz-result = Result +authz-authorization-services-enabled =授权已启用 +authz-authorization-services-enabled.tooltip =启用/禁用客户端的细粒度授权支持 +authz-required =必需 + +# Authz Settings +authz-import-config.tooltip =导入包含此资源服务器的授权设置的JSON文件。 + +authz-policy-enforcement-mode =策略强制模式 +authz-policy-enforcement-mode.tooltip =策略强制模式指示在评估授权请求时如何强制执行策略。 “Enforcing”表示即使没有与给定资源相关联的策略,也会默认拒绝请求。 “Permissive”表示即使没有与给定资源相关联的策略也允许请求。 “禁用”完全禁用策略的评估,并允许访问任何资源。 +authz-policy-enforcement-mode-enforcing =强制 +authz-policy-enforcement-mode-permissive = Permissive +authz-policy-enforcement-mode-disabled =禁用 + +authz-remote-resource-management =远程资源管理 +authz-remote-resource-management.tooltip =资源服务器是否应该远程管理资源?如果为false,则只能从此管理控制台管理资源。 + +authz-export-settings =导出设置 +authz-export-settings.tooltip =导出并下载此资源服务器的所有授权设置。 + +# Authz Resource List +authz-no-resources-available =无可用资源。 +authz-no-scopes-assigned =未分配范围。 +authz-no-type-defined =未定义类型。 +authz-no-permission-assigned =未分配权限。 +authz-no-policy-assigned =未分配策略。 +authz-create-permission =创建权限 + +# Authz Resource Detail +authz-add-resource =添加资源 +authz-resource-name.tooltip =此资源的唯一名称。 该名称可用于唯一标识资源,在查询特定资源时很有用。 +authz-resource-owner.tooltip =此资源的所有者。 +authz-resource-type.tooltip =此资源的类型。 它可以用于对具有相同类型的不同资源实例进行分组。 +authz-resource-uri.tooltip =也可以用于唯一标识此资源的URI。 +authz-resource-scopes.tooltip =与此资源关联的范围。 + +# Authz Scope List +authz-add-scope=Add Scope +authz-no-scopes-available=No scopes available. + +#Authz作用域详细信息 +authz-scope-name.tooltip =此作用域的唯一名称。该名称可用于唯一标识范围,在查询特定范围时很有用。 + +#Authz策略列表 +authz-all-types =所有类型 +authz-create-policy =创建策略 +authz-no-policies-available =没有可用的策略。 + +#Authz策略详细信息 +authz-policy-name.tooltip =此策略的名称。 +authz-policy-description.tooltip =此策略的描述。 +authz-policy-logic =逻辑 +authz-policy-logic-positive =肯定 +authz-policy-logic-negative = Negative +authz-policy-logic.tooltip =逻辑决定如何进行策略决策。如果为“积极”,则在评估本政策期间获得的效果(许可或拒绝)将用于执行决策。如果为“否定”,则所得的效果将被否定,换句话说,许可证变为拒绝,反之亦然。 +authz-policy-apply-policy =应用策略 +authz-policy-apply-policy.tooltip =指定必须应用于此策略或权限定义的范围的所有策略。 +authz-policy-decision-strategy =决策策略 +authz-policy-decision-strategy.tooltip =决策策略规定如何评估与给定权限相关联的策略以及如何获得最终决策。 “肯定”意味着至少一个政策必须评估为积极的决定,以使最终决定也是积极的。 “一致”是指所有政策必须评估为一个积极的决定,以使最终决定也是积极的。 “共识”意味着积极决策的数量必须大于负面决策的数量。如果正数和负数相同,最终决定将为负数。 +authz-policy-decision-strategy-affirmative =肯定 +authz-policy-decision-strategy-unanimous =一致 +authz-policy-decision-strategy-consensus=共识 +authz-select-a-policy =选择一个策略 + +#Authz角色策略详细信息 +authz-add-role-policy =添加角色策略 +authz-no-roles-assigned =未分配角色。 +authz-policy-role-realm-roles.tooltip =指定此策略允许的* realm *角色。 +authz-policy-role-clients.tooltip =选择客户端以过滤可应用于此策略的客户端角色。 +authz-policy-role-client-roles.tooltip =指定此策略允许的客户端角色。 + +#Authz用户策略详细信息 +authz-add-user-policy =添加用户策略 +authz-no-users-assigned =未分配用户。 +authz-policy-user-users.tooltip =指定此策略允许哪些用户。 + +#Authz时间策略详细信息 +authz-add-time-policy =添加时间策略 +authz-policy-time-not-before.tooltip =定义不得授予策略的时间。仅当当前日期/时间晚于或等于此值时才被授予。 +authz-policy-time-not-on-after =不开或之后 +authz-policy-time-not-on-after.tooltip =定义不能授予策略的时间。仅当当前日期/时间在此值之前或之前时才被授予。 +authz-policy-time-day-month =日期 +authz-policy-time-day-month.tooltip =定义必须授予策略的月份日期。您还可以通过填充第二个字段来提供范围。在这种情况下,只有当月的当天介于或等于您提供的两个值之后,才会授予权限。 +authz-policy-time-month = month +authz-policy-time-month.tooltip =定义必须授予策略的月份。您还可以通过填充第二个字段来提供范围。在这种情况下,仅当当前月份介于或等于您提供的两个值之间时才会授予权限。 +authz-policy-time-year =年 +authz-policy-time-year.tooltip =定义策略必须授予的年份。您还可以通过填充第二个字段来提供范围。在这种情况下,仅当当前年份介于或等于您提供的两个值之间时才会授予权限。 +authz-policy-time-hour =小时 +authz-policy-time-hour.tooltip =定义策略必须被授予的小时。您还可以通过填充第二个字段来提供范围。在这种情况下,只有当前小时介于或等于您提供的两个值之间时才会授予权限。 +authz-policy-time-minute =分钟 +authz-policy-time-minute.tooltip =定义策略必须被授予的分钟。您还可以通过填充第二个字段来提供范围。在这种情况下,仅当当前分钟介于或等于您提供的两个值之间时才会授予权限。 + +#Authz Drools策略详细信息 +authz-add-drools-policy =添加Drools策略 +authz-policy-drools-maven-artifact-resolve =解决 +authz-policy-drools-maven-artifact =策略Maven神器 +authz-policy-drools-maven-artifact.tooltip =指向从其中加载规则的工件的Maven GAV。一旦您提供了GAV,您可以点击* Resolve *来加载* Module *和* Session *字段。 +authz-policy-drools-module = Module +authz-policy-drools-module.tooltip =此策略使用的模块。您必须提供一个模块,以便选择将从中加载规则的特定会话。 +authz-policy-drools-session =会话 +authz-policy-drools-session.tooltip =此策略使用的会话。会话提供处理策略时评估的所有规则。 +authz-policy-drools-update-period =更新周期 +authz-policy-drools-update-period.tooltip =指定扫描工件更新的时间间隔。 + +#Authz JS策略详细信息 +authz-add-js-policy =添加JavaScript策略 +authz-policy-js-code =代码 +authz-policy-js-code.tooltip =提供此策略条件的JavaScript代码。 + + +#Authz聚合策略详细信息 +authz-aggregated=聚合 +authz-add-aggregation-policy =添加聚合策略 + +#Authz权限列表 +authz-no-permissions-available =没有可用的权限。 + +#Authz权限详细信息 +authz-permission-name.tooltip =此权限的名称。 +authz-permission-description.tooltip =此权限的描述。 + +#Authz资源许可详细信息 +authz-add-resource-permission =添加资源权限 +authz-permission-resource-apply-to-resource-type =应用于资源类型 +authz-permission-resource-apply-to-resource-type.tooltip =指定是否将此权限应用于具有给定类型的所有资源。 在这种情况下,将对给定资源类型的所有实例评估此权限。 +authz-permission-resource-resource.tooltip =指定此权限必须应用于特定资源实例。 +authz-permission-resource-type.tooltip =指定此权限必须应用于给定类型的所有资源实例。 + +#Authz Scope Permission Detail +authz-add-scope-permission =添加范围权限 +authz-permission-scope-resource.tooltip =将范围限制为与所选资源关联的范围。 如果未选择,则所有范围都可用。 +authz-permission-scope-scope.tooltip =指定此权限必须应用于一个或多个作用域。 + +# Authz Evaluation +authz-evaluation-identity-information =身份信息 +authz-evaluation-identity-information.tooltip =用于配置在评估策略时将使用的身份信息的可用选项。 +authz-evaluation-client.tooltip =选择进行此授权请求的客户端。如果未提供,授权请求将根据您所在的客户端完成。 +authz-evaluation-user.tooltip =选择一个用户,其身份将被用于查询服务器的权限。 +authz-evaluation-role.tooltip =选择要与所选用户关联的角色。 +authz-evaluation-new =新评估 +authz-evaluation-re-evaluate =重新评估 +authz-evaluation-previous =以前的评估 +authz-evaluation-contextual-info =上下文信息 +authz-evaluation-contextual-info.tooltip =用于配置在评估策略时将使用的任何上下文信息的可用选项。 +authz-evaluation-contextual-attributes =上下文属性 +authz-evaluation-contextual-attributes.tooltip =由正在运行的环境或执行上下文提供的任何属性。 +authz-evaluation-permissions.tooltip =用于配置将应用策略的权限的可用选项。 +authz-evaluation-evaluate =评估 +authz-evaluation-any-resource-with-scopes =任何具有范围的资源 +authz-evaluation-no-result =无法获取给定授权请求的任何结果。检查所提供的资源或范围是否与任何策略相关联。 +authz-evaluation-no-policies-resource =未找到此资源的策略。 +authz-evaluation-result.tooltip =此权限请求的总体结果。 +authz-evaluation-scopes.tooltip =允许的作用域列表。 +authz-evaluation-policies.tooltip =有关评估哪些策略及其决策的详细信息。 +authz-evaluation-authorization-data =响应 +authz-evaluation-authorization-data.tooltip =表示由于处理授权请求而携带授权数据的令牌。这个表示基本上是Keycloak向客户端请求权限的问题。针对根据当前授权请求授予的权限,检查“授权”声明。 +authz-show-authorization-data =显示授权数据 + +keys=秘钥 +all=所有 +status=状态 +keystore=钥匙链 +keystores= 钥匙链 +add-keystore=添加 钥匙链 +add-keystore.placeholder=添加 钥匙链... +view=查看 +active=活跃 + +Sunday=星期天 +Monday=星期一 +Tuesday=星期二 +Wednesday=星期三 +Thursday=星期四 +Friday=星期五 +Saturday=星期六 + +user-storage-cache-policy=缓存设置 +userStorage.cachePolicy=缓存策略 +userStorage.cachePolicy.option.DEFAULT=默认 +userStorage.cachePolicy.option.EVICT_WEEKLY=EVICT_WEEKLY +userStorage.cachePolicy.option.EVICT_DAILY=EVICT_DAILY +userStorage.cachePolicy.option.MAX_LIFESPAN=MAX_LIFESPAN +userStorage.cachePolicy.option.NO_CACHE=NO_CACHE +userStorage.cachePolicy.tooltip=这个存储源的缓存策略. '默认' 是全局的默认缓存策略。'EVICT_DAILY'是每天特定时间缓存会失效. 'EVICT_WEEKLY'是每周第n天的特定时间缓存会失效. 'MAX-LIFESPAN' 是指缓存条目的最大生命周期 +userStorage.cachePolicy.evictionDay=Eviction Day +userStorage.cachePolicy.evictionDay.tooltip=每周第n天缓存失效 +userStorage.cachePolicy.evictionHour=Eviction Hour +userStorage.cachePolicy.evictionHour.tooltip=一天中几点缓存失效 +userStorage.cachePolicy.evictionMinute=Eviction Minute +userStorage.cachePolicy.evictionMinute.tooltip=缓存失效的分钟 +userStorage.cachePolicy.maxLifespan=最大生命周期 +userStorage.cachePolicy.maxLifespan.tooltip=以微秒计数的最大生命周期 +user-origin-link=存储源 + +disable=关闭 +disableable-credential-types=可以关闭的类型 +credentials.disableable.tooltip=可以关闭的密码类型列表 +disable-credential-types=关闭密码类型 +credentials.disable.tooltip=点击按钮关闭密码类型 +credential-types=密码类型 +manage-user-password=管理密码 +disable-credentials=关闭密码 +credential-reset-actions=重置密码 +ldap-mappers=LDAP 映射器 +create-ldap-mapper=创建 LDAP 映射 +loginWithEmailAllowed=使用电子邮件登录 +duplicateEmailsAllowed=重复的邮件 +hidden=隐藏 + + + + + + diff --git a/admin/messages/messages_ca.properties b/admin/messages/messages_ca.properties new file mode 100644 index 0000000..50aa0a0 --- /dev/null +++ b/admin/messages/messages_ca.properties @@ -0,0 +1,8 @@ +invalidPasswordHistoryMessage=Contrasenya incorrecta: no pot ser igual a cap de les \u00FAltimes {0} contrasenyes. +invalidPasswordMinDigitsMessage=Contrase\u00F1a incorrecta: debe contener al menos {0} caracteres num\u00E9ricos. +invalidPasswordMinLengthMessage=Contrasenya incorrecta: longitud m\u00EDnima {0}. +invalidPasswordMinLowerCaseCharsMessage=Contrasenya incorrecta: ha de contenir almenys {0} lletres min\u00FAscules. +invalidPasswordMinSpecialCharsMessage=Contrasenya incorrecta: ha de contenir almenys {0} car\u00E0cters especials. +invalidPasswordMinUpperCaseCharsMessage=Contrasenya incorrecta: ha de contenir almenys {0} lletres maj\u00FAscules. +invalidPasswordNotUsernameMessage=Contrasenya incorrecta: no pot ser igual al nom d''usuari. +invalidPasswordRegexPatternMessage=Contrasenya incorrecta: no compleix l''expressi\u00F3 regular. diff --git a/admin/messages/messages_en.properties b/admin/messages/messages_en.properties new file mode 100644 index 0000000..ea61dc3 --- /dev/null +++ b/admin/messages/messages_en.properties @@ -0,0 +1,28 @@ +invalidPasswordMinLengthMessage=Invalid password: minimum length {0}. +invalidPasswordMinLowerCaseCharsMessage=Invalid password: must contain at least {0} lower case characters. +invalidPasswordMinDigitsMessage=Invalid password: must contain at least {0} numerical digits. +invalidPasswordMinUpperCaseCharsMessage=Invalid password: must contain at least {0} upper case characters. +invalidPasswordMinSpecialCharsMessage=Invalid password: must contain at least {0} special characters. +invalidPasswordNotUsernameMessage=Invalid password: must not be equal to the username. +invalidPasswordRegexPatternMessage=Invalid password: fails to match regex pattern(s). +invalidPasswordHistoryMessage=Invalid password: must not be equal to any of last {0} passwords. +invalidPasswordBlacklistedMessage=Invalid password: password is blacklisted. +invalidPasswordGenericMessage=Invalid password: new password doesn''t match password policies. + +ldapErrorInvalidCustomFilter=Custom configured LDAP filter does not start with "(" or does not end with ")". +ldapErrorConnectionTimeoutNotNumber=Connection Timeout must be a number +ldapErrorReadTimeoutNotNumber=Read Timeout must be a number +ldapErrorMissingClientId=Client ID needs to be provided in config when Realm Roles Mapping is not used. +ldapErrorCantPreserveGroupInheritanceWithUIDMembershipType=Not possible to preserve group inheritance and use UID membership type together. +ldapErrorCantWriteOnlyForReadOnlyLdap=Can't set write only when LDAP provider mode is not WRITABLE +ldapErrorCantWriteOnlyAndReadOnly=Can't set write-only and read-only together + +clientRedirectURIsFragmentError=Redirect URIs must not contain an URI fragment +clientRootURLFragmentError=Root URL must not contain an URL fragment + +pairwiseMalformedClientRedirectURI=Client contained an invalid redirect URI. +pairwiseClientRedirectURIsMissingHost=Client redirect URIs must contain a valid host component. +pairwiseClientRedirectURIsMultipleHosts=Without a configured Sector Identifier URI, client redirect URIs must not contain multiple host components. +pairwiseMalformedSectorIdentifierURI=Malformed Sector Identifier URI. +pairwiseFailedToGetRedirectURIs=Failed to get redirect URIs from the Sector Identifier URI. +pairwiseRedirectURIsMismatch=Client redirect URIs does not match redirect URIs fetched from the Sector Identifier URI. diff --git a/admin/messages/messages_es.properties b/admin/messages/messages_es.properties new file mode 100644 index 0000000..70e3d73 --- /dev/null +++ b/admin/messages/messages_es.properties @@ -0,0 +1,8 @@ +invalidPasswordMinLengthMessage=Contrase\u00F1a incorrecta: longitud m\u00EDnima {0}. +invalidPasswordMinLowerCaseCharsMessage=Contrase\u00F1a incorrecta: debe contener al menos {0} letras min\u00FAsculas. +invalidPasswordMinDigitsMessage=Contrase\u00F1a incorrecta: debe contener al menos {0} caracteres num\u00E9ricos. +invalidPasswordMinUpperCaseCharsMessage=Contrase\u00F1a incorrecta: debe contener al menos {0} letras may\u00FAsculas. +invalidPasswordMinSpecialCharsMessage=Contrase\u00F1a incorrecta: debe contener al menos {0} caracteres especiales. +invalidPasswordNotUsernameMessage=Contrase\u00F1a incorrecta: no puede ser igual al nombre de usuario. +invalidPasswordRegexPatternMessage=Contrase\u00F1a incorrecta: no cumple la expresi\u00F3n regular. +invalidPasswordHistoryMessage=Contrase\u00F1a incorrecta: no puede ser igual a ninguna de las \u00FAltimas {0} contrase\u00F1as. diff --git a/admin/messages/messages_fr.properties b/admin/messages/messages_fr.properties new file mode 100644 index 0000000..c4a0216 --- /dev/null +++ b/admin/messages/messages_fr.properties @@ -0,0 +1,8 @@ +invalidPasswordMinLengthMessage=Mot de passe invalide : longueur minimale requise de {0}. +invalidPasswordMinLowerCaseCharsMessage=Mot de passe invalide : doit contenir au moins {0} lettre(s) en minuscule. +invalidPasswordMinDigitsMessage=Mot de passe invalide : doit contenir au moins {0} chiffre(s). +invalidPasswordMinUpperCaseCharsMessage=Mot de passe invalide : doit contenir au moins {0} lettre(s) en majuscule. +invalidPasswordMinSpecialCharsMessage=Mot de passe invalide : doit contenir au moins {0} caract\u00e8re(s) sp\u00e9ciaux. +invalidPasswordNotUsernameMessage=Mot de passe invalide : ne doit pas \u00eatre identique au nom d''utilisateur. +invalidPasswordRegexPatternMessage=Mot de passe invalide : ne valide pas l''expression rationnelle. +invalidPasswordHistoryMessage=Mot de passe invalide : ne doit pas \u00eatre \u00e9gal aux {0} derniers mot de passe. diff --git a/admin/messages/messages_it.properties b/admin/messages/messages_it.properties new file mode 100644 index 0000000..e69de29 diff --git a/admin/messages/messages_ja.properties b/admin/messages/messages_ja.properties new file mode 100644 index 0000000..7914ec8 --- /dev/null +++ b/admin/messages/messages_ja.properties @@ -0,0 +1,25 @@ +# encoding: utf-8 +invalidPasswordMinLengthMessage=無効なパスワード: 最小 {0} の長さが必要です。 +invalidPasswordMinLowerCaseCharsMessage=無効なパスワード: 少なくとも {0} 文字の小文字を含む必要があります。 +invalidPasswordMinDigitsMessage=無効なパスワード: 少なくとも {0} 文字の数字を含む必要があります。 +invalidPasswordMinUpperCaseCharsMessage=無効なパスワード: 少なくとも {0} 文字の大文字を含む必要があります。 +invalidPasswordMinSpecialCharsMessage=無効なパスワード: 少なくとも {0} 文字の特殊文字を含む必要があります。 +invalidPasswordNotUsernameMessage=無効なパスワード: ユーザー名と同じパスワードは禁止されています。 +invalidPasswordRegexPatternMessage=無効なパスワード: 正規表現パターンと一致しません。 +invalidPasswordHistoryMessage=無効なパスワード: 最近の {0} パスワードのいずれかと同じパスワードは禁止されています。 + +ldapErrorInvalidCustomFilter=LDAP フィルターのカスタム設定が、 「(」 から開始または 「)」 で終了となっていません。 +ldapErrorMissingClientId=レルムロールマッピングを使用しない場合は、クライアント ID は設定内で提供される必要があります。 +ldapErrorCantPreserveGroupInheritanceWithUIDMembershipType=グループ継承と UID メンバーシップタイプを一緒に保存することはできません。 +ldapErrorCantWriteOnlyForReadOnlyLdap=LDAP プロバイダーモードが WRITABLE ではない場合は、write only を設定することはできません。 +ldapErrorCantWriteOnlyAndReadOnly=write-only と read-only を一緒に設定することはできません。 + +clientRedirectURIsFragmentError=リダイレクト URI に URI フラグメントを含めることはできません。 +clientRootURLFragmentError=ルート URL に URL フラグメントを含めることはできません。 + +pairwiseMalformedClientRedirectURI=クライアントに無効なリダイレクト URI が含まれていました。 +pairwiseClientRedirectURIsMissingHost=クライアントのリダイレクト URI には有効なホストコンポーネントが含まれている必要があります。 +pairwiseClientRedirectURIsMultipleHosts=設定された Sector Identifier URI がない場合は、クライアントのリダイレクト URI は複数のホストコンポーネントを含むことはできません。 +pairwiseMalformedSectorIdentifierURI=不正な Sector Identifier URI です。 +pairwiseFailedToGetRedirectURIs=Sector Identifier URI からリダイレクト URI を取得できませんでした。 +pairwiseRedirectURIsMismatch=クライアントのリダイレクト URI は、Sector Identifier URI からフェッチされたリダイレクト URI と一致しません。 diff --git a/admin/messages/messages_lt.properties b/admin/messages/messages_lt.properties new file mode 100644 index 0000000..5cc51a2 --- /dev/null +++ b/admin/messages/messages_lt.properties @@ -0,0 +1,24 @@ +invalidPasswordMinLengthMessage=Per trumpas slapta\u00c5\u00beodis: ma\u00c5\u00beiausias ilgis {0}. +invalidPasswordMinLowerCaseCharsMessage=Neteisingas slapta\u00c5\u00beodis: privaloma \u00c4\u00c6vesti {0} ma\u00c5\u00be\u00c4\u2026j\u00c4\u2026 raid\u00c4\u2122. +invalidPasswordMinDigitsMessage=Neteisingas slapta\u00c5\u00beodis: privaloma \u00c4\u00c6vesti {0} skaitmen\u00c4\u00c6. +invalidPasswordMinUpperCaseCharsMessage=Neteisingas slapta\u00c5\u00beodis: privaloma \u00c4\u00c6vesti {0} did\u00c5\u00bei\u00c4\u2026j\u00c4\u2026 raid\u00c4\u2122. +invalidPasswordMinSpecialCharsMessage=Neteisingas slapta\u00c5\u00beodis: privaloma \u00c4\u00c6vesti {0} special\u00c5\u00b3 simbol\u00c4\u00c6. +invalidPasswordNotUsernameMessage=Neteisingas slapta\u00c5\u00beodis: slapta\u00c5\u00beodis negali sutapti su naudotojo vardu. +invalidPasswordRegexPatternMessage=Neteisingas slapta\u00c5\u00beodis: slapta\u00c5\u00beodis netenkina regex taisykl\u00c4\u2014s(i\u00c5\u00b3). +invalidPasswordHistoryMessage=Neteisingas slapta\u00c5\u00beodis: slapta\u00c5\u00beodis negali sutapti su prie\u00c5\ufffd tai buvusiais {0} slapta\u00c5\u00beod\u00c5\u00beiais. + +ldapErrorInvalidCustomFilter=Sukonfig\u016Bruotas LDAP filtras neprasideda "(" ir nesibaigia ")" simboliais. +ldapErrorMissingClientId=Privaloma nurodyti kliento ID kai srities roli\u0173 susiejimas n\u0117ra nenaudojamas. +ldapErrorCantPreserveGroupInheritanceWithUIDMembershipType=Grupi\u0173 paveld\u0117jimo ir UID naryst\u0117s tipas kartu negali b\u016Bti naudojami. +ldapErrorCantWriteOnlyForReadOnlyLdap=Negalima nustatyti ra\u0161ymo r\u0117\u017Eimo kuomet LDAP teik\u0117jo r\u0117\u017Eimas ne WRITABLE +ldapErrorCantWriteOnlyAndReadOnly=Negalima nustatyti tik ra\u0161yti ir tik skaityti kartu + +clientRedirectURIsFragmentError=Nurodykite URI fragment\u0105, kurio negali b\u016Bti peradresuojamuose URI adresuose +clientRootURLFragmentError=Nurodykite URL fragment\u0105, kurio negali b\u016Bti \u0161akniniame URL adrese + +pairwiseMalformedClientRedirectURI=Klientas pateik\u0117 neteising\u0105 nukreipimo nuorod\u0105. +pairwiseClientRedirectURIsMissingHost=Kliento nukreipimo nuorodos privalo b\u016Bti nurodytos su serverio vardo komponentu. +pairwiseClientRedirectURIsMultipleHosts=Kuomet nesukonfig\u016Bruotas sektoriaus identifikatoriaus URL, kliento nukreipimo nuorodos privalo talpinti ne daugiau kaip vien\u0105 skirting\u0105 serverio vardo komponent\u0105. +pairwiseMalformedSectorIdentifierURI=Neteisinga sektoriaus identifikatoriaus URI. +pairwiseFailedToGetRedirectURIs=Nepavyko gauti nukreipimo nuorod\u0173 i\u0161 sektoriaus identifikatoriaus URI. +pairwiseRedirectURIsMismatch=Kliento nukreipimo nuoroda neatitinka nukreipimo nuorodo\u0173 i\u0161 sektoriaus identifikatoriaus URI. \ No newline at end of file diff --git a/admin/messages/messages_nl.properties b/admin/messages/messages_nl.properties new file mode 100644 index 0000000..4a04a52 --- /dev/null +++ b/admin/messages/messages_nl.properties @@ -0,0 +1,27 @@ +invalidPasswordMinLengthMessage=Ongeldig wachtwoord: de minimale lengte is {0} karakters. +invalidPasswordMinLowerCaseCharsMessage=Ongeldig wachtwoord: het moet minstens {0} kleine letters bevatten. +invalidPasswordMinDigitsMessage=Ongeldig wachtwoord: het moet minstens {0} getallen bevatten. +invalidPasswordMinUpperCaseCharsMessage=Ongeldig wachtwoord: het moet minstens {0} hoofdletters bevatten. +invalidPasswordMinSpecialCharsMessage=Ongeldig wachtwoord: het moet minstens {0} speciale karakters bevatten. +invalidPasswordNotUsernameMessage=Ongeldig wachtwoord: het mag niet overeenkomen met de gebruikersnaam. +invalidPasswordRegexPatternMessage=Ongeldig wachtwoord: het voldoet niet aan het door de beheerder ingestelde patroon. +invalidPasswordHistoryMessage=Ongeldig wachtwoord: het mag niet overeen komen met een van de laatste {0} wachtwoorden. +invalidPasswordGenericMessage=Ongeldig wachtwoord: het nieuwe wachtwoord voldoet niet aan het wachtwoordbeleid. + +ldapErrorInvalidCustomFilter=LDAP filter met aangepaste configuratie start niet met "(" of eindigt niet met ")". +ldapErrorConnectionTimeoutNotNumber=Verbindingstimeout moet een getal zijn +ldapErrorReadTimeoutNotNumber=Lees-timeout moet een getal zijn +ldapErrorMissingClientId=Client ID moet ingesteld zijn als Realm Roles Mapping niet gebruikt wordt. +ldapErrorCantPreserveGroupInheritanceWithUIDMembershipType=Kan groepsovererving niet behouden bij UID-lidmaatschapstype. +ldapErrorCantWriteOnlyForReadOnlyLdap=Alleen-schrijven niet mogelijk als LDAP provider mode niet WRITABLE is +ldapErrorCantWriteOnlyAndReadOnly=Alleen-schrijven en alleen-lezen mogen niet tegelijk ingesteld zijn + +clientRedirectURIsFragmentError=Redirect URIs mogen geen URI fragment bevatten +clientRootURLFragmentError=Root URL mag geen URL fragment bevatten + +pairwiseMalformedClientRedirectURI=Client heeft een ongeldige redirect URI. +pairwiseClientRedirectURIsMissingHost=Client redirect URIs moeten een geldige host-component bevatten. +pairwiseClientRedirectURIsMultipleHosts=Zonder een geconfigureerde Sector Identifier URI mogen client redirect URIs niet meerdere host componenten hebben. +pairwiseMalformedSectorIdentifierURI=Onjuist notatie in Sector Identifier URI. +pairwiseFailedToGetRedirectURIs=Kon geen redirect URIs verkrijgen van de Sector Identifier URI. +pairwiseRedirectURIsMismatch=Client redirect URIs komen niet overeen met redict URIs ontvangen van de Sector Identifier URI. diff --git a/admin/messages/messages_no.properties b/admin/messages/messages_no.properties new file mode 100644 index 0000000..43cb61d --- /dev/null +++ b/admin/messages/messages_no.properties @@ -0,0 +1,14 @@ +invalidPasswordMinLengthMessage=Ugyldig passord: minimum lengde {0}. +invalidPasswordMinLowerCaseCharsMessage=Ugyldig passord: m\u00E5 inneholde minst {0} sm\u00E5 bokstaver. +invalidPasswordMinDigitsMessage=Ugyldig passord: m\u00E5 inneholde minst {0} sifre. +invalidPasswordMinUpperCaseCharsMessage=Ugyldig passord: m\u00E5 inneholde minst {0} store bokstaver. +invalidPasswordMinSpecialCharsMessage=Ugyldig passord: m\u00E5 inneholde minst {0} spesialtegn. +invalidPasswordNotUsernameMessage=Ugyldig passord: kan ikke v\u00E6re likt brukernavn. +invalidPasswordRegexPatternMessage=Ugyldig passord: tilfredsstiller ikke kravene for passord-m\u00F8nster. +invalidPasswordHistoryMessage=Ugyldig passord: kan ikke v\u00E6re likt noen av de {0} foreg\u00E5ende passordene. + +ldapErrorInvalidCustomFilter=Tilpasset konfigurasjon av LDAP-filter starter ikke med "(" eller slutter ikke med ")". +ldapErrorMissingClientId=KlientID m\u00E5 v\u00E6re tilgjengelig i config n\u00E5r sikkerhetsdomenerollemapping ikke brukes. +ldapErrorCantPreserveGroupInheritanceWithUIDMembershipType=Ikke mulig \u00E5 bevare gruppearv og samtidig bruke UID medlemskapstype. +ldapErrorCantWriteOnlyForReadOnlyLdap=Kan ikke sette write-only n\u00E5r LDAP leverand\u00F8r-modus ikke er WRITABLE +ldapErrorCantWriteOnlyAndReadOnly=Kan ikke sette b\u00E5de write-only og read-only diff --git a/admin/messages/messages_pt_BR.properties b/admin/messages/messages_pt_BR.properties new file mode 100644 index 0000000..b26e465 --- /dev/null +++ b/admin/messages/messages_pt_BR.properties @@ -0,0 +1,18 @@ +#encoding: utf-8 +invalidPasswordMinLengthMessage=Senha inválida: deve conter ao menos {0} caracteres. +invalidPasswordMinLowerCaseCharsMessage=Senha inválida: deve conter ao menos {0} caracteres minúsculos. +invalidPasswordMinDigitsMessage=Senha inválida: deve conter ao menos {0} digitos numéricos. +invalidPasswordMinUpperCaseCharsMessage=Senha inválida: deve conter ao menos {0} caracteres maiúsculos. +invalidPasswordMinSpecialCharsMessage=Senha inválida: deve conter ao menos {0} caracteres especiais. +invalidPasswordNotUsernameMessage=Senha inválida: não deve ser igual ao nome de usuário. +invalidPasswordRegexPatternMessage=Senha inválida: falha ao passar por padrões. +invalidPasswordHistoryMessage=Senha inválida: não deve ser igual às últimas {0} senhas. + +ldapErrorInvalidCustomFilter=Filtro LDAP não inicia com "(" ou não termina com ")". +ldapErrorMissingClientId=ID do cliente precisa ser definido na configuração quando mapeamentos de Roles do Realm não é utilizado. +ldapErrorCantPreserveGroupInheritanceWithUIDMembershipType=Não é possível preservar herança de grupos e usar tipo de associação de UID ao mesmo tempo. +ldapErrorCantWriteOnlyForReadOnlyLdap=Não é possível definir modo de somente escrita quando o provedor LDAP não suporta escrita +ldapErrorCantWriteOnlyAndReadOnly=Não é possível definir somente escrita e somente leitura ao mesmo tempo + +clientRedirectURIsFragmentError=URIs de redirecionamento não podem conter fragmentos +clientRootURLFragmentError=URL raiz não pode conter fragmentos \ No newline at end of file diff --git a/admin/messages/messages_ru.properties b/admin/messages/messages_ru.properties new file mode 100644 index 0000000..efedac4 --- /dev/null +++ b/admin/messages/messages_ru.properties @@ -0,0 +1,26 @@ +# encoding: utf-8 +invalidPasswordMinLengthMessage=Некорректный пароль: длина пароля должна быть не менее {0} символов(а). +invalidPasswordMinDigitsMessage=Некорректный пароль: должен содержать не менее {0} цифр(ы). +invalidPasswordMinLowerCaseCharsMessage=Некорректный пароль: пароль должен содержать не менее {0} символов(а) в нижнем регистре. +invalidPasswordMinUpperCaseCharsMessage=Некорректный пароль: пароль должен содержать не менее {0} символов(а) в верхнем регистре. +invalidPasswordMinSpecialCharsMessage=Некорректный пароль: пароль должен содержать не менее {0} спецсимволов(а). +invalidPasswordNotUsernameMessage=Некорректный пароль: пароль не должен совпадать с именем пользователя. +invalidPasswordRegexPatternMessage=Некорректный пароль: пароль не прошел проверку по регулярному выражению. +invalidPasswordHistoryMessage=Некорректный пароль: пароль не должен совпадать с последним(и) {0} паролем(ями). +invalidPasswordGenericMessage=Некорректный пароль: новый пароль не соответствует правилам пароля. + +ldapErrorInvalidCustomFilter=Сконфигурированный пользователем фильтр LDAP не должен начинаться с "(" или заканчиваться на ")". +ldapErrorMissingClientId=Client ID должен быть настроен в конфигурации, если не используется сопоставление ролей в realm. +ldapErrorCantPreserveGroupInheritanceWithUIDMembershipType=Не удалось унаследовать группу и использовать членство UID типа вместе. +ldapErrorCantWriteOnlyForReadOnlyLdap=Невозможно установить режим "только на запись", когда LDAP провайдер не в режиме WRITABLE +ldapErrorCantWriteOnlyAndReadOnly=Невозможно одновременно установить режимы "только на чтение" и "только на запись" + +clientRedirectURIsFragmentError=URI перенаправления не должен содержать фрагмент URI +clientRootURLFragmentError=Корневой URL не должен содержать фрагмент URL + +pairwiseMalformedClientRedirectURI=Клиент содержит некорректный URI перенаправления. +pairwiseClientRedirectURIsMissingHost=URI перенаправления клиента должен содержать корректный компонент хоста. +pairwiseClientRedirectURIsMultipleHosts=Без конфигурации по части идентификатора URI, URI перенаправления клиента не может содержать несколько компонентов хоста. +pairwiseMalformedSectorIdentifierURI=Искаженная часть идентификатора URI. +pairwiseFailedToGetRedirectURIs=Не удалось получить идентификаторы URI перенаправления из части идентификатора URI. +pairwiseRedirectURIsMismatch=Клиент URI переадресации не соответствует URI переадресации, полученной из части идентификатора URI. diff --git a/admin/messages/messages_zh_CN.properties b/admin/messages/messages_zh_CN.properties new file mode 100644 index 0000000..622dccb --- /dev/null +++ b/admin/messages/messages_zh_CN.properties @@ -0,0 +1,26 @@ +# encoding: utf-8 +invalidPasswordMinLengthMessage=无效的密码:最短长度 {0}. +invalidPasswordMinLowerCaseCharsMessage=无效的密码:至少包含 {0} 小写字母 +invalidPasswordMinDigitsMessage=无效的密码:至少包含 {0} 个数字 +invalidPasswordMinUpperCaseCharsMessage=无效的密码:最短长度 {0} 大写字母 +invalidPasswordMinSpecialCharsMessage=无效的密码:最短长度 {0} 特殊字符 +invalidPasswordNotUsernameMessage=无效的密码: 不可以与用户名相同 +invalidPasswordRegexPatternMessage=无效的密码: 无法与正则表达式匹配 +invalidPasswordHistoryMessage=无效的密码:不能与最后使用的 {0} 个密码相同 + +ldapErrorInvalidCustomFilter=定制的 LDAP过滤器不是以 "(" 开头或以 ")"结尾. +ldapErrorConnectionTimeoutNotNumber=Connection Timeout 必须是个数字 +ldapErrorMissingClientId=当域角色映射未启用时,客户端 ID 需要指定。 +ldapErrorCantPreserveGroupInheritanceWithUIDMembershipType=无法在使用UID成员类型的同时维护组继承属性。 +ldapErrorCantWriteOnlyForReadOnlyLdap=当LDAP提供方不是可写模式时,无法设置只写 +ldapErrorCantWriteOnlyAndReadOnly=无法同时设置只读和只写 + +clientRedirectURIsFragmentError=重定向URL不应包含URI片段 +clientRootURLFragmentError=根URL 不应包含 URL 片段 + +pairwiseMalformedClientRedirectURI=客户端包含一个无效的重定向URL +pairwiseClientRedirectURIsMissingHost=客户端重定向URL需要有一个有效的主机 +pairwiseClientRedirectURIsMultipleHosts=Without a configured Sector Identifier URI, client redirect URIs must not contain multiple host components. +pairwiseMalformedSectorIdentifierURI=Malformed Sector Identifier URI. +pairwiseFailedToGetRedirectURIs=无法从服务器获得重定向URL +pairwiseRedirectURIsMismatch=客户端的重定向URI与服务器端获取的URI配置不匹配。 diff --git a/admin/resources/js/app.js b/admin/resources/js/app.js new file mode 100644 index 0000000..540f236 --- /dev/null +++ b/admin/resources/js/app.js @@ -0,0 +1,2958 @@ +'use strict'; + +var auth = {}; +var resourceBundle; +var locale = 'en'; + +var module = angular.module('keycloak', [ 'keycloak.services', 'keycloak.loaders', 'ui.bootstrap', 'ui.select2', 'angularFileUpload', 'angularTreeview', 'pascalprecht.translate', 'ngCookies', 'ngSanitize', 'ui.ace']); +var resourceRequests = 0; +var loadingTimer = -1; + +angular.element(document).ready(function () { + var keycloakAuth = new Keycloak(consoleBaseUrl + 'config'); + + function whoAmI(success, error) { + var req = new XMLHttpRequest(); + req.open('GET', consoleBaseUrl + 'whoami', true); + req.setRequestHeader('Accept', 'application/json'); + req.setRequestHeader('Authorization', 'bearer ' + keycloakAuth.token); + + req.onreadystatechange = function () { + if (req.readyState == 4) { + if (req.status == 200) { + var data = JSON.parse(req.responseText); + success(data); + } else { + error(); + } + } + } + + req.send(); + } + + function loadResourceBundle(success, error) { + var req = new XMLHttpRequest(); + req.open('GET', consoleBaseUrl + 'messages.json?lang=' + locale, true); + req.setRequestHeader('Accept', 'application/json'); + + req.onreadystatechange = function () { + if (req.readyState == 4) { + if (req.status == 200) { + var data = JSON.parse(req.responseText); + success && success(data); + } else { + error && error(); + } + } + } + + req.send(); + } + + function hasAnyAccess(user) { + return user && user['realm_access']; + } + + keycloakAuth.onAuthLogout = function() { + location.reload(); + } + + keycloakAuth.init({ onLoad: 'login-required' }).success(function () { + auth.authz = keycloakAuth; + + if (auth.authz.idTokenParsed.locale) { + locale = auth.authz.idTokenParsed.locale; + } + + auth.refreshPermissions = function(success, error) { + whoAmI(function(data) { + auth.user = data; + auth.loggedIn = true; + auth.hasAnyAccess = hasAnyAccess(data); + + success(); + }, function() { + error(); + }); + }; + + loadResourceBundle(function(data) { + resourceBundle = data; + + auth.refreshPermissions(function () { + module.factory('Auth', function () { + return auth; + }); + var injector = angular.bootstrap(document, ["keycloak"]); + + injector.get('$translate')('consoleTitle').then(function (consoleTitle) { + document.title = consoleTitle; + }); + }); + }); + }).error(function () { + window.location.reload(); + }); +}); + +module.factory('authInterceptor', function($q, Auth) { + return { + request: function (config) { + if (!config.url.match(/.html$/)) { + var deferred = $q.defer(); + if (Auth.authz.token) { + Auth.authz.updateToken(5).success(function () { + config.headers = config.headers || {}; + config.headers.Authorization = 'Bearer ' + Auth.authz.token; + + deferred.resolve(config); + }).error(function () { + location.reload(); + }); + } + return deferred.promise; + } else { + return config; + } + } + }; +}); + +module.config(['$translateProvider', function($translateProvider) { + $translateProvider.useSanitizeValueStrategy('sanitizeParameters'); + $translateProvider.preferredLanguage(locale); + $translateProvider.translations(locale, resourceBundle); +}]); + +// Change for upgrade to AngularJS 1.6 +// See https://github.com/angular/angular.js/commit/aa077e81129c740041438688dff2e8d20c3d7b52 +module.config(['$locationProvider', function($locationProvider) { + $locationProvider.hashPrefix(''); +}]); + +module.config([ '$routeProvider', function($routeProvider) { + $routeProvider + .when('/create/realm', { + templateUrl : resourceUrl + '/partials/realm-create.html', + resolve : { + + }, + controller : 'RealmCreateCtrl' + }) + .when('/realms/:realm', { + templateUrl : resourceUrl + '/partials/realm-detail.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + serverInfo : function(ServerInfoLoader) { + return ServerInfoLoader(); + } + }, + controller : 'RealmDetailCtrl' + }) + .when('/realms/:realm/login-settings', { + templateUrl : resourceUrl + '/partials/realm-login-settings.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + serverInfo : function(ServerInfo) { + return ServerInfo.delay; + } + }, + controller : 'RealmLoginSettingsCtrl' + }) + .when('/realms/:realm/theme-settings', { + templateUrl : resourceUrl + '/partials/realm-theme-settings.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + serverInfo : function(ServerInfoLoader) { + return ServerInfoLoader(); + } + }, + controller : 'RealmThemeCtrl' + }) + .when('/realms/:realm/cache-settings', { + templateUrl : resourceUrl + '/partials/realm-cache-settings.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + serverInfo : function(ServerInfoLoader) { + return ServerInfoLoader(); + } + }, + controller : 'RealmCacheCtrl' + }) + .when('/realms', { + templateUrl : resourceUrl + '/partials/realm-list.html', + controller : 'RealmListCtrl' + }) + .when('/realms/:realm/token-settings', { + templateUrl : resourceUrl + '/partials/realm-tokens.html', + resolve : { + serverInfo : function(ServerInfoLoader) { + return ServerInfoLoader(); + }, + realm : function(RealmLoader) { + return RealmLoader(); + } + }, + controller : 'RealmTokenDetailCtrl' + }) + .when('/realms/:realm/client-registration/client-initial-access', { + templateUrl : resourceUrl + '/partials/client-initial-access.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + clientInitialAccess : function(ClientInitialAccessLoader) { + return ClientInitialAccessLoader(); + } + }, + controller : 'ClientInitialAccessCtrl' + }) + .when('/realms/:realm/client-registration/client-initial-access/create', { + templateUrl : resourceUrl + '/partials/client-initial-access-create.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + } + }, + controller : 'ClientInitialAccessCreateCtrl' + }) + .when('/realms/:realm/client-registration/client-reg-policies', { + templateUrl : resourceUrl + '/partials/client-reg-policies.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + policies : function(ComponentsLoader) { + return ComponentsLoader.loadComponents(null, 'org.keycloak.services.clientregistration.policy.ClientRegistrationPolicy'); + }, + clientRegistrationPolicyProviders : function(ClientRegistrationPolicyProvidersLoader) { + return ClientRegistrationPolicyProvidersLoader(); + } + }, + controller : 'ClientRegPoliciesCtrl' + }) + .when('/realms/:realm/client-registration/client-reg-policies/create/:componentType/:providerId', { + templateUrl : resourceUrl + '/partials/client-reg-policy-detail.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + instance : function($route) { + return { + providerType: 'org.keycloak.services.clientregistration.policy.ClientRegistrationPolicy', + subType: $route.current.params.componentType, + providerId: $route.current.params.providerId + }; + }, + clientRegistrationPolicyProviders : function(ClientRegistrationPolicyProvidersLoader) { + return ClientRegistrationPolicyProvidersLoader(); + } + }, + controller : 'ClientRegPolicyDetailCtrl' + }) + .when('/realms/:realm/client-registration/client-reg-policies/:provider/:componentId', { + templateUrl : resourceUrl + '/partials/client-reg-policy-detail.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + instance : function(ComponentLoader) { + return ComponentLoader(); + }, + clientRegistrationPolicyProviders : function(ClientRegistrationPolicyProvidersLoader) { + return ClientRegistrationPolicyProvidersLoader(); + } + }, + controller : 'ClientRegPolicyDetailCtrl' + }) + .when('/realms/:realm/keys', { + templateUrl : resourceUrl + '/partials/realm-keys.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + serverInfo : function(ServerInfoLoader) { + return ServerInfoLoader(); + }, + keys: function(RealmKeysLoader) { + return RealmKeysLoader(); + } + }, + controller : 'RealmKeysCtrl' + }) + .when('/realms/:realm/keys/list', { + templateUrl : resourceUrl + '/partials/realm-keys-list.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + serverInfo : function(ServerInfoLoader) { + return ServerInfoLoader(); + }, + keys: function(RealmKeysLoader) { + return RealmKeysLoader(); + } + }, + controller : 'RealmKeysCtrl' + }) + .when('/realms/:realm/keys/providers', { + templateUrl : resourceUrl + '/partials/realm-keys-providers.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + serverInfo : function(ServerInfoLoader) { + return ServerInfoLoader(); + } + }, + controller : 'RealmKeysProvidersCtrl' + }) + .when('/create/keys/:realm/providers/:provider', { + templateUrl : resourceUrl + '/partials/realm-keys-generic.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + instance : function() { + return { + }; + }, + providerId : function($route) { + return $route.current.params.provider; + }, + serverInfo : function(ServerInfoLoader) { + return ServerInfoLoader(); + } + }, + controller : 'GenericKeystoreCtrl' + }) + .when('/realms/:realm/keys/providers/:provider/:componentId', { + templateUrl : resourceUrl + '/partials/realm-keys-generic.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + instance : function(ComponentLoader) { + return ComponentLoader(); + }, + providerId : function($route) { + return $route.current.params.provider; + }, + serverInfo : function(ServerInfoLoader) { + return ServerInfoLoader(); + } + }, + controller : 'GenericKeystoreCtrl' + }) + .when('/realms/:realm/identity-provider-settings', { + templateUrl : resourceUrl + '/partials/realm-identity-provider.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + serverInfo : function(ServerInfoLoader) { + return ServerInfoLoader(); + }, + instance : function(IdentityProviderLoader) { + return {}; + }, + providerFactory : function(IdentityProviderFactoryLoader) { + return {}; + }, + authFlows : function(AuthenticationFlowsLoader) { + return {}; + } + }, + controller : 'RealmIdentityProviderCtrl' + }) + .when('/create/identity-provider/:realm/:provider_id', { + templateUrl : function(params){ return resourceUrl + '/partials/realm-identity-provider-' + params.provider_id + '.html'; }, + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + serverInfo : function(ServerInfoLoader) { + return ServerInfoLoader(); + }, + instance : function(IdentityProviderLoader) { + return {}; + }, + providerFactory : function(IdentityProviderFactoryLoader) { + return new IdentityProviderFactoryLoader(); + }, + authFlows : function(AuthenticationFlowsLoader) { + return AuthenticationFlowsLoader(); + } + }, + controller : 'RealmIdentityProviderCtrl' + }) + .when('/realms/:realm/identity-provider-settings/provider/:provider_id/:alias', { + templateUrl : function(params){ return resourceUrl + '/partials/realm-identity-provider-' + params.provider_id + '.html'; }, + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + serverInfo : function(ServerInfoLoader) { + return ServerInfoLoader(); + }, + instance : function(IdentityProviderLoader) { + return IdentityProviderLoader(); + }, + providerFactory : function(IdentityProviderFactoryLoader) { + return IdentityProviderFactoryLoader(); + }, + authFlows : function(AuthenticationFlowsLoader) { + return AuthenticationFlowsLoader(); + } + }, + controller : 'RealmIdentityProviderCtrl' + }) + .when('/realms/:realm/identity-provider-settings/provider/:provider_id/:alias/export', { + templateUrl : resourceUrl + '/partials/realm-identity-provider-export.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + serverInfo : function(ServerInfoLoader) { + return ServerInfoLoader(); + }, + identityProvider : function(IdentityProviderLoader) { + return IdentityProviderLoader(); + }, + providerFactory : function(IdentityProviderFactoryLoader) { + return IdentityProviderFactoryLoader(); + } + }, + controller : 'RealmIdentityProviderExportCtrl' + }) + .when('/realms/:realm/identity-provider-mappers/:alias/mappers', { + templateUrl : function(params){ return resourceUrl + '/partials/identity-provider-mappers.html'; }, + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + identityProvider : function(IdentityProviderLoader) { + return IdentityProviderLoader(); + }, + mapperTypes : function(IdentityProviderMapperTypesLoader) { + return IdentityProviderMapperTypesLoader(); + }, + mappers : function(IdentityProviderMappersLoader) { + return IdentityProviderMappersLoader(); + } + }, + controller : 'IdentityProviderMapperListCtrl' + }) + .when('/realms/:realm/identity-provider-mappers/:alias/mappers/:mapperId', { + templateUrl : function(params){ return resourceUrl + '/partials/identity-provider-mapper-detail.html'; }, + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + identityProvider : function(IdentityProviderLoader) { + return IdentityProviderLoader(); + }, + mapperTypes : function(IdentityProviderMapperTypesLoader) { + return IdentityProviderMapperTypesLoader(); + }, + mapper : function(IdentityProviderMapperLoader) { + return IdentityProviderMapperLoader(); + } + }, + controller : 'IdentityProviderMapperCtrl' + }) + .when('/create/identity-provider-mappers/:realm/:alias', { + templateUrl : function(params){ return resourceUrl + '/partials/identity-provider-mapper-detail.html'; }, + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + identityProvider : function(IdentityProviderLoader) { + return IdentityProviderLoader(); + }, + mapperTypes : function(IdentityProviderMapperTypesLoader) { + return IdentityProviderMapperTypesLoader(); + } + }, + controller : 'IdentityProviderMapperCreateCtrl' + }) + + .when('/realms/:realm/default-roles', { + templateUrl : resourceUrl + '/partials/realm-default-roles.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + clients : function(ClientListLoader) { + return ClientListLoader(); + }, + roles : function(RoleListLoader) { + return RoleListLoader(); + } + }, + controller : 'RealmDefaultRolesCtrl' + }) + .when('/realms/:realm/smtp-settings', { + templateUrl : resourceUrl + '/partials/realm-smtp.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + } + }, + controller : 'RealmSMTPSettingsCtrl' + }) + .when('/realms/:realm/events', { + templateUrl : resourceUrl + '/partials/realm-events.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + serverInfo : function(ServerInfoLoader) { + return ServerInfoLoader(); + } + }, + controller : 'RealmEventsCtrl' + }) + .when('/realms/:realm/admin-events', { + templateUrl : resourceUrl + '/partials/realm-events-admin.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + serverInfo : function(ServerInfoLoader) { + return ServerInfoLoader(); + } + }, + controller : 'RealmAdminEventsCtrl' + }) + .when('/realms/:realm/events-settings', { + templateUrl : resourceUrl + '/partials/realm-events-config.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + serverInfo : function(ServerInfoLoader) { + return ServerInfoLoader(); + }, + eventsConfig : function(RealmEventsConfigLoader) { + return RealmEventsConfigLoader(); + } + }, + controller : 'RealmEventsConfigCtrl' + }) + .when('/realms/:realm/partial-import', { + templateUrl : resourceUrl + '/partials/partial-import.html', + resolve : { + resourceName : function() { return 'users'}, + realm : function(RealmLoader) { + return RealmLoader(); + } + }, + controller : 'RealmImportCtrl' + }) + .when('/realms/:realm/partial-export', { + templateUrl : resourceUrl + '/partials/partial-export.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + } + }, + controller : 'RealmExportCtrl' + }) + .when('/create/user/:realm', { + templateUrl : resourceUrl + '/partials/user-detail.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + user : function() { + return {}; + } + }, + controller : 'UserDetailCtrl' + }) + .when('/realms/:realm/users/:user', { + templateUrl : resourceUrl + '/partials/user-detail.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + user : function(UserLoader) { + return UserLoader(); + } + }, + controller : 'UserDetailCtrl' + }) + .when('/realms/:realm/users/:user/user-attributes', { + templateUrl : resourceUrl + '/partials/user-attributes.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + user : function(UserLoader) { + return UserLoader(); + } + }, + controller : 'UserDetailCtrl' + }) + .when('/realms/:realm/users/:user/user-credentials', { + templateUrl : resourceUrl + '/partials/user-credentials.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + user : function(UserLoader) { + return UserLoader(); + } + }, + controller : 'UserCredentialsCtrl' + }) + .when('/realms/:realm/users/:user/role-mappings', { + templateUrl : resourceUrl + '/partials/role-mappings.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + user : function(UserLoader) { + return UserLoader(); + }, + clients : function(ClientListLoader) { + return ClientListLoader(); + }, + client : function() { + return {}; + } + }, + controller : 'UserRoleMappingCtrl' + }) + .when('/realms/:realm/users/:user/groups', { + templateUrl : resourceUrl + '/partials/user-group-membership.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + user : function(UserLoader) { + return UserLoader(); + }, + groups : function(GroupListLoader) { + return GroupListLoader(); + } + }, + controller : 'UserGroupMembershipCtrl' + }) + .when('/realms/:realm/users/:user/sessions', { + templateUrl : resourceUrl + '/partials/user-sessions.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + user : function(UserLoader) { + return UserLoader(); + }, + sessions : function(UserSessionsLoader) { + return UserSessionsLoader(); + } + }, + controller : 'UserSessionsCtrl' + }) + .when('/realms/:realm/users/:user/federated-identity', { + templateUrl : resourceUrl + '/partials/user-federated-identity-list.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + user : function(UserLoader) { + return UserLoader(); + }, + federatedIdentities : function(UserFederatedIdentityLoader) { + return UserFederatedIdentityLoader(); + } + }, + controller : 'UserFederatedIdentityCtrl' + }) + .when('/create/federated-identity/:realm/:user', { + templateUrl : resourceUrl + '/partials/user-federated-identity-detail.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + user : function(UserLoader) { + return UserLoader(); + }, + federatedIdentities : function(UserFederatedIdentityLoader) { + return UserFederatedIdentityLoader(); + } + }, + controller : 'UserFederatedIdentityAddCtrl' + }) + .when('/realms/:realm/users/:user/consents', { + templateUrl : resourceUrl + '/partials/user-consents.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + user : function(UserLoader) { + return UserLoader(); + }, + userConsents : function(UserConsentsLoader) { + return UserConsentsLoader(); + } + }, + controller : 'UserConsentsCtrl' + }) + .when('/realms/:realm/users/:user/offline-sessions/:client', { + templateUrl : resourceUrl + '/partials/user-offline-sessions.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + user : function(UserLoader) { + return UserLoader(); + }, + client : function(ClientLoader) { + return ClientLoader(); + }, + offlineSessions : function(UserOfflineSessionsLoader) { + return UserOfflineSessionsLoader(); + } + }, + controller : 'UserOfflineSessionsCtrl' + }) + .when('/realms/:realm/users', { + templateUrl : resourceUrl + '/partials/user-list.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + } + }, + controller : 'UserListCtrl' + }) + + .when('/create/role/:realm', { + templateUrl : resourceUrl + '/partials/role-detail.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + role : function() { + return {}; + }, + roles : function(RoleListLoader) { + return RoleListLoader(); + }, + clients : function(ClientListLoader) { + return ClientListLoader(); + } + }, + controller : 'RoleDetailCtrl' + }) + .when('/realms/:realm/roles/:role', { + templateUrl : resourceUrl + '/partials/role-detail.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + role : function(RoleLoader) { + return RoleLoader(); + }, + roles : function(RoleListLoader) { + return RoleListLoader(); + }, + clients : function(ClientListLoader) { + return ClientListLoader(); + } + }, + controller : 'RoleDetailCtrl' + }) + .when('/realms/:realm/roles/:role/users', { + templateUrl : resourceUrl + '/partials/realm-role-users.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + role : function(RoleLoader) { + return RoleLoader(); + } + }, + controller : 'RoleMembersCtrl' + }) + .when('/realms/:realm/roles', { + templateUrl : resourceUrl + '/partials/role-list.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + roles : function(RoleListLoader) { + return RoleListLoader(); + } + }, + controller : 'RoleListCtrl' + }) + .when('/realms/:realm/groups', { + templateUrl : resourceUrl + '/partials/group-list.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + } + }, + controller : 'GroupListCtrl' + }) + .when('/create/group/:realm/parent/:parentId', { + templateUrl : resourceUrl + '/partials/create-group.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + parentId : function($route) { + return $route.current.params.parentId; + } + }, + controller : 'GroupCreateCtrl' + }) + .when('/realms/:realm/groups/:group', { + templateUrl : resourceUrl + '/partials/group-detail.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + group : function(GroupLoader) { + return GroupLoader(); + } + }, + controller : 'GroupDetailCtrl' + }) + .when('/realms/:realm/groups/:group/attributes', { + templateUrl : resourceUrl + '/partials/group-attributes.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + group : function(GroupLoader) { + return GroupLoader(); + } + }, + controller : 'GroupDetailCtrl' + }) + .when('/realms/:realm/groups/:group/members', { + templateUrl : resourceUrl + '/partials/group-members.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + group : function(GroupLoader) { + return GroupLoader(); + } + }, + controller : 'GroupMembersCtrl' + }) + .when('/realms/:realm/groups/:group/role-mappings', { + templateUrl : resourceUrl + '/partials/group-role-mappings.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + group : function(GroupLoader) { + return GroupLoader(); + }, + clients : function(ClientListLoader) { + return ClientListLoader(); + }, + client : function() { + return {}; + } + }, + controller : 'GroupRoleMappingCtrl' + }) + .when('/realms/:realm/default-groups', { + templateUrl : resourceUrl + '/partials/default-groups.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + groups : function(GroupListLoader) { + return GroupListLoader(); + } + }, + controller : 'DefaultGroupsCtrl' + }) + + + .when('/create/role/:realm/clients/:client', { + templateUrl : resourceUrl + '/partials/client-role-detail.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + client : function(ClientLoader) { + return ClientLoader(); + }, + role : function() { + return {}; + }, + roles : function(RoleListLoader) { + return RoleListLoader(); + }, + clients : function(ClientListLoader) { + return ClientListLoader(); + } + }, + controller : 'ClientRoleDetailCtrl' + }) + .when('/realms/:realm/clients/:client/roles/:role', { + templateUrl : resourceUrl + '/partials/client-role-detail.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + client : function(ClientLoader) { + return ClientLoader(); + }, + role : function(ClientRoleLoader) { + return ClientRoleLoader(); + }, + roles : function(RoleListLoader) { + return RoleListLoader(); + }, + clients : function(ClientListLoader) { + return ClientListLoader(); + } + }, + controller : 'ClientRoleDetailCtrl' + }) + .when('/realms/:realm/clients/:client/mappers', { + templateUrl : resourceUrl + '/partials/client-mappers.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + client : function(ClientLoader) { + return ClientLoader(); + }, + templates : function(ClientTemplateListLoader) { + return ClientTemplateListLoader(); + }, + serverInfo : function(ServerInfoLoader) { + return ServerInfoLoader(); + } + }, + controller : 'ClientProtocolMapperListCtrl' + }) + .when('/realms/:realm/clients/:client/add-mappers', { + templateUrl : resourceUrl + '/partials/client-mappers-add.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + client : function(ClientLoader) { + return ClientLoader(); + }, + serverInfo : function(ServerInfoLoader) { + return ServerInfoLoader(); + } + }, + controller : 'AddBuiltinProtocolMapperCtrl' + }) + .when('/realms/:realm/clients/:client/mappers/:id', { + templateUrl : resourceUrl + '/partials/client-protocol-mapper-detail.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + client : function(ClientLoader) { + return ClientLoader(); + }, + serverInfo : function(ServerInfoLoader) { + return ServerInfoLoader(); + }, + mapper : function(ClientProtocolMapperLoader) { + return ClientProtocolMapperLoader(); + }, + clients : function(ClientListLoader) { + return ClientListLoader(); + } + + }, + controller : 'ClientProtocolMapperCtrl' + }) + .when('/create/client/:realm/:client/mappers', { + templateUrl : resourceUrl + '/partials/client-protocol-mapper-detail.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + serverInfo : function(ServerInfoLoader) { + return ServerInfoLoader(); + }, + client : function(ClientLoader) { + return ClientLoader(); + }, + clients : function(ClientListLoader) { + return ClientListLoader(); + } + }, + controller : 'ClientProtocolMapperCreateCtrl' + }) + .when('/realms/:realm/client-templates/:template/mappers', { + templateUrl : resourceUrl + '/partials/client-template-mappers.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + template : function(ClientTemplateLoader) { + return ClientTemplateLoader(); + }, + serverInfo : function(ServerInfoLoader) { + return ServerInfoLoader(); + } + }, + controller : 'ClientTemplateProtocolMapperListCtrl' + }) + .when('/realms/:realm/client-templates/:template/add-mappers', { + templateUrl : resourceUrl + '/partials/client-template-mappers-add.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + template : function(ClientTemplateLoader) { + return ClientTemplateLoader(); + }, + serverInfo : function(ServerInfoLoader) { + return ServerInfoLoader(); + } + }, + controller : 'ClientTemplateAddBuiltinProtocolMapperCtrl' + }) + .when('/realms/:realm/client-templates/:template/mappers/:id', { + templateUrl : resourceUrl + '/partials/client-template-protocol-mapper-detail.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + template : function(ClientTemplateLoader) { + return ClientTemplateLoader(); + }, + serverInfo : function(ServerInfoLoader) { + return ServerInfoLoader(); + }, + mapper : function(ClientTemplateProtocolMapperLoader) { + return ClientTemplateProtocolMapperLoader(); + }, + clients : function(ClientListLoader) { + return ClientListLoader(); + } + + }, + controller : 'ClientTemplateProtocolMapperCtrl' + }) + .when('/create/client-template/:realm/:template/mappers', { + templateUrl : resourceUrl + '/partials/client-template-protocol-mapper-detail.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + serverInfo : function(ServerInfoLoader) { + return ServerInfoLoader(); + }, + template : function(ClientTemplateLoader) { + return ClientTemplateLoader(); + }, + clients : function(ClientListLoader) { + return ClientListLoader(); + } + }, + controller : 'ClientTemplateProtocolMapperCreateCtrl' + }) + .when('/realms/:realm/clients/:client/sessions', { + templateUrl : resourceUrl + '/partials/client-sessions.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + client : function(ClientLoader) { + return ClientLoader(); + }, + sessionCount : function(ClientSessionCountLoader) { + return ClientSessionCountLoader(); + } + }, + controller : 'ClientSessionsCtrl' + }) + .when('/realms/:realm/clients/:client/offline-access', { + templateUrl : resourceUrl + '/partials/client-offline-sessions.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + client : function(ClientLoader) { + return ClientLoader(); + }, + offlineSessionCount : function(ClientOfflineSessionCountLoader) { + return ClientOfflineSessionCountLoader(); + } + }, + controller : 'ClientOfflineSessionsCtrl' + }) + .when('/realms/:realm/clients/:client/credentials', { + templateUrl : resourceUrl + '/partials/client-credentials.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + client : function(ClientLoader) { + return ClientLoader(); + }, + clientAuthenticatorProviders : function(ClientAuthenticatorProvidersLoader) { + return ClientAuthenticatorProvidersLoader(); + }, + clientConfigProperties: function(PerClientAuthenticationConfigDescriptionLoader) { + return PerClientAuthenticationConfigDescriptionLoader(); + } + }, + controller : 'ClientCredentialsCtrl' + }) + .when('/realms/:realm/clients/:client/credentials/client-jwt/:keyType/import/:attribute', { + templateUrl : resourceUrl + '/partials/client-credentials-jwt-key-import.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + client : function(ClientLoader) { + return ClientLoader(); + }, + callingContext : function() { + return "jwt-credentials"; + } + }, + controller : 'ClientCertificateImportCtrl' + }) + .when('/realms/:realm/clients/:client/credentials/client-jwt/:keyType/export/:attribute', { + templateUrl : resourceUrl + '/partials/client-credentials-jwt-key-export.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + client : function(ClientLoader) { + return ClientLoader(); + }, + callingContext : function() { + return "jwt-credentials"; + } + }, + controller : 'ClientCertificateExportCtrl' + }) + .when('/realms/:realm/clients/:client/identity-provider', { + templateUrl : resourceUrl + '/partials/client-identity-provider.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + client : function(ClientLoader) { + return ClientLoader(); + } + }, + controller : 'ClientIdentityProviderCtrl' + }) + .when('/realms/:realm/clients/:client/clustering', { + templateUrl : resourceUrl + '/partials/client-clustering.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + client : function(ClientLoader) { + return ClientLoader(); + } + }, + controller : 'ClientClusteringCtrl' + }) + .when('/register-node/realms/:realm/clients/:client/clustering', { + templateUrl : resourceUrl + '/partials/client-clustering-node.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + client : function(ClientLoader) { + return ClientLoader(); + } + }, + controller : 'ClientClusteringNodeCtrl' + }) + .when('/realms/:realm/clients/:client/clustering/:node', { + templateUrl : resourceUrl + '/partials/client-clustering-node.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + client : function(ClientLoader) { + return ClientLoader(); + } + }, + controller : 'ClientClusteringNodeCtrl' + }) + .when('/realms/:realm/clients/:client/saml/keys', { + templateUrl : resourceUrl + '/partials/client-saml-keys.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + client : function(ClientLoader) { + return ClientLoader(); + } + }, + controller : 'ClientSamlKeyCtrl' + }) + .when('/realms/:realm/clients/:client/saml/:keyType/import/:attribute', { + templateUrl : resourceUrl + '/partials/client-saml-key-import.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + client : function(ClientLoader) { + return ClientLoader(); + }, + callingContext : function() { + return "saml"; + } + }, + controller : 'ClientCertificateImportCtrl' + }) + .when('/realms/:realm/clients/:client/saml/:keyType/export/:attribute', { + templateUrl : resourceUrl + '/partials/client-saml-key-export.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + client : function(ClientLoader) { + return ClientLoader(); + }, + callingContext : function() { + return "saml"; + } + }, + controller : 'ClientCertificateExportCtrl' + }) + .when('/realms/:realm/clients/:client/roles', { + templateUrl : resourceUrl + '/partials/client-role-list.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + client : function(ClientLoader) { + return ClientLoader(); + }, + roles : function(ClientRoleListLoader) { + return ClientRoleListLoader(); + } + }, + controller : 'ClientRoleListCtrl' + }) + .when('/realms/:realm/clients/:client/revocation', { + templateUrl : resourceUrl + '/partials/client-revocation.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + client : function(ClientLoader) { + return ClientLoader(); + } + }, + controller : 'ClientRevocationCtrl' + }) + .when('/realms/:realm/clients/:client/scope-mappings', { + templateUrl : resourceUrl + '/partials/client-scope-mappings.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + client : function(ClientLoader) { + return ClientLoader(); + }, + templates : function(ClientTemplateListLoader) { + return ClientTemplateListLoader(); + }, + clients : function(ClientListLoader) { + return ClientListLoader(); + } + }, + controller : 'ClientScopeMappingCtrl' + }) + .when('/realms/:realm/clients/:client/installation', { + templateUrl : resourceUrl + '/partials/client-installation.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + client : function(ClientLoader) { + return ClientLoader(); + }, + serverInfo : function(ServerInfoLoader) { + return ServerInfoLoader(); + } + }, + controller : 'ClientInstallationCtrl' + }) + .when('/realms/:realm/clients/:client/service-account-roles', { + templateUrl : resourceUrl + '/partials/client-service-account-roles.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + user : function(ClientServiceAccountUserLoader) { + return ClientServiceAccountUserLoader(); + }, + clients : function(ClientListLoader) { + return ClientListLoader(); + }, + client : function(ClientLoader) { + return ClientLoader(); + } + }, + controller : 'UserRoleMappingCtrl' + }) + .when('/create/client/:realm', { + templateUrl : resourceUrl + '/partials/create-client.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + templates : function(ClientTemplateListLoader) { + return ClientTemplateListLoader(); + }, + clients : function(ClientListLoader) { + return ClientListLoader(); + }, + client : function() { + return {}; + }, + serverInfo : function(ServerInfoLoader) { + return ServerInfoLoader(); + } + }, + controller : 'CreateClientCtrl' + }) + .when('/realms/:realm/clients/:client', { + templateUrl : resourceUrl + '/partials/client-detail.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + templates : function(ClientTemplateListLoader) { + return ClientTemplateListLoader(); + }, + clients : function(ClientListLoader) { + return ClientListLoader(); + }, + client : function(ClientLoader) { + return ClientLoader(); + }, + serverInfo : function(ServerInfoLoader) { + return ServerInfoLoader(); + } + }, + controller : 'ClientDetailCtrl' + }) + .when('/create/client-template/:realm', { + templateUrl : resourceUrl + '/partials/client-template-detail.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + templates : function(ClientTemplateListLoader) { + return ClientTemplateListLoader(); + }, + template : function() { + return {}; + }, + serverInfo : function(ServerInfoLoader) { + return ServerInfoLoader(); + } + }, + controller : 'ClientTemplateDetailCtrl' + }) + .when('/realms/:realm/client-templates/:template', { + templateUrl : resourceUrl + '/partials/client-template-detail.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + templates : function(ClientTemplateListLoader) { + return ClientTemplateListLoader(); + }, + template : function(ClientTemplateLoader) { + return ClientTemplateLoader(); + }, + serverInfo : function(ServerInfoLoader) { + return ServerInfoLoader(); + } + }, + controller : 'ClientTemplateDetailCtrl' + }) + .when('/realms/:realm/client-templates/:template/scope-mappings', { + templateUrl : resourceUrl + '/partials/client-template-scope-mappings.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + template : function(ClientTemplateLoader) { + return ClientTemplateLoader(); + }, + clients : function(ClientListLoader) { + return ClientListLoader(); + } + }, + controller : 'ClientTemplateScopeMappingCtrl' + }) + .when('/realms/:realm/clients', { + templateUrl : resourceUrl + '/partials/client-list.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + serverInfo : function(ServerInfoLoader) { + return ServerInfoLoader(); + } + + }, + controller : 'ClientListCtrl' + }) + .when('/realms/:realm/client-templates', { + templateUrl : resourceUrl + '/partials/client-template-list.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + templates : function(ClientTemplateListLoader) { + return ClientTemplateListLoader(); + }, + serverInfo : function(ServerInfoLoader) { + return ServerInfoLoader(); + } + + }, + controller : 'ClientTemplateListCtrl' + }) + .when('/import/client/:realm', { + templateUrl : resourceUrl + '/partials/client-import.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + serverInfo : function(ServerInfoLoader) { + return ServerInfoLoader(); + } + }, + controller : 'ClientImportCtrl' + }) + .when('/', { + templateUrl : resourceUrl + '/partials/home.html', + controller : 'HomeCtrl' + }) + .when('/mocks/:realm', { + templateUrl : resourceUrl + '/partials/realm-detail_mock.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + serverInfo : function(ServerInfoLoader) { + return ServerInfoLoader(); + } + }, + controller : 'RealmDetailCtrl' + }) + .when('/realms/:realm/sessions/revocation', { + templateUrl : resourceUrl + '/partials/session-revocation.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + } + }, + controller : 'RealmRevocationCtrl' + }) + .when('/realms/:realm/sessions/realm', { + templateUrl : resourceUrl + '/partials/session-realm.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + stats : function(RealmClientSessionStatsLoader) { + return RealmClientSessionStatsLoader(); + } + }, + controller : 'RealmSessionStatsCtrl' + }) + .when('/create/user-storage/:realm/providers/ldap', { + templateUrl : resourceUrl + '/partials/user-storage-ldap.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + instance : function() { + return { + + }; + }, + providerId : function($route) { + return $route.current.params.provider; + }, + serverInfo : function(ServerInfoLoader) { + return ServerInfoLoader(); + } + }, + controller : 'LDAPUserStorageCtrl' + }) + .when('/create/user-storage/:realm/providers/kerberos', { + templateUrl : resourceUrl + '/partials/user-storage-kerberos.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + instance : function() { + return { + + }; + }, + providerId : function($route) { + return "kerberos"; + }, + serverInfo : function(ServerInfoLoader) { + return ServerInfoLoader(); + } + }, + controller : 'GenericUserStorageCtrl' + }) + .when('/create/user-storage/:realm/providers/:provider', { + templateUrl : resourceUrl + '/partials/user-storage-generic.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + instance : function() { + return { + + }; + }, + providerId : function($route) { + return $route.current.params.provider; + }, + serverInfo : function(ServerInfoLoader) { + return ServerInfoLoader(); + } + }, + controller : 'GenericUserStorageCtrl' + }) + .when('/realms/:realm/user-storage/providers/ldap/:componentId', { + templateUrl : resourceUrl + '/partials/user-storage-ldap.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + instance : function(ComponentLoader) { + return ComponentLoader(); + }, + providerId : function($route) { + return $route.current.params.provider; + }, + serverInfo : function(ServerInfoLoader) { + return ServerInfoLoader(); + } + }, + controller : 'LDAPUserStorageCtrl' + }) + .when('/realms/:realm/user-storage/providers/kerberos/:componentId', { + templateUrl : resourceUrl + '/partials/user-storage-kerberos.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + instance : function(ComponentLoader) { + return ComponentLoader(); + }, + providerId : function($route) { + return "kerberos"; + }, + serverInfo : function(ServerInfoLoader) { + return ServerInfoLoader(); + } + }, + controller : 'GenericUserStorageCtrl' + }) + .when('/realms/:realm/user-storage/providers/:provider/:componentId', { + templateUrl : resourceUrl + '/partials/user-storage-generic.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + instance : function(ComponentLoader) { + return ComponentLoader(); + }, + providerId : function($route) { + return $route.current.params.provider; + }, + serverInfo : function(ServerInfoLoader) { + return ServerInfoLoader(); + } + }, + controller : 'GenericUserStorageCtrl' + }) + .when('/realms/:realm/ldap-mappers/:componentId', { + templateUrl : function(params){ return resourceUrl + '/partials/user-storage-ldap-mappers.html'; }, + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + provider : function(ComponentLoader) { + return ComponentLoader(); + }, + mappers : function(ComponentsLoader, $route) { + return ComponentsLoader.loadComponents($route.current.params.componentId, 'org.keycloak.storage.ldap.mappers.LDAPStorageMapper'); + } + }, + controller : 'LDAPMapperListCtrl' + }) + .when('/create/ldap-mappers/:realm/:componentId', { + templateUrl : function(params){ return resourceUrl + '/partials/user-storage-ldap-mapper-detail.html'; }, + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + provider : function(ComponentLoader) { + return ComponentLoader(); + }, + mapperTypes : function(SubComponentTypesLoader, $route) { + return SubComponentTypesLoader.loadComponents($route.current.params.componentId, 'org.keycloak.storage.ldap.mappers.LDAPStorageMapper'); + }, + clients : function(ClientListLoader) { + return ClientListLoader(); + } + }, + controller : 'LDAPMapperCreateCtrl' + }) + .when('/realms/:realm/ldap-mappers/:componentId/mappers/:mapperId', { + templateUrl : function(params){ return resourceUrl + '/partials/user-storage-ldap-mapper-detail.html'; }, + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + provider : function(ComponentLoader) { + return ComponentLoader(); + }, + mapperTypes : function(SubComponentTypesLoader, $route) { + return SubComponentTypesLoader.loadComponents($route.current.params.componentId, 'org.keycloak.storage.ldap.mappers.LDAPStorageMapper'); + }, + mapper : function(LDAPMapperLoader) { + return LDAPMapperLoader(); + }, + clients : function(ClientListLoader) { + return ClientListLoader(); + } + }, + controller : 'LDAPMapperCtrl' + }) + .when('/realms/:realm/user-federation', { + templateUrl : resourceUrl + '/partials/user-federation.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + serverInfo : function(ServerInfoLoader) { + return ServerInfoLoader(); + } + }, + controller : 'UserFederationCtrl' + }) + .when('/realms/:realm/defense/headers', { + templateUrl : resourceUrl + '/partials/defense-headers.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + serverInfo : function(ServerInfoLoader) { + return ServerInfoLoader(); + } + + }, + controller : 'DefenseHeadersCtrl' + }) + .when('/realms/:realm/defense/brute-force', { + templateUrl : resourceUrl + '/partials/brute-force.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + } + }, + controller : 'RealmBruteForceCtrl' + }) + .when('/realms/:realm/protocols', { + templateUrl : resourceUrl + '/partials/protocol-list.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + serverInfo : function(ServerInfoLoader) { + return ServerInfoLoader(); + } + + }, + controller : 'ProtocolListCtrl' + }) + .when('/realms/:realm/authentication/flows', { + templateUrl : resourceUrl + '/partials/authentication-flows.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + flows : function(AuthenticationFlowsLoader) { + return AuthenticationFlowsLoader(); + }, + selectedFlow : function() { + return null; + } + }, + controller : 'AuthenticationFlowsCtrl' + }) + .when('/realms/:realm/authentication/flow-bindings', { + templateUrl : resourceUrl + '/partials/authentication-flow-bindings.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + flows : function(AuthenticationFlowsLoader) { + return AuthenticationFlowsLoader(); + }, + serverInfo : function(ServerInfoLoader) { + return ServerInfoLoader(); + } + }, + controller : 'RealmFlowBindingCtrl' + }) + .when('/realms/:realm/authentication/flows/:flow', { + templateUrl : resourceUrl + '/partials/authentication-flows.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + flows : function(AuthenticationFlowsLoader) { + return AuthenticationFlowsLoader(); + }, + selectedFlow : function($route) { + return $route.current.params.flow; + } + }, + controller : 'AuthenticationFlowsCtrl' + }) + .when('/realms/:realm/authentication/flows/:flow/create/execution/:topFlow', { + templateUrl : resourceUrl + '/partials/create-execution.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + topFlow: function($route) { + return $route.current.params.topFlow; + }, + parentFlow : function(AuthenticationFlowLoader) { + return AuthenticationFlowLoader(); + }, + formActionProviders : function(AuthenticationFormActionProvidersLoader) { + return AuthenticationFormActionProvidersLoader(); + }, + authenticatorProviders : function(AuthenticatorProvidersLoader) { + return AuthenticatorProvidersLoader(); + }, + clientAuthenticatorProviders : function(ClientAuthenticatorProvidersLoader) { + return ClientAuthenticatorProvidersLoader(); + } + }, + controller : 'CreateExecutionCtrl' + }) + .when('/realms/:realm/authentication/flows/:flow/create/flow/execution/:topFlow', { + templateUrl : resourceUrl + '/partials/create-flow-execution.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + topFlow: function($route) { + return $route.current.params.topFlow; + }, + parentFlow : function(AuthenticationFlowLoader) { + return AuthenticationFlowLoader(); + }, + formProviders : function(AuthenticationFormProvidersLoader) { + return AuthenticationFormProvidersLoader(); + } + }, + controller : 'CreateExecutionFlowCtrl' + }) + .when('/realms/:realm/authentication/create/flow', { + templateUrl : resourceUrl + '/partials/create-flow.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + } + }, + controller : 'CreateFlowCtrl' + }) + .when('/realms/:realm/authentication/required-actions', { + templateUrl : resourceUrl + '/partials/required-actions.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + unregisteredRequiredActions : function(UnregisteredRequiredActionsListLoader) { + return UnregisteredRequiredActionsListLoader(); + } + }, + controller : 'RequiredActionsCtrl' + }) + .when('/realms/:realm/authentication/password-policy', { + templateUrl : resourceUrl + '/partials/password-policy.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + serverInfo : function(ServerInfoLoader) { + return ServerInfoLoader(); + } + }, + controller : 'RealmPasswordPolicyCtrl' + }) + .when('/realms/:realm/authentication/otp-policy', { + templateUrl : resourceUrl + '/partials/otp-policy.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + serverInfo : function(ServerInfo) { + return ServerInfo.delay; + } + }, + controller : 'RealmOtpPolicyCtrl' + }) + .when('/realms/:realm/authentication/flows/:flow/config/:provider/:config', { + templateUrl : resourceUrl + '/partials/authenticator-config.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + flow : function(AuthenticationFlowLoader) { + return AuthenticationFlowLoader(); + }, + configType : function(AuthenticationConfigDescriptionLoader) { + return AuthenticationConfigDescriptionLoader(); + }, + config : function(AuthenticationConfigLoader) { + return AuthenticationConfigLoader(); + } + }, + controller : 'AuthenticationConfigCtrl' + }) + .when('/create/authentication/:realm/flows/:flow/execution/:executionId/provider/:provider', { + templateUrl : resourceUrl + '/partials/authenticator-config.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + flow : function(AuthenticationFlowLoader) { + return AuthenticationFlowLoader(); + }, + configType : function(AuthenticationConfigDescriptionLoader) { + return AuthenticationConfigDescriptionLoader(); + }, + execution : function(ExecutionIdLoader) { + return ExecutionIdLoader(); + } + }, + controller : 'AuthenticationConfigCreateCtrl' + }) + .when('/server-info', { + templateUrl : resourceUrl + '/partials/server-info.html', + resolve : { + serverInfo : function(ServerInfoLoader) { + return ServerInfoLoader(); + } + }, + controller : 'ServerInfoCtrl' + }) + .when('/server-info/providers', { + templateUrl : resourceUrl + '/partials/server-info-providers.html', + resolve : { + serverInfo : function(ServerInfoLoader) { + return ServerInfoLoader(); + } + }, + controller : 'ServerInfoCtrl' + }) + .when('/logout', { + templateUrl : resourceUrl + '/partials/home.html', + controller : 'LogoutCtrl' + }) + .when('/notfound', { + templateUrl : resourceUrl + '/partials/notfound.html' + }) + .when('/forbidden', { + templateUrl : resourceUrl + '/partials/forbidden.html' + }) + .otherwise({ + templateUrl : resourceUrl + '/partials/pagenotfound.html' + }); +} ]); + +module.config(function($httpProvider) { + $httpProvider.interceptors.push('errorInterceptor'); + + var spinnerFunction = function(data, headersGetter) { + if (resourceRequests == 0) { + loadingTimer = window.setTimeout(function() { + $('#loading').show(); + loadingTimer = -1; + }, 500); + } + resourceRequests++; + return data; + }; + $httpProvider.defaults.transformRequest.push(spinnerFunction); + + $httpProvider.interceptors.push('spinnerInterceptor'); + $httpProvider.interceptors.push('authInterceptor'); + +}); + +module.factory('spinnerInterceptor', function($q, $window, $rootScope, $location) { + return { + response: function(response) { + resourceRequests--; + if (resourceRequests == 0) { + if(loadingTimer != -1) { + window.clearTimeout(loadingTimer); + loadingTimer = -1; + } + $('#loading').hide(); + } + return response; + }, + responseError: function(response) { + resourceRequests--; + if (resourceRequests == 0) { + if(loadingTimer != -1) { + window.clearTimeout(loadingTimer); + loadingTimer = -1; + } + $('#loading').hide(); + } + + return $q.reject(response); + } + }; +}); + +module.factory('errorInterceptor', function($q, $window, $rootScope, $location, Notifications, Auth) { + return { + response: function(response) { + return response; + }, + responseError: function(response) { + if (response.status == 401) { + Auth.authz.logout(); + } else if (response.status == 403) { + $location.path('/forbidden'); + } else if (response.status == 404) { + $location.path('/notfound'); + } else if (response.status) { + if (response.data && response.data.errorMessage) { + Notifications.error(response.data.errorMessage); + } else if (response.data && response.data.error_description) { + Notifications.error(response.data.error_description); + } else { + Notifications.error("An unexpected server error has occurred"); + } + } else { + Notifications.error("No response from server."); + } + return $q.reject(response); + } + }; +}); + +// collapsable form fieldsets +module.directive('collapsable', function() { + return function(scope, element, attrs) { + element.click(function() { + $(this).toggleClass('collapsed'); + $(this).find('.toggle-icons').toggleClass('kc-icon-collapse').toggleClass('kc-icon-expand'); + $(this).find('.toggle-icons').text($(this).text() == "Icon: expand" ? "Icon: collapse" : "Icon: expand"); + $(this).parent().find('.form-group').toggleClass('hidden'); + }); + } +}); + +// collapsable form fieldsets +module.directive('uncollapsed', function() { + return function(scope, element, attrs) { + element.prepend(' '); + element.click(function() { + $(this).find('.toggle-class').toggleClass('fa-angle-down').toggleClass('fa-angle-right'); + $(this).parent().find('.form-group').toggleClass('hidden'); + }); + } +}); + +// collapsable form fieldsets +module.directive('collapsed', function() { + return function(scope, element, attrs) { + element.prepend(' '); + element.parent().find('.form-group').toggleClass('hidden'); + element.click(function() { + $(this).find('.toggle-class').toggleClass('fa-angle-down').toggleClass('fa-angle-right'); + $(this).parent().find('.form-group').toggleClass('hidden'); + }); + } +}); + +/** + * Directive for presenting an ON-OFF switch for checkbox. + * Usage: + */ +module.directive('onoffswitch', function() { + return { + restrict: "EA", + replace: true, + scope: { + name: '@', + id: '@', + ngModel: '=', + ngDisabled: '=', + kcOnText: '@onText', + kcOffText: '@offText' + }, + // TODO - The same code acts differently when put into the templateURL. Find why and move the code there. + //templateUrl: "templates/kc-switch.html", + template: "
", + compile: function(element, attrs) { + /* + We don't want to propagate basic attributes to the root element of directive. Id should be passed to the + input element only to achieve proper label binding (and validity). + */ + element.removeAttr('name'); + element.removeAttr('id'); + + if (!attrs.onText) { attrs.onText = "ON"; } + if (!attrs.offText) { attrs.offText = "OFF"; } + + element.bind('keydown', function(e){ + var code = e.keyCode || e.which; + if (code === 32 || code === 13) { + e.stopImmediatePropagation(); + e.preventDefault(); + $(e.target).find('input').click(); + } + }); + } + } +}); + +/** + * Directive for presenting an ON-OFF switch for checkbox. The directive expects the value to be string 'true' or 'false', not boolean true/false + * This directive provides some additional capabilities to the default onoffswitch such as: + * + * - Dynamic values for id and name attributes. Useful if you need to use this directive inside a ng-repeat + * - Specific scope to specify the value. Instead of just true or false. + * + * Usage: + */ +module.directive('onoffswitchstring', function() { + return { + restrict: "EA", + replace: true, + scope: { + name: '=', + id: '=', + value: '=', + ngModel: '=', + ngDisabled: '=', + kcOnText: '@onText', + kcOffText: '@offText' + }, + // TODO - The same code acts differently when put into the templateURL. Find why and move the code there. + //templateUrl: "templates/kc-switch.html", + template: '
', + compile: function(element, attrs) { + + if (!attrs.onText) { attrs.onText = "ON"; } + if (!attrs.offText) { attrs.offText = "OFF"; } + + element.bind('keydown click', function(e){ + var code = e.keyCode || e.which; + if (code === 32 || code === 13) { + e.stopImmediatePropagation(); + e.preventDefault(); + $(e.target).find('input').click(); + } + }); + } + } +}); + +/** + * Directive for presenting an ON-OFF switch for checkbox. The directive expects the true-value or false-value to be string like 'true' or 'false', not boolean true/false. + * This directive provides some additional capabilities to the default onoffswitch such as: + * + * - Specific scope to specify the value. Instead of just 'true' or 'false' you can use any other values. For example: true-value="'foo'" false-value="'bar'" . + * But 'true'/'false' are defaults if true-value and false-value are not specified + * + * Usage: + */ +module.directive('onoffswitchvalue', function() { + return { + restrict: "EA", + replace: true, + scope: { + name: '@', + id: '@', + trueValue: '@', + falseValue: '@', + ngModel: '=', + ngDisabled: '=', + kcOnText: '@onText', + kcOffText: '@offText' + }, + // TODO - The same code acts differently when put into the templateURL. Find why and move the code there. + //templateUrl: "templates/kc-switch.html", + template: "
", + compile: function(element, attrs) { + /* + We don't want to propagate basic attributes to the root element of directive. Id should be passed to the + input element only to achieve proper label binding (and validity). + */ + element.removeAttr('name'); + element.removeAttr('id'); + + if (!attrs.trueValue) { attrs.trueValue = "'true'"; } + if (!attrs.falseValue) { attrs.falseValue = "'false'"; } + + if (!attrs.onText) { attrs.onText = "ON"; } + if (!attrs.offText) { attrs.offText = "OFF"; } + + element.bind('keydown', function(e){ + var code = e.keyCode || e.which; + if (code === 32 || code === 13) { + e.stopImmediatePropagation(); + e.preventDefault(); + $(e.target).find('input').click(); + } + }); + } + } +}); + +module.directive('kcInput', function() { + var d = { + scope : true, + replace : false, + link : function(scope, element, attrs) { + var form = element.children('form'); + var label = element.children('label'); + var input = element.children('input'); + + var id = form.attr('name') + '.' + input.attr('name'); + + element.attr('class', 'control-group'); + + label.attr('class', 'control-label'); + label.attr('for', id); + + input.wrap('
'); + input.attr('id', id); + + if (!input.attr('placeHolder')) { + input.attr('placeHolder', label.text()); + } + + if (input.attr('required')) { + label.append(' *'); + } + } + }; + return d; +}); + +module.directive('kcEnter', function() { + return function(scope, element, attrs) { + element.bind("keydown keypress", function(event) { + if (event.which === 13) { + scope.$apply(function() { + scope.$eval(attrs.kcEnter); + }); + + event.preventDefault(); + } + }); + }; +}); + +module.directive('kcSave', function ($compile, $timeout, Notifications) { + var clickDelay = 500; // 500 ms + + return { + restrict: 'A', + link: function ($scope, elem, attr, ctrl) { + elem.addClass("btn btn-primary"); + elem.attr("type","submit"); + + var disabled = false; + elem.on('click', function(evt) { + if ($scope.hasOwnProperty("changed") && !$scope.changed) return; + + // KEYCLOAK-4121: Prevent double form submission + if (disabled) { + evt.preventDefault(); + evt.stopImmediatePropagation(); + return; + } else { + disabled = true; + $timeout(function () { disabled = false; }, clickDelay, false); + } + + $scope.$apply(function() { + var form = elem.closest('form'); + if (form && form.attr('name')) { + var ngValid = form.find('.ng-valid'); + if ($scope[form.attr('name')].$valid) { + //ngValid.removeClass('error'); + ngValid.parent().removeClass('has-error'); + $scope['save'](); + } else { + Notifications.error("Missing or invalid field(s). Please verify the fields in red.") + //ngValid.removeClass('error'); + ngValid.parent().removeClass('has-error'); + + var ngInvalid = form.find('.ng-invalid'); + //ngInvalid.addClass('error'); + ngInvalid.parent().addClass('has-error'); + } + } + }); + }) + } + } +}); + +module.directive('kcReset', function ($compile, Notifications) { + return { + restrict: 'A', + link: function ($scope, elem, attr, ctrl) { + elem.addClass("btn btn-default"); + elem.attr("type","submit"); + elem.bind('click', function() { + $scope.$apply(function() { + var form = elem.closest('form'); + if (form && form.attr('name')) { + form.find('.ng-valid').removeClass('error'); + form.find('.ng-invalid').removeClass('error'); + $scope['reset'](); + } + }) + }) + } + } +}); + +module.directive('kcCancel', function ($compile, Notifications) { + return { + restrict: 'A', + link: function ($scope, elem, attr, ctrl) { + elem.addClass("btn btn-default"); + elem.attr("type","submit"); + } + } +}); + +module.directive('kcDelete', function ($compile, Notifications) { + return { + restrict: 'A', + link: function ($scope, elem, attr, ctrl) { + elem.addClass("btn btn-danger"); + elem.attr("type","submit"); + } + } +}); + + +module.directive('kcDropdown', function ($compile, Notifications) { + return { + scope: { + kcOptions: '=', + kcModel: '=', + id: "=", + kcPlaceholder: '@' + }, + restrict: 'EA', + replace: true, + templateUrl: resourceUrl + '/templates/kc-select.html', + link: function(scope, element, attr) { + scope.updateModel = function(item) { + scope.kcModel = item; + }; + } + } +}); + +module.directive('kcReadOnly', function() { + var disabled = {}; + + var d = { + replace : false, + link : function(scope, element, attrs) { + var disable = function(i, e) { + if (!e.disabled) { + disabled[e.tagName + i] = true; + e.disabled = true; + } + } + + var enable = function(i, e) { + if (disabled[e.tagName + i]) { + e.disabled = false; + delete disabled[i]; + } + } + + var filterIgnored = function(i, e){ + return !e.attributes['kc-read-only-ignore']; + } + + scope.$watch(attrs.kcReadOnly, function(readOnly) { + if (readOnly) { + element.find('input').filter(filterIgnored).each(disable); + element.find('button').filter(filterIgnored).each(disable); + element.find('select').filter(filterIgnored).each(disable); + element.find('textarea').filter(filterIgnored).each(disable); + } else { + element.find('input').filter(filterIgnored).each(enable); + element.find('input').filter(filterIgnored).each(enable); + element.find('button').filter(filterIgnored).each(enable); + element.find('select').filter(filterIgnored).each(enable); + element.find('textarea').filter(filterIgnored).each(enable); + } + }); + } + }; + return d; +}); + +module.directive('kcMenu', function () { + return { + scope: true, + restrict: 'E', + replace: true, + templateUrl: resourceUrl + '/templates/kc-menu.html' + } +}); + +module.directive('kcTabsRealm', function () { + return { + scope: true, + restrict: 'E', + replace: true, + templateUrl: resourceUrl + '/templates/kc-tabs-realm.html' + } +}); + +module.directive('kcTabsAuthentication', function () { + return { + scope: true, + restrict: 'E', + replace: true, + templateUrl: resourceUrl + '/templates/kc-tabs-authentication.html' + } +}); + +module.directive('kcTabsRole', function () { + return { + scope: true, + restrict: 'E', + replace: true, + templateUrl: resourceUrl + '/templates/kc-tabs-role.html' + } +}); + +module.directive('kcTabsClientRole', function () { + return { + scope: true, + restrict: 'E', + replace: true, + templateUrl: resourceUrl + '/templates/kc-tabs-client-role.html' + } +}); + +module.directive('kcTabsUser', function () { + return { + scope: true, + restrict: 'E', + replace: true, + templateUrl: resourceUrl + '/templates/kc-tabs-user.html' + } +}); + +module.directive('kcTabsUsers', function () { + return { + scope: true, + restrict: 'E', + replace: true, + templateUrl: resourceUrl + '/templates/kc-tabs-users.html' + } +}); + +module.directive('kcTabsGroup', function () { + return { + scope: true, + restrict: 'E', + replace: true, + templateUrl: resourceUrl + '/templates/kc-tabs-group.html' + } +}); + +module.directive('kcTabsGroupList', function () { + return { + scope: true, + restrict: 'E', + replace: true, + templateUrl: resourceUrl + '/templates/kc-tabs-group-list.html' + } +}); + +module.directive('kcTabsClient', function () { + return { + scope: true, + restrict: 'E', + replace: true, + templateUrl: resourceUrl + '/templates/kc-tabs-client.html' + } +}); + +module.directive('kcTabsClientTemplate', function () { + return { + scope: true, + restrict: 'E', + replace: true, + templateUrl: resourceUrl + '/templates/kc-tabs-client-template.html' + } +}); + +module.directive('kcNavigationUser', function () { + return { + scope: true, + restrict: 'E', + replace: true, + templateUrl: resourceUrl + '/templates/kc-navigation-user.html' + } +}); + +module.directive('kcTabsIdentityProvider', function () { + return { + scope: true, + restrict: 'E', + replace: true, + templateUrl: resourceUrl + '/templates/kc-tabs-identity-provider.html' + } +}); + +module.directive('kcTabsUserFederation', function () { + return { + scope: true, + restrict: 'E', + replace: true, + templateUrl: resourceUrl + '/templates/kc-tabs-user-federation.html' + } +}); + +module.directive('kcTabsLdap', function () { + return { + scope: true, + restrict: 'E', + replace: true, + templateUrl: resourceUrl + '/templates/kc-tabs-ldap.html' + } +}); + +module.controller('RoleSelectorModalCtrl', function($scope, realm, config, configName, RealmRoles, Client, ClientRole, $modalInstance) { + $scope.selectedRealmRole = { + role: undefined + }; + $scope.selectedClientRole = { + role: undefined + }; + $scope.client = { + selected: undefined + }; + + $scope.selectRealmRole = function() { + config[configName] = $scope.selectedRealmRole.role.name; + $modalInstance.close(); + } + + $scope.selectClientRole = function() { + config[configName] = $scope.client.selected.clientId + "." + $scope.selectedClientRole.role.name; + $modalInstance.close(); + } + + $scope.cancel = function() { + $modalInstance.dismiss(); + } + + $scope.changeClient = function() { + if ($scope.client.selected) { + ClientRole.query({realm: realm.realm, client: $scope.client.selected.id}, function (data) { + $scope.clientRoles = data; + }); + } else { + console.log('selected client was null'); + $scope.clientRoles = null; + } + + } + RealmRoles.query({realm: realm.realm}, function(data) { + $scope.realmRoles = data; + }) + Client.query({realm: realm.realm}, function(data) { + $scope.clients = data; + if (data.length > 0) { + $scope.client.selected = data[0]; + $scope.changeClient(); + } + }) +}); + +module.controller('ProviderConfigCtrl', function ($modal, $scope, ComponentUtils) { + $scope.fileNames = {}; + + // KEYCLOAK-4463 + $scope.initEditor = function(editor){ + editor.$blockScrolling = Infinity; // suppress warning message + }; + + $scope.openRoleSelector = function (configName, config) { + $modal.open({ + templateUrl: resourceUrl + '/partials/modal/role-selector.html', + controller: 'RoleSelectorModalCtrl', + resolve: { + realm: function () { + return $scope.realm; + }, + config: function () { + return config; + }, + configName: function () { + return configName; + } + } + }) + } + + ComponentUtils.addLastEmptyValueToMultivaluedLists($scope.properties, $scope.config); + + $scope.addValueToMultivalued = function(optionName) { + var configProperty = $scope.config[optionName]; + var lastIndex = configProperty.length - 1; + var lastValue = configProperty[lastIndex]; + console.log("Option=" + optionName + ", lastIndex=" + lastIndex + ", lastValue=" + lastValue); + + if (lastValue.length > 0) { + configProperty.push(''); + } + } + + $scope.deleteValueFromMultivalued = function(optionName, index) { + $scope.config[optionName].splice(index, 1); + } + + $scope.uploadFile = function($files, optionName, config) { + var reader = new FileReader(); + reader.onload = function(e) { + $scope.$apply(function() { + config[optionName][0] = e.target.result; + }); + }; + reader.readAsText($files[0]); + $scope.fileNames[optionName] = $files[0].name; + } +}); + +module.directive('kcProviderConfig', function ($modal) { + return { + scope: { + config: '=', + properties: '=', + realm: '=', + clients: '=', + configName: '=' + }, + restrict: 'E', + replace: true, + controller: 'ProviderConfigCtrl', + templateUrl: resourceUrl + '/templates/kc-provider-config.html' + } +}); + +module.controller('ComponentRoleSelectorModalCtrl', function($scope, realm, config, configName, RealmRoles, Client, ClientRole, $modalInstance) { + $scope.selectedRealmRole = { + role: undefined + }; + $scope.selectedClientRole = { + role: undefined + }; + $scope.client = { + selected: undefined + }; + + $scope.selectRealmRole = function() { + config[configName][0] = $scope.selectedRealmRole.role.name; + $modalInstance.close(); + } + + $scope.selectClientRole = function() { + config[configName][0] = $scope.client.selected.clientId + "." + $scope.selectedClientRole.role.name; + $modalInstance.close(); + } + + $scope.cancel = function() { + $modalInstance.dismiss(); + } + + $scope.changeClient = function() { + if ($scope.client.selected) { + ClientRole.query({realm: realm.realm, client: $scope.client.selected.id}, function (data) { + $scope.clientRoles = data; + }); + } else { + console.log('selected client was null'); + $scope.clientRoles = null; + } + + } + RealmRoles.query({realm: realm.realm}, function(data) { + $scope.realmRoles = data; + }) + Client.query({realm: realm.realm}, function(data) { + $scope.clients = data; + if (data.length > 0) { + $scope.client.selected = data[0]; + $scope.changeClient(); + } + }) +}); + +module.controller('ComponentConfigCtrl', function ($modal, $scope) { + $scope.openRoleSelector = function (configName, config) { + $modal.open({ + templateUrl: resourceUrl + '/partials/modal/component-role-selector.html', + controller: 'ComponentRoleSelectorModalCtrl', + resolve: { + realm: function () { + return $scope.realm; + }, + config: function () { + return config; + }, + configName: function () { + return configName; + } + } + }) + } +}); +module.directive('kcComponentConfig', function ($modal) { + return { + scope: { + config: '=', + properties: '=', + realm: '=', + clients: '=', + configName: '=' + }, + restrict: 'E', + replace: true, + controller: 'ComponentConfigCtrl', + templateUrl: resourceUrl + '/templates/kc-component-config.html' + } +}); + +/* +* Used to select the element (invoke $(elem).select()) on specified action list. +* Usages kc-select-action="click mouseover" +* When used in the textarea element, this will select/highlight the textarea content on specified action (i.e. click). +*/ +module.directive('kcSelectAction', function ($compile, Notifications) { + return { + restrict: 'A', + compile: function (elem, attrs) { + + var events = attrs.kcSelectAction.split(" "); + + for(var i=0; i < events.length; i++){ + + elem.bind(events[i], function(){ + elem.select(); + }); + } + } + } +}); + +module.filter('remove', function() { + return function(input, remove, attribute) { + if (!input || !remove) { + return input; + } + + var out = []; + for ( var i = 0; i < input.length; i++) { + var e = input[i]; + + if (Array.isArray(remove)) { + for (var j = 0; j < remove.length; j++) { + if (attribute) { + if (remove[j][attribute] == e[attribute]) { + e = null; + break; + } + } else { + if (remove[j] == e) { + e = null; + break; + } + } + } + } else { + if (attribute) { + if (remove[attribute] == e[attribute]) { + e = null; + } + } else { + if (remove == e) { + e = null; + } + } + } + + if (e != null) { + out.push(e); + } + } + + return out; + }; +}); + +module.filter('capitalize', function() { + return function(input) { + if (!input) { + return; + } + var splittedWords = input.split(/\s+/); + for (var i=0; i'); + + $compile(label)(scope); + } + }; +}); + +module.directive( 'kcOpen', function ( $location ) { + return function ( scope, element, attrs ) { + var path; + + attrs.$observe( 'kcOpen', function (val) { + path = val; + }); + + element.bind( 'click', function () { + scope.$apply( function () { + $location.path(path); + }); + }); + }; +}); + +module.directive('kcOnReadFile', function ($parse) { + console.debug('kcOnReadFile'); + return { + restrict: 'A', + scope: false, + link: function(scope, element, attrs) { + var fn = $parse(attrs.kcOnReadFile); + + element.on('change', function(onChangeEvent) { + var reader = new FileReader(); + + reader.onload = function(onLoadEvent) { + scope.$apply(function() { + fn(scope, {$fileContent:onLoadEvent.target.result}); + }); + }; + + reader.readAsText((onChangeEvent.srcElement || onChangeEvent.target).files[0]); + }); + } + }; +}); + +module.controller('PagingCtrl', function ($scope) { + $scope.currentPageInput = 1; + + $scope.firstPage = function() { + if (!$scope.hasPrevious()) return; + $scope.currentPage = 1; + $scope.currentPageInput = 1; + }; + + $scope.lastPage = function() { + if (!$scope.hasNext()) return; + $scope.currentPage = $scope.numberOfPages; + $scope.currentPageInput = $scope.numberOfPages; + }; + + $scope.previousPage = function() { + if (!$scope.hasPrevious()) return; + $scope.currentPage--; + $scope.currentPageInput = $scope.currentPage; + }; + + $scope.nextPage = function() { + if (!$scope.hasNext()) return; + $scope.currentPage++; + $scope.currentPageInput = $scope.currentPage; + }; + + $scope.hasNext = function() { + return $scope.currentPage < $scope.numberOfPages; + }; + + $scope.hasPrevious = function() { + return $scope.currentPage > 1; + }; +}); + +module.directive('kcPaging', function () { + return { + scope: { + currentPage: '=', + currentPageInput: '=', + numberOfPages: '=' + }, + restrict: 'E', + replace: true, + controller: 'PagingCtrl', + templateUrl: resourceUrl + '/templates/kc-paging.html' + } +}); + +// Tests the page number input from currentPageInput to see +// if it represents a valid page. If so, the current page is changed. +module.directive('kcValidPage', function() { + return { + require: 'ngModel', + link: function(scope, element, attrs, ctrl) { + ctrl.$validators.inRange = function(modelValue, viewValue) { + if (viewValue >= 1 && viewValue <= scope.numberOfPages) { + scope.currentPage = viewValue; + } + + return true; + } + } + } +}); + +// filter used for paged tables +module.filter('startFrom', function () { + return function (input, start) { + if (input) { + start = +start; + return input.slice(start); + } + return []; + }; +}); \ No newline at end of file diff --git a/admin/resources/js/authz/authz-app.js b/admin/resources/js/authz/authz-app.js new file mode 100644 index 0000000..fbd5379 --- /dev/null +++ b/admin/resources/js/authz/authz-app.js @@ -0,0 +1,543 @@ +/* + * JBoss, Home of Professional Open Source. + * Copyright 2016 Red Hat, Inc., and individual contributors + * as indicated by the @author tags. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +module.requires.push('ui.ace'); + +module.config(['$routeProvider', function ($routeProvider) { + $routeProvider + .when('/realms/:realm/authz', { + templateUrl: resourceUrl + '/partials/authz/resource-server-list.html', + resolve: { + realm: function (RealmLoader) { + return RealmLoader(); + } + }, + controller: 'ResourceServerCtrl' + }).when('/realms/:realm/clients/:client/authz/resource-server/create', { + templateUrl: resourceUrl + '/partials/authz/resource-server-detail.html', + resolve: { + realm: function (RealmLoader) { + return RealmLoader(); + }, + client : function(ClientLoader) { + return ClientLoader(); + }, + clients: function (ClientListLoader) { + return ClientListLoader(); + } + }, + controller: 'ResourceServerDetailCtrl' + }).when('/realms/:realm/clients/:client/authz/resource-server', { + templateUrl: resourceUrl + '/partials/authz/resource-server-detail.html', + resolve: { + realm: function (RealmLoader) { + return RealmLoader(); + }, + client : function(ClientLoader) { + return ClientLoader(); + }, + clients: function (ClientListLoader) { + return ClientListLoader(); + }, + serverInfo: function (ServerInfoLoader) { + return ServerInfoLoader(); + } + }, + controller: 'ResourceServerDetailCtrl' + }).when('/realms/:realm/clients/:client/authz/resource-server/export-settings', { + templateUrl: resourceUrl + '/partials/authz/resource-server-export-settings.html', + resolve: { + realm: function (RealmLoader) { + return RealmLoader(); + }, + client : function(ClientLoader) { + return ClientLoader(); + }, + clients: function (ClientListLoader) { + return ClientListLoader(); + }, + serverInfo: function (ServerInfoLoader) { + return ServerInfoLoader(); + } + }, + controller: 'ResourceServerDetailCtrl' + }).when('/realms/:realm/clients/:client/authz/resource-server/evaluate', { + templateUrl: resourceUrl + '/partials/authz/policy/resource-server-policy-evaluate.html', + resolve: { + realm: function (RealmLoader) { + return RealmLoader(); + }, + client : function(ClientLoader) { + return ClientLoader(); + }, + clients: function (ClientListLoader) { + return ClientListLoader(); + }, + roles: function (RoleListLoader) { + return new RoleListLoader(); + } + }, + controller: 'PolicyEvaluateCtrl' + }).when('/realms/:realm/clients/:client/authz/resource-server/evaluate/result', { + templateUrl: resourceUrl + '/partials/authz/policy/resource-server-policy-evaluate-result.html', + resolve: { + realm: function (RealmLoader) { + return RealmLoader(); + }, + client : function(ClientLoader) { + return ClientLoader(); + }, + }, + controller: 'PolicyEvaluateCtrl' + }).when('/realms/:realm/clients/:client/authz/resource-server/resource', { + templateUrl: resourceUrl + '/partials/authz/resource-server-resource-list.html', + resolve: { + realm: function (RealmLoader) { + return RealmLoader(); + }, + client : function(ClientLoader) { + return ClientLoader(); + } + }, + controller: 'ResourceServerResourceCtrl' + }).when('/realms/:realm/clients/:client/authz/resource-server/resource/create', { + templateUrl: resourceUrl + '/partials/authz/resource-server-resource-detail.html', + resolve: { + realm: function (RealmLoader) { + return RealmLoader(); + }, + client : function(ClientLoader) { + return ClientLoader(); + } + }, + controller: 'ResourceServerResourceDetailCtrl' + }).when('/realms/:realm/clients/:client/authz/resource-server/resource/:rsrid', { + templateUrl: resourceUrl + '/partials/authz/resource-server-resource-detail.html', + resolve: { + realm: function (RealmLoader) { + return RealmLoader(); + }, + client : function(ClientLoader) { + return ClientLoader(); + } + }, + controller: 'ResourceServerResourceDetailCtrl' + }).when('/realms/:realm/clients/:client/authz/resource-server/scope', { + templateUrl: resourceUrl + '/partials/authz/resource-server-scope-list.html', + resolve: { + realm: function (RealmLoader) { + return RealmLoader(); + }, + client : function(ClientLoader) { + return ClientLoader(); + } + }, + controller: 'ResourceServerScopeCtrl' + }).when('/realms/:realm/clients/:client/authz/resource-server/scope/create', { + templateUrl: resourceUrl + '/partials/authz/resource-server-scope-detail.html', + resolve: { + realm: function (RealmLoader) { + return RealmLoader(); + }, + client : function(ClientLoader) { + return ClientLoader(); + } + }, + controller: 'ResourceServerScopeDetailCtrl' + }).when('/realms/:realm/clients/:client/authz/resource-server/scope/:id', { + templateUrl: resourceUrl + '/partials/authz/resource-server-scope-detail.html', + resolve: { + realm: function (RealmLoader) { + return RealmLoader(); + }, + client : function(ClientLoader) { + return ClientLoader(); + } + }, + controller: 'ResourceServerScopeDetailCtrl' + }).when('/realms/:realm/clients/:client/authz/resource-server/permission', { + templateUrl: resourceUrl + '/partials/authz/permission/resource-server-permission-list.html', + resolve: { + realm: function (RealmLoader) { + return RealmLoader(); + }, + client : function(ClientLoader) { + return ClientLoader(); + } + }, + controller: 'ResourceServerPermissionCtrl' + }).when('/realms/:realm/clients/:client/authz/resource-server/policy', { + templateUrl: resourceUrl + '/partials/authz/policy/resource-server-policy-list.html', + resolve: { + realm: function (RealmLoader) { + return RealmLoader(); + }, + client : function(ClientLoader) { + return ClientLoader(); + } + }, + controller: 'ResourceServerPolicyCtrl' + }).when('/realms/:realm/clients/:client/authz/resource-server/policy/rules/create', { + templateUrl: resourceUrl + '/partials/authz/policy/provider/resource-server-policy-drools-detail.html', + resolve: { + realm: function (RealmLoader) { + return RealmLoader(); + }, + client : function(ClientLoader) { + return ClientLoader(); + } + }, + controller: 'ResourceServerPolicyDroolsDetailCtrl' + }).when('/realms/:realm/clients/:client/authz/resource-server/policy/rules/:id', { + templateUrl: resourceUrl + '/partials/authz/policy/provider/resource-server-policy-drools-detail.html', + resolve: { + realm: function (RealmLoader) { + return RealmLoader(); + }, + client : function(ClientLoader) { + return ClientLoader(); + } + }, + controller: 'ResourceServerPolicyDroolsDetailCtrl' + }).when('/realms/:realm/clients/:client/authz/resource-server/permission/resource/create', { + templateUrl: resourceUrl + '/partials/authz/permission/provider/resource-server-policy-resource-detail.html', + resolve: { + realm: function (RealmLoader) { + return RealmLoader(); + }, + client : function(ClientLoader) { + return ClientLoader(); + } + }, + controller: 'ResourceServerPolicyResourceDetailCtrl' + }).when('/realms/:realm/clients/:client/authz/resource-server/permission/resource/:id', { + templateUrl: resourceUrl + '/partials/authz/permission/provider/resource-server-policy-resource-detail.html', + resolve: { + realm: function (RealmLoader) { + return RealmLoader(); + }, + client : function(ClientLoader) { + return ClientLoader(); + } + }, + controller: 'ResourceServerPolicyResourceDetailCtrl' + }).when('/realms/:realm/clients/:client/authz/resource-server/permission/scope/create', { + templateUrl: resourceUrl + '/partials/authz/permission/provider/resource-server-policy-scope-detail.html', + resolve: { + realm: function (RealmLoader) { + return RealmLoader(); + }, + client : function(ClientLoader) { + return ClientLoader(); + } + }, + controller: 'ResourceServerPolicyScopeDetailCtrl' + }).when('/realms/:realm/clients/:client/authz/resource-server/permission/scope/:id', { + templateUrl: resourceUrl + '/partials/authz/permission/provider/resource-server-policy-scope-detail.html', + resolve: { + realm: function (RealmLoader) { + return RealmLoader(); + }, + client : function(ClientLoader) { + return ClientLoader(); + } + }, + controller: 'ResourceServerPolicyScopeDetailCtrl' + }).when('/realms/:realm/clients/:client/authz/resource-server/policy/user/create', { + templateUrl: resourceUrl + '/partials/authz/policy/provider/resource-server-policy-user-detail.html', + resolve: { + realm: function (RealmLoader) { + return RealmLoader(); + }, + client : function(ClientLoader) { + return ClientLoader(); + } + }, + controller: 'ResourceServerPolicyUserDetailCtrl' + }).when('/realms/:realm/clients/:client/authz/resource-server/policy/user/:id', { + templateUrl: resourceUrl + '/partials/authz/policy/provider/resource-server-policy-user-detail.html', + resolve: { + realm: function (RealmLoader) { + return RealmLoader(); + }, + client : function(ClientLoader) { + return ClientLoader(); + } + }, + controller: 'ResourceServerPolicyUserDetailCtrl' + }).when('/realms/:realm/clients/:client/authz/resource-server/policy/client/create', { + templateUrl: resourceUrl + '/partials/authz/policy/provider/resource-server-policy-client-detail.html', + resolve: { + realm: function (RealmLoader) { + return RealmLoader(); + }, + client : function(ClientLoader) { + return ClientLoader(); + } + }, + controller: 'ResourceServerPolicyClientDetailCtrl' + }).when('/realms/:realm/clients/:client/authz/resource-server/policy/client/:id', { + templateUrl: resourceUrl + '/partials/authz/policy/provider/resource-server-policy-client-detail.html', + resolve: { + realm: function (RealmLoader) { + return RealmLoader(); + }, + client : function(ClientLoader) { + return ClientLoader(); + } + }, + controller: 'ResourceServerPolicyClientDetailCtrl' + }).when('/realms/:realm/clients/:client/authz/resource-server/policy/role/create', { + templateUrl: resourceUrl + '/partials/authz/policy/provider/resource-server-policy-role-detail.html', + resolve: { + realm: function (RealmLoader) { + return RealmLoader(); + }, + client : function(ClientLoader) { + return ClientLoader(); + } + }, + controller: 'ResourceServerPolicyRoleDetailCtrl' + }).when('/realms/:realm/clients/:client/authz/resource-server/policy/role/:id', { + templateUrl: resourceUrl + '/partials/authz/policy/provider/resource-server-policy-role-detail.html', + resolve: { + realm: function (RealmLoader) { + return RealmLoader(); + }, + client : function(ClientLoader) { + return ClientLoader(); + } + }, + controller: 'ResourceServerPolicyRoleDetailCtrl' + }).when('/realms/:realm/clients/:client/authz/resource-server/policy/group/create', { + templateUrl: resourceUrl + '/partials/authz/policy/provider/resource-server-policy-group-detail.html', + resolve: { + realm: function (RealmLoader) { + return RealmLoader(); + }, + client : function(ClientLoader) { + return ClientLoader(); + } + }, + controller: 'ResourceServerPolicyGroupDetailCtrl' + }).when('/realms/:realm/clients/:client/authz/resource-server/policy/group/:id', { + templateUrl: resourceUrl + '/partials/authz/policy/provider/resource-server-policy-group-detail.html', + resolve: { + realm: function (RealmLoader) { + return RealmLoader(); + }, + client : function(ClientLoader) { + return ClientLoader(); + } + }, + controller: 'ResourceServerPolicyGroupDetailCtrl' + }).when('/realms/:realm/clients/:client/authz/resource-server/policy/js/create', { + templateUrl: resourceUrl + '/partials/authz/policy/provider/resource-server-policy-js-detail.html', + resolve: { + realm: function (RealmLoader) { + return RealmLoader(); + }, + client : function(ClientLoader) { + return ClientLoader(); + } + }, + controller: 'ResourceServerPolicyJSDetailCtrl' + }).when('/realms/:realm/clients/:client/authz/resource-server/policy/js/:id', { + templateUrl: resourceUrl + '/partials/authz/policy/provider/resource-server-policy-js-detail.html', + resolve: { + realm: function (RealmLoader) { + return RealmLoader(); + }, + client : function(ClientLoader) { + return ClientLoader(); + } + }, + controller: 'ResourceServerPolicyJSDetailCtrl' + }).when('/realms/:realm/clients/:client/authz/resource-server/policy/time/create', { + templateUrl: resourceUrl + '/partials/authz/policy/provider/resource-server-policy-time-detail.html', + resolve: { + realm: function (RealmLoader) { + return RealmLoader(); + }, + client : function(ClientLoader) { + return ClientLoader(); + } + }, + controller: 'ResourceServerPolicyTimeDetailCtrl' + }).when('/realms/:realm/clients/:client/authz/resource-server/policy/time/:id', { + templateUrl: resourceUrl + '/partials/authz/policy/provider/resource-server-policy-time-detail.html', + resolve: { + realm: function (RealmLoader) { + return RealmLoader(); + }, + client : function(ClientLoader) { + return ClientLoader(); + } + }, + controller: 'ResourceServerPolicyTimeDetailCtrl' + }).when('/realms/:realm/clients/:client/authz/resource-server/policy/aggregate/create', { + templateUrl: resourceUrl + '/partials/authz/policy/provider/resource-server-policy-aggregate-detail.html', + resolve: { + realm: function (RealmLoader) { + return RealmLoader(); + }, + client : function(ClientLoader) { + return ClientLoader(); + } + }, + controller: 'ResourceServerPolicyAggregateDetailCtrl' + }).when('/realms/:realm/clients/:client/authz/resource-server/policy/aggregate/:id', { + templateUrl: resourceUrl + '/partials/authz/policy/provider/resource-server-policy-aggregate-detail.html', + resolve: { + realm: function (RealmLoader) { + return RealmLoader(); + }, + client : function(ClientLoader) { + return ClientLoader(); + } + }, + controller: 'ResourceServerPolicyAggregateDetailCtrl' + }).when('/realms/:realm/roles/:role/permissions', { + templateUrl : resourceUrl + '/partials/authz/mgmt/realm-role-permissions.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + role : function(RoleLoader) { + return RoleLoader(); + } + }, + controller : 'RealmRolePermissionsCtrl' + }).when('/realms/:realm/clients/:client/roles/:role/permissions', { + templateUrl : resourceUrl + '/partials/authz/mgmt/client-role-permissions.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + client : function(ClientLoader) { + return ClientLoader(); + }, + role : function(RoleLoader) { + return RoleLoader(); + } + }, + controller : 'ClientRolePermissionsCtrl' + }).when('/realms/:realm/users-permissions', { + templateUrl : resourceUrl + '/partials/authz/mgmt/users-permissions.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + } + }, + controller : 'UsersPermissionsCtrl' + }) + .when('/realms/:realm/clients/:client/permissions', { + templateUrl : resourceUrl + '/partials/authz/mgmt/client-permissions.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + client : function(ClientLoader) { + return ClientLoader(); + } + }, + controller : 'ClientPermissionsCtrl' + }) + .when('/realms/:realm/groups/:group/permissions', { + templateUrl : resourceUrl + '/partials/authz/mgmt/group-permissions.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + group : function(GroupLoader) { + return GroupLoader(); + } + }, + controller : 'GroupPermissionsCtrl' + }) + .when('/realms/:realm/identity-provider-settings/provider/:provider_id/:alias/permissions', { + templateUrl : function(params){ return resourceUrl + '/partials/authz/mgmt/broker-permissions.html'; }, + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + identityProvider : function(IdentityProviderLoader) { + return IdentityProviderLoader(); + } + }, + controller : 'IdentityProviderPermissionCtrl' + }) + ; +}]); + +module.directive('kcTabsResourceServer', function () { + return { + scope: true, + restrict: 'E', + replace: true, + templateUrl: resourceUrl + '/templates/authz/kc-tabs-resource-server.html' + } +}); + +module.filter('unique', function () { + + return function (items, filterOn) { + + if (filterOn === false) { + return items; + } + + if ((filterOn || angular.isUndefined(filterOn)) && angular.isArray(items)) { + var hashCheck = {}, newItems = []; + + var extractValueToCompare = function (item) { + if (angular.isObject(item) && angular.isString(filterOn)) { + return item[filterOn]; + } else { + return item; + } + }; + + angular.forEach(items, function (item) { + var valueToCheck, isDuplicate = false; + + for (var i = 0; i < newItems.length; i++) { + if (angular.equals(extractValueToCompare(newItems[i]), extractValueToCompare(item))) { + isDuplicate = true; + break; + } + } + if (!isDuplicate) { + newItems.push(item); + } + + }); + items = newItems; + } + return items; + }; +}); + +module.filter('toCamelCase', function () { + return function (input) { + input = input || ''; + return input.replace(/\w\S*/g, function (txt) { + return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase(); + }); + }; +}) \ No newline at end of file diff --git a/admin/resources/js/authz/authz-controller.js b/admin/resources/js/authz/authz-controller.js new file mode 100644 index 0000000..e164f59 --- /dev/null +++ b/admin/resources/js/authz/authz-controller.js @@ -0,0 +1,2654 @@ +module.controller('ResourceServerCtrl', function($scope, realm, ResourceServer) { + $scope.realm = realm; + + ResourceServer.query({realm : realm.realm}, function (data) { + $scope.servers = data; + }); +}); + +module.controller('ResourceServerDetailCtrl', function($scope, $http, $route, $location, $upload, $modal, realm, ResourceServer, client, AuthzDialog, Notifications) { + $scope.realm = realm; + $scope.client = client; + + ResourceServer.get({ + realm : $route.current.params.realm, + client : client.id + }, function(data) { + $scope.server = angular.copy(data); + $scope.changed = false; + + $scope.$watch('server', function() { + if (!angular.equals($scope.server, data)) { + $scope.changed = true; + } + }, true); + + $scope.save = function() { + ResourceServer.update({realm : realm.realm, client : $scope.server.clientId}, $scope.server, function() { + $route.reload(); + Notifications.success("The resource server has been created."); + }); + } + + $scope.reset = function() { + $route.reload(); + } + + $scope.export = function() { + $scope.exportSettings = true; + ResourceServer.settings({ + realm : $route.current.params.realm, + client : client.id + }, function(data) { + var tmp = angular.fromJson(data); + $scope.settings = angular.toJson(tmp, true); + }) + } + + $scope.downloadSettings = function() { + saveAs(new Blob([$scope.settings], { type: 'application/json' }), $scope.server.name + "-authz-config.json"); + } + + $scope.cancelExport = function() { + delete $scope.settings + } + + $scope.onFileSelect = function($fileContent) { + $scope.server = angular.copy(JSON.parse($fileContent)); + $scope.importing = true; + }; + + $scope.viewImportDetails = function() { + $modal.open({ + templateUrl: resourceUrl + '/partials/modal/view-object.html', + controller: 'ObjectModalCtrl', + resolve: { + object: function () { + return $scope.server; + } + } + }) + }; + + $scope.import = function () { + ResourceServer.import({realm : realm.realm, client : client.id}, $scope.server, function() { + $route.reload(); + Notifications.success("The resource server has been updated."); + }); + } + }); +}); + +var Resources = { + delete: function(ResourceServerResource, realm, client, $scope, AuthzDialog, $location, Notifications, $route) { + ResourceServerResource.permissions({ + realm : realm, + client : client.id, + rsrid : $scope.resource._id + }, function (permissions) { + var msg = ""; + + if (permissions.length > 0 && !$scope.deleteConsent) { + msg = "

This resource is referenced in some permissions:

"; + msg += "
    "; + for (i = 0; i < permissions.length; i++) { + msg+= "
  • " + permissions[i].name + "
  • "; + } + msg += "
"; + msg += "

If you remove this resource, the permissions above will be affected and will not be associated with this resource anymore.

"; + } + + AuthzDialog.confirmDeleteWithMsg($scope.resource.name, "Resource", msg, function() { + ResourceServerResource.delete({realm : realm, client : $scope.client.id, rsrid : $scope.resource._id}, null, function() { + $location.url("/realms/" + realm + "/clients/" + $scope.client.id + "/authz/resource-server/resource"); + $route.reload(); + Notifications.success("The resource has been deleted."); + }); + }); + }); + } +} + +var Policies = { + delete: function(service, realm, client, $scope, AuthzDialog, $location, Notifications, $route, isPermission) { + var msg = ""; + + service.dependentPolicies({ + realm : realm, + client : client.id, + id : $scope.policy.id + }, function (dependentPolicies) { + if (dependentPolicies.length > 0 && !$scope.deleteConsent) { + msg = "

This policy is being used by other policies:

"; + msg += "
    "; + for (i = 0; i < dependentPolicies.length; i++) { + msg+= "
  • " + dependentPolicies[i].name + "
  • "; + } + msg += "
"; + msg += "

If you remove this policy, the policies above will be affected and will not be associated with this policy anymore.

"; + } + + AuthzDialog.confirmDeleteWithMsg($scope.policy.name, isPermission ? "Permission" : "Policy", msg, function() { + service.delete({realm : realm, client : $scope.client.id, id : $scope.policy.id}, null, function() { + if (isPermission) { + $location.url("/realms/" + realm + "/clients/" + $scope.client.id + "/authz/resource-server/permission"); + Notifications.success("The permission has been deleted."); + } else { + $location.url("/realms/" + realm + "/clients/" + $scope.client.id + "/authz/resource-server/policy"); + Notifications.success("The policy has been deleted."); + } + $route.reload(); + }); + }); + }); + } +} + +module.controller('ResourceServerResourceCtrl', function($scope, $http, $route, $location, realm, ResourceServer, ResourceServerResource, client, AuthzDialog, Notifications) { + $scope.realm = realm; + $scope.client = client; + + $scope.query = { + realm: realm.realm, + client : client.id, + deep: false, + max : 20, + first : 0 + }; + + $scope.listSizes = [5, 10, 20]; + + ResourceServer.get({ + realm : $route.current.params.realm, + client : client.id + }, function(data) { + $scope.server = data; + + $scope.createPolicy = function(resource) { + $location.path('/realms/' + $route.current.params.realm + '/clients/' + client.id + '/authz/resource-server/permission/resource/create').search({rsrid: resource._id}); + } + + $scope.searchQuery(); + }); + + $scope.firstPage = function() { + $scope.query.first = 0; + $scope.searchQuery(); + } + + $scope.previousPage = function() { + $scope.query.first -= parseInt($scope.query.max); + if ($scope.query.first < 0) { + $scope.query.first = 0; + } + $scope.searchQuery(); + } + + $scope.nextPage = function() { + $scope.query.first += parseInt($scope.query.max); + $scope.searchQuery(); + } + + $scope.searchQuery = function() { + $scope.searchLoaded = false; + + ResourceServerResource.query($scope.query, function(response) { + $scope.searchLoaded = true; + $scope.lastSearch = $scope.query.search; + $scope.resources = response; + if ($scope.detailsFilter) { + $scope.showDetails(); + } + }); + }; + + $scope.loadDetails = function (resource) { + if (resource.details) { + resource.details.loaded = !resource.details.loaded; + return; + } + + resource.details = {loaded: false}; + + ResourceServerResource.scopes({ + realm : $route.current.params.realm, + client : client.id, + rsrid : resource._id + }, function(response) { + resource.scopes = response; + ResourceServerResource.permissions({ + realm : $route.current.params.realm, + client : client.id, + rsrid : resource._id + }, function(response) { + resource.policies = response; + resource.details.loaded = true; + }); + }); + } + + $scope.showDetails = function(item) { + if (item) { + $scope.loadDetails(item); + } else { + for (i = 0; i < $scope.resources.length; i++) { + $scope.loadDetails($scope.resources[i]); + } + } + }; + + $scope.delete = function(resource) { + $scope.resource = resource; + Resources.delete(ResourceServerResource, $route.current.params.realm, client, $scope, AuthzDialog, $location, Notifications, $route); + }; +}); + +module.controller('ResourceServerResourceDetailCtrl', function($scope, $http, $route, $location, realm, ResourceServer, client, ResourceServerResource, ResourceServerScope, AuthzDialog, Notifications) { + $scope.realm = realm; + $scope.client = client; + + $scope.scopesUiSelect = { + minimumInputLength: 1, + delay: 500, + allowClear: true, + query: function (query) { + var data = {results: []}; + if ('' == query.term.trim()) { + query.callback(data); + return; + } + $scope.query = { + realm: realm.realm, + client : client.id, + name: query.term.trim(), + deep: false, + max : 20, + first : 0 + }; + ResourceServerScope.query($scope.query, function(response) { + data.results = response; + query.callback(data); + }); + }, + formatResult: function(object, container, query) { + return object.name; + }, + formatSelection: function(object, container, query) { + return object.name; + } + }; + + var $instance = this; + + ResourceServer.get({ + realm : $route.current.params.realm, + client : client.id + }, function(data) { + $scope.server = data; + + var resourceId = $route.current.params.rsrid; + + if (!resourceId) { + $scope.create = true; + $scope.changed = false; + + var resource = {}; + resource.scopes = []; + + $scope.resource = angular.copy(resource); + + $scope.$watch('resource', function() { + if (!angular.equals($scope.resource, resource)) { + $scope.changed = true; + } + }, true); + + $scope.save = function() { + for (i = 0; i < $scope.resource.scopes.length; i++) { + delete $scope.resource.scopes[i].text; + } + $instance.checkNameAvailability(function () { + ResourceServerResource.save({realm : realm.realm, client : $scope.client.id}, $scope.resource, function(data) { + $location.url("/realms/" + realm.realm + "/clients/" + $scope.client.id + "/authz/resource-server/resource/" + data._id); + Notifications.success("The resource has been created."); + }); + }); + } + + $scope.reset = function() { + $location.url("/realms/" + realm.realm + "/clients/" + $scope.client.id + "/authz/resource-server/resource/"); + } + } else { + ResourceServerResource.get({ + realm : $route.current.params.realm, + client : client.id, + rsrid : $route.current.params.rsrid, + }, function(data) { + if (!data.scopes) { + data.scopes = []; + } + + $scope.resource = angular.copy(data); + $scope.changed = false; + + $scope.originalResource = angular.copy($scope.resource); + + $scope.$watch('resource', function() { + if (!angular.equals($scope.resource, data)) { + $scope.changed = true; + } + }, true); + + $scope.save = function() { + for (i = 0; i < $scope.resource.scopes.length; i++) { + delete $scope.resource.scopes[i].text; + } + $instance.checkNameAvailability(function () { + ResourceServerResource.update({realm : realm.realm, client : $scope.client.id, rsrid : $scope.resource._id}, $scope.resource, function() { + $route.reload(); + Notifications.success("The resource has been updated."); + }); + }); + } + + $scope.remove = function() { + Resources.delete(ResourceServerResource, $route.current.params.realm, client, $scope, AuthzDialog, $location, Notifications, $route); + } + + $scope.reset = function() { + $route.reload(); + } + }); + } + }); + + $scope.checkNewNameAvailability = function () { + $instance.checkNameAvailability(function () {}); + } + + this.checkNameAvailability = function (onSuccess) { + if (!$scope.resource.name || $scope.resource.name.trim().length == 0) { + return; + } + ResourceServerResource.search({ + realm : $route.current.params.realm, + client : client.id, + rsrid : $route.current.params.rsrid, + name: $scope.resource.name + }, function(data) { + if (data && data._id && data._id != $scope.resource._id) { + Notifications.error("Name already in use by another resource, please choose another one."); + } else { + onSuccess(); + } + }); + } +}); + +var Scopes = { + delete: function(ResourceServerScope, realm, client, $scope, AuthzDialog, $location, Notifications, $route) { + ResourceServerScope.permissions({ + realm : realm, + client : client.id, + id : $scope.scope.id + }, function (permissions) { + var msg = ""; + + if (permissions.length > 0 && !$scope.deleteConsent) { + msg = "

This scope is referenced in some permissions:

"; + msg += "
    "; + for (i = 0; i < permissions.length; i++) { + msg+= "
  • " + permissions[i].name + "
  • "; + } + msg += "
"; + msg += "

If you remove this scope, the permissions above will be affected and will not be associated with this scope anymore.

"; + } + + AuthzDialog.confirmDeleteWithMsg($scope.scope.name, "Scope", msg, function() { + ResourceServerScope.delete({realm : realm, client : $scope.client.id, id : $scope.scope.id}, null, function() { + $location.url("/realms/" + realm + "/clients/" + $scope.client.id + "/authz/resource-server/scope"); + $route.reload(); + Notifications.success("The scope has been deleted."); + }); + }); + }); + } +} + +module.controller('ResourceServerScopeCtrl', function($scope, $http, $route, $location, realm, ResourceServer, ResourceServerScope,client, AuthzDialog, Notifications) { + $scope.realm = realm; + $scope.client = client; + + $scope.query = { + realm: realm.realm, + client : client.id, + deep: false, + max : 20, + first : 0 + }; + + $scope.listSizes = [5, 10, 20]; + + ResourceServer.get({ + realm : $route.current.params.realm, + client : client.id + }, function(data) { + $scope.server = data; + + $scope.createPolicy = function(scope) { + $location.path('/realms/' + $route.current.params.realm + '/clients/' + client.id + '/authz/resource-server/permission/scope/create').search({scpid: scope.id}); + } + + $scope.searchQuery(); + }); + + $scope.firstPage = function() { + $scope.query.first = 0; + $scope.searchQuery(); + } + + $scope.previousPage = function() { + $scope.query.first -= parseInt($scope.query.max); + if ($scope.query.first < 0) { + $scope.query.first = 0; + } + $scope.searchQuery(); + } + + $scope.nextPage = function() { + $scope.query.first += parseInt($scope.query.max); + $scope.searchQuery(); + } + + $scope.searchQuery = function(detailsFilter) { + $scope.searchLoaded = false; + + ResourceServerScope.query($scope.query, function(response) { + $scope.scopes = response; + $scope.searchLoaded = true; + $scope.lastSearch = $scope.query.search; + if ($scope.detailsFilter) { + $scope.showDetails(); + } + }); + }; + + $scope.loadDetails = function (scope) { + if (scope.details) { + scope.details.loaded = !scope.details.loaded; + return; + } + + scope.details = {loaded: false}; + + ResourceServerScope.resources({ + realm : $route.current.params.realm, + client : client.id, + id : scope.id + }, function(response) { + scope.resources = response; + ResourceServerScope.permissions({ + realm : $route.current.params.realm, + client : client.id, + id : scope.id + }, function(response) { + scope.policies = response; + scope.details.loaded = true; + }); + }); + } + + $scope.showDetails = function(item) { + if (item) { + $scope.loadDetails(item); + } else { + for (i = 0; i < $scope.scopes.length; i++) { + $scope.loadDetails($scope.scopes[i]); + } + } + }; + + $scope.delete = function(scope) { + $scope.scope = scope; + Scopes.delete(ResourceServerScope, $route.current.params.realm, client, $scope, AuthzDialog, $location, Notifications, $route); + }; +}); + +module.controller('ResourceServerScopeDetailCtrl', function($scope, $http, $route, $location, realm, ResourceServer, client, ResourceServerScope, AuthzDialog, Notifications) { + $scope.realm = realm; + $scope.client = client; + + var $instance = this; + + ResourceServer.get({ + realm : $route.current.params.realm, + client : client.id + }, function(data) { + $scope.server = data; + + var scopeId = $route.current.params.id; + + if (!scopeId) { + $scope.create = true; + $scope.changed = false; + + var scope = {}; + + $scope.scope = angular.copy(scope); + + $scope.$watch('scope', function() { + if (!angular.equals($scope.scope, scope)) { + $scope.changed = true; + } + }, true); + + $scope.save = function() { + $instance.checkNameAvailability(function () { + ResourceServerScope.save({realm : realm.realm, client : $scope.client.id}, $scope.scope, function(data) { + $location.url("/realms/" + realm.realm + "/clients/" + client.id + "/authz/resource-server/scope/" + data.id); + Notifications.success("The scope has been created."); + }); + }); + } + + $scope.reset = function() { + $location.url("/realms/" + realm.realm + "/clients/" + $scope.client.id + "/authz/resource-server/scope/"); + } + } else { + ResourceServerScope.get({ + realm : $route.current.params.realm, + client : client.id, + id : $route.current.params.id, + }, function(data) { + $scope.scope = angular.copy(data); + $scope.changed = false; + + $scope.$watch('scope', function() { + if (!angular.equals($scope.scope, data)) { + $scope.changed = true; + } + }, true); + + $scope.originalScope = angular.copy($scope.scope); + + $scope.save = function() { + $instance.checkNameAvailability(function () { + ResourceServerScope.update({realm : realm.realm, client : $scope.client.id, id : $scope.scope.id}, $scope.scope, function() { + $scope.changed = false; + Notifications.success("The scope has been updated."); + }); + }); + } + + $scope.remove = function() { + Scopes.delete(ResourceServerScope, $route.current.params.realm, client, $scope, AuthzDialog, $location, Notifications, $route); + } + + $scope.reset = function() { + $route.reload(); + } + }); + } + }); + + $scope.checkNewNameAvailability = function () { + $instance.checkNameAvailability(function () {}); + } + + this.checkNameAvailability = function (onSuccess) { + if (!$scope.scope.name || $scope.scope.name.trim().length == 0) { + return; + } + ResourceServerScope.search({ + realm : $route.current.params.realm, + client : client.id, + name: $scope.scope.name + }, function(data) { + if (data && data.id && data.id != $scope.scope.id) { + Notifications.error("Name already in use by another scope, please choose another one."); + } else { + onSuccess(); + } + }); + } +}); + +module.controller('ResourceServerPolicyCtrl', function($scope, $http, $route, $location, realm, ResourceServer, ResourceServerPolicy, PolicyProvider, client, AuthzDialog, Notifications) { + $scope.realm = realm; + $scope.client = client; + $scope.policyProviders = []; + + $scope.query = { + realm: realm.realm, + client : client.id, + permission: false, + max: 20, + first : 0 + }; + + $scope.listSizes = [5, 10, 20]; + + PolicyProvider.query({ + realm : $route.current.params.realm, + client : client.id + }, function (data) { + for (i = 0; i < data.length; i++) { + if (data[i].type != 'resource' && data[i].type != 'scope') { + $scope.policyProviders.push(data[i]); + } + } + }); + + ResourceServer.get({ + realm : $route.current.params.realm, + client : client.id + }, function(data) { + $scope.server = data; + $scope.searchQuery(); + }); + + $scope.addPolicy = function(policyType) { + $location.url("/realms/" + realm.realm + "/clients/" + client.id + "/authz/resource-server/policy/" + policyType.type + "/create"); + } + + $scope.firstPage = function() { + $scope.query.first = 0; + $scope.searchQuery(); + } + + $scope.previousPage = function() { + $scope.query.first -= parseInt($scope.query.max); + if ($scope.query.first < 0) { + $scope.query.first = 0; + } + $scope.searchQuery(); + } + + $scope.nextPage = function() { + $scope.query.first += parseInt($scope.query.max); + $scope.searchQuery(); + } + + $scope.searchQuery = function() { + $scope.searchLoaded = false; + + ResourceServerPolicy.query($scope.query, function(data) { + $scope.policies = data; + $scope.searchLoaded = true; + $scope.lastSearch = $scope.query.search; + if ($scope.detailsFilter) { + $scope.showDetails(); + } + }); + }; + + $scope.loadDetails = function (policy) { + if (policy.details) { + policy.details.loaded = !policy.details.loaded; + return; + } + + policy.details = {loaded: false}; + + ResourceServerPolicy.dependentPolicies({ + realm : $route.current.params.realm, + client : client.id, + id : policy.id + }, function(response) { + policy.dependentPolicies = response; + policy.details.loaded = true; + }); + } + + $scope.showDetails = function(item) { + if (item) { + $scope.loadDetails(item); + } else { + for (i = 0; i < $scope.policies.length; i++) { + $scope.loadDetails($scope.policies[i]); + } + } + }; + + $scope.delete = function(policy) { + $scope.policy = policy; + Policies.delete(ResourceServerPolicy, $route.current.params.realm, client, $scope, AuthzDialog, $location, Notifications, $route, false); + }; +}); + +module.controller('ResourceServerPermissionCtrl', function($scope, $http, $route, $location, realm, ResourceServer, ResourceServerPermission, PolicyProvider, client, AuthzDialog, Notifications) { + $scope.realm = realm; + $scope.client = client; + $scope.policyProviders = []; + + $scope.query = { + realm: realm.realm, + client : client.id, + max : 20, + first : 0 + }; + + $scope.listSizes = [5, 10, 20]; + + PolicyProvider.query({ + realm : $route.current.params.realm, + client : client.id + }, function (data) { + for (i = 0; i < data.length; i++) { + if (data[i].type == 'resource' || data[i].type == 'scope') { + $scope.policyProviders.push(data[i]); + } + } + }); + + ResourceServer.get({ + realm : $route.current.params.realm, + client : client.id + }, function(data) { + $scope.server = data; + $scope.searchQuery(); + }); + + $scope.addPolicy = function(policyType) { + $location.url("/realms/" + realm.realm + "/clients/" + client.id + "/authz/resource-server/permission/" + policyType.type + "/create"); + } + + $scope.firstPage = function() { + $scope.query.first = 0; + $scope.searchQuery(); + } + + $scope.previousPage = function() { + $scope.query.first -= parseInt($scope.query.max); + if ($scope.query.first < 0) { + $scope.query.first = 0; + } + $scope.searchQuery(); + } + + $scope.nextPage = function() { + $scope.query.first += parseInt($scope.query.max); + $scope.searchQuery(); + } + + $scope.searchQuery = function() { + $scope.searchLoaded = false; + + ResourceServerPermission.query($scope.query, function(data) { + $scope.policies = data; + $scope.searchLoaded = true; + $scope.lastSearch = $scope.query.search; + if ($scope.detailsFilter) { + $scope.showDetails(); + } + }); + }; + + $scope.loadDetails = function (policy) { + if (policy.details) { + policy.details.loaded = !policy.details.loaded; + return; + } + + policy.details = {loaded: false}; + + ResourceServerPermission.associatedPolicies({ + realm : $route.current.params.realm, + client : client.id, + id : policy.id + }, function(response) { + policy.associatedPolicies = response; + policy.details.loaded = true; + }); + } + + $scope.showDetails = function(item) { + if (item) { + $scope.loadDetails(item); + } else { + for (i = 0; i < $scope.policies.length; i++) { + $scope.loadDetails($scope.policies[i]); + } + } + }; + + $scope.delete = function(policy) { + $scope.policy = policy; + Policies.delete(ResourceServerPermission, $route.current.params.realm, client, $scope, AuthzDialog, $location, Notifications, $route, true); + }; +}); + +module.controller('ResourceServerPolicyDroolsDetailCtrl', function($scope, $http, $route, realm, client, PolicyController) { + PolicyController.onInit({ + getPolicyType : function() { + return "rules"; + }, + + onInit : function() { + $scope.drools = {}; + + $scope.resolveModules = function(policy) { + if (!policy) { + policy = $scope.policy; + } + + delete policy.config; + + $http.post(authUrl + '/admin/realms/'+ $route.current.params.realm + '/clients/' + client.id + '/authz/resource-server/policy/rules/provider/resolveModules' + , policy).then(function(response) { + $scope.drools.moduleNames = response.data; + $scope.resolveSessions(); + }); + } + + $scope.resolveSessions = function() { + delete $scope.policy.config; + + $http.post(authUrl + '/admin/realms/'+ $route.current.params.realm + '/clients/' + client.id + '/authz/resource-server/policy/rules/provider/resolveSessions' + , $scope.policy).then(function(response) { + $scope.drools.moduleSessions = response.data; + }); + } + }, + + onInitUpdate : function(policy) { + policy.scannerPeriod = parseInt(policy.scannerPeriod); + $scope.resolveModules(policy); + }, + + onUpdate : function() { + delete $scope.policy.config; + }, + + onInitCreate : function(newPolicy) { + newPolicy.scannerPeriod = 1; + newPolicy.scannerPeriodUnit = 'Hours'; + }, + + onCreate : function() { + delete $scope.policy.config; + } + }, realm, client, $scope); +}); + +module.controller('ResourceServerPolicyResourceDetailCtrl', function($scope, $route, $location, realm, client, PolicyController, ResourceServerPermission, ResourceServerResource) { + PolicyController.onInit({ + getPolicyType : function() { + return "resource"; + }, + + isPermission : function() { + return true; + }, + + onInit : function() { + $scope.resourcesUiSelect = { + minimumInputLength: 1, + delay: 500, + allowClear: true, + id: function(resource){ return resource._id; }, + query: function (query) { + var data = {results: []}; + if ('' == query.term.trim()) { + query.callback(data); + return; + } + $scope.query = { + realm: realm.realm, + client : client.id, + name: query.term.trim(), + deep: false, + max : 20, + first : 0 + }; + ResourceServerResource.query($scope.query, function(response) { + data.results = response; + query.callback(data); + }); + }, + formatResult: function(object, container, query) { + object.text = object.name; + return object.name; + } + }; + + $scope.policiesUiSelect = { + minimumInputLength: 1, + delay: 500, + allowClear: true, + query: function (query) { + var data = {results: []}; + if ('' == query.term.trim()) { + query.callback(data); + return; + } + $scope.query = { + realm: realm.realm, + client : client.id, + permission: false, + name: query.term.trim(), + max : 20, + first : 0 + }; + ResourceServerPermission.searchPolicies($scope.query, function(response) { + data.results = response; + query.callback(data); + }); + }, + formatResult: function(object, container, query) { + object.text = object.name; + return object.name; + } + }; + + $scope.applyToResourceType = function() { + if ($scope.applyToResourceTypeFlag) { + $scope.selectedResource = null; + } else { + $scope.policy.resourceType = null; + } + } + }, + + onInitUpdate : function(policy) { + if (!policy.resourceType) { + $scope.selectedResource = {}; + ResourceServerPermission.resources({ + realm: $route.current.params.realm, + client: client.id, + id: policy.id + }, function (resources) { + resources[0].text = resources[0].name; + $scope.selectedResource = resources[0]; + var copy = angular.copy($scope.selectedResource); + $scope.$watch('selectedResource', function() { + if (!angular.equals($scope.selectedResource, copy)) { + $scope.changed = true; + } + }, true); + }); + } else { + $scope.applyToResourceTypeFlag = true; + } + + ResourceServerPermission.associatedPolicies({ + realm : $route.current.params.realm, + client : client.id, + id : policy.id + }, function(policies) { + $scope.selectedPolicies = []; + for (i = 0; i < policies.length; i++) { + policies[i].text = policies[i].name; + $scope.selectedPolicies.push(policies[i]); + var copy = angular.copy($scope.selectedPolicies); + $scope.$watch('selectedPolicies', function() { + if (!angular.equals($scope.selectedPolicies, copy)) { + $scope.changed = true; + } + }, true); + } + }); + }, + + onUpdate : function() { + if ($scope.selectedResource && $scope.selectedResource._id) { + $scope.policy.resources = []; + $scope.policy.resources.push($scope.selectedResource._id); + } else { + delete $scope.policy.resources + } + + var policies = []; + + for (i = 0; i < $scope.selectedPolicies.length; i++) { + policies.push($scope.selectedPolicies[i].id); + } + + $scope.policy.policies = policies; + delete $scope.policy.config; + }, + + onInitCreate : function(newPolicy) { + newPolicy.decisionStrategy = 'UNANIMOUS'; + $scope.selectedResource = null; + var copy = angular.copy($scope.selectedResource); + $scope.$watch('selectedResource', function() { + if (!angular.equals($scope.selectedResource, copy)) { + $scope.changed = true; + } + }, true); + + $scope.selectedPolicies = null; + var copy = angular.copy($scope.selectedPolicies); + $scope.$watch('selectedPolicies', function() { + if (!angular.equals($scope.selectedPolicies, copy)) { + $scope.changed = true; + } + }, true); + + var resourceId = $location.search()['rsrid']; + + if (resourceId) { + ResourceServerResource.get({ + realm : $route.current.params.realm, + client : client.id, + rsrid : resourceId + }, function(data) { + data.text = data.name; + $scope.selectedResource = data; + }); + } + }, + + onCreate : function() { + if ($scope.selectedResource && $scope.selectedResource._id) { + $scope.policy.resources = []; + $scope.policy.resources.push($scope.selectedResource._id); + } else { + delete $scope.policy.resources + } + + var policies = []; + + for (i = 0; i < $scope.selectedPolicies.length; i++) { + policies.push($scope.selectedPolicies[i].id); + } + + $scope.policy.policies = policies; + delete $scope.policy.config; + } + }, realm, client, $scope); +}); + +module.controller('ResourceServerPolicyScopeDetailCtrl', function($scope, $route, $location, realm, client, PolicyController, ResourceServerPolicy, ResourceServerResource, ResourceServerScope) { + PolicyController.onInit({ + getPolicyType : function() { + return "scope"; + }, + + isPermission : function() { + return true; + }, + + onInit : function() { + $scope.scopesUiSelect = { + minimumInputLength: 1, + delay: 500, + allowClear: true, + query: function (query) { + var data = {results: []}; + if ('' == query.term.trim()) { + query.callback(data); + return; + } + $scope.query = { + realm: realm.realm, + client : client.id, + name: query.term.trim(), + deep: false, + max : 20, + first : 0 + }; + ResourceServerScope.query($scope.query, function(response) { + data.results = response; + query.callback(data); + }); + }, + formatResult: function(object, container, query) { + object.text = object.name; + return object.name; + } + }; + + $scope.resourcesUiSelect = { + minimumInputLength: 1, + delay: 500, + allowClear: true, + id: function(resource){ return resource._id; }, + query: function (query) { + var data = {results: []}; + if ('' == query.term.trim()) { + query.callback(data); + return; + } + $scope.query = { + realm: realm.realm, + client : client.id, + name: query.term.trim(), + deep: false, + max : 20, + first : 0 + }; + ResourceServerResource.query($scope.query, function(response) { + data.results = response; + query.callback(data); + }); + }, + formatResult: function(object, container, query) { + object.text = object.name; + return object.name; + } + }; + + $scope.policiesUiSelect = { + minimumInputLength: 1, + delay: 500, + allowClear: true, + query: function (query) { + var data = {results: []}; + if ('' == query.term.trim()) { + query.callback(data); + return; + } + $scope.query = { + realm: realm.realm, + client : client.id, + permission: false, + name: query.term.trim(), + max : 20, + first : 0 + }; + ResourceServerPolicy.query($scope.query, function(response) { + data.results = response; + query.callback(data); + }); + }, + formatResult: function(object, container, query) { + object.text = object.name; + return object.name; + } + }; + + $scope.selectResource = function() { + $scope.selectedScopes = null; + if ($scope.selectedResource) { + ResourceServerResource.scopes({ + realm: $route.current.params.realm, + client: client.id, + rsrid: $scope.selectedResource._id + }, function (data) { + $scope.resourceScopes = data; + }); + } + } + }, + + onInitUpdate : function(policy) { + ResourceServerPolicy.resources({ + realm : $route.current.params.realm, + client : client.id, + id : policy.id + }, function(resources) { + if (resources.length > 0) { + for (i = 0; i < resources.length; i++) { + ResourceServerResource.get({ + realm: $route.current.params.realm, + client: client.id, + rsrid: resources[0]._id, + }, function (resource) { + ResourceServerResource.query({ + realm: $route.current.params.realm, + client: client.id, + _id: resource._id, + deep: false + }, function (resource) { + resource[0].text = resource[0].name; + $scope.selectedResource = resource[0]; + var copy = angular.copy($scope.selectedResource); + $scope.$watch('selectedResource', function() { + if (!angular.equals($scope.selectedResource, copy)) { + $scope.changed = true; + } + }, true); + ResourceServerResource.scopes({ + realm: $route.current.params.realm, + client: client.id, + rsrid: resource[0]._id + }, function (scopes) { + $scope.resourceScopes = scopes; + }); + }); + }); + } + + ResourceServerPolicy.scopes({ + realm : $route.current.params.realm, + client : client.id, + id : policy.id + }, function(scopes) { + $scope.selectedScopes = []; + for (i = 0; i < scopes.length; i++) { + scopes[i].text = scopes[i].name; + $scope.selectedScopes.push(scopes[i].id); + } + var copy = angular.copy($scope.selectedScopes); + $scope.$watch('selectedScopes', function() { + if (!angular.equals($scope.selectedScopes, copy)) { + $scope.changed = true; + } + }, true); + }); + } else { + $scope.selectedResource = null; + var copy = angular.copy($scope.selectedResource); + $scope.$watch('selectedResource', function() { + if (!angular.equals($scope.selectedResource, copy)) { + $scope.changed = true; + } + }, true); + ResourceServerPolicy.scopes({ + realm : $route.current.params.realm, + client : client.id, + id : policy.id + }, function(scopes) { + $scope.selectedScopes = []; + for (i = 0; i < scopes.length; i++) { + scopes[i].text = scopes[i].name; + $scope.selectedScopes.push(scopes[i]); + } + var copy = angular.copy($scope.selectedScopes); + $scope.$watch('selectedScopes', function() { + if (!angular.equals($scope.selectedScopes, copy)) { + $scope.changed = true; + } + }, true); + }); + } + }); + + ResourceServerPolicy.associatedPolicies({ + realm : $route.current.params.realm, + client : client.id, + id : policy.id + }, function(policies) { + $scope.selectedPolicies = []; + for (i = 0; i < policies.length; i++) { + policies[i].text = policies[i].name; + $scope.selectedPolicies.push(policies[i]); + } + var copy = angular.copy($scope.selectedPolicies); + $scope.$watch('selectedPolicies', function() { + if (!angular.equals($scope.selectedPolicies, copy)) { + $scope.changed = true; + } + }, true); + }); + }, + + onUpdate : function() { + if ($scope.selectedResource != null) { + $scope.policy.resources = [$scope.selectedResource._id]; + } else { + delete $scope.policy.resources; + } + + var scopes = []; + + for (i = 0; i < $scope.selectedScopes.length; i++) { + if ($scope.selectedScopes[i].id) { + scopes.push($scope.selectedScopes[i].id); + } else { + scopes.push($scope.selectedScopes[i]); + } + } + + $scope.policy.scopes = scopes; + + var policies = []; + + for (i = 0; i < $scope.selectedPolicies.length; i++) { + policies.push($scope.selectedPolicies[i].id); + } + + $scope.policy.policies = policies; + delete $scope.policy.config; + }, + + onInitCreate : function(newPolicy) { + newPolicy.decisionStrategy = 'UNANIMOUS'; + + var scopeId = $location.search()['scpid']; + + if (scopeId) { + ResourceServerScope.get({ + realm: $route.current.params.realm, + client: client.id, + id: scopeId, + }, function (data) { + data.text = data.name; + if (!$scope.policy.scopes) { + $scope.selectedScopes = []; + } + $scope.selectedScopes.push(data); + }); + } + }, + + onCreate : function() { + if ($scope.selectedResource != null) { + $scope.policy.resources = [$scope.selectedResource._id]; + } + + var scopes = []; + + for (i = 0; i < $scope.selectedScopes.length; i++) { + if ($scope.selectedScopes[i].id) { + scopes.push($scope.selectedScopes[i].id); + } else { + scopes.push($scope.selectedScopes[i]); + } + } + + $scope.policy.scopes = scopes; + + var policies = []; + + for (i = 0; i < $scope.selectedPolicies.length; i++) { + policies.push($scope.selectedPolicies[i].id); + } + + $scope.policy.policies = policies; + delete $scope.policy.config; + } + }, realm, client, $scope); +}); + +module.controller('ResourceServerPolicyUserDetailCtrl', function($scope, $route, realm, client, PolicyController, User) { + PolicyController.onInit({ + getPolicyType : function() { + return "user"; + }, + + onInit : function() { + $scope.usersUiSelect = { + minimumInputLength: 1, + delay: 500, + allowClear: true, + query: function (query) { + var data = {results: []}; + if ('' == query.term.trim()) { + query.callback(data); + return; + } + User.query({realm: $route.current.params.realm, search: query.term.trim(), max: 20}, function(response) { + data.results = response; + query.callback(data); + }); + }, + formatResult: function(object, container, query) { + return object.username; + } + }; + + $scope.selectedUsers = []; + + $scope.selectUser = function(user) { + if (!user || !user.id) { + return; + } + + $scope.selectedUser = null; + + for (i = 0; i < $scope.selectedUsers.length; i++) { + if ($scope.selectedUsers[i].id == user.id) { + return; + } + } + + $scope.selectedUsers.push(user); + } + + $scope.removeFromList = function(list, user) { + for (i = 0; i < angular.copy(list).length; i++) { + if (user == list[i]) { + list.splice(i, 1); + } + } + } + }, + + onInitUpdate : function(policy) { + var selectedUsers = []; + + if (policy.users) { + var users = policy.users; + + for (i = 0; i < users.length; i++) { + User.get({realm: $route.current.params.realm, userId: users[i]}, function(data) { + selectedUsers.push(data); + $scope.selectedUsers = angular.copy(selectedUsers); + }); + } + } + + $scope.$watch('selectedUsers', function() { + if (!angular.equals($scope.selectedUsers, selectedUsers)) { + $scope.changed = true; + } else { + $scope.changed = false; + } + }, true); + }, + + onUpdate : function() { + var users = []; + + for (i = 0; i < $scope.selectedUsers.length; i++) { + users.push($scope.selectedUsers[i].id); + } + + $scope.policy.users = users; + delete $scope.policy.config; + }, + + onCreate : function() { + var users = []; + + for (i = 0; i < $scope.selectedUsers.length; i++) { + users.push($scope.selectedUsers[i].id); + } + + $scope.policy.users = users; + delete $scope.policy.config; + } + }, realm, client, $scope); +}); + +module.controller('ResourceServerPolicyClientDetailCtrl', function($scope, $route, realm, client, PolicyController, Client) { + PolicyController.onInit({ + getPolicyType : function() { + return "client"; + }, + + onInit : function() { + $scope.clientsUiSelect = { + minimumInputLength: 1, + delay: 500, + allowClear: true, + query: function (query) { + var data = {results: []}; + if ('' == query.term.trim()) { + query.callback(data); + return; + } + Client.query({realm: $route.current.params.realm, search: query.term.trim(), max: 20}, function(response) { + for (i = 0; i < response.length; i++) { + if (response[i].clientId.indexOf(query.term) != -1) { + data.results.push(response[i]); + } + } + query.callback(data); + }); + }, + formatResult: function(object, container, query) { + return object.clientId; + } + }; + + $scope.selectedClients = []; + + $scope.selectClient = function(client) { + if (!client || !client.id) { + return; + } + + $scope.selectedClient = null; + + for (var i = 0; i < $scope.selectedClients.length; i++) { + if ($scope.selectedClients[i].id == client.id) { + return; + } + } + + $scope.selectedClients.push(client); + } + + $scope.removeFromList = function(client) { + var index = $scope.selectedClients.indexOf(client); + if (index != -1) { + $scope.selectedClients.splice(index, 1); + } + } + }, + + onInitUpdate : function(policy) { + var selectedClients = []; + + if (policy.clients) { + var clients = policy.clients; + + for (var i = 0; i < clients.length; i++) { + Client.get({realm: $route.current.params.realm, client: clients[i]}, function(data) { + selectedClients.push(data); + $scope.selectedClients = angular.copy(selectedClients); + }); + } + } + + $scope.$watch('selectedClients', function() { + if (!angular.equals($scope.selectedClients, selectedClients)) { + $scope.changed = true; + } else { + $scope.changed = false; + } + }, true); + }, + + onUpdate : function() { + var clients = []; + + for (var i = 0; i < $scope.selectedClients.length; i++) { + clients.push($scope.selectedClients[i].id); + } + + $scope.policy.clients = clients; + delete $scope.policy.config; + }, + + onInitCreate : function() { + var selectedClients = []; + + $scope.$watch('selectedClients', function() { + if (!angular.equals($scope.selectedClients, selectedClients)) { + $scope.changed = true; + } + }, true); + }, + + onCreate : function() { + var clients = []; + + for (var i = 0; i < $scope.selectedClients.length; i++) { + clients.push($scope.selectedClients[i].id); + } + + $scope.policy.clients = clients; + delete $scope.policy.config; + } + }, realm, client, $scope); +}); + +module.controller('ResourceServerPolicyRoleDetailCtrl', function($scope, $route, realm, client, Client, ClientRole, PolicyController, Role, RoleById) { + PolicyController.onInit({ + getPolicyType : function() { + return "role"; + }, + + onInit : function() { + Role.query({realm: $route.current.params.realm}, function(data) { + $scope.roles = data; + }); + + Client.query({realm: $route.current.params.realm}, function (data) { + $scope.clients = data; + }); + + $scope.selectedRoles = []; + + $scope.selectRole = function(role) { + if (!role || !role.id) { + return; + } + + $scope.selectedRole = null; + + for (i = 0; i < $scope.selectedRoles.length; i++) { + if ($scope.selectedRoles[i].id == role.id) { + return; + } + } + + $scope.selectedRoles.push(role); + + var clientRoles = []; + + if ($scope.clientRoles) { + for (i = 0; i < $scope.clientRoles.length; i++) { + if ($scope.clientRoles[i].id != role.id) { + clientRoles.push($scope.clientRoles[i]); + } + } + $scope.clientRoles = clientRoles; + } + } + + $scope.removeFromList = function(role) { + if ($scope.clientRoles && $scope.selectedClient && $scope.selectedClient.id == role.containerId) { + $scope.clientRoles.push(role); + } + var index = $scope.selectedRoles.indexOf(role); + if (index != -1) { + $scope.selectedRoles.splice(index, 1); + } + } + + $scope.selectClient = function() { + if (!$scope.selectedClient) { + $scope.clientRoles = []; + return; + } + ClientRole.query({realm: $route.current.params.realm, client: $scope.selectedClient.id}, function(data) { + var roles = []; + + for (j = 0; j < data.length; j++) { + var defined = false; + + for (i = 0; i < $scope.selectedRoles.length; i++) { + if ($scope.selectedRoles[i].id == data[j].id) { + defined = true; + break; + } + } + + if (!defined) { + data[j].container = {}; + data[j].container.name = $scope.selectedClient.clientId; + roles.push(data[j]); + } + } + $scope.clientRoles = roles; + }); + } + }, + + onInitUpdate : function(policy) { + var selectedRoles = []; + + if (policy.roles) { + var roles = policy.roles; + + for (i = 0; i < roles.length; i++) { + RoleById.get({realm: $route.current.params.realm, role: roles[i].id}, function(data) { + for (i = 0; i < roles.length; i++) { + if (roles[i].id == data.id) { + data.required = roles[i].required ? true : false; + } + } + for (i = 0; i < $scope.clients.length; i++) { + if ($scope.clients[i].id == data.containerId) { + data.container = {}; + data.container.name = $scope.clients[i].clientId; + } + } + selectedRoles.push(data); + $scope.selectedRoles = angular.copy(selectedRoles); + }); + } + } + + $scope.$watch('selectedRoles', function() { + if (!angular.equals($scope.selectedRoles, selectedRoles)) { + $scope.changed = true; + } else { + $scope.changed = false; + } + }, true); + }, + + onUpdate : function() { + var roles = []; + + for (i = 0; i < $scope.selectedRoles.length; i++) { + var role = {}; + role.id = $scope.selectedRoles[i].id; + if ($scope.selectedRoles[i].required) { + role.required = $scope.selectedRoles[i].required; + } + roles.push(role); + } + + $scope.policy.roles = roles; + delete $scope.policy.config; + }, + + onCreate : function() { + var roles = []; + + for (i = 0; i < $scope.selectedRoles.length; i++) { + var role = {}; + role.id = $scope.selectedRoles[i].id; + if ($scope.selectedRoles[i].required) { + role.required = $scope.selectedRoles[i].required; + } + roles.push(role); + } + + $scope.policy.roles = roles; + delete $scope.policy.config; + } + }, realm, client, $scope); + + $scope.hasRealmRole = function () { + for (i = 0; i < $scope.selectedRoles.length; i++) { + if (!$scope.selectedRoles[i].clientRole) { + return true; + } + } + return false; + } + + $scope.hasClientRole = function () { + for (i = 0; i < $scope.selectedRoles.length; i++) { + if ($scope.selectedRoles[i].clientRole) { + return true; + } + } + return false; + } +}); + +module.controller('ResourceServerPolicyGroupDetailCtrl', function($scope, $route, realm, client, Client, Groups, Group, PolicyController) { + PolicyController.onInit({ + getPolicyType : function() { + return "group"; + }, + + onInit : function() { + $scope.tree = []; + + Groups.query({realm: $route.current.params.realm}, function(groups) { + $scope.groups = groups; + $scope.groupList = [ + {"id" : "realm", "name": "Groups", + "subGroups" : groups} + ]; + }); + + var isLeaf = function(node) { + return node.id != "realm" && (!node.subGroups || node.subGroups.length == 0); + } + + $scope.getGroupClass = function(node) { + if (node.id == "realm") { + return 'pficon pficon-users'; + } + if (isLeaf(node)) { + return 'normal'; + } + if (node.subGroups.length && node.collapsed) return 'collapsed'; + if (node.subGroups.length && !node.collapsed) return 'expanded'; + return 'collapsed'; + + } + + $scope.getSelectedClass = function(node) { + if (node.selected) { + return 'selected'; + } else if ($scope.cutNode && $scope.cutNode.id == node.id) { + return 'cut'; + } + return undefined; + } + + $scope.selectGroup = function(group) { + for (i = 0; i < $scope.selectedGroups.length; i++) { + if ($scope.selectedGroups[i].id == group.id) { + return + } + } + $scope.selectedGroups.push({id: group.id, path: group.path}); + $scope.changed = true; + } + + $scope.extendChildren = function(group) { + $scope.changed = true; + } + + $scope.removeFromList = function(group) { + var index = $scope.selectedGroups.indexOf(group); + if (index != -1) { + $scope.selectedGroups.splice(index, 1); + $scope.changed = true; + } + } + }, + + onInitCreate : function(policy) { + var selectedGroups = []; + + $scope.selectedGroups = angular.copy(selectedGroups); + + $scope.$watch('selectedGroups', function() { + if (!angular.equals($scope.selectedGroups, selectedGroups)) { + $scope.changed = true; + } else { + $scope.changed = false; + } + }, true); + }, + + onInitUpdate : function(policy) { + $scope.selectedGroups = policy.groups; + + angular.forEach($scope.selectedGroups, function(group, index){ + Group.get({realm: $route.current.params.realm, groupId: group.id}, function (existing) { + group.path = existing.path; + }); + }); + + $scope.$watch('selectedGroups', function() { + if (!$scope.changed) { + return; + } + if (!angular.equals($scope.selectedGroups, selectedGroups)) { + $scope.changed = true; + } else { + $scope.changed = false; + } + }, true); + }, + + onUpdate : function() { + $scope.policy.groups = $scope.selectedGroups; + delete $scope.policy.config; + }, + + onCreate : function() { + $scope.policy.groups = $scope.selectedGroups; + delete $scope.policy.config; + } + }, realm, client, $scope); +}); + +module.controller('ResourceServerPolicyJSDetailCtrl', function($scope, $route, $location, realm, PolicyController, client) { + PolicyController.onInit({ + getPolicyType : function() { + return "js"; + }, + + onInit : function() { + $scope.initEditor = function(editor){ + editor.$blockScrolling = Infinity; + var session = editor.getSession(); + session.setMode('ace/mode/javascript'); + }; + }, + + onInitUpdate : function(policy) { + + }, + + onUpdate : function() { + delete $scope.policy.config; + }, + + onInitCreate : function(newPolicy) { + }, + + onCreate : function() { + delete $scope.policy.config; + } + }, realm, client, $scope); +}); + +module.controller('ResourceServerPolicyTimeDetailCtrl', function($scope, $route, $location, realm, PolicyController, client) { + PolicyController.onInit({ + getPolicyType : function() { + return "time"; + }, + + onInit : function() { + }, + + onInitUpdate : function(policy) { + if (policy.dayMonth) { + policy.dayMonth = parseInt(policy.dayMonth); + } + if (policy.dayMonthEnd) { + policy.dayMonthEnd = parseInt(policy.dayMonthEnd); + } + if (policy.month) { + policy.month = parseInt(policy.month); + } + if (policy.monthEnd) { + policy.monthEnd = parseInt(policy.monthEnd); + } + if (policy.year) { + policy.year = parseInt(policy.year); + } + if (policy.yearEnd) { + policy.yearEnd = parseInt(policy.yearEnd); + } + if (policy.hour) { + policy.hour = parseInt(policy.hour); + } + if (policy.hourEnd) { + policy.hourEnd = parseInt(policy.hourEnd); + } + if (policy.minute) { + policy.minute = parseInt(policy.minute); + } + if (policy.minuteEnd) { + policy.minuteEnd = parseInt(policy.minuteEnd); + } + }, + + onUpdate : function() { + delete $scope.policy.config; + }, + + onInitCreate : function(newPolicy) { + }, + + onCreate : function() { + delete $scope.policy.config; + } + }, realm, client, $scope); + + $scope.isRequired = function () { + var policy = $scope.policy; + + if (!policy) { + return true; + } + + if (policy.notOnOrAfter || policy.notBefore + || policy.dayMonth + || policy.month + || policy.year + || policy.hour + || policy.minute) { + return false; + } + return true; + } +}); + +module.controller('ResourceServerPolicyAggregateDetailCtrl', function($scope, $route, $location, realm, PolicyController, ResourceServerPolicy, client) { + PolicyController.onInit({ + getPolicyType : function() { + return "aggregate"; + }, + + onInit : function() { + $scope.policiesUiSelect = { + minimumInputLength: 1, + delay: 500, + allowClear: true, + query: function (query) { + var data = {results: []}; + if ('' == query.term.trim()) { + query.callback(data); + return; + } + $scope.query = { + realm: realm.realm, + client : client.id, + permission: false, + name: query.term.trim(), + max : 20, + first : 0 + }; + ResourceServerPolicy.query($scope.query, function(response) { + data.results = response; + query.callback(data); + }); + }, + formatResult: function(object, container, query) { + object.text = object.name; + return object.name; + } + }; + }, + + onInitUpdate : function(policy) { + ResourceServerPolicy.associatedPolicies({ + realm : $route.current.params.realm, + client : client.id, + id : policy.id + }, function(policies) { + $scope.selectedPolicies = []; + for (i = 0; i < policies.length; i++) { + policies[i].text = policies[i].name; + $scope.selectedPolicies.push(policies[i]); + } + var copy = angular.copy($scope.selectedPolicies); + $scope.$watch('selectedPolicies', function() { + if (!angular.equals($scope.selectedPolicies, copy)) { + $scope.changed = true; + } + }, true); + }); + }, + + onUpdate : function() { + var policies = []; + + for (i = 0; i < $scope.selectedPolicies.length; i++) { + policies.push($scope.selectedPolicies[i].id); + } + + $scope.policy.policies = policies; + delete $scope.policy.config; + }, + + onInitCreate : function(newPolicy) { + newPolicy.decisionStrategy = 'UNANIMOUS'; + }, + + onCreate : function() { + var policies = []; + + for (i = 0; i < $scope.selectedPolicies.length; i++) { + policies.push($scope.selectedPolicies[i].id); + } + + $scope.policy.policies = policies; + delete $scope.policy.config; + } + }, realm, client, $scope); +}); + +module.service("PolicyController", function($http, $route, $location, ResourceServer, ResourceServerPolicy, ResourceServerPermission, AuthzDialog, Notifications) { + + var PolicyController = {}; + + PolicyController.onInit = function(delegate, realm, client, $scope) { + if (!delegate.isPermission) { + delegate.isPermission = function () { + return false; + } + } + + var service = ResourceServerPolicy; + + if (delegate.isPermission()) { + service = ResourceServerPermission; + } + + $scope.realm = realm; + $scope.client = client; + + $scope.decisionStrategies = ['AFFIRMATIVE', 'UNANIMOUS', 'CONSENSUS']; + $scope.logics = ['POSITIVE', 'NEGATIVE']; + + delegate.onInit(); + + var $instance = this; + + ResourceServer.get({ + realm : $route.current.params.realm, + client : client.id + }, function(data) { + $scope.server = data; + + var policyId = $route.current.params.id; + + if (!policyId) { + $scope.create = true; + $scope.changed = false; + + var policy = {}; + + policy.type = delegate.getPolicyType(); + policy.config = {}; + policy.logic = 'POSITIVE'; + + if (delegate.onInitCreate) { + delegate.onInitCreate(policy); + } + + $scope.policy = angular.copy(policy); + + $scope.$watch('policy', function() { + if (!angular.equals($scope.policy, policy)) { + $scope.changed = true; + } + }, true); + + $scope.save = function() { + $instance.checkNameAvailability(function () { + if (delegate.onCreate) { + delegate.onCreate(); + } + service.save({realm : realm.realm, client : client.id, type: $scope.policy.type}, $scope.policy, function(data) { + if (delegate.isPermission()) { + $location.url("/realms/" + realm.realm + "/clients/" + client.id + "/authz/resource-server/permission/" + $scope.policy.type + "/" + data.id); + Notifications.success("The permission has been created."); + } else { + $location.url("/realms/" + realm.realm + "/clients/" + client.id + "/authz/resource-server/policy/" + $scope.policy.type + "/" + data.id); + Notifications.success("The policy has been created."); + } + }); + }); + } + + $scope.reset = function() { + if (delegate.isPermission()) { + $location.url("/realms/" + realm.realm + "/clients/" + client.id + "/authz/resource-server/permission/"); + } else { + $location.url("/realms/" + realm.realm + "/clients/" + client.id + "/authz/resource-server/policy/"); + } + } + } else { + service.get({ + realm: realm.realm, + client : client.id, + type: delegate.getPolicyType(), + id: $route.current.params.id + }, function(data) { + $scope.originalPolicy = data; + var policy = angular.copy(data); + + if (delegate.onInitUpdate) { + delegate.onInitUpdate(policy); + } + + $scope.policy = angular.copy(policy); + $scope.changed = false; + + $scope.$watch('policy', function() { + if (!angular.equals($scope.policy, policy)) { + $scope.changed = true; + } + }, true); + + $scope.save = function() { + $instance.checkNameAvailability(function () { + if (delegate.onUpdate) { + delegate.onUpdate(); + } + service.update({realm : realm.realm, client : client.id, type: $scope.policy.type, id : $scope.policy.id}, $scope.policy, function() { + $route.reload(); + if (delegate.isPermission()) { + Notifications.success("The permission has been updated."); + } else { + Notifications.success("The policy has been updated."); + } + }); + }); + } + + $scope.reset = function() { + var freshPolicy = angular.copy(data); + + if (delegate.onInitUpdate) { + delegate.onInitUpdate(freshPolicy); + } + + $scope.policy = angular.copy(freshPolicy); + $scope.changed = false; + } + }); + + $scope.remove = function() { + Policies.delete(ResourceServerPolicy, $route.current.params.realm, client, $scope, AuthzDialog, $location, Notifications, $route, delegate.isPermission()); + } + } + }); + + $scope.checkNewNameAvailability = function () { + $instance.checkNameAvailability(function () {}); + } + + this.checkNameAvailability = function (onSuccess) { + if (!$scope.policy.name || $scope.policy.name.trim().length == 0) { + return; + } + ResourceServerPolicy.search({ + realm: $route.current.params.realm, + client: client.id, + name: $scope.policy.name + }, function(data) { + if (data && data.id && data.id != $scope.policy.id) { + Notifications.error("Name already in use by another policy or permission, please choose another one."); + } else { + onSuccess(); + } + }); + } + } + + return PolicyController; +}); + +module.controller('PolicyEvaluateCtrl', function($scope, $http, $route, $location, realm, clients, roles, ResourceServer, client, ResourceServerResource, ResourceServerScope, User, Notifications) { + $scope.realm = realm; + $scope.client = client; + $scope.clients = clients; + $scope.roles = roles; + $scope.authzRequest = {}; + $scope.authzRequest.resources = []; + $scope.authzRequest.context = {}; + $scope.authzRequest.context.attributes = {}; + $scope.authzRequest.roleIds = []; + $scope.resultUrl = resourceUrl + '/partials/authz/policy/resource-server-policy-evaluate-result.html'; + + $scope.addContextAttribute = function() { + if (!$scope.newContextAttribute.value || $scope.newContextAttribute.value == '') { + Notifications.error("You must provide a value to a context attribute."); + return; + } + + $scope.authzRequest.context.attributes[$scope.newContextAttribute.key] = $scope.newContextAttribute.value; + delete $scope.newContextAttribute; + } + + $scope.removeContextAttribute = function(key) { + delete $scope.authzRequest.context.attributes[key]; + } + + $scope.getContextAttribute = function(key) { + for (i = 0; i < $scope.defaultContextAttributes.length; i++) { + if ($scope.defaultContextAttributes[i].key == key) { + return $scope.defaultContextAttributes[i]; + } + } + + return $scope.authzRequest.context.attributes[key]; + } + + $scope.getContextAttributeName = function(key) { + var attribute = $scope.getContextAttribute(key); + + if (!attribute.name) { + return key; + } + + return attribute.name; + } + + $scope.defaultContextAttributes = [ + { + key : "custom", + name : "Custom Attribute...", + custom: true + }, + { + key : "kc.identity.authc.method", + name : "Authentication Method", + values: [ + { + key : "pwd", + name : "Password" + }, + { + key : "otp", + name : "One-Time Password" + }, + { + key : "kbr", + name : "Kerberos" + } + ] + }, + { + key : "kc.realm.name", + name : "Realm" + }, + { + key : "kc.time.date_time", + name : "Date/Time (MM/dd/yyyy hh:mm:ss)" + }, + { + key : "kc.client.network.ip_address", + name : "Client IPv4 Address" + }, + { + key : "kc.client.network.host", + name : "Client Host" + }, + { + key : "kc.client.user_agent", + name : "Client/User Agent" + } + ]; + + $scope.isDefaultContextAttribute = function() { + if (!$scope.newContextAttribute) { + return true; + } + + if ($scope.newContextAttribute.custom) { + return false; + } + + if (!$scope.getContextAttribute($scope.newContextAttribute.key).custom) { + return true; + } + + return false; + } + + $scope.selectDefaultContextAttribute = function() { + $scope.newContextAttribute = angular.copy($scope.newContextAttribute); + } + + $scope.setApplyToResourceType = function() { + delete $scope.newResource; + $scope.authzRequest.resources = []; + } + + $scope.addResource = function() { + var resource = angular.copy($scope.newResource); + + if (!resource) { + resource = {}; + } + + delete resource.text; + + if (!$scope.newScopes || (resource._id != null && $scope.newScopes.length > 0 && $scope.newScopes[0].id)) { + $scope.newScopes = []; + } + + var scopes = []; + + for (i = 0; i < $scope.newScopes.length; i++) { + if ($scope.newScopes[i].name) { + scopes.push($scope.newScopes[i].name); + } else { + scopes.push($scope.newScopes[i]); + } + } + + resource.scopes = scopes; + + $scope.authzRequest.resources.push(resource); + + delete $scope.newResource; + delete $scope.newScopes; + } + + $scope.removeResource = function(index) { + $scope.authzRequest.resources.splice(index, 1); + } + + $scope.resolveScopes = function() { + if ($scope.newResource._id) { + $scope.newResource.scopes = []; + $scope.scopes = []; + ResourceServerResource.scopes({ + realm: $route.current.params.realm, + client: client.id, + rsrid: $scope.newResource._id + }, function (data) { + $scope.scopes = data; + }); + } + } + + $scope.reevaluate = function() { + if ($scope.authzRequest.entitlements) { + $scope.entitlements(); + } else { + $scope.save(); + } + } + + $scope.showAuthzData = function() { + $scope.showRpt = true; + } + + $scope.save = function() { + $scope.authzRequest.entitlements = false; + if ($scope.applyResourceType) { + if (!$scope.newResource) { + $scope.newResource = {}; + } + if (!$scope.newScopes || ($scope.newResource._id != null && $scope.newScopes.length > 0 && $scope.newScopes[0].id)) { + $scope.newScopes = []; + } + + var scopes = angular.copy($scope.newScopes); + + for (i = 0; i < scopes.length; i++) { + delete scopes[i].text; + } + + $scope.authzRequest.resources[0].scopes = scopes; + } + + $http.post(authUrl + '/admin/realms/'+ $route.current.params.realm + '/clients/' + client.id + '/authz/resource-server/policy/evaluate' + , $scope.authzRequest).then(function(response) { + $scope.evaluationResult = response.data; + $scope.showResultTab(); + }); + } + + $scope.entitlements = function() { + $scope.authzRequest.entitlements = true; + $http.post(authUrl + '/admin/realms/'+ $route.current.params.realm + '/clients/' + client.id + '/authz/resource-server/policy/evaluate' + , $scope.authzRequest).then(function(response) { + $scope.evaluationResult = response.data; + $scope.showResultTab(); + }); + } + + $scope.showResultTab = function() { + $scope.showResult = true; + $scope.showRpt = false; + } + + $scope.showRequestTab = function() { + $scope.showResult = false; + $scope.showRpt = false; + } + + $scope.usersUiSelect = { + minimumInputLength: 1, + delay: 500, + allowClear: true, + query: function (query) { + var data = {results: []}; + if ('' == query.term.trim()) { + query.callback(data); + return; + } + User.query({realm: $route.current.params.realm, search: query.term.trim(), max: 20}, function(response) { + data.results = response; + query.callback(data); + }); + }, + formatResult: function(object, container, query) { + object.text = object.username; + return object.username; + } + }; + + $scope.resourcesUiSelect = { + minimumInputLength: 1, + delay: 500, + allowClear: true, + id: function(resource){ return resource._id; }, + query: function (query) { + var data = {results: []}; + if ('' == query.term.trim()) { + query.callback(data); + return; + } + $scope.query = { + realm: realm.realm, + client : client.id, + name: query.term.trim(), + deep: false, + max : 20, + first : 0 + }; + ResourceServerResource.query($scope.query, function(response) { + data.results = response; + query.callback(data); + }); + }, + formatResult: function(object, container, query) { + object.text = object.name; + return object.name; + } + }; + + $scope.scopesUiSelect = { + minimumInputLength: 1, + delay: 500, + allowClear: true, + query: function (query) { + var data = {results: []}; + if ('' == query.term.trim()) { + query.callback(data); + return; + } + $scope.query = { + realm: realm.realm, + client : client.id, + name: query.term.trim(), + deep: false, + max : 20, + first : 0 + }; + ResourceServerScope.query($scope.query, function(response) { + data.results = response; + query.callback(data); + }); + }, + formatResult: function(object, container, query) { + object.text = object.name; + return object.name; + } + }; + + ResourceServer.get({ + realm : $route.current.params.realm, + client : client.id + }, function(data) { + $scope.server = data; + }); + + $scope.selectUser = function(user) { + if (!user || !user.id) { + $scope.selectedUser = null; + $scope.authzRequest.userId = ''; + return; + } + + $scope.authzRequest.userId = user.id; + } + + $scope.reset = function() { + $scope.authzRequest = angular.copy(authzRequest); + $scope.changed = false; + } +}); + +getManageClientId = function(realm) { + if (realm.realm == masterRealm) { + return 'master-realm'; + } else { + return 'realm-management'; + } +} + +module.controller('RealmRolePermissionsCtrl', function($scope, $http, $route, $location, realm, role, RoleManagementPermissions, Client, Notifications, Dialog, RealmRoleRemover) { + console.log('RealmRolePermissionsCtrl'); + $scope.role = role; + $scope.realm = realm; + + $scope.remove = function() { + RealmRoleRemover.remove($scope.role, realm, Dialog, $location, Notifications); + }; + + RoleManagementPermissions.get({realm: realm.realm, role: role.id}, function(data) { + $scope.permissions = data; + $scope.$watch('permissions.enabled', function(newVal, oldVal) { + if (newVal != oldVal) { + var param = {enabled: $scope.permissions.enabled}; + $scope.permissions= RoleManagementPermissions.update({realm: realm.realm, role:role.id}, param); + } + }, true); + }); + Client.query({realm: realm.realm, clientId: getManageClientId(realm)}, function(data) { + $scope.realmManagementClientId = data[0].id; + }); +}); +module.controller('ClientRolePermissionsCtrl', function($scope, $http, $route, $location, realm, client, role, Client, RoleManagementPermissions, Client, Notifications) { + console.log('RealmRolePermissionsCtrl'); + $scope.client = client; + $scope.role = role; + $scope.realm = realm; + RoleManagementPermissions.get({realm: realm.realm, role: role.id}, function(data) { + $scope.permissions = data; + $scope.$watch('permissions.enabled', function(newVal, oldVal) { + if (newVal != oldVal) { + var param = {enabled: $scope.permissions.enabled}; + $scope.permissions = RoleManagementPermissions.update({realm: realm.realm, role:role.id}, param); + } + }, true); + }); + Client.query({realm: realm.realm, clientId: getManageClientId(realm)}, function(data) { + $scope.realmManagementClientId = data[0].id; + }); +}); + +module.controller('UsersPermissionsCtrl', function($scope, $http, $route, $location, realm, UsersManagementPermissions, Client, Notifications) { + console.log('UsersPermissionsCtrl'); + $scope.realm = realm; + var first = true; + UsersManagementPermissions.get({realm: realm.realm}, function(data) { + $scope.permissions = data; + $scope.$watch('permissions.enabled', function(newVal, oldVal) { + if (newVal != oldVal) { + var param = {enabled: $scope.permissions.enabled}; + $scope.permissions = UsersManagementPermissions.update({realm: realm.realm}, param); + + } + }, true); + }); + Client.query({realm: realm.realm, clientId: getManageClientId(realm)}, function(data) { + $scope.realmManagementClientId = data[0].id; + }); + + + + +}); + +module.controller('ClientPermissionsCtrl', function($scope, $http, $route, $location, realm, client, Client, ClientManagementPermissions, Notifications) { + $scope.client = client; + $scope.realm = realm; + ClientManagementPermissions.get({realm: realm.realm, client: client.id}, function(data) { + $scope.permissions = data; + $scope.$watch('permissions.enabled', function(newVal, oldVal) { + if (newVal != oldVal) { + var param = {enabled: $scope.permissions.enabled}; + $scope.permissions = ClientManagementPermissions.update({realm: realm.realm, client: client.id}, param); + } + }, true); + }); + Client.query({realm: realm.realm, clientId: getManageClientId(realm)}, function(data) { + $scope.realmManagementClientId = data[0].id; + }); +}); + +module.controller('IdentityProviderPermissionCtrl', function($scope, $http, $route, $location, realm, identityProvider, Client, IdentityProviderManagementPermissions, Notifications) { + $scope.identityProvider = identityProvider; + $scope.realm = realm; + IdentityProviderManagementPermissions.get({realm: realm.realm, alias: identityProvider.alias}, function(data) { + $scope.permissions = data; + $scope.$watch('permissions.enabled', function(newVal, oldVal) { + if (newVal != oldVal) { + var param = {enabled: $scope.permissions.enabled}; + $scope.permissions = IdentityProviderManagementPermissions.update({realm: realm.realm, alias: identityProvider.alias}, param); + } + }, true); + }); + Client.query({realm: realm.realm, clientId: getManageClientId(realm)}, function(data) { + $scope.realmManagementClientId = data[0].id; + }); +}); + +module.controller('GroupPermissionsCtrl', function($scope, $http, $route, $location, realm, group, GroupManagementPermissions, Client, Notifications) { + $scope.group = group; + $scope.realm = realm; + Client.query({realm: realm.realm, clientId: getManageClientId(realm)}, function(data) { + $scope.realmManagementClientId = data[0].id; + }); + GroupManagementPermissions.get({realm: realm.realm, group: group.id}, function(data) { + $scope.permissions = data; + $scope.$watch('permissions.enabled', function(newVal, oldVal) { + if (newVal != oldVal) { + var param = {enabled: $scope.permissions.enabled}; + $scope.permissions = GroupManagementPermissions.update({realm: realm.realm, group: group.id}, param); + } + }, true); + }); +}); + + diff --git a/admin/resources/js/authz/authz-services.js b/admin/resources/js/authz/authz-services.js new file mode 100644 index 0000000..12315ed --- /dev/null +++ b/admin/resources/js/authz/authz-services.js @@ -0,0 +1,204 @@ +module.factory('ResourceServer', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/clients/:client/authz/resource-server', { + realm : '@realm', + client: '@client' + }, { + 'update' : {method : 'PUT'}, + 'import' : {url: authUrl + '/admin/realms/:realm/clients/:client/authz/resource-server/import', method : 'POST'}, + 'settings' : {url: authUrl + '/admin/realms/:realm/clients/:client/authz/resource-server/settings', method : 'GET'} + }); +}); + +module.factory('ResourceServerResource', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/clients/:client/authz/resource-server/resource/:rsrid', { + realm : '@realm', + client: '@client', + rsrid : '@rsrid' + }, { + 'update' : {method : 'PUT'}, + 'search' : {url: authUrl + '/admin/realms/:realm/clients/:client/authz/resource-server/resource/search', method : 'GET'}, + 'scopes' : {url: authUrl + '/admin/realms/:realm/clients/:client/authz/resource-server/resource/:rsrid/scopes', method : 'GET', isArray: true}, + 'permissions' : {url: authUrl + '/admin/realms/:realm/clients/:client/authz/resource-server/resource/:rsrid/permissions', method : 'GET', isArray: true} + }); +}); + +module.factory('ResourceServerScope', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/clients/:client/authz/resource-server/scope/:id', { + realm : '@realm', + client: '@client', + id : '@id' + }, { + 'update' : {method : 'PUT'}, + 'search' : {url: authUrl + '/admin/realms/:realm/clients/:client/authz/resource-server/scope/search', method : 'GET'}, + 'resources' : {url: authUrl + '/admin/realms/:realm/clients/:client/authz/resource-server/scope/:id/resources', method : 'GET', isArray: true}, + 'permissions' : {url: authUrl + '/admin/realms/:realm/clients/:client/authz/resource-server/scope/:id/permissions', method : 'GET', isArray: true}, + }); +}); + +module.factory('ResourceServerPolicy', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/clients/:client/authz/resource-server/policy/:type/:id', { + realm : '@realm', + client: '@client', + id : '@id', + type: '@type' + }, { + 'update' : {method : 'PUT'}, + 'search' : {url: authUrl + '/admin/realms/:realm/clients/:client/authz/resource-server/policy/search', method : 'GET'}, + 'associatedPolicies' : {url: authUrl + '/admin/realms/:realm/clients/:client/authz/resource-server/policy/:id/associatedPolicies', method : 'GET', isArray: true}, + 'dependentPolicies' : {url: authUrl + '/admin/realms/:realm/clients/:client/authz/resource-server/policy/:id/dependentPolicies', method : 'GET', isArray: true}, + 'scopes' : {url: authUrl + '/admin/realms/:realm/clients/:client/authz/resource-server/policy/:id/scopes', method : 'GET', isArray: true}, + 'resources' : {url: authUrl + '/admin/realms/:realm/clients/:client/authz/resource-server/policy/:id/resources', method : 'GET', isArray: true} + }); +}); + +module.factory('ResourceServerPermission', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/clients/:client/authz/resource-server/permission/:type/:id', { + realm : '@realm', + client: '@client', + type: '@type', + id : '@id' + }, { + 'update' : {method : 'PUT'}, + 'search' : {url: authUrl + '/admin/realms/:realm/clients/:client/authz/resource-server/permission/search', method : 'GET'}, + 'searchPolicies' : {url: authUrl + '/admin/realms/:realm/clients/:client/authz/resource-server/policy', method : 'GET', isArray: true}, + 'associatedPolicies' : {url: authUrl + '/admin/realms/:realm/clients/:client/authz/resource-server/policy/:id/associatedPolicies', method : 'GET', isArray: true}, + 'dependentPolicies' : {url: authUrl + '/admin/realms/:realm/clients/:client/authz/resource-server/policy/:id/dependentPolicies', method : 'GET', isArray: true}, + 'scopes' : {url: authUrl + '/admin/realms/:realm/clients/:client/authz/resource-server/permission/:id/scopes', method : 'GET', isArray: true}, + 'resources' : {url: authUrl + '/admin/realms/:realm/clients/:client/authz/resource-server/permission/:id/resources', method : 'GET', isArray: true} + }); +}); + +module.factory('PolicyProvider', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/clients/:client/authz/resource-server/policy/providers', { + realm : '@realm', + client: '@client' + }); +}); + +module.service('AuthzDialog', function($modal) { + var dialog = {}; + + var openDialog = function(title, message, btns, template) { + var controller = function($scope, $modalInstance, $sce, title, message, btns) { + $scope.title = title; + $scope.message = $sce.trustAsHtml(message); + $scope.btns = btns; + + $scope.ok = function () { + $modalInstance.close(); + }; + $scope.cancel = function () { + $modalInstance.dismiss('cancel'); + }; + }; + + return $modal.open({ + templateUrl: resourceUrl + template, + controller: controller, + resolve: { + title: function() { + return title; + }, + message: function() { + return message; + }, + btns: function() { + return btns; + } + } + }).result; + } + + dialog.confirmDeleteWithMsg = function(name, type, msg, success) { + var title = 'Delete ' + type; + msg += 'Are you sure you want to permanently delete the ' + type + ' ' + name + ' ?'; + var btns = { + ok: { + label: 'Delete', + cssClass: 'btn btn-danger' + }, + cancel: { + label: 'Cancel', + cssClass: 'btn btn-default' + } + } + + openDialog(title, msg, btns, '/templates/authz/kc-authz-modal.html').then(success); + }; + + dialog.confirmDelete = function(name, type, success) { + var title = 'Delete ' + type; + var msg = 'Are you sure you want to permanently delete the ' + type + ' ' + name + ' ?'; + var btns = { + ok: { + label: 'Delete', + cssClass: 'btn btn-danger' + }, + cancel: { + label: 'Cancel', + cssClass: 'btn btn-default' + } + } + + openDialog(title, msg, btns, '/templates/authz/kc-authz-modal.html').then(success); + } + + return dialog; +}); + +module.factory('RoleManagementPermissions', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/roles-by-id/:role/management/permissions', { + realm : '@realm', + role : '@role' + }, { + update: { + method: 'PUT' + } + }); +}); + +module.factory('UsersManagementPermissions', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/users-management-permissions', { + realm : '@realm' + }, { + update: { + method: 'PUT' + } + }); +}); + +module.factory('ClientManagementPermissions', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/clients/:client/management/permissions', { + realm : '@realm', + client : '@client' + }, { + update: { + method: 'PUT' + } + }); +}); + +module.factory('IdentityProviderManagementPermissions', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/identity-provider/instances/:alias/management/permissions', { + realm : '@realm', + alias : '@alias' + }, { + update: { + method: 'PUT' + } + }); +}); + +module.factory('GroupManagementPermissions', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/groups/:group/management/permissions', { + realm : '@realm', + group : '@group' + }, { + update: { + method: 'PUT' + } + }); +}); + + + diff --git a/admin/resources/js/controllers/clients.js b/admin/resources/js/controllers/clients.js new file mode 100644 index 0000000..a52fdfc --- /dev/null +++ b/admin/resources/js/controllers/clients.js @@ -0,0 +1,2340 @@ +Array.prototype.remove = function(from, to) { + var rest = this.slice((to || from) + 1 || this.length); + this.length = from < 0 ? this.length + from : from; + return this.push.apply(this, rest); +}; + +module.controller('ClientTabCtrl', function(Dialog, $scope, Current, Notifications, $location) { + $scope.removeClient = function() { + Dialog.confirmDelete($scope.client.clientId, 'client', function() { + $scope.client.$remove({ + realm : Current.realm.realm, + client : $scope.client.id + }, function() { + $location.url("/realms/" + Current.realm.realm + "/clients"); + Notifications.success("The client has been deleted."); + }); + }); + }; +}); + +module.controller('ClientRoleListCtrl', function($scope, $location, realm, client, roles, $route, RoleById, Notifications, Dialog) { + $scope.realm = realm; + $scope.roles = roles; + $scope.client = client; + + $scope.removeRole = function(role) { + Dialog.confirmDelete(role.name, 'role', function() { + RoleById.remove({ + realm: realm.realm, + role: role.id + }, function () { + $route.reload(); + Notifications.success("The role has been deleted."); + }); + }); + }; + + $scope.$watch(function() { + return $location.path(); + }, function() { + $scope.path = $location.path().substring(1).split("/"); + }); +}); + +module.controller('ClientCredentialsCtrl', function($scope, $location, realm, client, clientAuthenticatorProviders, clientConfigProperties, Client, ClientRegistrationAccessToken, Notifications) { + $scope.realm = realm; + $scope.client = angular.copy(client); + $scope.clientAuthenticatorProviders = clientAuthenticatorProviders; + + var updateCurrentPartial = function(val) { + $scope.clientAuthenticatorConfigPartial; + switch(val) { + case 'client-secret': + $scope.clientAuthenticatorConfigPartial = 'client-credentials-secret.html'; + break; + case 'client-jwt': + $scope.clientAuthenticatorConfigPartial = 'client-credentials-jwt.html'; + break; + default: + $scope.currentAuthenticatorConfigProperties = clientConfigProperties[val]; + $scope.clientAuthenticatorConfigPartial = 'client-credentials-generic.html'; + break; + } + }; + + updateCurrentPartial(client.clientAuthenticatorType); + + $scope.$watch('client.clientAuthenticatorType', function() { + if (!angular.equals($scope.client.clientAuthenticatorType, client.clientAuthenticatorType)) { + + Client.update({ + realm : realm.realm, + client : client.id + }, $scope.client, function() { + $scope.changed = false; + client = angular.copy($scope.client); + updateCurrentPartial(client.clientAuthenticatorType) + }); + + } + }, true); + + $scope.regenerateRegistrationAccessToken = function() { + var secret = ClientRegistrationAccessToken.update({ realm : $scope.realm.realm, client : $scope.client.id }, + function(data) { + Notifications.success('The registration access token has been updated.'); + $scope.client['registrationAccessToken'] = data.registrationAccessToken; + }, + function() { + Notifications.error('Failed to update the registration access token'); + } + ); + }; +}); + +module.controller('ClientSecretCtrl', function($scope, $location, ClientSecret, Notifications) { + var secret = ClientSecret.get({ realm : $scope.realm.realm, client : $scope.client.id }, + function() { + $scope.secret = secret.value; + } + ); + + $scope.changePassword = function() { + var secret = ClientSecret.update({ realm : $scope.realm.realm, client : $scope.client.id }, + function() { + Notifications.success('The secret has been changed.'); + $scope.secret = secret.value; + }, + function() { + Notifications.error("The secret was not changed due to a problem."); + $scope.secret = "error"; + } + ); + }; + + $scope.$watch(function() { + return $location.path(); + }, function() { + $scope.path = $location.path().substring(1).split("/"); + }); + + $scope.cancel = function() { + $location.url("/realms/" + $scope.realm.realm + "/clients/" + $scope.client.id + "/credentials"); + }; +}); + +module.controller('ClientSignedJWTCtrl', function($scope, $location, Client, ClientCertificate, Notifications, $route) { + var signingKeyInfo = ClientCertificate.get({ realm : $scope.realm.realm, client : $scope.client.id, attribute: 'jwt.credential' }, + function() { + $scope.signingKeyInfo = signingKeyInfo; + } + ); + + console.log('ClientSignedJWTCtrl invoked'); + + $scope.clientCopy = angular.copy($scope.client); + $scope.changed = false; + + $scope.$watch('client', function() { + if (!angular.equals($scope.client, $scope.clientCopy)) { + $scope.changed = true; + } + }, true); + + if ($scope.client.attributes["use.jwks.url"]) { + if ($scope.client.attributes["use.jwks.url"] == "true") { + $scope.useJwksUrl = true; + } else { + $scope.useJwksUrl = false; + } + } + + $scope.switchChange = function() { + $scope.changed = true; + } + + $scope.save = function() { + + if ($scope.useJwksUrl == true) { + $scope.client.attributes["use.jwks.url"] = "true"; + } else { + $scope.client.attributes["use.jwks.url"] = "false"; + } + + Client.update({ + realm : $scope.realm.realm, + client : $scope.client.id + }, $scope.client, function() { + $scope.changed = false; + $scope.clientCopy = angular.copy($scope.client); + Notifications.success("Client authentication configuration has been saved to the client."); + }); + }; + + $scope.importCertificate = function() { + $location.url("/realms/" + $scope.realm.realm + "/clients/" + $scope.client.id + "/credentials/client-jwt/Signing/import/jwt.credential"); + }; + + $scope.generateSigningKey = function() { + $location.url("/realms/" + $scope.realm.realm + "/clients/" + $scope.client.id + "/credentials/client-jwt/Signing/export/jwt.credential"); + }; + + $scope.reset = function() { + $route.reload(); + }; +}); + +module.controller('ClientGenericCredentialsCtrl', function($scope, $location, Client, Notifications) { + + console.log('ClientGenericCredentialsCtrl invoked'); + + $scope.clientCopy = angular.copy($scope.client); + $scope.changed = false; + + $scope.$watch('client', function() { + if (!angular.equals($scope.client, $scope.clientCopy)) { + $scope.changed = true; + } + }, true); + + $scope.save = function() { + + Client.update({ + realm : $scope.realm.realm, + client : $scope.client.id + }, $scope.client, function() { + $scope.changed = false; + $scope.clientCopy = angular.copy($scope.client); + Notifications.success("Client authentication configuration has been saved to the client."); + }); + }; + + $scope.reset = function() { + $scope.client = angular.copy($scope.clientCopy); + $scope.changed = false; + }; +}); + +module.controller('ClientIdentityProviderCtrl', function($scope, $location, $route, realm, client, Client, $location, Notifications) { + $scope.realm = realm; + $scope.client = angular.copy(client); + var length = 0; + + if ($scope.client.identityProviders) { + length = $scope.client.identityProviders.length; + + for (i = 0; i < $scope.client.identityProviders.length; i++) { + var clientProvider = $scope.client.identityProviders[i]; + if (clientProvider.retrieveToken) { + clientProvider.retrieveToken = clientProvider.retrieveToken.toString(); + } + } + + } else { + $scope.client.identityProviders = []; + } + + $scope.identityProviders = []; + var providersMissingInClient = []; + + for (j = 0; j < realm.identityProviders.length; j++) { + var identityProvider = realm.identityProviders[j]; + var clientProvider = null; + + for (i = 0; i < $scope.client.identityProviders.length; i++) { + clientProvider = $scope.client.identityProviders[i]; + + if (clientProvider) { + + if (clientProvider.id == identityProvider.id) { + $scope.identityProviders[i] = {}; + $scope.identityProviders[i].identityProvider = identityProvider; + $scope.identityProviders[i].retrieveToken = clientProvider.retrieveToken; + break; + } + + clientProvider = null; + } + } + + if (clientProvider == null) { + providersMissingInClient.push(identityProvider); + } + } + + for (j = 0; j < providersMissingInClient.length; j++) { + var identityProvider = providersMissingInClient[j]; + + var currentProvider = {}; + currentProvider.identityProvider = identityProvider; + currentProvider.retrieveToken = "false"; + $scope.identityProviders.push(currentProvider); + + var currentClientProvider = {}; + currentClientProvider.id = identityProvider.id; + currentClientProvider.retrieveToken = "false"; + $scope.client.identityProviders.push(currentClientProvider); + } + + var oldCopy = angular.copy($scope.client); + + $scope.save = function() { + + Client.update({ + realm : realm.realm, + client : client.id + }, $scope.client, function() { + $scope.changed = false; + $route.reload(); + Notifications.success("Your changes have been saved to the client."); + }); + }; + + $scope.reset = function() { + $scope.client = angular.copy(oldCopy); + $scope.changed = false; + }; + + $scope.$watch('client', function() { + if (!angular.equals($scope.client, oldCopy)) { + $scope.changed = true; + } + }, true); +}); + +module.controller('ClientSamlKeyCtrl', function($scope, $location, $http, $upload, realm, client, + ClientCertificate, ClientCertificateGenerate, + ClientCertificateDownload, Notifications) { + $scope.realm = realm; + $scope.client = client; + + var signingKeyInfo = ClientCertificate.get({ realm : realm.realm, client : client.id, attribute: 'saml.signing' }, + function() { + $scope.signingKeyInfo = signingKeyInfo; + } + ); + + $scope.generateSigningKey = function() { + var keyInfo = ClientCertificateGenerate.generate({ realm : realm.realm, client : client.id, attribute: 'saml.signing' }, + function() { + Notifications.success('Signing key has been regenerated.'); + $scope.signingKeyInfo = keyInfo; + }, + function() { + Notifications.error("Signing key was not regenerated."); + } + ); + }; + + $scope.importSigningKey = function() { + $location.url("/realms/" + realm.realm + "/clients/" + client.id + "/saml/Signing/import/saml.signing"); + }; + + $scope.exportSigningKey = function() { + $location.url("/realms/" + realm.realm + "/clients/" + client.id + "/saml/Signing/export/saml.signing"); + }; + + var encryptionKeyInfo = ClientCertificate.get({ realm : realm.realm, client : client.id, attribute: 'saml.encryption' }, + function() { + $scope.encryptionKeyInfo = encryptionKeyInfo; + } + ); + + $scope.generateEncryptionKey = function() { + var keyInfo = ClientCertificateGenerate.generate({ realm : realm.realm, client : client.id, attribute: 'saml.encryption' }, + function() { + Notifications.success('Encryption key has been regenerated.'); + $scope.encryptionKeyInfo = keyInfo; + }, + function() { + Notifications.error("Encryption key was not regenerated."); + } + ); + }; + + $scope.importEncryptionKey = function() { + $location.url("/realms/" + realm.realm + "/clients/" + client.id + "/saml/Encryption/import/saml.encryption"); + }; + + $scope.exportEncryptionKey = function() { + $location.url("/realms/" + realm.realm + "/clients/" + client.id + "/saml/Encryption/export/saml.encryption"); + }; + + + $scope.$watch(function() { + return $location.path(); + }, function() { + $scope.path = $location.path().substring(1).split("/"); + }); +}); + +module.controller('ClientCertificateImportCtrl', function($scope, $location, $http, $upload, realm, client, callingContext, $routeParams, + ClientCertificate, ClientCertificateGenerate, + ClientCertificateDownload, Notifications) { + + console.log("callingContext: " + callingContext); + + var keyType = $routeParams.keyType; + var attribute = $routeParams.attribute; + $scope.realm = realm; + $scope.client = client; + $scope.keyType = keyType; + + if (callingContext == 'saml') { + var uploadUrl = authUrl + '/admin/realms/' + realm.realm + '/clients/' + client.id + '/certificates/' + attribute + '/upload'; + var redirectLocation = "/realms/" + realm.realm + "/clients/" + client.id + "/saml/keys"; + } else if (callingContext == 'jwt-credentials') { + var uploadUrl = authUrl + '/admin/realms/' + realm.realm + '/clients/' + client.id + '/certificates/' + attribute + '/upload-certificate'; + var redirectLocation = "/realms/" + realm.realm + "/clients/" + client.id + "/credentials"; + } + + $scope.files = []; + + $scope.onFileSelect = function($files) { + $scope.files = $files; + }; + + $scope.cancel = function() { + $location.url(redirectLocation); + } + + $scope.keyFormats = [ + "JKS", + "PKCS12", + "Certificate PEM" + ]; + + if (callingContext == 'jwt-credentials') { + $scope.keyFormats.push('Public Key PEM'); + $scope.keyFormats.push('JSON Web Key Set'); + } + + $scope.hideKeystoreSettings = function() { + return $scope.uploadKeyFormat == 'Certificate PEM' || $scope.uploadKeyFormat == 'Public Key PEM' || $scope.uploadKeyFormat == 'JSON Web Key Set'; + } + + $scope.uploadKeyFormat = $scope.keyFormats[0]; + + $scope.uploadFile = function() { + //$files: an array of files selected, each file has name, size, and type. + for (var i = 0; i < $scope.files.length; i++) { + var $file = $scope.files[i]; + $scope.upload = $upload.upload({ + url: uploadUrl, + // method: POST or PUT, + // headers: {'headerKey': 'headerValue'}, withCredential: true, + data: {keystoreFormat: $scope.uploadKeyFormat, + keyAlias: $scope.uploadKeyAlias, + keyPassword: $scope.uploadKeyPassword, + storePassword: $scope.uploadStorePassword + }, + file: $file + /* set file formData name for 'Content-Desposition' header. Default: 'file' */ + //fileFormDataName: myFile, + /* customize how data is added to formData. See #40#issuecomment-28612000 for example */ + //formDataAppender: function(formData, key, val){} + }).success(function(data, status, headers) { + Notifications.success("Keystore uploaded successfully."); + $location.url(redirectLocation); + }); + //.then(success, error, progress); + } + }; + + $scope.$watch(function() { + return $location.path(); + }, function() { + $scope.path = $location.path().substring(1).split("/"); + }); +}); + +module.controller('ClientCertificateExportCtrl', function($scope, $location, $http, $upload, realm, client, callingContext, $routeParams, + ClientCertificate, ClientCertificateGenerate, + ClientCertificateDownload, Notifications) { + var keyType = $routeParams.keyType; + var attribute = $routeParams.attribute; + $scope.realm = realm; + $scope.client = client; + $scope.keyType = keyType; + + if (callingContext == 'saml') { + var downloadUrl = authUrl + '/admin/realms/' + realm.realm + '/clients/' + client.id + '/certificates/' + attribute + '/download'; + var realmCertificate = true; + } else if (callingContext == 'jwt-credentials') { + var downloadUrl = authUrl + '/admin/realms/' + realm.realm + '/clients/' + client.id + '/certificates/' + attribute + '/generate-and-download' + var realmCertificate = false; + } + + var jks = { + keyAlias: client.clientId, + realmAlias: realm.realm, + realmCertificate: realmCertificate + }; + + $scope.keyFormats = [ + "JKS", + "PKCS12" + ]; + + var keyInfo = ClientCertificate.get({ realm : realm.realm, client : client.id, attribute: attribute }, + function() { + $scope.keyInfo = keyInfo; + } + ); + $scope.jks = jks; + $scope.jks.format = $scope.keyFormats[0]; + + $scope.download = function() { + $http({ + url: downloadUrl, + method: 'POST', + responseType: 'arraybuffer', + data: $scope.jks, + headers: { + 'Content-Type': 'application/json', + 'Accept': 'application/octet-stream' + } + }).then(function(response){ + var blob = new Blob([response.data], { + type: 'application/octet-stream' + }); + var ext = ".jks"; + if ($scope.jks.format == 'PKCS12') ext = ".p12"; + + if (callingContext == 'jwt-credentials') { + $location.url("/realms/" + realm.realm + "/clients/" + client.id + "/credentials"); + Notifications.success("New keypair and certificate generated successfully. Download keystore file") + } + + saveAs(blob, 'keystore' + ext); + }).catch(function(response) { + var errorMsg = 'Error downloading'; + try { + var error = JSON.parse(String.fromCharCode.apply(null, new Uint8Array(response.data))); + errorMsg = error['error_description'] ? error['error_description'] : errorMsg; + } catch (err) { + } + Notifications.error(errorMsg); + }); + } + + $scope.$watch(function() { + return $location.path(); + }, function() { + $scope.path = $location.path().substring(1).split("/"); + }); + + $scope.cancel = function() { + $location.url("/realms/" + realm.realm + "/clients/" + client.id + "/credentials"); + } +}); + +module.controller('ClientSessionsCtrl', function($scope, realm, sessionCount, client, + ClientUserSessions) { + $scope.realm = realm; + $scope.count = sessionCount.count; + $scope.sessions = []; + $scope.client = client; + + $scope.page = 0; + + $scope.query = { + realm : realm.realm, + client: $scope.client.id, + max : 5, + first : 0 + } + + $scope.firstPage = function() { + $scope.query.first = 0; + if ($scope.query.first < 0) { + $scope.query.first = 0; + } + $scope.loadUsers(); + } + + $scope.previousPage = function() { + $scope.query.first -= parseInt($scope.query.max); + if ($scope.query.first < 0) { + $scope.query.first = 0; + } + $scope.loadUsers(); + } + + $scope.nextPage = function() { + $scope.query.first += parseInt($scope.query.max); + $scope.loadUsers(); + } + + $scope.toDate = function(val) { + return new Date(val); + }; + + $scope.loadUsers = function() { + ClientUserSessions.query($scope.query, function(updated) { + $scope.sessions = updated; + }) + }; +}); + +module.controller('ClientOfflineSessionsCtrl', function($scope, realm, offlineSessionCount, client, + ClientOfflineSessions) { + $scope.realm = realm; + $scope.count = offlineSessionCount.count; + $scope.sessions = []; + $scope.client = client; + + $scope.page = 0; + + $scope.query = { + realm : realm.realm, + client: $scope.client.id, + max : 5, + first : 0 + } + + $scope.firstPage = function() { + $scope.query.first = 0; + if ($scope.query.first < 0) { + $scope.query.first = 0; + } + $scope.loadUsers(); + } + + $scope.previousPage = function() { + $scope.query.first -= parseInt($scope.query.max); + if ($scope.query.first < 0) { + $scope.query.first = 0; + } + $scope.loadUsers(); + } + + $scope.nextPage = function() { + $scope.query.first += parseInt($scope.query.max); + $scope.loadUsers(); + } + + $scope.toDate = function(val) { + return new Date(val); + }; + + $scope.loadUsers = function() { + ClientOfflineSessions.query($scope.query, function(updated) { + $scope.sessions = updated; + }) + }; +}); + +module.controller('ClientRoleDetailCtrl', function($scope, realm, client, role, roles, clients, + Role, ClientRole, RoleById, RoleRealmComposites, RoleClientComposites, + $http, $location, Dialog, Notifications) { + $scope.realm = realm; + $scope.client = client; + $scope.role = angular.copy(role); + $scope.create = !role.name; + + $scope.changed = $scope.create; + + $scope.save = function() { + if ($scope.create) { + ClientRole.save({ + realm: realm.realm, + client : client.id + }, $scope.role, function (data, headers) { + $scope.changed = false; + role = angular.copy($scope.role); + + ClientRole.get({ realm: realm.realm, client : client.id, role: role.name }, function(role) { + var id = role.id; + $location.url("/realms/" + realm.realm + "/clients/" + client.id + "/roles/" + id); + Notifications.success("The role has been created."); + }); + }); + } else { + $scope.update(); + } + }; + + $scope.remove = function() { + Dialog.confirmDelete($scope.role.name, 'role', function() { + $scope.role.$remove({ + realm : realm.realm, + client : client.id, + role : $scope.role.id + }, function() { + $location.url("/realms/" + realm.realm + "/clients/" + client.id + "/roles"); + Notifications.success("The role has been deleted."); + }); + }); + }; + + $scope.cancel = function () { + $location.url("/realms/" + realm.realm + "/clients/" + client.id + "/roles"); + }; + + + roleControl($scope, realm, role, roles, clients, + ClientRole, RoleById, RoleRealmComposites, RoleClientComposites, + $http, $location, Notifications, Dialog); + +}); + +module.controller('ClientImportCtrl', function($scope, $location, $upload, realm, serverInfo, Notifications) { + + $scope.realm = realm; + + $scope.files = []; + + $scope.onFileSelect = function($files) { + $scope.files = $files; + }; + + $scope.clearFileSelect = function() { + $scope.files = null; + } + + $scope.uploadFile = function() { + //$files: an array of files selected, each file has name, size, and type. + for (var i = 0; i < $scope.files.length; i++) { + var $file = $scope.files[i]; + $scope.upload = $upload.upload({ + url: authUrl + '/admin/realms/' + realm.realm + '/client-importers/' + $scope.configFormat.id + '/upload', + // method: POST or PUT, + // headers: {'headerKey': 'headerValue'}, withCredential: true, + data: {myObj: ""}, + file: $file + /* set file formData name for 'Content-Desposition' header. Default: 'file' */ + //fileFormDataName: myFile, + /* customize how data is added to formData. See #40#issuecomment-28612000 for example */ + //formDataAppender: function(formData, key, val){} + }).success(function(data, status, headers) { + Notifications.success("Uploaded successfully."); + $location.url("/realms/" + realm.realm + "/clients"); + }) + .error(function() { + Notifications.error("The file can not be uploaded. Please verify the file."); + + }); + //.then(success, error, progress); + } + }; + + $scope.$watch(function() { + return $location.path(); + }, function() { + $scope.path = $location.path().substring(1).split("/"); + }); +}); + + +module.controller('ClientListCtrl', function($scope, realm, Client, serverInfo, $route, Dialog, Notifications, filterFilter) { + $scope.realm = realm; + $scope.clients = []; + $scope.currentPage = 1; + $scope.currentPageInput = 1; + $scope.numberOfPages = 1; + $scope.pageSize = 20; + + Client.query({realm: realm.realm, viewableOnly: true}).$promise.then(function(clients) { + $scope.numberOfPages = Math.ceil(clients.length/$scope.pageSize); + $scope.clients = clients; + }); + + $scope.$watch('search', function (newVal, oldVal) { + $scope.filtered = filterFilter($scope.clients, newVal); + $scope.totalItems = $scope.filtered.length; + $scope.numberOfPages = Math.ceil($scope.totalItems/$scope.pageSize); + $scope.currentPage = 1; + $scope.currentPageInput = 1; + }, true); + + $scope.removeClient = function(client) { + Dialog.confirmDelete(client.clientId, 'client', function() { + Client.remove({ + realm : realm.realm, + client : client.id + }, function() { + $route.reload(); + Notifications.success("The client has been deleted."); + }); + }); + }; + + $scope.exportClient = function(client) { + var clientCopy = angular.copy(client); + delete clientCopy.id; + + for (var i = 0; i < clientCopy.protocolMappers.length; i++) { + delete clientCopy.protocolMappers[i].id; + } + + saveAs(new Blob([angular.toJson(clientCopy, 4)], { type: 'application/json' }), clientCopy.clientId + '.json'); + } +}); + +module.controller('ClientInstallationCtrl', function($scope, realm, client, serverInfo, ClientInstallation,$http, $routeParams) { + $scope.realm = realm; + $scope.client = client; + $scope.installation = null; + $scope.download = null; + $scope.configFormat = null; + $scope.filename = null; + + var protocol = client.protocol; + if (!protocol) protocol = 'openid-connect'; + $scope.configFormats = serverInfo.clientInstallations[protocol]; + console.log('configFormats.length: ' + $scope.configFormats.length); + + $scope.changeFormat = function() { + var url = ClientInstallation.url({ realm: $routeParams.realm, client: $routeParams.client, provider: $scope.configFormat.id }); + if ($scope.configFormat.mediaType == 'application/zip') { + $http({ + url: url, + method: 'GET', + responseType: 'arraybuffer', + cache: false + }).then(function(response) { + var installation = response.data; + $scope.installation = installation; + } + ); + } else { + $http.get(url).then(function (response) { + var installation = response.data; + if ($scope.configFormat.mediaType == 'application/json') { + installation = angular.fromJson(response.data); + installation = angular.toJson(installation, true); + } + $scope.installation = installation; + }); + } + + }; + $scope.download = function() { + saveAs(new Blob([$scope.installation], { type: $scope.configFormat.mediaType }), $scope.configFormat.filename); + } +}); + +module.controller('ClientDetailCtrl', function($scope, realm, client, templates, $route, serverInfo, Client, ClientDescriptionConverter, $location, $modal, Dialog, Notifications) { + + + + $scope.accessTypes = [ + "confidential", + "public", + "bearer-only" + ]; + + $scope.protocols = serverInfo.listProviderIds('login-protocol'); + + $scope.templates = [ {name:'NONE'}]; + for (var i = 0; i < templates.length; i++) { + var template = templates[i]; + $scope.templates.push(template); + } + + $scope.signatureAlgorithms = [ + "RSA_SHA1", + "RSA_SHA256", + "RSA_SHA512", + "DSA_SHA1" + ]; + $scope.nameIdFormats = [ + "username", + "email", + "transient", + "persistent" + ]; + $scope.xmlKeyNameTranformers = [ + "NONE", + "KEY_ID", + "CERT_SUBJECT" + ]; + + $scope.canonicalization = [ + {name: "EXCLUSIVE", value: "http://www.w3.org/2001/10/xml-exc-c14n#" }, + {name: "EXCLUSIVE_WITH_COMMENTS", value: "http://www.w3.org/2001/10/xml-exc-c14n#WithComments"}, + {name: "INCLUSIVE", value: "http://www.w3.org/TR/2001/REC-xml-c14n-20010315" }, + {name: "INCLUSIVE_WITH_COMMENTS", value: "http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments"} + ]; + + $scope.oidcSignatureAlgorithms = [ + "unsigned", + "RS256" + ]; + + $scope.requestObjectSignatureAlgorithms = [ + "any", + "none", + "RS256" + ]; + + $scope.realm = realm; + $scope.samlAuthnStatement = false; + $scope.samlOneTimeUseCondition = false; + $scope.samlMultiValuedRoles = false; + $scope.samlServerSignature = false; + $scope.samlServerSignatureEnableKeyInfoExtension = false; + $scope.samlAssertionSignature = false; + $scope.samlClientSignature = false; + $scope.samlEncrypt = false; + $scope.samlForcePostBinding = false; + $scope.samlForceNameIdFormat = false; + $scope.samlXmlKeyNameTranformer = $scope.xmlKeyNameTranformers[1]; + $scope.disableAuthorizationTab = !client.authorizationServicesEnabled; + $scope.disableServiceAccountRolesTab = !client.serviceAccountsEnabled; + $scope.disableCredentialsTab = client.publicClient; + + function updateProperties() { + if (!$scope.client.attributes) { + $scope.client.attributes = {}; + } + $scope.accessType = $scope.accessTypes[0]; + if ($scope.client.bearerOnly) { + $scope.accessType = $scope.accessTypes[2]; + } else if ($scope.client.publicClient) { + $scope.accessType = $scope.accessTypes[1]; + } + if ($scope.client.protocol) { + $scope.protocol = $scope.protocols[$scope.protocols.indexOf($scope.client.protocol)]; + } else { + $scope.protocol = $scope.protocols[0]; + } + if ($scope.client.attributes['saml.signature.algorithm'] == 'RSA_SHA1') { + $scope.signatureAlgorithm = $scope.signatureAlgorithms[0]; + } else if ($scope.client.attributes['saml.signature.algorithm'] == 'RSA_SHA256') { + $scope.signatureAlgorithm = $scope.signatureAlgorithms[1]; + } else if ($scope.client.attributes['saml.signature.algorithm'] == 'RSA_SHA512') { + $scope.signatureAlgorithm = $scope.signatureAlgorithms[2]; + } else if ($scope.client.attributes['saml.signature.algorithm'] == 'DSA_SHA1') { + $scope.signatureAlgorithm = $scope.signatureAlgorithms[3]; + } + if ($scope.client.attributes['saml_name_id_format'] == 'username') { + $scope.nameIdFormat = $scope.nameIdFormats[0]; + } else if ($scope.client.attributes['saml_name_id_format'] == 'email') { + $scope.nameIdFormat = $scope.nameIdFormats[1]; + } else if ($scope.client.attributes['saml_name_id_format'] == 'transient') { + $scope.nameIdFormat = $scope.nameIdFormats[2]; + } else if ($scope.client.attributes['saml_name_id_format'] == 'persistent') { + $scope.nameIdFormat = $scope.nameIdFormats[3]; + } + if ($scope.client.attributes["saml.server.signature"]) { + if ($scope.client.attributes["saml.server.signature"] == "true") { + $scope.samlServerSignature = true; + } else { + $scope.samlServerSignature = false; + + } + } + if ($scope.client.attributes["saml.server.signature.keyinfo.ext"]) { + if ($scope.client.attributes["saml.server.signature.keyinfo.ext"] == "true") { + $scope.samlServerSignatureEnableKeyInfoExtension = true; + } else { + $scope.samlServerSignatureEnableKeyInfoExtension = false; + } + } + if ($scope.client.attributes['saml.server.signature.keyinfo.xmlSigKeyInfoKeyNameTransformer'] === 'NONE') { + $scope.samlXmlKeyNameTranformer = $scope.xmlKeyNameTranformers[0]; + } else if ($scope.client.attributes['saml.server.signature.keyinfo.xmlSigKeyInfoKeyNameTransformer'] === 'KEY_ID') { + $scope.samlXmlKeyNameTranformer = $scope.xmlKeyNameTranformers[1]; + } else if ($scope.client.attributes['saml.server.signature.keyinfo.xmlSigKeyInfoKeyNameTransformer'] === 'CERT_SUBJECT') { + $scope.samlXmlKeyNameTranformer = $scope.xmlKeyNameTranformers[2]; + } + if ($scope.client.attributes["saml.assertion.signature"]) { + if ($scope.client.attributes["saml.assertion.signature"] == "true") { + $scope.samlAssertionSignature = true; + } else { + $scope.samlAssertionSignature = false; + } + } + if ($scope.client.attributes["saml.client.signature"]) { + if ($scope.client.attributes["saml.client.signature"] == "true") { + $scope.samlClientSignature = true; + } else { + $scope.samlClientSignature = false; + } + } + if ($scope.client.attributes["saml.encrypt"]) { + if ($scope.client.attributes["saml.encrypt"] == "true") { + $scope.samlEncrypt = true; + } else { + $scope.samlEncrypt = false; + } + } + if ($scope.client.attributes["saml.authnstatement"]) { + if ($scope.client.attributes["saml.authnstatement"] == "true") { + $scope.samlAuthnStatement = true; + } else { + $scope.samlAuthnStatement = false; + } + } + if ($scope.client.attributes["saml.onetimeuse.condition"]) { + if ($scope.client.attributes["saml.onetimeuse.condition"] == "true") { + $scope.samlOneTimeUseCondition = true; + } else { + $scope.samlOneTimeUseCondition = false; + } + } + if ($scope.client.attributes["saml_force_name_id_format"]) { + if ($scope.client.attributes["saml_force_name_id_format"] == "true") { + $scope.samlForceNameIdFormat = true; + } else { + $scope.samlForceNameIdFormat = false; + } + } + if ($scope.client.attributes["saml.multivalued.roles"]) { + if ($scope.client.attributes["saml.multivalued.roles"] == "true") { + $scope.samlMultiValuedRoles = true; + } else { + $scope.samlMultiValuedRoles = false; + } + } + if ($scope.client.attributes["saml.force.post.binding"]) { + if ($scope.client.attributes["saml.force.post.binding"] == "true") { + $scope.samlForcePostBinding = true; + } else { + $scope.samlForcePostBinding = false; + } + } + + var attrVal1 = $scope.client.attributes['user.info.response.signature.alg']; + $scope.userInfoSignedResponseAlg = attrVal1==null ? 'unsigned' : attrVal1; + + var attrVal2 = $scope.client.attributes['request.object.signature.alg']; + $scope.requestObjectSignatureAlg = attrVal2==null ? 'any' : attrVal2; + } + + if (!$scope.create) { + $scope.client = client; + updateProperties(); + + $scope.clientEdit = angular.copy(client); + } + + + $scope.importFile = function(fileContent){ + console.debug(fileContent); + ClientDescriptionConverter.save({ + realm: realm.realm + }, fileContent, function (data) { + $scope.client = data; + updateProperties(); + $scope.importing = true; + + $scope.clientEdit = angular.copy(client); + }); + }; + + $scope.viewImportDetails = function() { + $modal.open({ + templateUrl: resourceUrl + '/partials/modal/view-object.html', + controller: 'ObjectModalCtrl', + resolve: { + object: function () { + return $scope.client; + } + } + }) + }; + + $scope.switchChange = function() { + $scope.changed = true; + } + + $scope.changeAccessType = function() { + if ($scope.accessType == "confidential") { + $scope.clientEdit.bearerOnly = false; + $scope.clientEdit.publicClient = false; + } else if ($scope.accessType == "public") { + $scope.clientEdit.bearerOnly = false; + $scope.clientEdit.publicClient = true; + } else if ($scope.accessType == "bearer-only") { + $scope.clientEdit.bearerOnly = true; + $scope.clientEdit.publicClient = false; + } + }; + + $scope.changeProtocol = function() { + if ($scope.protocol == "openid-connect") { + $scope.clientEdit.protocol = "openid-connect"; + } else if ($scope.protocol == "saml") { + $scope.clientEdit.protocol = "saml"; + } + }; + + $scope.changeAlgorithm = function() { + $scope.clientEdit.attributes['saml.signature.algorithm'] = $scope.signatureAlgorithm; + }; + + $scope.changeNameIdFormat = function() { + $scope.clientEdit.attributes['saml_name_id_format'] = $scope.nameIdFormat; + }; + + $scope.changeSamlSigKeyNameTranformer = function() { + $scope.clientEdit.attributes['saml.server.signature.keyinfo.xmlSigKeyInfoKeyNameTransformer'] = $scope.samlXmlKeyNameTranformer; + }; + + $scope.changeUserInfoSignedResponseAlg = function() { + if ($scope.userInfoSignedResponseAlg === 'unsigned') { + $scope.clientEdit.attributes['user.info.response.signature.alg'] = null; + } else { + $scope.clientEdit.attributes['user.info.response.signature.alg'] = $scope.userInfoSignedResponseAlg; + } + }; + + $scope.changeRequestObjectSignatureAlg = function() { + if ($scope.requestObjectSignatureAlg === 'any') { + $scope.clientEdit.attributes['request.object.signature.alg'] = null; + } else { + $scope.clientEdit.attributes['request.object.signature.alg'] = $scope.requestObjectSignatureAlg; + } + }; + + $scope.$watch(function() { + return $location.path(); + }, function() { + $scope.path = $location.path().substring(1).split("/"); + }); + + function isChanged() { + if (!angular.equals($scope.client, $scope.clientEdit)) { + return true; + } + if ($scope.newRedirectUri && $scope.newRedirectUri.length > 0) { + return true; + } + if ($scope.newWebOrigin && $scope.newWebOrigin.length > 0) { + return true; + } + return false; + } + + function configureAuthorizationServices() { + if ($scope.clientEdit.authorizationServicesEnabled) { + if ($scope.accessType == 'public') { + $scope.accessType = 'confidential'; + } + $scope.clientEdit.publicClient = false; + $scope.clientEdit.serviceAccountsEnabled = true; + } else if ($scope.clientEdit.bearerOnly) { + $scope.clientEdit.serviceAccountsEnabled = false; + } + if ($scope.client.authorizationServicesEnabled && !$scope.clientEdit.authorizationServicesEnabled) { + Dialog.confirm("Disable Authorization Settings", "Are you sure you want to disable authorization ? Once you save your changes, all authorization settings associated with this client will be removed. This operation can not be reverted.", function () { + }, function () { + $scope.clientEdit.authorizationServicesEnabled = true; + }); + } + } + + $scope.$watch('clientEdit', function() { + $scope.changed = isChanged(); + configureAuthorizationServices(); + }, true); + + $scope.$watch('newRedirectUri', function() { + $scope.changed = isChanged(); + }, true); + + + $scope.$watch('newWebOrigin', function() { + $scope.changed = isChanged(); + }, true); + + $scope.deleteWebOrigin = function(index) { + $scope.clientEdit.webOrigins.splice(index, 1); + } + $scope.addWebOrigin = function() { + $scope.clientEdit.webOrigins.push($scope.newWebOrigin); + $scope.newWebOrigin = ""; + } + $scope.deleteRedirectUri = function(index) { + $scope.clientEdit.redirectUris.splice(index, 1); + } + + $scope.addRedirectUri = function() { + $scope.clientEdit.redirectUris.push($scope.newRedirectUri); + $scope.newRedirectUri = ""; + } + + $scope.save = function() { + if ($scope.newRedirectUri && $scope.newRedirectUri.length > 0) { + $scope.addRedirectUri(); + } + + if ($scope.newWebOrigin && $scope.newWebOrigin.length > 0) { + $scope.addWebOrigin(); + } + + if ($scope.samlServerSignature == true) { + $scope.clientEdit.attributes["saml.server.signature"] = "true"; + } else { + $scope.clientEdit.attributes["saml.server.signature"] = "false"; + } + if ($scope.samlServerSignatureEnableKeyInfoExtension == true) { + $scope.clientEdit.attributes["saml.server.signature.keyinfo.ext"] = "true"; + } else { + $scope.clientEdit.attributes["saml.server.signature.keyinfo.ext"] = "false"; + } + if ($scope.samlAssertionSignature == true) { + $scope.clientEdit.attributes["saml.assertion.signature"] = "true"; + } else { + $scope.clientEdit.attributes["saml.assertion.signature"] = "false"; + } + if ($scope.samlClientSignature == true) { + $scope.clientEdit.attributes["saml.client.signature"] = "true"; + } else { + $scope.clientEdit.attributes["saml.client.signature"] = "false"; + + } + if ($scope.samlEncrypt == true) { + $scope.clientEdit.attributes["saml.encrypt"] = "true"; + } else { + $scope.clientEdit.attributes["saml.encrypt"] = "false"; + + } + if ($scope.samlAuthnStatement == true) { + $scope.clientEdit.attributes["saml.authnstatement"] = "true"; + } else { + $scope.clientEdit.attributes["saml.authnstatement"] = "false"; + + } + if ($scope.samlOneTimeUseCondition == true) { + $scope.clientEdit.attributes["saml.onetimeuse.condition"] = "true"; + } else { + $scope.clientEdit.attributes["saml.onetimeuse.condition"] = "false"; + + } + if ($scope.samlForceNameIdFormat == true) { + $scope.clientEdit.attributes["saml_force_name_id_format"] = "true"; + } else { + $scope.clientEdit.attributes["saml_force_name_id_format"] = "false"; + + } + if ($scope.samlMultiValuedRoles == true) { + $scope.clientEdit.attributes["saml.multivalued.roles"] = "true"; + } else { + $scope.clientEdit.attributes["saml.multivalued.roles"] = "false"; + + } + if ($scope.samlForcePostBinding == true) { + $scope.clientEdit.attributes["saml.force.post.binding"] = "true"; + } else { + $scope.clientEdit.attributes["saml.force.post.binding"] = "false"; + + } + + $scope.clientEdit.protocol = $scope.protocol; + $scope.clientEdit.attributes['saml.signature.algorithm'] = $scope.signatureAlgorithm; + $scope.clientEdit.attributes['saml_name_id_format'] = $scope.nameIdFormat; + + if ($scope.clientEdit.protocol != 'saml' && !$scope.clientEdit.bearerOnly && ($scope.clientEdit.standardFlowEnabled || $scope.clientEdit.implicitFlowEnabled) && (!$scope.clientEdit.redirectUris || $scope.clientEdit.redirectUris.length == 0)) { + Notifications.error("You must specify at least one redirect uri"); + } else { + Client.update({ + realm : realm.realm, + client : client.id + }, $scope.clientEdit, function() { + $route.reload(); + Notifications.success("Your changes have been saved to the client."); + }); + } + }; + + $scope.reset = function() { + $route.reload(); + }; + + $scope.cancel = function() { + $location.url("/realms/" + realm.realm + "/clients"); + }; +}); + +module.controller('CreateClientCtrl', function($scope, realm, client, templates, $route, serverInfo, Client, ClientDescriptionConverter, $location, $modal, Dialog, Notifications) { + $scope.protocols = serverInfo.listProviderIds('login-protocol'); + $scope.create = true; + $scope.templates = [ {name:'NONE'}]; + var templateNameMap = new Object(); + for (var i = 0; i < templates.length; i++) { + var template = templates[i]; + templateNameMap[template.name] = template; + $scope.templates.push(template); + } + + $scope.realm = realm; + + $scope.client = { + enabled: true, + attributes: {} + }; + $scope.client.redirectUris = []; + $scope.protocol = $scope.protocols[0]; + + + $scope.importFile = function(fileContent){ + console.debug(fileContent); + ClientDescriptionConverter.save({ + realm: realm.realm + }, fileContent, function (data) { + $scope.client = data; + if (data.protocol) { + $scope.protocol = data.protocol; + } + $scope.importing = true; + }); + }; + + $scope.viewImportDetails = function() { + $modal.open({ + templateUrl: resourceUrl + '/partials/modal/view-object.html', + controller: 'ObjectModalCtrl', + resolve: { + object: function () { + return $scope.client; + } + } + }) + }; + + $scope.switchChange = function() { + $scope.changed = true; + } + + $scope.changeTemplate = function() { + if ($scope.client.clientTemplate == 'NONE') { + $scope.protocol = 'openid-connect'; + $scope.client.protocol = 'openid-connect'; + $scope.client.clientTemplate = null; + + } else { + var template = templateNameMap[$scope.client.clientTemplate]; + $scope.protocol = template.protocol; + $scope.client.protocol = template.protocol; + } + } + $scope.changeProtocol = function() { + if ($scope.protocol == "openid-connect") { + $scope.client.protocol = "openid-connect"; + } else if ($scope.protocol == "saml") { + $scope.client.protocol = "saml"; + } + }; + + $scope.$watch(function() { + return $location.path(); + }, function() { + $scope.path = $location.path().substring(1).split("/"); + }); + + function isChanged() { + if (!angular.equals($scope.client, client)) { + return true; + } + return false; + } + + $scope.$watch('client', function() { + $scope.changed = isChanged(); + }, true); + + + $scope.save = function() { + $scope.client.protocol = $scope.protocol; + + Client.save({ + realm: realm.realm, + client: '' + }, $scope.client, function (data, headers) { + $scope.changed = false; + var l = headers().location; + var id = l.substring(l.lastIndexOf("/") + 1); + $location.url("/realms/" + realm.realm + "/clients/" + id); + Notifications.success("The client has been created."); + }); + }; + + $scope.reset = function() { + $route.reload(); + }; + + $scope.cancel = function() { + $location.url("/realms/" + realm.realm + "/clients"); + }; +}); + +module.controller('ClientScopeMappingCtrl', function($scope, $http, realm, client, clients, templates, Notifications, + Client, ClientTemplate, + ClientRealmScopeMapping, ClientClientScopeMapping, ClientRole, + ClientAvailableRealmScopeMapping, ClientAvailableClientScopeMapping, + ClientCompositeRealmScopeMapping, ClientCompositeClientScopeMapping) { + $scope.realm = realm; + $scope.client = angular.copy(client); + $scope.selectedRealmRoles = []; + $scope.selectedRealmMappings = []; + $scope.realmMappings = []; + $scope.clients = clients; + $scope.clientRoles = []; + $scope.clientComposite = []; + $scope.selectedClientRoles = []; + $scope.selectedClientMappings = []; + $scope.clientMappings = []; + $scope.dummymodel = []; + + if (client.clientTemplate) { + for (var i = 0; i < templates.length; i++) { + if (templates[i].name == client.clientTemplate) { + ClientTemplate.get({realm: realm.realm, template: templates[i].id}, function(data) { + $scope.template = data; + }); + break; + } + } + + } + + $scope.hideRoleSelector = function() { + return ($scope.client.useTemplateScope && $scope.template && template.fullScopeAllowed) + || (!$scope.template && $scope.client.fullScopeAllowed); + } + + $scope.changeFlag = function() { + console.log('changeFlag'); + Client.update({ + realm : realm.realm, + client : client.id + }, $scope.client, function() { + $scope.changed = false; + client = angular.copy($scope.client); + updateRealmRoles(); + Notifications.success("Scope mappings updated."); + }); + } + + + + + function updateRealmRoles() { + $scope.realmRoles = ClientAvailableRealmScopeMapping.query({realm : realm.realm, client : client.id}); + $scope.realmMappings = ClientRealmScopeMapping.query({realm : realm.realm, client : client.id}); + $scope.realmComposite = ClientCompositeRealmScopeMapping.query({realm : realm.realm, client : client.id}); + } + + function updateClientRoles() { + if ($scope.targetClient) { + $scope.clientRoles = ClientAvailableClientScopeMapping.query({realm : realm.realm, client : client.id, targetClient : $scope.targetClient.id}); + $scope.clientMappings = ClientClientScopeMapping.query({realm : realm.realm, client : client.id, targetClient : $scope.targetClient.id}); + $scope.clientComposite = ClientCompositeClientScopeMapping.query({realm : realm.realm, client : client.id, targetClient : $scope.targetClient.id}); + } else { + $scope.clientRoles = null; + $scope.clientMappings = null; + $scope.clientComposite = null; + } + } + + $scope.changeClient = function() { + updateClientRoles(); + }; + + $scope.addRealmRole = function() { + var roles = $scope.selectedRealmRoles; + $scope.selectedRealmRoles = []; + $http.post(authUrl + '/admin/realms/' + realm.realm + '/clients/' + client.id + '/scope-mappings/realm', + roles).then(function() { + updateRealmRoles(); + Notifications.success("Scope mappings updated."); + }); + }; + + $scope.deleteRealmRole = function() { + var roles = $scope.selectedRealmMappings; + $scope.selectedRealmMappings = []; + $http.delete(authUrl + '/admin/realms/' + realm.realm + '/clients/' + client.id + '/scope-mappings/realm', + {data : roles, headers : {"content-type" : "application/json"}}).then(function () { + updateRealmRoles(); + Notifications.success("Scope mappings updated."); + }); + }; + + $scope.addClientRole = function() { + var roles = $scope.selectedClientRoles; + $scope.selectedClientRoles = []; + $http.post(authUrl + '/admin/realms/' + realm.realm + '/clients/' + client.id + '/scope-mappings/clients/' + $scope.targetClient.id, + roles).then(function () { + updateClientRoles(); + Notifications.success("Scope mappings updated."); + }); + }; + + $scope.deleteClientRole = function() { + var roles = $scope.selectedClientMappings; + $scope.selectedClientMappings = []; + $http.delete(authUrl + '/admin/realms/' + realm.realm + '/clients/' + client.id + '/scope-mappings/clients/' + $scope.targetClient.id, + {data : roles, headers : {"content-type" : "application/json"}}).then(function () { + updateClientRoles(); + Notifications.success("Scope mappings updated."); + }); + }; + + updateRealmRoles(); +}); + +module.controller('ClientRevocationCtrl', function($scope, realm, client, Client, ClientPushRevocation, $location, Dialog, Notifications) { + $scope.realm = realm; + $scope.client = client; + + var setNotBefore = function() { + if ($scope.client.notBefore == 0) { + $scope.notBefore = "None"; + } else { + $scope.notBefore = new Date($scope.client.notBefore * 1000); + } + }; + + setNotBefore(); + + var refresh = function() { + Client.get({ realm : realm.realm, client: $scope.client.id }, function(updated) { + $scope.client = updated; + setNotBefore(); + }) + + }; + + $scope.clear = function() { + $scope.client.notBefore = 0; + Client.update({ realm : realm.realm, client: client.id}, $scope.client, function () { + $scope.notBefore = "None"; + Notifications.success('Not Before cleared for client.'); + refresh(); + }); + } + $scope.setNotBeforeNow = function() { + $scope.client.notBefore = new Date().getTime()/1000; + Client.update({ realm : realm.realm, client: $scope.client.id}, $scope.client, function () { + Notifications.success('Not Before set for client.'); + refresh(); + }); + } + $scope.pushRevocation = function() { + ClientPushRevocation.save({realm : realm.realm, client: $scope.client.id}, function (globalReqResult) { + var successCount = globalReqResult.successRequests ? globalReqResult.successRequests.length : 0; + var failedCount = globalReqResult.failedRequests ? globalReqResult.failedRequests.length : 0; + + if (successCount==0 && failedCount==0) { + Notifications.warn('No push sent. No admin URI configured or no registered cluster nodes available'); + } else if (failedCount > 0) { + var msgStart = successCount>0 ? 'Successfully push notBefore to: ' + globalReqResult.successRequests + ' . ' : ''; + Notifications.error(msgStart + 'Failed to push notBefore to: ' + globalReqResult.failedRequests + '. Verify availability of failed hosts and try again'); + } else { + Notifications.success('Successfully push notBefore to: ' + globalReqResult.successRequests); + } + }); + } + +}); + +module.controller('ClientClusteringCtrl', function($scope, client, Client, ClientTestNodesAvailable, ClientClusterNode, realm, $location, $route, Dialog, Notifications, TimeUnit) { + $scope.client = client; + $scope.realm = realm; + + var oldCopy = angular.copy($scope.client); + $scope.changed = false; + + $scope.$watch('client', function() { + if (!angular.equals($scope.client, oldCopy)) { + $scope.changed = true; + } + }, true); + + $scope.client.nodeReRegistrationTimeoutUnit = TimeUnit.autoUnit(client.nodeReRegistrationTimeout); + $scope.client.nodeReRegistrationTimeout = TimeUnit.toUnit(client.nodeReRegistrationTimeout, $scope.client.nodeReRegistrationTimeoutUnit); + + $scope.save = function() { + var clientCopy = angular.copy($scope.client); + delete clientCopy['nodeReRegistrationTimeoutUnit']; + clientCopy.nodeReRegistrationTimeout = TimeUnit.toSeconds($scope.client.nodeReRegistrationTimeout, $scope.client.nodeReRegistrationTimeoutUnit) + Client.update({ realm : realm.realm, client : client.id }, clientCopy, function () { + $route.reload(); + Notifications.success('Your changes have been saved to the client.'); + }); + }; + + $scope.reset = function() { + $route.reload(); + }; + + $scope.testNodesAvailable = function() { + ClientTestNodesAvailable.get({ realm : realm.realm, client : client.id }, function(globalReqResult) { + $route.reload(); + + var successCount = globalReqResult.successRequests ? globalReqResult.successRequests.length : 0; + var failedCount = globalReqResult.failedRequests ? globalReqResult.failedRequests.length : 0; + + if (successCount==0 && failedCount==0) { + Notifications.warn('No requests sent. No admin URI configured or no registered cluster nodes available'); + } else if (failedCount > 0) { + var msgStart = successCount>0 ? 'Successfully verify availability for ' + globalReqResult.successRequests + ' . ' : ''; + Notifications.error(msgStart + 'Failed to verify availability for: ' + globalReqResult.failedRequests + '. Fix or unregister failed cluster nodes and try again'); + } else { + Notifications.success('Successfully sent requests to: ' + globalReqResult.successRequests); + } + }); + }; + + if (client.registeredNodes) { + var nodeRegistrations = []; + for (node in client.registeredNodes) { + reg = { + host: node, + lastRegistration: new Date(client.registeredNodes[node] * 1000) + } + nodeRegistrations.push(reg); + } + + $scope.nodeRegistrations = nodeRegistrations; + }; + + $scope.removeNode = function(node) { + Dialog.confirmDelete(node.host, 'node', function() { + ClientClusterNode.remove({ realm : realm.realm, client : client.id , node: node.host }, function() { + Notifications.success('Node ' + node.host + ' unregistered successfully.'); + $route.reload(); + }); + }); + }; +}); + +module.controller('ClientClusteringNodeCtrl', function($scope, client, Client, ClientClusterNode, realm, + $location, $routeParams, Notifications, Dialog) { + $scope.client = client; + $scope.realm = realm; + $scope.create = !$routeParams.node; + + $scope.save = function() { + ClientClusterNode.save({ realm : realm.realm, client : client.id , node: $scope.node.host }, function() { + Notifications.success('Node ' + $scope.node.host + ' registered successfully.'); + $location.url('/realms/' + realm.realm + '/clients/' + client.id + '/clustering'); + }); + } + + $scope.unregisterNode = function() { + Dialog.confirmDelete($scope.node.host, 'node', function() { + ClientClusterNode.remove({ realm : realm.realm, client : client.id , node: $scope.node.host }, function() { + Notifications.success('Node ' + $scope.node.host + ' unregistered successfully.'); + $location.url('/realms/' + realm.realm + '/clients/' + client.id + '/clustering'); + }); + }); + } + + if ($scope.create) { + $scope.node = {} + $scope.registered = false; + } else { + var lastRegTime = client.registeredNodes[$routeParams.node]; + + if (lastRegTime) { + $scope.registered = true; + $scope.node = { + host: $routeParams.node, + lastRegistration: new Date(lastRegTime * 1000) + } + + } else { + $scope.registered = false; + $scope.node = { + host: $routeParams.node + } + } + } +}); + +module.controller('AddBuiltinProtocolMapperCtrl', function($scope, realm, client, serverInfo, + ClientProtocolMappersByProtocol, + $http, $location, Dialog, Notifications) { + $scope.realm = realm; + $scope.client = client; + if (client.protocol == null) { + client.protocol = 'openid-connect'; + } + + var protocolMappers = serverInfo.protocolMapperTypes[client.protocol]; + var mapperTypes = {}; + for (var i = 0; i < protocolMappers.length; i++) { + mapperTypes[protocolMappers[i].id] = protocolMappers[i]; + } + $scope.mapperTypes = mapperTypes; + + + + + var updateMappers = function() { + var clientMappers = ClientProtocolMappersByProtocol.query({realm : realm.realm, client : client.id, protocol : client.protocol}, function() { + var builtinMappers = serverInfo.builtinProtocolMappers[client.protocol]; + for (var i = 0; i < clientMappers.length; i++) { + for (var j = 0; j < builtinMappers.length; j++) { + if (builtinMappers[j].name == clientMappers[i].name + && builtinMappers[j].protocolMapper == clientMappers[i].protocolMapper) { + builtinMappers.splice(j, 1); + break; + } + } + } + $scope.mappers = builtinMappers; + for (var i = 0; i < $scope.mappers.length; i++) { + $scope.mappers[i].isChecked = false; + } + + + }); + }; + + updateMappers(); + + $scope.add = function() { + var toAdd = []; + for (var i = 0; i < $scope.mappers.length; i++) { + if ($scope.mappers[i].isChecked) { + delete $scope.mappers[i].isChecked; + toAdd.push($scope.mappers[i]); + } + } + $http.post(authUrl + '/admin/realms/' + realm.realm + '/clients/' + client.id + '/protocol-mappers/add-models', + toAdd).then(function() { + Notifications.success("Mappers added"); + $location.url('/realms/' + realm.realm + '/clients/' + client.id + '/mappers'); + }).catch(function() { + Notifications.error("Error adding mappers"); + $location.url('/realms/' + realm.realm + '/clients/' + client.id + '/mappers'); + }); + }; + +}); + +module.controller('ClientProtocolMapperListCtrl', function($scope, realm, client, templates, serverInfo, + Client, + ClientProtocolMappersByProtocol, ClientProtocolMapper, + $route, Dialog, Notifications) { + $scope.realm = realm; + $scope.client = client; + if (client.protocol == null) { + client.protocol = 'openid-connect'; + } + if (client.clientTemplate) { + for (var i = 0; i < templates.length; i++) { + if (client.clientTemplate == templates[i].name) { + $scope.template = templates[i]; + break; + } + } + } + $scope.changeFlag = function() { + Client.update({ + realm : realm.realm, + client : client.id + }, $scope.client, function() { + $scope.changed = false; + client = angular.copy($scope.client); + Notifications.success("Client updated."); + }); + } + + var protocolMappers = serverInfo.protocolMapperTypes[client.protocol]; + var mapperTypes = {}; + for (var i = 0; i < protocolMappers.length; i++) { + mapperTypes[protocolMappers[i].id] = protocolMappers[i]; + } + $scope.mapperTypes = mapperTypes; + + $scope.removeMapper = function(mapper) { + console.debug(mapper); + Dialog.confirmDelete(mapper.name, 'mapper', function() { + ClientProtocolMapper.remove({ realm: realm.realm, client: client.id, id : mapper.id }, function() { + Notifications.success("The mapper has been deleted."); + $route.reload(); + }); + }); + }; + + var updateMappers = function() { + $scope.mappers = ClientProtocolMappersByProtocol.query({realm : realm.realm, client : client.id, protocol : client.protocol}); + }; + + updateMappers(); +}); + +module.controller('ClientProtocolMapperCtrl', function($scope, realm, serverInfo, client, clients, mapper, ClientProtocolMapper, Notifications, Dialog, $location) { + $scope.realm = realm; + $scope.clients = clients; + + /* + $scope.client = client; + $scope.create = false; + $scope.protocol = client.protocol; + $scope.mapper = angular.copy(mapper); + $scope.changed = false; + */ + + if (client.protocol == null) { + client.protocol = 'openid-connect'; + } + + $scope.model = { + realm: realm, + client: client, + create: false, + protocol: client.protocol, + mapper: angular.copy(mapper), + changed: false + }; + + var protocolMappers = serverInfo.protocolMapperTypes[client.protocol]; + for (var i = 0; i < protocolMappers.length; i++) { + if (protocolMappers[i].id === mapper.protocolMapper) { + $scope.model.mapperType = protocolMappers[i]; + } + } + $scope.$watch(function() { + return $location.path(); + }, function() { + $scope.path = $location.path().substring(1).split("/"); + }); + + $scope.$watch('model.mapper', function() { + if (!angular.equals($scope.model.mapper, mapper)) { + $scope.model.changed = true; + } + }, true); + + $scope.save = function() { + ClientProtocolMapper.update({ + realm : realm.realm, + client: client.id, + id : $scope.model.mapper.id + }, $scope.model.mapper, function() { + $scope.model.changed = false; + mapper = angular.copy($scope.mapper); + $location.url("/realms/" + realm.realm + '/clients/' + client.id + "/mappers/" + $scope.model.mapper.id); + Notifications.success("Your changes have been saved."); + }); + }; + + $scope.reset = function() { + $scope.model.mapper = angular.copy(mapper); + $scope.model.changed = false; + }; + + $scope.cancel = function() { + //$location.url("/realms"); + window.history.back(); + }; + + $scope.remove = function() { + Dialog.confirmDelete($scope.model.mapper.name, 'mapper', function() { + ClientProtocolMapper.remove({ realm: realm.realm, client: client.id, id : $scope.model.mapper.id }, function() { + Notifications.success("The mapper has been deleted."); + $location.url("/realms/" + realm.realm + '/clients/' + client.id + "/mappers"); + }); + }); + }; + +}); + +module.controller('ClientProtocolMapperCreateCtrl', function($scope, realm, serverInfo, client, clients, ClientProtocolMapper, Notifications, Dialog, $location) { + $scope.realm = realm; + $scope.clients = clients; + + if (client.protocol == null) { + client.protocol = 'openid-connect'; + } + var protocol = client.protocol; + /* + $scope.client = client; + $scope.create = true; + $scope.protocol = protocol; + $scope.mapper = { protocol : client.protocol, config: {}}; + $scope.mapperTypes = serverInfo.protocolMapperTypes[protocol]; + */ + $scope.model = { + realm: realm, + client: client, + create: true, + protocol: client.protocol, + mapper: { protocol : client.protocol, config: {}}, + changed: false, + mapperTypes: serverInfo.protocolMapperTypes[protocol] + }; + + // apply default configurations on change for selected protocolmapper type. + $scope.$watch('model.mapperType', function() { + var currentMapperType = $scope.model.mapperType; + var defaultConfig = {}; + + if (currentMapperType && Array.isArray(currentMapperType.properties)) { + for (var i = 0; i < currentMapperType.properties.length; i++) { + var property = currentMapperType.properties[i]; + if (property && property.name && property.defaultValue) { + defaultConfig[property.name] = property.defaultValue; + } + } + } + + $scope.model.mapper.config = defaultConfig; + }, true); + + $scope.model.mapperType = $scope.model.mapperTypes[0]; + + $scope.$watch(function() { + return $location.path(); + }, function() { + $scope.path = $location.path().substring(1).split("/"); + }); + + $scope.save = function() { + $scope.model.mapper.protocolMapper = $scope.model.mapperType.id; + ClientProtocolMapper.save({ + realm : realm.realm, client: client.id + }, $scope.model.mapper, function(data, headers) { + var l = headers().location; + var id = l.substring(l.lastIndexOf("/") + 1); + $location.url("/realms/" + realm.realm + '/clients/' + client.id + "/mappers/" + id); + Notifications.success("Mapper has been created."); + }); + }; + + $scope.cancel = function() { + //$location.url("/realms"); + window.history.back(); + }; + + +}); + +module.controller('ClientTemplateTabCtrl', function(Dialog, $scope, Current, Notifications, $location) { + $scope.removeClientTemplate = function() { + Dialog.confirmDelete($scope.template.name, 'client template', function() { + $scope.template.$remove({ + realm : Current.realm.realm, + template : $scope.template.id + }, function() { + $location.url("/realms/" + Current.realm.realm + "/client-templates"); + Notifications.success("The client template has been deleted."); + }); + }); + }; +}); + + + +module.controller('ClientTemplateListCtrl', function($scope, realm, templates, ClientTemplate, serverInfo, $route, Dialog, Notifications, $location) { + $scope.realm = realm; + $scope.templates = templates; + + $scope.removeClientTemplate = function(template) { + Dialog.confirmDelete(template.name, 'client template', function() { + ClientTemplate.remove({ + realm : realm.realm, + template : template.id + }, function() { + $route.reload(); + Notifications.success("The client template been deleted."); + }); + }); + }; +}); + +module.controller('ClientTemplateDetailCtrl', function($scope, realm, template, $route, serverInfo, ClientTemplate, $location, $modal, Dialog, Notifications) { + $scope.protocols = serverInfo.listProviderIds('login-protocol'); + + $scope.realm = realm; + $scope.create = !template.name; + + function updateProperties() { + if ($scope.template.protocol) { + $scope.protocol = $scope.protocols[$scope.protocols.indexOf($scope.template.protocol)]; + } else { + $scope.protocol = $scope.protocols[0]; + } + } + + if (!$scope.create) { + $scope.template = angular.copy(template); + updateProperties(); + } else { + $scope.template = { + }; + $scope.protocol = $scope.protocols[0]; + } + + + $scope.switchChange = function() { + $scope.changed = true; + } + + $scope.changeProtocol = function() { + if ($scope.protocol == "openid-connect") { + $scope.template.protocol = "openid-connect"; + } else if ($scope.protocol == "saml") { + $scope.template.protocol = "saml"; + } + }; + + $scope.$watch(function() { + return $location.path(); + }, function() { + $scope.path = $location.path().substring(1).split("/"); + }); + + function isChanged() { + if (!angular.equals($scope.template, template)) { + return true; + } + return false; + } + + $scope.$watch('template', function() { + $scope.changed = isChanged(); + }, true); + + $scope.save = function() { + $scope.template.protocol = $scope.protocol; + + if ($scope.create) { + ClientTemplate.save({ + realm: realm.realm, + template: '' + }, $scope.template, function (data, headers) { + $scope.changed = false; + var l = headers().location; + var id = l.substring(l.lastIndexOf("/") + 1); + $location.url("/realms/" + realm.realm + "/client-templates/" + id); + Notifications.success("The client template has been created."); + }); + } else { + ClientTemplate.update({ + realm : realm.realm, + template : template.id + }, $scope.template, function() { + $scope.changed = false; + template = angular.copy($scope.template); + $location.url("/realms/" + realm.realm + "/client-templates/" + template.id); + Notifications.success("Your changes have been saved to the client template."); + }); + } + }; + + $scope.reset = function() { + $route.reload(); + }; + + $scope.cancel = function() { + $location.url("/realms/" + realm.realm + "/client-templates"); + }; +}); + +module.controller('ClientTemplateProtocolMapperListCtrl', function($scope, realm, template, serverInfo, + ClientTemplateProtocolMappersByProtocol, ClientTemplateProtocolMapper, + $route, Dialog, Notifications) { + $scope.realm = realm; + $scope.template = template; + if (template.protocol == null) { + template.protocol = 'openid-connect'; + } + + var protocolMappers = serverInfo.protocolMapperTypes[template.protocol]; + var mapperTypes = {}; + for (var i = 0; i < protocolMappers.length; i++) { + mapperTypes[protocolMappers[i].id] = protocolMappers[i]; + } + $scope.mapperTypes = mapperTypes; + + $scope.removeMapper = function(mapper) { + console.debug(mapper); + Dialog.confirmDelete(mapper.name, 'mapper', function() { + ClientTemplateProtocolMapper.remove({ realm: realm.realm, template: template.id, id : mapper.id }, function() { + Notifications.success("The mapper has been deleted."); + $route.reload(); + }); + }); + }; + + var updateMappers = function() { + $scope.mappers = ClientTemplateProtocolMappersByProtocol.query({realm : realm.realm, template : template.id, protocol : template.protocol}); + }; + + updateMappers(); +}); + +module.controller('ClientTemplateProtocolMapperCtrl', function($scope, realm, serverInfo, template, mapper, clients, ClientTemplateProtocolMapper, Notifications, Dialog, $location, $route) { + $scope.realm = realm; + $scope.clients = clients; + + if (template.protocol == null) { + template.protocol = 'openid-connect'; + } + + $scope.model = { + realm: realm, + template: template, + create: false, + protocol: template.protocol, + mapper: angular.copy(mapper), + changed: false + } + + var protocolMappers = serverInfo.protocolMapperTypes[template.protocol]; + for (var i = 0; i < protocolMappers.length; i++) { + if (protocolMappers[i].id == mapper.protocolMapper) { + $scope.model.mapperType = protocolMappers[i]; + } + } + $scope.$watch(function() { + return $location.path(); + }, function() { + $scope.path = $location.path().substring(1).split("/"); + }); + + $scope.$watch('model.mapper', function() { + if (!angular.equals($scope.model.mapper, mapper)) { + $scope.model.changed = true; + } + }, true); + + $scope.save = function() { + ClientTemplateProtocolMapper.update({ + realm : realm.realm, + template: template.id, + id : mapper.id + }, $scope.model.mapper, function() { + $route.reload(); + Notifications.success("Your changes have been saved."); + }); + }; + + $scope.reset = function() { + $scope.model.mapper = angular.copy(mapper); + $scope.model.changed = false; + }; + + $scope.cancel = function() { + //$location.url("/realms"); + window.history.back(); + }; + + $scope.remove = function() { + Dialog.confirmDelete($scope.model.mapper.name, 'mapper', function() { + ClientTemplateProtocolMapper.remove({ realm: realm.realm, template: template.id, id : $scope.model.mapper.id }, function() { + Notifications.success("The mapper has been deleted."); + $location.url("/realms/" + realm.realm + '/client-templates/' + template.id + "/mappers"); + }); + }); + }; + +}); + +module.controller('ClientTemplateProtocolMapperCreateCtrl', function($scope, realm, serverInfo, template, clients, ClientTemplateProtocolMapper, Notifications, Dialog, $location) { + $scope.realm = realm; + $scope.clients = clients; + + if (template.protocol == null) { + template.protocol = 'openid-connect'; + } + var protocol = template.protocol; + $scope.model = { + realm: realm, + template: template, + create: true, + protocol: template.protocol, + mapper: { protocol : template.protocol, config: {}}, + changed: false, + mapperTypes: serverInfo.protocolMapperTypes[protocol] + } + + $scope.model.mapperType = $scope.model.mapperTypes[0]; + + $scope.$watch(function() { + return $location.path(); + }, function() { + $scope.path = $location.path().substring(1).split("/"); + }); + + $scope.save = function() { + $scope.model.mapper.protocolMapper = $scope.model.mapperType.id; + ClientTemplateProtocolMapper.save({ + realm : realm.realm, template: template.id + }, $scope.model.mapper, function(data, headers) { + var l = headers().location; + var id = l.substring(l.lastIndexOf("/") + 1); + $location.url("/realms/" + realm.realm + '/client-templates/' + template.id + "/mappers/" + id); + Notifications.success("Mapper has been created."); + }); + }; + + $scope.cancel = function() { + //$location.url("/realms"); + window.history.back(); + }; + + +}); + +module.controller('ClientTemplateAddBuiltinProtocolMapperCtrl', function($scope, realm, template, serverInfo, + ClientTemplateProtocolMappersByProtocol, + $http, $location, Dialog, Notifications) { + $scope.realm = realm; + $scope.template = template; + if (template.protocol == null) { + template.protocol = 'openid-connect'; + } + + var protocolMappers = serverInfo.protocolMapperTypes[template.protocol]; + var mapperTypes = {}; + for (var i = 0; i < protocolMappers.length; i++) { + mapperTypes[protocolMappers[i].id] = protocolMappers[i]; + } + $scope.mapperTypes = mapperTypes; + + + + + var updateMappers = function() { + var clientMappers = ClientTemplateProtocolMappersByProtocol.query({realm : realm.realm, template : template.id, protocol : template.protocol}, function() { + var builtinMappers = serverInfo.builtinProtocolMappers[template.protocol]; + for (var i = 0; i < clientMappers.length; i++) { + for (var j = 0; j < builtinMappers.length; j++) { + if (builtinMappers[j].name == clientMappers[i].name + && builtinMappers[j].protocolMapper == clientMappers[i].protocolMapper) { + builtinMappers.splice(j, 1); + break; + } + } + } + $scope.mappers = builtinMappers; + for (var i = 0; i < $scope.mappers.length; i++) { + $scope.mappers[i].isChecked = false; + } + + + }); + }; + + updateMappers(); + + $scope.add = function() { + var toAdd = []; + for (var i = 0; i < $scope.mappers.length; i++) { + if ($scope.mappers[i].isChecked) { + delete $scope.mappers[i].isChecked; + toAdd.push($scope.mappers[i]); + } + } + $http.post(authUrl + '/admin/realms/' + realm.realm + '/client-templates/' + template.id + '/protocol-mappers/add-models', + toAdd).then(function() { + Notifications.success("Mappers added"); + $location.url('/realms/' + realm.realm + '/client-templates/' + template.id + '/mappers'); + }).catch(function() { + Notifications.error("Error adding mappers"); + $location.url('/realms/' + realm.realm + '/client-templates/' + template.id + '/mappers'); + }); + }; + +}); + + +module.controller('ClientTemplateScopeMappingCtrl', function($scope, $http, realm, template, clients, Notifications, + ClientTemplate, + ClientTemplateRealmScopeMapping, ClientTemplateClientScopeMapping, ClientRole, + ClientTemplateAvailableRealmScopeMapping, ClientTemplateAvailableClientScopeMapping, + ClientTemplateCompositeRealmScopeMapping, ClientTemplateCompositeClientScopeMapping) { + $scope.realm = realm; + $scope.template = angular.copy(template); + $scope.selectedRealmRoles = []; + $scope.selectedRealmMappings = []; + $scope.realmMappings = []; + $scope.clients = clients; + $scope.clientRoles = []; + $scope.clientComposite = []; + $scope.selectedClientRoles = []; + $scope.selectedClientMappings = []; + $scope.clientMappings = []; + $scope.dummymodel = []; + + + $scope.changeFullScopeAllowed = function() { + ClientTemplate.update({ + realm : realm.realm, + template : template.id + }, $scope.template, function() { + $scope.changed = false; + template = angular.copy($scope.template); + updateTemplateRealmRoles(); + Notifications.success("Scope mappings updated."); + }); + } + + + + function updateTemplateRealmRoles() { + $scope.realmRoles = ClientTemplateAvailableRealmScopeMapping.query({realm : realm.realm, template : template.id}); + $scope.realmMappings = ClientTemplateRealmScopeMapping.query({realm : realm.realm, template : template.id}); + $scope.realmComposite = ClientTemplateCompositeRealmScopeMapping.query({realm : realm.realm, template : template.id}); + } + + function updateTemplateClientRoles() { + if ($scope.targetClient) { + $scope.clientRoles = ClientTemplateAvailableClientScopeMapping.query({realm : realm.realm, template : template.id, targetClient : $scope.targetClient.id}); + $scope.clientMappings = ClientTemplateClientScopeMapping.query({realm : realm.realm, template : template.id, targetClient : $scope.targetClient.id}); + $scope.clientComposite = ClientTemplateCompositeClientScopeMapping.query({realm : realm.realm, template : template.id, targetClient : $scope.targetClient.id}); + } else { + $scope.clientRoles = null; + $scope.clientMappings = null; + $scope.clientComposite = null; + } + } + + $scope.changeClient = function() { + updateTemplateClientRoles(); + }; + + $scope.addRealmRole = function() { + var roles = $scope.selectedRealmRoles; + $scope.selectedRealmRoles = []; + $http.post(authUrl + '/admin/realms/' + realm.realm + '/client-templates/' + template.id + '/scope-mappings/realm', + roles).then(function() { + updateTemplateRealmRoles(); + Notifications.success("Scope mappings updated."); + }); + }; + + $scope.deleteRealmRole = function() { + var roles = $scope.selectedRealmMappings; + $scope.selectedRealmMappings = []; + $http.delete(authUrl + '/admin/realms/' + realm.realm + '/client-templates/' + template.id + '/scope-mappings/realm', + {data : roles, headers : {"content-type" : "application/json"}}).then(function () { + updateTemplateRealmRoles(); + Notifications.success("Scope mappings updated."); + }); + }; + + $scope.addClientRole = function() { + var roles = $scope.selectedClientRoles; + $scope.selectedClientRoles = []; + $http.post(authUrl + '/admin/realms/' + realm.realm + '/client-templates/' + template.id + '/scope-mappings/clients/' + $scope.targetClient.id, + roles).then(function () { + updateTemplateClientRoles(); + Notifications.success("Scope mappings updated."); + }); + }; + + $scope.deleteClientRole = function() { + var roles = $scope.selectedClientMappings; + $scope.selectedClientMappings = []; + $http.delete(authUrl + '/admin/realms/' + realm.realm + '/client-templates/' + template.id + '/scope-mappings/clients/' + $scope.targetClient.id, + {data : roles, headers : {"content-type" : "application/json"}}).then(function () { + updateTemplateClientRoles(); + Notifications.success("Scope mappings updated."); + }); + }; + + updateTemplateRealmRoles(); +}); diff --git a/admin/resources/js/controllers/groups.js b/admin/resources/js/controllers/groups.js new file mode 100644 index 0000000..0a5652c --- /dev/null +++ b/admin/resources/js/controllers/groups.js @@ -0,0 +1,503 @@ +module.controller('GroupListCtrl', function($scope, $route, $q, realm, Groups, GroupsCount, Group, GroupChildren, Notifications, $location, Dialog) { + $scope.realm = realm; + $scope.groupList = [ + { + "id" : "realm", + "name": "Groups", + "subGroups" : [] + } + ]; + + + $scope.searchTerms = ''; + $scope.currentPage = 1; + $scope.currentPageInput = $scope.currentPage; + $scope.pageSize = 20; + $scope.tree = []; + + var refreshGroups = function (search) { + console.log('refreshGroups'); + + var first = ($scope.currentPage * $scope.pageSize) - $scope.pageSize; + console.log('first:' + first); + var queryParams = { + realm : realm.id, + first : first, + max : $scope.pageSize + }; + var countParams = { + realm : realm.id, + top : 'true' + }; + + if(angular.isDefined(search) && search !== '') { + queryParams.search = search; + countParams.search = search; + } + + var promiseGetGroups = $q.defer(); + Groups.query(queryParams, function(entry) { + promiseGetGroups.resolve(entry); + }, function() { + promiseGetGroups.reject('Unable to fetch ' + queryParams); + }); + var promiseGetGroupsChain = promiseGetGroups.promise.then(function(groups) { + console.log('*** group call groups size: ' + groups.length); + console.log('*** group call groups size: ' + groups.length); + $scope.groupList = [ + { + "id" : "realm", + "name": "Groups", + "subGroups" : groups + } + ]; + }); + + var promiseCount = $q.defer(); + GroupsCount.query(countParams, function(entry) { + promiseCount.resolve(entry); + }, function() { + promiseCount.reject('Unable to fetch ' + countParams); + }); + var promiseCountChain = promiseCount.promise.then(function(groupsCount) { + $scope.numberOfPages = Math.ceil(groupsCount.count/$scope.pageSize); + }); + }; + refreshGroups(); + + $scope.$watch('currentPage', function(newValue, oldValue) { + if(newValue !== oldValue) { + refreshGroups($scope.searchTerms); + } + }); + + $scope.clearSearch = function() { + $scope.searchTerms = ''; + $scope.currentPage = 1; + refreshGroups(); + }; + + $scope.searchGroup = function() { + $scope.currentPage = 1; + refreshGroups($scope.searchTerms); + }; + + $scope.edit = function(selected) { + if (selected.id === 'realm') return; + $location.url("/realms/" + realm.realm + "/groups/" + selected.id); + }; + + $scope.cut = function(selected) { + $scope.cutNode = selected; + }; + + $scope.isDisabled = function() { + if (!$scope.tree.currentNode) return true; + return $scope.tree.currentNode.id === 'realm'; + }; + + $scope.paste = function(selected) { + if (selected === null) return; + if ($scope.cutNode === null) return; + if (selected.id === $scope.cutNode.id) return; + if (selected.id === 'realm') { + Groups.save({realm: realm.realm}, {id:$scope.cutNode.id}, function() { + $route.reload(); + Notifications.success("Group moved."); + + }); + + } else { + GroupChildren.save({realm: realm.realm, groupId: selected.id}, {id:$scope.cutNode.id}, function() { + $route.reload(); + Notifications.success("Group moved."); + + }); + + } + + }; + + $scope.remove = function(selected) { + if (selected === null) return; + Dialog.confirmDelete(selected.name, 'group', function() { + Group.remove({ realm: realm.realm, groupId : selected.id }, function() { + $route.reload(); + Notifications.success("The group has been deleted."); + }); + }); + + }; + + $scope.createGroup = function(selected) { + var parent = 'realm'; + if (selected) { + parent = selected.id; + } + $location.url("/create/group/" + realm.realm + '/parent/' + parent); + + }; + var isLeaf = function(node) { + return node.id !== "realm" && (!node.subGroups || node.subGroups.length === 0); + }; + + $scope.getGroupClass = function(node) { + if (node.id === "realm") { + return 'pficon pficon-users'; + } + if (isLeaf(node)) { + return 'normal'; + } + if (node.subGroups.length && node.collapsed) return 'collapsed'; + if (node.subGroups.length && !node.collapsed) return 'expanded'; + return 'collapsed'; + + }; + + $scope.getSelectedClass = function(node) { + if (node.selected) { + return 'selected'; + } else if ($scope.cutNode && $scope.cutNode.id === node.id) { + return 'cut'; + } + return undefined; + } + +}); + +module.controller('GroupCreateCtrl', function($scope, $route, realm, parentId, Groups, Group, GroupChildren, Notifications, $location) { + $scope.realm = realm; + $scope.group = {}; + $scope.save = function() { + console.log('save!!!'); + if (parentId === 'realm') { + console.log('realm'); + Groups.save({realm: realm.realm}, $scope.group, function(data, headers) { + var l = headers().location; + + + var id = l.substring(l.lastIndexOf("/") + 1); + + $location.url("/realms/" + realm.realm + "/groups/" + id); + Notifications.success("Group Created."); + }) + + } else { + GroupChildren.save({realm: realm.realm, groupId: parentId}, $scope.group, function(data, headers) { + var l = headers().location; + + + var id = l.substring(l.lastIndexOf("/") + 1); + + $location.url("/realms/" + realm.realm + "/groups/" + id); + Notifications.success("Group Created."); + }) + + } + + }; + $scope.cancel = function() { + $location.url("/realms/" + realm.realm + "/groups"); + }; +}); + +module.controller('GroupTabCtrl', function(Dialog, $scope, Current, Group, Notifications, $location) { + $scope.removeGroup = function() { + Dialog.confirmDelete($scope.group.name, 'group', function() { + Group.remove({ + realm : Current.realm.realm, + groupId : $scope.group.id + }, function() { + $location.url("/realms/" + Current.realm.realm + "/groups"); + Notifications.success("The group has been deleted."); + }); + }); + }; +}); + +module.controller('GroupDetailCtrl', function(Dialog, $scope, realm, group, Group, Notifications, $location) { + $scope.realm = realm; + + if (!group.attributes) { + group.attributes = {} + } + convertAttributeValuesToString(group); + + + $scope.group = angular.copy(group); + + $scope.changed = false; // $scope.create; + $scope.$watch('group', function() { + if (!angular.equals($scope.group, group)) { + $scope.changed = true; + } + }, true); + + $scope.save = function() { + convertAttributeValuesToLists(); + + Group.update({ + realm: realm.realm, + groupId: $scope.group.id + }, $scope.group, function () { + $scope.changed = false; + convertAttributeValuesToString($scope.group); + group = angular.copy($scope.group); + Notifications.success("Your changes have been saved to the group."); + }); + }; + + function convertAttributeValuesToLists() { + var attrs = $scope.group.attributes; + for (var attribute in attrs) { + if (typeof attrs[attribute] === "string") { + attrs[attribute] = attrs[attribute].split("##"); + } + } + } + + function convertAttributeValuesToString(group) { + var attrs = group.attributes; + for (var attribute in attrs) { + if (typeof attrs[attribute] === "object") { + attrs[attribute] = attrs[attribute].join("##"); + } + } + } + + $scope.reset = function() { + $scope.group = angular.copy(group); + $scope.changed = false; + }; + + $scope.cancel = function() { + $location.url("/realms/" + realm.realm + "/groups"); + }; + + $scope.addAttribute = function() { + $scope.group.attributes[$scope.newAttribute.key] = $scope.newAttribute.value; + delete $scope.newAttribute; + } + + $scope.removeAttribute = function(key) { + delete $scope.group.attributes[key]; + } +}); + +module.controller('GroupRoleMappingCtrl', function($scope, $http, realm, group, clients, client, Notifications, GroupRealmRoleMapping, + GroupClientRoleMapping, GroupAvailableRealmRoleMapping, GroupAvailableClientRoleMapping, + GroupCompositeRealmRoleMapping, GroupCompositeClientRoleMapping) { + $scope.realm = realm; + $scope.group = group; + $scope.selectedRealmRoles = []; + $scope.selectedRealmMappings = []; + $scope.realmMappings = []; + $scope.clients = clients; + $scope.client = client; + $scope.clientRoles = []; + $scope.clientComposite = []; + $scope.selectedClientRoles = []; + $scope.selectedClientMappings = []; + $scope.clientMappings = []; + $scope.dummymodel = []; + + $scope.realmMappings = GroupRealmRoleMapping.query({realm : realm.realm, groupId : group.id}); + $scope.realmRoles = GroupAvailableRealmRoleMapping.query({realm : realm.realm, groupId : group.id}); + $scope.realmComposite = GroupCompositeRealmRoleMapping.query({realm : realm.realm, groupId : group.id}); + + $scope.addRealmRole = function() { + var roles = $scope.selectedRealmRoles; + $scope.selectedRealmRoles = []; + $http.post(authUrl + '/admin/realms/' + realm.realm + '/groups/' + group.id + '/role-mappings/realm', + roles).then(function() { + $scope.realmMappings = GroupRealmRoleMapping.query({realm : realm.realm, groupId : group.id}); + $scope.realmRoles = GroupAvailableRealmRoleMapping.query({realm : realm.realm, groupId : group.id}); + $scope.realmComposite = GroupCompositeRealmRoleMapping.query({realm : realm.realm, groupId : group.id}); + $scope.selectedRealmMappings = []; + $scope.selectRealmRoles = []; + if ($scope.targetClient) { + console.log('load available'); + $scope.clientComposite = GroupCompositeClientRoleMapping.query({realm : realm.realm, groupId : group.id, client : $scope.targetClient.id}); + $scope.clientRoles = GroupAvailableClientRoleMapping.query({realm : realm.realm, groupId : group.id, client : $scope.targetClient.id}); + $scope.clientMappings = GroupClientRoleMapping.query({realm : realm.realm, groupId : group.id, client : $scope.targetClient.id}); + $scope.selectedClientRoles = []; + $scope.selectedClientMappings = []; + } + Notifications.success("Role mappings updated."); + + }); + }; + + $scope.deleteRealmRole = function() { + $http.delete(authUrl + '/admin/realms/' + realm.realm + '/groups/' + group.id + '/role-mappings/realm', + {data : $scope.selectedRealmMappings, headers : {"content-type" : "application/json"}}).then(function() { + $scope.realmMappings = GroupRealmRoleMapping.query({realm : realm.realm, groupId : group.id}); + $scope.realmRoles = GroupAvailableRealmRoleMapping.query({realm : realm.realm, groupId : group.id}); + $scope.realmComposite = GroupCompositeRealmRoleMapping.query({realm : realm.realm, groupId : group.id}); + $scope.selectedRealmMappings = []; + $scope.selectRealmRoles = []; + if ($scope.targetClient) { + console.log('load available'); + $scope.clientComposite = GroupCompositeClientRoleMapping.query({realm : realm.realm, groupId : group.id, client : $scope.targetClient.id}); + $scope.clientRoles = GroupAvailableClientRoleMapping.query({realm : realm.realm, groupId : group.id, client : $scope.targetClient.id}); + $scope.clientMappings = GroupClientRoleMapping.query({realm : realm.realm, groupId : group.id, client : $scope.targetClient.id}); + $scope.selectedClientRoles = []; + $scope.selectedClientMappings = []; + } + Notifications.success("Role mappings updated."); + }); + }; + + $scope.addClientRole = function() { + $http.post(authUrl + '/admin/realms/' + realm.realm + '/groups/' + group.id + '/role-mappings/clients/' + $scope.targetClient.id, + $scope.selectedClientRoles).then(function() { + $scope.clientMappings = GroupClientRoleMapping.query({realm : realm.realm, groupId : group.id, client : $scope.targetClient.id}); + $scope.clientRoles = GroupAvailableClientRoleMapping.query({realm : realm.realm, groupId : group.id, client : $scope.targetClient.id}); + $scope.clientComposite = GroupCompositeClientRoleMapping.query({realm : realm.realm, groupId : group.id, client : $scope.targetClient.id}); + $scope.selectedClientRoles = []; + $scope.selectedClientMappings = []; + $scope.realmComposite = GroupCompositeRealmRoleMapping.query({realm : realm.realm, groupId : group.id}); + $scope.realmRoles = GroupAvailableRealmRoleMapping.query({realm : realm.realm, groupId : group.id}); + Notifications.success("Role mappings updated."); + }); + }; + + $scope.deleteClientRole = function() { + $http.delete(authUrl + '/admin/realms/' + realm.realm + '/groups/' + group.id + '/role-mappings/clients/' + $scope.targetClient.id, + {data : $scope.selectedClientMappings, headers : {"content-type" : "application/json"}}).then(function() { + $scope.clientMappings = GroupClientRoleMapping.query({realm : realm.realm, groupId : group.id, client : $scope.targetClient.id}); + $scope.clientRoles = GroupAvailableClientRoleMapping.query({realm : realm.realm, groupId : group.id, client : $scope.targetClient.id}); + $scope.clientComposite = GroupCompositeClientRoleMapping.query({realm : realm.realm, groupId : group.id, client : $scope.targetClient.id}); + $scope.selectedClientRoles = []; + $scope.selectedClientMappings = []; + $scope.realmComposite = GroupCompositeRealmRoleMapping.query({realm : realm.realm, groupId : group.id}); + $scope.realmRoles = GroupAvailableRealmRoleMapping.query({realm : realm.realm, groupId : group.id}); + Notifications.success("Role mappings updated."); + }); + }; + + + $scope.changeClient = function() { + if ($scope.targetClient) { + $scope.clientComposite = GroupCompositeClientRoleMapping.query({realm : realm.realm, groupId : group.id, client : $scope.targetClient.id}); + $scope.clientRoles = GroupAvailableClientRoleMapping.query({realm : realm.realm, groupId : group.id, client : $scope.targetClient.id}); + $scope.clientMappings = GroupClientRoleMapping.query({realm : realm.realm, groupId : group.id, client : $scope.targetClient.id}); + } else { + $scope.clientRoles = null; + $scope.clientMappings = null; + $scope.clientComposite = null; + } + $scope.selectedClientRoles = []; + $scope.selectedClientMappings = []; + }; + + + +}); + +module.controller('GroupMembersCtrl', function($scope, realm, group, GroupMembership) { + $scope.realm = realm; + $scope.page = 0; + $scope.group = group; + + $scope.query = { + realm: realm.realm, + groupId: group.id, + max : 5, + first : 0 + }; + + + $scope.firstPage = function() { + $scope.query.first = 0; + $scope.searchQuery(); + }; + + $scope.previousPage = function() { + $scope.query.first -= parseInt($scope.query.max); + if ($scope.query.first < 0) { + $scope.query.first = 0; + } + $scope.searchQuery(); + }; + + $scope.nextPage = function() { + $scope.query.first += parseInt($scope.query.max); + $scope.searchQuery(); + }; + + $scope.searchQuery = function() { + console.log("query.search: " + $scope.query.search); + $scope.searchLoaded = false; + + $scope.users = GroupMembership.query($scope.query, function() { + console.log('search loaded'); + $scope.searchLoaded = true; + $scope.lastSearch = $scope.query.search; + }); + }; + + $scope.searchQuery(); + +}); + +module.controller('DefaultGroupsCtrl', function($scope, $route, realm, groups, DefaultGroups, Notifications) { + $scope.realm = realm; + $scope.groupList = groups; + $scope.selectedGroup = null; + $scope.tree = []; + + DefaultGroups.query({realm: realm.realm}, function(data) { + $scope.defaultGroups = data; + + }); + + $scope.addDefaultGroup = function() { + if (!$scope.tree.currentNode) { + Notifications.error('Please select a group to add'); + return; + } + + DefaultGroups.update({realm: realm.realm, groupId: $scope.tree.currentNode.id}, function() { + Notifications.success('Added default group'); + $route.reload(); + }); + + }; + + $scope.removeDefaultGroup = function() { + DefaultGroups.remove({realm: realm.realm, groupId: $scope.selectedGroup.id}, function() { + Notifications.success('Removed default group'); + $route.reload(); + }); + + }; + + var isLeaf = function(node) { + return node.id !== "realm" && (!node.subGroups || node.subGroups.length === 0); + }; + + $scope.getGroupClass = function(node) { + if (node.id === "realm") { + return 'pficon pficon-users'; + } + if (isLeaf(node)) { + return 'normal'; + } + if (node.subGroups.length && node.collapsed) return 'collapsed'; + if (node.subGroups.length && !node.collapsed) return 'expanded'; + return 'collapsed'; + + }; + + $scope.getSelectedClass = function(node) { + if (node.selected) { + return 'selected'; + } else if ($scope.cutNode && $scope.cutNode.id === node.id) { + return 'cut'; + } + return undefined; + } + +}); + diff --git a/admin/resources/js/controllers/realm.js b/admin/resources/js/controllers/realm.js new file mode 100644 index 0000000..6a438e4 --- /dev/null +++ b/admin/resources/js/controllers/realm.js @@ -0,0 +1,2842 @@ +function getAccess(Auth, Current, role) { + if (!Current.realm)return false; + var realmAccess = Auth.user && Auth.user['realm_access']; + if (realmAccess) { + realmAccess = realmAccess[Current.realm.realm]; + if (realmAccess) { + return realmAccess.indexOf(role) >= 0; + } + } + return false; +} + +function getAccessObject(Auth, Current) { + return { + get createRealm() { + return Auth.user && Auth.user.createRealm; + }, + + get queryUsers() { + return getAccess(Auth, Current, 'query-users') || this.viewUsers; + }, + + get queryGroups() { + return getAccess(Auth, Current, 'query-groups') || this.viewUsers; + }, + + get queryClients() { + return getAccess(Auth, Current, 'query-clients') || this.viewClients; + }, + + get viewRealm() { + return getAccess(Auth, Current, 'view-realm') || getAccess(Auth, Current, 'manage-realm') || this.manageRealm; + }, + + get viewClients() { + return getAccess(Auth, Current, 'view-clients') || getAccess(Auth, Current, 'manage-clients') || this.manageClients; + }, + + get viewUsers() { + return getAccess(Auth, Current, 'view-users') || getAccess(Auth, Current, 'manage-users') || this.manageClients; + }, + + get viewEvents() { + return getAccess(Auth, Current, 'view-events') || getAccess(Auth, Current, 'manage-events') || this.manageClients; + }, + + get viewIdentityProviders() { + return getAccess(Auth, Current, 'view-identity-providers') || getAccess(Auth, Current, 'manage-identity-providers') || this.manageIdentityProviders; + }, + + get viewAuthorization() { + return getAccess(Auth, Current, 'view-authorization') || this.manageAuthorization; + }, + + get manageRealm() { + return getAccess(Auth, Current, 'manage-realm'); + }, + + get manageClients() { + return getAccess(Auth, Current, 'manage-clients'); + }, + + get manageUsers() { + return getAccess(Auth, Current, 'manage-users'); + }, + + get manageEvents() { + return getAccess(Auth, Current, 'manage-events'); + }, + + get manageIdentityProviders() { + return getAccess(Auth, Current, 'manage-identity-providers'); + }, + + get manageAuthorization() { + return getAccess(Auth, Current, 'manage-authorization'); + }, + + get impersonation() { + return getAccess(Auth, Current, 'impersonation'); + } + }; +} + + +module.controller('GlobalCtrl', function($scope, $http, Auth, Current, $location, Notifications, ServerInfo) { + $scope.authUrl = authUrl; + $scope.resourceUrl = resourceUrl; + $scope.auth = Auth; + $scope.serverInfo = ServerInfo.get(); + + $scope.access = getAccessObject(Auth, Current); + + $scope.$watch(function() { + return $location.path(); + }, function() { + $scope.fragment = $location.path(); + $scope.path = $location.path().substring(1).split("/"); + }); +}); + +module.controller('HomeCtrl', function(Realm, Auth, Current, $location) { + + Realm.query(null, function(realms) { + var realm; + if (realms.length == 1) { + realm = realms[0]; + } else if (realms.length == 2) { + if (realms[0].realm == Auth.user.realm) { + realm = realms[1]; + } else if (realms[1].realm == Auth.user.realm) { + realm = realms[0]; + } + } + if (realm) { + Current.realms = realms; + Current.realm = realm; + var access = getAccessObject(Auth, Current); + if (access.viewRealm || access.manageRealm) { + $location.url('/realms/' + realm.realm ); + } else if (access.queryClients) { + $location.url('/realms/' + realm.realm + "/clients"); + } else if (access.viewIdentityProviders) { + $location.url('/realms/' + realm.realm + "/identity-provider-settings"); + } else if (access.queryUsers) { + $location.url('/realms/' + realm.realm + "/users"); + } else if (access.queryGroups) { + $location.url('/realms/' + realm.realm + "/groups"); + } else if (access.viewEvents) { + $location.url('/realms/' + realm.realm + "/events"); + } + } else { + $location.url('/realms'); + } + }); +}); + +module.controller('RealmTabCtrl', function(Dialog, $scope, Current, Realm, Notifications, $location) { + $scope.removeRealm = function() { + Dialog.confirmDelete(Current.realm.realm, 'realm', function() { + Realm.remove({ id : Current.realm.realm }, function() { + Current.realms = Realm.query(); + Notifications.success("The realm has been deleted."); + $location.url("/"); + }); + }); + }; +}); + +module.controller('ServerInfoCtrl', function($scope, ServerInfo) { + ServerInfo.reload(); + + $scope.serverInfo = ServerInfo.get(); + + $scope.$watch($scope.serverInfo, function() { + $scope.providers = []; + for(var spi in $scope.serverInfo.providers) { + var p = angular.copy($scope.serverInfo.providers[spi]); + p.name = spi; + $scope.providers.push(p) + } + }); + + $scope.serverInfoReload = function() { + ServerInfo.reload(); + } +}); + +module.controller('RealmListCtrl', function($scope, Realm, Current) { + $scope.realms = Realm.query(); + Current.realms = $scope.realms; +}); + +module.controller('RealmDropdownCtrl', function($scope, Realm, Current, Auth, $location) { +// Current.realms = Realm.get(); + $scope.current = Current; + + $scope.changeRealm = function(selectedRealm) { + $location.url("/realms/" + selectedRealm); + } +}); + +module.controller('RealmCreateCtrl', function($scope, Current, Realm, $upload, $http, $location, $route, Dialog, Notifications, Auth, $modal) { + console.log('RealmCreateCtrl'); + + Current.realm = null; + + $scope.realm = { + enabled: true + }; + + $scope.changed = false; + $scope.files = []; + + var oldCopy = angular.copy($scope.realm); + + $scope.importFile = function($fileContent){ + $scope.realm = angular.copy(JSON.parse($fileContent)); + $scope.importing = true; + }; + + $scope.viewImportDetails = function() { + $modal.open({ + templateUrl: resourceUrl + '/partials/modal/view-object.html', + controller: 'ObjectModalCtrl', + resolve: { + object: function () { + return $scope.realm; + } + } + }) + }; + + $scope.$watch('realm', function() { + if (!angular.equals($scope.realm, oldCopy)) { + $scope.changed = true; + } + }, true); + + $scope.$watch('realm.realm', function() { + $scope.realm.id = $scope.realm.realm; + }, true); + + $scope.save = function() { + var realmCopy = angular.copy($scope.realm); + Realm.create(realmCopy, function() { + Notifications.success("The realm has been created."); + + Auth.refreshPermissions(function() { + $scope.$apply(function() { + $location.url("/realms/" + realmCopy.realm); + }); + }); + }); + }; + + $scope.cancel = function() { + $location.url("/"); + }; + + $scope.reset = function() { + $route.reload(); + } +}); + +module.controller('ObjectModalCtrl', function($scope, object) { + $scope.object = object; +}); + +module.controller('RealmDetailCtrl', function($scope, Current, Realm, realm, serverInfo, $http, $location, $window, Dialog, Notifications, Auth) { + $scope.createRealm = !realm.realm; + $scope.serverInfo = serverInfo; + $scope.realmName = realm.realm; + $scope.disableRename = realm.realm == masterRealm; + + if (Current.realm == null || Current.realm.realm != realm.realm) { + for (var i = 0; i < Current.realms.length; i++) { + if (realm.realm == Current.realms[i].realm) { + Current.realm = Current.realms[i]; + break; + } + } + } + for (var i = 0; i < Current.realms.length; i++) { + if (Current.realms[i].realm == realm.realm) { + Current.realm = Current.realms[i]; + } + } + $scope.realm = angular.copy(realm); + + var oldCopy = angular.copy($scope.realm); + + $scope.changed = $scope.create; + + $scope.$watch('realm', function() { + if (!angular.equals($scope.realm, oldCopy)) { + $scope.changed = true; + } + }, true); + $scope.$watch('realmName', function() { + if (!angular.equals($scope.realmName, oldCopy.realm)) { + $scope.changed = true; + } + }, true); + + $scope.save = function() { + var realmCopy = angular.copy($scope.realm); + realmCopy.realm = $scope.realmName; + $scope.changed = false; + var nameChanged = !angular.equals($scope.realmName, oldCopy.realm); + var oldName = oldCopy.realm; + Realm.update({ id : oldCopy.realm}, realmCopy, function () { + var data = Realm.query(function () { + Current.realms = data; + for (var i = 0; i < Current.realms.length; i++) { + if (Current.realms[i].realm == realmCopy.realm) { + Current.realm = Current.realms[i]; + oldCopy = angular.copy($scope.realm); + } + } + }); + + if (nameChanged) { + console.debug(Auth); + console.debug(Auth.authz.tokenParsed.iss); + + if (Auth.authz.tokenParsed.iss.endsWith(masterRealm)) { + Auth.refreshPermissions(function () { + Auth.refreshPermissions(function () { + Notifications.success("Your changes have been saved to the realm."); + $scope.$apply(function () { + $location.url("/realms/" + realmCopy.realm); + }); + }); + }); + } else { + delete Auth.authz.token; + delete Auth.authz.refreshToken; + + var newLocation = $window.location.href.replace('/' + oldName + '/', '/' + realmCopy.realm + '/') + .replace('/realms/' + oldName, '/realms/' + realmCopy.realm); + window.location.replace(newLocation); + } + } else { + $location.url("/realms/" + realmCopy.realm); + Notifications.success("Your changes have been saved to the realm."); + } + }); + }; + + $scope.reset = function() { + $scope.realm = angular.copy(oldCopy); + $scope.changed = false; + }; + + $scope.cancel = function() { + window.history.back(); + }; +}); + +function genericRealmUpdate($scope, Current, Realm, realm, serverInfo, $http, $location, Dialog, Notifications, url) { + $scope.realm = angular.copy(realm); + $scope.serverInfo = serverInfo; + $scope.registrationAllowed = $scope.realm.registrationAllowed; + + var oldCopy = angular.copy($scope.realm); + + $scope.changed = false; + + $scope.$watch('realm', function() { + if (!angular.equals($scope.realm, oldCopy)) { + $scope.changed = true; + } + }, true); + + $scope.save = function() { + var realmCopy = angular.copy($scope.realm); + console.log('updating realm...'); + $scope.changed = false; + console.log('oldCopy.realm - ' + oldCopy.realm); + Realm.update({ id : oldCopy.realm}, realmCopy, function () { + var data = Realm.query(function () { + Current.realms = data; + for (var i = 0; i < Current.realms.length; i++) { + if (Current.realms[i].realm == realmCopy.realm) { + Current.realm = Current.realms[i]; + oldCopy = angular.copy($scope.realm); + } + } + }); + $location.url(url); + Notifications.success("Your changes have been saved to the realm."); + $scope.registrationAllowed = $scope.realm.registrationAllowed; + }); + }; + + $scope.reset = function() { + $scope.realm = angular.copy(oldCopy); + $scope.changed = false; + }; + + $scope.cancel = function() { + //$location.url("/realms"); + window.history.back(); + }; + +} + +module.controller('DefenseHeadersCtrl', function($scope, Current, Realm, realm, serverInfo, $http, $location, Dialog, Notifications) { + genericRealmUpdate($scope, Current, Realm, realm, serverInfo, $http, $location, Dialog, Notifications, "/realms/" + realm.realm + "/defense/headers"); +}); + +module.controller('RealmLoginSettingsCtrl', function($scope, Current, Realm, realm, serverInfo, $http, $location, Dialog, Notifications) { + // KEYCLOAK-5474: Make sure duplicateEmailsAllowed is disabled if loginWithEmailAllowed + $scope.$watch('realm.loginWithEmailAllowed', function() { + if ($scope.realm.loginWithEmailAllowed) { + $scope.realm.duplicateEmailsAllowed = false; + } + }); + + genericRealmUpdate($scope, Current, Realm, realm, serverInfo, $http, $location, Dialog, Notifications, "/realms/" + realm.realm + "/login-settings"); +}); + +module.controller('RealmOtpPolicyCtrl', function($scope, Current, Realm, realm, serverInfo, $http, $location, Dialog, Notifications) { + $scope.optionsDigits = [ 6, 8 ]; + + genericRealmUpdate($scope, Current, Realm, realm, serverInfo, $http, $location, Dialog, Notifications, "/realms/" + realm.realm + "/authentication/otp-policy"); +}); + + +module.controller('RealmThemeCtrl', function($scope, Current, Realm, realm, serverInfo, $http, $location, Dialog, Notifications) { + genericRealmUpdate($scope, Current, Realm, realm, serverInfo, $http, $location, Dialog, Notifications, "/realms/" + realm.realm + "/theme-settings"); + + $scope.supportedLocalesOptions = { + 'multiple' : true, + 'simple_tags' : true, + 'tags' : [] + }; + + updateSupported(); + + function localeForTheme(type, name) { + name = name || 'base'; + for (var i = 0; i < serverInfo.themes[type].length; i++) { + if (serverInfo.themes[type][i].name == name) { + return serverInfo.themes[type][i].locales || []; + } + } + return []; + } + + function updateSupported() { + if ($scope.realm.internationalizationEnabled) { + var accountLocales = localeForTheme('account', $scope.realm.accountTheme); + var loginLocales = localeForTheme('login', $scope.realm.loginTheme); + var emailLocales = localeForTheme('email', $scope.realm.emailTheme); + + var supportedLocales = []; + for (var i = 0; i < accountLocales.length; i++) { + var l = accountLocales[i]; + if (loginLocales.indexOf(l) >= 0 && emailLocales.indexOf(l) >= 0) { + supportedLocales.push(l); + } + } + + $scope.supportedLocalesOptions.tags = supportedLocales; + + if (!$scope.realm.supportedLocales) { + $scope.realm.supportedLocales = supportedLocales; + } else { + for (var i = 0; i < $scope.realm.supportedLocales.length; i++) { + if (supportedLocales.indexOf($scope.realm.supportedLocales[i]) == -1) { + $scope.realm.supportedLocales = supportedLocales; + } + } + } + + if (!$scope.realm.defaultLocale || supportedLocales.indexOf($scope.realm.defaultLocale) == -1) { + $scope.realm.defaultLocale = 'en'; + } + } + } + + $scope.$watch('realm.loginTheme', updateSupported); + $scope.$watch('realm.accountTheme', updateSupported); + $scope.$watch('realm.emailTheme', updateSupported); + $scope.$watch('realm.internationalizationEnabled', updateSupported); +}); + +module.controller('RealmCacheCtrl', function($scope, realm, RealmClearUserCache, RealmClearRealmCache, RealmClearKeysCache, Notifications) { + $scope.realm = angular.copy(realm); + + $scope.clearUserCache = function() { + RealmClearUserCache.save({ realm: realm.realm}, function () { + Notifications.success("User cache cleared"); + }); + } + + $scope.clearRealmCache = function() { + RealmClearRealmCache.save({ realm: realm.realm}, function () { + Notifications.success("Realm cache cleared"); + }); + } + + $scope.clearKeysCache = function() { + RealmClearKeysCache.save({ realm: realm.realm}, function () { + Notifications.success("Public keys cache cleared"); + }); + } + + +}); + +module.controller('RealmPasswordPolicyCtrl', function($scope, Realm, realm, $http, $location, $route, Dialog, Notifications, serverInfo) { + var parse = function(policyString) { + var policies = []; + if (!policyString || policyString.length == 0){ + return policies; + } + + var policyArray = policyString.split(" and "); + + for (var i = 0; i < policyArray.length; i ++){ + var policyToken = policyArray[i]; + var id; + var value; + if (policyToken.indexOf('(') == -1) { + id = policyToken.trim(); + value = null; + } else { + id = policyToken.substring(0, policyToken.indexOf('(')); + value = policyToken.substring(policyToken.indexOf('(') + 1, policyToken.lastIndexOf(')')).trim(); + } + + for (var j = 0; j < serverInfo.passwordPolicies.length; j++) { + if (serverInfo.passwordPolicies[j].id == id) { + // clone + var p = JSON.parse(JSON.stringify(serverInfo.passwordPolicies[j])); + + p.value = value && value || p.defaultValue; + policies.push(p); + } + } + } + return policies; + }; + + var toString = function(policies) { + if (!policies || policies.length == 0) { + return ""; + } + var policyString = ""; + for (var i = 0; i < policies.length; i++) { + policyString += policies[i].id + '(' + policies[i].value + ')'; + if (i != policies.length - 1) { + policyString += ' and '; + } + } + return policyString; + } + + $scope.realm = realm; + $scope.serverInfo = serverInfo; + + $scope.changed = false; + console.log(JSON.stringify(parse(realm.passwordPolicy))); + $scope.policy = parse(realm.passwordPolicy); + var oldCopy = angular.copy($scope.policy); + + $scope.$watch('policy', function() { + $scope.changed = ! angular.equals($scope.policy, oldCopy); + }, true); + + $scope.addPolicy = function(policy){ + policy.value = policy.defaultValue; + if (!$scope.policy) { + $scope.policy = []; + } + $scope.policy.push(policy); + } + + $scope.removePolicy = function(index){ + $scope.policy.splice(index, 1); + } + + $scope.save = function() { + $scope.realm.passwordPolicy = toString($scope.policy); + console.log($scope.realm.passwordPolicy); + + Realm.update($scope.realm, function () { + $route.reload(); + Notifications.success("Your changes have been saved to the realm."); + }); + }; + + $scope.reset = function() { + $route.reload(); + }; +}); + +module.controller('RealmDefaultRolesCtrl', function ($scope, Realm, realm, clients, roles, Notifications, ClientRole, Client) { + + console.log('RealmDefaultRolesCtrl'); + + $scope.realm = realm; + + $scope.availableRealmRoles = []; + $scope.selectedRealmRoles = []; + $scope.selectedRealmDefRoles = []; + + $scope.clients = angular.copy(clients); + for (var i = 0; i < clients.length; i++) { + if (clients[i].name == 'account') { + $scope.client = $scope.clients[i]; + break; + } + } + + $scope.availableClientRoles = []; + $scope.selectedClientRoles = []; + $scope.selectedClientDefRoles = []; + + if (!$scope.realm.hasOwnProperty('defaultRoles') || $scope.realm.defaultRoles === null) { + $scope.realm.defaultRoles = []; + } + + // Populate available roles. Available roles are neither already assigned + for (var i = 0; i < roles.length; i++) { + var item = roles[i].name; + + if ($scope.realm.defaultRoles.indexOf(item) < 0) { + $scope.availableRealmRoles.push(item); + } + } + + $scope.addRealmDefaultRole = function () { + + // Remove selected roles from the Available roles and add them to realm default roles (move from left to right). + for (var i = 0; i < $scope.selectedRealmRoles.length; i++) { + var selectedRole = $scope.selectedRealmRoles[i]; + + $scope.realm.defaultRoles.push(selectedRole); + + var index = $scope.availableRealmRoles.indexOf(selectedRole); + if (index > -1) { + $scope.availableRealmRoles.splice(index, 1); + } + } + + $scope.selectedRealmRoles = []; + + // Update/save the realm with new default roles. + Realm.update($scope.realm, function () { + Notifications.success("Realm default roles updated."); + }); + }; + + $scope.deleteRealmDefaultRole = function () { + + // Remove selected roles from the realm default roles and add them to available roles (move from right to left). + for (var i = 0; i < $scope.selectedRealmDefRoles.length; i++) { + $scope.availableRealmRoles.push($scope.selectedRealmDefRoles[i]); + + var index = $scope.realm.defaultRoles.indexOf($scope.selectedRealmDefRoles[i]); + if (index > -1) { + $scope.realm.defaultRoles.splice(index, 1); + } + } + + $scope.selectedRealmDefRoles = []; + + // Update/save the realm with new default roles. + //var realmCopy = angular.copy($scope.realm); + Realm.update($scope.realm, function () { + Notifications.success("Realm default roles updated."); + }); + }; + + $scope.changeClient = function () { + + $scope.selectedClientRoles = []; + $scope.selectedClientDefRoles = []; + + // Populate available roles for selected client + if ($scope.client) { + var appDefaultRoles = ClientRole.query({realm: $scope.realm.realm, client: $scope.client.id}, function () { + + if (!$scope.client.hasOwnProperty('defaultRoles') || $scope.client.defaultRoles === null) { + $scope.client.defaultRoles = []; + } + + $scope.availableClientRoles = []; + + for (var i = 0; i < appDefaultRoles.length; i++) { + var roleName = appDefaultRoles[i].name; + if ($scope.client.defaultRoles.indexOf(roleName) < 0) { + $scope.availableClientRoles.push(roleName); + } + } + }); + } else { + $scope.availableClientRoles = null; + } + }; + + $scope.addClientDefaultRole = function () { + + // Remove selected roles from the app available roles and add them to app default roles (move from left to right). + for (var i = 0; i < $scope.selectedClientRoles.length; i++) { + var role = $scope.selectedClientRoles[i]; + + var idx = $scope.client.defaultRoles.indexOf(role); + if (idx < 0) { + $scope.client.defaultRoles.push(role); + } + + idx = $scope.availableClientRoles.indexOf(role); + + if (idx != -1) { + $scope.availableClientRoles.splice(idx, 1); + } + } + + $scope.selectedClientRoles = []; + + // Update/save the selected client with new default roles. + Client.update({ + realm: $scope.realm.realm, + client: $scope.client.id + }, $scope.client, function () { + Notifications.success("Your changes have been saved to the client."); + }); + }; + + $scope.rmClientDefaultRole = function () { + + // Remove selected roles from the app default roles and add them to app available roles (move from right to left). + for (var i = 0; i < $scope.selectedClientDefRoles.length; i++) { + var role = $scope.selectedClientDefRoles[i]; + var idx = $scope.client.defaultRoles.indexOf(role); + if (idx != -1) { + $scope.client.defaultRoles.splice(idx, 1); + } + idx = $scope.availableClientRoles.indexOf(role); + if (idx < 0) { + $scope.availableClientRoles.push(role); + } + } + + $scope.selectedClientDefRoles = []; + + // Update/save the selected client with new default roles. + Client.update({ + realm: $scope.realm.realm, + client: $scope.client.id + }, $scope.client, function () { + Notifications.success("Your changes have been saved to the client."); + }); + }; + +}); + + + +module.controller('IdentityProviderTabCtrl', function(Dialog, $scope, Current, Notifications, $location) { + $scope.removeIdentityProvider = function() { + Dialog.confirmDelete($scope.identityProvider.alias, 'provider', function() { + $scope.identityProvider.$remove({ + realm : Current.realm.realm, + alias : $scope.identityProvider.alias + }, function() { + $location.url("/realms/" + Current.realm.realm + "/identity-provider-settings"); + Notifications.success("The identity provider has been deleted."); + }); + }); + }; +}); + +module.controller('RealmIdentityProviderCtrl', function($scope, $filter, $upload, $http, $route, realm, instance, providerFactory, IdentityProvider, serverInfo, authFlows, $location, Notifications, Dialog) { + console.log('RealmIdentityProviderCtrl'); + + $scope.realm = angular.copy(realm); + + $scope.initSamlProvider = function() { + $scope.nameIdFormats = [ + /* + { + format: "urn:oasis:names:tc:SAML:2.0:nameid-format:transient", + name: "Transient" + }, + */ + { + format: "urn:oasis:names:tc:SAML:2.0:nameid-format:persistent", + name: "Persistent" + + }, + { + format: "urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress", + name: "Email" + + }, + { + format: "urn:oasis:names:tc:SAML:2.0:nameid-format:kerberos", + name: "Kerberos" + + }, + { + format: "urn:oasis:names:tc:SAML:1.1:nameid-format:X509SubjectName", + name: "X.509 Subject Name" + + }, + { + format: "urn:oasis:names:tc:SAML:1.1:nameid-format:WindowsDomainQualifiedName", + name: "Windows Domain Qualified Name" + + }, + { + format: "urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified", + name: "Unspecified" + + } + ]; + $scope.signatureAlgorithms = [ + "RSA_SHA1", + "RSA_SHA256", + "RSA_SHA512", + "DSA_SHA1" + ]; + $scope.xmlKeyNameTranformers = [ + "NONE", + "KEY_ID", + "CERT_SUBJECT" + ]; + if (instance && instance.alias) { + + } else { + $scope.identityProvider.config.nameIDPolicyFormat = $scope.nameIdFormats[0].format; + $scope.identityProvider.config.signatureAlgorithm = $scope.signatureAlgorithms[1]; + $scope.identityProvider.config.samlXmlKeyNameTranformer = $scope.xmlKeyNameTranformers[1]; + } + } + + $scope.hidePassword = true; + $scope.fromUrl = { + data: '' + }; + + if (instance && instance.alias) { + $scope.identityProvider = angular.copy(instance); + $scope.newIdentityProvider = false; + for (var i in serverInfo.identityProviders) { + var provider = serverInfo.identityProviders[i]; + + if (provider.id == instance.providerId) { + $scope.provider = provider; + } + } + } else { + $scope.identityProvider = {}; + $scope.identityProvider.config = {}; + $scope.identityProvider.alias = providerFactory.id; + $scope.identityProvider.providerId = providerFactory.id; + + $scope.identityProvider.enabled = true; + $scope.identityProvider.authenticateByDefault = false; + $scope.identityProvider.firstBrokerLoginFlowAlias = 'first broker login'; + $scope.identityProvider.config.useJwksUrl = 'true'; + $scope.newIdentityProvider = true; + } + + $scope.changed = $scope.newIdentityProvider; + + $scope.$watch('identityProvider', function() { + if (!angular.equals($scope.identityProvider, instance)) { + $scope.changed = true; + } + }, true); + + + $scope.serverInfo = serverInfo; + + $scope.allProviders = angular.copy(serverInfo.identityProviders); + + $scope.configuredProviders = angular.copy(realm.identityProviders); + + $scope.authFlows = []; + for (var i=0 ; i 0) { + $scope.importUrl = true; + } else{ + $scope.importUrl = false; + } + }); + + $scope.$watch('configuredProviders', function(configuredProviders) { + if (configuredProviders) { + $scope.configuredProviders = angular.copy(configuredProviders); + + for (var j = 0; j < configuredProviders.length; j++) { + var configProvidedId = configuredProviders[j].providerId; + + for (var i in $scope.allProviders) { + var provider = $scope.allProviders[i]; + if (provider.id == configProvidedId) { + configuredProviders[j].provider = provider; + } + } + } + $scope.configuredProviders = angular.copy(configuredProviders); + } + }, true); + + $scope.callbackUrl = encodeURI($location.absUrl().replace(/\/admin.*/, "/realms/") + realm.realm + "/broker/") ; + + $scope.addProvider = function(provider) { + $location.url("/create/identity-provider/" + realm.realm + "/" + provider.id); + }; + + $scope.save = function() { + if ($scope.newIdentityProvider) { + if (!$scope.identityProvider.alias) { + Notifications.error("You must specify an alias"); + return; + } + IdentityProvider.save({ + realm: $scope.realm.realm, alias: '' + }, $scope.identityProvider, function () { + $location.url("/realms/" + realm.realm + "/identity-provider-settings/provider/" + $scope.identityProvider.providerId + "/" + $scope.identityProvider.alias); + Notifications.success("The " + $scope.identityProvider.alias + " provider has been created."); + }); + } else { + IdentityProvider.update({ + realm: $scope.realm.realm, + alias: $scope.identityProvider.alias + }, $scope.identityProvider, function () { + $route.reload(); + Notifications.success("The " + $scope.identityProvider.alias + " provider has been updated."); + }); + } + }; + + $scope.cancel = function() { + if ($scope.newIdentityProvider) { + $location.url("/realms/" + realm.realm + "/identity-provider-settings"); + } else { + $route.reload(); + } + }; + + + $scope.reset = function() { + $scope.identityProvider = {}; + $scope.configuredProviders = angular.copy($scope.realm.identityProviders); + }; + + $scope.showPassword = function(flag) { + $scope.hidePassword = flag; + }; + + $scope.removeIdentityProvider = function(identityProvider) { + Dialog.confirmDelete(identityProvider.alias, 'provider', function() { + IdentityProvider.remove({ + realm : realm.realm, + alias : identityProvider.alias + }, function() { + $route.reload(); + Notifications.success("The identity provider has been deleted."); + }); + }); + }; + +}); + +module.controller('RealmIdentityProviderExportCtrl', function(realm, identityProvider, $scope, $http, IdentityProviderExport) { + $scope.realm = realm; + $scope.identityProvider = identityProvider; + $scope.download = null; + $scope.exported = ""; + $scope.exportedType = ""; + + var url = IdentityProviderExport.url({realm: realm.realm, alias: identityProvider.alias}) ; + $http.get(url).then(function(response) { + $scope.exportedType = response.headers('Content-Type'); + $scope.exported = response.data; + }); + + $scope.download = function() { + var suffix = "txt"; + if ($scope.exportedType == 'application/xml') { + suffix = 'xml'; + } else if ($scope.exportedType == 'application/json') { + suffix = 'json'; + } + saveAs(new Blob([$scope.exported], { type: $scope.exportedType }), 'keycloak.' + suffix); + } +}); + +module.controller('RealmTokenDetailCtrl', function($scope, Realm, realm, $http, $location, $route, Dialog, Notifications, TimeUnit, TimeUnit2, serverInfo) { + $scope.realm = realm; + $scope.serverInfo = serverInfo; + $scope.actionTokenProviders = $scope.serverInfo.providers.actionTokenHandler.providers; + + $scope.realm.accessTokenLifespan = TimeUnit2.asUnit(realm.accessTokenLifespan); + $scope.realm.accessTokenLifespanForImplicitFlow = TimeUnit2.asUnit(realm.accessTokenLifespanForImplicitFlow); + $scope.realm.ssoSessionIdleTimeout = TimeUnit2.asUnit(realm.ssoSessionIdleTimeout); + $scope.realm.ssoSessionMaxLifespan = TimeUnit2.asUnit(realm.ssoSessionMaxLifespan); + $scope.realm.offlineSessionIdleTimeout = TimeUnit2.asUnit(realm.offlineSessionIdleTimeout); + $scope.realm.accessCodeLifespan = TimeUnit2.asUnit(realm.accessCodeLifespan); + $scope.realm.accessCodeLifespanLogin = TimeUnit2.asUnit(realm.accessCodeLifespanLogin); + $scope.realm.accessCodeLifespanUserAction = TimeUnit2.asUnit(realm.accessCodeLifespanUserAction); + $scope.realm.actionTokenGeneratedByAdminLifespan = TimeUnit2.asUnit(realm.actionTokenGeneratedByAdminLifespan); + $scope.realm.actionTokenGeneratedByUserLifespan = TimeUnit2.asUnit(realm.actionTokenGeneratedByUserLifespan); + $scope.realm.attributes = realm.attributes + + var oldCopy = angular.copy($scope.realm); + $scope.changed = false; + + $scope.$watch('realm', function() { + if (!angular.equals($scope.realm, oldCopy)) { + $scope.changed = true; + } + }, true); + + $scope.$watch('actionLifespanId', function () { + $scope.actionTokenAttribute = TimeUnit2.asUnit($scope.realm.attributes['actionTokenGeneratedByUserLifespan.' + $scope.actionLifespanId]); + }, true); + + $scope.$watch('actionTokenAttribute', function () { + if ($scope.actionLifespanId != null && $scope.actionTokenAttribute != null) { + $scope.changed = true; + $scope.realm.attributes['actionTokenGeneratedByUserLifespan.' + $scope.actionLifespanId] = $scope.actionTokenAttribute.toSeconds(); + } + }, true); + + $scope.changeRevokeRefreshToken = function() { + + }; + + $scope.save = function() { + $scope.realm.accessTokenLifespan = $scope.realm.accessTokenLifespan.toSeconds(); + $scope.realm.accessTokenLifespanForImplicitFlow = $scope.realm.accessTokenLifespanForImplicitFlow.toSeconds(); + $scope.realm.ssoSessionIdleTimeout = $scope.realm.ssoSessionIdleTimeout.toSeconds(); + $scope.realm.ssoSessionMaxLifespan = $scope.realm.ssoSessionMaxLifespan.toSeconds(); + $scope.realm.offlineSessionIdleTimeout = $scope.realm.offlineSessionIdleTimeout.toSeconds(); + $scope.realm.accessCodeLifespan = $scope.realm.accessCodeLifespan.toSeconds(); + $scope.realm.accessCodeLifespanUserAction = $scope.realm.accessCodeLifespanUserAction.toSeconds(); + $scope.realm.accessCodeLifespanLogin = $scope.realm.accessCodeLifespanLogin.toSeconds(); + $scope.realm.actionTokenGeneratedByAdminLifespan = $scope.realm.actionTokenGeneratedByAdminLifespan.toSeconds(); + $scope.realm.actionTokenGeneratedByUserLifespan = $scope.realm.actionTokenGeneratedByUserLifespan.toSeconds(); + + Realm.update($scope.realm, function () { + $route.reload(); + Notifications.success("The changes have been saved to the realm."); + }); + }; + + $scope.resetToDefaultToken = function (actionTokenId) { + $scope.actionTokenAttribute = {}; + delete $scope.realm.attributes['actionTokenGeneratedByUserLifespan.' + $scope.actionLifespanId]; + //Only for UI effects, resets to the original state + $scope.actionTokenAttribute.unit = 'Minutes'; + } + + $scope.reset = function() { + $route.reload(); + }; +}); + +module.controller('ViewKeyCtrl', function($scope, key) { + $scope.key = key; +}); + +module.controller('RealmKeysCtrl', function($scope, Realm, realm, $http, $route, $location, Dialog, Notifications, serverInfo, keys, Components, $modal) { + $scope.realm = angular.copy(realm); + $scope.keys = keys.keys; + $scope.active = {}; + + Components.query({realm: realm.realm, + parent: realm.id, + type: 'org.keycloak.keys.KeyProvider' + }, function(data) { + for (var i = 0; i < keys.keys.length; i++) { + for (var j = 0; j < data.length; j++) { + if (keys.keys[i].providerId == data[j].id) { + keys.keys[i].provider = data[j]; + } + } + } + + for (var t in keys.active) { + for (var i = 0; i < keys.keys.length; i++) { + if (keys.active[t] == keys.keys[i].kid) { + $scope.active[t] = keys.keys[i]; + } + } + } + }); + + $scope.viewKey = function(key) { + $modal.open({ + templateUrl: resourceUrl + '/partials/modal/view-key.html', + controller: 'ViewKeyCtrl', + resolve: { + key: function () { + return key; + } + } + }) + } +}); + +module.controller('RealmKeysProvidersCtrl', function($scope, Realm, realm, $http, $route, $location, Dialog, Notifications, serverInfo, Components, $modal) { + $scope.realm = angular.copy(realm); + $scope.enableUpload = false; + + $scope.providers = serverInfo.componentTypes['org.keycloak.keys.KeyProvider']; + + Components.query({realm: realm.realm, + parent: realm.id, + type: 'org.keycloak.keys.KeyProvider' + }, function(data) { + $scope.instances = data; + + for (var i = 0; i < $scope.instances.length; i++) { + for (var j = 0; j < $scope.providers.length; j++) { + if ($scope.providers[j].id === $scope.instances[i].providerId) { + $scope.instances[i].provider = $scope.providers[j]; + } + } + } + }); + + $scope.addProvider = function(provider) { + $location.url("/create/keys/" + realm.realm + "/providers/" + provider.id); + }; + + $scope.removeInstance = function(instance) { + Dialog.confirmDelete(instance.name, 'key provider', function() { + Components.remove({ + realm : realm.realm, + componentId : instance.id + }, function() { + $route.reload(); + Notifications.success("The provider has been deleted."); + }); + }); + }; +}); + +module.controller('GenericKeystoreCtrl', function($scope, $location, Notifications, $route, Dialog, realm, serverInfo, instance, providerId, Components) { + $scope.create = !instance.providerId; + $scope.realm = realm; + + var providers = serverInfo.componentTypes['org.keycloak.keys.KeyProvider']; + var providerFactory = null; + for (var i = 0; i < providers.length; i++) { + var p = providers[i]; + if (p.id == providerId) { + $scope.providerFactory = p; + providerFactory = p; + break; + } + } + + if ($scope.create) { + $scope.instance = { + name: providerFactory.id, + providerId: providerFactory.id, + providerType: 'org.keycloak.keys.KeyProvider', + parentId: realm.id, + config: { + 'priority': ["0"] + } + } + } else { + $scope.instance = angular.copy(instance); + } + + if (providerFactory.properties) { + for (var i = 0; i < providerFactory.properties.length; i++) { + var configProperty = providerFactory.properties[i]; + if (!$scope.instance.config[configProperty.name]) { + if (configProperty.defaultValue) { + $scope.instance.config[configProperty.name] = [configProperty.defaultValue]; + if (!$scope.create) { + instance.config[configProperty.name] = [configProperty.defaultValue]; + } + } else { + $scope.instance.config[configProperty.name] = ['']; + if (!$scope.create) { + instance.config[configProperty.name] = [configProperty.defaultValue]; + } + } + } + } + } + + $scope.$watch('instance', function() { + if (!angular.equals($scope.instance, instance)) { + $scope.changed = true; + } + + }, true); + + $scope.save = function() { + $scope.changed = false; + if ($scope.create) { + Components.save({realm: realm.realm}, $scope.instance, function (data, headers) { + var l = headers().location; + var id = l.substring(l.lastIndexOf("/") + 1); + + $location.url("/realms/" + realm.realm + "/keys/providers/" + $scope.instance.providerId + "/" + id); + Notifications.success("The provider has been created."); + }); + } else { + Components.update({realm: realm.realm, + componentId: instance.id + }, + $scope.instance, function () { + $route.reload(); + Notifications.success("The provider has been updated."); + }); + } + }; + + $scope.reset = function() { + $route.reload(); + }; + + $scope.cancel = function() { + if ($scope.create) { + $location.url("/realms/" + realm.realm + "/keys"); + } else { + $route.reload(); + } + }; +}); + +module.controller('RealmSessionStatsCtrl', function($scope, realm, stats, RealmClientSessionStats, RealmLogoutAll, Notifications) { + $scope.realm = realm; + $scope.stats = stats; + + $scope.logoutAll = function() { + RealmLogoutAll.save({realm : realm.realm}, function (globalReqResult) { + var successCount = globalReqResult.successRequests ? globalReqResult.successRequests.length : 0; + var failedCount = globalReqResult.failedRequests ? globalReqResult.failedRequests.length : 0; + + if (failedCount > 0) { + var msgStart = successCount>0 ? 'Successfully logout all users under: ' + globalReqResult.successRequests + ' . ' : ''; + Notifications.error(msgStart + 'Failed to logout users under: ' + globalReqResult.failedRequests + '. Verify availability of failed hosts and try again'); + } else { + window.location.reload(); + } + }); + }; +}); + + +module.controller('RealmRevocationCtrl', function($scope, Realm, RealmPushRevocation, realm, $http, $location, Dialog, Notifications) { + $scope.realm = angular.copy(realm); + + var setNotBefore = function() { + if ($scope.realm.notBefore == 0) { + $scope.notBefore = "None"; + } else { + $scope.notBefore = new Date($scope.realm.notBefore * 1000); + } + }; + + setNotBefore(); + + var reset = function() { + Realm.get({ id : realm.realm }, function(updated) { + $scope.realm = updated; + setNotBefore(); + }) + + }; + + $scope.clear = function() { + Realm.update({ realm: realm.realm, notBefore : 0 }, function () { + $scope.notBefore = "None"; + Notifications.success('Not Before cleared for realm.'); + reset(); + }); + } + $scope.setNotBeforeNow = function() { + Realm.update({ realm: realm.realm, notBefore : new Date().getTime()/1000}, function () { + Notifications.success('Not Before set for realm.'); + reset(); + }); + } + $scope.pushRevocation = function() { + RealmPushRevocation.save({ realm: realm.realm}, function (globalReqResult) { + var successCount = globalReqResult.successRequests ? globalReqResult.successRequests.length : 0; + var failedCount = globalReqResult.failedRequests ? globalReqResult.failedRequests.length : 0; + + if (successCount==0 && failedCount==0) { + Notifications.warn('No push sent. No admin URI configured or no registered cluster nodes available'); + } else if (failedCount > 0) { + var msgStart = successCount>0 ? 'Successfully push notBefore to: ' + globalReqResult.successRequests + ' . ' : ''; + Notifications.error(msgStart + 'Failed to push notBefore to: ' + globalReqResult.failedRequests + '. Verify availability of failed hosts and try again'); + } else { + Notifications.success('Successfully push notBefore to all configured clients'); + } + }); + } + +}); + + +module.controller('RoleTabCtrl', function(Dialog, $scope, Current, Notifications, $location) { + $scope.removeRole = function() { + Dialog.confirmDelete($scope.role.name, 'role', function() { + RoleById.remove({ + realm: realm.realm, + role: $scope.role.id + }, function () { + $route.reload(); + Notifications.success("The role has been deleted."); + }); + }); + }; +}); + + +module.controller('RoleListCtrl', function($scope, $route, Dialog, Notifications, realm, roles, RoleById, filterFilter) { + $scope.realm = realm; + $scope.roles = roles; + $scope.currentPage = 1; + $scope.currentPageInput = 1; + $scope.pageSize = 20; + $scope.numberOfPages = Math.ceil($scope.roles.length/$scope.pageSize); + + $scope.$watch('searchQuery', function (newVal, oldVal) { + $scope.filtered = filterFilter($scope.roles, {name: newVal}); + $scope.totalItems = $scope.filtered.length; + $scope.numberOfPages = Math.ceil($scope.totalItems/$scope.pageSize); + $scope.currentPage = 1; + $scope.currentPageInput = 1; + }, true); + + $scope.removeRole = function (role) { + Dialog.confirmDelete(role.name, 'role', function () { + RoleById.remove({ + realm: realm.realm, + role: role.id + }, function () { + $route.reload(); + Notifications.success("The role has been deleted."); + }); + }); + }; +}); + + +module.controller('RoleDetailCtrl', function($scope, realm, role, roles, clients, + Role, ClientRole, RoleById, RoleRealmComposites, RoleClientComposites, + $http, $location, Dialog, Notifications, RealmRoleRemover) { + $scope.realm = realm; + $scope.role = angular.copy(role); + $scope.create = !role.name; + + $scope.changed = $scope.create; + + $scope.save = function() { + console.log('save'); + if ($scope.create) { + Role.save({ + realm: realm.realm + }, $scope.role, function (data, headers) { + $scope.changed = false; + role = angular.copy($scope.role); + + Role.get({ realm: realm.realm, role: role.name }, function(role) { + var id = role.id; + $location.url("/realms/" + realm.realm + "/roles/" + id); + Notifications.success("The role has been created."); + }); + }); + } else { + $scope.update(); + } + }; + + $scope.remove = function() { + RealmRoleRemover.remove($scope.role, realm, Dialog, $location, Notifications); + }; + + $scope.cancel = function () { + $location.url("/realms/" + realm.realm + "/roles"); + }; + + + + roleControl($scope, realm, role, roles, clients, + ClientRole, RoleById, RoleRealmComposites, RoleClientComposites, + $http, $location, Notifications, Dialog); +}); + +module.controller('RealmSMTPSettingsCtrl', function($scope, Current, Realm, realm, $http, $location, Dialog, Notifications, RealmSMTPConnectionTester) { + console.log('RealmSMTPSettingsCtrl'); + + var booleanSmtpAtts = ["auth","ssl","starttls"]; + + $scope.realm = realm; + + if ($scope.realm.smtpServer) { + $scope.realm.smtpServer = typeObject($scope.realm.smtpServer); + }; + + var oldCopy = angular.copy($scope.realm); + $scope.changed = false; + + $scope.$watch('realm', function() { + if (!angular.equals($scope.realm, oldCopy)) { + $scope.changed = true; + } + }, true); + + $scope.save = function() { + var realmCopy = angular.copy($scope.realm); + realmCopy['smtpServer'] = detypeObject(realmCopy.smtpServer); + $scope.changed = false; + Realm.update(realmCopy, function () { + $location.url("/realms/" + realm.realm + "/smtp-settings"); + Notifications.success("Your changes have been saved to the realm."); + }); + }; + + $scope.reset = function() { + $scope.realm = angular.copy(oldCopy); + $scope.changed = false; + }; + + var initSMTPTest = function() { + return { + realm: $scope.realm.realm, + config: JSON.stringify(realm.smtpServer) + }; + }; + + $scope.testConnection = function() { + RealmSMTPConnectionTester.send(initSMTPTest(), function() { + Notifications.success("SMTP connection successful. E-mail was sent!"); + }, function(errorResponse) { + if (error.data.errorMessage) { + Notifications.error(error.data.errorMessage); + } else { + Notifications.error('Unexpected error during SMTP validation'); + } + }); + }; + + /* Convert string attributes containing a boolean to actual boolean type + convert an integer string (port) to integer. */ + function typeObject(obj){ + for (var att in obj){ + if (booleanSmtpAtts.indexOf(att) < 0) + continue; + if (obj[att] === "true"){ + obj[att] = true; + } else if (obj[att] === "false"){ + obj[att] = false; + } + } + + obj['port'] = parseInt(obj['port']); + + return obj; + } + + /* Convert all non-string values to strings to invert changes caused by the typeObject function. */ + function detypeObject(obj){ + for (var att in obj){ + if (booleanSmtpAtts.indexOf(att) < 0) + continue; + if (obj[att] === true){ + obj[att] = "true"; + } else if (obj[att] === false){ + obj[att] = "false" + } + } + + obj['port'] = obj['port'] && obj['port'].toString(); + + return obj; + } +}); + +module.controller('RealmEventsConfigCtrl', function($scope, eventsConfig, RealmEventsConfig, RealmEvents, RealmAdminEvents, realm, serverInfo, $location, Notifications, TimeUnit, Dialog) { + $scope.realm = realm; + + $scope.eventsConfig = eventsConfig; + + $scope.eventsConfig.expirationUnit = TimeUnit.autoUnit(eventsConfig.eventsExpiration); + $scope.eventsConfig.eventsExpiration = TimeUnit.toUnit(eventsConfig.eventsExpiration, $scope.eventsConfig.expirationUnit); + + $scope.eventListeners = Object.keys(serverInfo.providers.eventsListener.providers); + + $scope.eventsConfigSelectOptions = { + 'multiple': true, + 'simple_tags': true, + 'tags': $scope.eventListeners + }; + + $scope.eventSelectOptions = { + 'multiple': true, + 'simple_tags': true, + 'tags': serverInfo.enums['eventType'] + }; + + var oldCopy = angular.copy($scope.eventsConfig); + $scope.changed = false; + + $scope.$watch('eventsConfig', function() { + if (!angular.equals($scope.eventsConfig, oldCopy)) { + $scope.changed = true; + } + }, true); + + $scope.save = function() { + $scope.changed = false; + + var copy = angular.copy($scope.eventsConfig) + delete copy['expirationUnit']; + + copy.eventsExpiration = TimeUnit.toSeconds($scope.eventsConfig.eventsExpiration, $scope.eventsConfig.expirationUnit); + + RealmEventsConfig.update({ + id : realm.realm + }, copy, function () { + $location.url("/realms/" + realm.realm + "/events-settings"); + Notifications.success("Your changes have been saved to the realm."); + }); + }; + + $scope.reset = function() { + $scope.eventsConfig = angular.copy(oldCopy); + $scope.changed = false; + }; + + $scope.clearEvents = function() { + Dialog.confirmDelete($scope.realm.realm, 'events', function() { + RealmEvents.remove({ id : $scope.realm.realm }, function() { + Notifications.success("The events has been cleared."); + }); + }); + }; + + $scope.clearAdminEvents = function() { + Dialog.confirmDelete($scope.realm.realm, 'admin-events', function() { + RealmAdminEvents.remove({ id : $scope.realm.realm }, function() { + Notifications.success("The admin events has been cleared."); + }); + }); + }; +}); + +module.controller('RealmEventsCtrl', function($scope, RealmEvents, realm, serverInfo) { + $scope.realm = realm; + $scope.page = 0; + + $scope.eventSelectOptions = { + 'multiple': true, + 'simple_tags': true, + 'tags': serverInfo.enums['eventType'] + }; + + $scope.query = { + id : realm.realm, + max : 5, + first : 0 + } + + $scope.update = function() { + $scope.query.first = 0; + for (var i in $scope.query) { + if ($scope.query[i] === '') { + delete $scope.query[i]; + } + } + $scope.events = RealmEvents.query($scope.query); + } + + $scope.reset = function() { + $scope.query.first = 0; + $scope.query.max = 5; + $scope.query.type = ''; + $scope.query.client = ''; + $scope.query.user = ''; + $scope.query.dateFrom = ''; + $scope.query.dateTo = ''; + + $scope.update(); + } + + $scope.queryUpdate = function() { + for (var i in $scope.query) { + if ($scope.query[i] === '') { + delete $scope.query[i]; + } + } + $scope.events = RealmEvents.query($scope.query); + } + + $scope.firstPage = function() { + $scope.query.first = 0; + $scope.queryUpdate(); + } + + $scope.previousPage = function() { + $scope.query.first -= parseInt($scope.query.max); + if ($scope.query.first < 0) { + $scope.query.first = 0; + } + $scope.queryUpdate(); + } + + $scope.nextPage = function() { + $scope.query.first += parseInt($scope.query.max); + $scope.queryUpdate(); + } + + $scope.update(); +}); + +module.controller('RealmAdminEventsCtrl', function($scope, RealmAdminEvents, realm, serverInfo, $modal, $filter) { + $scope.realm = realm; + $scope.page = 0; + + $scope.query = { + id : realm.realm, + max : 5, + first : 0 + }; + + $scope.adminEnabledEventOperationsOptions = { + 'multiple': true, + 'simple_tags': true, + 'tags': serverInfo.enums['operationType'] + }; + + $scope.adminEnabledEventResourceTypesOptions = { + 'multiple': true, + 'simple_tags': true, + 'tags': serverInfo.enums['resourceType'] + }; + + $scope.update = function() { + $scope.query.first = 0; + for (var i in $scope.query) { + if ($scope.query[i] === '') { + delete $scope.query[i]; + } + } + $scope.events = RealmAdminEvents.query($scope.query); + }; + + $scope.reset = function() { + $scope.query.first = 0; + $scope.query.max = 5; + $scope.query.operationTypes = ''; + $scope.query.resourceTypes = ''; + $scope.query.resourcePath = ''; + $scope.query.authRealm = ''; + $scope.query.authClient = ''; + $scope.query.authUser = ''; + $scope.query.authIpAddress = ''; + $scope.query.dateFrom = ''; + $scope.query.dateTo = ''; + + $scope.update(); + }; + + $scope.queryUpdate = function() { + for (var i in $scope.query) { + if ($scope.query[i] === '') { + delete $scope.query[i]; + } + } + $scope.events = RealmAdminEvents.query($scope.query); + } + + $scope.firstPage = function() { + $scope.query.first = 0; + $scope.queryUpdate(); + } + + $scope.previousPage = function() { + $scope.query.first -= parseInt($scope.query.max); + if ($scope.query.first < 0) { + $scope.query.first = 0; + } + $scope.queryUpdate(); + } + + $scope.nextPage = function() { + $scope.query.first += parseInt($scope.query.max); + $scope.queryUpdate(); + } + + $scope.update(); + + $scope.viewRepresentation = function(event) { + $modal.open({ + templateUrl: resourceUrl + '/partials/modal/realm-events-admin-representation.html', + controller: 'RealmAdminEventsModalCtrl', + resolve: { + event: function () { + return event; + } + } + }) + } + + $scope.viewAuth = function(event) { + $modal.open({ + templateUrl: resourceUrl + '/partials/modal/realm-events-admin-auth.html', + controller: 'RealmAdminEventsModalCtrl', + resolve: { + event: function () { + return event; + } + } + }) + } +}); + +module.controller('RealmAdminEventsModalCtrl', function($scope, $filter, event) { + $scope.event = event; +}); + +module.controller('RealmBruteForceCtrl', function($scope, Realm, realm, $http, $location, Dialog, Notifications, TimeUnit, $route) { + console.log('RealmBruteForceCtrl'); + + $scope.realm = realm; + + $scope.realm.waitIncrementUnit = TimeUnit.autoUnit(realm.waitIncrementSeconds); + $scope.realm.waitIncrement = TimeUnit.toUnit(realm.waitIncrementSeconds, $scope.realm.waitIncrementUnit); + + $scope.realm.minimumQuickLoginWaitUnit = TimeUnit.autoUnit(realm.minimumQuickLoginWaitSeconds); + $scope.realm.minimumQuickLoginWait = TimeUnit.toUnit(realm.minimumQuickLoginWaitSeconds, $scope.realm.minimumQuickLoginWaitUnit); + + $scope.realm.maxFailureWaitUnit = TimeUnit.autoUnit(realm.maxFailureWaitSeconds); + $scope.realm.maxFailureWait = TimeUnit.toUnit(realm.maxFailureWaitSeconds, $scope.realm.maxFailureWaitUnit); + + $scope.realm.maxDeltaTimeUnit = TimeUnit.autoUnit(realm.maxDeltaTimeSeconds); + $scope.realm.maxDeltaTime = TimeUnit.toUnit(realm.maxDeltaTimeSeconds, $scope.realm.maxDeltaTimeUnit); + + var oldCopy = angular.copy($scope.realm); + $scope.changed = false; + + $scope.$watch('realm', function() { + if (!angular.equals($scope.realm, oldCopy)) { + $scope.changed = true; + } + }, true); + + $scope.save = function() { + var realmCopy = angular.copy($scope.realm); + delete realmCopy["waitIncrementUnit"]; + delete realmCopy["waitIncrement"]; + delete realmCopy["minimumQuickLoginWaitUnit"]; + delete realmCopy["minimumQuickLoginWait"]; + delete realmCopy["maxFailureWaitUnit"]; + delete realmCopy["maxFailureWait"]; + delete realmCopy["maxDeltaTimeUnit"]; + delete realmCopy["maxDeltaTime"]; + + realmCopy.waitIncrementSeconds = TimeUnit.toSeconds($scope.realm.waitIncrement, $scope.realm.waitIncrementUnit) + realmCopy.minimumQuickLoginWaitSeconds = TimeUnit.toSeconds($scope.realm.minimumQuickLoginWait, $scope.realm.minimumQuickLoginWaitUnit) + realmCopy.maxFailureWaitSeconds = TimeUnit.toSeconds($scope.realm.maxFailureWait, $scope.realm.maxFailureWaitUnit) + realmCopy.maxDeltaTimeSeconds = TimeUnit.toSeconds($scope.realm.maxDeltaTime, $scope.realm.maxDeltaTimeUnit) + + $scope.changed = false; + Realm.update(realmCopy, function () { + oldCopy = angular.copy($scope.realm); + $location.url("/realms/" + realm.realm + "/defense/brute-force"); + Notifications.success("Your changes have been saved to the realm."); + }); + }; + + $scope.reset = function() { + $route.reload(); + }; +}); + + +module.controller('IdentityProviderMapperListCtrl', function($scope, realm, identityProvider, mapperTypes, mappers) { + $scope.realm = realm; + $scope.identityProvider = identityProvider; + $scope.mapperTypes = mapperTypes; + $scope.mappers = mappers; +}); + +module.controller('IdentityProviderMapperCtrl', function($scope, realm, identityProvider, mapperTypes, mapper, IdentityProviderMapper, Notifications, Dialog, $location) { + $scope.realm = realm; + $scope.identityProvider = identityProvider; + $scope.create = false; + $scope.mapper = angular.copy(mapper); + $scope.changed = false; + $scope.mapperType = mapperTypes[mapper.identityProviderMapper]; + $scope.$watch(function() { + return $location.path(); + }, function() { + $scope.path = $location.path().substring(1).split("/"); + }); + + $scope.$watch('mapper', function() { + if (!angular.equals($scope.mapper, mapper)) { + $scope.changed = true; + } + }, true); + + $scope.save = function() { + IdentityProviderMapper.update({ + realm : realm.realm, + alias: identityProvider.alias, + mapperId : mapper.id + }, $scope.mapper, function() { + $scope.changed = false; + mapper = angular.copy($scope.mapper); + $location.url("/realms/" + realm.realm + '/identity-provider-mappers/' + identityProvider.alias + "/mappers/" + mapper.id); + Notifications.success("Your changes have been saved."); + }); + }; + + $scope.reset = function() { + $scope.mapper = angular.copy(mapper); + $scope.changed = false; + }; + + $scope.cancel = function() { + //$location.url("/realms"); + window.history.back(); + }; + + $scope.remove = function() { + Dialog.confirmDelete($scope.mapper.name, 'mapper', function() { + IdentityProviderMapper.remove({ realm: realm.realm, alias: mapper.identityProviderAlias, mapperId : $scope.mapper.id }, function() { + Notifications.success("The mapper has been deleted."); + $location.url("/realms/" + realm.realm + '/identity-provider-mappers/' + identityProvider.alias + "/mappers"); + }); + }); + }; + +}); + +module.controller('IdentityProviderMapperCreateCtrl', function($scope, realm, identityProvider, mapperTypes, IdentityProviderMapper, Notifications, Dialog, $location) { + $scope.realm = realm; + $scope.identityProvider = identityProvider; + $scope.create = true; + $scope.mapper = { identityProviderAlias: identityProvider.alias, config: {}}; + $scope.mapperTypes = mapperTypes; + + // make first type the default + $scope.mapperType = mapperTypes[Object.keys(mapperTypes)[0]]; + + $scope.$watch(function() { + return $location.path(); + }, function() { + $scope.path = $location.path().substring(1).split("/"); + }); + + $scope.save = function() { + $scope.mapper.identityProviderMapper = $scope.mapperType.id; + IdentityProviderMapper.save({ + realm : realm.realm, alias: identityProvider.alias + }, $scope.mapper, function(data, headers) { + var l = headers().location; + var id = l.substring(l.lastIndexOf("/") + 1); + $location.url("/realms/" + realm.realm + '/identity-provider-mappers/' + identityProvider.alias + "/mappers/" + id); + Notifications.success("Mapper has been created."); + }); + }; + + $scope.cancel = function() { + //$location.url("/realms"); + window.history.back(); + }; + + +}); + +module.controller('RealmFlowBindingCtrl', function($scope, flows, Current, Realm, realm, serverInfo, $http, $location, Dialog, Notifications) { + $scope.flows = []; + $scope.clientFlows = []; + for (var i=0 ; i 0) { + $scope.provider = formProviders[0]; + } + + $scope.save = function() { + $scope.flow.provider = $scope.provider.id; + CreateExecutionFlow.save({realm: realm.realm, alias: parentFlow.alias}, $scope.flow, function() { + $location.url("/realms/" + realm.realm + "/authentication/flows"); + Notifications.success("Flow Created."); + }) + } + $scope.cancel = function() { + $location.url("/realms/" + realm.realm + "/authentication/flows"); + }; +}); + +module.controller('CreateExecutionCtrl', function($scope, realm, parentFlow, formActionProviders, authenticatorProviders, clientAuthenticatorProviders, + CreateExecution, + Notifications, $location) { + $scope.realm = realm; + $scope.parentFlow = parentFlow; + + if (parentFlow.providerId == 'form-flow') { + $scope.providers = formActionProviders; + } else if (parentFlow.providerId == 'client-flow') { + $scope.providers = clientAuthenticatorProviders; + } else { + $scope.providers = authenticatorProviders; + } + + $scope.provider = {}; + if ($scope.providers.length > 0) { + $scope.provider = $scope.providers[0]; + } + + $scope.save = function() { + var execution = { + provider: $scope.provider.id + } + CreateExecution.save({realm: realm.realm, alias: parentFlow.alias}, execution, function() { + $location.url("/realms/" + realm.realm + "/authentication/flows"); + Notifications.success("Execution Created."); + }) + } + $scope.cancel = function() { + $location.url("/realms/" + realm.realm + "/authentication/flows"); + }; +}); + + + +module.controller('AuthenticationFlowsCtrl', function($scope, $route, realm, flows, selectedFlow, LastFlowSelected, Dialog, + AuthenticationFlows, AuthenticationFlowsCopy, AuthenticationFlowExecutions, + AuthenticationExecution, AuthenticationExecutionRaisePriority, AuthenticationExecutionLowerPriority, + $modal, Notifications, CopyDialog, $location) { + $scope.realm = realm; + $scope.flows = flows; + + if (selectedFlow !== null) { + LastFlowSelected.alias = selectedFlow; + } + + if (selectedFlow === null && LastFlowSelected.alias !== null) { + selectedFlow = LastFlowSelected.alias; + } + + if (flows.length > 0) { + $scope.flow = flows[0]; + if (selectedFlow) { + for (var i = 0; i < flows.length; i++) { + if (flows[i].alias == selectedFlow) { + $scope.flow = flows[i]; + break; + } + } + } + } + + $scope.selectFlow = function(flow) { + $location.url("/realms/" + realm.realm + '/authentication/flows/' + flow.alias); + }; + + var setupForm = function() { + AuthenticationFlowExecutions.query({realm: realm.realm, alias: $scope.flow.alias}, function(data) { + $scope.executions = data; + $scope.choicesmax = 0; + $scope.levelmax = 0; + for (var i = 0; i < $scope.executions.length; i++ ) { + var execution = $scope.executions[i]; + if (execution.requirementChoices.length > $scope.choicesmax) { + $scope.choicesmax = execution.requirementChoices.length; + } + if (execution.level > $scope.levelmax) { + $scope.levelmax = execution.level; + } + } + $scope.levelmaxempties = []; + for (j = 0; j < $scope.levelmax; j++) { + $scope.levelmaxempties.push(j); + + } + for (var i = 0; i < $scope.executions.length; i++ ) { + var execution = $scope.executions[i]; + execution.empties = []; + for (j = 0; j < $scope.choicesmax - execution.requirementChoices.length; j++) { + execution.empties.push(j); + } + execution.preLevels = []; + for (j = 0; j < execution.level; j++) { + execution.preLevels.push(j); + } + execution.postLevels = []; + for (j = execution.level; j < $scope.levelmax; j++) { + execution.postLevels.push(j); + } + } + }) + }; + + $scope.copyFlow = function() { + CopyDialog.open('Copy Authentication Flow', $scope.flow.alias, function(name) { + AuthenticationFlowsCopy.save({realm: realm.realm, alias: $scope.flow.alias}, { + newName: name + }, function() { + $location.url("/realms/" + realm.realm + '/authentication/flows/' + name); + Notifications.success("Flow copied."); + }) + }) + }; + + $scope.deleteFlow = function() { + Dialog.confirmDelete($scope.flow.alias, 'flow', function() { + $scope.removeFlow(); + }); + }; + + $scope.removeFlow = function() { + console.log('Remove flow:' + $scope.flow.alias); + if (realm.browserFlow == $scope.flow.alias) { + Notifications.error("Cannot remove flow, it is currently being used as the browser flow."); + + } else if (realm.registrationFlow == $scope.flow.alias) { + Notifications.error("Cannot remove flow, it is currently being used as the registration flow."); + + } else if (realm.directGrantFlow == $scope.flow.alias) { + Notifications.error("Cannot remove flow, it is currently being used as the direct grant flow."); + + } else if (realm.resetCredentialsFlow == $scope.flow.alias) { + Notifications.error("Cannot remove flow, it is currently being used as the reset credentials flow."); + + } else if (realm.clientAuthenticationFlow == $scope.flow.alias) { + Notifications.error("Cannot remove flow, it is currently being used as the client authentication flow."); + + } else if (realm.dockerAuthenticationFlow == $scope.flow.alias) { + Notifications.error("Cannot remove flow, it is currently being used as the docker authentication flow."); + + } else { + AuthenticationFlows.remove({realm: realm.realm, flow: $scope.flow.id}, function () { + $location.url("/realms/" + realm.realm + '/authentication/flows/' + flows[0].alias); + Notifications.success("Flow removed"); + }) + } + + }; + + $scope.addFlow = function() { + $location.url("/realms/" + realm.realm + '/authentication/flows/' + $scope.flow.id + '/create/flow/execution/' + $scope.flow.id); + + } + + $scope.addSubFlow = function(execution) { + $location.url("/realms/" + realm.realm + '/authentication/flows/' + execution.flowId + '/create/flow/execution/' + $scope.flow.alias); + + } + + $scope.addSubFlowExecution = function(execution) { + $location.url("/realms/" + realm.realm + '/authentication/flows/' + execution.flowId + '/create/execution/' + $scope.flow.alias); + + } + + $scope.addExecution = function() { + $location.url("/realms/" + realm.realm + '/authentication/flows/' + $scope.flow.id + '/create/execution/' + $scope.flow.id); + + } + + $scope.createFlow = function() { + $location.url("/realms/" + realm.realm + '/authentication/create/flow'); + } + + $scope.updateExecution = function(execution) { + var copy = angular.copy(execution); + delete copy.empties; + delete copy.levels; + delete copy.preLevels; + delete copy.postLevels; + AuthenticationFlowExecutions.update({realm: realm.realm, alias: $scope.flow.alias}, copy, function() { + Notifications.success("Auth requirement updated"); + setupForm(); + }); + + }; + + $scope.removeExecution = function(execution) { + console.log('removeExecution: ' + execution.id); + var exeOrFlow = execution.authenticationFlow ? 'flow' : 'execution'; + Dialog.confirmDelete(execution.displayName, exeOrFlow, function() { + AuthenticationExecution.remove({realm: realm.realm, execution: execution.id}, function() { + Notifications.success("The " + exeOrFlow + " was removed."); + setupForm(); + }); + }); + + } + + $scope.raisePriority = function(execution) { + AuthenticationExecutionRaisePriority.save({realm: realm.realm, execution: execution.id}, function() { + Notifications.success("Priority raised"); + setupForm(); + }) + } + + $scope.lowerPriority = function(execution) { + AuthenticationExecutionLowerPriority.save({realm: realm.realm, execution: execution.id}, function() { + Notifications.success("Priority lowered"); + setupForm(); + }) + } + + $scope.setupForm = setupForm; + + if (selectedFlow == null) { + $scope.selectFlow(flows[0]); + } else { + setupForm(); + } +}); + +module.controller('RequiredActionsCtrl', function($scope, realm, unregisteredRequiredActions, + $modal, $route, + RegisterRequiredAction, RequiredActions, Notifications) { + console.log('RequiredActionsCtrl'); + $scope.realm = realm; + $scope.unregisteredRequiredActions = unregisteredRequiredActions; + $scope.requiredActions = []; + var setupRequiredActionsForm = function() { + console.log('setupRequiredActionsForm'); + RequiredActions.query({realm: realm.realm}, function(data) { + $scope.requiredActions = []; + for (var i = 0; i < data.length; i++) { + $scope.requiredActions.push(data[i]); + } + }); + }; + + $scope.updateRequiredAction = function(action) { + RequiredActions.update({realm: realm.realm, alias: action.alias}, action, function() { + Notifications.success("Required action updated"); + setupRequiredActionsForm(); + }); + } + + $scope.register = function() { + var controller = function($scope, $modalInstance) { + $scope.unregisteredRequiredActions = unregisteredRequiredActions; + $scope.selected = { + selected: $scope.unregisteredRequiredActions[0] + } + $scope.ok = function () { + $modalInstance.close(); + RegisterRequiredAction.save({realm: realm.realm}, $scope.selected.selected, function() { + $route.reload(); + }); + }; + $scope.cancel = function () { + $modalInstance.dismiss('cancel'); + }; + } + $modal.open({ + templateUrl: resourceUrl + '/partials/modal/unregistered-required-action-selector.html', + controller: controller, + resolve: { + } + }); + } + + setupRequiredActionsForm(); + + +}); + +module.controller('AuthenticationConfigCtrl', function($scope, realm, flow, configType, config, AuthenticationConfig, Notifications, Dialog, $location) { + $scope.realm = realm; + $scope.flow = flow; + $scope.configType = configType; + $scope.create = false; + $scope.config = angular.copy(config); + $scope.changed = false; + + $scope.$watch(function() { + return $location.path(); + }, function() { + $scope.path = $location.path().substring(1).split("/"); + }); + + $scope.$watch('config', function() { + if (!angular.equals($scope.config, config)) { + $scope.changed = true; + } + }, true); + + $scope.save = function() { + AuthenticationConfig.update({ + realm : realm.realm, + config : config.id + }, $scope.config, function() { + $scope.changed = false; + config = angular.copy($scope.config); + $location.url("/realms/" + realm.realm + '/authentication/flows/' + flow.id + '/config/' + configType.providerId + "/" + config.id); + Notifications.success("Your changes have been saved."); + }); + }; + + $scope.reset = function() { + $scope.config = angular.copy(config); + $scope.changed = false; + }; + + $scope.cancel = function() { + //$location.url("/realms"); + window.history.back(); + }; + + $scope.remove = function() { + Dialog.confirmDelete($scope.config.alias, 'config', function() { + AuthenticationConfig.remove({ realm: realm.realm, config : $scope.config.id }, function() { + Notifications.success("The config has been deleted."); + $location.url("/realms/" + realm.realm + '/authentication/flows/' + flow.id); + }); + }); + }; + +}); + +module.controller('AuthenticationConfigCreateCtrl', function($scope, realm, flow, configType, execution, AuthenticationExecutionConfig, Notifications, Dialog, $location) { + $scope.realm = realm; + $scope.flow = flow; + $scope.create = true; + $scope.configType = configType; + + var defaultConfig = {}; + if (configType && Array.isArray(configType.properties)) { + for(var i = 0; i < configType.properties.length; i++) { + var property = configType.properties[i]; + if (property && property.name) { + defaultConfig[property.name] = property.defaultValue; + } + } + } + + $scope.config = { config: defaultConfig}; + + $scope.$watch(function() { + return $location.path(); + }, function() { + $scope.path = $location.path().substring(1).split("/"); + }); + + $scope.save = function() { + AuthenticationExecutionConfig.save({ + realm : realm.realm, + execution: execution + }, $scope.config, function(data, headers) { + var l = headers().location; + var id = l.substring(l.lastIndexOf("/") + 1); + var url = "/realms/" + realm.realm + '/authentication/flows/' + flow.id + '/config/' + configType.providerId + "/" + id; + console.log('redirect url: ' + url); + $location.url(url); + Notifications.success("Config has been created."); + }); + }; + + $scope.cancel = function() { + //$location.url("/realms"); + window.history.back(); + }; +}); + +module.controller('ClientInitialAccessCtrl', function($scope, realm, clientInitialAccess, ClientInitialAccess, Dialog, Notifications, $route, $location) { + $scope.realm = realm; + $scope.clientInitialAccess = clientInitialAccess; + + $scope.remove = function(id) { + Dialog.confirmDelete(id, 'initial access token', function() { + ClientInitialAccess.remove({ realm: realm.realm, id: id }, function() { + Notifications.success("The initial access token was deleted."); + $route.reload(); + }); + }); + } +}); + +module.controller('ClientInitialAccessCreateCtrl', function($scope, realm, ClientInitialAccess, TimeUnit, Dialog, $location, $translate) { + $scope.expirationUnit = 'Days'; + $scope.expiration = TimeUnit.toUnit(0, $scope.expirationUnit); + $scope.count = 1; + $scope.realm = realm; + + $scope.save = function() { + var expiration = TimeUnit.toSeconds($scope.expiration, $scope.expirationUnit); + ClientInitialAccess.save({ + realm: realm.realm + }, { expiration: expiration, count: $scope.count}, function (data) { + console.debug(data); + $scope.id = data.id; + $scope.token = data.token; + }); + }; + + $scope.cancel = function() { + $location.url('/realms/' + realm.realm + '/client-registration/client-initial-access'); + }; + + $scope.done = function() { + var btns = { + ok: { + label: $translate.instant('continue'), + cssClass: 'btn btn-primary' + }, + cancel: { + label: $translate.instant('cancel'), + cssClass: 'btn btn-default' + } + } + + var title = $translate.instant('initial-access-token.confirm.title'); + var message = $translate.instant('initial-access-token.confirm.text'); + Dialog.open(title, message, btns, function() { + $location.url('/realms/' + realm.realm + '/client-registration/client-initial-access'); + }); + }; +}); + +module.controller('ClientRegPoliciesCtrl', function($scope, realm, clientRegistrationPolicyProviders, policies, Dialog, Notifications, Components, $route, $location) { + $scope.realm = realm; + $scope.providers = clientRegistrationPolicyProviders; + $scope.anonPolicies = []; + $scope.authPolicies = []; + for (var i=0 ; i 0)) { + if ($scope.rawContent.length > 1) $scope.isMultiRealm = true; + $scope.fileContent = $scope.rawContent[0]; + } else { + $scope.fileContent = $scope.rawContent; + } + + $scope.importing = true; + setOnOffSwitchDefaults(); + $scope.results = {}; + if (!$scope.hasResources()) { + $scope.nothingToImport(); + } + }; + + $scope.hasResults = function() { + return (Object.keys($scope.results).length > 0) && + ($scope.results.results !== undefined) && + ($scope.results.results.length > 0); + } + + $scope.resultsPage = function() { + if (!$scope.hasResults()) return {}; + return $scope.results.results.slice(startIndex(), endIndex()); + } + + function startIndex() { + return pageSize * $scope.currentPage; + } + + function endIndex() { + var length = $scope.results.results.length; + var endIndex = startIndex() + pageSize; + if (endIndex > length) endIndex = length; + return endIndex; + } + + function setOnOffSwitchDefaults() { + $scope.importUsers = $scope.hasArray('users'); + $scope.importGroups = $scope.hasArray('groups'); + $scope.importClients = $scope.hasArray('clients'); + $scope.importIdentityProviders = $scope.hasArray('identityProviders'); + $scope.importRealmRoles = $scope.hasRealmRoles(); + $scope.importClientRoles = $scope.hasClientRoles(); + } + + $scope.setFirstPage = function() { + $scope.currentPage = 0; + } + + $scope.setNextPage = function() { + $scope.currentPage++; + } + + $scope.setPreviousPage = function() { + $scope.currentPage--; + } + + $scope.hasNext = function() { + if (!$scope.hasResults()) return false; + var length = $scope.results.results.length; + //console.log('length=' + length); + var endIndex = startIndex() + pageSize; + //console.log('endIndex=' + endIndex); + return length > endIndex; + } + + $scope.hasPrevious = function() { + if (!$scope.hasResults()) return false; + return $scope.currentPage > 0; + } + + $scope.viewImportDetails = function() { + $modal.open({ + templateUrl: resourceUrl + '/partials/modal/view-object.html', + controller: 'ObjectModalCtrl', + resolve: { + object: function () { + return $scope.fileContent; + } + } + }) + }; + + $scope.hasArray = function(section) { + return ($scope.fileContent !== 'undefined') && + ($scope.fileContent.hasOwnProperty(section)) && + ($scope.fileContent[section] instanceof Array) && + ($scope.fileContent[section].length > 0); + } + + $scope.hasRealmRoles = function() { + return $scope.hasRoles() && + ($scope.fileContent.roles.hasOwnProperty('realm')) && + ($scope.fileContent.roles.realm instanceof Array) && + ($scope.fileContent.roles.realm.length > 0); + } + + $scope.hasRoles = function() { + return ($scope.fileContent !== 'undefined') && + ($scope.fileContent.hasOwnProperty('roles')) && + ($scope.fileContent.roles !== 'undefined'); + } + + $scope.hasClientRoles = function() { + return $scope.hasRoles() && + ($scope.fileContent.roles.hasOwnProperty('client')) && + (Object.keys($scope.fileContent.roles.client).length > 0); + } + + $scope.itemCount = function(section) { + if (!$scope.importing) return 0; + if ($scope.hasRealmRoles() && (section === 'roles.realm')) return $scope.fileContent.roles.realm.length; + if ($scope.hasClientRoles() && (section === 'roles.client')) return clientRolesCount($scope.fileContent.roles.client); + + if (!$scope.fileContent.hasOwnProperty(section)) return 0; + + return $scope.fileContent[section].length; + } + + clientRolesCount = function(clientRoles) { + var total = 0; + for (var clientName in clientRoles) { + total += clientRoles[clientName].length; + } + return total; + } + + $scope.hasResources = function() { + return ($scope.importUsers && $scope.hasArray('users')) || + ($scope.importGroups && $scope.hasArray('groups')) || + ($scope.importClients && $scope.hasArray('clients')) || + ($scope.importIdentityProviders && $scope.hasArray('identityProviders')) || + ($scope.importRealmRoles && $scope.hasRealmRoles()) || + ($scope.importClientRoles && $scope.hasClientRoles()); + } + + $scope.nothingToImport = function() { + Notifications.error('No resouces specified to import.'); + } + + $scope.$watch('fileContent', function() { + if (!angular.equals($scope.fileContent, oldCopy)) { + $scope.changed = true; + } + setOnOffSwitchDefaults(); + }, true); + + $scope.successMessage = function() { + var message = $scope.results.added + ' records added. '; + if ($scope.ifResourceExists === 'SKIP') { + message += $scope.results.skipped + ' records skipped.' + } + if ($scope.ifResourceExists === 'OVERWRITE') { + message += $scope.results.overwritten + ' records overwritten.'; + } + return message; + } + + $scope.save = function() { + var json = angular.copy($scope.fileContent); + json.ifResourceExists = $scope.ifResourceExists; + if (!$scope.importUsers) delete json.users; + if (!$scope.importGroups) delete json.groups; + if (!$scope.importIdentityProviders) delete json.identityProviders; + if (!$scope.importClients) delete json.clients; + + if (json.hasOwnProperty('roles')) { + if (!$scope.importRealmRoles) delete json.roles.realm; + if (!$scope.importClientRoles) delete json.roles.client; + } + + var importFile = $resource(authUrl + '/admin/realms/' + realm.realm + '/partialImport'); + $scope.results = importFile.save(json, function() { + Notifications.success($scope.successMessage()); + }, function(error) { + if (error.data.errorMessage) { + Notifications.error(error.data.errorMessage); + } else { + Notifications.error('Unexpected error during import'); + } + }); + }; + + $scope.reset = function() { + $route.reload(); + } + +}); + +module.controller('RealmExportCtrl', function($scope, realm, $http, + $httpParamSerializer, Notifications, Dialog) { + $scope.realm = realm; + $scope.exportGroupsAndRoles = false; + $scope.exportClients = false; + + $scope.export = function() { + if ($scope.exportGroupsAndRoles || $scope.exportClients) { + Dialog.confirm('Export', 'This operation may make server unresponsive for a while.\n\nAre you sure you want to proceed?', download); + } else { + download(); + } + } + + function download() { + var exportUrl = authUrl + '/admin/realms/' + realm.realm + '/partial-export'; + var params = {}; + if ($scope.exportGroupsAndRoles) { + params['exportGroupsAndRoles'] = true; + } + if ($scope.exportClients) { + params['exportClients'] = true; + } + if (Object.keys(params).length > 0) { + exportUrl += '?' + $httpParamSerializer(params); + } + $http.post(exportUrl) + .then(function(response) { + var download = angular.fromJson(response.data); + download = angular.toJson(download, true); + saveAs(new Blob([download], { type: 'application/json' }), 'realm-export.json'); + }).catch(function() { + Notifications.error("Sorry, something went wrong."); + }); + } +}); diff --git a/admin/resources/js/controllers/roles.js b/admin/resources/js/controllers/roles.js new file mode 100644 index 0000000..bc24c57 --- /dev/null +++ b/admin/resources/js/controllers/roles.js @@ -0,0 +1,48 @@ +module.controller('RoleMembersCtrl', function($scope, realm, role, RoleMembership, Dialog, Notifications, $location, RealmRoleRemover) { + $scope.realm = realm; + $scope.page = 0; + $scope.role = role; + + $scope.query = { + realm: realm.realm, + role: role.name, + max : 5, + first : 0 + } + + $scope.remove = function() { + RealmRoleRemover.remove($scope.role, realm, Dialog, $location, Notifications); + }; + + $scope.firstPage = function() { + $scope.query.first = 0; + $scope.searchQuery(); + } + + $scope.previousPage = function() { + $scope.query.first -= parseInt($scope.query.max); + if ($scope.query.first < 0) { + $scope.query.first = 0; + } + $scope.searchQuery(); + } + + $scope.nextPage = function() { + $scope.query.first += parseInt($scope.query.max); + $scope.searchQuery(); + } + + $scope.searchQuery = function() { + console.log("query.search: " + $scope.query.search); + $scope.searchLoaded = false; + + $scope.users = RoleMembership.query($scope.query, function() { + console.log('search loaded'); + $scope.searchLoaded = true; + $scope.lastSearch = $scope.query.search; + }); + }; + + $scope.searchQuery(); + +}); diff --git a/admin/resources/js/controllers/users.js b/admin/resources/js/controllers/users.js new file mode 100644 index 0000000..c50b691 --- /dev/null +++ b/admin/resources/js/controllers/users.js @@ -0,0 +1,1504 @@ +module.controller('UserRoleMappingCtrl', function($scope, $http, realm, user, clients, client, Notifications, RealmRoleMapping, + ClientRoleMapping, AvailableRealmRoleMapping, AvailableClientRoleMapping, + CompositeRealmRoleMapping, CompositeClientRoleMapping) { + $scope.realm = realm; + $scope.user = user; + $scope.selectedRealmRoles = []; + $scope.selectedRealmMappings = []; + $scope.realmMappings = []; + $scope.clients = clients; + $scope.client = client; + $scope.clientRoles = []; + $scope.clientComposite = []; + $scope.selectedClientRoles = []; + $scope.selectedClientMappings = []; + $scope.clientMappings = []; + $scope.dummymodel = []; + + $scope.realmMappings = RealmRoleMapping.query({realm : realm.realm, userId : user.id}); + $scope.realmRoles = AvailableRealmRoleMapping.query({realm : realm.realm, userId : user.id}); + $scope.realmComposite = CompositeRealmRoleMapping.query({realm : realm.realm, userId : user.id}); + + $scope.addRealmRole = function() { + var roles = $scope.selectedRealmRoles; + $scope.selectedRealmRoles = []; + $http.post(authUrl + '/admin/realms/' + realm.realm + '/users/' + user.id + '/role-mappings/realm', + roles).then(function() { + $scope.realmMappings = RealmRoleMapping.query({realm : realm.realm, userId : user.id}); + $scope.realmRoles = AvailableRealmRoleMapping.query({realm : realm.realm, userId : user.id}); + $scope.realmComposite = CompositeRealmRoleMapping.query({realm : realm.realm, userId : user.id}); + $scope.selectedRealmMappings = []; + $scope.selectRealmRoles = []; + if ($scope.targetClient) { + console.log('load available'); + $scope.clientComposite = CompositeClientRoleMapping.query({realm : realm.realm, userId : user.id, client : $scope.targetClient.id}); + $scope.clientRoles = AvailableClientRoleMapping.query({realm : realm.realm, userId : user.id, client : $scope.targetClient.id}); + $scope.clientMappings = ClientRoleMapping.query({realm : realm.realm, userId : user.id, client : $scope.targetClient.id}); + $scope.selectedClientRoles = []; + $scope.selectedClientMappings = []; + } + Notifications.success("Role mappings updated."); + + }); + }; + + $scope.deleteRealmRole = function() { + $http.delete(authUrl + '/admin/realms/' + realm.realm + '/users/' + user.id + '/role-mappings/realm', + {data : $scope.selectedRealmMappings, headers : {"content-type" : "application/json"}}).then(function() { + $scope.realmMappings = RealmRoleMapping.query({realm : realm.realm, userId : user.id}); + $scope.realmRoles = AvailableRealmRoleMapping.query({realm : realm.realm, userId : user.id}); + $scope.realmComposite = CompositeRealmRoleMapping.query({realm : realm.realm, userId : user.id}); + $scope.selectedRealmMappings = []; + $scope.selectRealmRoles = []; + if ($scope.targetClient) { + console.log('load available'); + $scope.clientComposite = CompositeClientRoleMapping.query({realm : realm.realm, userId : user.id, client : $scope.targetClient.id}); + $scope.clientRoles = AvailableClientRoleMapping.query({realm : realm.realm, userId : user.id, client : $scope.targetClient.id}); + $scope.clientMappings = ClientRoleMapping.query({realm : realm.realm, userId : user.id, client : $scope.targetClient.id}); + $scope.selectedClientRoles = []; + $scope.selectedClientMappings = []; + } + Notifications.success("Role mappings updated."); + }); + }; + + $scope.addClientRole = function() { + $http.post(authUrl + '/admin/realms/' + realm.realm + '/users/' + user.id + '/role-mappings/clients/' + $scope.targetClient.id, + $scope.selectedClientRoles).then(function() { + $scope.clientMappings = ClientRoleMapping.query({realm : realm.realm, userId : user.id, client : $scope.targetClient.id}); + $scope.clientRoles = AvailableClientRoleMapping.query({realm : realm.realm, userId : user.id, client : $scope.targetClient.id}); + $scope.clientComposite = CompositeClientRoleMapping.query({realm : realm.realm, userId : user.id, client : $scope.targetClient.id}); + $scope.selectedClientRoles = []; + $scope.selectedClientMappings = []; + $scope.realmComposite = CompositeRealmRoleMapping.query({realm : realm.realm, userId : user.id}); + $scope.realmRoles = AvailableRealmRoleMapping.query({realm : realm.realm, userId : user.id}); + Notifications.success("Role mappings updated."); + }); + }; + + $scope.deleteClientRole = function() { + $http.delete(authUrl + '/admin/realms/' + realm.realm + '/users/' + user.id + '/role-mappings/clients/' + $scope.targetClient.id, + {data : $scope.selectedClientMappings, headers : {"content-type" : "application/json"}}).then(function() { + $scope.clientMappings = ClientRoleMapping.query({realm : realm.realm, userId : user.id, client : $scope.targetClient.id}); + $scope.clientRoles = AvailableClientRoleMapping.query({realm : realm.realm, userId : user.id, client : $scope.targetClient.id}); + $scope.clientComposite = CompositeClientRoleMapping.query({realm : realm.realm, userId : user.id, client : $scope.targetClient.id}); + $scope.selectedClientRoles = []; + $scope.selectedClientMappings = []; + $scope.realmComposite = CompositeRealmRoleMapping.query({realm : realm.realm, userId : user.id}); + $scope.realmRoles = AvailableRealmRoleMapping.query({realm : realm.realm, userId : user.id}); + Notifications.success("Role mappings updated."); + }); + }; + + + $scope.changeClient = function() { + console.log('changeClient'); + if ($scope.targetClient) { + console.log('load available'); + $scope.clientComposite = CompositeClientRoleMapping.query({realm : realm.realm, userId : user.id, client : $scope.targetClient.id}); + $scope.clientRoles = AvailableClientRoleMapping.query({realm : realm.realm, userId : user.id, client : $scope.targetClient.id}); + $scope.clientMappings = ClientRoleMapping.query({realm : realm.realm, userId : user.id, client : $scope.targetClient.id}); + } else { + $scope.clientRoles = null; + $scope.clientMappings = null; + $scope.clientComposite = null; + } + $scope.selectedClientRoles = []; + $scope.selectedClientMappings = []; + }; + + + +}); + +module.controller('UserSessionsCtrl', function($scope, realm, user, sessions, UserSessions, UserLogout, UserSessionLogout, Notifications) { + $scope.realm = realm; + $scope.user = user; + $scope.sessions = sessions; + + $scope.logoutAll = function() { + UserLogout.save({realm : realm.realm, user: user.id}, function () { + Notifications.success('Logged out user in all clients'); + UserSessions.query({realm: realm.realm, user: user.id}, function(updated) { + $scope.sessions = updated; + }) + }); + }; + + $scope.logoutSession = function(sessionId) { + console.log('here in logoutSession'); + UserSessionLogout.delete({realm : realm.realm, session: sessionId}, function() { + UserSessions.query({realm: realm.realm, user: user.id}, function(updated) { + $scope.sessions = updated; + Notifications.success('Logged out session'); + }) + }); + } +}); + +module.controller('UserFederatedIdentityCtrl', function($scope, $location, realm, user, federatedIdentities, UserFederatedIdentity, Notifications, Dialog) { + $scope.realm = realm; + $scope.user = user; + $scope.federatedIdentities = federatedIdentities; + + $scope.hasAnyProvidersToCreate = function() { + return realm.identityProviders.length - $scope.federatedIdentities.length > 0; + } + + $scope.removeProviderLink = function(providerLink) { + + console.log("Removing provider link: " + providerLink.identityProvider); + + Dialog.confirmDelete(providerLink.identityProvider, 'Identity Provider Link', function() { + UserFederatedIdentity.remove({ realm: realm.realm, user: user.id, provider: providerLink.identityProvider }, function() { + Notifications.success("The provider link has been deleted."); + var indexToRemove = $scope.federatedIdentities.indexOf(providerLink); + $scope.federatedIdentities.splice(indexToRemove, 1); + }); + }); + } +}); + +module.controller('UserFederatedIdentityAddCtrl', function($scope, $location, realm, user, federatedIdentities, UserFederatedIdentity, Notifications) { + $scope.realm = realm; + $scope.user = user; + $scope.federatedIdentity = {}; + + var getAvailableProvidersToCreate = function() { + var realmProviders = []; + for (var i=0 ; i 0) { + $scope.previousPage(); + } + + Notifications.success("The user has been deleted."); + }, function() { + Notifications.error("User couldn't be deleted"); + }); + }); + }; +}); + + +module.controller('UserTabCtrl', function($scope, $location, Dialog, Notifications, Current) { + $scope.removeUser = function() { + Dialog.confirmDelete($scope.user.id, 'user', function() { + $scope.user.$remove({ + realm : Current.realm.realm, + userId : $scope.user.id + }, function() { + $location.url("/realms/" + Current.realm.realm + "/users"); + Notifications.success("The user has been deleted."); + }, function() { + Notifications.error("User couldn't be deleted"); + }); + }); + }; +}); + +module.controller('UserDetailCtrl', function($scope, realm, user, BruteForceUser, User, + Components, + UserImpersonation, RequiredActions, + UserStorageOperations, + $location, $http, Dialog, Notifications) { + $scope.realm = realm; + $scope.create = !user.id; + $scope.editUsername = $scope.create || $scope.realm.editUsernameAllowed; + + if ($scope.create) { + $scope.user = { enabled: true, attributes: {} } + } else { + if (!user.attributes) { + user.attributes = {} + } + convertAttributeValuesToString(user); + + + $scope.user = angular.copy(user); + $scope.impersonate = function() { + UserImpersonation.save({realm : realm.realm, user: $scope.user.id}, function (data) { + if (data.sameRealm) { + window.location = data.redirect; + } else { + window.open(data.redirect, "_blank"); + } + }); + }; + if(user.federationLink) { + console.log("federationLink is not null. It is " + user.federationLink); + + if ($scope.access.viewRealm) { + Components.get({realm: realm.realm, componentId: user.federationLink}, function (link) { + $scope.federationLinkName = link.name; + $scope.federationLink = "#/realms/" + realm.realm + "/user-storage/providers/" + link.providerId + "/" + link.id; + }); + } else { + // KEYCLOAK-4328 + UserStorageOperations.simpleName.get({realm: realm.realm, componentId: user.federationLink}, function (link) { + $scope.federationLinkName = link.name; + $scope.federationLink = $location.absUrl(); + }) + } + + } else { + console.log("federationLink is null"); + } + if(user.origin) { + if ($scope.access.viewRealm) { + Components.get({realm: realm.realm, componentId: user.origin}, function (link) { + $scope.originName = link.name; + $scope.originLink = "#/realms/" + realm.realm + "/user-storage/providers/" + link.providerId + "/" + link.id; + }) + } + else { + // KEYCLOAK-4328 + UserStorageOperations.simpleName.get({realm: realm.realm, componentId: user.origin}, function (link) { + $scope.originName = link.name; + $scope.originLink = $location.absUrl(); + }) + } + } else { + console.log("origin is null"); + } + console.log('realm brute force? ' + realm.bruteForceProtected) + $scope.temporarilyDisabled = false; + var isDisabled = function () { + BruteForceUser.get({realm: realm.realm, userId: user.id}, function(data) { + console.log('here in isDisabled ' + data.disabled); + $scope.temporarilyDisabled = data.disabled; + }); + }; + + console.log("check if disabled"); + isDisabled(); + + $scope.unlockUser = function() { + BruteForceUser.delete({realm: realm.realm, userId: user.id}, function(data) { + isDisabled(); + }); + } + } + + $scope.changed = false; // $scope.create; + if (user.requiredActions) { + for (var i = 0; i < user.requiredActions.length; i++) { + console.log("user require action: " + user.requiredActions[i]); + } + } + // ID - Name map for required actions. IDs are enum names. + RequiredActions.query({realm: realm.realm}, function(data) { + $scope.userReqActionList = []; + for (var i = 0; i < data.length; i++) { + console.log("listed required action: " + data[i].name); + if (data[i].enabled) { + var item = data[i]; + $scope.userReqActionList.push(item); + } + } + console.log("---------------------"); + console.log("ng-model: user.requiredActions=" + JSON.stringify($scope.user.requiredActions)); + console.log("---------------------"); + console.log("ng-repeat: userReqActionList=" + JSON.stringify($scope.userReqActionList)); + console.log("---------------------"); + }); + $scope.$watch('user', function() { + if (!angular.equals($scope.user, user)) { + $scope.changed = true; + } + }, true); + + $scope.save = function() { + convertAttributeValuesToLists(); + + if ($scope.create) { + User.save({ + realm: realm.realm + }, $scope.user, function (data, headers) { + $scope.changed = false; + convertAttributeValuesToString($scope.user); + user = angular.copy($scope.user); + var l = headers().location; + + console.debug("Location == " + l); + + var id = l.substring(l.lastIndexOf("/") + 1); + + + $location.url("/realms/" + realm.realm + "/users/" + id); + Notifications.success("The user has been created."); + }); + } else { + User.update({ + realm: realm.realm, + userId: $scope.user.id + }, $scope.user, function () { + $scope.changed = false; + convertAttributeValuesToString($scope.user); + user = angular.copy($scope.user); + Notifications.success("Your changes have been saved to the user."); + }); + } + }; + + function convertAttributeValuesToLists() { + var attrs = $scope.user.attributes; + for (var attribute in attrs) { + if (typeof attrs[attribute] === "string") { + var attrVals = attrs[attribute].split("##"); + attrs[attribute] = attrVals; + } + } + } + + function convertAttributeValuesToString(user) { + var attrs = user.attributes; + for (var attribute in attrs) { + if (typeof attrs[attribute] === "object") { + var attrVals = attrs[attribute].join("##"); + attrs[attribute] = attrVals; + } + } + } + + $scope.reset = function() { + $scope.user = angular.copy(user); + $scope.changed = false; + }; + + $scope.cancel = function() { + $location.url("/realms/" + realm.realm + "/users"); + }; + + $scope.addAttribute = function() { + $scope.user.attributes[$scope.newAttribute.key] = $scope.newAttribute.value; + delete $scope.newAttribute; + } + + $scope.removeAttribute = function(key) { + delete $scope.user.attributes[key]; + } +}); + +module.controller('UserCredentialsCtrl', function($scope, realm, user, $route, RequiredActions, User, UserExecuteActionsEmail, UserCredentials, Notifications, Dialog, TimeUnit2) { + console.log('UserCredentialsCtrl'); + + $scope.realm = realm; + $scope.user = angular.copy(user); + $scope.temporaryPassword = true; + + $scope.isTotp = false; + if(!!user.totp){ + $scope.isTotp = user.totp; + } + // ID - Name map for required actions. IDs are enum names. + RequiredActions.query({realm: realm.realm}, function(data) { + $scope.userReqActionList = []; + for (var i = 0; i < data.length; i++) { + console.log("listed required action: " + data[i].name); + if (data[i].enabled) { + var item = data[i]; + $scope.userReqActionList.push(item); + } + } + + }); + + $scope.resetPassword = function() { + // hit enter without entering both fields - ignore + if (!$scope.passwordAndConfirmPasswordEntered()) return; + + if ($scope.pwdChange) { + if ($scope.password != $scope.confirmPassword) { + Notifications.error("Password and confirmation does not match."); + return; + } + } + + var msgTitle = 'Change password'; + var msg = 'Are you sure you want to change the users password?'; + + Dialog.confirm(msgTitle, msg, function() { + UserCredentials.resetPassword({ realm: realm.realm, userId: user.id }, { type : "password", value : $scope.password, temporary: $scope.temporaryPassword }, function() { + Notifications.success("The password has been reset"); + $scope.password = null; + $scope.confirmPassword = null; + $route.reload(); + }); + }, function() { + $scope.password = null; + $scope.confirmPassword = null; + }); + }; + + $scope.passwordAndConfirmPasswordEntered = function() { + return $scope.password && $scope.confirmPassword; + } + + $scope.disableCredentialTypes = function() { + Dialog.confirm('Disable credentials', 'Are you sure you want to disable these the users credentials?', function() { + UserCredentials.disableCredentialTypes({ realm: realm.realm, userId: user.id }, $scope.disableableCredentialTypes, function() { + $route.reload(); + Notifications.success("Credentials disabled"); + }, function() { + Notifications.error("Failed to disable credentials"); + }); + }); + }; + + $scope.emailActions = []; + $scope.emailActionsTimeout = TimeUnit2.asUnit(realm.actionTokenGeneratedByAdminLifespan); + $scope.disableableCredentialTypes = []; + + $scope.sendExecuteActionsEmail = function() { + if ($scope.changed) { + Dialog.message("Cannot send email", "You must save your current changes before you can send an email"); + return; + } + Dialog.confirm('Send Email', 'Are you sure you want to send email to user?', function() { + UserExecuteActionsEmail.update({ realm: realm.realm, userId: user.id, lifespan: $scope.emailActionsTimeout.toSeconds() }, $scope.emailActions, function() { + Notifications.success("Email sent to user"); + $scope.emailActions = []; + }, function() { + Notifications.error("Failed to send email to user"); + }); + }); + }; + + + + $scope.$watch('user', function() { + if (!angular.equals($scope.user, user)) { + $scope.userChange = true; + } else { + $scope.userChange = false; + } + }, true); + + $scope.$watch('password', function() { + if (!!$scope.password){ + $scope.pwdChange = true; + } else { + $scope.pwdChange = false; + } + }, true); + + $scope.reset = function() { + $scope.password = ""; + $scope.confirmPassword = ""; + + $scope.user = angular.copy(user); + + $scope.isTotp = false; + if(!!user.totp){ + $scope.isTotp = user.totp; + } + + $scope.pwdChange = false; + $scope.userChange = false; + }; +}); + +module.controller('UserFederationCtrl', function($scope, $location, $route, realm, serverInfo, Components, Notifications, Dialog) { + console.log('UserFederationCtrl ++++****'); + $scope.realm = realm; + $scope.providers = serverInfo.componentTypes['org.keycloak.storage.UserStorageProvider']; + $scope.instancesLoaded = false; + + if (!$scope.providers) $scope.providers = []; + + $scope.addProvider = function(provider) { + console.log('Add provider: ' + provider.id); + $location.url("/create/user-storage/" + realm.realm + "/providers/" + provider.id); + }; + + $scope.getInstanceLink = function(instance) { + return "/realms/" + realm.realm + "/user-storage/providers/" + instance.providerId + "/" + instance.id; + } + + $scope.getInstanceName = function(instance) { + return instance.name; + } + $scope.getInstanceProvider = function(instance) { + return instance.providerId; + } + + $scope.getInstancePriority = function(instance) { + if (!instance.config['priority']) { + console.log('getInstancePriority is undefined'); + } + return instance.config['priority'][0]; + } + + Components.query({realm: realm.realm, + parent: realm.id, + type: 'org.keycloak.storage.UserStorageProvider' + }, function(data) { + $scope.instances = data; + $scope.instancesLoaded = true; + }); + + $scope.removeInstance = function(instance) { + Dialog.confirmDelete(instance.name, 'user storage provider', function() { + Components.remove({ + realm : realm.realm, + componentId : instance.id + }, function() { + $route.reload(); + Notifications.success("The provider has been deleted."); + }); + }); + }; +}); + +module.controller('GenericUserStorageCtrl', function($scope, $location, Notifications, $route, Dialog, realm, + serverInfo, instance, providerId, Components, UserStorageOperations) { + console.log('GenericUserStorageCtrl'); + console.log('providerId: ' + providerId); + $scope.create = !instance.providerId; + console.log('create: ' + $scope.create); + var providers = serverInfo.componentTypes['org.keycloak.storage.UserStorageProvider']; + console.log('providers length ' + providers.length); + var providerFactory = null; + for (var i = 0; i < providers.length; i++) { + var p = providers[i]; + console.log('provider: ' + p.id); + if (p.id == providerId) { + $scope.providerFactory = p; + providerFactory = p; + break; + } + + } + $scope.showSync = false; + $scope.changed = false; + + console.log("providerFactory: " + providerFactory.id); + + function initUserStorageSettings() { + if ($scope.create) { + $scope.changed = true; + instance.name = providerFactory.id; + instance.providerId = providerFactory.id; + instance.providerType = 'org.keycloak.storage.UserStorageProvider'; + instance.parentId = realm.id; + instance.config = { + + }; + instance.config['priority'] = ["0"]; + + $scope.fullSyncEnabled = false; + $scope.changedSyncEnabled = false; + if (providerFactory.metadata.synchronizable) { + instance.config['fullSyncPeriod'] = ['-1']; + instance.config['changedSyncPeriod'] = ['-1']; + + } + instance.config['cachePolicy'] = ['DEFAULT']; + instance.config['evictionDay'] = ['']; + instance.config['evictionHour'] = ['']; + instance.config['evictionMinute'] = ['']; + instance.config['maxLifespan'] = ['']; + if (providerFactory.properties) { + + for (var i = 0; i < providerFactory.properties.length; i++) { + var configProperty = providerFactory.properties[i]; + if (configProperty.defaultValue) { + instance.config[configProperty.name] = [configProperty.defaultValue]; + } else { + instance.config[configProperty.name] = ['']; + } + + } + } + + } else { + $scope.changed = false; + $scope.fullSyncEnabled = (instance.config['fullSyncPeriod'] && instance.config['fullSyncPeriod'][0] > 0); + $scope.changedSyncEnabled = (instance.config['changedSyncPeriod'] && instance.config['changedSyncPeriod'][0]> 0); + if (providerFactory.metadata.synchronizable) { + if (!instance.config['fullSyncPeriod']) { + console.log('setting to -1'); + instance.config['fullSyncPeriod'] = ['-1']; + + } + if (!instance.config['changedSyncPeriod']) { + console.log('setting to -1'); + instance.config['changedSyncPeriod'] = ['-1']; + + } + } + if (!instance.config['cachePolicy']) { + instance.config['cachePolicy'] = ['DEFAULT']; + + } + if (!instance.config['evictionDay']) { + instance.config['evictionDay'] = ['']; + + } + if (!instance.config['evictionHour']) { + instance.config['evictionHour'] = ['']; + + } + if (!instance.config['evictionMinute']) { + instance.config['evictionMinute'] = ['']; + + } + if (!instance.config['maxLifespan']) { + instance.config['maxLifespan'] = ['']; + + } + if (!instance.config['priority']) { + instance.config['priority'] = ['0']; + } + + if (providerFactory.properties) { + for (var i = 0; i < providerFactory.properties.length; i++) { + var configProperty = providerFactory.properties[i]; + if (!instance.config[configProperty.name]) { + instance.config[configProperty.name] = ['']; + } + } + } + + } + if (providerFactory.metadata.synchronizable) { + if (instance.config && instance.config['importEnabled']) { + $scope.showSync = instance.config['importEnabled'][0] == 'true'; + } else { + $scope.showSync = true; + } + } + + } + + initUserStorageSettings(); + $scope.instance = angular.copy(instance); + $scope.realm = realm; + + $scope.$watch('instance', function() { + if (!angular.equals($scope.instance, instance)) { + $scope.changed = true; + } + + }, true); + + $scope.$watch('fullSyncEnabled', function(newVal, oldVal) { + if (oldVal == newVal) { + return; + } + + $scope.instance.config['fullSyncPeriod'][0] = $scope.fullSyncEnabled ? "604800" : "-1"; + $scope.changed = true; + }); + + $scope.$watch('changedSyncEnabled', function(newVal, oldVal) { + if (oldVal == newVal) { + return; + } + + $scope.instance.config['changedSyncPeriod'][0] = $scope.changedSyncEnabled ? "86400" : "-1"; + $scope.changed = true; + }); + + + $scope.save = function() { + console.log('save provider'); + $scope.changed = false; + if ($scope.create) { + console.log('saving new provider'); + Components.save({realm: realm.realm}, $scope.instance, function (data, headers) { + var l = headers().location; + var id = l.substring(l.lastIndexOf("/") + 1); + + $location.url("/realms/" + realm.realm + "/user-storage/providers/" + $scope.instance.providerId + "/" + id); + Notifications.success("The provider has been created."); + }); + } else { + console.log('update existing provider'); + Components.update({realm: realm.realm, + componentId: instance.id + }, + $scope.instance, function () { + $route.reload(); + Notifications.success("The provider has been updated."); + }); + } + }; + + $scope.reset = function() { + //initUserStorageSettings(); + //$scope.instance = angular.copy(instance); + $route.reload(); + }; + + $scope.cancel = function() { + console.log('cancel'); + if ($scope.create) { + $location.url("/realms/" + realm.realm + "/user-federation"); + } else { + $route.reload(); + } + }; + + $scope.triggerFullSync = function() { + console.log('GenericCtrl: triggerFullSync'); + triggerSync('triggerFullSync'); + } + + $scope.triggerChangedUsersSync = function() { + console.log('GenericCtrl: triggerChangedUsersSync'); + triggerSync('triggerChangedUsersSync'); + } + + function triggerSync(action) { + UserStorageOperations.sync.save({ action: action, realm: $scope.realm.realm, componentId: $scope.instance.id }, {}, function(syncResult) { + $route.reload(); + Notifications.success("Sync of users finished successfully. " + syncResult.status); + }, function() { + $route.reload(); + Notifications.error("Error during sync of users"); + }); + } + $scope.removeImportedUsers = function() { + UserStorageOperations.removeImportedUsers.save({ realm: $scope.realm.realm, componentId: $scope.instance.id }, {}, function(syncResult) { + $route.reload(); + Notifications.success("Remove imported users finished successfully. "); + }, function() { + $route.reload(); + Notifications.error("Error during remove"); + }); + }; + $scope.unlinkUsers = function() { + UserStorageOperations.unlinkUsers.save({ realm: $scope.realm.realm, componentId: $scope.instance.id }, {}, function(syncResult) { + $route.reload(); + Notifications.success("Unlink of users finished successfully. "); + }, function() { + $route.reload(); + Notifications.error("Error during unlink"); + }); + }; + +}); + + +function removeGroupMember(groups, member) { + for (var j = 0; j < groups.length; j++) { + //console.log('checking: ' + groups[j].path); + if (member.path == groups[j].path) { + groups.splice(j, 1); + break; + } + if (groups[j].subGroups && groups[j].subGroups.length > 0) { + //console.log('going into subgroups'); + removeGroupMember(groups[j].subGroups, member); + } + } +} +module.controller('UserGroupMembershipCtrl', function($scope, $route, realm, groups, user, UserGroupMembership, UserGroupMapping, Notifications, $location, Dialog) { + $scope.realm = realm; + $scope.user = user; + $scope.groupList = groups; + $scope.selectedGroup = null; + $scope.tree = []; + + UserGroupMembership.query({realm: realm.realm, userId: user.id}, function(data) { + $scope.groupMemberships = data; + for (var i = 0; i < data.length; i++) { + var member = data[i]; + removeGroupMember(groups, member); + } + + }); + + + + $scope.joinGroup = function() { + if (!$scope.tree.currentNode) { + Notifications.error('Please select a group to add'); + return; + }; + UserGroupMapping.update({realm: realm.realm, userId: user.id, groupId: $scope.tree.currentNode.id}, function() { + Notifications.success('Added group membership'); + $route.reload(); + }); + + }; + + $scope.leaveGroup = function() { + if (!$scope.selectedGroup) { + return; + + } + UserGroupMapping.remove({realm: realm.realm, userId: user.id, groupId: $scope.selectedGroup.id}, function() { + Notifications.success('Removed group membership'); + $route.reload(); + }); + + }; + + var isLeaf = function(node) { + return node.id != "realm" && (!node.subGroups || node.subGroups.length == 0); + }; + + $scope.getGroupClass = function(node) { + if (node.id == "realm") { + return 'pficon pficon-users'; + } + if (isLeaf(node)) { + return 'normal'; + } + if (node.subGroups.length && node.collapsed) return 'collapsed'; + if (node.subGroups.length && !node.collapsed) return 'expanded'; + return 'collapsed'; + + } + + $scope.getSelectedClass = function(node) { + if (node.selected) { + return 'selected'; + } else if ($scope.cutNode && $scope.cutNode.id == node.id) { + return 'cut'; + } + return undefined; + } + +}); + +module.controller('LDAPUserStorageCtrl', function($scope, $location, Notifications, $route, Dialog, realm, + serverInfo, instance, Components, UserStorageOperations, RealmLDAPConnectionTester) { + console.log('LDAPUserStorageCtrl'); + var providerId = 'ldap'; + console.log('providerId: ' + providerId); + $scope.create = !instance.providerId; + console.log('create: ' + $scope.create); + var providers = serverInfo.componentTypes['org.keycloak.storage.UserStorageProvider']; + console.log('providers length ' + providers.length); + var providerFactory = null; + for (var i = 0; i < providers.length; i++) { + var p = providers[i]; + console.log('provider: ' + p.id); + if (p.id == providerId) { + $scope.providerFactory = p; + providerFactory = p; + break; + } + + } + + $scope.provider = instance; + $scope.showSync = false; + + if (serverInfo.profileInfo.name == 'community') { + $scope.ldapVendors = [ + {"id": "ad", "name": "Active Directory"}, + {"id": "rhds", "name": "Red Hat Directory Server"}, + {"id": "tivoli", "name": "Tivoli"}, + {"id": "edirectory", "name": "Novell eDirectory"}, + {"id": "other", "name": "Other"} + ]; + } else { + $scope.ldapVendors = [ + {"id": "ad", "name": "Active Directory"}, + {"id": "rhds", "name": "Red Hat Directory Server"} + ]; + } + + $scope.authTypes = [ + { "id": "none", "name": "none" }, + { "id": "simple", "name": "simple" } + ]; + + $scope.searchScopes = [ + { "id": "1", "name": "One Level" }, + { "id": "2", "name": "Subtree" } + ]; + + $scope.useTruststoreOptions = [ + { "id": "always", "name": "Always" }, + { "id": "ldapsOnly", "name": "Only for ldaps" }, + { "id": "never", "name": "Never" } + ]; + + var DEFAULT_BATCH_SIZE = "1000"; + + + console.log("providerFactory: " + providerFactory.id); + + $scope.changed = false; + function initUserStorageSettings() { + if ($scope.create) { + $scope.changed = true; + instance.name = 'ldap'; + instance.providerId = 'ldap'; + instance.providerType = 'org.keycloak.storage.UserStorageProvider'; + instance.parentId = realm.id; + instance.config = { + + }; + instance.config['priority'] = ["0"]; + + $scope.fullSyncEnabled = false; + $scope.changedSyncEnabled = false; + instance.config['fullSyncPeriod'] = ['-1']; + instance.config['changedSyncPeriod'] = ['-1']; + instance.config['cachePolicy'] = ['DEFAULT']; + instance.config['evictionDay'] = ['']; + instance.config['evictionHour'] = ['']; + instance.config['evictionMinute'] = ['']; + instance.config['maxLifespan'] = ['']; + instance.config['batchSizeForSync'] = [DEFAULT_BATCH_SIZE]; + //instance.config['importEnabled'] = ['true']; + + if (providerFactory.properties) { + + for (var i = 0; i < providerFactory.properties.length; i++) { + var configProperty = providerFactory.properties[i]; + if (configProperty.defaultValue) { + instance.config[configProperty.name] = [configProperty.defaultValue]; + } else { + instance.config[configProperty.name] = ['']; + } + + } + } + + + } else { + $scope.changed = false; + $scope.fullSyncEnabled = (instance.config['fullSyncPeriod'] && instance.config['fullSyncPeriod'][0] > 0); + $scope.changedSyncEnabled = (instance.config['changedSyncPeriod'] && instance.config['changedSyncPeriod'][0]> 0); + if (!instance.config['fullSyncPeriod']) { + console.log('setting to -1'); + instance.config['fullSyncPeriod'] = ['-1']; + + } + if (!instance.config['changedSyncPeriod']) { + console.log('setting to -1'); + instance.config['changedSyncPeriod'] = ['-1']; + + } + if (!instance.config['cachePolicy']) { + instance.config['cachePolicy'] = ['DEFAULT']; + + } + if (!instance.config['evictionDay']) { + instance.config['evictionDay'] = ['']; + + } + if (!instance.config['evictionHour']) { + instance.config['evictionHour'] = ['']; + + } + if (!instance.config['evictionMinute']) { + instance.config['evictionMinute'] = ['']; + + } + if (!instance.config['maxLifespan']) { + instance.config['maxLifespan'] = ['']; + + } + if (!instance.config['priority']) { + instance.config['priority'] = ['0']; + } + if (!instance.config['importEnabled']) { + instance.config['importEnabled'] = ['true']; + } + + if (providerFactory.properties) { + + for (var i = 0; i < providerFactory.properties.length; i++) { + var configProperty = providerFactory.properties[i]; + if (!instance.config[configProperty.name]) { + if (configProperty.defaultValue) { + instance.config[configProperty.name] = [configProperty.defaultValue]; + } else { + instance.config[configProperty.name] = ['']; + } + } + + } + } + + for (var i=0 ; i<$scope.ldapVendors.length ; i++) { + if ($scope.ldapVendors[i].id === instance.config['vendor'][0]) { + $scope.vendorName = $scope.ldapVendors[i].name; + } + }; + + + + } + if (instance.config && instance.config['importEnabled']) { + $scope.showSync = instance.config['importEnabled'][0] == 'true'; + } else { + $scope.showSync = true; + } + + $scope.lastVendor = instance.config['vendor'][0]; + } + + initUserStorageSettings(); + $scope.instance = angular.copy(instance); + $scope.realm = realm; + + $scope.$watch('instance', function() { + if (!angular.equals($scope.instance, instance)) { + $scope.changed = true; + } + + if (!angular.equals($scope.instance.config['vendor'][0], $scope.lastVendor)) { + console.log("LDAP vendor changed. Previous=" + $scope.lastVendor + " New=" + $scope.instance.config['vendor'][0]); + $scope.lastVendor = $scope.instance.config['vendor'][0]; + + if ($scope.lastVendor === "ad") { + $scope.instance.config['usernameLDAPAttribute'][0] = "cn"; + $scope.instance.config['userObjectClasses'][0] = "person, organizationalPerson, user"; + } else { + $scope.instance.config['usernameLDAPAttribute'][0] = "uid"; + $scope.instance.config['userObjectClasses'][0] = "inetOrgPerson, organizationalPerson"; + } + + $scope.instance.config['rdnLDAPAttribute'][0] = $scope.instance.config['usernameLDAPAttribute'][0]; + + var vendorToUUID = { + rhds: "nsuniqueid", + tivoli: "uniqueidentifier", + edirectory: "guid", + ad: "objectGUID", + other: "entryUUID" + }; + $scope.instance.config['uuidLDAPAttribute'][0] = vendorToUUID[$scope.lastVendor]; + } + + + }, true); + + $scope.$watch('fullSyncEnabled', function(newVal, oldVal) { + if (oldVal == newVal) { + return; + } + + $scope.instance.config['fullSyncPeriod'][0] = $scope.fullSyncEnabled ? "604800" : "-1"; + $scope.changed = true; + }); + + $scope.$watch('changedSyncEnabled', function(newVal, oldVal) { + if (oldVal == newVal) { + return; + } + + $scope.instance.config['changedSyncPeriod'][0] = $scope.changedSyncEnabled ? "86400" : "-1"; + $scope.changed = true; + }); + + + $scope.save = function() { + $scope.changed = false; + if (!$scope.instance.config['batchSizeForSync'] || !parseInt($scope.instance.config['batchSizeForSync'][0])) { + $scope.instance.config['batchSizeForSync'] = [ DEFAULT_BATCH_SIZE ]; + } else { + $scope.instance.config['batchSizeForSync'][0] = parseInt($scope.instance.config.batchSizeForSync).toString(); + } + + if ($scope.create) { + Components.save({realm: realm.realm}, $scope.instance, function (data, headers) { + var l = headers().location; + var id = l.substring(l.lastIndexOf("/") + 1); + + $location.url("/realms/" + realm.realm + "/user-storage/providers/" + $scope.instance.providerId + "/" + id); + Notifications.success("The provider has been created."); + }); + } else { + Components.update({realm: realm.realm, + componentId: instance.id + }, + $scope.instance, function () { + $route.reload(); + Notifications.success("The provider has been updated."); + }); + } + }; + + $scope.reset = function() { + $route.reload(); + }; + + $scope.cancel = function() { + if ($scope.create) { + $location.url("/realms/" + realm.realm + "/user-federation"); + } else { + $route.reload(); + } + }; + + $scope.triggerFullSync = function() { + console.log('GenericCtrl: triggerFullSync'); + triggerSync('triggerFullSync'); + } + + $scope.triggerChangedUsersSync = function() { + console.log('GenericCtrl: triggerChangedUsersSync'); + triggerSync('triggerChangedUsersSync'); + } + + + function triggerSync(action) { + UserStorageOperations.sync.save({ action: action, realm: $scope.realm.realm, componentId: $scope.instance.id }, {}, function(syncResult) { + $route.reload(); + Notifications.success("Sync of users finished successfully. " + syncResult.status); + }, function() { + $route.reload(); + Notifications.error("Error during sync of users"); + }); + } + $scope.removeImportedUsers = function() { + UserStorageOperations.removeImportedUsers.save({ realm: $scope.realm.realm, componentId: $scope.instance.id }, {}, function(syncResult) { + $route.reload(); + Notifications.success("Remove imported users finished successfully. "); + }, function() { + $route.reload(); + Notifications.error("Error during remove"); + }); + }; + $scope.unlinkUsers = function() { + UserStorageOperations.unlinkUsers.save({ realm: $scope.realm.realm, componentId: $scope.instance.id }, {}, function(syncResult) { + $route.reload(); + Notifications.success("Unlink of users finished successfully. "); + }, function() { + $route.reload(); + Notifications.error("Error during unlink"); + }); + }; + var initConnectionTest = function(testAction, ldapConfig) { + return { + action: testAction, + realm: $scope.realm.realm, + connectionUrl: ldapConfig.connectionUrl, + bindDn: ldapConfig.bindDn, + bindCredential: ldapConfig.bindCredential, + useTruststoreSpi: ldapConfig.useTruststoreSpi, + connectionTimeout: ldapConfig.connectionTimeout, + componentId: instance.id + }; + }; + + $scope.testConnection = function() { + console.log('LDAPCtrl: testConnection'); + RealmLDAPConnectionTester.get(initConnectionTest("testConnection", $scope.instance.config), function() { + Notifications.success("LDAP connection successful."); + }, function() { + Notifications.error("Error when trying to connect to LDAP. See server.log for details."); + }); + } + + $scope.testAuthentication = function() { + console.log('LDAPCtrl: testAuthentication'); + RealmLDAPConnectionTester.get(initConnectionTest("testAuthentication", $scope.instance.config), function() { + Notifications.success("LDAP authentication successful."); + }, function() { + Notifications.error("LDAP authentication failed. See server.log for details"); + }); + } + + + +}); + +module.controller('LDAPTabCtrl', function(Dialog, $scope, Current, Notifications, $location) { + $scope.removeUserFederation = function() { + Dialog.confirmDelete($scope.instance.name, 'ldap provider', function() { + $scope.instance.$remove({ + realm : Current.realm.realm, + componentId : $scope.instance.id + }, function() { + $location.url("/realms/" + Current.realm.realm + "/user-federation"); + Notifications.success("The provider has been deleted."); + }); + }); + }; +}); + + +module.controller('LDAPMapperListCtrl', function($scope, $location, Notifications, $route, Dialog, realm, provider, mappers) { + console.log('LDAPMapperListCtrl'); + + $scope.realm = realm; + $scope.provider = provider; + $scope.instance = provider; + + $scope.mappers = mappers; + +}); + +module.controller('LDAPMapperCtrl', function($scope, $route, realm, provider, mapperTypes, mapper, clients, Components, LDAPMapperSync, Notifications, Dialog, $location) { + console.log('LDAPMapperCtrl'); + $scope.realm = realm; + $scope.provider = provider; + $scope.clients = clients; + $scope.create = false; + $scope.changed = false; + + for (var i = 0; i < mapperTypes.length; i++) { + console.log('mapper.providerId: ' + mapper.providerId); + console.log('mapperTypes[i].id ' + mapperTypes[i].id); + if (mapperTypes[i].id == mapper.providerId) { + $scope.mapperType = mapperTypes[i]; + break; + } + } + + if ($scope.mapperType.properties) { + + for (var i = 0; i < $scope.mapperType.properties.length; i++) { + var configProperty = $scope.mapperType.properties[i]; + if (!mapper.config[configProperty.name]) { + if (configProperty.defaultValue) { + mapper.config[configProperty.name] = [configProperty.defaultValue]; + } else { + mapper.config[configProperty.name] = ['']; + } + } + + } + } + $scope.mapper = angular.copy(mapper); + + + $scope.$watch('mapper', function() { + if (!angular.equals($scope.mapper, mapper)) { + $scope.changed = true; + } + }, true); + + $scope.save = function() { + Components.update({realm: realm.realm, + componentId: mapper.id + }, + $scope.mapper, function () { + $route.reload(); + Notifications.success("The mapper has been updated."); + }); + }; + + $scope.reset = function() { + $scope.mapper = angular.copy(mapper); + $scope.changed = false; + }; + + $scope.remove = function() { + Dialog.confirmDelete($scope.mapper.name, 'ldap mapper', function() { + Components.remove({ + realm : realm.realm, + componentId : mapper.id + }, function() { + $location.url("/realms/" + realm.realm + '/ldap-mappers/' + provider.id); + Notifications.success("The provider has been deleted."); + }); + }); + }; + + $scope.triggerFedToKeycloakSync = function() { + triggerMapperSync("fedToKeycloak") + } + + $scope.triggerKeycloakToFedSync = function() { + triggerMapperSync("keycloakToFed"); + } + + function triggerMapperSync(direction) { + LDAPMapperSync.save({ direction: direction, realm: realm.realm, parentId: provider.id, mapperId : $scope.mapper.id }, {}, function(syncResult) { + Notifications.success("Data synced successfully. " + syncResult.status); + }, function(error) { + Notifications.error(error.data.errorMessage); + }); + } + +}); + +module.controller('LDAPMapperCreateCtrl', function($scope, realm, provider, mapperTypes, clients, Components, Notifications, Dialog, $location) { + console.log('LDAPMapperCreateCtrl'); + $scope.realm = realm; + $scope.provider = provider; + $scope.clients = clients; + $scope.create = true; + $scope.mapper = { config: {}}; + $scope.mapperTypes = mapperTypes; + $scope.mapperType = null; + $scope.changed = true; + + $scope.$watch('mapperType', function() { + if ($scope.mapperType != null) { + $scope.mapper.config = {}; + if ($scope.mapperType.properties) { + + for (var i = 0; i < $scope.mapperType.properties.length; i++) { + var configProperty = $scope.mapperType.properties[i]; + if (!$scope.mapper.config[configProperty.name]) { + if (configProperty.defaultValue) { + $scope.mapper.config[configProperty.name] = [configProperty.defaultValue]; + } else { + $scope.mapper.config[configProperty.name] = ['']; + } + } + + } + } + } + }, true); + + $scope.save = function() { + if ($scope.mapperType == null) { + Notifications.error("You need to select mapper type!"); + return; + } + + $scope.mapper.providerId = $scope.mapperType.id; + $scope.mapper.providerType = 'org.keycloak.storage.ldap.mappers.LDAPStorageMapper'; + $scope.mapper.parentId = provider.id; + + Components.save({realm: realm.realm}, $scope.mapper, function (data, headers) { + var l = headers().location; + var id = l.substring(l.lastIndexOf("/") + 1); + + $location.url("/realms/" + realm.realm + "/ldap-mappers/" + $scope.mapper.parentId + "/mappers/" + id); + Notifications.success("The mapper has been created."); + }); + }; + + $scope.reset = function() { + $location.url("/realms/" + realm.realm + '/ldap-mappers/' + provider.id); + }; + + +}); + + + + + diff --git a/admin/resources/js/loaders.js b/admin/resources/js/loaders.js new file mode 100644 index 0000000..47bbc02 --- /dev/null +++ b/admin/resources/js/loaders.js @@ -0,0 +1,536 @@ +'use strict'; + +var module = angular.module('keycloak.loaders', [ 'keycloak.services', 'ngResource' ]); + +module.factory('Loader', function($q) { + var loader = {}; + loader.get = function(service, id) { + return function() { + var i = id && id(); + var delay = $q.defer(); + service.get(i, function(entry) { + delay.resolve(entry); + }, function() { + delay.reject('Unable to fetch ' + i); + }); + return delay.promise; + }; + }; + loader.query = function(service, id) { + return function() { + var i = id && id(); + var delay = $q.defer(); + service.query(i, function(entry) { + delay.resolve(entry); + }, function() { + delay.reject('Unable to fetch ' + i); + }); + return delay.promise; + }; + }; + return loader; +}); + +module.factory('RealmListLoader', function(Loader, Realm, $q) { + return Loader.get(Realm); +}); + +module.factory('ServerInfoLoader', function(Loader, ServerInfo) { + return function() { + return ServerInfo.promise; + }; +}); + +module.factory('RealmLoader', function(Loader, Realm, $route, $q) { + return Loader.get(Realm, function() { + return { + id : $route.current.params.realm + } + }); +}); + +module.factory('RealmKeysLoader', function(Loader, RealmKeys, $route, $q) { + return Loader.get(RealmKeys, function() { + return { + id : $route.current.params.realm + } + }); +}); + +module.factory('RealmEventsConfigLoader', function(Loader, RealmEventsConfig, $route, $q) { + return Loader.get(RealmEventsConfig, function() { + return { + id : $route.current.params.realm + } + }); +}); + +module.factory('UserListLoader', function(Loader, User, $route, $q) { + return Loader.query(User, function() { + return { + realm : $route.current.params.realm + } + }); +}); + +module.factory('RequiredActionsListLoader', function(Loader, RequiredActions, $route, $q) { + return Loader.query(RequiredActions, function() { + return { + realm : $route.current.params.realm + } + }); +}); + +module.factory('UnregisteredRequiredActionsListLoader', function(Loader, UnregisteredRequiredActions, $route, $q) { + return Loader.query(UnregisteredRequiredActions, function() { + return { + realm : $route.current.params.realm + } + }); +}); + +module.factory('RealmSessionStatsLoader', function(Loader, RealmSessionStats, $route, $q) { + return Loader.get(RealmSessionStats, function() { + return { + realm : $route.current.params.realm + } + }); +}); + +module.factory('RealmClientSessionStatsLoader', function(Loader, RealmClientSessionStats, $route, $q) { + return Loader.query(RealmClientSessionStats, function() { + return { + realm : $route.current.params.realm + } + }); +}); + +module.factory('ClientProtocolMapperLoader', function(Loader, ClientProtocolMapper, $route, $q) { + return Loader.get(ClientProtocolMapper, function() { + return { + realm : $route.current.params.realm, + client : $route.current.params.client, + id: $route.current.params.id + } + }); +}); + +module.factory('ClientTemplateProtocolMapperLoader', function(Loader, ClientTemplateProtocolMapper, $route, $q) { + return Loader.get(ClientTemplateProtocolMapper, function() { + return { + realm : $route.current.params.realm, + template : $route.current.params.template, + id: $route.current.params.id + } + }); +}); + +module.factory('UserLoader', function(Loader, User, $route, $q) { + return Loader.get(User, function() { + return { + realm : $route.current.params.realm, + userId : $route.current.params.user + } + }); +}); + +module.factory('ComponentLoader', function(Loader, Components, $route, $q) { + return Loader.get(Components, function() { + return { + realm : $route.current.params.realm, + componentId: $route.current.params.componentId + } + }); +}); + +module.factory('LDAPMapperLoader', function(Loader, Components, $route, $q) { + return Loader.get(Components, function() { + return { + realm : $route.current.params.realm, + componentId: $route.current.params.mapperId + } + }); +}); + +module.factory('ComponentsLoader', function(Loader, Components, $route, $q) { + var componentsLoader = {}; + + componentsLoader.loadComponents = function(parent, componentType) { + return Loader.query(Components, function() { + return { + realm : $route.current.params.realm, + parent : parent, + type: componentType + } + })(); + }; + + return componentsLoader; +}); + +module.factory('SubComponentTypesLoader', function(Loader, SubComponentTypes, $route, $q) { + var componentsLoader = {}; + + componentsLoader.loadComponents = function(parent, componentType) { + return Loader.query(SubComponentTypes, function() { + return { + realm : $route.current.params.realm, + componentId : parent, + type: componentType + } + })(); + }; + + return componentsLoader; +}); + +module.factory('UserSessionStatsLoader', function(Loader, UserSessionStats, $route, $q) { + return Loader.get(UserSessionStats, function() { + return { + realm : $route.current.params.realm, + user : $route.current.params.user + } + }); +}); + +module.factory('UserSessionsLoader', function(Loader, UserSessions, $route, $q) { + return Loader.query(UserSessions, function() { + return { + realm : $route.current.params.realm, + user : $route.current.params.user + } + }); +}); + +module.factory('UserOfflineSessionsLoader', function(Loader, UserOfflineSessions, $route, $q) { + return Loader.query(UserOfflineSessions, function() { + return { + realm : $route.current.params.realm, + user : $route.current.params.user, + client : $route.current.params.client + } + }); +}); + +module.factory('UserFederatedIdentityLoader', function(Loader, UserFederatedIdentities, $route, $q) { + return Loader.query(UserFederatedIdentities, function() { + return { + realm : $route.current.params.realm, + user : $route.current.params.user + } + }); +}); + +module.factory('UserConsentsLoader', function(Loader, UserConsents, $route, $q) { + return Loader.query(UserConsents, function() { + return { + realm : $route.current.params.realm, + user : $route.current.params.user + } + }); +}); + + + +module.factory('RoleLoader', function(Loader, RoleById, $route, $q) { + return Loader.get(RoleById, function() { + return { + realm : $route.current.params.realm, + role : $route.current.params.role + } + }); +}); + +module.factory('RoleListLoader', function(Loader, Role, $route, $q) { + return Loader.query(Role, function() { + return { + realm : $route.current.params.realm + } + }); +}); + +module.factory('ClientRoleLoader', function(Loader, RoleById, $route, $q) { + return Loader.get(RoleById, function() { + return { + realm : $route.current.params.realm, + client : $route.current.params.client, + role : $route.current.params.role + } + }); +}); + +module.factory('ClientSessionStatsLoader', function(Loader, ClientSessionStats, $route, $q) { + return Loader.get(ClientSessionStats, function() { + return { + realm : $route.current.params.realm, + client : $route.current.params.client + } + }); +}); + +module.factory('ClientSessionCountLoader', function(Loader, ClientSessionCount, $route, $q) { + return Loader.get(ClientSessionCount, function() { + return { + realm : $route.current.params.realm, + client : $route.current.params.client + } + }); +}); + +module.factory('ClientOfflineSessionCountLoader', function(Loader, ClientOfflineSessionCount, $route, $q) { + return Loader.get(ClientOfflineSessionCount, function() { + return { + realm : $route.current.params.realm, + client : $route.current.params.client + } + }); +}); + +module.factory('ClientClaimsLoader', function(Loader, ClientClaims, $route, $q) { + return Loader.get(ClientClaims, function() { + return { + realm : $route.current.params.realm, + client : $route.current.params.client + } + }); +}); + +module.factory('ClientRoleListLoader', function(Loader, ClientRole, $route, $q) { + return Loader.query(ClientRole, function() { + return { + realm : $route.current.params.realm, + client : $route.current.params.client + } + }); +}); + + + +module.factory('ClientLoader', function(Loader, Client, $route, $q) { + return Loader.get(Client, function() { + return { + realm : $route.current.params.realm, + client : $route.current.params.client + } + }); +}); + +module.factory('ClientListLoader', function(Loader, Client, $route, $q) { + return Loader.query(Client, function() { + return { + realm : $route.current.params.realm + } + }); +}); + +module.factory('ClientTemplateLoader', function(Loader, ClientTemplate, $route, $q) { + return Loader.get(ClientTemplate, function() { + return { + realm : $route.current.params.realm, + template : $route.current.params.template + } + }); +}); + +module.factory('ClientTemplateListLoader', function(Loader, ClientTemplate, $route, $q) { + return Loader.query(ClientTemplate, function() { + return { + realm : $route.current.params.realm + } + }); +}); + +module.factory('ClientServiceAccountUserLoader', function(Loader, ClientServiceAccountUser, $route, $q) { + return Loader.get(ClientServiceAccountUser, function() { + return { + realm : $route.current.params.realm, + client : $route.current.params.client + } + }); +}); + + +module.factory('RoleMappingLoader', function(Loader, RoleMapping, $route, $q) { + var realm = $route.current.params.realm || $route.current.params.client; + + return Loader.query(RoleMapping, function() { + return { + realm : realm, + role : $route.current.params.role + } + }); +}); + +module.factory('IdentityProviderLoader', function(Loader, IdentityProvider, $route, $q) { + return Loader.get(IdentityProvider, function () { + return { + realm: $route.current.params.realm, + alias: $route.current.params.alias + } + }); +}); + +module.factory('IdentityProviderFactoryLoader', function(Loader, IdentityProviderFactory, $route, $q) { + return Loader.get(IdentityProviderFactory, function () { + return { + realm: $route.current.params.realm, + provider_id: $route.current.params.provider_id + } + }); +}); + +module.factory('IdentityProviderMapperTypesLoader', function(Loader, IdentityProviderMapperTypes, $route, $q) { + return Loader.get(IdentityProviderMapperTypes, function () { + return { + realm: $route.current.params.realm, + alias: $route.current.params.alias + } + }); +}); + +module.factory('IdentityProviderMappersLoader', function(Loader, IdentityProviderMappers, $route, $q) { + return Loader.query(IdentityProviderMappers, function () { + return { + realm: $route.current.params.realm, + alias: $route.current.params.alias + } + }); +}); + +module.factory('IdentityProviderMapperLoader', function(Loader, IdentityProviderMapper, $route, $q) { + return Loader.get(IdentityProviderMapper, function () { + return { + realm: $route.current.params.realm, + alias: $route.current.params.alias, + mapperId: $route.current.params.mapperId + } + }); +}); + +module.factory('AuthenticationFlowsLoader', function(Loader, AuthenticationFlows, $route, $q) { + return Loader.query(AuthenticationFlows, function() { + return { + realm : $route.current.params.realm, + flow: '' + } + }); +}); + +module.factory('AuthenticationFormProvidersLoader', function(Loader, AuthenticationFormProviders, $route, $q) { + return Loader.query(AuthenticationFormProviders, function() { + return { + realm : $route.current.params.realm + } + }); +}); + +module.factory('AuthenticationFormActionProvidersLoader', function(Loader, AuthenticationFormActionProviders, $route, $q) { + return Loader.query(AuthenticationFormActionProviders, function() { + return { + realm : $route.current.params.realm + } + }); +}); + +module.factory('AuthenticatorProvidersLoader', function(Loader, AuthenticatorProviders, $route, $q) { + return Loader.query(AuthenticatorProviders, function() { + return { + realm : $route.current.params.realm + } + }); +}); + +module.factory('ClientAuthenticatorProvidersLoader', function(Loader, ClientAuthenticatorProviders, $route, $q) { + return Loader.query(ClientAuthenticatorProviders, function() { + return { + realm : $route.current.params.realm + } + }); +}); + +module.factory('AuthenticationFlowLoader', function(Loader, AuthenticationFlows, $route, $q) { + return Loader.get(AuthenticationFlows, function() { + return { + realm : $route.current.params.realm, + flow: $route.current.params.flow + } + }); +}); + +module.factory('AuthenticationConfigDescriptionLoader', function(Loader, AuthenticationConfigDescription, $route, $q) { + return Loader.get(AuthenticationConfigDescription, function () { + return { + realm: $route.current.params.realm, + provider: $route.current.params.provider + } + }); +}); + +module.factory('PerClientAuthenticationConfigDescriptionLoader', function(Loader, PerClientAuthenticationConfigDescription, $route, $q) { + return Loader.get(PerClientAuthenticationConfigDescription, function () { + return { + realm: $route.current.params.realm + } + }); +}); + +module.factory('ExecutionIdLoader', function($route) { + return function() { return $route.current.params.executionId; }; +}); + +module.factory('AuthenticationConfigLoader', function(Loader, AuthenticationConfig, $route, $q) { + return Loader.get(AuthenticationConfig, function () { + return { + realm: $route.current.params.realm, + config: $route.current.params.config + } + }); +}); + +module.factory('GroupListLoader', function(Loader, Groups, $route, $q) { + return Loader.query(Groups, function() { + return { + realm : $route.current.params.realm + } + }); +}); + +module.factory('GroupCountLoader', function(Loader, GroupsCount, $route, $q) { + return Loader.query(GroupsCount, function() { + return { + realm : $route.current.params.realm, + top : true + } + }); +}); + +module.factory('GroupLoader', function(Loader, Group, $route, $q) { + return Loader.get(Group, function() { + return { + realm : $route.current.params.realm, + groupId : $route.current.params.group + } + }); +}); + +module.factory('ClientInitialAccessLoader', function(Loader, ClientInitialAccess, $route) { + return Loader.query(ClientInitialAccess, function() { + return { + realm: $route.current.params.realm + } + }); +}); + +module.factory('ClientRegistrationPolicyProvidersLoader', function(Loader, ClientRegistrationPolicyProviders, $route) { + return Loader.query(ClientRegistrationPolicyProviders, function() { + return { + realm: $route.current.params.realm + } + }); +}); + + + + + + diff --git a/admin/resources/js/services.js b/admin/resources/js/services.js new file mode 100644 index 0000000..ac0430c --- /dev/null +++ b/admin/resources/js/services.js @@ -0,0 +1,1830 @@ +'use strict'; + +var module = angular.module('keycloak.services', [ 'ngResource', 'ngRoute' ]); + +module.service('Dialog', function($modal) { + var dialog = {}; + + var openDialog = function(title, message, btns, template) { + var controller = function($scope, $modalInstance, title, message, btns) { + $scope.title = title; + $scope.message = message; + $scope.btns = btns; + + $scope.ok = function () { + $modalInstance.close(); + }; + $scope.cancel = function () { + $modalInstance.dismiss('cancel'); + }; + }; + + return $modal.open({ + templateUrl: resourceUrl + template, + controller: controller, + resolve: { + title: function() { + return title; + }, + message: function() { + return message; + }, + btns: function() { + return btns; + } + } + }).result; + } + + var escapeHtml = function(str) { + var div = document.createElement('div'); + div.appendChild(document.createTextNode(str)); + return div.innerHTML; + }; + + dialog.confirmDelete = function(name, type, success) { + var title = 'Delete ' + escapeHtml(type.charAt(0).toUpperCase() + type.slice(1)); + var msg = 'Are you sure you want to permanently delete the ' + type + ' ' + name + '?'; + var btns = { + ok: { + label: 'Delete', + cssClass: 'btn btn-danger' + }, + cancel: { + label: 'Cancel', + cssClass: 'btn btn-default' + } + } + + openDialog(title, msg, btns, '/templates/kc-modal.html').then(success); + } + + dialog.confirmGenerateKeys = function(name, type, success) { + var title = 'Generate new keys for realm'; + var msg = 'Are you sure you want to permanently generate new keys for ' + name + '?'; + var btns = { + ok: { + label: 'Generate Keys', + cssClass: 'btn btn-danger' + }, + cancel: { + label: 'Cancel', + cssClass: 'btn btn-default' + } + } + + openDialog(title, msg, btns, '/templates/kc-modal.html').then(success); + } + + dialog.confirm = function(title, message, success, cancel) { + var btns = { + ok: { + label: title, + cssClass: 'btn btn-danger' + }, + cancel: { + label: 'Cancel', + cssClass: 'btn btn-default' + } + } + + openDialog(title, message, btns, '/templates/kc-modal.html').then(success, cancel); + } + + dialog.message = function(title, message, success, cancel) { + var btns = { + ok: { + label: "Ok", + cssClass: 'btn btn-default' + } + } + + openDialog(title, message, btns, '/templates/kc-modal-message.html').then(success, cancel); + } + + dialog.open = function(title, message, btns, success, cancel) { + openDialog(title, message, btns, '/templates/kc-modal.html').then(success, cancel); + } + + return dialog +}); + +module.service('CopyDialog', function($modal) { + var dialog = {}; + dialog.open = function (title, suggested, success) { + var controller = function($scope, $modalInstance, title) { + $scope.title = title; + $scope.name = { value: 'Copy of ' + suggested }; + $scope.ok = function () { + console.log('ok with name: ' + $scope.name); + $modalInstance.close(); + success($scope.name.value); + }; + $scope.cancel = function () { + $modalInstance.dismiss('cancel'); + }; + } + $modal.open({ + templateUrl: resourceUrl + '/templates/kc-copy.html', + controller: controller, + resolve: { + title: function() { + return title; + } + } + }); + }; + return dialog; +}); + +module.factory('Notifications', function($rootScope, $timeout) { + // time (in ms) the notifications are shown + var delay = 5000; + + var notifications = {}; + notifications.current = { display: false }; + notifications.current.remove = function() { + if (notifications.scheduled) { + $timeout.cancel(notifications.scheduled); + delete notifications.scheduled; + } + delete notifications.current.type; + delete notifications.current.header; + delete notifications.current.message; + notifications.current.display = false; + console.debug("Remove message"); + } + + $rootScope.notification = notifications.current; + + notifications.message = function(type, header, message) { + notifications.current.remove(); + + notifications.current.type = type; + notifications.current.header = header; + notifications.current.message = message; + notifications.current.display = true; + + notifications.scheduled = $timeout(function() { + notifications.current.remove(); + }, delay); + + console.debug("Added message"); + } + + notifications.info = function(message) { + notifications.message("info", "Info!", message); + }; + + notifications.success = function(message) { + notifications.message("success", "Success!", message); + }; + + notifications.error = function(message) { + notifications.message("danger", "Error!", message); + }; + + notifications.warn = function(message) { + notifications.message("warning", "Warning!", message); + }; + + return notifications; +}); + + +module.factory('ComponentUtils', function() { + + var utils = {}; + + utils.addLastEmptyValueToMultivaluedLists = function(properties, config) { + if (!properties) { + return; + } + + for (var i=0 ; i 0) { + configProperty.push(''); + } + } + } + } + + + utils.removeLastEmptyValue = function(componentConfig) { + + for (var configPropertyName in componentConfig) { + var configVal = componentConfig[configPropertyName]; + if (configVal && configVal.length > 0) { + var lastVal = configVal[configVal.length - 1]; + if (lastVal === '') { + console.log('Remove empty value from config property: ' + configPropertyName); + configVal.splice(configVal.length - 1, 1); + } + } + } + } + + // Allows you to use ui-select2 with tag. + // In HTML you will then use property.mvOptions like this: + // Flows tab +module.service('LastFlowSelected', function() { + this.alias = null; +}); + +module.service('RealmRoleRemover', function() { + this.remove = function (role, realm, Dialog, $location, Notifications) { + Dialog.confirmDelete(role.name, 'role', function () { + role.$remove({ + realm: realm.realm, + role: role.id + }, function () { + $location.url("/realms/" + realm.realm + "/roles"); + Notifications.success("The role has been deleted."); + }); + }); + }; +}); + +module.factory('UserSessionStats', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/users/:user/session-stats', { + realm : '@realm', + user : '@user' + }); +}); +module.factory('UserSessions', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/users/:user/sessions', { + realm : '@realm', + user : '@user' + }); +}); +module.factory('UserOfflineSessions', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/users/:user/offline-sessions/:client', { + realm : '@realm', + user : '@user', + client : '@client' + }); +}); + +module.factory('UserSessionLogout', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/sessions/:session', { + realm : '@realm', + session : '@session' + }); +}); + +module.factory('UserLogout', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/users/:user/logout', { + realm : '@realm', + user : '@user' + }); +}); + +module.factory('UserFederatedIdentities', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/users/:user/federated-identity', { + realm : '@realm', + user : '@user' + }); +}); +module.factory('UserFederatedIdentity', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/users/:user/federated-identity/:provider', { + realm : '@realm', + user : '@user', + provider : '@provider' + }); +}); + +module.factory('UserConsents', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/users/:user/consents/:client', { + realm : '@realm', + user : '@user', + client: '@client' + }); +}); + +module.factory('UserImpersonation', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/users/:user/impersonation', { + realm : '@realm', + user : '@user' + }); +}); + +module.factory('UserCredentials', function($resource) { + var credentials = {}; + + credentials.resetPassword = $resource(authUrl + '/admin/realms/:realm/users/:userId/reset-password', { + realm : '@realm', + userId : '@userId' + }, { + update : { + method : 'PUT' + } + }).update; + + credentials.removeTotp = $resource(authUrl + '/admin/realms/:realm/users/:userId/remove-totp', { + realm : '@realm', + userId : '@userId' + }, { + update : { + method : 'PUT' + } + }).update; + + credentials.disableCredentialTypes = $resource(authUrl + '/admin/realms/:realm/users/:userId/disable-credential-types', { + realm : '@realm', + userId : '@userId' + }, { + update : { + method : 'PUT' + } + }).update; + + return credentials; +}); + +module.factory('UserExecuteActionsEmail', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/users/:userId/execute-actions-email', { + realm : '@realm', + userId : '@userId', + lifespan : '@lifespan', + }, { + update : { + method : 'PUT' + } + }); +}); + +module.factory('RealmRoleMapping', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/users/:userId/role-mappings/realm', { + realm : '@realm', + userId : '@userId' + }); +}); + +module.factory('CompositeRealmRoleMapping', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/users/:userId/role-mappings/realm/composite', { + realm : '@realm', + userId : '@userId' + }); +}); + +module.factory('AvailableRealmRoleMapping', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/users/:userId/role-mappings/realm/available', { + realm : '@realm', + userId : '@userId' + }); +}); + + +module.factory('ClientRoleMapping', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/users/:userId/role-mappings/clients/:client', { + realm : '@realm', + userId : '@userId', + client : "@client" + }); +}); + +module.factory('AvailableClientRoleMapping', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/users/:userId/role-mappings/clients/:client/available', { + realm : '@realm', + userId : '@userId', + client : "@client" + }); +}); + +module.factory('CompositeClientRoleMapping', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/users/:userId/role-mappings/clients/:client/composite', { + realm : '@realm', + userId : '@userId', + client : "@client" + }); +}); + +module.factory('ClientRealmScopeMapping', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/clients/:client/scope-mappings/realm', { + realm : '@realm', + client : '@client' + }); +}); + +module.factory('ClientAvailableRealmScopeMapping', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/clients/:client/scope-mappings/realm/available', { + realm : '@realm', + client : '@client' + }); +}); + +module.factory('ClientCompositeRealmScopeMapping', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/clients/:client/scope-mappings/realm/composite', { + realm : '@realm', + client : '@client' + }); +}); + +module.factory('ClientClientScopeMapping', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/clients/:client/scope-mappings/clients/:targetClient', { + realm : '@realm', + client : '@client', + targetClient : '@targetClient' + }); +}); + +module.factory('ClientAvailableClientScopeMapping', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/clients/:client/scope-mappings/clients/:targetClient/available', { + realm : '@realm', + client : '@client', + targetClient : '@targetClient' + }); +}); + +module.factory('ClientCompositeClientScopeMapping', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/clients/:client/scope-mappings/clients/:targetClient/composite', { + realm : '@realm', + client : '@client', + targetClient : '@targetClient' + }); +}); + + + +module.factory('RealmRoles', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/roles', { + realm : '@realm' + }); +}); + +module.factory('RoleRealmComposites', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/roles-by-id/:role/composites/realm', { + realm : '@realm', + role : '@role' + }); +}); + +module.factory('RealmPushRevocation', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/push-revocation', { + realm : '@realm' + }); +}); + +module.factory('RealmClearUserCache', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/clear-user-cache', { + realm : '@realm' + }); +}); + +module.factory('RealmClearRealmCache', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/clear-realm-cache', { + realm : '@realm' + }); +}); + +module.factory('RealmClearKeysCache', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/clear-keys-cache', { + realm : '@realm' + }); +}); + +module.factory('RealmSessionStats', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/session-stats', { + realm : '@realm' + }); +}); + +module.factory('RealmClientSessionStats', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/client-session-stats', { + realm : '@realm' + }); +}); + + +module.factory('RoleClientComposites', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/roles-by-id/:role/composites/clients/:client', { + realm : '@realm', + role : '@role', + client : "@client" + }); +}); + + +function roleControl($scope, realm, role, roles, clients, + ClientRole, RoleById, RoleRealmComposites, RoleClientComposites, + $http, $location, Notifications, Dialog) { + + $scope.$watch(function () { + return $location.path(); + }, function () { + $scope.path = $location.path().substring(1).split("/"); + }); + + $scope.$watch('role', function () { + if (!angular.equals($scope.role, role)) { + $scope.changed = true; + } + }, true); + + $scope.update = function () { + RoleById.update({ + realm: realm.realm, + role: role.id + }, $scope.role, function () { + $scope.changed = false; + role = angular.copy($scope.role); + Notifications.success("Your changes have been saved to the role."); + }); + }; + + $scope.reset = function () { + $scope.role = angular.copy(role); + $scope.changed = false; + }; + + if (!role.id) return; + + $scope.compositeSwitch = role.composite; + $scope.compositeSwitchDisabled = role.composite; + $scope.realmRoles = angular.copy(roles); + $scope.selectedRealmRoles = []; + $scope.selectedRealmMappings = []; + $scope.realmMappings = []; + $scope.clients = clients; + $scope.clientRoles = []; + $scope.selectedClientRoles = []; + $scope.selectedClientMappings = []; + $scope.clientMappings = []; + + for (var j = 0; j < $scope.realmRoles.length; j++) { + if ($scope.realmRoles[j].id == role.id) { + var realmRole = $scope.realmRoles[j]; + var idx = $scope.realmRoles.indexOf(realmRole); + $scope.realmRoles.splice(idx, 1); + break; + } + } + + + $scope.realmMappings = RoleRealmComposites.query({realm : realm.realm, role : role.id}, function(){ + for (var i = 0; i < $scope.realmMappings.length; i++) { + var role = $scope.realmMappings[i]; + for (var j = 0; j < $scope.realmRoles.length; j++) { + var realmRole = $scope.realmRoles[j]; + if (realmRole.id == role.id) { + var idx = $scope.realmRoles.indexOf(realmRole); + if (idx != -1) { + $scope.realmRoles.splice(idx, 1); + break; + } + } + } + } + }); + + $scope.addRealmRole = function() { + $scope.compositeSwitchDisabled=true; + $http.post(authUrl + '/admin/realms/' + realm.realm + '/roles-by-id/' + role.id + '/composites', + $scope.selectedRealmRoles).then(function() { + for (var i = 0; i < $scope.selectedRealmRoles.length; i++) { + var role = $scope.selectedRealmRoles[i]; + var idx = $scope.realmRoles.indexOf($scope.selectedRealmRoles[i]); + if (idx != -1) { + $scope.realmRoles.splice(idx, 1); + $scope.realmMappings.push(role); + } + } + $scope.selectedRealmRoles = []; + Notifications.success("Role added to composite."); + }); + }; + + $scope.deleteRealmRole = function() { + $scope.compositeSwitchDisabled=true; + $http.delete(authUrl + '/admin/realms/' + realm.realm + '/roles-by-id/' + role.id + '/composites', + {data : $scope.selectedRealmMappings, headers : {"content-type" : "application/json"}}).then(function() { + for (var i = 0; i < $scope.selectedRealmMappings.length; i++) { + var role = $scope.selectedRealmMappings[i]; + var idx = $scope.realmMappings.indexOf($scope.selectedRealmMappings[i]); + if (idx != -1) { + $scope.realmMappings.splice(idx, 1); + $scope.realmRoles.push(role); + } + } + $scope.selectedRealmMappings = []; + Notifications.success("Role removed from composite."); + }); + }; + + $scope.addClientRole = function() { + $scope.compositeSwitchDisabled=true; + $http.post(authUrl + '/admin/realms/' + realm.realm + '/roles-by-id/' + role.id + '/composites', + $scope.selectedClientRoles).then(function() { + for (var i = 0; i < $scope.selectedClientRoles.length; i++) { + var role = $scope.selectedClientRoles[i]; + var idx = $scope.clientRoles.indexOf($scope.selectedClientRoles[i]); + if (idx != -1) { + $scope.clientRoles.splice(idx, 1); + $scope.clientMappings.push(role); + } + } + $scope.selectedClientRoles = []; + }); + }; + + $scope.deleteClientRole = function() { + $scope.compositeSwitchDisabled=true; + $http.delete(authUrl + '/admin/realms/' + realm.realm + '/roles-by-id/' + role.id + '/composites', + {data : $scope.selectedClientMappings, headers : {"content-type" : "application/json"}}).then(function() { + for (var i = 0; i < $scope.selectedClientMappings.length; i++) { + var role = $scope.selectedClientMappings[i]; + var idx = $scope.clientMappings.indexOf($scope.selectedClientMappings[i]); + if (idx != -1) { + $scope.clientMappings.splice(idx, 1); + $scope.clientRoles.push(role); + } + } + $scope.selectedClientMappings = []; + }); + }; + + + $scope.changeClient = function() { + $scope.clientRoles = ClientRole.query({realm : realm.realm, client : $scope.compositeClient.id}, function() { + $scope.clientMappings = RoleClientComposites.query({realm : realm.realm, role : role.id, client : $scope.compositeClient.id}, function(){ + for (var i = 0; i < $scope.clientMappings.length; i++) { + var role = $scope.clientMappings[i]; + for (var j = 0; j < $scope.clientRoles.length; j++) { + var realmRole = $scope.clientRoles[j]; + if (realmRole.id == role.id) { + var idx = $scope.clientRoles.indexOf(realmRole); + if (idx != -1) { + $scope.clientRoles.splice(idx, 1); + break; + } + } + } + } + }); + for (var j = 0; j < $scope.clientRoles.length; j++) { + if ($scope.clientRoles[j] == role.id) { + var appRole = $scope.clientRoles[j]; + var idx = $scope.clientRoles.indexof(appRole); + $scope.clientRoles.splice(idx, 1); + break; + } + } + } + ); + }; + + + + +} + + +module.factory('Role', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/roles/:role', { + realm : '@realm', + role : '@role' + }, { + update : { + method : 'PUT' + } + }); +}); + +module.factory('RoleById', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/roles-by-id/:role', { + realm : '@realm', + role : '@role' + }, { + update : { + method : 'PUT' + } + }); +}); + +module.factory('ClientRole', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/clients/:client/roles/:role', { + realm : '@realm', + client : "@client", + role : '@role' + }, { + update : { + method : 'PUT' + } + }); +}); + +module.factory('ClientClaims', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/clients/:client/claims', { + realm : '@realm', + client : "@client" + }, { + update : { + method : 'PUT' + } + }); +}); + +module.factory('ClientProtocolMappersByProtocol', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/clients/:client/protocol-mappers/protocol/:protocol', { + realm : '@realm', + client : "@client", + protocol : "@protocol" + }); +}); + +module.factory('ClientTemplateProtocolMappersByProtocol', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/client-templates/:template/protocol-mappers/protocol/:protocol', { + realm : '@realm', + template : "@template", + protocol : "@protocol" + }); +}); + +module.factory('ClientTemplateRealmScopeMapping', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/client-templates/:template/scope-mappings/realm', { + realm : '@realm', + template : '@template' + }); +}); + +module.factory('ClientTemplateAvailableRealmScopeMapping', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/client-templates/:template/scope-mappings/realm/available', { + realm : '@realm', + template : '@template' + }); +}); + +module.factory('ClientTemplateCompositeRealmScopeMapping', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/client-templates/:template/scope-mappings/realm/composite', { + realm : '@realm', + template : '@template' + }); +}); + +module.factory('ClientTemplateClientScopeMapping', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/client-templates/:template/scope-mappings/clients/:targetClient', { + realm : '@realm', + template : '@template', + targetClient : '@targetClient' + }); +}); + +module.factory('ClientTemplateAvailableClientScopeMapping', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/client-templates/:template/scope-mappings/clients/:targetClient/available', { + realm : '@realm', + template : '@template', + targetClient : '@targetClient' + }); +}); + +module.factory('ClientTemplateCompositeClientScopeMapping', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/client-templates/:template/scope-mappings/clients/:targetClient/composite', { + realm : '@realm', + template : '@template', + targetClient : '@targetClient' + }); +}); + + +module.factory('ClientSessionStats', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/clients/:client/session-stats', { + realm : '@realm', + client : "@client" + }); +}); + +module.factory('ClientSessionStatsWithUsers', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/clients/:client/session-stats?users=true', { + realm : '@realm', + client : "@client" + }); +}); + +module.factory('ClientSessionCount', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/clients/:client/session-count', { + realm : '@realm', + client : "@client" + }); +}); + +module.factory('ClientUserSessions', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/clients/:client/user-sessions', { + realm : '@realm', + client : "@client" + }); +}); + +module.factory('ClientOfflineSessionCount', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/clients/:client/offline-session-count', { + realm : '@realm', + client : "@client" + }); +}); + +module.factory('ClientOfflineSessions', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/clients/:client/offline-sessions', { + realm : '@realm', + client : "@client" + }); +}); + +module.factory('RealmLogoutAll', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/logout-all', { + realm : '@realm' + }); +}); + +module.factory('ClientPushRevocation', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/clients/:client/push-revocation', { + realm : '@realm', + client : "@client" + }); +}); + +module.factory('ClientClusterNode', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/clients/:client/nodes/:node', { + realm : '@realm', + client : "@client" + }); +}); + +module.factory('ClientTestNodesAvailable', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/clients/:client/test-nodes-available', { + realm : '@realm', + client : "@client" + }); +}); + +module.factory('ClientCertificate', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/clients/:client/certificates/:attribute', { + realm : '@realm', + client : "@client", + attribute: "@attribute" + }); +}); + +module.factory('ClientCertificateGenerate', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/clients/:client/certificates/:attribute/generate', { + realm : '@realm', + client : "@client", + attribute: "@attribute" + }, + { + generate : { + method : 'POST' + } + }); +}); + +module.factory('ClientCertificateDownload', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/clients/:client/certificates/:attribute/download', { + realm : '@realm', + client : "@client", + attribute: "@attribute" + }, + { + download : { + method : 'POST', + responseType: 'arraybuffer' + } + }); +}); + +module.factory('Client', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/clients/:client', { + realm : '@realm', + client : '@client' + }, { + update : { + method : 'PUT' + } + }); +}); + +module.factory('ClientTemplate', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/client-templates/:template', { + realm : '@realm', + template : '@template' + }, { + update : { + method : 'PUT' + } + }); +}); + + +module.factory('ClientDescriptionConverter', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/client-description-converter', { + realm : '@realm' + }); +}); + +/* +module.factory('ClientInstallation', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/clients/:client/installation/providers/:provider', { + realm : '@realm', + client : '@client', + provider : '@provider' + }); +}); +*/ + + + +module.factory('ClientInstallation', function($resource) { + var url = authUrl + '/admin/realms/:realm/clients/:client/installation/providers/:provider'; + return { + url : function(parameters) + { + return url.replace(':realm', parameters.realm).replace(':client', parameters.client).replace(':provider', parameters.provider); + } + } +}); + +module.factory('ClientInstallationJBoss', function($resource) { + var url = authUrl + '/admin/realms/:realm/clients/:client/installation/jboss'; + return { + url : function(parameters) + { + return url.replace(':realm', parameters.realm).replace(':client', parameters.client); + } + } +}); + +module.factory('ClientSecret', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/clients/:client/client-secret', { + realm : '@realm', + client : '@client' + }, { + update : { + method : 'POST' + } + }); +}); + +module.factory('ClientRegistrationAccessToken', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/clients/:client/registration-access-token', { + realm : '@realm', + client : '@client' + }, { + update : { + method : 'POST' + } + }); +}); + +module.factory('ClientOrigins', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/clients/:client/allowed-origins', { + realm : '@realm', + client : '@client' + }, { + update : { + method : 'PUT', + isArray : true + } + }); +}); + +module.factory('ClientServiceAccountUser', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/clients/:client/service-account-user', { + realm : '@realm', + client : '@client' + }); +}); + +module.factory('Current', function(Realm, $route, $rootScope) { + var current = { + realms: {}, + realm: null + }; + + $rootScope.$on('$routeChangeStart', function() { + current.realms = Realm.query(null, function(realms) { + var currentRealm = null; + if ($route.current.params.realm) { + for (var i = 0; i < realms.length; i++) { + if (realms[i].realm == $route.current.params.realm) { + currentRealm = realms[i]; + } + } + } + current.realm = currentRealm; + }); + }); + + return current; +}); + +module.factory('TimeUnit', function() { + var t = {}; + + t.autoUnit = function(time) { + if (!time) { + return 'Hours'; + } + + var unit = 'Seconds'; + if (time % 60 == 0) { + unit = 'Minutes'; + time = time / 60; + } + if (time % 60 == 0) { + unit = 'Hours'; + time = time / 60; + } + if (time % 24 == 0) { + unit = 'Days' + time = time / 24; + } + return unit; + } + + t.toSeconds = function(time, unit) { + switch (unit) { + case 'Seconds': return time; + case 'Minutes': return time * 60; + case 'Hours': return time * 3600; + case 'Days': return time * 86400; + default: throw 'invalid unit ' + unit; + } + } + + t.toUnit = function(time, unit) { + switch (unit) { + case 'Seconds': return time; + case 'Minutes': return Math.ceil(time / 60); + case 'Hours': return Math.ceil(time / 3600); + case 'Days': return Math.ceil(time / 86400); + default: throw 'invalid unit ' + unit; + } + } + + return t; +}); + +module.factory('TimeUnit2', function() { + var t = {}; + + t.asUnit = function(time) { + var unit = 'Minutes'; + if (time) { + if (time < 60) { + time = 60; + } + + if (time % 60 == 0) { + unit = 'Minutes'; + time = time / 60; + } + if (time % 60 == 0) { + unit = 'Hours'; + time = time / 60; + } + if (time % 24 == 0) { + unit = 'Days' + time = time / 24; + } + } + + var v = { + unit: unit, + time: time, + toSeconds: function() { + switch (v.unit) { + case 'Minutes': + return v.time * 60; + case 'Hours': + return v.time * 3600; + case 'Days': + return v.time * 86400; + } + } + } + + return v; + } + + return t; +}); + +module.filter('removeSelectedPolicies', function() { + return function(policies, selectedPolicies) { + var result = []; + for(var i in policies) { + var policy = policies[i]; + var policyAvailable = true; + for(var j in selectedPolicies) { + if(policy.id === selectedPolicies[j].id && !policy.multipleSupported) { + policyAvailable = false; + } + } + if(policyAvailable) { + result.push(policy); + } + } + return result; + } +}); + +module.factory('IdentityProvider', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/identity-provider/instances/:alias', { + realm : '@realm', + alias : '@alias' + }, { + update: { + method : 'PUT' + } + }); +}); + +module.factory('IdentityProviderExport', function($resource) { + var url = authUrl + '/admin/realms/:realm/identity-provider/instances/:alias/export'; + return { + url : function(parameters) + { + return url.replace(':realm', parameters.realm).replace(':alias', parameters.alias); + } + } +}); + +module.factory('IdentityProviderFactory', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/identity-provider/providers/:provider_id', { + realm : '@realm', + provider_id : '@provider_id' + }); +}); + +module.factory('IdentityProviderMapperTypes', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/identity-provider/instances/:alias/mapper-types', { + realm : '@realm', + alias : '@alias' + }); +}); + +module.factory('IdentityProviderMappers', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/identity-provider/instances/:alias/mappers', { + realm : '@realm', + alias : '@alias' + }); +}); + +module.factory('IdentityProviderMapper', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/identity-provider/instances/:alias/mappers/:mapperId', { + realm : '@realm', + alias : '@alias', + mapperId: '@mapperId' + }, { + update: { + method : 'PUT' + } + }); +}); + +module.factory('AuthenticationFlowExecutions', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/authentication/flows/:alias/executions', { + realm : '@realm', + alias : '@alias' + }, { + update : { + method : 'PUT' + } + }); +}); + +module.factory('CreateExecutionFlow', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/authentication/flows/:alias/executions/flow', { + realm : '@realm', + alias : '@alias' + }); +}); + +module.factory('CreateExecution', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/authentication/flows/:alias/executions/execution', { + realm : '@realm', + alias : '@alias' + }); +}); + +module.factory('AuthenticationFlows', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/authentication/flows/:flow', { + realm : '@realm', + flow: '@flow' + }); +}); + +module.factory('AuthenticationFormProviders', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/authentication/form-providers', { + realm : '@realm' + }); +}); + +module.factory('AuthenticationFormActionProviders', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/authentication/form-action-providers', { + realm : '@realm' + }); +}); + +module.factory('AuthenticatorProviders', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/authentication/authenticator-providers', { + realm : '@realm' + }); +}); + +module.factory('ClientAuthenticatorProviders', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/authentication/client-authenticator-providers', { + realm : '@realm' + }); +}); + + +module.factory('AuthenticationFlowsCopy', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/authentication/flows/:alias/copy', { + realm : '@realm', + alias : '@alias' + }); +}); +module.factory('AuthenticationConfigDescription', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/authentication/config-description/:provider', { + realm : '@realm', + provider: '@provider' + }); +}); +module.factory('PerClientAuthenticationConfigDescription', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/authentication/per-client-config-description', { + realm : '@realm' + }); +}); + +module.factory('AuthenticationConfig', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/authentication/config/:config', { + realm : '@realm', + config: '@config' + }, { + update: { + method : 'PUT' + } + }); +}); +module.factory('AuthenticationExecutionConfig', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/authentication/executions/:execution/config', { + realm : '@realm', + execution: '@execution' + }); +}); + +module.factory('AuthenticationExecution', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/authentication/executions/:execution', { + realm : '@realm', + execution : '@execution' + }, { + update : { + method : 'PUT' + } + }); +}); + +module.factory('AuthenticationExecutionRaisePriority', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/authentication/executions/:execution/raise-priority', { + realm : '@realm', + execution : '@execution' + }); +}); + +module.factory('AuthenticationExecutionLowerPriority', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/authentication/executions/:execution/lower-priority', { + realm : '@realm', + execution : '@execution' + }); +}); + + + +module.service('SelectRoleDialog', function($modal) { + var dialog = {}; + + var openDialog = function(title, message, btns) { + var controller = function($scope, $modalInstance, title, message, btns) { + $scope.title = title; + $scope.message = message; + $scope.btns = btns; + + $scope.ok = function () { + $modalInstance.close(); + }; + $scope.cancel = function () { + $modalInstance.dismiss('cancel'); + }; + }; + + return $modal.open({ + templateUrl: resourceUrl + '/templates/kc-modal.html', + controller: controller, + resolve: { + title: function() { + return title; + }, + message: function() { + return message; + }, + btns: function() { + return btns; + } + } + }).result; + } + + var escapeHtml = function(str) { + var div = document.createElement('div'); + div.appendChild(document.createTextNode(str)); + return div.innerHTML; + }; + + dialog.confirmDelete = function(name, type, success) { + var title = 'Delete ' + escapeHtml(type.charAt(0).toUpperCase() + type.slice(1)); + var msg = 'Are you sure you want to permanently delete the ' + type + ' ' + name + '?'; + var btns = { + ok: { + label: 'Delete', + cssClass: 'btn btn-danger' + }, + cancel: { + label: 'Cancel', + cssClass: 'btn btn-default' + } + } + + openDialog(title, msg, btns).then(success); + } + + dialog.confirmGenerateKeys = function(name, type, success) { + var title = 'Generate new keys for realm'; + var msg = 'Are you sure you want to permanently generate new keys for ' + name + '?'; + var btns = { + ok: { + label: 'Generate Keys', + cssClass: 'btn btn-danger' + }, + cancel: { + label: 'Cancel', + cssClass: 'btn btn-default' + } + } + + openDialog(title, msg, btns).then(success); + } + + dialog.confirm = function(title, message, success, cancel) { + var btns = { + ok: { + label: title, + cssClass: 'btn btn-danger' + }, + cancel: { + label: 'Cancel', + cssClass: 'btn btn-default' + } + } + + openDialog(title, message, btns).then(success, cancel); + } + + return dialog +}); + +module.factory('Group', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/groups/:groupId', { + realm : '@realm', + userId : '@groupId' + }, { + update : { + method : 'PUT' + } + }); +}); + +module.factory('GroupChildren', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/groups/:groupId/children', { + realm : '@realm', + groupId : '@groupId' + }); +}); + +module.factory('GroupsCount', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/groups/count', { + realm : '@realm' + }, + { + query: { + isArray: false, + method: 'GET', + params: {}, + transformResponse: function (data) { + return angular.fromJson(data) + } + } + }); +}); + +module.factory('Groups', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/groups', { + realm : '@realm' + }) +}); + +module.factory('GroupRealmRoleMapping', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/groups/:groupId/role-mappings/realm', { + realm : '@realm', + groupId : '@groupId' + }); +}); + +module.factory('GroupCompositeRealmRoleMapping', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/groups/:groupId/role-mappings/realm/composite', { + realm : '@realm', + groupId : '@groupId' + }); +}); + +module.factory('GroupAvailableRealmRoleMapping', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/groups/:groupId/role-mappings/realm/available', { + realm : '@realm', + groupId : '@groupId' + }); +}); + + +module.factory('GroupClientRoleMapping', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/groups/:groupId/role-mappings/clients/:client', { + realm : '@realm', + groupId : '@groupId', + client : "@client" + }); +}); + +module.factory('GroupAvailableClientRoleMapping', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/groups/:groupId/role-mappings/clients/:client/available', { + realm : '@realm', + groupId : '@groupId', + client : "@client" + }); +}); + +module.factory('GroupCompositeClientRoleMapping', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/groups/:groupId/role-mappings/clients/:client/composite', { + realm : '@realm', + groupId : '@groupId', + client : "@client" + }); +}); + +module.factory('GroupMembership', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/groups/:groupId/members', { + realm : '@realm', + groupId : '@groupId' + }); +}); + +module.factory('RoleMembership', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/roles/:role/users', { + realm : '@realm', + role : '@role' + }); +}); + + +module.factory('UserGroupMembership', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/users/:userId/groups', { + realm : '@realm', + userId : '@userId' + }); +}); + +module.factory('UserGroupMapping', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/users/:userId/groups/:groupId', { + realm : '@realm', + userId : '@userId', + groupId : '@groupId' + }, { + update : { + method : 'PUT' + } + }); +}); + +module.factory('DefaultGroups', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/default-groups/:groupId', { + realm : '@realm', + groupId : '@groupId' + }, { + update : { + method : 'PUT' + } + }); +}); + +module.factory('SubComponentTypes', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/components/:componentId/sub-component-types', { + realm: '@realm', + componentId: '@componentId' + }); +}); + +module.factory('Components', function($resource, ComponentUtils) { + return $resource(authUrl + '/admin/realms/:realm/components/:componentId', { + realm : '@realm', + componentId : '@componentId' + }, { + update : { + method : 'PUT', + transformRequest: function(componentInstance) { + + if (componentInstance.config) { + ComponentUtils.removeLastEmptyValue(componentInstance.config); + } + + return angular.toJson(componentInstance); + } + }, + save : { + method : 'POST', + transformRequest: function(componentInstance) { + + if (componentInstance.config) { + ComponentUtils.removeLastEmptyValue(componentInstance.config); + } + + return angular.toJson(componentInstance); + } + } + }); +}); + +module.factory('UserStorageOperations', function($resource) { + var object = {} + object.sync = $resource(authUrl + '/admin/realms/:realm/user-storage/:componentId/sync', { + realm : '@realm', + componentId : '@componentId' + }); + object.removeImportedUsers = $resource(authUrl + '/admin/realms/:realm/user-storage/:componentId/remove-imported-users', { + realm : '@realm', + componentId : '@componentId' + }); + object.unlinkUsers = $resource(authUrl + '/admin/realms/:realm/user-storage/:componentId/unlink-users', { + realm : '@realm', + componentId : '@componentId' + }); + object.simpleName = $resource(authUrl + '/admin/realms/:realm/user-storage/:componentId/name', { + realm : '@realm', + componentId : '@componentId' + }); + return object; +}); + + +module.factory('ClientRegistrationPolicyProviders', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/client-registration-policy/providers', { + realm : '@realm', + }); +}); + +module.factory('LDAPMapperSync', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/user-storage/:parentId/mappers/:mapperId/sync', { + realm : '@realm', + componentId : '@componentId', + mapperId: '@mapperId' + }); +}); + + + + diff --git a/admin/resources/partials/authentication-flow-bindings.html b/admin/resources/partials/authentication-flow-bindings.html new file mode 100644 index 0000000..6bf39f3 --- /dev/null +++ b/admin/resources/partials/authentication-flow-bindings.html @@ -0,0 +1,83 @@ +
+

{{:: 'authentication' | translate}}

+ + + +
+
+ +
+
+ +
+
+ {{:: 'browser-flow.tooltip' | translate}} +
+
+ +
+
+ +
+
+ {{:: 'registration-flow.tooltip' | translate}} +
+
+ +
+
+ +
+
+ {{:: 'direct-grant-flow.tooltip' | translate}} +
+ +
+ +
+
+ +
+
+ {{:: 'reset-credentials.tooltip' | translate}} +
+ +
+ +
+
+ +
+
+ {{:: 'client-authentication.tooltip' | translate}} +
+ + +
+ +
+
+ +
+
+ {{:: 'docker-auth.tooltip' | translate}} +
+ +
+
+ + +
+
+
+ +
+ + + \ No newline at end of file diff --git a/admin/resources/partials/authentication-flows.html b/admin/resources/partials/authentication-flows.html new file mode 100644 index 0000000..3ef54b3 --- /dev/null +++ b/admin/resources/partials/authentication-flows.html @@ -0,0 +1,69 @@ +
+

{{:: 'authentication' | translate}}

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +    +
+ + + + + +
+
{{:: 'auth-type' | translate}}{{:: 'requirement' | translate}} 
+ + + {{execution.displayName|capitalize}}({{execution.alias}}) + + + + + +
{{:: 'no-executions-available' | translate}}
+
+ + \ No newline at end of file diff --git a/admin/resources/partials/authenticator-config.html b/admin/resources/partials/authenticator-config.html new file mode 100644 index 0000000..9ce157f --- /dev/null +++ b/admin/resources/partials/authenticator-config.html @@ -0,0 +1,55 @@ +
+ + + +

{{:: 'create-authenticator-config' | translate}}

+

+ {{config.alias|capitalize}} + {{config.id}} + +

+ +
+ + + +
+
+ +
+ +
+
+
+ +
+ +
+ {{:: 'authenticator.alias.tooltip' | translate}} +
+ +
+ +
+
+ + +
+
+ +
+
+ + +
+
+
+
+ + \ No newline at end of file diff --git a/admin/resources/partials/authz/mgmt/broker-permissions.html b/admin/resources/partials/authz/mgmt/broker-permissions.html new file mode 100644 index 0000000..2e389ff --- /dev/null +++ b/admin/resources/partials/authz/mgmt/broker-permissions.html @@ -0,0 +1,40 @@ +
+ + + + +
+
+
+ +
+ +
+ {{:: 'permissions-enabled-role.tooltip' | translate}} +
+
+
+ + + + + + + + + + + + + + + + + +
+ + \ No newline at end of file diff --git a/admin/resources/partials/authz/mgmt/client-permissions.html b/admin/resources/partials/authz/mgmt/client-permissions.html new file mode 100644 index 0000000..7f29fd7 --- /dev/null +++ b/admin/resources/partials/authz/mgmt/client-permissions.html @@ -0,0 +1,39 @@ +
+ + + + +
+
+
+ +
+ +
+ {{:: 'permissions-enabled-role.tooltip' | translate}} +
+
+
+ + + + + + + + + + + + + + + + + +
+ + \ No newline at end of file diff --git a/admin/resources/partials/authz/mgmt/client-role-permissions.html b/admin/resources/partials/authz/mgmt/client-role-permissions.html new file mode 100644 index 0000000..c76ecec --- /dev/null +++ b/admin/resources/partials/authz/mgmt/client-role-permissions.html @@ -0,0 +1,40 @@ +
+ + + + +
+
+
+ +
+ +
+ {{:: 'permissions-enabled-role.tooltip' | translate}} +
+
+
+ + + + + + + + + + + + + + + + + +
+ + \ No newline at end of file diff --git a/admin/resources/partials/authz/mgmt/group-permissions.html b/admin/resources/partials/authz/mgmt/group-permissions.html new file mode 100644 index 0000000..f2be6d9 --- /dev/null +++ b/admin/resources/partials/authz/mgmt/group-permissions.html @@ -0,0 +1,39 @@ +
+ + + + +
+
+
+ +
+ +
+ {{:: 'permissions-enabled-role.tooltip' | translate}} +
+
+
+ + + + + + + + + + + + + + + + + +
+ + \ No newline at end of file diff --git a/admin/resources/partials/authz/mgmt/realm-role-permissions.html b/admin/resources/partials/authz/mgmt/realm-role-permissions.html new file mode 100644 index 0000000..e21ee63 --- /dev/null +++ b/admin/resources/partials/authz/mgmt/realm-role-permissions.html @@ -0,0 +1,39 @@ +
+ + + + +
+
+
+ +
+ +
+ {{:: 'permissions-enabled-role.tooltip' | translate}} +
+
+
+ + + + + + + + + + + + + + + + + +
+ + \ No newline at end of file diff --git a/admin/resources/partials/authz/mgmt/users-permissions.html b/admin/resources/partials/authz/mgmt/users-permissions.html new file mode 100644 index 0000000..2665bba --- /dev/null +++ b/admin/resources/partials/authz/mgmt/users-permissions.html @@ -0,0 +1,35 @@ +
+ + + +
+
+
+ +
+ +
+ {{:: 'permissions-enabled-users.tooltip' | translate}} +
+
+
+ + + + + + + + + + + + + + + + + +
+ + \ No newline at end of file diff --git a/admin/resources/partials/authz/permission/provider/resource-server-policy-resource-detail.html b/admin/resources/partials/authz/permission/provider/resource-server-policy-resource-detail.html new file mode 100644 index 0000000..6a02a0a --- /dev/null +++ b/admin/resources/partials/authz/permission/provider/resource-server-policy-resource-detail.html @@ -0,0 +1,91 @@ +
+ + + +

{{:: 'authz-add-resource-permission' | translate}}

+

{{originalPolicy.name|capitalize}}

+ +
+
+
+ +
+ +
+ {{:: 'authz-permission-name.tooltip' | translate}} +
+
+ +
+ +
+ {{:: 'authz-permission-description.tooltip' | translate}} +
+
+ +
+ +
+ {{:: 'authz-permission-resource-apply-to-resource-type.tooltip' | translate}} +
+
+ + +
+ +
+ {{:: 'authz-permission-resource-resource.tooltip' | translate}} +
+
+ + +
+ +
+ + {{:: 'authz-permission-resource-type.tooltip' | translate}} +
+
+ + +
+ +
+ + {{:: 'authz-policy-apply-policy.tooltip' | translate}} +
+
+ + +
+ +
+ + {{:: 'authz-policy-decision-strategy.tooltip' | translate}} +
+ +
+ +
+
+ + +
+
+
+
+ + \ No newline at end of file diff --git a/admin/resources/partials/authz/permission/provider/resource-server-policy-scope-detail.html b/admin/resources/partials/authz/permission/provider/resource-server-policy-scope-detail.html new file mode 100644 index 0000000..df4377f --- /dev/null +++ b/admin/resources/partials/authz/permission/provider/resource-server-policy-scope-detail.html @@ -0,0 +1,94 @@ +
+ + + +

{{:: 'authz-add-scope-permission' | translate}}

+

{{originalPolicy.name|capitalize}}

+ +
+
+
+ +
+ +
+ {{:: 'authz-permission-name.tooltip' | translate}} +
+
+ +
+ +
+ {{:: 'authz-permission-description.tooltip' | translate}} +
+
+ + +
+ +
+ {{:: 'authz-permission-scope-resource.tooltip' | translate}} +
+
+ +
+ +
+ {{:: 'authz-permission-scope-scope.tooltip' | translate}} +
+
+ + +
+ +
+ {{:: 'authz-permission-scope-scope.tooltip' | translate}} +
+
+ + +
+ +
+ + {{:: 'authz-policy-apply-policy.tooltip' | translate}} +
+
+ + +
+ +
+ + {{:: 'authz-policy-decision-strategy.tooltip' | translate}} +
+ +
+
+
+ + +
+
+
+
+ + \ No newline at end of file diff --git a/admin/resources/partials/authz/permission/resource-server-permission-list.html b/admin/resources/partials/authz/permission/resource-server-permission-list.html new file mode 100644 index 0000000..2ee735b --- /dev/null +++ b/admin/resources/partials/authz/permission/resource-server-permission-list.html @@ -0,0 +1,127 @@ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ {{:: 'filter' | translate}}:   +
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+
+
+ +
+
+ +
+
+
{{:: 'name' | translate}}{{:: 'description' | translate}}{{:: 'type' | translate}}{{:: 'actions' | translate}}
+
+ + + +
+
{{policy.name}}{{policy.description}}{{policy.type}} + {{:: 'authz-show-details' | translate}} + + {{:: 'authz-hide-details' | translate}} + + {{:: 'delete' | translate}} +
+
+ + + + + + + + + + + +
Associated Policies
+ {{:: 'authz-no-permission-assigned' | translate}} + +
+
+
{{:: 'no-results' | translate}}{{:: 'authz-no-permissions-available' | translate}}
+
+ + \ No newline at end of file diff --git a/admin/resources/partials/authz/policy/provider/resource-server-policy-aggregate-detail.html b/admin/resources/partials/authz/policy/provider/resource-server-policy-aggregate-detail.html new file mode 100644 index 0000000..11d0827 --- /dev/null +++ b/admin/resources/partials/authz/policy/provider/resource-server-policy-aggregate-detail.html @@ -0,0 +1,81 @@ +
+ + + +

{{:: 'authz-add-aggregated-policy' | translate}}

+

{{originalPolicy.name|capitalize}}

+ +
+
+
+ +
+ +
+ {{:: 'authz-policy-name.tooltip' | translate}} +
+
+ +
+ +
+ {{:: 'authz-policy-description.tooltip' | translate}} +
+
+ + +
+ +
+ {{:: 'authz-policy-apply-policy.tooltip' | translate}} +
+
+ + +
+ +
+ + {{:: 'authz-policy-decision-strategy.tooltip' | translate}} +
+
+ + +
+ +
+ + {{:: 'authz-policy-logic.tooltip' | translate}} +
+ +
+ +
+
+ + +
+
+
+
+ + \ No newline at end of file diff --git a/admin/resources/partials/authz/policy/provider/resource-server-policy-client-detail.html b/admin/resources/partials/authz/policy/provider/resource-server-policy-client-detail.html new file mode 100644 index 0000000..de2da05 --- /dev/null +++ b/admin/resources/partials/authz/policy/provider/resource-server-policy-client-detail.html @@ -0,0 +1,91 @@ +
+ + + +

{{:: 'authz-add-client-policy' | translate}}

+

{{originalPolicy.name|capitalize}}

+ +
+
+
+ +
+ +
+ {{:: 'authz-policy-name.tooltip' | translate}} +
+
+ +
+ +
+ {{:: 'authz-policy-description.tooltip' | translate}} +
+
+ + +
+ + +
+ {{:: 'authz-policy-client-clients.tooltip' | translate}} +
+
+ +
+ + + + + + + + + + + + + + + + +
{{:: 'clientId' | translate}}{{:: 'actions' | translate}}
{{client.clientId}} + +
{{:: 'authz-no-clients-assigned' | translate}}
+
+
+
+ + +
+ +
+ + {{:: 'authz-policy-logic.tooltip' | translate}} +
+ +
+ +
+
+ + +
+
+
+
+ + \ No newline at end of file diff --git a/admin/resources/partials/authz/policy/provider/resource-server-policy-drools-detail.html b/admin/resources/partials/authz/policy/provider/resource-server-policy-drools-detail.html new file mode 100644 index 0000000..612a8a4 --- /dev/null +++ b/admin/resources/partials/authz/policy/provider/resource-server-policy-drools-detail.html @@ -0,0 +1,124 @@ +
+ + + +

{{:: 'authz-add-drools-policy' | translate}}

+

{{originalPolicy.name|capitalize}}

+ +
+
+
+ +
+ +
+ {{:: 'authz-policy-name.tooltip' | translate}} +
+
+ +
+ +
+ {{:: 'authz-policy-description.tooltip' | translate}} +
+
+ + +
+ +
+ {{:: 'authz-policy-drools-maven-artifact.tooltip' | translate}} +
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+
+ +
+
+ {{:: 'authz-policy-drools-module.tooltip' | translate}} +
+
+ +
+
+ +
+
+ {{:: 'authz-policy-drools-session.tooltip' | translate}} +
+
+ +
+ + +
+ {{:: 'authz-policy-drools-update-period.tooltip' | translate}} +
+
+ + +
+ +
+ + {{:: 'authz-policy-logic.tooltip' | translate}} +
+ +
+ +
+
+ + +
+
+
+
+ + \ No newline at end of file diff --git a/admin/resources/partials/authz/policy/provider/resource-server-policy-group-detail.html b/admin/resources/partials/authz/policy/provider/resource-server-policy-group-detail.html new file mode 100644 index 0000000..61af0f1 --- /dev/null +++ b/admin/resources/partials/authz/policy/provider/resource-server-policy-group-detail.html @@ -0,0 +1,124 @@ + + +
+ + + +

{{:: 'authz-add-group-policy' | translate}}

+

{{originalPolicy.name|capitalize}}

+ +
+
+
+ +
+ +
+ {{:: 'authz-policy-name.tooltip' | translate}} +
+
+ +
+ +
+ {{:: 'authz-policy-description.tooltip' | translate}} +
+
+ +
+ +
+ {{:: 'authz-policy-group-claim.tooltip' | translate}} +
+
+ +
+
+
+ + +
+ {{:: 'authz-policy-user-users.tooltip' | translate}} +
+
+ +
+ + + + + + + + + + + + + + + + + + +
{{:: 'path' | translate}}Extend to Children{{:: 'actions' | translate}}
{{group.path}} + + + +
{{:: 'authz-no-groups-assigned' | translate}}
+
+
+
+ + +
+ +
+ + {{:: 'authz-policy-logic.tooltip' | translate}} +
+ +
+
+
+ + +
+
+
+
+ + \ No newline at end of file diff --git a/admin/resources/partials/authz/policy/provider/resource-server-policy-js-detail.html b/admin/resources/partials/authz/policy/provider/resource-server-policy-js-detail.html new file mode 100644 index 0000000..679c15a --- /dev/null +++ b/admin/resources/partials/authz/policy/provider/resource-server-policy-js-detail.html @@ -0,0 +1,67 @@ + +
+ + + +

{{:: 'authz-add-js-policy' | translate}}

+

{{originalPolicy.name|capitalize}}

+ +
+
+
+ +
+ +
+ {{:: 'authz-policy-name.tooltip' | translate}} +
+
+ +
+ +
+ {{:: 'authz-policy-description.tooltip' | translate}} +
+
+ +
+
+
+ {{:: 'authz-policy-js-code.tooltip' | translate}} +
+
+ + +
+ +
+ + {{:: 'authz-policy-logic.tooltip' | translate}} +
+ +
+ +
+
+ + +
+
+
+
+ + \ No newline at end of file diff --git a/admin/resources/partials/authz/policy/provider/resource-server-policy-role-detail.html b/admin/resources/partials/authz/policy/provider/resource-server-policy-role-detail.html new file mode 100644 index 0000000..47e563a --- /dev/null +++ b/admin/resources/partials/authz/policy/provider/resource-server-policy-role-detail.html @@ -0,0 +1,166 @@ + + +
+ + + +

{{:: 'authz-add-role-policy' | translate}}

+

{{originalPolicy.name|capitalize}}

+ +
+
+
+ +
+ +
+ {{:: 'authz-policy-name.tooltip' | translate}} +
+
+ +
+ +
+ {{:: 'authz-policy-description.tooltip' | translate}} +
+
+ + +
+ +
+ + {{:: 'authz-policy-role-realm-roles.tooltip' | translate}} +
+
+ +
+ + + + + + + + + + + + + + + + + + +
{{:: 'name' | translate}}{{:: 'authz-required' | translate}}{{:: 'actions' | translate}}
{{role.name}} + +
{{:: 'authz-no-roles-assigned' | translate}}
+
+
+
+ + +
+ +
+ {{:: 'authz-policy-role-clients.tooltip' | translate}} +
+
+ + +
+ +
+ + {{:: 'authz-policy-role-client-roles.tooltip' | translate}} +
+
+ +
+ + + + + + + + + + + + + + + + + + + + +
{{:: 'name' | translate}}{{:: 'client' | translate}}{{:: 'authz-required' | translate}}{{:: 'actions' | translate}}
{{role.name}}{{role.container.name}} + +
{{:: 'authz-no-roles-assigned' | translate}}
+
+
+
+ + +
+ +
+ + {{:: 'authz-policy-logic.tooltip' | translate}} +
+ +
+
+
+ + +
+
+
+
+ + \ No newline at end of file diff --git a/admin/resources/partials/authz/policy/provider/resource-server-policy-time-detail.html b/admin/resources/partials/authz/policy/provider/resource-server-policy-time-detail.html new file mode 100644 index 0000000..81793d5 --- /dev/null +++ b/admin/resources/partials/authz/policy/provider/resource-server-policy-time-detail.html @@ -0,0 +1,117 @@ + +
+ + + + +

{{:: 'authz-add-time-policy' | translate}}

+

{{originalPolicy.name|capitalize}}

+ +
+
+
+ +
+ +
+ {{:: 'authz-policy-name.tooltip' | translate}} +
+
+ +
+ +
+ {{:: 'authz-policy-description.tooltip' | translate}} +
+
+ + +
+ +
+ {{:: 'authz-policy-time-not-before.tooltip' | translate}} +
+
+ + +
+ +
+ {{:: 'authz-policy-time-not-on-after.tooltip' | translate}} +
+
+ + +
+   to   +
+ {{:: 'authz-policy-time-day-month.tooltip' | translate}} +
+
+ + +
+   to   +
+ {{:: 'authz-policy-time-month.tooltip' | translate}} +
+
+ + +
+   to   +
+ {{:: 'authz-policy-time-year.tooltip' | translate}} +
+
+ + +
+   to   +
+ {{:: 'authz-policy-time-hour.tooltip' | translate}} +
+
+ + +
+   to   +
+ {{:: 'authz-policy-time-minute.tooltip' | translate}} +
+
+ + +
+ +
+ + {{:: 'authz-policy-logic.tooltip' | translate}} +
+ +
+ +
+
+ + +
+
+
+
+ + \ No newline at end of file diff --git a/admin/resources/partials/authz/policy/provider/resource-server-policy-user-detail.html b/admin/resources/partials/authz/policy/provider/resource-server-policy-user-detail.html new file mode 100644 index 0000000..c619910 --- /dev/null +++ b/admin/resources/partials/authz/policy/provider/resource-server-policy-user-detail.html @@ -0,0 +1,91 @@ +
+ + + +

{{:: 'authz-add-user-policy' | translate}}

+

{{originalPolicy.name|capitalize}}

+ +
+
+
+ +
+ +
+ {{:: 'authz-policy-name.tooltip' | translate}} +
+
+ +
+ +
+ {{:: 'authz-policy-description.tooltip' | translate}} +
+
+ + +
+ + +
+ {{:: 'authz-policy-user-users.tooltip' | translate}} +
+
+ +
+ + + + + + + + + + + + + + + + +
{{:: 'username' | translate}}{{:: 'actions' | translate}}
{{user.username}} + +
{{:: 'authz-no-users-assigned' | translate}}
+
+
+
+ + +
+ +
+ + {{:: 'authz-policy-logic.tooltip' | translate}} +
+ +
+ +
+
+ + +
+
+
+
+ + \ No newline at end of file diff --git a/admin/resources/partials/authz/policy/resource-server-policy-evaluate-result.html b/admin/resources/partials/authz/policy/resource-server-policy-evaluate-result.html new file mode 100644 index 0000000..cd8007f --- /dev/null +++ b/admin/resources/partials/authz/policy/resource-server-policy-evaluate-result.html @@ -0,0 +1,66 @@ +
+
+ {{:: 'authz-evaluation-no-result' | translate}} +
+ {{result.resource.name}} + +
+ + +
+
+ {{result.status}} + {{result.status}} +
+
+ {{:: 'authz-evaluation-result.tooltip' | translate}} +
+
+ + +
+ {{:: 'authz-no-scopes-available' | translate}} + +
+
    +
  • + {{scope.name}} +
  • +
+
+
+ {{:: 'authz-evaluation-scopes.tooltip' | translate}} +
+
+ + +
+ {{:: 'authz-evaluation-no-policies-resource' | translate}} +
+
+
  • + {{policyResult.policy.name}} + decision was {{policyResult.status}} + {{policyResult.status}} + by {{policyResult.policy.decisionStrategy}} decision. {{policyResult.policy.scopes.length > 0 ? (policyResult.status == 'DENY' ? 'Denied Scopes:' : 'Granted Scopes:') : ''}} {{scope}}{{$last ? '' : ', '}}{{policyResult.policy.scopes.length > 0 ? '.' : ''}} + +
  • + +
    +
    + {{:: 'authz-evaluation-policies.tooltip' | translate}} +
    +
    +
    +
    \ No newline at end of file diff --git a/admin/resources/partials/authz/policy/resource-server-policy-evaluate.html b/admin/resources/partials/authz/policy/resource-server-policy-evaluate.html new file mode 100644 index 0000000..aedbdea --- /dev/null +++ b/admin/resources/partials/authz/policy/resource-server-policy-evaluate.html @@ -0,0 +1,267 @@ +
    + + + + + + + + + +
    +
    + +
    + +
    + {{:: 'authz-evaluation-authorization-data.tooltip' | translate}} +
    +
    + +
    +
    +
    +
    + {{:: 'authz-evaluation-identity-information' | translate}} + {{:: 'authz-evaluation-identity-information.tooltip' | translate}} + +
    + + +
    +
    + +
    +
    + {{:: 'authz-evaluation-client.tooltip' | translate}} +
    +
    + + +
    + + +
    + + {{:: 'authz-evaluation-user.tooltip' | translate}} +
    + +
    + + +
    + +
    + + {{:: 'authz-evaluation-role.tooltip' | translate}} +
    +
    +
    + {{:: 'authz-evaluation-contextual-info' | translate}} + {{:: 'authz-evaluation-contextual-info.tooltip' | translate}} + +
    + + +
    + + + + + + + + + + + + + + + + + + + + +
    {{:: 'key' | translate}}{{:: 'value' | translate}}{{:: 'actions' | translate}}
    {{getContextAttributeName(key)}} + + + + +
    + + + + + + + +
    +
    + + {{:: 'authz-evaluation-contextual-attributes.tooltip' | translate}} +
    +
    +
    + {{:: 'authz-permissions' | translate}} + {{:: 'authz-evaluation-permissions.tooltip' | translate}} + +
    + + +
    + +
    + {{:: 'authz-permission-resource-apply-to-resource-type.tooltip' | translate}} + +
    +
    + + +
    + +
    + {{:: 'authz-permission-resource-resource.tooltip' | translate}} +
    +
    + + +
    + +
    + + {{:: 'authz-permission-resource-type.tooltip' | translate}} +
    +
    + + +
    + +
    + + {{:: 'authz-permission-scope-scope.tooltip' | translate}} +
    +
    + + +
    + +
    + + {{:: 'authz-permission-scope-scope.tooltip' | translate}} +
    +
    + + +
    + + + + + + + + + + + + + + + + + + + +
    {{:: 'authz-resource' | translate}}{{:: 'authz-scopes' | translate}}{{:: 'actions' | translate}}
    + {{:: 'authz-no-resources' | translate}} +
    {{resource.name ? resource.name : 'authz-evaluation-any-resource-with-scopes' | translate}} + {{:: 'authz-any-scope' | translate}}. + + + {{scope.name ? scope.name : scope}} {{$last ? '' : ', '}} + + + + +
    +
    +
    +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    +
    + + \ No newline at end of file diff --git a/admin/resources/partials/authz/policy/resource-server-policy-list.html b/admin/resources/partials/authz/policy/resource-server-policy-list.html new file mode 100644 index 0000000..8fe2117 --- /dev/null +++ b/admin/resources/partials/authz/policy/resource-server-policy-list.html @@ -0,0 +1,128 @@ +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    + {{:: 'filter' | translate}}:   +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    +
    + +
    +
    +
    + {{:: 'authz-hide-details' | translate}} + {{:: 'authz-show-details' | translate}} + +
    +
    +
    {{:: 'name' | translate}}{{:: 'description' | translate}}{{:: 'type' | translate}}{{:: 'actions' | translate}}
    +
    + + + +
    +
    {{policy.name}}{{policy.description}}{{policy.type}} + {{:: 'authz-show-details' | translate}} + + {{:: 'authz-hide-details' | translate}} + + {{:: 'delete' | translate}} +
    +
    + + + + + + + + + + + +
    Dependent Permissions and Policies
    + {{:: 'authz-no-permission-assigned' | translate}} + +
    +
    +
    {{:: 'no-results' | translate}}{{:: 'authz-no-policies-available' | translate}}
    +
    + + \ No newline at end of file diff --git a/admin/resources/partials/authz/resource-server-detail.html b/admin/resources/partials/authz/resource-server-detail.html new file mode 100644 index 0000000..092280f --- /dev/null +++ b/admin/resources/partials/authz/resource-server-detail.html @@ -0,0 +1,63 @@ +
    + + + + + +
    +
    +
    + +
    +
    + + +
    +
    + +
    +
    + {{:: 'authz-import-config.tooltip' | translate}} +
    +
    +
    + + +
    +
    +
    +
    +
    + +
    + +
    + {{:: 'authz-policy-enforcement-mode.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'authz-remote-resource-management.tooltip' | translate}} +
    +
    +
    + + +
    +
    +
    +
    +
    + + \ No newline at end of file diff --git a/admin/resources/partials/authz/resource-server-export-settings.html b/admin/resources/partials/authz/resource-server-export-settings.html new file mode 100644 index 0000000..86505db --- /dev/null +++ b/admin/resources/partials/authz/resource-server-export-settings.html @@ -0,0 +1,35 @@ +
    + + + + + +
    +
    +
    + +
    + + + +
    + {{:: 'authz-export-settings.tooltip' | translate}} +
    +
    +
    +
    + {{:: 'download' | translate}} + +
    +
    +
    +
    +
    +
    + + \ No newline at end of file diff --git a/admin/resources/partials/authz/resource-server-list.html b/admin/resources/partials/authz/resource-server-list.html new file mode 100644 index 0000000..3b4130e --- /dev/null +++ b/admin/resources/partials/authz/resource-server-list.html @@ -0,0 +1,49 @@ +
    +

    + Resource Servers + Resource Servers are applications serving resources to their users. These resources can be a RESTFul API, web pages or any other kind of resource that must be managed and protected by a set of authorization policies. +

    + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    + +
    + +
    +
    +
    + +
    + Create +
    +
    +
    NamePolicy Enforcement ModeAllows Remote Resource Management ?Allows Entitlement ?
    {{server.name}}{{server.policyEnforcementMode | toCamelCase}}{{server.allowRemoteResourceManagement}}{{server.allowEntitlements}}
    No resultsNo servers available
    +
    + + \ No newline at end of file diff --git a/admin/resources/partials/authz/resource-server-resource-detail.html b/admin/resources/partials/authz/resource-server-resource-detail.html new file mode 100644 index 0000000..e3bda1e --- /dev/null +++ b/admin/resources/partials/authz/resource-server-resource-detail.html @@ -0,0 +1,73 @@ +
    + + + +

    {{:: 'authz-add-resource' | translate}}

    +

    {{originalResource.name|capitalize}}

    + +
    +
    +
    + +
    + +
    + {{:: 'authz-resource-name.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'authz-resource-owner.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'authz-resource-type.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'authz-resource-uri.tooltip' | translate}} +
    +
    + + +
    + +
    + + {{:: 'authz-resource-scopes.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'authz-icon-uri.tooltip' | translate}} +
    +
    + +
    +
    + + +
    +
    +
    +
    + + \ No newline at end of file diff --git a/admin/resources/partials/authz/resource-server-resource-list.html b/admin/resources/partials/authz/resource-server-resource-list.html new file mode 100644 index 0000000..924edbc --- /dev/null +++ b/admin/resources/partials/authz/resource-server-resource-list.html @@ -0,0 +1,148 @@ +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + {{:: 'filter' | translate}}:   +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    +
    + +
    +
    {{:: 'name' | translate}}{{:: 'type' | translate}}{{:: 'authz-uri' | translate}}{{:: 'authz-owner' | translate}}{{:: 'actions' | translate}}
    +
    + + + +
    +
    {{resource.name}} + {{resource.type}} + {{:: 'authz-no-type-defined' | translate}} + + {{resource.uri}} + {{:: 'authz-no-uri-defined' | translate}} + {{resource.owner.name}} + {{:: 'authz-show-details' | translate}} + + {{:: 'authz-hide-details' | translate}} + + {{:: 'authz-create-permission' | translate}} + + {{:: 'delete' | translate}} +
    +
    + + + + + + + + + + + + + +
    ScopesAssociated Permissions
    + {{:: 'authz-no-scopes-assigned' | translate}} + + + {{:: 'authz-no-permission-assigned' | translate}} + +
    +
    +
    {{:: 'no-results' | translate}}{{:: 'authz-no-resources-available' | translate}}
    +
    + + diff --git a/admin/resources/partials/authz/resource-server-scope-detail.html b/admin/resources/partials/authz/resource-server-scope-detail.html new file mode 100644 index 0000000..a505bbc --- /dev/null +++ b/admin/resources/partials/authz/resource-server-scope-detail.html @@ -0,0 +1,43 @@ +
    + + + +

    {{:: 'authz-add-scope' | translate}}

    +

    {{originalScope.name|capitalize}}

    + +
    +
    +
    + +
    + +
    + {{:: 'authz-scope-name.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'authz-icon-uri.tooltip' | translate}} +
    +
    + +
    +
    + + +
    +
    +
    +
    + + \ No newline at end of file diff --git a/admin/resources/partials/authz/resource-server-scope-list.html b/admin/resources/partials/authz/resource-server-scope-list.html new file mode 100644 index 0000000..519c9f5 --- /dev/null +++ b/admin/resources/partials/authz/resource-server-scope-list.html @@ -0,0 +1,111 @@ +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    + +
    + +
    +
    +
    + +
    +
    + +
    +
    {{:: 'name' | translate}}{{:: 'actions' | translate}}
    +
    + + + +
    +
    {{scope.name}} + {{:: 'authz-show-details' | translate}} + + {{:: 'authz-hide-details' | translate}} + + {{:: 'authz-create-permission' | translate}} + + {{:: 'delete' | translate}} +
    +
    + + + + + + + + + + + + + +
    ResourcesAssociated Permissions
    + {{:: 'authz-no-resources-assigned' | translate}} + + + {{:: 'authz-no-permission-assigned' | translate}} + +
    +
    +
    {{:: 'no-results' | translate}}{{:: 'authz-no-scopes-available' | translate}}
    +
    + + \ No newline at end of file diff --git a/admin/resources/partials/brute-force.html b/admin/resources/partials/brute-force.html new file mode 100644 index 0000000..6ab0092 --- /dev/null +++ b/admin/resources/partials/brute-force.html @@ -0,0 +1,114 @@ +
    + + + + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    + {{:: 'permanent-lockout.tooltip' | translate}} +
    + +
    + + +
    + +
    + {{:: 'max-login-failures.tooltip' | translate}} +
    +
    + +
    + + +
    + {{:: 'wait-increment.tooltip' | translate}} +
    +
    + + +
    + +
    + {{:: 'quick-login-check-millis.tooltip' | translate}} +
    +
    + +
    + + +
    + {{:: 'min-quick-login-wait.tooltip' | translate}} +
    +
    + +
    + + +
    + {{:: 'max-wait.tooltip' | translate}} +
    +
    + +
    + + +
    + {{:: 'failure-reset-time.tooltip' | translate}} +
    +
    + +
    +
    + + +
    +
    +
    +
    + + \ No newline at end of file diff --git a/admin/resources/partials/claims.html b/admin/resources/partials/claims.html new file mode 100644 index 0000000..27357ca --- /dev/null +++ b/admin/resources/partials/claims.html @@ -0,0 +1,62 @@ +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    \ No newline at end of file diff --git a/admin/resources/partials/client-clustering-node.html b/admin/resources/partials/client-clustering-node.html new file mode 100644 index 0000000..7df3a42 --- /dev/null +++ b/admin/resources/partials/client-clustering-node.html @@ -0,0 +1,37 @@ +
    + + +

    {{:: 'add-node' | translate}}

    +

    + {{node.host|capitalize}} + +

    + +
    +
    + +
    + +
    +
    +
    + +
    + {{node.lastRegistration}} +
    +
    +
    +
    + +
    +
    +
    +
    + + \ No newline at end of file diff --git a/admin/resources/partials/client-clustering.html b/admin/resources/partials/client-clustering.html new file mode 100644 index 0000000..72ff437 --- /dev/null +++ b/admin/resources/partials/client-clustering.html @@ -0,0 +1,76 @@ +
    + + + + + +
    + {{:: 'basic-configuration' | translate}} +
    +
    + +
    +
    +
    + + +
    +
    +
    + {{:: 'node-reregistration-timeout.tooltip' | translate}} +
    + +
    +
    + + +
    +
    +
    + +
    + {{:: 'registered-cluster-nodes' | translate}} + + + + + + + + + + + + + + + + + + + + + + +
    + +
    {{:: 'node-host' | translate}}{{:: 'last-registration' | translate}}{{:: 'actions' | translate}}
    {{node.host}}{{node.lastRegistration}}{{:: 'edit' | translate}}{{:: 'delete' | translate}}
    {{:: 'no-registered-cluster-nodes' | translate}}
    +
    +
    +
    + + \ No newline at end of file diff --git a/admin/resources/partials/client-credentials-generic.html b/admin/resources/partials/client-credentials-generic.html new file mode 100644 index 0000000..39e9ebc --- /dev/null +++ b/admin/resources/partials/client-credentials-generic.html @@ -0,0 +1,14 @@ +
    +
    +
    + +
    + +
    +
    + + +
    +
    +
    +
    \ No newline at end of file diff --git a/admin/resources/partials/client-credentials-jwt-key-export.html b/admin/resources/partials/client-credentials-jwt-key-export.html new file mode 100644 index 0000000..82e50b7 --- /dev/null +++ b/admin/resources/partials/client-credentials-jwt-key-export.html @@ -0,0 +1,60 @@ +
    + + + +

    {{:: 'generate-private-key' | translate}}

    + +
    + + + +
    +
    + +
    +
    + +
    +
    + {{:: 'archive-format.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'key-alias.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'key-password.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'store-password.tooltip' | translate}} +
    +
    +
    + + +
    +
    +
    +
    +
    + + diff --git a/admin/resources/partials/client-credentials-jwt-key-import.html b/admin/resources/partials/client-credentials-jwt-key-import.html new file mode 100644 index 0000000..ec88cd6 --- /dev/null +++ b/admin/resources/partials/client-credentials-jwt-key-import.html @@ -0,0 +1,65 @@ +
    + + + +

    {{:: 'import-client-certificate' | translate}}

    + +
    + + + +
    +
    + +
    +
    + +
    +
    + {{:: 'archive-format.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'jwt-import.key-alias.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'store-password.tooltip' | translate}} +
    +
    + +
    +
    + + +
    + + {{files[0].name}} + +
    +
    +
    +
    + + +
    +
    +
    +
    +
    + + diff --git a/admin/resources/partials/client-credentials-jwt.html b/admin/resources/partials/client-credentials-jwt.html new file mode 100644 index 0000000..b2a5bf4 --- /dev/null +++ b/admin/resources/partials/client-credentials-jwt.html @@ -0,0 +1,74 @@ +
    + +
    + +
    + +
    + {{:: 'use-jwks-url.tooltip' | translate}} +
    + +
    + +
    + +
    + {{:: 'jwks-url.tooltip' | translate}} +
    + +
    + +
    + + {{:: 'certificate.tooltip' | translate}} + +
    + +
    +
    + +
    + + {{:: 'publicKey.tooltip' | translate}} + +
    + +
    +
    + +
    + + {{:: 'kid.tooltip' | translate}} + +
    +
    +
    + +
    +
    +
    +
    + +
    + +
    +
    +
    + {{:: 'no-client-certificate-configured' | translate}} +
    +
    +
    +
    + +
    + +
    +
    + + + + +
    +
    + +
    \ No newline at end of file diff --git a/admin/resources/partials/client-credentials-secret.html b/admin/resources/partials/client-credentials-secret.html new file mode 100644 index 0000000..7cf5bf1 --- /dev/null +++ b/admin/resources/partials/client-credentials-secret.html @@ -0,0 +1,17 @@ +
    +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    +
    +
    +
    +
    diff --git a/admin/resources/partials/client-credentials.html b/admin/resources/partials/client-credentials.html new file mode 100644 index 0000000..e6865a3 --- /dev/null +++ b/admin/resources/partials/client-credentials.html @@ -0,0 +1,38 @@ +
    + + + + + +
    +
    +
    + +
    +
    + +
    +
    + {{:: 'client-authenticator.tooltip' | translate}} +
    +
    +
    + +
    +
    + +
    + +
    +
    + +
    + + diff --git a/admin/resources/partials/client-detail.html b/admin/resources/partials/client-detail.html new file mode 100644 index 0000000..88d765a --- /dev/null +++ b/admin/resources/partials/client-detail.html @@ -0,0 +1,402 @@ +
    + + + + + +
    +
    +
    + +
    + +
    + {{:: 'client-id.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'client.name.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'client.description.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'client.enabled.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'consent-required.tooltip' | translate}} +
    +
    + +
    +
    + +
    +
    + {{:: 'client-protocol.tooltip' | translate}} +
    +
    + +
    +
    + +
    +
    + {{:: 'client-template.tooltip' | translate}} +
    +
    + +
    +
    + +
    +
    + {{:: 'access-type.tooltip' | translate}} +
    +
    + + {{:: 'standard-flow-enabled.tooltip' | translate}} +
    + +
    +
    +
    + + {{:: 'implicit-flow-enabled.tooltip' | translate}} +
    + +
    +
    +
    + + {{:: 'direct-access-grants-enabled.tooltip' | translate}} +
    + +
    +
    +
    + + {{:: 'service-accounts-enabled.tooltip' | translate}} +
    + +
    +
    +
    + + {{:: 'authz-authorization-services-enabled.tooltip' | translate}} +
    + +
    +
    +
    + +
    + +
    + {{:: 'include-authnstatement.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'include-onetimeuse-condition.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'sign-documents.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'sign-documents-redirect-enable-key-info-ext.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'sign-assertions.tooltip' | translate}} +
    +
    + +
    +
    + +
    +
    + {{:: 'signature-algorithm.tooltip' | translate}} +
    +
    + +
    +
    + +
    +
    + {{:: 'saml-signature-keyName-transformer.tooltip' | translate}} +
    +
    + +
    +
    + +
    +
    + {{:: 'canonicalization-method.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'encrypt-assertions.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'client-signature-required.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'force-post-binding.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'front-channel-logout.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'force-name-id-format.tooltip' | translate}} +
    +
    + +
    +
    + +
    +
    + {{:: 'name-id-format.tooltip' | translate}} +
    + +
    + +
    + +
    + {{:: 'root-url.tooltip' | translate}} +
    + +
    + + +
    +
    + +
    + +
    +
    + +
    + +
    + +
    +
    +
    + + {{:: 'valid-redirect-uris.tooltip' | translate}} +
    + +
    + +
    + +
    + {{:: 'base-url.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'admin-url.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'master-saml-processing-url.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'idp-sso-url-ref.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'idp-sso-relay-state.tooltip' | translate}} +
    +
    + + +
    +
    + +
    + +
    +
    + +
    + +
    + +
    +
    +
    + + {{:: 'web-origins.tooltip' | translate}} +
    +
    +
    + {{:: 'fine-saml-endpoint-conf' | translate}} {{:: 'fine-saml-endpoint-conf.tooltip' | translate}} +
    + +
    + +
    + {{:: 'assertion-consumer-post-binding-url.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'assertion-consumer-redirect-binding-url.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'logout-service-post-binding-url.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'logout-service-redir-binding-url.tooltip' | translate}} +
    +
    + +
    + {{:: 'fine-oidc-endpoint-conf' | translate}} {{:: 'fine-oidc-endpoint-conf.tooltip' | translate}} +
    + +
    +
    + +
    +
    + {{:: 'user-info-signed-response-alg.tooltip' | translate}} +
    +
    + +
    +
    + +
    +
    + {{:: 'request-object-signature-alg.tooltip' | translate}} +
    +
    + +
    +
    + + +
    +
    +
    +
    + + \ No newline at end of file diff --git a/admin/resources/partials/client-import.html b/admin/resources/partials/client-import.html new file mode 100644 index 0000000..18ec93c --- /dev/null +++ b/admin/resources/partials/client-import.html @@ -0,0 +1,46 @@ +
    + + + +

    {{:: 'import-client' | translate}}

    + +
    +
    +
    + +
    +
    +
    + +
    +
    +
    +
    +
    + +
    +
    + + +
    + + {{files[0].name}} + +
    +
    +
    +
    + + +
    +
    +
    +
    +
    + + \ No newline at end of file diff --git a/admin/resources/partials/client-initial-access-create.html b/admin/resources/partials/client-initial-access-create.html new file mode 100644 index 0000000..8c0cb19 --- /dev/null +++ b/admin/resources/partials/client-initial-access-create.html @@ -0,0 +1,63 @@ +
    + + + +

    {{:: 'add-client' | translate}}

    + +
    + +
    + + +
    + + +
    + {{:: 'expiration.tooltip' | translate}} +
    + +
    + +
    + +
    + {{:: 'count.tooltip' | translate}} +
    + +
    +
    + + +
    +
    +
    + +
    +
    + + +
    + +
    + + {{:: 'initial-access.copyPaste.tooltip' | translate}} +
    + +
    +
    + +
    +
    +
    +
    + + \ No newline at end of file diff --git a/admin/resources/partials/client-initial-access.html b/admin/resources/partials/client-initial-access.html new file mode 100644 index 0000000..cfb6a68 --- /dev/null +++ b/admin/resources/partials/client-initial-access.html @@ -0,0 +1,55 @@ +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    + +
    + +
    +
    +
    + + +
    +
    {{:: 'id' | translate}}{{:: 'created' | translate}}{{:: 'expires' | translate}}{{:: 'count' | translate}}{{:: 'remainingCount' | translate}}{{:: 'actions' | translate}}
    {{ia.id}}{{(ia.timestamp * 1000)|date:'shortDate'}} {{(ia.timestamp * 1000)|date:'mediumTime'}}{{((ia.timestamp + ia.expiration) * 1000)|date:'shortDate'}} {{((ia.timestamp + ia.expiration) * 1000)|date:'mediumTime'}}{{ia.count}}{{ia.remainingCount}}{{:: 'delete' | translate}}
    {{:: 'no-results' | translate}}{{:: 'no-initial-access-available' | translate}}
    +
    + + \ No newline at end of file diff --git a/admin/resources/partials/client-installation.html b/admin/resources/partials/client-installation.html new file mode 100644 index 0000000..d03fdd2 --- /dev/null +++ b/admin/resources/partials/client-installation.html @@ -0,0 +1,36 @@ +
    + + + + + +
    +
    +
    + +
    +
    +
    + +
    +
    +
    +
    +
    +
    +
    +
    + {{:: 'download' | translate}} + +
    +
    +
    +
    +
    + + diff --git a/admin/resources/partials/client-keys.html b/admin/resources/partials/client-keys.html new file mode 100644 index 0000000..c74f54f --- /dev/null +++ b/admin/resources/partials/client-keys.html @@ -0,0 +1,149 @@ +
    + + + + + +
    + + + +
    + {{:: 'import-keys-and-cert' | translate}} {{:: 'import-keys-and-cert.tooltip' | translate}} +
    + +
    +
    + +
    +
    + {{:: 'archive-format.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'key-alias.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'key-password.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'store-password.tooltip' | translate}} +
    +
    + + +
    +
    + + +
    +
    +
    + {{:: 'download-keys-and-cert' | translate}} Client key pair, cert, and realm certificate will be stuffed into a PKCS12 or Java keystore that you can use in your clients. +
    + +
    +
    + +
    +
    + Java keystore or PKCS12 archive format. +
    +
    + +
    + +
    + Archive alias for your private key and certificate. +
    +
    + +
    + +
    + Password to access the private key in the archive +
    +
    + +
    + +
    + Realm certificate is stored in archive too. This is the alias to it. +
    +
    + +
    + +
    + Password to access the archive itself +
    +
    +
    + +
    +
    +
    +
    + Keys and Certificate Keys and cert in PEM format. +
    + + +
    + +
    +
    +
    + + +
    + +
    +
    +
    + + +
    + +
    +
    +
    +
    + +
    +
    +
    +
    +
    + + \ No newline at end of file diff --git a/admin/resources/partials/client-list.html b/admin/resources/partials/client-list.html new file mode 100644 index 0000000..03ebf5c --- /dev/null +++ b/admin/resources/partials/client-list.html @@ -0,0 +1,56 @@ +
    +

    + {{:: 'clients' | translate}} + {{:: 'clients.tooltip' | translate}} +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + \ No newline at end of file diff --git a/admin/resources/partials/client-mappers-add.html b/admin/resources/partials/client-mappers-add.html new file mode 100644 index 0000000..6537779 --- /dev/null +++ b/admin/resources/partials/client-mappers-add.html @@ -0,0 +1,53 @@ +
    + + + +

    {{:: 'add-builtin-protocol-mapper' | translate}}

    + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    + +
    + +
    +
    +
    +
    +
    {{:: 'name' | translate}}{{:: 'category' | translate}}{{:: 'type' | translate}}{{:: 'add' | translate}}
    {{mapper.name}}{{mapperTypes[mapper.protocolMapper].category}}{{mapperTypes[mapper.protocolMapper].name}}
    {{:: 'no-mappers-available' | translate}}
    + +
    + +
    +
    + + \ No newline at end of file diff --git a/admin/resources/partials/client-mappers.html b/admin/resources/partials/client-mappers.html new file mode 100644 index 0000000..5648c19 --- /dev/null +++ b/admin/resources/partials/client-mappers.html @@ -0,0 +1,67 @@ +
    + + + + + +
    +
    +
    + + Inherit mappers from client template +
    + +
    + +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    {{:: 'name' | translate}}{{:: 'category' | translate}}{{:: 'type' | translate}}{{:: 'actions' | translate}}
    {{mapper.name}}{{mapperTypes[mapper.protocolMapper].category}}{{mapperTypes[mapper.protocolMapper].name}}{{:: 'edit' | translate}}{{:: 'delete' | translate}}
    {{:: 'no-mappers-available' | translate}}
    +
    + + \ No newline at end of file diff --git a/admin/resources/partials/client-offline-sessions.html b/admin/resources/partials/client-offline-sessions.html new file mode 100644 index 0000000..3d2aaf7 --- /dev/null +++ b/admin/resources/partials/client-offline-sessions.html @@ -0,0 +1,59 @@ +
    + + + + + +
    +
    +
    + +
    + +
    + {{:: 'offline-tokens.tooltip' | translate}} +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    {{:: 'user' | translate}}{{:: 'from-ip' | translate}}{{:: 'token-issued' | translate}}{{:: 'last-refresh' | translate}}
    +
    + + + +
    +
    {{session.username}}{{session.ipAddress}}{{session.start | date:'medium'}}{{session.lastAccess | date:'medium'}}
    +
    + + \ No newline at end of file diff --git a/admin/resources/partials/client-protocol-mapper-detail.html b/admin/resources/partials/client-protocol-mapper-detail.html new file mode 100644 index 0000000..b2af24a --- /dev/null +++ b/admin/resources/partials/client-protocol-mapper-detail.html @@ -0,0 +1,13 @@ +
    + + +
    +
    + + \ No newline at end of file diff --git a/admin/resources/partials/client-reg-policies.html b/admin/resources/partials/client-reg-policies.html new file mode 100644 index 0000000..9ca912f --- /dev/null +++ b/admin/resources/partials/client-reg-policies.html @@ -0,0 +1,106 @@ + + +
    + + + + +
    + +
    + {{:: 'anonymous-policies' | translate}}{{:: 'anonymous-policies.tooltip' | translate}} + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    + +
    +
    +
    {{:: 'policy-name' | translate}}{{:: 'provider-id' | translate}}{{:: 'actions' | translate}}
    {{instance.name}}{{instance.providerId}}{{:: 'edit' | translate}}{{:: 'delete' | translate}}
    {{:: 'no-client-reg-policies-configured' | translate}}
    +
    + +
    + {{:: 'auth-policies' | translate}}{{:: 'auth-policies.tooltip' | translate}} + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    + +
    +
    +
    {{:: 'policy-name' | translate}}{{:: 'provider-id' | translate}}{{:: 'actions' | translate}}
    {{instance.name}}{{instance.providerId}}{{:: 'edit' | translate}}{{:: 'delete' | translate}}
    {{:: 'no-client-reg-policies-configured' | translate}}
    +
    + + +
    +
    + + \ No newline at end of file diff --git a/admin/resources/partials/client-reg-policy-detail.html b/admin/resources/partials/client-reg-policy-detail.html new file mode 100644 index 0000000..c0fd074 --- /dev/null +++ b/admin/resources/partials/client-reg-policy-detail.html @@ -0,0 +1,68 @@ + + +
    + + + +
    +
    + {{instance.name}}{{:: providerType.helpText | translate}} +
    + +
    + +
    +
    +
    + +
    + +
    + {{:: 'client-reg-policy.name.tooltip' | translate}} +
    +
    + +
    + +
    + {{providerType.helpText}} +
    + +
    + +
    +
    + + +
    +
    + +
    +
    + + +
    +
    +
    + +
    + + \ No newline at end of file diff --git a/admin/resources/partials/client-reg-trusted-host-create.html b/admin/resources/partials/client-reg-trusted-host-create.html new file mode 100644 index 0000000..cb07613 --- /dev/null +++ b/admin/resources/partials/client-reg-trusted-host-create.html @@ -0,0 +1,55 @@ + + +
    + + + +

    {{:: 'add-client-reg-trusted-host' | translate}}

    + +
    + +
    + +
    + +
    + {{:: 'client-reg-hostname.tooltip' | translate}} +
    + +
    + +
    + +
    + {{:: 'client-reg-count.tooltip' | translate}} +
    + +
    +
    + + +
    +
    +
    + +
    + + \ No newline at end of file diff --git a/admin/resources/partials/client-reg-trusted-host-detail.html b/admin/resources/partials/client-reg-trusted-host-detail.html new file mode 100644 index 0000000..5644fc1 --- /dev/null +++ b/admin/resources/partials/client-reg-trusted-host-detail.html @@ -0,0 +1,64 @@ + + +
    + + + +

    {{hostName}}

    + +
    + +
    + +
    + +
    + {{:: 'client-reg-hostname.tooltip' | translate}} +
    + +
    + +
    + +
    + {{:: 'client-reg-count.tooltip' | translate}} +
    + +
    + +
    + +
    + {{:: 'client-reg-remainingCount.tooltip' | translate}} +
    + +
    +
    + + + +
    +
    +
    + +
    + + \ No newline at end of file diff --git a/admin/resources/partials/client-registration-access-token.html b/admin/resources/partials/client-registration-access-token.html new file mode 100644 index 0000000..327b70d --- /dev/null +++ b/admin/resources/partials/client-registration-access-token.html @@ -0,0 +1,18 @@ +
    +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    +
    + {{:: 'registrationAccessToken.tooltip' | translate}} +
    +
    +
    diff --git a/admin/resources/partials/client-revocation.html b/admin/resources/partials/client-revocation.html new file mode 100644 index 0000000..95db767 --- /dev/null +++ b/admin/resources/partials/client-revocation.html @@ -0,0 +1,30 @@ +
    + + + + + +
    +
    +
    + +
    + +
    + {{:: 'client-revoke.not-before.tooltip' | translate}} +
    +
    +
    +
    + + + +
    +
    +
    +
    + + diff --git a/admin/resources/partials/client-role-detail.html b/admin/resources/partials/client-role-detail.html new file mode 100644 index 0000000..67c96fc --- /dev/null +++ b/admin/resources/partials/client-role-detail.html @@ -0,0 +1,140 @@ +
    + + + + + +
    + +
    +
    + + +
    + +
    +
    +
    + + +
    + + +
    +
    +
    + + {{:: 'scope-param-required.tooltip' | translate}} +
    + +
    +
    +
    + +
    + +
    + {{:: 'composite-roles.tooltip' | translate}} +
    +
    + +
    +
    + + +
    +
    +
    +
    + + +
    +
    + +
    + {{:: 'composite-roles' | translate}} + +
    + + +
    +
    +
    + + {{:: 'composite.available-realm-roles.tooltip' | translate}} + + +
    +
    + + {{:: 'composite.associated-realm-roles.tooltip' | translate}} + + +
    +
    +
    +
    + +
    + + +
    +
    +
    {{:: 'select-client-to-view-roles' | translate}}
    +
    +
    +
    + + {{:: 'available-roles.tooltip' | translate}} + + +
    +
    + + {{:: 'client.associated-roles.tooltip' | translate}} + + +
    +
    +
    +
    +
    +
    +
    + + \ No newline at end of file diff --git a/admin/resources/partials/client-role-list.html b/admin/resources/partials/client-role-list.html new file mode 100644 index 0000000..9906074 --- /dev/null +++ b/admin/resources/partials/client-role-list.html @@ -0,0 +1,41 @@ +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    {{:: 'role-name' | translate}}{{:: 'composite' | translate}}{{:: 'description' | translate}}{{:: 'actions' | translate}}
    {{role.name}}{{role.description}}{{:: 'edit' | translate}}{{:: 'delete' | translate}}
    {{:: 'no-client-roles-available' | translate}}
    +
    + + diff --git a/admin/resources/partials/client-saml-key-export.html b/admin/resources/partials/client-saml-key-export.html new file mode 100644 index 0000000..ec51e96 --- /dev/null +++ b/admin/resources/partials/client-saml-key-export.html @@ -0,0 +1,66 @@ +
    + + + +

    {{:: 'export-saml-key' | translate}} {{client.clientId|capitalize}}

    + +
    + + + +
    +
    + +
    +
    + +
    +
    + {{:: 'archive-format.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'key-alias.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'key-password.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'realm-certificate-alias.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'store-password.tooltip' | translate}} +
    +
    +
    + +
    +
    +
    +
    +
    + + \ No newline at end of file diff --git a/admin/resources/partials/client-saml-key-import.html b/admin/resources/partials/client-saml-key-import.html new file mode 100644 index 0000000..a580a61 --- /dev/null +++ b/admin/resources/partials/client-saml-key-import.html @@ -0,0 +1,65 @@ +
    + + + +

    {{:: 'import-saml-key' | translate}} {{client.clientId|capitalize}}

    + +
    + + + +
    +
    + +
    +
    + +
    +
    + {{:: 'archive-format.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'key-alias.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'store-password.tooltip' | translate}} +
    +
    + +
    +
    + + +
    + + {{files[0].name}} + +
    +
    +
    +
    + + +
    +
    +
    +
    +
    + + \ No newline at end of file diff --git a/admin/resources/partials/client-saml-keys.html b/admin/resources/partials/client-saml-keys.html new file mode 100644 index 0000000..776349d --- /dev/null +++ b/admin/resources/partials/client-saml-keys.html @@ -0,0 +1,66 @@ +
    + + + + + +
    +
    + {{:: 'signing-key' | translate}} {{:: 'saml-signing-key' | translate}} +
    + + +
    + +
    +
    +
    + + +
    + +
    +
    +
    +
    + + + +
    +
    +
    +
    + {{:: 'encryption-key' | translate}} {{:: 'saml-encryption-key.tooltip' | translate}} +
    + + +
    + +
    +
    +
    + + +
    + +
    +
    +
    +
    + + + +
    +
    +
    +
    +
    + + \ No newline at end of file diff --git a/admin/resources/partials/client-scope-mappings.html b/admin/resources/partials/client-scope-mappings.html new file mode 100644 index 0000000..6cb01f4 --- /dev/null +++ b/admin/resources/partials/client-scope-mappings.html @@ -0,0 +1,137 @@ +
    + + + + + +

    {{client.clientId}} {{:: 'scope-mappings' | translate}}

    +

    +
    +
    +
    + + Inherit scope from client template +
    + +
    + +
    +
    + + {{:: 'full-scope-allowed.tooltip' | translate}} +
    + +
    +
    +
    + + Client template has full scope allowed, which means this client will have the full scope of all roles. +
    + +
    +
    + inherited +
    +
    +
    +
    + +
    +
    + +
    +
    +
    + + {{:: 'scope.available-roles.tooltip' | translate}} + + + +
    +
    + + {{:: 'assigned-roles.tooltip' | translate}} + + +
    +
    + + {{:: 'realm.effective-roles.tooltip' | translate}} + +
    +
    +
    +
    + +
    + + +
    +
    +
    {{:: 'select-client-roles.tooltip' | translate}}
    +
    +
    +
    + + {{:: 'assign.available-roles.tooltip' | translate}} + + +
    +
    + + {{:: 'client.assigned-roles.tooltip' | translate}} + + +
    +
    + + {{:: 'client.effective-roles.tooltip' | translate}} + +
    +
    +
    +
    +
    +
    + + \ No newline at end of file diff --git a/admin/resources/partials/client-service-account-roles.html b/admin/resources/partials/client-service-account-roles.html new file mode 100644 index 0000000..d57873f --- /dev/null +++ b/admin/resources/partials/client-service-account-roles.html @@ -0,0 +1,111 @@ +
    + + + + + +

    {{client.clientId}} {{:: 'service-accounts' | translate}}

    +

    + +
    +
    + +
    +
    +
    + + {{:: 'service-account.available-roles.tooltip' | translate}} + + + +
    +
    + + {{:: 'service-account.assigned-roles.tooltip' | translate}} + + +
    +
    + + {{:: 'realm.effective-roles.tooltip' | translate}} + +
    +
    +
    +
    + +
    + + +
    +
    +
    {{:: 'select-client-to-view-roles' | translate}}
    +
    +
    +
    + + {{:: 'assign.available-roles.tooltip' | translate}} + + +
    +
    + + {{:: 'client.assigned-roles.tooltip' | translate}} + + +
    +
    + + {{:: 'client.effective-roles.tooltip' | translate}} + +
    +
    +
    +
    +
    + +
    + +
    + +
    + + \ No newline at end of file diff --git a/admin/resources/partials/client-sessions.html b/admin/resources/partials/client-sessions.html new file mode 100644 index 0000000..5dbb2af --- /dev/null +++ b/admin/resources/partials/client-sessions.html @@ -0,0 +1,57 @@ +
    + + + + + +
    +
    +
    + +
    + +
    + {{:: 'active-sessions.tooltip' | translate}} +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    {{:: 'user' | translate}}{{:: 'from-ip' | translate}}{{:: 'session-start' | translate}}
    +
    + + + +
    +
    {{session.username}}{{session.ipAddress}}{{session.start | date:'medium'}}
    +
    + + \ No newline at end of file diff --git a/admin/resources/partials/client-template-detail.html b/admin/resources/partials/client-template-detail.html new file mode 100644 index 0000000..91af170 --- /dev/null +++ b/admin/resources/partials/client-template-detail.html @@ -0,0 +1,55 @@ +
    + + + + + +
    +
    +
    + +
    + +
    + {{:: 'client-template.name.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'client-template.description.tooltip' | translate}} +
    +
    + +
    +
    + +
    +
    + {{:: 'client-template.protocol.tooltip' | translate}} +
    +
    + +
    +
    + + +
    +
    + + +
    +
    +
    +
    + + \ No newline at end of file diff --git a/admin/resources/partials/client-template-list.html b/admin/resources/partials/client-template-list.html new file mode 100644 index 0000000..94df5f6 --- /dev/null +++ b/admin/resources/partials/client-template-list.html @@ -0,0 +1,46 @@ +
    +

    + {{:: 'client-templates' | translate}} + {{:: 'client-templates.tooltip' | translate}} +

    + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    + +
    + +
    +
    +
    + + +
    +
    {{:: 'name' | translate}}{{:: 'actions' | translate}}
    {{template.name}}{{:: 'edit' | translate}}{{:: 'delete' | translate}}
    {{:: 'no-results' | translate}}{{:: 'no-clients-available' | translate}}
    +
    + + \ No newline at end of file diff --git a/admin/resources/partials/client-template-mappers-add.html b/admin/resources/partials/client-template-mappers-add.html new file mode 100644 index 0000000..2612189 --- /dev/null +++ b/admin/resources/partials/client-template-mappers-add.html @@ -0,0 +1,53 @@ +
    + + + +

    {{:: 'add-builtin-protocol-mapper' | translate}}

    + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    + +
    + +
    +
    +
    +
    +
    {{:: 'name' | translate}}{{:: 'category' | translate}}{{:: 'type' | translate}}{{:: 'add' | translate}}
    {{mapper.name}}{{mapperTypes[mapper.protocolMapper].category}}{{mapperTypes[mapper.protocolMapper].name}}
    {{:: 'no-mappers-available' | translate}}
    + +
    + +
    +
    + + \ No newline at end of file diff --git a/admin/resources/partials/client-template-mappers.html b/admin/resources/partials/client-template-mappers.html new file mode 100644 index 0000000..3b6fa9e --- /dev/null +++ b/admin/resources/partials/client-template-mappers.html @@ -0,0 +1,53 @@ +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    {{:: 'name' | translate}}{{:: 'category' | translate}}{{:: 'type' | translate}}{{:: 'actions' | translate}}
    {{mapper.name}}{{mapperTypes[mapper.protocolMapper].category}}{{mapperTypes[mapper.protocolMapper].name}}{{:: 'edit' | translate}}{{:: 'delete' | translate}}
    {{:: 'no-mappers-available' | translate}}
    +
    + + \ No newline at end of file diff --git a/admin/resources/partials/client-template-protocol-mapper-detail.html b/admin/resources/partials/client-template-protocol-mapper-detail.html new file mode 100644 index 0000000..b664dc6 --- /dev/null +++ b/admin/resources/partials/client-template-protocol-mapper-detail.html @@ -0,0 +1,13 @@ +
    + + +
    +
    + + \ No newline at end of file diff --git a/admin/resources/partials/client-template-scope-mappings.html b/admin/resources/partials/client-template-scope-mappings.html new file mode 100644 index 0000000..e5be70f --- /dev/null +++ b/admin/resources/partials/client-template-scope-mappings.html @@ -0,0 +1,117 @@ +
    + + + + + +

    {{template.name}} {{:: 'scope-mappings' | translate}}

    +

    +
    +
    +
    + + {{:: 'full-scope-allowed.tooltip' | translate}} +
    + +
    +
    +
    +
    + +
    +
    + +
    +
    +
    + + {{:: 'scope.available-roles.tooltip' | translate}} + + + +
    +
    + + {{:: 'assigned-roles.tooltip' | translate}} + + +
    +
    + + {{:: 'realm.effective-roles.tooltip' | translate}} + +
    +
    +
    +
    + +
    + + +
    +
    +
    {{:: 'select-client-roles.tooltip' | translate}}
    +
    +
    +
    + + {{:: 'assign.available-roles.tooltip' | translate}} + + +
    +
    + + {{:: 'client.assigned-roles.tooltip' | translate}} + + +
    +
    + + {{:: 'client.effective-roles.tooltip' | translate}} + +
    +
    +
    +
    +
    +
    + + \ No newline at end of file diff --git a/admin/resources/partials/create-client.html b/admin/resources/partials/create-client.html new file mode 100644 index 0000000..98609c8 --- /dev/null +++ b/admin/resources/partials/create-client.html @@ -0,0 +1,85 @@ +
    + + + + + +
    +
    +
    + + +
    + + +
    + +
    + + +
    +
    + +
    + +
    + +
    + {{:: 'client-id.tooltip' | translate}} +
    +
    + +
    +
    + +
    +
    + {{:: 'client-protocol.tooltip' | translate}} +
    +
    + +
    +
    + +
    +
    + {{:: 'client-template.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'root-url.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'master-saml-processing-url.tooltip' | translate}} +
    +
    +
    +
    + + +
    +
    +
    +
    + + \ No newline at end of file diff --git a/admin/resources/partials/create-execution.html b/admin/resources/partials/create-execution.html new file mode 100644 index 0000000..dd333a9 --- /dev/null +++ b/admin/resources/partials/create-execution.html @@ -0,0 +1,31 @@ +
    + +
    +

    {{:: 'create-authenticator-execution' | translate}}

    +

    {{:: 'create-authenticator-execution' | translate}}

    +

    {{:: 'create-form-action-execution' | translate}}

    +
    + +
    +
    + +
    +
    + +
    +
    + {{provider.description}} +
    +
    +
    + + +
    +
    +
    +
    + + \ No newline at end of file diff --git a/admin/resources/partials/create-flow-execution.html b/admin/resources/partials/create-flow-execution.html new file mode 100644 index 0000000..195a7ff --- /dev/null +++ b/admin/resources/partials/create-flow-execution.html @@ -0,0 +1,55 @@ +
    +

    {{:: 'create-execution-flow' | translate}}

    + + + +
    +
    + +
    + +
    + {{:: 'flow.alias.tooltip' | translate}} +
    +
    + + +
    + +
    +
    +
    + +
    +
    + +
    +
    + {{:: 'flow-type.tooltip' | translate}} +
    +
    + +
    +
    + +
    +
    + {{provider.description}} +
    +
    +
    + + +
    +
    +
    +
    + + \ No newline at end of file diff --git a/admin/resources/partials/create-flow.html b/admin/resources/partials/create-flow.html new file mode 100644 index 0000000..a65f0a0 --- /dev/null +++ b/admin/resources/partials/create-flow.html @@ -0,0 +1,43 @@ +
    +

    {{:: 'create-top-level-form' | translate}}

    + + + +
    +
    + +
    + +
    + {{:: 'flow.alias.tooltip' | translate}} +
    +
    + + +
    + +
    +
    +
    + +
    +
    + +
    +
    + {{:: 'top-level-flow-type.tooltip' | translate}} +
    +
    +
    + + +
    +
    +
    +
    + + \ No newline at end of file diff --git a/admin/resources/partials/create-group.html b/admin/resources/partials/create-group.html new file mode 100644 index 0000000..255cf32 --- /dev/null +++ b/admin/resources/partials/create-group.html @@ -0,0 +1,25 @@ +
    +
    +

    {{:: 'create-group' | translate}}

    +
    +
    +
    +
    + +
    + +
    +
    +
    + +
    +
    + + +
    +
    +
    +
    + + \ No newline at end of file diff --git a/admin/resources/partials/default-groups.html b/admin/resources/partials/default-groups.html new file mode 100644 index 0000000..634944e --- /dev/null +++ b/admin/resources/partials/default-groups.html @@ -0,0 +1,80 @@ +
    + + +
    +
    + + +
    +
    +
    + + + + + + + + + + + +
    +
    + + {{:: 'default-groups.tooltip' | translate}} + +
    + +
    +
    +
    + + + +
    +
    +
    + + + + + + + + + + + +
    + +
    + + {{:: 'available-groups.tooltip' | translate}} + +
    + +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    +
    + + \ No newline at end of file diff --git a/admin/resources/partials/defense-headers.html b/admin/resources/partials/defense-headers.html new file mode 100644 index 0000000..0a8ffbd --- /dev/null +++ b/admin/resources/partials/defense-headers.html @@ -0,0 +1,64 @@ +
    + + + + +
    +
    +
    + +
    + +
    + {{:: 'x-frame-options-tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'content-sec-policy-tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'content-type-options-tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'robots-tag-tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'x-xss-protection-tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'strict-transport-security-tooltip' | translate}} +
    +
    +
    +
    + + +
    +
    +
    +
    + + + \ No newline at end of file diff --git a/admin/resources/partials/forbidden.html b/admin/resources/partials/forbidden.html new file mode 100644 index 0000000..b40f2e7 --- /dev/null +++ b/admin/resources/partials/forbidden.html @@ -0,0 +1,7 @@ +
    +
    +

    Forbidden

    +

    You don't have access to the requested resource.

    + Go to the home page » +
    +
    \ No newline at end of file diff --git a/admin/resources/partials/group-attributes.html b/admin/resources/partials/group-attributes.html new file mode 100644 index 0000000..e12c553 --- /dev/null +++ b/admin/resources/partials/group-attributes.html @@ -0,0 +1,41 @@ +
    + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    {{:: 'key' | translate}}{{:: 'value' | translate}}{{:: 'actions' | translate}}
    {{key}}{{:: 'delete' | translate}}
    {{:: 'add' | translate}}
    + +
    +
    + + +
    +
    +
    +
    + + diff --git a/admin/resources/partials/group-detail.html b/admin/resources/partials/group-detail.html new file mode 100644 index 0000000..8fd6461 --- /dev/null +++ b/admin/resources/partials/group-detail.html @@ -0,0 +1,28 @@ +
    + + + +
    +
    +
    + +
    + +
    +
    +
    + +
    +
    + + +
    +
    +
    +
    + + \ No newline at end of file diff --git a/admin/resources/partials/group-list.html b/admin/resources/partials/group-list.html new file mode 100644 index 0000000..7ad6f65 --- /dev/null +++ b/admin/resources/partials/group-list.html @@ -0,0 +1,50 @@ +
    + + + + + + + + + + + + + +
    +
    +
    +
    + +
    + +
    +
    +
    + +
    +
    + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + +
    +
    + + \ No newline at end of file diff --git a/admin/resources/partials/group-members.html b/admin/resources/partials/group-members.html new file mode 100644 index 0000000..ffdf362 --- /dev/null +++ b/admin/resources/partials/group-members.html @@ -0,0 +1,48 @@ +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {{:: 'username' | translate}}{{:: 'last-name' | translate}}{{:: 'first-name' | translate}}{{:: 'email' | translate}}
    +
    + + + +
    +
    {{user.username}}{{user.lastName}}{{user.firstName}}{{user.email}}{{:: 'edit' | translate}}
    {{:: 'no-group-members' | translate}}{{:: 'no-group-members' | translate}}
    +
    + + \ No newline at end of file diff --git a/admin/resources/partials/group-role-mappings.html b/admin/resources/partials/group-role-mappings.html new file mode 100644 index 0000000..62aa7d4 --- /dev/null +++ b/admin/resources/partials/group-role-mappings.html @@ -0,0 +1,102 @@ +
    + + + + +
    +
    + + +
    +
    +
    + + + + {{:: 'group.add-selected.tooltip' | translate}} +
    +
    + + {{:: 'group.assigned-roles.tooltip' | translate}} + + +
    +
    + + {{:: 'group.effective-roles.tooltip' | translate}} + +
    +
    +
    +
    + +
    + +
    +
    +
    {{:: 'select-client-to-view-roles' | translate}}
    +
    +
    +
    + + {{:: 'group.available-roles.tooltip' | translate}} + + +
    +
    + + {{:: 'group.assigned-roles-client.tooltip' | translate}} + + +
    +
    + + {{:: 'group.effective-roles-client.tooltip' | translate}} + +
    +
    +
    +
    +
    + +
    + + \ No newline at end of file diff --git a/admin/resources/partials/home.html b/admin/resources/partials/home.html new file mode 100644 index 0000000..dc2471b --- /dev/null +++ b/admin/resources/partials/home.html @@ -0,0 +1,4 @@ +
    +
    +
    +
    \ No newline at end of file diff --git a/admin/resources/partials/identity-provider-mapper-detail.html b/admin/resources/partials/identity-provider-mapper-detail.html new file mode 100644 index 0000000..a6b6c5e --- /dev/null +++ b/admin/resources/partials/identity-provider-mapper-detail.html @@ -0,0 +1,68 @@ +
    + + +

    {{mapper.name|capitalize}}

    +

    {{:: 'add-identity-provider-mapper' | translate}}

    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    + {{:: 'mapper.name.tooltip' | translate}} +
    +
    + +
    +
    + +
    +
    + {{mapperType.helpText}} +
    +
    + +
    + +
    + {{mapperType.helpText}} +
    + +
    + +
    +
    + + +
    +
    + +
    +
    + + +
    +
    +
    +
    + + \ No newline at end of file diff --git a/admin/resources/partials/identity-provider-mappers.html b/admin/resources/partials/identity-provider-mappers.html new file mode 100644 index 0000000..c7c136b --- /dev/null +++ b/admin/resources/partials/identity-provider-mappers.html @@ -0,0 +1,49 @@ +
    + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    + +
    + +
    +
    +
    + +
    +
    {{:: 'name' | translate}}{{:: 'category' | translate}}{{:: 'type' | translate}}
    {{mapper.name}}{{mapperTypes[mapper.identityProviderMapper].category}}{{mapperTypes[mapper.identityProviderMapper].name}}
    {{:: 'no-mappers-available' | translate}}
    +
    + + \ No newline at end of file diff --git a/admin/resources/partials/menu.html b/admin/resources/partials/menu.html new file mode 100644 index 0000000..bc066b0 --- /dev/null +++ b/admin/resources/partials/menu.html @@ -0,0 +1,26 @@ + + + \ No newline at end of file diff --git a/admin/resources/partials/modal/realm-events-admin-auth.html b/admin/resources/partials/modal/realm-events-admin-auth.html new file mode 100644 index 0000000..c8da93e --- /dev/null +++ b/admin/resources/partials/modal/realm-events-admin-auth.html @@ -0,0 +1,8 @@ +
    + + + + + +
    {{:: 'realm' | translate}}{{event.authDetails.realmId}}
    {{:: 'client' | translate}}{{event.authDetails.clientId}}
    {{:: 'user' | translate}}{{event.authDetails.userId}}
    {{:: 'ip-address' | translate}}{{event.authDetails.ipAddress}}
    +
    \ No newline at end of file diff --git a/admin/resources/partials/modal/realm-events-admin-representation.html b/admin/resources/partials/modal/realm-events-admin-representation.html new file mode 100644 index 0000000..837a164 --- /dev/null +++ b/admin/resources/partials/modal/realm-events-admin-representation.html @@ -0,0 +1,3 @@ +
    +
    
    +
    \ No newline at end of file diff --git a/admin/resources/partials/modal/role-selector.html b/admin/resources/partials/modal/role-selector.html new file mode 100644 index 0000000..d93484c --- /dev/null +++ b/admin/resources/partials/modal/role-selector.html @@ -0,0 +1,40 @@ + +
    +
    +
    + + {{:: 'realm-roles.tooltip' | translate}} + + +
    +
    + + + +
    +
    +
    diff --git a/admin/resources/partials/modal/unregistered-required-action-selector.html b/admin/resources/partials/modal/unregistered-required-action-selector.html new file mode 100644 index 0000000..bc9995f --- /dev/null +++ b/admin/resources/partials/modal/unregistered-required-action-selector.html @@ -0,0 +1,21 @@ + + + \ No newline at end of file diff --git a/admin/resources/partials/modal/view-key.html b/admin/resources/partials/modal/view-key.html new file mode 100644 index 0000000..5d53d3f --- /dev/null +++ b/admin/resources/partials/modal/view-key.html @@ -0,0 +1,18 @@ + + +
    {{key}}
    \ No newline at end of file diff --git a/admin/resources/partials/modal/view-object.html b/admin/resources/partials/modal/view-object.html new file mode 100644 index 0000000..ee50aee --- /dev/null +++ b/admin/resources/partials/modal/view-object.html @@ -0,0 +1,3 @@ +
    +
    
    +
    \ No newline at end of file diff --git a/admin/resources/partials/notfound.html b/admin/resources/partials/notfound.html new file mode 100644 index 0000000..62a1a5b --- /dev/null +++ b/admin/resources/partials/notfound.html @@ -0,0 +1,7 @@ +
    +
    +

    +

    {{:: 'resource-not-found.instruction' | translate}}

    + +
    +
    \ No newline at end of file diff --git a/admin/resources/partials/otp-policy.html b/admin/resources/partials/otp-policy.html new file mode 100644 index 0000000..941daad --- /dev/null +++ b/admin/resources/partials/otp-policy.html @@ -0,0 +1,80 @@ +
    +

    {{:: 'authentication' | translate}}

    + + + +
    +
    + +
    +
    + +
    +
    + {{:: 'otp-type.tooltip' | translate}} +
    +
    + +
    +
    + +
    +
    + {{:: 'otp-hash-algorithm.tooltip' | translate}} +
    + +
    + +
    +
    + +
    +
    + {{:: 'otp.number-of-digits.tooltip' | translate}} +
    + +
    + +
    + +
    + {{:: 'otp.look-ahead-window.tooltip' | translate}} +
    + +
    + +
    + +
    + {{:: 'otp.initial-counter.tooltip' | translate}} +
    + +
    + +
    + +
    + {{:: 'otp-token-period.tooltip' | translate}} +
    + + +
    +
    + + +
    +
    +
    + +
    + + + diff --git a/admin/resources/partials/pagenotfound.html b/admin/resources/partials/pagenotfound.html new file mode 100644 index 0000000..c15a051 --- /dev/null +++ b/admin/resources/partials/pagenotfound.html @@ -0,0 +1,7 @@ +
    +
    +

    +

    {{:: 'page-not-found.instruction' | translate}}

    + +
    +
    \ No newline at end of file diff --git a/admin/resources/partials/partial-export.html b/admin/resources/partials/partial-export.html new file mode 100644 index 0000000..1ceed8c --- /dev/null +++ b/admin/resources/partials/partial-export.html @@ -0,0 +1,34 @@ +
    + +

    + {{:: 'partial-export' | translate}} + {{:: 'partial-export.tooltip' | translate}} +

    + +
    +
    + +
    + +
    + +
    +
    + +
    + +
    + +
    +
    + +
    + +
    + +
    + +
    +
    + + \ No newline at end of file diff --git a/admin/resources/partials/partial-import.html b/admin/resources/partials/partial-import.html new file mode 100644 index 0000000..4df1207 --- /dev/null +++ b/admin/resources/partials/partial-import.html @@ -0,0 +1,130 @@ +
    + +

    + {{:: 'partial-import' | translate}} + {{:: 'partial-import.tooltip' | translate}} +

    + +
    +
    +
    + + +
    + + +
    + +
    + + +
    +
    + +
    + +
    +
    + +
    +
    +
    + +
    + +
    + +
    +
    + +
    + +
    + +
    +
    + +
    + +
    + +
    +
    + +
    + +
    + +
    +
    + +
    + +
    + +
    +
    + +
    + +
    + +
    +
    + +
    + +
    +
    + +
    +
    + {{:: 'if-resource-exists.tooltip' | translate}} +
    +
    + +
    +
    + +
    +
    + +
    + {{successMessage()}} + + + + + + + + + + + + + + + + + + + +
    {{:: 'action' | translate}}{{:: 'type' | translate}}{{:: 'name' | translate}}{{:: 'id' | translate}}
    {{result.action}}{{result.action}}{{result.action}}{{result.resourceType}}{{result.resourceName}}{{result.id}}
    + +
    + + + +
    +
    +
    +
    + + \ No newline at end of file diff --git a/admin/resources/partials/password-policy.html b/admin/resources/partials/password-policy.html new file mode 100644 index 0000000..f211dba --- /dev/null +++ b/admin/resources/partials/password-policy.html @@ -0,0 +1,51 @@ +
    +

    {{:: 'authentication' | translate}}

    + + + +
    + + + + + + + + + + + + + + + + + + + +
    +
    +
    + +
    +
    +
    {{:: 'policy-type' | translate}}{{:: 'policy-value' | translate}}{{:: 'actions' | translate}}
    {{p.displayName}} + + {{:: 'delete' | translate}}
    + +
    +
    + + +
    +
    +
    + +
    + + + diff --git a/admin/resources/partials/protocol-mapper-detail.html b/admin/resources/partials/protocol-mapper-detail.html new file mode 100644 index 0000000..e630bf9 --- /dev/null +++ b/admin/resources/partials/protocol-mapper-detail.html @@ -0,0 +1,79 @@ +

    {{:: 'create-protocol-mapper' | translate}}

    +

    {{model.mapper.name|capitalize}}

    + +
    + +
    +
    + +
    + +
    + {{:: 'protocol.tooltip' | translate}} +
    +
    + +
    + +
    +
    +
    + +
    + +
    + {{:: 'mapper.name.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'mapper.consent-required.tooltip' | translate}} +
    +
    + + +
    + +
    + {{:: 'consent-text.tooltip' | translate}} +
    +
    + +
    +
    + +
    +
    + {{model.mapperType.helpText}} +
    +
    + +
    + +
    + {{model.mapperType.helpText}} +
    + +
    + +
    +
    + + +
    +
    + +
    +
    + + +
    +
    +
    diff --git a/admin/resources/partials/realm-cache-settings.html b/admin/resources/partials/realm-cache-settings.html new file mode 100644 index 0000000..53a7987 --- /dev/null +++ b/admin/resources/partials/realm-cache-settings.html @@ -0,0 +1,30 @@ +
    + + +
    +
    + +
    + +
    + + {{:: 'realm-cache-clear.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'user-cache-clear.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'keys-cache-clear.tooltip' | translate}} +
    +
    +
    + + \ No newline at end of file diff --git a/admin/resources/partials/realm-create.html b/admin/resources/partials/realm-create.html new file mode 100644 index 0000000..04159ce --- /dev/null +++ b/admin/resources/partials/realm-create.html @@ -0,0 +1,45 @@ +
    + +

    {{:: 'add-realm' | translate}}

    + +
    +
    +
    + + +
    + + +
    + +
    + + +
    +
    + +
    + + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    +
    + + +
    +
    +
    +
    + + \ No newline at end of file diff --git a/admin/resources/partials/realm-default-roles.html b/admin/resources/partials/realm-default-roles.html new file mode 100644 index 0000000..b8e611d --- /dev/null +++ b/admin/resources/partials/realm-default-roles.html @@ -0,0 +1,82 @@ +
    +

    {{:: 'roles' | translate}}

    + + +
    +
    + + +
    +
    +
    + + {{:: 'default.available-roles.tooltip' | translate}} + + +
    +
    + + {{:: 'realm-default-roles.tooltip' | translate}} + + +
    +
    +
    +
    + +
    + +
    +
    +
    {{:: 'select-client-to-view-roles' | translate}}
    +
    +
    +
    + + {{:: 'default.available-roles-client.tooltip' | translate}} + + +
    +
    + + {{:: 'client-default-roles.tooltip' | translate}} + + +
    +
    +
    +
    +
    +
    + + \ No newline at end of file diff --git a/admin/resources/partials/realm-detail.html b/admin/resources/partials/realm-detail.html new file mode 100644 index 0000000..88416f3 --- /dev/null +++ b/admin/resources/partials/realm-detail.html @@ -0,0 +1,56 @@ +
    + + +
    +
    + +
    + +
    +
    + +
    + +
    + +
    +
    + +
    + +
    + +
    +
    + +
    + +
    + +
    + {{:: 'realm-detail.enabled.tooltip' | translate}} +
    + +
    + + + {{:: 'realm-detail.oidc-endpoints.tooltip' | translate}} +
    + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    + + \ No newline at end of file diff --git a/admin/resources/partials/realm-events-admin.html b/admin/resources/partials/realm-events-admin.html new file mode 100644 index 0000000..416c59c --- /dev/null +++ b/admin/resources/partials/realm-events-admin.html @@ -0,0 +1,134 @@ +
    +

    + {{:: 'admin-events' | translate}} + {{:: 'admin-events.tooltip' | translate}} +

    + + +

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + + {{:: 'resource-path.tooltip' | translate}} +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    + +
    + {{:: 'authentication-details' | translate}} + +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    +
    {{:: 'time' | translate}}{{:: 'operation-type' | translate}}{{:: 'resource-type' | translate}}{{:: 'resource-path' | translate}}{{:: 'details' | translate}}
    + + + +
    {{event.time|date:'shortDate'}}
    {{event.time|date:'mediumTime'}}
    {{event.operationType}}{{event.resourceType}}{{event.resourcePath}} + + +
    +
    +
    + \ No newline at end of file diff --git a/admin/resources/partials/realm-events-config.html b/admin/resources/partials/realm-events-config.html new file mode 100644 index 0000000..c610f68 --- /dev/null +++ b/admin/resources/partials/realm-events-config.html @@ -0,0 +1,104 @@ +
    +

    + {{:: 'events-config' | translate}} + {{:: 'events-config.tooltip' | translate}} +

    + + +
    +

    {{:: 'events-config' | translate}}

    + +
    + +
    +
    + + {{:: 'event-listeners.tooltip' | translate}} +
    + +
    +
    +
    + +
    + {{:: 'login-events-settings' | translate}} + +
    + + {{:: 'login.save-events.tooltip' | translate}} +
    + +
    +
    + +
    + + {{:: 'saved-types.tooltip' | translate}} +
    + +
    +
    + +
    + + {{:: 'clear-events.tooltip' | translate}} +
    + +
    +
    +
    + + {{:: 'events.expiration.tooltip' | translate}} +
    + + +
    +
    +
    + + +
    + {{:: 'admin-events-settings' | translate}} + +
    + + {{:: 'admin.save-events.tooltip' | translate}} +
    + +
    +
    + +
    + + {{:: 'include-representation.tooltip' | translate}} +
    + +
    +
    + +
    + + {{:: 'clear-admin-events.tooltip' | translate}} +
    + +
    +
    + +
    + +
    + + +
    +
    +
    +
    + \ No newline at end of file diff --git a/admin/resources/partials/realm-events.html b/admin/resources/partials/realm-events.html new file mode 100644 index 0000000..3c7e959 --- /dev/null +++ b/admin/resources/partials/realm-events.html @@ -0,0 +1,124 @@ +
    +

    + {{:: 'events' | translate}} + {{:: 'events.tooltip' | translate}} +

    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    + +
    + +
    + +
    +
    +
    + +
    + +
    +
    + +
    +
    {{:: 'time' | translate}}{{:: 'event-type' | translate}}{{:: 'details' | translate}}
    + + + +
    {{event.time|date:'shortDate'}}
    {{event.time|date:'mediumTime'}}
    {{event.type}} + + + + + + + + + + + + + +
    {{:: 'client' | translate}}{{event.clientId}}
    {{:: 'user' | translate}}{{event.userId}}
    {{:: 'ip-address' | translate}}{{event.ipAddress}}
    {{:: 'error' | translate}}{{event.error}}
    {{:: 'details' | translate}} + + + + + + +
    {{key}}{{value}}
    +
    {{:: 'representation' | translate}} + +
    {{event.representation}}
    +
    +
    +
    + + \ No newline at end of file diff --git a/admin/resources/partials/realm-identity-provider-bitbucket.html b/admin/resources/partials/realm-identity-provider-bitbucket.html new file mode 100644 index 0000000..90d5c1f --- /dev/null +++ b/admin/resources/partials/realm-identity-provider-bitbucket.html @@ -0,0 +1,130 @@ +
    + + + + +
    + + + +
    +
    + +
    + +
    + {{:: 'redirect-uri.tooltip' | translate}} +
    +
    +
    +
    + +
    + +
    + {{:: 'bitbucket.key.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'bitbucket.secret.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'bitbucket.default-scopes.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'identity-provider.store-tokens.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'identity-provider.stored-tokens-readable.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'identity-provider.enabled.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'trust-email.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'link-only.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'hide-on-login-page.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'gui-order.tooltip' | translate}} +
    +
    + +
    +
    + +
    +
    + {{:: 'first-broker-login-flow.tooltip' | translate}} +
    +
    + +
    +
    + +
    +
    + {{:: 'post-broker-login-flow.tooltip' | translate}} +
    +
    + +
    +
    + + +
    +
    +
    +
    + + \ No newline at end of file diff --git a/admin/resources/partials/realm-identity-provider-export.html b/admin/resources/partials/realm-identity-provider-export.html new file mode 100644 index 0000000..742cdf4 --- /dev/null +++ b/admin/resources/partials/realm-identity-provider-export.html @@ -0,0 +1,23 @@ +
    + + + + +
    +
    +
    +
    + {{:: 'download' | translate}} + +
    +
    +
    +
    +
    + + \ No newline at end of file diff --git a/admin/resources/partials/realm-identity-provider-facebook-ext.html b/admin/resources/partials/realm-identity-provider-facebook-ext.html new file mode 100644 index 0000000..e69de29 diff --git a/admin/resources/partials/realm-identity-provider-facebook.html b/admin/resources/partials/realm-identity-provider-facebook.html new file mode 100644 index 0000000..a4630ac --- /dev/null +++ b/admin/resources/partials/realm-identity-provider-facebook.html @@ -0,0 +1 @@ +
    \ No newline at end of file diff --git a/admin/resources/partials/realm-identity-provider-github-ext.html b/admin/resources/partials/realm-identity-provider-github-ext.html new file mode 100644 index 0000000..e69de29 diff --git a/admin/resources/partials/realm-identity-provider-github.html b/admin/resources/partials/realm-identity-provider-github.html new file mode 100644 index 0000000..a4630ac --- /dev/null +++ b/admin/resources/partials/realm-identity-provider-github.html @@ -0,0 +1 @@ +
    \ No newline at end of file diff --git a/admin/resources/partials/realm-identity-provider-gitlab.html b/admin/resources/partials/realm-identity-provider-gitlab.html new file mode 100644 index 0000000..152d1f1 --- /dev/null +++ b/admin/resources/partials/realm-identity-provider-gitlab.html @@ -0,0 +1,130 @@ +
    + + + + +
    + + + +
    +
    + +
    + +
    + {{:: 'redirect-uri.tooltip' | translate}} +
    +
    +
    +
    + +
    + +
    + {{:: 'gitlab.application-id.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'gitlab.application-secret.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'gitlab.default-scopes.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'identity-provider.store-tokens.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'identity-provider.stored-tokens-readable.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'identity-provider.enabled.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'trust-email.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'link-only.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'hide-on-login-page.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'gui-order.tooltip' | translate}} +
    +
    + +
    +
    + +
    +
    + {{:: 'first-broker-login-flow.tooltip' | translate}} +
    +
    + +
    +
    + +
    +
    + {{:: 'post-broker-login-flow.tooltip' | translate}} +
    +
    + +
    +
    + + +
    +
    +
    +
    + + \ No newline at end of file diff --git a/admin/resources/partials/realm-identity-provider-google-ext.html b/admin/resources/partials/realm-identity-provider-google-ext.html new file mode 100644 index 0000000..9d6632d --- /dev/null +++ b/admin/resources/partials/realm-identity-provider-google-ext.html @@ -0,0 +1,7 @@ +
    + +
    + +
    + {{:: 'identity-provider.google-userIp.tooltip' | translate}} +
    \ No newline at end of file diff --git a/admin/resources/partials/realm-identity-provider-google.html b/admin/resources/partials/realm-identity-provider-google.html new file mode 100644 index 0000000..a4630ac --- /dev/null +++ b/admin/resources/partials/realm-identity-provider-google.html @@ -0,0 +1 @@ +
    \ No newline at end of file diff --git a/admin/resources/partials/realm-identity-provider-keycloak-oidc.html b/admin/resources/partials/realm-identity-provider-keycloak-oidc.html new file mode 100644 index 0000000..d380749 --- /dev/null +++ b/admin/resources/partials/realm-identity-provider-keycloak-oidc.html @@ -0,0 +1 @@ +
    \ No newline at end of file diff --git a/admin/resources/partials/realm-identity-provider-linkedin-ext.html b/admin/resources/partials/realm-identity-provider-linkedin-ext.html new file mode 100644 index 0000000..e69de29 diff --git a/admin/resources/partials/realm-identity-provider-linkedin.html b/admin/resources/partials/realm-identity-provider-linkedin.html new file mode 100644 index 0000000..a4630ac --- /dev/null +++ b/admin/resources/partials/realm-identity-provider-linkedin.html @@ -0,0 +1 @@ +
    \ No newline at end of file diff --git a/admin/resources/partials/realm-identity-provider-microsoft-ext.html b/admin/resources/partials/realm-identity-provider-microsoft-ext.html new file mode 100644 index 0000000..e69de29 diff --git a/admin/resources/partials/realm-identity-provider-microsoft.html b/admin/resources/partials/realm-identity-provider-microsoft.html new file mode 100644 index 0000000..a4630ac --- /dev/null +++ b/admin/resources/partials/realm-identity-provider-microsoft.html @@ -0,0 +1 @@ +
    \ No newline at end of file diff --git a/admin/resources/partials/realm-identity-provider-oidc.html b/admin/resources/partials/realm-identity-provider-oidc.html new file mode 100644 index 0000000..ee815a3 --- /dev/null +++ b/admin/resources/partials/realm-identity-provider-oidc.html @@ -0,0 +1,299 @@ +
    + + + + +
    + + + +
    +
    + +
    + +
    + {{:: 'redirect-uri.tooltip' | translate}} +
    +
    +
    +
    + +
    + +
    + {{:: 'identity-provider.alias.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'identity-provider.display-name.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'identity-provider.enabled.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'identity-provider.store-tokens.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'identity-provider.stored-tokens-readable.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'trust-email.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'link-only.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'hide-on-login-page.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'gui-order.tooltip' | translate}} +
    +
    + +
    +
    + +
    +
    + {{:: 'first-broker-login-flow.tooltip' | translate}} +
    +
    + +
    +
    + +
    +
    + {{:: 'post-broker-login-flow.tooltip' | translate}} +
    +
    +
    + {{:: 'openid-connect-config' | translate}} {{:: 'openid-connect-config.tooltip' | translate}} +
    + +
    + +
    + {{:: 'authorization-url.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'loginHint.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'token-url.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'identity-provider.logout-url.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'backchannel-logout.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'identity-provider.disableUserInfo.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'user-info-url.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'identity-provider.client-id.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'client-secret.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'issuer.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'identity-provider.default-scopes.tooltip' | translate}} +
    +
    + +
    +
    + +
    +
    + {{:: 'prompt.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'identity-provider.validate-signatures.tooltip' | translate}} +
    + +
    + +
    + +
    + +
    + {{:: 'identity-provider.use-jwks-url.tooltip' | translate}} +
    + +
    + +
    + +
    + {{:: 'identity-provider.jwks-url.tooltip' | translate}} +
    + +
    + +
    + +
    +
    +
    + + {{:: 'scope-param-required.tooltip' | translate}} +
    + +
    +
    +
    + +
    + +
    + {{:: 'composite-roles.tooltip' | translate}} +
    +
    + +
    +
    + + +
    +
    + +
    +
    + + +
    +
    + +
    + {{:: 'composite-roles' | translate}} +
    + + +
    +
    +
    + + {{:: 'composite.available-roles.tooltip' | translate}} + + +
    +
    + + {{:: 'composite.associated-roles.tooltip' | translate}} + + +
    +
    +
    +
    + +
    + + +
    +
    +
    {{:: 'select-client-to-view-roles' | translate}}
    +
    +
    +
    + + {{:: 'composite.available-roles-client.tooltip' | translate}} + + +
    +
    + + {{:: 'composite.associated-roles-client.tooltip' | translate}} + + +
    +
    +
    +
    +
    +
    +
    + + \ No newline at end of file diff --git a/admin/resources/partials/role-list.html b/admin/resources/partials/role-list.html new file mode 100644 index 0000000..5c0d473 --- /dev/null +++ b/admin/resources/partials/role-list.html @@ -0,0 +1,53 @@ +
    +

    Roles

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + \ No newline at end of file diff --git a/admin/resources/partials/role-mappings.html b/admin/resources/partials/role-mappings.html new file mode 100644 index 0000000..013dae7 --- /dev/null +++ b/admin/resources/partials/role-mappings.html @@ -0,0 +1,101 @@ +
    + + + + +
    +
    + + +
    +
    +
    + + + + {{:: 'user.add-selected.tooltip' | translate}} +
    +
    + + {{:: 'user.assigned-roles.tooltip' | translate}} + + +
    +
    + + {{:: 'user.effective-roles.tooltip' | translate}} + +
    +
    +
    +
    + +
    + +
    +
    +
    {{:: 'select-client-to-view-roles' | translate}}
    +
    +
    +
    + + {{:: 'user.available-roles.tooltip' | translate}} + + +
    +
    + + {{:: 'user.assigned-roles-client.tooltip' | translate}} + + +
    +
    + + {{:: 'user.effective-roles-client.tooltip' | translate}} + +
    +
    +
    +
    +
    +
    + + \ No newline at end of file diff --git a/admin/resources/partials/server-info-providers.html b/admin/resources/partials/server-info-providers.html new file mode 100644 index 0000000..be741c1 --- /dev/null +++ b/admin/resources/partials/server-info-providers.html @@ -0,0 +1,55 @@ +
    +

    + {{:: 'server-info' | translate}} + +

    + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    + +
    +
    +
    +
    {{:: 'spi' | translate}}{{:: 'providers' | translate}}
    {{spi.name}} +
    + {{providerName}} + + + + + + + +
    {{key}}{{value}}
    +
    +
    +
    +
    + + \ No newline at end of file diff --git a/admin/resources/partials/server-info.html b/admin/resources/partials/server-info.html new file mode 100644 index 0000000..4a4b296 --- /dev/null +++ b/admin/resources/partials/server-info.html @@ -0,0 +1,112 @@ +
    +

    + {{:: 'server-info' | translate}} + +

    + + + + + + + + + + + + + + + + + + + + + + + + +
    {{:: 'server-version' | translate}}{{serverInfo.systemInfo.version}}
    {{:: 'server-profile' | translate}}{{serverInfo.profileInfo.name | capitalize}}
    {{:: 'server-disabled' | translate}}{{serverInfo.profileInfo.disabledFeatures.join(', ').toLowerCase() | capitalize}}
    {{:: 'server-time' | translate}}{{serverInfo.systemInfo.serverTime}}
    {{:: 'server-uptime' | translate}}{{serverInfo.systemInfo.uptime}}
    + +
    + {{:: 'memory' | translate}} + + + + + + + + + + + + + +
    {{:: 'total-memory' | translate}}{{serverInfo.memoryInfo.totalFormated}}
    {{:: 'free-memory' | translate}}{{serverInfo.memoryInfo.freeFormated}} ({{serverInfo.memoryInfo.freePercentage}}%)
    {{:: 'used-memory' | translate}}{{serverInfo.memoryInfo.usedFormated}}
    +
    + +
    + {{:: 'system' | translate}} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {{:: 'current-working-directory' | translate}}{{serverInfo.systemInfo.userDir}}
    {{:: 'java-version' | translate}}{{serverInfo.systemInfo.javaVersion}}
    {{:: 'java-vendor' | translate}}{{serverInfo.systemInfo.javaVendor}}
    {{:: 'java-runtime' | translate}}{{serverInfo.systemInfo.javaRuntime}}
    {{:: 'java-vm' | translate}}{{serverInfo.systemInfo.javaVm}}
    {{:: 'java-vm-version' | translate}}{{serverInfo.systemInfo.javaVmVersion}}
    {{:: 'java-home' | translate}}{{serverInfo.systemInfo.javaHome}}
    {{:: 'user-name' | translate}}{{serverInfo.systemInfo.userName}}
    {{:: 'user-timezone' | translate}}{{serverInfo.systemInfo.userTimezone}}
    {{:: 'user-locale' | translate}}{{serverInfo.systemInfo.userLocale}}
    {{:: 'system-encoding' | translate}}{{serverInfo.systemInfo.fileEncoding}}
    {{:: 'operating-system' | translate}}{{serverInfo.systemInfo.osName}} {{serverInfo.systemInfo.osVersion}}
    {{:: 'os-architecture' | translate}}{{serverInfo.systemInfo.osArchitecture}}
    +
    +
    + + \ No newline at end of file diff --git a/admin/resources/partials/session-realm.html b/admin/resources/partials/session-realm.html new file mode 100644 index 0000000..e724d95 --- /dev/null +++ b/admin/resources/partials/session-realm.html @@ -0,0 +1,32 @@ +
    +

    {{:: 'sessions' | translate}}

    + + + + + + + + + + + + + + + + + + + +
    + +
    {{:: 'client' | translate}}{{:: 'active-sessions' | translate}}
    {{data.clientId}}{{data.active}}
    +
    + + \ No newline at end of file diff --git a/admin/resources/partials/session-revocation.html b/admin/resources/partials/session-revocation.html new file mode 100644 index 0000000..03c6864 --- /dev/null +++ b/admin/resources/partials/session-revocation.html @@ -0,0 +1,30 @@ +
    +

    {{:: 'sessions' | translate}}

    + + + +
    +
    +
    + +
    + +
    + {{:: 'not-before.tooltip' | translate}} +
    +
    + +
    +
    + + + +
    +
    +
    +
    + + diff --git a/admin/resources/partials/user-attributes.html b/admin/resources/partials/user-attributes.html new file mode 100644 index 0000000..10e3d8f --- /dev/null +++ b/admin/resources/partials/user-attributes.html @@ -0,0 +1,41 @@ +
    + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    {{:: 'key' | translate}}{{:: 'value' | translate}}{{:: 'actions' | translate}}
    {{key}}{{:: 'delete' | translate}}
    {{:: 'add' | translate}}
    + +
    +
    + + +
    +
    +
    +
    + + diff --git a/admin/resources/partials/user-consents.html b/admin/resources/partials/user-consents.html new file mode 100644 index 0000000..670d708 --- /dev/null +++ b/admin/resources/partials/user-consents.html @@ -0,0 +1,54 @@ +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {{:: 'client' | translate}}{{:: 'granted-roles' | translate}}{{:: 'granted-protocol-mappers' | translate}}{{:: 'additional-grants' | translate}}{{:: 'consent-created-date' | translate}}{{:: 'consent-last-updated-date' | translate}}{{:: 'action' | translate}}
    {{consent.clientId}} + + , {{realmRole}} + + + + , {{clientRole}} in {{clientId}} + + + + + + , {{protocolMapper}} + + + + + , {{additionalGrant.key}} + + {{consent.createdDate | date :'short'}}{{consent.lastUpdatedDate | date :'short'}}{{:: 'revoke' | translate}}
    +
    + + \ No newline at end of file diff --git a/admin/resources/partials/user-credentials.html b/admin/resources/partials/user-credentials.html new file mode 100644 index 0000000..9f3512e --- /dev/null +++ b/admin/resources/partials/user-credentials.html @@ -0,0 +1,104 @@ +
    + + + + +
    + + + +
    + {{:: 'manage-user-password' | translate}} +
    + +
    + +
    +
    + +
    + +
    + +
    +
    + +
    + +
    + +
    + {{:: 'credentials.temporary.tooltip' | translate}} +
    + +
    +
    + +
    +
    +
    + +
    + {{:: 'disable-credentials' | translate}} +
    + + +
    + +
    + {{:: 'credentials.disableable.tooltip' | translate}} +
    +
    + + +
    + +
    + {{:: 'credentials.disable.tooltip' | translate}} +
    +
    + +
    + {{:: 'credential-reset-actions' | translate}} +
    + + +
    + +
    + {{:: 'credentials.reset-actions.tooltip' | translate}} +
    +
    + + +
    + + +
    + {{:: 'credential-reset-actions-timeout.tooltip' | translate}} +
    +
    + + +
    + +
    + {{:: 'credentials.reset-actions-email.tooltip' | translate}} +
    +
    +
    +
    + + diff --git a/admin/resources/partials/user-detail.html b/admin/resources/partials/user-detail.html new file mode 100644 index 0000000..88e66e7 --- /dev/null +++ b/admin/resources/partials/user-detail.html @@ -0,0 +1,150 @@ +
    + + + + +
    + +
    +
    + +
    + +
    +
    + +
    + +
    + {{user.createdTimestamp|date:'shortDate'}} {{user.createdTimestamp|date:'mediumTime'}} +
    +
    + +
    + +
    + + +
    +
    + + +
    + + +
    + +
    +
    +
    + + +
    + +
    +
    +
    + + +
    + +
    +
    + +
    + +
    + +
    + {{:: 'user-enabled.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'user-temporarily-locked.tooltip' | translate}} +
    + +
    +
    +
    + + + {{:: 'user-link.tooltip' | translate}} +
    +
    + + + {{:: 'user-origin.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'email-verified.tooltip' | translate}} +
    +
    + + +
    + +
    + {{:: 'required-user-actions.tooltip' | translate}} +
    + +
    + +
    +
    + +
    +
    +
    + +
    + + +
    + +
    + {{:: 'impersonate-user.tooltip' | translate}} +
    + +
    + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    + + diff --git a/admin/resources/partials/user-federated-identity-detail.html b/admin/resources/partials/user-federated-identity-detail.html new file mode 100644 index 0000000..aa5d049 --- /dev/null +++ b/admin/resources/partials/user-federated-identity-detail.html @@ -0,0 +1,53 @@ +
    + + +

    {{:: 'add-identity-provider-link' | translate}}

    + + + +
    +
    +
    + +
    +
    + +
    +
    +
    +
    + +
    + +
    + {{:: 'identity-provider-user-id.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'identity-provider-username.tooltip' | translate}} +
    + +
    + + +
    +
    + + +
    +
    + +
    +
    + + \ No newline at end of file diff --git a/admin/resources/partials/user-federated-identity-list.html b/admin/resources/partials/user-federated-identity-list.html new file mode 100644 index 0000000..82f96f6 --- /dev/null +++ b/admin/resources/partials/user-federated-identity-list.html @@ -0,0 +1,41 @@ +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    {{:: 'identity-provider-alias' | translate}}{{:: 'provider-user-id' | translate}}{{:: 'provider-username' | translate}}{{:: 'action' | translate}}
    {{identity.identityProvider}}{{identity.userId}}{{identity.userName}}{{:: 'remove' | translate}}
    {{:: 'no-identity-provider-links-available' | translate}}
    +
    + + \ No newline at end of file diff --git a/admin/resources/partials/user-federation.html b/admin/resources/partials/user-federation.html new file mode 100644 index 0000000..8298a99 --- /dev/null +++ b/admin/resources/partials/user-federation.html @@ -0,0 +1,67 @@ +
    +

    + {{:: 'user-federation' | translate}} +

    + +
    +
    + +
    +

    + {{:: 'user-federation' | translate}} +

    +

    Keycloak can federate external user databases. Out of the box we have support for LDAP and Active Directory.

    +

    To get started select a provider from the dropdown below:

    +
    +
    +
    +
    + +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    + +
    +
    +
    {{:: 'id' | translate}}{{:: 'provider-name' | translate}}{{:: 'priority' | translate}}{{:: 'actions' | translate}}
    {{getInstanceName(instance)}}{{getInstanceProvider(instance) | capitalize}}{{getInstancePriority(instance)}}{{:: 'edit' | translate}}{{:: 'delete' | translate}}
    {{:: 'no-user-federation-providers-configured' | translate}}
    +
    + + \ No newline at end of file diff --git a/admin/resources/partials/user-group-membership.html b/admin/resources/partials/user-group-membership.html new file mode 100644 index 0000000..f7bf04e --- /dev/null +++ b/admin/resources/partials/user-group-membership.html @@ -0,0 +1,85 @@ +
    + + + + +
    +
    + + +
    +
    +
    + + + + + + + + + + + +
    +
    + + {{:: 'group-membership.tooltip' | translate}} + +
    + +
    +
    +
    + + + +
    +
    +
    + + + + + + + + + + + +
    + +
    + + {{:: 'membership.available-groups.tooltip' | translate}} + +
    + +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    +
    + + \ No newline at end of file diff --git a/admin/resources/partials/user-list.html b/admin/resources/partials/user-list.html new file mode 100644 index 0000000..1fc707c --- /dev/null +++ b/admin/resources/partials/user-list.html @@ -0,0 +1,69 @@ +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    + +
    + +
    +
    +
    + + +
    + + {{:: 'add-user' | translate}} +
    +
    +
    {{:: 'id' | translate}}{{:: 'username' | translate}}{{:: 'email' | translate}}{{:: 'last-name' | translate}}{{:: 'first-name' | translate}}{{:: 'actions' | translate}}
    +
    + + + +
    +
    {{user.id}}{{user.username}}{{user.email}}{{user.lastName}}{{user.firstName}}{{:: 'edit' | translate}}{{:: 'impersonate' | translate}}{{:: 'delete' | translate}}
    {{:: 'users.instruction' | translate}}{{:: 'no-results' | translate}}{{:: 'no-users-available' | translate}}
    +
    + + diff --git a/admin/resources/partials/user-offline-sessions.html b/admin/resources/partials/user-offline-sessions.html new file mode 100644 index 0000000..0194bca --- /dev/null +++ b/admin/resources/partials/user-offline-sessions.html @@ -0,0 +1,35 @@ +
    + + + + + + + + + + + + + + + + + + + +
    {{:: 'ip-address' | translate}}{{:: 'started' | translate}}{{:: 'last-refresh' | translate}}
    {{session.ipAddress}}{{session.start | date:'medium'}}{{session.lastAccess | date:'medium'}}
    + +
    +
    + +
    +
    +
    + + \ No newline at end of file diff --git a/admin/resources/partials/user-sessions.html b/admin/resources/partials/user-sessions.html new file mode 100644 index 0000000..02c1959 --- /dev/null +++ b/admin/resources/partials/user-sessions.html @@ -0,0 +1,43 @@ +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    {{:: 'ip-address' | translate}}{{:: 'started' | translate}}{{:: 'last-access' | translate}}{{:: 'clients' | translate}}{{:: 'action' | translate}}
    {{session.ipAddress}}{{session.start | date:'medium'}}{{session.lastAccess | date:'medium'}} + + + {{:: 'logout' | translate}}
    +
    + + diff --git a/admin/resources/partials/user-storage-generic.html b/admin/resources/partials/user-storage-generic.html new file mode 100644 index 0000000..b4a1fda --- /dev/null +++ b/admin/resources/partials/user-storage-generic.html @@ -0,0 +1,239 @@ +
    + + + + +
    +
    + {{:: 'required-settings' | translate}} +
    + +
    + +
    +
    +
    + +
    + +
    + {{:: 'console-display-name.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'priority.tooltip' | translate}} +
    + + + +
    + +
    + {{:: 'sync-settings' | translate}} +
    + +
    + +
    + {{:: 'periodic-full-sync.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'full-sync-period.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'periodic-changed-users-sync.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'changed-users-sync-period.tooltip' | translate}} +
    +
    + + +
    + {{:: 'user-storage-cache-policy' | translate}} +
    + +
    +
    + +
    +
    + {{:: 'userStorage.cachePolicy.tooltip' | translate}} +
    +
    + +
    +
    + +
    +
    + {{:: 'userStorage.cachePolicy.evictionDay.tooltip' | translate}} +
    +
    + +
    +
    + +
    +
    + {{:: 'userStorage.cachePolicy.evictionHour.tooltip' | translate}} +
    +
    + +
    +
    + +
    +
    + {{:: 'userStorage.cachePolicy.evictionMinute.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'userStorage.cachePolicy.maxLifespan.tooltip' | translate}} +
    +
    + + +
    +
    + + +
    +
    + +
    +
    + + + + + + +
    +
    +
    +
    + + \ No newline at end of file diff --git a/admin/resources/partials/user-storage-kerberos.html b/admin/resources/partials/user-storage-kerberos.html new file mode 100644 index 0000000..5dd0a67 --- /dev/null +++ b/admin/resources/partials/user-storage-kerberos.html @@ -0,0 +1,257 @@ +
    + + + + +
    +
    + {{:: 'required-settings' | translate}} +
    + +
    + +
    +
    +
    + +
    + +
    + {{:: 'console-display-name.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'priority.tooltip' | translate}} +
    + +
    + +
    + +
    + {{:: 'kerberos-realm.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'server-principal.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'keytab.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'debug.tooltip' | translate}} +
    + +
    + +
    + +
    + {{:: 'allow-password-authentication.tooltip' | translate}} +
    +
    + +
    +
    + +
    +
    + {{:: 'edit-mode.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'update-profile-first-login.tooltip' | translate}} +
    + +
    + +
    + {{:: 'user-storage-cache-policy' | translate}} +
    + +
    +
    + +
    +
    + {{:: 'userStorage.cachePolicy.tooltip' | translate}} +
    +
    + +
    +
    + +
    +
    + {{:: 'userStorage.cachePolicy.evictionDay.tooltip' | translate}} +
    +
    + +
    +
    + +
    +
    + {{:: 'userStorage.cachePolicy.evictionHour.tooltip' | translate}} +
    +
    + +
    +
    + +
    +
    + {{:: 'userStorage.cachePolicy.evictionMinute.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'userStorage.cachePolicy.maxLifespan.tooltip' | translate}} +
    +
    + + +
    +
    + + +
    +
    + +
    +
    + + +
    +
    +
    +
    + + \ No newline at end of file diff --git a/admin/resources/partials/user-storage-ldap-mapper-detail.html b/admin/resources/partials/user-storage-ldap-mapper-detail.html new file mode 100644 index 0000000..88de0ff --- /dev/null +++ b/admin/resources/partials/user-storage-ldap-mapper-detail.html @@ -0,0 +1,64 @@ +
    + + +

    {{mapper.name|capitalize}}

    +

    {{:: 'add-user-federation-mapper' | translate}}

    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    + {{:: 'mapper.name.tooltip' | translate}} +
    +
    + +
    +
    + +
    +
    + {{mapperType.helpText}} +
    +
    + +
    + +
    + {{mapperType.helpText}} +
    + + + +
    + +
    +
    + + + + +
    +
    +
    +
    + + \ No newline at end of file diff --git a/admin/resources/partials/user-storage-ldap-mappers.html b/admin/resources/partials/user-storage-ldap-mappers.html new file mode 100644 index 0000000..794e83e --- /dev/null +++ b/admin/resources/partials/user-storage-ldap-mappers.html @@ -0,0 +1,46 @@ +
    + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    + +
    + +
    +
    +
    + +
    +
    {{:: 'name' | translate}}{{:: 'type' | translate}}
    {{mapper.name}}{{mapper.providerId}}
    {{:: 'no-mappers-available' | translate}}
    +
    + + \ No newline at end of file diff --git a/admin/resources/partials/user-storage-ldap.html b/admin/resources/partials/user-storage-ldap.html new file mode 100644 index 0000000..9412839 --- /dev/null +++ b/admin/resources/partials/user-storage-ldap.html @@ -0,0 +1,479 @@ +
    + + + + +
    + + + +
    + {{:: 'required-settings' | translate}} +
    + +
    + +
    +
    +
    + +
    + +
    + {{:: 'console-display-name.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'priority.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'ldap.import-enabled.tooltip' | translate}} +
    + +
    + +
    +
    + +
    +
    + {{:: 'ldap.edit-mode.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'ldap.sync-registrations.tooltip' | translate}} +
    +
    + +
    +
    + +
    +
    + +
    +
    + {{:: 'ldap.vendor.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'username-ldap-attribute.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'rdn-ldap-attribute.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'uuid-ldap-attribute.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'ldap.user-object-classes.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'ldap.connection-url.tooltip' | translate}} + +
    +
    + +
    + +
    + {{:: 'ldap.users-dn.tooltip' | translate}} +
    +
    + +
    +
    + +
    +
    + {{:: 'ldap.authentication-type.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'ldap.bind-dn.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'ldap.bind-credential.tooltip' | translate}} + +
    +
    + +
    + +
    + {{:: 'ldap.custom-user-ldap-filter.tooltip' | translate}} +
    +
    + +
    +
    + +
    +
    + {{:: 'ldap.search-scope.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'ldap.validate-password-policy.tooltip' | translate}} +
    +
    + +
    +
    + +
    +
    + {{:: 'ldap.use-truststore-spi.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'ldap.connection-pooling.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'ldap.connection-timeout.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'ldap.read-timeout.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'ldap.pagination.tooltip' | translate}} +
    +
    + +
    + {{:: 'kerberos-integration' | translate}} +
    + +
    + +
    + {{:: 'ldap.allow-kerberos-authentication.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'kerberos-realm.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'server-principal.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'keytab.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'debug.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'ldap.use-kerberos-for-password-authentication.tooltip' | translate}} +
    +
    + +
    + {{:: 'sync-settings' | translate}} +
    + +
    + +
    + {{:: 'ldap.batch-size.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'ldap.periodic-full-sync.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'full-sync-period.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'ldap.periodic-changed-users-sync.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'ldap.changed-users-sync-period.tooltip' | translate}} +
    +
    + +
    + {{:: 'user-storage-cache-policy' | translate}} +
    + +
    +
    + +
    +
    + {{:: 'userStorage.cachePolicy.tooltip' | translate}} +
    +
    + +
    +
    + +
    +
    + {{:: 'userStorage.cachePolicy.evictionDay.tooltip' | translate}} +
    +
    + +
    +
    + +
    +
    + {{:: 'userStorage.cachePolicy.evictionHour.tooltip' | translate}} +
    +
    + +
    +
    + +
    +
    + {{:: 'userStorage.cachePolicy.evictionMinute.tooltip' | translate}} +
    +
    + +
    + +
    + {{:: 'userStorage.cachePolicy.maxLifespan.tooltip' | translate}} +
    +
    + + +
    +
    + + +
    +
    + +
    +
    + + + + + + +
    +
    +
    +
    + + diff --git a/admin/resources/partials/user-storage.html b/admin/resources/partials/user-storage.html new file mode 100644 index 0000000..aaf2158 --- /dev/null +++ b/admin/resources/partials/user-storage.html @@ -0,0 +1,43 @@ +
    +

    + {{:: 'user-storage' | translate}} +

    + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    + +
    +
    +
    {{:: 'id' | translate}}{{:: 'provider-name' | translate}}{{:: 'priority' | translate}}{{:: 'actions' | translate}}
    {{instance.name}}{{instance.providerId|capitalize}}{{instance.config['priority'][0]}}{{:: 'edit' | translate}}{{:: 'delete' | translate}}
    {{:: 'no-user-storage-providers-configured' | translate}}
    +
    + + \ No newline at end of file diff --git a/admin/resources/templates/authz/kc-authz-modal.html b/admin/resources/templates/authz/kc-authz-modal.html new file mode 100644 index 0000000..18acf86 --- /dev/null +++ b/admin/resources/templates/authz/kc-authz-modal.html @@ -0,0 +1,11 @@ + + + \ No newline at end of file diff --git a/admin/resources/templates/authz/kc-tabs-resource-server.html b/admin/resources/templates/authz/kc-tabs-resource-server.html new file mode 100644 index 0000000..bd20270 --- /dev/null +++ b/admin/resources/templates/authz/kc-tabs-resource-server.html @@ -0,0 +1,14 @@ + \ No newline at end of file diff --git a/admin/resources/templates/kc-component-config.html b/admin/resources/templates/kc-component-config.html new file mode 100644 index 0000000..0f99038 --- /dev/null +++ b/admin/resources/templates/kc-component-config.html @@ -0,0 +1,68 @@ +
    +
    + + +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    +
    + +
    +
    + +
    +
    +
    +
    + +
    + +
    +
    + + + +
    +
    + +
    +
    + {{config[option.name]}} +
    +
    + +
    +
    + +
    + +
    + +
    + +
    +
    + +
    + + {{:: option.helpText | translate}} +
    +
    \ No newline at end of file diff --git a/admin/resources/templates/kc-copy.html b/admin/resources/templates/kc-copy.html new file mode 100644 index 0000000..d92b2d4 --- /dev/null +++ b/admin/resources/templates/kc-copy.html @@ -0,0 +1,18 @@ + + + \ No newline at end of file diff --git a/admin/resources/templates/kc-dropdown.html b/admin/resources/templates/kc-dropdown.html new file mode 100644 index 0000000..13874ca --- /dev/null +++ b/admin/resources/templates/kc-dropdown.html @@ -0,0 +1,12 @@ + \ No newline at end of file diff --git a/admin/resources/templates/kc-menu.html b/admin/resources/templates/kc-menu.html new file mode 100644 index 0000000..95c5fd1 --- /dev/null +++ b/admin/resources/templates/kc-menu.html @@ -0,0 +1,63 @@ + \ No newline at end of file diff --git a/admin/resources/templates/kc-modal-message.html b/admin/resources/templates/kc-modal-message.html new file mode 100644 index 0000000..fc32708 --- /dev/null +++ b/admin/resources/templates/kc-modal-message.html @@ -0,0 +1,10 @@ + + + \ No newline at end of file diff --git a/admin/resources/templates/kc-modal.html b/admin/resources/templates/kc-modal.html new file mode 100644 index 0000000..25eee96 --- /dev/null +++ b/admin/resources/templates/kc-modal.html @@ -0,0 +1,11 @@ + + + \ No newline at end of file diff --git a/admin/resources/templates/kc-paging.html b/admin/resources/templates/kc-paging.html new file mode 100644 index 0000000..653e4a5 --- /dev/null +++ b/admin/resources/templates/kc-paging.html @@ -0,0 +1,25 @@ + \ No newline at end of file diff --git a/admin/resources/templates/kc-provider-config.html b/admin/resources/templates/kc-provider-config.html new file mode 100644 index 0000000..74e97a0 --- /dev/null +++ b/admin/resources/templates/kc-provider-config.html @@ -0,0 +1,43 @@ +
    +
    + + +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    +
    + +
    +
    + +
    +
    +
    +
    + +
    + +
    +
    + {{config[option.name]}} +
    +
    + + {{:: option.helpText | translate}} +
    +
    \ No newline at end of file diff --git a/admin/resources/templates/kc-switch.html b/admin/resources/templates/kc-switch.html new file mode 100644 index 0000000..7f28598 --- /dev/null +++ b/admin/resources/templates/kc-switch.html @@ -0,0 +1,12 @@ + +
    + + +
    +
    \ No newline at end of file diff --git a/admin/resources/templates/kc-tabs-authentication.html b/admin/resources/templates/kc-tabs-authentication.html new file mode 100644 index 0000000..2bf3940 --- /dev/null +++ b/admin/resources/templates/kc-tabs-authentication.html @@ -0,0 +1,7 @@ + \ No newline at end of file diff --git a/admin/resources/templates/kc-tabs-client-role.html b/admin/resources/templates/kc-tabs-client-role.html new file mode 100644 index 0000000..fd966d5 --- /dev/null +++ b/admin/resources/templates/kc-tabs-client-role.html @@ -0,0 +1,13 @@ +
    +

    {{:: 'add-role' | translate}}

    +

    {{role.name|capitalize}}

    + + +
    \ No newline at end of file diff --git a/admin/resources/templates/kc-tabs-client-template.html b/admin/resources/templates/kc-tabs-client-template.html new file mode 100644 index 0000000..6328c4e --- /dev/null +++ b/admin/resources/templates/kc-tabs-client-template.html @@ -0,0 +1,20 @@ +
    + +

    {{:: 'add-client-template' | translate}}

    +

    + {{template.name|capitalize}} + +

    + + +
    \ No newline at end of file diff --git a/admin/resources/templates/kc-tabs-client.html b/admin/resources/templates/kc-tabs-client.html new file mode 100644 index 0000000..40aab54 --- /dev/null +++ b/admin/resources/templates/kc-tabs-client.html @@ -0,0 +1,59 @@ +
    + +

    {{:: 'add-client' | translate}}

    +

    + {{client.clientId|capitalize}} + +

    + + +
    diff --git a/admin/resources/templates/kc-tabs-group-list.html b/admin/resources/templates/kc-tabs-group-list.html new file mode 100644 index 0000000..5b67035 --- /dev/null +++ b/admin/resources/templates/kc-tabs-group-list.html @@ -0,0 +1,11 @@ +
    +

    + {{:: 'user-groups' | translate}} +

    + + +
    \ No newline at end of file diff --git a/admin/resources/templates/kc-tabs-group.html b/admin/resources/templates/kc-tabs-group.html new file mode 100644 index 0000000..b0abb95 --- /dev/null +++ b/admin/resources/templates/kc-tabs-group.html @@ -0,0 +1,17 @@ +
    +

    + {{group.name|capitalize}} + +

    + + +
    \ No newline at end of file diff --git a/admin/resources/templates/kc-tabs-identity-provider.html b/admin/resources/templates/kc-tabs-identity-provider.html new file mode 100644 index 0000000..c8e69e3 --- /dev/null +++ b/admin/resources/templates/kc-tabs-identity-provider.html @@ -0,0 +1,17 @@ +
    +

    + {{identityProvider.displayName}} + {{provider.name}} + {{identityProvider.alias}} + + +

    +

    {{:: 'add-identity-provider' | translate}}

    + + +
    diff --git a/admin/resources/templates/kc-tabs-ldap.html b/admin/resources/templates/kc-tabs-ldap.html new file mode 100644 index 0000000..a4f17a8 --- /dev/null +++ b/admin/resources/templates/kc-tabs-ldap.html @@ -0,0 +1,12 @@ +
    +

    + {{instance.name|capitalize}} + +

    +

    {{:: 'add-user-federation-provider' | translate}}

    + + +
    diff --git a/admin/resources/templates/kc-tabs-realm.html b/admin/resources/templates/kc-tabs-realm.html new file mode 100644 index 0000000..ae19473 --- /dev/null +++ b/admin/resources/templates/kc-tabs-realm.html @@ -0,0 +1,19 @@ + \ No newline at end of file diff --git a/admin/resources/templates/kc-tabs-role.html b/admin/resources/templates/kc-tabs-role.html new file mode 100644 index 0000000..9128dfd --- /dev/null +++ b/admin/resources/templates/kc-tabs-role.html @@ -0,0 +1,15 @@ +
    +

    {{role.name|capitalize}}

    +

    {{:: 'add-role' | translate}}

    + + +
    \ No newline at end of file diff --git a/admin/resources/templates/kc-tabs-user-storage.html b/admin/resources/templates/kc-tabs-user-storage.html new file mode 100644 index 0000000..03e1ddc --- /dev/null +++ b/admin/resources/templates/kc-tabs-user-storage.html @@ -0,0 +1,11 @@ +
    +

    + {{instance.name|capitalize}} + +

    +

    {{:: 'add-user-storage-provider' | translate}}

    + + +
    diff --git a/admin/resources/templates/kc-tabs-user.html b/admin/resources/templates/kc-tabs-user.html new file mode 100644 index 0000000..9c372e3 --- /dev/null +++ b/admin/resources/templates/kc-tabs-user.html @@ -0,0 +1,18 @@ + \ No newline at end of file diff --git a/admin/resources/templates/kc-tabs-users.html b/admin/resources/templates/kc-tabs-users.html new file mode 100644 index 0000000..61fe890 --- /dev/null +++ b/admin/resources/templates/kc-tabs-users.html @@ -0,0 +1,11 @@ +
    +

    {{:: 'users' | translate}}

    + + +
    \ No newline at end of file diff --git a/admin/theme.properties b/admin/theme.properties new file mode 100644 index 0000000..c1b9f53 --- /dev/null +++ b/admin/theme.properties @@ -0,0 +1 @@ +locales=ca,de,en,es,fr,it,ja,lt,nl,no,pt-BR,ru,sv,zh-CN diff --git a/email/html/email-test.ftl b/email/html/email-test.ftl new file mode 100644 index 0000000..d5d18b7 --- /dev/null +++ b/email/html/email-test.ftl @@ -0,0 +1,5 @@ + + +${msg("emailTestBodyHtml",realmName)?no_esc} + + diff --git a/email/html/email-verification.ftl b/email/html/email-verification.ftl new file mode 100644 index 0000000..b2142ef --- /dev/null +++ b/email/html/email-verification.ftl @@ -0,0 +1,5 @@ + + +${msg("emailVerificationBodyHtml",link, linkExpiration, realmName)?no_esc} + + diff --git a/email/html/event-login_error.ftl b/email/html/event-login_error.ftl new file mode 100644 index 0000000..68ba81d --- /dev/null +++ b/email/html/event-login_error.ftl @@ -0,0 +1,5 @@ + + +${msg("eventLoginErrorBodyHtml",event.date,event.ipAddress)?no_esc} + + diff --git a/email/html/event-remove_totp.ftl b/email/html/event-remove_totp.ftl new file mode 100644 index 0000000..e5ddadb --- /dev/null +++ b/email/html/event-remove_totp.ftl @@ -0,0 +1,5 @@ + + +${msg("eventRemoveTotpBodyHtml",event.date, event.ipAddress)?no_esc} + + diff --git a/email/html/event-update_password.ftl b/email/html/event-update_password.ftl new file mode 100644 index 0000000..dd5fda3 --- /dev/null +++ b/email/html/event-update_password.ftl @@ -0,0 +1,5 @@ + + +${msg("eventUpdatePasswordBodyHtml",event.date, event.ipAddress)?no_esc} + + diff --git a/email/html/event-update_totp.ftl b/email/html/event-update_totp.ftl new file mode 100644 index 0000000..050abab --- /dev/null +++ b/email/html/event-update_totp.ftl @@ -0,0 +1,5 @@ + + +${msg("eventUpdateTotpBodyHtml",event.date, event.ipAddress)?no_esc} + + diff --git a/email/html/executeActions.ftl b/email/html/executeActions.ftl new file mode 100644 index 0000000..509f617 --- /dev/null +++ b/email/html/executeActions.ftl @@ -0,0 +1,8 @@ +<#assign requiredActionsText> +<#if requiredActions??><#list requiredActions><#items as reqActionItem>${msg("requiredAction.${reqActionItem}")}<#sep>, <#else> + + + +${msg("executeActionsBodyHtml",link, linkExpiration, realmName, requiredActionsText)?no_esc} + + diff --git a/email/html/identity-provider-link.ftl b/email/html/identity-provider-link.ftl new file mode 100644 index 0000000..31bddbe --- /dev/null +++ b/email/html/identity-provider-link.ftl @@ -0,0 +1,5 @@ + + +${msg("identityProviderLinkBodyHtml", identityProviderAlias, realmName, identityProviderContext.username, link, linkExpiration)?no_esc} + + \ No newline at end of file diff --git a/email/html/password-reset.ftl b/email/html/password-reset.ftl new file mode 100644 index 0000000..edbc888 --- /dev/null +++ b/email/html/password-reset.ftl @@ -0,0 +1,5 @@ + + +${msg("passwordResetBodyHtml",link, linkExpiration, realmName)?no_esc} + + \ No newline at end of file diff --git a/email/messages/messages_ca.properties b/email/messages/messages_ca.properties new file mode 100644 index 0000000..7f8504a --- /dev/null +++ b/email/messages/messages_ca.properties @@ -0,0 +1,21 @@ +emailVerificationSubject=Verificaci\u00F3 d''email +emailVerificationBody=Alg\u00FA ha creat un compte de {2} amb aquesta adre\u00E7a de correu electr\u00F2nic. Si has estat tu, fes clic a l''enlla\u00E7 seg\u00FCent per verificar la teva adre\u00E7a de correu electr\u00F2nic.\n\n{0}\n\nAquest enlla\u00E7 expirar\u00E0 en {1} minuts.\n\nSi tu no has creat aquest compte, simplement ignora aquest missatge. +emailVerificationBodyHtml=

    Alg\u00FA ha creat un compte de {2} amb aquesta adre\u00E7a de correu electr\u00F2nic. Si has estat tu, fes clic a l''enlla\u00E7 seg\u00FCent per verificar la teva adre\u00E7a de correu electr\u00F2nic.

    {0}

    Aquest enlla\u00E7 expirar\u00E0 en {1} minuts.

    Si tu no has creat aquest compte, simplement ignora aquest missatge.

    +passwordResetSubject=Reinicia contrasenya +passwordResetBody=Alg\u00FA ha demanat de canviar les credencials del teu compte de {2}. Si has estat tu, fes clic a l''enlla\u00E7 seg\u00FCent per a reiniciar-les.\n\n{0}\n\nAquest enlla\u00E7 expirar\u00E0 en {1} minuts.\n\nSi no vols reiniciar les teves credencials, simplement ignora aquest missatge i no es realitzar\u00E0 cap canvi. +passwordResetBodyHtml=

    Alg\u00FA ha demanat de canviar les credencials del teu compte de {2}. Si has estat tu, fes clic a l''enlla\u00E7 seg\u00FCent per a reiniciar-les.

    {0}

    Aquest enlla\u00E7 expirar\u00E0 en {1} minuts.

    Si no vols reiniciar les teves credencials, simplement ignora aquest missatge i no es realitzar\u00E0 cap canvi.

    +executeActionsSubject=Actualitza el teu compte +executeActionsBody=L''administrador ha sol\u00B7licitat que actualitzis el teu compte de {2}. Fes clic a l''enlla\u00E7 inferior per iniciar aquest proc\u00E9s.\n\n{0}\n\nAquest enlla\u00E7 expirar\u00E0 en {1} minutes.\n\nSi no est\u00E0s al tant que l''administrador hagi sol\u00B7licitat aix\u00F2, simplement ignora aquest missatge i no es realitzar\u00E0 cap canvi. +executeActionsBodyHtml=

    L''administrador ha sol\u00B7licitat que actualitzis el teu compte de {2}. Fes clic a l''enlla\u00E7 inferior per iniciar aquest proc\u00E9s.

    {0}

    Aquest enlla\u00E7 expirar\u00E0 en {1} minutes.

    Si no est\u00E0s al tant que l''administrador hagi sol\u00B7licitat aix\u00F2, simplement ignora aquest missatge i no es realitzar\u00E0 cap canvi.

    +eventLoginErrorSubject=Fallada en l''inici de sessi\u00F3 +eventLoginErrorBody=S''ha detectat un intent d''acc\u00E9s fallit al teu compte el {0} des de {1}. Si no has estat tu, si us plau contacta amb l''administrador. +eventLoginErrorBodyHtml=

    S''ha detectat un intent d''acc\u00E9s fallit al teu compte el {0} des de {1}. Si no has estat tu, si us plau contacta amb l''administrador.

    +eventRemoveTotpSubject=Esborrat TOTP +eventRemoveTotpBody=TOTP s''ha eliminat del teu compte el {0} des de {1}. Si no has estat tu, per favor contacta amb l''administrador. +eventRemoveTotpBodyHtml=

    TOTP s''ha eliminat del teu compte el {0} des de {1}. Si no has estat tu, si us plau contacta amb l''administrador. +eventUpdatePasswordSubject=Actualitzaci\u00F3 de contrasenya +eventUpdatePasswordBody=La teva contrasenya s''ha actualitzat el {0} des de {1}. Si no has estat tu, si us plau contacta amb l''administrador. +eventUpdatePasswordBodyHtml=

    La teva contrasenya s''ha actualitzat el {0} des de {1}. Si no has estat tu, si us plau contacta amb l''administrador.

    +eventUpdateTotpSubject=Actualitzaci\u00F3 de TOTP +eventUpdateTotpBody=TOTP s''ha actualitzat al teu compte el {0} des de {1}. Si no has estat tu, si us plau contacta amb l''administrador. +eventUpdateTotpBodyHtml=

    TOTP s''ha actualitzat al teu compte el {0} des de {1}. Si no has estat tu, si us plau contacta amb l''administrador.

    diff --git a/email/messages/messages_cs.properties b/email/messages/messages_cs.properties new file mode 100644 index 0000000..42d65c1 --- /dev/null +++ b/email/messages/messages_cs.properties @@ -0,0 +1,42 @@ +# encoding: UTF-8 +emailVerificationSubject=Ověření emailové adresy +emailVerificationBody=Tato emailová adresa byla použita pro účet na "{2}". Pokud jste akci provedli, použijte odkaz níže k dokončení změny.\n\n{0}\n\nOdkaz vyprší za {1} minut.\n\nPokud jste změnu neprováděli vy, zprávu prosím ignorujte. +emailVerificationBodyHtml=

    Tato emailová adresa byla použita pro účet na "{2}". Pokud akci provedli, použijte odkaz níže k dokončení změny.

    Pokračujte zde

    Odkaz vyprší za {1} minut.

    Pokud jste změnu neprováděli vy, zprávu prosím ignorujte.

    + +emailTestSubject=[KEYCLOAK] - SMTP testovací zpráva +emailTestBody=Toto je testovací zpráva. +emailTestBodyHtml=

    Toto je testovací zpráva.

    + +identityProviderLinkSubject=Propojení účtu s {0} +identityProviderLinkBody=Někdo chce propojit váš "{1}" účet s "{0}" účtem uživatele "{2}". Pokud jste to byli vy, propojte účty kliknutím na odkaz níže.\n\n{3}\n\niOdkaz vyprší za {4} minut.\n\nPokud účty propojit nechcete, tuto zprávu ignorujte. Pokud účty propojíte, budete se moci přihlásit do {1} pomocí {0}. +identityProviderLinkBodyHtml=

    Někdo chce propojit váš {1} účet s {0} účtem uživatele {2}. Pokud jste to byli vy, propojte účty kliknutím na odkaz níže.

    Potvrdit propojení účtů

    Odkaz vyprší za {4} minut.

    Pokud účty propojit nechcete, tuto zprávu ignorujte. Pokud účty propojíte, budete se moci přihlásit do {1} pomocí {0}.

    + +passwordResetSubject=Vytvoření nového hesla +passwordResetBody=Bylo vyžádáno vytvoření nového hesla Vašeho účtu na "{2}". Pokud jste o změnu žádali, klikněte na odkaz níže a heslo si nastavte.\n\n{0}\n\nTento odkaz vyprší za {1} minut.\n\nPokud jste o tuto změnu nežádali, na email nereagujte a nic se nezmění. +passwordResetBodyHtml=

    Bylo vyžádáno vytvoření nového hesla Vašeho účtu na {2}. Pokud jste o změnu žádali, klikněte na odkaz níže a heslo si nastavte.

    Přihlašovací heslo změňte zde

    Tento odkaz vyprší za {1} minut.

    Pokud jste o tuto změnu nežádali, na email nereagujte a nic se nezmění.

    + +executeActionsSubject=Aktualizace účtu +executeActionsBody=Správce identit Vás žádá, abyste aktualizovali Váš {2} účet provedením následujících akcí: {3}. Použijte odkaz níže.\n\n{0}\n\nOdkaz vyprší za {1} minut.\n\nPokud se domníváte, že si Správce identit tuto změnu nevyžádal, zprávu prosím ignorujte. +executeActionsBodyHtml=

    Správce identit Vás žádá, abyste aktualizovali Váš {2} účet provedením následujících akcí: {3}. Použijte odkaz níže.

    Aktualizovat účet

    Odkaz vyprší za {1} minut.

    Pokud se domníváte, že si Správce identit tuto změnu nevyžádal, zprávu prosím ignorujte.

    + +eventLoginErrorSubject=Chyba přihlášení +eventLoginErrorBody=Byl zaznamenán neúspěšný pokus o přihlášení k Vašemu účtu na {0} z {1}. Pokud jste to nebyli Vy, kontaktujte, prosím, správce. +eventLoginErrorBodyHtml=

    Byl zaznamenán neúspěšný pokus o přihlášení k Vašemu účtu na {0} z {1}. Pokud jste to nebyli Vy, kontaktujte, prosím, správce.

    + +eventRemoveTotpSubject=Odstranění 2-faktorové autentifikace TOTP +eventRemoveTotpBody=Dvoufaktorová autorizace TOTP byla odstraněna z Vašeho účtu na {0} z {1}. Pokud jste to nebyli Vy, kontaktujte, prosím, správce. +eventRemoveTotpBodyHtml=

    Dvoufaktorová autorizace TOTP byla odstraněna z Vašeho účtu na {0} z {1}. Pokud jste to nebyli Vy, kontaktujte, prosím, správce.

    + +eventUpdatePasswordSubject=Aktualizace hesla +eventUpdatePasswordBody=Bylo změněno Vaše heslo na účtu na {0} z {1}. Pokud jste to nebyli Vy, kontaktujte, prosím, správce. +eventUpdatePasswordBodyHtml=

    Bylo změněno Vaše heslo na účtu na {0} z {1}. Pokud jste to nebyli Vy, kontaktujte, prosím, správce.

    + +eventUpdateTotpSubject=Aktualizace 2-faktorové autentifikace TOTP +eventUpdateTotpBody=Dvoufaktorová autorizace TOTP byla aktualizována na Vašem účtu na {0} z {1}. Pokud jste to nebyli Vy, kontaktujte, prosím, správce. +eventUpdateTotpBodyHtml=

    Dvoufaktorová autorizace TOTP byla aktualizována na Vašem účtu na {0} z {1}. Pokud jste to nebyli Vy, kontaktujte, prosím, správce.

    + +requiredAction.CONFIGURE_TOTP=Nastavit TOTP +requiredAction.terms_and_conditions=Podmínky užití +requiredAction.UPDATE_PASSWORD=Aktualizovat heslo +requiredAction.UPDATE_PROFILE=Aktualizovat profil +requiredAction.VERIFY_EMAIL=Ověřit emailovou adresu diff --git a/email/messages/messages_de.properties b/email/messages/messages_de.properties new file mode 100644 index 0000000..9068321 --- /dev/null +++ b/email/messages/messages_de.properties @@ -0,0 +1,24 @@ +emailVerificationSubject=E-Mail verifizieren +emailVerificationBody=Jemand hat ein {2} Konto mit dieser E-Mail Adresse erstellt. Falls Sie das waren, dann klicken Sie auf den Link, um die E-Mail Adresse zu verifizieren.\n\n{0}\n\nDieser Link wird in {1} Minuten ablaufen.\n\nFalls Sie dieses Konto nicht erstellt haben, dann k\u00F6nnen sie diese Nachricht ignorieren. +emailVerificationBodyHtml=

    Jemand hat ein {2} Konto mit dieser E-Mail Adresse erstellt. Falls das Sie waren, klicken Sie auf den Link, um die E-Mail Adresse zu verifizieren.

    {0}

    Dieser Link wird in {1} Minuten ablaufen.

    Falls Sie dieses Konto nicht erstellt haben, dann k\u00F6nnen sie diese Nachricht ignorieren.

    +identityProviderLinkSubject=Link {0} +identityProviderLinkBody=Es wurde beantragt Ihren Account {1} mit dem Account {0} von Benutzer {2} zu verlinken. Sollten Sie dies beantragt haben, klicken Sie auf den unten stehenden Link.\n\n{3}\n\n Die G\u00FCltigkeit des Links wird in {4} Minuten verfallen.\n\nSollten Sie Ihren Account nicht verlinken wollen, ignorieren Sie diese Nachricht. Wenn Sie die Accounts verlinken wird ein Login auf {1} \u00FCber {0} erm\u00F6glicht. +identityProviderLinkBodyHtml=

    Es wurde beantragt Ihren Account {1} mit dem Account {0} von Benutzer {2} zu verlinken. Sollten Sie dies beantragt haben, klicken Sie auf den unten stehenden Link.

    Link zur Best\u00E4tigung der Kontoverkn\u00FCpfung

    Die G\u00FCltigkeit des Links wird in {4} Minuten verfallen.

    Sollten Sie Ihren Account nicht verlinken wollen, ignorieren Sie diese Nachricht. Wenn Sie die Accounts verlinken wird ein Login auf {1} \u00FCber {0} erm\u00F6glicht.

    +passwordResetSubject=Passwort zur\u00FCcksetzen +passwordResetBody=Es wurde eine \u00C4nderung der Anmeldeinformationen f\u00FCr Ihren Account {2} angefordert. Wenn Sie diese \u00C4nderung beantragt haben, klicken Sie auf den unten stehenden Link.\n\n{0}\n\nDie G\u00FCltigkeit des Links wird in {1} Minuten verfallen.\n\nSollten Sie keine \u00C4nderung vollziehen wollen k\u00F6nnen Sie diese Nachricht ignorieren und an Ihrem Account wird nichts ge\u00E4ndert. +passwordResetBodyHtml=

    Es wurde eine \u00C4nderung der Anmeldeinformationen f\u00FCr Ihren Account {2} angefordert. Wenn Sie diese \u00C4nderung beantragt haben, klicken Sie auf den unten stehenden Link.

    Link zum Zur\u00FCcksetzen von Anmeldeinformationen

    Die G\u00FCltigkeit des Links wird in {1} Minuten verfallen.

    Sollten Sie keine \u00C4nderung vollziehen wollen k\u00F6nnen Sie diese Nachricht ignorieren und an Ihrem Account wird nichts ge\u00E4ndert.

    +executeActionsSubject=Aktualisieren Sie Ihr Konto +executeActionsBody=Ihr Administrator hat Sie aufgefordert Ihren Account {2} zu aktualisieren. Klicken Sie auf den unten stehenden Link um den Prozess zu starten.\n\n{0}\n\nDie G\u00FCltigkeit des Links wird in {1} Minuten verfallen.\n\nSollten Sie sich dieser Aufforderung nicht bewusst sein, ignorieren Sie diese Nachricht und Ihr Account bleibt unver\u00E4ndert. +executeActionsBodyHtml=

    Ihr Administrator hat Sie aufgefordert Ihren Account {2} zu aktualisieren. Klicken Sie auf den unten stehenden Link um den Prozess zu starten.

    Link zum Account-Update

    Die G\u00FCltigkeit des Links wird in {1} Minuten verfallen.

    Sollten Sie sich dieser Aufforderung nicht bewusst sein, ignorieren Sie diese Nachricht und Ihr Account bleibt unver\u00E4ndert.

    +eventLoginErrorSubject=Fehlgeschlagene Anmeldung +eventLoginErrorBody=Jemand hat um {0} von {1} versucht, sich mit ihrem Konto anzumelden. Falls das nicht Sie waren, dann kontaktieren Sie bitte Ihren Admin. +eventLoginErrorBodyHtml=

    Jemand hat um {0} von {1} versucht, sich mit ihrem Konto anzumelden. Falls das nicht Sie waren, dann kontaktieren Sie bitte Ihren Admin.

    +eventRemoveTotpSubject=TOTP Entfernt +eventRemoveTotpBody=TOTP wurde von ihrem Konto am {0} von {1} entfernt. Falls das nicht Sie waren, dann kontaktieren Sie bitte Ihren Admin. +eventRemoveTotpBodyHtml=

    TOTP wurde von ihrem Konto am {0} von {1} entfernt. Falls das nicht Sie waren, dann kontaktieren Sie bitte Ihren Admin.

    +eventUpdatePasswordSubject=Passwort Aktualisiert +eventUpdatePasswordBody=Ihr Passwort wurde am {0} von {1} ge\u00E4ndert. Falls das nicht Sie waren, dann kontaktieren Sie bitte Ihren Admin. +eventUpdatePasswordBodyHtml=

    Ihr Passwort wurde am {0} von {1} ge\u00E4ndert. Falls das nicht Sie waren, dann kontaktieren Sie bitte Ihren Admin.

    +eventUpdateTotpSubject=TOTP Aktualisiert +eventUpdateTotpBody=TOTP wurde am {0} von {1} ge\u00E4ndert. Falls das nicht Sie waren, dann kontaktieren Sie bitte Ihren Admin. +eventUpdateTotpBodyHtml=

    TOTP wurde am {0} von {1} ge\u00E4ndert. Falls das nicht Sie waren, dann kontaktieren Sie bitte Ihren Admin.

    diff --git a/email/messages/messages_en.properties b/email/messages/messages_en.properties new file mode 100644 index 0000000..5cb1b6e --- /dev/null +++ b/email/messages/messages_en.properties @@ -0,0 +1,33 @@ +emailVerificationSubject=Verify email +emailVerificationBody=Someone has created a {2} account with this email address. If this was you, click the link below to verify your email address\n\n{0}\n\nThis link will expire within {1} minutes.\n\nIf you didn''t create this account, just ignore this message. +emailVerificationBodyHtml=

    Someone has created a {2} account with this email address. If this was you, click the link below to verify your email address

    Link to e-mail address verification

    This link will expire within {1} minutes.

    If you didn''t create this account, just ignore this message.

    +emailTestSubject=[KEYCLOAK] - SMTP test message +emailTestBody=This is a test message +emailTestBodyHtml=

    This is a test message

    +identityProviderLinkSubject=Link {0} +identityProviderLinkBody=Someone wants to link your "{1}" account with "{0}" account of user {2} . If this was you, click the link below to link accounts\n\n{3}\n\nThis link will expire within {4} minutes.\n\nIf you don''t want to link account, just ignore this message. If you link accounts, you will be able to login to {1} through {0}. +identityProviderLinkBodyHtml=

    Someone wants to link your {1} account with {0} account of user {2} . If this was you, click the link below to link accounts

    Link to confirm account linking

    This link will expire within {4} minutes.

    If you don''t want to link account, just ignore this message. If you link accounts, you will be able to login to {1} through {0}.

    +passwordResetSubject=Reset password +passwordResetBody=Someone just requested to change your {2} account''s credentials. If this was you, click on the link below to reset them.\n\n{0}\n\nThis link and code will expire within {1} minutes.\n\nIf you don''t want to reset your credentials, just ignore this message and nothing will be changed. +passwordResetBodyHtml=

    Someone just requested to change your {2} account''s credentials. If this was you, click on the link below to reset them.

    Link to reset credentials

    This link will expire within {1} minutes.

    If you don''t want to reset your credentials, just ignore this message and nothing will be changed.

    +executeActionsSubject=Update Your Account +executeActionsBody=Your administrator has just requested that you update your {2} account by performing the following action(s): {3}. Click on the link below to start this process.\n\n{0}\n\nThis link will expire within {1} minutes.\n\nIf you are unaware that your admin has requested this, just ignore this message and nothing will be changed. +executeActionsBodyHtml=

    Your administrator has just requested that you update your {2} account by performing the following action(s): {3}. Click on the link below to start this process.

    Link to account update

    This link will expire within {1} minutes.

    If you are unaware that your admin has requested this, just ignore this message and nothing will be changed.

    +eventLoginErrorSubject=Login error +eventLoginErrorBody=A failed login attempt was detected to your account on {0} from {1}. If this was not you, please contact an admin. +eventLoginErrorBodyHtml=

    A failed login attempt was detected to your account on {0} from {1}. If this was not you, please contact an admin.

    +eventRemoveTotpSubject=Remove TOTP +eventRemoveTotpBody=TOTP was removed from your account on {0} from {1}. If this was not you, please contact an admin. +eventRemoveTotpBodyHtml=

    TOTP was removed from your account on {0} from {1}. If this was not you, please contact an admin.

    +eventUpdatePasswordSubject=Update password +eventUpdatePasswordBody=Your password was changed on {0} from {1}. If this was not you, please contact an admin. +eventUpdatePasswordBodyHtml=

    Your password was changed on {0} from {1}. If this was not you, please contact an admin.

    +eventUpdateTotpSubject=Update TOTP +eventUpdateTotpBody=TOTP was updated for your account on {0} from {1}. If this was not you, please contact an admin. +eventUpdateTotpBodyHtml=

    TOTP was updated for your account on {0} from {1}. If this was not you, please contact an admin.

    + +requiredAction.CONFIGURE_TOTP=Configure OTP +requiredAction.terms_and_conditions=Terms and Conditions +requiredAction.UPDATE_PASSWORD=Update Password +requiredAction.UPDATE_PROFILE=Update Profile +requiredAction.VERIFY_EMAIL=Verify Email diff --git a/email/messages/messages_es.properties b/email/messages/messages_es.properties new file mode 100644 index 0000000..1616014 --- /dev/null +++ b/email/messages/messages_es.properties @@ -0,0 +1,21 @@ +emailVerificationSubject=Verificaci\u00F3n de email +emailVerificationBody=Alguien ha creado una cuenta de {2} con esta direcci\u00F3n de email. Si has sido t\u00FA, haz click en el enlace siguiente para verificar tu direcci\u00F3n de email.\n\n{0}\n\nEste enlace expirar\u00E1 en {1} minutos.\n\nSi t\u00FA no has creado esta cuenta, simplemente ignora este mensaje. +emailVerificationBodyHtml=

    Alguien ha creado una cuenta de {2} con esta direcci\u00F3n de email. Si has sido t\u00FA, haz click en el enlace siguiente para verificar tu direcci\u00F3n de email.

    {0}

    Este enlace expirar\u00E1 en {1} minutos.

    Si t\u00FA no has creado esta cuenta, simplemente ignora este mensaje.

    +passwordResetSubject=Reiniciar contrase\u00F1a +passwordResetBody=Alguien ha solicitado cambiar las credenciales de tu cuenta de {2}. Si has sido t\u00FA, haz clic en el enlace siguiente para reiniciarlas.\n\n{0}\n\nEste enlace expirar\u00E1 en {1} minutos.\n\nSi no quieres reiniciar tus credenciales, simplemente ignora este mensaje y no se realizar\u00E1 ning\u00FAn cambio. +passwordResetBodyHtml=

    Alguien ha solicitado cambiar las credenciales de tu cuenta de {2}. Si has sido t\u00FA, haz clic en el enlace siguiente para reiniciarlas.

    {0}

    Este enlace expirar\u00E1 en {1} minutos.

    Si no quieres reiniciar tus credenciales, simplemente ignora este mensaje y no se realizar\u00E1 ning\u00FAn cambio.

    +executeActionsSubject=Actualiza tu cuenta +executeActionsBody=El administrador ha solicitado que actualices tu cuenta de {2}. Haz clic en el enlace inferior para iniciar este proceso.\n\n{0}\n\nEste enlace expirar\u00E1 en {1} minutes.\n\nSi no est\u00E1s al tanto de que el administrador haya solicitado esto, simplemente ignora este mensaje y no se realizar\u00E1 ning\u00FAn cambio. +executeActionsBodyHtml=

    El administrador ha solicitado que actualices tu cuenta de {2}. Haz clic en el enlace inferior para iniciar este proceso.

    {0}

    Este enlace expirar\u00E1 en {1} minutes.

    Si no est\u00E1s al tanto de que el administrador haya solicitado esto, simplemente ignora este mensaje y no se realizar\u00E1 ning\u00FAn cambio.

    +eventLoginErrorSubject=Fallo en el inicio de sesi\u00F3n +eventLoginErrorBody=Se ha detectado un intento de acceso fallido a tu cuenta el {0} desde {1}. Si no has sido t\u00FA, por favor contacta con el administrador. +eventLoginErrorBodyHtml=

    Se ha detectado un intento de acceso fallido a tu cuenta el {0} desde {1}. Si no has sido t\u00FA, por favor contacta con el administrador.

    +eventRemoveTotpSubject=Borrado TOTP +eventRemoveTotpBody=TOTP fue eliminado de tu cuenta el {0} desde {1}. Si no has sido t\u00FA, por favor contacta con el administrador. +eventRemoveTotpBodyHtml=

    TOTP fue eliminado de tu cuenta el {0} desde {1}. Si no has sido t\u00FA, por favor contacta con el administrador.

    +eventUpdatePasswordSubject=Actualizaci\u00F3n de contrase\u00F1a +eventUpdatePasswordBody=Tu contrase\u00F1a se ha actualizado el {0} desde {1}. Si no has sido t\u00FA, por favor contacta con el administrador. +eventUpdatePasswordBodyHtml=

    Tu contrase\u00F1a se ha actualizado el {0} desde {1}. Si no has sido t\u00FA, por favor contacta con el administrador.

    +eventUpdateTotpSubject=Actualizaci\u00F3n de TOTP +eventUpdateTotpBody=TOTP se ha actualizado en tu cuenta el {0} desde {1}. Si no has sido t\u00FA, por favor contacta con el administrador. +eventUpdateTotpBodyHtml=

    TOTP se ha actualizado en tu cuenta el {0} desde {1}. Si no has sido t\u00FA, por favor contacta con el administrador.

    diff --git a/email/messages/messages_fr.properties b/email/messages/messages_fr.properties new file mode 100644 index 0000000..3467dec --- /dev/null +++ b/email/messages/messages_fr.properties @@ -0,0 +1,21 @@ +emailVerificationSubject=V\u00e9rification du courriel +emailVerificationBody=Quelqu''un vient de cr\u00e9er un compte "{2}" avec votre courriel. Si vous \u00eates \u00e0 l''origine de cette requ\u00eate, veuillez cliquer sur le lien ci-dessous afin de v\u00e9rifier votre adresse de courriel\n\n{0}\n\nCe lien expire dans {1} minute(s).\n\nSinon, veuillez ignorer ce message. +emailVerificationBodyHtml=

    Quelqu''un vient de cr\u00e9er un compte "{2}" avec votre courriel. Si vous \u00eates \u00e0 l''origine de cette requ\u00eate, veuillez cliquer sur le lien ci-dessous afin de v\u00e9rifier votre adresse de courriel

    {0}

    Ce lien expire dans {1} minute(s).

    Sinon, veuillez ignorer ce message.

    +passwordResetSubject=R\u00e9initialiser le mot de passe +passwordResetBody=Quelqu''un vient de demander une r\u00e9initialisation de mot de passe pour votre compte {2}. Si vous \u00eates \u00e0 l''origine de cette requ\u00eate, veuillez cliquer sur le lien ci-dessous pour le mettre \u00e0 jour.\n\n{0}\n\nCe lien expire dans {1} minute(s).\n\nSinon, veuillez ignorer ce message ; aucun changement ne sera effectu\u00e9 sur votre compte. +passwordResetBodyHtml=

    Quelqu''un vient de demander une r\u00e9initialisation de mot de passe pour votre compte {2}. Si vous \u00eates \u00e0 l''origine de cette requ\u00eate, veuillez cliquer sur le lien ci-dessous pour le mettre \u00e0 jour.

    {0}

    Ce lien expire dans {1} minute(s).

    Sinon, veuillez ignorer ce message ; aucun changement ne sera effectu\u00e9 sur votre compte.

    +executeActionsSubject=Mettre \u00e0 jour votre compte +executeActionsBody=Votre administrateur vient de demander une mise \u00e0 jour de votre compte {2}. Veuillez cliquer sur le lien ci-dessous afin de commencer le processus.\n\n{0}\n\nCe lien expire dans {1} minute(s).\n\nSi vous n''\u00eates pas \u00e0 l''origine de cette requ\u00eate, veuillez ignorer ce message ; aucun changement ne sera effectu\u00e9 sur votre compte. +executeActionsBodyHtml=

    Votre administrateur vient de demander une mise \u00e0 jour de votre compte {2}. Veuillez cliquer sur le lien ci-dessous afin de commencer le processus.

    {0}

    Ce lien expire dans {1} minute(s).

    Si vous n''\u00eates pas \u00e0 l''origine de cette requ\u00eate, veuillez ignorer ce message ; aucun changement ne sera effectu\u00e9 sur votre compte.

    +eventLoginErrorSubject=Erreur de connexion +eventLoginErrorBody=Une tentative de connexion a \u00e9t\u00e9 d\u00e9tect\u00e9e sur votre compte {0} depuis {1}. Si vous n''\u00eates pas \u00e0 l''origine de cette requ\u00eate, veuillez contacter votre administrateur. +eventLoginErrorBodyHtml=

    Une tentative de connexion a \u00e9t\u00e9 d\u00e9tect\u00e9e sur votre compte {0} depuis {1}. Si vous n''\u00eates pas \u00e0 l''origine de cette requ\u00eate, veuillez contacter votre administrateur.

    +eventRemoveTotpSubject=Suppression du TOTP +eventRemoveTotpBody=Le TOTP a \u00e9t\u00e9 supprim\u00e9 de votre compte {0} depuis {1}. Si vous n''\u00e9tiez pas \u00e0 l''origine de cette requ\u00eate, veuillez contacter votre administrateur. +eventRemoveTotpBodyHtml=

    Le TOTP a \u00e9t\u00e9 supprim\u00e9 de votre compte {0} depuis {1}. Si vous n''\u00e9tiez pas \u00e0 l''origine de cette requ\u00eate, veuillez contacter votre administrateur.

    +eventUpdatePasswordSubject=Mise \u00e0 jour du mot de passe +eventUpdatePasswordBody=Votre mot de passe pour votre compte {0} a \u00e9t\u00e9 modifi\u00e9 depuis {1}. Si vous n''\u00e9tiez pas \u00e0 l''origine de cette requ\u00eate, veuillez contacter votre administrateur. +eventUpdatePasswordBodyHtml=

    Votre mot de passe pour votre compte {0} a \u00e9t\u00e9 modifi\u00e9 depuis {1}. Si vous n''\u00e9tiez pas \u00e0 l''origine de cette requ\u00eate, veuillez contacter votre administrateur.

    +eventUpdateTotpSubject=Mise \u00e0 jour du TOTP +eventUpdateTotpBody=Le TOTP a \u00e9t\u00e9 mis \u00e0 jour pour votre compte {0} depuis {1}. Si vous n''\u00e9tiez pas \u00e0 l''origine de cette requ\u00eate, veuillez contacter votre administrateur. +eventUpdateTotpBodyHtml=

    Le TOTP a \u00e9t\u00e9 mis \u00e0 jour pour votre compte {0} depuis {1}. Si vous n''\u00e9tiez pas \u00e0 l''origine de cette requ\u00eate, veuillez contacter votre administrateur.

    diff --git a/email/messages/messages_it.properties b/email/messages/messages_it.properties new file mode 100644 index 0000000..b877b91 --- /dev/null +++ b/email/messages/messages_it.properties @@ -0,0 +1,24 @@ +emailVerificationSubject=Verifica l''email +emailVerificationBody=Qualcuno ha creato un {2} account con questo indirizzo email. Se sei stato tu, fai clic sul pulsante seguente per verificare il tuo indirizzo email\n\n{0}\n\nQuesto link scadr\u00e0 in {1} minuti.\n\nSe non sei stato tu a creare questo account, ignora questo messaggio. +emailVerificationBodyHtml=

    Qualcuno ha creato un {2} account con questo indirizzo email. Se sei stato tu, fai clic sul pulsante seguente per verificare il tuo indirizzo email

    {0}

    Questo link scadr\u00e0 in {1} minuti.

    Se non sei stato tu a creare questo account, ignora questo messaggio.

    +identityProviderLinkSubject=Link {0} +identityProviderLinkBody=Qualcuno vuole associare il tuo "{1}" account con "{0}" l''account dell''utente {2} . Se sei stato tu, fai clic sul pulsante seguente per associare gli account\n\n{3}\n\nQuesto link scadr\u00e0 in {4} minuti.\n\nSe non vuoi associare l''account, ignora questo messaggio. Se associ gli account, potrai accedere a {1} attraverso {0}. +identityProviderLinkBodyHtml=

    Qualcuno vuole associare il tuo {1} account con {0} l''account dell''utente {2} . Se sei stato tu, fai clic sul pulsante seguente per associare gli account

    {3}

    Questo link scadr\u00e0 in {4} minuti.

    Se non vuoi associare l''account, ignora questo messaggio. Se associ gli account, potrai accedere a {1} attraverso {0}.

    +passwordResetSubject=Reimposta la password +passwordResetBody= Qualcuno ha appena richiesto di cambiare le {2} credenziali di accesso al tuo account. Se sei stato tu, fai clic sul pulsante seguente reimpostarle.\n\n{0}\n\nQuesto link e codice scadranno in {1} minuti.\n\nSe non vuoi reimpostare le tue credenziali di accesso, ignora questo messaggio e non verr\u00e0 effettuato nessun cambio. +passwordResetBodyHtml=

    Qualcuno ha appena richiesto di cambiare le {2} credenziali di accesso al tuo account. Se sei stato tu, fai clic sul pulsante seguente reimpostarle.

    {0}

    Questo link scadr\u00e0 in {1} minuti.

    Se non vuoi reimpostare le tue credenziali di accesso, ignora questo messaggio e non verr\u00e0 effettuato nessun cambio.

    +executeActionsSubject=Aggiorna il tuo account +executeActionsBody=Il tuo amministratore ha appena richiesto un aggiornamento del tuo {2} account. Fai clic sul pulsante seguente per iniziare questo processo.\n\n{0}\n\nQuesto link scadr\u00e0 in {1} minuti.\n\nSe non sei a conoscenza della richiesta del tuo amministratore, ignora questo messaggio e non verr\u00e0 effettuato nessun cambio. +executeActionsBodyHtml=

    Il tuo amministratore ha appena richiesto un aggiornamento del tuo {2} account. Fai clic sul pulsante seguente per iniziare questo processo.

    {0}

    Questo link scadr\u00e0 in {1} minuti.

    Se non sei a conoscenza della richiesta del tuo amministratore, ignora questo messaggio e non verr\u00e0 effettuato nessun cambio.

    +eventLoginErrorSubject=Errore di accesso +eventLoginErrorBody=\u00c8 stato rilevato un tentativo fallito di accesso al tuo account il {0} da {1}. Se non sei stato tu, per favore contatta l''amministratore. +eventLoginErrorBodyHtml=

    \u00c8 stato rilevato un tentativo fallito di accesso al tuo account il {0} da {1}. Se non sei stato tu, per favore contatta l''amministratore.

    +eventRemoveTotpSubject=Rimuovi TOTP (Password temporanea valida una volta sola) +eventRemoveTotpBody=TOTP (Password temporanea valida una volta sola) \u00e8 stata rimossa dal tuo account il {0} da {1}. Se non sei stato tu, per favore contatta l''amministratore. +eventRemoveTotpBodyHtml=

    TOTP (Password temporanea valida una volta sola) \u00e8 stata rimossa dal tuo account il {0} da {1}. Se non sei stato tu, per favore contatta l''amministratore.

    +eventUpdatePasswordSubject=Aggiornamento password +eventUpdatePasswordBody=La tua password \u00e8 stata cambiata il {0} da {1}. Se non sei stato tu, per favore contatta l''amministratore. +eventUpdatePasswordBodyHtml=

    La tua password \u00e8 stata cambiata il {0} da {1}. Se non sei stato tu, per favore contatta l''amministratore.

    +eventUpdateTotpSubject=Aggiornamento TOTP (Password temporanea valida una volta sola) +eventUpdateTotpBody=TOTP (Password temporanea valida una volta sola) \u00e8 stata aggiornata per il tuo account il {0} da {1}. Se non sei stato tu, per favore contatta l''amministratore. +eventUpdateTotpBodyHtml=

    TOTP (Password temporanea valida una volta sola) \u00e8 stata aggiornata per il tuo account il {0} da {1}. Se non sei stato tu, per favore contatta l''amministratore.

    diff --git a/email/messages/messages_ja.properties b/email/messages/messages_ja.properties new file mode 100644 index 0000000..a60ffe3 --- /dev/null +++ b/email/messages/messages_ja.properties @@ -0,0 +1,25 @@ +# encoding: utf-8 +emailVerificationSubject=Eメールの確認 +emailVerificationBody=このメールアドレスで {2} アカウントが作成されたました。以下のリンクをクリックしてメールアドレスの確認を完了してください。\n\n{0}\n\nこのリンクは {1} 分間だけ有効です。\n\nもしこのアカウントの作成に心当たりがない場合は、このメールを無視してください。 +emailVerificationBodyHtml=

    このメールアドレスで {2} アカウントが作成されました。以下のリンクをクリックしてメールアドレスの確認を完了してください。

    メールアドレスの確認

    このリンクは {1} 分間だけ有効です。

    もしこのアカウントの作成に心当たりがない場合は、このメールを無視してください。

    +identityProviderLinkSubject=リンク {0} +identityProviderLinkBody=あなたの "{1}" アカウントと {2} ユーザーの "{0}" アカウントのリンクが要求されました。以下のリンクをクリックしてアカウントのリンクを行ってください。\n\n{3}\n\nこのリンクは {4} 分間だけ有効です。\n\nもしアカウントのリンクを行わない場合は、このメッセージを無視してください。アカウントのリンクを行うことで、{0} 経由で {1} にログインすることができるようになります。 +identityProviderLinkBodyHtml=

    あなたの {1} アカウントと {2} ユーザーの {0} アカウントのリンクが要求されました。以下のリンクをクリックしてアカウントのリンクを行ってください。

    アカウントリンクの確認

    このリンクは {4} 分間だけ有効です。

    もしアカウントのリンクを行わない場合は、このメッセージを無視してください。アカウントのリンクを行うことで、{0} 経由で {1} にログインすることができるようになります。

    +passwordResetSubject=パスワードのリセット +passwordResetBody=あなたの {2} アカウントのパスワードの変更が要求されています。以下のリンクをクリックしてパスワードのリセットを行ってください。\n\n{0}\n\nこのリンクは {1} 分間だけ有効です。\n\nもしパスワードのリセットを行わない場合は、このメッセージを無視してください。何も変更されません。 +passwordResetBodyHtml=

    あなたの {2} アカウントのパスワードの変更が要求されています。以下のリンクをクリックしてパスワードのリセットを行ってください。

    パスワードのリセット

    このリンクは {1} 分間だけ有効です。

    もしパスワードのリセットを行わない場合は、このメッセージを無視してください。何も変更されません。

    +executeActionsSubject=アカウントの更新 +executeActionsBody=管理者よりあなたの {2} アカウントの更新が要求されています。以下のリンクをクリックしてこのプロセスを開始してください。\n\n{0}\n\nこのリンクは {1} 分間だけ有効です。\n\n管理者からのこの変更要求についてご存知ない場合は、このメッセージを無視してください。何も変更されません。 +executeActionsBodyHtml=

    管理者よりあなたの {2} アカウントの更新が要求されています。以下のリンクをクリックしてこのプロセスを開始してください。

    アカウントの更新

    このリンクは {1} 分間だけ有効です。

    管理者からのこの変更要求についてご存知ない場合は、このメッセージを無視してください。何も変更されません。

    +eventLoginErrorSubject=ログインエラー +eventLoginErrorBody={0} に {1} からのログイン失敗があなたのアカウントで検出されました。心当たりがない場合は、管理者に連絡してください。 +eventLoginErrorBodyHtml=

    {0} に {1} からのログイン失敗があなたのアカウントで検出されました。心当たりがない場合は管理者に連絡してください。

    +eventRemoveTotpSubject=TOTPの削除 +eventRemoveTotpBody={0} に {1} からの操作で TOTP が削除されました。心当たりがない場合は、管理者に連絡してください。 +eventRemoveTotpBodyHtml=

    {0} に {1} からの操作で TOTP が削除されました。心当たりがない場合は、管理者に連絡してください。

    +eventUpdatePasswordSubject=パスワードの更新 +eventUpdatePasswordBody={0} に {1} からの操作であなたのパスワードが変更されました。心当たりがない場合は、管理者に連絡してください。 +eventUpdatePasswordBodyHtml=

    {0} に {1} からの操作であなたのパスワードが変更されました。心当たりがない場合は、管理者に連絡してください。

    +eventUpdateTotpSubject=TOTPの更新 +eventUpdateTotpBody={0} に {1} からの操作で TOTP が更新されました。心当たりがない場合は、管理者に連絡してください。 +eventUpdateTotpBodyHtml=

    {0} に {1} からの操作で TOTP が更新されました。心当たりがない場合は、管理者に連絡してください。

    diff --git a/email/messages/messages_lt.properties b/email/messages/messages_lt.properties new file mode 100644 index 0000000..a1b59ad --- /dev/null +++ b/email/messages/messages_lt.properties @@ -0,0 +1,24 @@ +emailVerificationSubject=El. pa\u0161to patvirtinimas +emailVerificationBody=Paskyra {2} sukurta naudojant \u0161\u012F el. pa\u0161to adres\u0105. Jei tai buvote J\u016Bs, tuomet paspauskite \u017Eemiau esan\u010Di\u0105 nuorod\u0105\n\n{0}\n\n\u0160i nuoroda galioja {1} min.\n\nJei paskyros nek\u016Br\u0117te, tuomet ignuoruokite \u0161\u012F lai\u0161k\u0105. +emailVerificationBodyHtml=

    Paskyra {2} sukurta naudojant \u0161\u012F el. pa\u0161to adres\u0105. Jei tao buvote J\u016Bs, tuomet paspauskite \u017Eemiau esan\u010Di\u0105 nuorod\u0105

    {0}

    \u0160i nuoroda galioja {1} min.

    nJei paskyros nek\u016Br\u0117te, tuomet ignuoruokite \u0161\u012F lai\u0161k\u0105.

    +identityProviderLinkSubject=S\u0105saja {0} +identityProviderLinkBody=Ka\u017Eas pageidauja susieti J\u016Bs\u0173 "{1}" paskyr\u0105 su "{0}" {2} naudotojo paskyr\u0105. Jei tai buvote J\u016Bs, tuomet paspauskite \u017Eemiau esan\u010Di\u0105 nuorod\u0105 nor\u0117dami susieti paskyras\n\n{3}\n\n\u0160i nuoroda galioja {4} min.\n\nJei paskyr\u0173 susieti nenorite, tuomet ignoruokite \u0161\u012F lai\u0161k\u0105. Jei paskyras susiesite, tuomet prie {1} gal\u0117siste prisijungti per {0}. +identityProviderLinkBodyHtml=

    \u017Eas pageidauja susieti J\u016Bs\u0173 {1} paskyr\u0105 su {0} {2} naudotojo paskyr\u0105. Jei tai buvote J\u016Bs, tuomet paspauskite \u017Eemiau esan\u010Di\u0105 nuorod\u0105 nor\u0117dami susieti paskyras

    {3}

    \u0160i nuoroda galioja {4} min.

    Jei paskyr\u0173 susieti nenorite, tuomet ignoruokite \u0161\u012F lai\u0161k\u0105. Jei paskyras susiesite, tuomet prie {1} gal\u0117siste prisijungti per {0}.

    +passwordResetSubject=Slapta\u017Eod\u017Eio atk\u016Brimas +passwordResetBody=Ka\u017Ekas pageidauja pakeisti J\u016Bs\u0173 paskyros {2} slapta\u017Eod\u012F. Jei tai buvote J\u016Bs, tuomet paspauskite \u017Eemiau esan\u010Di\u0105 nuorod\u0105 slapta\u017Eod\u017Eio pakeitimui.\n\n{0}\n\n\u0160i nuoroda ir kodas galioja {1} min.\n\nJei nepageidajate keisti slapta\u017Eod\u017Eio, tuomet ignoruokite \u0161\u012F lai\u0161k\u0105 ir niekas nebus pakeista. +passwordResetBodyHtml=

    Ka\u017Ekas pageidauja pakeisti J\u016Bs\u0173 paskyros {2} slapta\u017Eod\u012F. Jei tai buvote J\u016Bs, tuomet paspauskite \u017Eemiau esan\u010Di\u0105 nuorod\u0105 slapta\u017Eod\u017Eio pakeitimui.

    {0}

    \u0160i nuoroda ir kodas galioja {1} min.

    Jei nepageidajate keisti slapta\u017Eod\u017Eio, tuomet ignoruokite \u0161\u012F lai\u0161k\u0105 ir niekas nebus pakeista.

    +executeActionsSubject=Atnaujinkite savo paskyr\u0105 +executeActionsBody=Sistemos administratorius pageidauja, kad J\u016Bs atnaujintum\u0117te savo {2} paskyr\u0105. Paspauskite \u017Eemiau esan\u010Di\u0105 nuorod\u0105 paskyros duomen\u0173 atnaujinimui.\n\n{0}\n\n\u0160i nuoroda galioja {1} min.\n\nJei J\u016Bs neasate tikri, kad tai administratoriaus pageidavimas, tuomet ignoruokite \u0161\u012F lai\u0161k\u0105 ir niekas nebus pakeista. +executeActionsBodyHtml=

    Sistemos administratorius pageidauja, kad J\u016Bs atnaujintum\u0117te savo {2} paskyr\u0105. Paspauskite \u017Eemiau esan\u010Di\u0105 nuorod\u0105 paskyros duomen\u0173 atnaujinimui.

    {0}

    \u0160i nuoroda galioja {1} min.

    Jei J\u016Bs neasate tikri, kad tai administratoriaus pageidavimas, tuomet ignoruokite \u0161\u012F lai\u0161k\u0105 ir niekas nebus pakeista.

    +eventLoginErrorSubject=Nes\u0117kmingas bandymas prisijungti prie j\u016Bs\u0173 paskyros +eventLoginErrorBody=Bandymas prisijungti prie j\u016Bs\u0173 paskyros {0} i\u0161 {1} nes\u0117kmingas. Jei tai nebuvote j\u016Bs, tuomet susisiekite su administratoriumi +eventLoginErrorBodyHtml=

    Bandymas prisijungti prie j\u016Bs\u0173 paskyros {0} i\u0161 {1} nes\u0117kmingas. Jei tai nebuvote j\u016Bs, tuomet susisiekite su administratoriumi

    +eventRemoveTotpSubject=TOTP pa\u0161alinimas +eventRemoveTotpBody=Ka\u017Ekas pageidauja atsieti TOPT J\u016Bs\u0173 {1} paskyroje su {0}. Jei tai nebuvote J\u016Bs, tuomet susisiekite su administratoriumi +eventRemoveTotpBodyHtml=

    Ka\u017Ekas pageidauja atsieti TOPT J\u016Bs\u0173 {1} paskyroje su {0}. Jei tai nebuvote J\u016Bs, tuomet susisiekite su administratoriumi

    +eventUpdatePasswordSubject=Slapta\u017Eod\u017Eio atnaujinimas +eventUpdatePasswordBody={1} paskyroje {0} pakeisas j\u016Bs\u0173 slapta\u017Eodis. Jei J\u016Bs nekeit\u0117te, tuomet susisiekite su administratoriumi +eventUpdatePasswordBodyHtml=

    {1} paskyroje {0} pakeisas j\u016Bs\u0173 slapta\u017Eodis. Jei J\u016Bs nekeit\u0117te, tuomet susisiekite su administratoriumi

    +eventUpdateTotpSubject=TOTP atnaujinimas +eventUpdateTotpBody=TOTP J\u016Bs\u0173 {1} paskyroje su {0} buvo atnaujintas. Jei tai nebuvote J\u016Bs, tuomet susisiekite su administratoriumi +eventUpdateTotpBodyHtml=

    TOTP J\u016Bs\u0173 {1} paskyroje su {0} buvo atnaujintas. Jei tai nebuvote J\u016Bs, tuomet susisiekite su administratoriumi

    \ No newline at end of file diff --git a/email/messages/messages_nl.properties b/email/messages/messages_nl.properties new file mode 100644 index 0000000..af84d6d --- /dev/null +++ b/email/messages/messages_nl.properties @@ -0,0 +1,27 @@ +emailVerificationSubject=Bevestig e-mailadres +emailVerificationBody=Iemand heeft een {2} account aangemaakt met dit e-mailadres. Als u dit was, klikt u op de onderstaande koppeling om uw e-mailadres te bevestigen \n\n{0}\n\nDeze koppeling zal binnen {1} minuten vervallen.\n\nU kunt dit bericht negeren indien u dit account niet heeft aangemaakt. +emailVerificationBodyHtml=

    Iemand heeft een {2} account aangemaakt met dit e-mailadres. Als u dit was, klikt u op de onderstaande koppeling om uw e-mailadres te bevestigen

    Koppeling naar e-mailadres bevestiging

    Deze koppeling zal binnen {1} minuten vervallen.U kunt dit bericht negeren indien u dit account niet heeft aangemaakt.

    +emailTestSubject=[KEYCLOAK] - SMTP testbericht +emailTestBody=Dit is een testbericht +emailTestBodyHtml=

    Dit is een testbericht

    +identityProviderLinkSubject=Koppel {0} +identityProviderLinkBody=Iemand wil uw "{1}" account koppelen met "{0}" account van gebruiker {2}. Als u dit was, klik dan op de onderstaande link om de accounts te koppelen\n\n{3}\n\nDeze link zal over {4} minuten vervallen.\n\nAls u de accounts niet wilt koppelen, negeer dan dit bericht. Als u accounts koppelt, dan kunt u bij {1} inloggen via {0}. +identityProviderLinkBodyHtml=

    Iemand wil uw "{1}" account koppelen met "{0}" account van gebruiker {2}. Als u dit was, klik dan op de onderstaande link om de accounts te koppelen

    Link om accounts te koppelen

    Deze link zal over {4} minuten vervallen.

    Als u de accounts niet wilt koppelen, negeer dan dit bericht. Als u accounts koppelt, dan kunt u bij {1} inloggen via {0}.

    +passwordResetSubject=Wijzig wachtwoord +passwordResetBody=Iemand verzocht de aanmeldgegevens van uw {2} account te wijzigen. Als u dit was, klik dan op de onderstaande koppeling om ze te wijzigen.\n\n{0}\n\nDe link en de code zullen binnen {1} minuten vervallen.\n\nAls u uw aanmeldgegevens niet wilt wijzigen, negeer dan dit bericht en er zal niets gewijzigd worden. +passwordResetBodyHtml=

    Iemand verzocht de aanmeldgegevens van uw {2} account te wijzigen. Als u dit was, klik dan op de onderstaande koppeling om ze te wijzigen.

    Wijzig aanmeldgegevens

    De link en de code zullen binnen {1} minuten vervallen.

    Als u uw aanmeldgegevens niet wilt wijzigen, negeer dan dit bericht en er zal niets gewijzigd worden.

    +executeActionsSubject=Wijzig uw account +executeActionsBody=Uw beheerder heeft u verzocht uw {2} account te wijzigen. Klik op de onderstaande koppeling om dit proces te starten. \n\n{0}\n\nDeze link zal over {1} minuten vervallen. \n\nAls u niet over dit verzoek op de hoogte was, negeer dan dit bericht om uw account ongewijzigd te laten. +executeActionsBodyHtml=

    Uw beheerder heeft u verzocht uw {2} account te wijzigen. Klik op de onderstaande koppeling om dit proces te starten.

    Link naar account wijziging

    Deze link zal over {1} minuten vervallen.

    Als u niet over dit verzoek op de hoogte was, negeer dan dit bericht om uw account ongewijzigd te laten.

    +eventLoginErrorSubject=Inlogfout +eventLoginErrorBody=Er is een foutieve inlogpoging gedetecteerd op uw account om {0} vanuit {1}. Als u dit niet was, neem dan contact op met de beheerder. +eventLoginErrorBodyHtml=

    Er is een foutieve inlogpoging gedetecteerd op uw account om {0} vanuit {1}. Als u dit niet was, neem dan contact op met de beheerder.

    +eventRemoveTotpSubject=TOTP verwijderd +eventRemoveTotpBody=TOTP is verwijderd van uw account om {0} vanuit {1}. Als u dit niet was, neem dan contact op met uw beheerder. +eventRemoveTotpBodyHtml=

    TOTP is verwijderd van uw account om {0} vanuit {1}. Als u dit niet was, neem dan contact op met uw beheerder.

    +eventUpdatePasswordSubject=Wachtwoord gewijzigd +eventUpdatePasswordBody=Uw wachtwoord is gewijzigd om {0} door {1}. Als u dit niet was, neem dan contact op met uw beheerder. +eventUpdatePasswordBodyHtml=

    Uw wachtwoord is gewijzigd om {0} door {1}. Als u dit niet was, neem dan contact op met uw beheerder.

    +eventUpdateTotpSubject=TOTP gewijzigd +eventUpdateTotpBody=TOTP is gewijzigd voor uw account om {0} door {1}. Als u dit niet was, neem dan contact op met uw beheerder. +eventUpdateTotpBodyHtml=

    TOTP is gewijzigd voor uw account om {0} door {1}. Als u dit niet was, neem dan contact op met uw beheerder.

    diff --git a/email/messages/messages_no.properties b/email/messages/messages_no.properties new file mode 100644 index 0000000..32334e9 --- /dev/null +++ b/email/messages/messages_no.properties @@ -0,0 +1,24 @@ +emailVerificationSubject=Bekreft e-postadresse +emailVerificationBody=Noen har opprettet en {2} konto med denne e-postadressen. Hvis dette var deg, klikk p\u00E5 lenken nedenfor for \u00E5 bekrefte e-postadressen din\n\n{0}\n\nDenne lenken vil utl\u00F8pe om {1} minutter.\n\nHvis du ikke opprettet denne kontoen, vennligst ignorer denne meldingen. +emailVerificationBodyHtml=

    Noen har opprettet en {2} konto med denne e-postadressen. Hvis dette var deg, klikk p\u00E5 lenken nedenfor for \u00E5 bekrefte e-postadressen din

    {0}

    Denne lenken vil utl\u00F8pe om {1} minutter.

    Hvis du ikke opprettet denne kontoen, vennligst ignorer denne meldingen.

    +identityProviderLinkSubject=Lenke {0} +identityProviderLinkBody=Noen vil koble din {1} konto med {0} konto til bruker {2}. Hvis dette var deg, klikk p\u00E5 lenken nedenfor for \u00E5 koble kontoene\n\n{3}\n\nDenne lenken vil utl\u00F8pe om {4} minutter\n\nHvis du ikke vil koble kontoene, vennligst ignorer denne meldingen. Hvis du kobler kontoene sammen vil du kunne logge inn til {1} gjennom {0}. +identityProviderLinkBodyHtml=

    Noen vil koble din {1} konto med {0} konto til bruker {2}. Hvis dette var deg, klikk p\u00E5 lenken nedenfor for \u00E5 koble kontoene.

    {3}

    Denne lenken vil utl\u00F8pe om {4} minutter.

    Hvis du ikke vil koble kontoene, vennligst ignorer denne meldingen. Hvis du kobler kontoene sammen vil du kunne logge inn til {1} gjennom {0}.

    +passwordResetSubject=Tilbakestill passord +passwordResetBody=Noen har bedt om \u00E5 endre innloggingsdetaljene til din konto {2}. Hvis dette var deg, klikk p\u00E5 lenken nedenfor for \u00E5 tilbakestille dem.\n\n{0}\n\nDenne lenken vil utl\u00F8pe om {1} minutter.\n\nHvis du ikke vil tilbakestille din innloggingsdata, vennligst ignorer denne meldingen og ingenting vil bli endret. +passwordResetBodyHtml=

    Noen har bedt om \u00E5 endre innloggingsdetaljene til din konto {2}. Hvis dette var deg, klikk p\u00E5 lenken nedenfor for \u00E5 tilbakestille dem.

    {0}

    Denne lenken vil utl\u00F8pe om {1} minutter.

    Hvis du ikke vil tilbakestille din innloggingsdata, vennligst ignorer denne meldingen og ingenting vil bli endret.

    +executeActionsSubject=Oppdater kontoen din +executeActionsBody=Administrator har anmodet at du oppdaterer din {2} konto. Klikk p\u00E5 lenken nedenfor for \u00E5 starte denne prosessen\n\n{0}\n\nDenne lenken vil utl\u00F8pe om {1} minutter.\n\nHvis du ikke var klar over at administrator har bedt om dette, vennligst ignorer denne meldingen og ingenting vil bli endret. +executeActionsBodyHtml=

    Administrator har anmodet at du oppdaterer din {2} konto. Klikk p\u00E5 linken nedenfor for \u00E5 starte denne prosessen.

    {0}

    Denne lenken vil utl\u00F8pe om {1} minutter.

    Hvis du ikke var klar over at administrator har bedt om dette, ignorer denne meldingen og ingenting vil bli endret.

    +eventLoginErrorSubject=Innlogging feilet +eventLoginErrorBody=Et mislykket innloggingsfors\u00F8k ble oppdaget p\u00E5 din konto p\u00E5 {0} fra {1}. Hvis dette ikke var deg, vennligst kontakt administrator. +eventLoginErrorBodyHtml=

    Et mislykket innloggingsfors\u00F8k ble oppdaget p\u00E5 din konto p\u00E5 {0} fra {1}. Hvis dette ikke var deg, vennligst kontakt administrator.

    +eventRemoveTotpSubject=Fjern engangskode +eventRemoveTotpBody=Engangskode ble fjernet fra kontoen din p\u00E5 {0} fra {1}. Hvis dette ikke var deg, vennligst kontakt administrator. +eventRemoveTotpBodyHtml=

    Engangskode ble fjernet fra kontoen din p\u00E5 {0} fra {1}. Hvis dette ikke var deg, vennligst kontakt administrator.

    +eventUpdatePasswordSubject=Oppdater passord +eventUpdatePasswordBody=Ditt passord ble endret i {0} fra {1}. Hvis dette ikke var deg, vennligst kontakt administrator. +eventUpdatePasswordBodyHtml=

    Ditt passord ble endret i {0} fra {1}. Hvis dette ikke var deg, vennligst kontakt administrator.

    +eventUpdateTotpSubject=Oppdater engangskode +eventUpdateTotpBody=Engangskode ble oppdatert for kontoen din p\u00E5 {0} fra {1}. Hvis dette ikke var deg, vennligst kontakt administrator. +eventUpdateTotpBodyHtml=

    Engangskode ble oppdatert for kontoen din p\u00E5 {0} fra {1}. Hvis dette ikke var deg, vennligst kontakt administrator.

    diff --git a/email/messages/messages_pt_BR.properties b/email/messages/messages_pt_BR.properties new file mode 100644 index 0000000..cfe9737 --- /dev/null +++ b/email/messages/messages_pt_BR.properties @@ -0,0 +1,19 @@ +emailVerificationSubject=Verifica\u00E7\u00E3o de e-mail +emailVerificationBody=Algu\u00E9m criou uma conta {2} com este endere\u00E7o de e-mail. Se foi voc\u00EA, clique no link abaixo para verificar o seu endere\u00E7o de email\n\n{0}\n\nEste link ir\u00E1 expirar dentro de {1} minutos.\n\nSe n\u00E3o foi voc\u00EA que criou esta conta, basta ignorar esta mensagem. +emailVerificationBodyHtml=

    Algu\u00E9m criou uma conta {2} com este endere\u00E7o de e-mail. Se foi voc\u00EA, clique no link abaixo para verificar o seu endere\u00E7o de email

    {0}

    Este link ir\u00E1 expirar dentro de {1} minutos.

    Se n\u00E3o foi voc\u00EA que criou esta conta, basta ignorar esta mensagem.

    +identityProviderLinkSubject=Vincular {0} +identityProviderLinkBody=Algu\u00E9m quer vincular sua conta "{1}" com a conta "{0}" do usu\u00E1rio {2} . Se foi voc\u00EA, clique no link abaixo para vincular as contas.\n\n{3}\n\nEste link ir\u00E1 expirar em {4} minutos.\n\nSe voc\u00EA n\u00E3o quer vincular a conta, apenas ignore esta mensagem. Se voc\u00EA vincular as contas, voc\u00EA ser\u00E1 capaz de logar em {1} atr\u00E1v\u00E9s de {0}. +identityProviderLinkBodyHtml=

    Algu\u00E9m quer vincular sua conta {1} com a conta {0} do usu\u00E1rio {2} . Se foi voc\u00EA, clique no link abaixo para vincular as contas.

    {3}

    Este link ir\u00E1 expirar em {4} minutos.

    Se voc\u00EA n\u00E3o quer vincular a conta, apenas ignore esta mensagem. Se voc\u00EA vincular as contas, voc\u00EA ser\u00E1 capaz de logar em {1} atr\u00E1v\u00E9s de {0}.

    +passwordResetSubject=Redefini\u00E7\u00E3o de senha +eventLoginErrorSubject=Erro de login +eventLoginErrorBody=Uma tentativa de login mal sucedida para a sua conta foi detectada em {0} de {1}. Se n\u00E3o foi voc\u00EA, por favor, entre em contato com um administrador. +eventLoginErrorBodyHtml=

    Uma tentativa de login mal sucedida para a sua conta foi detectada em {0} de {1}. Se n\u00E3o foi voc\u00EA, por favor, entre em contato com um administrador.

    +eventRemoveTotpSubject=Remover TOTP +eventRemoveTotpBody=TOTP foi removido da sua conta em {0} de {1}. Se n\u00E3o foi voc\u00EA, por favor, entre em contato com um administrador. +eventRemoveTotpBodyHtml=

    TOTP foi removido da sua conta em {0} de {1}. Se n\u00E3o foi voc\u00EA, por favor, entre em contato com um administrador.

    +eventUpdatePasswordSubject=Atualiza\u00E7\u00E3o de senha +eventUpdatePasswordBody=Sua senha foi alterada em {0} de {1}. Se n\u00E3o foi voc\u00EA, por favor, entre em contato com um administrador. +eventUpdatePasswordBodyHtml=

    Sua senha foi alterada em {0} de {1}. Se n\u00E3o foi voc\u00EA, por favor, entre em contato com um administrador.

    +eventUpdateTotpSubject=Atualiza\u00E7\u00E3o TOTP +eventUpdateTotpBody=TOTP foi atualizado para a sua conta em {0} de {1}. Se n\u00E3o foi voc\u00EA, por favor, entre em contato com um administrador. +eventUpdateTotpBodyHtml=

    TOTP foi atualizado para a sua conta em {0} de {1}. Se n\u00E3o foi voc\u00EA, por favor, entre em contato com um administrador.

    \ No newline at end of file diff --git a/email/messages/messages_ru.properties b/email/messages/messages_ru.properties new file mode 100644 index 0000000..1355788 --- /dev/null +++ b/email/messages/messages_ru.properties @@ -0,0 +1,25 @@ +# encoding: utf-8 +emailVerificationSubject=Подтверждение E-mail +emailVerificationBody=Кто-то создал учетную запись {2} с этим E-mail. Если это были Вы, нажмите на следующую ссылку для подтверждения вашего email\n\n{0}\n\nЭта ссылка устареет через {1} минут.\n\nЕсли Вы не создавали учетную запись, просто проигнорируйте это письмо. +emailVerificationBodyHtml=

    Кто-то создал учетную запись {2} с этим E-mail. Если это были Вы, нажмите по ссылке для подтверждения вашего E-mail

    {0}

    Эта ссылка устареет через {1} минут.

    Если Вы не создавали учетную запись, просто проигнорируйте это письмо.

    +identityProviderLinkSubject=Ссылка {0} +identityProviderLinkBody=Кто-то хочет связать вашу учетную запись "{1}" с "{0}" учетной записью пользователя {2} . Если это были Вы, нажмите по следующей ссылке, чтобы связать учетные записи\n\n{3}\n\nЭта ссылка устареет через {4} минут.\n\nЕсли это не хотите объединять учетные записи, просто проигнориуйте это письмо. После объединения учетных записей Вы можете войти в {1} через {0}. +identityProviderLinkBodyHtml=

    Кто-то хочет связать вашу учетную запись {1} с {0} учетной записью пользователя {2} . Если это были Вы, нажмите по следующей ссылке, чтобы связать учетные записи

    {3}

    Эта ссылка устареет через {4} минут.

    Если это не хотите объединять учетные записи, просто проигнориуйте это письмо. После объединения учетных записей Вы можете войти в {1} через {0}.

    +passwordResetSubject=Сброс пароля +passwordResetBody=Кто-то только что запросил изменение пароля от Вашей учетной записи {2}. Если это были Вы, нажмите на следующую ссылку, чтобы сбросить его.\n\n{0}\n\nЭта ссылка устареет через {1} минут.\n\nЕсли Вы не хотите сбрасывать пароль, просто проигнорируйте это письмо. +passwordResetBodyHtml=

    Кто-то только что запросил изменение пароля от Вашей учетной записи {2}. Если это были Вы, нажмите на следующую ссылку, чтобы сбросить его.

    {0}

    Эта ссылка устареет через {1} минут.

    Если Вы не хотите сбрасывать пароль, просто проигнорируйте это письмо и ничего не изменится.

    +executeActionsSubject=Обновление Вашей учетной записи +executeActionsBody=Администратор просит Вас обновить данные Вашей учетной записи {2}. Нажмите по следующей ссылке чтобы начать этот процесс.\n\n{0}\n\nЭта ссылка устареет через {1} минут.\n\nЕсли у вас есть подозрения, что администратор не мог сделать такой запрос, просто проигнорируйте это письмо. +executeActionsBodyHtml=

    Администратор просит Вас обновить данные Вашей учетной записи {2}. Нажмите по следующей ссылке чтобы начать этот процесс.

    {0}

    Эта ссылка устареет через {1} минут.

    Если у вас есть подозрения, что администратор не мог сделать такой запрос, просто проигнорируйте это письмо.

    +eventLoginErrorSubject=Ошибка входа +eventLoginErrorBody=Была зафиксирована неудачная попытка входа в Вашу учетную запись {0} с {1}. Если это были не Вы, пожалуйста, свяжитесь с администратором. +eventLoginErrorBodyHtml=

    Была зафиксирована неудачная попытка входа в Вашу учетную запись {0} с {1}. Если это были не Вы, пожалуйста, свяжитесь с администратором.

    +eventRemoveTotpSubject=Удалить TOTP +eventRemoveTotpBody=TOTP был удален из вашей учетной записи {0} c {1}. Если это были не Вы, пожалуйста, свяжитесь с администратором. +eventRemoveTotpBodyHtml=

    TOTP был удален из вашей учетной записи {0} c {1}. Если это были не Вы, пожалуйста, свяжитесь с администратором.

    +eventUpdatePasswordSubject=Обновление пароля +eventUpdatePasswordBody=Ваш пароль был изменен в {0} с {1}. Если это были не Вы, пожалуйста, свяжитесь с администратором. +eventUpdatePasswordBodyHtml=

    Ваш пароль был изменен в {0} с {1}. Если это были не Вы, пожалуйста, свяжитесь с администратором.

    +eventUpdateTotpSubject=Обновление TOTP +eventUpdateTotpBody=TOTP был обновлен в вашей учетной записи {0} с {1}. Если это были не Вы, пожалуйста, свяжитесь с администратором. +eventUpdateTotpBodyHtml=

    TOTP был обновлен в вашей учетной записи {0} с {1}. Если это были не Вы, пожалуйста, свяжитесь с администратором.

    diff --git a/email/messages/messages_sv.properties b/email/messages/messages_sv.properties new file mode 100644 index 0000000..a5ffbf4 --- /dev/null +++ b/email/messages/messages_sv.properties @@ -0,0 +1,25 @@ +# encoding: utf-8 +emailVerificationSubject=Verifiera e-post +emailVerificationBody=Någon har skapat ett {2} konto med den här e-postadressen. Om det var du, klicka då på länken nedan för att verifiera din e-postadress\n\n{0}\n\nDen här länken kommer att upphöra inom {1} minuter.\n\nOm det inte var du som skapade det här kontot, ignorera i så fall det här meddelandet. +emailVerificationBodyHtml=

    Någon har skapat ett {2} konto med den här e-postadressen. Om det var du, klicka då på länken nedan för att verifiera din e-postadress

    {0}

    Den här länken kommer att upphöra inom {1} minuter.

    Om det inte var du som skapade det här kontot, ignorera i så fall det här meddelandet.

    +identityProviderLinkSubject=Länk {0} +identityProviderLinkBody=Någon vill länka ditt "{1}" konto med "{0}" kontot tillhörande användaren {2} . Om det var du, klicka då på länken nedan för att länka kontona\n\n{3}\n\nDen här länken kommer att upphöra inom {4} minuter.\n\nOm du inte vill länka kontot, ignorera i så fall det här meddelandet. Om du länkar kontona, så kan du logga in till {1} genom {0}. +identityProviderLinkBodyHtml=

    Någon vill länka ditt {1} konto med {0} kontot tillhörande användaren {2} . Om det var du, klicka då på länken nedan för att länka kontona

    {3}

    Den här länken kommer att upphöra inom {4} minuter.

    Om du inte vill länka kontot, ignorera i så fall det här meddelandet. Om du länkar kontona, så kan du logga in till {1} genom {0}.

    +passwordResetSubject=Återställ lösenord +passwordResetBody=Någon har precis bett om att ändra användaruppgifter för ditt konto {2}. Om det var du, klicka då på länken nedan för att återställa dem.\n\n{0}\n\nDen här länken och koden kommer att upphöra inom {1} minuter.\n\nOm du inte vill återställa dina kontouppgifter, ignorera i så fall det här meddelandet så kommer inget att ändras. +passwordResetBodyHtml=

    Någon har precis bett om att ändra användaruppgifter för ditt konto {2}. Om det var du, klicka då på länken nedan för att återställa dem.

    {0}

    Den här länken och koden kommer att upphöra inom {1} minuter.

    Om du inte vill återställa dina kontouppgifter, ignorera i så fall det här meddelandet så kommer inget att ändras.

    +executeActionsSubject=Uppdatera ditt konto +executeActionsBody=Din administratör har precis bett om att du skall uppdatera ditt {2} konto. Klicka på länken för att påbörja processen.\n\n{0}\n\nDen här länken kommer att upphöra inom {1} minuter.\n\nOm du är omedveten om att din administratör har bett om detta, ignorera i så fall det här meddelandet så kommer inget att ändras. +executeActionsBodyHtml=

    Din administratör har precis bett om att du skall uppdatera ditt {2} konto. Klicka på länken för att påbörja processen.

    {0}

    Den här länken kommer att upphöra inom {1} minuter.

    Om du är omedveten om att din administratör har bett om detta, ignorera i så fall det här meddelandet så kommer inget att ändras.

    +eventLoginErrorSubject=Inloggningsfel +eventLoginErrorBody=Ett misslyckat inloggningsförsök har upptäckts på ditt konto på {0} från {1}. Om det inte var du, vänligen kontakta i så fall en administratör. +eventLoginErrorBodyHtml=

    Ett misslyckat inloggningsförsök har upptäckts på ditt konto den {0} från {1}. Om det inte var du, vänligen kontakta i så fall en administratör.

    +eventRemoveTotpSubject=Ta bort TOTP +eventRemoveTotpBody=TOTP togs bort från ditt konto den {0} från {1}. Om det inte var du, vänligen kontakta i så fall en administratör. +eventRemoveTotpBodyHtml=

    TOTP togs bort från ditt konto den {0} från {1}. Om det inte var du, vänligen kontakta i så fall en administratör.

    +eventUpdatePasswordSubject=Uppdatera lösenord +eventUpdatePasswordBody=Ditt lösenord ändrades den {0} från {1}. Om det inte var du, vänligen kontakta i så fall en administratör. +eventUpdatePasswordBodyHtml=

    Ditt lösenord ändrades den {0} från {1}. Om det inte var du, vänligen kontakta i så fall en administratör.

    +eventUpdateTotpSubject=Uppdatera TOTP +eventUpdateTotpBody=TOTP uppdaterades för ditt konto den {0} från {1}. Om det inte var du, vänligen kontakta i så fall en administratör. +eventUpdateTotpBodyHtml=

    TOTP uppdaterades för ditt konto den {0} från {1}. Om det inte var du, vänligen kontakta i så fall en administratör.

    \ No newline at end of file diff --git a/email/messages/messages_zh_CN.properties b/email/messages/messages_zh_CN.properties new file mode 100644 index 0000000..b7b0e50 --- /dev/null +++ b/email/messages/messages_zh_CN.properties @@ -0,0 +1,25 @@ +# encoding: utf-8 +emailVerificationSubject=验证电子邮件 +emailVerificationBody=用户使用当前电子邮件注册 {2} 账户。如是本人操作,请点击以下链接完成邮箱验证\n\n{0}\n\n这个链接会在 {1} 分钟后过期.\n\n如果您没有注册用户,请忽略这条消息。 +emailVerificationBodyHtml=

    用户使用当前电子邮件注册 {2} 账户。如是本人操作,请点击以下链接完成邮箱验证

    {0}

    这个链接会在 {1} 分钟后过期.

    如果您没有注册用户,请忽略这条消息。

    +identityProviderLinkSubject=链接 {0} +identityProviderLinkBody=有用户想要将账户 "{1}" 与用户{2}的账户"{0}" 做链接 . 如果是本人操作,请点击以下链接完成链接请求\n\n{3}\n\n这个链接会在 {4} 分钟后过期.\n\n如非本人操作,请忽略这条消息。如果您链接账户,您将可以通过{0}登录账户 {1}. +identityProviderLinkBodyHtml=

    有用户想要将账户 {1} 与用户{2} 的账户{0} 做链接 . 如果是本人操作,请点击以下链接完成链接请求

    {3}

    这个链接会在 {4} 分钟后过期。

    如非本人操作,请忽略这条消息。如果您链接账户,您将可以通过{0}登录账户 {1}.

    +passwordResetSubject=重置密码 +passwordResetBody=有用户要求修改账户 {2} 的密码.如是本人操作,请点击下面链接进行重置.\n\n{0}\n\n这个链接会在 {1} 分钟后过期.\n\n如果您不想重置您的密码,请忽略这条消息,密码不会改变。 +passwordResetBodyHtml=

    有用户要求修改账户 {2} 的密码如是本人操作,请点击下面链接进行重置.

    {0}

    这个链接会在 {1} 分钟后过期

    如果您不想重置您的密码,请忽略这条消息,密码不会改变。

    +executeActionsSubject=更新您的账户 +executeActionsBody=您的管理员要求您更新账户 {2}. 点击以下链接开始更新\n\n{0}\n\n这个链接会在 {1} 分钟后失效.\n\n如果您不知道管理员要求更新账户信息,请忽略这条消息。账户信息不会修改。 +executeActionsBodyHtml=

    您的管理员要求您更新账户{2}. 点击以下链接开始更新.

    {0}

    这个链接会在 {1} 分钟后失效.

    如果您不知道管理员要求更新账户信息,请忽略这条消息。账户信息不会修改。

    +eventLoginErrorSubject=登录错误 +eventLoginErrorBody=在{0} 由 {1}使用您的账户登录失败. 如果这不是您本人操作,请联系管理员. +eventLoginErrorBodyHtml=

    在{0} 由 {1}使用您的账户登录失败. 如果这不是您本人操作,请联系管理员.

    +eventRemoveTotpSubject=删除 TOTP +eventRemoveTotpBody=TOTP在 {0} 由{1} 从您的账户中删除.如果这不是您本人操作,请联系管理员 +eventRemoveTotpBodyHtml=

    TOTP在 {0} 由{1} 从您的账户中删除.如果这不是您本人操作,请联系管理员。

    +eventUpdatePasswordSubject=更新密码 +eventUpdatePasswordBody=您的密码在{0} 由 {1}更改. 如非本人操作,请联系管理员 +eventUpdatePasswordBodyHtml=

    您的密码在{0} 由 {1}更改. 如非本人操作,请联系管理员

    +eventUpdateTotpSubject=更新 TOTP +eventUpdateTotpBody=您账户的TOTP 配置在{0} 由 {1}更改. 如非本人操作,请联系管理员。 +eventUpdateTotpBodyHtml=

    您账户的TOTP 配置在{0} 由 {1}更改. 如非本人操作,请联系管理员。

    diff --git a/email/text/email-test.ftl b/email/text/email-test.ftl new file mode 100644 index 0000000..19942c7 --- /dev/null +++ b/email/text/email-test.ftl @@ -0,0 +1 @@ +${msg("emailTestBody", realmName)} \ No newline at end of file diff --git a/email/text/email-verification.ftl b/email/text/email-verification.ftl new file mode 100644 index 0000000..0ae601f --- /dev/null +++ b/email/text/email-verification.ftl @@ -0,0 +1 @@ +${msg("emailVerificationBody",link, linkExpiration, realmName)} \ No newline at end of file diff --git a/email/text/event-login_error.ftl b/email/text/event-login_error.ftl new file mode 100644 index 0000000..7835c91 --- /dev/null +++ b/email/text/event-login_error.ftl @@ -0,0 +1 @@ +${msg("eventLoginErrorBody",event.date,event.ipAddress)} \ No newline at end of file diff --git a/email/text/event-remove_totp.ftl b/email/text/event-remove_totp.ftl new file mode 100644 index 0000000..8930b64 --- /dev/null +++ b/email/text/event-remove_totp.ftl @@ -0,0 +1 @@ +${msg("eventRemoveTotpBody",event.date, event.ipAddress)} \ No newline at end of file diff --git a/email/text/event-update_password.ftl b/email/text/event-update_password.ftl new file mode 100644 index 0000000..754daac --- /dev/null +++ b/email/text/event-update_password.ftl @@ -0,0 +1 @@ +${msg("eventUpdatePasswordBody",event.date, event.ipAddress)} \ No newline at end of file diff --git a/email/text/event-update_totp.ftl b/email/text/event-update_totp.ftl new file mode 100644 index 0000000..3a7b0f7 --- /dev/null +++ b/email/text/event-update_totp.ftl @@ -0,0 +1 @@ +${msg("eventUpdateTotpBody",event.date, event.ipAddress)} \ No newline at end of file diff --git a/email/text/executeActions.ftl b/email/text/executeActions.ftl new file mode 100644 index 0000000..39ce047 --- /dev/null +++ b/email/text/executeActions.ftl @@ -0,0 +1,4 @@ +<#assign requiredActionsText> +<#if requiredActions??><#list requiredActions><#items as reqActionItem>${msg("requiredAction.${reqActionItem}")}<#sep>, <#else> + +${msg("executeActionsBody",link, linkExpiration, realmName, requiredActionsText)} \ No newline at end of file diff --git a/email/text/identity-provider-link.ftl b/email/text/identity-provider-link.ftl new file mode 100644 index 0000000..a8c0d54 --- /dev/null +++ b/email/text/identity-provider-link.ftl @@ -0,0 +1 @@ +${msg("identityProviderLinkBody", identityProviderAlias, realmName, identityProviderContext.username, link, linkExpiration)} \ No newline at end of file diff --git a/email/text/password-reset.ftl b/email/text/password-reset.ftl new file mode 100644 index 0000000..aba4fd1 --- /dev/null +++ b/email/text/password-reset.ftl @@ -0,0 +1 @@ +${msg("passwordResetBody",link, linkExpiration, realmName)} \ No newline at end of file diff --git a/email/theme.properties b/email/theme.properties new file mode 100644 index 0000000..3685c92 --- /dev/null +++ b/email/theme.properties @@ -0,0 +1 @@ +locales=ca,de,en,es,fr,it,ja,lt,nl,no,pt-BR,ru,sv,zh-CN \ No newline at end of file diff --git a/login/code.ftl b/login/code.ftl new file mode 100644 index 0000000..974bc4b --- /dev/null +++ b/login/code.ftl @@ -0,0 +1,21 @@ +<#import "template.ftl" as layout> +<@layout.registrationLayout; section> + <#if section = "title"> + <#if code.success> + ${msg("codeSuccessTitle")} + <#else> + ${msg("codeErrorTitle", code.error)} + + <#elseif section = "form"> +
    +
    + <#if code.success> +

    ${msg("copyCodeInstruction")}

    + + <#else> +

    ${code.error}

    + +
    +
    + + diff --git a/login/error.ftl b/login/error.ftl new file mode 100644 index 0000000..c0d0f60 --- /dev/null +++ b/login/error.ftl @@ -0,0 +1,15 @@ +<#import "template.ftl" as layout> +<@layout.registrationLayout displayMessage=false; section> + <#if section = "title"> + ${msg("errorTitle")} + <#elseif section = "header"> + ${msg("errorTitleHtml")?no_esc} + <#elseif section = "form"> +
    + <#if client?? && client.baseUrl?has_content> +
    +

    ${msg("backToApplication")?no_esc}

    + +
    + + diff --git a/login/info.ftl b/login/info.ftl new file mode 100644 index 0000000..c8ee6d3 --- /dev/null +++ b/login/info.ftl @@ -0,0 +1,25 @@ +<#import "template.ftl" as layout> +<@layout.registrationLayout displayMessage=false; section> + <#if section = "title"> + ${msg("operationInfo")?no_esc} + <#elseif section = "header"> + ${msg("operationInfo")?no_esc} + <#elseif section = "form"> +
    +
    +
    +

    ${message.summary}<#if requiredActions??><#list requiredActions>: <#items as reqActionItem>${msg("requiredAction.${reqActionItem}")}<#sep>, <#else>

    + <#if skipLink??> + <#else> + <#if pageRedirectUri??> +

    ${msg("backToApplication")?no_esc}

    + <#elseif actionUri??> +

    ${msg("proceedWithAction")?no_esc}

    + <#elseif client.baseUrl??> +

    ${msg("backToApplication")?no_esc}

    + + +
    +
    + + diff --git a/login/login-config-totp.ftl b/login/login-config-totp.ftl new file mode 100644 index 0000000..f3acdb2 --- /dev/null +++ b/login/login-config-totp.ftl @@ -0,0 +1,29 @@ +<#import "template.ftl" as layout> +<@layout.registrationLayout displayInfo=true; section> + <#if section = "title"> + ${msg("loginTotpTitle")} + <#elseif section = "header"> + ${msg("loginTotpTitle")} + <#elseif section = "form"> +
    +
      +
    1. ${msg("loginTotpStep1")?no_esc}

    2. +
    3. ${msg("loginTotpStep2")}

      + Figure: Barcode
      + ${totp.totpSecretEncoded} +
    4. +
    5. ${msg("loginTotpStep3")}

    6. +
    +
    +
    +
    + +
    + +
    + + +
    +
    + + diff --git a/login/login-idp-link-confirm.ftl b/login/login-idp-link-confirm.ftl new file mode 100644 index 0000000..4baaee4 --- /dev/null +++ b/login/login-idp-link-confirm.ftl @@ -0,0 +1,18 @@ +<#import "template.ftl" as layout> +<@layout.registrationLayout; section> + <#if section = "title"> + ${msg("confirmLinkIdpTitle")} + <#elseif section = "header"> + ${msg("confirmLinkIdpTitle")} + <#elseif section = "form"> +
    +
    + ${msg("federatedIdentityConfirmLinkMessage")} +
    +
    + + +
    +
    + + diff --git a/login/login-idp-link-email.ftl b/login/login-idp-link-email.ftl new file mode 100644 index 0000000..5be21eb --- /dev/null +++ b/login/login-idp-link-email.ftl @@ -0,0 +1,21 @@ +<#import "template.ftl" as layout> +<@layout.registrationLayout; section> + <#if section = "title"> + ${msg("emailLinkIdpTitle", idpAlias)} + <#elseif section = "header"> + ${msg("emailLinkIdpTitle", idpAlias)} + <#elseif section = "form"> +
    +
    +

    + ${msg("emailLinkIdp1", idpAlias, brokerContext.username, realm.displayName)} +

    +

    + ${msg("emailLinkIdp2")} ${msg("doClickHere")} ${msg("emailLinkIdp3")} +

    +

    + ${msg("emailLinkIdp4")} ${msg("doClickHere")} ${msg("emailLinkIdp5")} +

    +
    + + diff --git a/login/login-oauth-grant.ftl b/login/login-oauth-grant.ftl new file mode 100644 index 0000000..492ec7b --- /dev/null +++ b/login/login-oauth-grant.ftl @@ -0,0 +1,67 @@ +<#import "template.ftl" as layout> +<@layout.registrationLayout bodyClass="oauth"; section> + <#if section = "title"> + ${msg("oauthGrantTitle")} + <#elseif section = "header"> + ${msg("oauthGrantTitleHtml",(realm.displayNameHtml!''))?no_esc} <#if client.name??>${advancedMsg(client.name)}<#else>${client.clientId}. + <#elseif section = "form"> +
    +
    +

    ${msg("oauthGrantRequest")}

    +
      + <#if oauth.claimsRequested??> +
    • + + ${msg("personalInfo")}  + <#list oauth.claimsRequested as claim> + ${advancedMsg(claim)}<#if claim_has_next>,  + + +
    • + + <#if oauth.accessRequestMessage??> +
    • + + ${oauth.accessRequestMessage} + +
    • + + <#if oauth.realmRolesRequested??> + <#list oauth.realmRolesRequested as role> +
    • + <#if role.description??>${advancedMsg(role.description)}<#else>${advancedMsg(role.name)} +
    • + + + <#if oauth.resourceRolesRequested??> + <#list oauth.resourceRolesRequested?keys as resource> + <#list oauth.resourceRolesRequested[resource] as clientRole> +
    • + <#if clientRole.roleDescription??>${advancedMsg(clientRole.roleDescription)}<#else>${advancedMsg(clientRole.roleName)} + ${msg("inResource")} <#if clientRole.clientName??>${advancedMsg(clientRole.clientName)}<#else>${clientRole.clientId} +
    • + + + +
    + +
    + +
    +
    +
    +
    +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    + + diff --git a/login/login-page-expired.ftl b/login/login-page-expired.ftl new file mode 100644 index 0000000..59439ad --- /dev/null +++ b/login/login-page-expired.ftl @@ -0,0 +1,16 @@ +<#import "template.ftl" as layout> +<@layout.registrationLayout; section> + <#if section = "title"> + ${msg("pageExpiredTitle")} + <#elseif section = "header"> + ${msg("pageExpiredTitle")} + <#elseif section = "form"> +
    +
    +

    + ${msg("pageExpiredMsg1")} ${msg("doClickHere")} . + ${msg("pageExpiredMsg2")} ${msg("doClickHere")} . +

    +
    + + diff --git a/login/login-reset-password.ftl b/login/login-reset-password.ftl new file mode 100644 index 0000000..3ee17ad --- /dev/null +++ b/login/login-reset-password.ftl @@ -0,0 +1,30 @@ +<#import "template.ftl" as layout> +<@layout.registrationLayout displayInfo=true; section> + <#if section = "title"> + ${msg("emailForgotTitle")} + <#elseif section = "header"> + ${msg("emailForgotTitle")} + <#elseif section = "form"> +
    +
    +
    +
    + +
    +
    + +
    +
    + + +
    +
    +
    + ${msg("emailInstruction")} +
    + + diff --git a/login/login-totp.ftl b/login/login-totp.ftl new file mode 100644 index 0000000..9499121 --- /dev/null +++ b/login/login-totp.ftl @@ -0,0 +1,27 @@ +<#import "template.ftl" as layout> +<@layout.registrationLayout; section> + <#if section = "title"> + ${msg("loginTitle",realm.displayName)} + <#elseif section = "header"> + ${msg("loginTitleHtml",realm.displayNameHtml)?no_esc} + <#elseif section = "form"> +
    +
    +
    + + +
    +
    + + +
    +
    +
    +
    + Zadejte ověřovací TOTP kód z aplikace. +
    + + diff --git a/login/login-update-password.ftl b/login/login-update-password.ftl new file mode 100644 index 0000000..129fc9c --- /dev/null +++ b/login/login-update-password.ftl @@ -0,0 +1,53 @@ +<#import "template.ftl" as layout> +<@layout.registrationLayout displayInfo=true; section> + <#if section = "title"> + ${msg("updatePasswordTitle")} + <#elseif section = "header"> + ${msg("updatePasswordTitle")} + <#elseif section = "form"> +
    +
    + + + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    +
    +
    + +
    + +
    +
    +
    +
    +
    + Heslo musí splňovat následující podmínky: +
      +
    • minimální délka 8 znaků
    • +
    • obsahuje alespoň 1 malé písmeno
    • +
    • obsahuje alespoň 1 velké písmeno
    • +
    • obsahuje alespoň 1 číslici
    • +
    +
    + + diff --git a/login/login-update-profile.ftl b/login/login-update-profile.ftl new file mode 100644 index 0000000..7f3bfc3 --- /dev/null +++ b/login/login-update-profile.ftl @@ -0,0 +1,60 @@ +<#import "template.ftl" as layout> +<@layout.registrationLayout; section> + <#if section = "title"> + ${msg("loginProfileTitle")} + <#elseif section = "header"> + ${msg("loginProfileTitle")} + <#elseif section = "form"> +
    +
    + <#if user.editUsernameAllowed> +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    +
    +
    + +
    + +
    +
    +
    +
    + + diff --git a/login/login-verify-email.ftl b/login/login-verify-email.ftl new file mode 100644 index 0000000..e607fd6 --- /dev/null +++ b/login/login-verify-email.ftl @@ -0,0 +1,18 @@ +<#import "template.ftl" as layout> +<@layout.registrationLayout; section> + <#if section = "title"> + ${msg("emailVerifyTitle")} + <#elseif section = "header"> + ${msg("emailVerifyTitle")} + <#elseif section = "form"> +
    +
    +

    + ${msg("emailVerifyInstruction1")} +

    +

    + ${msg("emailVerifyInstruction2")} ${msg("doClickHere")} ${msg("emailVerifyInstruction3")} +

    +
    + + diff --git a/login/login-x509-info.ftl b/login/login-x509-info.ftl new file mode 100644 index 0000000..bbe0852 --- /dev/null +++ b/login/login-x509-info.ftl @@ -0,0 +1,58 @@ +<#import "template.ftl" as layout> +<@layout.registrationLayout; section> + <#if section = "title"> + ${msg("loginTitle",(realm.displayName!''))} + <#elseif section = "header"> + ${msg("loginTitleHtml",(realm.displayNameHtml!''))?no_esc} + <#elseif section = "form"> +
    +
    +
    + +
    + +
    + <#if subjectDN??> +
    + +
    + <#else> +
    + +
    + +
    + +
    + + <#if isUserEnabled> +
    + +
    +
    + +
    + + +
    + +
    +
    +
    +
    +
    + +
    +
    + + <#if isUserEnabled> + + +
    +
    +
    +
    +
    + + + diff --git a/login/login.ftl b/login/login.ftl new file mode 100644 index 0000000..53679ec --- /dev/null +++ b/login/login.ftl @@ -0,0 +1,96 @@ +<#import "template.ftl" as layout> +<@layout.registrationLayout displayInfo=social.displayInfo; section> + <#if section = "title"> + ${msg("loginTitle",(realm.displayName!''))} + <#elseif section = "header"> + ${msg("loginTitleHtml",(realm.displayNameHtml!''))?no_esc} + <#if realm.internationalizationEnabled>(<#list locale.supported as l><#if l.label!=locale.current>${l.label}) + <#elseif section = "form"> +
    + <#if realm.password> +
    +
    + + <#if usernameEditDisabled??> + + <#else> + + +
    + +
    + + +
    + +
    + <#if realm.rememberMe && !usernameEditDisabled??> +
    + +
    + +
    + +
    + + ${msg("doForgotPassword")?no_esc} + <#if realm.password && realm.registrationAllowed && !usernameEditDisabled??> + ${msg("doRegister")} + +
    +
    + + +
    +
    + +

    Přihlášení existujícím účtem

    + +
    + +

    Více informací

    +

    Proč se registrovat a další související informace najdete v aplikaci Nalodění. +

    + +
    + + diff --git a/login/messages/messages_ca.properties b/login/messages/messages_ca.properties new file mode 100644 index 0000000..0e8458b --- /dev/null +++ b/login/messages/messages_ca.properties @@ -0,0 +1,200 @@ +doLogIn=Inicia sessi\u00F3 +doRegister=Registra''t +doCancel=Cancel\u00B7lar +doSubmit=Envia +doYes=S\u00ED +doNo=No +doContinue=Continua +doAccept=Accepta +doDecline=Rebutja +doForgotPassword=Has oblidat la teva contrasenya? +doClickHere=Fes clic aqu\u00ED +doImpersonate=Personifica +kerberosNotConfigured=Kerberos no configurat +kerberosNotConfiguredTitle=Kerberos no configurat +bypassKerberosDetail=O b\u00E9 no est\u00E0s identificat mitjan\u00E7ant Kerberos o el teu navegador no est\u00E0 configurat per identificar-se mitjan\u00E7ant Kerberos. Si us plau fes clic per identificar-te per un altre mitj\u00E0. +kerberosNotSetUp=Kerberos no est\u00E0 configurat. No pots identificar-te. +registerWithTitle=Registra''t amb {0} +registerWithTitleHtml={0} +loginTitle=Inicia sessi\u00F3 a {0} +loginTitleHtml={0} +impersonateTitle={0}\u00A0Personifica Usuari +impersonateTitleHtml={0} Personifica Usuari
    +realmChoice=Domini +unknownUser=Usuari desconegut +loginTotpTitle=Configura la teva aplicaci\u00F3 d''identificaci\u00F3 m\u00F2bil +loginProfileTitle=Actualitza la informaci\u00F3 del teu compte +loginTimeout=Has trigat massa a identificar-te. Inicia de nou la identificaci\u00F3. +oauthGrantTitle=Concessi\u00F3 OAuth +oauthGrantTitleHtml={0} +errorTitle=Ho sentim... +errorTitleHtml=Ho sentim... +emailVerifyTitle=Verificaci\u00F3 de l''email +emailForgotTitle=Has oblidat la teva contrasenya? +updatePasswordTitle=Modificaci\u00F3 de contrasenya +codeSuccessTitle=Codi d''\u00E8xit +codeErrorTitle=Codi d''error: {0} + +termsTitle=Termes i Condicions +termsTitleHtml=Termes i Condicions +termsText=

    Termes i condicions a definir

    + +recaptchaFailed=Reconeixement de text inv\u00E0lid +recaptchaNotConfigured=El reconeixement de text \u00E9s obligatori per\u00F2 no est\u00E0 configurat +consentDenied=Consentiment rebutjat. + +noAccount=Usuari nou? +username=Usuari +usernameOrEmail=Usuari o email +firstName=Nom +givenName=Nom de pila +fullName=Nom complet +lastName=Cognoms +familyName=Cognoms +email=Email +password=Contrasenya +passwordConfirm=Confirma la contrasenya +passwordNew=Nova contrasenya +passwordNewConfirm=Confirma la nova contrasenya +rememberMe=Seguir connectat +authenticatorCode=Codi d''identificaci\u00F3 +address=Adre\u00E7a +street=Carrer +locality=Ciutat o Municipi +region=Estat, Prov\u00EDncia, o Regi\u00F3 +postal_code=Codi Postal +country=Pa\u00EDs +emailVerified=Email verificat +gssDelegationCredential=GSS Delegation Credential + +loginTotpStep1=Instal\u00B7la FreeOTP o Google Authenticator al teu tel\u00E8fon m\u00F2bil. Les dues aplicacions estan disponibles a Google Play i en l''App Store d''Apple. +loginTotpStep2=Obre l''aplicaci\u00F3 i escaneja el codi o introdueix la clau. +loginTotpStep3=Introdueix el codi \u00FAnic que et mostra l''aplicaci\u00F3 d''autenticaci\u00F3 i fes clic a Envia per finalitzar la configuraci\u00F3 +loginTotpOneTime=Codi d''un sol \u00FAs + +oauthGrantRequest=Vols permetre aquests privilegis d''acc\u00E9s? +inResource=a + +emailVerifyInstruction1=T''hem enviat un email amb instruccions per verificar el teu email. +emailVerifyInstruction2=No has rebut un codi de verificaci\u00F3 al teu email? +emailVerifyInstruction3=per reenviar l''email. + +backToLogin=« Torna a la identificaci\u00F3 + +emailInstruction=Indica el teu usuari o email i t''enviarem instruccions indicant com generar una nova contrasenya. + +copyCodeInstruction=Si us plau, copia i enganxa aquest codi a la teva aplicaci\u00F3: + +personalInfo=Informaci\u00F3 personal: +role_admin=Admin +role_realm-admin=Administrador del domini +role_create-realm=Crear domini +role_create-client=Crear client +role_view-realm=Veure domini +role_view-users=Veure usuaris +role_view-applications=Veure aplicacions +role_view-clients=Veure clients +role_view-events=Veure events +role_view-identity-providers=Veure prove\u00EFdors d''identitat +role_manage-realm=Gestionar domini +role_manage-users=Gestionar usuaris +role_manage-applications=Gestionar aplicacions +role_manage-identity-providers=Gestionar prove\u00EFdors d''identitat +role_manage-clients=Gestionar clients +role_manage-events=Gestionar events +role_view-profile=Veure perfil +role_manage-account=Gestionar compte +role_read-token=Llegir token +role_offline-access=Acc\u00E9s sense connexi\u00F3 +client_account=Compte +client_security-admin-console=Consola d''Administraci\u00F3 de Seguretat +client_realm-management=Gesti\u00F3 del domini +client_broker=Broker + +invalidUserMessage=Usuari o contrasenya incorrectes. +invalidEmailMessage=Email no v\u00E0lid +accountDisabledMessage=El compte est\u00E0 desactivat, contacta amb l''administrador. +accountTemporarilyDisabledMessage=El compte est\u00E0 temporalment desactivat, contacta amb l''administrador o intenta-ho de nou m\u00E9s tard. +expiredCodeMessage=S''ha esgotat el temps m\u00E0xim per a la identificaci\u00F3. Si us plau identifica''t de nou. + +missingFirstNameMessage=Si us plau indica el teu nom. +missingLastNameMessage=Si us plau indica els teus cognoms. +missingEmailMessage=Si us plau indica el teu email. +missingUsernameMessage=Si us plau indica el teu usuari. +missingPasswordMessage=Si us plau indica la teva contrasenya. +missingTotpMessage=Si us plau indica el teu codi d''autenticaci\u00F3 +notMatchPasswordMessage=Les contrasenyes no coincideixen. + +invalidPasswordExistingMessage=La contrasenya actual no \u00E9s correcta. +invalidPasswordConfirmMessage=La confirmaci\u00F3 de contrasenya no coincideix. +invalidTotpMessage=El codi d''autenticaci\u00F3 no \u00E9s v\u00E0lid. + +usernameExistsMessage=El nom d''usuari ja existeix +emailExistsMessage=L''email ja existeix + +federatedIdentityEmailExistsMessage=Ja existeix un usuari amb aquest email. Si us plau accedeix a la gesti\u00F3 del teu compte per enlla\u00E7ar-lo. +federatedIdentityUsernameExistsMessage=Ja existeix un usuari amb aquest nom d''usuari. Si us plau accedeix a la gesti\u00F3 del teu compte per enlla\u00E7ar-lo. + +configureTotpMessage=Has de configurar l''aplicaci\u00F3 m\u00F2bil 'd'identificaci\u00F3 per activar el teu compte. +updateProfileMessage=Has d''actualitzar el teu perfil d''usuari per activar el teu compte. +updatePasswordMessage=Has de canviar la contrasenya per activar el teu compte. +verifyEmailMessage=Has de verificar el teu email per activar el teu compte. + +emailSentMessage=En breu hauries de rebre un missatge amb m\u00E9s instruccions +emailSendErrorMessage=Ha fallat l''enviament de l''email, si us plau intenta-ho de nou m\u00E9s tard. + +accountUpdatedMessage=El teu compte s''ha actualitzat. +accountPasswordUpdatedMessage=La contrasenya s''ha actualitzat. + +noAccessMessage=Sense acc\u00E9s + +invalidPasswordMinLengthMessage=Contrasenya incorrecta: longitud m\u00EDnima {0}. +invalidPasswordMinDigitsMessage=Contrasenya incorrecta: ha de contenir almenys {0} car\u00E0cters num\u00E8rics. +invalidPasswordMinLowerCaseCharsMessage=Contrasenya incorrecta: ha de contenir almenys {0} lletres min\u00FAscules. +invalidPasswordMinUpperCaseCharsMessage=Contrasenya incorrecta: ha de contenir almenys {0} lletres maj\u00FAscules. +invalidPasswordMinSpecialCharsMessage=Contrasenya incorrecta: ha de contenir almenys {0} car\u00E0cters especials. +invalidPasswordNotUsernameMessage=Contrasenya incorrecta: no pot ser igual al nom d''usuari. +invalidPasswordRegexPatternMessage=Contrasenya incorrecta: no compleix l''expressi\u00F3 regular. +invalidPasswordHistoryMessage=Contrasenya incorrecta: no pot ser igual a cap de les \u00FAltimes {0} contrasenyes. + +failedToProcessResponseMessage=Fallada en processar la resposta +httpsRequiredMessage=HTTPS obligatori +realmNotEnabledMessage=El domini no est\u00E0 activat +invalidRequestMessage=Petici\u00F3 incorrecta +failedLogout=Ha fallat la desconnexi\u00F3. +unknownLoginRequesterMessage=Sol\u00B7licitant d''identificaci\u00F3 desconegut +loginRequesterNotEnabledMessage=El sol\u00B7licitant d''inici de sessi\u00F3 est\u00E0 desactivat +bearerOnlyMessage=Les aplicacions Bearer-only no poden iniciar sessi\u00F3 des del navegador. +directGrantsOnlyMessage=Els clients de tipus Direct-grants-only no poden iniciar sessi\u00F3 des del navegador. +invalidRedirectUriMessage=L''URI de redirecci\u00F3 no \u00E9s correcta +unsupportedNameIdFormatMessage=NameIDFormat no suportat +invalidRequesterMessage=Sol\u00B7licitant no v\u00E0lid +registrationNotAllowedMessage=El registre no est\u00E0 perm\u00E8s +resetCredentialNotAllowedMessage=El reinici de les credencials no est\u00E0 perm\u00E8s + +permissionNotApprovedMessage=Perm\u00EDs no aprovat. +noRelayStateInResponseMessage=Sense estat de retransmissi\u00F3 en la resposta del prove\u00EFdor d''identitat. +identityProviderAlreadyLinkedMessage=La identitat retornada pel prove\u00EFdor d''identitat ja est\u00E0 associada a un altre usuari. +insufficientPermissionMessage=Permisos insuficients per enlla\u00E7ar identitats. +couldNotProceedWithAuthenticationRequestMessage=No s''ha pogut continuar amb la petici\u00F3 d''autenticaci\u00F3 al prove\u00EFdor d''identitat. +couldNotObtainTokenMessage=No s''ha pogut obtenir el codi del prove\u00EFdor d''identitat. +unexpectedErrorRetrievingTokenMessage=Error inesperat obtenint el token del prove\u00EFdor d''identitat +unexpectedErrorHandlingResponseMessage=Error inesperat processant la resposta del prove\u00EFdor d''identitat. +identityProviderAuthenticationFailedMessage=Ha fallat l''autenticaci\u00F3. No ha estat possible autenticar-se en el prove\u00EFdor d''identitat. +couldNotSendAuthenticationRequestMessage=No s''ha pogut enviar la petici\u00F3 d''identificaci\u00F3 al prove\u00EFdor d''identitat. +unexpectedErrorHandlingRequestMessage=Error inesperat durant la petici\u00F3 d''identificaci\u00F3 al prove\u00EFdor d''identitat. +invalidAccessCodeMessage=Codi d''acc\u00E9s no v\u00E0lid. +sessionNotActiveMessage=La sessi\u00F3 no est\u00E0 activa +invalidCodeMessage=Hi ha hagut un error, si us plau identifica''t de nou des de la teva aplicaci\u00F3. +identityProviderUnexpectedErrorMessage=Error no esperat intentant autenticar en el prove\u00EFdor d''identitat. +identityProviderNotFoundMessage=No s''ha trobat cap prove\u00EFdor d''identitat. +realmSupportsNoCredentialsMessage=El domini no suporta cap tipus de credencials. +identityProviderNotUniqueMessage=El domini suporta m\u00FAltiples prove\u00EFdors d''identitat. No s''ha pogut determinar el prove\u00EFdor d''identitat que hauria de ser utilitzat per identificar-se. +emailVerifiedMessage=El teu email ha estat verificat. + +backToApplication=« Torna a l''aplicaci\u00F3 +missingParameterMessage=Par\u00E0metres que falten: {0} +clientNotFoundMessage=Client no trobat +invalidParameterMessage=Par\u00E0metre no v\u00E0lid: {0} +alreadyLoggedIn=You are already logged in. + diff --git a/login/messages/messages_cs.properties b/login/messages/messages_cs.properties new file mode 100644 index 0000000..14c8cb4 --- /dev/null +++ b/login/messages/messages_cs.properties @@ -0,0 +1,272 @@ +# encoding: UTF-8 +locale_ca=Catal\u00E0 +locale_cs=Česky +locale_de=Deutsch +locale_en=English +locale_es=Espa\u00F1ol +locale_fr=Fran\u00e7ais +locale_it=Italian +locale_ja=\u65E5\u672C\u8A9E +locale_nl=Nederlands +locale_no=Norsk +locale_pt_BR=Portugu\u00EAs (Brasil) +locale_pt-BR=Portugu\u00EAs (Brasil) +locale_ru=\u0420\u0443\u0441\u0441\u043A\u0438\u0439 +locale_lt=Lietuvi\u0173 +locale_zh-CN=\u4e2d\u6587\u7b80\u4f53 +locale_sv=Svenska + +doLogIn=Přihlásit se +doRegister=Registrovat se +doCancel=Zrušit +doSubmit=Odeslat +doYes=Ano +doNo=Ne +doContinue=Pokračovat +doIgnore=Ignorovat +doAccept=Souhlasím +doDecline=Nesouhlasím +doForgotPassword=Zapomenuté heslo? +doClickHere=Klikněte zde +doImpersonate=Přihlásit se tímto jménem +kerberosNotConfigured=Kerberos Not Configured +kerberosNotConfiguredTitle=Kerberos Not Configured +bypassKerberosDetail=Either you are not logged in via Kerberos or your browser is not set up for Kerberos login. Please click continue to login in through other means +kerberosNotSetUp=Kerberos is not set up. You cannot login. +registerWithTitle=Registrace | {0} +registerWithTitleHtml=Registrace +loginTitle=Přihlášení | {0} +loginTitleHtml=Přihlášení +impersonateTitle={0} Přihlášení uživatelem +impersonateTitleHtml={0} Přihlášení uživatelem
    +realmChoice=Realm +unknownUser=Neznámý uživatel +loginTotpTitle=Nastavení 2-faktorové autorizace TOTP +loginProfileTitle=Zkontrolovat informace o uživatelském účtu +loginTimeout=Vaše přihlášení trvalo příliš dlouho. Přihlašovací proces začal od začátku. +oauthGrantTitle=Povolení přístupu +oauthGrantTitleHtml={0} +errorTitle=Nastala chyba ... +errorTitleHtml=Nastala chyba ... +emailVerifyTitle=Ověření emailu +emailForgotTitle=Zapomněli jste heslo ? +updatePasswordTitle=Aktualizovat heslo +codeSuccessTitle=Úspěch +codeErrorTitle=Chyba, kód\: {0} + +termsTitle=Podmínky užití +termsTitleHtml=Podmínky užití +termsText=

    Podmínky užití budou dopracovány.

    + +recaptchaFailed=Ověření Recaptcha selhalo. +recaptchaNotConfigured=Recaptcha je vyžadována, ale není nakonfigurována. +consentDenied=Souhlas odepřen. + +noAccount=Nový uživatel ? +username=Uživatelské jméno +usernameOrEmail=Uživatelské jméno nebo email +firstName=Jméno +givenName=Jméno +fullName=Celé jméno +lastName=Příjmení +familyName=Příjmení +email=Email +password=Heslo +passwordConfirm=Heslo znovu +passwordNew=Nové heslo +passwordNewConfirm=Nové heslo znovu +rememberMe=Zapamatovat přihlášení +authenticatorCode=Jednorázový kód +address=Adresa +street=Ulice +locality=Město +region=Kraj +postal_code=PSČ +country=Země +emailVerified=E-mail byl ověřen +gssDelegationCredential=GSS Delegation Credential + +loginTotpStep1=Nainstalujte si FreeOTP nebo Google Authenticator na váš telefon. Obě aplikace jsou dostupné v Google Play a Apple App Store. +loginTotpStep2=Otevřete aplikaci a naskenujte čárový kód nebo zadejte klíč. +loginTotpStep3=Zadejte jednorázový kód z aplikace a klikněte na Uložit pro dokončení nastavení. +loginTotpOneTime=Jednorázový kód + +oauthGrantRequest=Chcete zpřístupnit aplikaci následující údaje ? +inResource=v + +emailVerifyInstruction1=Na zadanou emailovou adresu jsme odeslali ověřovací email. +emailVerifyInstruction2=Nedošla Vám zpráva s ověřovacím kódem ? +emailVerifyInstruction3=pro znovuodeslání zprávy. + +emailLinkIdpTitle=Propojit {0} +emailLinkIdp1=Byla Vám zaslána emailová zpráva s instrukcemi k propojení {0} účtu {1} s Vaším "{2}" účtem. +emailLinkIdp2=Nedošla Vám zpráva s ověřovacím kódem ? +emailLinkIdp3=pro znovuodeslání zprávy. +emailLinkIdp4=Pokud jste ověřili emalovou adresu v jiném prohlížeči +emailLinkIdp5=pro pokračování. + +backToLogin=« Zpět na přihlášení + +emailInstruction=Zadejte uživatelské jméno nebo email. Pošleme Vám instrukce pro vytvoření nového hesla. + +copyCodeInstruction=Zkopírujte tento kód a zadejte ho do Vaší aplikace: + +pageExpiredTitle=Stránka vypršela +pageExpiredMsg1=Pro započetí nového procesu přihlášení +pageExpiredMsg2=Pro pokračování v procesu přihlášení + +personalInfo=Osobní informace: +role_admin=Admin +role_realm-admin=Realm Admin +role_create-realm=Create realm +role_create-client=Create client +role_view-realm=View realm +role_view-users=View users +role_view-applications=View applications +role_view-clients=View clients +role_view-events=View events +role_view-identity-providers=View identity providers +role_manage-realm=Manage realm +role_manage-users=Manage users +role_manage-applications=Manage applications +role_manage-identity-providers=Manage identity providers +role_manage-clients=Manage clients +role_manage-events=Manage events +role_view-profile=View profile +role_manage-account=Manage account +role_manage-account-links=Manage account links +role_read-token=Read token +role_offline-access=Offline access +client_account=Účet +client_security-admin-console=Security Admin Console +client_admin-cli=Admin CLI +client_realm-management=Realm Management +client_broker=Broker + +invalidUserMessage=Neplatné uživatelské jméno nebo heslo. +invalidEmailMessage=Neplatná emailová adresa. +accountDisabledMessage=Účet je neaktivní. Kontaktujte správce. +accountTemporarilyDisabledMessage=Účet je dočasně zablokován. Opakujte akci později, nebo kontaktujte správce. +expiredCodeMessage=Přihlášení vypršelo. Prosím, přihlaste se znovu. +expiredActionMessage=Platnost akce vypršela. Pokračujte novým přihlášením. +expiredActionTokenNoSessionMessage=Platnost akce vypršela. +expiredActionTokenSessionExistsMessage=Platnost akce vypršela. Prosím, začněte znovu. + +missingFirstNameMessage=Prosím, zadejte Vaše jméno. +missingLastNameMessage=Prosím, zadejte Vaše příjmení. +missingEmailMessage=Prosím, zadejte email. +missingUsernameMessage=Prosím, zadejte uživatelské jméno. +missingPasswordMessage=Prosím, zadejte heslo. +missingTotpMessage=Prosím, zadejte ověřovací kód. +notMatchPasswordMessage=Zadaná hesla nesouhlasí. + +invalidPasswordExistingMessage=Neplatné existující heslo. Zadejte jiné. +invalidPasswordBlacklistedMessage=Zadané heslo je na seznamu zakázaných hesel. +invalidPasswordConfirmMessage=Potvrzení hesla nesouhlasí. +invalidTotpMessage=Neplatný ověřovací kód. + +usernameExistsMessage=Uživatelské jméno je již obsazeno. +emailExistsMessage=Email je již obsazen. + +federatedIdentityExistsMessage=Uživatel s {0} {1} již existuje. Chcete-li účty spárovat, přihlašte se do správy účtu. + +confirmLinkIdpTitle=Účet již existuje +federatedIdentityConfirmLinkMessage=Uživatel s {0} {1} již existuje. Jak si přejete pokračovat ? +federatedIdentityConfirmReauthenticateMessage=Přihlašte se jako {0}, pokud chcete Vás účet propojit s {1} +confirmLinkIdpReviewProfile=Zkontrolovat údaje +confirmLinkIdpContinue=Přidat k existujícímu účtu + +configureTotpMessage=Pro aktivaci účtu je potřeba nastavit 2-faktorové ověření. +updateProfileMessage=Pro aktivaci účtu je potřeba vyplnit uživatelský profil. +updatePasswordMessage=Pro aktivaci účtu je třeba změnit heslo. +resetPasswordMessage=Je třeba si změnit přihlašovací heslo. +verifyEmailMessage=Je třeba ověřit Váš email, pokud chcete aktivovat Váš účet. +linkIdpMessage=Je třeba ověřit Váš email, pokud chcete propojit účet s {0}. + +emailSentMessage=Byla Vám zaslána emailová zpráva s dalšími instrukcemi. +emailSendErrorMessage=Email se nepodařilo odeslat. Prosím, zkuste to později. + +accountUpdatedMessage=Váš účet byl aktualizován. +accountPasswordUpdatedMessage=Vaše heslo bylo aktualizováno. + +noAccessMessage=Přístup odepřen + +invalidPasswordMinLengthMessage=Neplatné heslo: minimální délka {0}. +invalidPasswordMinDigitsMessage=Neplatné heslo: musí obsahovat nejméně {0} číslic. +invalidPasswordMinLowerCaseCharsMessage=Neplatné heslo: musí obsahovat nejméně {0} malých písmen. +invalidPasswordMinUpperCaseCharsMessage=Neplatné heslo: musí obsahovat nejméně {0} velkých písmen. +invalidPasswordMinSpecialCharsMessage=Neplatné heslo: musí obsahovat nejméně {0} speciálních znaků. +invalidPasswordNotUsernameMessage=Neplatné heslo: nesmí se shodovat s uživatelským jménem. +invalidPasswordRegexPatternMessage=Neplatné heslo: nesplňuje vyžadovanou masku. +invalidPasswordHistoryMessage=Neplatné heslo: nesmí být stejné jako minulých {0} hesel. +invalidPasswordGenericMessage=Neplatné heslo: nové heslo nesplňuje požadavky. + +failedToProcessResponseMessage=Nepodařilo se zpracovat odpověď +httpsRequiredMessage=Je vyžadováno HTTPS +realmNotEnabledMessage=Realm není aktivní +invalidRequestMessage=Špatný požadavek +failedLogout=Odhlášení selhalo +unknownLoginRequesterMessage=Neznámý žadatel o přihlášení +loginRequesterNotEnabledMessage=Žadatel o přihlášení není aktivní +bearerOnlyMessage=Bearer-only aplikace nemohou využívat přihlášení přes prohlížeč +standardFlowDisabledMessage=Klient se nemůže ověřit požadovaným způsobem. Standard flow je pro klienta zakázáno. +implicitFlowDisabledMessage=Klient se nemůže ověřit požadovaným způsobem. Implicit flow je pro klienta zakázáno. +invalidRedirectUriMessage=Neplatná URI pro přesměrování +unsupportedNameIdFormatMessage=Nepodporovaný NameIDFormat +invalidRequesterMessage=Špatný žadatel +registrationNotAllowedMessage=Registrace není povolena +resetCredentialNotAllowedMessage=Znovunastavení hesla není povoleno + +permissionNotApprovedMessage=Oprávnění není potvrzeno. +noRelayStateInResponseMessage=No relay state in response from identity provider. +insufficientPermissionMessage=Pro propojení identit nemáte dostatečné oprávnění. +couldNotProceedWithAuthenticationRequestMessage=Could not proceed with authentication request to identity provider. +couldNotObtainTokenMessage=Could not obtain token from identity provider. +unexpectedErrorRetrievingTokenMessage=Unexpected error when retrieving token from identity provider. +unexpectedErrorHandlingResponseMessage=Unexpected error when handling response from identity provider. +identityProviderAuthenticationFailedMessage=Authentication failed. Could not authenticate with identity provider. +identityProviderDifferentUserMessage=Přihlášení {0} neodpovídá očekávané identitě {1} +couldNotSendAuthenticationRequestMessage=Could not send authentication request to identity provider. +unexpectedErrorHandlingRequestMessage=Unexpected error when handling authentication request to identity provider. +invalidAccessCodeMessage=Neplatný přístupový kód. +sessionNotActiveMessage=Neaktivní session. +invalidCodeMessage=Nastala chyba. Přihlašte se znovu pomocí aplikace. +identityProviderUnexpectedErrorMessage=Unexpected error when authenticating with identity provider +identityProviderNotFoundMessage=Could not find an identity provider with the identifier. +identityProviderLinkSuccess=Vaše emailová adresa byla ověřena. Pokračujte v přihlášení v prohlížeči, kde jste se registrovali. +staleCodeMessage=Stránka již není platná. Vraťte se do aplikace a přihlašte se znovu. +realmSupportsNoCredentialsMessage=Realm does not support any credential type. +identityProviderNotUniqueMessage=Realm podporuje více poskytovatelů identit. Nepodařilo se určit, který z nich se má pro přihlášení použít. +emailVerifiedMessage=Vaše emailová adresa byla ověřena. +staleEmailVerificationLink=Použitý odkaz je starý. Je možné, že jste již emailovou adresu ověřili. +identityProviderAlreadyLinkedMessage=Identita předaná z {0} je již propojena s jiným účtem. +confirmAccountLinking=Potvrďte propojení účtu {0} poskytovatele identit {1} s Vaším účtem. +confirmEmailAddressVerification=Ověřte platnost emailové adresy {0}. +confirmExecutionOfActions=Proveďte následující akce + +backToApplication=« Zpět do aplikace +missingParameterMessage=Chybějísí parametry\: {0} +clientNotFoundMessage=Klient nenalezen. +clientDisabledMessage=Klient neaktivní. +invalidParameterMessage=Neplatný parametr\: {0} +alreadyLoggedIn=Již jste přihlášeni. +differentUserAuthenticated=Již jste přihlášení jako jiný uživatel ''{0}''. Nejprve se, prosím, odhlašte. +brokerLinkingSessionExpired=Requested broker account linking, but current session is no longer valid. +proceedWithAction=» Klikněte zde pro pokračování + +requiredAction.CONFIGURE_TOTP=Nastavit TOTP +requiredAction.terms_and_conditions=Podmínky užití +requiredAction.UPDATE_PASSWORD=Aktualizovat heslo +requiredAction.UPDATE_PROFILE=Aktualizovat profil +requiredAction.VERIFY_EMAIL=Ověřit email + +p3pPolicy=CP="This is not a P3P policy!" + +doX509Login=Budete přihlášeni jako\: +clientCertificate=X509 certifikát klienta\: +noCertificate=[Žádný certifikát] + +pageNotFound=Stránka nenalezena +internalServerError=Nastala interní chyba aplikace. + +operationInfo=Operace provedena diff --git a/login/messages/messages_de.properties b/login/messages/messages_de.properties new file mode 100644 index 0000000..327e99b --- /dev/null +++ b/login/messages/messages_de.properties @@ -0,0 +1,195 @@ +doLogIn=Anmelden +doRegister=Registrieren +doCancel=Abbrechen +doSubmit=Absenden +doYes=Ja +doNo=Nein +doAccept=Annehmen +doDecline=Ablehnen +doContinue=Weiter +doForgotPassword=Passwort vergessen? +doClickHere=Hier klicken +doImpersonate=Identit\u00E4tswechsel +kerberosNotConfigured=Kerberos ist nicht konfiguriert. +kerberosNotConfiguredTitle=Kerberos nicht konfiguriert +bypassKerberos=Ihr Browser is nicht f\u00FCr Kerberos Login konfiguriert. Bitte klicken Sie auf Weiter, um mit einem anderen Anmeldeverfahren fortzufahren +kerberosNotSetUp=Kerberos ist nicht konfiguriert. Sie k\u00F6nnen sich damit nicht anmelden. +recaptchaFailed=Ung\u00FCltiges Recaptcha +recaptchaNotConfigured=Recaptcha Eingabe ist erforderlich, jedoch noch nicht konfiguriert. +consentDenied=Zustimmung verweigert. + +registerWithTitle=Registrierung bei {0} +registerWithTitleHtml={0} +loginTitle=Anmeldung bei {0} +loginTitleHtml={0} +loginOauthTitle= +loginOauthTitleHtml=Tempor\u00E4rer Zugriff auf {0} angefordert von {1}. +loginTotpTitle=Mobile Authentifizierung einrichten +loginProfileTitle=Benutzerkonto Informationen aktualisieren +loginTimeout=Sie haben zu lange gebraucht, um sich anzumelden. Bitte versuchen Sie es erneut. +impersonateTitle={0} Identit\u00E4tswechsel +impersonateTitleHtml={0} Identit\u00E4tswechsel +unknownUser=Unbekannter Benutzer +realmChoice=Realm +oauthGrantTitle=OAuth gew\u00E4hren +oauthGrantTitleHtml={0} +errorTitle=Es ist ein Fehler aufgetreten. +errorTitleHtml=Es ist ein Fehler aufgetreten. +emailVerifyTitle=E-Mail verifizieren +emailForgotTitle=Passwort vergessen? +updatePasswordTitle=Passwort aktualisieren +codeSuccessTitle=Erfolgreicher Code +codeErrorTitle=Fehlercode\: {0} + +noAccount=Neuer Benutzer? +username=Benutzername +usernameOrEmail=Benutzername oder E-Mail +firstName=Vorname +givenName=Vorname +fullName=Voller Name +lastName=Nachname +familyName=Nachname +email=E-Mail +password=Passwort +passwordConfirm=Passwort best\u00E4tigen +passwordNew=Neues Passwort +passwordNewConfirm=Neues Passwort best\u00E4tigen +rememberMe=Angemeldet bleiben +authenticatorCode=One-time Code +address=Adresse +street=Stra\u00DFe +region=Staat, Provinz, Region +postal_code=PLZ +locality=Stadt oder Ortschaft +country=Land +emailVerified=E-Mail verifiziert +gssDelegationCredential=GSS delegierte Berechtigung + +loginTotpStep1=Installieren Sie FreeOTP oder Google Authenticator auf Ihrem Smartphone. +loginTotpStep2=\u00D6ffnen Sie die Applikation und scannen Sie den Barcode oder geben Sie den Code ein. +loginTotpStep3=Geben Sie den von der Applikation generierten One-time Code ein und klicken Sie auf Absenden. +loginTotpOneTime=One-time Code + +oauthGrantRequest=Wollen Sie diese Zugriffsrechte gew\u00E4hren? +inResource=in + +emailVerifyInstruction1=Eine E-Mail mit weiteren Anweisungen wurde an Sie versendet. +emailVerifyInstruction2=Falls Sie keine E-Mail erhalten haben, dann k\u00F6nnen Sie +emailVerifyInstruction3=um eine neue E-Mail versenden zu lassen. + +backToLogin=« Zur\u00FCck zur Anmeldung +backToApplication=« Zur\u00FCck zur Applikation + +temporaryEmailCode=Tempor\u00E4rer Email Code +emailInstruction=Geben Sie ihren Benutzernamen oder E-Mail Adresse ein und klicken Sie auf Absenden. Danach werden wir Ihnen eine E-Mail mit weiteren Instruktionen zusenden. +validateResetEmailInstruction=Eine E-Mail wurde an Sie versendet. Klicken Sie auf die URL in der E-Mail, um ihr Passwort zur\u00FCckzusetzen und sich neu anzumelden. Alternativ k\u00F6nnen Sie den tempor\u00E4ren Code aus der E-Mail in das Eingabefeld unten links eingeben und auf Absenden klicken. + +copyCodeInstruction=Bitte kopieren Sie den folgenden Code und f\u00FCgen ihn in die Applikation ein\: + +personalInfo=Pers\u00F6nliche Informationen: + +role_admin=Admin +role_realm-admin=Realm Admin +role_create-realm=Realm erstellen +role_view-realm=Realm ansehen +role_view-users=Benutzer ansehen +role_view-applications=Applikationen ansehen +role_view-clients=Clients ansehen +role_view-events=Events ansehen +role_view-identity-providers=Identity Provider ansehen +role_manage-realm=Realm verwalten +role_manage-users=Benutzer verwalten +role_manage-applications=Applikationen verwalten +role_manage-identity-providers=Identity Provider verwalten +role_manage-clients=Clients verwalten +role_manage-events=Events verwalten +role_view-profile=Profile ansehen +role_manage-account=Profile verwalten + +invalidUserMessage=Ung\u00FCltiger Benutzername oder Passwort. +invalidEmailMessage=Ung\u00FCltige E-Mail Adresse. +accountDisabledMessage=Benutzerkonto ist gesperrt, bitte kontaktieren Sie den Admin. +accountTemporarilyDisabledMessage=Benutzerkonto ist tempor\u00E4r gesperrt. Bitte kontaktieren Sie den Admin oder versuchen Sie es sp\u00E4ter noch einmal. +expiredCodeMessage=Zeit\u00FCberschreitung bei der Anmeldung. Bitte melden Sie sich erneut an. + +missingFirstNameMessage=Bitte geben Sie einen Vornamen ein. +missingLastNameMessage=Bitte geben Sie einen Nachnamen ein. +missingEmailMessage=Bitte geben Sie eine E-Mail Adresse ein. +missingUsernameMessage=Bitte geben Sie einen Benutzernamen ein. +missingPasswordMessage=Bitte geben Sie ein Passwort ein. +missingTotpMessage=Bitte geben Sie den One-time Code ein. +notMatchPasswordMessage=Passw\u00F6rter sind nicht identisch. + +invalidPasswordExistingMessage=Das aktuelle Passwort ist ung\u00FCltig. +invalidPasswordConfirmMessage=Die Passwortbest\u00E4tigung ist nicht identisch. +invalidTotpMessage=Ung\u00FCltiger One-time Code. + +usernameExistsMessage=Benutzername existiert bereits. +emailExistsMessage=E-Mail existiert bereits. + +federatedIdentityEmailExistsMessage=Es existiert bereits ein Benutzer mit dieser E-Mail Adresse. Bitte melden Sie sich bei der Benutzerverwaltung an, um das Benutzerkonto zu verkn\u00FCpfen. +federatedIdentityUsernameExistsMessage=Es existiert bereits ein Benutzer mit diesem Benutzernamen. Bitte melden Sie sich bei der Benutzerverwaltung an, um das Benutzerkonto zu verkn\u00FCpfen. + +configureTotpMessage=Sie m\u00FCssen eine Mobile Authentifizierung einrichten, um das Benutzerkonto zu aktivieren. +updateProfileMessage=Sie m\u00FCssen ihr Benutzerkonto aktualisieren, um das Benutzerkonto zu aktivieren. +updatePasswordMessage=Sie m\u00FCssen ihr Passwort \u00E4ndern, um das Benutzerkonto zu aktivieren. +verifyEmailMessage=Sie m\u00FCssen ihre E-Mail Adresse verifizieren, um das Benutzerkonto zu aktivieren. + +emailSentMessage=Sie sollten in k\u00FCrze ein E-Mail mit weiteren Instruktionen erhalten. +emailSendErrorMessage=Die E-Mail konnte nicht versendet werden. Bitte versuchen Sie es sp\u00E4ter nochmal einmal. + +accountUpdatedMessage=Ihr Benutzerkonto wurde aktualisiert. +accountPasswordUpdatedMessage=Ihr Passwort wurde aktualisiert. + +noAccessMessage=Kein Zugriff + +invalidPasswordMinLengthMessage=Ung\u00FCltiges Passwort\: Mindestl\u00E4nge {0}. +invalidPasswordMinDigitsMessage=Ung\u00FCltiges Passwort\: muss mindestens {0} Ziffer(n) enthalten. +invalidPasswordMinLowerCaseCharsMessage=Ung\u00FCltiges Passwort\: muss mindestens {0} Kleinbuchstaben enthalten. +invalidPasswordMinUpperCaseCharsMessage=Ung\u00FCltiges Passwort\: muss mindestens {0} Gro\u00DFbuchstaben enthalten. +invalidPasswordMinSpecialCharsMessage=Ung\u00FCltiges Passwort\: muss mindestens {0} Sonderzeichen enthalten. +invalidPasswordNotUsernameMessage=Ung\u00FCltiges Passwort\: darf nicht dem Benutzernamen entsprechen. +invalidPasswordRegexPatternMessage=Ung\u00FCltiges Passwort\: entspricht nicht Regex-Muster(n). +invalidPasswordHistoryMessage=Ung\u00FCltiges Passwort: darf nicht einem der letzten {0} Passw\u00F6rter entsprechen. + +failedToProcessResponseMessage=Konnte Antwort nicht verarbeiten. +httpsRequiredMessage=HTTPS erforderlich. +realmNotEnabledMessage=Realm nicht aktiviert. +invalidRequestMessage=Ung\u00FCltiger Request. +failedLogout=Logout fehlgeschlagen. +unknownLoginRequesterMessage=Ung\u00FCltiger Login Requester. +loginRequesterNotEnabledMessage=Login Requester nicht aktiviert. +bearerOnlyMessage=Bearer-only Clients k\u00F6nnen sich nicht via Browser anmelden. +directGrantsOnlyMessage=Direct-grants-only Clients k\u00F6nnen sich nicht via Browser anmelden. +invalidRedirectUriMessage=Ung\u00FCltige Redirect Uri. +unsupportedNameIdFormatMessage=Nicht unterst\u00FCtztes NameIDFormat. +invalidRequesterMessage=Ung\u00FCltiger Requester. +registrationNotAllowedMessage=Registrierung nicht erlaubt. +resetCredentialNotAllowedMessage=Reset Credential nicht erlaubt. + +permissionNotApprovedMessage=Berechtigung nicht best\u00E4tigt. +noRelayStateInResponseMessage=Kein Relay State in der Antwort von Identity Provider. +identityProviderAlreadyLinkedMessage=Die Identit\u00E4t welche von dem Identity Provider zur\u00FCckgegeben wurde ist bereits mit einem anderen Benutzer verkn\u00FCpft. +insufficientPermissionMessage=Nicht gen\u00FCgend Rechte, um die Identit\u00E4t zu verkn\u00FCpfen. +couldNotProceedWithAuthenticationRequestMessage=Konnte die Authentifizierungsanfrage nicht weiter verarbeiten. +couldNotObtainTokenMessage=Konnte kein Token vom Identity Provider erhalten. +unexpectedErrorRetrievingTokenMessage=Unerwarteter Fehler w\u00E4hrend dem Empfang des Tokens vom Identity Provider. +unexpectedErrorHandlingResponseMessage=Unerwarteter Fehler w\u00E4hrend der Bearbeitung der Antwort vom Identity Provider. +identityProviderAuthenticationFailedMessage=Authentifizierung fehlgeschlagen. Authentifizierung mit dem Identity Provider nicht m\u00F6glich. +couldNotSendAuthenticationRequestMessage=Konnte Authentifizierungsanfrage nicht an den Identity Provider senden. +unexpectedErrorHandlingRequestMessage=Unerwarteter Fehler w\u00E4hrend der Bearbeitung der Anfrage an den Identity Provider. +invalidAccessCodeMessage=Ung\u00FCltiger Access-Code. +sessionNotActiveMessage=Session nicht aktiv. +unknownCodeMessage=Unbekannter Code. Bitte melden Sie sich erneut \u00FCber die Applikation an. +invalidCodeMessage=Ung\u00FCltiger Code, bitte melden Sie sich erneut \u00FCber die Applikation an. +identityProviderUnexpectedErrorMessage=Unerwarteter Fehler w\u00E4hrend der Authentifizierung mit dem Identity Provider. +identityProviderNotFoundMessage=Konnte keinen Identity Provider zu der Identit\u00E4t finden. +realmSupportsNoCredentialsMessage=Realm unterst\u00FCtzt keine Credential Typen. +identityProviderNotUniqueMessage=Der Realm unterst\u00FCtzt mehrere Identity Provider. Es konnte kein eindeutiger Identity Provider zum Authentifizieren gew\u00E4hlt werden. + +invalidParameterMessage=Ung\u00FCltiger Parameter\: {0} +missingParameterMessage=Fehlender Parameter\: {0} +clientNotFoundMessage=Client nicht gefunden. + +emailVerifiedMessage=Ihr E-Mail Adresse wurde erfolgreich verifiziert. +alreadyLoggedIn=Sie sind bereits angemeldet. diff --git a/login/messages/messages_en.properties b/login/messages/messages_en.properties new file mode 100644 index 0000000..12633f0 --- /dev/null +++ b/login/messages/messages_en.properties @@ -0,0 +1,285 @@ +#encoding: UTF-8 +locale_ca=Catal\u00E0 +locale_cs=Česky +locale_de=Deutsch +locale_en=English +locale_es=Espa\u00F1ol +locale_fr=Fran\u00e7ais +locale_it=Italian +locale_ja=\u65E5\u672C\u8A9E +locale_nl=Nederlands +locale_no=Norsk +locale_pt_BR=Portugu\u00EAs (Brasil) +locale_pt-BR=Portugu\u00EAs (Brasil) +locale_ru=\u0420\u0443\u0441\u0441\u043A\u0438\u0439 +locale_lt=Lietuvi\u0173 +locale_zh-CN=\u4e2d\u6587\u7b80\u4f53 +locale_sv=Svenska + +doLogIn=Log in +doRegister=Register +doCancel=Cancel +doSubmit=Submit +doYes=Yes +doNo=No +doContinue=Continue +doIgnore=Ignore +doAccept=Accept +doDecline=Decline +doForgotPassword=Forgot Password? +doClickHere=Click here +doImpersonate=Impersonate +kerberosNotConfigured=Kerberos Not Configured +kerberosNotConfiguredTitle=Kerberos Not Configured +bypassKerberosDetail=Either you are not logged in via Kerberos or your browser is not set up for Kerberos login. Please click continue to login in through other means +kerberosNotSetUp=Kerberos is not set up. You cannot login. +registerWithTitle=Register with {0} +registerWithTitleHtml=Register +loginTitle=Log in to {0} +loginTitleHtml=Log in +impersonateTitle={0} Impersonate User +impersonateTitleHtml={0} Impersonate User +realmChoice=Realm +unknownUser=Unknown user +loginTotpTitle=Mobile Authenticator Setup +loginProfileTitle=Update Account Information +loginTimeout=You took too long to login. Login process starting from beginning. +oauthGrantTitle=Grant Access +oauthGrantTitleHtml={0} +errorTitle=We''re sorry... +errorTitleHtml=We''re sorry ... +emailVerifyTitle=Email verification +emailForgotTitle=Forgot Your Password ? +updatePasswordTitle=Update password +codeSuccessTitle=Success code +codeErrorTitle=Error code\: {0} + +termsTitle=Terms and Conditions +termsTitleHtml=Terms and Conditions +termsText=

    Terms and conditions to be defined

    + +recaptchaFailed=Invalid Recaptcha +recaptchaNotConfigured=Recaptcha is required, but not configured +consentDenied=Consent denied. + +noAccount=New user? +username=Username +usernameOrEmail=Username or email +firstName=First name +givenName=Given name +fullName=Full name +lastName=Last name +familyName=Family name +email=Email +password=Password +passwordConfirm=Confirm password +passwordNew=New Password +passwordNewConfirm=New Password confirmation +rememberMe=Remember me +authenticatorCode=One-time code +address=Address +street=Street +locality=City or Locality +region=State, Province, or Region +postal_code=Zip or Postal code +country=Country +emailVerified=Email verified +gssDelegationCredential=GSS Delegation Credential + +loginTotpStep1=Install one of the following applications on your mobile +loginTotpStep2=Open the application and scan the barcode +loginTotpStep3=Enter the one-time code provided by the application and click Submit to finish the setup +loginTotpManualStep2=Open the application and enter the key +loginTotpManualStep3=Use the following configuration values if the application allows setting them +loginTotpUnableToScan=Unable to scan? +loginTotpScanBarcode=Scan barcode? +loginTotpOneTime=One-time code +loginTotpType=Type +loginTotpAlgorithm=Algorithm +loginTotpDigits=Digits +loginTotpInterval=Interval + +loginTotp.totp=Time-based +loginTotp.hotp=Counter-based + + +oauthGrantRequest=Do you grant these access privileges? +inResource=in + +emailVerifyInstruction1=An email with instructions to verify your email address has been sent to you. +emailVerifyInstruction2=Haven''t received a verification code in your email? +emailVerifyInstruction3=to re-send the email. + +emailLinkIdpTitle=Link {0} +emailLinkIdp1=An email with instructions to link {0} account {1} with your "{2}" account has been sent to you. +emailLinkIdp2=Haven''t received a verification code in your email? +emailLinkIdp3=to re-send the email. +emailLinkIdp4=If you already verified the email in different browser +emailLinkIdp5=to continue. + +backToLogin=« Back to Login + +emailInstruction=Enter your username or email address and we will send you instructions on how to create a new password. + +copyCodeInstruction=Please copy this code and paste it into your application: + +pageExpiredTitle=Page has expired +pageExpiredMsg1=To restart the login process +pageExpiredMsg2=To continue the login process + +personalInfo=Personal Info: +role_admin=Admin +role_realm-admin=Realm Admin +role_create-realm=Create realm +role_create-client=Create client +role_view-realm=View realm +role_view-users=View users +role_view-applications=View applications +role_view-clients=View clients +role_view-events=View events +role_view-identity-providers=View identity providers +role_manage-realm=Manage realm +role_manage-users=Manage users +role_manage-applications=Manage applications +role_manage-identity-providers=Manage identity providers +role_manage-clients=Manage clients +role_manage-events=Manage events +role_view-profile=View profile +role_manage-account=Manage account +role_manage-account-links=Manage account links +role_read-token=Read token +role_offline-access=Offline access +client_account=Account +client_security-admin-console=Security Admin Console +client_admin-cli=Admin CLI +client_realm-management=Realm Management +client_broker=Broker + +invalidUserMessage=Invalid username or password. +invalidEmailMessage=Invalid email address. +accountDisabledMessage=Account is disabled, contact admin. +accountTemporarilyDisabledMessage=Account is temporarily disabled, contact admin or try again later. +expiredCodeMessage=Login timeout. Please login again. +expiredActionMessage=Action expired. Please continue with login now. +expiredActionTokenNoSessionMessage=Action expired. +expiredActionTokenSessionExistsMessage=Action expired. Please start again. + +missingFirstNameMessage=Please specify first name. +missingLastNameMessage=Please specify last name. +missingEmailMessage=Please specify email. +missingUsernameMessage=Please specify username. +missingPasswordMessage=Please specify password. +missingTotpMessage=Please specify authenticator code. +notMatchPasswordMessage=Passwords don''t match. + +invalidPasswordExistingMessage=Invalid existing password. +invalidPasswordBlacklistedMessage=Invalid password: password is blacklisted. +invalidPasswordConfirmMessage=Password confirmation doesn''t match. +invalidTotpMessage=Invalid authenticator code. + +usernameExistsMessage=Username already exists. +emailExistsMessage=Email already exists. + +federatedIdentityExistsMessage=User with {0} {1} already exists. Please login to account management to link the account. + +confirmLinkIdpTitle=Account already exists +federatedIdentityConfirmLinkMessage=User with {0} {1} already exists. How do you want to continue? +federatedIdentityConfirmReauthenticateMessage=Authenticate as {0} to link your account with {1} +confirmLinkIdpReviewProfile=Review profile +confirmLinkIdpContinue=Add to existing account + +configureTotpMessage=You need to set up Mobile Authenticator to activate your account. +updateProfileMessage=You need to update your user profile to activate your account. +updatePasswordMessage=You need to change your password to activate your account. +resetPasswordMessage=You need to change your password. +verifyEmailMessage=You need to verify your email address to activate your account. +linkIdpMessage=You need to verify your email address to link your account with {0}. + +emailSentMessage=You should receive an email shortly with further instructions. +emailSendErrorMessage=Failed to send email, please try again later. + +accountUpdatedMessage=Your account has been updated. +accountPasswordUpdatedMessage=Your password has been updated. + +noAccessMessage=No access + +invalidPasswordMinLengthMessage=Invalid password: minimum length {0}. +invalidPasswordMinDigitsMessage=Invalid password: must contain at least {0} numerical digits. +invalidPasswordMinLowerCaseCharsMessage=Invalid password: must contain at least {0} lower case characters. +invalidPasswordMinUpperCaseCharsMessage=Invalid password: must contain at least {0} upper case characters. +invalidPasswordMinSpecialCharsMessage=Invalid password: must contain at least {0} special characters. +invalidPasswordNotUsernameMessage=Invalid password: must not be equal to the username. +invalidPasswordRegexPatternMessage=Invalid password: fails to match regex pattern(s). +invalidPasswordHistoryMessage=Invalid password: must not be equal to any of last {0} passwords. +invalidPasswordGenericMessage=Invalid password: new password doesn''t match password policies. + +failedToProcessResponseMessage=Failed to process response +httpsRequiredMessage=HTTPS required +realmNotEnabledMessage=Realm not enabled +invalidRequestMessage=Invalid Request +failedLogout=Logout failed +unknownLoginRequesterMessage=Unknown login requester +loginRequesterNotEnabledMessage=Login requester not enabled +bearerOnlyMessage=Bearer-only applications are not allowed to initiate browser login +standardFlowDisabledMessage=Client is not allowed to initiate browser login with given response_type. Standard flow is disabled for the client. +implicitFlowDisabledMessage=Client is not allowed to initiate browser login with given response_type. Implicit flow is disabled for the client. +invalidRedirectUriMessage=Invalid redirect uri +unsupportedNameIdFormatMessage=Unsupported NameIDFormat +invalidRequesterMessage=Invalid requester +registrationNotAllowedMessage=Registration not allowed +resetCredentialNotAllowedMessage=Reset Credential not allowed + +permissionNotApprovedMessage=Permission not approved. +noRelayStateInResponseMessage=No relay state in response from identity provider. +insufficientPermissionMessage=Insufficient permissions to link identities. +couldNotProceedWithAuthenticationRequestMessage=Could not proceed with authentication request to identity provider. +couldNotObtainTokenMessage=Could not obtain token from identity provider. +unexpectedErrorRetrievingTokenMessage=Unexpected error when retrieving token from identity provider. +unexpectedErrorHandlingResponseMessage=Unexpected error when handling response from identity provider. +identityProviderAuthenticationFailedMessage=Authentication failed. Could not authenticate with identity provider. +identityProviderDifferentUserMessage=Authenticated as {0}, but expected to be authenticated as {1} +couldNotSendAuthenticationRequestMessage=Could not send authentication request to identity provider. +unexpectedErrorHandlingRequestMessage=Unexpected error when handling authentication request to identity provider. +invalidAccessCodeMessage=Invalid access code. +sessionNotActiveMessage=Session not active. +invalidCodeMessage=An error occurred, please login again through your application. +identityProviderUnexpectedErrorMessage=Unexpected error when authenticating with identity provider +identityProviderNotFoundMessage=Could not find an identity provider with the identifier. +identityProviderLinkSuccess=You successfully verified your email. Please go back to your original browser and continue there with the login. +staleCodeMessage=This page is no longer valid, please go back to your application and login again +realmSupportsNoCredentialsMessage=Realm does not support any credential type. +identityProviderNotUniqueMessage=Realm supports multiple identity providers. Could not determine which identity provider should be used to authenticate with. +emailVerifiedMessage=Your email address has been verified. +staleEmailVerificationLink=The link you clicked is a old stale link and is no longer valid. Maybe you have already verified your email? +identityProviderAlreadyLinkedMessage=Federated identity returned by {0} is already linked to another user. +confirmAccountLinking=Confirm linking the account {0} of identity provider {1} with your account. +confirmEmailAddressVerification=Confirm validity of e-mail address {0}. +confirmExecutionOfActions=Perform the following action(s) + +backToApplication=« Back to Application +missingParameterMessage=Missing parameters\: {0} +clientNotFoundMessage=Client not found. +clientDisabledMessage=Client disabled. +invalidParameterMessage=Invalid parameter\: {0} +alreadyLoggedIn=You are already logged in. +differentUserAuthenticated=You are already authenticated as different user ''{0}'' in this session. Please logout first. +brokerLinkingSessionExpired=Requested broker account linking, but current session is no longer valid. +proceedWithAction=» Click here to proceed + +requiredAction.CONFIGURE_TOTP=Configure OTP +requiredAction.terms_and_conditions=Terms and Conditions +requiredAction.UPDATE_PASSWORD=Update Password +requiredAction.UPDATE_PROFILE=Update Profile +requiredAction.VERIFY_EMAIL=Verify Email + +p3pPolicy=CP="This is not a P3P policy!" + +doX509Login=You will be logged in as\: +clientCertificate=X509 client certificate\: +noCertificate=[No Certificate] + + +pageNotFound=Page not found +internalServerError=An internal server error has occurred + +operationInfo=Action completed diff --git a/login/messages/messages_es.properties b/login/messages/messages_es.properties new file mode 100644 index 0000000..a2a40d4 --- /dev/null +++ b/login/messages/messages_es.properties @@ -0,0 +1,200 @@ +doLogIn=Iniciar sesi\u00F3n +doRegister=Reg\u00EDstrate +doCancel=Cancelar +doSubmit=Enviar +doYes=S\u00ED +doNo=No +doContinue=Continuar +doAccept=Aceptar +doDecline=Declinar +doForgotPassword=\u00BFHas olvidado tu contrase\u00F1a? +doClickHere=Haz clic aqu\u00ED +doImpersonate=Personificar +kerberosNotConfigured=Kerberos no configurado +kerberosNotConfiguredTitle=Kerberos no configurado +bypassKerberosDetail=O bien no est\u00E1s identificado mediante Kerberos o tu navegador no est\u00E1 configurado para identificarse mediante Kerberos. Por favor haz clic para identificarte por otro medio. +kerberosNotSetUp=Kerberos no est\u00E1 configurado. No puedes identificarte. +registerWithTitle=Reg\u00EDstrate con {0} +registerWithTitleHtml={0} +loginTitle=Inicia sesi\u00F3n en {0} +loginTitleHtml={0} +impersonateTitle={0}\u00A0Personificar Usuario +impersonateTitleHtml={0} Personificar Usuario +realmChoice=Dominio +unknownUser=Usuario desconocido +loginTotpTitle=Configura tu aplicaci\u00F3n de identificaci\u00F3n m\u00F3vil +loginProfileTitle=Actualiza la informaci\u00F3n de tu cuenta +loginTimeout=Has tardado demasiado en identificarte. Inicia de nuevo la identificaci\u00F3n. +oauthGrantTitle=Concesi\u00F3n OAuth +oauthGrantTitleHtml={0} +errorTitle=Lo sentimos... +errorTitleHtml=Lo sentimos... +emailVerifyTitle=Verificaci\u00F3n del email +emailForgotTitle=\u00BFHas olvidado tu contrase\u00F1a? +updatePasswordTitle=Modificaci\u00F3n de contrase\u00F1a +codeSuccessTitle=C\u00F3digo de \u00E9xito +codeErrorTitle=C\u00F3digo de error: {0} + +termsTitle=T\u00E9rminos y Condiciones +termsTitleHtml=T\u00E9rminos y Condiciones +termsText=

    T\u00E9rmines y condiciones a definir

    + +recaptchaFailed=Reconocimiento de texto inv\u00E1lido +recaptchaNotConfigured=El reconocimiento de texto es obligatorio pero no est\u00E1 configurado +consentDenied=Consentimiento rechazado. + +noAccount=\u00BFUsuario nuevo? +username=Usuario +usernameOrEmail=Usuario o email +firstName=Nombre +givenName=Nombre de pila +fullName=Nombre completo +lastName=Apellidos +familyName=Apellidos +email=Email +password=Contrase\u00F1a +passwordConfirm=Confirma la contrase\u00F1a +passwordNew=Nueva contrase\u00F1a +passwordNewConfirm=Confirma la nueva contrase\u00F1a +rememberMe=Seguir conectado +authenticatorCode=C\u00F3digo de identificaci\u00F3n +address=Direcci\u00F3n +street=Calle +locality=Ciudad o Municipio +region=Estado, Provincia, o Regi\u00F3n +postal_code=C\u00F3digo Postal +country=Pa\u00EDs +emailVerified=Email verificado +gssDelegationCredential=GSS Delegation Credential + +loginTotpStep1=Instala FreeOTP o Google Authenticator en tu tel\u00E9fono m\u00F3vil. Ambas aplicaciones est\u00E1n disponibles en Google Play y en la App Store de Apple. +loginTotpStep2=Abre la aplicacvi\u00F3n y escanea el c\u00F3digo o introduce la clave. +loginTotpStep3=Introduce el c\u00F3digo \u00FAnico que te muestra la aplicaci\u00F3n de autenticaci\u00F3n y haz clic en Enviar para finalizar la configuraci\u00F3n +loginTotpOneTime=C\u00F3digo de un solo uso + +oauthGrantRequest=\u00BFQuieres permitir estos privilegios de acceso? +inResource=en + +emailVerifyInstruction1=Te hemos enviado un email con instrucciones para verificar tu email. +emailVerifyInstruction2=\u00BFNo has recibido un c\u00F3digo de verificaci\u00F3n en tu email? +emailVerifyInstruction3=para reenviar el email. + +backToLogin=« Volver a la identificaci\u00F3n + +emailInstruction=Indica tu usuario o email y te enviaremos instruciones indicando como generar una nueva contrase\u00F1a. + +copyCodeInstruction=Por favor, copia y pega este c\u00F3digo en tu aplicaci\u00F3n: + +personalInfo=Informaci\u00F3n personal: +role_admin=Admin +role_realm-admin=Administrador del dominio +role_create-realm=Crear dominio +role_create-client=Crear cliente +role_view-realm=Ver dominio +role_view-users=Ver usuarios +role_view-applications=Ver aplicaciones +role_view-clients=Ver clientes +role_view-events=Ver eventos +role_view-identity-providers=Ver proveedores de identidad +role_manage-realm=Gestionar dominio +role_manage-users=Gestionar usuarios +role_manage-applications=Gestionar aplicaciones +role_manage-identity-providers=Gestionar proveedores de identidad +role_manage-clients=Gestionar clientes +role_manage-events=Gestionar eventos +role_view-profile=Ver perfil +role_manage-account=Gestionar cuenta +role_read-token=Leer token +role_offline-access=Acceso sin conexi\u00F3n +client_account=Cuenta +client_security-admin-console=Consola de Administraci\u00F3n de Seguridad +client_realm-management=Gesti\u00F3n del dominio +client_broker=Broker + +invalidUserMessage=Usuario o contrase\u00F1a incorrectos. +invalidEmailMessage=Email no v\u00E1lido +accountDisabledMessage=La cuenta est\u00E1 desactivada, contacta con el administrador. +accountTemporarilyDisabledMessage=La cuenta est\u00E1 temporalmente desactivada, contacta con el administrador o int\u00E9ntalo de nuevo m\u00E1s tarde. +expiredCodeMessage=Se agot\u00F3 el tiempo m\u00E1ximo para la identificaci\u00F3n. Por favor identificate de nuevo. + +missingFirstNameMessage=Por favor indica tu nombre. +missingLastNameMessage=Por favor indica tus apellidos. +missingEmailMessage=Por favor indica tu email. +missingUsernameMessage=Por favor indica tu usuario. +missingPasswordMessage=Por favor indica tu contrase\u00F1a. +missingTotpMessage=Por favor indica tu c\u00F3digo de autenticaci\u00F3n +notMatchPasswordMessage=Las contrase\u00F1as no coinciden. + +invalidPasswordExistingMessage=La contrase\u00F1a actual no es correcta. +invalidPasswordConfirmMessage=La confirmaci\u00F3n de contrase\u00F1a no coincide. +invalidTotpMessage=El c\u00F3digo de autenticaci\u00F3n no es v\u00E1lido. + +usernameExistsMessage=El nombre de usuario ya existe +emailExistsMessage=El email ya existe + +federatedIdentityEmailExistsMessage=Ya existe un usuario con este email. Por favor accede a la gesti\u00F3n de tu cuenta para enlazarlo. +federatedIdentityUsernameExistsMessage=Ya existe un usuario con este nombre de usuario. Por favor accede a la gesti\u00F3n de tu cuenta para enlazarlo. + +configureTotpMessage=Tienes que configurar la aplicaci\u00F3n m\u00F3vil de identificaci\u00F3n para activar tu cuenta. +updateProfileMessage=Tienes que actualizar tu perfil de usuario para activar tu cuenta. +updatePasswordMessage=Tienes que cambiar tu contrase\u00F1a para activar tu cuenta. +verifyEmailMessage=Tienes que verificar tu email para activar tu cuenta. + +emailSentMessage=En breve deber\u00EDas recibir un mensaje con m\u00E1s instrucciones +emailSendErrorMessage=Fall\u00F3 el env\u00EDo del email, por favor int\u00E9ntalo de nuevo m\u00E1s tarde. + +accountUpdatedMessage=Tu cuenta se ha actualizado. +accountPasswordUpdatedMessage=Tu contrase\u00F1a se ha actualizado. + +noAccessMessage=Sin acceso + +invalidPasswordMinLengthMessage=Contrase\u00F1a incorrecta: longitud m\u00EDnima {0}. +invalidPasswordMinDigitsMessage=Contrase\u00F1a incorrecta: debe contaner al menos {0} caracteres num\u00E9ricos. +invalidPasswordMinLowerCaseCharsMessage=Contrase\u00F1a incorrecta: debe contener al menos {0} letras min\u00FAsculas. +invalidPasswordMinUpperCaseCharsMessage=Contrase\u00F1a incorrecta: debe contener al menos {0} letras may\u00FAsculas. +invalidPasswordMinSpecialCharsMessage=Contrase\u00F1a incorrecta: debe contener al menos {0} caracteres especiales. +invalidPasswordNotUsernameMessage=Contrase\u00F1a incorrecta: no puede ser igual al nombre de usuario. +invalidPasswordRegexPatternMessage=Contrase\u00F1a incorrecta: no cumple la expresi\u00F3n regular. +invalidPasswordHistoryMessage=Contrase\u00F1a incorrecta: no puede ser igual a ninguna de las \u00FAltimas {0} contrase\u00F1as. + +failedToProcessResponseMessage=Fallo al procesar la respuesta +httpsRequiredMessage=HTTPS obligatorio +realmNotEnabledMessage=El dominio no est\u00E1 activado +invalidRequestMessage=Petici\u00F3n incorrecta +failedLogout=Fall\u00F3 la desconexi\u00F3n. +unknownLoginRequesterMessage=Solicitante de identificaci\u00F3n desconocido +loginRequesterNotEnabledMessage=El solicitante de inicio de sesi\u00F3n est\u00E1 desactivado +bearerOnlyMessage=Las aplicaciones Bearer-only no pueden iniciar sesi\u00F3n desde el navegador. +directGrantsOnlyMessage=Los clientes de tipo Direct-grants-only no pueden iniciar sesi\u00F3n desde el navegador. +invalidRedirectUriMessage=La URI de redirecci\u00F3n no es correcta +unsupportedNameIdFormatMessage=NameIDFormat no soportado +invalidRequesterMessage=Solicitante no v\u00E1lido +registrationNotAllowedMessage=El registro no est\u00E1 permitido +resetCredentialNotAllowedMessage=El renicio de las credenciales no est\u00E1 permitido + +permissionNotApprovedMessage=Permiso no aprobado. +noRelayStateInResponseMessage=Sin estado de retransmisi\u00F3n en la respuesta del proveedor de identidad. +identityProviderAlreadyLinkedMessage=La identidad devuelta por el proveedor de identidad ya est\u00E1 asociada a otro usuario. +insufficientPermissionMessage=Permisos insuficientes para enlazar identidades. +couldNotProceedWithAuthenticationRequestMessage=No se pudo continuar con la petici\u00F3n de autenticaci\u00F3n al proveedor de identidad. +couldNotObtainTokenMessage=.No se pudo obtener el c\u00F3digo del proveedor de identidad +unexpectedErrorRetrievingTokenMessage=Error inesperado obteniendo el token del proveedor de identidad +unexpectedErrorHandlingResponseMessage=Error inesperado procesando la respuesta del proveedor de identidad. +identityProviderAuthenticationFailedMessage=Fall\u00F3 la autenticaci\u00F3n. No fue posible autenticarse en el proveedor de identidad. +couldNotSendAuthenticationRequestMessage=No se pudo enviar la petici\u00F3n de identificaci\u00F3n al proveedor de identidad. +unexpectedErrorHandlingRequestMessage=Error inesperado durante la petici\u00F3n de identificaci\u00F3n al proveedor de identidad. +invalidAccessCodeMessage=C\u00F3digo de acceso no v\u00E1lido. +sessionNotActiveMessage=La sesi\u00F3n no est\u00E1 activa +invalidCodeMessage=Ha ocurrido un error, por favor identificate de nuevo desde tu aplicaci\u00F3n. +identityProviderUnexpectedErrorMessage=Error no esperado intentado autenticar en el proveedor de identidad. +identityProviderNotFoundMessage=No se encontr\u00F3 un proveedor de identidad. +realmSupportsNoCredentialsMessage=El dominio no soporta ning\u00FAn tipo de credenciales. +identityProviderNotUniqueMessage=El dominio soporta m\u00FAltiples proveedores de identidad. No se pudo determinar el proveedor de identidad que deber\u00EDa ser utilizado para identificarse. +emailVerifiedMessage=Tu email ha sido verificado. + +backToApplication=« Volver a la aplicaci\u00F3n +missingParameterMessage=Par\u00E1metros que faltan: {0} +clientNotFoundMessage=Cliente no encontrado +invalidParameterMessage=Par\u00E1metro no v\u00E1lido: {0} +alreadyLoggedIn=You are already logged in. + diff --git a/login/messages/messages_fr.properties b/login/messages/messages_fr.properties new file mode 100644 index 0000000..f1d4254 --- /dev/null +++ b/login/messages/messages_fr.properties @@ -0,0 +1,214 @@ +doLogIn=Connexion +doRegister=Enregistrement +doCancel=Annuler +doSubmit=Soumettre +doYes=Oui +doNo=Non +doContinue=Continuer +doAccept=Accepter +doDecline=D\u00e9cliner +doForgotPassword=Mot de passe oubli\u00e9 ? +doClickHere=Cliquez ici +doImpersonate=Impersonate +kerberosNotConfigured=Kerberos non configur\u00e9 +kerberosNotConfiguredTitle=Kerberos non configur\u00e9 +bypassKerberosDetail=Si vous n''\u00eates pas connect\u00e9 via Kerberos ou bien que votre navigateur n''est pas configur\u00e9 pour la connexion via Kerberos. Veuillez cliquer pour vous connecter via un autre moyen. +kerberosNotSetUp=Kerberos n''est pas configur\u00e9. Connexion impossible. +registerWithTitle=Enregistrement avec {0} +registerWithTitleHtml={0} +loginTitle=Se connecter \u00e0 {0} +loginTitleHtml={0} +impersonateTitle={0} utilisateur impersonate +impersonateTitleHtml={0} utilisateur impersonate +realmChoice=Domaine +unknownUser=Utilisateur inconnu +loginTotpTitle=Configuration de l''authentification par mobile +loginProfileTitle=Mise \u00e0 jour du compte +loginTimeout=Le temps imparti pour la connexion est \u00e9coul\u00e9. Le processus de connexion red\u00e9marre depuis le d\u00e9but. +oauthGrantTitle=OAuth Grant +oauthGrantTitleHtml={0} +errorTitle=Nous sommes d\u00e9sol\u00e9s... +errorTitleHtml=Nous sommes d\u00e9sol\u00e9s... +emailVerifyTitle=V\u00e9rification du courriel +emailForgotTitle=Mot de passe oubli\u00e9 ? +updatePasswordTitle=Mise \u00e0 jour du mot de passe +codeSuccessTitle=Code succ\u00e8s +codeErrorTitle=Code d''erreur \: {0} + +termsTitle=Termes et Conditions +termsTitleHtml=Termes et Conditions +termsText=

    Termes et conditions \u00e0 d\u00e9finir

    + +recaptchaFailed=Re-captcha invalide +recaptchaNotConfigured=Re-captcha est requis, mais il n''est pas configur\u00e9 +consentDenied=Consentement refus\u00e9. + +noAccount=Nouvel utilisateur ? +username=Nom d''utilisateur +usernameOrEmail=Nom d''utilisateur ou courriel +firstName=Pr\u00e9nom +givenName=Pr\u00e9nom +fullName=Nom complet +lastName=Nom +familyName=Nom de famille +email=Courriel +password=Mot de passe +passwordConfirm=Confirmation du mot de passe +passwordNew=Nouveau mot de passe +passwordNewConfirm=Confirmation du nouveau mot de passe +rememberMe=Se souvenir de moi +authenticatorCode=Code \u00e0 usage unique +address=Adresse +street=Rue +locality=Ville ou Localit\u00e9 +region=\u00c9tat, Province ou R\u00e9gion +postal_code=Code postal +country=Pays +emailVerified=Courriel v\u00e9rifi\u00e9 +gssDelegationCredential=Accr\u00e9ditation de d\u00e9l\u00e9gation GSS + +loginTotpStep1=Installez FreeOTP ou bien Google Authenticator sur votre mobile. Ces deux applications sont disponibles sur Google Play et Apple App Store. +loginTotpStep2=Ouvrez l''application et scannez le code-barres ou entrez la clef. +loginTotpStep3=Entrez le code \u00e0 usage unique fourni par l''application et cliquez sur Sauvegarder pour terminer. +loginTotpOneTime=Code \u00e0 usage unique + +oauthGrantRequest=Voulez-vous accorder ces privil\u00e8ges d''acc\u00e8s ? +inResource=dans + +emailVerifyInstruction1=Un courriel avec des instructions \u00e0 suivre vous a \u00e9t\u00e9 envoy\u00e9. +emailVerifyInstruction2=Vous n''avez pas re\u00e7u de code dans le courriel ? +emailVerifyInstruction3=pour renvoyer le courriel. + +emailLinkIdpTitle=Association avec {0} +emailLinkIdp1=Un courriel avec des instructions pour associer le compte {1} sur {0} avec votre compte {2} vous a \u00e9t\u00e9 envoy\u00e9. +emailLinkIdp2=Vous n''avez pas re\u00e7u de code dans le courriel ? +emailLinkIdp3=pour renvoyer le courriel. + +backToLogin=« Retour \u00e0 la connexion + +emailInstruction=Entrez votre nom d''utilisateur ou votre courriel ; un courriel va vous \u00eatre envoy\u00e9 vous permettant de cr\u00e9er un nouveau mot de passe. + +copyCodeInstruction=Copiez le code et recopiez le dans votre application : + +personalInfo=Information personnelle : +role_admin=Administrateur +role_realm-admin=Administrateur du domaine +role_create-realm=Cr\u00e9er un domaine +role_create-client=Cr\u00e9er un client +role_view-realm=Voir un domaine +role_view-users=Voir les utilisateurs +role_view-applications=Voir les applications +role_view-clients=Voir les clients +role_view-events=Voir les \u00e9v\u00e9nements +role_view-identity-providers=Voir les fournisseurs d''identit\u00e9 +role_manage-realm=G\u00e9rer le domaine +role_manage-users=G\u00e9rer les utilisateurs +role_manage-applications=G\u00e9rer les applications +role_manage-identity-providers=G\u00e9rer les fournisseurs d''identit\u00e9 +role_manage-clients=G\u00e9rer les clients +role_manage-events=G\u00e9rer les \u00e9v\u00e9nements +role_view-profile=Voir le profil +role_manage-account=G\u00e9rer le compte +role_read-token=Lire le jeton d''authentification +role_offline-access=Acc\u00e8s hors-ligne +client_account=Compte +client_security-admin-console=Console d''administration de la s\u00e9curit\u00e9 +client_admin-cli=Admin CLI +client_realm-management=Gestion du domaine +client_broker=Broker + +invalidUserMessage=Nom d''utilisateur ou mot de passe invalide. +invalidEmailMessage=Courriel invalide. +accountDisabledMessage=Compte d\u00e9sactiv\u00e9, contactez votre administrateur. +accountTemporarilyDisabledMessage=Ce compte est temporairement d\u00e9sactiv\u00e9, contactez votre administrateur ou bien r\u00e9essayez plus tard. +expiredCodeMessage=Connexion expir\u00e9e. Veuillez vous reconnecter. + +missingFirstNameMessage=Veuillez entrer votre pr\u00e9nom. +missingLastNameMessage=Veuillez entrer votre nom. +missingEmailMessage=Veuillez entrer votre courriel. +missingUsernameMessage=Veuillez entrer votre nom d''utilisateur. +missingPasswordMessage=Veuillez entrer votre mot de passe. +missingTotpMessage=Veuillez entrer votre code d''authentification. +notMatchPasswordMessage=Les mots de passe ne sont pas identiques. + +invalidPasswordExistingMessage=Mot de passe existant invalide. +invalidPasswordConfirmMessage=Le mot de passe de confirmation ne correspond pas. +invalidTotpMessage=Le code d''authentification est invalide. + +usernameExistsMessage=Le nom d''utilisateur existe d\u00e9j\u00e0. +emailExistsMessage=Le courriel existe d\u00e9j\u00e0. + +federatedIdentityEmailExistsMessage=Cet utilisateur avec ce courriel existe d\u00e9j\u00e0. Veuillez vous connecter au gestionnaire de compte pour lier le compte. + +confirmLinkIdpTitle=Ce compte existe d\u00e9j\u00e0 +federatedIdentityConfirmLinkMessage=L''utilisateur {0} {1} existe d\u00e9j\u00e0. Que souhaitez-vous faire ? +federatedIdentityConfirmReauthenticateMessage=Identifiez vous en tant que {0} afin de lier votre compte avec {1} +confirmLinkIdpReviewProfile=V\u00e9rifiez vos informations de profil +confirmLinkIdpContinue=Souhaitez-vous lier {0} \u00e0 votre compte existant + +configureTotpMessage=Vous devez configurer l''authentification par mobile pour activer votre compte. +updateProfileMessage=Vous devez mettre \u00e0 jour votre profil pour activer votre compte. +updatePasswordMessage=Vous devez changer votre mot de passe pour activer votre compte. +verifyEmailMessage=Vous devez v\u00e9rifier votre courriel pour activer votre compte. +linkIdpMessage=Vous devez v\u00e9rifier votre courriel pour lier votre compte avec {0}. + +emailSentMessage=Vous devriez recevoir rapidement un courriel avec de plus amples instructions. +emailSendErrorMessage=Erreur lors de l''envoi du courriel, veuillez essayer plus tard. + +accountUpdatedMessage=Votre compte a \u00e9t\u00e9 mis \u00e0 jour. +accountPasswordUpdatedMessage=Votre mot de passe a \u00e9t\u00e9 mis \u00e0 jour. + +noAccessMessage=Aucun acc\u00e8s + +invalidPasswordMinLengthMessage=Mot de passe invalide : longueur minimale requise de {0}. +invalidPasswordMinDigitsMessage=Mot de passe invalide : doit contenir au moins {0} chiffre(s). +invalidPasswordMinLowerCaseCharsMessage=Mot de passe invalide : doit contenir au moins {0} lettre(s) en minuscule. +invalidPasswordMinUpperCaseCharsMessage=Mot de passe invalide : doit contenir au moins {0} lettre(s) en majuscule. +invalidPasswordMinSpecialCharsMessage=Mot de passe invalide : doit contenir au moins {0} caract\u00e8re(s) sp\u00e9ciaux. +invalidPasswordNotUsernameMessage=Mot de passe invalide : ne doit pas \u00eatre identique au nom d''utilisateur. +invalidPasswordRegexPatternMessage=Mot de passe invalide : ne valide pas l''expression rationnelle. +invalidPasswordHistoryMessage=Mot de passe invalide : ne doit pas \u00eatre \u00e9gal aux {0} derniers mots de passe. + +failedToProcessResponseMessage=Erreur lors du traitement de la r\u00e9ponse +httpsRequiredMessage=Le protocole HTTPS est requis +realmNotEnabledMessage=Le domaine n''est pas activ\u00e9 +invalidRequestMessage=Requ\u00eate invalide +failedLogout=La d\u00e9connexion a \u00e9chou\u00e9e +unknownLoginRequesterMessage=Compte inconnu du demandeur +loginRequesterNotEnabledMessage=La connexion du demandeur n''est pas active +bearerOnlyMessage=Les applications Bearer-only ne sont pas autoris\u00e9es \u00e0 initier la connexion par navigateur. +standardFlowDisabledMessage=Le client n''est pas autoris\u00e9 \u00e0 initier une connexion avec le navigateur avec ce response_type. Le flux standard est d\u00e9sactiv\u00e9 pour le client. +implicitFlowDisabledMessage=Le client n''est pas autoris\u00e9 \u00e0 initier une connexion avec le navigateur avec ce response_type. Le flux implicite est d\u00e9sactiv\u00e9 pour le client. +invalidRedirectUriMessage=L''URI de redirection est invalide +unsupportedNameIdFormatMessage=NameIDFormat non support\u00e9 +invalidRequesterMessage=Demandeur invalide +registrationNotAllowedMessage=L''enregistrement n''est pas autoris\u00e9 +resetCredentialNotAllowedMessage=La remise \u00e0 z\u00e9ro n''est pas autoris\u00e9e + +permissionNotApprovedMessage=La permission n''est pas approuv\u00e9e. +noRelayStateInResponseMessage=Aucun \u00e9tat de relais dans la r\u00e9ponse du fournisseur d''identit\u00e9. +insufficientPermissionMessage=Permissions insuffisantes pour lier les identit\u00e9s. +couldNotProceedWithAuthenticationRequestMessage=Impossible de continuer avec la requ\u00eate d''authentification vers le fournisseur d''identit\u00e9. +couldNotObtainTokenMessage=Impossible de r\u00e9cup\u00e9rer le jeton du fournisseur d''identit\u00e9. +unexpectedErrorRetrievingTokenMessage=Erreur inattendue lors de la r\u00e9cup\u00e9ration du jeton provenant du fournisseur d''identit\u00e9. +unexpectedErrorHandlingResponseMessage=Erreur inattendue lors du traitement de la r\u00e9ponse provenant du fournisseur d''identit\u00e9. +identityProviderAuthenticationFailedMessage=L''authentification a \u00e9chou\u00e9e. Impossible de s''authentifier avec le fournisseur d''identit\u00e9. +identityProviderDifferentUserMessage=Authentifi\u00e9 en tant que {0}, alors que l''authentification aurait du \u00eatre {1} +couldNotSendAuthenticationRequestMessage=Impossible d''envoyer la requ\u00eate d''authentification vers le fournisseur d''identit\u00e9. +unexpectedErrorHandlingRequestMessage=Erreur inattendue lors du traitement de la requ\u00eate vers le fournisseur d''identit\u00e9. +invalidAccessCodeMessage=Code d''acc\u00e8s invalide. +sessionNotActiveMessage=La session n''est pas active. +invalidCodeMessage=Une erreur est survenue, veuillez vous reconnecter \u00e0 votre application. +identityProviderUnexpectedErrorMessage=Erreur inattendue lors de l''authentification avec fournisseur d''identit\u00e9. +identityProviderNotFoundMessage=Impossible de trouver le fournisseur d''identit\u00e9 avec cet identifiant. +identityProviderLinkSuccess=Votre compte a \u00e9t\u00e9 correctement li\u00e9 avec {0} compte {1} . +realmSupportsNoCredentialsMessage=Ce domaine ne supporte aucun type d''accr\u00e9ditation. +identityProviderNotUniqueMessage=Ce domaine autorise plusieurs fournisseurs d''identit\u00e9. Impossible de d\u00e9terminer le fournisseur d''identit\u00e9 avec lequel s''authentifier. +emailVerifiedMessage=Votre courriel a \u00e9t\u00e9 v\u00e9rifi\u00e9. + +backToApplication=« Revenir \u00e0 l''application +missingParameterMessage=Param\u00e8tres manquants \: {0} +clientNotFoundMessage=Client inconnu. +invalidParameterMessage=Param\u00e8tre invalide \: {0} +alreadyLoggedIn=Vous \u00eates d\u00e9j\u00e0 connect\u00e9. + diff --git a/login/messages/messages_it.properties b/login/messages/messages_it.properties new file mode 100644 index 0000000..92c6355 --- /dev/null +++ b/login/messages/messages_it.properties @@ -0,0 +1,216 @@ +doLogIn=Accedi +doRegister=Registrati +doCancel=Annulla +doSubmit=Invia +doYes=S\u00ec +doNo=No +doContinue=Continua +doAccept=Accetta +doDecline=Nega +doForgotPassword=Password dimenticata? +doClickHere=Clicca qui +doImpersonate=Impersonate +kerberosNotConfigured=Kerberos non configurato +kerberosNotConfiguredTitle=Kerberos non configurato +bypassKerberosDetail=O non sei connesso via Kerberos o il tuo browser non supporta l''autenticazione a Kerberos. Fai clic su Continua per accedere in modo alternativo +kerberosNotSetUp=Kerberos non \u00e8 configurato. Non puoi effettuare l''accesso. +registerWithTitle=Registrati con {0} +registerWithTitleHtml={0} +loginTitle=Accedi a {0} +loginTitleHtml={0} +impersonateTitle={0} Impersonate Utente +impersonateTitleHtml={0} Impersonate Utente +realmChoice=Realm +unknownUser=Utente Sconosciuto +loginTotpTitle=Configura Autenticazione Mobile +loginProfileTitle=Aggiorna Profilo +loginTimeout=Stai impiegando troppo tempo per accedere. Il processo di autenticazione verr\u00e0 riniziato di nuovo. +oauthGrantTitle=Autenticazione concessa +oauthGrantTitleHtml={0} +errorTitle=Siamo spiacenti\u2026 +errorTitleHtml=Siamo spiacenti ... +emailVerifyTitle=Verifica l''email +emailForgotTitle=Password Dimenticata? +updatePasswordTitle=Aggiorna password +codeSuccessTitle=Codice di successo +codeErrorTitle=Codice di errore\: {0} + +recaptchaFailed=Recaptcha non valido +recaptchaNotConfigured=Il Recaptcha \u00e8 obbligatorio, ma non configurato +consentDenied=Permesso negato. + +noAccount=Nuovo utente? +username=Username +usernameOrEmail=Username o email +firstName=Nome +givenName=Nome +fullName=Nome completo +lastName=Cognome +familyName=Cognome +email=Email +password=Password +passwordConfirm=Conferma password +passwordNew=Nuova Password +passwordNewConfirm=Conferma nuova password +rememberMe=Ricordami +authenticatorCode=Codice One-time +address=Indirizzo +street=Via +locality=Citt\u00e0 o Localit\u00e0 +region=Stato, Provincia, o Regione +postal_code=Cap +country=Paese +emailVerified=Email verificata +gssDelegationCredential=Credenziali GSS Delegation + +loginTotpStep1=Installa FreeOTP or Google Authenticator sul tuo dispositivo mobile +loginTotpStep2=Apri l''applicazione e scansione il barcode o scrivi la chiave +loginTotpStep3=Scrivi il codice one-time fornito dall''applicazione e premi Invia per finire il setup +loginTotpOneTime=Codice one-time + +oauthGrantRequest=Vuoi assegnare questi privilegi di accesso? +inResource=per + +emailVerifyInstruction1=Ti \u00e8 stata inviata una email con le istruzioni per la verifica della tua email. +emailVerifyInstruction2=Non hai ricevuto un codice di verifica nella tua email? +emailVerifyInstruction3=per rinviare la email. + +emailLinkIdpTitle=Link {0} +emailLinkIdp1=Ti \u00e8 stata inviata una email con le istruzioni per associare {0} l''account {1} con il tuo {2} account. +emailLinkIdp2=Non hai ricevuto un codice di verifica nella tua email? +emailLinkIdp3=Per rinviare la email. + +backToLogin=« Torna al Login + +emailInstruction=Inserisci la tua username o l''indirizzo email e ti manderemo le istruzioni per creare una nuova password. + +copyCodeInstruction=Copia questo codice e incollalo nella tua applicazione: + +personalInfo=Informazioni personali: +role_admin=Admin +role_realm-admin=Realm Admin +role_create-realm=Crea realm +role_create-client=Crea client +role_view-realm=Visualizza realm +role_view-users=Visualizza utenti +role_view-applications=Visualizza applicazioni +role_view-clients=Visualizza clients +role_view-events=Visualizza eventi +role_view-identity-providers=Visualizza identity providers +role_manage-realm=Gestisci realm +role_manage-users=Gestisci utenti +role_manage-applications=Gestisci applicazioni +role_manage-identity-providers=Gestisci identity providers +role_manage-clients=Gestisci clients +role_manage-events=Gestisci eventi +role_view-profile=Visualizza profilo +role_manage-account=Gestisci account +role_read-token=Leggi il token +role_offline-access=Accesso offline +client_account=Account +client_security-admin-console=Security Admin Console +client_admin-cli=Admin CLI +client_realm-management=Realm Management +client_broker=Broker + +invalidUserMessage=Username o password non valida. +invalidEmailMessage=Indirizzo email non valido. +accountDisabledMessage=L''account \u00e8 stato disabilitato, contatta l''amministratore. +accountTemporarilyDisabledMessage=L''account \u00e8 stato temporaneamente disabilitato, contatta l''amministratore o riprova pi\u00f9 tardi. +expiredCodeMessage=Login scaduto. Effettua nuovamente l''accesso. + +missingFirstNameMessage=Inserisci nome. +missingLastNameMessage=Inserisci cognome. +missingEmailMessage=Inserisci email. +missingUsernameMessage=Inserisci username. +missingPasswordMessage=Inserisci password. +missingTotpMessage=Inserisci codice di autenticazione. +notMatchPasswordMessage=Le password non coincidono. + +invalidPasswordExistingMessage=Password esistente non valida. +invalidPasswordConfirmMessage=La password di conferma non coincide. +invalidTotpMessage=Codice di autenticazione invalido. + +usernameExistsMessage=Username gi\u00e0 esistente. +emailExistsMessage=Email gi\u00e0 esistente. + +federatedIdentityExistsMessage=L''utente con {0} {1} esiste gi\u00e0. Effettua il login nella gestione account per associare l''account. + +confirmLinkIdpTitle=Account gi\u00e0 esistente +federatedIdentityConfirmLinkMessage=L''utente con {0} {1} esiste gi\u00e0. Come vuoi procedere? +federatedIdentityConfirmReauthenticateMessage=Autenticati come {0} per associare il tuo account con {1} +confirmLinkIdpReviewProfile=Rivedi profilo +confirmLinkIdpContinue=Aggiungi all''account esistente + +configureTotpMessage=Devi impostare un Mobile Authenticator per attivare il tuo account. +updateProfileMessage=Devi aggiornare il tuo profilo utente per attivare il tuo account. +updatePasswordMessage=Devi cambiare la password per attivare il tuo account. +verifyEmailMessage=Devi verificare il tuo indirizzo email per attivare il tuo account. +linkIdpMessage=Devi verificare il tuo indirizzo email per associare il tuo account con {0}. + +emailSentMessage=Riceverai a breve una email con maggiori istruzioni. +emailSendErrorMessage=Invio email fallito, riprova pi\u00f9 tardi. + +accountUpdatedMessage=Il tuo account \u00e8 stato aggiornato. +accountPasswordUpdatedMessage=La tua password \u00e8 stata aggiornata. + +noAccessMessage=Nessun accesso + +invalidPasswordMinLengthMessage=Password non valida: lunghezza minima {0}. +invalidPasswordMinDigitsMessage=Password non valida: deve contenere almeno {0} numeri. +invalidPasswordMinLowerCaseCharsMessage=Password non valida: deve contenere almeno {0} caratteri minuscoli. +invalidPasswordMinUpperCaseCharsMessage= Password non valida: deve contenere almeno {0} caratteri maiuscoli. +invalidPasswordMinSpecialCharsMessage= Password non valida: deve contenere almeno {0} caratteri speciali. +invalidPasswordNotUsernameMessage=Password non valida: non deve essere uguale alla username. +invalidPasswordRegexPatternMessage=Password non valida: fallito il match con una o pi\u00f9 espressioni regolari. +invalidPasswordHistoryMessage=Password non valida: non deve essere uguale ad una delle ultime {0} password. +invalidPasswordGenericMessage=Password non valida: la nuova password non rispetta le indicazioni previste. + +failedToProcessResponseMessage=Fallimento nell''elaborazione della risposta +httpsRequiredMessage=HTTPS richiesto +realmNotEnabledMessage=Realm non abilitato +invalidRequestMessage=Richiesta non valida +failedLogout=Logout fallito +unknownLoginRequesterMessage=Richiedente di Login non riconosciuto +loginRequesterNotEnabledMessage=Richiedente di Login non abilitato +bearerOnlyMessage=Alle applicazioni di tipo Bearer-only non \u00e8 consentito di effettuare il login tramite browser +standardFlowDisabledMessage=Al Client non \u00e8 consentito di effettuare il login tramite browser con dato response_type. Standard flow \u00e8 stato disabilitato per il client. +implicitFlowDisabledMessage=Al Client non \u00e8 consentito di effettuare il login tramite browser con dato response_type. Implicit flow \u00e8 stato disabilitato per il client. +invalidRedirectUriMessage=Redirect uri non valido +unsupportedNameIdFormatMessage=NameIDFormat non supportato +invalidRequesterMessage=Richiedente non valido +registrationNotAllowedMessage=Registrazione non permessa +resetCredentialNotAllowedMessage=Reimpostazione della credenziale non permessa + +permissionNotApprovedMessage=Permesso non approvato. +noRelayStateInResponseMessage=Nessun relay state in risposta dall''identity provider. +identityProviderAlreadyLinkedMessage=L''identita'' restituita dall''identity provider e'' gia'' associata ad un altro utente. +insufficientPermissionMessage=Permessi insufficienti per associare le identit\u00e0. +couldNotProceedWithAuthenticationRequestMessage=Impossibile procedere con la richiesta di autenticazione all''identity provider +couldNotObtainTokenMessage=Non posso ottenere un token dall''identity provider. +unexpectedErrorRetrievingTokenMessage=Errore inaspettato nel recupero del token dall''identity provider. +unexpectedErrorHandlingResponseMessage=Errore inaspettato nella gestione della risposta dall''identity provider. +identityProviderAuthenticationFailedMessage=Autenticazione fallita. Non posso effettuare l''autenticazione con l''identity provider. +identityProviderDifferentUserMessage=Autenticato come {0}, ma previsto per essere autenticato come {1} +couldNotSendAuthenticationRequestMessage=Impossibile inviare la richiesta di autenticazione all''identity provider. +unexpectedErrorHandlingRequestMessage=Errore inaspettato nella gestione della richiesta di autenticazione all''identity provider. +invalidAccessCodeMessage=Codice di accesso non valido. +sessionNotActiveMessage=Sessione non attiva. +invalidCodeMessage=Si \u00e8 verificato un errore, effettua di nuovo il login nella tua applicazione. +identityProviderUnexpectedErrorMessage=Errore imprevisto durante l''autenticazione con identity provider +identityProviderNotFoundMessage=Non posso trovare un identity provider con l''identificativo. +identityProviderLinkSuccess=Il tuo account \u00e8 stato associato con successo con {0} l''account {1} . +staleCodeMessage=Questa pagina non \u00e8 pi\u00f9 valida, torna alla tua applicazione ed effettua nuovamente l''accesso +realmSupportsNoCredentialsMessage=Il Realm non supporta nessun tipo di credenziali. +identityProviderNotUniqueMessage=Il Realm supporta pi\u00f9 di un identity provider. Impossibile determinare quale identity provider deve essere utilizzato per autenticarti. +emailVerifiedMessage=Il tuo indirizzo email \u00e8 stato verificato. +staleEmailVerificationLink=Il link che hai cliccato \u00e8 un link scaduto e non \u00e8 pi\u00f9 valido. Forse hai gi\u00e0 verificato la tua email? + +backToApplication=« Torna all''applicazione +missingParameterMessage=Parametri mancanti\: {0} +clientNotFoundMessage=Client non trovato. +clientDisabledMessage=Client disabilitato. +invalidParameterMessage=Parametro non valido\: {0} +alreadyLoggedIn=Sei gi\u00e0 connesso. + +p3pPolicy=CP="Questa non \u00e8 una P3P policy!" diff --git a/login/messages/messages_ja.properties b/login/messages/messages_ja.properties new file mode 100644 index 0000000..7a293d4 --- /dev/null +++ b/login/messages/messages_ja.properties @@ -0,0 +1,218 @@ +# encoding: utf-8 +doLogIn=ログイン +doRegister=登録 +doCancel=キャンセル +doSubmit=送信 +doYes=はい +doNo=いいえ +doContinue=続ける +doAccept=承諾 +doDecline=却下 +doForgotPassword=パスワードをお忘れですか? +doClickHere=クリックしてください +doImpersonate=代理ログイン +kerberosNotConfigured=Kerberos は設定されていません +kerberosNotConfiguredTitle=Kerberos は設定されていません +bypassKerberosDetail=Kerberos 経由でログインしていないか、ブラウザーで Kerberos ログインの設定がされていません。他の手段でログインするには 「続ける」 をクリックしてください。 +kerberosNotSetUp=Kerberos が設定されていません。ログインできません。 +registerWithTitle={0} で登録 +registerWithTitleHtml={0} +loginTitle={0} にログイン +loginTitleHtml={0} +impersonateTitle={0} ユーザーの代理 +impersonateTitleHtml={0} ユーザーの代理 +realmChoice=レルム +unknownUser=不明なユーザー +loginTotpTitle=モバイル Authenticator セットアップ +loginProfileTitle=アカウント情報の更新 +loginTimeout=ログインに時間がかかりすぎています。最初からログイン処理を開始します。 +oauthGrantTitle=Grant アクセス +oauthGrantTitleHtml={0} +errorTitle=申し訳ございません +errorTitleHtml=申し訳ございません +emailVerifyTitle=Eメール確認 +emailForgotTitle=パスワードをお忘れですか? +updatePasswordTitle=パスワード更新 +codeSuccessTitle=成功コード +codeErrorTitle=エラーコード\: {0} + +termsTitle=利用規約 +termsTitleHtml=利用規約 +termsText=

    利用規約はここで設定する必要があります

    + +recaptchaFailed=無効な reCAPTCHA +recaptchaNotConfigured=reCAPTCHA が必須ですが、設定されていません +consentDenied=同意は拒否されました。 + +noAccount=新規ユーザーですか? +username=ユーザー名 +usernameOrEmail=ユーザー名 または メールアドレス +firstName=名 +givenName=名 +fullName=氏名 +lastName=姓 +familyName=姓 +email=Eメール +password=パスワード +passwordConfirm=パスワード (確認) +passwordNew=新しいパスワード +passwordNewConfirm=新しいパスワード (確認) +rememberMe=ログイン状態の保存 +authenticatorCode=ワンタイムコード +address=住所 +street=番地 +locality=市区町村 +region=都道府県 +postal_code=郵便番号 +country=国 +emailVerified=確認済みEメール +gssDelegationCredential=GSS 代行クレデンシャル + +loginTotpStep1=FreeOTP または Google Authenticator (Google認証システム) をご自身のデバイスにインストールしてください。これらのアプリケーションは Google Play と Apple App Store で入手できます。 +loginTotpStep2=アプリケーションを開きバーコードをスキャンするかキーを入力してください。 +loginTotpStep3=アプリケーションで提供されたワンタイムコードを入力して送信をクリックし、セットアップを完了してください。 +loginTotpOneTime=ワンタイムコード + +oauthGrantRequest=アクセス権を許可してよろしいでしょうか? +inResource=in + +emailVerifyInstruction1=メールアドレスを確認する手順を記載したEメールを送信しました。 +emailVerifyInstruction2=Eメールで確認コードを受け取っていませんか? +emailVerifyInstruction3=Eメールを再送信します。 + +emailLinkIdpTitle=リンク {0} +emailLinkIdp1={0} の {1} アカウントを あなたの {2} アカウントとリンクするための手順を記載したEメールを送信しました。 +emailLinkIdp2=Eメールで確認コードを受け取っていませんか? +emailLinkIdp3=Eメールを再送信します。 + +backToLogin=« ログインに戻る + +emailInstruction=ユーザー名またメールアドレスを入力してください。新しいパスワードの設定方法をご案内いたします。 + +copyCodeInstruction=このコードをコピーし、あなたのアプリケーションにペーストしてください: + +personalInfo=個人情報: +role_admin=管理者 +role_realm-admin=レルム管理者 +role_create-realm=レルムの作成 +role_create-client=クライアントの作成 +role_view-realm=レルムの参照 +role_view-users=ユーザーの参照 +role_view-applications=アプリケーションの参照 +role_view-clients=クライアントの参照 +role_view-events=イベントの参照 +role_view-identity-providers=アイデンティティ プロバイダーの参照 +role_manage-realm=レルムの管理 +role_manage-users=ユーザーの管理 +role_manage-applications=アプリケーションの管理 +role_manage-identity-providers=アイデンティティ プロバイダーの管理 +role_manage-clients=クライアントの管理 +role_manage-events=イベントの管理 +role_view-profile=プロフィールの参照 +role_manage-account=アカウントの管理 +role_read-token=トークンの読み取り +role_offline-access=オフラインアクセス +client_account=アカウント +client_security-admin-console=セキュリティ管理コンソール +client_admin-cli=管理 CLI +client_realm-management=レルム管理 +client_broker=ブローカー + +invalidUserMessage=無効なユーザー名またはパスワードです。 +invalidEmailMessage=無効なメールアドレスです。 +accountDisabledMessage=アカウントは無効です。管理者に連絡してください。 +accountTemporarilyDisabledMessage=アカウントは一時的に無効です。管理者に連絡、またはしばらく時間をおいてから再度お試しください。 +expiredCodeMessage=ログインタイムアウトが発生しました。再度ログインしてください。 + +missingFirstNameMessage=名を指定してください。 +missingLastNameMessage=姓を指定してください。 +missingEmailMessage=Eメールを指定してください。 +missingUsernameMessage=ユーザー名を指定してください。 +missingPasswordMessage=パスワードを指定してください。 +missingTotpMessage=Authenticator コードを指定してください。 +notMatchPasswordMessage=パスワードが一致していません。 + +invalidPasswordExistingMessage=間違った既存のパスワードです。 +invalidPasswordConfirmMessage=パスワード確認が一致していません。 +invalidTotpMessage=間違った Authenticator コードです。 + +usernameExistsMessage=既に存在するユーザー名です。 +emailExistsMessage=既に存在するEメールです。 + +federatedIdentityExistsMessage={0} {1} のユーザーは既に存在します。そのアカウントををリンクするにはアカウント管理にログインしてください。 + +confirmLinkIdpTitle=既に存在するアカウントです。 +federatedIdentityConfirmLinkMessage={0} {1} のユーザーは既に存在します。継続しますか? +federatedIdentityConfirmReauthenticateMessage={1} でアカウントをリンクするために {0} として認証します +confirmLinkIdpReviewProfile=プロフィールの確認 +confirmLinkIdpContinue=既存のアカウントに追加する + +configureTotpMessage=アカウントを有効にするにはモバイル Authenticator のセットアップが必要です。 +updateProfileMessage=アカウントを有効にするにはユーザープロフィールの更新が必要です。 +updatePasswordMessage=アカウントを有効にするにはパスワードの更新が必要です。 +verifyEmailMessage=アカウントを有効にするにはメールアドレスの確認が必要です。 +linkIdpMessage=アカウントを {0} とリンクするにはメールアドレスの確認が必要です。 + +emailSentMessage=詳細な手順を記載したEメールをすぐに受信してください。 +emailSendErrorMessage=Eメールの送信に失敗しました。しばらく時間をおいてから再度お試しください。 + +accountUpdatedMessage=アカウントが更新されました。 +accountPasswordUpdatedMessage=パスワードが更新されました。 + +noAccessMessage=アクセスがありません + +invalidPasswordMinLengthMessage=無効なパスワード: 最小 {0} の長さが必要です。 +invalidPasswordMinDigitsMessage=無効なパスワード: 少なくとも {0} 文字の数字を含む必要があります。 +invalidPasswordMinLowerCaseCharsMessage=無効なパスワード: 少なくとも {0} 文字の小文字を含む必要があります。 +invalidPasswordMinUpperCaseCharsMessage=無効なパスワード: 少なくとも {0} 文字の大文字を含む必要があります。 +invalidPasswordMinSpecialCharsMessage=無効なパスワード: 少なくとも {0} 文字の特殊文字を含む必要があります。 +invalidPasswordNotUsernameMessage=無効なパスワード: ユーザー名と同じパスワードは禁止されています。 +invalidPasswordRegexPatternMessage=無効なパスワード: 正規表現パターンと一致しません。 +invalidPasswordHistoryMessage=無効なパスワード: 最近の {0} パスワードのいずれかと同じパスワードは禁止されています。 + +failedToProcessResponseMessage=応答を処理できませんでした +httpsRequiredMessage=HTTPS が必須です +realmNotEnabledMessage=レルムが有効ではありません +invalidRequestMessage=無効なリクエストです +failedLogout=ログアウトに失敗しました +unknownLoginRequesterMessage=不明なログイン要求元です +loginRequesterNotEnabledMessage=ログイン要求元は有効ではありません +bearerOnlyMessage=bearer-only のアプリケーションはブラウザーログインを開始することが許可されていません +standardFlowDisabledMessage=与えられた response_type でクライアントはブラウザーログインを開始することが許可されていません。 Standard Flow は無効です。 +implicitFlowDisabledMessage=与えられた response_type でクライアントはブラウザーログインを開始することが許可されていません。 Implicit Flow は無効です。 +invalidRedirectUriMessage=無効なリダイレクト URI です +unsupportedNameIdFormatMessage=サポートされていない NameID Format です +invalidRequesterMessage=無効な要求元です +registrationNotAllowedMessage=登録は許可されていません +resetCredentialNotAllowedMessage=クレデンシャルのリセットは許可されていません + +permissionNotApprovedMessage=アクセス権は承認されていません。 +noRelayStateInResponseMessage=アイデンティティ プロバイダーからの応答に RelayState がありません。 +insufficientPermissionMessage=アイデンティティにリンクするには不十分なアクセス権です。 +couldNotProceedWithAuthenticationRequestMessage=アイデンティティ プロバイダーに認証要求を続行できませんでした。 +couldNotObtainTokenMessage=アイデンティティ プロバイダーからトークンを取得できませんでした。 +unexpectedErrorRetrievingTokenMessage=アイデンティティ プロバイダーからのトークン取得で予期せぬエラーが発生しました。 +unexpectedErrorHandlingResponseMessage=アイデンティティ プロバイダーからの応答を処理する際に予期せぬエラーが発生しました。 +identityProviderAuthenticationFailedMessage=認証に失敗しました。アイデンティティ プロバイダーを使用して認証できませんでした。 +identityProviderDifferentUserMessage={1} として認証されることを期待していましたが、{0} として認証されました +couldNotSendAuthenticationRequestMessage=アイデンティティ プロバイダーに認証要求を送信することができませんでした。 +unexpectedErrorHandlingRequestMessage=アイデンティティ プロバイダーへの認証要求を処理する際に予期せぬエラーが発生しました。 +invalidAccessCodeMessage=無効なアクセスコードです。 +sessionNotActiveMessage=セッションが有効ではありません。 +invalidCodeMessage=エラーが発生しました。アプリケーションを介して再度ログインしてください。 +identityProviderUnexpectedErrorMessage=アイデンティティ プロバイダーによる認証の再に予期せぬエラーが発生しました +identityProviderNotFoundMessage=該当の識別子を持つアイデンティティ プロバイダーが見つかりませんでした。 +identityProviderLinkSuccess=アカウントが正常に {0} の {1} アカウントにリンクされました。 +staleCodeMessage=このページはもはや有効ではありませんので、アプリケーションに戻り再度ログインしてください +realmSupportsNoCredentialsMessage=レルムはクレデンシャルタイプをサポートしていません。 +identityProviderNotUniqueMessage=レルムは複数のアイデンティティ プロバイダーをサポートしています。どのアイデンティティ プロバイダーが認証に使用されるべきか判断できませんでした。 +emailVerifiedMessage=メールアドレスが確認できました。 +staleEmailVerificationLink=クリックされたリンクは古いリンクでありもはや有効ではありません。おそらくEメールは既に確認済みではないでしょうか? + +backToApplication=« アプリケーションに戻る +missingParameterMessage=不足パラメータ\: {0} +clientNotFoundMessage=クライアントが見つかりません。 +clientDisabledMessage=クライアントが無効になっています。 +invalidParameterMessage=無効なパラメータ\: {0} +alreadyLoggedIn=既にログインしています。 + diff --git a/login/messages/messages_lt.properties b/login/messages/messages_lt.properties new file mode 100644 index 0000000..0edff1b --- /dev/null +++ b/login/messages/messages_lt.properties @@ -0,0 +1,218 @@ +doLogIn=Prisijungti +doRegister=Registruotis +doCancel=At\u0161aukti +doSubmit=Patvirtinti +doYes=Taip +doNo=Ne +doContinue=T\u0119sti +doAccept=Patvirtinti +doDecline=At\u0161aukti +doForgotPassword=Pamir\u0161ote slapta\u017Eod\u012F? +doClickHere=Spauskite \u010Dia +doImpersonate=Apsimesti kaip +kerberosNotConfigured=Kerberos nesukonfig\u016Bruotas +kerberosNotConfiguredTitle=Kerberos nesukonfig\u016Bruotas +bypassKerberosDetail=J\u016Bs neprisijung\u0119s per Kerberos arba J\u016Bs\u0173 nar\u0161ykl\u0117 nesukonfig\u016Bruota Kerberos prisijungimui. T\u0119skite ir pasirinkite kit\u0105 prisijungimo b\u016Bd\u0105 +kerberosNotSetUp=Kerberos nesukonfig\u016Bruotas. J\u016Bs negalite prisijungti. +registerWithTitle=Registruotis su {0} +registerWithTitleHtml={0} +loginTitle=Prisijungti su {0} +loginTitleHtml={0} +impersonateTitle=Apsimesti kaip naudotojas {0} +impersonateTitleHtml=Apsimesti kaip {0} +realmChoice=Sritis +unknownUser=Ne\u017Einomas naudotojas +loginTotpTitle=Mobilaus autentifikatoriaus nustatymas +loginProfileTitle=Atnaujinti paskyros informacij\u0105 +loginTimeout=U\u017Etrukote per ilgai. Prisijungimo procesas pradedamas i\u0161 naujo. +oauthGrantTitle=Suteitikti prieig\u0105 +oauthGrantTitleHtml={0} +errorTitle=Atsipra\u0161ome ... +errorTitleHtml=Atsipra\u0161ome ... +emailVerifyTitle=El. pa\u0161to adreso patvirtinimas +emailForgotTitle=Pamir\u0161ote slapta\u017Eod\u012F? +updatePasswordTitle=Atnaujinti slapta\u017Eod\u012F +codeSuccessTitle=S\u0117km\u0117 +codeErrorTitle=Klaidos kodas\: {0} + +termsTitle=Naudojimo s\u0105lygos +termsTitleHtml=Naudojimo s\u0105lygos +termsText=

    Naudojimo s\u0105lygos nenurodytos

    + +recaptchaFailed=Recaptcha neteisingas +recaptchaNotConfigured=Reikalingas Recaptcha nesukonfig\u016Bruotas +consentDenied=Prieiga draud\u017Eiama. + +noAccount=Dar neturite paskyros? +username=Naudotojo vardas +usernameOrEmail=Naudotojo vardas arba el. pa\u0161to adresas +firstName=Vardas +givenName=Vardas +fullName=Pavard\u0117 +lastName=Pavard\u0117 +familyName=Pavard\u0117 +email=El. pa\u0161tas +password=Slapta\u017Eodis +passwordConfirm=Pakartotas slapta\u017Eodis +passwordNew=Naujas slapta\u017Eodis +passwordNewConfirm=Pakartotas naujas slapta\u017Eodis +rememberMe=Prisiminti mane +authenticatorCode=Vienkartinis kodas +address=Adresas +street=Gatv\u0117 +locality=Miestas arba vietov\u0117 +region=Rajonas +postal_code=Pa\u0161to kodas +country=\u0160alis +emailVerified=El. pa\u0161to adresas patvirtintas +gssDelegationCredential=GSS prisijungimo duomen\u0173 delegavimas + +loginTotpStep1=\u012Ediekite FreeOTP arba Google Authenticator savo \u012Frenginyje. Program\u0117l\u0117s prieinamos Google Play ir Apple App Store. +loginTotpStep2=Atidarykite program\u0117l\u0119 ir nuskenuokite barkod\u0105 arba \u012Fveskite kod\u0105. +loginTotpStep3=\u012Eveskite program\u0117l\u0117je sugeneruot\u0105 vien\u0105 kart\u0105 galiojant\u012F kod\u0105 ir paspauskite Saugoti nor\u0117dami prisijungti. +loginTotpOneTime=Vienkartinis kodas + +oauthGrantRequest=Ar J\u016Bs suteikiate \u0161ias prieigos teises? +inResource=\u012F + +emailVerifyInstruction1=El. pa\u0161tas su instrukcijomis ir patvirtinimo nuoroda nusi\u0173sti \u012F J\u016Bs\u0173 el. pa\u0161t\u0105. +emailVerifyInstruction2=El. pa\u0161tu negavote patvirtinimo kodo? +emailVerifyInstruction3=pakartotoinai si\u0173sti el. lai\u0161k\u0105. + +emailLinkIdpTitle=Susieti {0} +emailLinkIdp1=El. pa\u0161to lai\u0161kas su instrukcijomis susieti {0} paskyr\u0105 {1} su {2} buvo nusi\u0173stas. +emailLinkIdp2=Negavote patvirtinimo kodo el. pa\u0161tu? +emailLinkIdp3=pakartotoinai si\u0173sti el. lai\u0161k\u0105. + +backToLogin=« Gr\u012F\u017Eti \u012F prisijungimo lang\u0105 + +emailInstruction=\u012Eveskite naudotojo vard\u0105 arba slapta\u017Eod\u012F ir slapta\u017Eod\u017Eio pakeitimo instrukcijos bus atsi\u0173stos Jums el. pa\u0161tu + +copyCodeInstruction=Nukopijuokite \u0161\u012F kod\u0105 \u012F J\u016Bs\u0173 program\u0105: + +personalInfo=Asmenin\u0117 informacija: +role_admin=Administratorius +role_realm-admin=Srities administravimas +role_create-realm=Kurti srit\u012F +role_create-client=Kurti program\u0105 +role_view-realm=Per\u017Ei\u016Br\u0117ti srit\u012F +role_view-users=Per\u017Ei\u016Br\u0117ti naudotojus +role_view-applications=Per\u017Ei\u016Br\u0117ti programas +role_view-clients=Per\u017Ei\u016Br\u0117ti klientines programas +role_view-events=Per\u017Ei\u016Br\u0117ti \u012Fvyki\u0173 \u017Eurnal\u0105 +role_view-identity-providers=Per\u017Ei\u016Br\u0117ti tapatyb\u0117s teik\u0117jus +role_manage-realm=Valdyti sritis +role_manage-users=Valdyti naudotojus +role_manage-applications=Valdyti programas +role_manage-identity-providers=Valdyti tapatyb\u0117s teik\u0117jus +role_manage-clients=Valdyti programas +role_manage-events=Valdyti \u012Fvykius +role_view-profile=Per\u017Ei\u016Br\u0117ti paskyr\u0105 +role_manage-account=Valdyti paskyr\u0105 +role_read-token=Skaityti prieigos rak\u0161\u0105 +role_offline-access=Darbas neprisijungus +client_account=Paskyra +client_security-admin-console=Saugumo administravimo konsol\u0117 +client_admin-cli=Administravimo CLI +client_realm-management=Srities valdymas +client_broker=Tarpininkas + +invalidUserMessage=Neteisingas naudotojo vardas arba slapta\u017Eodis. +invalidEmailMessage=Neteisingas el. pa\u0161to adresas. +accountDisabledMessage=Paskyros galiojimas sustabdytas, kreipkit\u0117s \u012F administratori\u0173. +accountTemporarilyDisabledMessage=Paskyros galiojimas laikinai sustabdytas. Kreipkit\u0117s \u012F administratori\u0173 arba pabandykite v\u0117liau. +expiredCodeMessage=Prisijungimo laikas baig\u0117si. Bandykite dar kart\u0105. + +missingFirstNameMessage=Pra\u0161ome \u012Fvesti vard\u0105. +missingLastNameMessage=Pra\u0161ome \u012Fvesti pavard\u0119. +missingEmailMessage=Pra\u0161ome \u012Fvesti el. pa\u0161to adres\u0105. +missingUsernameMessage=Pra\u0161ome \u012Fvesti naudotojo vard\u0105. +missingPasswordMessage=Pra\u0161ome \u012Fvesti slapta\u017Eod\u012F. +missingTotpMessage=Pra\u0161ome \u012Fvesti autentifikacijos kod\u0105. +notMatchPasswordMessage=Slapta\u017Eod\u017Eiai nesutampa. + +invalidPasswordExistingMessage=Neteisingas dabartinis slapta\u017Eodis. +invalidPasswordConfirmMessage=Pakartotas slapta\u017Eodis nesutampa. +invalidTotpMessage=Neteisingas autentifikacijos kodas. + +usernameExistsMessage=Toks naudotojas jau egzistuoja. +emailExistsMessage=El. pa\u0161to adresas jau egzistuoja. + +federatedIdentityExistsMessage=Naudotojas {0} {1} jau egzistuoja. Pra\u0161ome prsijungti prie naudotoj\u0173 valdymo posistem\u0117s paskyr\u0173 susiejimui. + +confirmLinkIdpTitle=Paskyra jau egzistuoja +federatedIdentityConfirmLinkMessage=Naudotojas {0} {1} jau egzistuoja. Ar t\u0119sti? +federatedIdentityConfirmReauthenticateMessage=Prisijunkite prie {0} nor\u0117dami susieti paskyr\u0105 su {1} +confirmLinkIdpReviewProfile=Per\u017Ei\u016Br\u0117ti naudotojo profilio informacij\u0105 +confirmLinkIdpContinue=Susieti su egzistuojan\u010Dia paskyra + +configureTotpMessage=Paskyros aktyvavimui Jums reikalingas Mobilus autentifikatorius. +updateProfileMessage=Paskyros aktyvavimui Jums reikia atnaujinti profilio informacij\u0105. +updatePasswordMessage=Paskyros aktyvavimui Jums reikia pakeisti slapta\u017Eod\u012F. +verifyEmailMessage=Paskyros aktyvavimui Jums reikia patvirtinti el. pa\u0161to adres\u0105. +linkIdpMessage=El. pa\u0161to adreso susiejimui su J\u016Bsu paskyra {0} reikalingas patvirtinimas. + +emailSentMessage=Netrukus tur\u0117tum\u0117te gauti el. pa\u0161to adres\u0105 su instrukcijomis. +emailSendErrorMessage=Klaida siun\u010Diant el. pa\u0161t\u0105, bandykite v\u0117liau. + +accountUpdatedMessage=J\u0173s\u0173 paskyros informacija atnaujinta. +accountPasswordUpdatedMessage=J\u016Bs\u0173 slapta\u017Eodis pakeistas. + +noAccessMessage=Prieiga negalima + +invalidPasswordMinLengthMessage=Neteisingas slapta\u017Eodis: privalomi bent {0} simboliai. +invalidPasswordMinDigitsMessage=Neteisingas slapta\u017Eodis: privalomi bent {0} skaitmenys. +invalidPasswordMinLowerCaseCharsMessage=Neteisingas slapta\u017Eodis: privalomos bent {0} ma\u017Eosios raid\u0117s. +invalidPasswordMinUpperCaseCharsMessage=Neteisingas slapta\u017Eodis: privalomos bent {0} did\u017Eiosios raid\u0117s. +invalidPasswordMinSpecialCharsMessage=Neteisingas slapta\u017Eodis: privalomi bent {0} special\u016Bs simboliai. +invalidPasswordNotUsernameMessage=Neteisingas slapta\u017Eodis: negali sutapti su naudotojo vardu. +invalidPasswordRegexPatternMessage=Neteisingas slapta\u017Eodis: neatitinka regexp taisykl\u0117s. +invalidPasswordHistoryMessage=Neteisingas slapta\u017Eodis: negali sutapti su prie\u0161 tai naudotais {0} slapta\u017Eod\u017Eiais. + +failedToProcessResponseMessage=Klaida apdorojant atsakym\u0105 +httpsRequiredMessage=Privalomas HTTPS +realmNotEnabledMessage=Srities galiojimas i\u0161jungtas +invalidRequestMessage=Neteisinga u\u017Eklausa +failedLogout=Nepavyko u\u017Ebaigti sesijos +unknownLoginRequesterMessage=Ne\u017Einomas prisijungimo pra\u0161ytojas +loginRequesterNotEnabledMessage=Prisijungimo pra\u0161ytojo galiojimas i\u0161jungtas +bearerOnlyMessage=Programos, sukonfig\u016Bruotos tik kaip perdav\u0117jai, negali inicijuoti prisijungim\u0105 per nar\u0161ykl\u0119. +standardFlowDisabledMessage=Su pateiktu atsakymo tipu prisijungimas per nar\u0161ykl\u0119 \u0161iam klientui negalimas. \u0160iam klientui ne\u012Fgalinta standartin\u0117 seka. +implicitFlowDisabledMessage=Su pateiktu atsakymo tipu prisijungimas per nar\u0161ykl\u0119 \u0161iam klientui negalimas. \u0160iam klientui ne\u012Fgalinta i\u0161reik\u0161tin\u0117 seka. +invalidRedirectUriMessage=Neteisinga nukreipimo nuoroda +unsupportedNameIdFormatMessage=Nepalaikomas NameIDFormat +invalidRequesterMessage=Neteisingas pra\u0161ytojas +registrationNotAllowedMessage=Registracija negalima +resetCredentialNotAllowedMessage=Prisijungimo duomen\u0173 atk\u016Brimas negalimas + +permissionNotApprovedMessage=Teis\u012F nepatvirtinta. +noRelayStateInResponseMessage=Tapatyb\u0117s teik\u0117jo atsakyme tr\u016Bksta perdavimo b\u016Bsenos. +insufficientPermissionMessage=Tr\u016Bksta teisi\u0173 tapatybi\u0173 susiejimui. +couldNotProceedWithAuthenticationRequestMessage=Nepavyksta prad\u0117ti tapatyb\u0117s teik\u0117jo autentifikacijos u\u017Eklausos. +couldNotObtainTokenMessage=Negaunamas prieigos raktas i\u0161 tapatyb\u0117s teik\u0117jo. +unexpectedErrorRetrievingTokenMessage=Prieigos rak\u0161o gavimo i\u0161 tapatyb\u0117s teik\u0117jo metu \u012Fvyko netik\u0117ta klaida. +unexpectedErrorHandlingResponseMessage=Tapatyb\u0117s teik\u0117jo atsakymo apdorojimo metu \u012Fvyko netik\u0117ta klaida. +identityProviderAuthenticationFailedMessage=Autentifikacijos klaida. Nepavyksta autentifikacija su tapatyb\u0117s teik\u0117ju. +identityProviderDifferentUserMessage=Autentifikuota kaip {0}, nors buvo tikimasi {1} +couldNotSendAuthenticationRequestMessage=Tapatyb\u0117s teik\u0117jui nepavyksta nusi\u0173sti autentifikacijos u\u017Eklausos. +unexpectedErrorHandlingRequestMessage=U\u017Eklausos tapatyb\u0117s teik\u0117jui formavimo metu \u012Fvyko netik\u0117ta klaida. +invalidAccessCodeMessage=Neteisingas prieigos kodas. +sessionNotActiveMessage=Sesija neaktyvi. +invalidCodeMessage=\u012Evyko klaida. Pra\u0161ome bandyti prisijungti dar kart\u0105. +identityProviderUnexpectedErrorMessage=Autentifikavimo su i\u0161oriniu tapatyb\u0117s teik\u0117ju metu \u012Fvyko netik\u0117ta klaida. +identityProviderNotFoundMessage=Su nurodytu identifikatoriumi nerastas tapatyb\u0117s teik\u0117jas. +identityProviderLinkSuccess=J\u016Bs\u0173 naudotojo paskyra buvo s\u0117kmingai susieta su {0} paskyra {1} . +staleCodeMessage=\u0160is puslapis nebegalioja. Pra\u0161ome gr\u012F\u017Eti \u012F program\u0105 ir bandyti prisijungti i\u0161 naujo. +realmSupportsNoCredentialsMessage=Sritis nepalaiko prisijungim\u0173 naudojant prisijungimo duomenis. +identityProviderNotUniqueMessage=Sritis palaiko daugiau nei vien\u0105 tapatyb\u0117s teik\u0117j\u0105. Negalima nustatyti kuris tapatyb\u0117s teik\u0117jas turi b\u016Bti naudojamas autentifikacijai. +emailVerifiedMessage=J\u016Bs\u0173 el. pa\u0161to adresas patvirtintas. +staleEmailVerificationLink=Nuoroda, kuri\u0105 paspaud\u0117te nebegalioja? Galb\u016Bt J\u016Bs jau patvirtinote el. pa\u0161to adres\u0105? + +backToApplication=« Gr\u012F\u017Eti \u012F program\u0105 +missingParameterMessage=Nenurodytas parametras\: {0} +clientNotFoundMessage=Nenurodytas klientas. +clientDisabledMessage=Kliento galiojimas i\u0161jungtas. +invalidParameterMessage=Neteisingas parametras\: {0} +alreadyLoggedIn=J\u016Bs jau esate prisijung\u0119. + +p3pPolicy=CP="Nurodyta reik\u0161m\u0117 n\u0117ra P3P taisykl\u0117!" \ No newline at end of file diff --git a/login/messages/messages_nl.properties b/login/messages/messages_nl.properties new file mode 100644 index 0000000..5d5b890 --- /dev/null +++ b/login/messages/messages_nl.properties @@ -0,0 +1,224 @@ +doLogIn=Inloggen +doRegister=Registreer +doCancel=Annuleer +doSubmit=Verzenden +doYes=Ja +doNo=Nee +doContinue=Doorgaan +doAccept=Accepteren +doDecline=Afwijzen +doForgotPassword=Wachtwoord vergeten? +doClickHere=Klik hier +doImpersonate=Identiteit overnemen +kerberosNotConfigured=Kerberos is niet geconfigureerd +kerberosNotConfiguredTitle=Kerberos is niet geconfigureerd +bypassKerberosDetail=U bent niet ingelogd via Kerberos of uw browser kan niet met Kerberos inloggen. Klik op 'doorgaan' om via een andere manier in te loggen +kerberosNotSetUp=Kerberos is onjuist geconfigureerd. U kunt niet inloggen. +registerWithTitle=Registreer met {0} +registerWithTitleHtml={0} +loginTitle=Inloggen bij {0} +loginTitleHtml={0} +impersonateTitle={0} Identiteit overnemen +impersonateTitleHtml={0} Identiteit overnemen +realmChoice=Realm +unknownUser=Onbekende gebruiker +loginTotpTitle=Mobile Authenticator Setup +loginProfileTitle=Update accountinformatie +loginTimeout=U bent te lang bezig geweest met inloggen. Het inlogproces begint overnieuw. +oauthGrantTitle=Verleen Toegang +oauthGrantTitleHtml={0} +errorTitle=Er is een fout opgetreden... +errorTitleHtml=Er is een fout opgetreden... +emailVerifyTitle=E-mailadres-verificatie +emailForgotTitle=Wachtwoord vergeten? +updatePasswordTitle=Wachtwoord updaten +codeSuccessTitle=Succescode +codeErrorTitle=Foutcode: {0} + +termsTitle=Voorwaarden +termsTitleHtml=Voorwaarden +termsText=

    Gedefinieerde voorwaarden

    +recaptchaFailed=Ongeldige Recaptcha +recaptchaNotConfigured=Recaptcha is verplicht, maar niet geconfigureerd +consentDenied=Toestemming geweigerd. + +noAccount=Nieuwe gebruiker? +username=Gebruikersnaam +usernameOrEmail=Gebruikersnaam of e-mailadres +firstName=Voornaam +givenName=Voornaam +lastName=Achternaam +familyName=Familienaam +email=E-mailadres +password=Wachtwoord +passwordConfirm=Bevestig wachtwoord +passwordNew=Nieuw wachtwoord +passwordNewConfirm=Bevestiging nieuwe wachtwoord +rememberMe=Ingelogd blijven +authenticatorCode=Authenticatiecode +address=Adres +postal_code=Postcode +country=Land +emailVerified=E-mailadres geverifieerd +gssDelegationCredential=GSS delegatie Credential +loginTotpStep1=Installeer FreeOTP of Google Authenticator op uw mobiele telefoon. Beide applicaties zijn beschikbaar in de Google Play en Apple App Store. +loginTotpStep2=Open de applicatie en scan de barcode of voer de sleutel in +loginTotpStep3=Voer de eenmalige code die door de applicatie is aangeleverd in en klik op 'Verzenden' om de setup te voltooien +loginTotpOneTime=Eenmalige code + +oauthGrantRequest=Wilt u deze toegangsrechten verlenen? +inResource=in + +emailVerifyInstruction1=Een e-mail met instructies om uw e-mailadres te verifiëren is zojuist verzonden. +emailVerifyInstruction2=Heeft u geen verificatiecode ontvangen in uw e-mail? +emailVerifyInstruction3=om opnieuw een e-mail te versturen. + +emailLinkIdpTitle=Link {0} +emailLinkIdp1=Er is een e-mail met instructies verzonden om {0} account {1} te koppelen met uw {2} account. +emailLinkIdp2=Heeft u geen verificatiecode in uw e-mail ontvangen? +emailLinkIdp3=om opnieuw een e-mail te versturen. + +backToLogin=« Terug naar Inloggen + +emailInstruction=Voer uw gebruikersnaam of e-mailadres in en wij sturen u een e-mailbericht met instructies voor het aanmaken van een nieuw wachtwoord. + +copyCodeInstruction=Kopieer deze code en plak deze in uw applicatie: + +personalInfo=Persoonlijke informatie: +role_realm-admin=Realm beheren +role_create-realm=Realm aanmaken +role_create-client=Client aanmaken +role_view-realm=Bekijk realm +role_view-users=Bekijk gebruikers +role_view-clients=Bekijk clients +role_view-events=Bekijk gebeurtenissen +role_view-identity-providers=Bekijk identity providers +role_manage-realm=Beheer realm +role_manage-users=Gebruikers beheren +role_manage-identity-providers=Beheer identity providers +role_manage-clients=Beheer clients +role_manage-events=Beheer gebeurtenissen +role_view-profile=Profiel bekijken +role_read-token=Token lezen +role_offline-access=Offline toegang +client_account=Account +client_security-admin-console=Security Admin Console +client_admin-cli=Admin CLI +client_broker=Broker +invalidUserMessage=Ongeldige gebruikersnaam of wachtwoord. +invalidEmailMessage=Ongeldig e-mailadres. +accountDisabledMessage=Account is uitgeschakeld, neem contact op met beheer. +accountTemporarilyDisabledMessage=Account is tijdelijk uitgeschakeld, neem contact op met beheer of probeer het later opnieuw. +expiredCodeMessage=Logintijd verlopen. Gelieve opnieuw in te loggen. + +missingFirstNameMessage=Voer uw voornaam in. +missingLastNameMessage=Voer uw achternaam in. +missingEmailMessage=Voer uw e-mailadres in. +missingUsernameMessage=Voer uw gebruikersnaam in. +missingPasswordMessage=Voer uw wachtwoord in. +missingTotpMessage=Voer uw authenticatiecode in. +notMatchPasswordMessage=Wachtwoorden komen niet overeen. +invalidPasswordExistingMessage=Ongeldig bestaand wachtwoord. +invalidPasswordConfirmMessage=Wachtwoord komt niet overeen met wachtwoordbevestiging. +invalidTotpMessage=Ongeldige authenticatiecode. + +usernameExistsMessage=Gebruikersnaam bestaat al. +emailExistsMessage=E-mailadres bestaat al. + +federatedIdentityExistsMessage=Gebruiker met {0} {1} bestaat al. Log in met het beheerdersaccount om het account te koppelen. + +confirmLinkIdpTitle=Account bestaat al +federatedIdentityConfirmLinkMessage=Gebruiker met {0} {1} bestaat al. Hoe wilt u doorgaan? +federatedIdentityConfirmReauthenticateMessage=Authenticeer als {0} om uw account te koppelen {1} +confirmLinkIdpReviewProfile=Nalopen profiel +confirmLinkIdpContinue=Voeg toe aan bestaande account + +configureTotpMessage=U moet de Mobile Authenticator configuren om uw account te activeren. +updateProfileMessage=U moet uw gebruikersprofiel bijwerken om uw account te activeren. +updatePasswordMessage=U moet uw wachtwoord wijzigen om uw account te activeren. +verifyEmailMessage=U moet uw e-mailadres verifiëren om uw account te activeren. +linkIdpMessage=U moet uw e-mailadres verifiëren om uw account te koppelen aan {0}. + +emailSentMessage=U ontvangt binnenkort een e-mail met verdere instructies. +emailSendErrorMessage=Het versturen van de e-mail is mislukt, probeer het later opnieuw. + +accountUpdatedMessage=Uw account is gewijzigd. +accountPasswordUpdatedMessage=Uw wachtwoord is gewijzigd. + +noAccessMessage=Geen toegang + +invalidPasswordMinLengthMessage=Ongeldig wachtwoord, de minimumlengte is {0} karakters. +invalidPasswordMinDigitsMessage=Ongeldig wachtwoord, deze moet minstens {0} cijfers bevatten. +invalidPasswordMinLowerCaseCharsMessage=Ongeldig wachtwoord, deze moet minstens {0} kleine letters bevatten. +invalidPasswordMinUpperCaseCharsMessage=Ongeldig wachtwoord, deze moet minstens {0} hoofdletters bevatten. +invalidPasswordMinSpecialCharsMessage=Ongeldig wachtwoord, deze moet minstens {0} speciale tekens bevatten. +invalidPasswordNotUsernameMessage=Ongeldig wachtwoord, deze mag niet overeen komen met de gebruikersnaam. +invalidPasswordRegexPatternMessage=Ongeldig wachtwoord, deze komt niet overeen met opgegeven reguliere expressie(s). +invalidPasswordHistoryMessage=Ongeldig wachtwoord, deze mag niet overeen komen met een van de laatste {0} wachtwoorden. + +failedToProcessResponseMessage=Het verwerken van de respons is mislukt +httpsRequiredMessage=HTTPS vereist +realmNotEnabledMessage=Realm niet geactiveerd +invalidRequestMessage=Ongeldige request +failedLogout=Afmelden is mislukt +unknownLoginRequesterMessage=De login requester is onbekend +loginRequesterNotEnabledMessage=De login requester is niet geactiveerd +bearerOnlyMessage=Bearer-only applicaties mogen geen browserlogin initiëren +standardFlowDisabledMessage=Client mag geen browserlogin starten met het opgegeven response_type. Standard flow is uitgeschakeld voor de client. +implicitFlowDisabledMessage=Client mag geen browserlogin starten met opgegeven response_type. Implicit flow is uitgeschakeld voor de klant. +invalidRedirectUriMessage=Ongeldige redirect-URI +unsupportedNameIdFormatMessage=Niet-ondersteunde NameIDFormat +invalidRequesterMessage=Ongeldige requester +registrationNotAllowedMessage=Registratie is niet toegestaan +resetCredentialNotAllowedMessage=Het opnieuw instellen van de aanmeldgegevens is niet toegestaan +permissionNotApprovedMessage=Recht verworpen. +noRelayStateInResponseMessage=Geen relay state in antwoord van de identity provider. +insufficientPermissionMessage=Onvoldoende rechten om identiteiten te koppelen. +couldNotProceedWithAuthenticationRequestMessage=Het authenticatieverzoek naar de identity provider wordt afgebroken. +couldNotObtainTokenMessage=Kon geen token bemachtigen van de identity provider. +unexpectedErrorRetrievingTokenMessage=Onverwachte fout bij het ophalen van de token van de identity provider. +unexpectedErrorHandlingResponseMessage=Onverwachte fout bij het verwerken van de respons van de identity provider. +identityProviderAuthenticationFailedMessage=Verificatie mislukt. Er kon niet worden geauthenticeerd met de identity provider. +identityProviderDifferentUserMessage=U bent geauthenticeerd als {0}, maar u werd verwacht als {1} geauthenticeerd te zijn +couldNotSendAuthenticationRequestMessage=Kan het authenticatieverzoek niet verzenden naar de identity provider. +unexpectedErrorHandlingRequestMessage=Onverwachte fout bij het verwerken van het authenticatieverzoek naar de identity provider. +invalidAccessCodeMessage=Ongeldige toegangscode. +sessionNotActiveMessage=Sessie inactief. +invalidCodeMessage=Er is een fout opgetreden, probeer nogmaals in te loggen. +identityProviderUnexpectedErrorMessage=Onverwachte fout tijdens de authenticatie met de identity provider +identityProviderNotFoundMessage=Geen identity provider gevonden met deze naam. +identityProviderLinkSuccess=Uw account is met succes gekoppeld aan {0} account {1}. +staleCodeMessage=Deze pagina is verlopen. Keer terug naar uw applicatie om opnieuw in te loggen. +realmSupportsNoCredentialsMessage=Realm ondersteunt geen enkel soort aanmeldgegeven. +identityProviderNotUniqueMessage=Realm ondersteunt meerdere identity providers. Er kon niet bepaald worden welke identity provider er gebruikt zou moeten worden tijdens de authenticatie. +emailVerifiedMessage=Uw e-mailadres is geverifieerd. +staleEmailVerificationLink=De link die u gebruikt is verlopen, wellicht omdat u uw e-mailadres al eerder geverifieerd heeft. + +backToApplication=« Terug naar de applicatie +missingParameterMessage=Missende parameters: {0} +clientNotFoundMessage=Client niet gevonden. +clientDisabledMessage=Client is inactief. +invalidParameterMessage=Ongeldige parameter: {0} +alreadyLoggedIn=U bent al ingelogd. + +p3pPolicy=CP="This is not a P3P policy!" +fullName=Volledige naam +street=Straat +locality=Plaats +region=Staat, provincie of regio +emailLinkIdp4=Als u de e-mail al geverifieerd heeft in een andere browser +emailLinkIdp5=om door te gaan. +pageExpiredTitle=Pagina is verlopen +pageExpiredMsg1=Om het inlogproces te herstarten +pageExpiredMsg2=Om het inlogproces te vervolgen +role_admin=Beheerder +role_view-applications=Bekijk applicaties +role_manage-applications=Beheer applicaties +role_manage-account=Beheer account +role_manage-account-links=Beheer account-links +client_realm-management=Realm-beheer +expiredActionMessage=Actie verlopen. Vervolg nu met inloggen. +invalidPasswordGenericMessage=Ongeldig wachtwoord: het nieuwe wachtwoord voldoet niet aan het wachtwoordbeleid. +identityProviderAlreadyLinkedMessage=De door {0} teruggegeven gefedereerde identiteit is al aan een andere gebruiker gekoppeld. +differentUserAuthenticated=U bent in deze sessie al als de gebruiker "{0}" aangemeld. Log eerst uit. +brokerLinkingSessionExpired=Broker account linking aangevraagd, maar de huidige sessie in verlopen. diff --git a/login/messages/messages_no.properties b/login/messages/messages_no.properties new file mode 100644 index 0000000..47922cd --- /dev/null +++ b/login/messages/messages_no.properties @@ -0,0 +1,231 @@ +doLogIn=Logg inn +doRegister=Registrer deg +doCancel=Avbryt +doSubmit=Send inn +doYes=Ja +doNo=Nei +doContinue=Fortsett +doAccept=Aksepter +doDecline=Avsl\u00E5 +doForgotPassword=Glemt passord? +doClickHere=Klikk her +doImpersonate=Utgi deg for \u00E5 v\u00E6re en annen bruker +kerberosNotConfigured=Kerberos er ikke konfigurert +kerberosNotConfiguredTitle=Kerberos er ikke konfigurert +bypassKerberosDetail=Enten er du ikke logget inn via Kerberos eller s\u00E5 st\u00F8tter ikke nettleseren innlogging med Kerberos. Vennligst klikk Fortsett for \u00E5 logge inn p\u00E5 andre m\u00E5ter +kerberosNotSetUp=Kerberos er ikke konfigurert. Du kan ikke logge inn. +registerWithTitle=Registrer deg med {0} +registerWithTitleHtml={0} +loginTitle=Logg inn p\u00E5 {0} +loginTitleHtml={0} +impersonateTitle={0} Gi deg ut for \u00E5 v\u00E6re en annen bruker +impersonateTitleHtml={0} Gi deg ut for \u00E5 v\u00E6re en annen bruker +realmChoice=Sikkerhetsdomene +unknownUser=Ukjent bruker +loginTotpTitle=Konfigurer autentifikator for mobil +loginProfileTitle=Oppdater konto +loginTimeout=Du brukte for lang tid p\u00E5 \u00E5 logge inn. Vennligst pr\u00F8v igjen. +oauthGrantTitle=Gi tilgang +oauthGrantTitleHtml={0} +errorTitle=Vi beklager... +errorTitleHtml=Vi beklager ... +emailVerifyTitle=E-postbekreftelse +emailForgotTitle=Glemt passord? +updatePasswordTitle=Oppdater passord +codeSuccessTitle=Suksesskode +codeErrorTitle=Feilkode\: {0} + +termsTitle=Vilk\u00E5r og betingelser +termsTitleHtml=Vilk\u00E5r og betingelser +termsText=

    Vilk\u00E5r og betingelser kommer

    + +recaptchaFailed=Ugyldig Bildebekreftelse +recaptchaNotConfigured=Bildebekreftelse er p\u00E5krevet, men er ikke konfigurert +consentDenied=Samtykke avsl\u00E5tt. + +noAccount=Ny bruker? +username=Brukernavn +usernameOrEmail=Brukernavn eller e-postadresse +firstName=Fornavn +givenName=Fornavn +fullName=Fullstendig navn +lastName=Etternavn +familyName=Etternavn +email=E-postadresse +password=Passord +passwordConfirm=Bekreft passord +passwordNew=Nytt passord +passwordNewConfirm=Bekreft nytt Passord +rememberMe=Husk meg +authenticatorCode=Engangskode +address=Adresse +street=Gate-/veinavn + husnummer +locality=By +region=Fylke +postal_code=Postnummer +country=Land +emailVerified=E-postadresse bekreftet +gssDelegationCredential=GSS legitimasjons-delegering + +loginTotpStep1=Installer FreeOTP eller Google Authenticator p\u00E5 din mobiltelefon. Begge applikasjoner er tilgjengelige p\u00E5 Google Play og Apple App Store. +loginTotpStep2=\u00C5pne applikasjonen og skann strekkoden eller skriv inn koden +loginTotpStep3=Skriv inn engangskoden fra applikasjonen og klikk send inn for \u00E5 fullf\u00F8re +loginTotpOneTime=Engangskode + +oauthGrantRequest=Vil du gi disse tilgangsrettighetene? +inResource=i + +emailVerifyInstruction1=En e-post med instruksjoner for \u00E5 bekrefte din e-postadresse har blitt sendt til deg. +emailVerifyInstruction2=Ikke mottatt en bekreftelseskode i e-posten vi sendte til deg? +emailVerifyInstruction3=for \u00E5 sende e-post p\u00E5 nytt. + +emailLinkIdpTitle=Lenke {0} +emailLinkIdp1=En e-post med instruksjoner for \u00E5 koble {0} konto med din {2} konto har blitt sendt til deg. +emailLinkIdp2=Ikke mottatt en bekreftelseskode i e-posten vi sendte til deg? +emailLinkIdp3=for \u00E5 sende e-post p\u00E5 nytt. + +backToLogin=« Tilbake til innlogging +emailInstruction=Skriv inn e-postadressen din og vi vil sende deg instruksjoner for hvordan du oppretter et nytt passord. + +copyCodeInstruction=Vennligst kopier denne koden og lim den inn i applikasjonen din: + +personalInfo=Personlig informasjon: +role_admin=Administrator +role_realm-admin=Administrator for sikkerhetsdomene +role_create-realm=Opprette sikkerhetsdomene +role_create-client=Opprette klient +role_view-realm=Se sikkerhetsdomene +role_view-users=Se brukere +role_view-applications=Se applikasjoner +role_view-clients=Se klienter +role_view-events=Se hendelser +role_view-identity-providers=Se identitetsleverand\u00F8rer +role_manage-realm=Administrere sikkerhetsdomene +role_manage-users=Administrere brukere +role_manage-applications=Administrere applikasjoner +role_manage-identity-providers=Administrere identitetsleverand\u00F8rer +role_manage-clients=Administrere klienter +role_manage-events=Administrere hendelser +role_view-profile=Se profil +role_manage-account=Administrere konto +role_read-token=Lese token +role_offline-access=Frakoblet tilgang +role_uma_authorization=Skaffe tillatelser +client_account=Konto +client_security-admin-console=Sikkerthetsadministrasjonskonsoll +client_realm-management=Sikkerhetsdomene-administrasjon +client_broker=Broker + +invalidUserMessage=Ugyldig brukernavn eller passord. +invalidEmailMessage=Ugyldig e-postadresse. +accountDisabledMessage=Konto er deaktivert, kontakt administrator. +accountTemporarilyDisabledMessage=Konto er midlertidig deaktivert, kontakt administrator eller pr\u00F8v p\u00E5 nytt senere. +expiredCodeMessage=Login ble tidsavbrutt. Vennligst logg inn p\u00E5 nytt. + +missingFirstNameMessage=Vennligst oppgi fornavn. +missingLastNameMessage=Vennligst oppgi etternavn. +missingEmailMessage=Vennligst oppgi e-postadresse. +missingUsernameMessage=Vennligst oppgi brukernavn. +missingPasswordMessage=Vennligst oppgi passord. +missingTotpMessage=Vennligst oppgi autentiseringskode. +notMatchPasswordMessage=Passordene er ikke like. + +invalidPasswordExistingMessage=Ugyldig eksisterende passord. +invalidPasswordConfirmMessage=Passord er ikke like. +invalidTotpMessage=Ugyldig engangskode. + +usernameExistsMessage=Brukernavnet finnes allerede. +emailExistsMessage=E-post finnes allerede. + +federatedIdentityExistsMessage=Bruker med {0} {1} finnes allerede. Vennligst logg inn p\u00E5 kontoadministratsjon for \u00E5 koble sammen kontoene. + +confirmLinkIdpTitle=Kontoen finnes allerede +federatedIdentityConfirmLinkMessage=Bruker med {0} {1} finnes allerede. Hvordan vil du fortsette? +federatedIdentityConfirmReauthenticateMessage=Bekreft at du er {0} for \u00E5 koble din konto med {1} +confirmLinkIdpReviewProfile=Se over og bekreft profil +confirmLinkIdpContinue=Legg til eksisterende konto + +configureTotpMessage=Du m\u00E5 sette opp en engangskode-generator for \u00E5 aktivere konto. +updateProfileMessage=Du m\u00E5 oppdatere brukerprofilen din for \u00E5 aktivere konto. +updatePasswordMessage=Du m\u00E5 skifte passord for \u00E5 aktivere kontoen din. +verifyEmailMessage=Du m\u00E5 bekrefte e-postadressen din for \u00E5 aktivere konto. +linkIdpMessage=You need to verify your email address to link your account with {0}. + +emailSentMessage=Du vil straks motta en e-post med ytterlige instruksjoner. +emailSendErrorMessage=Mislyktes \u00E5 sende e-post, vennligst pr\u00F8v igjen senere. + +accountUpdatedMessage=Din konto har blitt oppdatert. +accountPasswordUpdatedMessage=Ditt passord har blitt oppdatert. + +noAccessMessage=Ingen tilgang + +invalidPasswordMinLengthMessage=Ugyldig passord: minimum lengde {0}. +invalidPasswordMinDigitsMessage=Ugyldig passord: m\u00E5 inneholde minimum {0} sifre. +invalidPasswordMinLowerCaseCharsMessage=Ugyldig passord: m\u00E5 inneholde minimum {0} sm\u00E5 bokstaver. +invalidPasswordMinUpperCaseCharsMessage=Ugyldig passord: m\u00E5 inneholde minimum {0} store bokstaver. +invalidPasswordMinSpecialCharsMessage=Ugyldig passord: m\u00E5 inneholde minimum {0} spesialtegn. +invalidPasswordNotUsernameMessage=Ugyldig passord: kan ikke v\u00E6re likt brukernavn. +invalidPasswordRegexPatternMessage=Ugyldig passord: tilfredsstiller ikke kravene for passord-m\u00F8nster. +invalidPasswordHistoryMessage=Ugyldig passord: kan ikke v\u00E6re likt noen av de {0} foreg\u00E5ende passordene. + +failedToProcessResponseMessage=Kunne ikke behandle svar +httpsRequiredMessage=HTTPS p\u00E5krevd +realmNotEnabledMessage=Sikkerhetsdomene er ikke aktivert +invalidRequestMessage=Ugyldig foresp\u00F8rsel +failedLogout=Utlogging feilet +unknownLoginRequesterMessage=Ukjent anmoder for innlogging +loginRequesterNotEnabledMessage=Anmoder for innlogging er ikke aktivert +bearerOnlyMessage=Bearer-only applikasjoner har ikke lov til \u00E5 initiere innlogging via nettleser +standardFlowDisabledMessage=Klienten har ikke lov til \u00E5 initiere innlogging via nettleser med gitt response_type. Standard flow er deaktivert for denne klienten. +implicitFlowDisabledMessage=Klienten har ikke lov til \u00E5 initiere innlogging via nettleser med gitt response_type. Implicit flow er deaktivert for denne klienten. +invalidRedirectUriMessage=Ugyldig redirect uri +unsupportedNameIdFormatMessage=NameIDFormat er ikke st\u00F8ttet +invalidRequesterMessage=Ugyldig sender av foresp\u00F8rsel +registrationNotAllowedMessage=Registrering er ikke lov +resetCredentialNotAllowedMessage=Tilbakestilling av innloggingsdata er ikke lov + +permissionNotApprovedMessage=Tillatelse ikke godkjent. +noRelayStateInResponseMessage=Ingen relay state i svar fra identitetsleverand\u00F8r. +insufficientPermissionMessage=Utilstrekkelige rettigheter for \u00E5 koble identiteter. +couldNotProceedWithAuthenticationRequestMessage=Kunne ikke g\u00E5 videre med autentiseringsforesp\u00F8rsel til identitetsleverand\u00F8r. +couldNotObtainTokenMessage=Klarte ikke \u00E5 innhente token fra identitetsleverand\u00F8r. +unexpectedErrorRetrievingTokenMessage=Uventet feil ved henting av token fra identitetsleverand\u00F8r. +unexpectedErrorHandlingResponseMessage=Uventet feil ved h\u00E5ndtering av svar fra identitetsleverand\u00F8r. +identityProviderAuthenticationFailedMessage=Autentisering feilet. Kunne ikke autentisere med identitetsleverand\u00F8r. +identityProviderDifferentUserMessage= Autentisert som {0}, men forventet \u00E5 bli identifisert som {1} +couldNotSendAuthenticationRequestMessage=Kunne ikke sende autentiseringsforesp\u00F8rsel til identitetsleverand\u00F8r. +unexpectedErrorHandlingRequestMessage=Uventet feil ved h\u00E5ndtering av autentiseringsforesp\u00F8rsel til identitetsleverand\u00F8r. +invalidAccessCodeMessage=Ugyldig tilgangskode. +sessionNotActiveMessage=Sesjonen er ikke aktiv. +invalidCodeMessage=En feil oppstod, vennligst logg inn p\u00E5 nytt i din applikasjon. +identityProviderUnexpectedErrorMessage=Uventet feil ved autentisering med identitetsleverand\u00F8r +identityProviderNotFoundMessage=Kunne ikke finne en identitetsleverand\u00F8r med identifikatoren. +identityProviderLinkSuccess=Din konto ble suksessfullt koblet med {0} konto {1}. +staleCodeMessage=Denne siden er ikke lenger gyldig. Vennligst g\u00E5 tilbake til applikasjonen din og logg inn p\u00E5 nytt. +realmSupportsNoCredentialsMessage=Sikkerhetsdomene st\u00F8tter ingen legitimasjonstyper. +identityProviderNotUniqueMessage=Sikkerhetsdomene st\u00F8tter flere identitetsleverand\u00F8rer. Kunne ikke avgj\u00F8re hvilken identitetsleverand\u00F8r som burde brukes for autentisering. +emailVerifiedMessage=Din e-postadresse har blitt verifisert. +staleEmailVerificationLink=Lenken du klikket er utg\u00E5tt og er ikke lenger gyldig. Har du kanskje allerede bekreftet e-postadressen din? + +locale_ca=Catal\u00E0 +locale_de=Deutsch +locale_en=English +locale_es=Espa\u00F1ol +locale_fr=Fran\u00e7ais +locale_it=Italian +locale_ja=\u65E5\u672C\u8A9E +locale_nl=Nederlands +locale_no=Norsk +locale_pt_BR=Portugu\u00EAs (Brasil) +locale_pt-BR=Portugu\u00EAs (Brasil) +locale_ru=\u0420\u0443\u0441\u0441\u043A\u0438\u0439 +locale_zh-CN=\u4e2d\u6587\u7b80\u4f53 + +backToApplication=« Tilbake til applikasjonen +missingParameterMessage=Manglende parameter\: {0} +clientNotFoundMessage=Klient ikke funnet. +clientDisabledMessage=Klient deaktivert. +invalidParameterMessage=Ugyldig parameter\: {0} +alreadyLoggedIn=Du er allerede innlogget. + +p3pPolicy=CP="Dette er ikke en P3P policy!" diff --git a/login/messages/messages_pt_BR.properties b/login/messages/messages_pt_BR.properties new file mode 100644 index 0000000..cddfe82 --- /dev/null +++ b/login/messages/messages_pt_BR.properties @@ -0,0 +1,214 @@ +doLogIn=Entrar +doRegister=Cadastre-se +doCancel=Cancelar +doSubmit=Ok +doYes=Sim +doNo=N\u00E3o +doContinue=Continue +doAccept=Aceitar +doDecline=Rejeitar +doForgotPassword=Esqueceu sua senha? +doClickHere=Clique aqui +doImpersonate=Personificar +kerberosNotConfigured=Kerberos N\u00E3o Configurado +kerberosNotConfiguredTitle=Kerberos N\u00E3o Configurado +bypassKerberosDetail=Ou voc\u00EA n\u00E3o est\u00E1 logado via Kerberos ou o seu navegador n\u00E3o est\u00E1 configurado para login Kerberos. Por favor, clique em continuar para fazer o login no atrav\u00E9s de outros meios +kerberosNotSetUp=Kerberos n\u00E3o est\u00E1 configurado. Voc\u00EA n\u00E3o pode acessar. +registerWithTitle=Registre-se com {0} +registerWithTitleHtml=Registre-se com {0} +loginTitle=Entrar em {0} +loginTitleHtml=Entrar em {0} +impersonateTitle={0} Impersonate User +impersonateTitleHtml={0} Impersonate User +realmChoice=Realm +unknownUser=Usu\u00E1rio desconhecido +loginTotpTitle=Configura\u00E7\u00E3o do autenticador mobile +loginProfileTitle=Atualiza\u00E7\u00E3o das Informa\u00E7\u00F5es da Conta +loginTimeout=Voc\u00EA demorou muito para entrar. Por favor, refa\u00E7a o processo de login a partir do in\u00EDcio. +oauthGrantTitle=Concess\u00E3o OAuth +oauthGrantTitleHtml=Acesso tempor\u00E1rio para {0} solicitado pela +errorTitle=N\u00F3s lamentamos... +errorTitleHtml=N\u00F3s lamentamos ... +emailVerifyTitle=Verifica\u00E7\u00E3o de e-mail +emailForgotTitle=Esqueceu sua senha? +updatePasswordTitle=Atualiza\u00E7\u00E3o de senha +codeSuccessTitle=C\u00F3digo de sucesso +codeErrorTitle=C\u00F3digo de erro\: {0} + +termsTitle=Termos e Condi\u00E7\u00F5es +termsTitleHtml=Termos e Condi\u00E7\u00F5es +termsText=

    Termos e Condi\u00E7\u00F5es a ser definido

    + +recaptchaFailed=Recaptcha inv\u00E1lido +recaptchaNotConfigured=Recaptcha \u00E9 requerido, mas n\u00E3o foi configurado +consentDenied=Consentimento negado. + +noAccount=Novo usu\u00E1rio? +username=Nome de usu\u00E1rio +usernameOrEmail=Nome de usu\u00E1rio ou e-mail +firstName=Primeiro nome +givenName=Primeiro nome +fullName=Nome completo +lastName=Sobrenome +familyName=Sobrenome +email=E-mail +password=Senha +passwordConfirm=Confirme a senha +passwordNew=Nova senha +passwordNewConfirm=Confirma\u00E7\u00E3o da nova senha +rememberMe=Mantenha-me conectado +authenticatorCode=C\u00F3digo autenticador +address=Endere\u00E7o +street=Logradouro +locality=Cidade ou localidade +region=Estado +postal_code=CEP +country=Pa\u00EDs +emailVerified=E-mail verificado +gssDelegationCredential=gss delega\u00E7\u00E3o credencial + +loginTotpStep1=Instale FreeOTP ou Google Authenticator em seu celular +loginTotpStep2=Abra o aplicativo e escaneie o c\u00F3digo de barras ou digite o c\u00F3digo +loginTotpStep3=Digite o c\u00F3digo fornecido pelo aplicativo e clique em Enviar para concluir a configura\u00E7\u00E3o +loginTotpOneTime=C\u00F3digo autenticador + +oauthGrantRequest=Voc\u00EA concede esses privil\u00E9gios de acesso? +inResource=em + +emailVerifyInstruction1=Um e-mail com instru\u00E7\u00F5es para verificar o seu endere\u00E7o de e-mail foi enviado para voc\u00EA. +emailVerifyInstruction2=Voc\u00EA n\u00E3o recebeu um c\u00F3digo de verifica\u00E7\u00E3o em seu e-mail? +emailVerifyInstruction3=para reenviar o e-mail. + +emailLinkIdpTitle=Vincular {0} +emailLinkIdp1=Um e-mail com instru\u00E7\u00F5es para vincular a conta {0} {1} com sua conta {2} foi enviado para voc\u00EA. +emailLinkIdp2=N\u00E3o recebeu um c\u00F3digo de verifica\u00E7\u00E3o no e-mail? +emailLinkIdp3=para reenviar o e-mail. + +backToLogin=« Voltar + +emailInstruction=Digite seu nome de usu\u00E1rio ou endere\u00E7o de e-mail e n\u00F3s lhe enviaremos instru\u00E7\u00F5es sobre como criar uma nova senha. + +copyCodeInstruction=Por favor, copie o c\u00F3digo e cole-o em seu aplicativo: + +personalInfo=Informa\u00E7\u00F5es Pessoais: +role_admin=Admininstrador +role_realm-admin=Administra Realm +role_create-realm=Cria realm +role_create-client=Cria cliente +role_view-realm=Visualiza realm +role_view-users=Visualiza usu\u00E1rios +role_view-applications=Visualiza aplicativos +role_view-clients=Visualiza clientes +role_view-events=Visualiza eventos +role_view-identity-providers=Visualiza provedores de identidade +role_manage-realm=Gerencia realm +role_manage-users=Gerencia usu\u00E1rios +role_manage-applications=Gerencia aplicativos +role_manage-identity-providers=Gerencia provedores de identidade +role_manage-clients=Gerencia clientes +role_manage-events=Gerencia eventos +role_view-profile=Visualiza perfil +role_manage-account=Gerencia contas +role_read-token=L\u00EA token +role_offline-access=Acesso offline +client_account=Conta +client_security-admin-console=Console de Administra\u00E7\u00E3o de Seguran\u00E7a +client_admin-cli=Admin CLI +client_realm-management=Gerenciamento de Realm +client_broker=Broker + +invalidUserMessage=Nome de usu\u00E1rio ou senha inv\u00E1lida. +invalidEmailMessage=E-mail inv\u00E1lido. +accountDisabledMessage=Conta desativada, contate o administrador. +accountTemporarilyDisabledMessage=Conta temporariamente indispon\u00EDvel, contate o administrador ou tente novamente mais tarde. +expiredCodeMessage=Tempo de login expirado. Por favor, fa\u00E7a login novamente. + +missingFirstNameMessage=Por favor, informe o primeiro nome. +missingLastNameMessage=Por favor, informe o sobrenome. +missingEmailMessage=Por favor, informe o e-mail. +missingUsernameMessage=Por favor, informe o nome de usu\u00E1rio. +missingPasswordMessage=Por favor, informe a senha. +missingTotpMessage=Por favor, informe o c\u00F3digo autenticador. +notMatchPasswordMessage=As senhas n\u00E3o coincidem. + +invalidPasswordExistingMessage=Senha atual inv\u00E1lida. +invalidPasswordConfirmMessage=Senha de confirma\u00E7\u00E3o n\u00E3o coincide. +invalidTotpMessage=C\u00F3digo autenticador inv\u00E1lido. + +usernameExistsMessage=Nome de usu\u00E1rio j\u00E1 existe. +emailExistsMessage=E-mail j\u00E1 existe. + +federatedIdentityExistsMessage=Usu\u00E1rio com {0} {1} j\u00E1 existe. Por favor, entre em gerenciamento de contas para vincular a conta. + +confirmLinkIdpTitle=Conta j\u00E1 existente +federatedIdentityConfirmLinkMessage=Usu\u00E1rio com {0} {1} j\u00E1 existe. Como voc\u00EA quer continuar? +federatedIdentityConfirmReauthenticateMessage=Autenticar como {0} para vincular sua conta com {1} +confirmLinkIdpReviewProfile=Revisar informa\u00E7\u00F5es do perfil +confirmLinkIdpContinue=Vincular {0} com uma conta existente + +configureTotpMessage=Voc\u00EA precisa configurar seu celular com o autenticador Mobile para ativar sua conta. +updateProfileMessage=Voc\u00EA precisa atualizar o seu perfil de usu\u00E1rio para ativar sua conta. +updatePasswordMessage=Voc\u00EA precisa mudar sua senha para ativar sua conta. +verifyEmailMessage=Voc\u00EA precisa verificar o seu endere\u00E7o de e-mail para ativar sua conta. +linkIdpMessage=Voc\u00EA precisa confirmar o seu endere\u00E7o de e-mail para vincular sua conta com {0}. + +emailSentMessage=Voc\u00EA dever\u00E1 receber um e-mail em breve com mais instru\u00E7\u00F5es. +emailSendErrorMessage=Falha ao enviar e-mail, por favor, tente novamente mais tarde + +accountUpdatedMessage=Sua conta foi atualizada +accountPasswordUpdatedMessage=Sua senha foi atualizada + +noAccessMessage=Sem acesso + +invalidPasswordMinLengthMessage=Senha inv\u00E1lida\: comprimento m\u00EDnimo {0} +invalidPasswordMinDigitsMessage=Senha inv\u00E1lida\: deve conter pelo menos {0} n\u00FAmero(s) +invalidPasswordMinLowerCaseCharsMessage=Senha inv\u00E1lida\: deve conter pelo menos {0} caractere(s) min\u00FAsculo +invalidPasswordMinUpperCaseCharsMessage=Senha inv\u00E1lida\: deve conter pelo menos {0} caractere(s) mai\u00FAsculo +invalidPasswordMinSpecialCharsMessage=Senha inv\u00E1lida\: deve conter pelo menos {0} caractere(s) especial +invalidPasswordNotUsernameMessage=Senha inv\u00E1lida\: n\u00E3o deve ser igual ao nome de usu\u00E1rio +invalidPasswordRegexPatternMessage=Senha inv\u00E1lida\: n\u00E3o corresponde ao padr\u00E3o da express\u00E3o regular. +invalidPasswordHistoryMessage=Senha inv\u00E1lida\: n\u00E3o pode ser igual a qualquer uma das {0} \u00FAltimas senhas. + +failedToProcessResponseMessage=Falha ao processar a resposta +httpsRequiredMessage=HTTPS requerido +realmNotEnabledMessage=Realm desativado +invalidRequestMessage=Pedido inv\u00E1lido +failedLogout=Falha ao sair +unknownLoginRequesterMessage=Solicitante de login desconhecido +loginRequesterNotEnabledMessage=Solicitante de login desativado +bearerOnlyMessage=Aplicativos somente ao portador n\u00E3o tem permiss\u00E3o para iniciar o login pelo navegador +standardFlowDisabledMessage=Cliente n\u00E3o tem permiss\u00E3o para iniciar o login com response_type informado. O fluxo padr\u00E3o est\u00E1 desabilitado para o cliente. +implicitFlowDisabledMessage=Cliente n\u00E3o tem permiss\u00E3o para iniciar o login com response_type informado. O fluxo padr\u00E3o est\u00E1 desabilitado para o cliente. +invalidRedirectUriMessage=URI de redirecionamento inv\u00E1lido +unsupportedNameIdFormatMessage=NameIDFormat n\u00E3o suportado +invalidRequesterMessage=Solicitante inv\u00E1lido +registrationNotAllowedMessage=Registro n\u00E3o permitido. +resetCredentialNotAllowedMessage=N\u00E3o \u00E9 permitido redefinir credencial. + +permissionNotApprovedMessage=Permiss\u00E3o n\u00E3o aprovada. +noRelayStateInResponseMessage=Sem estado de retransmiss\u00E3o na resposta do provedor de identidade. +insufficientPermissionMessage=Permiss\u00F5es insuficientes para vincular identidades. +couldNotProceedWithAuthenticationRequestMessage=N\u00E3o foi poss\u00EDvel proceder \u00E0 solicita\u00E7\u00E3o de autentica\u00E7\u00E3o para provedor de identidade. +couldNotObtainTokenMessage=N\u00E3o foi poss\u00EDvel obter token do provedor de identidade. +unexpectedErrorRetrievingTokenMessage=Erro inesperado ao recuperar token do provedor de identidade. +unexpectedErrorHandlingResponseMessage=Erro inesperado ao manusear resposta do provedor de identidade. +identityProviderAuthenticationFailedMessage=Falha na autentica\u00E7\u00E3o. N\u00E3o foi poss\u00EDvel autenticar com o provedor de identidade. +identityProviderDifferentUserMessage=Autenticado como {0}, mas era esperado ser autenticado como {1} +couldNotSendAuthenticationRequestMessage=N\u00E3o foi poss\u00EDvel enviar solicita\u00E7\u00E3o de autentica\u00E7\u00E3o para o provedor de identidade. +unexpectedErrorHandlingRequestMessage=Erro inesperado ao manusear pedido de autentica\u00E7\u00E3o para provedor de identidade. +invalidAccessCodeMessage=C\u00F3digo de acesso inv\u00E1lido. +sessionNotActiveMessage=Sess\u00E3o inativa. +invalidCodeMessage=C\u00F3digo inv\u00E1lido, por favor fa\u00E7a login novamente atrav\u00E9s de sua aplica\u00E7\u00E3o. +identityProviderUnexpectedErrorMessage=Erro inesperado durante a autentica\u00E7\u00E3o com o provedor de identidade +identityProviderNotFoundMessage=N\u00E3o foi poss\u00EDvel encontrar um provedor de identidade com o identificador. +identityProviderLinkSuccess=Sua conta foi vinculada com sucesso com {0} conta {1} . +realmSupportsNoCredentialsMessage=O realm n\u00E3o suporta qualquer tipo de credencial. +identityProviderNotUniqueMessage=O realm suporta m\u00FAltiplos provedores de identidade. N\u00E3o foi poss\u00EDvel determinar qual o provedor de identidade deve ser usado para se autenticar. +emailVerifiedMessage=O seu endere\u00E7o de e-mail foi confirmado. + +backToApplication=« Voltar para o aplicativo +missingParameterMessage=Par\u00E2metros que faltam\: {0} +clientNotFoundMessage=Cliente n\u00E3o encontrado. +invalidParameterMessage=Par\u00E2mentro inv\u00E1lido\: {0} +alreadyLoggedIn=You are already logged in. + diff --git a/login/messages/messages_ru.properties b/login/messages/messages_ru.properties new file mode 100644 index 0000000..0d3d31a --- /dev/null +++ b/login/messages/messages_ru.properties @@ -0,0 +1,220 @@ +# encoding: utf-8 +doLogIn=Вход +doRegister=Регистрация +doCancel=Отмена +doSubmit=Подтвердить +doYes=Да +doNo=Нет +doContinue=Продолжить +doAccept=Подтвердить +doDecline=Отменить +doForgotPassword=Забыли пароль? +doClickHere=Нажмите сюда +doImpersonate=Имперсонализироваться +kerberosNotConfigured=Kerberos не сконфигурирован +kerberosNotConfiguredTitle=Kerberos не сконфигурирован +bypassKerberosDetail=Либо вы не вошли в систему с помощью Kerberos, либо ваш браузер не настроен для входа в систему Kerberos. Пожалуйста, нажмите кнопку 'Продолжить' для входа в с помощью других средств +kerberosNotSetUp=Kerberos не настроен. Вы не можете войти. +registerWithTitle=Зарегистрироваться с {0} +registerWithTitleHtml={0} +loginTitle=Log in to {0} +loginTitleHtml={0} +impersonateTitle={0} Имперсонализация пользователя +impersonateTitleHtml={0} Имперсонализация пользователя +realmChoice=Realm +unknownUser=Неизвестный пользователь +loginTotpTitle=Настройка мобильного аутентификатора +loginProfileTitle=Обновление информации учетной записи +loginTimeout=Вы слишком долго бездействовали. Процесс аутентификации начнется с начала. +oauthGrantTitle=Согласовать доступ +oauthGrantTitleHtml={0} +errorTitle=Мы сожалеем... +errorTitleHtml=Мы сожалеем ... +emailVerifyTitle=Подтверждение адреса E-mail +emailForgotTitle=Забыли пароль? +updatePasswordTitle=Обновление пароля +codeSuccessTitle=Успешный код +codeErrorTitle=Ошибочный код\: {0} + +termsTitle=Условия и положения +termsTitleHtml=Условия и положения +termsText=

    Условия и положения должны быть определены

    + +recaptchaFailed=Некорректная Recaptcha +recaptchaNotConfigured=Recaptcha требуется, но не сконфигурирована +consentDenied=В согласовании отказано. + +noAccount=Новый пользователь? +username=Имя пользователя +usernameOrEmail=Имя пользователя или E-mail +firstName=Имя +givenName=Выданное имя +fullName=Полное имя +lastName=Фамилия +familyName=Фамилия +email=E-mail +password=Пароль +passwordConfirm=Подтверждение пароля +passwordNew=Новый пароль +passwordNewConfirm=Подтверждение нового пароля +rememberMe=Запомнить меня +authenticatorCode=Одноразовый код +address=Адрес +street=Улица +locality=Город +region=Регион +postal_code=Почтовый индекс +country=Страна +emailVerified=E-mail подтвержден +gssDelegationCredential=Делегирование учетных данных GSS + +loginTotpStep1=Установите FreeOTP или Google Authenticator. Оба приложения доступны в Google Play и Apple App Store. +loginTotpStep2=Откройте приложение и просканируйте баркод, либо введите ключ +loginTotpStep3=Введите одноразовый пароль, выданный приложением, и нажмите сохранить для завершения установки +loginTotpOneTime=Одноразовый пароль + +oauthGrantRequest=Вы согласуете доступ к этим привелегиям? +inResource=в + +emailVerifyInstruction1=Вам было отправлено письмо с инструкциями для подтверждения адреса E-mail. +emailVerifyInstruction2=Не получили письмо с кодом подтверждения? +emailVerifyInstruction3=для повторной отправки письма. + +emailLinkIdpTitle=Связать {0} +emailLinkIdp1=Вам было отправлено письмо с инструкциями по объединению {0} учетной записи {1} с вашей учетной записью {2}. +emailLinkIdp2=Не получили код подтверждения на ваш E-mail? +emailLinkIdp3=для повторной отправки письма. + +backToLogin=« Назад ко входу + +emailInstruction=Введите Ваше имя пользователя или E-mail и мы вышлем Вам инструкции по получению нового пароля. + +copyCodeInstruction=Пожалуйста, скопируйте этот код в приложение: + +personalInfo=Персональная информация: +role_admin=Администратор +role_realm-admin=Администратор realm +role_create-realm=Создание realm +role_create-client=Создание клиента +role_view-realm=Просмотр realm +role_view-users=Просмотр пользователей +role_view-applications=Просмотр приложений +role_view-clients=Просмотр клиентов +role_view-events=Просмотр событий +role_view-identity-providers=Просмотр провайдеров учетных записей +role_manage-realm=Управление realm +role_manage-users=Управление пользователями +role_manage-applications=Управление приложениями +role_manage-identity-providers=Управление провайдерами учетных записей +role_manage-clients=Управление клиентами +role_manage-events=Управление событиями +role_view-profile=Просмотр профиля +role_manage-account=Управление учетной записью +role_read-token=Чтение токена +role_offline-access=Оффлайн доступ +client_account=Учетная запись +client_security-admin-console=Консоль администратора безопасности +client_admin-cli=Командный интерфейс администратора +client_realm-management=Управление realm +client_broker=Брокер + +invalidUserMessage=Неправильное имя пользователя или пароль. +invalidEmailMessage=Неправильный E-mail. +accountDisabledMessage=Учетная запись заблокирована, свяжитесь с администратором. +accountTemporarilyDisabledMessage=Учетная запись временно заблокирована, свяжитесь с администратором или попробуйте позже. +expiredCodeMessage=Вход просрочен по таймауту. Пожалуйста, войдите снова. + +missingFirstNameMessage=Пожалуйста введите имя. +missingLastNameMessage=Пожалуйста введите фамилию. +missingEmailMessage=Пожалуйста введите E-mail. +missingUsernameMessage=Пожалуйста введите имя пользователя. +missingPasswordMessage=Пожалуйста введите пароль. +missingTotpMessage=Пожалуйста введите код аутентификатора. +notMatchPasswordMessage=Пароли не совпадают. + +invalidPasswordExistingMessage=Неверный существующий пароль. +invalidPasswordConfirmMessage=Подтверждение пароля не совпадает. +invalidTotpMessage=Неверный код аутентификатора. + +usernameExistsMessage=Имя пользователя уже занято. +emailExistsMessage=E-mail уже существует. + +federatedIdentityExistsMessage=Пользователь с {0} {1} уже существует. Пожалуйста войдите в управление учетными записями, чтобы связать эту учетную запись. + +confirmLinkIdpTitle=Учетная запись уже существует +federatedIdentityConfirmLinkMessage=Пользователь с {0} {1} уже сущестует. Хотите продолжить? +federatedIdentityConfirmReauthenticateMessage=Аутентифицируйтесь как {0} для того, чтобы связать Вашу учетную запись с {1} +confirmLinkIdpReviewProfile=Обзор профиля +confirmLinkIdpContinue=Добавить в существующую учетную запись + +configureTotpMessage=Вам необходимо настроить аутентификатор в мобильном устройстве, чтобы активировать учетную запись. +updateProfileMessage=Вам необходимо обновить свой профиль, чтобы активировать Вашу учетную запись. +updatePasswordMessage=Вам необходимо изменить пароль, чтобы активировать Вашу учетную запись. +verifyEmailMessage=Вам необходимо подтвердить Ваш E-mail, чтобы активировать Вашу учетную запись. +linkIdpMessage=Вам необходимо подтвердить Ваш E-mail, чтобы связать Вашу учетную запись с {0}. + +emailSentMessage=В ближайшее время Вы должны получить письмо с дальнейшими инструкциями. +emailSendErrorMessage=Не получается отправить письмо. Пожалуйста, повторите позже. + +accountUpdatedMessage=Ваша учетная запись успешно обновлена. +accountPasswordUpdatedMessage=Ваш пароль успешно обновлен. + +noAccessMessage=Нет доступа + +invalidPasswordMinLengthMessage=Некорректный пароль: длина пароля должна быть не менее {0} символов(а). +invalidPasswordMinDigitsMessage=Некорректный пароль: пароль должен содержать не менее {0} цифр(ы). +invalidPasswordMinLowerCaseCharsMessage=Некорректный пароль: пароль должен содержать не менее {0} символов(а) в нижнем регистре. +invalidPasswordMinUpperCaseCharsMessage=Некорректный пароль: пароль должен содержать не менее {0} символов(а) в верхнем регистре. +invalidPasswordMinSpecialCharsMessage=Некорректный пароль: пароль должен содержать не менее {0} спецсимволов(а). +invalidPasswordNotUsernameMessage=Некорректный пароль: пароль не должен совпадать с именем пользователя. +invalidPasswordRegexPatternMessage=Некорректный пароль: пароль не прошел проверку по регулярному выражению. +invalidPasswordHistoryMessage=Некорректный пароль: пароль не должен совпадать с последним(и) {0} паролем(ями). +invalidPasswordGenericMessage=Некорректный пароль: новый пароль не соответствует правилам пароля. + +failedToProcessResponseMessage=Не удалось обработать ответ +httpsRequiredMessage=Требуется HTTPS +realmNotEnabledMessage=Realm не включен +invalidRequestMessage=Неверный запрос +failedLogout=Выйти не удалось +unknownLoginRequesterMessage=Неизвестный клиент +loginRequesterNotEnabledMessage=Клиент отключен +bearerOnlyMessage=Bearer-only приложениям не разрешается инициализация входа через браузер +standardFlowDisabledMessage=Клиенту не разрешается инициировать вход через браузер с данным response_type. Standard flow отключен для этого клиента. +implicitFlowDisabledMessage=Клиенту не разрешается инициировать вход через браузер с данным response_type. Implicit flow отключен для этого клиента. +invalidRedirectUriMessage=Неверный uri для переадресации +unsupportedNameIdFormatMessage=Неподдерживаемый NameIDFormat +invalidRequesterMessage=Неверный запрашивающий +registrationNotAllowedMessage=Регистрация не разрешена +resetCredentialNotAllowedMessage=Сброс идентификационных данных не разрешен + +permissionNotApprovedMessage=Разрешение не подтверждено. +noRelayStateInResponseMessage=Нет изменения состояния в ответе от провайдера учетных записей. +insufficientPermissionMessage=Недостаточно полномочий для связывания идентификаторов. +couldNotProceedWithAuthenticationRequestMessage=Невозможно обработать аутентификационный запрос в провайдере учетных записей. +couldNotObtainTokenMessage=Не удалось получить токен от провайдера учетных записей. +unexpectedErrorRetrievingTokenMessage=Непредвиденная ошибка при получении токена от провайдера учетных записей. +unexpectedErrorHandlingResponseMessage=Непредвиденная ошибка при обработке ответа от провайдера учетных записей. +identityProviderAuthenticationFailedMessage=Аутентификация провалена. Невозможно аутентифицировать с поставщиком учетных записей. +identityProviderDifferentUserMessage=Аутентифицирован как {0}, но ожидается, что будет аутентифицирован как {1} +couldNotSendAuthenticationRequestMessage=Не получается выполнить запрос аутентификации к поставщику учетных записей. +unexpectedErrorHandlingRequestMessage=Непредвиденная ошибка при обработке запроса аутентификации поставщика учетных записей. +invalidAccessCodeMessage=Неверный код доступа. +sessionNotActiveMessage=Сессия не активна. +invalidCodeMessage=Произошла ошибка. Пожалуйста, войдите в систему снова через ваше приложение. +identityProviderUnexpectedErrorMessage=Непредвиденная ошибка при проверке подлинности поставщика учетных записей. +identityProviderNotFoundMessage=Не удалось найти поставщика учетных записей с данным идентификатором. +identityProviderLinkSuccess=Ваша учетная запись была успешно соединена с {0} учетной записью {1} . +staleCodeMessage=Эта страница больше не действительна, пожалуйста, вернитесь в приложение и снова войдите в систему. +realmSupportsNoCredentialsMessage=Realm не поддерживает никакой тип учетных данных. +identityProviderNotUniqueMessage=Realm поддерживает несколько поставщиков учетных записей. Не удалось определить, какой именно поставщик должен использоваться для аутентификации. +emailVerifiedMessage=Ваш E-mail был подтвержден. +staleEmailVerificationLink=Ссылка, по которой Вы перешли, устарела и больше не действует. Может быть, вы уже подтвердили свой E-mail? + +backToApplication=« Назад в приложение +missingParameterMessage=Пропущенные параметры\: {0} +clientNotFoundMessage=Клиент не найден. +clientDisabledMessage=Клиент отключен. +invalidParameterMessage=Неверный параметр\: {0} +alreadyLoggedIn=Вы уже вошли. + +p3pPolicy=CP="Это не политика P3P!" diff --git a/login/messages/messages_sv.properties b/login/messages/messages_sv.properties new file mode 100644 index 0000000..c383703 --- /dev/null +++ b/login/messages/messages_sv.properties @@ -0,0 +1,216 @@ +# encoding: utf-8 +doLogIn=Logga in +doRegister=Registrera +doCancel=Avbryt +doSubmit=Skicka +doYes=Ja +doNo=Nej +doContinue=Fortsätt +doAccept=Acceptera +doDecline=Avböj +doForgotPassword=Glömt lösenord? +doClickHere=Klicka här +doImpersonate=Imitera +kerberosNotConfigured=Kerberos är inte konfigurerat +kerberosNotConfiguredTitle=Kerberos är inte konfigurerat +bypassKerberosDetail=Antingen så är du inte inloggad via Kerberos eller så är inte din webbläsare inställd för Kerberosinloggning. Vänligen klicka på fortsätt för att logga in på annat sätt. +kerberosNotSetUp=Kerberos är inte inställt. Du kan inte logga in. +registerWithTitle=Registrera med {0} +registerWithTitleHtml={0} +loginTitle=Logga in till {0} +loginTitleHtml={0} +impersonateTitle={0} Imitera användare +impersonateTitleHtml={0} Imitera användare +realmChoice=Realm +unknownUser=Okänd användare +loginTotpTitle=Inställning av mobilautentiserare +loginProfileTitle=Uppdatera kontoinformation +loginTimeout=Det tog för lång tid att logga in. Inloggningsprocessen börjar om. +oauthGrantTitle=Bevilja åtkomst +oauthGrantTitleHtml={0} +errorTitle=Vi ber om ursäkt... +errorTitleHtml=Vi ber om ursäkt ... +emailVerifyTitle=E-postverifiering +emailForgotTitle=Glömt ditt lösenord? +updatePasswordTitle=Uppdatera lösenord +codeSuccessTitle=Rätt kod +codeErrorTitle=Felkod\: {0} + +termsTitle=Användarvillkor +termsTitleHtml=Användarvillkor +termsText=

    Användarvillkoren har ännu inte definierats

    + +recaptchaFailed=Ogiltig Recaptcha +recaptchaNotConfigured=Recaptcha krävs, men är inte inställd +consentDenied=Samtycke förnekat. + +noAccount=Ny användare? +username=Användarnamn +usernameOrEmail=Användarnamn eller e-post +firstName=Förnamn +lastName=Efternamn +email=E-post +password=Lösenord +passwordConfirm=Bekräfta lösenord +passwordNew=Nytt lösenord +passwordNewConfirm=Bekräftelse av nytt lösenord +rememberMe=Kom ihåg mig +authenticatorCode=Engångskod +address=Adress +street=Gata +locality=Postort +region=Stat, Provins eller Region +postal_code=Postnummer +country=Land +emailVerified=E-post verifierad +gssDelegationCredential=GSS Delegation Credential + +loginTotpStep1=Installera FreeOTP eller Google Authenticator på din mobil. Båda applikationerna finns tillgängliga hos Google Play och Apple App Store. +loginTotpStep2=Öppna applikationen och skanna streckkoden eller skriv i nyckeln +loginTotpStep3=Fyll i engångskoden som tillhandahålls av applikationen och klicka på Spara för att avsluta inställningarna +loginTotpOneTime=Engångskod + +oauthGrantRequest=Godkänner du tillgång till de här rättigheterna? +inResource=i + +emailVerifyInstruction1=Ett e-postmeddelande med instruktioner om hur du verifierar din e-postadress har skickats till dig. +emailVerifyInstruction2=Har du inte fått en verifikationskod i din e-post? +emailVerifyInstruction3=för att skicka e-postmeddelandet igen. + +emailLinkIdpTitle=Länkning {0} +emailLinkIdp1=Ett e-postmeddelande med instruktioner om hur du länkar {0} kontot {1} med ditt {2} konto har skickats till dig. +emailLinkIdp2=Har du inte fått en verifikationskod i din e-post? +emailLinkIdp3=för att skicka e-postmeddelandet igen. + +backToLogin=« Tillbaka till inloggningen + +emailInstruction=Fyll i ditt användarnamn eller din e-postadress, så kommer vi att skicka instruktioner för hur du skapar ett nytt lösenord. + +copyCodeInstruction=Vänligen kopiera den här koden och klistra in den i din applikation: + +personalInfo=Personlig information: +role_admin=Administratör +role_realm-admin=Realm-administratör +role_create-realm=Skapa realm +role_create-client=Skapa klient +role_view-realm=Visa realm +role_view-users=Visa användare +role_view-applications=Visa applikationer +role_view-clients=Visa klienter +role_view-events=Visa event +role_view-identity-providers=Visa identitetsleverantörer +role_manage-realm=Hantera realm +role_manage-users=Hantera användare +role_manage-applications=Hantera applikationer +role_manage-identity-providers=Hantera identitetsleverantörer +role_manage-clients=Hantera klienter +role_manage-events=Hantera event +role_view-profile=Visa profil +role_manage-account=Hantera konto +role_read-token=Läs element +role_offline-access=Åtkomst offline +client_account=Konto +client_security-admin-console=Säkerhetsadministratörskonsol +client_admin-cli=Administratörs-CLI +client_realm-management=Realmhantering + +invalidUserMessage=Ogiltigt användarnamn eller lösenord. +invalidEmailMessage=Ogiltig e-postadress. +accountDisabledMessage=Kontot är inaktiverat, kontakta administratör. +accountTemporarilyDisabledMessage=Kontot är tillfälligt inaktiverat, kontakta administratör eller försök igen senare. +expiredCodeMessage=Inloggningen nådde en maxtidsgräns. Vänligen försök igen. + +missingFirstNameMessage=Vänligen ange förnamn. +missingLastNameMessage=Vänligen ange efternamn. +missingEmailMessage=Vänligen ange e-post. +missingUsernameMessage=Vänligen ange användarnamn. +missingPasswordMessage=Vänligen ange lösenord. +missingTotpMessage=Vänligen ange autentiseringskod. +notMatchPasswordMessage=Lösenorden matchar inte. + +invalidPasswordExistingMessage=Det nuvarande lösenordet är ogiltigt. +invalidPasswordConfirmMessage=Lösenordsbekräftelsen matchar inte. +invalidTotpMessage=Autentiseringskoden är ogiltig. + +usernameExistsMessage=Användarnamnet finns redan. +emailExistsMessage=E-postadressen finns redan. + +federatedIdentityExistsMessage=Användare med {0} {1} finns redan. Vänligen logga in till kontohanteringen för att länka kontot. + +confirmLinkIdpTitle=Kontot finns redan +federatedIdentityConfirmLinkMessage=Användare med {0} {1} finns redan, Hur vill du forsätta? +federatedIdentityConfirmReauthenticateMessage=Autentisera som {0} för att länka ditt konto med {1} +confirmLinkIdpReviewProfile=Granska profil +confirmLinkIdpContinue=Lägg till i existerande konto + +configureTotpMessage=Du behöver konfigurera mobilautentiseraren för att aktivera ditt konto. +updateProfileMessage=Du behöver uppdatera din användarprofil för att aktivera ditt konto. +updatePasswordMessage=Du behöver byta ditt lösenord för att aktivera ditt konto. +verifyEmailMessage=Du behöver verifiera din e-postadress för att aktivera ditt konto. +linkIdpMessage=Du behöver verifiera din e-postadress för att länka ditt konto med {0}. + +emailSentMessage=Du bör inom kort motta ett epost-meddelande med ytterligare instruktioner inom kort. +emailSendErrorMessage=E-postmeddelandet kunde inte skickas, försök igen senare. + +accountUpdatedMessage=Ditt konto har uppdaterats. +accountPasswordUpdatedMessage=Ditt lösenord har uppdaterats. + +noAccessMessage=Ingen åtkomst + +invalidPasswordMinLengthMessage=Ogiltigt lösenord. Minsta längd är {0}. +invalidPasswordMinDigitsMessage=Ogiltigt lösenord: måste innehålla minst {0} siffror. +invalidPasswordMinLowerCaseCharsMessage=Ogiltigt lösenord: måste innehålla minst {0} små bokstäver. +invalidPasswordMinUpperCaseCharsMessage=Ogiltigt lösenord: måste innehålla minst {0} stora bokstäver. +invalidPasswordMinSpecialCharsMessage=Ogiltigt lösenord: måste innehålla minst {0} specialtecken. +invalidPasswordNotUsernameMessage=Ogiltigt lösenord: Får inte vara samma som användarnamnet. +invalidPasswordRegexPatternMessage=Ogiltigt lösenord: matchar inte regex mönstret(en). +invalidPasswordHistoryMessage=Ogiltigt lösenord: Får inte vara samma som de senaste {0} lösenorden. +invalidPasswordGenericMessage=Ogiltigt lösenord: Det nya lösenordet stämmer inte med lösenordspolicyn. + +failedToProcessResponseMessage=Misslyckades med att behandla svaret +httpsRequiredMessage=HTTPS krävs +realmNotEnabledMessage=Realm är inte aktiverad +invalidRequestMessage=Ogiltig förfrågan +failedLogout=Utloggning misslyckades +unknownLoginRequesterMessage=Okänd inloggningsförfrågan +loginRequesterNotEnabledMessage=Inloggningsförfrågaren är inte aktiverad +bearerOnlyMessage=Bearer-only-applikationer tillåts inte att initiera inloggning genom webbläsare +standardFlowDisabledMessage=Klienten tillåts inte att initiera inloggning genom webbläsare med det givna response_type. Standardflödet är inaktiverat för klienten. +implicitFlowDisabledMessage=Klienten tillåts inte att initiera inloggning genom webbläsare med det givna response_type. Villkorslöst flöde är inaktiverat för klienten. +invalidRedirectUriMessage=Ogiltig omdirigeringsadress +unsupportedNameIdFormatMessage=NameIDFormat stöds ej +invalidRequesterMessage=Ogiltig förfrågare +registrationNotAllowedMessage=Registrering tillåts ej +resetCredentialNotAllowedMessage=Återställning av uppgifter tillåts ej + +permissionNotApprovedMessage=Rättigheten ej godkänd. +noRelayStateInResponseMessage=Inget vidarebefordrat tillstånd i svaret från identitetsleverantör. +insufficientPermissionMessage=Otillräckliga tillstånd för att länka identiteter. +couldNotProceedWithAuthenticationRequestMessage=Kunde inte fortsätta med autentiseringsförfrågan till identitetsleverantör. +couldNotObtainTokenMessage=Kunde inte motta element från identitetsleverantör. +unexpectedErrorRetrievingTokenMessage=Oväntat fel när element hämtas från identitetsleverantör. +unexpectedErrorHandlingResponseMessage=Oväntat fel under hantering av svar från från identitetsleverantör. +identityProviderAuthenticationFailedMessage=Autentiseringen misslyckades. Kunde inte autentisera med identitetsleverantör. +identityProviderDifferentUserMessage=Autentiserad som {0}, men väntades att vara autentiserad som {1} +couldNotSendAuthenticationRequestMessage=Kunde inte skicka autentiseringsförfrågan till identitetsleverantör. +unexpectedErrorHandlingRequestMessage=Oväntat fel under hantering av autentiseringsförfrågan till identitetsleverantör. +invalidAccessCodeMessage=Ogiltig tillträdeskod. +sessionNotActiveMessage=Sessionen ej aktiv. +invalidCodeMessage=Ett fel uppstod, vänligen logga in igen genom din applikation. +identityProviderUnexpectedErrorMessage=Oväntat fel under autentiseringen med identitetsleverantör +identityProviderNotFoundMessage=Kunde inte hitta en identitetsleverantör med identifikatorn. +identityProviderLinkSuccess=Ditt konto lyckades med att länka {0} med kontot {1}. +staleCodeMessage=Den här sidan är inte längre giltig, vänligen gå tillbaka till din applikation och logga in igen +realmSupportsNoCredentialsMessage=Realmen stödjer inga inloggningstyper. +identityProviderNotUniqueMessage=Realmen stödjer flera identitetsleverantör. Kunde inte avgöra vilken identitetsleverantör som skall användas för autentisering. +emailVerifiedMessage=Din e-postadress har blivit verifierad. +staleEmailVerificationLink=Länken du klickade på är en gammal, inaktuell länk som inte längre är giltig. Kanske har du redan verifierat din e-post? + +backToApplication=« Tillbaka till applikationen +missingParameterMessage=Parametrar som saknas\: {0} +clientNotFoundMessage=Klienten hittades ej. +clientDisabledMessage=Klienten är inaktiverad. +invalidParameterMessage=Ogiltig parameter\: {0} +alreadyLoggedIn=Du är redan inloggad. + +p3pPolicy=CP="Det här är ingen P3P policy!" diff --git a/login/messages/messages_zh_CN.properties b/login/messages/messages_zh_CN.properties new file mode 100644 index 0000000..b2771b2 --- /dev/null +++ b/login/messages/messages_zh_CN.properties @@ -0,0 +1,234 @@ +# encoding: utf-8 +doLogIn=登录 +doRegister=注册 +doCancel=取消 +doSubmit=提交 +doYes=是 +doNo=否 +doContinue=继续 +doAccept=接受 +doDecline=拒绝 +doForgotPassword=忘记密码? +doClickHere=点击这里 +doImpersonate=模拟 +kerberosNotConfigured=Kerberos 没有配置 +kerberosNotConfiguredTitle=Kerberos 没有配置 +bypassKerberosDetail=您没有通过Kerberos登录 或者您的浏览器没有设置Kerberos登录. 请点击继续通过其他途径登录。 +kerberosNotSetUp=Kerberos没有配置,您不可以登录 +registerWithTitle=用 {0} 注册 +registerWithTitleHtml={0} +loginTitle=登录到 {0} +loginTitleHtml={0} +impersonateTitle={0} 模拟用户 +impersonateTitleHtml={0}模拟用户 +realmChoice=域 +unknownUser=未知用户 +loginTotpTitle=手机验证者配置 +loginProfileTitle=更新账户信息 +loginTimeout=登录超时,请重新开始登录 +oauthGrantTitle=授权 +oauthGrantTitleHtml={0} +errorTitle=很抱歉... +errorTitleHtml=我们很抱歉 ... +emailVerifyTitle=验证电子邮件地址 +emailForgotTitle=忘记密码? +updatePasswordTitle=更新密码 +codeSuccessTitle=成功码 +codeErrorTitle=错误码\: {0} + +termsTitle=条款 +termsTitleHtml=条款 +termsText=

    需要确定的条款

    + +recaptchaFailed=无效的验证码 +recaptchaNotConfigured=需要验证码,但是没有配置 +consentDenied=许可被拒绝。 + +noAccount=新用户? +username=用户名 +usernameOrEmail=用户名 或 电子邮箱地址 +firstName=名 +givenName=姓 +fullName=全名 +lastName=姓 +familyName=姓 +email=Email +password=密码 +passwordConfirm=确认密码 +passwordNew=新密码 +passwordNewConfirm=新密码确认 +rememberMe=记住我 +authenticatorCode=一次性验证码 +address=地址 +street=街道 +locality=市 +region=省,自治区,直辖市 +postal_code=邮政编码 +country=国家 +emailVerified=电子邮件已验证 +gssDelegationCredential=GSS Delegation Credential + +loginTotpStep1=在手机安装 FreeOTP 或 Google Authenticator. 这两个应用可以在 Google Play 和 Apple App Store找到. +loginTotpStep2=打开应用扫描二维码或者输入一次性码 +loginTotpStep3=输入应用提供的一次性码点击提交完成设置 +loginTotpOneTime=一次性验证码 + +oauthGrantRequest=您是否想要授予下列权限? +inResource=in + +emailVerifyInstruction1=一封包含验证邮箱具体步骤的邮件已经发送到您的邮箱。 +emailVerifyInstruction2=邮箱没有收到验证码? +emailVerifyInstruction3=重新发送电子邮件 + +emailLinkIdpTitle=链接 {0} +emailLinkIdp1=一封包含链接账户 {0} 和账户 {1} 到账户 {2} 的邮件已经发送到您的邮箱。 +emailLinkIdp2=邮箱没有收到验证码邮件? +emailLinkIdp3=重新发送电子邮件 + +backToLogin=« 回到登录 + +emailInstruction=输入您的用户名和邮箱,我们会发送一封带有设置新密码步骤的邮件到您的邮箱。 + +copyCodeInstruction=请复制这段验证码并粘贴到应用: + +personalInfo=个人信息\: +role_admin=管理员 +role_realm-admin=域管理员 +role_create-realm=创建域 +role_create-client=创建客户 +role_view-realm=查看域 +role_view-users=查看用户 +role_view-applications=查看应用 +role_view-clients=查看客户 +role_view-events=查看时间 +role_view-identity-providers=查看身份提供者 +role_manage-realm=管理域 +role_manage-users=管理用户 +role_manage-applications=管理应用 +role_manage-identity-providers=管理身份提供者 +role_manage-clients=管理客户 +role_manage-events=管理事件 +role_view-profile=查看用户信息 +role_manage-account=管理账户 +role_read-token=读取 token +role_offline-access=离线访问 +client_account=账户 +client_security-admin-console=安全管理控制台 +client_admin-cli=管理命令行工具 +client_realm-management=域管理 +client_broker=代理 + +invalidUserMessage=无效的用户名或密码。 +invalidEmailMessage=无效的电子邮件地址 +accountDisabledMessage=账户被禁用,请联系管理员。 +accountTemporarilyDisabledMessage=账户被暂时禁用,请稍后再试或联系管理员。 +expiredCodeMessage=登录超时,请重新登陆。 + +missingFirstNameMessage=请输入名 +missingLastNameMessage=请输入姓 +missingEmailMessage=请输入email. +missingUsernameMessage=请输入用户名 +missingPasswordMessage=请输入密码 +missingTotpMessage=请输入验证码 +notMatchPasswordMessage=密码不匹配。 + +invalidPasswordExistingMessage=无效的旧密码 +invalidPasswordConfirmMessage=确认密码不相同 +invalidTotpMessage=无效的验证码 + +usernameExistsMessage=用户名已被占用 +emailExistsMessage=电子邮件已存在。 + +federatedIdentityExistsMessage=用户 {0} {1} 已存在. 请登录账户管理界面链接账户. + +confirmLinkIdpTitle=账户已存在 +federatedIdentityConfirmLinkMessage=用户{0} {1} 已存在. 怎么继续? +federatedIdentityConfirmReauthenticateMessage=以 {0} 登录来将 {1} 连接到您的账户 +confirmLinkIdpReviewProfile=审查您的信息 +confirmLinkIdpContinue=添加到已知账户 + +configureTotpMessage=您需要设置验证码模块来激活您的账户 +updateProfileMessage=您需要更新您的简介来激活您的账户 +updatePasswordMessage=您需要更新您的密码来激活您的账户 +verifyEmailMessage=您需要验证您的电子邮箱来激活您的账户 +linkIdpMessage=您需要验证您的电子邮箱来连接到账户{0}. + +emailSentMessage=您很快会收到一封关于接下来操作的邮件。 +emailSendErrorMessage=无法发送邮件,请稍后再试 + +accountUpdatedMessage=您的账户已经更新。 +accountPasswordUpdatedMessage=您的密码已经更新 + +noAccessMessage=无权限 + +invalidPasswordMinLengthMessage=无效的密码:最短长度 {0}. +invalidPasswordMinDigitsMessage=无效的密码: 至少包含{0} 个数字 +invalidPasswordMinLowerCaseCharsMessage=无效的密码:至少包含 {0} 小写字母. +invalidPasswordMinUpperCaseCharsMessage=无效的密码:至少包含 {0} 大写字母. +invalidPasswordMinSpecialCharsMessage=无效的密码:至少包含 {0} 特殊字符. +invalidPasswordNotUsernameMessage=无效的密码: 不能与用户名相同. +invalidPasswordRegexPatternMessage=无效的密码: 无法与正则表达式匹配. +invalidPasswordHistoryMessage=无效的密码: 不能与前 {0} 个旧密码相同. + +failedToProcessResponseMessage=无法处理回复 +httpsRequiredMessage=需要HTTPS +realmNotEnabledMessage=域未启用 +invalidRequestMessage=非法的请求 +failedLogout=无法登出 +unknownLoginRequesterMessage=未知的登录请求发起方 +loginRequesterNotEnabledMessage=登录请求发起方为启用 +bearerOnlyMessage=Bearer-only 的应用允许通过浏览器登录 +standardFlowDisabledMessage=客户程序不允许发起指定返回类型的浏览器登录. 标准的登录流程已禁用。 +implicitFlowDisabledMessage=客户程序不允许发起指定返回类型的浏览器登录. 隐式的登录流程已禁用。 +invalidRedirectUriMessage=无效的跳转链接 +unsupportedNameIdFormatMessage=不支持的 nameID格式 +invalidRequesterMessage=无效的发起者 +registrationNotAllowedMessage=注册不允许 +resetCredentialNotAllowedMessage=不允许重置密码 + +permissionNotApprovedMessage=许可没有批准 +noRelayStateInResponseMessage=身份提供者没有返回中继状态信息 +insufficientPermissionMessage=权限不足以链接新的身份 +couldNotProceedWithAuthenticationRequestMessage=无法与身份提供者处理认证请求 +couldNotObtainTokenMessage=未从身份提供者获得token +unexpectedErrorRetrievingTokenMessage=从身份提供者获得Token时遇到未知错误 +unexpectedErrorHandlingResponseMessage=从身份提供者获得回复时遇到未知错误 +identityProviderAuthenticationFailedMessage=认证失败,无法通过身份提供者认证 +identityProviderDifferentUserMessage=认证为 {0}, 但期望认证为 {1} +couldNotSendAuthenticationRequestMessage=无法向身份提供方发送认证请求 +unexpectedErrorHandlingRequestMessage=在处理发向认证提供方的请求时,出现未知错误。 +invalidAccessCodeMessage=无效的验证码 +sessionNotActiveMessage=会话不在活动状态 +invalidCodeMessage=发生错误,请重新通过应用登录 +identityProviderUnexpectedErrorMessage=在与认证提供者认证过程中发生未知错误 +identityProviderNotFoundMessage=无法找到认证提供方 +identityProviderLinkSuccess=您的账户已经将账户{0} 与账户 {1} 链接. +staleCodeMessage=当前页面已无效,请到登录界面重新登录 +realmSupportsNoCredentialsMessage=域不支持特定类型密码 +identityProviderNotUniqueMessage=域支持通过多个身份提供者登录,不知道应用哪一种方式登录 +emailVerifiedMessage=您的电子邮箱已经验证。 +staleEmailVerificationLink=您点击的链接已无效。可能您已经验证过您的电子邮箱? + +locale_ca=Català +locale_de=Deutsch +locale_en=English +locale_es=Español +locale_fr=Français +locale_it=Italian +locale_ja=日本語 +locale_nl=Nederlands +locale_no=Norsk +locale_pt_BR=Português (Brasil) +locale_pt-BR=Português (Brasil) +locale_ru=Русский +locale_lt=Lietuvių +locale_zh-CN=中文简体 + +backToApplication=« 回到应用 +missingParameterMessage=缺少参数 \: {0} +clientNotFoundMessage=客户端未找到 +clientDisabledMessage=客户端已禁用 +invalidParameterMessage=无效的参数 \: {0} +alreadyLoggedIn=您已经登录 + +p3pPolicy="This is not a P3P policy!" diff --git a/login/register.ftl b/login/register.ftl new file mode 100644 index 0000000..5fce5a8 --- /dev/null +++ b/login/register.ftl @@ -0,0 +1,123 @@ +<#import "template.ftl" as layout> +<#assign userType = "not"/> +<@layout.registrationLayout; section> + <#if section = "title"> + ${msg("registerWithTitle",(realm.displayName!''))} + <#elseif section = "header"> + ${msg("registerWithTitleHtml",(realm.displayNameHtml!''))?no_esc} + <#if realm.internationalizationEnabled>(<#list locale.supported as l><#if l.label!=locale.current>${l.label}) + <#elseif section = "form"> +
    +
    + + <#if !realm.registrationEmailAsUsername> +
    + + +
    + +
    + + +
    + +
    + + +
    + +
    + + +
    + + <#if passwordRequired> +
    + + +
    + +
    + + +
    + + + <#switch userType> + <#case "member"> +
    + + +
    + <#break> + + + <#if recaptchaRequired??> +
    +
    +
    +
    +
    + + + +
    +
    +
    + +

    Proč se registrovat ?

    +

    Vplutím do zátoky Pirátů získáte možnost odebírat + emailové newslettery a přihlašovat se k dalším systémům strany + (např. fórum). +

    +

    Kromě odběratele novinek se můžete později stát příznivcem či dokonce + plnoprávným členem Pirátů. +

    + +

    Přihlášení existujícím účtem

    +
    Pro vytvoření účtu můžete použít již existující příhlášení do následujících služeb: + <#if realm.password && social.providers??> + + +
    +
    + +

    Více informací

    +

    Proč se registrovat a další související informace najdete v aplikaci Nalodění. +

    + +
    + + diff --git a/login/resources/css/firasans_opensans.css b/login/resources/css/firasans_opensans.css new file mode 100644 index 0000000..eaf3b4b --- /dev/null +++ b/login/resources/css/firasans_opensans.css @@ -0,0 +1,42 @@ +@font-face { + font-family: 'Fira Sans'; + font-style: italic; + font-weight: 300; + src: local('Fira Sans Light Italic'), local('FiraSans-LightItalic'), url(va9f4kDNxMZdWfMOD5VvkrBiQyf4VFw.ttf) format('truetype'); +} +@font-face { + font-family: 'Fira Sans'; + font-style: normal; + font-weight: 400; + src: local('Fira Sans Regular'), local('FiraSans-Regular'), url(va9E4kDNxMZdWfMOD5Vvl4jO.ttf) format('truetype'); +} +@font-face { + font-family: 'Fira Sans'; + font-style: normal; + font-weight: 500; + src: local('Fira Sans Medium'), local('FiraSans-Medium'), url(va9B4kDNxMZdWfMOD5VnZKveRhf_.ttf) format('truetype'); +} +@font-face { + font-family: 'Fira Sans'; + font-style: normal; + font-weight: 700; + src: local('Fira Sans Bold'), local('FiraSans-Bold'), url(va9B4kDNxMZdWfMOD5VnLK3eRhf_.ttf) format('truetype'); +} +@font-face { + font-family: 'Open Sans'; + font-style: normal; + font-weight: 400; + src: local('Open Sans Regular'), local('OpenSans-Regular'), url(mem8YaGs126MiZpBA-UFVZ0e.ttf) format('truetype'); +} +@font-face { + font-family: 'Open Sans'; + font-style: normal; + font-weight: 600; + src: local('Open Sans SemiBold'), local('OpenSans-SemiBold'), url(mem5YaGs126MiZpBA-UNirkOUuhs.ttf) format('truetype'); +} +@font-face { + font-family: 'Open Sans'; + font-style: normal; + font-weight: 700; + src: local('Open Sans Bold'), local('OpenSans-Bold'), url(mem5YaGs126MiZpBA-UN7rgOUuhs.ttf) format('truetype'); +} diff --git a/login/resources/css/lightGrey.png b/login/resources/css/lightGrey.png new file mode 100644 index 0000000000000000000000000000000000000000..20df0ee8b4a60619278f0f9a857058b772001be7 GIT binary patch literal 4618 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 MS=mF#7B|!W4-rBZmH+?% literal 0 HcmV?d00001 diff --git a/login/resources/css/mem5YaGs126MiZpBA-UN7rgOUuhs.ttf b/login/resources/css/mem5YaGs126MiZpBA-UN7rgOUuhs.ttf new file mode 100644 index 0000000000000000000000000000000000000000..11aec0f49e405c86631d7a177398edc8f60b6243 GIT binary patch literal 28192 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 JxKA>Q{tw$}-OB&~ literal 0 HcmV?d00001 diff --git a/login/resources/css/va9B4kDNxMZdWfMOD5VnZKveRhf_.ttf b/login/resources/css/va9B4kDNxMZdWfMOD5VnZKveRhf_.ttf new file mode 100644 index 0000000000000000000000000000000000000000..079b55fd294a026421c10e2b2b7a28db3c81a68c GIT binary patch literal 53604 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 KIGiV$%l$9f35$*Z literal 0 HcmV?d00001 diff --git a/login/resources/css/va9E4kDNxMZdWfMOD5Vvl4jO.ttf b/login/resources/css/va9E4kDNxMZdWfMOD5Vvl4jO.ttf new file mode 100644 index 0000000000000000000000000000000000000000..a330a88d000a8ff83a608b4865e49f5f8c441db8 GIT binary patch literal 54032 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 literal 0 HcmV?d00001 diff --git a/login/resources/css/va9f4kDNxMZdWfMOD5VvkrBiQyf4VFw.ttf b/login/resources/css/va9f4kDNxMZdWfMOD5VvkrBiQyf4VFw.ttf new file mode 100644 index 0000000000000000000000000000000000000000..cf0ec6c3b9e179556fded494a4c92fb3815db083 GIT binary patch literal 54300 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

    iOWvZYQ2=sc&s)9pLvR3X_0@`crnyTCc2AWbDE} zh~7krHI3FtWmY>ASPy9ZP-5*eiLW-K9cA+ub*yuyvi{K-qXyO_Gg)bH2MF$?uuVvN zW)pV~E23uBDszE154lVO>%RrSIT2e%%VQzX7h&7b@>q<&bWSF+e(52<_@g8?Ys(ER*&D zC`F0Wlx0#Mt@_h)qLH!bobGi#nJ|s#I#alM)3yfFwni}jJVwp=*lu*zF2?;k*hOfa zy_qrh7HkXpSj!pbeQ3BXLc?th&$ZYN^xED@{RYwLIF<97I!S#UwhJw`cQfX$N0V)a zOMH||yvXvnlP!;HwLET`<#AIjk6S=ne4NoQsoY7H%1w^`7<+U&xuqUD|crWhzu=Cs# z?Pv%71ot-VBF`8l?@IT0S9%ubY99s85cU*KwC>=kz3EAoEzY)VagO(?k7a-RIq38- zw#oa{74K6Y6P23o6&-4BYkrhcpAOb){A~u)wTmijNB)hEMu5Kcz7=fL-p!-9AII+@ zb26#?Wb}v_--pqq5r=GCBPOxLnJ;*$FvNRx z65dH^dZ7zvIWT+7PM+3$23Ol@ZddYF^~i8Em0a}?B@sGI@M4%wOO5T+1FUf0*q!%^ zO5$D>jUSRMOz`;qQuQnL6@8q_2!RlC5U5wuj6d^DHlHxMJZj}&8lW|8*@xf4h&kBN zCZv)Ug+d#kh{0rUzKX4rhI%%X+wCYmK>ew2Zdlp5a3rp2d*dGjk*lX0Fk1x2It&yaRfY=%2EYSJ= zk_AGAX-`_=VSc-caosn}3N?N|%D$?!D(l0vJ@;tr%TN;Wak)%LEuEFr;p}@j;y4e@ zJJn#)^M#+JX>uba0zXoySxcCvWZa+HrnUuYzw)*Vxs2C;&Rh8xN>nY|k-CiKb+xcU zTZJ|*diG!n5rO|0=Yg@49 ztJ=Sg%gmfgHJR(l&3cTU(}y`Jw2S^TuHg zUJvK{25bpf7c(bbf~_-G+rkNpOM(6-Yy-N;moWo~&uv80_i}v1?KYD4TbVuH#;Jx1 z=M1hSzRFQH=i9;=j{zhI;(uGw3|_~KEiQPHx!^W)!R_XPJIn=7HW%FP($`V?_mblu zVJp%5ux-@l{kX*~#;#8r?=#>&#jVR^yTsu=8&1B~M_oO(^qIeZu1@o8SlQ0wIs+pv9NcDhpV9Po=%u;L%50 ztw0WDQJl8b|BkiNg2%GTpA5eo!4FFZGNQy&@SV$gCd|3ryiam2O3A-=+e&hz-(<&E z8c7S<`2}+vFU6FekSM{-DpuB1lwwB^e!shsk@pe*9XB4~$ zUEU7wd>0rU_EyDXkD#=MgyhsNq#~Ynl93-|P%;;}49Sns zoGxc^itk)QqUf2rlNU43v8ZKAlM1^PS?uDwC~+_PkL@n5mTO~V^%~(@(<0S4ZsQo7 z8?6N#G=Q7D%4+Z`tI@i@b=Li@^ZKej)%}&eZ#mWXErDNJF}KnO6-J8iNcb$BTVX}a zC^!+f#?Lh4#8gJi$>4>?X4xz0I?D>%yq>Q2db+`~!fB>R?WRbLURAf73N@JuwR=51 z!RzUEQn+bVUyR*6|ZO~cnvzi^rYRZ z&#CB+?G_f-&8qtlBNhIYnHOCOS=v|hdb06Qt~z`V!+@od{q98WYdmG`nc^$>e#kQf zhmpa-q7-Hq#%iDp*$ASJmh9>H)~(K2dP8HDJ7kgeljm~vTs7l^Q?EiC^Kzn0 zRcNXsX}xC#L?Dj^iC9ln)8Lw(QiMPS!)^iI#1jO4TbCxJsd;8SR^!RIJ<9V%t?&3> zPO6EK*@dVR44@)2S*X&}Hm@6eei!C{;M}zn4 z)ao19MoZ2rmYKC!W;W4svR2EpKHM`AT!3l6h8;ys$c4x z?u6E4GR8;Xj>h7V#)zDIxjfFxBYgB6;FvBMo>vupVquBK?_FmZK5NxRlaSiX~@)? z9T3rwSp^!>Z0@bN8`5SPGSxI>x@kzKX~=Zbkcw%@bkmS&rXf>IL#CL9w3~WNGxcbM zc3cV9DC#lY)MJ{d$8=MVX{H_>rXKC)`MOL!W|(?3nR?7L^_Xbt(PZi|+0Zov2sltlYLjpqEOr~3|~9@FTr>F(VH$d7eeBQw(6&Cb*5G@WF1b>^JQ=A6qZ z&m2z2g`Pj&klx5Y0Jjt%We~G>%a@C4V>$Z_br$_V) zC7bV(T@>8{g|61Im`0qR^uZ%`o`UxG7f2($@owvlA8ozyXcJ7e6(j7WO}9qD!9Kt zj;`V9{>u1?A$<`ln#&)5rY9rSgV|}wMxTbPuUQd=vyY=sJ?iYF_RdP|nQ@Dhcg@P) zFDrX@EcVV<$va$S?`@U6hgI?(R>^x<%=O;c!8uR;-2iRNYgm=nQYUQ*AEl-^uKB$3r9Vhgl z$zD=`Yb6apalN;KdmH#|Lz1@_oO=NIg>X@nmy?{7O8A$Wu(Lu-RW~P!scgFMnRi2DRGDpO11FPkQ+qEI|n_;Y+M_BUZWJVh+87)ohDb zvu(_G_pvIL7Dtz7x|yEoj$)>Jf)%3lG3GE&ewmdge+vz*s%Hk}ABuq`jz#NQnR>X0 zNyZ}aFGZ6{)3dXz*@>^}*{^DB#SI#7!B6YwGWQn*SzY#&&VZ!ZBTcQ(%$nel@_Gd- zzVs`l85e9L5>V+{Hc^ffkiQr0Y+@I`gIo9Ck2G^@JbK1RrwB?n8HqptF_l~Ce$If0 zmF=QMrMnrdQb@P29VzZqcnhkn3+X?NdTxiq2BWjh^Sy>B zqfK#K>RatGrOf84#qg2(1+6P-ma>XKb#sG>Ypi znd^*4ah&y z=|2FDVP&Yc4!$a3C%Atsa{e=-=4BUL$lZI(t~kFtdi%M{F6)l2KKD|d@8OoO?&t#- zF1w;T`V1F`bw@W}rqHi*byzo4CBV|nLsOs~$Fbg&kN$^XB3L^IoLB^O`NiN)2ovR) z1|Dg=y*dqJ%s5>Gcs`vmvH)y9GYw;>&tck!n*shy{})|r!(5t%H8D=Q*h^aoZ+=#E zcHi>V8{+pI@w0Euy7+y4NBGoTXYogm^tp0yd0)KgNS~`$U9~*^t0R7L>05lWu6~O@ z@8_+4{)3;l`}tizxA^%(KkwBQV)0Lo^a*-tbu3EIMxW?Ql5lClhnYin-N;uf-f-^~ z|N3mV@KO&?J^nxa);5-49@B#^CmE46Soa+Vm50|Ev ze!H}(q;tATr?J=yKE5WpLAL(q*OW;K~1krXgMS z)hXdDOc`>CfmUz7H|2hk0+*3$ybnpJYI8}X+YL1aRW9YE+_j#sL#k4W-j1t; ztm6URS=le4H9yOJpxk>H{Y`W;_a=Uh8wzhR&DrH!1*>uA6ZcP8d4D?k)9BBTVf;n( zndmP$@hv^ir@2e<8KBoe={5mf|AJES{NI8!T97G( zHd9_|JKbtjLMEW_+w$_va=t6^TbbvZmGH9MNBM{I8d*J*PUTns&*!IlWa(;Zz|E3f zgaQE!>cCa4!EAgh#*@0J8@Di|4jqf&(wPv|ChOOw&_LZE_W`7B9~`UKM&4lw9R5Dm c<!AXP+E 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 z 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

    +
    +
    +
    + +
    + + ${realm.displayName} + + + ${realm.displayName} + +
    +
    +
    +
    +
    +
    +
    +
    +
    +

    <#nested "header">

    +
    +
    +
    + <#if message?has_content> + <#if message.type = 'success'>
    + <#if message.type = 'warning'>
    + <#if message.type = 'error'>
    + <#if message.type = 'info'>
    ${message.summary?no_esc}
    + +
    +
    +
    +
    +
    + <#nested "form"> +
    +
    +
    +
    + + + + + diff --git a/login/terms.ftl b/login/terms.ftl new file mode 100644 index 0000000..2c92aeb --- /dev/null +++ b/login/terms.ftl @@ -0,0 +1,20 @@ +<#import "template.ftl" as layout> +<@layout.registrationLayout displayMessage=false; section> + <#if section = "title"> + ${msg("termsTitle")} + <#elseif section = "header"> + ${msg("termsTitleHtml")} + <#elseif section = "form"> +
    +
    + ${msg("termsText")?no_esc} +
    +
    + + +
    +
    + + diff --git a/login/theme.properties b/login/theme.properties new file mode 100644 index 0000000..3f449dd --- /dev/null +++ b/login/theme.properties @@ -0,0 +1,12 @@ +locales=cs,en + +styles=css/style.css + +default_encoding=UTF-8 + +kcButtonClass=sso-form-button +# classes defining priority of the button - primary or default (there is typically only one priority button for the form) +kcButtonPrimaryClass=sso-form-button-primary +kcButtonDefaultClass= +# classes defining size of the button +kcButtonLargeClass=

    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 d0mRO}xo^G_%I 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 SdSQM28?+M|D(2r_;{O0|uQ74} literal 0 HcmV?d00001 diff --git a/login/resources/fonts/fontawesome-webfont.woff2 b/login/resources/fonts/fontawesome-webfont.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..4d13fc60404b91e398a37200c4a77b645cfd9586 GIT binary patch literal 77160 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 literal 0 HcmV?d00001 diff --git a/login/resources/img/brand/logo_napis.svg b/login/resources/img/brand/logo_napis.svg new file mode 100644 index 0000000..08b8560 --- /dev/null +++ b/login/resources/img/brand/logo_napis.svg @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/login/resources/img/brand/logo_napis_white.png b/login/resources/img/brand/logo_napis_white.png new file mode 100644 index 0000000000000000000000000000000000000000..684a8b0849a04cf8fe8f2e3d45756e746e75e02c GIT binary patch literal 16011 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 Ya~Oh;u(iai`d5Cdpdnu_`|->F0W$fY!2kdN literal 0 HcmV?d00001 diff --git a/login/resources/js/fontawesome_all.js b/login/resources/js/fontawesome_all.js new file mode 100644 index 0000000..565018b --- /dev/null +++ b/login/resources/js/fontawesome_all.js @@ -0,0 +1,14 @@ +/*! + * Font Awesome Free 5.0.1 by @fontawesome - http://fontawesome.com + * License - http://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + */ +!function(){"use strict";function c(c){"function"==typeof s.hooks.addPack?s.hooks.addPack(c,m):s.styles[c]=r({},s.styles[c]||{},m)}var l={};try{"undefined"!=typeof window&&(l=window)}catch(c){}var h=(l.navigator||{}).userAgent,v=void 0===h?"":h,z=l,e=(~v.indexOf("MSIE")||v.indexOf("Trident/"),[1,2,3,4,5,6,7,8,9,10]),a=e.concat([11,12,13,14,15,16,17,18,19,20]),m=(["xs","sm","lg","fw","ul","li","border","pull-left","pull-right","spin","pulse","rotate-90","rotate-180","rotate-270","flip-horizontal","flip-vertical","stack","stack-1x","stack-2x","inverse","layers","layers-text","layers-counter"].concat(e.map(function(c){return c+"x"})).concat(a.map(function(c){return"w-"+c})),{ + "facebook-f":[264,512,[],"f39e","M76.7 512V283H0v-91h76.7v-71.7C76.7 42.4 124.3 0 193.8 0c33.3 0 61.9 2.5 70.2 3.6V85h-48.2c-37.8 0-45.1 18-45.1 44.3V192H256l-11.7 91h-73.6v229"], + google:[488,512,[],"f1a0","M488 261.8C488 403.3 391.1 504 248 504 110.8 504 0 393.2 0 256S110.8 8 248 8c66.8 0 123 24.5 166.3 64.9l-67.5 64.9C258.5 52.6 94.3 116.6 94.3 256c0 86.5 69.1 156.6 153.7 156.6 98.2 0 135-70.4 140.8-106.9H248v-85.3h236.1c2.3 12.7 3.9 24.9 3.9 41.4z"], + "google-plus":[496,512,[],"f2b3","M248 8C111.1 8 0 119.1 0 256s111.1 248 248 248 248-111.1 248-248S384.9 8 248 8zm-70.7 372c-68.8 0-124-55.5-124-124s55.2-124 124-124c31.3 0 60.1 11 83 32.3l-33.6 32.6c-13.2-12.9-31.3-19.1-49.4-19.1-42.9 0-77.2 35.5-77.2 78.1s34.2 78.1 77.2 78.1c32.6 0 64.9-19.1 70.1-53.3h-70.1v-42.6h116.9c1.3 6.8 1.9 13.6 1.9 20.7 0 70.8-47.5 121.2-118.8 121.2zm230.2-106.2v35.5H372v-35.5h-35.5v-35.5H372v-35.5h35.5v35.5h35.2v35.5h-35.2z"], + instagram:[448,512,[],"f16d","M224.1 141c-63.6 0-114.9 51.3-114.9 114.9s51.3 114.9 114.9 114.9S339 319.5 339 255.9 287.7 141 224.1 141zm0 189.6c-41.1 0-74.7-33.5-74.7-74.7s33.5-74.7 74.7-74.7 74.7 33.5 74.7 74.7-33.6 74.7-74.7 74.7zm146.4-194.3c0 14.9-12 26.8-26.8 26.8-14.9 0-26.8-12-26.8-26.8s12-26.8 26.8-26.8 26.8 12 26.8 26.8zm76.1 27.2c-1.7-35.9-9.9-67.7-36.2-93.9-26.2-26.2-58-34.4-93.9-36.2-37-2.1-147.9-2.1-184.9 0-35.8 1.7-67.6 9.9-93.9 36.1s-34.4 58-36.2 93.9c-2.1 37-2.1 147.9 0 184.9 1.7 35.9 9.9 67.7 36.2 93.9s58 34.4 93.9 36.2c37 2.1 147.9 2.1 184.9 0 35.9-1.7 67.7-9.9 93.9-36.2 26.2-26.2 34.4-58 36.2-93.9 2.1-37 2.1-147.8 0-184.8zM398.8 388c-7.8 19.6-22.9 34.7-42.6 42.6-29.5 11.7-99.5 9-132.1 9s-102.7 2.6-132.1-9c-19.6-7.8-34.7-22.9-42.6-42.6-11.7-29.5-9-99.5-9-132.1s-2.6-102.7 9-132.1c7.8-19.6 22.9-34.7 42.6-42.6 29.5-11.7 99.5-9 132.1-9s102.7-2.6 132.1 9c19.6 7.8 34.7 22.9 42.6 42.6 11.7 29.5 9 99.5 9 132.1s2.7 102.7-9 132.1z"], + microsoft:[448,512,[],"f3ca","M0 32h214.6v214.6H0V32zm233.4 0H448v214.6H233.4V32zM0 265.4h214.6V480H0V265.4zm233.4 0H448V480H233.4V265.4z"], + openid:[448,512,[],"f19b","M271.5 432l-68 32C88.5 453.7 0 392.5 0 318.2c0-71.5 82.5-131 191.7-144.3v43c-71.5 12.5-124 53-124 101.3 0 51 58.5 93.3 135.7 103v-340l68-33.2v384zM448 291l-131.3-28.5 36.8-20.7c-19.5-11.5-43.5-20-70-24.8v-43c46.2 5.5 87.7 19.5 120.3 39.3l35-19.8L448 291z"], + twitter:[512,512,[],"f099","M459.37 151.716c.325 4.548.325 9.097.325 13.645 0 138.72-105.583 298.558-298.558 298.558-59.452 0-114.68-17.219-161.137-47.106 8.447.974 16.568 1.299 25.34 1.299 49.055 0 94.213-16.568 130.274-44.832-46.132-.975-84.792-31.188-98.112-72.772 6.498.974 12.995 1.624 19.818 1.624 9.421 0 18.843-1.3 27.614-3.573-48.081-9.747-84.143-51.98-84.143-102.985v-1.299c13.969 7.797 30.214 12.67 47.431 13.319-28.264-18.843-46.781-51.005-46.781-87.391 0-19.492 5.197-37.36 14.294-52.954 51.655 63.675 129.3 105.258 216.365 109.807-1.624-7.797-2.599-15.918-2.599-24.04 0-57.828 46.782-104.934 104.934-104.934 30.213 0 57.502 12.67 76.67 33.137 23.715-4.548 46.456-13.32 66.599-25.34-7.798 24.366-24.366 44.833-46.132 57.827 21.117-2.273 41.584-8.122 60.426-16.243-14.292 20.791-32.161 39.308-52.628 54.253z"], + }),t=z||{};t.___FONT_AWESOME___||(t.___FONT_AWESOME___={}),t.___FONT_AWESOME___.styles||(t.___FONT_AWESOME___.styles={}),t.___FONT_AWESOME___.hooks||(t.___FONT_AWESOME___.hooks={}),t.___FONT_AWESOME___.shims||(t.___FONT_AWESOME___.shims=[]);var s=t.___FONT_AWESOME___,r=Object.assign||function(c){for(var l=1;l-1;z--){var e=h[z],a=(e.tagName||"").toUpperCase();["STYLE","LINK"].indexOf(a)>-1&&(v=e)}return K.head.insertBefore(l,v),c}}function v(){return++Cc}function z(c){for(var l=[],h=(c||[]).length>>>0;h--;)l[h]=c[h];return l}function e(c){return c.classList?z(c.classList):(c.getAttribute("class")||"").split(" ").filter(function(c){return c})}function a(c,h){var v=h.split("-"),z=v[0],e=v.slice(1).join("-");return z!==c||""===e||l(e)?null:e}function m(c){return(""+c).replace(/&/g,"&").replace(/"/g,""").replace(/'/g,"'").replace(//g,">")}function t(c){return Object.keys(c||{}).reduce(function(l,h){return l+(h+'="')+m(c[h])+'" '},"").trim()}function s(c){return Object.keys(c||{}).reduce(function(l,h){return l+(h+": ")+c[h]+";"},"")}function r(c){return c.size!==Vc.size||c.x!==Vc.x||c.y!==Vc.y||c.rotate!==Vc.rotate||c.flipX||c.flipY}function f(c){var l=c.transform,h=c.containerWidth,v=c.iconWidth;return{outer:{transform:"translate("+h/2+" 256)"},inner:{transform:"translate("+32*l.x+", "+32*l.y+") "+" "+("scale("+l.size/16*(l.flipX?-1:1)+", "+l.size/16*(l.flipY?-1:1)+") ")+" "+("rotate("+l.rotate+" 0 0)")},path:{transform:"translate("+v/2*-1+" -256)"}}}function M(c){var l=c.transform,h=c.width,v=void 0===h?$:h,z=c.height,e=void 0===z?$:z,a=c.startCentered,m=void 0!==a&&a,t="";return t+=m&&Z?"translate("+(l.x/oc-v/2)+"em, "+(l.y/oc-e/2)+"em) ":m?"translate(calc(-50% + "+l.x/oc+"em), calc(-50% + "+l.y/oc+"em)) ":"translate("+l.x/oc+"em, "+l.y/oc+"em) ",t+="scale("+l.size/oc*(l.flipX?-1:1)+", "+l.size/oc*(l.flipY?-1:1)+") ",t+="rotate("+l.rotate+"deg) "}function i(c){var l,h=c.icons,z=h.main,e=h.mask,a=c.prefix,m=c.iconName,t=c.transform,s=c.symbol,r=c.title,f=c.extra,M=e.found?e:z,i=M.width,n=M.height,H="fa-w-"+Math.ceil(i/n*16),o=[Hc.replacementClass,m?Hc.familyPrefix+"-"+m:"",H].concat(f.classes).join(" "),V={children:[],attributes:fc({},f.attributes,(l={},rc(l,cc,""),rc(l,"data-prefix",a),rc(l,"data-icon",m),rc(l,"class",o),rc(l,"role","img"),rc(l,"xmlns","http://www.w3.org/2000/svg"),rc(l,"viewBox","0 0 "+i+" "+n),l))};r&&V.children.push({tag:"title",attributes:{id:V.attributes["aria-labelledby"]||"title-"+v()},children:[r]});var C=fc({},V,{prefix:a,iconName:m,main:z,mask:e,transform:t,symbol:s,styles:f.styles}),L=e.found&&z.found?uc(C):dc(C),u=L.children,d=L.attributes;return C.children=u,C.attributes=d,s?gc(C):pc(C)}function n(c){var l,h=c.content,v=c.width,z=c.height,e=c.transform,a=c.title,m=c.extra,t=fc({},m.attributes,a?{title:a}:{},(l={},rc(l,cc,""),rc(l,"class",m.classes.join(" ")),l)),f=fc({},m.styles);r(e)&&(f.transform=M({transform:e,startCentered:!0,width:v,height:z}),f["-webkit-transform"]=f.transform);var i=s(f);i.length>0&&(t.style=i);var n=[];return n.push({tag:"span",attributes:t,children:[h]}),a&&n.push({tag:"span",attributes:{class:"sr-only"},children:[a]}),n}function H(c,l){return Nc[c][l]}function o(c,l){return qc[c][l]}function V(c){return Tc[c]||{prefix:null,iconName:null}}function C(c){return c.reduce(function(c,l){var h=a(Hc.familyPrefix,l);if(Fc[l])c.prefix=l;else if(h){var v="fa"===c.prefix?V(h):{};c.iconName=v.iconName||h,c.prefix=v.prefix||c.prefix}else l!==Hc.replacementClass&&0!==l.indexOf("fa-w-")&&c.rest.push(l);return c},Wc())}function L(c,l,h){if(c&&c[l]&&c[l][h])return{prefix:l,iconName:h,icon:c[l][h]}}function u(c){var l=c.tag,h=c.attributes,v=void 0===h?{}:h,z=c.children,e=void 0===z?[]:z;return"string"==typeof c?m(c):"<"+l+" "+t(v)+">"+e.map(u).join("")+""}function d(c){var l=c.getAttribute?c.getAttribute("class"):null;return!!l&&(!!~l.toString().indexOf(Hc.replacementClass)||~l.toString().indexOf("fa-layers-text"))}function p(){return!0===Hc.autoReplaceSvg?Ic.replace:Ic[Hc.autoReplaceSvg]||Ic.replace}function g(c,l){var h="function"==typeof l?l:Pc;0===c.length?h():(U.requestAnimationFrame||function(c){return c()})(function(){var l=p(),v=kc.begin("mutate");c.map(l),v(),h()})}function b(c){Rc=!0,c(),Rc=!1}function w(c){if(G){var l=c.treeCallback,h=c.nodeCallback,v=c.pseudoElementsCallback,a=new G(function(c){Rc||z(c).forEach(function(c){if("childList"===c.type&&c.addedNodes.length>0&&!d(c.addedNodes[0])&&(Hc.searchPseudoElements&&v(c.target),l(c.target)),"attributes"===c.type&&"class"===c.attributeName&&c.target.parentNode&&Hc.searchPseudoElements&&v(c.target.parentNode),"attributes"===c.type&&d(c.target)&&~ac.indexOf(c.attributeName))if("class"===c.attributeName){var z=C(e(c.target)),a=z.prefix,m=z.iconName;a&&c.target.setAttribute("data-prefix",a),m&&c.target.setAttribute("data-icon",m)}else h(c.target)})});K.getElementsByTagName&&a.observe(K.getElementsByTagName("body")[0],{childList:!0,attributes:!0,characterData:!0,subtree:!0})}}function y(c){for(var l="",h=0;h1&&void 0!==arguments[1]?arguments[1]:null,h=K.documentElement.classList,v=function(c){return h.add(hc+"-"+c)},e=function(c){return h.remove(hc+"-"+c)},a=Object.keys(ll),m=["."+hl+":not(["+cc+"])"].concat(a.map(function(c){return"."+c+":not(["+cc+"])"})).join(", ");if(0!==m.length){var t=z(c.querySelectorAll(m));if(t.length>0){v("pending"),e("complete");var s=kc.begin("onTree"),r=t.reduce(function(c,l){try{var h=O(l);h&&c.push(h)}catch(c){vc||c instanceof _&&console.error(c)}return c},[]);s(),g(r,function(){v("active"),v("complete"),e("pending"),"function"==typeof l&&l()})}}}function q(c){var l=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,h=O(c);h&&g([h],l)}function T(c){return{found:!0,width:c[0],height:c[1],icon:{tag:"path",attributes:{fill:"currentColor",d:c.slice(4)[0]}}}}function j(){Hc.autoAddCss&&(sl||h(tl()),sl=!0)}function F(c,l){return Object.defineProperty(c,"abstract",{get:l}),Object.defineProperty(c,"html",{get:function(){return c.abstract.map(function(c){return u(c)})}}),Object.defineProperty(c,"node",{get:function(){if(K.createElement){var l=K.createElement("div");return l.innerHTML=c.html,l.children}}}),c}function W(c){var l=c.prefix,h=void 0===l?"fa":l,v=c.iconName;if(v)return L(rl.definitions,h,v)||L(wc.styles,h,v)}var P=function(){},I={},R={},B=null,X={mark:P,measure:P};try{"undefined"!=typeof window&&(I=window),"undefined"!=typeof document&&(R=document),"undefined"!=typeof MutationObserver&&(B=MutationObserver),"undefined"!=typeof performance&&(X=performance)}catch(c){}var Y=(I.navigator||{}).userAgent,D=void 0===Y?"":Y,U=I,K=R,G=B,J=X,Q=!!U.document,Z=~D.indexOf("MSIE")||~D.indexOf("Trident/"),$=16,cc="data-fa-processed",lc="data-fa-pseudo-element",hc="fontawesome-i2svg",vc=function(){try{return!0}catch(c){return!1}}(),zc=[1,2,3,4,5,6,7,8,9,10],ec=zc.concat([11,12,13,14,15,16,17,18,19,20]),ac=["class","data-prefix","data-icon","data-fa-transform","data-fa-mask"],mc=["xs","sm","lg","fw","ul","li","border","pull-left","pull-right","spin","pulse","rotate-90","rotate-180","rotate-270","flip-horizontal","flip-vertical","stack","stack-1x","stack-2x","inverse","layers","layers-text","layers-counter"].concat(zc.map(function(c){return c+"x"})).concat(ec.map(function(c){return"w-"+c})),tc=function(c,l){if(!(c instanceof l))throw new TypeError("Cannot call a class as a function")},sc=function(){function c(c,l){for(var h=0;h=0||Object.prototype.hasOwnProperty.call(c,v)&&(h[v]=c[v]);return h},ic=function(c){if(Array.isArray(c)){for(var l=0,h=Array(c.length);l0&&(h.style=e),r(z)){var a=f({transform:z,containerWidth:v.width,iconWidth:v.width});l.push({tag:"g",attributes:fc({},a.outer),children:[{tag:"g",attributes:fc({},a.inner),children:[{tag:v.icon.tag,children:v.icon.children,attributes:fc({},v.icon.attributes,a.path)}]}]})}else l.push(v.icon);return{children:l,attributes:h}},pc=function(c){var l=c.children,h=c.main,v=c.mask,z=c.attributes,e=c.styles,a=c.transform;if(r(a)&&h.found&&!v.found){var m={x:h.width/h.height/2,y:.5};z.style=s(fc({},e,{"transform-origin":m.x+a.x/16+"em "+(m.y+a.y/16)+"em"}))}return[{tag:"svg",attributes:z,children:l}]},gc=function(c){var l=c.prefix,h=c.iconName,v=c.children,z=c.attributes,e=c.symbol,a=!0===e?l+"-"+Hc.familyPrefix+"-"+h:e;return[{tag:"svg",attributes:{style:"display: none;"},children:[{tag:"symbol",attributes:fc({},z,{id:a}),children:v}]}]},bc=U||{};bc.___FONT_AWESOME___||(bc.___FONT_AWESOME___={}),bc.___FONT_AWESOME___.styles||(bc.___FONT_AWESOME___.styles={}),bc.___FONT_AWESOME___.hooks||(bc.___FONT_AWESOME___.hooks={}),bc.___FONT_AWESOME___.shims||(bc.___FONT_AWESOME___.shims=[]);var wc=bc.___FONT_AWESOME___,yc=function(){},Sc=Hc.measurePerformance&&J&&J.mark&&J.measure?J:{mark:yc,measure:yc},_c=function(c){Sc.mark('FA "5.0.1" '+c+" ends"),Sc.measure('FA "5.0.1" '+c,'FA "5.0.1" '+c+" begins",'FA "5.0.1" '+c+" ends")},kc={begin:function(c){return Sc.mark('FA "5.0.1" '+c+" begins"),function(){return _c(c)}},end:_c},Ac=function(c,l){return function(h,v,z,e){return c.call(l,h,v,z,e)}},xc=function(c,l,h,v){var z,e,a,m=Object.keys(c),t=m.length,s=void 0!==v?Ac(l,v):l;for(void 0===h?(z=1,a=c[m[0]]):(z=0,a=h);z0&&(c[v]=z.join(":").trim()),c},{})),h},Xc=function(c){var l=c.getAttribute("data-prefix"),h=c.getAttribute("data-icon"),v=void 0!==c.innerText?c.innerText.trim():"",z=C(e(c));return l&&h&&(z.prefix=l,z.iconName=h),z.prefix&&v.length>1?z.iconName=o(z.prefix,c.innerText):z.prefix&&1===v.length&&(z.iconName=H(z.prefix,y(c.innerText))),z},Yc=function(c){var l={size:16,x:0,y:0,flipX:!1,flipY:!1,rotate:0};return c?c.toLowerCase().split(" ").reduce(function(c,l){var h=l.toLowerCase().split("-"),v=h[0],z=h.slice(1).join("-");if(v&&"h"===z)return c.flipX=!0,c;if(v&&"v"===z)return c.flipY=!0,c;if(z=parseFloat(z),isNaN(z))return c;switch(v){case"grow":c.size=c.size+z;break;case"shrink":c.size=c.size-z;break;case"left":c.x=c.x-z;break;case"right":c.x=c.x+z;break;case"up":c.y=c.y-z;break;case"down":c.y=c.y+z;break;case"rotate":c.rotate=c.rotate+z}return c},l):l},Dc=function(c){return Yc(c.getAttribute("data-fa-transform"))},Uc=function(c){var l=c.getAttribute("data-fa-symbol");return null!==l&&(""===l||l)},Kc=function(c){var l=z(c.attributes).reduce(function(c,l){return"class"!==c.name&&"style"!==c.name&&(c[l.name]=l.value),c},{}),h=c.getAttribute("title");return Hc.autoA11y&&(h?l["aria-labelledby"]=Hc.replacementClass+"-title-"+v():l["aria-hidden"]="true"),l},Gc=function(c){var l=c.getAttribute("data-fa-mask");return l?C(l.split(" ").map(function(c){return c.trim()})):Wc()};_.prototype=Object.create(Error.prototype),_.prototype.constructor=_;var Jc={fill:"currentColor"},Qc={attributeType:"XML",repeatCount:"indefinite",dur:"2s"},Zc={tag:"path",attributes:fc({},Jc,{d:"M156.5,447.7l-12.6,29.5c-18.7-9.5-35.9-21.2-51.5-34.9l22.7-22.7C127.6,430.5,141.5,440,156.5,447.7z M40.6,272H8.5 c1.4,21.2,5.4,41.7,11.7,61.1L50,321.2C45.1,305.5,41.8,289,40.6,272z M40.6,240c1.4-18.8,5.2-37,11.1-54.1l-29.5-12.6 C14.7,194.3,10,216.7,8.5,240H40.6z M64.3,156.5c7.8-14.9,17.2-28.8,28.1-41.5L69.7,92.3c-13.7,15.6-25.5,32.8-34.9,51.5 L64.3,156.5z M397,419.6c-13.9,12-29.4,22.3-46.1,30.4l11.9,29.8c20.7-9.9,39.8-22.6,56.9-37.6L397,419.6z M115,92.4 c13.9-12,29.4-22.3,46.1-30.4l-11.9-29.8c-20.7,9.9-39.8,22.6-56.8,37.6L115,92.4z M447.7,355.5c-7.8,14.9-17.2,28.8-28.1,41.5 l22.7,22.7c13.7-15.6,25.5-32.9,34.9-51.5L447.7,355.5z M471.4,272c-1.4,18.8-5.2,37-11.1,54.1l29.5,12.6 c7.5-21.1,12.2-43.5,13.6-66.8H471.4z M321.2,462c-15.7,5-32.2,8.2-49.2,9.4v32.1c21.2-1.4,41.7-5.4,61.1-11.7L321.2,462z M240,471.4c-18.8-1.4-37-5.2-54.1-11.1l-12.6,29.5c21.1,7.5,43.5,12.2,66.8,13.6V471.4z M462,190.8c5,15.7,8.2,32.2,9.4,49.2h32.1 c-1.4-21.2-5.4-41.7-11.7-61.1L462,190.8z M92.4,397c-12-13.9-22.3-29.4-30.4-46.1l-29.8,11.9c9.9,20.7,22.6,39.8,37.6,56.9 L92.4,397z M272,40.6c18.8,1.4,36.9,5.2,54.1,11.1l12.6-29.5C317.7,14.7,295.3,10,272,8.5V40.6z M190.8,50 c15.7-5,32.2-8.2,49.2-9.4V8.5c-21.2,1.4-41.7,5.4-61.1,11.7L190.8,50z M442.3,92.3L419.6,115c12,13.9,22.3,29.4,30.5,46.1 l29.8-11.9C470,128.5,457.3,109.4,442.3,92.3z M397,92.4l22.7-22.7c-15.6-13.7-32.8-25.5-51.5-34.9l-12.6,29.5 C370.4,72.1,384.4,81.5,397,92.4z"})},$c=fc({},Qc,{attributeName:"opacity"}),cl={tag:"g",children:[Zc,{tag:"circle",attributes:fc({},Jc,{cx:"256",cy:"364",r:"28"}),children:[{tag:"animate",attributes:fc({},Qc,{attributeName:"r",values:"28;14;28;28;14;28;"})},{tag:"animate",attributes:fc({},$c,{values:"1;0;1;1;0;1;"})}]},{tag:"path",attributes:fc({},Jc,{opacity:"1",d:"M263.7,312h-16c-6.6,0-12-5.4-12-12c0-71,77.4-63.9,77.4-107.8c0-20-17.8-40.2-57.4-40.2c-29.1,0-44.3,9.6-59.2,28.7 c-3.9,5-11.1,6-16.2,2.4l-13.1-9.2c-5.6-3.9-6.9-11.8-2.6-17.2c21.2-27.2,46.4-44.7,91.2-44.7c52.3,0,97.4,29.8,97.4,80.2 c0,67.6-77.4,63.5-77.4,107.8C275.7,306.6,270.3,312,263.7,312z"}),children:[{tag:"animate",attributes:fc({},$c,{values:"1;0;0;0;0;1;"})}]},{tag:"path",attributes:fc({},Jc,{opacity:"0",d:"M232.5,134.5l7,168c0.3,6.4,5.6,11.5,12,11.5h9c6.4,0,11.7-5.1,12-11.5l7-168c0.3-6.8-5.2-12.5-12-12.5h-23 C237.7,122,232.2,127.7,232.5,134.5z"}),children:[{tag:"animate",attributes:fc({},$c,{values:"0;0;1;1;0;0;"})}]}]},ll=wc.styles,hl="fa-layers-text",vl=/Font Awesome 5 (Solid|Regular|Light|Brands)/,zl={Solid:"fas",Regular:"far",Light:"fal",Brands:"fab"},el=[],al=(K.documentElement.doScroll?/^loaded|^c/:/^loaded|^i|^c/).test(K.readyState);al||K.addEventListener("DOMContentLoaded",function c(){K.removeEventListener("DOMContentLoaded",c),al=1,el.map(function(c){return c()})});var ml=function(c){K&&(al?setTimeout(c,0):el.push(c))},tl=function(){var c="svg-inline--fa",l=Hc.familyPrefix,h=Hc.replacementClass,v="svg:not(:root).svg-inline--fa{overflow:visible}.svg-inline--fa{display:inline-block;font-size:inherit;height:1em;overflow:visible;vertical-align:-.125em}.svg-inline--fa.fa-lg{vertical-align:-.225em}.svg-inline--fa.fa-w-1{width:.0625em}.svg-inline--fa.fa-w-2{width:.125em}.svg-inline--fa.fa-w-3{width:.1875em}.svg-inline--fa.fa-w-4{width:.25em}.svg-inline--fa.fa-w-5{width:.3125em}.svg-inline--fa.fa-w-6{width:.375em}.svg-inline--fa.fa-w-7{width:.4375em}.svg-inline--fa.fa-w-8{width:.5em}.svg-inline--fa.fa-w-9{width:.5625em}.svg-inline--fa.fa-w-10{width:.625em}.svg-inline--fa.fa-w-11{width:.6875em}.svg-inline--fa.fa-w-12{width:.75em}.svg-inline--fa.fa-w-13{width:.8125em}.svg-inline--fa.fa-w-14{width:.875em}.svg-inline--fa.fa-w-15{width:.9375em}.svg-inline--fa.fa-w-16{width:1em}.svg-inline--fa.fa-w-17{width:1.0625em}.svg-inline--fa.fa-w-18{width:1.125em}.svg-inline--fa.fa-w-19{width:1.1875em}.svg-inline--fa.fa-w-20{width:1.25em}.svg-inline--fa.fa-pull-left{margin-right:.3em;width:auto}.svg-inline--fa.fa-pull-right{margin-left:.3em;width:auto}.svg-inline--fa.fa-border{height:1.5em}.svg-inline--fa.fa-li{width:2em}.svg-inline--fa.fa-fw{width:1.25em}.fa-layers svg.svg-inline--fa{bottom:0;left:0;margin:auto;position:absolute;right:0;top:0}.fa-layers{display:inline-block;height:1em;position:relative;text-align:center;vertical-align:-12.5%;width:1em}.fa-layers svg.svg-inline--fa{-webkit-transform-origin:center center;transform-origin:center center}.fa-layers-counter,.fa-layers-text{display:inline-block;position:absolute;text-align:center}.fa-layers-text{left:50%;top:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);-webkit-transform-origin:center center;transform-origin:center center}.fa-layers-counter{background-color:#ff253a;border-radius:1em;color:#fff;height:1.5em;line-height:1;max-width:5em;min-width:1.5em;overflow:hidden;padding:.25em;right:0;text-overflow:ellipsis;top:0;-webkit-transform:scale(.25);transform:scale(.25);-webkit-transform-origin:top right;transform-origin:top right}.fa-layers-bottom-right{bottom:0;right:0;top:auto;-webkit-transform:scale(.25);transform:scale(.25);-webkit-transform-origin:bottom right;transform-origin:bottom right}.fa-layers-bottom-left{bottom:0;left:0;right:auto;top:auto;-webkit-transform:scale(.25);transform:scale(.25);-webkit-transform-origin:bottom left;transform-origin:bottom left}.fa-layers-top-right{right:0;top:0;-webkit-transform:scale(.25);transform:scale(.25);-webkit-transform-origin:top right;transform-origin:top right}.fa-layers-top-left{left:0;right:auto;top:0;-webkit-transform:scale(.25);transform:scale(.25);-webkit-transform-origin:top left;transform-origin:top left}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-.0667em}.fa-xs{font-size:.75em}.fa-sm{font-size:.875em}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:2.5em;padding-left:0}.fa-ul>li{position:relative}.fa-li{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.fa-border{border:solid .08em #eee;border-radius:.1em;padding:.2em .25em .15em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.fab.fa-pull-left,.fal.fa-pull-left,.far.fa-pull-left,.fas.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fab.fa-pull-right,.fal.fa-pull-right,.far.fa-pull-right,.fas.fa-pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.fa-rotate-90{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-webkit-transform:scale(-1,1);transform:scale(-1,1)}.fa-flip-vertical{-webkit-transform:scale(1,-1);transform:scale(1,-1)}.fa-flip-horizontal.fa-flip-vertical{-webkit-transform:scale(-1,-1);transform:scale(-1,-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-rotate-90{-webkit-filter:none;filter:none}.fa-stack{display:inline-block;height:2em;position:relative;width:2em}.fa-stack-1x,.fa-stack-2x{bottom:0;left:0;margin:auto;position:absolute;right:0;top:0}.svg-inline--fa.fa-stack-1x{height:1em;width:1em}.svg-inline--fa.fa-stack-2x{height:2em;width:2em}.fa-inverse{color:#fff}.sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}";if("fa"!==l||h!==c){var z=new RegExp("\\.fa\\-","g"),e=new RegExp("\\."+c,"g");v=v.replace(z,"."+l+"-").replace(e,"."+h)}return v},sl=!1,rl=new(function(){function c(){tc(this,c),this.definitions={}}return sc(c,[{key:"add",value:function(){for(var c=this,l=arguments.length,h=Array(l),v=0;v0&&void 0!==arguments[0]?arguments[0]:{};j();var l=c.node,h=void 0===l?K:l,v=c.callback,z=void 0===v?function(){}:v;Hc.searchPseudoElements&&E(h),N(h,z)},css:tl,insertCss:function(){h(tl())}},library:rl,parse:{transform:function(c){return Yc(c)}},findIconDefinition:W,icon:function(c){return function(l){var h=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},v=(l||{}).icon?l:W(l||{}),z=h.mask;return z&&(z=(z||{}).icon?z:W(z||{})),c(v,fc({},h,{mask:z}))}}(function(c){var l=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},h=l.transform,z=void 0===h?Vc:h,e=l.symbol,a=void 0!==e&&e,m=l.mask,t=void 0===m?null:m,s=l.title,r=void 0===s?null:s,f=l.classes,M=void 0===f?[]:f,n=l.attributes,H=void 0===n?{}:n,o=l.styles,V=void 0===o?{}:o;if(c){var C=c.prefix,L=c.iconName,u=c.icon;return F(fc({type:"icon"},c),function(){return j(),Hc.autoA11y&&(r?H["aria-labelledby"]=Hc.replacementClass+"-title-"+v():H["aria-hidden"]="true"),i({icons:{main:T(u),mask:t?T(t.icon):{found:!1,width:null,height:null,icon:{}}},prefix:C,iconName:L,transform:fc({},Vc,z),symbol:a,title:r,extra:{attributes:H,styles:V,classes:M}})})}}),text:function(c){var l=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},h=l.transform,v=void 0===h?Vc:h,z=l.title,e=void 0===z?null:z,a=l.classes,m=void 0===a?[]:a,t=l.attributes,s=void 0===t?{}:t,r=l.styles,f=void 0===r?{}:r;return F({type:"text",content:c},function(){return j(),n({content:c,transform:fc({},Vc,v),title:e,extra:{attributes:s,styles:f,classes:[Hc.familyPrefix+"-layers-text"].concat(ic(m))}})})},layer:function(c){return F({type:"layer"},function(){j();var l=[];return c(function(c){l=Array.isArray(c)?c.map(function(c){l=l.concat(c.abstract)}):l.concat(c.abstract)}),[{tag:"span",attributes:{class:Hc.familyPrefix+"-layers"},children:l}]})}};Object.defineProperty(fl,"config",{get:function(){Hc.autoReplaceSvg,Hc.observeMutations,Hc.showMissingIcons;return Mc(Hc,["autoReplaceSvg","observeMutations","showMissingIcons"])},set:function(l){c(l)}}),function(c){try{c()}catch(c){}}(function(){var c=function(){Hc.autoReplaceSvg&&fl.dom.i2svg({node:K})};Q&&(U.FontAwesome||(U.FontAwesome=fl),ml(function(){Object.keys(wc.styles).length>0&&c(),Hc.observeMutations&&"function"==typeof MutationObserver&&w({treeCallback:N,nodeCallback:q,pseudoElementsCallback:E})})),wc.hooks=fc({},wc.hooks,{addPack:function(l,h){wc.styles[l]=fc({},wc.styles[l]||{},h),jc(),c()},addShims:function(l){var h;(h=wc.shims).push.apply(h,ic(l)),jc(),c()}})})}(); + diff --git a/login/template.ftl b/login/template.ftl new file mode 100644 index 0000000..72c1726 --- /dev/null +++ b/login/template.ftl @@ -0,0 +1,234 @@ +<#macro registrationLayout bodyClass="" displayInfo=false displayMessage=false> + + + + + + + + <#nested "title"> + + <#if properties.styles?has_content> + <#list properties.styles?split(' ') as style> + + + + <#if properties.scripts?has_content> + <#list properties.scripts?split(' ') as script> + + + + <#if scripts??> + <#list scripts as script> + + + + + + + + + +