From 78b6c0d38105094fb670ed3612ba331c53789666 Mon Sep 17 00:00:00 2001 From: Philip Wagner Date: Sat, 31 Aug 2024 10:01:49 +0200 Subject: [PATCH] init --- .editorconfig | 21 + .gitignore | 52 + .htaccess | 67 + README.md | 36 + assets/Kobata-Bold.woff2 | Bin 0 -> 18500 bytes assets/VG5000-Regular_web.woff2 | Bin 0 -> 31616 bytes assets/grid/black.png | Bin 0 -> 120 bytes assets/grid/black@2x.png | Bin 0 -> 141 bytes assets/grid/green.png | Bin 0 -> 120 bytes assets/grid/green@2x.png | Bin 0 -> 141 bytes assets/grid/lila.png | Bin 0 -> 120 bytes assets/grid/lila@2x.png | Bin 0 -> 141 bytes assets/grid/orange.png | Bin 0 -> 120 bytes assets/grid/orange@2x.png | Bin 0 -> 141 bytes assets/grid/pink.png | Bin 0 -> 120 bytes assets/grid/pink@2x.png | Bin 0 -> 141 bytes assets/grid/white.png | Bin 0 -> 120 bytes assets/grid/white@2x.png | Bin 0 -> 141 bytes assets/siema.min.js | 1 + assets/style.css | 96 + composer.json | 39 + index.php | 5 + kirby/.editorconfig | 28 + kirby/CONTRIBUTING.md | 101 + kirby/LICENSE.md | 276 + kirby/README.md | 49 + kirby/SECURITY.md | 27 + kirby/assets/whoops.css | 83 + kirby/bootstrap.php | 36 + kirby/cacert.pem | 3568 +++++ kirby/composer.json | 115 + kirby/composer.lock | 1117 ++ kirby/config/aliases.php | 95 + kirby/config/api/authentication.php | 27 + kirby/config/api/collections.php | 78 + kirby/config/api/models.php | 21 + kirby/config/api/models/File.php | 119 + kirby/config/api/models/FileBlueprint.php | 17 + kirby/config/api/models/FileVersion.php | 59 + kirby/config/api/models/Language.php | 30 + kirby/config/api/models/License.php | 17 + kirby/config/api/models/Page.php | 96 + kirby/config/api/models/PageBlueprint.php | 20 + kirby/config/api/models/Role.php | 23 + kirby/config/api/models/Site.php | 52 + kirby/config/api/models/SiteBlueprint.php | 17 + kirby/config/api/models/System.php | 91 + kirby/config/api/models/Translation.php | 24 + kirby/config/api/models/User.php | 81 + kirby/config/api/models/UserBlueprint.php | 17 + kirby/config/api/routes.php | 29 + kirby/config/api/routes/auth.php | 116 + kirby/config/api/routes/files.php | 148 + kirby/config/api/routes/kql.php | 35 + kirby/config/api/routes/languages.php | 42 + kirby/config/api/routes/lock.php | 56 + kirby/config/api/routes/pages.php | 129 + kirby/config/api/routes/roles.php | 27 + kirby/config/api/routes/site.php | 109 + kirby/config/api/routes/system.php | 78 + kirby/config/api/routes/translations.php | 24 + kirby/config/api/routes/users.php | 242 + kirby/config/areas/account.php | 15 + kirby/config/areas/account/dialogs.php | 106 + kirby/config/areas/account/drawers.php | 19 + kirby/config/areas/account/dropdowns.php | 14 + kirby/config/areas/account/views.php | 32 + kirby/config/areas/fields/dialogs.php | 61 + kirby/config/areas/fields/drawers.php | 61 + kirby/config/areas/files/dialogs.php | 172 + kirby/config/areas/files/dropdowns.php | 9 + kirby/config/areas/installation.php | 40 + kirby/config/areas/lab.php | 11 + kirby/config/areas/lab/drawers.php | 30 + kirby/config/areas/lab/views.php | 148 + kirby/config/areas/languages.php | 13 + kirby/config/areas/languages/dialogs.php | 266 + kirby/config/areas/languages/views.php | 128 + kirby/config/areas/login.php | 44 + kirby/config/areas/logout.php | 21 + kirby/config/areas/search.php | 11 + kirby/config/areas/search/views.php | 17 + kirby/config/areas/site.php | 20 + kirby/config/areas/site/dialogs.php | 643 + kirby/config/areas/site/drawers.php | 33 + kirby/config/areas/site/dropdowns.php | 21 + kirby/config/areas/site/requests.php | 66 + kirby/config/areas/site/searches.php | 56 + kirby/config/areas/site/views.php | 27 + kirby/config/areas/system.php | 13 + kirby/config/areas/system/dialogs.php | 113 + kirby/config/areas/system/views.php | 101 + kirby/config/areas/users.php | 17 + kirby/config/areas/users/dialogs.php | 346 + kirby/config/areas/users/drawers.php | 18 + kirby/config/areas/users/dropdowns.php | 18 + kirby/config/areas/users/searches.php | 29 + kirby/config/areas/users/views.php | 70 + kirby/config/blocks/code/code.php | 2 + kirby/config/blocks/code/code.yml | 59 + kirby/config/blocks/gallery/gallery.php | 20 + kirby/config/blocks/gallery/gallery.yml | 40 + kirby/config/blocks/heading/heading.php | 2 + kirby/config/blocks/heading/heading.yml | 35 + kirby/config/blocks/image/image.php | 35 + kirby/config/blocks/image/image.yml | 60 + kirby/config/blocks/line/line.php | 1 + kirby/config/blocks/line/line.yml | 4 + kirby/config/blocks/list/list.php | 2 + kirby/config/blocks/list/list.yml | 8 + kirby/config/blocks/markdown/markdown.php | 2 + kirby/config/blocks/markdown/markdown.yml | 11 + kirby/config/blocks/quote/quote.php | 9 + kirby/config/blocks/quote/quote.yml | 17 + kirby/config/blocks/table/table.yml | 3 + kirby/config/blocks/text/text.php | 2 + kirby/config/blocks/text/text.yml | 9 + kirby/config/blocks/video/video.php | 31 + kirby/config/blocks/video/video.yml | 78 + kirby/config/components.php | 427 + kirby/config/fields/checkboxes.php | 61 + kirby/config/fields/color.php | 145 + kirby/config/fields/date.php | 154 + kirby/config/fields/email.php | 40 + kirby/config/fields/files.php | 141 + kirby/config/fields/gap.php | 5 + kirby/config/fields/headline.php | 19 + kirby/config/fields/hidden.php | 5 + kirby/config/fields/info.php | 43 + kirby/config/fields/line.php | 5 + kirby/config/fields/link.php | 155 + kirby/config/fields/list.php | 23 + kirby/config/fields/mixins/datetime.php | 35 + kirby/config/fields/mixins/filepicker.php | 14 + kirby/config/fields/mixins/layout.php | 21 + kirby/config/fields/mixins/min.php | 22 + kirby/config/fields/mixins/options.php | 47 + kirby/config/fields/mixins/pagepicker.php | 14 + kirby/config/fields/mixins/picker.php | 88 + kirby/config/fields/mixins/upload.php | 87 + kirby/config/fields/mixins/userpicker.php | 13 + kirby/config/fields/multiselect.php | 35 + kirby/config/fields/number.php | 48 + kirby/config/fields/object.php | 104 + kirby/config/fields/pages.php | 111 + kirby/config/fields/radio.php | 29 + kirby/config/fields/range.php | 33 + kirby/config/fields/select.php | 37 + kirby/config/fields/slug.php | 55 + kirby/config/fields/structure.php | 225 + kirby/config/fields/tags.php | 106 + kirby/config/fields/tel.php | 27 + kirby/config/fields/text.php | 109 + kirby/config/fields/textarea.php | 123 + kirby/config/fields/time.php | 126 + kirby/config/fields/toggle.php | 73 + kirby/config/fields/toggles.php | 41 + kirby/config/fields/url.php | 42 + kirby/config/fields/users.php | 107 + kirby/config/fields/writer.php | 93 + kirby/config/helpers.php | 690 + kirby/config/methods.php | 618 + kirby/config/presets/files.php | 27 + kirby/config/presets/page.php | 74 + kirby/config/presets/pages.php | 58 + kirby/config/routes.php | 195 + kirby/config/sections/fields.php | 62 + kirby/config/sections/files.php | 249 + kirby/config/sections/info.php | 37 + kirby/config/sections/mixins/details.php | 36 + kirby/config/sections/mixins/empty.php | 21 + kirby/config/sections/mixins/headline.php | 36 + kirby/config/sections/mixins/help.php | 23 + kirby/config/sections/mixins/layout.php | 155 + kirby/config/sections/mixins/max.php | 28 + kirby/config/sections/mixins/min.php | 21 + kirby/config/sections/mixins/pagination.php | 37 + kirby/config/sections/mixins/parent.php | 47 + kirby/config/sections/mixins/search.php | 19 + kirby/config/sections/mixins/sort.php | 57 + kirby/config/sections/pages.php | 337 + kirby/config/sections/stats.php | 68 + kirby/config/setup.php | 31 + kirby/config/tags.php | 339 + kirby/config/templates/emails/auth/login.php | 16 + .../templates/emails/auth/password-reset.php | 16 + .../parsedown-extra/ParsedownExtra.php | 637 + kirby/dependencies/parsedown/Parsedown.php | 1818 +++ kirby/dependencies/spyc/COPYING | 21 + kirby/dependencies/spyc/Spyc.php | 1196 ++ kirby/i18n/rules/LICENSE | 9 + kirby/i18n/rules/ar.json | 30 + kirby/i18n/rules/az.json | 16 + kirby/i18n/rules/bg.json | 65 + kirby/i18n/rules/cs.json | 20 + kirby/i18n/rules/da.json | 10 + kirby/i18n/rules/de.json | 9 + kirby/i18n/rules/el.json | 111 + kirby/i18n/rules/eo.json | 14 + kirby/i18n/rules/et.json | 14 + kirby/i18n/rules/fa.json | 36 + kirby/i18n/rules/fi.json | 6 + kirby/i18n/rules/fr.json | 34 + kirby/i18n/rules/hi.json | 66 + kirby/i18n/rules/hr.json | 12 + kirby/i18n/rules/hu.json | 20 + kirby/i18n/rules/hy.json | 79 + kirby/i18n/rules/is_IS.json | 22 + kirby/i18n/rules/it.json | 13 + kirby/i18n/rules/iu.json | 163 + kirby/i18n/rules/ja.json | 182 + kirby/i18n/rules/ka.json | 35 + kirby/i18n/rules/ko.json | 11174 ++++++++++++++++ kirby/i18n/rules/lt.json | 20 + kirby/i18n/rules/lv.json | 18 + kirby/i18n/rules/mk.json | 64 + kirby/i18n/rules/my.json | 121 + kirby/i18n/rules/nb.json | 8 + kirby/i18n/rules/pl.json | 20 + kirby/i18n/rules/pt_BR.json | 187 + kirby/i18n/rules/ro.json | 16 + kirby/i18n/rules/ru.json | 68 + kirby/i18n/rules/sr.json | 72 + kirby/i18n/rules/sv_SE.json | 8 + kirby/i18n/rules/tr.json | 14 + kirby/i18n/rules/uk.json | 10 + kirby/i18n/rules/vi.json | 135 + kirby/i18n/rules/zh.json | 6937 ++++++++++ kirby/i18n/translations/bg.json | 730 + kirby/i18n/translations/ca.json | 730 + kirby/i18n/translations/cs.json | 730 + kirby/i18n/translations/da.json | 730 + kirby/i18n/translations/de.json | 730 + kirby/i18n/translations/el.json | 730 + kirby/i18n/translations/en.json | 733 + kirby/i18n/translations/eo.json | 730 + kirby/i18n/translations/es_419.json | 730 + kirby/i18n/translations/es_ES.json | 730 + kirby/i18n/translations/fa.json | 730 + kirby/i18n/translations/fi.json | 730 + kirby/i18n/translations/fr.json | 730 + kirby/i18n/translations/hu.json | 730 + kirby/i18n/translations/id.json | 730 + kirby/i18n/translations/is_IS.json | 730 + kirby/i18n/translations/it.json | 730 + kirby/i18n/translations/ko.json | 730 + kirby/i18n/translations/lt.json | 730 + kirby/i18n/translations/nb.json | 730 + kirby/i18n/translations/nl.json | 730 + kirby/i18n/translations/pl.json | 730 + kirby/i18n/translations/pt_BR.json | 730 + kirby/i18n/translations/pt_PT.json | 730 + kirby/i18n/translations/ro.json | 730 + kirby/i18n/translations/ru.json | 730 + kirby/i18n/translations/sk.json | 730 + kirby/i18n/translations/sv_SE.json | 730 + kirby/i18n/translations/tr.json | 730 + kirby/kirby.pub | 9 + kirby/package-lock.json | 6 + kirby/panel/.prettierignore | 2 + kirby/panel/dist/apple-touch-icon-dark.png | Bin 0 -> 1148 bytes kirby/panel/dist/apple-touch-icon.png | Bin 0 -> 4115 bytes kirby/panel/dist/css/style.min.css | 1 + kirby/panel/dist/favicon-dark.png | Bin 0 -> 416 bytes kirby/panel/dist/favicon.png | Bin 0 -> 539 bytes kirby/panel/dist/favicon.svg | 9 + kirby/panel/dist/img/icons.svg | 644 + kirby/panel/dist/js/Docs.min.js | 1 + kirby/panel/dist/js/DocsView.min.js | 1 + kirby/panel/dist/js/Highlight.min.js | 1 + kirby/panel/dist/js/IndexView.min.js | 1 + kirby/panel/dist/js/PlaygroundView.min.js | 1 + .../js/container-query-polyfill.modern.min.js | 1 + kirby/panel/dist/js/index.min.js | 2 + kirby/panel/dist/js/plugins.js | 91 + kirby/panel/dist/js/vendor.min.js | 16 + kirby/panel/dist/js/vue.min.js | 11 + kirby/panel/dist/js/vuedraggable.min.js | 7 + kirby/panel/eslint.config.mjs | 28 + kirby/router.php | 15 + kirby/src/Api/Api.php | 741 + kirby/src/Api/Collection.php | 153 + kirby/src/Api/Model.php | 227 + kirby/src/Blueprint/Collection.php | 97 + kirby/src/Blueprint/Config.php | 75 + kirby/src/Blueprint/Extension.php | 65 + kirby/src/Blueprint/Factory.php | 119 + kirby/src/Blueprint/Node.php | 117 + kirby/src/Blueprint/NodeI18n.php | 44 + kirby/src/Blueprint/NodeIcon.php | 27 + kirby/src/Blueprint/NodeProperty.php | 27 + kirby/src/Blueprint/NodeString.php | 39 + kirby/src/Blueprint/NodeText.php | 30 + kirby/src/Cache/ApcuCache.php | 83 + kirby/src/Cache/Cache.php | 238 + kirby/src/Cache/FileCache.php | 227 + kirby/src/Cache/MemCached.php | 106 + kirby/src/Cache/MemoryCache.php | 77 + kirby/src/Cache/NullCache.php | 65 + kirby/src/Cache/Value.php | 137 + kirby/src/Cms/Api.php | 260 + kirby/src/Cms/App.php | 1729 +++ kirby/src/Cms/AppCaches.php | 131 + kirby/src/Cms/AppErrors.php | 216 + kirby/src/Cms/AppPlugins.php | 817 ++ kirby/src/Cms/AppTranslations.php | 174 + kirby/src/Cms/AppUsers.php | 131 + kirby/src/Cms/Auth.php | 928 ++ kirby/src/Cms/Auth/Challenge.php | 65 + kirby/src/Cms/Auth/EmailChallenge.php | 76 + kirby/src/Cms/Auth/Status.php | 160 + kirby/src/Cms/Auth/TotpChallenge.php | 65 + kirby/src/Cms/Block.php | 245 + kirby/src/Cms/BlockConverter.php | 285 + kirby/src/Cms/Blocks.php | 167 + kirby/src/Cms/Blueprint.php | 882 ++ kirby/src/Cms/Collection.php | 383 + kirby/src/Cms/Collections.php | 125 + kirby/src/Cms/ContentLock.php | 222 + kirby/src/Cms/ContentLocks.php | 210 + kirby/src/Cms/Core.php | 459 + kirby/src/Cms/Email.php | 240 + kirby/src/Cms/Event.php | 253 + kirby/src/Cms/Fieldset.php | 230 + kirby/src/Cms/Fieldsets.php | 113 + kirby/src/Cms/File.php | 662 + kirby/src/Cms/FileActions.php | 453 + kirby/src/Cms/FileBlueprint.php | 254 + kirby/src/Cms/FileModifications.php | 214 + kirby/src/Cms/FilePermissions.php | 26 + kirby/src/Cms/FilePicker.php | 74 + kirby/src/Cms/FileRules.php | 343 + kirby/src/Cms/FileVersion.php | 120 + kirby/src/Cms/Files.php | 174 + kirby/src/Cms/Find.php | 175 + kirby/src/Cms/HasChildren.php | 201 + kirby/src/Cms/HasFiles.php | 189 + kirby/src/Cms/HasMethods.php | 70 + kirby/src/Cms/HasSiblings.php | 153 + kirby/src/Cms/Helpers.php | 194 + kirby/src/Cms/Html.php | 164 + kirby/src/Cms/Ingredients.php | 82 + kirby/src/Cms/Item.php | 118 + kirby/src/Cms/Items.php | 100 + kirby/src/Cms/Language.php | 599 + kirby/src/Cms/LanguageRouter.php | 125 + kirby/src/Cms/LanguageRoutes.php | 156 + kirby/src/Cms/LanguageRules.php | 90 + kirby/src/Cms/LanguageVariable.php | 122 + kirby/src/Cms/Languages.php | 94 + kirby/src/Cms/Layout.php | 105 + kirby/src/Cms/LayoutColumn.php | 120 + kirby/src/Cms/LayoutColumns.php | 23 + kirby/src/Cms/Layouts.php | 120 + kirby/src/Cms/License.php | 529 + kirby/src/Cms/LicenseStatus.php | 144 + kirby/src/Cms/LicenseType.php | 111 + kirby/src/Cms/Loader.php | 217 + kirby/src/Cms/Media.php | 180 + kirby/src/Cms/Model.php | 117 + kirby/src/Cms/ModelPermissions.php | 116 + kirby/src/Cms/ModelWithContent.php | 829 ++ kirby/src/Cms/Nest.php | 49 + kirby/src/Cms/NestCollection.php | 28 + kirby/src/Cms/NestObject.php | 45 + kirby/src/Cms/Page.php | 1321 ++ kirby/src/Cms/PageActions.php | 1012 ++ kirby/src/Cms/PageBlueprint.php | 193 + kirby/src/Cms/PagePermissions.php | 67 + kirby/src/Cms/PagePicker.php | 224 + kirby/src/Cms/PageRules.php | 518 + kirby/src/Cms/PageSiblings.php | 131 + kirby/src/Cms/Pages.php | 495 + kirby/src/Cms/Pagination.php | 166 + kirby/src/Cms/Permissions.php | 213 + kirby/src/Cms/Picker.php | 148 + kirby/src/Cms/Plugin.php | 341 + kirby/src/Cms/PluginAsset.php | 120 + kirby/src/Cms/PluginAssets.php | 184 + kirby/src/Cms/R.php | 23 + kirby/src/Cms/Responder.php | 406 + kirby/src/Cms/Response.php | 28 + kirby/src/Cms/Role.php | 149 + kirby/src/Cms/Roles.php | 140 + kirby/src/Cms/S.php | 23 + kirby/src/Cms/Search.php | 51 + kirby/src/Cms/Section.php | 102 + kirby/src/Cms/Site.php | 508 + kirby/src/Cms/SiteActions.php | 107 + kirby/src/Cms/SiteBlueprint.php | 56 + kirby/src/Cms/SitePermissions.php | 17 + kirby/src/Cms/SiteRules.php | 52 + kirby/src/Cms/Structure.php | 53 + kirby/src/Cms/StructureObject.php | 85 + kirby/src/Cms/System.php | 508 + kirby/src/Cms/System/UpdateStatus.php | 838 ++ kirby/src/Cms/Translation.php | 156 + kirby/src/Cms/Translations.php | 56 + kirby/src/Cms/Url.php | 63 + kirby/src/Cms/User.php | 765 ++ kirby/src/Cms/UserActions.php | 448 + kirby/src/Cms/UserBlueprint.php | 46 + kirby/src/Cms/UserPermissions.php | 51 + kirby/src/Cms/UserPicker.php | 67 + kirby/src/Cms/UserRules.php | 384 + kirby/src/Cms/Users.php | 159 + kirby/src/Cms/Visitor.php | 23 + kirby/src/Content/Content.php | 248 + kirby/src/Content/ContentStorage.php | 314 + kirby/src/Content/ContentStorageHandler.php | 96 + kirby/src/Content/ContentTranslation.php | 173 + kirby/src/Content/Field.php | 220 + .../PlainTextContentStorageHandler.php | 253 + kirby/src/Data/Data.php | 118 + kirby/src/Data/Handler.php | 54 + kirby/src/Data/Json.php | 54 + kirby/src/Data/PHP.php | 82 + kirby/src/Data/Txt.php | 130 + kirby/src/Data/Xml.php | 58 + kirby/src/Data/Yaml.php | 62 + kirby/src/Data/YamlSpyc.php | 43 + kirby/src/Data/YamlSymfony.php | 44 + kirby/src/Database/Database.php | 603 + kirby/src/Database/Db.php | 294 + kirby/src/Database/Query.php | 948 ++ kirby/src/Database/Sql.php | 896 ++ kirby/src/Database/Sql/Mysql.php | 56 + kirby/src/Database/Sql/Sqlite.php | 137 + kirby/src/Email/Body.php | 71 + kirby/src/Email/Email.php | 296 + kirby/src/Email/PHPMailer.php | 112 + kirby/src/Exception/AuthException.php | 21 + .../src/Exception/BadMethodCallException.php | 21 + kirby/src/Exception/DuplicateException.php | 21 + kirby/src/Exception/ErrorPageException.php | 21 + kirby/src/Exception/Exception.php | 207 + .../Exception/InvalidArgumentException.php | 21 + kirby/src/Exception/LogicException.php | 20 + kirby/src/Exception/NotFoundException.php | 20 + kirby/src/Exception/PermissionException.php | 21 + kirby/src/Field/FieldOptions.php | 108 + kirby/src/Filesystem/Asset.php | 118 + kirby/src/Filesystem/Dir.php | 612 + kirby/src/Filesystem/F.php | 943 ++ kirby/src/Filesystem/File.php | 566 + kirby/src/Filesystem/Filename.php | 271 + kirby/src/Filesystem/IsFile.php | 155 + kirby/src/Filesystem/Mime.php | 338 + kirby/src/Form/Field.php | 510 + kirby/src/Form/Field/BlocksField.php | 352 + kirby/src/Form/Field/LayoutField.php | 365 + kirby/src/Form/FieldClass.php | 646 + kirby/src/Form/Fields.php | 52 + kirby/src/Form/Form.php | 355 + kirby/src/Form/Mixin/EmptyState.php | 18 + kirby/src/Form/Mixin/Max.php | 18 + kirby/src/Form/Mixin/Min.php | 18 + kirby/src/Form/Validations.php | 272 + kirby/src/Http/Cookie.php | 234 + kirby/src/Http/Environment.php | 1018 ++ .../Http/Exceptions/NextRouteException.php | 16 + kirby/src/Http/Header.php | 313 + kirby/src/Http/Idn.php | 63 + kirby/src/Http/Params.php | 156 + kirby/src/Http/Path.php | 49 + kirby/src/Http/Query.php | 59 + kirby/src/Http/Remote.php | 364 + kirby/src/Http/Request.php | 426 + kirby/src/Http/Request/Auth.php | 48 + kirby/src/Http/Request/Auth/BasicAuth.php | 66 + kirby/src/Http/Request/Auth/BearerAuth.php | 33 + kirby/src/Http/Request/Auth/SessionAuth.php | 43 + kirby/src/Http/Request/Body.php | 115 + kirby/src/Http/Request/Data.php | 73 + kirby/src/Http/Request/Files.php | 63 + kirby/src/Http/Request/Query.php | 84 + kirby/src/Http/Response.php | 319 + kirby/src/Http/Route.php | 192 + kirby/src/Http/Router.php | 198 + kirby/src/Http/Uri.php | 514 + kirby/src/Http/Url.php | 249 + kirby/src/Http/Visitor.php | 229 + kirby/src/Image/Camera.php | 68 + kirby/src/Image/Darkroom.php | 147 + kirby/src/Image/Darkroom/GdLib.php | 143 + kirby/src/Image/Darkroom/ImageMagick.php | 246 + kirby/src/Image/Dimensions.php | 409 + kirby/src/Image/Exif.php | 200 + kirby/src/Image/Focus.php | 110 + kirby/src/Image/Image.php | 223 + kirby/src/Image/Location.php | 116 + kirby/src/Image/QrCode.php | 1611 +++ kirby/src/Option/Option.php | 64 + kirby/src/Option/Options.php | 57 + kirby/src/Option/OptionsApi.php | 148 + kirby/src/Option/OptionsProvider.php | 38 + kirby/src/Option/OptionsQuery.php | 186 + kirby/src/Panel/Assets.php | 324 + kirby/src/Panel/ChangesDialog.php | 71 + kirby/src/Panel/Dialog.php | 72 + kirby/src/Panel/Document.php | 72 + kirby/src/Panel/Drawer.php | 21 + kirby/src/Panel/Dropdown.php | 71 + kirby/src/Panel/Field.php | 292 + kirby/src/Panel/File.php | 493 + kirby/src/Panel/Home.php | 255 + kirby/src/Panel/Json.php | 84 + kirby/src/Panel/Lab/Category.php | 134 + kirby/src/Panel/Lab/Docs.php | 340 + kirby/src/Panel/Lab/Example.php | 296 + kirby/src/Panel/Lab/Snippet.php | 26 + kirby/src/Panel/Lab/Template.php | 34 + kirby/src/Panel/Menu.php | 221 + kirby/src/Panel/Model.php | 433 + kirby/src/Panel/Page.php | 369 + kirby/src/Panel/PageCreateDialog.php | 389 + kirby/src/Panel/Panel.php | 593 + kirby/src/Panel/Plugins.php | 139 + kirby/src/Panel/Redirect.php | 42 + kirby/src/Panel/Request.php | 24 + kirby/src/Panel/Search.php | 41 + kirby/src/Panel/Site.php | 91 + kirby/src/Panel/User.php | 271 + kirby/src/Panel/UserTotpDisableDialog.php | 114 + kirby/src/Panel/UserTotpEnableDialog.php | 95 + kirby/src/Panel/View.php | 384 + kirby/src/Parsley/Element.php | 159 + kirby/src/Parsley/Inline.php | 161 + kirby/src/Parsley/Parsley.php | 300 + kirby/src/Parsley/Schema.php | 53 + kirby/src/Parsley/Schema/Blocks.php | 371 + kirby/src/Parsley/Schema/Plain.php | 64 + kirby/src/Query/Argument.php | 117 + kirby/src/Query/Arguments.php | 59 + kirby/src/Query/Expression.php | 119 + kirby/src/Query/Query.php | 142 + kirby/src/Query/Segment.php | 182 + kirby/src/Query/Segments.php | 100 + kirby/src/Sane/DomHandler.php | 171 + kirby/src/Sane/Handler.php | 84 + kirby/src/Sane/Html.php | 126 + kirby/src/Sane/Sane.php | 211 + kirby/src/Sane/Svg.php | 501 + kirby/src/Sane/Svgz.php | 70 + kirby/src/Sane/Xml.php | 72 + kirby/src/Session/AutoSession.php | 168 + kirby/src/Session/FileSessionStore.php | 473 + kirby/src/Session/Session.php | 810 ++ kirby/src/Session/SessionData.php | 213 + kirby/src/Session/SessionStore.php | 103 + kirby/src/Session/Sessions.php | 261 + kirby/src/Template/Slot.php | 123 + kirby/src/Template/Slots.php | 54 + kirby/src/Template/Snippet.php | 308 + kirby/src/Template/Template.php | 216 + kirby/src/Text/KirbyTag.php | 240 + kirby/src/Text/KirbyTags.php | 63 + kirby/src/Text/Markdown.php | 70 + kirby/src/Text/SmartyPants.php | 119 + kirby/src/Toolkit/A.php | 991 ++ kirby/src/Toolkit/Collection.php | 1445 ++ kirby/src/Toolkit/Component.php | 278 + kirby/src/Toolkit/Config.php | 18 + kirby/src/Toolkit/Controller.php | 77 + kirby/src/Toolkit/Date.php | 528 + kirby/src/Toolkit/Dom.php | 932 ++ kirby/src/Toolkit/Escape.php | 140 + kirby/src/Toolkit/Facade.php | 30 + kirby/src/Toolkit/Html.php | 658 + kirby/src/Toolkit/I18n.php | 333 + kirby/src/Toolkit/Iterator.php | 153 + kirby/src/Toolkit/LazyValue.php | 48 + kirby/src/Toolkit/Locale.php | 185 + kirby/src/Toolkit/Obj.php | 105 + kirby/src/Toolkit/Pagination.php | 398 + kirby/src/Toolkit/Properties.php | 152 + kirby/src/Toolkit/Silo.php | 58 + kirby/src/Toolkit/Str.php | 1507 +++ kirby/src/Toolkit/SymmetricCrypto.php | 216 + kirby/src/Toolkit/Totp.php | 144 + kirby/src/Toolkit/Tpl.php | 50 + kirby/src/Toolkit/V.php | 634 + kirby/src/Toolkit/View.php | 107 + kirby/src/Toolkit/Xml.php | 439 + kirby/src/Uuid/BlockUuid.php | 39 + kirby/src/Uuid/FieldUuid.php | 131 + kirby/src/Uuid/FileUuid.php | 86 + kirby/src/Uuid/HasUuids.php | 37 + kirby/src/Uuid/Identifiable.php | 21 + kirby/src/Uuid/ModelUuid.php | 124 + kirby/src/Uuid/PageUuid.php | 57 + kirby/src/Uuid/SiteUuid.php | 79 + kirby/src/Uuid/StructureUuid.php | 39 + kirby/src/Uuid/Uri.php | 94 + kirby/src/Uuid/UserUuid.php | 63 + kirby/src/Uuid/Uuid.php | 400 + kirby/src/Uuid/Uuids.php | 122 + kirby/vendor/autoload.php | 25 + kirby/vendor/bin/yaml-lint | 119 + kirby/vendor/bin/yaml-lint.bat | 5 + kirby/vendor/christian-riesen/base32/LICENSE | 19 + .../christian-riesen/base32/src/Base32.php | 168 + .../christian-riesen/base32/src/Base32Hex.php | 68 + kirby/vendor/claviska/simpleimage/LICENSE.md | 7 + .../vendor/claviska/simpleimage/composer.json | 26 + .../vendor/claviska/simpleimage/composer.lock | 209 + .../simpleimage/src/claviska/SimpleImage.php | 2409 ++++ kirby/vendor/composer/ClassLoader.php | 579 + kirby/vendor/composer/InstalledVersions.php | 359 + kirby/vendor/composer/LICENSE | 21 + kirby/vendor/composer/autoload_classmap.php | 410 + kirby/vendor/composer/autoload_files.php | 16 + kirby/vendor/composer/autoload_namespaces.php | 11 + kirby/vendor/composer/autoload_psr4.php | 22 + kirby/vendor/composer/autoload_real.php | 48 + kirby/vendor/composer/autoload_static.php | 543 + kirby/vendor/composer/installed.json | 1136 ++ kirby/vendor/composer/installed.php | 179 + kirby/vendor/composer/semver/LICENSE | 19 + kirby/vendor/composer/semver/composer.json | 59 + .../composer/semver/phpstan-baseline.neon | 11 + .../vendor/composer/semver/src/Comparator.php | 113 + .../composer/semver/src/CompilingMatcher.php | 94 + .../composer/semver/src/Constraint/Bound.php | 122 + .../semver/src/Constraint/Constraint.php | 435 + .../src/Constraint/ConstraintInterface.php | 75 + .../src/Constraint/MatchAllConstraint.php | 85 + .../src/Constraint/MatchNoneConstraint.php | 83 + .../semver/src/Constraint/MultiConstraint.php | 325 + kirby/vendor/composer/semver/src/Interval.php | 98 + .../vendor/composer/semver/src/Intervals.php | 478 + kirby/vendor/composer/semver/src/Semver.php | 129 + .../composer/semver/src/VersionParser.php | 586 + kirby/vendor/filp/whoops/LICENSE.md | 19 + kirby/vendor/filp/whoops/composer.json | 45 + .../src/Whoops/Exception/ErrorException.php | 17 + .../whoops/src/Whoops/Exception/Formatter.php | 77 + .../whoops/src/Whoops/Exception/Frame.php | 311 + .../src/Whoops/Exception/FrameCollection.php | 219 + .../whoops/src/Whoops/Exception/Inspector.php | 341 + .../src/Whoops/Handler/CallbackHandler.php | 52 + .../whoops/src/Whoops/Handler/Handler.php | 95 + .../src/Whoops/Handler/HandlerInterface.php | 36 + .../Whoops/Handler/JsonResponseHandler.php | 90 + .../src/Whoops/Handler/PlainTextHandler.php | 359 + .../src/Whoops/Handler/PrettyPageHandler.php | 832 ++ .../src/Whoops/Handler/XmlResponseHandler.php | 108 + .../src/Whoops/Inspector/InspectorFactory.php | 21 + .../Inspector/InspectorFactoryInterface.php | 16 + .../Whoops/Inspector/InspectorInterface.php | 71 + .../whoops/src/Whoops/Resources/css/prism.css | 5 + .../src/Whoops/Resources/css/whoops.base.css | 560 + .../src/Whoops/Resources/js/clipboard.min.js | 7 + .../whoops/src/Whoops/Resources/js/prism.js | 8 + .../src/Whoops/Resources/js/whoops.base.js | 188 + .../src/Whoops/Resources/js/zepto.min.js | 2 + .../Resources/views/env_details.html.php | 42 + .../Resources/views/frame_code.html.php | 67 + .../Resources/views/frame_list.html.php | 17 + .../Resources/views/frames_container.html.php | 3 + .../views/frames_description.html.php | 14 + .../Whoops/Resources/views/header.html.php | 96 + .../Resources/views/header_outer.html.php | 3 + .../Whoops/Resources/views/layout.html.php | 34 + .../Resources/views/panel_details.html.php | 2 + .../views/panel_details_outer.html.php | 3 + .../Resources/views/panel_left.html.php | 4 + .../Resources/views/panel_left_outer.html.php | 3 + kirby/vendor/filp/whoops/src/Whoops/Run.php | 597 + .../filp/whoops/src/Whoops/RunInterface.php | 158 + .../src/Whoops/Util/HtmlDumperOutput.php | 36 + .../filp/whoops/src/Whoops/Util/Misc.php | 77 + .../whoops/src/Whoops/Util/SystemFacade.php | 144 + .../whoops/src/Whoops/Util/TemplateHelper.php | 349 + .../laminas/laminas-escaper/COPYRIGHT.md | 1 + .../vendor/laminas/laminas-escaper/LICENSE.md | 26 + .../laminas/laminas-escaper/composer.json | 68 + .../laminas/laminas-escaper/src/Escaper.php | 424 + .../src/Exception/ExceptionInterface.php | 11 + .../Exception/InvalidArgumentException.php | 13 + .../src/Exception/RuntimeException.php | 13 + kirby/vendor/league/color-extractor/LICENSE | 21 + .../league/color-extractor/composer.json | 40 + .../league/color-extractor/src/Color.php | 51 + .../color-extractor/src/ColorExtractor.php | 282 + .../league/color-extractor/src/Palette.php | 180 + .../vendor/michelf/php-smartypants/License.md | 36 + .../Michelf/SmartyPants.inc.php | 9 + .../php-smartypants/Michelf/SmartyPants.php | 560 + .../Michelf/SmartyPantsTypographer.inc.php | 10 + .../Michelf/SmartyPantsTypographer.php | 486 + .../michelf/php-smartypants/composer.json | 26 + kirby/vendor/phpmailer/phpmailer/LICENSE | 502 + .../vendor/phpmailer/phpmailer/composer.json | 79 + .../phpmailer/phpmailer/get_oauth_token.php | 182 + .../phpmailer/language/phpmailer.lang-af.php | 26 + .../phpmailer/language/phpmailer.lang-ar.php | 27 + .../phpmailer/language/phpmailer.lang-as.php | 35 + .../phpmailer/language/phpmailer.lang-az.php | 27 + .../phpmailer/language/phpmailer.lang-ba.php | 27 + .../phpmailer/language/phpmailer.lang-be.php | 27 + .../phpmailer/language/phpmailer.lang-bg.php | 27 + .../phpmailer/language/phpmailer.lang-bn.php | 35 + .../phpmailer/language/phpmailer.lang-ca.php | 27 + .../phpmailer/language/phpmailer.lang-cs.php | 28 + .../phpmailer/language/phpmailer.lang-da.php | 36 + .../phpmailer/language/phpmailer.lang-de.php | 28 + .../phpmailer/language/phpmailer.lang-el.php | 33 + .../phpmailer/language/phpmailer.lang-eo.php | 26 + .../phpmailer/language/phpmailer.lang-es.php | 31 + .../phpmailer/language/phpmailer.lang-et.php | 28 + .../phpmailer/language/phpmailer.lang-fa.php | 28 + .../phpmailer/language/phpmailer.lang-fi.php | 27 + .../phpmailer/language/phpmailer.lang-fo.php | 27 + .../phpmailer/language/phpmailer.lang-fr.php | 37 + .../phpmailer/language/phpmailer.lang-gl.php | 27 + .../phpmailer/language/phpmailer.lang-he.php | 27 + .../phpmailer/language/phpmailer.lang-hi.php | 35 + .../phpmailer/language/phpmailer.lang-hr.php | 27 + .../phpmailer/language/phpmailer.lang-hu.php | 27 + .../phpmailer/language/phpmailer.lang-hy.php | 27 + .../phpmailer/language/phpmailer.lang-id.php | 31 + .../phpmailer/language/phpmailer.lang-it.php | 28 + .../phpmailer/language/phpmailer.lang-ja.php | 29 + .../phpmailer/language/phpmailer.lang-ka.php | 27 + .../phpmailer/language/phpmailer.lang-ko.php | 27 + .../phpmailer/language/phpmailer.lang-lt.php | 27 + .../phpmailer/language/phpmailer.lang-lv.php | 27 + .../phpmailer/language/phpmailer.lang-mg.php | 27 + .../phpmailer/language/phpmailer.lang-mn.php | 27 + .../phpmailer/language/phpmailer.lang-ms.php | 27 + .../phpmailer/language/phpmailer.lang-nb.php | 33 + .../phpmailer/language/phpmailer.lang-nl.php | 34 + .../phpmailer/language/phpmailer.lang-pl.php | 33 + .../phpmailer/language/phpmailer.lang-pt.php | 27 + .../language/phpmailer.lang-pt_br.php | 38 + .../phpmailer/language/phpmailer.lang-ro.php | 33 + .../phpmailer/language/phpmailer.lang-ru.php | 28 + .../phpmailer/language/phpmailer.lang-si.php | 34 + .../phpmailer/language/phpmailer.lang-sk.php | 30 + .../phpmailer/language/phpmailer.lang-sl.php | 36 + .../phpmailer/language/phpmailer.lang-sr.php | 28 + .../language/phpmailer.lang-sr_latn.php | 28 + .../phpmailer/language/phpmailer.lang-sv.php | 27 + .../phpmailer/language/phpmailer.lang-tl.php | 28 + .../phpmailer/language/phpmailer.lang-tr.php | 31 + .../phpmailer/language/phpmailer.lang-uk.php | 28 + .../phpmailer/language/phpmailer.lang-vi.php | 27 + .../phpmailer/language/phpmailer.lang-zh.php | 29 + .../language/phpmailer.lang-zh_cn.php | 36 + .../phpmailer/src/DSNConfigurator.php | 245 + .../phpmailer/phpmailer/src/Exception.php | 40 + .../vendor/phpmailer/phpmailer/src/OAuth.php | 139 + .../phpmailer/src/OAuthTokenProvider.php | 44 + .../phpmailer/phpmailer/src/PHPMailer.php | 5252 ++++++++ kirby/vendor/phpmailer/phpmailer/src/POP3.php | 467 + kirby/vendor/phpmailer/phpmailer/src/SMTP.php | 1497 +++ kirby/vendor/psr/log/LICENSE | 19 + kirby/vendor/psr/log/composer.json | 26 + kirby/vendor/psr/log/src/AbstractLogger.php | 15 + .../psr/log/src/InvalidArgumentException.php | 7 + kirby/vendor/psr/log/src/LogLevel.php | 18 + .../psr/log/src/LoggerAwareInterface.php | 18 + kirby/vendor/psr/log/src/LoggerAwareTrait.php | 26 + kirby/vendor/psr/log/src/LoggerInterface.php | 125 + kirby/vendor/psr/log/src/LoggerTrait.php | 142 + kirby/vendor/psr/log/src/NullLogger.php | 30 + .../symfony/deprecation-contracts/LICENSE | 19 + .../deprecation-contracts/composer.json | 35 + .../deprecation-contracts/function.php | 27 + kirby/vendor/symfony/polyfill-ctype/Ctype.php | 232 + kirby/vendor/symfony/polyfill-ctype/LICENSE | 19 + .../symfony/polyfill-ctype/bootstrap.php | 50 + .../symfony/polyfill-ctype/bootstrap80.php | 46 + .../symfony/polyfill-ctype/composer.json | 38 + .../vendor/symfony/polyfill-intl-idn/Idn.php | 923 ++ .../vendor/symfony/polyfill-intl-idn/Info.php | 23 + .../vendor/symfony/polyfill-intl-idn/LICENSE | 19 + .../Resources/unidata/DisallowedRanges.php | 384 + .../Resources/unidata/Regex.php | 33 + .../Resources/unidata/deviation.php | 8 + .../Resources/unidata/disallowed.php | 2638 ++++ .../unidata/disallowed_STD3_mapped.php | 308 + .../unidata/disallowed_STD3_valid.php | 71 + .../Resources/unidata/ignored.php | 273 + .../Resources/unidata/mapped.php | 5778 ++++++++ .../Resources/unidata/virama.php | 65 + .../symfony/polyfill-intl-idn/bootstrap.php | 145 + .../symfony/polyfill-intl-idn/bootstrap80.php | 125 + .../symfony/polyfill-intl-idn/composer.json | 41 + .../symfony/polyfill-intl-normalizer/LICENSE | 19 + .../polyfill-intl-normalizer/Normalizer.php | 310 + .../Resources/stubs/Normalizer.php | 17 + .../unidata/canonicalComposition.php | 945 ++ .../unidata/canonicalDecomposition.php | 2065 +++ .../Resources/unidata/combiningClass.php | 876 ++ .../unidata/compatibilityDecomposition.php | 3695 +++++ .../polyfill-intl-normalizer/bootstrap.php | 23 + .../polyfill-intl-normalizer/bootstrap80.php | 19 + .../polyfill-intl-normalizer/composer.json | 36 + .../vendor/symfony/polyfill-mbstring/LICENSE | 19 + .../symfony/polyfill-mbstring/Mbstring.php | 947 ++ .../Resources/unidata/caseFolding.php | 119 + .../Resources/unidata/lowerCase.php | 1397 ++ .../Resources/unidata/titleCaseRegexp.php | 5 + .../Resources/unidata/upperCase.php | 1489 ++ .../symfony/polyfill-mbstring/bootstrap.php | 151 + .../symfony/polyfill-mbstring/bootstrap80.php | 147 + .../symfony/polyfill-mbstring/composer.json | 38 + .../symfony/yaml/Command/LintCommand.php | 276 + kirby/vendor/symfony/yaml/Dumper.php | 178 + kirby/vendor/symfony/yaml/Escaper.php | 95 + .../symfony/yaml/Exception/DumpException.php | 21 + .../yaml/Exception/ExceptionInterface.php | 21 + .../symfony/yaml/Exception/ParseException.php | 132 + .../yaml/Exception/RuntimeException.php | 21 + kirby/vendor/symfony/yaml/Inline.php | 828 ++ kirby/vendor/symfony/yaml/LICENSE | 19 + kirby/vendor/symfony/yaml/Parser.php | 1249 ++ .../symfony/yaml/Resources/bin/yaml-lint | 49 + kirby/vendor/symfony/yaml/Tag/TaggedValue.php | 38 + kirby/vendor/symfony/yaml/Unescaper.php | 108 + kirby/vendor/symfony/yaml/Yaml.php | 97 + kirby/vendor/symfony/yaml/composer.json | 39 + kirby/views/browser.php | 21 + kirby/views/fatal.php | 11 + kirby/views/panel.php | 75 + kirby/views/php.php | 11 + kirby/views/snippets/footer.php | 2 + kirby/views/snippets/header.php | 42 + media/index.html | 0 site/accounts/index.html | 0 site/blueprints/blocks/audio.yml | 16 + site/blueprints/blocks/embed.yml | 17 + site/blueprints/blocks/image.yml | 22 + site/blueprints/blocks/image_gallery.yml | 16 + site/blueprints/blocks/texts.yml | 31 + site/blueprints/blocks/twitch.yml | 10 + site/blueprints/blocks/video.yml | 27 + site/blueprints/fields/block_settings.yml | 23 + site/blueprints/pages/calendar.yml | 16 + site/blueprints/pages/calendar_entry.yml | 52 + site/blueprints/pages/default.yml | 28 + site/blueprints/pages/project.yml | 49 + site/blueprints/pages/projects.yml | 38 + site/blueprints/sections/calendar.yml | 5 + site/blueprints/sections/projects.yml | 5 + site/blueprints/site.yml | 20 + site/cache/index.html | 0 site/config/config.php | 24 + site/languages/de.php | 15 + site/languages/en.php | 15 + site/plugins/embed/.editorconfig | 9 + site/plugins/embed/.gitignore | 5 + site/plugins/embed/README.md | 125 + .../embed/assets/svg/embed-icon-failed.svg | 1 + .../embed/assets/svg/embed-icon-flickr.svg | 1 + .../embed/assets/svg/embed-icon-instagram.svg | 1 + .../assets/svg/embed-icon-soundcloud.svg | 1 + .../embed/assets/svg/embed-icon-spotify.svg | 1 + .../embed/assets/svg/embed-icon-synced.svg | 1 + .../embed/assets/svg/embed-icon-twitter.svg | 1 + .../embed/assets/svg/embed-icon-vimeo.svg | 1 + .../embed/assets/svg/embed-icon-youtube.svg | 1 + site/plugins/embed/composer.json | 27 + site/plugins/embed/index.css | 1 + site/plugins/embed/index.js | 1 + site/plugins/embed/index.php | 14 + site/plugins/embed/lib/api.php | 14 + site/plugins/embed/lib/fieldMethods.php | 14 + site/plugins/embed/lib/fields.php | 22 + site/plugins/embed/lib/languages/en.php | 6 + site/plugins/embed/lib/languages/fr.php | 6 + site/plugins/embed/lib/siteMethods.php | 99 + site/plugins/embed/package.json | 30 + .../embed/src/assets/css/_variables.scss | 38 + site/plugins/embed/src/assets/css/styles.scss | 143 + .../embed/src/components/embedField.vue | 99 + .../embed/src/components/embedInput.vue | 88 + .../embed/src/components/embedPreview.vue | 53 + site/plugins/embed/src/helpers/validators.js | 21 + site/plugins/embed/src/index.js | 13 + site/plugins/embed/vendor/autoload.php | 25 + .../embed/vendor/composer/ClassLoader.php | 581 + .../vendor/composer/InstalledVersions.php | 352 + site/plugins/embed/vendor/composer/LICENSE | 21 + .../vendor/composer/autoload_classmap.php | 10 + .../embed/vendor/composer/autoload_files.php | 11 + .../vendor/composer/autoload_namespaces.php | 10 + .../embed/vendor/composer/autoload_psr4.php | 17 + .../embed/vendor/composer/autoload_real.php | 50 + .../embed/vendor/composer/autoload_static.php | 106 + .../embed/vendor/composer/ca-bundle/LICENSE | 19 + .../embed/vendor/composer/ca-bundle/README.md | 85 + .../vendor/composer/ca-bundle/composer.json | 54 + .../vendor/composer/ca-bundle/res/cacert.pem | 3451 +++++ .../composer/ca-bundle/src/CaBundle.php | 431 + .../embed/vendor/composer/installed.json | 718 + .../embed/vendor/composer/installed.php | 134 + .../embed/vendor/composer/platform_check.php | 26 + .../embed/vendor/embed/embed/CHANGELOG.md | 246 + site/plugins/embed/vendor/embed/embed/LICENSE | 21 + .../embed/vendor/embed/embed/README.md | 360 + .../embed/vendor/embed/embed/composer.json | 72 + .../embed/embed/src/Adapters/Archive/Api.php | 18 + .../Adapters/Archive/Detectors/AuthorName.php | 17 + .../src/Adapters/Archive/Detectors/Code.php | 37 + .../Archive/Detectors/Description.php | 17 + .../Archive/Detectors/ProviderName.php | 14 + .../Archive/Detectors/PublishedTime.php | 20 + .../src/Adapters/Archive/Detectors/Title.php | 17 + .../embed/src/Adapters/Archive/Extractor.php | 30 + .../Bandcamp/Detectors/ProviderName.php | 14 + .../embed/src/Adapters/Bandcamp/Extractor.php | 16 + .../src/Adapters/CadenaSer/Detectors/Code.php | 41 + .../src/Adapters/CadenaSer/Extractor.php | 16 + .../src/Adapters/Facebook/Detectors/Title.php | 21 + .../embed/src/Adapters/Facebook/Extractor.php | 18 + .../embed/src/Adapters/Facebook/OEmbed.php | 80 + .../src/Adapters/Flickr/Detectors/Code.php | 44 + .../embed/src/Adapters/Flickr/Extractor.php | 16 + .../embed/embed/src/Adapters/Gist/Api.php | 19 + .../Adapters/Gist/Detectors/AuthorName.php | 17 + .../src/Adapters/Gist/Detectors/AuthorUrl.php | 22 + .../src/Adapters/Gist/Detectors/Code.php | 31 + .../Adapters/Gist/Detectors/PublishedTime.php | 18 + .../embed/src/Adapters/Gist/Extractor.php | 28 + .../src/Adapters/Github/Detectors/Code.php | 47 + .../embed/src/Adapters/Github/Extractor.php | 16 + .../src/Adapters/Ideone/Detectors/Code.php | 31 + .../embed/src/Adapters/Ideone/Extractor.php | 16 + .../embed/src/Adapters/ImageShack/Api.php | 36 + .../ImageShack/Detectors/AuthorName.php | 17 + .../ImageShack/Detectors/AuthorUrl.php | 22 + .../ImageShack/Detectors/Description.php | 17 + .../Adapters/ImageShack/Detectors/Image.php | 18 + .../ImageShack/Detectors/ProviderName.php | 14 + .../ImageShack/Detectors/PublishedTime.php | 18 + .../Adapters/ImageShack/Detectors/Title.php | 17 + .../src/Adapters/ImageShack/Extractor.php | 31 + .../src/Adapters/Instagram/Extractor.php | 20 + .../embed/src/Adapters/Instagram/OEmbed.php | 33 + .../src/Adapters/Pinterest/Detectors/Code.php | 41 + .../src/Adapters/Pinterest/Extractor.php | 16 + .../Adapters/Sassmeister/Detectors/Code.php | 45 + .../src/Adapters/Sassmeister/Extractor.php | 16 + .../src/Adapters/Slides/Detectors/Code.php | 39 + .../embed/src/Adapters/Slides/Extractor.php | 16 + .../src/Adapters/Snipplr/Detectors/Code.php | 46 + .../embed/src/Adapters/Snipplr/Extractor.php | 16 + .../src/Adapters/Twitch/Detectors/Code.php | 82 + .../embed/src/Adapters/Twitch/Extractor.php | 16 + .../embed/embed/src/Adapters/Twitter/Api.php | 34 + .../Adapters/Twitter/Detectors/AuthorName.php | 17 + .../Adapters/Twitter/Detectors/AuthorUrl.php | 22 + .../Twitter/Detectors/Description.php | 17 + .../src/Adapters/Twitter/Detectors/Image.php | 28 + .../Twitter/Detectors/ProviderName.php | 14 + .../Twitter/Detectors/PublishedTime.php | 18 + .../src/Adapters/Twitter/Detectors/Title.php | 21 + .../embed/src/Adapters/Twitter/Extractor.php | 31 + .../embed/src/Adapters/Wikipedia/Api.php | 40 + .../Wikipedia/Detectors/Description.php | 17 + .../Adapters/Wikipedia/Detectors/Title.php | 17 + .../src/Adapters/Wikipedia/Extractor.php | 26 + .../src/Adapters/Youtube/Detectors/Feeds.php | 35 + .../embed/src/Adapters/Youtube/Extractor.php | 16 + .../embed/vendor/embed/embed/src/ApiTrait.php | 107 + .../embed/embed/src/Detectors/AuthorName.php | 24 + .../embed/embed/src/Detectors/AuthorUrl.php | 29 + .../vendor/embed/embed/src/Detectors/Cms.php | 68 + .../vendor/embed/embed/src/Detectors/Code.php | 142 + .../embed/embed/src/Detectors/Description.php | 28 + .../embed/embed/src/Detectors/Detector.php | 31 + .../embed/embed/src/Detectors/Favicon.php | 18 + .../embed/embed/src/Detectors/Feeds.php | 35 + .../vendor/embed/embed/src/Detectors/Icon.php | 20 + .../embed/embed/src/Detectors/Image.php | 38 + .../embed/embed/src/Detectors/Keywords.php | 63 + .../embed/embed/src/Detectors/Language.php | 20 + .../embed/embed/src/Detectors/Languages.php | 31 + .../embed/embed/src/Detectors/License.php | 16 + .../embed/src/Detectors/ProviderName.php | 56 + .../embed/embed/src/Detectors/ProviderUrl.php | 24 + .../embed/src/Detectors/PublishedTime.php | 60 + .../embed/embed/src/Detectors/Redirect.php | 26 + .../embed/embed/src/Detectors/Title.php | 27 + .../vendor/embed/embed/src/Detectors/Url.php | 18 + .../embed/vendor/embed/embed/src/Document.php | 124 + .../embed/vendor/embed/embed/src/Embed.php | 89 + .../vendor/embed/embed/src/EmbedCode.php | 42 + .../vendor/embed/embed/src/Extractor.php | 222 + .../embed/embed/src/ExtractorFactory.php | 93 + .../vendor/embed/embed/src/Http/Crawler.php | 77 + .../embed/embed/src/Http/CurlClient.php | 40 + .../embed/embed/src/Http/CurlDispatcher.php | 207 + .../embed/embed/src/Http/FactoryDiscovery.php | 72 + .../embed/embed/src/Http/NetworkException.php | 24 + .../embed/embed/src/Http/RequestException.php | 23 + .../vendor/embed/embed/src/HttpApiTrait.php | 32 + .../vendor/embed/embed/src/LinkedData.php | 111 + .../embed/vendor/embed/embed/src/Metas.php | 43 + .../embed/vendor/embed/embed/src/OEmbed.php | 173 + .../vendor/embed/embed/src/QueryResult.php | 112 + .../vendor/embed/embed/src/functions.php | 156 + .../embed/embed/src/resources/oembed.php | 1134 ++ .../embed/embed/src/resources/suffix.php | 8002 +++++++++++ .../getkirby/composer-installer/composer.json | 30 + .../getkirby/composer-installer/readme.md | 104 + .../src/ComposerInstaller/CmsInstaller.php | 64 + .../src/ComposerInstaller/Installer.php | 105 + .../src/ComposerInstaller/Plugin.php | 59 + .../src/ComposerInstaller/PluginInstaller.php | 112 + .../embed/vendor/guzzlehttp/psr7/CHANGELOG.md | 437 + .../embed/vendor/guzzlehttp/psr7/LICENSE | 26 + .../embed/vendor/guzzlehttp/psr7/README.md | 880 ++ .../vendor/guzzlehttp/psr7/composer.json | 93 + .../guzzlehttp/psr7/src/AppendStream.php | 248 + .../guzzlehttp/psr7/src/BufferStream.php | 147 + .../guzzlehttp/psr7/src/CachingStream.php | 153 + .../guzzlehttp/psr7/src/DroppingStream.php | 49 + .../src/Exception/MalformedUriException.php | 14 + .../vendor/guzzlehttp/psr7/src/FnStream.php | 179 + .../vendor/guzzlehttp/psr7/src/Header.php | 134 + .../guzzlehttp/psr7/src/HttpFactory.php | 94 + .../guzzlehttp/psr7/src/InflateStream.php | 37 + .../guzzlehttp/psr7/src/LazyOpenStream.php | 49 + .../guzzlehttp/psr7/src/LimitStream.php | 157 + .../vendor/guzzlehttp/psr7/src/Message.php | 246 + .../guzzlehttp/psr7/src/MessageTrait.php | 265 + .../vendor/guzzlehttp/psr7/src/MimeType.php | 1259 ++ .../guzzlehttp/psr7/src/MultipartStream.php | 157 + .../guzzlehttp/psr7/src/NoSeekStream.php | 28 + .../vendor/guzzlehttp/psr7/src/PumpStream.php | 179 + .../vendor/guzzlehttp/psr7/src/Query.php | 113 + .../vendor/guzzlehttp/psr7/src/Request.php | 159 + .../vendor/guzzlehttp/psr7/src/Response.php | 161 + .../vendor/guzzlehttp/psr7/src/Rfc7230.php | 23 + .../guzzlehttp/psr7/src/ServerRequest.php | 340 + .../vendor/guzzlehttp/psr7/src/Stream.php | 283 + .../psr7/src/StreamDecoratorTrait.php | 156 + .../guzzlehttp/psr7/src/StreamWrapper.php | 175 + .../guzzlehttp/psr7/src/UploadedFile.php | 211 + .../embed/vendor/guzzlehttp/psr7/src/Uri.php | 741 + .../guzzlehttp/psr7/src/UriComparator.php | 52 + .../guzzlehttp/psr7/src/UriNormalizer.php | 220 + .../guzzlehttp/psr7/src/UriResolver.php | 211 + .../vendor/guzzlehttp/psr7/src/Utils.php | 463 + .../embed/vendor/ml/iri/ML/IRI/.gitignore | 3 + .../embed/vendor/ml/iri/ML/IRI/.travis.yml | 7 + .../embed/vendor/ml/iri/ML/IRI/IRI.php | 601 + .../embed/vendor/ml/iri/ML/IRI/LICENSE | 19 + .../embed/vendor/ml/iri/ML/IRI/README.md | 47 + .../vendor/ml/iri/ML/IRI/Test/IriTest.php | 1078 ++ .../vendor/ml/iri/ML/IRI/Test/bootstrap.php | 12 + .../embed/vendor/ml/iri/ML/IRI/composer.json | 24 + .../vendor/ml/iri/ML/IRI/phpunit.xml.dist | 32 + .../ml/json-ld/.devcontainer/Dockerfile | 16 + .../json-ld/.devcontainer/devcontainer.json | 46 + .../ml/json-ld/.github/workflows/ci.yaml | 43 + .../embed/vendor/ml/json-ld/.gitignore | 4 + .../vendor/ml/json-ld/.vscode/launch.json | 29 + .../ml/json-ld/DefaultDocumentFactory.php | 28 + .../embed/vendor/ml/json-ld/Document.php | 206 + .../ml/json-ld/DocumentFactoryInterface.php | 29 + .../vendor/ml/json-ld/DocumentInterface.php | 89 + .../ml/json-ld/DocumentLoaderInterface.php | 31 + .../Exception/InvalidQuadException.php | 61 + .../ml/json-ld/Exception/JsonLdException.php | 307 + .../ml/json-ld/FileGetContentsLoader.php | 197 + .../plugins/embed/vendor/ml/json-ld/Graph.php | 273 + .../vendor/ml/json-ld/GraphInterface.php | 117 + .../embed/vendor/ml/json-ld/JsonLD.php | 692 + .../vendor/ml/json-ld/JsonLdSerializable.php | 38 + site/plugins/embed/vendor/ml/json-ld/LICENSE | 19 + .../ml/json-ld/LanguageTaggedString.php | 95 + .../embed/vendor/ml/json-ld/NQuads.php | 176 + site/plugins/embed/vendor/ml/json-ld/Node.php | 509 + .../embed/vendor/ml/json-ld/NodeInterface.php | 218 + .../embed/vendor/ml/json-ld/Processor.php | 2973 ++++ site/plugins/embed/vendor/ml/json-ld/Quad.php | 152 + .../vendor/ml/json-ld/QuadParserInterface.php | 27 + .../ml/json-ld/QuadSerializerInterface.php | 27 + .../plugins/embed/vendor/ml/json-ld/README.md | 104 + .../embed/vendor/ml/json-ld/RdfConstants.php | 28 + .../vendor/ml/json-ld/RemoteDocument.php | 57 + .../vendor/ml/json-ld/Test/DocumentTest.php | 100 + .../ml/json-ld/Test/EarlReportGenerator.php | 273 + .../Test/FileGetContentsLoaderTest.php | 99 + .../ml/json-ld/Test/Fixtures/dataset.jsonld | 36 + .../Test/Fixtures/sample-compacted.jsonld | 24 + .../Test/Fixtures/sample-context.jsonld | 11 + .../Test/Fixtures/sample-expanded.jsonld | 20 + .../Test/Fixtures/sample-flattened.jsonld | 34 + .../ml/json-ld/Test/Fixtures/sample-in.jsonld | 22 + .../sample-serialized-document.jsonld | 23 + .../vendor/ml/json-ld/Test/GraphTest.php | 915 ++ .../vendor/ml/json-ld/Test/JsonLDApiTest.php | 132 + .../vendor/ml/json-ld/Test/JsonTestCase.php | 64 + .../vendor/ml/json-ld/Test/NQuadsTest.php | 106 + .../ml/json-ld/Test/TestManifestIterator.php | 120 + .../vendor/ml/json-ld/Test/ValueTest.php | 138 + .../ml/json-ld/Test/W3CTestSuiteTest.php | 368 + .../vendor/ml/json-ld/Test/bootstrap.php | 19 + .../embed/vendor/ml/json-ld/TypedValue.php | 139 + .../plugins/embed/vendor/ml/json-ld/Value.php | 123 + .../embed/vendor/ml/json-ld/composer.json | 30 + .../embed/vendor/ml/json-ld/phpunit.xml.dist | 74 + .../html-parser/.github/workflows/test.yml | 44 + .../oscarotero/html-parser/CHANGELOG.md | 54 + .../vendor/oscarotero/html-parser/LICENSE | 21 + .../vendor/oscarotero/html-parser/README.md | 25 + .../oscarotero/html-parser/composer.json | 41 + .../oscarotero/html-parser/src/Parser.php | 95 + .../embed/vendor/psr/http-client/CHANGELOG.md | 31 + .../embed/vendor/psr/http-client/LICENSE | 19 + .../embed/vendor/psr/http-client/README.md | 12 + .../vendor/psr/http-client/composer.json | 30 + .../src/ClientExceptionInterface.php | 10 + .../psr/http-client/src/ClientInterface.php | 20 + .../src/NetworkExceptionInterface.php | 24 + .../src/RequestExceptionInterface.php | 24 + .../embed/vendor/psr/http-factory/LICENSE | 21 + .../embed/vendor/psr/http-factory/README.md | 12 + .../vendor/psr/http-factory/composer.json | 35 + .../src/RequestFactoryInterface.php | 18 + .../src/ResponseFactoryInterface.php | 18 + .../src/ServerRequestFactoryInterface.php | 24 + .../src/StreamFactoryInterface.php | 45 + .../src/UploadedFileFactoryInterface.php | 34 + .../http-factory/src/UriFactoryInterface.php | 17 + .../vendor/psr/http-message/CHANGELOG.md | 36 + .../embed/vendor/psr/http-message/LICENSE | 19 + .../embed/vendor/psr/http-message/README.md | 16 + .../vendor/psr/http-message/composer.json | 26 + .../psr/http-message/docs/PSR7-Interfaces.md | 130 + .../psr/http-message/docs/PSR7-Usage.md | 159 + .../psr/http-message/src/MessageInterface.php | 187 + .../psr/http-message/src/RequestInterface.php | 130 + .../http-message/src/ResponseInterface.php | 68 + .../src/ServerRequestInterface.php | 261 + .../psr/http-message/src/StreamInterface.php | 158 + .../src/UploadedFileInterface.php | 123 + .../psr/http-message/src/UriInterface.php | 324 + .../vendor/ralouphie/getallheaders/LICENSE | 21 + .../vendor/ralouphie/getallheaders/README.md | 27 + .../ralouphie/getallheaders/composer.json | 26 + .../getallheaders/src/getallheaders.php | 46 + site/plugins/embed/yarn.lock | 1740 +++ site/plugins/my-helper/index.php | 33 + site/sessions/index.html | 0 site/snippets/blocks/audio.php | 3 + site/snippets/blocks/code.php | 3 + site/snippets/blocks/embed.php | 52 + site/snippets/blocks/iframe.php | 5 + site/snippets/blocks/image.php | 23 + site/snippets/blocks/image_gallery.php | 7 + site/snippets/blocks/texts.php | 10 + site/snippets/blocks/twitch.php | 17 + site/snippets/blocks/video.php | 9 + site/snippets/footer.php | 91 + site/snippets/header.php | 51 + site/snippets/index.html | 0 site/snippets/layouts.php | 9 + site/templates/calendar.php | 27 + site/templates/default.php | 9 + site/templates/home.php | 30 + site/templates/project.php | 11 + site/templates/projects.php | 25 + 1169 files changed, 235103 insertions(+) create mode 100644 .editorconfig create mode 100644 .gitignore create mode 100644 .htaccess create mode 100644 README.md create mode 100755 assets/Kobata-Bold.woff2 create mode 100755 assets/VG5000-Regular_web.woff2 create mode 100644 assets/grid/black.png create mode 100644 assets/grid/black@2x.png create mode 100644 assets/grid/green.png create mode 100644 assets/grid/green@2x.png create mode 100644 assets/grid/lila.png create mode 100644 assets/grid/lila@2x.png create mode 100644 assets/grid/orange.png create mode 100644 assets/grid/orange@2x.png create mode 100644 assets/grid/pink.png create mode 100644 assets/grid/pink@2x.png create mode 100644 assets/grid/white.png create mode 100644 assets/grid/white@2x.png create mode 100644 assets/siema.min.js create mode 100644 assets/style.css create mode 100644 composer.json create mode 100644 index.php create mode 100644 kirby/.editorconfig create mode 100644 kirby/CONTRIBUTING.md create mode 100644 kirby/LICENSE.md create mode 100644 kirby/README.md create mode 100644 kirby/SECURITY.md create mode 100644 kirby/assets/whoops.css create mode 100644 kirby/bootstrap.php create mode 100644 kirby/cacert.pem create mode 100644 kirby/composer.json create mode 100644 kirby/composer.lock create mode 100644 kirby/config/aliases.php create mode 100644 kirby/config/api/authentication.php create mode 100644 kirby/config/api/collections.php create mode 100644 kirby/config/api/models.php create mode 100644 kirby/config/api/models/File.php create mode 100644 kirby/config/api/models/FileBlueprint.php create mode 100644 kirby/config/api/models/FileVersion.php create mode 100644 kirby/config/api/models/Language.php create mode 100644 kirby/config/api/models/License.php create mode 100644 kirby/config/api/models/Page.php create mode 100644 kirby/config/api/models/PageBlueprint.php create mode 100644 kirby/config/api/models/Role.php create mode 100644 kirby/config/api/models/Site.php create mode 100644 kirby/config/api/models/SiteBlueprint.php create mode 100644 kirby/config/api/models/System.php create mode 100644 kirby/config/api/models/Translation.php create mode 100644 kirby/config/api/models/User.php create mode 100644 kirby/config/api/models/UserBlueprint.php create mode 100644 kirby/config/api/routes.php create mode 100644 kirby/config/api/routes/auth.php create mode 100644 kirby/config/api/routes/files.php create mode 100644 kirby/config/api/routes/kql.php create mode 100644 kirby/config/api/routes/languages.php create mode 100644 kirby/config/api/routes/lock.php create mode 100644 kirby/config/api/routes/pages.php create mode 100644 kirby/config/api/routes/roles.php create mode 100644 kirby/config/api/routes/site.php create mode 100644 kirby/config/api/routes/system.php create mode 100644 kirby/config/api/routes/translations.php create mode 100644 kirby/config/api/routes/users.php create mode 100644 kirby/config/areas/account.php create mode 100644 kirby/config/areas/account/dialogs.php create mode 100644 kirby/config/areas/account/drawers.php create mode 100644 kirby/config/areas/account/dropdowns.php create mode 100644 kirby/config/areas/account/views.php create mode 100644 kirby/config/areas/fields/dialogs.php create mode 100644 kirby/config/areas/fields/drawers.php create mode 100644 kirby/config/areas/files/dialogs.php create mode 100644 kirby/config/areas/files/dropdowns.php create mode 100644 kirby/config/areas/installation.php create mode 100644 kirby/config/areas/lab.php create mode 100644 kirby/config/areas/lab/drawers.php create mode 100644 kirby/config/areas/lab/views.php create mode 100644 kirby/config/areas/languages.php create mode 100644 kirby/config/areas/languages/dialogs.php create mode 100644 kirby/config/areas/languages/views.php create mode 100644 kirby/config/areas/login.php create mode 100644 kirby/config/areas/logout.php create mode 100644 kirby/config/areas/search.php create mode 100644 kirby/config/areas/search/views.php create mode 100644 kirby/config/areas/site.php create mode 100644 kirby/config/areas/site/dialogs.php create mode 100644 kirby/config/areas/site/drawers.php create mode 100644 kirby/config/areas/site/dropdowns.php create mode 100644 kirby/config/areas/site/requests.php create mode 100644 kirby/config/areas/site/searches.php create mode 100644 kirby/config/areas/site/views.php create mode 100644 kirby/config/areas/system.php create mode 100644 kirby/config/areas/system/dialogs.php create mode 100644 kirby/config/areas/system/views.php create mode 100644 kirby/config/areas/users.php create mode 100644 kirby/config/areas/users/dialogs.php create mode 100644 kirby/config/areas/users/drawers.php create mode 100644 kirby/config/areas/users/dropdowns.php create mode 100644 kirby/config/areas/users/searches.php create mode 100644 kirby/config/areas/users/views.php create mode 100644 kirby/config/blocks/code/code.php create mode 100644 kirby/config/blocks/code/code.yml create mode 100644 kirby/config/blocks/gallery/gallery.php create mode 100644 kirby/config/blocks/gallery/gallery.yml create mode 100644 kirby/config/blocks/heading/heading.php create mode 100644 kirby/config/blocks/heading/heading.yml create mode 100644 kirby/config/blocks/image/image.php create mode 100644 kirby/config/blocks/image/image.yml create mode 100644 kirby/config/blocks/line/line.php create mode 100644 kirby/config/blocks/line/line.yml create mode 100644 kirby/config/blocks/list/list.php create mode 100644 kirby/config/blocks/list/list.yml create mode 100644 kirby/config/blocks/markdown/markdown.php create mode 100644 kirby/config/blocks/markdown/markdown.yml create mode 100644 kirby/config/blocks/quote/quote.php create mode 100644 kirby/config/blocks/quote/quote.yml create mode 100644 kirby/config/blocks/table/table.yml create mode 100644 kirby/config/blocks/text/text.php create mode 100644 kirby/config/blocks/text/text.yml create mode 100644 kirby/config/blocks/video/video.php create mode 100644 kirby/config/blocks/video/video.yml create mode 100644 kirby/config/components.php create mode 100644 kirby/config/fields/checkboxes.php create mode 100644 kirby/config/fields/color.php create mode 100644 kirby/config/fields/date.php create mode 100644 kirby/config/fields/email.php create mode 100644 kirby/config/fields/files.php create mode 100644 kirby/config/fields/gap.php create mode 100644 kirby/config/fields/headline.php create mode 100644 kirby/config/fields/hidden.php create mode 100644 kirby/config/fields/info.php create mode 100644 kirby/config/fields/line.php create mode 100644 kirby/config/fields/link.php create mode 100644 kirby/config/fields/list.php create mode 100644 kirby/config/fields/mixins/datetime.php create mode 100644 kirby/config/fields/mixins/filepicker.php create mode 100644 kirby/config/fields/mixins/layout.php create mode 100644 kirby/config/fields/mixins/min.php create mode 100644 kirby/config/fields/mixins/options.php create mode 100644 kirby/config/fields/mixins/pagepicker.php create mode 100644 kirby/config/fields/mixins/picker.php create mode 100644 kirby/config/fields/mixins/upload.php create mode 100644 kirby/config/fields/mixins/userpicker.php create mode 100644 kirby/config/fields/multiselect.php create mode 100644 kirby/config/fields/number.php create mode 100644 kirby/config/fields/object.php create mode 100644 kirby/config/fields/pages.php create mode 100644 kirby/config/fields/radio.php create mode 100644 kirby/config/fields/range.php create mode 100644 kirby/config/fields/select.php create mode 100644 kirby/config/fields/slug.php create mode 100644 kirby/config/fields/structure.php create mode 100644 kirby/config/fields/tags.php create mode 100644 kirby/config/fields/tel.php create mode 100644 kirby/config/fields/text.php create mode 100644 kirby/config/fields/textarea.php create mode 100644 kirby/config/fields/time.php create mode 100644 kirby/config/fields/toggle.php create mode 100644 kirby/config/fields/toggles.php create mode 100644 kirby/config/fields/url.php create mode 100644 kirby/config/fields/users.php create mode 100644 kirby/config/fields/writer.php create mode 100644 kirby/config/helpers.php create mode 100644 kirby/config/methods.php create mode 100644 kirby/config/presets/files.php create mode 100644 kirby/config/presets/page.php create mode 100644 kirby/config/presets/pages.php create mode 100644 kirby/config/routes.php create mode 100644 kirby/config/sections/fields.php create mode 100644 kirby/config/sections/files.php create mode 100644 kirby/config/sections/info.php create mode 100644 kirby/config/sections/mixins/details.php create mode 100644 kirby/config/sections/mixins/empty.php create mode 100644 kirby/config/sections/mixins/headline.php create mode 100644 kirby/config/sections/mixins/help.php create mode 100644 kirby/config/sections/mixins/layout.php create mode 100644 kirby/config/sections/mixins/max.php create mode 100644 kirby/config/sections/mixins/min.php create mode 100644 kirby/config/sections/mixins/pagination.php create mode 100644 kirby/config/sections/mixins/parent.php create mode 100644 kirby/config/sections/mixins/search.php create mode 100644 kirby/config/sections/mixins/sort.php create mode 100644 kirby/config/sections/pages.php create mode 100644 kirby/config/sections/stats.php create mode 100644 kirby/config/setup.php create mode 100644 kirby/config/tags.php create mode 100644 kirby/config/templates/emails/auth/login.php create mode 100644 kirby/config/templates/emails/auth/password-reset.php create mode 100644 kirby/dependencies/parsedown-extra/ParsedownExtra.php create mode 100644 kirby/dependencies/parsedown/Parsedown.php create mode 100644 kirby/dependencies/spyc/COPYING create mode 100644 kirby/dependencies/spyc/Spyc.php create mode 100644 kirby/i18n/rules/LICENSE create mode 100644 kirby/i18n/rules/ar.json create mode 100644 kirby/i18n/rules/az.json create mode 100644 kirby/i18n/rules/bg.json create mode 100644 kirby/i18n/rules/cs.json create mode 100644 kirby/i18n/rules/da.json create mode 100644 kirby/i18n/rules/de.json create mode 100644 kirby/i18n/rules/el.json create mode 100644 kirby/i18n/rules/eo.json create mode 100644 kirby/i18n/rules/et.json create mode 100644 kirby/i18n/rules/fa.json create mode 100644 kirby/i18n/rules/fi.json create mode 100644 kirby/i18n/rules/fr.json create mode 100644 kirby/i18n/rules/hi.json create mode 100644 kirby/i18n/rules/hr.json create mode 100644 kirby/i18n/rules/hu.json create mode 100644 kirby/i18n/rules/hy.json create mode 100644 kirby/i18n/rules/is_IS.json create mode 100644 kirby/i18n/rules/it.json create mode 100644 kirby/i18n/rules/iu.json create mode 100644 kirby/i18n/rules/ja.json create mode 100644 kirby/i18n/rules/ka.json create mode 100644 kirby/i18n/rules/ko.json create mode 100644 kirby/i18n/rules/lt.json create mode 100644 kirby/i18n/rules/lv.json create mode 100644 kirby/i18n/rules/mk.json create mode 100644 kirby/i18n/rules/my.json create mode 100644 kirby/i18n/rules/nb.json create mode 100644 kirby/i18n/rules/pl.json create mode 100644 kirby/i18n/rules/pt_BR.json create mode 100644 kirby/i18n/rules/ro.json create mode 100644 kirby/i18n/rules/ru.json create mode 100644 kirby/i18n/rules/sr.json create mode 100644 kirby/i18n/rules/sv_SE.json create mode 100644 kirby/i18n/rules/tr.json create mode 100644 kirby/i18n/rules/uk.json create mode 100644 kirby/i18n/rules/vi.json create mode 100644 kirby/i18n/rules/zh.json create mode 100644 kirby/i18n/translations/bg.json create mode 100644 kirby/i18n/translations/ca.json create mode 100644 kirby/i18n/translations/cs.json create mode 100644 kirby/i18n/translations/da.json create mode 100644 kirby/i18n/translations/de.json create mode 100644 kirby/i18n/translations/el.json create mode 100644 kirby/i18n/translations/en.json create mode 100644 kirby/i18n/translations/eo.json create mode 100644 kirby/i18n/translations/es_419.json create mode 100644 kirby/i18n/translations/es_ES.json create mode 100644 kirby/i18n/translations/fa.json create mode 100644 kirby/i18n/translations/fi.json create mode 100644 kirby/i18n/translations/fr.json create mode 100644 kirby/i18n/translations/hu.json create mode 100644 kirby/i18n/translations/id.json create mode 100644 kirby/i18n/translations/is_IS.json create mode 100644 kirby/i18n/translations/it.json create mode 100644 kirby/i18n/translations/ko.json create mode 100644 kirby/i18n/translations/lt.json create mode 100644 kirby/i18n/translations/nb.json create mode 100644 kirby/i18n/translations/nl.json create mode 100644 kirby/i18n/translations/pl.json create mode 100644 kirby/i18n/translations/pt_BR.json create mode 100644 kirby/i18n/translations/pt_PT.json create mode 100644 kirby/i18n/translations/ro.json create mode 100644 kirby/i18n/translations/ru.json create mode 100644 kirby/i18n/translations/sk.json create mode 100644 kirby/i18n/translations/sv_SE.json create mode 100644 kirby/i18n/translations/tr.json create mode 100644 kirby/kirby.pub create mode 100644 kirby/package-lock.json create mode 100644 kirby/panel/.prettierignore create mode 100644 kirby/panel/dist/apple-touch-icon-dark.png create mode 100644 kirby/panel/dist/apple-touch-icon.png create mode 100644 kirby/panel/dist/css/style.min.css create mode 100644 kirby/panel/dist/favicon-dark.png create mode 100644 kirby/panel/dist/favicon.png create mode 100644 kirby/panel/dist/favicon.svg create mode 100644 kirby/panel/dist/img/icons.svg create mode 100644 kirby/panel/dist/js/Docs.min.js create mode 100644 kirby/panel/dist/js/DocsView.min.js create mode 100644 kirby/panel/dist/js/Highlight.min.js create mode 100644 kirby/panel/dist/js/IndexView.min.js create mode 100644 kirby/panel/dist/js/PlaygroundView.min.js create mode 100644 kirby/panel/dist/js/container-query-polyfill.modern.min.js create mode 100644 kirby/panel/dist/js/index.min.js create mode 100644 kirby/panel/dist/js/plugins.js create mode 100644 kirby/panel/dist/js/vendor.min.js create mode 100644 kirby/panel/dist/js/vue.min.js create mode 100644 kirby/panel/dist/js/vuedraggable.min.js create mode 100644 kirby/panel/eslint.config.mjs create mode 100644 kirby/router.php create mode 100644 kirby/src/Api/Api.php create mode 100644 kirby/src/Api/Collection.php create mode 100644 kirby/src/Api/Model.php create mode 100644 kirby/src/Blueprint/Collection.php create mode 100644 kirby/src/Blueprint/Config.php create mode 100644 kirby/src/Blueprint/Extension.php create mode 100644 kirby/src/Blueprint/Factory.php create mode 100644 kirby/src/Blueprint/Node.php create mode 100644 kirby/src/Blueprint/NodeI18n.php create mode 100644 kirby/src/Blueprint/NodeIcon.php create mode 100644 kirby/src/Blueprint/NodeProperty.php create mode 100644 kirby/src/Blueprint/NodeString.php create mode 100644 kirby/src/Blueprint/NodeText.php create mode 100644 kirby/src/Cache/ApcuCache.php create mode 100644 kirby/src/Cache/Cache.php create mode 100644 kirby/src/Cache/FileCache.php create mode 100644 kirby/src/Cache/MemCached.php create mode 100644 kirby/src/Cache/MemoryCache.php create mode 100644 kirby/src/Cache/NullCache.php create mode 100644 kirby/src/Cache/Value.php create mode 100644 kirby/src/Cms/Api.php create mode 100644 kirby/src/Cms/App.php create mode 100644 kirby/src/Cms/AppCaches.php create mode 100644 kirby/src/Cms/AppErrors.php create mode 100644 kirby/src/Cms/AppPlugins.php create mode 100644 kirby/src/Cms/AppTranslations.php create mode 100644 kirby/src/Cms/AppUsers.php create mode 100644 kirby/src/Cms/Auth.php create mode 100644 kirby/src/Cms/Auth/Challenge.php create mode 100644 kirby/src/Cms/Auth/EmailChallenge.php create mode 100644 kirby/src/Cms/Auth/Status.php create mode 100644 kirby/src/Cms/Auth/TotpChallenge.php create mode 100644 kirby/src/Cms/Block.php create mode 100644 kirby/src/Cms/BlockConverter.php create mode 100644 kirby/src/Cms/Blocks.php create mode 100644 kirby/src/Cms/Blueprint.php create mode 100644 kirby/src/Cms/Collection.php create mode 100644 kirby/src/Cms/Collections.php create mode 100644 kirby/src/Cms/ContentLock.php create mode 100644 kirby/src/Cms/ContentLocks.php create mode 100644 kirby/src/Cms/Core.php create mode 100644 kirby/src/Cms/Email.php create mode 100644 kirby/src/Cms/Event.php create mode 100644 kirby/src/Cms/Fieldset.php create mode 100644 kirby/src/Cms/Fieldsets.php create mode 100644 kirby/src/Cms/File.php create mode 100644 kirby/src/Cms/FileActions.php create mode 100644 kirby/src/Cms/FileBlueprint.php create mode 100644 kirby/src/Cms/FileModifications.php create mode 100644 kirby/src/Cms/FilePermissions.php create mode 100644 kirby/src/Cms/FilePicker.php create mode 100644 kirby/src/Cms/FileRules.php create mode 100644 kirby/src/Cms/FileVersion.php create mode 100644 kirby/src/Cms/Files.php create mode 100644 kirby/src/Cms/Find.php create mode 100644 kirby/src/Cms/HasChildren.php create mode 100644 kirby/src/Cms/HasFiles.php create mode 100644 kirby/src/Cms/HasMethods.php create mode 100644 kirby/src/Cms/HasSiblings.php create mode 100644 kirby/src/Cms/Helpers.php create mode 100644 kirby/src/Cms/Html.php create mode 100644 kirby/src/Cms/Ingredients.php create mode 100644 kirby/src/Cms/Item.php create mode 100644 kirby/src/Cms/Items.php create mode 100644 kirby/src/Cms/Language.php create mode 100644 kirby/src/Cms/LanguageRouter.php create mode 100644 kirby/src/Cms/LanguageRoutes.php create mode 100644 kirby/src/Cms/LanguageRules.php create mode 100644 kirby/src/Cms/LanguageVariable.php create mode 100644 kirby/src/Cms/Languages.php create mode 100644 kirby/src/Cms/Layout.php create mode 100644 kirby/src/Cms/LayoutColumn.php create mode 100644 kirby/src/Cms/LayoutColumns.php create mode 100644 kirby/src/Cms/Layouts.php create mode 100644 kirby/src/Cms/License.php create mode 100644 kirby/src/Cms/LicenseStatus.php create mode 100644 kirby/src/Cms/LicenseType.php create mode 100644 kirby/src/Cms/Loader.php create mode 100644 kirby/src/Cms/Media.php create mode 100644 kirby/src/Cms/Model.php create mode 100644 kirby/src/Cms/ModelPermissions.php create mode 100644 kirby/src/Cms/ModelWithContent.php create mode 100644 kirby/src/Cms/Nest.php create mode 100644 kirby/src/Cms/NestCollection.php create mode 100644 kirby/src/Cms/NestObject.php create mode 100644 kirby/src/Cms/Page.php create mode 100644 kirby/src/Cms/PageActions.php create mode 100644 kirby/src/Cms/PageBlueprint.php create mode 100644 kirby/src/Cms/PagePermissions.php create mode 100644 kirby/src/Cms/PagePicker.php create mode 100644 kirby/src/Cms/PageRules.php create mode 100644 kirby/src/Cms/PageSiblings.php create mode 100644 kirby/src/Cms/Pages.php create mode 100644 kirby/src/Cms/Pagination.php create mode 100644 kirby/src/Cms/Permissions.php create mode 100644 kirby/src/Cms/Picker.php create mode 100644 kirby/src/Cms/Plugin.php create mode 100644 kirby/src/Cms/PluginAsset.php create mode 100644 kirby/src/Cms/PluginAssets.php create mode 100644 kirby/src/Cms/R.php create mode 100644 kirby/src/Cms/Responder.php create mode 100644 kirby/src/Cms/Response.php create mode 100644 kirby/src/Cms/Role.php create mode 100644 kirby/src/Cms/Roles.php create mode 100644 kirby/src/Cms/S.php create mode 100644 kirby/src/Cms/Search.php create mode 100644 kirby/src/Cms/Section.php create mode 100644 kirby/src/Cms/Site.php create mode 100644 kirby/src/Cms/SiteActions.php create mode 100644 kirby/src/Cms/SiteBlueprint.php create mode 100644 kirby/src/Cms/SitePermissions.php create mode 100644 kirby/src/Cms/SiteRules.php create mode 100644 kirby/src/Cms/Structure.php create mode 100644 kirby/src/Cms/StructureObject.php create mode 100644 kirby/src/Cms/System.php create mode 100644 kirby/src/Cms/System/UpdateStatus.php create mode 100644 kirby/src/Cms/Translation.php create mode 100644 kirby/src/Cms/Translations.php create mode 100644 kirby/src/Cms/Url.php create mode 100644 kirby/src/Cms/User.php create mode 100644 kirby/src/Cms/UserActions.php create mode 100644 kirby/src/Cms/UserBlueprint.php create mode 100644 kirby/src/Cms/UserPermissions.php create mode 100644 kirby/src/Cms/UserPicker.php create mode 100644 kirby/src/Cms/UserRules.php create mode 100644 kirby/src/Cms/Users.php create mode 100644 kirby/src/Cms/Visitor.php create mode 100644 kirby/src/Content/Content.php create mode 100644 kirby/src/Content/ContentStorage.php create mode 100644 kirby/src/Content/ContentStorageHandler.php create mode 100644 kirby/src/Content/ContentTranslation.php create mode 100644 kirby/src/Content/Field.php create mode 100644 kirby/src/Content/PlainTextContentStorageHandler.php create mode 100644 kirby/src/Data/Data.php create mode 100644 kirby/src/Data/Handler.php create mode 100644 kirby/src/Data/Json.php create mode 100644 kirby/src/Data/PHP.php create mode 100644 kirby/src/Data/Txt.php create mode 100644 kirby/src/Data/Xml.php create mode 100644 kirby/src/Data/Yaml.php create mode 100644 kirby/src/Data/YamlSpyc.php create mode 100644 kirby/src/Data/YamlSymfony.php create mode 100644 kirby/src/Database/Database.php create mode 100644 kirby/src/Database/Db.php create mode 100644 kirby/src/Database/Query.php create mode 100644 kirby/src/Database/Sql.php create mode 100644 kirby/src/Database/Sql/Mysql.php create mode 100644 kirby/src/Database/Sql/Sqlite.php create mode 100644 kirby/src/Email/Body.php create mode 100644 kirby/src/Email/Email.php create mode 100644 kirby/src/Email/PHPMailer.php create mode 100644 kirby/src/Exception/AuthException.php create mode 100644 kirby/src/Exception/BadMethodCallException.php create mode 100644 kirby/src/Exception/DuplicateException.php create mode 100644 kirby/src/Exception/ErrorPageException.php create mode 100644 kirby/src/Exception/Exception.php create mode 100644 kirby/src/Exception/InvalidArgumentException.php create mode 100644 kirby/src/Exception/LogicException.php create mode 100644 kirby/src/Exception/NotFoundException.php create mode 100644 kirby/src/Exception/PermissionException.php create mode 100644 kirby/src/Field/FieldOptions.php create mode 100644 kirby/src/Filesystem/Asset.php create mode 100644 kirby/src/Filesystem/Dir.php create mode 100644 kirby/src/Filesystem/F.php create mode 100644 kirby/src/Filesystem/File.php create mode 100644 kirby/src/Filesystem/Filename.php create mode 100644 kirby/src/Filesystem/IsFile.php create mode 100644 kirby/src/Filesystem/Mime.php create mode 100644 kirby/src/Form/Field.php create mode 100644 kirby/src/Form/Field/BlocksField.php create mode 100644 kirby/src/Form/Field/LayoutField.php create mode 100644 kirby/src/Form/FieldClass.php create mode 100644 kirby/src/Form/Fields.php create mode 100644 kirby/src/Form/Form.php create mode 100644 kirby/src/Form/Mixin/EmptyState.php create mode 100644 kirby/src/Form/Mixin/Max.php create mode 100644 kirby/src/Form/Mixin/Min.php create mode 100644 kirby/src/Form/Validations.php create mode 100644 kirby/src/Http/Cookie.php create mode 100644 kirby/src/Http/Environment.php create mode 100644 kirby/src/Http/Exceptions/NextRouteException.php create mode 100644 kirby/src/Http/Header.php create mode 100644 kirby/src/Http/Idn.php create mode 100644 kirby/src/Http/Params.php create mode 100644 kirby/src/Http/Path.php create mode 100644 kirby/src/Http/Query.php create mode 100644 kirby/src/Http/Remote.php create mode 100644 kirby/src/Http/Request.php create mode 100644 kirby/src/Http/Request/Auth.php create mode 100644 kirby/src/Http/Request/Auth/BasicAuth.php create mode 100644 kirby/src/Http/Request/Auth/BearerAuth.php create mode 100644 kirby/src/Http/Request/Auth/SessionAuth.php create mode 100644 kirby/src/Http/Request/Body.php create mode 100644 kirby/src/Http/Request/Data.php create mode 100644 kirby/src/Http/Request/Files.php create mode 100644 kirby/src/Http/Request/Query.php create mode 100644 kirby/src/Http/Response.php create mode 100644 kirby/src/Http/Route.php create mode 100644 kirby/src/Http/Router.php create mode 100644 kirby/src/Http/Uri.php create mode 100644 kirby/src/Http/Url.php create mode 100644 kirby/src/Http/Visitor.php create mode 100644 kirby/src/Image/Camera.php create mode 100644 kirby/src/Image/Darkroom.php create mode 100644 kirby/src/Image/Darkroom/GdLib.php create mode 100644 kirby/src/Image/Darkroom/ImageMagick.php create mode 100644 kirby/src/Image/Dimensions.php create mode 100644 kirby/src/Image/Exif.php create mode 100644 kirby/src/Image/Focus.php create mode 100644 kirby/src/Image/Image.php create mode 100644 kirby/src/Image/Location.php create mode 100644 kirby/src/Image/QrCode.php create mode 100644 kirby/src/Option/Option.php create mode 100644 kirby/src/Option/Options.php create mode 100644 kirby/src/Option/OptionsApi.php create mode 100644 kirby/src/Option/OptionsProvider.php create mode 100644 kirby/src/Option/OptionsQuery.php create mode 100644 kirby/src/Panel/Assets.php create mode 100644 kirby/src/Panel/ChangesDialog.php create mode 100644 kirby/src/Panel/Dialog.php create mode 100644 kirby/src/Panel/Document.php create mode 100644 kirby/src/Panel/Drawer.php create mode 100644 kirby/src/Panel/Dropdown.php create mode 100644 kirby/src/Panel/Field.php create mode 100644 kirby/src/Panel/File.php create mode 100644 kirby/src/Panel/Home.php create mode 100644 kirby/src/Panel/Json.php create mode 100644 kirby/src/Panel/Lab/Category.php create mode 100644 kirby/src/Panel/Lab/Docs.php create mode 100644 kirby/src/Panel/Lab/Example.php create mode 100644 kirby/src/Panel/Lab/Snippet.php create mode 100644 kirby/src/Panel/Lab/Template.php create mode 100644 kirby/src/Panel/Menu.php create mode 100644 kirby/src/Panel/Model.php create mode 100644 kirby/src/Panel/Page.php create mode 100644 kirby/src/Panel/PageCreateDialog.php create mode 100644 kirby/src/Panel/Panel.php create mode 100644 kirby/src/Panel/Plugins.php create mode 100644 kirby/src/Panel/Redirect.php create mode 100644 kirby/src/Panel/Request.php create mode 100644 kirby/src/Panel/Search.php create mode 100644 kirby/src/Panel/Site.php create mode 100644 kirby/src/Panel/User.php create mode 100644 kirby/src/Panel/UserTotpDisableDialog.php create mode 100644 kirby/src/Panel/UserTotpEnableDialog.php create mode 100644 kirby/src/Panel/View.php create mode 100644 kirby/src/Parsley/Element.php create mode 100644 kirby/src/Parsley/Inline.php create mode 100644 kirby/src/Parsley/Parsley.php create mode 100644 kirby/src/Parsley/Schema.php create mode 100644 kirby/src/Parsley/Schema/Blocks.php create mode 100644 kirby/src/Parsley/Schema/Plain.php create mode 100644 kirby/src/Query/Argument.php create mode 100644 kirby/src/Query/Arguments.php create mode 100644 kirby/src/Query/Expression.php create mode 100644 kirby/src/Query/Query.php create mode 100644 kirby/src/Query/Segment.php create mode 100644 kirby/src/Query/Segments.php create mode 100644 kirby/src/Sane/DomHandler.php create mode 100644 kirby/src/Sane/Handler.php create mode 100644 kirby/src/Sane/Html.php create mode 100644 kirby/src/Sane/Sane.php create mode 100644 kirby/src/Sane/Svg.php create mode 100644 kirby/src/Sane/Svgz.php create mode 100644 kirby/src/Sane/Xml.php create mode 100644 kirby/src/Session/AutoSession.php create mode 100644 kirby/src/Session/FileSessionStore.php create mode 100644 kirby/src/Session/Session.php create mode 100644 kirby/src/Session/SessionData.php create mode 100644 kirby/src/Session/SessionStore.php create mode 100644 kirby/src/Session/Sessions.php create mode 100644 kirby/src/Template/Slot.php create mode 100644 kirby/src/Template/Slots.php create mode 100644 kirby/src/Template/Snippet.php create mode 100644 kirby/src/Template/Template.php create mode 100644 kirby/src/Text/KirbyTag.php create mode 100644 kirby/src/Text/KirbyTags.php create mode 100644 kirby/src/Text/Markdown.php create mode 100644 kirby/src/Text/SmartyPants.php create mode 100644 kirby/src/Toolkit/A.php create mode 100644 kirby/src/Toolkit/Collection.php create mode 100644 kirby/src/Toolkit/Component.php create mode 100644 kirby/src/Toolkit/Config.php create mode 100644 kirby/src/Toolkit/Controller.php create mode 100644 kirby/src/Toolkit/Date.php create mode 100644 kirby/src/Toolkit/Dom.php create mode 100644 kirby/src/Toolkit/Escape.php create mode 100644 kirby/src/Toolkit/Facade.php create mode 100644 kirby/src/Toolkit/Html.php create mode 100644 kirby/src/Toolkit/I18n.php create mode 100644 kirby/src/Toolkit/Iterator.php create mode 100644 kirby/src/Toolkit/LazyValue.php create mode 100644 kirby/src/Toolkit/Locale.php create mode 100644 kirby/src/Toolkit/Obj.php create mode 100644 kirby/src/Toolkit/Pagination.php create mode 100644 kirby/src/Toolkit/Properties.php create mode 100644 kirby/src/Toolkit/Silo.php create mode 100644 kirby/src/Toolkit/Str.php create mode 100644 kirby/src/Toolkit/SymmetricCrypto.php create mode 100644 kirby/src/Toolkit/Totp.php create mode 100644 kirby/src/Toolkit/Tpl.php create mode 100644 kirby/src/Toolkit/V.php create mode 100644 kirby/src/Toolkit/View.php create mode 100644 kirby/src/Toolkit/Xml.php create mode 100644 kirby/src/Uuid/BlockUuid.php create mode 100644 kirby/src/Uuid/FieldUuid.php create mode 100644 kirby/src/Uuid/FileUuid.php create mode 100644 kirby/src/Uuid/HasUuids.php create mode 100644 kirby/src/Uuid/Identifiable.php create mode 100644 kirby/src/Uuid/ModelUuid.php create mode 100644 kirby/src/Uuid/PageUuid.php create mode 100644 kirby/src/Uuid/SiteUuid.php create mode 100644 kirby/src/Uuid/StructureUuid.php create mode 100644 kirby/src/Uuid/Uri.php create mode 100644 kirby/src/Uuid/UserUuid.php create mode 100644 kirby/src/Uuid/Uuid.php create mode 100644 kirby/src/Uuid/Uuids.php create mode 100644 kirby/vendor/autoload.php create mode 100755 kirby/vendor/bin/yaml-lint create mode 100644 kirby/vendor/bin/yaml-lint.bat create mode 100644 kirby/vendor/christian-riesen/base32/LICENSE create mode 100644 kirby/vendor/christian-riesen/base32/src/Base32.php create mode 100644 kirby/vendor/christian-riesen/base32/src/Base32Hex.php create mode 100644 kirby/vendor/claviska/simpleimage/LICENSE.md create mode 100644 kirby/vendor/claviska/simpleimage/composer.json create mode 100644 kirby/vendor/claviska/simpleimage/composer.lock create mode 100644 kirby/vendor/claviska/simpleimage/src/claviska/SimpleImage.php create mode 100644 kirby/vendor/composer/ClassLoader.php create mode 100644 kirby/vendor/composer/InstalledVersions.php create mode 100644 kirby/vendor/composer/LICENSE create mode 100644 kirby/vendor/composer/autoload_classmap.php create mode 100644 kirby/vendor/composer/autoload_files.php create mode 100644 kirby/vendor/composer/autoload_namespaces.php create mode 100644 kirby/vendor/composer/autoload_psr4.php create mode 100644 kirby/vendor/composer/autoload_real.php create mode 100644 kirby/vendor/composer/autoload_static.php create mode 100644 kirby/vendor/composer/installed.json create mode 100644 kirby/vendor/composer/installed.php create mode 100644 kirby/vendor/composer/semver/LICENSE create mode 100644 kirby/vendor/composer/semver/composer.json create mode 100644 kirby/vendor/composer/semver/phpstan-baseline.neon create mode 100644 kirby/vendor/composer/semver/src/Comparator.php create mode 100644 kirby/vendor/composer/semver/src/CompilingMatcher.php create mode 100644 kirby/vendor/composer/semver/src/Constraint/Bound.php create mode 100644 kirby/vendor/composer/semver/src/Constraint/Constraint.php create mode 100644 kirby/vendor/composer/semver/src/Constraint/ConstraintInterface.php create mode 100644 kirby/vendor/composer/semver/src/Constraint/MatchAllConstraint.php create mode 100644 kirby/vendor/composer/semver/src/Constraint/MatchNoneConstraint.php create mode 100644 kirby/vendor/composer/semver/src/Constraint/MultiConstraint.php create mode 100644 kirby/vendor/composer/semver/src/Interval.php create mode 100644 kirby/vendor/composer/semver/src/Intervals.php create mode 100644 kirby/vendor/composer/semver/src/Semver.php create mode 100644 kirby/vendor/composer/semver/src/VersionParser.php create mode 100644 kirby/vendor/filp/whoops/LICENSE.md create mode 100644 kirby/vendor/filp/whoops/composer.json create mode 100644 kirby/vendor/filp/whoops/src/Whoops/Exception/ErrorException.php create mode 100644 kirby/vendor/filp/whoops/src/Whoops/Exception/Formatter.php create mode 100644 kirby/vendor/filp/whoops/src/Whoops/Exception/Frame.php create mode 100644 kirby/vendor/filp/whoops/src/Whoops/Exception/FrameCollection.php create mode 100644 kirby/vendor/filp/whoops/src/Whoops/Exception/Inspector.php create mode 100644 kirby/vendor/filp/whoops/src/Whoops/Handler/CallbackHandler.php create mode 100644 kirby/vendor/filp/whoops/src/Whoops/Handler/Handler.php create mode 100644 kirby/vendor/filp/whoops/src/Whoops/Handler/HandlerInterface.php create mode 100644 kirby/vendor/filp/whoops/src/Whoops/Handler/JsonResponseHandler.php create mode 100644 kirby/vendor/filp/whoops/src/Whoops/Handler/PlainTextHandler.php create mode 100644 kirby/vendor/filp/whoops/src/Whoops/Handler/PrettyPageHandler.php create mode 100644 kirby/vendor/filp/whoops/src/Whoops/Handler/XmlResponseHandler.php create mode 100644 kirby/vendor/filp/whoops/src/Whoops/Inspector/InspectorFactory.php create mode 100644 kirby/vendor/filp/whoops/src/Whoops/Inspector/InspectorFactoryInterface.php create mode 100644 kirby/vendor/filp/whoops/src/Whoops/Inspector/InspectorInterface.php create mode 100644 kirby/vendor/filp/whoops/src/Whoops/Resources/css/prism.css create mode 100644 kirby/vendor/filp/whoops/src/Whoops/Resources/css/whoops.base.css create mode 100644 kirby/vendor/filp/whoops/src/Whoops/Resources/js/clipboard.min.js create mode 100644 kirby/vendor/filp/whoops/src/Whoops/Resources/js/prism.js create mode 100644 kirby/vendor/filp/whoops/src/Whoops/Resources/js/whoops.base.js create mode 100644 kirby/vendor/filp/whoops/src/Whoops/Resources/js/zepto.min.js create mode 100644 kirby/vendor/filp/whoops/src/Whoops/Resources/views/env_details.html.php create mode 100644 kirby/vendor/filp/whoops/src/Whoops/Resources/views/frame_code.html.php create mode 100644 kirby/vendor/filp/whoops/src/Whoops/Resources/views/frame_list.html.php create mode 100644 kirby/vendor/filp/whoops/src/Whoops/Resources/views/frames_container.html.php create mode 100644 kirby/vendor/filp/whoops/src/Whoops/Resources/views/frames_description.html.php create mode 100644 kirby/vendor/filp/whoops/src/Whoops/Resources/views/header.html.php create mode 100644 kirby/vendor/filp/whoops/src/Whoops/Resources/views/header_outer.html.php create mode 100644 kirby/vendor/filp/whoops/src/Whoops/Resources/views/layout.html.php create mode 100644 kirby/vendor/filp/whoops/src/Whoops/Resources/views/panel_details.html.php create mode 100644 kirby/vendor/filp/whoops/src/Whoops/Resources/views/panel_details_outer.html.php create mode 100644 kirby/vendor/filp/whoops/src/Whoops/Resources/views/panel_left.html.php create mode 100644 kirby/vendor/filp/whoops/src/Whoops/Resources/views/panel_left_outer.html.php create mode 100644 kirby/vendor/filp/whoops/src/Whoops/Run.php create mode 100644 kirby/vendor/filp/whoops/src/Whoops/RunInterface.php create mode 100644 kirby/vendor/filp/whoops/src/Whoops/Util/HtmlDumperOutput.php create mode 100644 kirby/vendor/filp/whoops/src/Whoops/Util/Misc.php create mode 100644 kirby/vendor/filp/whoops/src/Whoops/Util/SystemFacade.php create mode 100644 kirby/vendor/filp/whoops/src/Whoops/Util/TemplateHelper.php create mode 100644 kirby/vendor/laminas/laminas-escaper/COPYRIGHT.md create mode 100644 kirby/vendor/laminas/laminas-escaper/LICENSE.md create mode 100644 kirby/vendor/laminas/laminas-escaper/composer.json create mode 100644 kirby/vendor/laminas/laminas-escaper/src/Escaper.php create mode 100644 kirby/vendor/laminas/laminas-escaper/src/Exception/ExceptionInterface.php create mode 100644 kirby/vendor/laminas/laminas-escaper/src/Exception/InvalidArgumentException.php create mode 100644 kirby/vendor/laminas/laminas-escaper/src/Exception/RuntimeException.php create mode 100644 kirby/vendor/league/color-extractor/LICENSE create mode 100644 kirby/vendor/league/color-extractor/composer.json create mode 100644 kirby/vendor/league/color-extractor/src/Color.php create mode 100644 kirby/vendor/league/color-extractor/src/ColorExtractor.php create mode 100644 kirby/vendor/league/color-extractor/src/Palette.php create mode 100644 kirby/vendor/michelf/php-smartypants/License.md create mode 100644 kirby/vendor/michelf/php-smartypants/Michelf/SmartyPants.inc.php create mode 100644 kirby/vendor/michelf/php-smartypants/Michelf/SmartyPants.php create mode 100644 kirby/vendor/michelf/php-smartypants/Michelf/SmartyPantsTypographer.inc.php create mode 100644 kirby/vendor/michelf/php-smartypants/Michelf/SmartyPantsTypographer.php create mode 100644 kirby/vendor/michelf/php-smartypants/composer.json create mode 100644 kirby/vendor/phpmailer/phpmailer/LICENSE create mode 100644 kirby/vendor/phpmailer/phpmailer/composer.json create mode 100644 kirby/vendor/phpmailer/phpmailer/get_oauth_token.php create mode 100644 kirby/vendor/phpmailer/phpmailer/language/phpmailer.lang-af.php create mode 100644 kirby/vendor/phpmailer/phpmailer/language/phpmailer.lang-ar.php create mode 100644 kirby/vendor/phpmailer/phpmailer/language/phpmailer.lang-as.php create mode 100644 kirby/vendor/phpmailer/phpmailer/language/phpmailer.lang-az.php create mode 100644 kirby/vendor/phpmailer/phpmailer/language/phpmailer.lang-ba.php create mode 100644 kirby/vendor/phpmailer/phpmailer/language/phpmailer.lang-be.php create mode 100644 kirby/vendor/phpmailer/phpmailer/language/phpmailer.lang-bg.php create mode 100644 kirby/vendor/phpmailer/phpmailer/language/phpmailer.lang-bn.php create mode 100644 kirby/vendor/phpmailer/phpmailer/language/phpmailer.lang-ca.php create mode 100644 kirby/vendor/phpmailer/phpmailer/language/phpmailer.lang-cs.php create mode 100644 kirby/vendor/phpmailer/phpmailer/language/phpmailer.lang-da.php create mode 100644 kirby/vendor/phpmailer/phpmailer/language/phpmailer.lang-de.php create mode 100644 kirby/vendor/phpmailer/phpmailer/language/phpmailer.lang-el.php create mode 100644 kirby/vendor/phpmailer/phpmailer/language/phpmailer.lang-eo.php create mode 100644 kirby/vendor/phpmailer/phpmailer/language/phpmailer.lang-es.php create mode 100644 kirby/vendor/phpmailer/phpmailer/language/phpmailer.lang-et.php create mode 100644 kirby/vendor/phpmailer/phpmailer/language/phpmailer.lang-fa.php create mode 100644 kirby/vendor/phpmailer/phpmailer/language/phpmailer.lang-fi.php create mode 100644 kirby/vendor/phpmailer/phpmailer/language/phpmailer.lang-fo.php create mode 100644 kirby/vendor/phpmailer/phpmailer/language/phpmailer.lang-fr.php create mode 100644 kirby/vendor/phpmailer/phpmailer/language/phpmailer.lang-gl.php create mode 100644 kirby/vendor/phpmailer/phpmailer/language/phpmailer.lang-he.php create mode 100644 kirby/vendor/phpmailer/phpmailer/language/phpmailer.lang-hi.php create mode 100644 kirby/vendor/phpmailer/phpmailer/language/phpmailer.lang-hr.php create mode 100644 kirby/vendor/phpmailer/phpmailer/language/phpmailer.lang-hu.php create mode 100644 kirby/vendor/phpmailer/phpmailer/language/phpmailer.lang-hy.php create mode 100644 kirby/vendor/phpmailer/phpmailer/language/phpmailer.lang-id.php create mode 100644 kirby/vendor/phpmailer/phpmailer/language/phpmailer.lang-it.php create mode 100644 kirby/vendor/phpmailer/phpmailer/language/phpmailer.lang-ja.php create mode 100644 kirby/vendor/phpmailer/phpmailer/language/phpmailer.lang-ka.php create mode 100644 kirby/vendor/phpmailer/phpmailer/language/phpmailer.lang-ko.php create mode 100644 kirby/vendor/phpmailer/phpmailer/language/phpmailer.lang-lt.php create mode 100644 kirby/vendor/phpmailer/phpmailer/language/phpmailer.lang-lv.php create mode 100644 kirby/vendor/phpmailer/phpmailer/language/phpmailer.lang-mg.php create mode 100644 kirby/vendor/phpmailer/phpmailer/language/phpmailer.lang-mn.php create mode 100644 kirby/vendor/phpmailer/phpmailer/language/phpmailer.lang-ms.php create mode 100644 kirby/vendor/phpmailer/phpmailer/language/phpmailer.lang-nb.php create mode 100644 kirby/vendor/phpmailer/phpmailer/language/phpmailer.lang-nl.php create mode 100644 kirby/vendor/phpmailer/phpmailer/language/phpmailer.lang-pl.php create mode 100644 kirby/vendor/phpmailer/phpmailer/language/phpmailer.lang-pt.php create mode 100644 kirby/vendor/phpmailer/phpmailer/language/phpmailer.lang-pt_br.php create mode 100644 kirby/vendor/phpmailer/phpmailer/language/phpmailer.lang-ro.php create mode 100644 kirby/vendor/phpmailer/phpmailer/language/phpmailer.lang-ru.php create mode 100644 kirby/vendor/phpmailer/phpmailer/language/phpmailer.lang-si.php create mode 100644 kirby/vendor/phpmailer/phpmailer/language/phpmailer.lang-sk.php create mode 100644 kirby/vendor/phpmailer/phpmailer/language/phpmailer.lang-sl.php create mode 100644 kirby/vendor/phpmailer/phpmailer/language/phpmailer.lang-sr.php create mode 100644 kirby/vendor/phpmailer/phpmailer/language/phpmailer.lang-sr_latn.php create mode 100644 kirby/vendor/phpmailer/phpmailer/language/phpmailer.lang-sv.php create mode 100644 kirby/vendor/phpmailer/phpmailer/language/phpmailer.lang-tl.php create mode 100644 kirby/vendor/phpmailer/phpmailer/language/phpmailer.lang-tr.php create mode 100644 kirby/vendor/phpmailer/phpmailer/language/phpmailer.lang-uk.php create mode 100644 kirby/vendor/phpmailer/phpmailer/language/phpmailer.lang-vi.php create mode 100644 kirby/vendor/phpmailer/phpmailer/language/phpmailer.lang-zh.php create mode 100644 kirby/vendor/phpmailer/phpmailer/language/phpmailer.lang-zh_cn.php create mode 100644 kirby/vendor/phpmailer/phpmailer/src/DSNConfigurator.php create mode 100644 kirby/vendor/phpmailer/phpmailer/src/Exception.php create mode 100644 kirby/vendor/phpmailer/phpmailer/src/OAuth.php create mode 100644 kirby/vendor/phpmailer/phpmailer/src/OAuthTokenProvider.php create mode 100644 kirby/vendor/phpmailer/phpmailer/src/PHPMailer.php create mode 100644 kirby/vendor/phpmailer/phpmailer/src/POP3.php create mode 100644 kirby/vendor/phpmailer/phpmailer/src/SMTP.php create mode 100644 kirby/vendor/psr/log/LICENSE create mode 100644 kirby/vendor/psr/log/composer.json create mode 100644 kirby/vendor/psr/log/src/AbstractLogger.php create mode 100644 kirby/vendor/psr/log/src/InvalidArgumentException.php create mode 100644 kirby/vendor/psr/log/src/LogLevel.php create mode 100644 kirby/vendor/psr/log/src/LoggerAwareInterface.php create mode 100644 kirby/vendor/psr/log/src/LoggerAwareTrait.php create mode 100644 kirby/vendor/psr/log/src/LoggerInterface.php create mode 100644 kirby/vendor/psr/log/src/LoggerTrait.php create mode 100644 kirby/vendor/psr/log/src/NullLogger.php create mode 100644 kirby/vendor/symfony/deprecation-contracts/LICENSE create mode 100644 kirby/vendor/symfony/deprecation-contracts/composer.json create mode 100644 kirby/vendor/symfony/deprecation-contracts/function.php create mode 100644 kirby/vendor/symfony/polyfill-ctype/Ctype.php create mode 100644 kirby/vendor/symfony/polyfill-ctype/LICENSE create mode 100644 kirby/vendor/symfony/polyfill-ctype/bootstrap.php create mode 100644 kirby/vendor/symfony/polyfill-ctype/bootstrap80.php create mode 100644 kirby/vendor/symfony/polyfill-ctype/composer.json create mode 100644 kirby/vendor/symfony/polyfill-intl-idn/Idn.php create mode 100644 kirby/vendor/symfony/polyfill-intl-idn/Info.php create mode 100644 kirby/vendor/symfony/polyfill-intl-idn/LICENSE create mode 100644 kirby/vendor/symfony/polyfill-intl-idn/Resources/unidata/DisallowedRanges.php create mode 100644 kirby/vendor/symfony/polyfill-intl-idn/Resources/unidata/Regex.php create mode 100644 kirby/vendor/symfony/polyfill-intl-idn/Resources/unidata/deviation.php create mode 100644 kirby/vendor/symfony/polyfill-intl-idn/Resources/unidata/disallowed.php create mode 100644 kirby/vendor/symfony/polyfill-intl-idn/Resources/unidata/disallowed_STD3_mapped.php create mode 100644 kirby/vendor/symfony/polyfill-intl-idn/Resources/unidata/disallowed_STD3_valid.php create mode 100644 kirby/vendor/symfony/polyfill-intl-idn/Resources/unidata/ignored.php create mode 100644 kirby/vendor/symfony/polyfill-intl-idn/Resources/unidata/mapped.php create mode 100644 kirby/vendor/symfony/polyfill-intl-idn/Resources/unidata/virama.php create mode 100644 kirby/vendor/symfony/polyfill-intl-idn/bootstrap.php create mode 100644 kirby/vendor/symfony/polyfill-intl-idn/bootstrap80.php create mode 100644 kirby/vendor/symfony/polyfill-intl-idn/composer.json create mode 100644 kirby/vendor/symfony/polyfill-intl-normalizer/LICENSE create mode 100644 kirby/vendor/symfony/polyfill-intl-normalizer/Normalizer.php create mode 100644 kirby/vendor/symfony/polyfill-intl-normalizer/Resources/stubs/Normalizer.php create mode 100644 kirby/vendor/symfony/polyfill-intl-normalizer/Resources/unidata/canonicalComposition.php create mode 100644 kirby/vendor/symfony/polyfill-intl-normalizer/Resources/unidata/canonicalDecomposition.php create mode 100644 kirby/vendor/symfony/polyfill-intl-normalizer/Resources/unidata/combiningClass.php create mode 100644 kirby/vendor/symfony/polyfill-intl-normalizer/Resources/unidata/compatibilityDecomposition.php create mode 100644 kirby/vendor/symfony/polyfill-intl-normalizer/bootstrap.php create mode 100644 kirby/vendor/symfony/polyfill-intl-normalizer/bootstrap80.php create mode 100644 kirby/vendor/symfony/polyfill-intl-normalizer/composer.json create mode 100644 kirby/vendor/symfony/polyfill-mbstring/LICENSE create mode 100644 kirby/vendor/symfony/polyfill-mbstring/Mbstring.php create mode 100644 kirby/vendor/symfony/polyfill-mbstring/Resources/unidata/caseFolding.php create mode 100644 kirby/vendor/symfony/polyfill-mbstring/Resources/unidata/lowerCase.php create mode 100644 kirby/vendor/symfony/polyfill-mbstring/Resources/unidata/titleCaseRegexp.php create mode 100644 kirby/vendor/symfony/polyfill-mbstring/Resources/unidata/upperCase.php create mode 100644 kirby/vendor/symfony/polyfill-mbstring/bootstrap.php create mode 100644 kirby/vendor/symfony/polyfill-mbstring/bootstrap80.php create mode 100644 kirby/vendor/symfony/polyfill-mbstring/composer.json create mode 100644 kirby/vendor/symfony/yaml/Command/LintCommand.php create mode 100644 kirby/vendor/symfony/yaml/Dumper.php create mode 100644 kirby/vendor/symfony/yaml/Escaper.php create mode 100644 kirby/vendor/symfony/yaml/Exception/DumpException.php create mode 100644 kirby/vendor/symfony/yaml/Exception/ExceptionInterface.php create mode 100644 kirby/vendor/symfony/yaml/Exception/ParseException.php create mode 100644 kirby/vendor/symfony/yaml/Exception/RuntimeException.php create mode 100644 kirby/vendor/symfony/yaml/Inline.php create mode 100644 kirby/vendor/symfony/yaml/LICENSE create mode 100644 kirby/vendor/symfony/yaml/Parser.php create mode 100755 kirby/vendor/symfony/yaml/Resources/bin/yaml-lint create mode 100644 kirby/vendor/symfony/yaml/Tag/TaggedValue.php create mode 100644 kirby/vendor/symfony/yaml/Unescaper.php create mode 100644 kirby/vendor/symfony/yaml/Yaml.php create mode 100644 kirby/vendor/symfony/yaml/composer.json create mode 100644 kirby/views/browser.php create mode 100644 kirby/views/fatal.php create mode 100644 kirby/views/panel.php create mode 100644 kirby/views/php.php create mode 100644 kirby/views/snippets/footer.php create mode 100644 kirby/views/snippets/header.php create mode 100644 media/index.html create mode 100644 site/accounts/index.html create mode 100644 site/blueprints/blocks/audio.yml create mode 100644 site/blueprints/blocks/embed.yml create mode 100644 site/blueprints/blocks/image.yml create mode 100644 site/blueprints/blocks/image_gallery.yml create mode 100644 site/blueprints/blocks/texts.yml create mode 100644 site/blueprints/blocks/twitch.yml create mode 100644 site/blueprints/blocks/video.yml create mode 100644 site/blueprints/fields/block_settings.yml create mode 100644 site/blueprints/pages/calendar.yml create mode 100644 site/blueprints/pages/calendar_entry.yml create mode 100644 site/blueprints/pages/default.yml create mode 100644 site/blueprints/pages/project.yml create mode 100644 site/blueprints/pages/projects.yml create mode 100644 site/blueprints/sections/calendar.yml create mode 100644 site/blueprints/sections/projects.yml create mode 100644 site/blueprints/site.yml create mode 100644 site/cache/index.html create mode 100644 site/config/config.php create mode 100644 site/languages/de.php create mode 100644 site/languages/en.php create mode 100644 site/plugins/embed/.editorconfig create mode 100644 site/plugins/embed/.gitignore create mode 100644 site/plugins/embed/README.md create mode 100644 site/plugins/embed/assets/svg/embed-icon-failed.svg create mode 100644 site/plugins/embed/assets/svg/embed-icon-flickr.svg create mode 100644 site/plugins/embed/assets/svg/embed-icon-instagram.svg create mode 100644 site/plugins/embed/assets/svg/embed-icon-soundcloud.svg create mode 100644 site/plugins/embed/assets/svg/embed-icon-spotify.svg create mode 100644 site/plugins/embed/assets/svg/embed-icon-synced.svg create mode 100644 site/plugins/embed/assets/svg/embed-icon-twitter.svg create mode 100644 site/plugins/embed/assets/svg/embed-icon-vimeo.svg create mode 100644 site/plugins/embed/assets/svg/embed-icon-youtube.svg create mode 100644 site/plugins/embed/composer.json create mode 100644 site/plugins/embed/index.css create mode 100644 site/plugins/embed/index.js create mode 100644 site/plugins/embed/index.php create mode 100644 site/plugins/embed/lib/api.php create mode 100644 site/plugins/embed/lib/fieldMethods.php create mode 100644 site/plugins/embed/lib/fields.php create mode 100644 site/plugins/embed/lib/languages/en.php create mode 100644 site/plugins/embed/lib/languages/fr.php create mode 100644 site/plugins/embed/lib/siteMethods.php create mode 100644 site/plugins/embed/package.json create mode 100644 site/plugins/embed/src/assets/css/_variables.scss create mode 100644 site/plugins/embed/src/assets/css/styles.scss create mode 100644 site/plugins/embed/src/components/embedField.vue create mode 100644 site/plugins/embed/src/components/embedInput.vue create mode 100644 site/plugins/embed/src/components/embedPreview.vue create mode 100644 site/plugins/embed/src/helpers/validators.js create mode 100644 site/plugins/embed/src/index.js create mode 100644 site/plugins/embed/vendor/autoload.php create mode 100644 site/plugins/embed/vendor/composer/ClassLoader.php create mode 100644 site/plugins/embed/vendor/composer/InstalledVersions.php create mode 100644 site/plugins/embed/vendor/composer/LICENSE create mode 100644 site/plugins/embed/vendor/composer/autoload_classmap.php create mode 100644 site/plugins/embed/vendor/composer/autoload_files.php create mode 100644 site/plugins/embed/vendor/composer/autoload_namespaces.php create mode 100644 site/plugins/embed/vendor/composer/autoload_psr4.php create mode 100644 site/plugins/embed/vendor/composer/autoload_real.php create mode 100644 site/plugins/embed/vendor/composer/autoload_static.php create mode 100644 site/plugins/embed/vendor/composer/ca-bundle/LICENSE create mode 100644 site/plugins/embed/vendor/composer/ca-bundle/README.md create mode 100644 site/plugins/embed/vendor/composer/ca-bundle/composer.json create mode 100644 site/plugins/embed/vendor/composer/ca-bundle/res/cacert.pem create mode 100644 site/plugins/embed/vendor/composer/ca-bundle/src/CaBundle.php create mode 100644 site/plugins/embed/vendor/composer/installed.json create mode 100644 site/plugins/embed/vendor/composer/installed.php create mode 100644 site/plugins/embed/vendor/composer/platform_check.php create mode 100644 site/plugins/embed/vendor/embed/embed/CHANGELOG.md create mode 100644 site/plugins/embed/vendor/embed/embed/LICENSE create mode 100644 site/plugins/embed/vendor/embed/embed/README.md create mode 100644 site/plugins/embed/vendor/embed/embed/composer.json create mode 100644 site/plugins/embed/vendor/embed/embed/src/Adapters/Archive/Api.php create mode 100644 site/plugins/embed/vendor/embed/embed/src/Adapters/Archive/Detectors/AuthorName.php create mode 100644 site/plugins/embed/vendor/embed/embed/src/Adapters/Archive/Detectors/Code.php create mode 100644 site/plugins/embed/vendor/embed/embed/src/Adapters/Archive/Detectors/Description.php create mode 100644 site/plugins/embed/vendor/embed/embed/src/Adapters/Archive/Detectors/ProviderName.php create mode 100644 site/plugins/embed/vendor/embed/embed/src/Adapters/Archive/Detectors/PublishedTime.php create mode 100644 site/plugins/embed/vendor/embed/embed/src/Adapters/Archive/Detectors/Title.php create mode 100644 site/plugins/embed/vendor/embed/embed/src/Adapters/Archive/Extractor.php create mode 100644 site/plugins/embed/vendor/embed/embed/src/Adapters/Bandcamp/Detectors/ProviderName.php create mode 100644 site/plugins/embed/vendor/embed/embed/src/Adapters/Bandcamp/Extractor.php create mode 100644 site/plugins/embed/vendor/embed/embed/src/Adapters/CadenaSer/Detectors/Code.php create mode 100644 site/plugins/embed/vendor/embed/embed/src/Adapters/CadenaSer/Extractor.php create mode 100644 site/plugins/embed/vendor/embed/embed/src/Adapters/Facebook/Detectors/Title.php create mode 100644 site/plugins/embed/vendor/embed/embed/src/Adapters/Facebook/Extractor.php create mode 100644 site/plugins/embed/vendor/embed/embed/src/Adapters/Facebook/OEmbed.php create mode 100644 site/plugins/embed/vendor/embed/embed/src/Adapters/Flickr/Detectors/Code.php create mode 100644 site/plugins/embed/vendor/embed/embed/src/Adapters/Flickr/Extractor.php create mode 100644 site/plugins/embed/vendor/embed/embed/src/Adapters/Gist/Api.php create mode 100644 site/plugins/embed/vendor/embed/embed/src/Adapters/Gist/Detectors/AuthorName.php create mode 100644 site/plugins/embed/vendor/embed/embed/src/Adapters/Gist/Detectors/AuthorUrl.php create mode 100644 site/plugins/embed/vendor/embed/embed/src/Adapters/Gist/Detectors/Code.php create mode 100644 site/plugins/embed/vendor/embed/embed/src/Adapters/Gist/Detectors/PublishedTime.php create mode 100644 site/plugins/embed/vendor/embed/embed/src/Adapters/Gist/Extractor.php create mode 100644 site/plugins/embed/vendor/embed/embed/src/Adapters/Github/Detectors/Code.php create mode 100644 site/plugins/embed/vendor/embed/embed/src/Adapters/Github/Extractor.php create mode 100644 site/plugins/embed/vendor/embed/embed/src/Adapters/Ideone/Detectors/Code.php create mode 100644 site/plugins/embed/vendor/embed/embed/src/Adapters/Ideone/Extractor.php create mode 100644 site/plugins/embed/vendor/embed/embed/src/Adapters/ImageShack/Api.php create mode 100644 site/plugins/embed/vendor/embed/embed/src/Adapters/ImageShack/Detectors/AuthorName.php create mode 100644 site/plugins/embed/vendor/embed/embed/src/Adapters/ImageShack/Detectors/AuthorUrl.php create mode 100644 site/plugins/embed/vendor/embed/embed/src/Adapters/ImageShack/Detectors/Description.php create mode 100644 site/plugins/embed/vendor/embed/embed/src/Adapters/ImageShack/Detectors/Image.php create mode 100644 site/plugins/embed/vendor/embed/embed/src/Adapters/ImageShack/Detectors/ProviderName.php create mode 100644 site/plugins/embed/vendor/embed/embed/src/Adapters/ImageShack/Detectors/PublishedTime.php create mode 100644 site/plugins/embed/vendor/embed/embed/src/Adapters/ImageShack/Detectors/Title.php create mode 100644 site/plugins/embed/vendor/embed/embed/src/Adapters/ImageShack/Extractor.php create mode 100644 site/plugins/embed/vendor/embed/embed/src/Adapters/Instagram/Extractor.php create mode 100644 site/plugins/embed/vendor/embed/embed/src/Adapters/Instagram/OEmbed.php create mode 100644 site/plugins/embed/vendor/embed/embed/src/Adapters/Pinterest/Detectors/Code.php create mode 100644 site/plugins/embed/vendor/embed/embed/src/Adapters/Pinterest/Extractor.php create mode 100644 site/plugins/embed/vendor/embed/embed/src/Adapters/Sassmeister/Detectors/Code.php create mode 100644 site/plugins/embed/vendor/embed/embed/src/Adapters/Sassmeister/Extractor.php create mode 100644 site/plugins/embed/vendor/embed/embed/src/Adapters/Slides/Detectors/Code.php create mode 100644 site/plugins/embed/vendor/embed/embed/src/Adapters/Slides/Extractor.php create mode 100644 site/plugins/embed/vendor/embed/embed/src/Adapters/Snipplr/Detectors/Code.php create mode 100644 site/plugins/embed/vendor/embed/embed/src/Adapters/Snipplr/Extractor.php create mode 100644 site/plugins/embed/vendor/embed/embed/src/Adapters/Twitch/Detectors/Code.php create mode 100644 site/plugins/embed/vendor/embed/embed/src/Adapters/Twitch/Extractor.php create mode 100644 site/plugins/embed/vendor/embed/embed/src/Adapters/Twitter/Api.php create mode 100644 site/plugins/embed/vendor/embed/embed/src/Adapters/Twitter/Detectors/AuthorName.php create mode 100644 site/plugins/embed/vendor/embed/embed/src/Adapters/Twitter/Detectors/AuthorUrl.php create mode 100644 site/plugins/embed/vendor/embed/embed/src/Adapters/Twitter/Detectors/Description.php create mode 100644 site/plugins/embed/vendor/embed/embed/src/Adapters/Twitter/Detectors/Image.php create mode 100644 site/plugins/embed/vendor/embed/embed/src/Adapters/Twitter/Detectors/ProviderName.php create mode 100644 site/plugins/embed/vendor/embed/embed/src/Adapters/Twitter/Detectors/PublishedTime.php create mode 100644 site/plugins/embed/vendor/embed/embed/src/Adapters/Twitter/Detectors/Title.php create mode 100644 site/plugins/embed/vendor/embed/embed/src/Adapters/Twitter/Extractor.php create mode 100644 site/plugins/embed/vendor/embed/embed/src/Adapters/Wikipedia/Api.php create mode 100644 site/plugins/embed/vendor/embed/embed/src/Adapters/Wikipedia/Detectors/Description.php create mode 100644 site/plugins/embed/vendor/embed/embed/src/Adapters/Wikipedia/Detectors/Title.php create mode 100644 site/plugins/embed/vendor/embed/embed/src/Adapters/Wikipedia/Extractor.php create mode 100644 site/plugins/embed/vendor/embed/embed/src/Adapters/Youtube/Detectors/Feeds.php create mode 100644 site/plugins/embed/vendor/embed/embed/src/Adapters/Youtube/Extractor.php create mode 100644 site/plugins/embed/vendor/embed/embed/src/ApiTrait.php create mode 100644 site/plugins/embed/vendor/embed/embed/src/Detectors/AuthorName.php create mode 100644 site/plugins/embed/vendor/embed/embed/src/Detectors/AuthorUrl.php create mode 100644 site/plugins/embed/vendor/embed/embed/src/Detectors/Cms.php create mode 100644 site/plugins/embed/vendor/embed/embed/src/Detectors/Code.php create mode 100644 site/plugins/embed/vendor/embed/embed/src/Detectors/Description.php create mode 100644 site/plugins/embed/vendor/embed/embed/src/Detectors/Detector.php create mode 100644 site/plugins/embed/vendor/embed/embed/src/Detectors/Favicon.php create mode 100644 site/plugins/embed/vendor/embed/embed/src/Detectors/Feeds.php create mode 100644 site/plugins/embed/vendor/embed/embed/src/Detectors/Icon.php create mode 100644 site/plugins/embed/vendor/embed/embed/src/Detectors/Image.php create mode 100644 site/plugins/embed/vendor/embed/embed/src/Detectors/Keywords.php create mode 100644 site/plugins/embed/vendor/embed/embed/src/Detectors/Language.php create mode 100644 site/plugins/embed/vendor/embed/embed/src/Detectors/Languages.php create mode 100644 site/plugins/embed/vendor/embed/embed/src/Detectors/License.php create mode 100644 site/plugins/embed/vendor/embed/embed/src/Detectors/ProviderName.php create mode 100644 site/plugins/embed/vendor/embed/embed/src/Detectors/ProviderUrl.php create mode 100644 site/plugins/embed/vendor/embed/embed/src/Detectors/PublishedTime.php create mode 100644 site/plugins/embed/vendor/embed/embed/src/Detectors/Redirect.php create mode 100644 site/plugins/embed/vendor/embed/embed/src/Detectors/Title.php create mode 100644 site/plugins/embed/vendor/embed/embed/src/Detectors/Url.php create mode 100644 site/plugins/embed/vendor/embed/embed/src/Document.php create mode 100644 site/plugins/embed/vendor/embed/embed/src/Embed.php create mode 100644 site/plugins/embed/vendor/embed/embed/src/EmbedCode.php create mode 100644 site/plugins/embed/vendor/embed/embed/src/Extractor.php create mode 100644 site/plugins/embed/vendor/embed/embed/src/ExtractorFactory.php create mode 100644 site/plugins/embed/vendor/embed/embed/src/Http/Crawler.php create mode 100644 site/plugins/embed/vendor/embed/embed/src/Http/CurlClient.php create mode 100644 site/plugins/embed/vendor/embed/embed/src/Http/CurlDispatcher.php create mode 100644 site/plugins/embed/vendor/embed/embed/src/Http/FactoryDiscovery.php create mode 100644 site/plugins/embed/vendor/embed/embed/src/Http/NetworkException.php create mode 100644 site/plugins/embed/vendor/embed/embed/src/Http/RequestException.php create mode 100644 site/plugins/embed/vendor/embed/embed/src/HttpApiTrait.php create mode 100644 site/plugins/embed/vendor/embed/embed/src/LinkedData.php create mode 100644 site/plugins/embed/vendor/embed/embed/src/Metas.php create mode 100644 site/plugins/embed/vendor/embed/embed/src/OEmbed.php create mode 100644 site/plugins/embed/vendor/embed/embed/src/QueryResult.php create mode 100644 site/plugins/embed/vendor/embed/embed/src/functions.php create mode 100644 site/plugins/embed/vendor/embed/embed/src/resources/oembed.php create mode 100644 site/plugins/embed/vendor/embed/embed/src/resources/suffix.php create mode 100644 site/plugins/embed/vendor/getkirby/composer-installer/composer.json create mode 100644 site/plugins/embed/vendor/getkirby/composer-installer/readme.md create mode 100644 site/plugins/embed/vendor/getkirby/composer-installer/src/ComposerInstaller/CmsInstaller.php create mode 100644 site/plugins/embed/vendor/getkirby/composer-installer/src/ComposerInstaller/Installer.php create mode 100644 site/plugins/embed/vendor/getkirby/composer-installer/src/ComposerInstaller/Plugin.php create mode 100644 site/plugins/embed/vendor/getkirby/composer-installer/src/ComposerInstaller/PluginInstaller.php create mode 100644 site/plugins/embed/vendor/guzzlehttp/psr7/CHANGELOG.md create mode 100644 site/plugins/embed/vendor/guzzlehttp/psr7/LICENSE create mode 100644 site/plugins/embed/vendor/guzzlehttp/psr7/README.md create mode 100644 site/plugins/embed/vendor/guzzlehttp/psr7/composer.json create mode 100644 site/plugins/embed/vendor/guzzlehttp/psr7/src/AppendStream.php create mode 100644 site/plugins/embed/vendor/guzzlehttp/psr7/src/BufferStream.php create mode 100644 site/plugins/embed/vendor/guzzlehttp/psr7/src/CachingStream.php create mode 100644 site/plugins/embed/vendor/guzzlehttp/psr7/src/DroppingStream.php create mode 100644 site/plugins/embed/vendor/guzzlehttp/psr7/src/Exception/MalformedUriException.php create mode 100644 site/plugins/embed/vendor/guzzlehttp/psr7/src/FnStream.php create mode 100644 site/plugins/embed/vendor/guzzlehttp/psr7/src/Header.php create mode 100644 site/plugins/embed/vendor/guzzlehttp/psr7/src/HttpFactory.php create mode 100644 site/plugins/embed/vendor/guzzlehttp/psr7/src/InflateStream.php create mode 100644 site/plugins/embed/vendor/guzzlehttp/psr7/src/LazyOpenStream.php create mode 100644 site/plugins/embed/vendor/guzzlehttp/psr7/src/LimitStream.php create mode 100644 site/plugins/embed/vendor/guzzlehttp/psr7/src/Message.php create mode 100644 site/plugins/embed/vendor/guzzlehttp/psr7/src/MessageTrait.php create mode 100644 site/plugins/embed/vendor/guzzlehttp/psr7/src/MimeType.php create mode 100644 site/plugins/embed/vendor/guzzlehttp/psr7/src/MultipartStream.php create mode 100644 site/plugins/embed/vendor/guzzlehttp/psr7/src/NoSeekStream.php create mode 100644 site/plugins/embed/vendor/guzzlehttp/psr7/src/PumpStream.php create mode 100644 site/plugins/embed/vendor/guzzlehttp/psr7/src/Query.php create mode 100644 site/plugins/embed/vendor/guzzlehttp/psr7/src/Request.php create mode 100644 site/plugins/embed/vendor/guzzlehttp/psr7/src/Response.php create mode 100644 site/plugins/embed/vendor/guzzlehttp/psr7/src/Rfc7230.php create mode 100644 site/plugins/embed/vendor/guzzlehttp/psr7/src/ServerRequest.php create mode 100644 site/plugins/embed/vendor/guzzlehttp/psr7/src/Stream.php create mode 100644 site/plugins/embed/vendor/guzzlehttp/psr7/src/StreamDecoratorTrait.php create mode 100644 site/plugins/embed/vendor/guzzlehttp/psr7/src/StreamWrapper.php create mode 100644 site/plugins/embed/vendor/guzzlehttp/psr7/src/UploadedFile.php create mode 100644 site/plugins/embed/vendor/guzzlehttp/psr7/src/Uri.php create mode 100644 site/plugins/embed/vendor/guzzlehttp/psr7/src/UriComparator.php create mode 100644 site/plugins/embed/vendor/guzzlehttp/psr7/src/UriNormalizer.php create mode 100644 site/plugins/embed/vendor/guzzlehttp/psr7/src/UriResolver.php create mode 100644 site/plugins/embed/vendor/guzzlehttp/psr7/src/Utils.php create mode 100644 site/plugins/embed/vendor/ml/iri/ML/IRI/.gitignore create mode 100644 site/plugins/embed/vendor/ml/iri/ML/IRI/.travis.yml create mode 100644 site/plugins/embed/vendor/ml/iri/ML/IRI/IRI.php create mode 100644 site/plugins/embed/vendor/ml/iri/ML/IRI/LICENSE create mode 100644 site/plugins/embed/vendor/ml/iri/ML/IRI/README.md create mode 100644 site/plugins/embed/vendor/ml/iri/ML/IRI/Test/IriTest.php create mode 100644 site/plugins/embed/vendor/ml/iri/ML/IRI/Test/bootstrap.php create mode 100644 site/plugins/embed/vendor/ml/iri/ML/IRI/composer.json create mode 100644 site/plugins/embed/vendor/ml/iri/ML/IRI/phpunit.xml.dist create mode 100644 site/plugins/embed/vendor/ml/json-ld/.devcontainer/Dockerfile create mode 100644 site/plugins/embed/vendor/ml/json-ld/.devcontainer/devcontainer.json create mode 100644 site/plugins/embed/vendor/ml/json-ld/.github/workflows/ci.yaml create mode 100644 site/plugins/embed/vendor/ml/json-ld/.gitignore create mode 100644 site/plugins/embed/vendor/ml/json-ld/.vscode/launch.json create mode 100644 site/plugins/embed/vendor/ml/json-ld/DefaultDocumentFactory.php create mode 100644 site/plugins/embed/vendor/ml/json-ld/Document.php create mode 100644 site/plugins/embed/vendor/ml/json-ld/DocumentFactoryInterface.php create mode 100644 site/plugins/embed/vendor/ml/json-ld/DocumentInterface.php create mode 100644 site/plugins/embed/vendor/ml/json-ld/DocumentLoaderInterface.php create mode 100644 site/plugins/embed/vendor/ml/json-ld/Exception/InvalidQuadException.php create mode 100644 site/plugins/embed/vendor/ml/json-ld/Exception/JsonLdException.php create mode 100644 site/plugins/embed/vendor/ml/json-ld/FileGetContentsLoader.php create mode 100644 site/plugins/embed/vendor/ml/json-ld/Graph.php create mode 100644 site/plugins/embed/vendor/ml/json-ld/GraphInterface.php create mode 100644 site/plugins/embed/vendor/ml/json-ld/JsonLD.php create mode 100644 site/plugins/embed/vendor/ml/json-ld/JsonLdSerializable.php create mode 100644 site/plugins/embed/vendor/ml/json-ld/LICENSE create mode 100644 site/plugins/embed/vendor/ml/json-ld/LanguageTaggedString.php create mode 100644 site/plugins/embed/vendor/ml/json-ld/NQuads.php create mode 100644 site/plugins/embed/vendor/ml/json-ld/Node.php create mode 100644 site/plugins/embed/vendor/ml/json-ld/NodeInterface.php create mode 100644 site/plugins/embed/vendor/ml/json-ld/Processor.php create mode 100644 site/plugins/embed/vendor/ml/json-ld/Quad.php create mode 100644 site/plugins/embed/vendor/ml/json-ld/QuadParserInterface.php create mode 100644 site/plugins/embed/vendor/ml/json-ld/QuadSerializerInterface.php create mode 100644 site/plugins/embed/vendor/ml/json-ld/README.md create mode 100644 site/plugins/embed/vendor/ml/json-ld/RdfConstants.php create mode 100644 site/plugins/embed/vendor/ml/json-ld/RemoteDocument.php create mode 100644 site/plugins/embed/vendor/ml/json-ld/Test/DocumentTest.php create mode 100644 site/plugins/embed/vendor/ml/json-ld/Test/EarlReportGenerator.php create mode 100644 site/plugins/embed/vendor/ml/json-ld/Test/FileGetContentsLoaderTest.php create mode 100644 site/plugins/embed/vendor/ml/json-ld/Test/Fixtures/dataset.jsonld create mode 100644 site/plugins/embed/vendor/ml/json-ld/Test/Fixtures/sample-compacted.jsonld create mode 100644 site/plugins/embed/vendor/ml/json-ld/Test/Fixtures/sample-context.jsonld create mode 100644 site/plugins/embed/vendor/ml/json-ld/Test/Fixtures/sample-expanded.jsonld create mode 100644 site/plugins/embed/vendor/ml/json-ld/Test/Fixtures/sample-flattened.jsonld create mode 100644 site/plugins/embed/vendor/ml/json-ld/Test/Fixtures/sample-in.jsonld create mode 100644 site/plugins/embed/vendor/ml/json-ld/Test/Fixtures/sample-serialized-document.jsonld create mode 100644 site/plugins/embed/vendor/ml/json-ld/Test/GraphTest.php create mode 100644 site/plugins/embed/vendor/ml/json-ld/Test/JsonLDApiTest.php create mode 100644 site/plugins/embed/vendor/ml/json-ld/Test/JsonTestCase.php create mode 100644 site/plugins/embed/vendor/ml/json-ld/Test/NQuadsTest.php create mode 100644 site/plugins/embed/vendor/ml/json-ld/Test/TestManifestIterator.php create mode 100644 site/plugins/embed/vendor/ml/json-ld/Test/ValueTest.php create mode 100644 site/plugins/embed/vendor/ml/json-ld/Test/W3CTestSuiteTest.php create mode 100644 site/plugins/embed/vendor/ml/json-ld/Test/bootstrap.php create mode 100644 site/plugins/embed/vendor/ml/json-ld/TypedValue.php create mode 100644 site/plugins/embed/vendor/ml/json-ld/Value.php create mode 100644 site/plugins/embed/vendor/ml/json-ld/composer.json create mode 100644 site/plugins/embed/vendor/ml/json-ld/phpunit.xml.dist create mode 100644 site/plugins/embed/vendor/oscarotero/html-parser/.github/workflows/test.yml create mode 100644 site/plugins/embed/vendor/oscarotero/html-parser/CHANGELOG.md create mode 100644 site/plugins/embed/vendor/oscarotero/html-parser/LICENSE create mode 100644 site/plugins/embed/vendor/oscarotero/html-parser/README.md create mode 100644 site/plugins/embed/vendor/oscarotero/html-parser/composer.json create mode 100644 site/plugins/embed/vendor/oscarotero/html-parser/src/Parser.php create mode 100644 site/plugins/embed/vendor/psr/http-client/CHANGELOG.md create mode 100644 site/plugins/embed/vendor/psr/http-client/LICENSE create mode 100644 site/plugins/embed/vendor/psr/http-client/README.md create mode 100644 site/plugins/embed/vendor/psr/http-client/composer.json create mode 100644 site/plugins/embed/vendor/psr/http-client/src/ClientExceptionInterface.php create mode 100644 site/plugins/embed/vendor/psr/http-client/src/ClientInterface.php create mode 100644 site/plugins/embed/vendor/psr/http-client/src/NetworkExceptionInterface.php create mode 100644 site/plugins/embed/vendor/psr/http-client/src/RequestExceptionInterface.php create mode 100644 site/plugins/embed/vendor/psr/http-factory/LICENSE create mode 100644 site/plugins/embed/vendor/psr/http-factory/README.md create mode 100644 site/plugins/embed/vendor/psr/http-factory/composer.json create mode 100644 site/plugins/embed/vendor/psr/http-factory/src/RequestFactoryInterface.php create mode 100644 site/plugins/embed/vendor/psr/http-factory/src/ResponseFactoryInterface.php create mode 100644 site/plugins/embed/vendor/psr/http-factory/src/ServerRequestFactoryInterface.php create mode 100644 site/plugins/embed/vendor/psr/http-factory/src/StreamFactoryInterface.php create mode 100644 site/plugins/embed/vendor/psr/http-factory/src/UploadedFileFactoryInterface.php create mode 100644 site/plugins/embed/vendor/psr/http-factory/src/UriFactoryInterface.php create mode 100644 site/plugins/embed/vendor/psr/http-message/CHANGELOG.md create mode 100644 site/plugins/embed/vendor/psr/http-message/LICENSE create mode 100644 site/plugins/embed/vendor/psr/http-message/README.md create mode 100644 site/plugins/embed/vendor/psr/http-message/composer.json create mode 100644 site/plugins/embed/vendor/psr/http-message/docs/PSR7-Interfaces.md create mode 100644 site/plugins/embed/vendor/psr/http-message/docs/PSR7-Usage.md create mode 100644 site/plugins/embed/vendor/psr/http-message/src/MessageInterface.php create mode 100644 site/plugins/embed/vendor/psr/http-message/src/RequestInterface.php create mode 100644 site/plugins/embed/vendor/psr/http-message/src/ResponseInterface.php create mode 100644 site/plugins/embed/vendor/psr/http-message/src/ServerRequestInterface.php create mode 100644 site/plugins/embed/vendor/psr/http-message/src/StreamInterface.php create mode 100644 site/plugins/embed/vendor/psr/http-message/src/UploadedFileInterface.php create mode 100644 site/plugins/embed/vendor/psr/http-message/src/UriInterface.php create mode 100644 site/plugins/embed/vendor/ralouphie/getallheaders/LICENSE create mode 100644 site/plugins/embed/vendor/ralouphie/getallheaders/README.md create mode 100644 site/plugins/embed/vendor/ralouphie/getallheaders/composer.json create mode 100644 site/plugins/embed/vendor/ralouphie/getallheaders/src/getallheaders.php create mode 100644 site/plugins/embed/yarn.lock create mode 100644 site/plugins/my-helper/index.php create mode 100644 site/sessions/index.html create mode 100644 site/snippets/blocks/audio.php create mode 100644 site/snippets/blocks/code.php create mode 100644 site/snippets/blocks/embed.php create mode 100644 site/snippets/blocks/iframe.php create mode 100644 site/snippets/blocks/image.php create mode 100644 site/snippets/blocks/image_gallery.php create mode 100644 site/snippets/blocks/texts.php create mode 100644 site/snippets/blocks/twitch.php create mode 100644 site/snippets/blocks/video.php create mode 100644 site/snippets/footer.php create mode 100644 site/snippets/header.php create mode 100644 site/snippets/index.html create mode 100644 site/snippets/layouts.php create mode 100644 site/templates/calendar.php create mode 100644 site/templates/default.php create mode 100644 site/templates/home.php create mode 100644 site/templates/project.php create mode 100644 site/templates/projects.php diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..31cb096 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,21 @@ +[*.{css,scss,less,js,json,ts,sass,html,hbs,mustache,phtml,html.twig,md,yml}] +charset = utf-8 +indent_style = space +indent_size = 2 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true + +[*.md] +indent_size = 4 +trim_trailing_whitespace = false + +[site/templates/**.php] +indent_size = 2 + +[site/snippets/**.php] +indent_size = 2 + +[package.json,.{babelrc,editorconfig,eslintrc,lintstagedrc,stylelintrc}] +indent_style = space +indent_size = 2 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4530a5a --- /dev/null +++ b/.gitignore @@ -0,0 +1,52 @@ +/content + +# System files +# ------------ + +Icon +.DS_Store + +# Temporary files +# --------------- + +/media/* +!/media/index.html + +# Lock files +# --------------- + +.lock + +# Editors +# (sensitive workspace files) +# --------------------------- +*.sublime-workspace +/.vscode +/.idea + +# -------------SECURITY------------- +# NEVER publish these files via Git! +# -------------SECURITY------------- + +# Cache Files +# --------------- + +/site/cache/* +!/site/cache/index.html + +# Accounts +# --------------- + +/site/accounts/* +!/site/accounts/index.html + +# Sessions +# --------------- + +/site/sessions/* +!/site/sessions/index.html + +# License +# --------------- + +/site/config/.license diff --git a/.htaccess b/.htaccess new file mode 100644 index 0000000..5fe5c71 --- /dev/null +++ b/.htaccess @@ -0,0 +1,67 @@ +# Kirby .htaccess +# revision 2023-07-22 + +# rewrite rules + + +# enable awesome urls. i.e.: +# http://yourdomain.com/about-us/team +RewriteEngine on + +# make sure to set the RewriteBase correctly +# if you are running the site in a subfolder; +# otherwise links or the entire site will break. +# +# If your homepage is http://yourdomain.com/mysite, +# set the RewriteBase to: +# +# RewriteBase /mysite + +# In some environments it's necessary to +# set the RewriteBase to: +# +# RewriteBase / + +# block files and folders beginning with a dot, such as .git +# except for the .well-known folder, which is used for Let's Encrypt and security.txt +RewriteRule (^|/)\.(?!well-known\/) index.php [L] + +# block all files in the content folder from being accessed directly +RewriteRule ^content/(.*) index.php [L] + +# block all files in the site folder from being accessed directly +RewriteRule ^site/(.*) index.php [L] + +# block direct access to Kirby and the Panel sources +RewriteRule ^kirby/(.*) index.php [L] + +# make site links work +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteRule ^(.*) index.php [L] + + + +# pass the Authorization header to PHP +SetEnvIf Authorization "(.+)" HTTP_AUTHORIZATION=$1 + +# compress text file responses + +AddOutputFilterByType DEFLATE text/plain +AddOutputFilterByType DEFLATE text/html +AddOutputFilterByType DEFLATE text/css +AddOutputFilterByType DEFLATE text/javascript +AddOutputFilterByType DEFLATE application/json +AddOutputFilterByType DEFLATE application/javascript +AddOutputFilterByType DEFLATE application/x-javascript + + +# set security headers in all responses + + +# serve files as plain text if the actual content type is not known +# (hardens against attacks from malicious file uploads) +Header set Content-Type "text/plain" "expr=-z %{CONTENT_TYPE}" +Header set X-Content-Type-Options "nosniff" + + diff --git a/README.md b/README.md new file mode 100644 index 0000000..80e633e --- /dev/null +++ b/README.md @@ -0,0 +1,36 @@ + + +**Kirby: the CMS that adapts to any project, loved by developers and editors alike.** +The Plainkit is a minimal Kirby setup with the basics you need to start a project from scratch. It is the ideal choice if you are already familiar with Kirby and want to start step-by-step. + +You can learn more about Kirby at [getkirby.com](https://getkirby.com). + +### Try Kirby for free + +You can try Kirby and the Plainkit on your local machine or on a test server as long as you need to make sure it is the right tool for your next project. … and when you’re convinced, [buy your license](https://getkirby.com/buy). + +### Get going + +Read our guide on [how to get started with Kirby](https://getkirby.com/docs/guide/quickstart). + +You can [download the latest version](https://github.com/getkirby/plainkit/archive/main.zip) of the Plainkit. +If you are familiar with Git, you can clone Kirby's Plainkit repository from Github. + + git clone https://github.com/getkirby/plainkit.git + +## What's Kirby? + +- **[getkirby.com](https://getkirby.com)** – Get to know the CMS. +- **[Try it](https://getkirby.com/try)** – Take a test ride with our online demo. Or download one of our kits to get started. +- **[Documentation](https://getkirby.com/docs/guide)** – Read the official guide, reference and cookbook recipes. +- **[Issues](https://github.com/getkirby/kirby/issues)** – Report bugs and other problems. +- **[Feedback](https://feedback.getkirby.com)** – You have an idea for Kirby? Share it. +- **[Forum](https://forum.getkirby.com)** – Whenever you get stuck, don't hesitate to reach out for questions and support. +- **[Discord](https://chat.getkirby.com)** – Hang out and meet the community. +- **[Mastodon](https://mastodon.social/@getkirby)** – Spread the word. +- **[Instagram](https://www.instagram.com/getkirby/)** – Share your creations: #madewithkirby. + +--- + +© 2009 Bastian Allgeier +[getkirby.com](https://getkirby.com) · [License agreement](https://getkirby.com/license) diff --git a/assets/Kobata-Bold.woff2 b/assets/Kobata-Bold.woff2 new file mode 100755 index 0000000000000000000000000000000000000000..a97da86dd820f00b413c89e58d797698e41e06c0 GIT binary patch literal 18500 zcmV)3K+C^(Pew9NR8&s@07ygt3;+NC0F(p(07vlv0e}Di00000000000000000000 z0000Dfw@u|fkGR?LL7)z24Db*2mv+%Bm;{`1O^3(PzN9zE0Z;Bo5m5l9Wc}R?m0&x zuyKF{w)u(}g(RdEmi_;yC6zHWjay0!L-69}g_ygOg2-y3w#@jb_r2CM=@I@J6<%C> zL%|+nk^_TQ{f%=S`G&%ENv3acCdeE4vUtJZ6X!f^;p^v2Ohyow$W656n>J0ybx9`Q z!MA&`wI8vH?Zl0%Ma4umGf*RfH29g!jobP!nFpFO3C$E zu8EsfmiVz|Iw>2HpPIa=*~!CycK`i8b?mlqA8Dx^Ql2gjZza*acWLQ?3Wrf5MXY*3MLI=CL~Jezt8`osU?+^ z)?NRqsa^H;9CorJ%jy^}4m(a*VNk3rvF(HxLp00a1p+N0_3+^N5AB5wPb%`#UL}a^r9~8BheNf1lSBpkxJhCqBwyo4^?M&*@vFVz0 zf2>d20tnbtHTyCx9G1x6%H+}#r5BilD7-094}xyX_`|YQ(7`<(-ZUX<5-6h_B&o>Y zROa6iJ(J!Sfe}{SEaVe?3xCQE=p#R{=aZl&kmY3gcqJ(ShUS|0nchw&s(2u!YZz1;=Jpd_fV0xuxN!@)9(czpaJ7JRcF1*KN3>K-t_P>FG(7WgeufD6nofGUKc0HhGo{PjL(wCjI;>mAvMEz*%@W1S7vu@i@f=^(aY zu#O!>BxZ{>c2WN_9c-|Rh%BlTq!ESw`){U3ZPiQF3v}6kFF>;)giR@cXo3l813;1t zB*!%dmgABEC_Lda%AHM0#`5n?HQNP1X%>_`$8+R4MV5Bah1}irZYo!N@Ban(|6dT= zzW}LS02FsYg$1ZHc0mOI;@yIB054J(QC#12 zx(pfqskMKz={X^qgdLHZL>NHhW6AdG`80k1eCp6-!aQMEazH|@Tj4NBD)rS{MP$?p zyH2f@Yxl3USDT&bC9F#0J6i<*3v4TERNd{%?r{ilkA98<=-MiDEDVyXu{Dl_sgqw; zMo3wL%|vgMf7Ix!48{i8CY5iZRA7;8fcWhHWzL=h+g@weJnvN23|v3ky&vih~y*$k@6_z=>6wjO~4bN)0GwfdI1Xip{C%vuTlT=1%B-H$GiNv z9;^O+^!{6TQ4Y;t*4^qUXe0s2E8yi*Jm(GX`PA2b5rUbB3kM%GFfJiEEdx6gIxaC469?|RL7_1Bl%{ z$Q(eQ4`t_wq9iFwR;=tH;5jDqS=X`2PLYeT90m5r&=)wVGkcKS1ju?qSDg2Xi%gt@ zB3>hcUL4R-fU0A9+cGU`<3cX?otI~)*j1`uiA>;%5?9m{H{bA$C9%1w0&cE^*xxup z!9?lC3#{-i6Zc>rb(g(YM$8ZQdO0Ybfepvy2=t``c^!CWEu^sG2@5Y=BQTqUGd_Y@ z1noqb3&<{HvwlP;TM*lY%kx8uSgi-DbzS9VDw%tc4%3-7Ovh#)9to3ac8WTI8PFVxb^G?{$Dd ziIFTrt^!8Y8VokVSd+}sY@ub^bl7OCUG_QTxU;T$?wyZ0=c6DdQmWBLJ6#O8r>`cP zZjOKYY8xElC?{%i{yl!wX1BT99#4DA8~&j$eCuafc@}`p69E;Q$Yh-vg~KBgQZN|r zyYT_*uVNFjt%g=xtGzY0HKjGTwWzhcbx`Z@R#$8NOcO}T>9Tnppn@AG zC$sBomM^!3K4Y4>9!3&SC#e-qXcWW(*pZXKy7+g9gayIok@AMBg{FaeIjb%}scALT z!dSwA1M$9KyQG>MWQdgkCH2~^qf=Ek{!CH>tfW$Cm@HPuHZQj$B=G^ZMN(7^HdHH$ zI2fCuxNIkI|ziPp%OYuM)BQ9IYYMk)ocNr6$Vs) zteOW6SIH36*O1rGm;n`3sxIfj2qM5l(0-Z|HzEn|Qq<9@lA|0iBbbyI`^nU`kh6a= z#OY4Ce<&}hm!-4+%_$hQz50;ev+MTx$MiQ3o3eWT@HZwuGL@?Bc0*I~ten6)Gg+7c-W94X$%q$+(r*lkKMFKj=Z39;+{3TW z^M^djGp0^@jY2Y#L~fOWmceLdd-Q6~Z@hqJH64cDW7MvCXk-W5Vc0>2zIgM^FD~1C z*^WyG5IQ$YTJb+gYl$1K*}ZJ&eAMZkW9@i7!g%V{2`*hHfMu)jmj$d>-OZiycT@ux zc?)$$UDl~gI{lJFOYoOv%8L=3Fq}#>+UZ+TkQ1LQ#szOU28u(i(Aw(i&Xe}aLd=%6 zS5A|5;Vl70QHL#C_fEW5oH0Hn62u zBz7e!DtWN;?FsV*xU3hZ!2GAUyh{ zAuPjm?1csMq5DyLZL!KQLo8I_vP^15Vx?sK3D-^2wbvK?uB{wk)bb)*1a-O>m?W}8 z_4@>I#zo~bJ&`KWJVj*`^#fYU z4?TgsQWTk?%T6pumFW>RgQP>;9F-Q8fVoxd$_|bgDH_IYwkw)eY~yCi)S)X4Y_t0lXmqk_z>z%PO%2I+E_l8b$@yXs_AodBNCnUyTe#MqeY*jO~C z4vie*~b`=CCeXbVnn$+Q!71O)PGEimlc} zmd=i(opz<|&SmJ?xn1#c)M0NJ{N7Edf8BWV*&j~leEB&Uaw@?8(&_MxFuhS{ z9C0*u@4VwI;UZE=ClZ>hf6kihQbyj}c_X=kW-+B=S!-RJ`K~E=x9Yu0%@hd@(^~Cj zM@o|9UU$%!e}iiJeCQ(|kA|LgPg<&WY0}4&DShtK*+NF*x0)I`IhziHJ!^$;c@faj_|>jD{(pG1d^nFyVLt(J>S# z5+Eqwjo@f9TZrLCs4-F~np&gOsYg<+R26dkq)a)MP8+PE&TlMPjK6#sMo-Lsi;jjY6vpDxbj>Mi5aXv4}Xb zC?k&|mXW?r-o7U4STWTU6qwtu!*xapWaXR2Md4kTB;Y*a(DSh{nyxa>Uw2EtmrL!Yucu6%eJoV)b?!G?f(0T z{lQ6n$~?_E-95XU8_#X$EmGK(@CvDQ)GHdJzvveFJtGsi3No0%%uHq<%VcZeICeSP z!(L~gRxk+ClBFt^zYa zD_9Tuzz0KQ>2FzJn2ZkNB1G_jweTSPi9}X`R(WU=+KyhL@0f)(t(!IkXX8e^9v{F@ z2~OfiDvdOd1!Na_M1Gnon>=%k`P@?3Mq6eZvp?(>dxL$(?sp{mNN1w6(s}H%U0~;B zm+j7XPq+h~#NOY&!dv7W^?vwVKmK(s^B4G60;yv`&>h?f)rN?$FkBR&XpP24*JCU` z;_dN^_;W%@WS5YnAZbcwC0ml0$(IyMkF-5Kl0MDIS?^}dmS#QK$DE!=L?Drrm*#`> zx%u9_uaLRBxF-~q#hjv}I9WU{`pdF%OJ(Ufy&9-1>LqnY{jy;;*t@1#)*Nl#x7I%S z?XO6Tz%uZ@!gf)#V@0u*&pkF57EP{p>6mymXD*x&hg3keew<*KAoIpK_&Bl z^PMGQ8NN(gmMjO?84+^*u6{Sa!S5dc#nyU@Ocwv`6q<*wc3{``VoUoUU)a81NsBM{ zl_Q!o`tO-d;#75L1bro7)J*InKeuLmW*=!oN2oc6|n*8sDio$mGNnw5taNxn0t%<<5+%a$+>X4 zu~|#$1CTfU)TX#L1ad+q-BAhmiRBkdHLWKZZR16NBRJ6|@WOI`gQkUy^LZQA9M1>Y zpV36s?J#bR3}Qoe*WQeuR6VX@iz|9O%6Qv;YnmRK+mk)Qv`s%43+Q09!f&7z<$98FSS6~47>_Zi-0Ihwi`wX?8Hjf;1>jI!(Tx%5xzMf zi(QY{UMQ6@B7%UF$J10=EqS9+h|aOnwBHgRmkYcTxP#+H6`)LWc7UnVK1uR!?(IuF zhO_=2c0W{0zyb>}4lib+>`DEz7a~p>ok5zx0vs=_E38Qyv9kQ0US;c2MdreO4RNa! zS4sYI_U(6II1IrPeOWX6!)D*ksKVC`e0l7X^24eUfV310mnDm;g@s|P4x2;rMzif8 z+mZhZfJXLt0_k@5up|;zF_xyE*cA$J6ofmNTQTQA5}$QR-a&>fcsY{eCgC*&wBohK z3uRs%GRE!997GC2$@O{kaYZUxnAN!R2mX(Fe`6J(1)+S9oBVlfWbBWw? zJWM)ALIrUUx1RVz{Go9c^Ffp;=P*^&brL6#6Iu-#1X$8VHQ0!oXI;-UDv#!oWoBBJ z!Or5SPINASn%?Cq<=!n*7dzJ6ma>VmhsmZYc)wn>?J{N{z9I2 z#au!5g*UO<)*psLrET2Wg!mDM+X-VNE!1f*8c*15f+F6=^zMql;i3n= zmn}cDexSx?9SNsV762A*-;?kPk%3e5$_HWoZJy#5nQD~YjGs6;eqZHfj0P=;<4DC=txzqx zjHI`**va2k5e-j*x5MjI2zFS*w7r;PnRBBK4K-*4ma&Ki+0)T6G<=_++6T|76mxoK zMk|a<8^BrM{+LV!=zz$+X|2t&RYpesn5rzgKp?<|p+|`wxVNm=P-hI|nj=l!8fQR! zl-tVB;bgIqp7(1%UrBP0!X}#ghL(6`Bl}TXz`EQ28fky~jE`_^z*VP7c6I=(H1{ph z`@c?K!;Rj2vo{|kcImyxWo)GW`Ty>S%+K!)MZifk#AY)1lbB&ZjTO$dF^dym{V>UW zH4lx{`qFK$H^61Q{k;H&br!|y?l+4J(SlkrJSrt&_PSx_{e97fjdmLUt+ba^>z_v` ztvJTX{ecpH+L)Vy((6GJ8eBh_Z$>HCI&oBMYD#mcIt`3T1xH*l^SeJV(yrO#Hh8>V z6UbNq>6;sM0(OXwzmEO5gNT^b-jomj`Am0l>a6CMCN%cU6MtjUuq-Oa;&_34*P5VI9 z**6hx3})Gsuh=YX&vH?G!`JR!*}MoAlBa_`F+1c80uDw{>0<*?l?y|R73^`=$6Ud0 zY$X{D5%`)`a!|$~x<<)A{^`$n#h*CgB1?fcpit7~rlWJ3NoT7#hX>yuQ*7WBkr*M( zcbDMDGmrW@Z*}W97Ia6_FuMa~-TFLJ!qZMJQc`v?}bHg zm{);X76vk?N&FD%S_=tFHS66q2pUtcfsMa9P5w#%#`S;pmH2r-E*4WzEGTt(H^FVv zK=m>N*Dkvof*i9 zf7CLbet8MYxKHQ*H~V0!AmICL8`bjrO5z>xG3b=9V984VJ3qZ28a;$re!}SA=WM@r zGO79ZF?V{gO-6ekRkq*>IOwm5Z*v9jdfm}KJK}<=q>{jypu65Z1fVCG1g?dn=%mYN zD;>R@`(auFkZIaNn$uE0;Y>$h)tn^XqJO?try9iJD_iga0$A z7l7siPm7tucN4l3`hUS!9#FBdJ3d(?mEEqh3?S&}1(?ozVVT_Z>JPx)o1OW$SN@%e zu=c8Kn3!AYWtpL)9MCn1)eE55ns$0oe`Vm>p(T)bbcPyQC9Y9z2;)mCi4G zugBwq>W%xs-Y2Q+sO+eH7~3z(mfNnI@#ERfeR~_XhsjXxlW?yJF(mizf+iP_DY6Zv zUi>h9yFq&P1~#HMsyk!wCrpmU;+}$Vc@g)fIjdLJeEHPMJBrwsY(UtlP_o8=7IeGl&@rI5)Cs-C1?DhVB!?)`IJ!U?aUO z3o~t74R=gnr$Kd1(@}RZ4<*@;h3PI_^=1~PDUGRW7zTy5RHTAwKwXa)Qufq-ACCmU zTC`H&E%8t}oO5389939bKCR3fbWSjPctH9+<5N15<);y?m9HETGzLTVn z-3>@=VF6ZS92T~Xw>kneO6w7=hSMtpt1b^C>13=1i?9jGQ^m}zZYcd{pOuyxnG#03 z8(yM?eRX{4TVZQjg5?RX{v9p@_arv93hqt}*LE)jrs@PZ$+FrvYx($-H1l-RmBeO< z-J>kecNA0ggE$kRW3qgGy5R`y5Bd`6f5E~0FI;=?u9dgRv-Ws=s65z-s$~kTslKk( zYqf9sWg>YKM}tJ+{KA*z{(U4k_S1GX3<{5Qp~5?!*sb=>AP#{@!wn2>(%3}Ds|?4k zAr=P+vS8mGGpTR^g}OmROG3gE8ZGUCK=rnY3(#GxG2PdYCsq(*<3Rr*KSu5w2? zDbQNIBZyY=SdzyV`;&#P7G}R$=PO+fHaiN(8vA3^c|{7nTtkP80b)BipWu&w|FnxT zRDp$$I#Zh)SMw!N4;rcDKJ7Z01lW{no+o=CRj7m$-+eJsZah0cM>XtL%TqQMOO>F< zJ0%Qi2<+g3KpX-oU#hiChRb(>F{jkJ>4-2xOFsw)X|zpQOT59UHL}UIR@QRy2F2?S zSPZ>}EM6y;9$9|H+e2QbA2Nl@8eedkIJbZvYz^S=KI7Ne*W z-L;H0iR7`tkfiG-{Y(u~_?R9*)e<-;t#Hdj6EKl6ssU*c#VGd&#guoA@}td_@th1^ zbRlaE52L~zDak8bv>Ur)>Aa`6qBF!o$|7OBS93*7} z_!nx}-D5DuwJ?5=U3n{IZ%;8Q4;4cYsADl8C`9>=_TV%S^tF(Fp z!o2E{Y#^lsW<4@KPKm9&C~tX|SSqOt%4Shi(KoiRwnG6h;amEQ9^s!Nij-HjM`@>Z z^zODf&#%-K(*k+5uaP6B{)KWiJn&?ry%PN?ZkC3DU;OPaYYQLt+rxT$mSFsuS}!~v z)Ev?YN7hPy&Q>|>Yc0>q{l;yWs{&Zd`GYU{U@|`!!kfihe!9dx|C+Gq&fTwrf{_cb z)lcliK6Q9CFYuYP&^42t)^t`P)mq!E_i#V*iFV2h9L%8#(Icu_9DJ}WK(QQ6GF}jy zdAH#NBiQW?{KDqbU~q|pq0)0$jKnUV%sQ^<15{66KbBZq?&!H z_R|MkV7@b2xsTp@>!XjXzHRrznpVx-1rEHQok721qDQHXn|m#AARmrG;i#WJTGenh zlf%S{c%u_a%_Im|_o7wnV11sy>@}Rs2=7=C5H&M_T3Z9}b7nN*V%$u&t*u|=%rrkS58F*FxLiRYebkHdb-4<2Qn#@KMs+D# zElu(6qI7UD?_SAQy1>^IORr5;lV!0jeNj!FmgZRUgK`HyEPj`9o#}urBu*dLnVm{jjyUzY}hG z0UH=jTngF4&e>sSg>vPy!*z5FnFcqfF{FKX{!+>CsB&AZRXM0zyLzaapTxPJ6@*~g zcwD~^YP4(*gMO^_3Nl|V_8u3O!H9d-n9ZbA7XU&04CTh1KMJ8fS)aV`uBs?NPCW<$zZ(Zv5ZuSzb(preFbnp5ME?LK_~wKs9h}ELubL_8P&_H}Ri)&UUQbe%uc?hEsYhko%NpxUtn31_IKw@A{ZT(~BJf&2)O8_uS5~$ZAr9o6Fx}GEvU3;QOL~}R|BqtE+G?XVxEz;hI zA|rY1Uhkk~hmBvC=e|zxQEtGTR?U_0UjL)0D&;X9Ze+gRN78##)T654Zk$uGn}=FP z2j1+!CJz1s`|TNP`KsQ(+$AedxnlYec;?7a8N9WtNSSS{{Swp)9QHUbb*!vbP5675C66L z$R|mLKl=6^{*ih~XrTl*pOD`!59CM}*q2?MR~R2|RuCiD{6f}Pw+yY7k!ou@SbXrM z!$2~u;keVBkokCOg;AStA zI#^y6)q8-LzFe+rh!Jk~r-h07f=2yyv?!kQwZ~OP7TMy}^^l!Uy66!~KQ=ezB7wVz zvWnHU2#_M0#L%o@Rwe@5vXmZ#xByaLCC4Z2#u884wbvLcWgzO7|2a4x(tm0Ulq*TH zOFDZ9-X}+rBKk~w)*_g7AOeX!#mMU!hFJOkYIPf8={9fYLlTc&uCz(QWOlWK0Omvx zbWJEl?0a4aP&X=6LN0W;*if}x%Nh+*?awkVHbEW9v-_l_hEGaTbn2?$xRv%lxVbu6 z?F*;$@Rrv`$Ttoh|A^WAPPJ@q_~)K3=}lsoZw5Dp}QzqsyC)p9U1qZ+M>T^wCO*hVg1EIaqA#y`Jj*t6}}wr}FQZ+DSZ zTbpyEpk-gO04vKD@fVPbu(jyq|AC{ZDPG4$S97alcA8E;+i%30$sV7&NxfdO{4(!b z@22o&MrPRwNJy=F80ZrQfNbTl99=jcYUrz`4uzpuXe1GiyQlG~u_18{g z*5mY3VW=1TJ7EVonfAaH?$l%_%5 zC>0YO#xh28@ybhC5~nol`)jK_#6AGT8RB$nY2bT+8mt{@iD8@p=Idfz!p4SOk+qJU z-&2=HU61;j$r7Tk49O&=QATA)EodepLDaNi;Y2>!l@=^X?yG;~ZsY_9kpbCZSSyS? zH@YXBuD;F3EzyfnstQp&Md}`ADEDPw&xqb)`fSLZ58=fQIs%LEaqi#w(x#9KX~w!- zUI%|mHgS^CP`hg`4c?u{zOI@u+(U3#g<(uv1Jp}V6BX7`;)pW@%vdV+&EKfzO(jIi zoyQC`87EcPkJ$ONdmNRjfK+h9dCHVA=p|a|qzSAP(}rl3t!nh>MxS+1UwYpN+~XW4LPvmD+UTdg?kO!}1L)wx>SIup20a{EfGDk?DP^ z&?d7K!iwX+#BvJUir?;%|Fvr1#4m)Yz?YSy46mqS#Ai)IR~);hYM36i#-7$qzi4@a z)OB+bQ{WP#I*dMwY;8!1r#3E5qU`#h@!-D0m4qF*6e`!Od9dws%zm z_#rV$I3UpK4btbYOF*`wpM>teNTik>7yBgsN(~*e2a|Q}P}jdx<$b8wN9C<>4heLqzyz5?e)~? zLEng?c=~NB23?b%6xRp=DC%XeftLt3-AXewHBA)|d#bQSqsAh8x61dc zW(zcaWWLBoZI-c0K&jf2d<^WsUTJ;)5)}!d2kQD-UC$vTQ?*J7<06VG+Bnhst?;Q) zV@;S<5rCa&il)Vz6?@De(%+iUj}XulMfDxniZPQ>HW_u(jP6mosV@dqdd=pH>P^cj z>7X@>R!=?~-)6qSZEF3-ivJd71&XpYrVlqqkYb+9Fj3f4-&)CF$~G&!-j~g2A6b<*CJh zUhu7bz~kd^9tBvT;H?r!gTQqt-Ar9(olWaZeEqC=Su^pm0{+Zb3%wNYVuii|WC)(P ztbfj*(%=hPQB)B8i4|%hBO?;;A0lQzt;3?fl<{aaPgQzwD9>-=4~+eqZ>iwqSl)h) zy^Zvwq&C2CW64IZko5LMU_Yo|un|3hQbA%74l~`zWZTLa_(Vecuu2P!qzd+75!-oo zRp6xen$V^*8u2ZEA2~`1jerkUNs8D{7B|u?ZZ^8eyzHU5jF-+%=GNkip>P)bxJ%&L z?BMHy*gJy)=BbgsoxWD(?)OEi-rGea&y`2exE>%3!IjY!o?CDek;z#(SSHdX9QJ*@ zo~*{}Dee9JZjQ?$@K%!A&um-H0d9c`dAXixyYuaPBoq27dh=$CUonytLyqm$s|91Wy@G1q?)H&c zz^(cXSLoGpOypx@GsJa*4nH3y7)kgF% znB;yQ`#Qj#Q$_z7YjF%#>mxrK8TzfgOWYitQ>5+P1-YFr;u-#B*)f*VEwvtb`Ehd5 zb@aveky*)0XbA$}g?$%0L-`!u4vzwBG7fxkuSB}Vq?XUeE&9ryheOv7@Wq~suWvNT z*BM_|W~v(_8R%vBjbb2Lh5;k^+%n&JsFx@ik8nskHysCRW)7SzD77w}JKMcGr+6v6 zkJ-} z^#H;jgE3o3_D9y`js1cH3Utr@n}O3SNYzhH;uk}&sy zv2rr$u1Dka&(6mQ7(v~rO+*`P&2>Ck{T%@4+LZ8ffwjMKr`LZ) zN)r@5mpeD#pqC6CxO|N|5ts$1>D9NquRt0C>8d{zyTqQA)ohr2C|G$RuC{28Vy`7z z!m0Y=Ux+n!S|bBcIgY42w&JT#rdP6yZ&J;S2nKsS>28Ls0=zd z^&kEAr&l$o#ujHPcvZL$Y=Y`0g1ST&lBGsjGw07CzKWh?Rh*Jn-|PNDX*`d11n(#U zRxEVcM;c#^`FWyoqv|Ul9x@X*_|ZMz)y$}M7+rZ`15q#*2{`4d44Kw|wzYj4S?I+a znfak|d4)U<3oxm|pmKa#9<5_&_&={Na!epP^9dM=RPFz@r%AD(Hu667lmL{bPbkmf z1NMhp6hRa8EN2*hP_WGT79Sah;=sTL7PaRpr&=R+s#iA_+3w>+mNMScCDZ=gZbb=4BHx9iifidnCbf%wjvUVh&JodQiBTFtl93vT%olRO|E2Gl`q9yD7Ji1T zX9{%h7h}QaiIopV=I8e4x^uzL{x{m#)Z67nplg-6b(bz#MTYu`n4v{Kx9nOfqzdeX zn7AGwYUVDr9}pgKQO!f_+i?z#v0_PE?OSV}3MY$X(nc!z&BN-!5c|xvP4@(7{Y&tBab1^X!=r1=g?Z9XYiAn`mld6K~(7ZbMi5;z2gt2%mg}wm?&qpT-v7a9;}tGjDU$0GPoy3Zng+c=0Cv zA3sM`GHI$*l9zrm!KC$)Q52iXS^UUZQ5t|`r%7)t=k!SbM??Bu=xjbBzh(C@<#SAP zJq9YGN*T|vS%I5OLbKNVCaIGuMlTcZ5S7M4XjIwMSl<`HzL6yIbIhXPFY*WQXgF>H zaZ#H>?!nOEU)_T662XU)<@+U`+8Z zM&f_`>mQXP=8`+hJ$c5;sv80*G80{F5EFQGtg)+QZa;`s-7lP+nRFIo_YQZDUeQxn zed9IvoH#YV30BwjAn`j`>|4qJt&kMK29Mz)Uhc&tEJ_L!*m!ns59ezi`4V-mS4&p# zb6z%+L31?DcnCw{j7HZ~H~k(~+9-~7k< zaMV_UPsZGADAZ9gZ9xk;e5^h~j}>bbC|VORHHKtn2(y6gV){eUDk;WOVRU=c@K}&5 zB>oU2<~rYGchXQk3A7`StGf=+u+*@)?6UH`Q8<|oF6M*B?XJT}3Vx*V$M7E3^rCCy zT&t$59*RdB@tz_(yuQ+iUe6|Qwa(S4$VvKb< zblz|>1BmlzzUv*Lh!>p}|xVjs%l}nud{4ohg zS#ahdOQCW##+zb>ITl!Im8V{K>!WWl0Dn*lQ4tGCRcWQIPWl>Rq%kI%YL@vHUE=P? zZLs5PaiMLlah;po>N&4@+ebe4jUW7?{Y?OwHvoc5Ovl0}G9EcCBWLb>fWTqk|KF~V z&|T1!UCeL3gHKFB!_2|JYV6g&g}u9ktfIQEfr+yR&)!e6YVF*O2Q_U2QyWJ&FSo*u zet}3%aYburQhH8#T~nW+@c87SnpR!XvhzzCTRJahm&~8N+aBX5&sn^D&DIfPC(U2J ze)A5y?m1%ow7CnHu3WeIHam`=K4;;|4O@3@*m_ESZ3`ED>jQZ>HA?~mLpdAGd7C9~ zpA`(~=mloB#GdDM0~qtP4vF$$i0?|GvK5O8nDB!#QUDUifu(2TFGKWqkg zkh~;4A!(EgBsLC4(52FPjDW2_R1)t;bIZ=nM#_-laZ{s6<#AY-IN0l#I)Df354h5} z+zPMOxzsh>?k2qY>Sh<141t0MIrqaLO}0D`Pygzgp;tH(Etww&YIY|p7!n-tI2E#` zeFkhhT2Cy{@u)uvG~Gg4acmg>a6RZusL^h*w}z@ko20o1pf%R*l>XpONsd8>%3^b7 z2!o-YefZ&LpDF)${@(9>9~r+md!V$P5-OEE+e+f@={sz@Z@XB9z?`oPg(Rnm&%d{NYV)VC1OH1w9@W1U7b8>C6Hv>IXs2-=`o z_w;ia=;{5u%NIC6a{;`O)?!LmXdGVGe2rQw#^b&;V%>lTqYr{|H8mj>267ZN0^tx-wU1g3t#s%w9`Oi8G ziUL%T+CcV;(pDIg7cP&&XIG7#%a(1%A_m;Sv=?tPl@2gQ(p99WjrsA{HY;%^yoAuq zFzUWR=tu|MTuDQkw>lhp_P9gY9MQO~RPJ*vj8nriyc{=AdLHTCX|g1&V3nQdpiUO1 zsZ+9Z4e5rt1PTMyHg({s=?Q>Z&e<3TqudegJSQn{5#46BY^wy0BYrUUfg!=pP_iTe zmjWc}4c<$Ju_5eqD=m^%f{)sT`)ua&Q^j+AjU9fY;z#(Q4QvCLVTD`TR@$q8)U?f=8)Y0^g5FdH z*rs@?67AB73AUdIUzSuojp&5VIG+KrwliAi z;v_SqGYCMnOl6(fNKb^XN>U@6flr(#eYkbnHH-c_Y`HWR53z9LY;*x@x|g+=u)N+p zvH7_E2vVa7xWynBMbg9}eu#={a001A67vo@uY+m?LX1{Qjn-z~g>IxE#4(=Iryy}1 zM4j#+L*)rlRRy7fH)Z5WN0XeLicFy1H{MfIa+s+bhpx<`Mo>6MEKB)U{az>VY%0le z8BEN)F8zSCMU;RZV3$Qt)O0$F&<9ef4kgH~10C_H2;8vycYn8MKhjapI-o8nasmRn z0o(_pfZ;&|gb=auCWw?J#ELCM&kN!s5)y61NNf^`mjTIo7?NW$WU3jESw_7OllhQE zmO)yzL)O{^>9P&7Ll5Mjkwgybg`9m^x-6mt$WRpoaxIW7L#d&)RXB% zEN{;sreXE05bpFkF4M;&UhygVF`x_3;LR+1St`q}1|0?nd4+Z9q>Z ztf=mOZ1fkFXXGKBU6-%Y@f@TCm7&=5fz<&`(l1J_hS%~E+;2e{e4)4GJM-cENYM!E zOY-ERK#8uR9`Lo420*80j*G*(ey~{9XF~8V)A);!x@az%T zDnmXPDy2qHVx=@*tx)b55RvYtr;DDVtSHem*shAkZHbEtaW9o9BlDr~aEft0qK7M} zi9sFIYm^;#tJSPF3dfX6Om|}EB(LibsD>SXKszkyiZ9f2ns!l?b+-ju(k9H6qDuy0 z&gln^BJ3X}FwoGTlnc#<{Fz#G2d1; zf{!>-&-gsFnQaxJLNd}>DILc6JJXGbW79Y+SLyI3T8BC-Zs+66he;gPKkUOqVhzzq z($Y~q*NRA@E(iwNRnH2;7rv*W0YYrLJ2ytRaygDsodHod0{sR zjT!K(%|O1gEo&=*d>e3!y(h{;sliV)b34|0;Y=6jc|9hzPD@xyWi1&60MA?g75Ng2TrJ+2`sVW>#wbb8q@HmknP@I818A~1*OH4%DFtw#V<-o$SAQp%{rGBVNqCXtotUQ+yTOU!Xw60HK)G-l-KHPT?XOi&)oy^#r33K0p*A4ufCjv zYV?ZETG9ovSL7i;JqXC>B1&6Fv`NA^F+JtWCh50P}FkJ-}oBv$`M*Un0DEp*g*a@INsuhiyG$TOhi(l$ z0Fo-;^|&ep$5M{ywU16zUJz(L?>;6&hb;9MYa ze){X(uLQ0qRd0w)q1`CODAVz2j4#BOk zQisDZJQy0#L5)hofr^1MJ=ZnqfZ)!N&+9k|7Rgz(Sf1jg@VOE+L1mucKmYTvFoO&g zqtiwS-r%_@FdV~8Q^88|m@LEB8f&b46Du9o(dx3FtsV!tJM086r*8_lE}TBlMb89T zai+JglLes%4KWZ4Nt7y6-rBhcia0RnQqh294GJzj;lf9N5)G~d5ljei#50`HjA05h zna5Jv=wv)LR8oU>q4uLghD>kTXV;WsmNY4RXbLfa*z!XcCf+Yq;7RRuyBuj#194X=o zC0;MUgO31)VUz(dzV2>pOCg#XqH%)_t&nk9V+NwidjuFbfuB+T|i_ZCLJuYl)y6S`?PS>0foU@DC~5?!=<|HAhgqd zR6WejscqEXbeP-`NAVrUnD2xvdl}0DcYb;p?vh(H`rIe+0Fzc8dP?h=$UR=*enMtW~4F?7! zaPb=|$d<37fE2ArrrexNM2HZB!-b0k2~?;^p+QH5Ag5~Pv_al3--|&)W8nH3B-F`5 zO$lQx3O`69@c;*h+#s1Dza10n%Z-2zPrCX~Pf$WVqnN=WRxfy0ulT)NO}*k=8#FxL zyYdsL_&-0QzXQ5B40uRpR=qGbZC8sO&UoNQ2vH=EMvgD~Pq{<4 z9H?awBN)dNX3@eTTK($(&O3BFfi8Bey!!wF7B5=76v&Xkg{fIp(Q)SW{_G7Ya%%Mm zH za>!^ISnhuZH3>ht%k^@-mtFaLx27Z&x%aYmGt-ahFcS2~^-5zIp z=hagW09OIxw>%0MC7Hly{hScIKHeS%I9Uj?04{t@uu+%oZ&QDKPpC+!Qfu`(>ZbRf zEC1`~TVsA8-5Xtfw~F{4#$ z9knsI1XozItkqVBwaGeby|Ug~A8&~_j2EN0^0UU~ce&Sdj~<7^KoZsJbkJEZeT_54 zB5Q4oET_^p0I4D|D#yAT#_WI46Fr@tO=+)d=C)W)2QS&yykJ@8j{%#lZPq?-o7^n$ z@jLL*AK(x0(eE++(T7L7e&mCJ504Ko4{r~v2Ol4t19r%)_|I<-z-&3)Uz6 zMg1istv<$UDGkvPj&uy5{rHIl{DR-8MflPn9R0;UQkGJh1OD`SE?g1y@f9pqyaXw- zB!|SJ-XoX2CbhpW5T}==}gG77KPff-|!N9_2K}JEzz>Yl!B0<812o)_X zc0?&wpiq%|an2ZH#JTl#MjLOUY37;ZKP^^kJJ-F+Ogrqg%WggP#GV7Ly@B|D&sC2c z@&wITxRL0_;hI8VI-aS-W|5dpZ9bK`EG;0{OlvV4OIce&XE`TpIBVzVf84C&Zaq&M zdDy_qCf+vl(=EU@{=VN*(NW2cOL9!AlhU1*=G634UXbIwZ0D4^!RVF} z*Oj@c%3Tc}Yc$w%L%lS_3mJOlxtMw@|L#bA8m%$g9P=%<#6q*ow8&fwsBvGVJF4A# z=;>)uqI2V~AvVnnNhnZ1{S7e4U|nM+n{!XGKA2F(1@6i4R6E_ugk1B89Uq(RgKk^Yki}{`f;NE`r>w#lXL4!9q(>YxO**eGcRU;J{wnGOYEL zzIdb2k|N>D0ax1$UX%31M|IR9Zd$sw?OPxw9J@b4%rtFl1cdfGln;yOLuPZ$_%}~ zXa{uPgjY#D#Q9Yus7(hjE-Ju?Bq12XiL6Qz!{5vx;KkFJtUU7+N=)d-R9R(U8eL1g z^g5Wy&>5J;qdOF~5nd#5vPOYSQ@c%bauRCFQzkh}w{?nUG zxxSH65=Az@)c+c&jl2r}qEEp$AFtgKqgJ> zh5R2aIS93yisTlGAojgUyX^FZFqjdD{%14&Ex0?33s5jF26sN~@;P+ArQ&yi$A7F2 zZ;qcPQp!HM9xRDs71IOGu8&e}G+#|tLE({^srrH?W=vn<28CoRlP(jF_adv_aHEAG zvx-$kx*o~x#k@3=$~jNgxoU=FBTB54OZrYwqfG2nZ8a6@{QXb_;(L=xDQeR_>@7<(5dZ)H DKYgW! literal 0 HcmV?d00001 diff --git a/assets/VG5000-Regular_web.woff2 b/assets/VG5000-Regular_web.woff2 new file mode 100755 index 0000000000000000000000000000000000000000..42226e3f849634724c3184e3ecc950020d62f699 GIT binary patch literal 31616 zcmV(@K-Rx^Pew8T0RR910DFJ{5C8xG0i8$y0DB$)0RR9100000000000000000000 z0000Rlwur=90p(jv@QsI3729K2nvM!RD_rU0X7081C%feiW&d}AO(jX2c%;Rfg@YO zWN`;|!=yM>kol{-3dDcRH*rodc9mzlZ2-}x`_D%%k-0gaklw5Uis9d>+5i9l|DI$K zV{2!?**%T}AT(4YtkUn(#9S3ZmKx8{dP$x2IX6SLwy|OCVH$HlYdIzIHXlbj30=^2 z@P49NXbvVTY^iYOm!4f0hjD^-wcCc8^%h!7$t%aMzhg(Mk!G5hzyszn*{APgx8ziT@ z_)9d4DLZ;q3B!YVP>H?VA<4RMD#@f;mT%D?>e7L{7F(D<|H%6Iq`A8vO7PAkBFmZG zGflN$E?DdiZVzz2*RWCd%4>{`Vb%+V&@Q=WJ}IHVG1%WBW)n8dqIWBa5~y@aqGe6$ zSp@>3Ih(x*A{L}UJeY@|Qd5Haztb1x)p>FHqSUCkQE^(Q6o3Fd@JH*-?>s0>FvHZM z#4}7JtKETd8K4M8JH&OkpQ$$b#U!X=cO+eCY7)8<2$`A)y4&&prW*l05Bq(abKm|I zByC1Rq!GP}Sl&b^lupQ|ktE(aU|X6_OHt`Xo?qww)TaF#@IgYP#E3%7i0HOcS$99} zKl+N;`3FD&1VI08?CTA1D-f@61`G} z?187kyCs)gN~Wz6ZC?&5vH< z=3V6{VFu`b*(~30gdu4~3$v^I#Lb<&kxT98NjYo1p)FoxNNw!xr{m z+nn^Rt$qdzP)^7^NxlZ9q6z?4hGE_+t+LL5I>v;5%inJoQOo3g$!WTav}##odZ;@T z*yh$CRy-te{~G{fE-^vs7)QUfeF_6njV2}zlauiO%+_l~nK;cQFJep=pBQUVfhg?m z|3#gmrmGGUhn}kCSL%VXvN9_x)0D~d)uig*&G8yC2N*Ih>VfdVE1iJU0~9fkbsSze z&F=-wT+mXy>jKd!V?l}l==B}??mI~&9}Y#G*Ffh^8y1bN9pYXEvPma3w|7a!ts*WD z<}4}9Om70fSKVWlilh$o*J)4HQHV#*`kBu+-}PC-_+)KRdzuU{P#kfp$EN)9u#-OfwD8O#nkN z4d(wWwM+$R?r3-IJ3H>o4x+sxC(#C>L!s)|F9X%T+9JA}5`iX{A~CcCLV6q!q$P?o zzY17wp#hCs;2xlMo*y;7DEXp%a`)D~=aH>LC+Qw%=rA+<*WZ`I1KxMm(*W?>CdsuI zfqf+jQ9weeXI}%jtOArwpaB+$T3bwpg((Nyt3mjvp?oy7CJ6uU-+&^#(Doz%X}f`zK5nC%1$yrTQTR%La$(3iTt`w3@uO=l7mps13Anl)r0 z{m*iTYOJl_hX0=)vn0FQoAw49B&0TL#TAiZ7(^uGrD^{JPDfm_IH`jW1i_(*6e<4V z_I}Dkku6X{Nf{Rm93bS0-M4zt4Zh zTs^34Y&*#AaHEmoxUuHHADQlx4ri@&IXh`sg#dwMza*g6fA_z?mfu)|?VzpG_U*H| z!7f`O0kYo&^y{6z-~qB6oi38@bbdMJ4fi^la77Nu|9^xmz!;H!tXzfdF(#02uS7zD zvSO#b1@-z)>i@PTg1#06$P`E@332PdFl3Bk`G;kUgbYCnQ?#Ca2q<>u$K|mfP-l<(>CSA%F~JI3pRIF&Uc)nV3nLlBt=N>6ww4Gb?j4H}f(- z3$ieavmz_ADyy?5YqKuvvmqO^Ia{+W+p}|aWq0;uZ}#V44(CXY=2#q$6AGN#@cD9~ zTr8K$<#M$)-hZ|{&Hxf1Gn6=*vGxt*Po2%!nX8Eb`aoljBF|IWna4l9#?l8rF@TB! z005w3ydppZDLof8mN$&%mlH%dMe{T)^n^z;XXa2a4<#5*5uvZ%3643( z>J;T0rJii@VM`39og@yd=QO}OAzQWxnKT=H1%VZavEb#A6;YH>m2s$`v7t3_Y2((x zW5De*#SFTcFlM_xb1dYwL<4;1zG=IWZnH+WZSF@;=yswzM8FAHr(BRNs z=ufb}UCHAYyw@n+xtjN%Ien?SeD|B@;T;{NCW#3!PTZgK)xL@^;yavmbB{;BZh`c@P~I z?vi!>GUF-ed%V$O{jgnO*@QQGd3gumsZU55~czk55ooOx)3X z&&jf_>pQ8q-}y4z`%d(Pb$0ljREaOMlki*feKv+y5=+XiG)v%YTnQ^+zmFeEZ!6(@ zvhC2+cmGTaZ};D}o#@&P00VB!V!)YBbvg-(24`_rXLI(A3Kkp)6nXJ>`#U>cqi%j# zN|*nZy^pW?Ok<~2xAL1xJSX)$;oqB3gZ%yd$j3hMsn2}w3t#%mkgt8?Ti^NK4}SEM zpZ((3Q|Dv*%isR-um4V;IipscK#$P|i#=ykM#5OqPvumRFhjx=vih_!WS)4V%@q9b zAb=pe2_XeF(-vZxPaKu?cqYMVaiWqWg;ga>5zA7Lar>m8g&8W;1fe0GRGIRXnqeNj zIuaWVlGtQ;Z#O{3IftDkG3E$~^NuPmIL1ZCx#R?wo#cvBTy>gjo!ONm5O89eAZ@U| zBeBz==HE%g7$0QY1zSQ8Yezsl@9$Y7a22CqVi;z9s4Q=y?Kh^t6kA;J z!jG58C^OB=>Nn@U# z+D1m%YO{i!42^qZ2wz8z2NJ1V&VsEe;a)i;&})vIjW(IDMj%JvLz+r5>B9yobdB`V z%s?*Me+%f!#xO38VCu>ti@xL9!;por zXlHn3Yc#U0cGwzYU!(s&lqy-?zK!XG9@&{kGYZ_dZFZnn>nS7}RE1yxcl)muN+hdOwE(3Vd0uhx3aybfMxFJ~`zuRyQt zSumCJ@7(p)d*OZYcJaQ@zy9~#>remoj4ieV5=kn#ag1{|>X~|@-m9$ffA-1Csj+_B`Thd! z(rb+IC!A!mV^?2WYPou?-qj_lXKkyr_U)fiq7E#}GgAskAa;5bJ)LSr|p z4y_J3_}^)#9Jb#sJ8iesGD{8cJ?58uF1*b6sCe-8(I=Aox4Lz!mkCY-#0&j0siT|R z$w#6)EC;l^)~%TtGl$MF7fBalTQRfJbTK5m+r3%cWKOnc(%wf=35kZ1G1mM|@aaAk zx$u?Q#ypt_Q-KKUHmhz?aHqRsM2haA4FpCQKeY~QvBUnk^|&WqPp+-l=|y27l)_Rn zyU`_0&YgU(P?_>4*yh|n0erYfg-VT@pIoOq^y&B5o%+)>6FV{&i9Iky0JT6n+dS=U zu`yRktZkj1win-d7pAFA9*tIGHs#jMZZzIR3Zxk3i5%r$Fu@uNEV04`N1SlR3~&6H zf|>w)Ma}<|zi1I6MM)5>O$M!WS#&aG%TxN0^y~-ZUID$@$Ky`DnjWTqx>u(z-Ja0o zDbqQa!@~k93k7PBXf+{=>xwcP`))puYm0BmJl&ZKdybqq*wt>648+umDygjL&1hQ1 zl~&%O=C`1Qr57%Ut~jv{w!cFi=x`nN)LCy`_0?T}^);4TPQgMHR#0UX>6t>ZUeEg+ z&m+Yod?Gb|MH)~QYXENuIq-q-1ydk0ff`~X_>K^szz_ICn1BEU0T8$?!Y-CV+(vK` zRv;v9A@qh&fH2HsU?&g{62KiK0wM+^K}3S&B%(n|JVa^|8z8MO04+!dMu1Mq6v%kJ zIgkl*fDOn6`M?zvfIK-G9&lI^Czc zKriUi@eJsPFawW4?10B1%)t{$B!Vy60~gW&h$-MJhyXAIp$1<=1cGlMcEYz1o8dc1 z?cn<)w!jau5%>|p75oH|1b&9F2ERaTg8WB{y|99SbIuvUh^ zI++0L53IokdIuK3X7pXa7GN9T2(~Mk0Xyv7C6a-0>bL0PHPn?L!h8uwVY* zKtCEB1P%ic;D}NJII3W9Ol{zJ%kV+RC(j6<(#is-r2}UQJ_}`obIz+>!KE$Wi)V!| z>HchR8Mq3}0N0cXz;)|uT5xTxJ>J8DQun?jY1VWU728b?@2+<9mgy=~m zLA)9MkUm}@71F3ttJSndb!)Y?PD|T0wqJ7xbaW7UrLRMJJFLGWcVofZ3dk)i_@3Ox zf)R2D3s#W3*i}!iVfPJk4tC#+Tt~6lwm?lsC{BR$DX@>?y4`@*au+y6QMD(q3&o54 zPw@r=C~EREN?4GE61U@lUP}uE6kX(Fl>9CLBq$|d2&ErJf^yWM`7JOL^}qffn2UNg zScH16&j;qCNsxi2fRtz!phdHSbTn%SkLCnH(VRht<_@W7fslrl4GGZ}KvXn6#6_!w z*l7PkXtdpsjV>J;K*v;cM>K-&f(q#8;UM}2*pGhs!riZc1L#-bF#1hYLcbRr!Cq~r zgI2M3PgsHR=6nmN#Te@EfhLUKpabJ~=)w34Ix+r+UW^gw!dMD@7%QL~VHb6s8$WbKn_FRlopdXs{SFacY6*FlY4w;8o0u z;BCyxSp~d?;`%-C4d$;gD1K8I#=Kcr zf_ZDuVnX3}?32PDX+v!U{0S4`Z#LJKz(24N{%3FP1B^f|EJMDq9EHLP=!KQ|La4!z zP>o?>49gWR<3MD{MU;@k(K-eQ#xp`bJ{0n>Oen;1g#sK>gi2Ow1E2y%3RU>=KVvO^ zbM@B&xk2pMA2x8<#Cl@)_9XX+>r*F;5;rNFM=p%QSeS&F;F`-;{#Zy8*-W7)OmEagZ z3By?_c)+O8-n-9tbrHVbnhZ{|Md-y2!EyEo&ahW#$3CINe!)==2pu>ojOK)J3TK6m z+_o@=yMj|ZFws46i=uCl3*#^qT*u7fnYmEqvUS@5dvLJW5-4<~N2p;?=)s6!k{!ZC zb_yfeC5+&dFpM#aBROxPXX3V)C_~(qPYh1nR)j%GDGb3#n1PA2onRJWAXb7K*a+@o zFF1><;2!RR3#bIE@f5n@B{+w-(1k!@4B>)1LP+-N5?%fh0#|M_ZskQ75I`Ue*|1d@(VsQGP!SqEC5h|& zxbx^0uiotudk(V5utdTNYsGZ53sX>wwfuC_@zG45w&|Z974wtSI^EMdEoyvASC^GlGR)%Kw`-bn(9iK}+ae)`K)JOzhLR8IZhy*=dobr~g2`dJ1>*DN)-c z{ZtOsW9>fusoD?VSsbf2blozY^mfICYb z+Vh*wk!{|!c}GmU{B;_6a-y{jww|(jWV~)kYwCnV`IAC9iuufoNY;gR1inn=AVmEF z-W(04v7=-*;y{tJ0n^e!&H)&l03@{j_bZtBP8RbP}C087+ z+0ePzKo9+ITqrfCKCaQrlAQ52%1rLe`VI@TK2kM)?G003|cvKxpdVB|X141VOTn+8^Q!^_Gnp~oNjres<{$z66RLIhlfcbRA5mxT z5)O-6AXx+(bVe0W`>ieQmWHwx+p>SxM6f&DnH=!Y!F?srM@Jc>J1EBMpc$WoVf+r3 z2{q1?5Z;3D2?(Er@F@tNh9vW7OcfVp3aJGxHM5W6%!~M_JNF*Py;1Rd&$Mdbn&*^o)uU zp#OsOx6jBuyV>o!emPJ>qgGIVCjrCtW}wb+Vhl8@#X;IsU8hN>O2;`3S^?&S=zZKS zT$n>uX?ECP23edMwXPq%9B2XPFn+=1OCsvZK`WXxwr(u#GF8K>UoaLKjw_a3CPA*! zPwHs@$jwQ*{hb`62|;Qm;}P1jz-SB(7J=efu>_^EHE7jsS)5XJ??S;YL-y=y5=>`H z`|;L!dG@^3=@6s!D)C`lzfsXth5rgeWhK)A^ z-Ml!0#bVD=s3&A8p;v^tr`pVhS!vK{-hJaXf?#m!_H+Kp_V_7IjFi)RsZ}7nSYXuP zKAA-*v%H~roEiK3F%25KyXBjtF%P|1*RBKx@*2G=LKt(?Z+Q?}(PGLFw4?Qk90dZ+ z5gh|Y1H}jodl#o!l>Lq!4&+5?6F>%Bhlme6qt+)71dxW%As{kpV**J4=|~*{GNU#p zPy~>P(jlNSYHI>b09v#T0i99X6VHLi(l6HWaColmvx#(@ztTR)z%t4gbtP=uGu!1E z$4b$25q4!}w+zop)prqNY`zrCkFe#>Gm+VbAG)5E))#@$f)6h@onHxvf#bp!~KD13%iBO5Hjsi}!%uExL?dWMP-=fos8 z!RMCw|8FQHO9#cP{tc)wM#5I|4lZ61k_r3_<9VVI7du-qO<=+(G2WM#pU~?Qau7=x zN`B)+U~C4IY%Rv7!2Bj-$7Pfe0WjO2ox7A+!~Of>a~3sxA}0VzzyJOW)nzzK`h zur@kTpMz56O$R?Cs{BP7C_y6z|=UD-rAjxe;Ghlc|qfe znVOC&$C5({5>+bZ{KSqR%KooSt{`%-n8*Vf3YwC?)=?9~h*AuK2-Ml=W;!{iyrJ6Q z5({mRsiwpICsZUF3TA{uDh@Qa$YvfmVp~&fmYQu86(ep}Q}UCyBu&*40kKl~SMp{q zjQ@wn+>;h#=K&olt)O7`0@Va&X3$hIr{z^G684+)AeA$ zIWs2?Fi+b2h;V-o(-b#z+uCg1j5KO|e>ew{q$$zf35Zjexg#1oaLe}?7Xfsr_@lOl z;XY^_wUQY$z?*N$E#F@7{S)n81{7&-%FQ}HAXdF;V}s}i#vNpKYklH?bO{9BCu`E% zB}Tx9K$wCIRcQ=Ub@n-V4m2l4H6-`RBWNRS)`|n?fbFb=i`L2-{-ttLbjt;mj!%hh z_*&@yKT##$4F=er%-A3ZWg2)!7bZ8!yNoQ49eQK-$zgxSC zPtv3`q$9|?hypLsegC-%Mb0jlw+1!7#$-@fgOWms8#(Cg`lOyN^6oNX7w`kcURIzI zz|k2w@(q_htwVEwc8{+C1Kb?I$=rHa}n0>3iCOlR;oBnt|g zT|;g-l#kw)}G&Er~xwj;3 zj!h_7DsZpbq+L~W>bBb3aRi(F*@V6qe--y~FbCnAqX8V<5rZklAye*gGEDuK?8Nti zDEPkdP!b+!c=n^l+&4d54C%V|u+^wu4Ke5Md?i*CAvVV-ISyBkNio-DU#C*B^*}4; z_8T-Ov8eEMpG-lW-RW;Y_no16UyDBrek0t_k#%yr5sR?YKjSg8> zh;E3QZQ0t^sfZ)C=$P(wEG7pV(W*~Rdgx6khVlfrD4u$XB|{0>)Ws`x{diM6ybEWE zrhM|1@Zg{@iBl41Fr*N1-%>i;yWku=I^D>LAd?clF~9^SI?+oxMVuN;H!syRGcb3W znE&5&83q2g8M4vnuQ}y61@Pwl4te?nt+CV2N~0xvF_a53ig{$O+PAOb!wqy}p5LK7 z)qp7j`cQxduI_GcWZ7zD*MasbB=&|ay{|1_sbG9GdYX zeZVfn*>29>pqxoVx1V~Ta(k0aOLMc4^W*GK`n(K}^&cjE_G4|Mx6OS&4Bt+t)}{Is zN@sI z8yy?kbv1|L`1A|JbJSyCb;e&K;tg!~R8!)&TRDJRT-D``(^w9n99u?6gu9t~A&on;q$DqTg_^Cxadwg?aU2!Kk z@?UuRcxg<@(TsSAU0BtQuU`Lrz+rD}bw6nQ-7LA7yD~5^Ag*c+wYLHRYSXP3+Ly~v zNUQ@U<3iPB3yZyC1vItJywLowdvt8hzC>8}b5NleJo00s?^mHAaEr@yu%~Gt4~TfE zdoC}He`VWlUL45i{58^CidW*F()b5i-wJ&xvPc~FyAFr#O2)hd-}h8ft0kM8nuK`U zl1Z&O)$*7AP8FHZsX?fvq7*vobFFbdTEXeABCE}-Le6xoNEU$n1K z(?j->*p5!r0x)xe7pUv~V@A1!Z)9V+cxx#1?RD=%VP=UUpFNBr9^o6xcMMaQX?#i! zcV4wDTGGc~6jMUo8ruTz7n1BuzUQ_J%}nzk&4>I3#(xP*Tm!e#U0{Jc*L>djhvYba z%`0`fGmz!+3~#gOkC0?iW36%(*n?KaykJ{)EX@yjBXMKAN7sdVV^r=e)5;srt(2Og zn~AwW4uaJlhC^lMp6n9)MpEi1!UDwbSyhP6l~G!t#Ot`tS&CIR;H@nC_(ja%sR1BSl!l%sZ;ZEq!42LTagzd#dpXGcQA)f2S zK)-gLl{v@B8=kkc55>*^=*us3O^TcCmv1X+nuBAsr4uNlKUuaAWj05&$cYoE`(8$- zJIaTU8+}{XZJ)ngvOBf)H(?iOy^h3PKzjcD%z<9apBm zP&K$_z{tsb$MRy!jc(k167AZr{jyPp#*dBY4stiT13e_UimoCgG>(b1*IIC#$%=4Zvcf zc1Ko%^$P`u$PmMQBP62e_*#~?u~hxoz0?2zT4)urGp5}=NKFZm#P1RM#wFdU=aMGG z-6i(R_W0^QPa?$CM;y; z?7Xm1l$)>%4S@`YA(t#tpKvS?a#-X|#^8Y?ti($uvCkW)^81)7lw#?G&rAI{<#< z_;r8WC_ADT)(#(X4QO~(9VHmjP^LnneZ)e^CmYutJ2c9~*-2pfp)`mAg=$a`X$s@%-b~8JX{<{;1^}z&l@MEP zQo(P$V4f^T(ImU$TiE#%;YbpJ-9@xs>^ zV9rhftdYy)d4{-PUaFC_`r{+wig>S%)DxPOY(zg*gW2X5L3JHaUi708QCM2dB@EZ1nBipb5ns(2#s&ct?{LdkVCw`VD1 zlW1Fiu|%^DCl12OZf5dXKf(x%X3`||O)e=Hnm3*jN)v)OB3m~#ejyo6n~JsaZI>z> z<#%X@sVj|TvE1kjr)*-T^>Y9epAqcdKQ<<}i5VG+nhm|f>v@FJnmltOMqi%KHScsk zKs?UtaWqyuUxU~vfes{iyGYtAXoNDVmJ3ver8PIXHT#X)a!APV-ieSVDMfdjtaRvI z)6^G7hygn2iy7`v-3SXP#hXDn{-sc2b4IYJo~KGnbpIY_^s(NXC5%poVlaa?2*1}} zHgs`Q&u8aF>`S$VFO0q^Ad3k+Wy`nd6jwUpX6Uf9s6-pgZdI;2;^O>jeu0^Q7)U!h z@k>t=Py{j9?`B3PdREag#qAK!xXYsF;1nlTbyDiFE z25{7MxZi()uhcd?j z@O^eB^Y3wc>I5zICH9_Lf6_fC-3MA{m+OZd0PXlX3Ps< z{k@eetIU#e{D=s|f_(NklzjdG67_ zIt$_eAMuPajBy$cE*%pD7?s!ju{#AqXoUfa_uJ&^9oaH#GO4jQnj=t=wOcM zadfyVFx03!WpeaOD88kTx=5sI10N(!@uzCz8<>WeSyUn<3kViM*zk~nMiOk^vp#05}~h=p+3V|SwAV-PCD#jsxH>ktf(;S5x1zQck8)0a-#| zWC~I9_@i6VB-(FoG_JIr!y`)+weXQtrqo8=L0F`%m(2iG&U+k*QLoR#DMHn+M`Q{? zw4=g~@Zo4oG>i-DwVljEP<6;UU@!==|J$`CGaoafgGHk;lxXfyY=-n$v{L_}M58+R zdNSRH+(2U`KfJDEfouFfjwj+T4A@;4ndFsV8+T8mAk2_4CpT?44rH_}8d1?RQ@tvh zfUIY8HN!#Qt1H6{&=MpmTU5(DjbNPVDCx?SOajK;6Ofb$iPx$yq!0kl=4%=Xs8|h_ zeV9lrF^Xc0Sm=Q-RF*#CIr6!57o+9}ux6pb_!e13=di=ahJK+LV{qcr|Lrw z0a4HpB^*c2Ieqx>b-5|esLOj)DA9PQwmRtKFRfX&$)M}dSI97iKxjrSiQV4{0C6U~ zreY{_(U2mHP)JNEEy&|=@5epZ0BViy#7o&7*}S47@uTW={7<#VVaPAG16e|ZuS-FV zEBzq53WA#veH8Us%|s<+6&-q0{~jUKG7?ZC98CFw`pvTr^Gw_z_t;Pfh8|K@PFOpd z>rmc|bfCNT@hI7@l%t>p$stV5kzw=C;otkO{)ngy!Eg7QZY8p95dw0GT;$(bz_3dK zlq&B+%Nl^5g9?p}_0_Mik#9Lf=@<3QtA@t=jlzt7qmsENvZk|7M#N5nB4M`wO{!f( zXhM#hNiyI)@*?>TQkaru@-+XE3gr@WXj~pTs24tyop^l!g;j&n0va|GzvY%(VrFj# zxMR4&9y;^Q@F1v4v^vjxc2 zEm!0d1WyAkCRd~4+>w|HW4x$%h1+^%kzmF~s25T#oanx0S#Gobs5VAL*K7Kylss;I zjE4M)DEvh@o>tPABB$+QB8Kds`)B|K&xT9VIixo`svky@ChEuG?o$f!``m8m(qwO? z#MI{03a0iNjb`kKPhJbA@(pVgKbCcvQrp^;?{Ru0Pfs#LQzd9{5~4Iw;#SbPH42Jl zRdBlUmnY=;nqkO3Rm#hm=6##ot@?4_Y5q>A{YjE^vH74dUr7ZnKCah4Ro)ay%T!=^`VkSYIjz1i?yfpxn)nFbp_wvT@H#H@!oWtm*n!#!rsvLARIKJ&QJIO-hLG{007IEidb&$m(b}+{iKS_{*|X z8!Wb$b<$9hNiR=dbs_jF*lh3+LKo3w%y>2L4)7$t0tzFZvXGJq>pgQIi=(c`URfT| zB!9ktk&+k@cJ`5?<71b2Yw}nP_u%c7F+xR(z$mKSsl~_lbwt!jP!PZE@pxnBgN^@> ziMaUUBFFjXK5;vTU_MtP(Bc+reK_DGrY@*|AZtIYW$W#)-`I*{-hOdk{tw~O)f@&gK^ zp`ZxX0??IA<#*&hmN5KJZXD`bPG8HO`t%T3ZnN;V?Pv^kL=^e%Z#lZ`}k9g?JlM}cHvlMc4^2k^5!bDg=2Qm zx}B45jW*$a^NAD7=eb~7K+;jPwltyLPoi`5*v6X{#4 z5jOrbdsyUK>7&q1Y_w4P$ranko$*0i=T_!G>yqwj@H}fd;8@>uRA$o3l(hV;J=2vk zK}w`-FU1kM|6=CZ5;7CW-$rD7>CIfb|G5Wp`(VFcYq84%pssUjJ%qk1i#+WHZn@z! zDKG3XT>4&?+KF*T@v+@^Tz$YOEPih362n-$z~tH5;hlvmz_#g8&(d&KS4g2680^M) zm#vA4)f{nRDw58iwYzObk z%)7V_V7Gaie$2X9cruF+#av4J?c=)9<~-UaD-`m27gxZwcX{DwN5$OU$!3%pr&vx_ zu({ZXDN`s!1ntFqMlVU`H2H~c?lc)IDa#Y$_WP{ud+C+B{>qp3X?D#S(tQAlKo|+2 z7AK}iogZhd=bme=uHl=%Jg|Aaccx#oykRFxua4&r^ zR}I#TtonKxj6`SkUby=o&;R}Te~kMiqNZy(-fVIUk%~r6d_D~Q8D}KtQHQQ(e_EfO zn;0~f3STWO8OBQg>Qcc_wVtZ)+j#uGKVx+l6CvTE$(U$zioOyP`Wh@HtOJlsI3243 zV9FFw=5+?T-B97f8OAbGgyLTcHO(1`^~Vse0|)?!BtRg2oG^^yRW$EkOZz7tW{$%E zGr}5vB0|wV`M_S5X#Z>Oz@-+tM*!6TM$D8*%jm^h{}pE9dUZ#uloibD2lYkYJc1}F zt%+v1Tq(AKF-`2V6e2!?bOi%xSE_&4Ov6a%;|*D3Wo0%w=FEzrz!42Ov*eh4d$iiu zEbZHu=5@=%`-hnj0FG;=wR}({1b{CsUXG&=o(m;7(f;gxSR3o6BL=GONvKOSmX`tW zaQ)|8v&o?^oO9PMqmLAWZLVFpkzaDzeLvI2joZV-f9Yz^{8G zXo=T}n(5;+JwikyfUy_!4Ia|SGA^k7Ctd%OP1(<_g3B@ zVm4X#QbVI%)9N3~2oNbNTI^-YKKf6o@Y2F^bheZB8?zH(67|`4<`Wcdn0+-|$2u?* z2q`2k8;G-5^}DLe`(*aXkM?0d6Q;BJP%9~%c;dO`mVL#RKT3wg*y1*$sbs=CJwkxR z3^Tahy31JHGWm`GW9M7Xw#a-V?Y}Icg%PgD6nf=GqVLZQe#`Q_CMzJOqnbJMl(1!U zsCzHROwQ&lo*7fOZ?>#Z?H$w!A72|9ss9F7>{;2b?ZJohvTOW34>uhUyGo6AVmfJ( z5clVCvW-RGyQBvFSVT;5d7uBKWHIX{|BGlS_kHHs*go>QTfh9}B|f65Tv{M>rN0ij zc%Li3KF0UuibsVrd~N?|*Jh%>x-0S~Es1mViYlD=SantSl*#T3ja_%8s_Tv{?g=p2qtK$2mORwFUAGdFZ3<}~wORuJ)P`I$ zem}Yt5~`3wZRYMYg=hbP8p;v@5mfqsM34fiC&9>G*9R@Aw7|O7<6#nD@R8L>gcN^q z?gD7i+eS>9mL#Nb2Me~jNYP$|96qus!00n<5nOFobGwaiuhAbR6Cybmd;muzZ7{F} z6|Ewx3PKt#l7wiNX2H6RS+JUO&J;oT9*wNcppa(LfA$;NlhgE4CXJ-4^yVdr*Ec`^hET z=5n|6X)SqH3qr@!ng}TV5RmU3W&q2v0QU?zP6T-1a>TS4Hj0--bq#K7MfN815U`nc zf;ZiWn!^UfL`=X+1r^j=OBdR7#vc#A z>e~G<-p}h-6@cl^p+lqygh)G*FSkM|hRp9aUCyx*$X;@?UE&vq6o-D7uv7+&lQ~w_ zBXZ6-6`>bij#E1E%Pbg5-K?dk2Eh9y44VPG#^Vew3_UYl5^GFfm2O^T#s% ze!8T)ZF*A_;vkelr-}cIwo1}anc!^OXN;3F#*YxAF1m{UjF4TAWN--MIK;@QwHXn= ze>On6nsOaJ9vlO3BQ2w-$mI>rB^im3{SHuKnY=O!jFUwC^`$L^R3O@Z9(OqQDS^RG zu|Gly81fw^1jNtNOJ~XtKen)6k1Zbu9v;5bhWs8WaoD%}D>oRM12j&4dN{j!k3V{6 z{8EHaBC>~umZ53!AeN7jwsrfv&6nCMGU40VAkdPmZ{Pk(yjy;8Q`n=z3Eq2se5Dz$ zc+bAIGlp{9{`td5OS{9v{6ie``(Eg^m+7ciU`QtbYf)PCsTR8&V4kF!_UK> z_Nryy3@vSwqUVK|b0Ef)>-;%Q2MA;{wt!Y+l3~r{UqF~C2_fmV`Q6KGejEW59)$F; z-)kbU9SXk5Z*Ar?TTX`=;H@L>yNCeuKkSxfqylgn`>jyH?Ur#^v6}#1eL2S$vLJkB zp;tErxP6G?^iYVxq%C9lCF5o(eBAOKm#Hcj1;(3&X%|mIQEi~U?fB!fIZ#MDkIMBu z6hw^qu5?d>g$ENclEvjO`|nXw71?L;9k%yRJg=mlknLW6-w-Ro-Wn>lXDlbocS?=R zd^gOvij9m7MAPfVmu)_-3N!?~*yoqfcWn0PA9qsnDkCtC$+s~|99tHiI*se?>*qMv z^(F{iYeJ>AFHB6=+GVh#H+yAm&D=VSlpa})FWz-Aep({vUQKBn8;A3LChScO5%*DM9qBARD#y^g=tDf_1O5)vpCPj zM^q|tKKMC<&0*n(G=%lz4bIOuBPJEkj*U=oR$p;h=zXi@w&f}zz@oHP3TkAH4VU4x ztYv6~+}iZ$ps!?vNx^tcx#zFpJ18%GxFLKTq_?z;Fz--Qof0ec=(+owv=$4|TB-*W zYqKI)w9g&~gj-_-K6D10hKK^`$w7=+7Y&#z6Fj>%r!qBl&0qD@>?Wrzv;Kx~fG6{@ z0arVy#5}*5Yv4QpGz;uyZfA5E9olq=5?C3WxXJ;xRhuH7Nq7UXBV}PC^xikK^uO|k&BPG;1n^XL8#c`{kQjbdC>pHC?0zQ zt`@VhC>6v}PWyBq@%oso0N#8W1KhSrkV>zq(3p7=Y=-^{IYM;=!*lBh9MtxX( zOzYog_iu|YwsV$>(}xE)wFlVRdj7e3&kEeVOOGYeRzi?mYUkb7^Uu}v?kP9Y%9iXo zcy=SFrMTxs(7ad{62lqm5{=XV&)Nyy30iNzxCk^2yUcuVfJGEpbr6QK1d<`N@zzCx zmaw#bV#0kJOpW!qY-3@CU74ADj5b4j7`r%VnY@eqv?U|^4IH0!h3Vf^Xm9Ug2D*dQ zoiS59q7-)Aa@nEW*6j({XqN#^CMt-m+%ZPkt^+6gX^#BO0IRJa*Zo}$q6A5}T;e|< zLLdnQ_w>dUt!(kE1YQ&}{2^4ZEqmW3Mgz3gD>Vt*tNFPoBUv?sC~KmNSH!m315Y<2 zGS7O^iDN3+@H)or?cJSh0_X_UMxkNv6&c9FH#88lEdo-gnB0%2GN_q3QP)WOKqBp^ z!+7>^h(+KUfUVX<*jGlH$0Vfg`~FrH{bmsLu^Ah$yMR_!l2~61K}d^Vl{1D^-shA~ ztb(wFF{H2+dJ}Q=iLKGkbZ+_bbrJFb5hjFTrZHZrVE^(VB)9ZG1}v%^`xop!7w)oe zU#5(M>cms|TAfs{HyL2zX!tM{ng3js9=x!O=jeLwm0s3yt(Bu-PaJo8u{}U5VEFqhX4_70>0;g1 z0a$HkDqK*oK4f~cU~|+RCK+@1Vo5U#6uIIg7U|k*ggA?j&Gdoko3nV)ouxo1g%Rnk z83UkL2~5rnVvYCoRNW1Fx%UwU+?2=>48viPNRJDOFgigw`63hbD2F)1~<(@%9fz- z0sH9Z4u_p+&UjXgzJ*7zBwr}^D zDvHS%Mdvl=Q+rc-PuYQTz>%C^+TI-moqzFc&=|3(&_#`(5R1^`z}R+i&%v)f2f)N_ zK*WVo1KxGG>RXz^8tqJ1nmFuX(7$no#P)nAOz-mi-|?2A5VjW2VRhE0`yy)DbSvwL z!QmHvAXn9M;1sue><>tHUBdc8>5R_qm~Orx4Ccz7`7ZhdH?ZWX|1HZIV7(aTDwFah z?OVF$Y!PWI@JkN}FVudz1Ma0g&>_lEDSX*-q;*TvT{dU-S&97RO337~U`i3P+Uh4i zvNMySCpj5R(JGPmkM1I{$^bFlFi-H|pkA*WOkODg%{2>FITqIRj6Q&`uMXcy+guZy0WU^hEft<-Z7gT1Tqt(?L$ov5D_*8&Y zGX3Gfljv8=#Yis+5e8BBEw%dJF5386{rL;$TzlP~fz0&*#7#ZD?`*jlmg?hH&u*gU znF$w!9p)g>0g06r27#F(+ZL%D9Z=r)VoU~M`#8^P%EYd8lyE*2LLhI-+lLn@2hZ(v zk>|?d+AOB*rm?g?@`X|_TzfzbJQu3)J(8h|m25|BuP|F{ot0$Sd{<)4rDod|{aHnF zhx-8L);wz!@dNH>1~_iw?tG$dC(Jp07qMXBm68gT4D)=cj-J5ol2F;~Lf=wpjG0+2 z5!20?HC_29uuEBafosNXPy{FEaK{ZP=o_|uH#lv&2N}I712M?imgR`;CwI@7{u?XE zx-S*uY{{6T>o3;<>?nROnG!ImAjf#bTv)lq*H;3b=rI#82I{Ho_`lI8zj@RiQ68dn zX(-sA4-x-X?B(;_dDp++7lJJEX_mRZ%gyX|m>nWX3it&7Px}O7RYCUv-t)960!vQ8 zpo3^GHn^;Kw08di;P5Ugavx4JqVm8fDIxEMS+e|Cdb1{`0yHZYCVj;4XZ5Lx`(iR? zoas5;xDsS$LfI_?dL)MHw|)UH_%uYIeigs&gxtika@0rt7-eWb?x>=cl{A&pse8Yl{q3vVlWZ0y|XnS{s4b2sPw)ib~)d8LDU5;AUwx zh&3Y^^dlP~&kY>xV z3rL!kfaJ^QkPpiPfDxYk>QckC&LXo7Ih}O@*8Xg2M4>|1%qV-iiBTrD$MdbRt7;ao za|!#Kb|VC@H2AFEv(aSHG4g=JXt-KxCx(VXYb!Zy8(SyNXY3$S#sPXdvmRe%A?Umh zf$|7L7_cUL-b!f&9!z7*FCjl4bvh(NFA#rYlob41R`kTOV;3VmYX$Wi0}(n@>1S8! zxTp5hzFs(^W~+Z}XA$G9&Qvem(Hk->b-&mMT1qRN4Ry{dQGZ`h2yE3#mTfWX+Ymri zGBvau`<>tuxUT>pc$3C*@{zHS0UO4y|D4B70=iEhz+_`J_I?M0EM$>i^-wNStOEa* zx{^5T&ZeDalOiUWeJUd#Pj~ty)gr8b@6wTQbx212nJqme|jImcIP%s~)GQbAo z@JI9EOMWQ0pPdjitYxNhjFg*B@GRA(H=KcL1^;geEJZij2Arb=O`7bBoUf zUNKNg8lz?l1_=F9^VFVm`+Hyv?!BtS+d{-VIEh^<(U?cai7Y7M!%nN$95Xrn$#0wd z)J3n`(ak(oMJt{B*0luLn8AE$m^z~o@w<)M*_+UN+Sf# z65*$-md#t9zH~>9A7qK|Mv}u8ti7*&7b`z@g*JBMH1*UyP$5)kvd!uHBt$5PLpfu1 zIuGt4EA<70sn-{cJXlZ?8JPUi8Y1Mu9W6Gd^A`(9U&=co1y%>WlR*Q8D?L5 za(4i_Fxf43Veqn*fZR3aJ{4G85RPZ+Or&5BJLgW?- z*2c%_J`Mg0ZubZ65D*ITn^kiT@TZ(iT|t|O03X~m1|FM@Ot5cGoRSFio8m+m;W&x# zK3s4tWVwz>n&!2?!Q#<}zuyRYMjO{xdIdVz(WO!i*}L^guHqER-|sh3v07ppX;xL$?Uk%l@OircAJo- zN?uZGwuN9oIFYg1d(J#{WTTB}qHqZ$_V>d63ohY27~JmndPL2l=82)B#8 z-e~KE?dOad_P_3B(NUh-O??tBd49Vhu)&ZWsSZL4VBC~}EnOtjqR(x3YSP#iQrk6Q z=t?kHMwrOX)V*`2uPWxS|I`$w4w~*YVaC&0NDdG4;>I~3et3^5K)0S8Ngv-o-qzi)7DdGJ^SxWr73AtkzNn(cty0hn(A$AZrHGKrp9 zm_znw#Xc?roQnvx2l6`#Ec5DzfNTSJXn)e{V|Mi65ndp@O^%I^z_ZUm^l%=)$>tN+|M+dudu382IGj5*(b>HZ#X zgxA&|K-ID>_4&5*?$7@IAyzHqPoa(hfc3cD3&Ivs6!<#|nRIfSIXmt`igf2Y@>)Ld zwN3#l)@^$7QyV@Ja2XU!UEs1g{8Mm z#*TW7&;X+{;KZ+$F%MC;6%3d+*5_x*GXx5Qn$`h~BL_#sD|ovTs5MqA;@H6b ztz0j=FfcoANCYNyhS@k38yd5^GC`GA#c807OHyEa6XbCyfXeweMl+_PHSf-t^u%-^ z&U^+Dt~DPtvs@u^QXU@1&q|so#30SXtm*A$BfJp&2)&i9}Jp^&=@Y z!dJNO22^dugvxy^jJ~$>+M=}$qa)EJTm?G|vOFrUotaOMQ}(2EAjy1&Li1II=LPI4 zQE0AkKo0N_Fbse*WJpAZ#%PatNI6C)PY(moinja|b|!H;3q)9@BHP^GdPMjNGEJ;o zU^=dxqYj2R%VC2|-4O9(RV^z@Ia=)pup3lCene!U@Qm#%#@ySA){cG&I|$9-&Q`H@ zH_t3KJ=mmx++}4FQb{qW0VmjCD}{n~Q39PgAc;a2zP5$YLDt9brsrkZ#C&}IA@M)B z;#~uP9JGp}vep5HZYs@Ox+}9h^O<9DOChgJ0c;z9T|>|crc`$g#)YjSeaG^LsYQCD?HRcOd`&?J@>$q1i?_Mdke81 zJXCnrs4XS%Qy_46v*T=M&m%+9U9WSksXht~YV#)lN#z@o%4e{+uy6RkAs4d^IZ>%u zMyxSY)7l0^bW$d>XRDcd_UZDo5tU-$`s$?h!Ub#51*-NVtA_qMlEXA`f0I7d{=q~U zFiq`>*-yNeCFitgWhZ*u{WbeCHW+@4LIE zWOEZI9D&w3gWwC?ly=cm(d zcYC`2aX($_FX!Dcq*i4}bdVF31A*xbQ(_qF#y#h%G;Tea^pEp&$3aH0dW!kX#w0Nv z;e=P|Dq8a8yk7fm%*W_SjD0(NNrM5oy>?JFOvJX)PoryuBXRly4gwBLtaUO~)7H`8{2k5yBR*UPzl+GeB)~sRhkQr_9 zto7TYIRN3|bT(Wg(|Luf|)pjJe# z$UHTf>a=2-j&T9*#%h0bRg>@?39*>fLvt+nE63a(z_S>wl#cuA?$dsT%2_*XQWMh` zc6Our^PZlU)rxITN(+hdSvo5bQ022joEk?Y?*MRzs4V>RTb&~7*HW+oDQFm8$Q61( zn6cD(8HF6CUZ(*w1(+CGWYq5?3L9c|&@1{im0EM{N*+lz?+#NkUeq1?WziR+Xly04&OGhGeK4NIJ$>1=F0Zs$lYohx&lke`+jJ zS2*T5f%dMjBoWEc&IQ~5p4uc}0=LY#3iLG9cuNJIY%2OcW}*rwt0EGtgUdXLZ52BO zl#SuRYN~p>);7K7+%1wgLSEV2M{fQ2vD!xsxLx^tE&Xs77c-H=R zh^taHtH!h}f8Pm6LM})Y$}$*$6f}G_fKB^&$FdWNc4FZ(%(R?*FR3XvPo(GbxO)Vg zvh7_PIZd2TE;Sz1L(Yt9(YQt-F{naQx7LE}>WLo7T#fUA2v<%|A(4oTz$tOQc~5M} z#wQozGFWer!7yhVa71=eAmJ=%m?NWBSv?Jyvw_6C!f4|+(~ny?V9ykl383KaHZBIY zkpQO#};gv$Gsb3Ek0R_+)YF{tTu}zm) ziEmURj9Yc({&}MZJgBNf8XDEfX(S!j-0a*i;UtR?{4yvY*}79=I=`!{oR6j#nNBP5 z%kZdLI3!}9XAjmm#?yOE9v=q=B;!NNQ?a7|Q7kVro5sAsEe;uE3YU5qLrE(POEVQh zWeCRB42rj6T$Ehns1FlpHCht2wU*UNd9=$%A1sYrE6(CIc4bVE@ZZ9-n?Z9-h}&5=y2sD&m@(6Jd-8#K%;2ps3_F2XN`<8!u8=HZO<6ROV6 zb2RjRYFgBio^o@u2_5EwHJMJ=QJKj=vV5|ZVA~`|nk*uT$0{IfVf*PcuDhwiv_AJs zcFaX=uD@zUf?2!RS>N9+L2?;DwBP}Yj_?-uR@PP{dJN42pJ;3e%!K!>3$@x_fQsm$ z$;u-T%sgfo7;{1a92~rgg9NWWLTPlO+G;n%lqrrj6@E% zcpS_d_x51owkkt1-OE3`S9wLuGc*d$(>==x$40<5L3=G!pHB`>a7l^$1>< z?emM1*a66R^9;wzS3@IlDGXt|8fx5RQ|Lk~qb6cm;_OK>AXq>y;8Or9|Fey@KDIA; zfb6&=I2eut-;DCKoC9|GUu?WZ-70CXsTvr#u5XLp96%jDyIeLf z;Z^ge2B)BDl9O^7O=uB|3gvNQ#G(e4h=tgg4e4PpH~7_rs0NAzHd2FE;|I#aR+>$3YM=%Nw&hMu=Q4p%!$%XMmG#2dN6j9yq9tG0@|3(9h%-ZQ zriT_-I$(=ME;2&s^B}ZYh}&Trf-BGL{(WtVc|&K<2J6lgwizB1r9^63L{9*Mm{szc zlBe|%kB?QAWg1K^(1`7CEB!GM31KTQD;;NwFX@=|gP~|;BG4Ho1Tp|tZbpDxo2U)2 z5Q!4N7zj3Z%X<7vlHfDM2`1QK;*cL?J?34Amf!!6wNQ5Hw#6UlBOPdfthR?X-4UwA zD?OoMgpj3#3_DlTscyIkA-M))1A14$NERCwmzPU~y-ZO-h84ht=O7})%!}78Sh*S%*QmyRg|@ylGOkzSlaKtR@236h(lfw$nQBM#?F8#ahLLFVC61>n_9zu5yY454Rla` zbd0=Yj30u|pe%PrpG+&WYQ9D!2||Xj$v89?Fhb36R2BkZknTgC!6W%1s%}KM-lQ6P zWVkP5{mmCgK>+T5zJt*w2>2#~8R2Fg&>+;(TD>J=EEjn?n1Fv&^9&>!7j`s2P2bi>h=6bkNl4~!Mnh&OMkUKnf#>=;twhGj5`@O>~S zOot}Dau&%~+en$jLjgNLK$kUi{`EsF8-5j55)}dv?}WqPYe) z(dhnCjezQEUPecwjq07)yH5mWUUtfzZ)&!w=~ZSo_x ztXy<+a@s|+`%~3-g*ktK_QZ{3fIp=g*zTP#Z+M*Sj$L@PFZn;mcX`U0o? ziNh-yF?#80N^kzkug-SvD~krRQ%4nGg1-nO26miBMtTyt7!sqmORS?4kU<`29Mlx7U`P3gYH+6y z{rQGHrT6PwIBzA5W{iAt3>*aVX}lVB^6?HK#p71V+hlEO+ZB4x8)zowrg|`NVIQzP z#k6S@vZZ&G^?IB@ zlcGM#UZfC~xMi()X*a`b^?!ppnWnw6LPBMLXDW>rEVYo{fv7>=u;LrO?#1gHj;Z_(Cnb^#~t{T)`W@9$M55x345kJ?7~Kuyru+Yz7-+>dn(dPPvDK5X-BW9<5gb zx*L9&!FyS`i)_OmY|nN5di0=v6i4po+D7@reEDk3^RjLzFHd=?+4l;tp<>3RY|T+o zaK3N!6to}Py9+ib$x{Ks{3Hd@illA>T5gF!{&LmC zlW66H_a{UpbdwhjQ^;$25_Hwflh68J>?m7>Aqaz&Fy;L@so(OR-&dZD`b5u%VIji2 zWrXc$Szlg2Pm-y&jkYw+O%Y{b)5yOyhMIsPXkkK$S&8ni zY*4h|SRm;{%~HnhJpe`+K12QlgVDTB2|mFX zpmi>;_TwoGUszr0xiV)zwvK@*DqkNt(|&~3G0+2rd&yLx77DaQpoz5L@ed#f5a9xV zR)#>|d*9@7;(3@Us}nV@Z73)dGh!4oY8FZ@CVq?)!gg#x9sllm9<|+{T-5t#3A^ z|JC|>ehr+nRkYC%bOK+0=NUiVb8k8i`_)$A&ARzrPVC24k3a`E@WF#Y8|p-&GyqKo zdm)X$i8(}7G#wiS6M;8Tn1r81tU05TO;F=%gKB3?jZ4M6=VcGg(U^!=6;!_gque!?DmmqB!?yRGPW#b2)!g+Pcw5z8(3<3-}Qs+sb*~`ddWpD20x_3eX~Z z8@yA4MEO)FOUcWhA8(e`D_Opu#3n7?6d9X-x0zntcjl^n--8NvSy4|-=HCEkizv=u zBHxRp8#Ql6*TSl-W~k(O^3P$CtYVt$G%zpJFt-6gO1@0SdmS1FxZ{Lr1}U{_R;s;+ zY2G&9O!3GaFSdawClc3mL|kT-^BH~t=#J6AT?gzp?0cfH{0C;77f?mI5zF2!{)rV5~PkHJ`MvN7G?w^MGSlGYZgo6zS7q*=#L_$ zrtfl-J(;R1=2}{p6phCB4_c+X9CPaxP0mx*-%&$*!{*28!(C^JD6dV-kT*$Iv@TQX zX2fdr$nDdb;XF=0H}s=UhMSJ+j`BLmr5v9Q2l^LN=eY#kn5iEDGV#50L-8)hBi7Wm z6Vz{(SzeH7t7U25-!^zM+g%4S{TGI>wwVR-|CvBJTCJ-?P)k7phe2sd+Y{%pr}63O zu-mNu+EC`nJ1`Z|_L-1|k5>63OUC5)6sfRn`)(5fflp10o`E0vOkg6ubQkJxIN*iP zu9K|Re?`_^scn>NW|~}=iGKyp5|$M1ED9V#8;3jAQQn|L4IwO1m*_Y-sQP1 z(qy0TG*gtJHi2KIXOWLW-QD^cB>1-~TO2{ekt#IJTvyXEq99^JaZSDx@l~h~YJM|Y z)}@JpGCpm}mOZWCsr`VV&Imb9JXGSC4mo@)!4{iWpjIb=I=%um22qsv=iq0RWOMK* zZ+T^QiZDwkJhT&*gatc03vIR*w>1k%9su@7W}v|Aok;|az`*aKu^{Q=1 z&3Nt}jr&t*5=UY1_xsw%>v5y%kOoSFpCKJG(@`^`i}8VAk+%&Mw%TcwKdm@cf`(vJ z8e<_tqklb_@t;g867sk#CXGrW;;<<2*q3?eo4Ux8IPe|Y&=pzW$-$(1I#Pkk8Sb32 z%{;vvF(ajBR1S;C+BO%f8lJIu@aOay5KHi3z(@}k_4C7aSyy=$N4^I{!aRcjcf5jf zGZ5zDD08dHq9>6Kct6R{Q8)!^_r^nCe%>z2P*Hl^rJ7|Znh|goy%d^S0Nkbq@e=4* zi4HV6))5O~1~Ct@pP5NFsTQ?$4mYQ&B+@9*3oeEsT9$B_fu2HuvW_x%tQQ59?Pv#y za0qwv5|jW}$<#^FPM}N@uoOS4M>)SNosX85*Ny>v?URJ606c0f2?Z!wHAg$$%XOGvN1($Xp3}{g4#JvTjJ8UIo*IXX`}l(m>ih+0~8 z)B^pT0l1m#oXq7CGSH^L$D7vwGPCl#U^=S;M+4)?_c3={2g1>hsnV-v@ zBh*jTr&#@pw1*)qyY(Z-?uO?qH4j?fSN+{c{he1%hK-Ql@bNbAe>YNZ@ZY5E^#3Y; zxY@Yi8|V+wy|wyI$IX7zj5^2sj-U)0Ghbbz_x>6p?}_oPfv;uC!rTfW00$!e&-3_x zjpCZqZRM#?lcNvX(MlZlN27P~2Dm^>86h_qBYAw{qgep-xL?li*K^KCn}BvN!vjhbQIFzF}gSV^}uD?%Sln)L~|+Pdr}ShD=fgM zh5X(!E3?D_drEcH+Kkwb0HcH*C@awhizT1iT~ia;oL70_m1Q!I6n6nyF=NPX(gl$- z877yE`j5h@>jE2BzJ1 zsW4NI0#Sg1s{wJbx_Ww!S>@KZd#Ro3wQDg{)yr{T zM62(X{Dam*7-gmAXdj9kik&l#xP(YBC3*&guS0r@QWoF?eunPOt?W9)2o^VxTcM(f zyMhO%$ypl2-X%OzaWkNBQ2_M_~f4af> zm!?tc^kxpBs~Tl7}NASX#{7ASw9+| z)u#G3n%gSOoB@`|U}2yqjtEhX7)|WK0*rtwXoN+n;59Kjq7~m8l^}VBe$1pvUT%4j zk8eRI(+DUEsOi#--j7x!5PrR&mLPJ`W53B08S@hq4sz9UKQ8D3c(M_H(3ruW4uF2r|wk(tLg(D@{ZcS!i;q2eW!NCqqnSLN+HG*SB zE7wqxD6_;>poJL6K?J7Pd!Z=;D|`l?X<;tR^||$;=`OU>G9I>MG1O>Eu{mq%U}#{f z_HPUjgkS*?BEPj&P`to}E0moFpF1(Y2t>FrN01hiG39KJ(npP+kfMD0iSm8tih_jvW(G4Bb>yzDU;MY zL?6zeIo4{V8Eh^ghC?sWh;dYhSg#?bsS$&aR+_hs(qk@+O=K!aUo?XTmXTD%&W=a} zVjxHCl;$yQJ=)gVEY59vUsV6-Ma<8Ug}po(AA$Og`{o(2u&P;F{X_(hFuOx8)&O8A^s8Ln-3$>Cb& zU8z;OAds8eDnrWTNHlzlaN4>pe7mPkLz)|TH}ucfNF%^+&7cwUNN=0GDyY?K5Vqm7UsodrClr@ES!(TETG1 z>WxY7!eC#x*LBfI>xUzy{|Z#GL-igW@x0XMF5j^Q@#xp#;Qi#(sJydC8O98r=~zeE z7XN!gGzjn&pYtOQ10-gt(~Z2}eUgNLY!&J|X1)S;!@u?SLIEx(F~G?SyiEly#GE)U z!j=Uuj+&m*QtWw6%P?g~E3jl(D=}lm_ga)}Aw$TGAe-3*30yfZ33H*442`gn99NMc z1#K;~5~~Rr5+tt52uI09Ca9zcnc^&!y<1``wN>-``>*_7{>q>BJf7Zu0&ZsyU)PDe zh}@OnxcYDP@sTuLe$c%915u2eclP^_R;R1)zFHZ1-~V5!_3G#6JBU_Ye|lfs7cC}U z0XCTIX#m=Tofz`R|2xR@YvLfMA4v^4@9!JW1?)iU^&XAz^_m~**p(mdSCqY9Ww)Uf zmC2D$rAVd>g$r>rr^yl}Z2p_2QmRt5P7M}nQ;;sv=}S|;)vHWis!E6kwHDE|KvZ9}NHGkV%)`pQ zN)5X9`a1M#LP(|DbGDo)Q?pJ@^xE{wbq3mXsI@s&t5%JL5WDAMhyepL7lo+OmXuwg zj>aM(%1xWKskdtO60`dxy#hWqu#QE3R^b1KGsQ=V?blSEmrG{>ck`L79c|LXUBF&7rXk`-$%KPCTuZG?FlC+vl1XJL+Ne+z zwPYu9geXS7_X81%k5qxNXs?5e0ZSQ(PTyGU-CcFpQ!mf{fnD|IpKcEOzetyekbuPw zqt$SHN^&wLQdMgMkx|hxv2pPUiAl*RscGpMnOWI6xq0~og+;|BrDf$6l~vU>VzqVk z4UJ9BEv;?s9i3g>J-vPX1A{}uBco&E6O&WZGqWg$6C_15EXNC?BrB>$X5UXm-7qcN zaXmi>qc};kyeO->X}f+Hr}O1{yFZ?<_lH%#fQ*5TiD1i5c=_+|@Bc!TNeC-{`N&{! za`^?x|H1OaGcSDSbh$l!y4U9q1dUKQ5{<=8E0Ij4Gud3eP%M=zcC}V-G+XUXw>PSP zfB+x_BPfOwBt=Lca#FJmyH4KTH;o7QrY3mz0*3S5#J2*VNY4 zH#BZiA$|<$5N%XW%jz{Vt@22(RBc1aAoBn&OQX*F+ z2;<=T=g(W*L*b+o?f!Fr+?PS*Y>>KYs%1U9CHP+Qg7>)c1BQjP7nR4vXdCnm+(ITLa@p3l>`KbM|0N~*nBp!qA zbPyRj;2_Jl&;#<4 zoB+jeszg$VA=8nmPm0GyA_AL!!BejWg1S>$g>Ks1ehXe=D1l>sgy7)Qq>8%@ktETy zPiVs;*ksGbKAPcEkttvtgHz|oeD^P&R1;jT75z$D(W#%Q4sdnvS@ zVERpPr)%06oxx;na(C()>@UNJQZdTGi%nwmZRF7Zw^q42nGq=c)Zc!2%^c30TST982OFnq(17NrjOyjafxDRt&K_j|^qJfOCel zp~0z!*li64_8Km6x@s+XrWTGeW-AN`i(Wn@OtQfTx{!&*&hstV21oSdE0|eFyV?h+ z!lSD4%^IE)^^T<5?hM!M4rak!dl}=p)S!<=BLyCupxK-AlAD1BU+O@~%9}7#_ zSpo*y*Y_5MWdy9pzOyUbm)296VgGA&O8n-IBimT}SzfWRVr@k_-l(IPY00(aQ|DN9 z?G)V$tN4X;#Cz>HH}A#h9ZCOx!hORY`LBQFEGLBS+RXoVgG!=%Yde*h2E3lh#lv~^ PMMw9F)vu#F2><{9Z{Nxq literal 0 HcmV?d00001 diff --git a/assets/grid/black.png b/assets/grid/black.png new file mode 100644 index 0000000000000000000000000000000000000000..a0bee5c2d20845e597f1679d594602e1f4fe8577 GIT binary patch literal 120 zcmeAS@N?(olHy`uVBq!ia0vp^nLzBv$P6SUpRW22q}T#{LR^6~5G+mKc^*hHmIV0) zGdMiEkp|=_c)B=-R4^tpF!8YoBrrW{Q#>I1^q)K1;Zx0v?_B)C!{G75`F=%EbRx(A MPgg&ebxsLQ0Br*yNdN!< literal 0 HcmV?d00001 diff --git a/assets/grid/black@2x.png b/assets/grid/black@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..2434448ae8e1ac6f3e0bfc8c986e423ed30ce921 GIT binary patch literal 141 zcmeAS@N?(olHy`uVBq!ia0vp^mw|=QfvV}A+A6g2$rVrJP)K8OM?7@ z862M7NCR?AJzX3_Dj1U*nwWVw4m7K=WNhc-WnfTHV0dS5%H5zcw@Se-xo6|%jTzb7 ij@wHn_ZS|V@n@#Zuh0{(zH`KaO!aj2b6Mw<&;$Uy9w(*% literal 0 HcmV?d00001 diff --git a/assets/grid/green.png b/assets/grid/green.png new file mode 100644 index 0000000000000000000000000000000000000000..46de76e82230e31ba791cf50e13849674eb17ed9 GIT binary patch literal 120 zcmeAS@N?(olHy`uVBq!ia0vp^nLzBv$P6SUpRW22q}T#{LR^8g$KGDa9|=QfvV}A+A8$V{flykJo)5i?Jlg zFPOpM*^M+H$JEosF{FYqsiBFPhvPuA8cW7@K3)a}1qFt8_NLqoDs!t8?2>ynZr+%Y kz3sTYWO9$;u^E46+WZPV@#;HAEYJW3Pgg&ebxsLQ01AC5asU7T literal 0 HcmV?d00001 diff --git a/assets/grid/lila.png b/assets/grid/lila.png new file mode 100644 index 0000000000000000000000000000000000000000..14d963ac045706b6d88b91c7e0ae78a01947be73 GIT binary patch literal 120 zcmeAS@N?(olHy`uVBq!ia0vp^nLzBv$P6SUpRW22q}T#{LR^7#6T|K&sS&St? ze!&b5&u*jvISQUGjv*C{$qY<gTe~DWM4f*t8|=QfvV}A+A8WiQ#|Nm6>aREXI-` zzhDN3XE)M-98*sh$B+ufq=qJD9*zUeYAhMs`FI%^6ciZV*_(1VsLZWWuuJaQxOrnn l_O|2plF2=W$7cMQY4a=e#H;Tdu|NYDJYD@<);T3K0RTo0DHZ?# literal 0 HcmV?d00001 diff --git a/assets/grid/orange.png b/assets/grid/orange.png new file mode 100644 index 0000000000000000000000000000000000000000..92175085a81b5ca6e8f842a3fd0aad08aca374f9 GIT binary patch literal 120 zcmeAS@N?(olHy`uVBq!ia0vp^nLzBv$P6SUpRW22q}T#{LR^9L|8xdJ=K?1ni?Jlg zFPOpM*^M+HN5Rv@F{FYqnSqIqO(22kQJdlc*{A>9*$$s-UVP``7aj(WAI|qHf}#_F PY8gCT{an^LB{Ts5aN{9C literal 0 HcmV?d00001 diff --git a/assets/grid/orange@2x.png b/assets/grid/orange@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..638e09bdaeceee05b5aba202a1dc641e11ccbdbd GIT binary patch literal 141 zcmeAS@N?(olHy`uVBq!ia0vp^mw|=QfvV}A+A9Be>#JqbAc0(#aI&L z7tG-B>_!@pW9sSR7*fHQ)X>Dt!*QTljU{6{A1?!gf&#-kdsFTPmAO?4cF8>(H*d_y k-gewxGP%d_*o;3jZGMHGc=eql7H9y2r>mdKI;Vst0KZlzo&W#< literal 0 HcmV?d00001 diff --git a/assets/grid/pink.png b/assets/grid/pink.png new file mode 100644 index 0000000000000000000000000000000000000000..5e5920f7ce18adc86144d1a3c5523f449a4fee09 GIT binary patch literal 120 zcmeAS@N?(olHy`uVBq!ia0vp^nLzBv$P6SUpRW22q}T#{LR^9Le}?~Nf0Nb&S&St? ze!&b5&u*jvISQUGjv*C{$qY<gTe~DWM4f>=h#S literal 0 HcmV?d00001 diff --git a/assets/grid/pink@2x.png b/assets/grid/pink@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..9ce79e16dd5efb91bce325130bc342b81fb70165 GIT binary patch literal 141 zcmeAS@N?(olHy`uVBq!ia0vp^mw|=QfvV}A+A9BKf`~sze($XEXI-` zzhDN3XE)M-98*sh$B+ufq=qJD9*zUeYAhMs`FI%^6ciZV*_(1VsLZWWuuJaQxOrnn l_O|2plF2=W$7cMQY4a=e#H;Tdu|NYDJYD@<);T3K0RUcwDO3Oe literal 0 HcmV?d00001 diff --git a/assets/grid/white.png b/assets/grid/white.png new file mode 100644 index 0000000000000000000000000000000000000000..a86b6f8685ad7a30c707984338564a4dd80c35db GIT binary patch literal 120 zcmeAS@N?(olHy`uVBq!ia0vp^nLzBv$P6SUpRW22q}T#{LR^9L$G5M~W{On;S&St? ze!&b5&u*jvISQUGjv*C{$qY<gTe~DWM4f1v(=` literal 0 HcmV?d00001 diff --git a/assets/grid/white@2x.png b/assets/grid/white@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..bdf175a6f3e529eee6a07177ceeb5b65180f22bb GIT binary patch literal 141 zcmeAS@N?(olHy`uVBq!ia0vp^mw|=QfvV}A+A9B=e&&(this.perPage=this.config.perPage[e])}}},{key:"prev",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1,t=arguments[1];if(!(this.innerElements.length<=this.perPage)){var i=this.currentSlide;if(this.config.loop){if(this.currentSlide-e<0){this.disableTransition();var r=this.currentSlide+this.innerElements.length,n=this.perPage,s=r+n,l=(this.config.rtl?1:-1)*s*(this.selectorWidth/this.perPage),o=this.config.draggable?this.drag.endX-this.drag.startX:0;this.sliderFrame.style[this.transformProperty]="translate3d("+(l+o)+"px, 0, 0)",this.currentSlide=r-e}else this.currentSlide=this.currentSlide-e}else this.currentSlide=Math.max(this.currentSlide-e,0);i!==this.currentSlide&&(this.slideToCurrent(this.config.loop),this.config.onChange.call(this),t&&t.call(this))}}},{key:"next",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1,t=arguments[1];if(!(this.innerElements.length<=this.perPage)){var i=this.currentSlide;if(this.config.loop){if(this.currentSlide+e>this.innerElements.length-this.perPage){this.disableTransition();var r=this.currentSlide-this.innerElements.length,n=this.perPage,s=r+n,l=(this.config.rtl?1:-1)*s*(this.selectorWidth/this.perPage),o=this.config.draggable?this.drag.endX-this.drag.startX:0;this.sliderFrame.style[this.transformProperty]="translate3d("+(l+o)+"px, 0, 0)",this.currentSlide=r+e}else this.currentSlide=this.currentSlide+e}else this.currentSlide=Math.min(this.currentSlide+e,this.innerElements.length-this.perPage);i!==this.currentSlide&&(this.slideToCurrent(this.config.loop),this.config.onChange.call(this),t&&t.call(this))}}},{key:"disableTransition",value:function(){this.sliderFrame.style.webkitTransition="all 0ms "+this.config.easing,this.sliderFrame.style.transition="all 0ms "+this.config.easing}},{key:"enableTransition",value:function(){this.sliderFrame.style.webkitTransition="all "+this.config.duration+"ms "+this.config.easing,this.sliderFrame.style.transition="all "+this.config.duration+"ms "+this.config.easing}},{key:"goTo",value:function(e,t){if(!(this.innerElements.length<=this.perPage)){var i=this.currentSlide;this.currentSlide=this.config.loop?e%this.innerElements.length:Math.min(Math.max(e,0),this.innerElements.length-this.perPage),i!==this.currentSlide&&(this.slideToCurrent(),this.config.onChange.call(this),t&&t.call(this))}}},{key:"slideToCurrent",value:function(e){var t=this,i=this.config.loop?this.currentSlide+this.perPage:this.currentSlide,r=(this.config.rtl?1:-1)*i*(this.selectorWidth/this.perPage);e?requestAnimationFrame(function(){requestAnimationFrame(function(){t.enableTransition(),t.sliderFrame.style[t.transformProperty]="translate3d("+r+"px, 0, 0)"})}):this.sliderFrame.style[this.transformProperty]="translate3d("+r+"px, 0, 0)"}},{key:"updateAfterDrag",value:function(){var e=(this.config.rtl?-1:1)*(this.drag.endX-this.drag.startX),t=Math.abs(e),i=this.config.multipleDrag?Math.ceil(t/(this.selectorWidth/this.perPage)):1,r=e>0&&this.currentSlide-i<0,n=e<0&&this.currentSlide+i>this.innerElements.length-this.perPage;e>0&&t>this.config.threshold&&this.innerElements.length>this.perPage?this.prev(i):e<0&&t>this.config.threshold&&this.innerElements.length>this.perPage&&this.next(i),this.slideToCurrent(r||n)}},{key:"resizeHandler",value:function(){this.resolveSlidesNumber(),this.currentSlide+this.perPage>this.innerElements.length&&(this.currentSlide=this.innerElements.length<=this.perPage?0:this.innerElements.length-this.perPage),this.selectorWidth=this.selector.offsetWidth,this.buildSliderFrame()}},{key:"clearDrag",value:function(){this.drag={startX:0,endX:0,startY:0,letItGo:null,preventClick:this.drag.preventClick}}},{key:"touchstartHandler",value:function(e){-1!==["TEXTAREA","OPTION","INPUT","SELECT"].indexOf(e.target.nodeName)||(e.stopPropagation(),this.pointerDown=!0,this.drag.startX=e.touches[0].pageX,this.drag.startY=e.touches[0].pageY)}},{key:"touchendHandler",value:function(e){e.stopPropagation(),this.pointerDown=!1,this.enableTransition(),this.drag.endX&&this.updateAfterDrag(),this.clearDrag()}},{key:"touchmoveHandler",value:function(e){if(e.stopPropagation(),null===this.drag.letItGo&&(this.drag.letItGo=Math.abs(this.drag.startY-e.touches[0].pageY)=this.innerElements.length)throw new Error("Item to remove doesn't exist 😭");var i=ethis.innerElements.length+1)throw new Error("Unable to inset it at this index 😭");if(-1!==this.innerElements.indexOf(e))throw new Error("The same item in a carousel? Really? Nope 😭");var r=t<=this.currentSlide>0&&this.innerElements.length;this.currentSlide=r?this.currentSlide+1:this.currentSlide,this.innerElements.splice(t,0,e),this.buildSliderFrame(),i&&i.call(this)}},{key:"prepend",value:function(e,t){this.insert(e,0),t&&t.call(this)}},{key:"append",value:function(e,t){this.insert(e,this.innerElements.length+1),t&&t.call(this)}},{key:"destroy",value:function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],t=arguments[1];if(this.detachEvents(),this.selector.style.cursor="auto",e){for(var i=document.createDocumentFragment(),r=0;r .column { grid-column: span var(--span); display: grid } +.grid img { width: 100%; max-width: 100% } + +.border-top { border-top: 1px solid var(--black) } + +.leading-none { line-height: 1 } + +.font-kobata { font-family: Kobata !important; font-weight: normal } +.font-vg5000 { font-family: VG5000 !important } + +.text-center { text-align: center } +.align-self-center { align-self: center } + +code { font-family: Kobata !important; font-weight: normal } + +.bg-white-white, .bg-white-pink, .bg-white-green, .bg-white-lila, .bg-white-orange, .bg-white-black { background-color: var(--white) } +.bg-pink-white, .bg-pink-pink, .bg-pink-green, .bg-pink-lila, .bg-pink-orange, .bg-pink-black { background-color: var(--pink) } +.bg-green-white, .bg-green-pink, .bg-green-green, .bg-green-lila, .bg-green-orange, .bg-green-black { background-color: var(--green) } +.bg-lila-white, .bg-lila-pink, .bg-lila-green, .bg-lila-lila, .bg-lila-orange, .bg-lila-black { background-color: var(--lila) } +.bg-orange-white, .bg-orange-pink, .bg-orange-green, .bg-orange-lila, .bg-orange-orange, .bg-orange-black { background-color: var(--orange) } +.bg-black-white, .bg-black-pink, .bg-black-green, .bg-black-lila, .bg-black-orange, .bg-black-black { background-color: var(--black) } + +.bg-white-white, .bg-pink-white, .bg-green-white, .bg-lila-white, .bg-orange-white, .bg-black-white { background-image: url("/assets/grid/white.png") } +.bg-white-pink, .bg-pink-pink, .bg-green-pink, .bg-lila-pink, .bg-orange-pink, .bg-black-pink { background-image: url("/assets/grid/pink.png") } +.bg-white-green, .bg-pink-green, .bg-green-green, .bg-lila-green, .bg-orange-green, .bg-black-green { background-image: url("/assets/grid/green.png") } +.bg-white-lila, .bg-pink-lila, .bg-green-lila, .bg-lila-lila, .bg-orange-lila, .bg-black-lila { background-image: url("/assets/grid/lila.png") } +.bg-white-orange, .bg-pink-orange, .bg-green-orange, .bg-lila-orange, .bg-orange-orange, .bg-black-orange { background-image: url("/assets/grid/orange.png") } +.bg-white-black, .bg-pink-black, .bg-green-black, .bg-lila-black, .bg-orange-black, .bg-black-black { background-image: url("/assets/grid/black.png") } + +@media (min-resolution: 2x) { + .bg-white-white, .bg-pink-white, .bg-green-white, .bg-lila-white, .bg-orange-white, .bg-black-white { background-image: url("/assets/grid/white@2x.png"); background-size: 105px 78px } + .bg-white-pink, .bg-pink-pink, .bg-green-pink, .bg-lila-pink, .bg-orange-pink, .bg-black-pink { background-image: url("/assets/grid/pink@2x.png"); background-size: 105px 78px } + .bg-white-green, .bg-pink-green, .bg-green-green, .bg-lila-green, .bg-orange-green, .bg-black-green { background-image: url("/assets/grid/green@2x.png"); background-size: 105px 78px } + .bg-white-lila, .bg-pink-lila, .bg-green-lila, .bg-lila-lila, .bg-orange-lila, .bg-black-lila { background-image: url("/assets/grid/lila@2x.png"); background-size: 105px 78px } + .bg-white-orange, .bg-pink-orange, .bg-green-orange, .bg-lila-orange, .bg-orange-orange, .bg-black-orange { background-image: url("/assets/grid/orange@2x.png"); background-size: 105px 78px } + .bg-white-black, .bg-pink-black, .bg-green-black, .bg-lila-black, .bg-orange-black, .bg-black-black { background-image: url("/assets/grid/black@2x.png"); background-size: 105px 78px } +} + +.container { padding: 22pt } + +.link { text-decoration: none; color: var(--black) } +.link:hover { color: var(--lila) } + +.no-button { border: none; background: transparent; margin: 0; padding: 0 } +.no-button:hover { cursor: pointer } + +.embed .iframe { display: none } +.embed .iframe.active { padding:56.25% 0 0 0; position:relative } +.embed .iframe.active iframe { position:absolute; top:0; left:0; width:100%; height:100% } +.embed div { position: relative; } +.embed video { width: 100%; } +.embeded-iframe { border: none; width: 100% } + +.calendar-entry { display: grid; grid-template-columns: 199pt 508pt } + +.menu-button { display: none; width: 47px; height: 48px; flex-direction: column; justify-content: center; box-sizing: content-box } +.menu-button div { width: 47px; height: 7px; background: var(--black) } +.menu-button:hover { color: var(--lila) } +.menu-button:hover div { background: var(--lila) } + +#menu-container { width: 498px; position: absolute; left: 0; top: 0; bottom: 0; pointer-events: none; } +#menu-container button, #menu-container a { pointer-events: initial } +nav { display: none } +nav { height: 100%; padding-top: 89pt !important; justify-content: space-between; flex-direction: column; box-sizing: border-box; } +nav > div { margin-left: -2px } + +#lang-switch { position: absolute; top: -3px; right: 0 } + +footer { background: var(--white) } + +.embed-btn { display:block; position:absolute !important; top:0; right:0; bottom:0; left:0; z-index:1; background-position:50%; background-size: 15.5% auto; background-repeat:no-repeat; background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 13 8'%3E%3Crect fill='rgba(0,0,0,.65)' width='13' height='8' rx='1' ry='1'/%3E%3Cpolygon fill='%23fff' points='5 6 9 4 5 2'/%3E%3C/svg%3E") } +.embed-btn:hover { cursor: pointer; background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 13 8'%3E%3Crect fill='%231AB7EA' width='13' height='8' rx='1' ry='1'/%3E%3Cpolygon fill='%23fff' points='5 6 9 4 5 2'/%3E%3C/svg%3E") } +.embed-btn.yt { background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 68 48'%3E%3Cpath fill='%23212121' fill-opacity='.8' d='M66.52,7.74c-0.78-2.93-2.49-5.41-5.42-6.19C55.79,.13,34,0,34,0S12.21,.13,6.9,1.55 C3.97,2.33,2.27,4.81,1.48,7.74C0.06,13.05,0,24,0,24s0.06,10.95,1.48,16.26c0.78,2.93,2.49,5.41,5.42,6.19 C12.21,47.87,34,48,34,48s21.79-0.13,27.1-1.55c2.93-0.78,4.64-3.26,5.42-6.19C67.94,34.95,68,24,68,24S67.94,13.05,66.52,7.74z'/%3E%3Cpath fill='%23fff' d='m45 24-18-10v20'/%3E%3C/svg%3E") } +.embed-btn.yt:hover { background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 68 48'%3E%3Cpath fill='red' d='M66.52,7.74c-0.78-2.93-2.49-5.41-5.42-6.19C55.79,.13,34,0,34,0S12.21,.13,6.9,1.55 C3.97,2.33,2.27,4.81,1.48,7.74C0.06,13.05,0,24,0,24s0.06,10.95,1.48,16.26c0.78,2.93,2.49,5.41,5.42,6.19 C12.21,47.87,34,48,34,48s21.79-0.13,27.1-1.55c2.93-0.78,4.64-3.26,5.42-6.19C67.94,34.95,68,24,68,24S67.94,13.05,66.52,7.74z'/%3E%3Cpath fill='%23fff' d='m45 24-18-10v20'/%3E%3C/svg%3E") } diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..5b92331 --- /dev/null +++ b/composer.json @@ -0,0 +1,39 @@ +{ + "name": "getkirby/plainkit", + "description": "Kirby Plainkit", + "type": "project", + "keywords": [ + "kirby", + "cms", + "plainkit" + ], + "authors": [ + { + "name": "Bastian Allgeier", + "email": "bastian@getkirby.com", + "homepage": "https://getkirby.com" + } + ], + "homepage": "https://getkirby.com", + "support": { + "email": "support@getkirby.com", + "forum": "https://forum.getkirby.com", + "source": "https://github.com/getkirby/plainkit" + }, + "require": { + "php": "~8.1.0 || ~8.2.0 || ~8.3.0", + "getkirby/cms": "^4.0" + }, + "config": { + "allow-plugins": { + "getkirby/composer-installer": true + }, + "optimize-autoloader": true + }, + "scripts": { + "start": [ + "Composer\\Config::disableProcessTimeout", + "@php -S localhost:8000 kirby/router.php" + ] + } +} diff --git a/index.php b/index.php new file mode 100644 index 0000000..87ed01d --- /dev/null +++ b/index.php @@ -0,0 +1,5 @@ +render(); diff --git a/kirby/.editorconfig b/kirby/.editorconfig new file mode 100644 index 0000000..10fd327 --- /dev/null +++ b/kirby/.editorconfig @@ -0,0 +1,28 @@ +# This file is for unifying the coding style for different editors and IDEs +# editorconfig.org + +# PHP PSR-12 Coding Standards +# https://www.php-fig.org/psr/psr-12/ + +root = true + +[*] +charset = utf-8 +end_of_line = lf +indent_style = tab +indent_size = 2 +trim_trailing_whitespace = true + +[*.php] +indent_size = 4 +insert_final_newline = true + +[*.vue.php] +indent_size = 2 +insert_final_newline = false + +[*.yml] +indent_style = space + +[*.md] +trim_trailing_whitespace = false \ No newline at end of file diff --git a/kirby/CONTRIBUTING.md b/kirby/CONTRIBUTING.md new file mode 100644 index 0000000..a4c299a --- /dev/null +++ b/kirby/CONTRIBUTING.md @@ -0,0 +1,101 @@ +# Contributing + +:+1::tada: First off, yes, you can contribute and thanks already for taking the time if you do! :tada::+1: + +## How we organize code + +To keep track of different states of our code (current release, bugfixes, features) we use branches: + +| Branch | Used for | PRs allowed? | +| --------------- | ------------------------------------------------------------------------ | --------------------------- | +| `main` | Latest released version | ❌ | +| `develop-patch` | Working branch for next patch release, e.g. `4.0.x` | ✅ | +| `develop-minor` | Working branch for next minor release, e.g. `4.x.0` | ✅ | +| `v5/develop` | Working branch for next major release, e.g. `5.0.0` | ✅ | +| `fix/*` | Temporary branches for single bugfix | - | +| `feature/*` | Temporary branches for single feature | - | +| `release/*` | Pre-releases in testing before they are merged into `main` when released | only during release testing | + +We will review all pull requests (PRs) to `develop-patch`, `develop-minor` and `v5/develop` and merge them if accepted, once an appropriate version is upcoming. Please understand that this might not be the immediate next release and might take some time. + +## How you can contribute + +### Report a bug + +When you find a bug, the first step to fixing it is to help us understand and reproduce the bug as best as possible. When you create a bug report, please include as many details as possible. Fill out [the template](https://github.com/getkirby/kirby/issues/new?template=bug_report.md) because the requested information helps us resolve issues so much faster. + +### Bug fixes + +For bug fixes, please create a new branch following the name scheme: `fix/issue_number-bug-x`, e.g. `fix/234-this-nasty-bug`. Limit bug fix PRs to a single bug. **Do not mix multiple bug fixes in a single PR.** This will make it easier for us to review the fix and merge it. + +- Always send bug fix PRs against the `develop-patch` branch––not `main`. +- Add a helpful description of what the PR does if it is not 100% self-explanatory. +- Every bug fix should include a [unit test](#tests) to avoid future regressions. Let us know if you need help with that. +- Make sure your code [style](#style) matches ours and includes [comments/in-code documentation](#documentation). +- Make sure your branch is up to date with the latest state on the `develop-patch` branch. [Rebase](https://help.github.com/articles/about-pull-request-merges/) changes before you send the PR. +- Please *don't* commit updated dist files in the `panel/dist` folder to avoid merge conflicts. We only build the dist files on release. Your branch should only contain changes to the source files. + +### Features + +For features create a new branch following the name scheme: `feature/issue_number-feature-x`, e.g. `feature/123-awesome-function`. Our [feedback platform](https://feedback.getkirby.com) can be a good source of highly requested features. Maybe your feature idea already exists and you can get valuable feedback from other Kirby users. Focus on a single feature per PR. Don't mix features! + +- Always send feature PRs against the `develop-minor` branch––not `main`. +- Add a helpful description of what the PR does. +- New features should include [unit tests](#tests). Let us know if you need help with that. +- Make your code [style](#style) matches ours and includes [comments/in-code documentation](#documentation). +- Make sure your branch is up to date with the latest state on the `develop-minor` branch. [Rebase](https://help.github.com/articles/about-pull-request-merges/) changes before you send the PR. +- Please *don't* commit updated dist files in the `panel/dist` folder to avoid merge conflicts. We only build the dist files on release. Your branch should only contain changes to the source files. + +We try to bundle features in our major releases, e.g. `5.0`. That is why we might only review and, if accepted, merge your PR once an appropriate release is upcoming. Please understand that we cannot merge all feature ideas or that it might take a while. Check out the [roadmap](https://roadmap.getkirby.com) to see upcoming releases. + +### Translations + +We are really happy about any help with translations. Please do not directly translate JSON files, though. We use a service called Transifex to handle [all translations](https://translation.getkirby.com/). Create an account there and send us a request to join our translator group. Additionally, also send an email to . Unfortunately, we don't get notified properly about new translator requests. + +## How we write code + +### Style + +#### Backend (PHP) + +We use [PHP CS Fixer](https://github.com/FriendsOfPHP/PHP-CS-Fixer) to ensure a consistent style for our PHP code. It is mainly based on [PSR-12](https://www.php-fig.org/psr/psr-12/). [Install PHP CS Fixer globally](https://github.com/FriendsOfPHP/PHP-CS-Fixer#globally-composer) via Composer and then run `composer fix` in the `kirby` folder to check for inconsistencies and fix them. Our automated PR checks will fail if there are code style issues with your code. + +#### Frontend/Panel (JavaScript, Vue) + +We use [Prettier](https://prettier.io) to ensure a consistent style for our JavaScript and Vue code. After running `npm install` in the `kirby/panel` folder, you can run `npm run format` to check for inconsistencies and fix them. We also use [ESLint](https://eslint.org) which you can use by running `npm run lint` and/or `npm run lint:fix`. + +### Documentation + +In-code documentation and comments help us understand each other's code - or our own code after some months. Especially when matters get more complicated, we try to add a lot of comments to explain what the code does or why we implemented it like this. Even better than good comments is good code that is easy to understand. + +#### Backend (PHP) + +We use PHP [DocBlocks](https://docs.phpdoc.org/guide/references/phpdoc/basic-syntax.html#what-is-a-docblock) for classes and methods. + +#### Frontend/Panel (JavaScript, Vue) + +We use [JSDoc](https://jsdoc.app) for documenting JavaScript code, especially for [Vue components](https://vue-styleguidist.github.io/docs/Documenting.html). + +#### Public documentation + +We also document Kirby on the Kirby website at . However we recommend to wait with writing public documentation until the feature PR is merged. If you don't know where the documentation for a feature best belongs, don't worry. We can take care of writing the docs. + +### Tests + +Unit and integration tests help us prevent regressions when we make changes to the code. Every bug fix should also add a unit test for the fixed bug to make sure we won't re-introduce the same problem later down the road. Every new feature should be accompanied by unit tests to protect it from breaking through future changes. + +#### Backend (PHP) + +We use [PHPUnit](https://phpunit.de) for unit test for our PHP code. You can find all existing tests in the [`kirby/tests` subfolders](https://github.com/getkirby/kirby/tree/main/tests). Take a look to see how we usually structure our tests. + +#### Frontend/Panel (JavaScript, Vue) + +The Panel doesn't have extensive test coverage yet. That's an area we are still trying to improve. + +We use [vitest](https://vitest.dev) for unit tests for JavaScript and Vue components - `.test.js` files next to the actual JavaScript/Vue file. + +## And last… + +Let us know [in the forum](https://forum.getkirby.com) if you have questions. + +**And once more: thank you!** :+1::tada: diff --git a/kirby/LICENSE.md b/kirby/LICENSE.md new file mode 100644 index 0000000..f7514fd --- /dev/null +++ b/kirby/LICENSE.md @@ -0,0 +1,276 @@ +# Kirby License Agreement + +Published: November 28, 2023 +Source: https://getkirby.com/license/2023-11-28 + +## About this Agreement + +While Kirby's source code is publicly available, Kirby is **not free**. To use Kirby in production, you need to [purchase a license](https://getkirby.com/buy). + +This End User License Agreement (the **"Agreement"**) is fundamental to the relationship between you and us. Therefore we recommend to read this Agreement carefully before you download, install or use Kirby. + +If you do not agree to this Agreement, please do not download, install or use Kirby. Installation or use of Kirby signifies that you have read, understood, and agreed to be bound by this Agreement. + +## Summary + +This section summarizes the most important conditions of this Agreement to give you a quick overview: + +- With your purchase you obtain a license. A license allows you to use Kirby according to this Agreement. +- Each project (defined by its URL) needs its own license. You need to purchase the right license for your project and/or client. You can find our license variants on . In some explicitly listed cases, you can use Kirby without having to purchase a license. +- Each license includes any Kirby version that gets released within three years from the date when you first activated your license. We also provide free security updates for older versions that may protect your project beyond three years. +- After those three years, you can continue to use Kirby for your project with any of these versions as long as you want. +- To use any newer version released after this time, you will need to upgrade your license. +- Upgrading your license extends the timeframe for an additional three years during which you can use new releases. You can perform the upgrade at any time. +- You have the right to transfer or reassign a license to another person or project if needed. +- There are some restrictions for use of Kirby that you can find below. + +For the full license details, please read the Agreement in full. Only the following sections are legally binding. + +## Definitions + +Before we get started with the conditions of the Agreement, let's define the terms that will be used throughout it: + +- When we refer to **"You"**, we mean the licensee. Before purchasing Kirby, that's the individual or company that has downloaded and/or installed Kirby for a Development Installation, Private Installation or Extension Demo. When used for a Public Site, the licensee is the individual or company that has purchased the Kirby license. If you work on a client project and have purchased the Kirby license for your client, you (and _not_ the client) are the licensee. +- When we refer to **"We"**/**"Us"**/**"Our"**, we mean the licensor, the Content Folder GmbH & Co. KG. You can find Our company and contact information on Our [contact page](https://getkirby.com/contact). +- **"Client"** is the individual or company on whose behalf You create or work on a Website. This only applies if the client is not the licensee. +- A **"Website"** is a single Kirby project that is defined by its domain name and root directory (e.g. `https://sub.example.com` or `https://example.com/example/`). Each (sub)domain and root directory is a separate Website, even if the projects are related in any way. Exception: If You use the cross-domain multi-language feature with the same `content` folder, these domains count as the same Website. + You may use Kirby as a headless backend or as a static site generator. In these cases the Website is defined by the domain and root directory of the user- or visitor-facing frontend(s). +- A **"Development Installation"** is a Website that is installed purely for the purposes of development and client preview. It must only be accessible by a restricted number of users (like on a personal computer, on a server in a network with restricted access or when protecting a staging website with a password that only a restricted number of users know). +- A **"Private Installation"** is a Website that is installed purely for personal use. It must only be accessible by You and Your family. +- An **"Extension Demo"** is a Website with the single purpose to showcase a free or commercial Kirby theme or Kirby plugin, as long as that Website only contains demo content. If the showcased extension is a Kirby theme, the demo content must be exactly as shipped with the theme. Demos for Kirby plugins may _not_ contain any additional content that is not needed to showcase the plugin in use. +- A **"Public Site"** is a Website that is _neither_ a Development Installation, a Private Installation nor an Extension Demo. +- A **"Minor Release"** is a stable Kirby release which adds smaller new features, minor functionality enhancements or bug fixes. This class of release is identified by the change of the revision to the right of the first decimal point, e.g. 4.1 to 4.2, 4.X.1 to 4.X.2. +- A **"Major Release"** is a stable Kirby release which incorporates major new features or enhancements that increase or change the core functionality of Kirby to a larger extent. It may also deprecate existing parts of the Source Code or change them in a breaking way. This class of release is identified by the change of the revision to the left of the first decimal point, e.g. 4.X to 5.0. +- A **"Major Generation"** is defined as all releases that share the revision to the left of the first decimal point, e.g. 4.0.0, 4.0.X, 4.X.0 and 4.X.X. +- The **"Source Code"** is defined as the contents of all files that are provided with Kirby and that make Kirby work. This includes (but is not limited to) all PHP, JavaScript, JSON, HTML and CSS files as well as all related image and other media files. +- The **"Activation Date"** determines the included updates. It is defined like this: + - For a newly purchased license, it is the date when the license was first activated for use with a Public Site. + - When You upgrade an already activated license, it is the date on which the upgrade was performed in Our license hub. If the license is still within the Included Updates Period, the Activation Date of the upgrade license will be set to the end of the Included Updates Period of the existing license. + - When You upgrade a license that had _not_ been activated before, the upgrade license adopts the unactivated state of the existing license. The Activation Date is set on first activation for use with a Public Site. +- The **"Included Updates Period"** is the time span of three (3) years after the Activation Date. +- Licensees (You), Clients and Websites are **"Qualified"** if they satisfy the purchase requirements from the ["Order Process" section](#order-process) of this Agreement. + +Every time you see one of these capitalized terms in the following text, it has the meaning that has been explained above. + +## Usage for a Public Site + +Installing Kirby on or using it for a Public Site requires a [paid license](https://getkirby.com/buy). Once a paid license is needed, the license must be immediately activated to the Public Site’s domain name and root directory via our license hub or the activation feature in the Kirby Panel. + +As Kirby is software and software is intangible, We don't sell it as such. Instead, this Agreement grants a license for each purchase to install and use a single instance of Kirby on a **specific Website**. Additional Kirby licenses must be purchased in order to install and use Kirby on **additional Websites**. + +The license is **non-exclusive** (meaning that You are not the only one to whom We will issue a license) and **generally non-transferable** (meaning that the one who purchases the license is the licensee). + +On request, We will **transfer** a license to anyone who would be allowed and Qualified to purchase the license by law and this Agreement. The new licensee will take over all rights and obligations of this Agreement from You at the moment We confirm the license transfer. + +We will also **reassign** a license to another Qualified Website domain and root directory, if You confirm that the previous Website is no longer in operation and will not be operated with the same license in the future. + +If the new licensee, Website or Client in a transfer or reassignment is not Qualified for the existing license, You or the new licensee need to **upgrade the license to the qualifying terms and conditions** before the transfer or reassignment can be performed. + +> [!NOTE] +> If you need to transfer your Kirby license to another individual or company (for example to your client or a new agency) or reassign it to a different project, please get in touch directly at . + +A license is valid for all Major Releases that We publish before the end of the Included Updates Period. It is also valid for all releases in those Major Generations independent of their release date. Whether a release is a Minor Release or Major Release is at Our sole discretion. + +The use of releases in Major Generations that We publish after the Included Updates Period requires a **paid license upgrade**. An upgrade license replaces the existing license. + +## Order Process + +Our order process is conducted by Our online reseller [Paddle.com](https://paddle.com). Paddle.com is the Merchant of Record for all Our orders. Paddle provides all customer service inquiries and handles returns. + +When purchasing a license, You are **responsible to choose the right license** based on You and the Website project. Different license variants can come with certain requirements towards You and/or the Website project. We publish all such requirements on in a way that makes them clearly visible before the purchase. With Your purchase, You confirm that You and the Website project qualify for the selected license variant. + +If the Website is created for a Client, You need to make sure that the **Client qualifies for the selected license**. + +If You purchase licenses **in advance**, You need to ensure to only use the license(s) for projects that satisfy the requirements for the selected license variant(s). + +We **reserve the right to verify** at any time after the purchase whether You, the Website and (if applicable) the Client are Qualified. Changes to the situation of You, the Website or the Client as well as changes to the published information on Our "Buy" page after the purchase or after the assignment to a Client do _not_ take effect on an existing license unless You upgrade the license or We transfer or reassign the license on Your request. + +## Free Licenses + +Kirby can be used **for free in the following cases**. + +> [!NOTE] +> Please note that the restrictions and all other clauses of this Agreement also apply to free licenses. You may especially _not_ alter or circumvent the licensing features. + +### Usage for a Development Installation + +We believe that it should be possible to test and evaluate software before having to purchase a license. Also, We understand that a web project first needs to be built in a protected environment before it can be published. + +Therefore, installing and using Kirby on a personal computer (like a desktop PC, notebook or tablet) or server for a Development Installation is **free** for as long as You need. + +> [!NOTE] +> The usage of Kirby in production (with the intention to handle production data or content) is _never_ considered a Development Installation, even in internal apps or systems. + +### Usage for a Private Installation + +You may also install and use Kirby for **free** in Private Installations as long as they are not accessible by anyone except You and Your family. + +> [!NOTE] +> Our [definition](#definitions) of a Private Installation allows the following use cases: +> +> - Private sites for personal use, for example: +> - Apps for You personally (like a personal diary) +> - Apps for You as a freelancer (like a bookkeeping, invoicing or project management app) +> - Apps for Your family (like a private photo gallery) +> - Experimental local Kirby setups for Your personal use (for example to try out Kirby features) +> +> However, the following use cases are _not_ covered and need a **[paid license](#usage-for-a-public-site)**: +> +> - Intranets for companies, authorities or organizations, no matter if on a local or public server +> - (Internal) apps for teams or entire companies, authorities or organizations +> - Websites that are accessible by the public, even for personal/non-commercial purposes +> - Use of Kirby as a local CMS for a static or headless site without a license for the frontend domain(s) + +### Usage for an Extension Demo + +Extension Demos are not real Websites. We want to encourage you to build and showcase your themes and plugins. + +Therefore, You may **operate Extension Demos without purchasing a license**. + +> [!NOTE] +> Please note that this does _not_ apply to store fronts or other types of sites used to promote free or commercial themes or plugins. If such a site is built with Kirby as well, it is a Public Site and needs a **[paid license](#usage-for-a-public-site)**. + +## Restrictions + +### Legal Restrictions + +You may only use Kirby in a manner that complies with any and all **applicable laws** in the jurisdictions in which You use Kirby. Please respect all applicable restrictions concerning **privacy and intellectual property rights**. + +### Making Copies + +You may make **copies of Kirby** in any machine readable form solely for the **following purposes**, provided that You reproduce Kirby in its original form and with all proprietary notices on the copy: + +- when deploying a Website to a server, +- when developing a Website on a personal computer or server, +- when working on code contributions to Kirby or +- as a backup. + +You may _not_ reproduce Kirby or its Source Code, in whole or in part, for **any other purpose**. + +### Modification of the Source Code + +You may **alter, modify or extend the Source Code** for Your own use or with the intention to contribute Your changes back to Kirby. You may also **commission a third party** to perform those modifications for You. + +However You may _not_: + +- **alter or circumvent the licensing features**, including (but not limited to) the license validation and payment prompts or +- **resell, redistribute or transfer** the modified or derivative version. + +> [!NOTE] +> Please note that We **can't provide technical support** for modified or derivative versions of the Source Code. + +### Your Relationship to Third Parties + +You are generally _not_ allowed to **sell, assign, license, disclose, distribute, or otherwise transfer or make available** Kirby or its Source Code, in whole or in part, in any form to any third parties. + +The following cases are exempted from this restriction: + +- Kirby licenses may be transferred to a new licensee by requesting the transfer from Us ([see above](#usage-for-a-public-site)). +- You may create Websites for third parties (e.g. as an agency or freelancer for a client). Together with this Website, You may bill Your client for the used Kirby license. You may also include the license price in a flat rate. Please note that the licensee in both of these cases is still You unless You request to transfer the license to Your client. If Your price exceeds the price You paid to Us, You need to give Your client the option to purchase the license directly from Us. +- You may make Kirby available to customers via a Software-as-a-Service (SaaS) offering, provided You ensure that each Website has a valid Kirby license purchased either by You or Your customer. If multiple customers share a Website, each customer needs at least one license. Your offering _must not_ appear to be provided or officially endorsed by Us. +- You may make a Kirby installation available to employees or partners of You or Your Website client. You may also disclose and distribute Kirby’s Source Code to Your client together with the source code of the Website You created for them. +- You may disclose the Source Code to individuals or companies that are involved in the development or operation of Your Website (e.g. agencies, design or development freelancers, hosting providers or administrators). + +> [!NOTE] +> E.g. the following cases are explicitly **_not_ allowed**: +> +> - Selling, licensing or distributing a new product based on Kirby that modifies or hides Kirby’s identity as a Content Management System (CMS) +> - Forking Kirby and selling the modified version ([see above](#modification-of-the-source-code)) +> - Buying licenses in bulk and reselling them in your own shop +> - Bundling or including Kirby’s Source Code in the publication and/or distribution of a Website’s source code or a (free or paid) theme or plugin (please use Git submodules or Composer or provide a link to Our repository or website instead) + +### Disallowed Uses + +The following uses of Kirby are _not_ covered by this Agreement and will result in the termination of the license: + +- Direct or indirect use of Kirby in **critical infrastructure** (e.g. water and energy services, public health, financial services, public security services) or **high-risk environments** (e.g. handling of harmful or dangerous materials). The use in Websites without connection to core processes is allowed. +- Use of Kirby for Websites that contain **misinformation, hate speech or discriminating content** based on age, gender, gender identity, race, sexuality, religion, nationality, serious illnesses or disabilities, no matter who authored this content. Misinformation is defined as content that is false or misleading and may lead to significant risk of physical or societal harm. +- Use of Kirby by **companies or individuals who**: + - lobby for, promote, derive a majority of income from or are significantly invested in: + - the production of tobacco or weapons, + - any prison or jail operated for profit, + - any action or facility that supports or contributes to: + - gambling, adversely addictive behaviours or + - deforestation. + - lobby against, or derive a majority of income from actions that discourage or frustrate: + - peace, + - access to the rights set out in the Universal Declaration of Human Rights and the Convention on the Rights of the Child, + - peaceful assembly and association (including worker associations), + - a safe environment or action to curtail the use of fossil fuels or to prevent climate change or + - democratic processes. + +### Other Restrictions + +You may also _not_: + +- **extract parts of the Source Code** for use in other programs or projects (unless the code file in question is explicitly licensed under the terms of the MIT license) or +- **remove or alter any proprietary notices** on Kirby. + +## Technical Support + +Technical support is **provided as described on Our website** at . **No representations or guarantees** are made regarding the response time in which support questions are answered, however We will do Our best to respond quickly. + +For each Major Generation, We aim to provide **security support for three (3) years** after the Major Release. Security support means that We will provide free security updates for the supported releases, which will include fixes for security vulnerabilities according to the following rules: + - We published a security advisory on within the respective security support period. We will publish vulnerabilities on this page as soon as they are known to Us and an official fix for any supported release is available. + - The latest release of the supported Major Generation is affected by the vulnerability. + +With each vulnerability, We aim to publish the security advisory and security updates for all supported Major Generations at the same time. + +> [!NOTE] +> You can find up-to-date information on our currently supported versions in our [public security policy](https://getkirby.com/security). + +We reserve the right to **limit technical support for free licenses**. + +## Refund Policy + +We offer a **14-day**, money back refund policy if Kirby didn't work out for Your project. + +> [!NOTE] +> If you need a refund, please get in touch directly at . + +## No Warranty + +KIRBY IS OFFERED ON AN **"AS-IS" BASIS** AND **NO WARRANTY**, EITHER EXPRESSED OR IMPLIED, IS GIVEN. WE EXPRESSLY DISCLAIM ALL WARRANTIES OF ANY KIND, WHETHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. YOU ASSUME ALL RISK ASSOCIATED WITH THE QUALITY, PERFORMANCE, INSTALLATION AND USE OF KIRBY INCLUDING, BUT NOT LIMITED TO, THE RISKS OF PROGRAM ERRORS, DAMAGE TO EQUIPMENT, LOSS OF DATA OR SOFTWARE PROGRAMS, OR UNAVAILABILITY OR INTERRUPTION OF OPERATIONS. **YOU ARE SOLELY RESPONSIBLE** FOR DETERMINING THE APPROPRIATENESS OF USE OF KIRBY AND ASSUME ALL RISKS ASSOCIATED WITH ITS USE. THIS PARAGRAPH ALSO APPLIES TO YOU IF YOU ARE NOT THE LICENSEE (E.G. IF YOU USE KIRBY WHILE SOMEONE ELSE IS THE LICENSEE). + +## Term, Termination and Modification + +You may **indefinitely use** all Kirby versions that are covered by Your license under this Agreement until either party **terminates this Agreement** as described in this section. + +**You** may terminate the Agreement at any time. + +**We** may only terminate the Agreement if You or any individual or company who works with Kirby or uses it on Your behalf has violated or failed to comply with terms of this Agreement. If Your compliance with the Agreement can be restored by fixing the violation or non-compliance, We will first contact You with information on the specific term that was violated or not complied with and will allow reasonable time of at least 14 days before We will decide on a license termination. Should We be in the position to terminate a license according to this paragraph, other or all licenses granted to You may be terminated for the same reason(s) at the same time or at any later date. + +Termination takes effect upon notice to the other party in textual form (via email or letter). Upon termination, the specified **licenses granted to You will terminate**, and You will **immediately uninstall and cease all use** of Kirby. If not all licenses are terminated, You may continue to use Kirby for the Websites with active licenses. The sections entitled "No Warranty", "Indemnification" and "Limitation of Liability" will **survive any termination** of this Agreement. + +We may **modify Kirby and this Agreement** with notice to You either via email or by publishing content on the Kirby website at https://getkirby.com, including but not limited to changing the functionality or appearance of Kirby. Any such modification will **become binding on You** unless You terminate this Agreement. Changes to this Agreement that constrain Your rights to a great extent will only become effective with Your approval in textual or electronic form. + +## Indemnification + +By accepting the Agreement, you **agree to indemnify and otherwise hold harmless** Us as well as Our officers, employees, agents, subsidiaries, affiliates and other partners from any direct, indirect, incidental, special, consequential or exemplary damages arising out of, relating to, or resulting from your use of Kirby or any other matter relating to Kirby. This paragraph also applies to you if you are not the licensee (e.g. if you use Kirby while someone else is the licensee). + +## Limitation of Liability + +YOU EXPRESSLY UNDERSTAND AND AGREE THAT **WE SHALL NOT BE LIABLE** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, CONSEQUENTIAL OR EXEMPLARY DAMAGES, INCLUDING BUT NOT LIMITED TO, DAMAGES FOR LOSS OF PROFITS, GOODWILL, USE, DATA OR OTHER INTANGIBLE LOSSES (EVEN IF WE HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES). SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF THE LIMITATION OR EXCLUSION OF LIABILITY FOR INCIDENTAL OR CONSEQUENTIAL DAMAGES. ACCORDINGLY, **SOME OF THE ABOVE LIMITATIONS MAY NOT APPLY TO YOU**. **IN NO EVENT WILL OUR TOTAL CUMULATIVE DAMAGES EXCEED** THE FEES YOU PAID TO US UNDER THIS AGREEMENT IN THE MOST RECENT TWELVE-MONTH PERIOD. THIS PARAGRAPH ALSO APPLIES TO YOU IF YOU ARE NOT THE LICENSEE (E.G. IF YOU USE KIRBY WHILE SOMEONE ELSE IS THE LICENSEE). + +## All Rights Reserved + +Bastian Allgeier **owns all rights**, title and interest to Kirby (including all intellectual property rights) and **reserves all rights to Kirby** that are not expressly granted in this Agreement. + +In the event that Kirby will no longer be actively maintained, Bastian Allgeier will provide the Source Code under the terms of a free and open source software (FOSS) license as far as legally and contractually possible. + +## Applicable Law & Place of Jurisdiction + +1. For all disputes arising out of or in connection with this Agreement, the courts competent for Neckargemünd, Germany, shall have exclusive jurisdiction. However, We shall have the choice to file lawsuits against You before the courts competent for Your place of business. +2. If You reside in Germany, para. 1 shall only apply if You are a merchant, a legal entity under public law or a special fund under public law. +3. If You don't reside in Germany, but in a different member state of the European Union, para. 1 shall only apply if You are not a consumer under Art. 17 of the regulation (EU) No. 1215/2012. In that case, You shall be entitled to file actions against Us either at Our place of business or at the courts competent at the place where You usually reside. We, on the other hand, are only entitled to bring proceedings against You in the courts of the Member State in which You are domiciled. +4. If You neither reside in Germany nor in a member state of the EU, the applicability of para. 1 remains unaffected. + +## Severability Clause + +Should any provision of this Agreement be or become invalid, void or unenforceable, in whole or in part, at present or in the future, this shall not affect the validity of the remaining provisions of this Agreement. The same shall apply if a gap requiring supplementation arises after conclusion of this Agreement. The parties shall replace the invalid, void or unenforceable provision or gap requiring filling by a valid provision which in its legal or economic content takes account of the invalid, void provision and the overall content of the agreement. § Section 139 of the German Civil Code (partial invalidity) is expressly waived. + +## Questions? + +Due to Kirby's flexibility, you may have special use cases or requirements that don't fit this Agreement. + +If that's the case or if you have any questions, feel free to [get in touch](mailto:support@getkirby.com). We are happy to think outside the box and find custom license solutions for your creative application of Kirby. diff --git a/kirby/README.md b/kirby/README.md new file mode 100644 index 0000000..4ef329d --- /dev/null +++ b/kirby/README.md @@ -0,0 +1,49 @@ +[](https://getkirby.com) + +[![Release](https://img.shields.io/github/v/release/getkirby/kirby)](https://github.com/getkirby/kirby/releases/latest) +[![CI Status](https://img.shields.io/github/actions/workflow/status/getkirby/kirby/ci.yml?branch=main&label=CI)](https://github.com/getkirby/kirby/actions?query=workflow%3ACI+branch%3Amain) +[![Coverage Status](https://img.shields.io/codecov/c/gh/getkirby/kirby?token=ROZ2RVA0OF)](https://codecov.io/gh/getkirby/kirby) +[![Downloads](https://img.shields.io/packagist/dt/getkirby/cms?color=red)](https://github.com/getkirby/kirby/releases/latest) + +**Kirby: the CMS that adapts to any project, loved by developers and editors alike.** +With Kirby, you build your own ideal interface. Combine forms, galleries, articles, spreadsheets and more into an amazing editing experience. You can learn more about Kirby at [getkirby.com](https://getkirby.com). + +This is Kirby's core application folder. Get started with one of the following repositories instead: + +- [Starterkit](https://github.com/getkirby/starterkit) +- [Plainkit](https://github.com/getkirby/plainkit) + + + +### Try Kirby for free + +Kirby is not free software. However, you can try Kirby and the Starterkit on your local machine or on a test server as long as you need to make sure it is the right tool for your next project. … and when you’re convinced, [buy your license](https://getkirby.com/buy). + +### Contribute + +**Found a bug?** +Please post all bugs as individual reports in our [issue tracker](https://github.com/getkirby/kirby/issues). + +**Suggest a feature** +If you have ideas for a feature or enhancement for Kirby, please use our [feedback platform](https://feedback.getkirby.com). + +**Translations, bug fixes, code contributions ...** +Read about how to contribute to the development in our [contributing guide](/CONTRIBUTING.md). + +## What's Kirby? + +- **[getkirby.com](https://getkirby.com)** – Get to know the CMS. +- **[Try it](https://getkirby.com/try)** – Take a test ride with our online demo. Or download one of our kits to get started. +- **[Documentation](https://getkirby.com/docs/guide)** – Read the official guide, reference and cookbook recipes. +- **[Issues](https://github.com/getkirby/kirby/issues)** – Report bugs and other problems. +- **[Feedback](https://feedback.getkirby.com)** – You have an idea for Kirby? Share it. +- **[Forum](https://forum.getkirby.com)** – Whenever you get stuck, don't hesitate to reach out for questions and support. +- **[Discord](https://chat.getkirby.com)** – Hang out and meet the community. +- **[YouTube](https://youtube.com/kirbyCasts)** - Watch the latest video tutorials visually with Bastian. +- **[Mastodon](https://mastodon.social/@getkirby)** – Spread the word. +- **[Instagram](https://www.instagram.com/getkirby/)** – Share your creations: #madewithkirby. + +--- + +© 2009 Bastian Allgeier +[getkirby.com](https://getkirby.com) · [License agreement](https://getkirby.com/license) diff --git a/kirby/SECURITY.md b/kirby/SECURITY.md new file mode 100644 index 0000000..ffc6ad0 --- /dev/null +++ b/kirby/SECURITY.md @@ -0,0 +1,27 @@ +# Security Policy + +## Supported versions and past security incidents + +You can find up-to-date information on the security status of each version on . + +## Security of your Kirby site + +We have a detailed [security guide](https://getkirby.com/docs/guide/security) with information on how to keep your Kirby installation secure. + +## Reporting a vulnerability + +If you have spotted a vulnerability in Kirby's core or the Panel, please make sure to let us know immediately. We appreciate your efforts to responsibly disclose your findings, and will make every effort to acknowledge your contributions. + +You can always contact us directly at ****. +If you want to encrypt your message, our GPG key is [6E6B 057A F491 FFAD 363F 6F49 9101 10FA A459 E120](https://getkirby.com/pgp.asc). + +You can also use the [security advisory form on GitHub](https://github.com/getkirby/kirby/security/advisories/new) to securely and privately report a vulnerability to us. + +We will send you a response as soon as possible and will keep you informed on our progress towards a fix and announcement. + +> [!IMPORTANT] +> Please do not write to us publicly, e.g. in the forum, on Discord or in a GitHub issue. A public report can give attackers valuable time to exploit the issue before it is fixed. +> +> By letting us know directly and coordinating the disclosure with us, you can help to protect other Kirby users from such attacks. +> +> Also please do *not* request a CVE ID from organizations like MITRE. The responsible CVE Numbering Authority (CNA) for Kirby is GitHub. We can and will request a CVE ID for each confirmed vulnerability and will provide it to you in advance of the coordinated release. diff --git a/kirby/assets/whoops.css b/kirby/assets/whoops.css new file mode 100644 index 0000000..bd35464 --- /dev/null +++ b/kirby/assets/whoops.css @@ -0,0 +1,83 @@ +body { + background: #efefef; + font: normal normal 400 12px/1.5 -apple-system, BlinkMacSystemFont, Segoe UI, + Roboto, Helvetica, Arial, sans-serif; +} + +.left-panel { + background: transparent; +} + +header { + background-color: #313740; +} + +.exc-title-primary { + color: hsl(0, 71%, 55%); +} + +.frame.active { + color: hsl(0, 71%, 55%); + box-shadow: inset -5px 0 0 0 #d16464; +} + +.frame:not(.active):hover { + background: rgba(203, 215, 229, 0.5); +} + +.rightButton { + color: #999; + box-shadow: inset 0 0 0 1px #777; + border-radius: 0; +} + +.rightButton:hover { + box-shadow: inset 0 0 0 1px #555; + color: #777; +} + +.details-heading { + color: #7e9abf; + font-weight: 500; +} + +.frame-code { + background: #000; +} + +pre.code-block, +code.code-block, +.frame-args.code-block, +.frame-args.code-block samp { + background: #16171a; +} + +.linenums li.current { + background: transparent; +} + +.linenums li.current.active { + background: rgba(209, 100, 100, 0.3); +} + +pre .atv, +code .atv, +pre .str, +code .str { + color: #a7bd68; +} + +pre .tag, +code .tag { + color: #d16464; +} + +pre .kwd, +code .kwd { + color: #8abeb7; +} + +pre .atn, +code .atn { + color: #de935f; +} diff --git a/kirby/bootstrap.php b/kirby/bootstrap.php new file mode 100644 index 0000000..9a419de --- /dev/null +++ b/kirby/bootstrap.php @@ -0,0 +1,36 @@ +=') === false || + version_compare(PHP_VERSION, '8.4.0', '<') === false +) { + die(include __DIR__ . '/views/php.php'); +} + +if (is_file($autoloader = dirname(__DIR__) . '/vendor/autoload.php')) { + /** + * Always prefer a site-wide Composer autoloader + * if it exists, it means that the user has probably + * installed additional packages + * + * @psalm-suppress MissingFile + */ + include $autoloader; +} elseif (is_file($autoloader = __DIR__ . '/vendor/autoload.php')) { + /** + * Fall back to the local autoloader if that exists + * + * @psalm-suppress MissingFile + */ + include $autoloader; +} else { + /** + * If neither one exists, don't bother searching; + * it's a custom directory setup and the users need to + * load the autoloader themselves + */ +} diff --git a/kirby/cacert.pem b/kirby/cacert.pem new file mode 100644 index 0000000..86d6cd8 --- /dev/null +++ b/kirby/cacert.pem @@ -0,0 +1,3568 @@ +## +## Bundle of CA Root Certificates +## +## Certificate data from Mozilla as of: Tue Jul 2 03:12:04 2024 GMT +## +## This is a bundle of X.509 certificates of public Certificate Authorities +## (CA). These were automatically extracted from Mozilla's root certificates +## file (certdata.txt). This file can be found in the mozilla source tree: +## https://hg.mozilla.org/releases/mozilla-release/raw-file/default/security/nss/lib/ckfw/builtins/certdata.txt +## +## It contains the certificates in PEM format and therefore +## can be directly used with curl / libcurl / php_curl, or with +## an Apache+mod_ssl webserver for SSL client authentication. +## Just configure this file as the SSLCACertificateFile. +## +## Conversion done with mk-ca-bundle.pl version 1.29. +## SHA256: 456ff095dde6dd73354c5c28c73d9c06f53b61a803963414cb91a1d92945cdd3 +## + + +GlobalSign Root CA +================== +-----BEGIN CERTIFICATE----- +MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkGA1UEBhMCQkUx +GTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkds +b2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAwMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNV +BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYD +VQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDa +DuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6sc +THAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlb +Kk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgKOOvyJBNP +c1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrX +gzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0BAQUF +AAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOzyj1hTdNGCbM+w6Dj +Y1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE38NflNUVyRRBnMRddWQVDf9VMOyG +j/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymPAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhH +hm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveC +X4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== +-----END CERTIFICATE----- + +Entrust.net Premium 2048 Secure Server CA +========================================= +-----BEGIN CERTIFICATE----- +MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u +ZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxp +bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV +BAMTKkVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQx +NzUwNTFaFw0yOTA3MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3 +d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl +MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u +ZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOL +Gp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSr +hRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzW +nLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUi +VBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo0IwQDAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJ +KoZIhvcNAQEFBQADggEBADubj1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPy +T/4xmf3IDExoU8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf +zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5bu/8j72gZyxKT +J1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+bYQLCIt+jerXmCHG8+c8eS9e +nNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/ErfF6adulZkMV8gzURZVE= +-----END CERTIFICATE----- + +Baltimore CyberTrust Root +========================= +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJRTESMBAGA1UE +ChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3li +ZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMC +SUUxEjAQBgNVBAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFs +dGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKME +uyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsB +UnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/C +G9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9 +XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjpr +l3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoI +VDaGezq1BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEB +BQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkTI7gQCvlYpNRh +cL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3WgxjkzSswF07r51XgdIGn9w/xZchMB5 +hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsa +Y71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H +RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp +-----END CERTIFICATE----- + +Entrust Root Certification Authority +==================================== +-----BEGIN CERTIFICATE----- +MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMCVVMxFjAUBgNV +BAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jw +b3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsG +A1UEAxMkRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0 +MloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMu +MTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVu +Y2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNVBAMTJEVudHJ1c3QgUm9v +dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +ALaVtkNC+sZtKm9I35RMOVcF7sN5EUFoNu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYsz +A9u3g3s+IIRe7bJWKKf44LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOww +Cj0Yzfv9KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGIrb68 +j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi94DkZfs0Nw4pgHBN +rziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOBsDCBrTAOBgNVHQ8BAf8EBAMCAQYw +DwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAigA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1 +MzQyWjAfBgNVHSMEGDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DH +hmak8fdLQ/uEvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA +A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9tO1KzKtvn1ISM +Y/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6ZuaAGAT/3B+XxFNSRuzFVJ7yVTa +v52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTS +W3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0 +tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8 +-----END CERTIFICATE----- + +Comodo AAA Services root +======================== +-----BEGIN CERTIFICATE----- +MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS +R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg +TGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAw +MFoXDTI4MTIzMTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hl +c3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV +BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhG +C1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfHdr/jzDUs +i14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszW +Y19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjH +Ypy+g8cmez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEK +Iz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wewYDVR0f +BHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNl +cy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2Vz +LmNybDANBgkqhkiG9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm +7l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz +Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z +8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C +12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== +-----END CERTIFICATE----- + +QuoVadis Root CA 2 +================== +-----BEGIN CERTIFICATE----- +MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT +EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMjAeFw0wNjExMjQx +ODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM +aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4IC +DwAwggIKAoICAQCaGMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6 +XJxgFyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55JWpzmM+Yk +lvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bBrrcCaoF6qUWD4gXmuVbB +lDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp+ARz8un+XJiM9XOva7R+zdRcAitMOeGy +lZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt +66/3FsvbzSUr5R/7mp/iUcw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1Jdxn +wQ5hYIizPtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og/zOh +D7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UHoycR7hYQe7xFSkyy +BNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuIyV77zGHcizN300QyNQliBJIWENie +J0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1Ud +DgQWBBQahGK8SEwzJQTU7tD2A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGU +a6FJpEcwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT +ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2fBluornFdLwUv +Z+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzng/iN/Ae42l9NLmeyhP3ZRPx3 +UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2BlfF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodm +VjB3pjd4M1IQWK4/YY7yarHvGH5KWWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK ++JDSV6IZUaUtl0HaB0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrW +IozchLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPRTUIZ3Ph1 +WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWDmbA4CD/pXvk1B+TJYm5X +f6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0ZohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II +4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8 +VCLAAVBpQ570su9t+Oza8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u +-----END CERTIFICATE----- + +QuoVadis Root CA 3 +================== +-----BEGIN CERTIFICATE----- +MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT +EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMzAeFw0wNjExMjQx +OTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM +aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4IC +DwAwggIKAoICAQDMV0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNgg +DhoB4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUrH556VOij +KTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd8lyyBTNvijbO0BNO/79K +DDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9CabwvvWhDFlaJKjdhkf2mrk7AyxRllDdLkgbv +BNDInIjbC3uBr7E9KsRlOni27tyAsdLTmZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwp +p5ijJUMv7/FfJuGITfhebtfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8 +nT8KKdjcT5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDtWAEX +MJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZc6tsgLjoC2SToJyM +Gf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A4iLItLRkT9a6fUg+qGkM17uGcclz +uD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYDVR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHT +BgkrBgEEAb5YAAMwgcUwgZMGCCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmlj +YXRlIGNvbnN0aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 +aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVudC4wLQYIKwYB +BQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2NwczALBgNVHQ8EBAMCAQYwHQYD +VR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4GA1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4 +ywLQoUmkRzBFMQswCQYDVQQGEwJCTTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UE +AxMSUXVvVmFkaXMgUm9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZV +qyM07ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSemd1o417+s +hvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd+LJ2w/w4E6oM3kJpK27z +POuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2 +Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadNt54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp +8kokUvd0/bpO5qgdAm6xDYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBC +bjPsMZ57k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6szHXu +g/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0jWy10QJLZYxkNc91p +vGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeTmJlglFwjz1onl14LBQaTNx47aTbr +qZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK4SVhM7JZG+Ju1zdXtg2pEto= +-----END CERTIFICATE----- + +XRamp Global CA Root +==================== +-----BEGIN CERTIFICATE----- +MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UE +BhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2Vj +dXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwHhcNMDQxMTAxMTcxNDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMx +HjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkg +U2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS638eMpSe2OAtp87ZOqCwu +IR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCPKZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMx +foArtYzAQDsRhtDLooY2YKTVMIJt2W7QDxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FE +zG+gSqmUsE3a56k0enI4qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqs +AxcZZPRaJSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNViPvry +xS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud +EwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASsjVy16bYbMDYGA1UdHwQvMC0wK6Ap +oCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMC +AQEwDQYJKoZIhvcNAQEFBQADggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc +/Kh4ZzXxHfARvbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt +qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLaIR9NmXmd4c8n +nxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSyi6mx5O+aGtA9aZnuqCij4Tyz +8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQO+7ETPTsJ3xCwnR8gooJybQDJbw= +-----END CERTIFICATE----- + +Go Daddy Class 2 CA +=================== +-----BEGIN CERTIFICATE----- +MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMY +VGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkG +A1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g +RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQAD +ggENADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv +2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+qN1j3hybX2C32 +qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiOr18SPaAIBQi2XKVlOARFmR6j +YGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmY +vLEHZ6IVDd2gWMZEewo+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0O +BBYEFNLEsNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h/t2o +atTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMu +MTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwG +A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wim +PQoZ+YeAEW5p5JYXMP80kWNyOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKt +I3lpjbi2Tc7PTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ +HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mERdEr/VxqHD3VI +Ls9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/b +vZ8= +-----END CERTIFICATE----- + +Starfield Class 2 CA +==================== +-----BEGIN CERTIFICATE----- +MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzElMCMGA1UEChMc +U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIg +Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBo +MQswCQYDVQQGEwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAG +A1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqG +SIb3DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf8MOh2tTY +bitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN+lq2cwQlZut3f+dZxkqZ +JRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVm +epsZGD3/cVE8MC5fvj13c7JdBmzDI1aaK4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSN +F4Azbl5KXZnJHoe0nRrA1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HF +MIHCMB0GA1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fRzt0f +hvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNo +bm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24g +QXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGs +afPzWdqbAYcaT1epoXkJKtv3L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLM +PUxA2IGvd56Deruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl +xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynpVSJYACPq4xJD +KVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3 +QBFGmh95DmK/D5fs4C8fF5Q= +-----END CERTIFICATE----- + +DigiCert Assured ID Root CA +=========================== +-----BEGIN CERTIFICATE----- +MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw +IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzEx +MTEwMDAwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL +ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0Ew +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7cJpSIqvTO +9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYPmDI2dsze3Tyoou9q+yHy +UmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW +/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpy +oeb6pNnVFzF1roV9Iq4/AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whf +GHdPAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRF +66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkq +hkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRCdWKuh+vy1dneVrOfzM4UKLkNl2Bc +EkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38Fn +SbNd67IJKusm7Xi+fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i +8b5QZ7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe ++o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== +-----END CERTIFICATE----- + +DigiCert Global Root CA +======================= +-----BEGIN CERTIFICATE----- +MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw +HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAw +MDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3 +dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkq +hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOn +TjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5 +BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H +4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y +7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQAB +o2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm +8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEF +BQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmr +EbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIt +tep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886 +UAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk +CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= +-----END CERTIFICATE----- + +DigiCert High Assurance EV Root CA +================================== +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw +KQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw +MFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ +MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu +Y2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t +Mqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS +OO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3 +MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ +NAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe +h10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB +Af8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY +JhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ +V8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp +myPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK +mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe +vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K +-----END CERTIFICATE----- + +SwissSign Gold CA - G2 +====================== +-----BEGIN CERTIFICATE----- +MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNVBAYTAkNIMRUw +EwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2lnbiBHb2xkIENBIC0gRzIwHhcN +MDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBFMQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dp +c3NTaWduIEFHMR8wHQYDVQQDExZTd2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0B +AQEFAAOCAg8AMIICCgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUq +t2/876LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+bbqBHH5C +jCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c6bM8K8vzARO/Ws/BtQpg +vd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqEemA8atufK+ze3gE/bk3lUIbLtK/tREDF +ylqM2tIrfKjuvqblCqoOpd8FUrdVxyJdMmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvR +AiTysybUa9oEVeXBCsdtMDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuend +jIj3o02yMszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69yFGkO +peUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPiaG59je883WX0XaxR +7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxMgI93e2CaHt+28kgeDrpOVG2Y4OGi +GqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUw +AwEB/zAdBgNVHQ4EFgQUWyV7lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64 +OfPAeGZe6Drn8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov +L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe645R88a7A3hfm +5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczOUYrHUDFu4Up+GC9pWbY9ZIEr +44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOf +Mke6UiI0HTJ6CVanfCU2qT1L2sCCbwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6m +Gu6uLftIdxf+u+yvGPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxp +mo/a77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCChdiDyyJk +vC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid392qgQmwLOM7XdVAyksLf +KzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEppLd6leNcG2mqeSz53OiATIgHQv2ieY2Br +NU0LbbqhPcCT4H8js1WtciVORvnSFu+wZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6Lqj +viOvrv1vA+ACOzB2+httQc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ +-----END CERTIFICATE----- + +SwissSign Silver CA - G2 +======================== +-----BEGIN CERTIFICATE----- +MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCQ0gxFTAT +BgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMB4X +DTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0NlowRzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3 +aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG +9w0BAQEFAAOCAg8AMIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644 +N0MvFz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7brYT7QbNHm ++/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieFnbAVlDLaYQ1HTWBCrpJH +6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH6ATK72oxh9TAtvmUcXtnZLi2kUpCe2Uu +MGoM9ZDulebyzYLs2aFK7PayS+VFheZteJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5h +qAaEuSh6XzjZG6k4sIN/c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5 +FZGkECwJMoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRHHTBs +ROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTfjNFusB3hB48IHpmc +celM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb65i/4z3GcRm25xBWNOHkDRUjvxF3X +CO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ +BAUwAwEB/zAdBgNVHQ4EFgQUF6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRB +tjpbO8tFnb0cwpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0 +cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBAHPGgeAn0i0P +4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShpWJHckRE1qTodvBqlYJ7YH39F +kWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L +3XWgwF15kIwb4FDm3jH+mHtwX6WQ2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx +/uNncqCxv1yL5PqZIseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFa +DGi8aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2Xem1ZqSqP +e97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQRdAtq/gsD/KNVV4n+Ssuu +WxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJ +DIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ub +DgEj8Z+7fNzcbBGXJbLytGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u +-----END CERTIFICATE----- + +SecureTrust CA +============== +-----BEGIN CERTIFICATE----- +MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQG +EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xFzAVBgNVBAMTDlNlY3VyZVRy +dXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIzMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAe +BgNVBAoTF1NlY3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCC +ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQX +OZEzZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO0gMdA+9t +DWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIaowW8xQmxSPmjL8xk037uH +GFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b +01k/unK8RCSc43Oz969XL0Imnal0ugBS8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmH +ursCAwEAAaOBnTCBmjATBgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/ +BAUwAwEB/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCegJYYj +aHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ +KoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt36Z3q059c4EVlew3KW+JwULKUBRSu +SceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHf +mbx8IVQr5Fiiu1cprp6poxkmD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZ +nMUFdAvnZyPSCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR +3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= +-----END CERTIFICATE----- + +Secure Global CA +================ +-----BEGIN CERTIFICATE----- +MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQG +EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBH +bG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkxMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEg +MB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwg +Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jx +YDiJiQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa/FHtaMbQ +bqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJjnIFHovdRIWCQtBJwB1g +8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnIHmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYV +HDGA76oYa8J719rO+TMg1fW9ajMtgQT7sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi +0XPnj3pDAgMBAAGjgZ0wgZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud +EwEB/wQFMAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCswKaAn +oCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsGAQQBgjcVAQQDAgEA +MA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0LURYD7xh8yOOvaliTFGCRsoTciE6+ +OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXOH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cn +CDpOGR86p1hcF895P4vkp9MmI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/5 +3CYNv6ZHdAbYiNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc +f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW +-----END CERTIFICATE----- + +COMODO Certification Authority +============================== +-----BEGIN CERTIFICATE----- +MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UE +BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG +A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNVBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1 +dGhvcml0eTAeFw0wNjEyMDEwMDAwMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEb +MBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD +T01PRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3UcEbVASY06m/weaKXTuH ++7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI2GqGd0S7WWaXUF601CxwRM/aN5VCaTww +xHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV +4EajcNxo2f8ESIl33rXp+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA +1KGzqSX+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5OnKVI +rLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLmNvbW9k +b2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOC +AQEAPpiem/Yb6dc5t3iuHXIYSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CP +OGEIqB6BCsAvIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ +RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4zJVSk/BwJVmc +IGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN ++8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ== +-----END CERTIFICATE----- + +COMODO ECC Certification Authority +================================== +-----BEGIN CERTIFICATE----- +MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTELMAkGA1UEBhMC +R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE +ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwHhcNMDgwMzA2MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0Ix +GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR +Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRo +b3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSRFtSrYpn1PlILBs5BAH+X +4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0JcfRK9ChQtP6IHG4/bC8vCVlbpVsLM5ni +wz2J+Wos77LTBumjQjBAMB0GA1UdDgQWBBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VG +FAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA +U/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= +-----END CERTIFICATE----- + +Certigna +======== +-----BEGIN CERTIFICATE----- +MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNVBAYTAkZSMRIw +EAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4XDTA3MDYyOTE1MTMwNVoXDTI3 +MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwI +Q2VydGlnbmEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7q +XOEm7RFHYeGifBZ4QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyH +GxnygQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbwzBfsV1/p +ogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q130yGLMLLGq/jj8UEYkg +DncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKf +Irjxwo1p3Po6WAbfAgMBAAGjgbwwgbkwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQ +tCRZvgHyUtVF9lo53BEwZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJ +BgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzjAQ/J +SP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQUFAAOCAQEA +hQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8hbV6lUmPOEvjvKtpv6zf+EwLHyzs+ +ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFncfca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1klu +PBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY +1gkIl2PlwS6wt0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw +WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== +-----END CERTIFICATE----- + +ePKI Root Certification Authority +================================= +-----BEGIN CERTIFICATE----- +MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBeMQswCQYDVQQG +EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xKjAoBgNVBAsMIWVQS0kg +Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMx +MjdaMF4xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEq +MCgGA1UECwwhZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0B +AQEFAAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAHSyZbCUNs +IZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAhijHyl3SJCRImHJ7K2RKi +lTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3XDZoTM1PRYfl61dd4s5oz9wCGzh1NlDiv +qOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX +12ruOzjjK9SXDrkb5wdJfzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0O +WQqraffAsgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uUWH1+ +ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLSnT0IFaUQAS2zMnao +lQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pHdmX2Os+PYhcZewoozRrSgx4hxyy/ +vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJipNiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXi +Zo1jDiVN1Rmy5nk3pyKdVDECAwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/Qkqi +MAwGA1UdEwQFMAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH +ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGBuvl2ICO1J2B0 +1GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6YlPwZpVnPDimZI+ymBV3QGypzq +KOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkPJXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdV +xrsStZf0X4OFunHB2WyBEXYKCrC/gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEP +NXubrjlpC2JgQCA2j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+r +GNm65ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUBo2M3IUxE +xJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS/jQ6fbjpKdx2qcgw+BRx +gMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2zGp1iro2C6pSe3VkQw63d4k3jMdXH7Ojy +sP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTEW9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmOD +BCEIZ43ygknQW/2xzQ+DhNQ+IIX3Sj0rnP0qCglN6oH4EZw= +-----END CERTIFICATE----- + +certSIGN ROOT CA +================ +-----BEGIN CERTIFICATE----- +MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYTAlJPMREwDwYD +VQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTAeFw0wNjA3MDQxNzIwMDRa +Fw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UE +CxMQY2VydFNJR04gUk9PVCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7I +JUqOtdu0KBuqV5Do0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHH +rfAQUySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5dRdY4zTW2 +ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQOA7+j0xbm0bqQfWwCHTD +0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwvJoIQ4uNllAoEwF73XVv4EOLQunpL+943 +AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B +Af8EBAMCAcYwHQYDVR0OBBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IB +AQA+0hyJLjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecYMnQ8 +SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ44gx+FkagQnIl6Z0 +x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6IJd1hJyMctTEHBDa0GpC9oHRxUIlt +vBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNwi/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7Nz +TogVZ96edhBiIL5VaZVDADlN9u6wWk5JRFRYX0KD +-----END CERTIFICATE----- + +NetLock Arany (Class Gold) Főtanúsítvány +======================================== +-----BEGIN CERTIFICATE----- +MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G +A1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610 +dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBB +cmFueSAoQ2xhc3MgR29sZCkgRsWRdGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgx +MjA2MTUwODIxWjCBpzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxO +ZXRMb2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlmaWNhdGlv +biBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEbFkXRhbsO6 +c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxCRec75LbRTDofTjl5Bu +0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrTlF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw +/HpYzY6b7cNGbIRwXdrzAZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAk +H3B5r9s5VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRGILdw +fzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2BJtr+UBdADTHLpl1 +neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAGAQH/AgEEMA4GA1UdDwEB/wQEAwIB +BjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2MU9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwW +qZw8UQCgwBEIBaeZ5m8BiFRhbvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTta +YtOUZcTh5m2C+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC +bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2FuLjbvrW5Kfna +NwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQu +dZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= +-----END CERTIFICATE----- + +SecureSign RootCA11 +=================== +-----BEGIN CERTIFICATE----- +MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDErMCkGA1UEChMi +SmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoGA1UEAxMTU2VjdXJlU2lnbiBS +b290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSsw +KQYDVQQKEyJKYXBhbiBDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1 +cmVTaWduIFJvb3RDQTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvL +TJszi1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8h9uuywGO +wvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOVMdrAG/LuYpmGYz+/3ZMq +g6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rP +O7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitA +bpSACW22s293bzUIUPsCh8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZX +t94wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAKCh +OBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xmKbabfSVSSUOrTC4r +bnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQX5Ucv+2rIrVls4W6ng+4reV6G4pQ +Oh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWrQbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01 +y8hSyn+B/tlr0/cR7SXf+Of5pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061 +lgeLKBObjBmNQSdJQO7e5iNEOdyhIta6A/I= +-----END CERTIFICATE----- + +Microsec e-Szigno Root CA 2009 +============================== +-----BEGIN CERTIFICATE----- +MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYDVQQGEwJIVTER +MA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jv +c2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o +dTAeFw0wOTA2MTYxMTMwMThaFw0yOTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UE +BwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUt +U3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvPkd6mJviZpWNwrZuuyjNA +fW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tccbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG +0IMZfcChEhyVbUr02MelTTMuhTlAdX4UfIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKA +pxn1ntxVUwOXewdI/5n7N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm +1HxdrtbCxkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1+rUC +AwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTLD8bf +QkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAbBgNVHREE +FDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqGSIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0o +lZMEyL/azXm4Q5DwpL7v8u8hmLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfX +I/OMn74dseGkddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 +tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c2Pm2G2JwCz02 +yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5tHMN1Rq41Bab2XD0h7lbwyYIi +LXpUq3DDfSJlgnCW +-----END CERTIFICATE----- + +GlobalSign Root CA - R3 +======================= +-----BEGIN CERTIFICATE----- +MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4GA1UECxMXR2xv +YmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh +bFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT +aWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln +bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWt +iHL8RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsTgHeMCOFJ +0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmmKPZpO/bLyCiR5Z2KYVc3 +rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zdQQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjl +OCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZXriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2 +xmmFghcCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE +FI/wS3+oLkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZURUm7 +lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMpjjM5RcOO5LlXbKr8 +EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK6fBdRoyV3XpYKBovHd7NADdBj+1E +bddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQXmcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18 +YIvDQVETI53O9zJrlAGomecsMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7r +kpeDMdmztcpHWD9f +-----END CERTIFICATE----- + +Izenpe.com +========== +-----BEGIN CERTIFICATE----- +MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4MQswCQYDVQQG +EwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wHhcNMDcxMjEz +MTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMu +QS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ +03rKDx6sp4boFmVqscIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAK +ClaOxdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6HLmYRY2xU ++zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFXuaOKmMPsOzTFlUFpfnXC +PCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQDyCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxT +OTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbK +F7jJeodWLBoBHmy+E60QrLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK +0GqfvEyNBjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8Lhij+ +0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIBQFqNeb+Lz0vPqhbB +leStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+HMh3/1uaD7euBUbl8agW7EekFwID +AQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2luZm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+ +SVpFTlBFIFMuQS4gLSBDSUYgQTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBG +NjIgUzgxQzBBBgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx +MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O +BBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUAA4ICAQB4pgwWSp9MiDrAyw6l +Fn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWblaQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbga +kEyrkgPH7UIBzg/YsfqikuFgba56awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8q +hT/AQKM6WfxZSzwoJNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Cs +g1lwLDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCTVyvehQP5 +aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGkLhObNA5me0mrZJfQRsN5 +nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJbUjWumDqtujWTI6cfSN01RpiyEGjkpTHC +ClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZo +Q0iy2+tzJOeRf1SktoA+naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1Z +WrOZyGlsQyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw== +-----END CERTIFICATE----- + +Go Daddy Root Certificate Authority - G2 +======================================== +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT +B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMu +MTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 +MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 +b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8G +A1UEAxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKDE6bFIEMBO4Tx5oVJnyfq +9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD ++qK+ihVqf94Lw7YZFAXK6sOoBJQ7RnwyDfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutd +fMh8+7ArU6SSYmlRJQVhGkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMl +NAJWJwGRtDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEAAaNC +MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFDqahQcQZyi27/a9 +BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmXWWcDYfF+OwYxdS2hII5PZYe096ac +vNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r +5N9ss4UXnT3ZJE95kTXWXwTrgIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYV +N8Gb5DKj7Tjo2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO +LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI4uJEvlz36hz1 +-----END CERTIFICATE----- + +Starfield Root Certificate Authority - G2 +========================================= +-----BEGIN CERTIFICATE----- +MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT +B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s +b2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0 +eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAw +DgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQg +VGVjaG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBB +dXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3twQP89o/8ArFv +W59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMgnLRJdzIpVv257IzdIvpy3Cdhl+72WoTs +bhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNk +N3mSwOxGXn/hbVNMYq/NHwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7Nf +ZTD4p7dNdloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0HZbU +JtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0GCSqGSIb3DQEBCwUAA4IBAQARWfol +TwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjUsHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx +4mcujJUDJi5DnUox9g61DLu34jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUw +F5okxBDgBPfg8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K +pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1mMpYjn0q7pBZ +c2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 +-----END CERTIFICATE----- + +Starfield Services Root Certificate Authority - G2 +================================================== +-----BEGIN CERTIFICATE----- +MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT +B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s +b2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRl +IEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNV +BAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxT +dGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2VydmljZXMg +Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC +AQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20pOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2 +h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm28xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4Pa +hHQUw2eeBGg6345AWh1KTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLP +LJGmpufehRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk6mFB +rMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAwDwYDVR0TAQH/BAUw +AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMA0GCSqG +SIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMIbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPP +E95Dz+I0swSdHynVv/heyNXBve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTy +xQGjhdByPq1zqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd +iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn0q23KXB56jza +YyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCNsSi6 +-----END CERTIFICATE----- + +AffirmTrust Commercial +====================== +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UEBhMCVVMxFDAS +BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMB4XDTEw +MDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly +bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6Eqdb +DuKPHx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yrba0F8PrV +C8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPALMeIrJmqbTFeurCA+ukV6 +BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1yHp52UKqK39c/s4mT6NmgTWvRLpUHhww +MmWd5jyTXlBOeuM61G7MGvv50jeuJCqrVwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNV +HQ4EFgQUnZPGU4teyq8/nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwDQYJKoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYGXUPG +hi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNjvbz4YYCanrHOQnDi +qX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivtZ8SOyUOyXGsViQK8YvxO8rUzqrJv +0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9gN53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0kh +sUlHRUe072o0EclNmsxZt9YCnlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= +-----END CERTIFICATE----- + +AffirmTrust Networking +====================== +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UEBhMCVVMxFDAS +BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMB4XDTEw +MDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly +bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SE +Hi3yYJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbuakCNrmreI +dIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRLQESxG9fhwoXA3hA/Pe24 +/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gb +h+0t+nvujArjqWaJGctB+d1ENmHP4ndGyH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNV +HQ4EFgQUBx/S55zawm6iQLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwDQYJKoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfOtDIu +UFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzuQY0x2+c06lkh1QF6 +12S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZLgo/bNjR9eUJtGxUAArgFU2HdW23 +WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4uolu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9 +/ZFvgrG+CJPbFEfxojfHRZ48x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= +-----END CERTIFICATE----- + +AffirmTrust Premium +=================== +-----BEGIN CERTIFICATE----- +MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UEBhMCVVMxFDAS +BgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMB4XDTEwMDEy +OTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRy +dXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A +MIICCgKCAgEAxBLfqV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtn +BKAQJG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ+jjeRFcV +5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrSs8PhaJyJ+HoAVt70VZVs ++7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmd +GPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d770O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5R +p9EixAqnOEhss/n/fauGV+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NI +S+LI+H+SqHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S5u04 +6uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4IaC1nEWTJ3s7xgaVY5 +/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TXOwF0lkLgAOIua+rF7nKsu7/+6qqo ++Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYEFJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB +/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByv +MiPIs0laUZx2KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg +Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B8OWycvpEgjNC +6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQMKSOyARiqcTtNd56l+0OOF6S +L5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK ++4w1IX2COPKpVJEZNZOUbWo6xbLQu4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmV +BtWVyuEklut89pMFu+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFg +IxpHYoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8GKa1qF60 +g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaORtGdFNrHF+QFlozEJLUb +zxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6eKeC2uAloGRwYQw== +-----END CERTIFICATE----- + +AffirmTrust Premium ECC +======================= +-----BEGIN CERTIFICATE----- +MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMCVVMxFDASBgNV +BAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQzAeFw0xMDAx +MjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJBgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1U +cnVzdDEgMB4GA1UEAwwXQWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQA +IgNiAAQNMF4bFZ0D0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQ +N8O9ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0GA1UdDgQW +BBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAK +BggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/VsaobgxCd05DhT1wV/GzTjxi+zygk8N53X +57hG8f2h4nECMEJZh0PUUd+60wkyWs6Iflc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKM +eQ== +-----END CERTIFICATE----- + +Certum Trusted Network CA +========================= +-----BEGIN CERTIFICATE----- +MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBMMSIwIAYDVQQK +ExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIy +MTIwNzM3WhcNMjkxMjMxMTIwNzM3WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBU +ZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +MSIwIAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rHUV+rpDKmYYe2bg+G0jAC +l/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LMTXPb865Px1bVWqeWifrzq2jUI4ZZJ88J +J7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVUBBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4 +fOQtf/WsX+sWn7Et0brMkUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0 +cvW0QM8xAcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNVHRMB +Af8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNVHQ8BAf8EBAMCAQYw +DQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15ysHhE49wcrwn9I0j6vSrEuVUEtRCj +jSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfLI9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1 +mS1FhIrlQgnXdAIv94nYmem8J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5aj +Zt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI +03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= +-----END CERTIFICATE----- + +TWCA Root Certification Authority +================================= +-----BEGIN CERTIFICATE----- +MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJ +VEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMzWhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQG +EwJUVzESMBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NB +IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK +AoIBAQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFEAcK0HMMx +QhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HHK3XLfJ+utdGdIzdjp9xC +oi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeXRfwZVzsrb+RH9JlF/h3x+JejiB03HFyP +4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/zrX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1r +y+UPizgN7gr8/g+YnzAx3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIB +BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkqhkiG +9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeCMErJk/9q56YAf4lC +mtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdlsXebQ79NqZp4VKIV66IIArB6nCWlW +QtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62Dlhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVY +T0bf+215WfKEIlKuD8z7fDvnaspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocny +Yh0igzyXxfkZYiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== +-----END CERTIFICATE----- + +Security Communication RootCA2 +============================== +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDElMCMGA1UEChMc +U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMeU2VjdXJpdHkgQ29tbXVuaWNh +dGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoXDTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMC +SlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3Vy +aXR5IENvbW11bmljYXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +ANAVOVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGrzbl+dp++ ++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVMVAX3NuRFg3sUZdbcDE3R +3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQhNBqyjoGADdH5H5XTz+L62e4iKrFvlNV +spHEfbmwhRkGeC7bYRr6hfVKkaHnFtWOojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1K +EOtOghY6rCcMU/Gt1SSwawNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8 +QIH4D5csOPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEB +CwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpFcoJxDjrSzG+ntKEj +u/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXcokgfGT+Ok+vx+hfuzU7jBBJV1uXk +3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6q +tnRGEmyR7jTV7JqR50S+kDFy1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29 +mvVXIwAHIRc/SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 +-----END CERTIFICATE----- + +Actalis Authentication Root CA +============================== +-----BEGIN CERTIFICATE----- +MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UEBhMCSVQxDjAM +BgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UE +AwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDky +MjExMjIwMlowazELMAkGA1UEBhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlz +IFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290 +IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNvUTufClrJ +wkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX4ay8IMKx4INRimlNAJZa +by/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9KK3giq0itFZljoZUj5NDKd45RnijMCO6 +zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1f +YVEiVRvjRuPjPdA1YprbrxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2 +oxgkg4YQ51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2Fbe8l +EfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxeKF+w6D9Fz8+vm2/7 +hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4Fv6MGn8i1zeQf1xcGDXqVdFUNaBr8 +EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbnfpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5 +jF66CyCU3nuDuP/jVo23Eek7jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLY +iDrIn3hm7YnzezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt +ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQALe3KHwGCmSUyI +WOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70jsNjLiNmsGe+b7bAEzlgqqI0 +JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDzWochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKx +K3JCaKygvU5a2hi/a5iB0P2avl4VSM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+ +Xlff1ANATIGk0k9jpwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC +4yyXX04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+OkfcvHlXHo +2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7RK4X9p2jIugErsWx0Hbhz +lefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btUZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXem +OR/qnuOf0GZvBeyqdn6/axag67XH/JJULysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9 +vwGYT7JZVEc+NHt4bVaTLnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg== +-----END CERTIFICATE----- + +Buypass Class 2 Root CA +======================= +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU +QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMiBSb290IENBMB4X +DTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1owTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1 +eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIw +DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1 +g1Lr6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPVL4O2fuPn +9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC911K2GScuVr1QGbNgGE41b +/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHxMlAQTn/0hpPshNOOvEu/XAFOBz3cFIqU +CqTqc/sLUegTBxj6DvEr0VQVfTzh97QZQmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeff +awrbD02TTqigzXsu8lkBarcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgI +zRFo1clrUs3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLiFRhn +Bkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRSP/TizPJhk9H9Z2vX +Uq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN9SG9dKpN6nIDSdvHXx1iY8f93ZHs +M+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxPAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD +VR0OBBYEFMmAd+BikoL1RpzzuvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF +AAOCAgEAU18h9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s +A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3tOluwlN5E40EI +osHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo+fsicdl9sz1Gv7SEr5AcD48S +aq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYd +DnkM/crqJIByw5c/8nerQyIKx+u2DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWD +LfJ6v9r9jv6ly0UsH8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0 +oyLQI+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK75t98biGC +wWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h3PFaTWwyI0PurKju7koS +CTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPzY11aWOIv4x3kqdbQCtCev9eBCfHJxyYN +rJgWVqA= +-----END CERTIFICATE----- + +Buypass Class 3 Root CA +======================= +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU +QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMyBSb290IENBMB4X +DTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFowTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1 +eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIw +DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRH +sJ8YZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3EN3coTRiR +5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9tznDDgFHmV0ST9tD+leh +7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX0DJq1l1sDPGzbjniazEuOQAnFN44wOwZ +ZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH +2xc519woe2v1n/MuwU8XKhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV +/afmiSTYzIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvSO1UQ +RwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D34xFMFbG02SrZvPA +Xpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgPK9Dx2hzLabjKSWJtyNBjYt1gD1iq +j6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD +VR0OBBYEFEe4zf/lb+74suwvTg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF +AAOCAgEAACAjQTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV +cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXSIGrs/CIBKM+G +uIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2HJLw5QY33KbmkJs4j1xrG0aG +Q0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsaO5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8 +ZORK15FTAaggiG6cX0S5y2CBNOxv033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2 +KSb12tjE8nVhz36udmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz +6MkEkbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg413OEMXbug +UZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvDu79leNKGef9JOxqDDPDe +eOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq4/g7u9xN12TyUb7mqqta6THuBrxzvxNi +Cp/HuZc= +-----END CERTIFICATE----- + +T-TeleSec GlobalRoot Class 3 +============================ +-----BEGIN CERTIFICATE----- +MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM +IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU +cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgx +MDAxMTAyOTU2WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz +dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD +ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN8ELg63iIVl6bmlQdTQyK +9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/RLyTPWGrTs0NvvAgJ1gORH8EGoel15YU +NpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZF +iP0Zf3WHHx+xGwpzJFu5ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W +0eDrXltMEnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGjQjBA +MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1A/d2O2GCahKqGFPr +AyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOyWL6ukK2YJ5f+AbGwUgC4TeQbIXQb +fsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzT +ucpH9sry9uetuUg/vBa3wW306gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7h +P0HHRwA11fXT91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml +e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4pTpPDpFQUWw== +-----END CERTIFICATE----- + +D-TRUST Root Class 3 CA 2 2009 +============================== +-----BEGIN CERTIFICATE----- +MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQK +DAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTAe +Fw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NThaME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxE +LVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOAD +ER03UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42tSHKXzlA +BF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9RySPocq60vFYJfxLLHLGv +KZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsMlFqVlNpQmvH/pStmMaTJOKDfHR+4CS7z +p+hnUquVH+BGPtikw8paxTGA6Eian5Rp/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUC +AwEAAaOCARowggEWMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ +4PGEMA4GA1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVjdG9y +eS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUyMENBJTIwMiUyMDIw +MDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRlcmV2b2NhdGlvbmxpc3QwQ6BBoD+G +PWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3JsL2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAw +OS5jcmwwDQYJKoZIhvcNAQELBQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm +2H6NMLVwMeniacfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0 +o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4KzCUqNQT4YJEV +dT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8PIWmawomDeCTmGCufsYkl4ph +X5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3YJohw1+qRzT65ysCQblrGXnRl11z+o+I= +-----END CERTIFICATE----- + +D-TRUST Root Class 3 CA 2 EV 2009 +================================= +-----BEGIN CERTIFICATE----- +MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK +DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw +OTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUwNDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK +DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw +OTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfS +egpnljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM03TP1YtHh +zRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6ZqQTMFexgaDbtCHu39b+T +7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lRp75mpoo6Kr3HGrHhFPC+Oh25z1uxav60 +sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure35 +11H3a6UCAwEAAaOCASQwggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyv +cop9NteaHNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFwOi8v +ZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xhc3MlMjAzJTIwQ0El +MjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1ERT9jZXJ0aWZpY2F0ZXJldm9jYXRp +b25saXN0MEagRKBChkBodHRwOi8vd3d3LmQtdHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xh +c3NfM19jYV8yX2V2XzIwMDkuY3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+ +PPoeUSbrh/Yp3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05 +nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNFCSuGdXzfX2lX +ANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7naxpeG0ILD5EJt/rDiZE4OJudA +NCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqXKVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVv +w9y4AyHqnxbxLFS1 +-----END CERTIFICATE----- + +CA Disig Root R2 +================ +-----BEGIN CERTIFICATE----- +MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNVBAYTAlNLMRMw +EQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMuMRkwFwYDVQQDExBDQSBEaXNp +ZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQyMDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sx +EzARBgNVBAcTCkJyYXRpc2xhdmExEzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERp +c2lnIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbC +w3OeNcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNHPWSb6Wia +xswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3Ix2ymrdMxp7zo5eFm1tL7 +A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbeQTg06ov80egEFGEtQX6sx3dOy1FU+16S +GBsEWmjGycT6txOgmLcRK7fWV8x8nhfRyyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqV +g8NTEQxzHQuyRpDRQjrOQG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa +5Beny912H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJQfYE +koopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUDi/ZnWejBBhG93c+A +Ak9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORsnLMOPReisjQS1n6yqEm70XooQL6i +Fh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNV +HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5u +Qu0wDQYJKoZIhvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM +tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqfGopTpti72TVV +sRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkblvdhuDvEK7Z4bLQjb/D907Je +dR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka+elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W8 +1k/BfDxujRNt+3vrMNDcTa/F1balTFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjx +mHHEt38OFdAlab0inSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01 +utI3gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18DrG5gPcFw0 +sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3OszMOl6W8KjptlwlCFtaOg +UxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8xL4ysEr3vQCj8KWefshNPZiTEUxnpHikV +7+ZtsH8tZ/3zbBt1RqPlShfppNcL +-----END CERTIFICATE----- + +ACCVRAIZ1 +========= +-----BEGIN CERTIFICATE----- +MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UEAwwJQUNDVlJB +SVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQswCQYDVQQGEwJFUzAeFw0xMTA1 +MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQBgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwH +UEtJQUNDVjENMAsGA1UECgwEQUNDVjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4IC +DwAwggIKAoICAQCbqau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gM +jmoYHtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWoG2ioPej0 +RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpAlHPrzg5XPAOBOp0KoVdD +aaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhrIA8wKFSVf+DuzgpmndFALW4ir50awQUZ +0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDG +WuzndN9wrqODJerWx5eHk6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs7 +8yM2x/474KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMOm3WR +5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpacXpkatcnYGMN285J +9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPluUsXQA+xtrn13k/c4LOsOxFwYIRK +Q26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYIKwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRw +Oi8vd3d3LmFjY3YuZXMvZmlsZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEu +Y3J0MB8GCCsGAQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2 +VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeTVfZW6oHlNsyM +Hj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIGCCsGAQUFBwICMIIBFB6CARAA +QQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUAcgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBh +AO0AegAgAGQAZQAgAGwAYQAgAEEAQwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUA +YwBuAG8AbABvAGcA7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBj +AHQAcgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAAQwBQAFMA +IABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUAczAwBggrBgEFBQcCARYk +aHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2MuaHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0 +dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRtaW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2 +MV9kZXIuY3JsMA4GA1UdDwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZI +hvcNAQEFBQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdpD70E +R9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gUJyCpZET/LtZ1qmxN +YEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+mAM/EKXMRNt6GGT6d7hmKG9Ww7Y49 +nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepDvV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJ +TS+xJlsndQAJxGJ3KQhfnlmstn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3 +sCPdK6jT2iWH7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h +I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szAh1xA2syVP1Xg +Nce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xFd3+YJ5oyXSrjhO7FmGYvliAd +3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2HpPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3p +EfbRD0tVNEYqi4Y7 +-----END CERTIFICATE----- + +TWCA Global Root CA +=================== +-----BEGIN CERTIFICATE----- +MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcxEjAQBgNVBAoT +CVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMTVFdDQSBHbG9iYWwgUm9vdCBD +QTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQK +EwlUQUlXQU4tQ0ExEDAOBgNVBAsTB1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3Qg +Q0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2C +nJfF10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz0ALfUPZV +r2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfChMBwqoJimFb3u/Rk28OKR +Q4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbHzIh1HrtsBv+baz4X7GGqcXzGHaL3SekV +tTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1W +KKD+u4ZqyPpcC1jcxkt2yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99 +sy2sbZCilaLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYPoA/p +yJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQABDzfuBSO6N+pjWxn +kjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcEqYSjMq+u7msXi7Kx/mzhkIyIqJdI +zshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMC +AQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6g +cFGn90xHNcgL1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn +LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WFH6vPNOw/KP4M +8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNoRI2T9GRwoD2dKAXDOXC4Ynsg +/eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlg +lPx4mI88k1HtQJAH32RjJMtOcQWh15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryP +A9gK8kxkRr05YuWW6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3m +i4TWnsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5jwa19hAM8 +EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWzaGHQRiapIVJpLesux+t3 +zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmyKwbQBM0= +-----END CERTIFICATE----- + +TeliaSonera Root CA v1 +====================== +-----BEGIN CERTIFICATE----- +MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAwNzEUMBIGA1UE +CgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJvb3QgQ0EgdjEwHhcNMDcxMDE4 +MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYDVQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwW +VGVsaWFTb25lcmEgUm9vdCBDQSB2MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+ +6yfwIaPzaSZVfp3FVRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA +3GV17CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+XZ75Ljo1k +B1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+/jXh7VB7qTCNGdMJjmhn +Xb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxH +oLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkmdtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3 +F0fUTPHSiXk+TT2YqGHeOh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJ +oWjiUIMusDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4pgd7 +gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fsslESl1MpWtTwEhDc +TwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQarMCpgKIv7NHfirZ1fpoeDVNAgMB +AAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qW +DNXr+nuqF+gTEjANBgkqhkiG9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNm +zqjMDfz1mgbldxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx +0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1TjTQpgcmLNkQfW +pb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBedY2gea+zDTYa4EzAvXUYNR0PV +G6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpc +c41teyWRyu5FrgZLAMzTsVlQ2jqIOylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOT +JsjrDNYmiLbAJM+7vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2 +qReWt88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcnHL/EVlP6 +Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVxSK236thZiNSQvxaz2ems +WWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY= +-----END CERTIFICATE----- + +T-TeleSec GlobalRoot Class 2 +============================ +-----BEGIN CERTIFICATE----- +MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM +IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU +cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgx +MDAxMTA0MDE0WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz +dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD +ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUdAqSzm1nzHoqvNK38DcLZ +SBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiCFoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/F +vudocP05l03Sx5iRUKrERLMjfTlH6VJi1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx970 +2cu+fjOlbpSD8DT6IavqjnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGV +WOHAD3bZwI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGjQjBA +MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/WSA2AHmgoCJrjNXy +YdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhyNsZt+U2e+iKo4YFWz827n+qrkRk4 +r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPACuvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNf +vNoBYimipidx5joifsFvHZVwIEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR +3p1m0IvVVGb6g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN +9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlPBSeOE6Fuwg== +-----END CERTIFICATE----- + +Atos TrustedRoot 2011 +===================== +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UEAwwVQXRvcyBU +cnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQGEwJERTAeFw0xMTA3MDcxNDU4 +MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMMFUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsG +A1UECgwEQXRvczELMAkGA1UEBhMCREUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCV +hTuXbyo7LjvPpvMpNb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr +54rMVD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+SZFhyBH+ +DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ4J7sVaE3IqKHBAUsR320 +HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0Lcp2AMBYHlT8oDv3FdU9T1nSatCQujgKR +z3bFmx5VdJx4IbHwLfELn8LVlhgf8FQieowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7R +l+lwrrw7GWzbITAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZ +bNshMBgGA1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB +CwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8jvZfza1zv7v1Apt+h +k6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kPDpFrdRbhIfzYJsdHt6bPWHJxfrrh +TZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pcmaHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a9 +61qn8FYiqTxlVMYVqL2Gns2Dlmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G +3mB/ufNPRJLvKrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed +-----END CERTIFICATE----- + +QuoVadis Root CA 1 G3 +===================== +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQELBQAwSDELMAkG +A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv +b3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJN +MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEg +RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakE +PBtVwedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWerNrwU8lm +PNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF34168Xfuw6cwI2H44g4hWf6 +Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh4Pw5qlPafX7PGglTvF0FBM+hSo+LdoIN +ofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXpUhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/l +g6AnhF4EwfWQvTA9xO+oabw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV +7qJZjqlc3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/GKubX +9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSthfbZxbGL0eUQMk1f +iyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KOTk0k+17kBL5yG6YnLUlamXrXXAkg +t3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOtzCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZI +hvcNAQELBQADggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC +MTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2cDMT/uFPpiN3 +GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUNqXsCHKnQO18LwIE6PWThv6ct +Tr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP ++V04ikkwj+3x6xn0dxoxGE1nVGwvb2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh +3jRJjehZrJ3ydlo28hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fa +wx/kNSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNjZgKAvQU6 +O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhpq1467HxpvMc7hU6eFbm0 +FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFtnh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOV +hMJKzRwuJIczYOXD +-----END CERTIFICATE----- + +QuoVadis Root CA 2 G3 +===================== +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQELBQAwSDELMAkG +A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv +b3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJN +MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIg +RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFh +ZiFfqq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMWn4rjyduY +NM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ymc5GQYaYDFCDy54ejiK2t +oIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+O7q414AB+6XrW7PFXmAqMaCvN+ggOp+o +MiwMzAkd056OXbxMmO7FGmh77FOm6RQ1o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+l +V0POKa2Mq1W/xPtbAd0jIaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZo +L1NesNKqIcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz8eQQ +sSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43ehvNURG3YBZwjgQQvD +6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l7ZizlWNof/k19N+IxWA1ksB8aRxh +lRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALGcC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZI +hvcNAQELBQADggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66 +AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RCroijQ1h5fq7K +pVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0GaW/ZZGYjeVYg3UQt4XAoeo0L9 +x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4nlv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgz +dWqTHBLmYF5vHX/JHyPLhGGfHoJE+V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6X +U/IyAgkwo1jwDQHVcsaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+Nw +mNtddbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNgKCLjsZWD +zYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeMHVOyToV7BjjHLPj4sHKN +JeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4WSr2Rz0ZiC3oheGe7IUIarFsNMkd7Egr +O3jtZsSOeWmD3n+M +-----END CERTIFICATE----- + +QuoVadis Root CA 3 G3 +===================== +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQELBQAwSDELMAkG +A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv +b3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJN +MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMg +RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286 +IxSR/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNuFoM7pmRL +Mon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXRU7Ox7sWTaYI+FrUoRqHe +6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+cra1AdHkrAj80//ogaX3T7mH1urPnMNA3 +I4ZyYUUpSFlob3emLoG+B01vr87ERRORFHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3U +VDmrJqMz6nWB2i3ND0/kA9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f7 +5li59wzweyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634RylsSqi +Md5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBpVzgeAVuNVejH38DM +dyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0QA4XN8f+MFrXBsj6IbGB/kE+V9/Yt +rQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZI +hvcNAQELBQADggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px +KGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnIFUBhynLWcKzS +t/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5WvvoxXqA/4Ti2Tk08HS6IT7SdEQ +TXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFgu/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9Du +DcpmvJRPpq3t/O5jrFc/ZSXPsoaP0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGib +Ih6BJpsQBJFxwAYf3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmD +hPbl8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+DhcI00iX +0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HNPlopNLk9hM6xZdRZkZFW +dSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/ywaZWWDYWGWVjUTR939+J399roD1B0y2 +PpxxVJkES/1Y+Zj0 +-----END CERTIFICATE----- + +DigiCert Assured ID Root G2 +=========================== +-----BEGIN CERTIFICATE----- +MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw +IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgw +MTE1MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL +ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIw +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSAn61UQbVH +35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4HteccbiJVMWWXvdMX0h5i89vq +bFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9HpEgjAALAcKxHad3A2m67OeYfcgnDmCXRw +VWmvo2ifv922ebPynXApVfSr/5Vh88lAbx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OP +YLfykqGxvYmJHzDNw6YuYjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+Rn +lTGNAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTO +w0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPIQW5pJ6d1Ee88hjZv +0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I0jJmwYrA8y8678Dj1JGG0VDjA9tz +d29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4GnilmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAW +hsI6yLETcDbYz+70CjTVW0z9B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0M +jomZmWzwPDCvON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo +IhNzbM8m9Yop5w== +-----END CERTIFICATE----- + +DigiCert Assured ID Root G3 +=========================== +-----BEGIN CERTIFICATE----- +MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQswCQYDVQQGEwJV +UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYD +VQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1 +MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQ +BgcqhkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJfZn4f5dwb +RXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17QRSAPWXYQ1qAk8C3eNvJs +KTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgF +UaFNN6KDec6NHSrkhDAKBggqhkjOPQQDAwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5Fy +YZ5eEJJZVrmDxxDnOOlYJjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy +1vUhZscv6pZjamVFkpUBtA== +-----END CERTIFICATE----- + +DigiCert Global Root G2 +======================= +-----BEGIN CERTIFICATE----- +MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBhMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw +HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUx +MjAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3 +dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkq +hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI2/Ou8jqJ +kTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx1x7e/dfgy5SDN67sH0NO +3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQq2EGnI/yuum06ZIya7XzV+hdG82MHauV +BJVJ8zUtluNJbd134/tJS7SsVQepj5WztCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyM +UNGPHgm+F6HmIcr9g+UQvIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQAB +o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV5uNu +5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY1Yl9PMWLSn/pvtsr +F9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4NeF22d+mQrvHRAiGfzZ0JFrabA0U +WTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NGFdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBH +QRFXGU7Aj64GxJUTFy8bJZ918rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/ +iyK5S9kJRaTepLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl +MrY= +-----END CERTIFICATE----- + +DigiCert Global Root G3 +======================= +-----BEGIN CERTIFICATE----- +MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQswCQYDVQQGEwJV +UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAwHgYD +VQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAw +MDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5k +aWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0C +AQYFK4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FGfp4tn+6O +YwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPOZ9wj/wMco+I+o0IwQDAP +BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNp +Yim8S8YwCgYIKoZIzj0EAwMDaAAwZQIxAK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y +3maTD/HMsQmP3Wyr+mt/oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34 +VOKa5Vt8sycX +-----END CERTIFICATE----- + +DigiCert Trusted Root G4 +======================== +-----BEGIN CERTIFICATE----- +MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBiMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEw +HwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1 +MTIwMDAwWjBiMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0G +CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3yithZwuEp +pz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1Ifxp4VpX6+n6lXFllVcq9o +k3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDVySAdYyktzuxeTsiT+CFhmzTrBcZe7Fsa +vOvJz82sNEBfsXpm7nfISKhmV1efVFiODCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGY +QJB5w3jHtrHEtWoYOAMQjdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6 +MUSaM0C/CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCiEhtm +mnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADMfRyVw4/3IbKyEbe7 +f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QYuKZ3AeEPlAwhHbJUKSWJbOUOUlFH +dL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXKchYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8 +oR7FwI+isX4KJpn15GkvmB0t9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud +DwEB/wQEAwIBhjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD +ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2SV1EY+CtnJYY +ZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd+SeuMIW59mdNOj6PWTkiU0Tr +yF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWcfFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy +7zBZLq7gcfJW5GqXb5JQbZaNaHqasjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iah +ixTXTBmyUEFxPT9NcCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN +5r5N0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie4u1Ki7wb +/UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mIr/OSmbaz5mEP0oUA51Aa +5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tK +G48BtieVU+i2iW1bvGjUI+iLUaJW+fCmgKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP +82Z+ +-----END CERTIFICATE----- + +COMODO RSA Certification Authority +================================== +-----BEGIN CERTIFICATE----- +MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCBhTELMAkGA1UE +BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG +A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkwHhcNMTAwMTE5MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMC +R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE +ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR6FSS0gpWsawNJN3Fz0Rn +dJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8Xpz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZ +FGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+ +5eNu/Nio5JIk2kNrYrhV/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pG +x8cgoLEfZd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z+pUX +2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7wqP/0uK3pN/u6uPQL +OvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZahSL0896+1DSJMwBGB7FY79tOi4lu3 +sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVICu9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+C +GCe01a60y1Dma/RMhnEw6abfFobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5 +WdYgGq/yapiqcrxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E +FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w +DQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvlwFTPoCWOAvn9sKIN9SCYPBMt +rFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+ +nq6PK7o9mfjYcwlYRm6mnPTXJ9OV2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSg +tZx8jb8uk2IntznaFxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwW +sRqZCuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiKboHGhfKp +pC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmckejkk9u+UJueBPSZI9FoJA +zMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yLS0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHq +ZJx64SIDqZxubw5lT2yHh17zbqD5daWbQOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk52 +7RH89elWsn2/x20Kk4yl0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7I +LaZRfyHBNVOFBkpdn627G190 +-----END CERTIFICATE----- + +USERTrust RSA Certification Authority +===================================== +-----BEGIN CERTIFICATE----- +MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCBiDELMAkGA1UE +BhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQK +ExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkwHhcNMTAwMjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UE +BhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQK +ExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCAEmUXNg7D2wiz +0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2j +Y0K2dvKpOyuR+OJv0OwWIJAJPuLodMkYtJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFn +RghRy4YUVD+8M/5+bJz/Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O ++T23LLb2VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT79uq +/nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6c0Plfg6lZrEpfDKE +Y1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmTYo61Zs8liM2EuLE/pDkP2QKe6xJM +lXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97lc6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8 +yexDJtC/QV9AqURE9JnnV4eeUB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+ +eLf8ZxXhyVeEHg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd +BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF +MAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPFUp/L+M+ZBn8b2kMVn54CVVeW +FPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KOVWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ +7l8wXEskEVX/JJpuXior7gtNn3/3ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQ +Eg9zKC7F4iRO/Fjs8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM +8WcRiQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYzeSf7dNXGi +FSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZXHlKYC6SQK5MNyosycdi +yA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9c +J2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRBVXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGw +sAvgnEzDHNb842m1R0aBL6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gx +Q+6IHdfGjjxDah2nGN59PRbxYvnKkKj9 +-----END CERTIFICATE----- + +USERTrust ECC Certification Authority +===================================== +-----BEGIN CERTIFICATE----- +MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDELMAkGA1UEBhMC +VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU +aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkwHhcNMTAwMjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMC +VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU +aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqfloI+d61SRvU8Za2EurxtW2 +0eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinngo4N+LZfQYcTxmdwlkWOrfzCjtHDix6Ez +nPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0GA1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNV +HQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBB +HU6+4WMBzzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbWRNZu +9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg= +-----END CERTIFICATE----- + +GlobalSign ECC Root CA - R5 +=========================== +-----BEGIN CERTIFICATE----- +MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEkMCIGA1UECxMb +R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD +EwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb +R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD +EwpHbG9iYWxTaWduMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6 +SFkc8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8kehOvRnkmS +h5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd +BgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYIKoZIzj0EAwMDaAAwZQIxAOVpEslu28Yx +uglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7 +yFz9SO8NdCKoCOJuxUnOxwy8p2Fp8fc74SrL+SvzZpA3 +-----END CERTIFICATE----- + +IdenTrust Commercial Root CA 1 +============================== +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBKMQswCQYDVQQG +EwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBS +b290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQwMTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzES +MBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENB +IDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ld +hNlT3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU+ehcCuz/ +mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gpS0l4PJNgiCL8mdo2yMKi +1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1bVoE/c40yiTcdCMbXTMTEl3EASX2MN0C +XZ/g1Ue9tOsbobtJSdifWwLziuQkkORiT0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl +3ZBWzvurpWCdxJ35UrCLvYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzy +NeVJSQjKVsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZKdHzV +WYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHTc+XvvqDtMwt0viAg +xGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hvl7yTmvmcEpB4eoCHFddydJxVdHix +uuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5NiGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMC +AQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZI +hvcNAQELBQADggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH +6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwtLRvM7Kqas6pg +ghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93nAbowacYXVKV7cndJZ5t+qnt +ozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3+wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmV +YjzlVYA211QC//G5Xc7UI2/YRYRKW2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUX +feu+h1sXIFRRk0pTAwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/ro +kTLql1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG4iZZRHUe +2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZmUlO+KWA2yUPHGNiiskz +Z2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7R +cGzM7vRX+Bi6hG6H +-----END CERTIFICATE----- + +IdenTrust Public Sector Root CA 1 +================================= +-----BEGIN CERTIFICATE----- +MIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBNMQswCQYDVQQG +EwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3Rv +ciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcNMzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJV +UzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBS +b290IENBIDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTy +P4o7ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGyRBb06tD6 +Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlSbdsHyo+1W/CD80/HLaXI +rcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF/YTLNiCBWS2ab21ISGHKTN9T0a9SvESf +qy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoS +mJxZZoY+rfGwyj4GD3vwEUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFn +ol57plzy9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9VGxyh +LrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ2fjXctscvG29ZV/v +iDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsVWaFHVCkugyhfHMKiq3IXAAaOReyL +4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gDW/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8B +Af8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMw +DQYJKoZIhvcNAQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj +t2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHVDRDtfULAj+7A +mgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9TaDKQGXSc3z1i9kKlT/YPyNt +GtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8GlwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFt +m6/n6J91eEyrRjuazr8FGF1NFTwWmhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMx +NRF4eKLg6TCMf4DfWN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4 +Mhn5+bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJtshquDDI +ajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhAGaQdp/lLQzfcaFpPz+vC +ZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ +3Wl9af0AVqW3rLatt8o+Ae+c +-----END CERTIFICATE----- + +Entrust Root Certification Authority - G2 +========================================= +-----BEGIN CERTIFICATE----- +MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMCVVMxFjAUBgNV +BAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVy +bXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ug +b25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIw +HhcNMDkwNzA3MTcyNTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoT +DUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMx +OTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25s +eTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwggEi +MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP +/vaCeb9zYQYKpSfYs1/TRU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXz +HHfV1IWNcCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hWwcKU +s/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1U1+cPvQXLOZprE4y +TGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0jaWvYkxN4FisZDQSA/i2jZRjJKRx +AgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ6 +0B7vfec7aVHUbI2fkBJmqzANBgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5Z +iXMRrEPR9RP/jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ +Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v1fN2D807iDgi +nWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4RnAuknZoh8/CbCzB428Hch0P+ +vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmHVHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xO +e4pIb4tF9g== +-----END CERTIFICATE----- + +Entrust Root Certification Authority - EC1 +========================================== +-----BEGIN CERTIFICATE----- +MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkGA1UEBhMCVVMx +FjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVn +YWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXpl +ZCB1c2Ugb25seTEzMDEGA1UEAxMqRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +IC0gRUMxMB4XDTEyMTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYw +FAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2Fs +LXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQg +dXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAt +IEVDMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHy +AsWfoPZb1YsGGYZPUxBtByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef +9eNi1KlHBz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE +FLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVCR98crlOZF7ZvHH3h +vxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nXhTcGtXsI/esni0qU+eH6p44mCOh8 +kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G +-----END CERTIFICATE----- + +CFCA EV ROOT +============ +-----BEGIN CERTIFICATE----- +MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJDTjEwMC4GA1UE +CgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNB +IEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkxMjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEw +MC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQD +DAxDRkNBIEVWIFJPT1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnV +BU03sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpLTIpTUnrD +7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5/ZOkVIBMUtRSqy5J35DN +uF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp7hZZLDRJGqgG16iI0gNyejLi6mhNbiyW +ZXvKWfry4t3uMCz7zEasxGPrb382KzRzEpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7 +xzbh72fROdOXW3NiGUgthxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9f +py25IGvPa931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqotaK8K +gWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNgTnYGmE69g60dWIol +hdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfVPKPtl8MeNPo4+QgO48BdK4PRVmrJ +tqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hvcWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAf +BgNVHSMEGDAWgBTj/i39KNALtbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB +/wQEAwIBBjAdBgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB +ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObTej/tUxPQ4i9q +ecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdLjOztUmCypAbqTuv0axn96/Ua +4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBSESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sG +E5uPhnEFtC+NiWYzKXZUmhH4J/qyP5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfX +BDrDMlI1Dlb4pd19xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjn +aH9dCi77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN5mydLIhy +PDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe/v5WOaHIz16eGWRGENoX +kbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+ZAAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3C +ekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su +-----END CERTIFICATE----- + +OISTE WISeKey Global Root GB CA +=============================== +-----BEGIN CERTIFICATE----- +MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBtMQswCQYDVQQG +EwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl +ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAw +MzJaFw0zOTEyMDExNTEwMzFaMG0xCzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYD +VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEds +b2JhbCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3HEokKtaX +scriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGxWuR51jIjK+FTzJlFXHtP +rby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk +9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNku7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4o +Qnc/nSMbsrY9gBQHTC5P99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvg +GUpuuy9rM2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB +/zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZI +hvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrghcViXfa43FK8+5/ea4n32cZiZBKpD +dHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0 +VQreUGdNZtGn//3ZwLWoo4rOZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEui +HZeeevJuQHHfaPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic +Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM= +-----END CERTIFICATE----- + +SZAFIR ROOT CA2 +=============== +-----BEGIN CERTIFICATE----- +MIIDcjCCAlqgAwIBAgIUPopdB+xV0jLVt+O2XwHrLdzk1uQwDQYJKoZIhvcNAQELBQAwUTELMAkG +A1UEBhMCUEwxKDAmBgNVBAoMH0tyYWpvd2EgSXpiYSBSb3psaWN6ZW5pb3dhIFMuQS4xGDAWBgNV +BAMMD1NaQUZJUiBST09UIENBMjAeFw0xNTEwMTkwNzQzMzBaFw0zNTEwMTkwNzQzMzBaMFExCzAJ +BgNVBAYTAlBMMSgwJgYDVQQKDB9LcmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuMRgwFgYD +VQQDDA9TWkFGSVIgUk9PVCBDQTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3vD5Q +qEvNQLXOYeeWyrSh2gwisPq1e3YAd4wLz32ohswmUeQgPYUM1ljj5/QqGJ3a0a4m7utT3PSQ1hNK +DJA8w/Ta0o4NkjrcsbH/ON7Dui1fgLkCvUqdGw+0w8LBZwPd3BucPbOw3gAeqDRHu5rr/gsUvTaE +2g0gv/pby6kWIK05YO4vdbbnl5z5Pv1+TW9NL++IDWr63fE9biCloBK0TXC5ztdyO4mTp4CEHCdJ +ckm1/zuVnsHMyAHs6A6KCpbns6aH5db5BSsNl0BwPLqsdVqc1U2dAgrSS5tmS0YHF2Wtn2yIANwi +ieDhZNRnvDF5YTy7ykHNXGoAyDw4jlivAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P +AQH/BAQDAgEGMB0GA1UdDgQWBBQuFqlKGLXLzPVvUPMjX/hd56zwyDANBgkqhkiG9w0BAQsFAAOC +AQEAtXP4A9xZWx126aMqe5Aosk3AM0+qmrHUuOQn/6mWmc5G4G18TKI4pAZw8PRBEew/R40/cof5 +O/2kbytTAOD/OblqBw7rHRz2onKQy4I9EYKL0rufKq8h5mOGnXkZ7/e7DDWQw4rtTw/1zBLZpD67 +oPwglV9PJi8RI4NOdQcPv5vRtB3pEAT+ymCPoky4rc/hkA/NrgrHXXu3UNLUYfrVFdvXn4dRVOul +4+vJhaAlIDf7js4MNIThPIGyd05DpYhfhmehPea0XGG2Ptv+tyjFogeutcrKjSoS75ftwjCkySp6 ++/NNIxuZMzSgLvWpCz/UXeHPhJ/iGcJfitYgHuNztw== +-----END CERTIFICATE----- + +Certum Trusted Network CA 2 +=========================== +-----BEGIN CERTIFICATE----- +MIIF0jCCA7qgAwIBAgIQIdbQSk8lD8kyN/yqXhKN6TANBgkqhkiG9w0BAQ0FADCBgDELMAkGA1UE +BhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMuQS4xJzAlBgNVBAsTHkNlcnR1 +bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIGA1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0d29y +ayBDQSAyMCIYDzIwMTExMDA2MDgzOTU2WhgPMjA0NjEwMDYwODM5NTZaMIGAMQswCQYDVQQGEwJQ +TDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENl +cnRpZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENB +IDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC9+Xj45tWADGSdhhuWZGc/IjoedQF9 +7/tcZ4zJzFxrqZHmuULlIEub2pt7uZld2ZuAS9eEQCsn0+i6MLs+CRqnSZXvK0AkwpfHp+6bJe+o +CgCXhVqqndwpyeI1B+twTUrWwbNWuKFBOJvR+zF/j+Bf4bE/D44WSWDXBo0Y+aomEKsq09DRZ40b +Rr5HMNUuctHFY9rnY3lEfktjJImGLjQ/KUxSiyqnwOKRKIm5wFv5HdnnJ63/mgKXwcZQkpsCLL2p +uTRZCr+ESv/f/rOf69me4Jgj7KZrdxYq28ytOxykh9xGc14ZYmhFV+SQgkK7QtbwYeDBoz1mo130 +GO6IyY0XRSmZMnUCMe4pJshrAua1YkV/NxVaI2iJ1D7eTiew8EAMvE0Xy02isx7QBlrd9pPPV3WZ +9fqGGmd4s7+W/jTcvedSVuWz5XV710GRBdxdaeOVDUO5/IOWOZV7bIBaTxNyxtd9KXpEulKkKtVB +Rgkg/iKgtlswjbyJDNXXcPiHUv3a76xRLgezTv7QCdpw75j6VuZt27VXS9zlLCUVyJ4ueE742pye +hizKV/Ma5ciSixqClnrDvFASadgOWkaLOusm+iPJtrCBvkIApPjW/jAux9JG9uWOdf3yzLnQh1vM +BhBgu4M1t15n3kfsmUjxpKEV/q2MYo45VU85FrmxY53/twIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MB0GA1UdDgQWBBS2oVQ5AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZI +hvcNAQENBQADggIBAHGlDs7k6b8/ONWJWsQCYftMxRQXLYtPU2sQF/xlhMcQSZDe28cmk4gmb3DW +Al45oPePq5a1pRNcgRRtDoGCERuKTsZPpd1iHkTfCVn0W3cLN+mLIMb4Ck4uWBzrM9DPhmDJ2vuA +L55MYIR4PSFk1vtBHxgP58l1cb29XN40hz5BsA72udY/CROWFC/emh1auVbONTqwX3BNXuMp8SMo +clm2q8KMZiYcdywmdjWLKKdpoPk79SPdhRB0yZADVpHnr7pH1BKXESLjokmUbOe3lEu6LaTaM4tM +pkT/WjzGHWTYtTHkpjx6qFcL2+1hGsvxznN3Y6SHb0xRONbkX8eftoEq5IVIeVheO/jbAoJnwTnb +w3RLPTYe+SmTiGhbqEQZIfCn6IENLOiTNrQ3ssqwGyZ6miUfmpqAnksqP/ujmv5zMnHCnsZy4Ypo +J/HkD7TETKVhk/iXEAcqMCWpuchxuO9ozC1+9eB+D4Kob7a6bINDd82Kkhehnlt4Fj1F4jNy3eFm +ypnTycUm/Q1oBEauttmbjL4ZvrHG8hnjXALKLNhvSgfZyTXaQHXyxKcZb55CEJh15pWLYLztxRLX +is7VmFxWlgPF7ncGNf/P5O4/E2Hu29othfDNrp2yGAlFw5Khchf8R7agCyzxxN5DaAhqXzvwdmP7 +zAYspsbiDrW5viSP +-----END CERTIFICATE----- + +Hellenic Academic and Research Institutions RootCA 2015 +======================================================= +-----BEGIN CERTIFICATE----- +MIIGCzCCA/OgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBpjELMAkGA1UEBhMCR1IxDzANBgNVBAcT +BkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0 +aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNl +YXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIwMTUwHhcNMTUwNzA3MTAxMTIxWhcNNDAwNjMwMTAx +MTIxWjCBpjELMAkGA1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMg +QWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNV +BAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIw +MTUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDC+Kk/G4n8PDwEXT2QNrCROnk8Zlrv +bTkBSRq0t89/TSNTt5AA4xMqKKYx8ZEA4yjsriFBzh/a/X0SWwGDD7mwX5nh8hKDgE0GPt+sr+eh +iGsxr/CL0BgzuNtFajT0AoAkKAoCFZVedioNmToUW/bLy1O8E00BiDeUJRtCvCLYjqOWXjrZMts+ +6PAQZe104S+nfK8nNLspfZu2zwnI5dMK/IhlZXQK3HMcXM1AsRzUtoSMTFDPaI6oWa7CJ06CojXd +FPQf/7J31Ycvqm59JCfnxssm5uX+Zwdj2EUN3TpZZTlYepKZcj2chF6IIbjV9Cz82XBST3i4vTwr +i5WY9bPRaM8gFH5MXF/ni+X1NYEZN9cRCLdmvtNKzoNXADrDgfgXy5I2XdGj2HUb4Ysn6npIQf1F +GQatJ5lOwXBH3bWfgVMS5bGMSF0xQxfjjMZ6Y5ZLKTBOhE5iGV48zpeQpX8B653g+IuJ3SWYPZK2 +fu/Z8VFRfS0myGlZYeCsargqNhEEelC9MoS+L9xy1dcdFkfkR2YgP/SWxa+OAXqlD3pk9Q0Yh9mu +iNX6hME6wGkoLfINaFGq46V3xqSQDqE3izEjR8EJCOtu93ib14L8hCCZSRm2Ekax+0VVFqmjZayc +Bw/qa9wfLgZy7IaIEuQt218FL+TwA9MmM+eAws1CoRc0CwIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcRVnyMjJvXVdctA4GGqd83EkVAswDQYJKoZI +hvcNAQELBQADggIBAHW7bVRLqhBYRjTyYtcWNl0IXtVsyIe9tC5G8jH4fOpCtZMWVdyhDBKg2mF+ +D1hYc2Ryx+hFjtyp8iY/xnmMsVMIM4GwVhO+5lFc2JsKT0ucVlMC6U/2DWDqTUJV6HwbISHTGzrM +d/K4kPFox/la/vot9L/J9UUbzjgQKjeKeaO04wlshYaT/4mWJ3iBj2fjRnRUjtkNaeJK9E10A/+y +d+2VZ5fkscWrv2oj6NSU4kQoYsRL4vDY4ilrGnB+JGGTe08DMiUNRSQrlrRGar9KC/eaj8GsGsVn +82800vpzY4zvFrCopEYq+OsS7HK07/grfoxSwIuEVPkvPuNVqNxmsdnhX9izjFk0WaSrT2y7Hxjb +davYy5LNlDhhDgcGH0tGEPEVvo2FXDtKK4F5D7Rpn0lQl033DlZdwJVqwjbDG2jJ9SrcR5q+ss7F +Jej6A7na+RZukYT1HCjI/CbM1xyQVqdfbzoEvM14iQuODy+jqk+iGxI9FghAD/FGTNeqewjBCvVt +J94Cj8rDtSvK6evIIVM4pcw72Hc3MKJP2W/R8kCtQXoXxdZKNYm3QdV8hn9VTYNKpXMgwDqvkPGa +JI7ZjnHKe7iG2rKPmT4dEw0SEe7Uq/DpFXYC5ODfqiAeW2GFZECpkJcNrVPSWh2HagCXZWK0vm9q +p/UsQu0yrbYhnr68 +-----END CERTIFICATE----- + +Hellenic Academic and Research Institutions ECC RootCA 2015 +=========================================================== +-----BEGIN CERTIFICATE----- +MIICwzCCAkqgAwIBAgIBADAKBggqhkjOPQQDAjCBqjELMAkGA1UEBhMCR1IxDzANBgNVBAcTBkF0 +aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9u +cyBDZXJ0LiBBdXRob3JpdHkxRDBCBgNVBAMTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJj +aCBJbnN0aXR1dGlvbnMgRUNDIFJvb3RDQSAyMDE1MB4XDTE1MDcwNzEwMzcxMloXDTQwMDYzMDEw +MzcxMlowgaoxCzAJBgNVBAYTAkdSMQ8wDQYDVQQHEwZBdGhlbnMxRDBCBgNVBAoTO0hlbGxlbmlj +IEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUQwQgYD +VQQDEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIEVDQyBSb290 +Q0EgMjAxNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJKgQehLgoRc4vgxEZmGZE4JJS+dQS8KrjVP +dJWyUWRrjWvmP3CV8AVER6ZyOFB2lQJajq4onvktTpnvLEhvTCUp6NFxW98dwXU3tNf6e3pCnGoK +Vlp8aQuqgAkkbH7BRqNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O +BBYEFLQiC4KZJAEOnLvkDv2/+5cgk5kqMAoGCCqGSM49BAMCA2cAMGQCMGfOFmI4oqxiRaeplSTA +GiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7SofTUwJCA3sS61kFyjn +dc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR +-----END CERTIFICATE----- + +ISRG Root X1 +============ +-----BEGIN CERTIFICATE----- +MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAwTzELMAkGA1UE +BhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2VhcmNoIEdyb3VwMRUwEwYDVQQD +EwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQG +EwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMT +DElTUkcgUm9vdCBYMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54r +Vygch77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+0TM8ukj1 +3Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6UA5/TR5d8mUgjU+g4rk8K +b4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sWT8KOEUt+zwvo/7V3LvSye0rgTBIlDHCN +Aymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyHB5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ +4Q7e2RCOFvu396j3x+UCB5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf +1b0SHzUvKBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWnOlFu +hjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTnjh8BCNAw1FtxNrQH +usEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbwqHyGO0aoSCqI3Haadr8faqU9GY/r +OPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CIrU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4G +A1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY +9umbbjANBgkqhkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL +ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ3BebYhtF8GaV +0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KKNFtY2PwByVS5uCbMiogziUwt +hDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJw +TdwJx4nLCgdNbOhdjsnvzqvHu7UrTkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nx +e5AW0wdeRlN8NwdCjNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZA +JzVcoyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq4RgqsahD +YVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPAmRGunUHBcnWEvgJBQl9n +JEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57demyPxgcYxn/eR44/KJ4EBs+lVDR3veyJ +m+kXQ99b21/+jh5Xos1AnX5iItreGCc= +-----END CERTIFICATE----- + +AC RAIZ FNMT-RCM +================ +-----BEGIN CERTIFICATE----- +MIIFgzCCA2ugAwIBAgIPXZONMGc2yAYdGsdUhGkHMA0GCSqGSIb3DQEBCwUAMDsxCzAJBgNVBAYT +AkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJWiBGTk1ULVJDTTAeFw0wODEw +MjkxNTU5NTZaFw0zMDAxMDEwMDAwMDBaMDsxCzAJBgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJD +TTEZMBcGA1UECwwQQUMgUkFJWiBGTk1ULVJDTTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC +ggIBALpxgHpMhm5/yBNtwMZ9HACXjywMI7sQmkCpGreHiPibVmr75nuOi5KOpyVdWRHbNi63URcf +qQgfBBckWKo3Shjf5TnUV/3XwSyRAZHiItQDwFj8d0fsjz50Q7qsNI1NOHZnjrDIbzAzWHFctPVr +btQBULgTfmxKo0nRIBnuvMApGGWn3v7v3QqQIecaZ5JCEJhfTzC8PhxFtBDXaEAUwED653cXeuYL +j2VbPNmaUtu1vZ5Gzz3rkQUCwJaydkxNEJY7kvqcfw+Z374jNUUeAlz+taibmSXaXvMiwzn15Cou +08YfxGyqxRxqAQVKL9LFwag0Jl1mpdICIfkYtwb1TplvqKtMUejPUBjFd8g5CSxJkjKZqLsXF3mw +WsXmo8RZZUc1g16p6DULmbvkzSDGm0oGObVo/CK67lWMK07q87Hj/LaZmtVC+nFNCM+HHmpxffnT +tOmlcYF7wk5HlqX2doWjKI/pgG6BU6VtX7hI+cL5NqYuSf+4lsKMB7ObiFj86xsc3i1w4peSMKGJ +47xVqCfWS+2QrYv6YyVZLag13cqXM7zlzced0ezvXg5KkAYmY6252TUtB7p2ZSysV4999AeU14EC +ll2jB0nVetBX+RvnU0Z1qrB5QstocQjpYL05ac70r8NWQMetUqIJ5G+GR4of6ygnXYMgrwTJbFaa +i0b1AgMBAAGjgYMwgYAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE +FPd9xf3E6Jobd2Sn9R2gzL+HYJptMD4GA1UdIAQ3MDUwMwYEVR0gADArMCkGCCsGAQUFBwIBFh1o +dHRwOi8vd3d3LmNlcnQuZm5tdC5lcy9kcGNzLzANBgkqhkiG9w0BAQsFAAOCAgEAB5BK3/MjTvDD +nFFlm5wioooMhfNzKWtN/gHiqQxjAb8EZ6WdmF/9ARP67Jpi6Yb+tmLSbkyU+8B1RXxlDPiyN8+s +D8+Nb/kZ94/sHvJwnvDKuO+3/3Y3dlv2bojzr2IyIpMNOmqOFGYMLVN0V2Ue1bLdI4E7pWYjJ2cJ +j+F3qkPNZVEI7VFY/uY5+ctHhKQV8Xa7pO6kO8Rf77IzlhEYt8llvhjho6Tc+hj507wTmzl6NLrT +Qfv6MooqtyuGC2mDOL7Nii4LcK2NJpLuHvUBKwrZ1pebbuCoGRw6IYsMHkCtA+fdZn71uSANA+iW ++YJF1DngoABd15jmfZ5nc8OaKveri6E6FO80vFIOiZiaBECEHX5FaZNXzuvO+FB8TxxuBEOb+dY7 +Ixjp6o7RTUaN8Tvkasq6+yO3m/qZASlaWFot4/nUbQ4mrcFuNLwy+AwF+mWj2zs3gyLp1txyM/1d +8iC9djwj2ij3+RvrWWTV3F9yfiD8zYm1kGdNYno/Tq0dwzn+evQoFt9B9kiABdcPUXmsEKvU7ANm +5mqwujGSQkBqvjrTcuFqN1W8rB2Vt2lh8kORdOag0wokRqEIr9baRRmW1FMdW4R58MD3R++Lj8UG +rp1MYp3/RgT408m2ECVAdf4WqslKYIYvuu8wd+RU4riEmViAqhOLUTpPSPaLtrM= +-----END CERTIFICATE----- + +Amazon Root CA 1 +================ +-----BEGIN CERTIFICATE----- +MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsFADA5MQswCQYD +VQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAxMB4XDTE1 +MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpv +bjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBALJ4gHHKeNXjca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgH +FzZM9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qwIFAGbHrQ +gLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6VOujw5H5SNz/0egwLX0t +dHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L93FcXmn/6pUCyziKrlA4b9v7LWIbxcce +VOF34GfID5yHI9Y/QCB/IIDEgEw+OyQmjgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB +/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3 +DQEBCwUAA4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDIU5PM +CCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUsN+gDS63pYaACbvXy +8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vvo/ufQJVtMVT8QtPHRh8jrdkPSHCa +2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2 +xJNDd2ZhwLnoQdeXeGADbkpyrqXRfboQnoZsG4q5WTP468SQvvG5 +-----END CERTIFICATE----- + +Amazon Root CA 2 +================ +-----BEGIN CERTIFICATE----- +MIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwFADA5MQswCQYD +VQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAyMB4XDTE1 +MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpv +bjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC +ggIBAK2Wny2cSkxKgXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4 +kHbZW0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg1dKmSYXp +N+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K8nu+NQWpEjTj82R0Yiw9 +AElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvd +fLC6HM783k81ds8P+HgfajZRRidhW+mez/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAEx +kv8LV/SasrlX6avvDXbR8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSS +btqDT6ZjmUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz7Mt0 +Q5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6+XUyo05f7O0oYtlN +c/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI0u1ufm8/0i2BWSlmy5A5lREedCf+ +3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSw +DPBMMPQFWAJI/TPlUq9LhONmUjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oA +A7CXDpO8Wqj2LIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY ++gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kSk5Nrp+gvU5LE +YFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl7uxMMne0nxrpS10gxdr9HIcW +xkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygmbtmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQ +gj9sAq+uEjonljYE1x2igGOpm/HlurR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbW +aQbLU8uz/mtBzUF+fUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoV +Yh63n749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE76KlXIx3 +KadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H9jVlpNMKVv/1F2Rs76gi +JUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT4PsJYGw= +-----END CERTIFICATE----- + +Amazon Root CA 3 +================ +-----BEGIN CERTIFICATE----- +MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5MQswCQYDVQQG +EwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAzMB4XDTE1MDUy +NjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZ +MBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZB +f8ANm+gBG1bG8lKlui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjr +Zt6jQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSrttvXBp43 +rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkrBqWTrBqYaGFy+uGh0Psc +eGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteMYyRIHN8wfdVoOw== +-----END CERTIFICATE----- + +Amazon Root CA 4 +================ +-----BEGIN CERTIFICATE----- +MIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5MQswCQYDVQQG +EwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSA0MB4XDTE1MDUy +NjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZ +MBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN +/sGKe0uoe0ZLY7Bi9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri +83BkM6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV +HQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WBMAoGCCqGSM49BAMDA2gA +MGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlwCkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1 +AE47xDqUEpHJWEadIRNyp4iciuRMStuW1KyLa2tJElMzrdfkviT8tQp21KW8EA== +-----END CERTIFICATE----- + +TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 +============================================= +-----BEGIN CERTIFICATE----- +MIIEYzCCA0ugAwIBAgIBATANBgkqhkiG9w0BAQsFADCB0jELMAkGA1UEBhMCVFIxGDAWBgNVBAcT +D0dlYnplIC0gS29jYWVsaTFCMEAGA1UEChM5VHVya2l5ZSBCaWxpbXNlbCB2ZSBUZWtub2xvamlr +IEFyYXN0aXJtYSBLdXJ1bXUgLSBUVUJJVEFLMS0wKwYDVQQLEyRLYW11IFNlcnRpZmlrYXN5b24g +TWVya2V6aSAtIEthbXUgU00xNjA0BgNVBAMTLVRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRp +ZmlrYXNpIC0gU3VydW0gMTAeFw0xMzExMjUwODI1NTVaFw00MzEwMjUwODI1NTVaMIHSMQswCQYD +VQQGEwJUUjEYMBYGA1UEBxMPR2ViemUgLSBLb2NhZWxpMUIwQAYDVQQKEzlUdXJraXllIEJpbGlt +c2VsIHZlIFRla25vbG9qaWsgQXJhc3Rpcm1hIEt1cnVtdSAtIFRVQklUQUsxLTArBgNVBAsTJEth +bXUgU2VydGlmaWthc3lvbiBNZXJrZXppIC0gS2FtdSBTTTE2MDQGA1UEAxMtVFVCSVRBSyBLYW11 +IFNNIFNTTCBLb2sgU2VydGlmaWthc2kgLSBTdXJ1bSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAr3UwM6q7a9OZLBI3hNmNe5eA027n/5tQlT6QlVZC1xl8JoSNkvoBHToP4mQ4t4y8 +6Ij5iySrLqP1N+RAjhgleYN1Hzv/bKjFxlb4tO2KRKOrbEz8HdDc72i9z+SqzvBV96I01INrN3wc +wv61A+xXzry0tcXtAA9TNypN9E8Mg/uGz8v+jE69h/mniyFXnHrfA2eJLJ2XYacQuFWQfw4tJzh0 +3+f92k4S400VIgLI4OD8D62K18lUUMw7D8oWgITQUVbDjlZ/iSIzL+aFCr2lqBs23tPcLG07xxO9 +WSMs5uWk99gL7eqQQESolbuT1dCANLZGeA4fAJNG4e7p+exPFwIDAQABo0IwQDAdBgNVHQ4EFgQU +ZT/HiobGPN08VFw1+DrtUgxHV8gwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJ +KoZIhvcNAQELBQADggEBACo/4fEyjq7hmFxLXs9rHmoJ0iKpEsdeV31zVmSAhHqT5Am5EM2fKifh +AHe+SMg1qIGf5LgsyX8OsNJLN13qudULXjS99HMpw+0mFZx+CFOKWI3QSyjfwbPfIPP54+M638yc +lNhOT8NrF7f3cuitZjO1JVOr4PhMqZ398g26rrnZqsZr+ZO7rqu4lzwDGrpDxpa5RXI4s6ehlj2R +e37AIVNMh+3yC1SVUZPVIqUNivGTDj5UDrDYyU7c8jEyVupk+eq1nRZmQnLzf9OxMUP8pI4X8W0j +q5Rm+K37DwhuJi1/FwcJsoz7UMCflo3Ptv0AnVoUmr8CRPXBwp8iXqIPoeM= +-----END CERTIFICATE----- + +GDCA TrustAUTH R5 ROOT +====================== +-----BEGIN CERTIFICATE----- +MIIFiDCCA3CgAwIBAgIIfQmX/vBH6nowDQYJKoZIhvcNAQELBQAwYjELMAkGA1UEBhMCQ04xMjAw +BgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZIENPLixMVEQuMR8wHQYDVQQD +DBZHRENBIFRydXN0QVVUSCBSNSBST09UMB4XDTE0MTEyNjA1MTMxNVoXDTQwMTIzMTE1NTk1OVow +YjELMAkGA1UEBhMCQ04xMjAwBgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZ +IENPLixMVEQuMR8wHQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMIICIjANBgkqhkiG9w0B +AQEFAAOCAg8AMIICCgKCAgEA2aMW8Mh0dHeb7zMNOwZ+Vfy1YI92hhJCfVZmPoiC7XJjDp6L3TQs +AlFRwxn9WVSEyfFrs0yw6ehGXTjGoqcuEVe6ghWinI9tsJlKCvLriXBjTnnEt1u9ol2x8kECK62p +OqPseQrsXzrj/e+APK00mxqriCZ7VqKChh/rNYmDf1+uKU49tm7srsHwJ5uu4/Ts765/94Y9cnrr +pftZTqfrlYwiOXnhLQiPzLyRuEH3FMEjqcOtmkVEs7LXLM3GKeJQEK5cy4KOFxg2fZfmiJqwTTQJ +9Cy5WmYqsBebnh52nUpmMUHfP/vFBu8btn4aRjb3ZGM74zkYI+dndRTVdVeSN72+ahsmUPI2JgaQ +xXABZG12ZuGR224HwGGALrIuL4xwp9E7PLOR5G62xDtw8mySlwnNR30YwPO7ng/Wi64HtloPzgsM +R6flPri9fcebNaBhlzpBdRfMK5Z3KpIhHtmVdiBnaM8Nvd/WHwlqmuLMc3GkL30SgLdTMEZeS1SZ +D2fJpcjyIMGC7J0R38IC+xo70e0gmu9lZJIQDSri3nDxGGeCjGHeuLzRL5z7D9Ar7Rt2ueQ5Vfj4 +oR24qoAATILnsn8JuLwwoC8N9VKejveSswoAHQBUlwbgsQfZxw9cZX08bVlX5O2ljelAU58VS6Bx +9hoh49pwBiFYFIeFd3mqgnkCAwEAAaNCMEAwHQYDVR0OBBYEFOLJQJ9NzuiaoXzPDj9lxSmIahlR +MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQDRSVfg +p8xoWLoBDysZzY2wYUWsEe1jUGn4H3++Fo/9nesLqjJHdtJnJO29fDMylyrHBYZmDRd9FBUb1Ov9 +H5r2XpdptxolpAqzkT9fNqyL7FeoPueBihhXOYV0GkLH6VsTX4/5COmSdI31R9KrO9b7eGZONn35 +6ZLpBN79SWP8bfsUcZNnL0dKt7n/HipzcEYwv1ryL3ml4Y0M2fmyYzeMN2WFcGpcWwlyua1jPLHd ++PwyvzeG5LuOmCd+uh8W4XAR8gPfJWIyJyYYMoSf/wA6E7qaTfRPuBRwIrHKK5DOKcFw9C+df/KQ +HtZa37dG/OaG+svgIHZ6uqbL9XzeYqWxi+7egmaKTjowHz+Ay60nugxe19CxVsp3cbK1daFQqUBD +F8Io2c9Si1vIY9RCPqAzekYu9wogRlR+ak8x8YF+QnQ4ZXMn7sZ8uI7XpTrXmKGcjBBV09tL7ECQ +8s1uV9JiDnxXk7Gnbc2dg7sq5+W2O3FYrf3RRbxake5TFW/TRQl1brqQXR4EzzffHqhmsYzmIGrv +/EhOdJhCrylvLmrH+33RZjEizIYAfmaDDEL0vTSSwxrqT8p+ck0LcIymSLumoRT2+1hEmRSuqguT +aaApJUqlyyvdimYHFngVV3Eb7PVHhPOeMTd61X8kreS8/f3MboPoDKi3QWwH3b08hpcv0g== +-----END CERTIFICATE----- + +SSL.com Root Certification Authority RSA +======================================== +-----BEGIN CERTIFICATE----- +MIIF3TCCA8WgAwIBAgIIeyyb0xaAMpkwDQYJKoZIhvcNAQELBQAwfDELMAkGA1UEBhMCVVMxDjAM +BgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9TU0wgQ29ycG9yYXRpb24x +MTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBSU0EwHhcNMTYw +MjEyMTczOTM5WhcNNDEwMjEyMTczOTM5WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMx +EDAOBgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NM +LmNvbSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFJTQTCCAiIwDQYJKoZIhvcNAQEBBQAD +ggIPADCCAgoCggIBAPkP3aMrfcvQKv7sZ4Wm5y4bunfh4/WvpOz6Sl2RxFdHaxh3a3by/ZPkPQ/C +Fp4LZsNWlJ4Xg4XOVu/yFv0AYvUiCVToZRdOQbngT0aXqhvIuG5iXmmxX9sqAn78bMrzQdjt0Oj8 +P2FI7bADFB0QDksZ4LtO7IZl/zbzXmcCC52GVWH9ejjt/uIZALdvoVBidXQ8oPrIJZK0bnoix/ge +oeOy3ZExqysdBP+lSgQ36YWkMyv94tZVNHwZpEpox7Ko07fKoZOI68GXvIz5HdkihCR0xwQ9aqkp +k8zruFvh/l8lqjRYyMEjVJ0bmBHDOJx+PYZspQ9AhnwC9FwCTyjLrnGfDzrIM/4RJTXq/LrFYD3Z +fBjVsqnTdXgDciLKOsMf7yzlLqn6niy2UUb9rwPW6mBo6oUWNmuF6R7As93EJNyAKoFBbZQ+yODJ +gUEAnl6/f8UImKIYLEJAs/lvOCdLToD0PYFH4Ih86hzOtXVcUS4cK38acijnALXRdMbX5J+tB5O2 +UzU1/Dfkw/ZdFr4hc96SCvigY2q8lpJqPvi8ZVWb3vUNiSYE/CUapiVpy8JtynziWV+XrOvvLsi8 +1xtZPCvM8hnIk2snYxnP/Okm+Mpxm3+T/jRnhE6Z6/yzeAkzcLpmpnbtG3PrGqUNxCITIJRWCk4s +bE6x/c+cCbqiM+2HAgMBAAGjYzBhMB0GA1UdDgQWBBTdBAkHovV6fVJTEpKV7jiAJQ2mWTAPBgNV +HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFN0ECQei9Xp9UlMSkpXuOIAlDaZZMA4GA1UdDwEB/wQE +AwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAIBgRlCn7Jp0cHh5wYfGVcpNxJK1ok1iOMq8bs3AD/CUr +dIWQPXhq9LmLpZc7tRiRux6n+UBbkflVma8eEdBcHadm47GUBwwyOabqG7B52B2ccETjit3E+ZUf +ijhDPwGFpUenPUayvOUiaPd7nNgsPgohyC0zrL/FgZkxdMF1ccW+sfAjRfSda/wZY52jvATGGAsl +u1OJD7OAUN5F7kR/q5R4ZJjT9ijdh9hwZXT7DrkT66cPYakylszeu+1jTBi7qUD3oFRuIIhxdRjq +erQ0cuAjJ3dctpDqhiVAq+8zD8ufgr6iIPv2tS0a5sKFsXQP+8hlAqRSAUfdSSLBv9jra6x+3uxj +MxW3IwiPxg+NQVrdjsW5j+VFP3jbutIbQLH+cU0/4IGiul607BXgk90IH37hVZkLId6Tngr75qNJ +vTYw/ud3sqB1l7UtgYgXZSD32pAAn8lSzDLKNXz1PQ/YK9f1JmzJBjSWFupwWRoyeXkLtoh/D1JI +Pb9s2KJELtFOt3JY04kTlf5Eq/jXixtunLwsoFvVagCvXzfh1foQC5ichucmj87w7G6KVwuA406y +wKBjYZC6VWg3dGq2ktufoYYitmUnDuy2n0Jg5GfCtdpBC8TTi2EbvPofkSvXRAdeuims2cXp71NI +WuuA8ShYIc2wBlX7Jz9TkHCpBB5XJ7k= +-----END CERTIFICATE----- + +SSL.com Root Certification Authority ECC +======================================== +-----BEGIN CERTIFICATE----- +MIICjTCCAhSgAwIBAgIIdebfy8FoW6gwCgYIKoZIzj0EAwIwfDELMAkGA1UEBhMCVVMxDjAMBgNV +BAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9TU0wgQ29ycG9yYXRpb24xMTAv +BgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEy +MTgxNDAzWhcNNDEwMjEyMTgxNDAzWjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAO +BgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNv +bSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuBBAAiA2IA +BEVuqVDEpiM2nl8ojRfLliJkP9x6jh3MCLOicSS6jkm5BBtHllirLZXI7Z4INcgn64mMU1jrYor+ +8FsPazFSY0E7ic3s7LaNGdM0B9y7xgZ/wkWV7Mt/qCPgCemB+vNH06NjMGEwHQYDVR0OBBYEFILR +hXMw5zUE044CkvvlpNHEIejNMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUgtGFczDnNQTT +jgKS++Wk0cQh6M0wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2cAMGQCMG/n61kRpGDPYbCW +e+0F+S8Tkdzt5fxQaxFGRrMcIQBiu77D5+jNB5n5DQtdcj7EqgIwH7y6C+IwJPt8bYBVCpk+gA0z +5Wajs6O7pdWLjwkspl1+4vAHCGht0nxpbl/f5Wpl +-----END CERTIFICATE----- + +SSL.com EV Root Certification Authority RSA R2 +============================================== +-----BEGIN CERTIFICATE----- +MIIF6zCCA9OgAwIBAgIIVrYpzTS8ePYwDQYJKoZIhvcNAQELBQAwgYIxCzAJBgNVBAYTAlVTMQ4w +DAYDVQQIDAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9u +MTcwNQYDVQQDDC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIy +MB4XDTE3MDUzMTE4MTQzN1oXDTQyMDUzMDE4MTQzN1owgYIxCzAJBgNVBAYTAlVTMQ4wDAYDVQQI +DAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMTcwNQYD +VQQDDC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIyMIICIjAN +BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAjzZlQOHWTcDXtOlG2mvqM0fNTPl9fb69LT3w23jh +hqXZuglXaO1XPqDQCEGD5yhBJB/jchXQARr7XnAjssufOePPxU7Gkm0mxnu7s9onnQqG6YE3Bf7w +cXHswxzpY6IXFJ3vG2fThVUCAtZJycxa4bH3bzKfydQ7iEGonL3Lq9ttewkfokxykNorCPzPPFTO +Zw+oz12WGQvE43LrrdF9HSfvkusQv1vrO6/PgN3B0pYEW3p+pKk8OHakYo6gOV7qd89dAFmPZiw+ +B6KjBSYRaZfqhbcPlgtLyEDhULouisv3D5oi53+aNxPN8k0TayHRwMwi8qFG9kRpnMphNQcAb9Zh +CBHqurj26bNg5U257J8UZslXWNvNh2n4ioYSA0e/ZhN2rHd9NCSFg83XqpyQGp8hLH94t2S42Oim +9HizVcuE0jLEeK6jj2HdzghTreyI/BXkmg3mnxp3zkyPuBQVPWKchjgGAGYS5Fl2WlPAApiiECto +RHuOec4zSnaqW4EWG7WK2NAAe15itAnWhmMOpgWVSbooi4iTsjQc2KRVbrcc0N6ZVTsj9CLg+Slm +JuwgUHfbSguPvuUCYHBBXtSuUDkiFCbLsjtzdFVHB3mBOagwE0TlBIqulhMlQg+5U8Sb/M3kHN48 ++qvWBkofZ6aYMBzdLNvcGJVXZsb/XItW9XcCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNV +HSMEGDAWgBT5YLvU49U09rj1BoAlp3PbRmmonjAdBgNVHQ4EFgQU+WC71OPVNPa49QaAJadz20Zp +qJ4wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBWs47LCp1Jjr+kxJG7ZhcFUZh1 +++VQLHqe8RT6q9OKPv+RKY9ji9i0qVQBDb6Thi/5Sm3HXvVX+cpVHBK+Rw82xd9qt9t1wkclf7nx +Y/hoLVUE0fKNsKTPvDxeH3jnpaAgcLAExbf3cqfeIg29MyVGjGSSJuM+LmOW2puMPfgYCdcDzH2G +guDKBAdRUNf/ktUM79qGn5nX67evaOI5JpS6aLe/g9Pqemc9YmeuJeVy6OLk7K4S9ksrPJ/psEDz +OFSz/bdoyNrGj1E8svuR3Bznm53htw1yj+KkxKl4+esUrMZDBcJlOSgYAsOCsp0FvmXtll9ldDz7 +CTUue5wT/RsPXcdtgTpWD8w74a8CLyKsRspGPKAcTNZEtF4uXBVmCeEmKf7GUmG6sXP/wwyc5Wxq +lD8UykAWlYTzWamsX0xhk23RO8yilQwipmdnRC652dKKQbNmC1r7fSOl8hqw/96bg5Qu0T/fkreR +rwU7ZcegbLHNYhLDkBvjJc40vG93drEQw/cFGsDWr3RiSBd3kmmQYRzelYB0VI8YHMPzA9C/pEN1 +hlMYegouCRw2n5H9gooiS9EOUCXdywMMF8mDAAhONU2Ki+3wApRmLER/y5UnlhetCTCstnEXbosX +9hwJ1C07mKVx01QT2WDz9UtmT/rx7iASjbSsV7FFY6GsdqnC+w== +-----END CERTIFICATE----- + +SSL.com EV Root Certification Authority ECC +=========================================== +-----BEGIN CERTIFICATE----- +MIIClDCCAhqgAwIBAgIILCmcWxbtBZUwCgYIKoZIzj0EAwIwfzELMAkGA1UEBhMCVVMxDjAMBgNV +BAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9TU0wgQ29ycG9yYXRpb24xNDAy +BgNVBAMMK1NTTC5jb20gRVYgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYw +MjEyMTgxNTIzWhcNNDEwMjEyMTgxNTIzWjB/MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMx +EDAOBgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjE0MDIGA1UEAwwrU1NM +LmNvbSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuB +BAAiA2IABKoSR5CYG/vvw0AHgyBO8TCCogbR8pKGYfL2IWjKAMTH6kMAVIbc/R/fALhBYlzccBYy +3h+Z1MzFB8gIH2EWB1E9fVwHU+M1OIzfzZ/ZLg1KthkuWnBaBu2+8KGwytAJKaNjMGEwHQYDVR0O +BBYEFFvKXuXe0oGqzagtZFG22XKbl+ZPMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUW8pe +5d7SgarNqC1kUbbZcpuX5k8wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2gAMGUCMQCK5kCJ +N+vp1RPZytRrJPOwPYdGWBrssd9v+1a6cGvHOMzosYxPD/fxZ3YOg9AeUY8CMD32IygmTMZgh5Mm +m7I1HrrW9zzRHM76JTymGoEVW/MSD2zuZYrJh6j5B+BimoxcSg== +-----END CERTIFICATE----- + +GlobalSign Root CA - R6 +======================= +-----BEGIN CERTIFICATE----- +MIIFgzCCA2ugAwIBAgIORea7A4Mzw4VlSOb/RVEwDQYJKoZIhvcNAQEMBQAwTDEgMB4GA1UECxMX +R2xvYmFsU2lnbiBSb290IENBIC0gUjYxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkds +b2JhbFNpZ24wHhcNMTQxMjEwMDAwMDAwWhcNMzQxMjEwMDAwMDAwWjBMMSAwHgYDVQQLExdHbG9i +YWxTaWduIFJvb3QgQ0EgLSBSNjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFs +U2lnbjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAJUH6HPKZvnsFMp7PPcNCPG0RQss +grRIxutbPK6DuEGSMxSkb3/pKszGsIhrxbaJ0cay/xTOURQh7ErdG1rG1ofuTToVBu1kZguSgMpE +3nOUTvOniX9PeGMIyBJQbUJmL025eShNUhqKGoC3GYEOfsSKvGRMIRxDaNc9PIrFsmbVkJq3MQbF +vuJtMgamHvm566qjuL++gmNQ0PAYid/kD3n16qIfKtJwLnvnvJO7bVPiSHyMEAc4/2ayd2F+4OqM +PKq0pPbzlUoSB239jLKJz9CgYXfIWHSw1CM69106yqLbnQneXUQtkPGBzVeS+n68UARjNN9rkxi+ +azayOeSsJDa38O+2HBNXk7besvjihbdzorg1qkXy4J02oW9UivFyVm4uiMVRQkQVlO6jxTiWm05O +WgtH8wY2SXcwvHE35absIQh1/OZhFj931dmRl4QKbNQCTXTAFO39OfuD8l4UoQSwC+n+7o/hbguy +CLNhZglqsQY6ZZZZwPA1/cnaKI0aEYdwgQqomnUdnjqGBQCe24DWJfncBZ4nWUx2OVvq+aWh2IMP +0f/fMBH5hc8zSPXKbWQULHpYT9NLCEnFlWQaYw55PfWzjMpYrZxCRXluDocZXFSxZba/jJvcE+kN +b7gu3GduyYsRtYQUigAZcIN5kZeR1BonvzceMgfYFGM8KEyvAgMBAAGjYzBhMA4GA1UdDwEB/wQE +AwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSubAWjkxPioufi1xzWx/B/yGdToDAfBgNV +HSMEGDAWgBSubAWjkxPioufi1xzWx/B/yGdToDANBgkqhkiG9w0BAQwFAAOCAgEAgyXt6NH9lVLN +nsAEoJFp5lzQhN7craJP6Ed41mWYqVuoPId8AorRbrcWc+ZfwFSY1XS+wc3iEZGtIxg93eFyRJa0 +lV7Ae46ZeBZDE1ZXs6KzO7V33EByrKPrmzU+sQghoefEQzd5Mr6155wsTLxDKZmOMNOsIeDjHfrY +BzN2VAAiKrlNIC5waNrlU/yDXNOd8v9EDERm8tLjvUYAGm0CuiVdjaExUd1URhxN25mW7xocBFym +Fe944Hn+Xds+qkxV/ZoVqW/hpvvfcDDpw+5CRu3CkwWJ+n1jez/QcYF8AOiYrg54NMMl+68KnyBr +3TsTjxKM4kEaSHpzoHdpx7Zcf4LIHv5YGygrqGytXm3ABdJ7t+uA/iU3/gKbaKxCXcPu9czc8FB1 +0jZpnOZ7BN9uBmm23goJSFmH63sUYHpkqmlD75HHTOwY3WzvUy2MmeFe8nI+z1TIvWfspA9MRf/T +uTAjB0yPEL+GltmZWrSZVxykzLsViVO6LAUP5MSeGbEYNNVMnbrt9x+vJJUEeKgDu+6B5dpffItK +oZB0JaezPkvILFa9x8jvOOJckvB595yEunQtYQEgfn7R8k8HWV+LLUNS60YMlOH1Zkd5d9VUWx+t +JDfLRVpOoERIyNiwmcUVhAn21klJwGW45hpxbqCo8YLoRT5s1gLXCmeDBVrJpBA= +-----END CERTIFICATE----- + +OISTE WISeKey Global Root GC CA +=============================== +-----BEGIN CERTIFICATE----- +MIICaTCCAe+gAwIBAgIQISpWDK7aDKtARb8roi066jAKBggqhkjOPQQDAzBtMQswCQYDVQQGEwJD +SDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEo +MCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQyBDQTAeFw0xNzA1MDkwOTQ4MzRa +Fw00MjA1MDkwOTU4MzNaMG0xCzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQL +ExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2Jh +bCBSb290IEdDIENBMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAETOlQwMYPchi82PG6s4nieUqjFqdr +VCTbUf/q9Akkwwsin8tqJ4KBDdLArzHkdIJuyiXZjHWd8dvQmqJLIX4Wp2OQ0jnUsYd4XxiWD1Ab +NTcPasbc2RNNpI6QN+a9WzGRo1QwUjAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd +BgNVHQ4EFgQUSIcUrOPDnpBgOtfKie7TrYy0UGYwEAYJKwYBBAGCNxUBBAMCAQAwCgYIKoZIzj0E +AwMDaAAwZQIwJsdpW9zV57LnyAyMjMPdeYwbY9XJUpROTYJKcx6ygISpJcBMWm1JKWB4E+J+SOtk +AjEA2zQgMgj/mkkCtojeFK9dbJlxjRo/i9fgojaGHAeCOnZT/cKi7e97sIBPWA9LUzm9 +-----END CERTIFICATE----- + +UCA Global G2 Root +================== +-----BEGIN CERTIFICATE----- +MIIFRjCCAy6gAwIBAgIQXd+x2lqj7V2+WmUgZQOQ7zANBgkqhkiG9w0BAQsFADA9MQswCQYDVQQG +EwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxGzAZBgNVBAMMElVDQSBHbG9iYWwgRzIgUm9vdDAeFw0x +NjAzMTEwMDAwMDBaFw00MDEyMzEwMDAwMDBaMD0xCzAJBgNVBAYTAkNOMREwDwYDVQQKDAhVbmlU +cnVzdDEbMBkGA1UEAwwSVUNBIEdsb2JhbCBHMiBSb290MIICIjANBgkqhkiG9w0BAQEFAAOCAg8A +MIICCgKCAgEAxeYrb3zvJgUno4Ek2m/LAfmZmqkywiKHYUGRO8vDaBsGxUypK8FnFyIdK+35KYmT +oni9kmugow2ifsqTs6bRjDXVdfkX9s9FxeV67HeToI8jrg4aA3++1NDtLnurRiNb/yzmVHqUwCoV +8MmNsHo7JOHXaOIxPAYzRrZUEaalLyJUKlgNAQLx+hVRZ2zA+te2G3/RVogvGjqNO7uCEeBHANBS +h6v7hn4PJGtAnTRnvI3HLYZveT6OqTwXS3+wmeOwcWDcC/Vkw85DvG1xudLeJ1uK6NjGruFZfc8o +LTW4lVYa8bJYS7cSN8h8s+1LgOGN+jIjtm+3SJUIsUROhYw6AlQgL9+/V087OpAh18EmNVQg7Mc/ +R+zvWr9LesGtOxdQXGLYD0tK3Cv6brxzks3sx1DoQZbXqX5t2Okdj4q1uViSukqSKwxW/YDrCPBe +KW4bHAyvj5OJrdu9o54hyokZ7N+1wxrrFv54NkzWbtA+FxyQF2smuvt6L78RHBgOLXMDj6DlNaBa +4kx1HXHhOThTeEDMg5PXCp6dW4+K5OXgSORIskfNTip1KnvyIvbJvgmRlld6iIis7nCs+dwp4wwc +OxJORNanTrAmyPPZGpeRaOrvjUYG0lZFWJo8DA+DuAUlwznPO6Q0ibd5Ei9Hxeepl2n8pndntd97 +8XplFeRhVmUCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O +BBYEFIHEjMz15DD/pQwIX4wVZyF0Ad/fMA0GCSqGSIb3DQEBCwUAA4ICAQATZSL1jiutROTL/7lo +5sOASD0Ee/ojL3rtNtqyzm325p7lX1iPyzcyochltq44PTUbPrw7tgTQvPlJ9Zv3hcU2tsu8+Mg5 +1eRfB70VVJd0ysrtT7q6ZHafgbiERUlMjW+i67HM0cOU2kTC5uLqGOiiHycFutfl1qnN3e92mI0A +Ds0b+gO3joBYDic/UvuUospeZcnWhNq5NXHzJsBPd+aBJ9J3O5oUb3n09tDh05S60FdRvScFDcH9 +yBIw7m+NESsIndTUv4BFFJqIRNow6rSn4+7vW4LVPtateJLbXDzz2K36uGt/xDYotgIVilQsnLAX +c47QN6MUPJiVAAwpBVueSUmxX8fjy88nZY41F7dXyDDZQVu5FLbowg+UMaeUmMxq67XhJ/UQqAHo +jhJi6IjMtX9Gl8CbEGY4GjZGXyJoPd/JxhMnq1MGrKI8hgZlb7F+sSlEmqO6SWkoaY/X5V+tBIZk +bxqgDMUIYs6Ao9Dz7GjevjPHF1t/gMRMTLGmhIrDO7gJzRSBuhjjVFc2/tsvfEehOjPI+Vg7RE+x +ygKJBJYoaMVLuCaJu9YzL1DV/pqJuhgyklTGW+Cd+V7lDSKb9triyCGyYiGqhkCyLmTTX8jjfhFn +RR8F/uOi77Oos/N9j/gMHyIfLXC0uAE0djAA5SN4p1bXUB+K+wb1whnw0A== +-----END CERTIFICATE----- + +UCA Extended Validation Root +============================ +-----BEGIN CERTIFICATE----- +MIIFWjCCA0KgAwIBAgIQT9Irj/VkyDOeTzRYZiNwYDANBgkqhkiG9w0BAQsFADBHMQswCQYDVQQG +EwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNVBAMMHFVDQSBFeHRlbmRlZCBWYWxpZGF0aW9u +IFJvb3QwHhcNMTUwMzEzMDAwMDAwWhcNMzgxMjMxMDAwMDAwWjBHMQswCQYDVQQGEwJDTjERMA8G +A1UECgwIVW5pVHJ1c3QxJTAjBgNVBAMMHFVDQSBFeHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCpCQcoEwKwmeBkqh5DFnpzsZGgdT6o+uM4AHrs +iWogD4vFsJszA1qGxliG1cGFu0/GnEBNyr7uaZa4rYEwmnySBesFK5pI0Lh2PpbIILvSsPGP2KxF +Rv+qZ2C0d35qHzwaUnoEPQc8hQ2E0B92CvdqFN9y4zR8V05WAT558aopO2z6+I9tTcg1367r3CTu +eUWnhbYFiN6IXSV8l2RnCdm/WhUFhvMJHuxYMjMR83dksHYf5BA1FxvyDrFspCqjc/wJHx4yGVMR +59mzLC52LqGj3n5qiAno8geK+LLNEOfic0CTuwjRP+H8C5SzJe98ptfRr5//lpr1kXuYC3fUfugH +0mK1lTnj8/FtDw5lhIpjVMWAtuCeS31HJqcBCF3RiJ7XwzJE+oJKCmhUfzhTA8ykADNkUVkLo4KR +el7sFsLzKuZi2irbWWIQJUoqgQtHB0MGcIfS+pMRKXpITeuUx3BNr2fVUbGAIAEBtHoIppB/TuDv +B0GHr2qlXov7z1CymlSvw4m6WC31MJixNnI5fkkE/SmnTHnkBVfblLkWU41Gsx2VYVdWf6/wFlth +WG82UBEL2KwrlRYaDh8IzTY0ZRBiZtWAXxQgXy0MoHgKaNYs1+lvK9JKBZP8nm9rZ/+I8U6laUpS +NwXqxhaN0sSZ0YIrO7o1dfdRUVjzyAfd5LQDfwIDAQABo0IwQDAdBgNVHQ4EFgQU2XQ65DA9DfcS +3H5aBZ8eNJr34RQwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQEL +BQADggIBADaNl8xCFWQpN5smLNb7rhVpLGsaGvdftvkHTFnq88nIua7Mui563MD1sC3AO6+fcAUR +ap8lTwEpcOPlDOHqWnzcSbvBHiqB9RZLcpHIojG5qtr8nR/zXUACE/xOHAbKsxSQVBcZEhrxH9cM +aVr2cXj0lH2RC47skFSOvG+hTKv8dGT9cZr4QQehzZHkPJrgmzI5c6sq1WnIeJEmMX3ixzDx/BR4 +dxIOE/TdFpS/S2d7cFOFyrC78zhNLJA5wA3CXWvp4uXViI3WLL+rG761KIcSF3Ru/H38j9CHJrAb ++7lsq+KePRXBOy5nAliRn+/4Qh8st2j1da3Ptfb/EX3C8CSlrdP6oDyp+l3cpaDvRKS+1ujl5BOW +F3sGPjLtx7dCvHaj2GU4Kzg1USEODm8uNBNA4StnDG1KQTAYI1oyVZnJF+A83vbsea0rWBmirSwi +GpWOvpaQXUJXxPkUAzUrHC1RVwinOt4/5Mi0A3PCwSaAuwtCH60NryZy2sy+s6ODWA2CxR9GUeOc +GMyNm43sSet1UNWMKFnKdDTajAshqx7qG+XH/RU+wBeq+yNuJkbL+vmxcmtpzyKEC2IPrNkZAJSi +djzULZrtBJ4tBmIQN1IchXIbJ+XMxjHsN+xjWZsLHXbMfjKaiJUINlK73nZfdklJrX+9ZSCyycEr +dhh2n1ax +-----END CERTIFICATE----- + +Certigna Root CA +================ +-----BEGIN CERTIFICATE----- +MIIGWzCCBEOgAwIBAgIRAMrpG4nxVQMNo+ZBbcTjpuEwDQYJKoZIhvcNAQELBQAwWjELMAkGA1UE +BhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczEcMBoGA1UECwwTMDAwMiA0ODE0NjMwODEwMDAzNjEZ +MBcGA1UEAwwQQ2VydGlnbmEgUm9vdCBDQTAeFw0xMzEwMDEwODMyMjdaFw0zMzEwMDEwODMyMjda +MFoxCzAJBgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxHDAaBgNVBAsMEzAwMDIgNDgxNDYz +MDgxMDAwMzYxGTAXBgNVBAMMEENlcnRpZ25hIFJvb3QgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4IC +DwAwggIKAoICAQDNGDllGlmx6mQWDoyUJJV8g9PFOSbcDO8WV43X2KyjQn+Cyu3NW9sOty3tRQgX +stmzy9YXUnIo245Onoq2C/mehJpNdt4iKVzSs9IGPjA5qXSjklYcoW9MCiBtnyN6tMbaLOQdLNyz +KNAT8kxOAkmhVECe5uUFoC2EyP+YbNDrihqECB63aCPuI9Vwzm1RaRDuoXrC0SIxwoKF0vJVdlB8 +JXrJhFwLrN1CTivngqIkicuQstDuI7pmTLtipPlTWmR7fJj6o0ieD5Wupxj0auwuA0Wv8HT4Ks16 +XdG+RCYyKfHx9WzMfgIhC59vpD++nVPiz32pLHxYGpfhPTc3GGYo0kDFUYqMwy3OU4gkWGQwFsWq +4NYKpkDfePb1BHxpE4S80dGnBs8B92jAqFe7OmGtBIyT46388NtEbVncSVmurJqZNjBBe3YzIoej +wpKGbvlw7q6Hh5UbxHq9MfPU0uWZ/75I7HX1eBYdpnDBfzwboZL7z8g81sWTCo/1VTp2lc5ZmIoJ +lXcymoO6LAQ6l73UL77XbJuiyn1tJslV1c/DeVIICZkHJC1kJWumIWmbat10TWuXekG9qxf5kBdI +jzb5LdXF2+6qhUVB+s06RbFo5jZMm5BX7CO5hwjCxAnxl4YqKE3idMDaxIzb3+KhF1nOJFl0Mdp/ +/TBt2dzhauH8XwIDAQABo4IBGjCCARYwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw +HQYDVR0OBBYEFBiHVuBud+4kNTxOc5of1uHieX4rMB8GA1UdIwQYMBaAFBiHVuBud+4kNTxOc5of +1uHieX4rMEQGA1UdIAQ9MDswOQYEVR0gADAxMC8GCCsGAQUFBwIBFiNodHRwczovL3d3d3cuY2Vy +dGlnbmEuZnIvYXV0b3JpdGVzLzBtBgNVHR8EZjBkMC+gLaArhilodHRwOi8vY3JsLmNlcnRpZ25h +LmZyL2NlcnRpZ25hcm9vdGNhLmNybDAxoC+gLYYraHR0cDovL2NybC5kaGlteW90aXMuY29tL2Nl +cnRpZ25hcm9vdGNhLmNybDANBgkqhkiG9w0BAQsFAAOCAgEAlLieT/DjlQgi581oQfccVdV8AOIt +OoldaDgvUSILSo3L6btdPrtcPbEo/uRTVRPPoZAbAh1fZkYJMyjhDSSXcNMQH+pkV5a7XdrnxIxP +TGRGHVyH41neQtGbqH6mid2PHMkwgu07nM3A6RngatgCdTer9zQoKJHyBApPNeNgJgH60BGM+RFq +7q89w1DTj18zeTyGqHNFkIwgtnJzFyO+B2XleJINugHA64wcZr+shncBlA2c5uk5jR+mUYyZDDl3 +4bSb+hxnV29qao6pK0xXeXpXIs/NX2NGjVxZOob4Mkdio2cNGJHc+6Zr9UhhcyNZjgKnvETq9Emd +8VRY+WCv2hikLyhF3HqgiIZd8zvn/yk1gPxkQ5Tm4xxvvq0OKmOZK8l+hfZx6AYDlf7ej0gcWtSS +6Cvu5zHbugRqh5jnxV/vfaci9wHYTfmJ0A6aBVmknpjZbyvKcL5kwlWj9Omvw5Ip3IgWJJk8jSaY +tlu3zM63Nwf9JtmYhST/WSMDmu2dnajkXjjO11INb9I/bbEFa0nOipFGc/T2L/Coc3cOZayhjWZS +aX5LaAzHHjcng6WMxwLkFM1JAbBzs/3GkDpv0mztO+7skb6iQ12LAEpmJURw3kAP+HwV96LOPNde +E4yBFxgX0b3xdxA61GU5wSesVywlVP+i2k+KYTlerj1KjL0= +-----END CERTIFICATE----- + +emSign Root CA - G1 +=================== +-----BEGIN CERTIFICATE----- +MIIDlDCCAnygAwIBAgIKMfXkYgxsWO3W2DANBgkqhkiG9w0BAQsFADBnMQswCQYDVQQGEwJJTjET +MBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNobm9sb2dpZXMgTGltaXRl +ZDEcMBoGA1UEAxMTZW1TaWduIFJvb3QgQ0EgLSBHMTAeFw0xODAyMTgxODMwMDBaFw00MzAyMTgx +ODMwMDBaMGcxCzAJBgNVBAYTAklOMRMwEQYDVQQLEwplbVNpZ24gUEtJMSUwIwYDVQQKExxlTXVk +aHJhIFRlY2hub2xvZ2llcyBMaW1pdGVkMRwwGgYDVQQDExNlbVNpZ24gUm9vdCBDQSAtIEcxMIIB +IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAk0u76WaK7p1b1TST0Bsew+eeuGQzf2N4aLTN +LnF115sgxk0pvLZoYIr3IZpWNVrzdr3YzZr/k1ZLpVkGoZM0Kd0WNHVO8oG0x5ZOrRkVUkr+PHB1 +cM2vK6sVmjM8qrOLqs1D/fXqcP/tzxE7lM5OMhbTI0Aqd7OvPAEsbO2ZLIvZTmmYsvePQbAyeGHW +DV/D+qJAkh1cF+ZwPjXnorfCYuKrpDhMtTk1b+oDafo6VGiFbdbyL0NVHpENDtjVaqSW0RM8LHhQ +6DqS0hdW5TUaQBw+jSztOd9C4INBdN+jzcKGYEho42kLVACL5HZpIQ15TjQIXhTCzLG3rdd8cIrH +hQIDAQABo0IwQDAdBgNVHQ4EFgQU++8Nhp6w492pufEhF38+/PB3KxowDgYDVR0PAQH/BAQDAgEG +MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAFn/8oz1h31xPaOfG1vR2vjTnGs2 +vZupYeveFix0PZ7mddrXuqe8QhfnPZHr5X3dPpzxz5KsbEjMwiI/aTvFthUvozXGaCocV685743Q +NcMYDHsAVhzNixl03r4PEuDQqqE/AjSxcM6dGNYIAwlG7mDgfrbESQRRfXBgvKqy/3lyeqYdPV8q ++Mri/Tm3R7nrft8EI6/6nAYH6ftjk4BAtcZsCjEozgyfz7MjNYBBjWzEN3uBL4ChQEKF6dk4jeih +U80Bv2noWgbyRQuQ+q7hv53yrlc8pa6yVvSLZUDp/TGBLPQ5Cdjua6e0ph0VpZj3AYHYhX3zUVxx +iN66zB+Afko= +-----END CERTIFICATE----- + +emSign ECC Root CA - G3 +======================= +-----BEGIN CERTIFICATE----- +MIICTjCCAdOgAwIBAgIKPPYHqWhwDtqLhDAKBggqhkjOPQQDAzBrMQswCQYDVQQGEwJJTjETMBEG +A1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNobm9sb2dpZXMgTGltaXRlZDEg +MB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0gRzMwHhcNMTgwMjE4MTgzMDAwWhcNNDMwMjE4 +MTgzMDAwWjBrMQswCQYDVQQGEwJJTjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11 +ZGhyYSBUZWNobm9sb2dpZXMgTGltaXRlZDEgMB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0g +RzMwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQjpQy4LRL1KPOxst3iAhKAnjlfSU2fySU0WXTsuwYc +58Byr+iuL+FBVIcUqEqy6HyC5ltqtdyzdc6LBtCGI79G1Y4PPwT01xySfvalY8L1X44uT6EYGQIr +MgqCZH0Wk9GjQjBAMB0GA1UdDgQWBBR8XQKEE9TMipuBzhccLikenEhjQjAOBgNVHQ8BAf8EBAMC +AQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNpADBmAjEAvvNhzwIQHWSVB7gYboiFBS+D +CBeQyh+KTOgNG3qxrdWBCUfvO6wIBHxcmbHtRwfSAjEAnbpV/KlK6O3t5nYBQnvI+GDZjVGLVTv7 +jHvrZQnD+JbNR6iC8hZVdyR+EhCVBCyj +-----END CERTIFICATE----- + +emSign Root CA - C1 +=================== +-----BEGIN CERTIFICATE----- +MIIDczCCAlugAwIBAgILAK7PALrEzzL4Q7IwDQYJKoZIhvcNAQELBQAwVjELMAkGA1UEBhMCVVMx +EzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMRwwGgYDVQQDExNlbVNp +Z24gUm9vdCBDQSAtIEMxMB4XDTE4MDIxODE4MzAwMFoXDTQzMDIxODE4MzAwMFowVjELMAkGA1UE +BhMCVVMxEzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMRwwGgYDVQQD +ExNlbVNpZ24gUm9vdCBDQSAtIEMxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz+up +ufGZBczYKCFK83M0UYRWEPWgTywS4/oTmifQz/l5GnRfHXk5/Fv4cI7gklL35CX5VIPZHdPIWoU/ +Xse2B+4+wM6ar6xWQio5JXDWv7V7Nq2s9nPczdcdioOl+yuQFTdrHCZH3DspVpNqs8FqOp099cGX +OFgFixwR4+S0uF2FHYP+eF8LRWgYSKVGczQ7/g/IdrvHGPMF0Ybzhe3nudkyrVWIzqa2kbBPrH4V +I5b2P/AgNBbeCsbEBEV5f6f9vtKppa+cxSMq9zwhbL2vj07FOrLzNBL834AaSaTUqZX3noleooms +lMuoaJuvimUnzYnu3Yy1aylwQ6BpC+S5DwIDAQABo0IwQDAdBgNVHQ4EFgQU/qHgcB4qAzlSWkK+ +XJGFehiqTbUwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQAD +ggEBAMJKVvoVIXsoounlHfv4LcQ5lkFMOycsxGwYFYDGrK9HWS8mC+M2sO87/kOXSTKZEhVb3xEp +/6tT+LvBeA+snFOvV71ojD1pM/CjoCNjO2RnIkSt1XHLVip4kqNPEjE2NuLe/gDEo2APJ62gsIq1 +NnpSob0n9CAnYuhNlCQT5AoE6TyrLshDCUrGYQTlSTR+08TI9Q/Aqum6VF7zYytPT1DU/rl7mYw9 +wC68AivTxEDkigcxHpvOJpkT+xHqmiIMERnHXhuBUDDIlhJu58tBf5E7oke3VIAb3ADMmpDqw8NQ +BmIMMMAVSKeoWXzhriKi4gp6D/piq1JM4fHfyr6DDUI= +-----END CERTIFICATE----- + +emSign ECC Root CA - C3 +======================= +-----BEGIN CERTIFICATE----- +MIICKzCCAbGgAwIBAgIKe3G2gla4EnycqDAKBggqhkjOPQQDAzBaMQswCQYDVQQGEwJVUzETMBEG +A1UECxMKZW1TaWduIFBLSTEUMBIGA1UEChMLZU11ZGhyYSBJbmMxIDAeBgNVBAMTF2VtU2lnbiBF +Q0MgUm9vdCBDQSAtIEMzMB4XDTE4MDIxODE4MzAwMFoXDTQzMDIxODE4MzAwMFowWjELMAkGA1UE +BhMCVVMxEzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMSAwHgYDVQQD +ExdlbVNpZ24gRUNDIFJvb3QgQ0EgLSBDMzB2MBAGByqGSM49AgEGBSuBBAAiA2IABP2lYa57JhAd +6bciMK4G9IGzsUJxlTm801Ljr6/58pc1kjZGDoeVjbk5Wum739D+yAdBPLtVb4OjavtisIGJAnB9 +SMVK4+kiVCJNk7tCDK93nCOmfddhEc5lx/h//vXyqaNCMEAwHQYDVR0OBBYEFPtaSNCAIEDyqOkA +B2kZd6fmw/TPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MAoGCCqGSM49BAMDA2gA +MGUCMQC02C8Cif22TGK6Q04ThHK1rt0c3ta13FaPWEBaLd4gTCKDypOofu4SQMfWh0/434UCMBwU +ZOR8loMRnLDRWmFLpg9J0wD8ofzkpf9/rdcw0Md3f76BB1UwUCAU9Vc4CqgxUQ== +-----END CERTIFICATE----- + +Hongkong Post Root CA 3 +======================= +-----BEGIN CERTIFICATE----- +MIIFzzCCA7egAwIBAgIUCBZfikyl7ADJk0DfxMauI7gcWqQwDQYJKoZIhvcNAQELBQAwbzELMAkG +A1UEBhMCSEsxEjAQBgNVBAgTCUhvbmcgS29uZzESMBAGA1UEBxMJSG9uZyBLb25nMRYwFAYDVQQK +Ew1Ib25na29uZyBQb3N0MSAwHgYDVQQDExdIb25na29uZyBQb3N0IFJvb3QgQ0EgMzAeFw0xNzA2 +MDMwMjI5NDZaFw00MjA2MDMwMjI5NDZaMG8xCzAJBgNVBAYTAkhLMRIwEAYDVQQIEwlIb25nIEtv +bmcxEjAQBgNVBAcTCUhvbmcgS29uZzEWMBQGA1UEChMNSG9uZ2tvbmcgUG9zdDEgMB4GA1UEAxMX +SG9uZ2tvbmcgUG9zdCBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCz +iNfqzg8gTr7m1gNt7ln8wlffKWihgw4+aMdoWJwcYEuJQwy51BWy7sFOdem1p+/l6TWZ5Mwc50tf +jTMwIDNT2aa71T4Tjukfh0mtUC1Qyhi+AViiE3CWu4mIVoBc+L0sPOFMV4i707mV78vH9toxdCim +5lSJ9UExyuUmGs2C4HDaOym71QP1mbpV9WTRYA6ziUm4ii8F0oRFKHyPaFASePwLtVPLwpgchKOe +sL4jpNrcyCse2m5FHomY2vkALgbpDDtw1VAliJnLzXNg99X/NWfFobxeq81KuEXryGgeDQ0URhLj +0mRiikKYvLTGCAj4/ahMZJx2Ab0vqWwzD9g/KLg8aQFChn5pwckGyuV6RmXpwtZQQS4/t+TtbNe/ +JgERohYpSms0BpDsE9K2+2p20jzt8NYt3eEV7KObLyzJPivkaTv/ciWxNoZbx39ri1UbSsUgYT2u +y1DhCDq+sI9jQVMwCFk8mB13umOResoQUGC/8Ne8lYePl8X+l2oBlKN8W4UdKjk60FSh0Tlxnf0h ++bV78OLgAo9uliQlLKAeLKjEiafv7ZkGL7YKTE/bosw3Gq9HhS2KX8Q0NEwA/RiTZxPRN+ZItIsG +xVd7GYYKecsAyVKvQv83j+GjHno9UKtjBucVtT+2RTeUN7F+8kjDf8V1/peNRY8apxpyKBpADwID +AQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBQXnc0e +i9Y5K3DTXNSguB+wAPzFYTAdBgNVHQ4EFgQUF53NHovWOStw01zUoLgfsAD8xWEwDQYJKoZIhvcN +AQELBQADggIBAFbVe27mIgHSQpsY1Q7XZiNc4/6gx5LS6ZStS6LG7BJ8dNVI0lkUmcDrudHr9Egw +W62nV3OZqdPlt9EuWSRY3GguLmLYauRwCy0gUCCkMpXRAJi70/33MvJJrsZ64Ee+bs7Lo3I6LWld +y8joRTnU+kLBEUx3XZL7av9YROXrgZ6voJmtvqkBZss4HTzfQx/0TW60uhdG/H39h4F5ag0zD/ov ++BS5gLNdTaqX4fnkGMX41TiMJjz98iji7lpJiCzfeT2OnpA8vUFKOt1b9pq0zj8lMH8yfaIDlNDc +eqFS3m6TjRgm/VWsvY+b0s+v54Ysyx8Jb6NvqYTUc79NoXQbTiNg8swOqn+knEwlqLJmOzj/2ZQw +9nKEvmhVEA/GcywWaZMH/rFF7buiVWqw2rVKAiUnhde3t4ZEFolsgCs+l6mc1X5VTMbeRRAc6uk7 +nwNT7u56AQIWeNTowr5GdogTPyK7SBIdUgC0An4hGh6cJfTzPV4e0hz5sy229zdcxsshTrD3mUcY +hcErulWuBurQB7Lcq9CClnXO0lD+mefPL5/ndtFhKvshuzHQqp9HpLIiyhY6UFfEW0NnxWViA0kB +60PZ2Pierc+xYw5F9KBaLJstxabArahH9CdMOA0uG0k7UvToiIMrVCjU8jVStDKDYmlkDJGcn5fq +dBb9HxEGmpv0 +-----END CERTIFICATE----- + +Entrust Root Certification Authority - G4 +========================================= +-----BEGIN CERTIFICATE----- +MIIGSzCCBDOgAwIBAgIRANm1Q3+vqTkPAAAAAFVlrVgwDQYJKoZIhvcNAQELBQAwgb4xCzAJBgNV +BAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3Qu +bmV0L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxNSBFbnRydXN0LCBJbmMuIC0gZm9yIGF1 +dGhvcml6ZWQgdXNlIG9ubHkxMjAwBgNVBAMTKUVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1 +dGhvcml0eSAtIEc0MB4XDTE1MDUyNzExMTExNloXDTM3MTIyNzExNDExNlowgb4xCzAJBgNVBAYT +AlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0 +L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxNSBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhv +cml6ZWQgdXNlIG9ubHkxMjAwBgNVBAMTKUVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhv +cml0eSAtIEc0MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAsewsQu7i0TD/pZJH4i3D +umSXbcr3DbVZwbPLqGgZ2K+EbTBwXX7zLtJTmeH+H17ZSK9dE43b/2MzTdMAArzE+NEGCJR5WIoV +3imz/f3ET+iq4qA7ec2/a0My3dl0ELn39GjUu9CH1apLiipvKgS1sqbHoHrmSKvS0VnM1n4j5pds +8ELl3FFLFUHtSUrJ3hCX1nbB76W1NhSXNdh4IjVS70O92yfbYVaCNNzLiGAMC1rlLAHGVK/XqsEQ +e9IFWrhAnoanw5CGAlZSCXqc0ieCU0plUmr1POeo8pyvi73TDtTUXm6Hnmo9RR3RXRv06QqsYJn7 +ibT/mCzPfB3pAqoEmh643IhuJbNsZvc8kPNXwbMv9W3y+8qh+CmdRouzavbmZwe+LGcKKh9asj5X +xNMhIWNlUpEbsZmOeX7m640A2Vqq6nPopIICR5b+W45UYaPrL0swsIsjdXJ8ITzI9vF01Bx7owVV +7rtNOzK+mndmnqxpkCIHH2E6lr7lmk/MBTwoWdPBDFSoWWG9yHJM6Nyfh3+9nEg2XpWjDrk4JFX8 +dWbrAuMINClKxuMrLzOg2qOGpRKX/YAr2hRC45K9PvJdXmd0LhyIRyk0X+IyqJwlN4y6mACXi0mW +Hv0liqzc2thddG5msP9E36EYxr5ILzeUePiVSj9/E15dWf10hkNjc0kCAwEAAaNCMEAwDwYDVR0T +AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJ84xFYjwznooHFs6FRM5Og6sb9n +MA0GCSqGSIb3DQEBCwUAA4ICAQAS5UKme4sPDORGpbZgQIeMJX6tuGguW8ZAdjwD+MlZ9POrYs4Q +jbRaZIxowLByQzTSGwv2LFPSypBLhmb8qoMi9IsabyZIrHZ3CL/FmFz0Jomee8O5ZDIBf9PD3Vht +7LGrhFV0d4QEJ1JrhkzO3bll/9bGXp+aEJlLdWr+aumXIOTkdnrG0CSqkM0gkLpHZPt/B7NTeLUK +YvJzQ85BK4FqLoUWlFPUa19yIqtRLULVAJyZv967lDtX/Zr1hstWO1uIAeV8KEsD+UmDfLJ/fOPt +jqF/YFOOVZ1QNBIPt5d7bIdKROf1beyAN/BYGW5KaHbwH5Lk6rWS02FREAutp9lfx1/cH6NcjKF+ +m7ee01ZvZl4HliDtC3T7Zk6LERXpgUl+b7DUUH8i119lAg2m9IUe2K4GS0qn0jFmwvjO5QimpAKW +RGhXxNUzzxkvFMSUHHuk2fCfDrGA4tGeEWSpiBE6doLlYsKA2KSD7ZPvfC+QsDJMlhVoSFLUmQjA +JOgc47OlIQ6SwJAfzyBfyjs4x7dtOvPmRLgOMWuIjnDrnBdSqEGULoe256YSxXXfW8AKbnuk5F6G ++TaU33fD6Q3AOfF5u0aOq0NZJ7cguyPpVkAh7DE9ZapD8j3fcEThuk0mEDuYn/PIjhs4ViFqUZPT +kcpG2om3PVODLAgfi49T3f+sHw== +-----END CERTIFICATE----- + +Microsoft ECC Root Certificate Authority 2017 +============================================= +-----BEGIN CERTIFICATE----- +MIICWTCCAd+gAwIBAgIQZvI9r4fei7FK6gxXMQHC7DAKBggqhkjOPQQDAzBlMQswCQYDVQQGEwJV +UzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYDVQQDEy1NaWNyb3NvZnQgRUND +IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwHhcNMTkxMjE4MjMwNjQ1WhcNNDIwNzE4 +MjMxNjA0WjBlMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYw +NAYDVQQDEy1NaWNyb3NvZnQgRUNDIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwdjAQ +BgcqhkjOPQIBBgUrgQQAIgNiAATUvD0CQnVBEyPNgASGAlEvaqiBYgtlzPbKnR5vSmZRogPZnZH6 +thaxjG7efM3beaYvzrvOcS/lpaso7GMEZpn4+vKTEAXhgShC48Zo9OYbhGBKia/teQ87zvH2RPUB +eMCjVDBSMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTIy5lycFIM ++Oa+sgRXKSrPQhDtNTAQBgkrBgEEAYI3FQEEAwIBADAKBggqhkjOPQQDAwNoADBlAjBY8k3qDPlf +Xu5gKcs68tvWMoQZP3zVL8KxzJOuULsJMsbG7X7JNpQS5GiFBqIb0C8CMQCZ6Ra0DvpWSNSkMBaR +eNtUjGUBiudQZsIxtzm6uBoiB078a1QWIP8rtedMDE2mT3M= +-----END CERTIFICATE----- + +Microsoft RSA Root Certificate Authority 2017 +============================================= +-----BEGIN CERTIFICATE----- +MIIFqDCCA5CgAwIBAgIQHtOXCV/YtLNHcB6qvn9FszANBgkqhkiG9w0BAQwFADBlMQswCQYDVQQG +EwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYDVQQDEy1NaWNyb3NvZnQg +UlNBIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwHhcNMTkxMjE4MjI1MTIyWhcNNDIw +NzE4MjMwMDIzWjBlMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9u +MTYwNAYDVQQDEy1NaWNyb3NvZnQgUlNBIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcw +ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKW76UM4wplZEWCpW9R2LBifOZNt9GkMml +7Xhqb0eRaPgnZ1AzHaGm++DlQ6OEAlcBXZxIQIJTELy/xztokLaCLeX0ZdDMbRnMlfl7rEqUrQ7e +S0MdhweSE5CAg2Q1OQT85elss7YfUJQ4ZVBcF0a5toW1HLUX6NZFndiyJrDKxHBKrmCk3bPZ7Pw7 +1VdyvD/IybLeS2v4I2wDwAW9lcfNcztmgGTjGqwu+UcF8ga2m3P1eDNbx6H7JyqhtJqRjJHTOoI+ +dkC0zVJhUXAoP8XFWvLJjEm7FFtNyP9nTUwSlq31/niol4fX/V4ggNyhSyL71Imtus5Hl0dVe49F +yGcohJUcaDDv70ngNXtk55iwlNpNhTs+VcQor1fznhPbRiefHqJeRIOkpcrVE7NLP8TjwuaGYaRS +MLl6IE9vDzhTyzMMEyuP1pq9KsgtsRx9S1HKR9FIJ3Jdh+vVReZIZZ2vUpC6W6IYZVcSn2i51BVr +lMRpIpj0M+Dt+VGOQVDJNE92kKz8OMHY4Xu54+OU4UZpyw4KUGsTuqwPN1q3ErWQgR5WrlcihtnJ +0tHXUeOrO8ZV/R4O03QK0dqq6mm4lyiPSMQH+FJDOvTKVTUssKZqwJz58oHhEmrARdlns87/I6KJ +ClTUFLkqqNfs+avNJVgyeY+QW5g5xAgGwax/Dj0ApQIDAQABo1QwUjAOBgNVHQ8BAf8EBAMCAYYw +DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUCctZf4aycI8awznjwNnpv7tNsiMwEAYJKwYBBAGC +NxUBBAMCAQAwDQYJKoZIhvcNAQEMBQADggIBAKyvPl3CEZaJjqPnktaXFbgToqZCLgLNFgVZJ8og +6Lq46BrsTaiXVq5lQ7GPAJtSzVXNUzltYkyLDVt8LkS/gxCP81OCgMNPOsduET/m4xaRhPtthH80 +dK2Jp86519efhGSSvpWhrQlTM93uCupKUY5vVau6tZRGrox/2KJQJWVggEbbMwSubLWYdFQl3JPk ++ONVFT24bcMKpBLBaYVu32TxU5nhSnUgnZUP5NbcA/FZGOhHibJXWpS2qdgXKxdJ5XbLwVaZOjex +/2kskZGT4d9Mozd2TaGf+G0eHdP67Pv0RR0Tbc/3WeUiJ3IrhvNXuzDtJE3cfVa7o7P4NHmJweDy +AmH3pvwPuxwXC65B2Xy9J6P9LjrRk5Sxcx0ki69bIImtt2dmefU6xqaWM/5TkshGsRGRxpl/j8nW +ZjEgQRCHLQzWwa80mMpkg/sTV9HB8Dx6jKXB/ZUhoHHBk2dxEuqPiAppGWSZI1b7rCoucL5mxAyE +7+WL85MB+GqQk2dLsmijtWKP6T+MejteD+eMuMZ87zf9dOLITzNy4ZQ5bb0Sr74MTnB8G2+NszKT +c0QWbej09+CVgI+WXTik9KveCjCHk9hNAHFiRSdLOkKEW39lt2c0Ui2cFmuqqNh7o0JMcccMyj6D +5KbvtwEwXlGjefVwaaZBRA+GsCyRxj3qrg+E +-----END CERTIFICATE----- + +e-Szigno Root CA 2017 +===================== +-----BEGIN CERTIFICATE----- +MIICQDCCAeWgAwIBAgIMAVRI7yH9l1kN9QQKMAoGCCqGSM49BAMCMHExCzAJBgNVBAYTAkhVMREw +DwYDVQQHDAhCdWRhcGVzdDEWMBQGA1UECgwNTWljcm9zZWMgTHRkLjEXMBUGA1UEYQwOVkFUSFUt +MjM1ODQ0OTcxHjAcBgNVBAMMFWUtU3ppZ25vIFJvb3QgQ0EgMjAxNzAeFw0xNzA4MjIxMjA3MDZa +Fw00MjA4MjIxMjA3MDZaMHExCzAJBgNVBAYTAkhVMREwDwYDVQQHDAhCdWRhcGVzdDEWMBQGA1UE +CgwNTWljcm9zZWMgTHRkLjEXMBUGA1UEYQwOVkFUSFUtMjM1ODQ0OTcxHjAcBgNVBAMMFWUtU3pp +Z25vIFJvb3QgQ0EgMjAxNzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABJbcPYrYsHtvxie+RJCx +s1YVe45DJH0ahFnuY2iyxl6H0BVIHqiQrb1TotreOpCmYF9oMrWGQd+HWyx7xf58etqjYzBhMA8G +A1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSHERUI0arBeAyxr87GyZDv +vzAEwDAfBgNVHSMEGDAWgBSHERUI0arBeAyxr87GyZDvvzAEwDAKBggqhkjOPQQDAgNJADBGAiEA +tVfd14pVCzbhhkT61NlojbjcI4qKDdQvfepz7L9NbKgCIQDLpbQS+ue16M9+k/zzNY9vTlp8tLxO +svxyqltZ+efcMQ== +-----END CERTIFICATE----- + +certSIGN Root CA G2 +=================== +-----BEGIN CERTIFICATE----- +MIIFRzCCAy+gAwIBAgIJEQA0tk7GNi02MA0GCSqGSIb3DQEBCwUAMEExCzAJBgNVBAYTAlJPMRQw +EgYDVQQKEwtDRVJUU0lHTiBTQTEcMBoGA1UECxMTY2VydFNJR04gUk9PVCBDQSBHMjAeFw0xNzAy +MDYwOTI3MzVaFw00MjAyMDYwOTI3MzVaMEExCzAJBgNVBAYTAlJPMRQwEgYDVQQKEwtDRVJUU0lH +TiBTQTEcMBoGA1UECxMTY2VydFNJR04gUk9PVCBDQSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIP +ADCCAgoCggIBAMDFdRmRfUR0dIf+DjuW3NgBFszuY5HnC2/OOwppGnzC46+CjobXXo9X69MhWf05 +N0IwvlDqtg+piNguLWkh59E3GE59kdUWX2tbAMI5Qw02hVK5U2UPHULlj88F0+7cDBrZuIt4Imfk +abBoxTzkbFpG583H+u/E7Eu9aqSs/cwoUe+StCmrqzWaTOTECMYmzPhpn+Sc8CnTXPnGFiWeI8Mg +wT0PPzhAsP6CRDiqWhqKa2NYOLQV07YRaXseVO6MGiKscpc/I1mbySKEwQdPzH/iV8oScLumZfNp +dWO9lfsbl83kqK/20U6o2YpxJM02PbyWxPFsqa7lzw1uKA2wDrXKUXt4FMMgL3/7FFXhEZn91Qqh +ngLjYl/rNUssuHLoPj1PrCy7Lobio3aP5ZMqz6WryFyNSwb/EkaseMsUBzXgqd+L6a8VTxaJW732 +jcZZroiFDsGJ6x9nxUWO/203Nit4ZoORUSs9/1F3dmKh7Gc+PoGD4FapUB8fepmrY7+EF3fxDTvf +95xhszWYijqy7DwaNz9+j5LP2RIUZNoQAhVB/0/E6xyjyfqZ90bp4RjZsbgyLcsUDFDYg2WD7rlc +z8sFWkz6GZdr1l0T08JcVLwyc6B49fFtHsufpaafItzRUZ6CeWRgKRM+o/1Pcmqr4tTluCRVLERL +iohEnMqE0yo7AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1Ud +DgQWBBSCIS1mxteg4BXrzkwJd8RgnlRuAzANBgkqhkiG9w0BAQsFAAOCAgEAYN4auOfyYILVAzOB +ywaK8SJJ6ejqkX/GM15oGQOGO0MBzwdw5AgeZYWR5hEit/UCI46uuR59H35s5r0l1ZUa8gWmr4UC +b6741jH/JclKyMeKqdmfS0mbEVeZkkMR3rYzpMzXjWR91M08KCy0mpbqTfXERMQlqiCA2ClV9+BB +/AYm/7k29UMUA2Z44RGx2iBfRgB4ACGlHgAoYXhvqAEBj500mv/0OJD7uNGzcgbJceaBxXntC6Z5 +8hMLnPddDnskk7RI24Zf3lCGeOdA5jGokHZwYa+cNywRtYK3qq4kNFtyDGkNzVmf9nGvnAvRCjj5 +BiKDUyUM/FHE5r7iOZULJK2v0ZXkltd0ZGtxTgI8qoXzIKNDOXZbbFD+mpwUHmUUihW9o4JFWklW +atKcsWMy5WHgUyIOpwpJ6st+H6jiYoD2EEVSmAYY3qXNL3+q1Ok+CHLsIwMCPKaq2LxndD0UF/tU +Sxfj03k9bWtJySgOLnRQvwzZRjoQhsmnP+mg7H/rpXdYaXHmgwo38oZJar55CJD2AhZkPuXaTH4M +NMn5X7azKFGnpyuqSfqNZSlO42sTp5SjLVFteAxEy9/eCG/Oo2Sr05WE1LlSVHJ7liXMvGnjSG4N +0MedJ5qq+BOS3R7fY581qRY27Iy4g/Q9iY/NtBde17MXQRBdJ3NghVdJIgc= +-----END CERTIFICATE----- + +Trustwave Global Certification Authority +======================================== +-----BEGIN CERTIFICATE----- +MIIF2jCCA8KgAwIBAgIMBfcOhtpJ80Y1LrqyMA0GCSqGSIb3DQEBCwUAMIGIMQswCQYDVQQGEwJV +UzERMA8GA1UECAwISWxsaW5vaXMxEDAOBgNVBAcMB0NoaWNhZ28xITAfBgNVBAoMGFRydXN0d2F2 +ZSBIb2xkaW5ncywgSW5jLjExMC8GA1UEAwwoVHJ1c3R3YXZlIEdsb2JhbCBDZXJ0aWZpY2F0aW9u +IEF1dGhvcml0eTAeFw0xNzA4MjMxOTM0MTJaFw00MjA4MjMxOTM0MTJaMIGIMQswCQYDVQQGEwJV +UzERMA8GA1UECAwISWxsaW5vaXMxEDAOBgNVBAcMB0NoaWNhZ28xITAfBgNVBAoMGFRydXN0d2F2 +ZSBIb2xkaW5ncywgSW5jLjExMC8GA1UEAwwoVHJ1c3R3YXZlIEdsb2JhbCBDZXJ0aWZpY2F0aW9u +IEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALldUShLPDeS0YLOvR29 +zd24q88KPuFd5dyqCblXAj7mY2Hf8g+CY66j96xz0XznswuvCAAJWX/NKSqIk4cXGIDtiLK0thAf +LdZfVaITXdHG6wZWiYj+rDKd/VzDBcdu7oaJuogDnXIhhpCujwOl3J+IKMujkkkP7NAP4m1ET4Bq +stTnoApTAbqOl5F2brz81Ws25kCI1nsvXwXoLG0R8+eyvpJETNKXpP7ScoFDB5zpET71ixpZfR9o +WN0EACyW80OzfpgZdNmcc9kYvkHHNHnZ9GLCQ7mzJ7Aiy/k9UscwR7PJPrhq4ufogXBeQotPJqX+ +OsIgbrv4Fo7NDKm0G2x2EOFYeUY+VM6AqFcJNykbmROPDMjWLBz7BegIlT1lRtzuzWniTY+HKE40 +Cz7PFNm73bZQmq131BnW2hqIyE4bJ3XYsgjxroMwuREOzYfwhI0Vcnyh78zyiGG69Gm7DIwLdVcE +uE4qFC49DxweMqZiNu5m4iK4BUBjECLzMx10coos9TkpoNPnG4CELcU9402x/RpvumUHO1jsQkUm ++9jaJXLE9gCxInm943xZYkqcBW89zubWR2OZxiRvchLIrH+QtAuRcOi35hYQcRfO3gZPSEF9NUqj +ifLJS3tBEW1ntwiYTOURGa5CgNz7kAXU+FDKvuStx8KU1xad5hePrzb7AgMBAAGjQjBAMA8GA1Ud +EwEB/wQFMAMBAf8wHQYDVR0OBBYEFJngGWcNYtt2s9o9uFvo/ULSMQ6HMA4GA1UdDwEB/wQEAwIB +BjANBgkqhkiG9w0BAQsFAAOCAgEAmHNw4rDT7TnsTGDZqRKGFx6W0OhUKDtkLSGm+J1WE2pIPU/H +PinbbViDVD2HfSMF1OQc3Og4ZYbFdada2zUFvXfeuyk3QAUHw5RSn8pk3fEbK9xGChACMf1KaA0H +ZJDmHvUqoai7PF35owgLEQzxPy0QlG/+4jSHg9bP5Rs1bdID4bANqKCqRieCNqcVtgimQlRXtpla +4gt5kNdXElE1GYhBaCXUNxeEFfsBctyV3lImIJgm4nb1J2/6ADtKYdkNy1GTKv0WBpanI5ojSP5R +vbbEsLFUzt5sQa0WZ37b/TjNuThOssFgy50X31ieemKyJo90lZvkWx3SD92YHJtZuSPTMaCm/zjd +zyBP6VhWOmfD0faZmZ26NraAL4hHT4a/RDqA5Dccprrql5gR0IRiR2Qequ5AvzSxnI9O4fKSTx+O +856X3vOmeWqJcU9LJxdI/uz0UA9PSX3MReO9ekDFQdxhVicGaeVyQYHTtgGJoC86cnn+OjC/QezH +Yj6RS8fZMXZC+fc8Y+wmjHMMfRod6qh8h6jCJ3zhM0EPz8/8AKAigJ5Kp28AsEFFtyLKaEjFQqKu +3R3y4G5OBVixwJAWKqQ9EEC+j2Jjg6mcgn0tAumDMHzLJ8n9HmYAsC7TIS+OMxZsmO0QqAfWzJPP +29FpHOTKyeC2nOnOcXHebD8WpHk= +-----END CERTIFICATE----- + +Trustwave Global ECC P256 Certification Authority +================================================= +-----BEGIN CERTIFICATE----- +MIICYDCCAgegAwIBAgIMDWpfCD8oXD5Rld9dMAoGCCqGSM49BAMCMIGRMQswCQYDVQQGEwJVUzER +MA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRydXN0d2F2ZSBI +b2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBFQ0MgUDI1NiBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eTAeFw0xNzA4MjMxOTM1MTBaFw00MjA4MjMxOTM1MTBaMIGRMQswCQYD +VQQGEwJVUzERMA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRy +dXN0d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBFQ0MgUDI1 +NiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABH77bOYj +43MyCMpg5lOcunSNGLB4kFKA3TjASh3RqMyTpJcGOMoNFWLGjgEqZZ2q3zSRLoHB5DOSMcT9CTqm +P62jQzBBMA8GA1UdEwEB/wQFMAMBAf8wDwYDVR0PAQH/BAUDAwcGADAdBgNVHQ4EFgQUo0EGrJBt +0UrrdaVKEJmzsaGLSvcwCgYIKoZIzj0EAwIDRwAwRAIgB+ZU2g6gWrKuEZ+Hxbb/ad4lvvigtwjz +RM4q3wghDDcCIC0mA6AFvWvR9lz4ZcyGbbOcNEhjhAnFjXca4syc4XR7 +-----END CERTIFICATE----- + +Trustwave Global ECC P384 Certification Authority +================================================= +-----BEGIN CERTIFICATE----- +MIICnTCCAiSgAwIBAgIMCL2Fl2yZJ6SAaEc7MAoGCCqGSM49BAMDMIGRMQswCQYDVQQGEwJVUzER +MA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRydXN0d2F2ZSBI +b2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBFQ0MgUDM4NCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eTAeFw0xNzA4MjMxOTM2NDNaFw00MjA4MjMxOTM2NDNaMIGRMQswCQYD +VQQGEwJVUzERMA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRy +dXN0d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBFQ0MgUDM4 +NCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTB2MBAGByqGSM49AgEGBSuBBAAiA2IABGvaDXU1CDFH +Ba5FmVXxERMuSvgQMSOjfoPTfygIOiYaOs+Xgh+AtycJj9GOMMQKmw6sWASr9zZ9lCOkmwqKi6vr +/TklZvFe/oyujUF5nQlgziip04pt89ZF1PKYhDhloKNDMEEwDwYDVR0TAQH/BAUwAwEB/zAPBgNV +HQ8BAf8EBQMDBwYAMB0GA1UdDgQWBBRVqYSJ0sEyvRjLbKYHTsjnnb6CkDAKBggqhkjOPQQDAwNn +ADBkAjA3AZKXRRJ+oPM+rRk6ct30UJMDEr5E0k9BpIycnR+j9sKS50gU/k6bpZFXrsY3crsCMGcl +CrEMXu6pY5Jv5ZAL/mYiykf9ijH3g/56vxC+GCsej/YpHpRZ744hN8tRmKVuSw== +-----END CERTIFICATE----- + +NAVER Global Root Certification Authority +========================================= +-----BEGIN CERTIFICATE----- +MIIFojCCA4qgAwIBAgIUAZQwHqIL3fXFMyqxQ0Rx+NZQTQ0wDQYJKoZIhvcNAQEMBQAwaTELMAkG +A1UEBhMCS1IxJjAkBgNVBAoMHU5BVkVSIEJVU0lORVNTIFBMQVRGT1JNIENvcnAuMTIwMAYDVQQD +DClOQVZFUiBHbG9iYWwgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0xNzA4MTgwODU4 +NDJaFw0zNzA4MTgyMzU5NTlaMGkxCzAJBgNVBAYTAktSMSYwJAYDVQQKDB1OQVZFUiBCVVNJTkVT +UyBQTEFURk9STSBDb3JwLjEyMDAGA1UEAwwpTkFWRVIgR2xvYmFsIFJvb3QgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC21PGTXLVAiQqrDZBb +UGOukJR0F0Vy1ntlWilLp1agS7gvQnXp2XskWjFlqxcX0TM62RHcQDaH38dq6SZeWYp34+hInDEW ++j6RscrJo+KfziFTowI2MMtSAuXaMl3Dxeb57hHHi8lEHoSTGEq0n+USZGnQJoViAbbJAh2+g1G7 +XNr4rRVqmfeSVPc0W+m/6imBEtRTkZazkVrd/pBzKPswRrXKCAfHcXLJZtM0l/aM9BhK4dA9WkW2 +aacp+yPOiNgSnABIqKYPszuSjXEOdMWLyEz59JuOuDxp7W87UC9Y7cSw0BwbagzivESq2M0UXZR4 +Yb8ObtoqvC8MC3GmsxY/nOb5zJ9TNeIDoKAYv7vxvvTWjIcNQvcGufFt7QSUqP620wbGQGHfnZ3z +VHbOUzoBppJB7ASjjw2i1QnK1sua8e9DXcCrpUHPXFNwcMmIpi3Ua2FzUCaGYQ5fG8Ir4ozVu53B +A0K6lNpfqbDKzE0K70dpAy8i+/Eozr9dUGWokG2zdLAIx6yo0es+nPxdGoMuK8u180SdOqcXYZai +cdNwlhVNt0xz7hlcxVs+Qf6sdWA7G2POAN3aCJBitOUt7kinaxeZVL6HSuOpXgRM6xBtVNbv8ejy +YhbLgGvtPe31HzClrkvJE+2KAQHJuFFYwGY6sWZLxNUxAmLpdIQM201GLQIDAQABo0IwQDAdBgNV +HQ4EFgQU0p+I36HNLL3s9TsBAZMzJ7LrYEswDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMB +Af8wDQYJKoZIhvcNAQEMBQADggIBADLKgLOdPVQG3dLSLvCkASELZ0jKbY7gyKoNqo0hV4/GPnrK +21HUUrPUloSlWGB/5QuOH/XcChWB5Tu2tyIvCZwTFrFsDDUIbatjcu3cvuzHV+YwIHHW1xDBE1UB +jCpD5EHxzzp6U5LOogMFDTjfArsQLtk70pt6wKGm+LUx5vR1yblTmXVHIloUFcd4G7ad6Qz4G3bx +hYTeodoS76TiEJd6eN4MUZeoIUCLhr0N8F5OSza7OyAfikJW4Qsav3vQIkMsRIz75Sq0bBwcupTg +E34h5prCy8VCZLQelHsIJchxzIdFV4XTnyliIoNRlwAYl3dqmJLJfGBs32x9SuRwTMKeuB330DTH +D8z7p/8Dvq1wkNoL3chtl1+afwkyQf3NosxabUzyqkn+Zvjp2DXrDige7kgvOtB5CTh8piKCk5XQ +A76+AqAF3SAi428diDRgxuYKuQl1C/AH6GmWNcf7I4GOODm4RStDeKLRLBT/DShycpWbXgnbiUSY +qqFJu3FS8r/2/yehNq+4tneI3TqkbZs0kNwUXTC/t+sX5Ie3cdCh13cV1ELX8vMxmV2b3RZtP+oG +I/hGoiLtk/bdmuYqh7GYVPEi92tF4+KOdh2ajcQGjTa3FPOdVGm3jjzVpG2Tgbet9r1ke8LJaDmg +kpzNNIaRkPpkUZ3+/uul9XXeifdy +-----END CERTIFICATE----- + +AC RAIZ FNMT-RCM SERVIDORES SEGUROS +=================================== +-----BEGIN CERTIFICATE----- +MIICbjCCAfOgAwIBAgIQYvYybOXE42hcG2LdnC6dlTAKBggqhkjOPQQDAzB4MQswCQYDVQQGEwJF +UzERMA8GA1UECgwIRk5NVC1SQ00xDjAMBgNVBAsMBUNlcmVzMRgwFgYDVQRhDA9WQVRFUy1RMjgy +NjAwNEoxLDAqBgNVBAMMI0FDIFJBSVogRk5NVC1SQ00gU0VSVklET1JFUyBTRUdVUk9TMB4XDTE4 +MTIyMDA5MzczM1oXDTQzMTIyMDA5MzczM1oweDELMAkGA1UEBhMCRVMxETAPBgNVBAoMCEZOTVQt +UkNNMQ4wDAYDVQQLDAVDZXJlczEYMBYGA1UEYQwPVkFURVMtUTI4MjYwMDRKMSwwKgYDVQQDDCNB +QyBSQUlaIEZOTVQtUkNNIFNFUlZJRE9SRVMgU0VHVVJPUzB2MBAGByqGSM49AgEGBSuBBAAiA2IA +BPa6V1PIyqvfNkpSIeSX0oNnnvBlUdBeh8dHsVnyV0ebAAKTRBdp20LHsbI6GA60XYyzZl2hNPk2 +LEnb80b8s0RpRBNm/dfF/a82Tc4DTQdxz69qBdKiQ1oKUm8BA06Oi6NCMEAwDwYDVR0TAQH/BAUw +AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFAG5L++/EYZg8k/QQW6rcx/n0m5JMAoGCCqG +SM49BAMDA2kAMGYCMQCuSuMrQMN0EfKVrRYj3k4MGuZdpSRea0R7/DjiT8ucRRcRTBQnJlU5dUoD +zBOQn5ICMQD6SmxgiHPz7riYYqnOK8LZiqZwMR2vsJRM60/G49HzYqc8/5MuB1xJAWdpEgJyv+c= +-----END CERTIFICATE----- + +GlobalSign Root R46 +=================== +-----BEGIN CERTIFICATE----- +MIIFWjCCA0KgAwIBAgISEdK7udcjGJ5AXwqdLdDfJWfRMA0GCSqGSIb3DQEBDAUAMEYxCzAJBgNV +BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRwwGgYDVQQDExNHbG9iYWxTaWduIFJv +b3QgUjQ2MB4XDTE5MDMyMDAwMDAwMFoXDTQ2MDMyMDAwMDAwMFowRjELMAkGA1UEBhMCQkUxGTAX +BgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExHDAaBgNVBAMTE0dsb2JhbFNpZ24gUm9vdCBSNDYwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCsrHQy6LNl5brtQyYdpokNRbopiLKkHWPd08Es +CVeJOaFV6Wc0dwxu5FUdUiXSE2te4R2pt32JMl8Nnp8semNgQB+msLZ4j5lUlghYruQGvGIFAha/ +r6gjA7aUD7xubMLL1aa7DOn2wQL7Id5m3RerdELv8HQvJfTqa1VbkNud316HCkD7rRlr+/fKYIje +2sGP1q7Vf9Q8g+7XFkyDRTNrJ9CG0Bwta/OrffGFqfUo0q3v84RLHIf8E6M6cqJaESvWJ3En7YEt +bWaBkoe0G1h6zD8K+kZPTXhc+CtI4wSEy132tGqzZfxCnlEmIyDLPRT5ge1lFgBPGmSXZgjPjHvj +K8Cd+RTyG/FWaha/LIWFzXg4mutCagI0GIMXTpRW+LaCtfOW3T3zvn8gdz57GSNrLNRyc0NXfeD4 +12lPFzYE+cCQYDdF3uYM2HSNrpyibXRdQr4G9dlkbgIQrImwTDsHTUB+JMWKmIJ5jqSngiCNI/on +ccnfxkF0oE32kRbcRoxfKWMxWXEM2G/CtjJ9++ZdU6Z+Ffy7dXxd7Pj2Fxzsx2sZy/N78CsHpdls +eVR2bJ0cpm4O6XkMqCNqo98bMDGfsVR7/mrLZqrcZdCinkqaByFrgY/bxFn63iLABJzjqls2k+g9 +vXqhnQt2sQvHnf3PmKgGwvgqo6GDoLclcqUC4wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYD +VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA1yrc4GHqMywptWU4jaWSf8FmSwwDQYJKoZIhvcNAQEM +BQADggIBAHx47PYCLLtbfpIrXTncvtgdokIzTfnvpCo7RGkerNlFo048p9gkUbJUHJNOxO97k4Vg +JuoJSOD1u8fpaNK7ajFxzHmuEajwmf3lH7wvqMxX63bEIaZHU1VNaL8FpO7XJqti2kM3S+LGteWy +gxk6x9PbTZ4IevPuzz5i+6zoYMzRx6Fcg0XERczzF2sUyQQCPtIkpnnpHs6i58FZFZ8d4kuaPp92 +CC1r2LpXFNqD6v6MVenQTqnMdzGxRBF6XLE+0xRFFRhiJBPSy03OXIPBNvIQtQ6IbbjhVp+J3pZm +OUdkLG5NrmJ7v2B0GbhWrJKsFjLtrWhV/pi60zTe9Mlhww6G9kuEYO4Ne7UyWHmRVSyBQ7N0H3qq +JZ4d16GLuc1CLgSkZoNNiTW2bKg2SnkheCLQQrzRQDGQob4Ez8pn7fXwgNNgyYMqIgXQBztSvwye +qiv5u+YfjyW6hY0XHgL+XVAEV8/+LbzvXMAaq7afJMbfc2hIkCwU9D9SGuTSyxTDYWnP4vkYxboz +nxSjBF25cfe1lNj2M8FawTSLfJvdkzrnE6JwYZ+vj+vYxXX4M2bUdGc6N3ec592kD3ZDZopD8p/7 +DEJ4Y9HiD2971KE9dJeFt0g5QdYg/NA6s/rob8SKunE3vouXsXgxT7PntgMTzlSdriVZzH81Xwj3 +QEUxeCp6 +-----END CERTIFICATE----- + +GlobalSign Root E46 +=================== +-----BEGIN CERTIFICATE----- +MIICCzCCAZGgAwIBAgISEdK7ujNu1LzmJGjFDYQdmOhDMAoGCCqGSM49BAMDMEYxCzAJBgNVBAYT +AkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRwwGgYDVQQDExNHbG9iYWxTaWduIFJvb3Qg +RTQ2MB4XDTE5MDMyMDAwMDAwMFoXDTQ2MDMyMDAwMDAwMFowRjELMAkGA1UEBhMCQkUxGTAXBgNV +BAoTEEdsb2JhbFNpZ24gbnYtc2ExHDAaBgNVBAMTE0dsb2JhbFNpZ24gUm9vdCBFNDYwdjAQBgcq +hkjOPQIBBgUrgQQAIgNiAAScDrHPt+ieUnd1NPqlRqetMhkytAepJ8qUuwzSChDH2omwlwxwEwkB +jtjqR+q+soArzfwoDdusvKSGN+1wCAB16pMLey5SnCNoIwZD7JIvU4Tb+0cUB+hflGddyXqBPCCj +QjBAMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBQxCpCPtsad0kRL +gLWi5h+xEk8blTAKBggqhkjOPQQDAwNoADBlAjEA31SQ7Zvvi5QCkxeCmb6zniz2C5GMn0oUsfZk +vLtoURMMA/cVi4RguYv/Uo7njLwcAjA8+RHUjE7AwWHCFUyqqx0LMV87HOIAl0Qx5v5zli/altP+ +CAezNIm8BZ/3Hobui3A= +-----END CERTIFICATE----- + +ANF Secure Server Root CA +========================= +-----BEGIN CERTIFICATE----- +MIIF7zCCA9egAwIBAgIIDdPjvGz5a7EwDQYJKoZIhvcNAQELBQAwgYQxEjAQBgNVBAUTCUc2MzI4 +NzUxMDELMAkGA1UEBhMCRVMxJzAlBgNVBAoTHkFORiBBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lv +bjEUMBIGA1UECxMLQU5GIENBIFJhaXoxIjAgBgNVBAMTGUFORiBTZWN1cmUgU2VydmVyIFJvb3Qg +Q0EwHhcNMTkwOTA0MTAwMDM4WhcNMzkwODMwMTAwMDM4WjCBhDESMBAGA1UEBRMJRzYzMjg3NTEw +MQswCQYDVQQGEwJFUzEnMCUGA1UEChMeQU5GIEF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uMRQw +EgYDVQQLEwtBTkYgQ0EgUmFpejEiMCAGA1UEAxMZQU5GIFNlY3VyZSBTZXJ2ZXIgUm9vdCBDQTCC +AiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANvrayvmZFSVgpCjcqQZAZ2cC4Ffc0m6p6zz +BE57lgvsEeBbphzOG9INgxwruJ4dfkUyYA8H6XdYfp9qyGFOtibBTI3/TO80sh9l2Ll49a2pcbnv +T1gdpd50IJeh7WhM3pIXS7yr/2WanvtH2Vdy8wmhrnZEE26cLUQ5vPnHO6RYPUG9tMJJo8gN0pcv +B2VSAKduyK9o7PQUlrZXH1bDOZ8rbeTzPvY1ZNoMHKGESy9LS+IsJJ1tk0DrtSOOMspvRdOoiXse +zx76W0OLzc2oD2rKDF65nkeP8Nm2CgtYZRczuSPkdxl9y0oukntPLxB3sY0vaJxizOBQ+OyRp1RM +VwnVdmPF6GUe7m1qzwmd+nxPrWAI/VaZDxUse6mAq4xhj0oHdkLePfTdsiQzW7i1o0TJrH93PB0j +7IKppuLIBkwC/qxcmZkLLxCKpvR/1Yd0DVlJRfbwcVw5Kda/SiOL9V8BY9KHcyi1Swr1+KuCLH5z +JTIdC2MKF4EA/7Z2Xue0sUDKIbvVgFHlSFJnLNJhiQcND85Cd8BEc5xEUKDbEAotlRyBr+Qc5RQe +8TZBAQIvfXOn3kLMTOmJDVb3n5HUA8ZsyY/b2BzgQJhdZpmYgG4t/wHFzstGH6wCxkPmrqKEPMVO +Hj1tyRRM4y5Bu8o5vzY8KhmqQYdOpc5LMnndkEl/AgMBAAGjYzBhMB8GA1UdIwQYMBaAFJxf0Gxj +o1+TypOYCK2Mh6UsXME3MB0GA1UdDgQWBBScX9BsY6Nfk8qTmAitjIelLFzBNzAOBgNVHQ8BAf8E +BAMCAYYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEATh65isagmD9uw2nAalxJ +UqzLK114OMHVVISfk/CHGT0sZonrDUL8zPB1hT+L9IBdeeUXZ701guLyPI59WzbLWoAAKfLOKyzx +j6ptBZNscsdW699QIyjlRRA96Gejrw5VD5AJYu9LWaL2U/HANeQvwSS9eS9OICI7/RogsKQOLHDt +dD+4E5UGUcjohybKpFtqFiGS3XNgnhAY3jyB6ugYw3yJ8otQPr0R4hUDqDZ9MwFsSBXXiJCZBMXM +5gf0vPSQ7RPi6ovDj6MzD8EpTBNO2hVWcXNyglD2mjN8orGoGjR0ZVzO0eurU+AagNjqOknkJjCb +5RyKqKkVMoaZkgoQI1YS4PbOTOK7vtuNknMBZi9iPrJyJ0U27U1W45eZ/zo1PqVUSlJZS2Db7v54 +EX9K3BR5YLZrZAPbFYPhor72I5dQ8AkzNqdxliXzuUJ92zg/LFis6ELhDtjTO0wugumDLmsx2d1H +hk9tl5EuT+IocTUW0fJz/iUrB0ckYyfI+PbZa/wSMVYIwFNCr5zQM378BvAxRAMU8Vjq8moNqRGy +g77FGr8H6lnco4g175x2MjxNBiLOFeXdntiP2t7SxDnlF4HPOEfrf4htWRvfn0IUrn7PqLBmZdo3 +r5+qPeoott7VMVgWglvquxl1AnMaykgaIZOQCo6ThKd9OyMYkomgjaw= +-----END CERTIFICATE----- + +Certum EC-384 CA +================ +-----BEGIN CERTIFICATE----- +MIICZTCCAeugAwIBAgIQeI8nXIESUiClBNAt3bpz9DAKBggqhkjOPQQDAzB0MQswCQYDVQQGEwJQ +TDEhMB8GA1UEChMYQXNzZWNvIERhdGEgU3lzdGVtcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2Vy +dGlmaWNhdGlvbiBBdXRob3JpdHkxGTAXBgNVBAMTEENlcnR1bSBFQy0zODQgQ0EwHhcNMTgwMzI2 +MDcyNDU0WhcNNDMwMzI2MDcyNDU0WjB0MQswCQYDVQQGEwJQTDEhMB8GA1UEChMYQXNzZWNvIERh +dGEgU3lzdGVtcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkx +GTAXBgNVBAMTEENlcnR1bSBFQy0zODQgQ0EwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAATEKI6rGFtq +vm5kN2PkzeyrOvfMobgOgknXhimfoZTy42B4mIF4Bk3y7JoOV2CDn7TmFy8as10CW4kjPMIRBSqn +iBMY81CE1700LCeJVf/OTOffph8oxPBUw7l8t1Ot68KjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD +VR0OBBYEFI0GZnQkdjrzife81r1HfS+8EF9LMA4GA1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNo +ADBlAjADVS2m5hjEfO/JUG7BJw+ch69u1RsIGL2SKcHvlJF40jocVYli5RsJHrpka/F2tNQCMQC0 +QoSZ/6vnnvuRlydd3LBbMHHOXjgaatkl5+r3YZJW+OraNsKHZZYuciUvf9/DE8k= +-----END CERTIFICATE----- + +Certum Trusted Root CA +====================== +-----BEGIN CERTIFICATE----- +MIIFwDCCA6igAwIBAgIQHr9ZULjJgDdMBvfrVU+17TANBgkqhkiG9w0BAQ0FADB6MQswCQYDVQQG +EwJQTDEhMB8GA1UEChMYQXNzZWNvIERhdGEgU3lzdGVtcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0g +Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkxHzAdBgNVBAMTFkNlcnR1bSBUcnVzdGVkIFJvb3QgQ0Ew +HhcNMTgwMzE2MTIxMDEzWhcNNDMwMzE2MTIxMDEzWjB6MQswCQYDVQQGEwJQTDEhMB8GA1UEChMY +QXNzZWNvIERhdGEgU3lzdGVtcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkxHzAdBgNVBAMTFkNlcnR1bSBUcnVzdGVkIFJvb3QgQ0EwggIiMA0GCSqGSIb3DQEB +AQUAA4ICDwAwggIKAoICAQDRLY67tzbqbTeRn06TpwXkKQMlzhyC93yZn0EGze2jusDbCSzBfN8p +fktlL5On1AFrAygYo9idBcEq2EXxkd7fO9CAAozPOA/qp1x4EaTByIVcJdPTsuclzxFUl6s1wB52 +HO8AU5853BSlLCIls3Jy/I2z5T4IHhQqNwuIPMqw9MjCoa68wb4pZ1Xi/K1ZXP69VyywkI3C7Te2 +fJmItdUDmj0VDT06qKhF8JVOJVkdzZhpu9PMMsmN74H+rX2Ju7pgE8pllWeg8xn2A1bUatMn4qGt +g/BKEiJ3HAVz4hlxQsDsdUaakFjgao4rpUYwBI4Zshfjvqm6f1bxJAPXsiEodg42MEx51UGamqi4 +NboMOvJEGyCI98Ul1z3G4z5D3Yf+xOr1Uz5MZf87Sst4WmsXXw3Hw09Omiqi7VdNIuJGmj8PkTQk +fVXjjJU30xrwCSss0smNtA0Aq2cpKNgB9RkEth2+dv5yXMSFytKAQd8FqKPVhJBPC/PgP5sZ0jeJ +P/J7UhyM9uH3PAeXjA6iWYEMspA90+NZRu0PqafegGtaqge2Gcu8V/OXIXoMsSt0Puvap2ctTMSY +njYJdmZm/Bo/6khUHL4wvYBQv3y1zgD2DGHZ5yQD4OMBgQ692IU0iL2yNqh7XAjlRICMb/gv1SHK +HRzQ+8S1h9E6Tsd2tTVItQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSM+xx1 +vALTn04uSNn5YFSqxLNP+jAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQENBQADggIBAEii1QAL +LtA/vBzVtVRJHlpr9OTy4EA34MwUe7nJ+jW1dReTagVphZzNTxl4WxmB82M+w85bj/UvXgF2Ez8s +ALnNllI5SW0ETsXpD4YN4fqzX4IS8TrOZgYkNCvozMrnadyHncI013nR03e4qllY/p0m+jiGPp2K +h2RX5Rc64vmNueMzeMGQ2Ljdt4NR5MTMI9UGfOZR0800McD2RrsLrfw9EAUqO0qRJe6M1ISHgCq8 +CYyqOhNf6DR5UMEQGfnTKB7U0VEwKbOukGfWHwpjscWpxkIxYxeU72nLL/qMFH3EQxiJ2fAyQOaA +4kZf5ePBAFmo+eggvIksDkc0C+pXwlM2/KfUrzHN/gLldfq5Jwn58/U7yn2fqSLLiMmq0Uc9Nneo +WWRrJ8/vJ8HjJLWG965+Mk2weWjROeiQWMODvA8s1pfrzgzhIMfatz7DP78v3DSk+yshzWePS/Tj +6tQ/50+6uaWTRRxmHyH6ZF5v4HaUMst19W7l9o/HuKTMqJZ9ZPskWkoDbGs4xugDQ5r3V7mzKWmT +OPQD8rv7gmsHINFSH5pkAnuYZttcTVoP0ISVoDwUQwbKytu4QTbaakRnh6+v40URFWkIsr4WOZck +bxJF0WddCajJFdr60qZfE2Efv4WstK2tBZQIgx51F9NxO5NQI1mg7TyRVJ12AMXDuDjb +-----END CERTIFICATE----- + +TunTrust Root CA +================ +-----BEGIN CERTIFICATE----- +MIIFszCCA5ugAwIBAgIUEwLV4kBMkkaGFmddtLu7sms+/BMwDQYJKoZIhvcNAQELBQAwYTELMAkG +A1UEBhMCVE4xNzA1BgNVBAoMLkFnZW5jZSBOYXRpb25hbGUgZGUgQ2VydGlmaWNhdGlvbiBFbGVj +dHJvbmlxdWUxGTAXBgNVBAMMEFR1blRydXN0IFJvb3QgQ0EwHhcNMTkwNDI2MDg1NzU2WhcNNDQw +NDI2MDg1NzU2WjBhMQswCQYDVQQGEwJUTjE3MDUGA1UECgwuQWdlbmNlIE5hdGlvbmFsZSBkZSBD +ZXJ0aWZpY2F0aW9uIEVsZWN0cm9uaXF1ZTEZMBcGA1UEAwwQVHVuVHJ1c3QgUm9vdCBDQTCCAiIw +DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMPN0/y9BFPdDCA61YguBUtB9YOCfvdZn56eY+hz +2vYGqU8ftPkLHzmMmiDQfgbU7DTZhrx1W4eI8NLZ1KMKsmwb60ksPqxd2JQDoOw05TDENX37Jk0b +bjBU2PWARZw5rZzJJQRNmpA+TkBuimvNKWfGzC3gdOgFVwpIUPp6Q9p+7FuaDmJ2/uqdHYVy7BG7 +NegfJ7/Boce7SBbdVtfMTqDhuazb1YMZGoXRlJfXyqNlC/M4+QKu3fZnz8k/9YosRxqZbwUN/dAd +gjH8KcwAWJeRTIAAHDOFli/LQcKLEITDCSSJH7UP2dl3RxiSlGBcx5kDPP73lad9UKGAwqmDrViW +VSHbhlnUr8a83YFuB9tgYv7sEG7aaAH0gxupPqJbI9dkxt/con3YS7qC0lH4Zr8GRuR5KiY2eY8f +Tpkdso8MDhz/yV3A/ZAQprE38806JG60hZC/gLkMjNWb1sjxVj8agIl6qeIbMlEsPvLfe/ZdeikZ +juXIvTZxi11Mwh0/rViizz1wTaZQmCXcI/m4WEEIcb9PuISgjwBUFfyRbVinljvrS5YnzWuioYas +DXxU5mZMZl+QviGaAkYt5IPCgLnPSz7ofzwB7I9ezX/SKEIBlYrilz0QIX32nRzFNKHsLA4KUiwS +VXAkPcvCFDVDXSdOvsC9qnyW5/yeYa1E0wCXAgMBAAGjYzBhMB0GA1UdDgQWBBQGmpsfU33x9aTI +04Y+oXNZtPdEITAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFAaamx9TffH1pMjThj6hc1m0 +90QhMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAqgVutt0Vyb+zxiD2BkewhpMl +0425yAA/l/VSJ4hxyXT968pk21vvHl26v9Hr7lxpuhbI87mP0zYuQEkHDVneixCwSQXi/5E/S7fd +Ao74gShczNxtr18UnH1YeA32gAm56Q6XKRm4t+v4FstVEuTGfbvE7Pi1HE4+Z7/FXxttbUcoqgRY +YdZ2vyJ/0Adqp2RT8JeNnYA/u8EH22Wv5psymsNUk8QcCMNE+3tjEUPRahphanltkE8pjkcFwRJp +adbGNjHh/PqAulxPxOu3Mqz4dWEX1xAZufHSCe96Qp1bWgvUxpVOKs7/B9dPfhgGiPEZtdmYu65x +xBzndFlY7wyJz4sfdZMaBBSSSFCp61cpABbjNhzI+L/wM9VBD8TMPN3pM0MBkRArHtG5Xc0yGYuP +jCB31yLEQtyEFpslbei0VXF/sHyz03FJuc9SpAQ/3D2gu68zngowYI7bnV2UqL1g52KAdoGDDIzM +MEZJ4gzSqK/rYXHv5yJiqfdcZGyfFoxnNidF9Ql7v/YQCvGwjVRDjAS6oz/v4jXH+XTgbzRB0L9z +ZVcg+ZtnemZoJE6AZb0QmQZZ8mWvuMZHu/2QeItBcy6vVR/cO5JyboTT0GFMDcx2V+IthSIVNg3r +AZ3r2OvEhJn7wAzMMujjd9qDRIueVSjAi1jTkD5OGwDxFa2DK5o= +-----END CERTIFICATE----- + +HARICA TLS RSA Root CA 2021 +=========================== +-----BEGIN CERTIFICATE----- +MIIFpDCCA4ygAwIBAgIQOcqTHO9D88aOk8f0ZIk4fjANBgkqhkiG9w0BAQsFADBsMQswCQYDVQQG +EwJHUjE3MDUGA1UECgwuSGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9u +cyBDQTEkMCIGA1UEAwwbSEFSSUNBIFRMUyBSU0EgUm9vdCBDQSAyMDIxMB4XDTIxMDIxOTEwNTUz +OFoXDTQ1MDIxMzEwNTUzN1owbDELMAkGA1UEBhMCR1IxNzA1BgNVBAoMLkhlbGxlbmljIEFjYWRl +bWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ0ExJDAiBgNVBAMMG0hBUklDQSBUTFMgUlNB +IFJvb3QgQ0EgMjAyMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAIvC569lmwVnlskN +JLnQDmT8zuIkGCyEf3dRywQRNrhe7Wlxp57kJQmXZ8FHws+RFjZiPTgE4VGC/6zStGndLuwRo0Xu +a2s7TL+MjaQenRG56Tj5eg4MmOIjHdFOY9TnuEFE+2uva9of08WRiFukiZLRgeaMOVig1mlDqa2Y +Ulhu2wr7a89o+uOkXjpFc5gH6l8Cct4MpbOfrqkdtx2z/IpZ525yZa31MJQjB/OCFks1mJxTuy/K +5FrZx40d/JiZ+yykgmvwKh+OC19xXFyuQnspiYHLA6OZyoieC0AJQTPb5lh6/a6ZcMBaD9YThnEv +dmn8kN3bLW7R8pv1GmuebxWMevBLKKAiOIAkbDakO/IwkfN4E8/BPzWr8R0RI7VDIp4BkrcYAuUR +0YLbFQDMYTfBKnya4dC6s1BG7oKsnTH4+yPiAwBIcKMJJnkVU2DzOFytOOqBAGMUuTNe3QvboEUH +GjMJ+E20pwKmafTCWQWIZYVWrkvL4N48fS0ayOn7H6NhStYqE613TBoYm5EPWNgGVMWX+Ko/IIqm +haZ39qb8HOLubpQzKoNQhArlT4b4UEV4AIHrW2jjJo3Me1xR9BQsQL4aYB16cmEdH2MtiKrOokWQ +CPxrvrNQKlr9qEgYRtaQQJKQCoReaDH46+0N0x3GfZkYVVYnZS6NRcUk7M7jAgMBAAGjQjBAMA8G +A1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFApII6ZgpJIKM+qTW8VX6iVNvRLuMA4GA1UdDwEB/wQE +AwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAPpBIqm5iFSVmewzVjIuJndftTgfvnNAUX15QvWiWkKQU +EapobQk1OUAJ2vQJLDSle1mESSmXdMgHHkdt8s4cUCbjnj1AUz/3f5Z2EMVGpdAgS1D0NTsY9FVq +QRtHBmg8uwkIYtlfVUKqrFOFrJVWNlar5AWMxajaH6NpvVMPxP/cyuN+8kyIhkdGGvMA9YCRotxD +QpSbIPDRzbLrLFPCU3hKTwSUQZqPJzLB5UkZv/HywouoCjkxKLR9YjYsTewfM7Z+d21+UPCfDtcR +j88YxeMn/ibvBZ3PzzfF0HvaO7AWhAw6k9a+F9sPPg4ZeAnHqQJyIkv3N3a6dcSFA1pj1bF1BcK5 +vZStjBWZp5N99sXzqnTPBIWUmAD04vnKJGW/4GKvyMX6ssmeVkjaef2WdhW+o45WxLM0/L5H9MG0 +qPzVMIho7suuyWPEdr6sOBjhXlzPrjoiUevRi7PzKzMHVIf6tLITe7pTBGIBnfHAT+7hOtSLIBD6 +Alfm78ELt5BGnBkpjNxvoEppaZS3JGWg/6w/zgH7IS79aPib8qXPMThcFarmlwDB31qlpzmq6YR/ +PFGoOtmUW4y/Twhx5duoXNTSpv4Ao8YWxw/ogM4cKGR0GQjTQuPOAF1/sdwTsOEFy9EgqoZ0njnn +kf3/W9b3raYvAwtt41dU63ZTGI0RmLo= +-----END CERTIFICATE----- + +HARICA TLS ECC Root CA 2021 +=========================== +-----BEGIN CERTIFICATE----- +MIICVDCCAdugAwIBAgIQZ3SdjXfYO2rbIvT/WeK/zjAKBggqhkjOPQQDAzBsMQswCQYDVQQGEwJH +UjE3MDUGA1UECgwuSGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBD +QTEkMCIGA1UEAwwbSEFSSUNBIFRMUyBFQ0MgUm9vdCBDQSAyMDIxMB4XDTIxMDIxOTExMDExMFoX +DTQ1MDIxMzExMDEwOVowbDELMAkGA1UEBhMCR1IxNzA1BgNVBAoMLkhlbGxlbmljIEFjYWRlbWlj +IGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ0ExJDAiBgNVBAMMG0hBUklDQSBUTFMgRUNDIFJv +b3QgQ0EgMjAyMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABDgI/rGgltJ6rK9JOtDA4MM7KKrxcm1l +AEeIhPyaJmuqS7psBAqIXhfyVYf8MLA04jRYVxqEU+kw2anylnTDUR9YSTHMmE5gEYd103KUkE+b +ECUqqHgtvpBBWJAVcqeht6NCMEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUyRtTgRL+BNUW +0aq8mm+3oJUZbsowDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMDA2cAMGQCMBHervjcToiwqfAi +rcJRQO9gcS3ujwLEXQNwSaSS6sUUiHCm0w2wqsosQJz76YJumgIwK0eaB8bRwoF8yguWGEEbo/Qw +CZ61IygNnxS2PFOiTAZpffpskcYqSUXm7LcT4Tps +-----END CERTIFICATE----- + +Autoridad de Certificacion Firmaprofesional CIF A62634068 +========================================================= +-----BEGIN CERTIFICATE----- +MIIGFDCCA/ygAwIBAgIIG3Dp0v+ubHEwDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCRVMxQjBA +BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2 +MjYzNDA2ODAeFw0xNDA5MjMxNTIyMDdaFw0zNjA1MDUxNTIyMDdaMFExCzAJBgNVBAYTAkVTMUIw +QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB +NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD +Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P +B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY +7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH +ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI +plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX +MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX +LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK +bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU +vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMB0GA1Ud +DgQWBBRlzeurNR4APn7VdMActHNHDhpkLzASBgNVHRMBAf8ECDAGAQH/AgEBMIGmBgNVHSAEgZ4w +gZswgZgGBFUdIAAwgY8wLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuZmlybWFwcm9mZXNpb25hbC5j +b20vY3BzMFwGCCsGAQUFBwICMFAeTgBQAGEAcwBlAG8AIABkAGUAIABsAGEAIABCAG8AbgBhAG4A +bwB2AGEAIAA0ADcAIABCAGEAcgBjAGUAbABvAG4AYQAgADAAOAAwADEANzAOBgNVHQ8BAf8EBAMC +AQYwDQYJKoZIhvcNAQELBQADggIBAHSHKAIrdx9miWTtj3QuRhy7qPj4Cx2Dtjqn6EWKB7fgPiDL +4QjbEwj4KKE1soCzC1HA01aajTNFSa9J8OA9B3pFE1r/yJfY0xgsfZb43aJlQ3CTkBW6kN/oGbDb +LIpgD7dvlAceHabJhfa9NPhAeGIQcDq+fUs5gakQ1JZBu/hfHAsdCPKxsIl68veg4MSPi3i1O1il +I45PVf42O+AMt8oqMEEgtIDNrvx2ZnOorm7hfNoD6JQg5iKj0B+QXSBTFCZX2lSX3xZEEAEeiGaP +cjiT3SC3NL7X8e5jjkd5KAb881lFJWAiMxujX6i6KtoaPc1A6ozuBRWV1aUsIC+nmCjuRfzxuIgA +LI9C2lHVnOUTaHFFQ4ueCyE8S1wF3BqfmI7avSKecs2tCsvMo2ebKHTEm9caPARYpoKdrcd7b/+A +lun4jWq9GJAd/0kakFI3ky88Al2CdgtR5xbHV/g4+afNmyJU72OwFW1TZQNKXkqgsqeOSQBZONXH +9IBk9W6VULgRfhVwOEqwf9DEMnDAGf/JOC0ULGb0QkTmVXYbgBVX/8Cnp6o5qtjTcNAuuuuUavpf +NIbnYrX9ivAwhZTJryQCL2/W3Wf+47BVTwSYT6RBVuKT0Gro1vP7ZeDOdcQxWQzugsgMYDNKGbqE +ZycPvEJdvSRUDewdcAZfpLz6IHxV +-----END CERTIFICATE----- + +vTrus ECC Root CA +================= +-----BEGIN CERTIFICATE----- +MIICDzCCAZWgAwIBAgIUbmq8WapTvpg5Z6LSa6Q75m0c1towCgYIKoZIzj0EAwMwRzELMAkGA1UE +BhMCQ04xHDAaBgNVBAoTE2lUcnVzQ2hpbmEgQ28uLEx0ZC4xGjAYBgNVBAMTEXZUcnVzIEVDQyBS +b290IENBMB4XDTE4MDczMTA3MjY0NFoXDTQzMDczMTA3MjY0NFowRzELMAkGA1UEBhMCQ04xHDAa +BgNVBAoTE2lUcnVzQ2hpbmEgQ28uLEx0ZC4xGjAYBgNVBAMTEXZUcnVzIEVDQyBSb290IENBMHYw +EAYHKoZIzj0CAQYFK4EEACIDYgAEZVBKrox5lkqqHAjDo6LN/llWQXf9JpRCux3NCNtzslt188+c +ToL0v/hhJoVs1oVbcnDS/dtitN9Ti72xRFhiQgnH+n9bEOf+QP3A2MMrMudwpremIFUde4BdS49n +TPEQo0IwQDAdBgNVHQ4EFgQUmDnNvtiyjPeyq+GtJK97fKHbH88wDwYDVR0TAQH/BAUwAwEB/zAO +BgNVHQ8BAf8EBAMCAQYwCgYIKoZIzj0EAwMDaAAwZQIwV53dVvHH4+m4SVBrm2nDb+zDfSXkV5UT +QJtS0zvzQBm8JsctBp61ezaf9SXUY2sAAjEA6dPGnlaaKsyh2j/IZivTWJwghfqrkYpwcBE4YGQL +YgmRWAD5Tfs0aNoJrSEGGJTO +-----END CERTIFICATE----- + +vTrus Root CA +============= +-----BEGIN CERTIFICATE----- +MIIFVjCCAz6gAwIBAgIUQ+NxE9izWRRdt86M/TX9b7wFjUUwDQYJKoZIhvcNAQELBQAwQzELMAkG +A1UEBhMCQ04xHDAaBgNVBAoTE2lUcnVzQ2hpbmEgQ28uLEx0ZC4xFjAUBgNVBAMTDXZUcnVzIFJv +b3QgQ0EwHhcNMTgwNzMxMDcyNDA1WhcNNDMwNzMxMDcyNDA1WjBDMQswCQYDVQQGEwJDTjEcMBoG +A1UEChMTaVRydXNDaGluYSBDby4sTHRkLjEWMBQGA1UEAxMNdlRydXMgUm9vdCBDQTCCAiIwDQYJ +KoZIhvcNAQEBBQADggIPADCCAgoCggIBAL1VfGHTuB0EYgWgrmy3cLRB6ksDXhA/kFocizuwZots +SKYcIrrVQJLuM7IjWcmOvFjai57QGfIvWcaMY1q6n6MLsLOaXLoRuBLpDLvPbmyAhykUAyyNJJrI +ZIO1aqwTLDPxn9wsYTwaP3BVm60AUn/PBLn+NvqcwBauYv6WTEN+VRS+GrPSbcKvdmaVayqwlHeF +XgQPYh1jdfdr58tbmnDsPmcF8P4HCIDPKNsFxhQnL4Z98Cfe/+Z+M0jnCx5Y0ScrUw5XSmXX+6KA +YPxMvDVTAWqXcoKv8R1w6Jz1717CbMdHflqUhSZNO7rrTOiwCcJlwp2dCZtOtZcFrPUGoPc2BX70 +kLJrxLT5ZOrpGgrIDajtJ8nU57O5q4IikCc9Kuh8kO+8T/3iCiSn3mUkpF3qwHYw03dQ+A0Em5Q2 +AXPKBlim0zvc+gRGE1WKyURHuFE5Gi7oNOJ5y1lKCn+8pu8fA2dqWSslYpPZUxlmPCdiKYZNpGvu +/9ROutW04o5IWgAZCfEF2c6Rsffr6TlP9m8EQ5pV9T4FFL2/s1m02I4zhKOQUqqzApVg+QxMaPnu +1RcN+HFXtSXkKe5lXa/R7jwXC1pDxaWG6iSe4gUH3DRCEpHWOXSuTEGC2/KmSNGzm/MzqvOmwMVO +9fSddmPmAsYiS8GVP1BkLFTltvA8Kc9XAgMBAAGjQjBAMB0GA1UdDgQWBBRUYnBj8XWEQ1iO0RYg +scasGrz2iTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOC +AgEAKbqSSaet8PFww+SX8J+pJdVrnjT+5hpk9jprUrIQeBqfTNqK2uwcN1LgQkv7bHbKJAs5EhWd +nxEt/Hlk3ODg9d3gV8mlsnZwUKT+twpw1aA08XXXTUm6EdGz2OyC/+sOxL9kLX1jbhd47F18iMjr +jld22VkE+rxSH0Ws8HqA7Oxvdq6R2xCOBNyS36D25q5J08FsEhvMKar5CKXiNxTKsbhm7xqC5PD4 +8acWabfbqWE8n/Uxy+QARsIvdLGx14HuqCaVvIivTDUHKgLKeBRtRytAVunLKmChZwOgzoy8sHJn +xDHO2zTlJQNgJXtxmOTAGytfdELSS8VZCAeHvsXDf+eW2eHcKJfWjwXj9ZtOyh1QRwVTsMo554Wg +icEFOwE30z9J4nfrI8iIZjs9OXYhRvHsXyO466JmdXTBQPfYaJqT4i2pLr0cox7IdMakLXogqzu4 +sEb9b91fUlV1YvCXoHzXOP0l382gmxDPi7g4Xl7FtKYCNqEeXxzP4padKar9mK5S4fNBUvupLnKW +nyfjqnN9+BojZns7q2WwMgFLFT49ok8MKzWixtlnEjUwzXYuFrOZnk1PTi07NEPhmg4NpGaXutIc +SkwsKouLgU9xGqndXHt7CMUADTdA43x7VF8vhV929vensBxXVsFy6K2ir40zSbofitzmdHxghm+H +l3s= +-----END CERTIFICATE----- + +ISRG Root X2 +============ +-----BEGIN CERTIFICATE----- +MIICGzCCAaGgAwIBAgIQQdKd0XLq7qeAwSxs6S+HUjAKBggqhkjOPQQDAzBPMQswCQYDVQQGEwJV +UzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElT +UkcgUm9vdCBYMjAeFw0yMDA5MDQwMDAwMDBaFw00MDA5MTcxNjAwMDBaME8xCzAJBgNVBAYTAlVT +MSkwJwYDVQQKEyBJbnRlcm5ldCBTZWN1cml0eSBSZXNlYXJjaCBHcm91cDEVMBMGA1UEAxMMSVNS +RyBSb290IFgyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEzZvVn4CDCuwJSvMWSj5cz3es3mcFDR0H +ttwW+1qLFNvicWDEukWVEYmO6gbf9yoWHKS5xcUy4APgHoIYOIvXRdgKam7mAHf7AlF9ItgKbppb +d9/w+kHsOdx1ymgHDB/qo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV +HQ4EFgQUfEKWrt5LSDv6kviejM9ti6lyN5UwCgYIKoZIzj0EAwMDaAAwZQIwe3lORlCEwkSHRhtF +cP9Ymd70/aTSVaYgLXTWNLxBo1BfASdWtL4ndQavEi51mI38AjEAi/V3bNTIZargCyzuFJ0nN6T5 +U6VR5CmD1/iQMVtCnwr1/q4AaOeMSQ+2b1tbFfLn +-----END CERTIFICATE----- + +HiPKI Root CA - G1 +================== +-----BEGIN CERTIFICATE----- +MIIFajCCA1KgAwIBAgIQLd2szmKXlKFD6LDNdmpeYDANBgkqhkiG9w0BAQsFADBPMQswCQYDVQQG +EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xGzAZBgNVBAMMEkhpUEtJ +IFJvb3QgQ0EgLSBHMTAeFw0xOTAyMjIwOTQ2MDRaFw0zNzEyMzExNTU5NTlaME8xCzAJBgNVBAYT +AlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEbMBkGA1UEAwwSSGlQS0kg +Um9vdCBDQSAtIEcxMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA9B5/UnMyDHPkvRN0 +o9QwqNCuS9i233VHZvR85zkEHmpwINJaR3JnVfSl6J3VHiGh8Ge6zCFovkRTv4354twvVcg3Px+k +wJyz5HdcoEb+d/oaoDjq7Zpy3iu9lFc6uux55199QmQ5eiY29yTw1S+6lZgRZq2XNdZ1AYDgr/SE +YYwNHl98h5ZeQa/rh+r4XfEuiAU+TCK72h8q3VJGZDnzQs7ZngyzsHeXZJzA9KMuH5UHsBffMNsA +GJZMoYFL3QRtU6M9/Aes1MU3guvklQgZKILSQjqj2FPseYlgSGDIcpJQ3AOPgz+yQlda22rpEZfd +hSi8MEyr48KxRURHH+CKFgeW0iEPU8DtqX7UTuybCeyvQqww1r/REEXgphaypcXTT3OUM3ECoWqj +1jOXTyFjHluP2cFeRXF3D4FdXyGarYPM+l7WjSNfGz1BryB1ZlpK9p/7qxj3ccC2HTHsOyDry+K4 +9a6SsvfhhEvyovKTmiKe0xRvNlS9H15ZFblzqMF8b3ti6RZsR1pl8w4Rm0bZ/W3c1pzAtH2lsN0/ +Vm+h+fbkEkj9Bn8SV7apI09bA8PgcSojt/ewsTu8mL3WmKgMa/aOEmem8rJY5AIJEzypuxC00jBF +8ez3ABHfZfjcK0NVvxaXxA/VLGGEqnKG/uY6fsI/fe78LxQ+5oXdUG+3Se0CAwEAAaNCMEAwDwYD +VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU8ncX+l6o/vY9cdVouslGDDjYr7AwDgYDVR0PAQH/BAQD +AgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBQUfB13HAE4/+qddRxosuej6ip0691x1TPOhwEmSKsxBHi +7zNKpiMdDg1H2DfHb680f0+BazVP6XKlMeJ45/dOlBhbQH3PayFUhuaVevvGyuqcSE5XCV0vrPSl +tJczWNWseanMX/mF+lLFjfiRFOs6DRfQUsJ748JzjkZ4Bjgs6FzaZsT0pPBWGTMpWmWSBUdGSquE +wx4noR8RkpkndZMPvDY7l1ePJlsMu5wP1G4wB9TcXzZoZjmDlicmisjEOf6aIW/Vcobpf2Lll07Q +JNBAsNB1CI69aO4I1258EHBGG3zgiLKecoaZAeO/n0kZtCW+VmWuF2PlHt/o/0elv+EmBYTksMCv +5wiZqAxeJoBF1PhoL5aPruJKHJwWDBNvOIf2u8g0X5IDUXlwpt/L9ZlNec1OvFefQ05rLisY+Gpz +jLrFNe85akEez3GoorKGB1s6yeHvP2UEgEcyRHCVTjFnanRbEEV16rCf0OY1/k6fi8wrkkVbbiVg +hUbN0aqwdmaTd5a+g744tiROJgvM7XpWGuDpWsZkrUx6AEhEL7lAuxM+vhV4nYWBSipX3tUZQ9rb +yltHhoMLP7YNdnhzeSJesYAfz77RP1YQmCuVh6EfnWQUYDksswBVLuT1sw5XxJFBAJw/6KXf6vb/ +yPCtbVKoF6ubYfwSUTXkJf2vqmqGOQ== +-----END CERTIFICATE----- + +GlobalSign ECC Root CA - R4 +=========================== +-----BEGIN CERTIFICATE----- +MIIB3DCCAYOgAwIBAgINAgPlfvU/k/2lCSGypjAKBggqhkjOPQQDAjBQMSQwIgYDVQQLExtHbG9i +YWxTaWduIEVDQyBSb290IENBIC0gUjQxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkds +b2JhbFNpZ24wHhcNMTIxMTEzMDAwMDAwWhcNMzgwMTE5MDMxNDA3WjBQMSQwIgYDVQQLExtHbG9i +YWxTaWduIEVDQyBSb290IENBIC0gUjQxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkds +b2JhbFNpZ24wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAS4xnnTj2wlDp8uORkcA6SumuU5BwkW +ymOxuYb4ilfBV85C+nOh92VC/x7BALJucw7/xyHlGKSq2XE/qNS5zowdo0IwQDAOBgNVHQ8BAf8E +BAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVLB7rUW44kB/+wpu+74zyTyjhNUwCgYI +KoZIzj0EAwIDRwAwRAIgIk90crlgr/HmnKAWBVBfw147bmF0774BxL4YSFlhgjICICadVGNA3jdg +UM/I2O2dgq43mLyjj0xMqTQrbO/7lZsm +-----END CERTIFICATE----- + +GTS Root R1 +=========== +-----BEGIN CERTIFICATE----- +MIIFVzCCAz+gAwIBAgINAgPlk28xsBNJiGuiFzANBgkqhkiG9w0BAQwFADBHMQswCQYDVQQGEwJV +UzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3Qg +UjEwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UE +ChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwggIiMA0G +CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2EQKLHuOhd5s73L+UPreVp0A8of2C+X0yBoJx9vaM +f/vo27xqLpeXo4xL+Sv2sfnOhB2x+cWX3u+58qPpvBKJXqeqUqv4IyfLpLGcY9vXmX7wCl7raKb0 +xlpHDU0QM+NOsROjyBhsS+z8CZDfnWQpJSMHobTSPS5g4M/SCYe7zUjwTcLCeoiKu7rPWRnWr4+w +B7CeMfGCwcDfLqZtbBkOtdh+JhpFAz2weaSUKK0PfyblqAj+lug8aJRT7oM6iCsVlgmy4HqMLnXW +nOunVmSPlk9orj2XwoSPwLxAwAtcvfaHszVsrBhQf4TgTM2S0yDpM7xSma8ytSmzJSq0SPly4cpk +9+aCEI3oncKKiPo4Zor8Y/kB+Xj9e1x3+naH+uzfsQ55lVe0vSbv1gHR6xYKu44LtcXFilWr06zq +kUspzBmkMiVOKvFlRNACzqrOSbTqn3yDsEB750Orp2yjj32JgfpMpf/VjsPOS+C12LOORc92wO1A +K/1TD7Cn1TsNsYqiA94xrcx36m97PtbfkSIS5r762DL8EGMUUXLeXdYWk70paDPvOmbsB4om3xPX +V2V4J95eSRQAogB/mqghtqmxlbCluQ0WEdrHbEg8QOB+DVrNVjzRlwW5y0vtOUucxD/SVRNuJLDW +cfr0wbrM7Rv1/oFB2ACYPTrIrnqYNxgFlQIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0T +AQH/BAUwAwEB/zAdBgNVHQ4EFgQU5K8rJnEaK0gnhS9SZizv8IkTcT4wDQYJKoZIhvcNAQEMBQAD +ggIBAJ+qQibbC5u+/x6Wki4+omVKapi6Ist9wTrYggoGxval3sBOh2Z5ofmmWJyq+bXmYOfg6LEe +QkEzCzc9zolwFcq1JKjPa7XSQCGYzyI0zzvFIoTgxQ6KfF2I5DUkzps+GlQebtuyh6f88/qBVRRi +ClmpIgUxPoLW7ttXNLwzldMXG+gnoot7TiYaelpkttGsN/H9oPM47HLwEXWdyzRSjeZ2axfG34ar +J45JK3VmgRAhpuo+9K4l/3wV3s6MJT/KYnAK9y8JZgfIPxz88NtFMN9iiMG1D53Dn0reWVlHxYci +NuaCp+0KueIHoI17eko8cdLiA6EfMgfdG+RCzgwARWGAtQsgWSl4vflVy2PFPEz0tv/bal8xa5me +LMFrUKTX5hgUvYU/Z6tGn6D/Qqc6f1zLXbBwHSs09dR2CQzreExZBfMzQsNhFRAbd03OIozUhfJF +fbdT6u9AWpQKXCBfTkBdYiJ23//OYb2MI3jSNwLgjt7RETeJ9r/tSQdirpLsQBqvFAnZ0E6yove+ +7u7Y/9waLd64NnHi/Hm3lCXRSHNboTXns5lndcEZOitHTtNCjv0xyBZm2tIMPNuzjsmhDYAPexZ3 +FL//2wmUspO8IFgV6dtxQ/PeEMMA3KgqlbbC1j+Qa3bbbP6MvPJwNQzcmRk13NfIRmPVNnGuV/u3 +gm3c +-----END CERTIFICATE----- + +GTS Root R2 +=========== +-----BEGIN CERTIFICATE----- +MIIFVzCCAz+gAwIBAgINAgPlrsWNBCUaqxElqjANBgkqhkiG9w0BAQwFADBHMQswCQYDVQQGEwJV +UzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3Qg +UjIwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UE +ChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwggIiMA0G +CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDO3v2m++zsFDQ8BwZabFn3GTXd98GdVarTzTukk3Lv +CvptnfbwhYBboUhSnznFt+4orO/LdmgUud+tAWyZH8QiHZ/+cnfgLFuv5AS/T3KgGjSY6Dlo7JUl +e3ah5mm5hRm9iYz+re026nO8/4Piy33B0s5Ks40FnotJk9/BW9BuXvAuMC6C/Pq8tBcKSOWIm8Wb +a96wyrQD8Nr0kLhlZPdcTK3ofmZemde4wj7I0BOdre7kRXuJVfeKH2JShBKzwkCX44ofR5GmdFrS ++LFjKBC4swm4VndAoiaYecb+3yXuPuWgf9RhD1FLPD+M2uFwdNjCaKH5wQzpoeJ/u1U8dgbuak7M +kogwTZq9TwtImoS1mKPV+3PBV2HdKFZ1E66HjucMUQkQdYhMvI35ezzUIkgfKtzra7tEscszcTJG +r61K8YzodDqs5xoic4DSMPclQsciOzsSrZYuxsN2B6ogtzVJV+mSSeh2FnIxZyuWfoqjx5RWIr9q +S34BIbIjMt/kmkRtWVtd9QCgHJvGeJeNkP+byKq0rxFROV7Z+2et1VsRnTKaG73VululycslaVNV +J1zgyjbLiGH7HrfQy+4W+9OmTN6SpdTi3/UGVN4unUu0kzCqgc7dGtxRcw1PcOnlthYhGXmy5okL +dWTK1au8CcEYof/UVKGFPP0UJAOyh9OktwIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0T +AQH/BAUwAwEB/zAdBgNVHQ4EFgQUu//KjiOfT5nK2+JopqUVJxce2Q4wDQYJKoZIhvcNAQEMBQAD +ggIBAB/Kzt3HvqGf2SdMC9wXmBFqiN495nFWcrKeGk6c1SuYJF2ba3uwM4IJvd8lRuqYnrYb/oM8 +0mJhwQTtzuDFycgTE1XnqGOtjHsB/ncw4c5omwX4Eu55MaBBRTUoCnGkJE+M3DyCB19m3H0Q/gxh +swWV7uGugQ+o+MePTagjAiZrHYNSVc61LwDKgEDg4XSsYPWHgJ2uNmSRXbBoGOqKYcl3qJfEycel +/FVL8/B/uWU9J2jQzGv6U53hkRrJXRqWbTKH7QMgyALOWr7Z6v2yTcQvG99fevX4i8buMTolUVVn +jWQye+mew4K6Ki3pHrTgSAai/GevHyICc/sgCq+dVEuhzf9gR7A/Xe8bVr2XIZYtCtFenTgCR2y5 +9PYjJbigapordwj6xLEokCZYCDzifqrXPW+6MYgKBesntaFJ7qBFVHvmJ2WZICGoo7z7GJa7Um8M +7YNRTOlZ4iBgxcJlkoKM8xAfDoqXvneCbT+PHV28SSe9zE8P4c52hgQjxcCMElv924SgJPFI/2R8 +0L5cFtHvma3AH/vLrrw4IgYmZNralw4/KBVEqE8AyvCazM90arQ+POuV7LXTWtiBmelDGDfrs7vR +WGJB82bSj6p4lVQgw1oudCvV0b4YacCs1aTPObpRhANl6WLAYv7YTVWW4tAR+kg0Eeye7QUd5MjW +HYbL +-----END CERTIFICATE----- + +GTS Root R3 +=========== +-----BEGIN CERTIFICATE----- +MIICCTCCAY6gAwIBAgINAgPluILrIPglJ209ZjAKBggqhkjOPQQDAzBHMQswCQYDVQQGEwJVUzEi +MCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjMw +HhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZ +R29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjMwdjAQBgcqhkjO +PQIBBgUrgQQAIgNiAAQfTzOHMymKoYTey8chWEGJ6ladK0uFxh1MJ7x/JlFyb+Kf1qPKzEUURout +736GjOyxfi//qXGdGIRFBEFVbivqJn+7kAHjSxm65FSWRQmx1WyRRK2EE46ajA2ADDL24CejQjBA +MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTB8Sa6oC2uhYHP0/Eq +Er24Cmf9vDAKBggqhkjOPQQDAwNpADBmAjEA9uEglRR7VKOQFhG/hMjqb2sXnh5GmCCbn9MN2azT +L818+FsuVbu/3ZL3pAzcMeGiAjEA/JdmZuVDFhOD3cffL74UOO0BzrEXGhF16b0DjyZ+hOXJYKaV +11RZt+cRLInUue4X +-----END CERTIFICATE----- + +GTS Root R4 +=========== +-----BEGIN CERTIFICATE----- +MIICCTCCAY6gAwIBAgINAgPlwGjvYxqccpBQUjAKBggqhkjOPQQDAzBHMQswCQYDVQQGEwJVUzEi +MCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQw +HhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZ +R29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQwdjAQBgcqhkjO +PQIBBgUrgQQAIgNiAATzdHOnaItgrkO4NcWBMHtLSZ37wWHO5t5GvWvVYRg1rkDdc/eJkTBa6zzu +hXyiQHY7qca4R9gq55KRanPpsXI5nymfopjTX15YhmUPoYRlBtHci8nHc8iMai/lxKvRHYqjQjBA +MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSATNbrdP9JNqPV2Py1 +PsVq8JQdjDAKBggqhkjOPQQDAwNpADBmAjEA6ED/g94D9J+uHXqnLrmvT/aDHQ4thQEd0dlq7A/C +r8deVl5c1RxYIigL9zC2L7F8AjEA8GE8p/SgguMh1YQdc4acLa/KNJvxn7kjNuK8YAOdgLOaVsjh +4rsUecrNIdSUtUlD +-----END CERTIFICATE----- + +Telia Root CA v2 +================ +-----BEGIN CERTIFICATE----- +MIIFdDCCA1ygAwIBAgIPAWdfJ9b+euPkrL4JWwWeMA0GCSqGSIb3DQEBCwUAMEQxCzAJBgNVBAYT +AkZJMRowGAYDVQQKDBFUZWxpYSBGaW5sYW5kIE95ajEZMBcGA1UEAwwQVGVsaWEgUm9vdCBDQSB2 +MjAeFw0xODExMjkxMTU1NTRaFw00MzExMjkxMTU1NTRaMEQxCzAJBgNVBAYTAkZJMRowGAYDVQQK +DBFUZWxpYSBGaW5sYW5kIE95ajEZMBcGA1UEAwwQVGVsaWEgUm9vdCBDQSB2MjCCAiIwDQYJKoZI +hvcNAQEBBQADggIPADCCAgoCggIBALLQPwe84nvQa5n44ndp586dpAO8gm2h/oFlH0wnrI4AuhZ7 +6zBqAMCzdGh+sq/H1WKzej9Qyow2RCRj0jbpDIX2Q3bVTKFgcmfiKDOlyzG4OiIjNLh9vVYiQJ3q +9HsDrWj8soFPmNB06o3lfc1jw6P23pLCWBnglrvFxKk9pXSW/q/5iaq9lRdU2HhE8Qx3FZLgmEKn +pNaqIJLNwaCzlrI6hEKNfdWV5Nbb6WLEWLN5xYzTNTODn3WhUidhOPFZPY5Q4L15POdslv5e2QJl +tI5c0BE0312/UqeBAMN/mUWZFdUXyApT7GPzmX3MaRKGwhfwAZ6/hLzRUssbkmbOpFPlob/E2wnW +5olWK8jjfN7j/4nlNW4o6GwLI1GpJQXrSPjdscr6bAhR77cYbETKJuFzxokGgeWKrLDiKca5JLNr +RBH0pUPCTEPlcDaMtjNXepUugqD0XBCzYYP2AgWGLnwtbNwDRm41k9V6lS/eINhbfpSQBGq6WT0E +BXWdN6IOLj3rwaRSg/7Qa9RmjtzG6RJOHSpXqhC8fF6CfaamyfItufUXJ63RDolUK5X6wK0dmBR4 +M0KGCqlztft0DbcbMBnEWg4cJ7faGND/isgFuvGqHKI3t+ZIpEYslOqodmJHixBTB0hXbOKSTbau +BcvcwUpej6w9GU7C7WB1K9vBykLVAgMBAAGjYzBhMB8GA1UdIwQYMBaAFHKs5DN5qkWH9v2sHZ7W +xy+G2CQ5MB0GA1UdDgQWBBRyrOQzeapFh/b9rB2e1scvhtgkOTAOBgNVHQ8BAf8EBAMCAQYwDwYD +VR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAoDtZpwmUPjaE0n4vOaWWl/oRrfxn83EJ +8rKJhGdEr7nv7ZbsnGTbMjBvZ5qsfl+yqwE2foH65IRe0qw24GtixX1LDoJt0nZi0f6X+J8wfBj5 +tFJ3gh1229MdqfDBmgC9bXXYfef6xzijnHDoRnkDry5023X4blMMA8iZGok1GTzTyVR8qPAs5m4H +eW9q4ebqkYJpCh3DflminmtGFZhb069GHWLIzoBSSRE/yQQSwxN8PzuKlts8oB4KtItUsiRnDe+C +y748fdHif64W1lZYudogsYMVoe+KTTJvQS8TUoKU1xrBeKJR3Stwbbca+few4GeXVtt8YVMJAygC +QMez2P2ccGrGKMOF6eLtGpOg3kuYooQ+BXcBlj37tCAPnHICehIv1aO6UXivKitEZU61/Qrowc15 +h2Er3oBXRb9n8ZuRXqWk7FlIEA04x7D6w0RtBPV4UBySllva9bguulvP5fBqnUsvWHMtTy3EHD70 +sz+rFQ47GUGKpMFXEmZxTPpT41frYpUJnlTd0cI8Vzy9OK2YZLe4A5pTVmBds9hCG1xLEooc6+t9 +xnppxyd/pPiL8uSUZodL6ZQHCRJ5irLrdATczvREWeAWysUsWNc8e89ihmpQfTU2Zqf7N+cox9jQ +raVplI/owd8k+BsHMYeB2F326CjYSlKArBPuUBQemMc= +-----END CERTIFICATE----- + +D-TRUST BR Root CA 1 2020 +========================= +-----BEGIN CERTIFICATE----- +MIIC2zCCAmCgAwIBAgIQfMmPK4TX3+oPyWWa00tNljAKBggqhkjOPQQDAzBIMQswCQYDVQQGEwJE +RTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlELVRSVVNUIEJSIFJvb3QgQ0EgMSAy +MDIwMB4XDTIwMDIxMTA5NDUwMFoXDTM1MDIxMTA5NDQ1OVowSDELMAkGA1UEBhMCREUxFTATBgNV +BAoTDEQtVHJ1c3QgR21iSDEiMCAGA1UEAxMZRC1UUlVTVCBCUiBSb290IENBIDEgMjAyMDB2MBAG +ByqGSM49AgEGBSuBBAAiA2IABMbLxyjR+4T1mu9CFCDhQ2tuda38KwOE1HaTJddZO0Flax7mNCq7 +dPYSzuht56vkPE4/RAiLzRZxy7+SmfSk1zxQVFKQhYN4lGdnoxwJGT11NIXe7WB9xwy0QVK5buXu +QqOCAQ0wggEJMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFHOREKv/VbNafAkl1bK6CKBrqx9t +MA4GA1UdDwEB/wQEAwIBBjCBxgYDVR0fBIG+MIG7MD6gPKA6hjhodHRwOi8vY3JsLmQtdHJ1c3Qu +bmV0L2NybC9kLXRydXN0X2JyX3Jvb3RfY2FfMV8yMDIwLmNybDB5oHegdYZzbGRhcDovL2RpcmVj +dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwQlIlMjBSb290JTIwQ0ElMjAxJTIwMjAyMCxP +PUQtVHJ1c3QlMjBHbWJILEM9REU/Y2VydGlmaWNhdGVyZXZvY2F0aW9ubGlzdDAKBggqhkjOPQQD +AwNpADBmAjEAlJAtE/rhY/hhY+ithXhUkZy4kzg+GkHaQBZTQgjKL47xPoFWwKrY7RjEsK70Pvom +AjEA8yjixtsrmfu3Ubgko6SUeho/5jbiA1czijDLgsfWFBHVdWNbFJWcHwHP2NVypw87 +-----END CERTIFICATE----- + +D-TRUST EV Root CA 1 2020 +========================= +-----BEGIN CERTIFICATE----- +MIIC2zCCAmCgAwIBAgIQXwJB13qHfEwDo6yWjfv/0DAKBggqhkjOPQQDAzBIMQswCQYDVQQGEwJE +RTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlELVRSVVNUIEVWIFJvb3QgQ0EgMSAy +MDIwMB4XDTIwMDIxMTEwMDAwMFoXDTM1MDIxMTA5NTk1OVowSDELMAkGA1UEBhMCREUxFTATBgNV +BAoTDEQtVHJ1c3QgR21iSDEiMCAGA1UEAxMZRC1UUlVTVCBFViBSb290IENBIDEgMjAyMDB2MBAG +ByqGSM49AgEGBSuBBAAiA2IABPEL3YZDIBnfl4XoIkqbz52Yv7QFJsnL46bSj8WeeHsxiamJrSc8 +ZRCC/N/DnU7wMyPE0jL1HLDfMxddxfCxivnvubcUyilKwg+pf3VlSSowZ/Rk99Yad9rDwpdhQntJ +raOCAQ0wggEJMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFH8QARY3OqQo5FD4pPfsazK2/umL +MA4GA1UdDwEB/wQEAwIBBjCBxgYDVR0fBIG+MIG7MD6gPKA6hjhodHRwOi8vY3JsLmQtdHJ1c3Qu +bmV0L2NybC9kLXRydXN0X2V2X3Jvb3RfY2FfMV8yMDIwLmNybDB5oHegdYZzbGRhcDovL2RpcmVj +dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwRVYlMjBSb290JTIwQ0ElMjAxJTIwMjAyMCxP +PUQtVHJ1c3QlMjBHbWJILEM9REU/Y2VydGlmaWNhdGVyZXZvY2F0aW9ubGlzdDAKBggqhkjOPQQD +AwNpADBmAjEAyjzGKnXCXnViOTYAYFqLwZOZzNnbQTs7h5kXO9XMT8oi96CAy/m0sRtW9XLS/BnR +AjEAkfcwkz8QRitxpNA7RJvAKQIFskF3UfN5Wp6OFKBOQtJbgfM0agPnIjhQW+0ZT0MW +-----END CERTIFICATE----- + +DigiCert TLS ECC P384 Root G5 +============================= +-----BEGIN CERTIFICATE----- +MIICGTCCAZ+gAwIBAgIQCeCTZaz32ci5PhwLBCou8zAKBggqhkjOPQQDAzBOMQswCQYDVQQGEwJV +UzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xJjAkBgNVBAMTHURpZ2lDZXJ0IFRMUyBFQ0MgUDM4 +NCBSb290IEc1MB4XDTIxMDExNTAwMDAwMFoXDTQ2MDExNDIzNTk1OVowTjELMAkGA1UEBhMCVVMx +FzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMSYwJAYDVQQDEx1EaWdpQ2VydCBUTFMgRUNDIFAzODQg +Um9vdCBHNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABMFEoc8Rl1Ca3iOCNQfN0MsYndLxf3c1Tzvd +lHJS7cI7+Oz6e2tYIOyZrsn8aLN1udsJ7MgT9U7GCh1mMEy7H0cKPGEQQil8pQgO4CLp0zVozptj +n4S1mU1YoI71VOeVyaNCMEAwHQYDVR0OBBYEFMFRRVBZqz7nLFr6ICISB4CIfBFqMA4GA1UdDwEB +/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MAoGCCqGSM49BAMDA2gAMGUCMQCJao1H5+z8blUD2Wds +Jk6Dxv3J+ysTvLd6jLRl0mlpYxNjOyZQLgGheQaRnUi/wr4CMEfDFXuxoJGZSZOoPHzoRgaLLPIx +AJSdYsiJvRmEFOml+wG4DXZDjC5Ty3zfDBeWUA== +-----END CERTIFICATE----- + +DigiCert TLS RSA4096 Root G5 +============================ +-----BEGIN CERTIFICATE----- +MIIFZjCCA06gAwIBAgIQCPm0eKj6ftpqMzeJ3nzPijANBgkqhkiG9w0BAQwFADBNMQswCQYDVQQG +EwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xJTAjBgNVBAMTHERpZ2lDZXJ0IFRMUyBSU0E0 +MDk2IFJvb3QgRzUwHhcNMjEwMTE1MDAwMDAwWhcNNDYwMTE0MjM1OTU5WjBNMQswCQYDVQQGEwJV +UzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xJTAjBgNVBAMTHERpZ2lDZXJ0IFRMUyBSU0E0MDk2 +IFJvb3QgRzUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCz0PTJeRGd/fxmgefM1eS8 +7IE+ajWOLrfn3q/5B03PMJ3qCQuZvWxX2hhKuHisOjmopkisLnLlvevxGs3npAOpPxG02C+JFvuU +AT27L/gTBaF4HI4o4EXgg/RZG5Wzrn4DReW+wkL+7vI8toUTmDKdFqgpwgscONyfMXdcvyej/Ces +tyu9dJsXLfKB2l2w4SMXPohKEiPQ6s+d3gMXsUJKoBZMpG2T6T867jp8nVid9E6P/DsjyG244gXa +zOvswzH016cpVIDPRFtMbzCe88zdH5RDnU1/cHAN1DrRN/BsnZvAFJNY781BOHW8EwOVfH/jXOnV +DdXifBBiqmvwPXbzP6PosMH976pXTayGpxi0KcEsDr9kvimM2AItzVwv8n/vFfQMFawKsPHTDU9q +TXeXAaDxZre3zu/O7Oyldcqs4+Fj97ihBMi8ez9dLRYiVu1ISf6nL3kwJZu6ay0/nTvEF+cdLvvy +z6b84xQslpghjLSR6Rlgg/IwKwZzUNWYOwbpx4oMYIwo+FKbbuH2TbsGJJvXKyY//SovcfXWJL5/ +MZ4PbeiPT02jP/816t9JXkGPhvnxd3lLG7SjXi/7RgLQZhNeXoVPzthwiHvOAbWWl9fNff2C+MIk +wcoBOU+NosEUQB+cZtUMCUbW8tDRSHZWOkPLtgoRObqME2wGtZ7P6wIDAQABo0IwQDAdBgNVHQ4E +FgQUUTMc7TZArxfTJc1paPKvTiM+s0EwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8w +DQYJKoZIhvcNAQEMBQADggIBAGCmr1tfV9qJ20tQqcQjNSH/0GEwhJG3PxDPJY7Jv0Y02cEhJhxw +GXIeo8mH/qlDZJY6yFMECrZBu8RHANmfGBg7sg7zNOok992vIGCukihfNudd5N7HPNtQOa27PShN +lnx2xlv0wdsUpasZYgcYQF+Xkdycx6u1UQ3maVNVzDl92sURVXLFO4uJ+DQtpBflF+aZfTCIITfN +MBc9uPK8qHWgQ9w+iUuQrm0D4ByjoJYJu32jtyoQREtGBzRj7TG5BO6jm5qu5jF49OokYTurWGT/ +u4cnYiWB39yhL/btp/96j1EuMPikAdKFOV8BmZZvWltwGUb+hmA+rYAQCd05JS9Yf7vSdPD3Rh9G +OUrYU9DzLjtxpdRv/PNn5AeP3SYZ4Y1b+qOTEZvpyDrDVWiakuFSdjjo4bq9+0/V77PnSIMx8IIh +47a+p6tv75/fTM8BuGJqIz3nCU2AG3swpMPdB380vqQmsvZB6Akd4yCYqjdP//fx4ilwMUc/dNAU +FvohigLVigmUdy7yWSiLfFCSCmZ4OIN1xLVaqBHG5cGdZlXPU8Sv13WFqUITVuwhd4GTWgzqltlJ +yqEI8pc7bZsEGCREjnwB8twl2F6GmrE52/WRMmrRpnCKovfepEWFJqgejF0pW8hL2JpqA15w8oVP +bEtoL8pU9ozaMv7Da4M/OMZ+ +-----END CERTIFICATE----- + +Certainly Root R1 +================= +-----BEGIN CERTIFICATE----- +MIIFRzCCAy+gAwIBAgIRAI4P+UuQcWhlM1T01EQ5t+AwDQYJKoZIhvcNAQELBQAwPTELMAkGA1UE +BhMCVVMxEjAQBgNVBAoTCUNlcnRhaW5seTEaMBgGA1UEAxMRQ2VydGFpbmx5IFJvb3QgUjEwHhcN +MjEwNDAxMDAwMDAwWhcNNDYwNDAxMDAwMDAwWjA9MQswCQYDVQQGEwJVUzESMBAGA1UEChMJQ2Vy +dGFpbmx5MRowGAYDVQQDExFDZXJ0YWlubHkgUm9vdCBSMTCCAiIwDQYJKoZIhvcNAQEBBQADggIP +ADCCAgoCggIBANA21B/q3avk0bbm+yLA3RMNansiExyXPGhjZjKcA7WNpIGD2ngwEc/csiu+kr+O +5MQTvqRoTNoCaBZ0vrLdBORrKt03H2As2/X3oXyVtwxwhi7xOu9S98zTm/mLvg7fMbedaFySpvXl +8wo0tf97ouSHocavFwDvA5HtqRxOcT3Si2yJ9HiG5mpJoM610rCrm/b01C7jcvk2xusVtyWMOvwl +DbMicyF0yEqWYZL1LwsYpfSt4u5BvQF5+paMjRcCMLT5r3gajLQ2EBAHBXDQ9DGQilHFhiZ5shGI +XsXwClTNSaa/ApzSRKft43jvRl5tcdF5cBxGX1HpyTfcX35pe0HfNEXgO4T0oYoKNp43zGJS4YkN +KPl6I7ENPT2a/Z2B7yyQwHtETrtJ4A5KVpK8y7XdeReJkd5hiXSSqOMyhb5OhaRLWcsrxXiOcVTQ +AjeZjOVJ6uBUcqQRBi8LjMFbvrWhsFNunLhgkR9Za/kt9JQKl7XsxXYDVBtlUrpMklZRNaBA2Cnb +rlJ2Oy0wQJuK0EJWtLeIAaSHO1OWzaMWj/Nmqhexx2DgwUMFDO6bW2BvBlyHWyf5QBGenDPBt+U1 +VwV/J84XIIwc/PH72jEpSe31C4SnT8H2TsIonPru4K8H+zMReiFPCyEQtkA6qyI6BJyLm4SGcprS +p6XEtHWRqSsjAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud +DgQWBBTgqj8ljZ9EXME66C6ud0yEPmcM9DANBgkqhkiG9w0BAQsFAAOCAgEAuVevuBLaV4OPaAsz +HQNTVfSVcOQrPbA56/qJYv331hgELyE03fFo8NWWWt7CgKPBjcZq91l3rhVkz1t5BXdm6ozTaw3d +8VkswTOlMIAVRQdFGjEitpIAq5lNOo93r6kiyi9jyhXWx8bwPWz8HA2YEGGeEaIi1wrykXprOQ4v +MMM2SZ/g6Q8CRFA3lFV96p/2O7qUpUzpvD5RtOjKkjZUbVwlKNrdrRT90+7iIgXr0PK3aBLXWopB +GsaSpVo7Y0VPv+E6dyIvXL9G+VoDhRNCX8reU9ditaY1BMJH/5n9hN9czulegChB8n3nHpDYT3Y+ +gjwN/KUD+nsa2UUeYNrEjvn8K8l7lcUq/6qJ34IxD3L/DCfXCh5WAFAeDJDBlrXYFIW7pw0WwfgH +JBu6haEaBQmAupVjyTrsJZ9/nbqkRxWbRHDxakvWOF5D8xh+UG7pWijmZeZ3Gzr9Hb4DJqPb1OG7 +fpYnKx3upPvaJVQTA945xsMfTZDsjxtK0hzthZU4UHlG1sGQUDGpXJpuHfUzVounmdLyyCwzk5Iw +x06MZTMQZBf9JBeW0Y3COmor6xOLRPIh80oat3df1+2IpHLlOR+Vnb5nwXARPbv0+Em34yaXOp/S +X3z7wJl8OSngex2/DaeP0ik0biQVy96QXr8axGbqwua6OV+KmalBWQewLK8= +-----END CERTIFICATE----- + +Certainly Root E1 +================= +-----BEGIN CERTIFICATE----- +MIIB9zCCAX2gAwIBAgIQBiUzsUcDMydc+Y2aub/M+DAKBggqhkjOPQQDAzA9MQswCQYDVQQGEwJV +UzESMBAGA1UEChMJQ2VydGFpbmx5MRowGAYDVQQDExFDZXJ0YWlubHkgUm9vdCBFMTAeFw0yMTA0 +MDEwMDAwMDBaFw00NjA0MDEwMDAwMDBaMD0xCzAJBgNVBAYTAlVTMRIwEAYDVQQKEwlDZXJ0YWlu +bHkxGjAYBgNVBAMTEUNlcnRhaW5seSBSb290IEUxMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE3m/4 +fxzf7flHh4axpMCK+IKXgOqPyEpeKn2IaKcBYhSRJHpcnqMXfYqGITQYUBsQ3tA3SybHGWCA6TS9 +YBk2QNYphwk8kXr2vBMj3VlOBF7PyAIcGFPBMdjaIOlEjeR2o0IwQDAOBgNVHQ8BAf8EBAMCAQYw +DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU8ygYy2R17ikq6+2uI1g4hevIIgcwCgYIKoZIzj0E +AwMDaAAwZQIxALGOWiDDshliTd6wT99u0nCK8Z9+aozmut6Dacpps6kFtZaSF4fC0urQe87YQVt8 +rgIwRt7qy12a7DLCZRawTDBcMPPaTnOGBtjOiQRINzf43TNRnXCve1XYAS59BWQOhriR +-----END CERTIFICATE----- + +Security Communication RootCA3 +============================== +-----BEGIN CERTIFICATE----- +MIIFfzCCA2egAwIBAgIJAOF8N0D9G/5nMA0GCSqGSIb3DQEBDAUAMF0xCzAJBgNVBAYTAkpQMSUw +IwYDVQQKExxTRUNPTSBUcnVzdCBTeXN0ZW1zIENPLixMVEQuMScwJQYDVQQDEx5TZWN1cml0eSBD +b21tdW5pY2F0aW9uIFJvb3RDQTMwHhcNMTYwNjE2MDYxNzE2WhcNMzgwMTE4MDYxNzE2WjBdMQsw +CQYDVQQGEwJKUDElMCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UE +AxMeU2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0EzMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A +MIICCgKCAgEA48lySfcw3gl8qUCBWNO0Ot26YQ+TUG5pPDXC7ltzkBtnTCHsXzW7OT4rCmDvu20r +hvtxosis5FaU+cmvsXLUIKx00rgVrVH+hXShuRD+BYD5UpOzQD11EKzAlrenfna84xtSGc4RHwsE +NPXY9Wk8d/Nk9A2qhd7gCVAEF5aEt8iKvE1y/By7z/MGTfmfZPd+pmaGNXHIEYBMwXFAWB6+oHP2 +/D5Q4eAvJj1+XCO1eXDe+uDRpdYMQXF79+qMHIjH7Iv10S9VlkZ8WjtYO/u62C21Jdp6Ts9EriGm +npjKIG58u4iFW/vAEGK78vknR+/RiTlDxN/e4UG/VHMgly1s2vPUB6PmudhvrvyMGS7TZ2crldtY +XLVqAvO4g160a75BflcJdURQVc1aEWEhCmHCqYj9E7wtiS/NYeCVvsq1e+F7NGcLH7YMx3weGVPK +p7FKFSBWFHA9K4IsD50VHUeAR/94mQ4xr28+j+2GaR57GIgUssL8gjMunEst+3A7caoreyYn8xrC +3PsXuKHqy6C0rtOUfnrQq8PsOC0RLoi/1D+tEjtCrI8Cbn3M0V9hvqG8OmpI6iZVIhZdXw3/JzOf +GAN0iltSIEdrRU0id4xVJ/CvHozJgyJUt5rQT9nO/NkuHJYosQLTA70lUhw0Zk8jq/R3gpYd0Vcw +CBEF/VfR2ccCAwEAAaNCMEAwHQYDVR0OBBYEFGQUfPxYchamCik0FW8qy7z8r6irMA4GA1UdDwEB +/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBDAUAA4ICAQDcAiMI4u8hOscNtybS +YpOnpSNyByCCYN8Y11StaSWSntkUz5m5UoHPrmyKO1o5yGwBQ8IibQLwYs1OY0PAFNr0Y/Dq9HHu +Tofjcan0yVflLl8cebsjqodEV+m9NU1Bu0soo5iyG9kLFwfl9+qd9XbXv8S2gVj/yP9kaWJ5rW4O +H3/uHWnlt3Jxs/6lATWUVCvAUm2PVcTJ0rjLyjQIUYWg9by0F1jqClx6vWPGOi//lkkZhOpn2ASx +YfQAW0q3nHE3GYV5v4GwxxMOdnE+OoAGrgYWp421wsTL/0ClXI2lyTrtcoHKXJg80jQDdwj98ClZ +XSEIx2C/pHF7uNkegr4Jr2VvKKu/S7XuPghHJ6APbw+LP6yVGPO5DtxnVW5inkYO0QR4ynKudtml ++LLfiAlhi+8kTtFZP1rUPcmTPCtk9YENFpb3ksP+MW/oKjJ0DvRMmEoYDjBU1cXrvMUVnuiZIesn +KwkK2/HmcBhWuwzkvvnoEKQTkrgc4NtnHVMDpCKn3F2SEDzq//wbEBrD2NCcnWXL0CsnMQMeNuE9 +dnUM/0Umud1RvCPHX9jYhxBAEg09ODfnRDwYwFMJZI//1ZqmfHAuc1Uh6N//g7kdPjIe1qZ9LPFm +6Vwdp6POXiUyK+OVrCoHzrQoeIY8LaadTdJ0MN1kURXbg4NR16/9M51NZg== +-----END CERTIFICATE----- + +Security Communication ECC RootCA1 +================================== +-----BEGIN CERTIFICATE----- +MIICODCCAb6gAwIBAgIJANZdm7N4gS7rMAoGCCqGSM49BAMDMGExCzAJBgNVBAYTAkpQMSUwIwYD +VQQKExxTRUNPTSBUcnVzdCBTeXN0ZW1zIENPLixMVEQuMSswKQYDVQQDEyJTZWN1cml0eSBDb21t +dW5pY2F0aW9uIEVDQyBSb290Q0ExMB4XDTE2MDYxNjA1MTUyOFoXDTM4MDExODA1MTUyOFowYTEL +MAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKzApBgNV +BAMTIlNlY3VyaXR5IENvbW11bmljYXRpb24gRUNDIFJvb3RDQTEwdjAQBgcqhkjOPQIBBgUrgQQA +IgNiAASkpW9gAwPDvTH00xecK4R1rOX9PVdu12O/5gSJko6BnOPpR27KkBLIE+CnnfdldB9sELLo +5OnvbYUymUSxXv3MdhDYW72ixvnWQuRXdtyQwjWpS4g8EkdtXP9JTxpKULGjQjBAMB0GA1UdDgQW +BBSGHOf+LaVKiwj+KBH6vqNm+GBZLzAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAK +BggqhkjOPQQDAwNoADBlAjAVXUI9/Lbu9zuxNuie9sRGKEkz0FhDKmMpzE2xtHqiuQ04pV1IKv3L +snNdo4gIxwwCMQDAqy0Obe0YottT6SXbVQjgUMzfRGEWgqtJsLKB7HOHeLRMsmIbEvoWTSVLY70e +N9k= +-----END CERTIFICATE----- + +BJCA Global Root CA1 +==================== +-----BEGIN CERTIFICATE----- +MIIFdDCCA1ygAwIBAgIQVW9l47TZkGobCdFsPsBsIDANBgkqhkiG9w0BAQsFADBUMQswCQYDVQQG +EwJDTjEmMCQGA1UECgwdQkVJSklORyBDRVJUSUZJQ0FURSBBVVRIT1JJVFkxHTAbBgNVBAMMFEJK +Q0EgR2xvYmFsIFJvb3QgQ0ExMB4XDTE5MTIxOTAzMTYxN1oXDTQ0MTIxMjAzMTYxN1owVDELMAkG +A1UEBhMCQ04xJjAkBgNVBAoMHUJFSUpJTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZMR0wGwYDVQQD +DBRCSkNBIEdsb2JhbCBSb290IENBMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAPFm +CL3ZxRVhy4QEQaVpN3cdwbB7+sN3SJATcmTRuHyQNZ0YeYjjlwE8R4HyDqKYDZ4/N+AZspDyRhyS +sTphzvq3Rp4Dhtczbu33RYx2N95ulpH3134rhxfVizXuhJFyV9xgw8O558dnJCNPYwpj9mZ9S1Wn +P3hkSWkSl+BMDdMJoDIwOvqfwPKcxRIqLhy1BDPapDgRat7GGPZHOiJBhyL8xIkoVNiMpTAK+BcW +yqw3/XmnkRd4OJmtWO2y3syJfQOcs4ll5+M7sSKGjwZteAf9kRJ/sGsciQ35uMt0WwfCyPQ10WRj +eulumijWML3mG90Vr4TqnMfK9Q7q8l0ph49pczm+LiRvRSGsxdRpJQaDrXpIhRMsDQa4bHlW/KNn +MoH1V6XKV0Jp6VwkYe/iMBhORJhVb3rCk9gZtt58R4oRTklH2yiUAguUSiz5EtBP6DF+bHq/pj+b +OT0CFqMYs2esWz8sgytnOYFcuX6U1WTdno9uruh8W7TXakdI136z1C2OVnZOz2nxbkRs1CTqjSSh +GL+9V/6pmTW12xB3uD1IutbB5/EjPtffhZ0nPNRAvQoMvfXnjSXWgXSHRtQpdaJCbPdzied9v3pK +H9MiyRVVz99vfFXQpIsHETdfg6YmV6YBW37+WGgHqel62bno/1Afq8K0wM7o6v0PvY1NuLxxAgMB +AAGjQjBAMB0GA1UdDgQWBBTF7+3M2I0hxkjk49cULqcWk+WYATAPBgNVHRMBAf8EBTADAQH/MA4G +A1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAUoKsITQfI/Ki2Pm4rzc2IInRNwPWaZ+4 +YRC6ojGYWUfo0Q0lHhVBDOAqVdVXUsv45Mdpox1NcQJeXyFFYEhcCY5JEMEE3KliawLwQ8hOnThJ +dMkycFRtwUf8jrQ2ntScvd0g1lPJGKm1Vrl2i5VnZu69mP6u775u+2D2/VnGKhs/I0qUJDAnyIm8 +60Qkmss9vk/Ves6OF8tiwdneHg56/0OGNFK8YT88X7vZdrRTvJez/opMEi4r89fO4aL/3Xtw+zuh +TaRjAv04l5U/BXCga99igUOLtFkNSoxUnMW7gZ/NfaXvCyUeOiDbHPwfmGcCCtRzRBPbUYQaVQNW +4AB+dAb/OMRyHdOoP2gxXdMJxy6MW2Pg6Nwe0uxhHvLe5e/2mXZgLR6UcnHGCyoyx5JO1UbXHfmp +GQrI+pXObSOYqgs4rZpWDW+N8TEAiMEXnM0ZNjX+VVOg4DwzX5Ze4jLp3zO7Bkqp2IRzznfSxqxx +4VyjHQy7Ct9f4qNx2No3WqB4K/TUfet27fJhcKVlmtOJNBir+3I+17Q9eVzYH6Eze9mCUAyTF6ps +3MKCuwJXNq+YJyo5UOGwifUll35HaBC07HPKs5fRJNz2YqAo07WjuGS3iGJCz51TzZm+ZGiPTx4S +SPfSKcOYKMryMguTjClPPGAyzQWWYezyr/6zcCwupvI= +-----END CERTIFICATE----- + +BJCA Global Root CA2 +==================== +-----BEGIN CERTIFICATE----- +MIICJTCCAaugAwIBAgIQLBcIfWQqwP6FGFkGz7RK6zAKBggqhkjOPQQDAzBUMQswCQYDVQQGEwJD +TjEmMCQGA1UECgwdQkVJSklORyBDRVJUSUZJQ0FURSBBVVRIT1JJVFkxHTAbBgNVBAMMFEJKQ0Eg +R2xvYmFsIFJvb3QgQ0EyMB4XDTE5MTIxOTAzMTgyMVoXDTQ0MTIxMjAzMTgyMVowVDELMAkGA1UE +BhMCQ04xJjAkBgNVBAoMHUJFSUpJTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZMR0wGwYDVQQDDBRC +SkNBIEdsb2JhbCBSb290IENBMjB2MBAGByqGSM49AgEGBSuBBAAiA2IABJ3LgJGNU2e1uVCxA/jl +SR9BIgmwUVJY1is0j8USRhTFiy8shP8sbqjV8QnjAyEUxEM9fMEsxEtqSs3ph+B99iK++kpRuDCK +/eHeGBIK9ke35xe/J4rUQUyWPGCWwf0VHKNCMEAwHQYDVR0OBBYEFNJKsVF/BvDRgh9Obl+rg/xI +1LCRMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMAoGCCqGSM49BAMDA2gAMGUCMBq8 +W9f+qdJUDkpd0m2xQNz0Q9XSSpkZElaA94M04TVOSG0ED1cxMDAtsaqdAzjbBgIxAMvMh1PLet8g +UXOQwKhbYdDFUDn9hf7B43j4ptZLvZuHjw/l1lOWqzzIQNph91Oj9w== +-----END CERTIFICATE----- + +Sectigo Public Server Authentication Root E46 +============================================= +-----BEGIN CERTIFICATE----- +MIICOjCCAcGgAwIBAgIQQvLM2htpN0RfFf51KBC49DAKBggqhkjOPQQDAzBfMQswCQYDVQQGEwJH +QjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1TZWN0aWdvIFB1YmxpYyBTZXJ2 +ZXIgQXV0aGVudGljYXRpb24gUm9vdCBFNDYwHhcNMjEwMzIyMDAwMDAwWhcNNDYwMzIxMjM1OTU5 +WjBfMQswCQYDVQQGEwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1TZWN0 +aWdvIFB1YmxpYyBTZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBFNDYwdjAQBgcqhkjOPQIBBgUr +gQQAIgNiAAR2+pmpbiDt+dd34wc7qNs9Xzjoq1WmVk/WSOrsfy2qw7LFeeyZYX8QeccCWvkEN/U0 +NSt3zn8gj1KjAIns1aeibVvjS5KToID1AZTc8GgHHs3u/iVStSBDHBv+6xnOQ6OjQjBAMB0GA1Ud +DgQWBBTRItpMWfFLXyY4qp3W7usNw/upYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB +/zAKBggqhkjOPQQDAwNnADBkAjAn7qRaqCG76UeXlImldCBteU/IvZNeWBj7LRoAasm4PdCkT0RH +lAFWovgzJQxC36oCMB3q4S6ILuH5px0CMk7yn2xVdOOurvulGu7t0vzCAxHrRVxgED1cf5kDW21U +SAGKcw== +-----END CERTIFICATE----- + +Sectigo Public Server Authentication Root R46 +============================================= +-----BEGIN CERTIFICATE----- +MIIFijCCA3KgAwIBAgIQdY39i658BwD6qSWn4cetFDANBgkqhkiG9w0BAQwFADBfMQswCQYDVQQG +EwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1TZWN0aWdvIFB1YmxpYyBT +ZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBSNDYwHhcNMjEwMzIyMDAwMDAwWhcNNDYwMzIxMjM1 +OTU5WjBfMQswCQYDVQQGEwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1T +ZWN0aWdvIFB1YmxpYyBTZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBSNDYwggIiMA0GCSqGSIb3 +DQEBAQUAA4ICDwAwggIKAoICAQCTvtU2UnXYASOgHEdCSe5jtrch/cSV1UgrJnwUUxDaef0rty2k +1Cz66jLdScK5vQ9IPXtamFSvnl0xdE8H/FAh3aTPaE8bEmNtJZlMKpnzSDBh+oF8HqcIStw+Kxwf +GExxqjWMrfhu6DtK2eWUAtaJhBOqbchPM8xQljeSM9xfiOefVNlI8JhD1mb9nxc4Q8UBUQvX4yMP +FF1bFOdLvt30yNoDN9HWOaEhUTCDsG3XME6WW5HwcCSrv0WBZEMNvSE6Lzzpng3LILVCJ8zab5vu +ZDCQOc2TZYEhMbUjUDM3IuM47fgxMMxF/mL50V0yeUKH32rMVhlATc6qu/m1dkmU8Sf4kaWD5Qaz +Yw6A3OASVYCmO2a0OYctyPDQ0RTp5A1NDvZdV3LFOxxHVp3i1fuBYYzMTYCQNFu31xR13NgESJ/A +wSiItOkcyqex8Va3e0lMWeUgFaiEAin6OJRpmkkGj80feRQXEgyDet4fsZfu+Zd4KKTIRJLpfSYF +plhym3kT2BFfrsU4YjRosoYwjviQYZ4ybPUHNs2iTG7sijbt8uaZFURww3y8nDnAtOFr94MlI1fZ +EoDlSfB1D++N6xybVCi0ITz8fAr/73trdf+LHaAZBav6+CuBQug4urv7qv094PPK306Xlynt8xhW +6aWWrL3DkJiy4Pmi1KZHQ3xtzwIDAQABo0IwQDAdBgNVHQ4EFgQUVnNYZJX5khqwEioEYnmhQBWI +IUkwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAC9c +mTz8Bl6MlC5w6tIyMY208FHVvArzZJ8HXtXBc2hkeqK5Duj5XYUtqDdFqij0lgVQYKlJfp/imTYp +E0RHap1VIDzYm/EDMrraQKFz6oOht0SmDpkBm+S8f74TlH7Kph52gDY9hAaLMyZlbcp+nv4fjFg4 +exqDsQ+8FxG75gbMY/qB8oFM2gsQa6H61SilzwZAFv97fRheORKkU55+MkIQpiGRqRxOF3yEvJ+M +0ejf5lG5Nkc/kLnHvALcWxxPDkjBJYOcCj+esQMzEhonrPcibCTRAUH4WAP+JWgiH5paPHxsnnVI +84HxZmduTILA7rpXDhjvLpr3Etiga+kFpaHpaPi8TD8SHkXoUsCjvxInebnMMTzD9joiFgOgyY9m +pFuiTdaBJQbpdqQACj7LzTWb4OE4y2BThihCQRxEV+ioratF4yUQvNs+ZUH7G6aXD+u5dHn5Hrwd +Vw1Hr8Mvn4dGp+smWg9WY7ViYG4A++MnESLn/pmPNPW56MORcr3Ywx65LvKRRFHQV80MNNVIIb/b +E/FmJUNS0nAiNs2fxBx1IK1jcmMGDw4nztJqDby1ORrp0XZ60Vzk50lJLVU3aPAaOpg+VBeHVOmm +J1CJeyAvP/+/oYtKR5j/K3tJPsMpRmAYQqszKbrAKbkTidOIijlBO8n9pu0f9GBj39ItVQGL +-----END CERTIFICATE----- + +SSL.com TLS RSA Root CA 2022 +============================ +-----BEGIN CERTIFICATE----- +MIIFiTCCA3GgAwIBAgIQb77arXO9CEDii02+1PdbkTANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQG +EwJVUzEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMSUwIwYDVQQDDBxTU0wuY29tIFRMUyBSU0Eg +Um9vdCBDQSAyMDIyMB4XDTIyMDgyNTE2MzQyMloXDTQ2MDgxOTE2MzQyMVowTjELMAkGA1UEBhMC +VVMxGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjElMCMGA1UEAwwcU1NMLmNvbSBUTFMgUlNBIFJv +b3QgQ0EgMjAyMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANCkCXJPQIgSYT41I57u +9nTPL3tYPc48DRAokC+X94xI2KDYJbFMsBFMF3NQ0CJKY7uB0ylu1bUJPiYYf7ISf5OYt6/wNr/y +7hienDtSxUcZXXTzZGbVXcdotL8bHAajvI9AI7YexoS9UcQbOcGV0insS657Lb85/bRi3pZ7Qcac +oOAGcvvwB5cJOYF0r/c0WRFXCsJbwST0MXMwgsadugL3PnxEX4MN8/HdIGkWCVDi1FW24IBydm5M +R7d1VVm0U3TZlMZBrViKMWYPHqIbKUBOL9975hYsLfy/7PO0+r4Y9ptJ1O4Fbtk085zx7AGL0SDG +D6C1vBdOSHtRwvzpXGk3R2azaPgVKPC506QVzFpPulJwoxJF3ca6TvvC0PeoUidtbnm1jPx7jMEW +TO6Af77wdr5BUxIzrlo4QqvXDz5BjXYHMtWrifZOZ9mxQnUjbvPNQrL8VfVThxc7wDNY8VLS+YCk +8OjwO4s4zKTGkH8PnP2L0aPP2oOnaclQNtVcBdIKQXTbYxE3waWglksejBYSd66UNHsef8JmAOSq +g+qKkK3ONkRN0VHpvB/zagX9wHQfJRlAUW7qglFA35u5CCoGAtUjHBPW6dvbxrB6y3snm/vg1UYk +7RBLY0ulBY+6uB0rpvqR4pJSvezrZ5dtmi2fgTIFZzL7SAg/2SW4BCUvAgMBAAGjYzBhMA8GA1Ud +EwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAU+y437uOEeicuzRk1sTN8/9REQrkwHQYDVR0OBBYEFPsu +N+7jhHonLs0ZNbEzfP/UREK5MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAjYlt +hEUY8U+zoO9opMAdrDC8Z2awms22qyIZZtM7QbUQnRC6cm4pJCAcAZli05bg4vsMQtfhWsSWTVTN +j8pDU/0quOr4ZcoBwq1gaAafORpR2eCNJvkLTqVTJXojpBzOCBvfR4iyrT7gJ4eLSYwfqUdYe5by +iB0YrrPRpgqU+tvT5TgKa3kSM/tKWTcWQA673vWJDPFs0/dRa1419dvAJuoSc06pkZCmF8NsLzjU +o3KUQyxi4U5cMj29TH0ZR6LDSeeWP4+a0zvkEdiLA9z2tmBVGKaBUfPhqBVq6+AL8BQx1rmMRTqo +ENjwuSfr98t67wVylrXEj5ZzxOhWc5y8aVFjvO9nHEMaX3cZHxj4HCUp+UmZKbaSPaKDN7Egkaib +MOlqbLQjk2UEqxHzDh1TJElTHaE/nUiSEeJ9DU/1172iWD54nR4fK/4huxoTtrEoZP2wAgDHbICi +vRZQIA9ygV/MlP+7mea6kMvq+cYMwq7FGc4zoWtcu358NFcXrfA/rs3qr5nsLFR+jM4uElZI7xc7 +P0peYNLcdDa8pUNjyw9bowJWCZ4kLOGGgYz+qxcs+sjiMho6/4UIyYOf8kpIEFR3N+2ivEC+5BB0 +9+Rbu7nzifmPQdjH5FCQNYA+HLhNkNPU98OwoX6EyneSMSy4kLGCenROmxMmtNVQZlR4rmA= +-----END CERTIFICATE----- + +SSL.com TLS ECC Root CA 2022 +============================ +-----BEGIN CERTIFICATE----- +MIICOjCCAcCgAwIBAgIQFAP1q/s3ixdAW+JDsqXRxDAKBggqhkjOPQQDAzBOMQswCQYDVQQGEwJV +UzEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMSUwIwYDVQQDDBxTU0wuY29tIFRMUyBFQ0MgUm9v +dCBDQSAyMDIyMB4XDTIyMDgyNTE2MzM0OFoXDTQ2MDgxOTE2MzM0N1owTjELMAkGA1UEBhMCVVMx +GDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjElMCMGA1UEAwwcU1NMLmNvbSBUTFMgRUNDIFJvb3Qg +Q0EgMjAyMjB2MBAGByqGSM49AgEGBSuBBAAiA2IABEUpNXP6wrgjzhR9qLFNoFs27iosU8NgCTWy +JGYmacCzldZdkkAZDsalE3D07xJRKF3nzL35PIXBz5SQySvOkkJYWWf9lCcQZIxPBLFNSeR7T5v1 +5wj4A4j3p8OSSxlUgaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBSJjy+j6CugFFR7 +81a4Jl9nOAuc0DAdBgNVHQ4EFgQUiY8vo+groBRUe/NWuCZfZzgLnNAwDgYDVR0PAQH/BAQDAgGG +MAoGCCqGSM49BAMDA2gAMGUCMFXjIlbp15IkWE8elDIPDAI2wv2sdDJO4fscgIijzPvX6yv/N33w +7deedWo1dlJF4AIxAMeNb0Igj762TVntd00pxCAgRWSGOlDGxK0tk/UYfXLtqc/ErFc2KAhl3zx5 +Zn6g6g== +-----END CERTIFICATE----- + +Atos TrustedRoot Root CA ECC TLS 2021 +===================================== +-----BEGIN CERTIFICATE----- +MIICFTCCAZugAwIBAgIQPZg7pmY9kGP3fiZXOATvADAKBggqhkjOPQQDAzBMMS4wLAYDVQQDDCVB +dG9zIFRydXN0ZWRSb290IFJvb3QgQ0EgRUNDIFRMUyAyMDIxMQ0wCwYDVQQKDARBdG9zMQswCQYD +VQQGEwJERTAeFw0yMTA0MjIwOTI2MjNaFw00MTA0MTcwOTI2MjJaMEwxLjAsBgNVBAMMJUF0b3Mg +VHJ1c3RlZFJvb3QgUm9vdCBDQSBFQ0MgVExTIDIwMjExDTALBgNVBAoMBEF0b3MxCzAJBgNVBAYT +AkRFMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEloZYKDcKZ9Cg3iQZGeHkBQcfl+3oZIK59sRxUM6K +DP/XtXa7oWyTbIOiaG6l2b4siJVBzV3dscqDY4PMwL502eCdpO5KTlbgmClBk1IQ1SQ4AjJn8ZQS +b+/Xxd4u/RmAo0IwQDAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR2KCXWfeBmmnoJsmo7jjPX +NtNPojAOBgNVHQ8BAf8EBAMCAYYwCgYIKoZIzj0EAwMDaAAwZQIwW5kp85wxtolrbNa9d+F851F+ +uDrNozZffPc8dz7kUK2o59JZDCaOMDtuCCrCp1rIAjEAmeMM56PDr9NJLkaCI2ZdyQAUEv049OGY +a3cpetskz2VAv9LcjBHo9H1/IISpQuQo +-----END CERTIFICATE----- + +Atos TrustedRoot Root CA RSA TLS 2021 +===================================== +-----BEGIN CERTIFICATE----- +MIIFZDCCA0ygAwIBAgIQU9XP5hmTC/srBRLYwiqipDANBgkqhkiG9w0BAQwFADBMMS4wLAYDVQQD +DCVBdG9zIFRydXN0ZWRSb290IFJvb3QgQ0EgUlNBIFRMUyAyMDIxMQ0wCwYDVQQKDARBdG9zMQsw +CQYDVQQGEwJERTAeFw0yMTA0MjIwOTIxMTBaFw00MTA0MTcwOTIxMDlaMEwxLjAsBgNVBAMMJUF0 +b3MgVHJ1c3RlZFJvb3QgUm9vdCBDQSBSU0EgVExTIDIwMjExDTALBgNVBAoMBEF0b3MxCzAJBgNV +BAYTAkRFMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtoAOxHm9BYx9sKOdTSJNy/BB +l01Z4NH+VoyX8te9j2y3I49f1cTYQcvyAh5x5en2XssIKl4w8i1mx4QbZFc4nXUtVsYvYe+W/CBG +vevUez8/fEc4BKkbqlLfEzfTFRVOvV98r61jx3ncCHvVoOX3W3WsgFWZkmGbzSoXfduP9LVq6hdK +ZChmFSlsAvFr1bqjM9xaZ6cF4r9lthawEO3NUDPJcFDsGY6wx/J0W2tExn2WuZgIWWbeKQGb9Cpt +0xU6kGpn8bRrZtkh68rZYnxGEFzedUlnnkL5/nWpo63/dgpnQOPF943HhZpZnmKaau1Fh5hnstVK +PNe0OwANwI8f4UDErmwh3El+fsqyjW22v5MvoVw+j8rtgI5Y4dtXz4U2OLJxpAmMkokIiEjxQGMY +sluMWuPD0xeqqxmjLBvk1cbiZnrXghmmOxYsL3GHX0WelXOTwkKBIROW1527k2gV+p2kHYzygeBY +Br3JtuP2iV2J+axEoctr+hbxx1A9JNr3w+SH1VbxT5Aw+kUJWdo0zuATHAR8ANSbhqRAvNncTFd+ +rrcztl524WWLZt+NyteYr842mIycg5kDcPOvdO3GDjbnvezBc6eUWsuSZIKmAMFwoW4sKeFYV+xa +fJlrJaSQOoD0IJ2azsct+bJLKZWD6TWNp0lIpw9MGZHQ9b8Q4HECAwEAAaNCMEAwDwYDVR0TAQH/ +BAUwAwEB/zAdBgNVHQ4EFgQUdEmZ0f+0emhFdcN+tNzMzjkz2ggwDgYDVR0PAQH/BAQDAgGGMA0G +CSqGSIb3DQEBDAUAA4ICAQAjQ1MkYlxt/T7Cz1UAbMVWiLkO3TriJQ2VSpfKgInuKs1l+NsW4AmS +4BjHeJi78+xCUvuppILXTdiK/ORO/auQxDh1MoSf/7OwKwIzNsAQkG8dnK/haZPso0UvFJ/1TCpl +Q3IM98P4lYsU84UgYt1UU90s3BiVaU+DR3BAM1h3Egyi61IxHkzJqM7F78PRreBrAwA0JrRUITWX +AdxfG/F851X6LWh3e9NpzNMOa7pNdkTWwhWaJuywxfW70Xp0wmzNxbVe9kzmWy2B27O3Opee7c9G +slA9hGCZcbUztVdF5kJHdWoOsAgMrr3e97sPWD2PAzHoPYJQyi9eDF20l74gNAf0xBLh7tew2Vkt +afcxBPTy+av5EzH4AXcOPUIjJsyacmdRIXrMPIWo6iFqO9taPKU0nprALN+AnCng33eU0aKAQv9q +TFsR0PXNor6uzFFcw9VUewyu1rkGd4Di7wcaaMxZUa1+XGdrudviB0JbuAEFWDlN5LuYo7Ey7Nmj +1m+UI/87tyll5gfp77YZ6ufCOB0yiJA8EytuzO+rdwY0d4RPcuSBhPm5dDTedk+SKlOxJTnbPP/l +PqYO5Wue/9vsL3SD3460s6neFE3/MaNFcyT6lSnMEpcEoji2jbDwN/zIIX8/syQbPYtuzE2wFg2W +HYMfRsCbvUOZ58SWLs5fyQ== +-----END CERTIFICATE----- + +TrustAsia Global Root CA G3 +=========================== +-----BEGIN CERTIFICATE----- +MIIFpTCCA42gAwIBAgIUZPYOZXdhaqs7tOqFhLuxibhxkw8wDQYJKoZIhvcNAQEMBQAwWjELMAkG +A1UEBhMCQ04xJTAjBgNVBAoMHFRydXN0QXNpYSBUZWNobm9sb2dpZXMsIEluYy4xJDAiBgNVBAMM +G1RydXN0QXNpYSBHbG9iYWwgUm9vdCBDQSBHMzAeFw0yMTA1MjAwMjEwMTlaFw00NjA1MTkwMjEw +MTlaMFoxCzAJBgNVBAYTAkNOMSUwIwYDVQQKDBxUcnVzdEFzaWEgVGVjaG5vbG9naWVzLCBJbmMu +MSQwIgYDVQQDDBtUcnVzdEFzaWEgR2xvYmFsIFJvb3QgQ0EgRzMwggIiMA0GCSqGSIb3DQEBAQUA +A4ICDwAwggIKAoICAQDAMYJhkuSUGwoqZdC+BqmHO1ES6nBBruL7dOoKjbmzTNyPtxNST1QY4Sxz +lZHFZjtqz6xjbYdT8PfxObegQ2OwxANdV6nnRM7EoYNl9lA+sX4WuDqKAtCWHwDNBSHvBm3dIZwZ +Q0WhxeiAysKtQGIXBsaqvPPW5vxQfmZCHzyLpnl5hkA1nyDvP+uLRx+PjsXUjrYsyUQE49RDdT/V +P68czH5GX6zfZBCK70bwkPAPLfSIC7Epqq+FqklYqL9joDiR5rPmd2jE+SoZhLsO4fWvieylL1Ag +dB4SQXMeJNnKziyhWTXAyB1GJ2Faj/lN03J5Zh6fFZAhLf3ti1ZwA0pJPn9pMRJpxx5cynoTi+jm +9WAPzJMshH/x/Gr8m0ed262IPfN2dTPXS6TIi/n1Q1hPy8gDVI+lhXgEGvNz8teHHUGf59gXzhqc +D0r83ERoVGjiQTz+LISGNzzNPy+i2+f3VANfWdP3kXjHi3dqFuVJhZBFcnAvkV34PmVACxmZySYg +WmjBNb9Pp1Hx2BErW+Canig7CjoKH8GB5S7wprlppYiU5msTf9FkPz2ccEblooV7WIQn3MSAPmea +mseaMQ4w7OYXQJXZRe0Blqq/DPNL0WP3E1jAuPP6Z92bfW1K/zJMtSU7/xxnD4UiWQWRkUF3gdCF +TIcQcf+eQxuulXUtgQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFEDk5PIj +7zjKsK5Xf/IhMBY027ySMB0GA1UdDgQWBBRA5OTyI+84yrCuV3/yITAWNNu8kjAOBgNVHQ8BAf8E +BAMCAQYwDQYJKoZIhvcNAQEMBQADggIBACY7UeFNOPMyGLS0XuFlXsSUT9SnYaP4wM8zAQLpw6o1 +D/GUE3d3NZ4tVlFEbuHGLige/9rsR82XRBf34EzC4Xx8MnpmyFq2XFNFV1pF1AWZLy4jVe5jaN/T +G3inEpQGAHUNcoTpLrxaatXeL1nHo+zSh2bbt1S1JKv0Q3jbSwTEb93mPmY+KfJLaHEih6D4sTNj +duMNhXJEIlU/HHzp/LgV6FL6qj6jITk1dImmasI5+njPtqzn59ZW/yOSLlALqbUHM/Q4X6RJpstl +cHboCoWASzY9M/eVVHUl2qzEc4Jl6VL1XP04lQJqaTDFHApXB64ipCz5xUG3uOyfT0gA+QEEVcys ++TIxxHWVBqB/0Y0n3bOppHKH/lmLmnp0Ft0WpWIp6zqW3IunaFnT63eROfjXy9mPX1onAX1daBli +2MjN9LdyR75bl87yraKZk62Uy5P2EgmVtqvXO9A/EcswFi55gORngS1d7XB4tmBZrOFdRWOPyN9y +aFvqHbgB8X7754qz41SgOAngPN5C8sLtLpvzHzW2NtjjgKGLzZlkD8Kqq7HK9W+eQ42EVJmzbsAS +ZthwEPEGNTNDqJwuuhQxzhB/HIbjj9LV+Hfsm6vxL2PZQl/gZ4FkkfGXL/xuJvYz+NO1+MRiqzFR +JQJ6+N1rZdVtTTDIZbpoFGWsJwt0ivKH +-----END CERTIFICATE----- + +TrustAsia Global Root CA G4 +=========================== +-----BEGIN CERTIFICATE----- +MIICVTCCAdygAwIBAgIUTyNkuI6XY57GU4HBdk7LKnQV1tcwCgYIKoZIzj0EAwMwWjELMAkGA1UE +BhMCQ04xJTAjBgNVBAoMHFRydXN0QXNpYSBUZWNobm9sb2dpZXMsIEluYy4xJDAiBgNVBAMMG1Ry +dXN0QXNpYSBHbG9iYWwgUm9vdCBDQSBHNDAeFw0yMTA1MjAwMjEwMjJaFw00NjA1MTkwMjEwMjJa +MFoxCzAJBgNVBAYTAkNOMSUwIwYDVQQKDBxUcnVzdEFzaWEgVGVjaG5vbG9naWVzLCBJbmMuMSQw +IgYDVQQDDBtUcnVzdEFzaWEgR2xvYmFsIFJvb3QgQ0EgRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNi +AATxs8045CVD5d4ZCbuBeaIVXxVjAd7Cq92zphtnS4CDr5nLrBfbK5bKfFJV4hrhPVbwLxYI+hW8 +m7tH5j/uqOFMjPXTNvk4XatwmkcN4oFBButJ+bAp3TPsUKV/eSm4IJijYzBhMA8GA1UdEwEB/wQF +MAMBAf8wHwYDVR0jBBgwFoAUpbtKl86zK3+kMd6Xg1mDpm9xy94wHQYDVR0OBBYEFKW7SpfOsyt/ +pDHel4NZg6ZvccveMA4GA1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNnADBkAjBe8usGzEkxn0AA +bbd+NvBNEU/zy4k6LHiRUKNbwMp1JvK/kF0LgoxgKJ/GcJpo5PECMFxYDlZ2z1jD1xCMuo6u47xk +dUfFVZDj/bpV6wfEU6s3qe4hsiFbYI89MvHVI5TWWA== +-----END CERTIFICATE----- + +CommScope Public Trust ECC Root-01 +================================== +-----BEGIN CERTIFICATE----- +MIICHTCCAaOgAwIBAgIUQ3CCd89NXTTxyq4yLzf39H91oJ4wCgYIKoZIzj0EAwMwTjELMAkGA1UE +BhMCVVMxEjAQBgNVBAoMCUNvbW1TY29wZTErMCkGA1UEAwwiQ29tbVNjb3BlIFB1YmxpYyBUcnVz +dCBFQ0MgUm9vdC0wMTAeFw0yMTA0MjgxNzM1NDNaFw00NjA0MjgxNzM1NDJaME4xCzAJBgNVBAYT +AlVTMRIwEAYDVQQKDAlDb21tU2NvcGUxKzApBgNVBAMMIkNvbW1TY29wZSBQdWJsaWMgVHJ1c3Qg +RUNDIFJvb3QtMDEwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAARLNumuV16ocNfQj3Rid8NeeqrltqLx +eP0CflfdkXmcbLlSiFS8LwS+uM32ENEp7LXQoMPwiXAZu1FlxUOcw5tjnSCDPgYLpkJEhRGnSjot +6dZoL0hOUysHP029uax3OVejQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G +A1UdDgQWBBSOB2LAUN3GGQYARnQE9/OufXVNMDAKBggqhkjOPQQDAwNoADBlAjEAnDPfQeMjqEI2 +Jpc1XHvr20v4qotzVRVcrHgpD7oh2MSg2NED3W3ROT3Ek2DS43KyAjB8xX6I01D1HiXo+k515liW +pDVfG2XqYZpwI7UNo5uSUm9poIyNStDuiw7LR47QjRE= +-----END CERTIFICATE----- + +CommScope Public Trust ECC Root-02 +================================== +-----BEGIN CERTIFICATE----- +MIICHDCCAaOgAwIBAgIUKP2ZYEFHpgE6yhR7H+/5aAiDXX0wCgYIKoZIzj0EAwMwTjELMAkGA1UE +BhMCVVMxEjAQBgNVBAoMCUNvbW1TY29wZTErMCkGA1UEAwwiQ29tbVNjb3BlIFB1YmxpYyBUcnVz +dCBFQ0MgUm9vdC0wMjAeFw0yMTA0MjgxNzQ0NTRaFw00NjA0MjgxNzQ0NTNaME4xCzAJBgNVBAYT +AlVTMRIwEAYDVQQKDAlDb21tU2NvcGUxKzApBgNVBAMMIkNvbW1TY29wZSBQdWJsaWMgVHJ1c3Qg +RUNDIFJvb3QtMDIwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAR4MIHoYx7l63FRD/cHB8o5mXxO1Q/M +MDALj2aTPs+9xYa9+bG3tD60B8jzljHz7aRP+KNOjSkVWLjVb3/ubCK1sK9IRQq9qEmUv4RDsNuE +SgMjGWdqb8FuvAY5N9GIIvejQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G +A1UdDgQWBBTmGHX/72DehKT1RsfeSlXjMjZ59TAKBggqhkjOPQQDAwNnADBkAjAmc0l6tqvmSfR9 +Uj/UQQSugEODZXW5hYA4O9Zv5JOGq4/nich/m35rChJVYaoR4HkCMHfoMXGsPHED1oQmHhS48zs7 +3u1Z/GtMMH9ZzkXpc2AVmkzw5l4lIhVtwodZ0LKOag== +-----END CERTIFICATE----- + +CommScope Public Trust RSA Root-01 +================================== +-----BEGIN CERTIFICATE----- +MIIFbDCCA1SgAwIBAgIUPgNJgXUWdDGOTKvVxZAplsU5EN0wDQYJKoZIhvcNAQELBQAwTjELMAkG +A1UEBhMCVVMxEjAQBgNVBAoMCUNvbW1TY29wZTErMCkGA1UEAwwiQ29tbVNjb3BlIFB1YmxpYyBU +cnVzdCBSU0EgUm9vdC0wMTAeFw0yMTA0MjgxNjQ1NTRaFw00NjA0MjgxNjQ1NTNaME4xCzAJBgNV +BAYTAlVTMRIwEAYDVQQKDAlDb21tU2NvcGUxKzApBgNVBAMMIkNvbW1TY29wZSBQdWJsaWMgVHJ1 +c3QgUlNBIFJvb3QtMDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCwSGWjDR1C45Ft +nYSkYZYSwu3D2iM0GXb26v1VWvZVAVMP8syMl0+5UMuzAURWlv2bKOx7dAvnQmtVzslhsuitQDy6 +uUEKBU8bJoWPQ7VAtYXR1HHcg0Hz9kXHgKKEUJdGzqAMxGBWBB0HW0alDrJLpA6lfO741GIDuZNq +ihS4cPgugkY4Iw50x2tBt9Apo52AsH53k2NC+zSDO3OjWiE260f6GBfZumbCk6SP/F2krfxQapWs +vCQz0b2If4b19bJzKo98rwjyGpg/qYFlP8GMicWWMJoKz/TUyDTtnS+8jTiGU+6Xn6myY5QXjQ/c +Zip8UlF1y5mO6D1cv547KI2DAg+pn3LiLCuz3GaXAEDQpFSOm117RTYm1nJD68/A6g3czhLmfTif +BSeolz7pUcZsBSjBAg/pGG3svZwG1KdJ9FQFa2ww8esD1eo9anbCyxooSU1/ZOD6K9pzg4H/kQO9 +lLvkuI6cMmPNn7togbGEW682v3fuHX/3SZtS7NJ3Wn2RnU3COS3kuoL4b/JOHg9O5j9ZpSPcPYeo +KFgo0fEbNttPxP/hjFtyjMcmAyejOQoBqsCyMWCDIqFPEgkBEa801M/XrmLTBQe0MXXgDW1XT2mH ++VepuhX2yFJtocucH+X8eKg1mp9BFM6ltM6UCBwJrVbl2rZJmkrqYxhTnCwuwwIDAQABo0IwQDAP +BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUN12mmnQywsL5x6YVEFm4 +5P3luG0wDQYJKoZIhvcNAQELBQADggIBAK+nz97/4L1CjU3lIpbfaOp9TSp90K09FlxD533Ahuh6 +NWPxzIHIxgvoLlI1pKZJkGNRrDSsBTtXAOnTYtPZKdVUvhwQkZyybf5Z/Xn36lbQnmhUQo8mUuJM +3y+Xpi/SB5io82BdS5pYV4jvguX6r2yBS5KPQJqTRlnLX3gWsWc+QgvfKNmwrZggvkN80V4aCRck +jXtdlemrwWCrWxhkgPut4AZ9HcpZuPN4KWfGVh2vtrV0KnahP/t1MJ+UXjulYPPLXAziDslg+Mkf +Foom3ecnf+slpoq9uC02EJqxWE2aaE9gVOX2RhOOiKy8IUISrcZKiX2bwdgt6ZYD9KJ0DLwAHb/W +NyVntHKLr4W96ioDj8z7PEQkguIBpQtZtjSNMgsSDesnwv1B10A8ckYpwIzqug/xBpMu95yo9GA+ +o/E4Xo4TwbM6l4c/ksp4qRyv0LAbJh6+cOx69TOY6lz/KwsETkPdY34Op054A5U+1C0wlREQKC6/ +oAI+/15Z0wUOlV9TRe9rh9VIzRamloPh37MG88EU26fsHItdkJANclHnYfkUyq+Dj7+vsQpZXdxc +1+SWrVtgHdqul7I52Qb1dgAT+GhMIbA1xNxVssnBQVocicCMb3SgazNNtQEo/a2tiRc7ppqEvOuM +6sRxJKi6KfkIsidWNTJf6jn7MZrVGczw +-----END CERTIFICATE----- + +CommScope Public Trust RSA Root-02 +================================== +-----BEGIN CERTIFICATE----- +MIIFbDCCA1SgAwIBAgIUVBa/O345lXGN0aoApYYNK496BU4wDQYJKoZIhvcNAQELBQAwTjELMAkG +A1UEBhMCVVMxEjAQBgNVBAoMCUNvbW1TY29wZTErMCkGA1UEAwwiQ29tbVNjb3BlIFB1YmxpYyBU +cnVzdCBSU0EgUm9vdC0wMjAeFw0yMTA0MjgxNzE2NDNaFw00NjA0MjgxNzE2NDJaME4xCzAJBgNV +BAYTAlVTMRIwEAYDVQQKDAlDb21tU2NvcGUxKzApBgNVBAMMIkNvbW1TY29wZSBQdWJsaWMgVHJ1 +c3QgUlNBIFJvb3QtMDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDh+g77aAASyE3V +rCLENQE7xVTlWXZjpX/rwcRqmL0yjReA61260WI9JSMZNRTpf4mnG2I81lDnNJUDMrG0kyI9p+Kx +7eZ7Ti6Hmw0zdQreqjXnfuU2mKKuJZ6VszKWpCtYHu8//mI0SFHRtI1CrWDaSWqVcN3SAOLMV2MC +e5bdSZdbkk6V0/nLKR8YSvgBKtJjCW4k6YnS5cciTNxzhkcAqg2Ijq6FfUrpuzNPDlJwnZXjfG2W +Wy09X6GDRl224yW4fKcZgBzqZUPckXk2LHR88mcGyYnJ27/aaL8j7dxrrSiDeS/sOKUNNwFnJ5rp +M9kzXzehxfCrPfp4sOcsn/Y+n2Dg70jpkEUeBVF4GiwSLFworA2iI540jwXmojPOEXcT1A6kHkIf +hs1w/tkuFT0du7jyU1fbzMZ0KZwYszZ1OC4PVKH4kh+Jlk+71O6d6Ts2QrUKOyrUZHk2EOH5kQMr +eyBUzQ0ZGshBMjTRsJnhkB4BQDa1t/qp5Xd1pCKBXbCL5CcSD1SIxtuFdOa3wNemKfrb3vOTlycE +VS8KbzfFPROvCgCpLIscgSjX74Yxqa7ybrjKaixUR9gqiC6vwQcQeKwRoi9C8DfF8rhW3Q5iLc4t +Vn5V8qdE9isy9COoR+jUKgF4z2rDN6ieZdIs5fq6M8EGRPbmz6UNp2YINIos8wIDAQABo0IwQDAP +BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUR9DnsSL/nSz12Vdgs7Gx +cJXvYXowDQYJKoZIhvcNAQELBQADggIBAIZpsU0v6Z9PIpNojuQhmaPORVMbc0RTAIFhzTHjCLqB +KCh6krm2qMhDnscTJk3C2OVVnJJdUNjCK9v+5qiXz1I6JMNlZFxHMaNlNRPDk7n3+VGXu6TwYofF +1gbTl4MgqX67tiHCpQ2EAOHyJxCDut0DgdXdaMNmEMjRdrSzbymeAPnCKfWxkxlSaRosTKCL4BWa +MS/TiJVZbuXEs1DIFAhKm4sTg7GkcrI7djNB3NyqpgdvHSQSn8h2vS/ZjvQs7rfSOBAkNlEv41xd +gSGn2rtO/+YHqP65DSdsu3BaVXoT6fEqSWnHX4dXTEN5bTpl6TBcQe7rd6VzEojov32u5cSoHw2O +HG1QAk8mGEPej1WFsQs3BWDJVTkSBKEqz3EWnzZRSb9wO55nnPt7eck5HHisd5FUmrh1CoFSl+Nm +YWvtPjgelmFV4ZFUjO2MJB+ByRCac5krFk5yAD9UG/iNuovnFNa2RU9g7Jauwy8CTl2dlklyALKr +dVwPaFsdZcJfMw8eD/A7hvWwTruc9+olBdytoptLFwG+Qt81IR2tq670v64fG9PiO/yzcnMcmyiQ +iRM9HcEARwmWmjgb3bHPDcK0RPOWlc4yOo80nOAXx17Org3bhzjlP1v9mxnhMUF6cKojawHhRUzN +lM47ni3niAIi9G7oyOzWPPO5std3eqx7 +-----END CERTIFICATE----- + +Telekom Security TLS ECC Root 2020 +================================== +-----BEGIN CERTIFICATE----- +MIICQjCCAcmgAwIBAgIQNjqWjMlcsljN0AFdxeVXADAKBggqhkjOPQQDAzBjMQswCQYDVQQGEwJE +RTEnMCUGA1UECgweRGV1dHNjaGUgVGVsZWtvbSBTZWN1cml0eSBHbWJIMSswKQYDVQQDDCJUZWxl +a29tIFNlY3VyaXR5IFRMUyBFQ0MgUm9vdCAyMDIwMB4XDTIwMDgyNTA3NDgyMFoXDTQ1MDgyNTIz +NTk1OVowYzELMAkGA1UEBhMCREUxJzAlBgNVBAoMHkRldXRzY2hlIFRlbGVrb20gU2VjdXJpdHkg +R21iSDErMCkGA1UEAwwiVGVsZWtvbSBTZWN1cml0eSBUTFMgRUNDIFJvb3QgMjAyMDB2MBAGByqG +SM49AgEGBSuBBAAiA2IABM6//leov9Wq9xCazbzREaK9Z0LMkOsVGJDZos0MKiXrPk/OtdKPD/M1 +2kOLAoC+b1EkHQ9rK8qfwm9QMuU3ILYg/4gND21Ju9sGpIeQkpT0CdDPf8iAC8GXs7s1J8nCG6NC +MEAwHQYDVR0OBBYEFONyzG6VmUex5rNhTNHLq+O6zd6fMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P +AQH/BAQDAgEGMAoGCCqGSM49BAMDA2cAMGQCMHVSi7ekEE+uShCLsoRbQuHmKjYC2qBuGT8lv9pZ +Mo7k+5Dck2TOrbRBR2Diz6fLHgIwN0GMZt9Ba9aDAEH9L1r3ULRn0SyocddDypwnJJGDSA3PzfdU +ga/sf+Rn27iQ7t0l +-----END CERTIFICATE----- + +Telekom Security TLS RSA Root 2023 +================================== +-----BEGIN CERTIFICATE----- +MIIFszCCA5ugAwIBAgIQIZxULej27HF3+k7ow3BXlzANBgkqhkiG9w0BAQwFADBjMQswCQYDVQQG +EwJERTEnMCUGA1UECgweRGV1dHNjaGUgVGVsZWtvbSBTZWN1cml0eSBHbWJIMSswKQYDVQQDDCJU +ZWxla29tIFNlY3VyaXR5IFRMUyBSU0EgUm9vdCAyMDIzMB4XDTIzMDMyODEyMTY0NVoXDTQ4MDMy +NzIzNTk1OVowYzELMAkGA1UEBhMCREUxJzAlBgNVBAoMHkRldXRzY2hlIFRlbGVrb20gU2VjdXJp +dHkgR21iSDErMCkGA1UEAwwiVGVsZWtvbSBTZWN1cml0eSBUTFMgUlNBIFJvb3QgMjAyMzCCAiIw +DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAO01oYGA88tKaVvC+1GDrib94W7zgRJ9cUD/h3VC +KSHtgVIs3xLBGYSJwb3FKNXVS2xE1kzbB5ZKVXrKNoIENqil/Cf2SfHVcp6R+SPWcHu79ZvB7JPP +GeplfohwoHP89v+1VmLhc2o0mD6CuKyVU/QBoCcHcqMAU6DksquDOFczJZSfvkgdmOGjup5czQRx +UX11eKvzWarE4GC+j4NSuHUaQTXtvPM6Y+mpFEXX5lLRbtLevOP1Czvm4MS9Q2QTps70mDdsipWo +l8hHD/BeEIvnHRz+sTugBTNoBUGCwQMrAcjnj02r6LX2zWtEtefdi+zqJbQAIldNsLGyMcEWzv/9 +FIS3R/qy8XDe24tsNlikfLMR0cN3f1+2JeANxdKz+bi4d9s3cXFH42AYTyS2dTd4uaNir73Jco4v +zLuu2+QVUhkHM/tqty1LkCiCc/4YizWN26cEar7qwU02OxY2kTLvtkCJkUPg8qKrBC7m8kwOFjQg +rIfBLX7JZkcXFBGk8/ehJImr2BrIoVyxo/eMbcgByU/J7MT8rFEz0ciD0cmfHdRHNCk+y7AO+oML +KFjlKdw/fKifybYKu6boRhYPluV75Gp6SG12mAWl3G0eQh5C2hrgUve1g8Aae3g1LDj1H/1Joy7S +WWO/gLCMk3PLNaaZlSJhZQNg+y+TS/qanIA7AgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBBjAdBgNV +HQ4EFgQUtqeXgj10hZv3PJ+TmpV5dVKMbUcwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBS2 +p5eCPXSFm/c8n5OalXl1UoxtRzANBgkqhkiG9w0BAQwFAAOCAgEAqMxhpr51nhVQpGv7qHBFfLp+ +sVr8WyP6Cnf4mHGCDG3gXkaqk/QeoMPhk9tLrbKmXauw1GLLXrtm9S3ul0A8Yute1hTWjOKWi0Fp +kzXmuZlrYrShF2Y0pmtjxrlO8iLpWA1WQdH6DErwM807u20hOq6OcrXDSvvpfeWxm4bu4uB9tPcy +/SKE8YXJN3nptT+/XOR0so8RYgDdGGah2XsjX/GO1WfoVNpbOms2b/mBsTNHM3dA+VKq3dSDz4V4 +mZqTuXNnQkYRIer+CqkbGmVps4+uFrb2S1ayLfmlyOw7YqPta9BO1UAJpB+Y1zqlklkg5LB9zVtz +aL1txKITDmcZuI1CfmwMmm6gJC3VRRvcxAIU/oVbZZfKTpBQCHpCNfnqwmbU+AGuHrS+w6jv/naa +oqYfRvaE7fzbzsQCzndILIyy7MMAo+wsVRjBfhnu4S/yrYObnqsZ38aKL4x35bcF7DvB7L6Gs4a8 +wPfc5+pbrrLMtTWGS9DiP7bY+A4A7l3j941Y/8+LN+ljX273CXE2whJdV/LItM3z7gLfEdxquVeE +HVlNjM7IDiPCtyaaEBRx/pOyiriA8A4QntOoUAw3gi/q4Iqd4Sw5/7W0cwDk90imc6y/st53BIe0 +o82bNSQ3+pCTE4FCxpgmdTdmQRCsu/WU48IxK63nI1bMNSWSs1A= +-----END CERTIFICATE----- + +FIRMAPROFESIONAL CA ROOT-A WEB +============================== +-----BEGIN CERTIFICATE----- +MIICejCCAgCgAwIBAgIQMZch7a+JQn81QYehZ1ZMbTAKBggqhkjOPQQDAzBuMQswCQYDVQQGEwJF +UzEcMBoGA1UECgwTRmlybWFwcm9mZXNpb25hbCBTQTEYMBYGA1UEYQwPVkFURVMtQTYyNjM0MDY4 +MScwJQYDVQQDDB5GSVJNQVBST0ZFU0lPTkFMIENBIFJPT1QtQSBXRUIwHhcNMjIwNDA2MDkwMTM2 +WhcNNDcwMzMxMDkwMTM2WjBuMQswCQYDVQQGEwJFUzEcMBoGA1UECgwTRmlybWFwcm9mZXNpb25h +bCBTQTEYMBYGA1UEYQwPVkFURVMtQTYyNjM0MDY4MScwJQYDVQQDDB5GSVJNQVBST0ZFU0lPTkFM +IENBIFJPT1QtQSBXRUIwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAARHU+osEaR3xyrq89Zfe9MEkVz6 +iMYiuYMQYneEMy3pA4jU4DP37XcsSmDq5G+tbbT4TIqk5B/K6k84Si6CcyvHZpsKjECcfIr28jlg +st7L7Ljkb+qbXbdTkBgyVcUgt5SjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUk+FD +Y1w8ndYn81LsF7Kpryz3dvgwHQYDVR0OBBYEFJPhQ2NcPJ3WJ/NS7Beyqa8s93b4MA4GA1UdDwEB +/wQEAwIBBjAKBggqhkjOPQQDAwNoADBlAjAdfKR7w4l1M+E7qUW/Runpod3JIha3RxEL2Jq68cgL +cFBTApFwhVmpHqTm6iMxoAACMQD94vizrxa5HnPEluPBMBnYfubDl94cT7iJLzPrSA8Z94dGXSaQ +pYXFuXqUPoeovQA= +-----END CERTIFICATE----- diff --git a/kirby/composer.json b/kirby/composer.json new file mode 100644 index 0000000..59cbfb6 --- /dev/null +++ b/kirby/composer.json @@ -0,0 +1,115 @@ +{ + "name": "getkirby/cms", + "description": "The Kirby core", + "license": "proprietary", + "type": "kirby-cms", + "version": "4.3.1", + "keywords": [ + "kirby", + "cms", + "core" + ], + "authors": [ + { + "name": "Kirby Team", + "email": "support@getkirby.com", + "homepage": "https://getkirby.com" + } + ], + "homepage": "https://getkirby.com", + "support": { + "email": "support@getkirby.com", + "issues": "https://github.com/getkirby/kirby/issues", + "forum": "https://forum.getkirby.com", + "source": "https://github.com/getkirby/kirby" + }, + "require": { + "php": "~8.1.0 || ~8.2.0 || ~8.3.0", + "ext-SimpleXML": "*", + "ext-ctype": "*", + "ext-curl": "*", + "ext-dom": "*", + "ext-filter": "*", + "ext-hash": "*", + "ext-iconv": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-openssl": "*", + "christian-riesen/base32": "1.6.0", + "claviska/simpleimage": "4.2.0", + "composer/semver": "3.4.0", + "filp/whoops": "2.15.4", + "getkirby/composer-installer": "^1.2.1", + "laminas/laminas-escaper": "2.13.0", + "michelf/php-smartypants": "1.8.1", + "phpmailer/phpmailer": "6.9.1", + "symfony/polyfill-intl-idn": "1.29.0", + "symfony/polyfill-mbstring": "1.29.0", + "symfony/yaml": "6.4.8" + }, + "replace": { + "symfony/polyfill-php72": "*" + }, + "suggest": { + "ext-PDO": "Support for using databases", + "ext-apcu": "Support for the Apcu cache driver", + "ext-exif": "Support for exif information from images", + "ext-fileinfo": "Improved mime type detection for files", + "ext-intl": "Improved i18n number formatting", + "ext-memcached": "Support for the Memcached cache driver", + "ext-sodium": "Support for the crypto class and more robust session handling", + "ext-zip": "Support for ZIP archive file functions", + "ext-zlib": "Sanitization and validation for svgz files" + }, + "autoload": { + "psr-4": { + "Kirby\\": "src/" + }, + "classmap": [ + "dependencies/" + ], + "files": [ + "config/setup.php", + "config/helpers.php" + ] + }, + "config": { + "allow-plugins": { + "getkirby/composer-installer": true + }, + "optimize-autoloader": true, + "platform": { + "php": "8.1.0" + }, + "platform-check": false + }, + "extra": { + "unused": [ + "symfony/polyfill-intl-idn" + ] + }, + "scripts": { + "post-update-cmd": "curl -o cacert.pem https://curl.se/ca/cacert.pem", + "analyze": [ + "@analyze:composer", + "@analyze:psalm", + "@analyze:phpmd" + ], + "analyze:composer": "composer validate --strict --no-check-version --no-check-all", + "analyze:phpmd": "phpmd . ansi phpmd.xml.dist --exclude 'dependencies/*,tests/*,vendor/*'", + "analyze:psalm": "psalm", + "bench": "phpbench run --report=aggregate --ref baseline", + "bench:baseline": "phpbench run --report=aggregate --tag baseline", + "build": "./scripts/build", + "ci": [ + "@fix", + "@analyze", + "@test" + ], + "fix": "php-cs-fixer fix", + "test": "phpunit", + "test:coverage": "XDEBUG_MODE=coverage phpunit --coverage-html=tests/coverage", + "zip": "composer archive --format=zip --file=dist" + } +} diff --git a/kirby/composer.lock b/kirby/composer.lock new file mode 100644 index 0000000..d648e89 --- /dev/null +++ b/kirby/composer.lock @@ -0,0 +1,1117 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "5c5a02ed090776d3c703adfc737f316b", + "packages": [ + { + "name": "christian-riesen/base32", + "version": "1.6.0", + "source": { + "type": "git", + "url": "https://github.com/ChristianRiesen/base32.git", + "reference": "2e82dab3baa008e24a505649b0d583c31d31e894" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ChristianRiesen/base32/zipball/2e82dab3baa008e24a505649b0d583c31d31e894", + "reference": "2e82dab3baa008e24a505649b0d583c31d31e894", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^2.17", + "phpstan/phpstan": "^0.12", + "phpunit/phpunit": "^8.5.13 || ^9.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Base32\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Riesen", + "email": "chris.riesen@gmail.com", + "homepage": "http://christianriesen.com", + "role": "Developer" + } + ], + "description": "Base32 encoder/decoder according to RFC 4648", + "homepage": "https://github.com/ChristianRiesen/base32", + "keywords": [ + "base32", + "decode", + "encode", + "rfc4648" + ], + "support": { + "issues": "https://github.com/ChristianRiesen/base32/issues", + "source": "https://github.com/ChristianRiesen/base32/tree/1.6.0" + }, + "time": "2021-02-26T10:19:33+00:00" + }, + { + "name": "claviska/simpleimage", + "version": "4.2.0", + "source": { + "type": "git", + "url": "https://github.com/claviska/SimpleImage.git", + "reference": "dfbe53c01dae8467468ef2b817c09b786a7839d2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/claviska/SimpleImage/zipball/dfbe53c01dae8467468ef2b817c09b786a7839d2", + "reference": "dfbe53c01dae8467468ef2b817c09b786a7839d2", + "shasum": "" + }, + "require": { + "ext-gd": "*", + "league/color-extractor": "0.4.*", + "php": ">=8.0" + }, + "require-dev": { + "laravel/pint": "^1.5", + "phpstan/phpstan": "^1.10" + }, + "type": "library", + "autoload": { + "psr-0": { + "claviska": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Cory LaViska", + "homepage": "http://www.abeautifulsite.net/", + "role": "Developer" + } + ], + "description": "A PHP class that makes working with images as simple as possible.", + "support": { + "issues": "https://github.com/claviska/SimpleImage/issues", + "source": "https://github.com/claviska/SimpleImage/tree/4.2.0" + }, + "funding": [ + { + "url": "https://github.com/claviska", + "type": "github" + } + ], + "time": "2024-04-15T16:07:16+00:00" + }, + { + "name": "composer/semver", + "version": "3.4.0", + "source": { + "type": "git", + "url": "https://github.com/composer/semver.git", + "reference": "35e8d0af4486141bc745f23a29cc2091eb624a32" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/semver/zipball/35e8d0af4486141bc745f23a29cc2091eb624a32", + "reference": "35e8d0af4486141bc745f23a29cc2091eb624a32", + "shasum": "" + }, + "require": { + "php": "^5.3.2 || ^7.0 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.4", + "symfony/phpunit-bridge": "^4.2 || ^5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Semver\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nils Adermann", + "email": "naderman@naderman.de", + "homepage": "http://www.naderman.de" + }, + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + }, + { + "name": "Rob Bast", + "email": "rob.bast@gmail.com", + "homepage": "http://robbast.nl" + } + ], + "description": "Semver library that offers utilities, version constraint parsing and validation.", + "keywords": [ + "semantic", + "semver", + "validation", + "versioning" + ], + "support": { + "irc": "ircs://irc.libera.chat:6697/composer", + "issues": "https://github.com/composer/semver/issues", + "source": "https://github.com/composer/semver/tree/3.4.0" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2023-08-31T09:50:34+00:00" + }, + { + "name": "filp/whoops", + "version": "2.15.4", + "source": { + "type": "git", + "url": "https://github.com/filp/whoops.git", + "reference": "a139776fa3f5985a50b509f2a02ff0f709d2a546" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/filp/whoops/zipball/a139776fa3f5985a50b509f2a02ff0f709d2a546", + "reference": "a139776fa3f5985a50b509f2a02ff0f709d2a546", + "shasum": "" + }, + "require": { + "php": "^5.5.9 || ^7.0 || ^8.0", + "psr/log": "^1.0.1 || ^2.0 || ^3.0" + }, + "require-dev": { + "mockery/mockery": "^0.9 || ^1.0", + "phpunit/phpunit": "^4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.8 || ^9.3.3", + "symfony/var-dumper": "^2.6 || ^3.0 || ^4.0 || ^5.0" + }, + "suggest": { + "symfony/var-dumper": "Pretty print complex values better with var-dumper available", + "whoops/soap": "Formats errors as SOAP responses" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "autoload": { + "psr-4": { + "Whoops\\": "src/Whoops/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Filipe Dobreira", + "homepage": "https://github.com/filp", + "role": "Developer" + } + ], + "description": "php error handling for cool kids", + "homepage": "https://filp.github.io/whoops/", + "keywords": [ + "error", + "exception", + "handling", + "library", + "throwable", + "whoops" + ], + "support": { + "issues": "https://github.com/filp/whoops/issues", + "source": "https://github.com/filp/whoops/tree/2.15.4" + }, + "funding": [ + { + "url": "https://github.com/denis-sokolov", + "type": "github" + } + ], + "time": "2023-11-03T12:00:00+00:00" + }, + { + "name": "getkirby/composer-installer", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/getkirby/composer-installer.git", + "reference": "c98ece30bfba45be7ce457e1102d1b169d922f3d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/getkirby/composer-installer/zipball/c98ece30bfba45be7ce457e1102d1b169d922f3d", + "reference": "c98ece30bfba45be7ce457e1102d1b169d922f3d", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.0 || ^2.0" + }, + "require-dev": { + "composer/composer": "^1.8 || ^2.0" + }, + "type": "composer-plugin", + "extra": { + "class": "Kirby\\ComposerInstaller\\Plugin" + }, + "autoload": { + "psr-4": { + "Kirby\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Kirby's custom Composer installer for the Kirby CMS and for Kirby plugins", + "homepage": "https://getkirby.com", + "support": { + "issues": "https://github.com/getkirby/composer-installer/issues", + "source": "https://github.com/getkirby/composer-installer/tree/1.2.1" + }, + "funding": [ + { + "url": "https://getkirby.com/buy", + "type": "custom" + } + ], + "time": "2020-12-28T12:54:39+00:00" + }, + { + "name": "laminas/laminas-escaper", + "version": "2.13.0", + "source": { + "type": "git", + "url": "https://github.com/laminas/laminas-escaper.git", + "reference": "af459883f4018d0f8a0c69c7a209daef3bf973ba" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laminas/laminas-escaper/zipball/af459883f4018d0f8a0c69c7a209daef3bf973ba", + "reference": "af459883f4018d0f8a0c69c7a209daef3bf973ba", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "ext-mbstring": "*", + "php": "~8.1.0 || ~8.2.0 || ~8.3.0" + }, + "conflict": { + "zendframework/zend-escaper": "*" + }, + "require-dev": { + "infection/infection": "^0.27.0", + "laminas/laminas-coding-standard": "~2.5.0", + "maglnet/composer-require-checker": "^3.8.0", + "phpunit/phpunit": "^9.6.7", + "psalm/plugin-phpunit": "^0.18.4", + "vimeo/psalm": "^5.9" + }, + "type": "library", + "autoload": { + "psr-4": { + "Laminas\\Escaper\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Securely and safely escape HTML, HTML attributes, JavaScript, CSS, and URLs", + "homepage": "https://laminas.dev", + "keywords": [ + "escaper", + "laminas" + ], + "support": { + "chat": "https://laminas.dev/chat", + "docs": "https://docs.laminas.dev/laminas-escaper/", + "forum": "https://discourse.laminas.dev", + "issues": "https://github.com/laminas/laminas-escaper/issues", + "rss": "https://github.com/laminas/laminas-escaper/releases.atom", + "source": "https://github.com/laminas/laminas-escaper" + }, + "funding": [ + { + "url": "https://funding.communitybridge.org/projects/laminas-project", + "type": "community_bridge" + } + ], + "time": "2023-10-10T08:35:13+00:00" + }, + { + "name": "league/color-extractor", + "version": "0.4.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/color-extractor.git", + "reference": "21fcac6249c5ef7d00eb83e128743ee6678fe505" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/color-extractor/zipball/21fcac6249c5ef7d00eb83e128743ee6678fe505", + "reference": "21fcac6249c5ef7d00eb83e128743ee6678fe505", + "shasum": "" + }, + "require": { + "ext-gd": "*", + "php": "^7.3 || ^8.0" + }, + "replace": { + "matthecat/colorextractor": "*" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "~2", + "phpunit/phpunit": "^9.5" + }, + "suggest": { + "ext-curl": "To download images from remote URLs if allow_url_fopen is disabled for security reasons" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\ColorExtractor\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mathieu Lechat", + "email": "math.lechat@gmail.com", + "homepage": "http://matthecat.com", + "role": "Developer" + } + ], + "description": "Extract colors from an image as a human would do.", + "homepage": "https://github.com/thephpleague/color-extractor", + "keywords": [ + "color", + "extract", + "human", + "image", + "palette" + ], + "support": { + "issues": "https://github.com/thephpleague/color-extractor/issues", + "source": "https://github.com/thephpleague/color-extractor/tree/0.4.0" + }, + "time": "2022-09-24T15:57:16+00:00" + }, + { + "name": "michelf/php-smartypants", + "version": "1.8.1", + "source": { + "type": "git", + "url": "https://github.com/michelf/php-smartypants.git", + "reference": "47d17c90a4dfd0ccf1f87e25c65e6c8012415aad" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/michelf/php-smartypants/zipball/47d17c90a4dfd0ccf1f87e25c65e6c8012415aad", + "reference": "47d17c90a4dfd0ccf1f87e25c65e6c8012415aad", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "autoload": { + "psr-0": { + "Michelf": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Michel Fortin", + "email": "michel.fortin@michelf.ca", + "homepage": "https://michelf.ca/", + "role": "Developer" + }, + { + "name": "John Gruber", + "homepage": "https://daringfireball.net/" + } + ], + "description": "PHP SmartyPants", + "homepage": "https://michelf.ca/projects/php-smartypants/", + "keywords": [ + "dashes", + "quotes", + "spaces", + "typographer", + "typography" + ], + "support": { + "issues": "https://github.com/michelf/php-smartypants/issues", + "source": "https://github.com/michelf/php-smartypants/tree/1.8.1" + }, + "time": "2016-12-13T01:01:17+00:00" + }, + { + "name": "phpmailer/phpmailer", + "version": "v6.9.1", + "source": { + "type": "git", + "url": "https://github.com/PHPMailer/PHPMailer.git", + "reference": "039de174cd9c17a8389754d3b877a2ed22743e18" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/039de174cd9c17a8389754d3b877a2ed22743e18", + "reference": "039de174cd9c17a8389754d3b877a2ed22743e18", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "ext-filter": "*", + "ext-hash": "*", + "php": ">=5.5.0" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^1.0", + "doctrine/annotations": "^1.2.6 || ^1.13.3", + "php-parallel-lint/php-console-highlighter": "^1.0.0", + "php-parallel-lint/php-parallel-lint": "^1.3.2", + "phpcompatibility/php-compatibility": "^9.3.5", + "roave/security-advisories": "dev-latest", + "squizlabs/php_codesniffer": "^3.7.2", + "yoast/phpunit-polyfills": "^1.0.4" + }, + "suggest": { + "decomplexity/SendOauth2": "Adapter for using XOAUTH2 authentication", + "ext-mbstring": "Needed to send email in multibyte encoding charset or decode encoded addresses", + "ext-openssl": "Needed for secure SMTP sending and DKIM signing", + "greew/oauth2-azure-provider": "Needed for Microsoft Azure XOAUTH2 authentication", + "hayageek/oauth2-yahoo": "Needed for Yahoo XOAUTH2 authentication", + "league/oauth2-google": "Needed for Google XOAUTH2 authentication", + "psr/log": "For optional PSR-3 debug logging", + "symfony/polyfill-mbstring": "To support UTF-8 if the Mbstring PHP extension is not enabled (^1.2)", + "thenetworg/oauth2-azure": "Needed for Microsoft XOAUTH2 authentication" + }, + "type": "library", + "autoload": { + "psr-4": { + "PHPMailer\\PHPMailer\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-2.1-only" + ], + "authors": [ + { + "name": "Marcus Bointon", + "email": "phpmailer@synchromedia.co.uk" + }, + { + "name": "Jim Jagielski", + "email": "jimjag@gmail.com" + }, + { + "name": "Andy Prevost", + "email": "codeworxtech@users.sourceforge.net" + }, + { + "name": "Brent R. Matzelle" + } + ], + "description": "PHPMailer is a full-featured email creation and transfer class for PHP", + "support": { + "issues": "https://github.com/PHPMailer/PHPMailer/issues", + "source": "https://github.com/PHPMailer/PHPMailer/tree/v6.9.1" + }, + "funding": [ + { + "url": "https://github.com/Synchro", + "type": "github" + } + ], + "time": "2023-11-25T22:23:28+00:00" + }, + { + "name": "psr/log", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/fe5ea303b0887d5caefd3d431c3e61ad47037001", + "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "support": { + "source": "https://github.com/php-fig/log/tree/3.0.0" + }, + "time": "2021-07-14T16:46:02+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v3.5.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1", + "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-04-18T09:32:20+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ef4d7e442ca910c4764bce785146269b30cb5fc4", + "reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-ctype": "*" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.29.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-29T20:11:03+00:00" + }, + { + "name": "symfony/polyfill-intl-idn", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-idn.git", + "reference": "a287ed7475f85bf6f61890146edbc932c0fff919" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/a287ed7475f85bf6f61890146edbc932c0fff919", + "reference": "a287ed7475f85bf6f61890146edbc932c0fff919", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "symfony/polyfill-intl-normalizer": "^1.10", + "symfony/polyfill-php72": "^1.10" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Idn\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Laurent Bassin", + "email": "laurent@bassin.info" + }, + { + "name": "Trevor Rowbotham", + "email": "trevor.rowbotham@pm.me" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "idn", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.29.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-29T20:11:03+00:00" + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "bc45c394692b948b4d383a08d7753968bed9a83d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/bc45c394692b948b4d383a08d7753968bed9a83d", + "reference": "bc45c394692b948b4d383a08d7753968bed9a83d", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's Normalizer class and related functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "intl", + "normalizer", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.29.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-29T20:11:03+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9773676c8a1bb1f8d4340a62efe641cf76eda7ec", + "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.29.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-29T20:11:03+00:00" + }, + { + "name": "symfony/yaml", + "version": "v6.4.8", + "source": { + "type": "git", + "url": "https://github.com/symfony/yaml.git", + "reference": "52903de178d542850f6f341ba92995d3d63e60c9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/yaml/zipball/52903de178d542850f6f341ba92995d3d63e60c9", + "reference": "52903de178d542850f6f341ba92995d3d63e60c9", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "symfony/console": "<5.4" + }, + "require-dev": { + "symfony/console": "^5.4|^6.0|^7.0" + }, + "bin": [ + "Resources/bin/yaml-lint" + ], + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Yaml\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Loads and dumps YAML files", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/yaml/tree/v6.4.8" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-05-31T14:49:08+00:00" + } + ], + "packages-dev": [], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": [], + "prefer-stable": false, + "prefer-lowest": false, + "platform": { + "php": "~8.1.0 || ~8.2.0 || ~8.3.0", + "ext-simplexml": "*", + "ext-ctype": "*", + "ext-curl": "*", + "ext-dom": "*", + "ext-filter": "*", + "ext-hash": "*", + "ext-iconv": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-openssl": "*" + }, + "platform-dev": [], + "platform-overrides": { + "php": "8.1.0" + }, + "plugin-api-version": "2.6.0" +} diff --git a/kirby/config/aliases.php b/kirby/config/aliases.php new file mode 100644 index 0000000..206d3b4 --- /dev/null +++ b/kirby/config/aliases.php @@ -0,0 +1,95 @@ + 'Kirby\Cms\Collection', + 'file' => 'Kirby\Cms\File', + 'files' => 'Kirby\Cms\Files', + 'find' => 'Kirby\Cms\Find', + 'helpers' => 'Kirby\Cms\Helpers', + 'html' => 'Kirby\Cms\Html', + 'kirby' => 'Kirby\Cms\App', + 'page' => 'Kirby\Cms\Page', + 'pages' => 'Kirby\Cms\Pages', + 'pagination' => 'Kirby\Cms\Pagination', + 'r' => 'Kirby\Cms\R', + 'response' => 'Kirby\Cms\Response', + 's' => 'Kirby\Cms\S', + 'sane' => 'Kirby\Sane\Sane', + 'site' => 'Kirby\Cms\Site', + 'structure' => 'Kirby\Cms\Structure', + 'url' => 'Kirby\Cms\Url', + 'user' => 'Kirby\Cms\User', + 'users' => 'Kirby\Cms\Users', + 'visitor' => 'Kirby\Cms\Visitor', + + // content classes + 'field' => 'Kirby\Content\Field', + + // data handler + 'data' => 'Kirby\Data\Data', + 'json' => 'Kirby\Data\Json', + 'yaml' => 'Kirby\Data\Yaml', + + // file classes + 'asset' => 'Kirby\Filesystem\Asset', + 'dir' => 'Kirby\Filesystem\Dir', + 'f' => 'Kirby\Filesystem\F', + 'mime' => 'Kirby\Filesystem\Mime', + + // data classes + 'database' => 'Kirby\Database\Database', + 'db' => 'Kirby\Database\Db', + + // exceptions + 'errorpageexception' => 'Kirby\Exception\ErrorPageException', + + // http classes + 'cookie' => 'Kirby\Http\Cookie', + 'header' => 'Kirby\Http\Header', + 'remote' => 'Kirby\Http\Remote', + + // image classes + 'dimensions' => 'Kirby\Image\Dimensions', + + // panel classes + 'panel' => 'Kirby\Panel\Panel', + + // template classes + 'snippet' => 'Kirby\Template\Snippet', + 'slot' => 'Kirby\Template\Slot', + + // toolkit classes + 'a' => 'Kirby\Toolkit\A', + 'c' => 'Kirby\Toolkit\Config', + 'config' => 'Kirby\Toolkit\Config', + 'escape' => 'Kirby\Toolkit\Escape', + 'i18n' => 'Kirby\Toolkit\I18n', + 'obj' => 'Kirby\Toolkit\Obj', + 'str' => 'Kirby\Toolkit\Str', + 'tpl' => 'Kirby\Toolkit\Tpl', + 'v' => 'Kirby\Toolkit\V', + 'xml' => 'Kirby\Toolkit\Xml', + + // Deprecated aliases: + // Any of these might be removed at any point in the future + 'kirby\cms\asset' => 'Kirby\Filesystem\Asset', + 'kirby\cms\content' => 'Kirby\Content\Content', + 'kirby\cms\contenttranslation' => 'Kirby\Content\ContentTranslation', + 'kirby\cms\dir' => 'Kirby\Filesystem\Dir', + 'kirby\cms\filename' => 'Kirby\Filesystem\Filename', + 'kirby\cms\filefoundation' => 'Kirby\Filesystem\IsFile', + 'kirby\cms\field' => 'Kirby\Content\Field', + 'kirby\cms\form' => 'Kirby\Form\Form', + 'kirby\cms\kirbytag' => 'Kirby\Text\KirbyTag', + 'kirby\cms\kirbytags' => 'Kirby\Text\KirbyTags', + 'kirby\cms\template' => 'Kirby\Template\Template', + 'kirby\form\options' => 'Kirby\Option\Options', + 'kirby\form\optionsapi' => 'Kirby\Option\OptionsApi', + 'kirby\form\optionsquery' => 'Kirby\Option\OptionsQuery', + 'kirby\toolkit\dir' => 'Kirby\Filesystem\Dir', + 'kirby\toolkit\f' => 'Kirby\Filesystem\F', + 'kirby\toolkit\file' => 'Kirby\Filesystem\File', + 'kirby\toolkit\mime' => 'Kirby\Filesystem\Mime', + 'kirby\toolkit\query' => 'Kirby\Query\Query', +]; diff --git a/kirby/config/api/authentication.php b/kirby/config/api/authentication.php new file mode 100644 index 0000000..15f3bbd --- /dev/null +++ b/kirby/config/api/authentication.php @@ -0,0 +1,27 @@ +kirby()->auth(); + $allowImpersonation = $this->kirby()->option('api.allowImpersonation') ?? false; + + // csrf token check + if ( + $auth->type($allowImpersonation) === 'session' && + $auth->csrf() === false + ) { + throw new AuthException('Unauthenticated'); + } + + // get user from session or basic auth + if ($user = $auth->user(null, $allowImpersonation)) { + if ($user->role()->permissions()->for('access', 'panel') === false) { + throw new AuthException(['key' => 'access.panel']); + } + + return $user; + } + + throw new AuthException('Unauthenticated'); +}; diff --git a/kirby/config/api/collections.php b/kirby/config/api/collections.php new file mode 100644 index 0000000..97b2180 --- /dev/null +++ b/kirby/config/api/collections.php @@ -0,0 +1,78 @@ + [ + 'model' => 'page', + 'type' => Pages::class, + 'view' => 'compact' + ], + + /** + * Files + */ + 'files' => [ + 'model' => 'file', + 'type' => Files::class, + ], + + /** + * Languages + */ + 'languages' => [ + 'model' => 'language', + 'type' => Languages::class, + ], + + /** + * Pages + */ + 'pages' => [ + 'model' => 'page', + 'type' => Pages::class, + 'view' => 'compact' + ], + + /** + * Roles + */ + 'roles' => [ + 'model' => 'role', + 'type' => Roles::class, + 'view' => 'compact' + ], + + /** + * Translations + */ + 'translations' => [ + 'model' => 'translation', + 'type' => Translations::class, + 'view' => 'compact' + ], + + /** + * Users + */ + 'users' => [ + 'default' => fn () => $this->users(), + 'model' => 'user', + 'type' => Users::class, + 'view' => 'compact' + ] + +]; diff --git a/kirby/config/api/models.php b/kirby/config/api/models.php new file mode 100644 index 0000000..9e6fc18 --- /dev/null +++ b/kirby/config/api/models.php @@ -0,0 +1,21 @@ + include __DIR__ . '/models/File.php', + 'FileBlueprint' => include __DIR__ . '/models/FileBlueprint.php', + 'FileVersion' => include __DIR__ . '/models/FileVersion.php', + 'Language' => include __DIR__ . '/models/Language.php', + 'License' => include __DIR__ . '/models/License.php', + 'Page' => include __DIR__ . '/models/Page.php', + 'PageBlueprint' => include __DIR__ . '/models/PageBlueprint.php', + 'Role' => include __DIR__ . '/models/Role.php', + 'Site' => include __DIR__ . '/models/Site.php', + 'SiteBlueprint' => include __DIR__ . '/models/SiteBlueprint.php', + 'System' => include __DIR__ . '/models/System.php', + 'Translation' => include __DIR__ . '/models/Translation.php', + 'User' => include __DIR__ . '/models/User.php', + 'UserBlueprint' => include __DIR__ . '/models/UserBlueprint.php', +]; diff --git a/kirby/config/api/models/File.php b/kirby/config/api/models/File.php new file mode 100644 index 0000000..b70919a --- /dev/null +++ b/kirby/config/api/models/File.php @@ -0,0 +1,119 @@ + [ + 'blueprint' => fn (File $file) => $file->blueprint(), + 'content' => fn (File $file) => Form::for($file)->values(), + 'dimensions' => fn (File $file) => $file->dimensions()->toArray(), + 'dragText' => fn (File $file) => $file->panel()->dragText(), + 'exists' => fn (File $file) => $file->exists(), + 'extension' => fn (File $file) => $file->extension(), + 'filename' => fn (File $file) => $file->filename(), + 'id' => fn (File $file) => $file->id(), + 'link' => fn (File $file) => $file->panel()->url(true), + 'mime' => fn (File $file) => $file->mime(), + 'modified' => fn (File $file) => $file->modified('c'), + 'name' => fn (File $file) => $file->name(), + 'next' => fn (File $file) => $file->next(), + 'nextWithTemplate' => function (File $file) { + $files = $file->templateSiblings()->sorted(); + $index = $files->indexOf($file); + + return $files->nth($index + 1); + }, + 'niceSize' => fn (File $file) => $file->niceSize(), + 'options' => fn (File $file) => $file->panel()->options(), + 'panelImage' => fn (File $file) => $file->panel()->image(), + 'panelUrl' => fn (File $file) => $file->panel()->url(true), + 'prev' => fn (File $file) => $file->prev(), + 'prevWithTemplate' => function (File $file) { + $files = $file->templateSiblings()->sorted(); + $index = $files->indexOf($file); + + return $files->nth($index - 1); + }, + 'parent' => fn (File $file) => $file->parent(), + 'parents' => fn (File $file) => $file->parents()->flip(), + 'size' => fn (File $file) => $file->size(), + 'template' => fn (File $file) => $file->template(), + 'thumbs' => function ($file) { + if ($file->isResizable() === false) { + return null; + } + + return [ + 'tiny' => $file->resize(128)->url(), + 'small' => $file->resize(256)->url(), + 'medium' => $file->resize(512)->url(), + 'large' => $file->resize(768)->url(), + 'huge' => $file->resize(1024)->url(), + ]; + }, + 'type' => fn (File $file) => $file->type(), + 'url' => fn (File $file) => $file->url(), + 'uuid' => fn (File $file) => $file->uuid()?->toString() + ], + 'type' => File::class, + 'views' => [ + 'default' => [ + 'content', + 'dimensions', + 'exists', + 'extension', + 'filename', + 'id', + 'link', + 'mime', + 'modified', + 'name', + 'next' => 'compact', + 'niceSize', + 'parent' => 'compact', + 'options', + 'prev' => 'compact', + 'size', + 'template', + 'type', + 'url', + 'uuid' + ], + 'compact' => [ + 'filename', + 'id', + 'link', + 'type', + 'url', + 'uuid' + ], + 'panel' => [ + 'blueprint', + 'content', + 'dimensions', + 'extension', + 'filename', + 'id', + 'link', + 'mime', + 'modified', + 'name', + 'nextWithTemplate' => 'compact', + 'niceSize', + 'options', + 'panelIcon', + 'panelImage', + 'parent' => 'compact', + 'parents' => ['id', 'slug', 'title'], + 'prevWithTemplate' => 'compact', + 'template', + 'type', + 'url', + 'uuid' + ] + ], +]; diff --git a/kirby/config/api/models/FileBlueprint.php b/kirby/config/api/models/FileBlueprint.php new file mode 100644 index 0000000..f255c14 --- /dev/null +++ b/kirby/config/api/models/FileBlueprint.php @@ -0,0 +1,17 @@ + [ + 'name' => fn (FileBlueprint $blueprint) => $blueprint->name(), + 'options' => fn (FileBlueprint $blueprint) => $blueprint->options(), + 'tabs' => fn (FileBlueprint $blueprint) => $blueprint->tabs(), + 'title' => fn (FileBlueprint $blueprint) => $blueprint->title(), + ], + 'type' => FileBlueprint::class, + 'views' => [], +]; diff --git a/kirby/config/api/models/FileVersion.php b/kirby/config/api/models/FileVersion.php new file mode 100644 index 0000000..063e10b --- /dev/null +++ b/kirby/config/api/models/FileVersion.php @@ -0,0 +1,59 @@ + [ + 'dimensions' => fn (FileVersion $file) => $file->dimensions()->toArray(), + 'exists' => fn (FileVersion $file) => $file->exists(), + 'extension' => fn (FileVersion $file) => $file->extension(), + 'filename' => fn (FileVersion $file) => $file->filename(), + 'id' => fn (FileVersion $file) => $file->id(), + 'mime' => fn (FileVersion $file) => $file->mime(), + 'modified' => fn (FileVersion $file) => $file->modified('c'), + 'name' => fn (FileVersion $file) => $file->name(), + 'niceSize' => fn (FileVersion $file) => $file->niceSize(), + 'size' => fn (FileVersion $file) => $file->size(), + 'type' => fn (FileVersion $file) => $file->type(), + 'url' => fn (FileVersion $file) => $file->url(), + ], + 'type' => FileVersion::class, + 'views' => [ + 'default' => [ + 'dimensions', + 'exists', + 'extension', + 'filename', + 'id', + 'mime', + 'modified', + 'name', + 'niceSize', + 'size', + 'type', + 'url' + ], + 'compact' => [ + 'filename', + 'id', + 'type', + 'url', + ], + 'panel' => [ + 'dimensions', + 'extension', + 'filename', + 'id', + 'mime', + 'modified', + 'name', + 'niceSize', + 'template', + 'type', + 'url' + ] + ], +]; diff --git a/kirby/config/api/models/Language.php b/kirby/config/api/models/Language.php new file mode 100644 index 0000000..fcebad1 --- /dev/null +++ b/kirby/config/api/models/Language.php @@ -0,0 +1,30 @@ + [ + 'code' => fn (Language $language) => $language->code(), + 'default' => fn (Language $language) => $language->isDefault(), + 'direction' => fn (Language $language) => $language->direction(), + 'locale' => fn (Language $language) => $language->locale(), + 'name' => fn (Language $language) => $language->name(), + 'rules' => fn (Language $language) => $language->rules(), + 'url' => fn (Language $language) => $language->url(), + ], + 'type' => Language::class, + 'views' => [ + 'default' => [ + 'code', + 'default', + 'direction', + 'locale', + 'name', + 'rules', + 'url' + ] + ] +]; diff --git a/kirby/config/api/models/License.php b/kirby/config/api/models/License.php new file mode 100644 index 0000000..3a56556 --- /dev/null +++ b/kirby/config/api/models/License.php @@ -0,0 +1,17 @@ + [ + 'status' => fn (License $license) => $license->status()->value(), + 'code' => function (License $license) { + return $this->kirby()->user()->isAdmin() ? $license->code() : $license->code(true); + }, + 'type' => fn (License $license) => $license->type()->label(), + ], + 'type' => License::class, +]; diff --git a/kirby/config/api/models/Page.php b/kirby/config/api/models/Page.php new file mode 100644 index 0000000..4ff6dbc --- /dev/null +++ b/kirby/config/api/models/Page.php @@ -0,0 +1,96 @@ + [ + 'blueprint' => fn (Page $page) => $page->blueprint(), + 'blueprints' => fn (Page $page) => $page->blueprints(), + 'children' => fn (Page $page) => $page->children(), + 'content' => fn (Page $page) => Form::for($page)->values(), + 'drafts' => fn (Page $page) => $page->drafts(), + 'errors' => fn (Page $page) => $page->errors(), + 'files' => fn (Page $page) => $page->files()->sorted(), + 'hasChildren' => fn (Page $page) => $page->hasChildren(), + 'hasDrafts' => fn (Page $page) => $page->hasDrafts(), + 'hasFiles' => fn (Page $page) => $page->hasFiles(), + 'id' => fn (Page $page) => $page->id(), + 'isSortable' => fn (Page $page) => $page->isSortable(), + 'num' => fn (Page $page) => $page->num(), + 'options' => fn (Page $page) => $page->panel()->options(['preview']), + 'panelImage' => fn (Page $page) => $page->panel()->image(), + 'parent' => fn (Page $page) => $page->parent(), + 'parents' => fn (Page $page) => $page->parents()->flip(), + 'previewUrl' => fn (Page $page) => $page->previewUrl(), + 'siblings' => function (Page $page) { + if ($page->isDraft() === true) { + return $page->parentModel()->children()->not($page); + } + + return $page->siblings(); + }, + 'slug' => fn (Page $page) => $page->slug(), + 'status' => fn (Page $page) => $page->status(), + 'template' => fn (Page $page) => $page->intendedTemplate()->name(), + 'title' => fn (Page $page) => $page->title()->value(), + 'url' => fn (Page $page) => $page->url(), + 'uuid' => fn (Page $page) => $page->uuid()?->toString() + ], + 'type' => Page::class, + 'views' => [ + 'compact' => [ + 'id', + 'title', + 'url', + 'num', + 'uuid' + ], + 'default' => [ + 'content', + 'id', + 'status', + 'num', + 'options', + 'parent' => 'compact', + 'slug', + 'template', + 'title', + 'url', + 'uuid' + ], + 'panel' => [ + 'id', + 'blueprint', + 'content', + 'status', + 'options', + 'next' => ['id', 'slug', 'title'], + 'parents' => ['id', 'slug', 'title'], + 'prev' => ['id', 'slug', 'title'], + 'previewUrl', + 'slug', + 'title', + 'url', + 'uuid' + ], + 'selector' => [ + 'id', + 'title', + 'parent' => [ + 'id', + 'title' + ], + 'children' => [ + 'hasChildren', + 'id', + 'panelIcon', + 'panelImage', + 'title', + ], + ] + ], +]; diff --git a/kirby/config/api/models/PageBlueprint.php b/kirby/config/api/models/PageBlueprint.php new file mode 100644 index 0000000..e993b91 --- /dev/null +++ b/kirby/config/api/models/PageBlueprint.php @@ -0,0 +1,20 @@ + [ + 'name' => fn (PageBlueprint $blueprint) => $blueprint->name(), + 'num' => fn (PageBlueprint $blueprint) => $blueprint->num(), + 'options' => fn (PageBlueprint $blueprint) => $blueprint->options(), + 'preview' => fn (PageBlueprint $blueprint) => $blueprint->preview(), + 'status' => fn (PageBlueprint $blueprint) => $blueprint->status(), + 'tabs' => fn (PageBlueprint $blueprint) => $blueprint->tabs(), + 'title' => fn (PageBlueprint $blueprint) => $blueprint->title(), + ], + 'type' => PageBlueprint::class, + 'views' => [], +]; diff --git a/kirby/config/api/models/Role.php b/kirby/config/api/models/Role.php new file mode 100644 index 0000000..3c2b468 --- /dev/null +++ b/kirby/config/api/models/Role.php @@ -0,0 +1,23 @@ + [ + 'description' => fn (Role $role) => $role->description(), + 'name' => fn (Role $role) => $role->name(), + 'permissions' => fn (Role $role) => $role->permissions()->toArray(), + 'title' => fn (Role $role) => $role->title(), + ], + 'type' => Role::class, + 'views' => [ + 'compact' => [ + 'description', + 'name', + 'title' + ] + ] +]; diff --git a/kirby/config/api/models/Site.php b/kirby/config/api/models/Site.php new file mode 100644 index 0000000..81cab62 --- /dev/null +++ b/kirby/config/api/models/Site.php @@ -0,0 +1,52 @@ + fn () => $this->site(), + 'fields' => [ + 'blueprint' => fn (Site $site) => $site->blueprint(), + 'children' => fn (Site $site) => $site->children(), + 'content' => fn (Site $site) => Form::for($site)->values(), + 'drafts' => fn (Site $site) => $site->drafts(), + 'files' => fn (Site $site) => $site->files()->sorted(), + 'options' => fn (Site $site) => $site->permissions()->toArray(), + 'previewUrl' => fn (Site $site) => $site->previewUrl(), + 'title' => fn (Site $site) => $site->title()->value(), + 'url' => fn (Site $site) => $site->url(), + ], + 'type' => Site::class, + 'views' => [ + 'compact' => [ + 'title', + 'url' + ], + 'default' => [ + 'content', + 'options', + 'title', + 'url' + ], + 'panel' => [ + 'title', + 'blueprint', + 'content', + 'options', + 'previewUrl', + 'url' + ], + 'selector' => [ + 'title', + 'children' => [ + 'id', + 'title', + 'panelIcon', + 'hasChildren' + ], + ] + ] +]; diff --git a/kirby/config/api/models/SiteBlueprint.php b/kirby/config/api/models/SiteBlueprint.php new file mode 100644 index 0000000..69aad5b --- /dev/null +++ b/kirby/config/api/models/SiteBlueprint.php @@ -0,0 +1,17 @@ + [ + 'name' => fn (SiteBlueprint $blueprint) => $blueprint->name(), + 'options' => fn (SiteBlueprint $blueprint) => $blueprint->options(), + 'tabs' => fn (SiteBlueprint $blueprint) => $blueprint->tabs(), + 'title' => fn (SiteBlueprint $blueprint) => $blueprint->title(), + ], + 'type' => SiteBlueprint::class, + 'views' => [], +]; diff --git a/kirby/config/api/models/System.php b/kirby/config/api/models/System.php new file mode 100644 index 0000000..4627226 --- /dev/null +++ b/kirby/config/api/models/System.php @@ -0,0 +1,91 @@ + [ + 'ascii' => fn () => Str::$ascii, + 'authStatus' => fn () => $this->kirby()->auth()->status()->toArray(), + 'defaultLanguage' => fn () => $this->kirby()->panelLanguage(), + 'isOk' => fn (System $system) => $system->isOk(), + 'isInstallable' => fn (System $system) => $system->isInstallable(), + 'isInstalled' => fn (System $system) => $system->isInstalled(), + 'isLocal' => fn (System $system) => $system->isLocal(), + 'multilang' => fn () => $this->kirby()->option('languages', false) !== false, + 'languages' => fn () => $this->kirby()->languages(), + 'license' => fn (System $system) => $system->license(), + 'locales' => function () { + $locales = []; + $translations = $this->kirby()->translations(); + foreach ($translations as $translation) { + $locales[$translation->code()] = $translation->locale(); + } + return $locales; + }, + 'loginMethods' => fn (System $system) => array_keys($system->loginMethods()), + 'requirements' => fn (System $system) => $system->toArray(), + 'site' => fn (System $system) => $system->title(), + 'slugs' => fn () => Str::$language, + 'title' => fn () => $this->site()->title()->value(), + 'translation' => function () { + $code = $this->user()?->language() ?? + $this->kirby()->panelLanguage(); + + return + $this->kirby()->translation($code) ?? + $this->kirby()->translation('en'); + }, + 'kirbytext' => fn () => $this->kirby()->option('panel.kirbytext') ?? true, + 'user' => fn () => $this->user(), + 'version' => function () { + if ($this->user()?->role()->permissions()->for('access', 'system') === true) { + return $this->kirby()->version(); + } + + return null; + } + ], + 'type' => System::class, + 'views' => [ + 'login' => [ + 'authStatus', + 'isOk', + 'isInstallable', + 'isInstalled', + 'loginMethods', + 'title', + 'translation' + ], + 'troubleshooting' => [ + 'isOk', + 'isInstallable', + 'isInstalled', + 'title', + 'translation', + 'requirements' + ], + 'panel' => [ + 'ascii', + 'defaultLanguage', + 'isOk', + 'isInstalled', + 'isLocal', + 'kirbytext', + 'languages', + 'license', + 'locales', + 'multilang', + 'requirements', + 'site', + 'slugs', + 'title', + 'translation', + 'user' => 'auth', + 'version' + ] + ], +]; diff --git a/kirby/config/api/models/Translation.php b/kirby/config/api/models/Translation.php new file mode 100644 index 0000000..94f9c02 --- /dev/null +++ b/kirby/config/api/models/Translation.php @@ -0,0 +1,24 @@ + [ + 'author' => fn (Translation $translation) => $translation->author(), + 'data' => fn (Translation $translation) => $translation->dataWithFallback(), + 'direction' => fn (Translation $translation) => $translation->direction(), + 'id' => fn (Translation $translation) => $translation->id(), + 'name' => fn (Translation $translation) => $translation->name(), + ], + 'type' => Translation::class, + 'views' => [ + 'compact' => [ + 'direction', + 'id', + 'name' + ] + ] +]; diff --git a/kirby/config/api/models/User.php b/kirby/config/api/models/User.php new file mode 100644 index 0000000..0da32e9 --- /dev/null +++ b/kirby/config/api/models/User.php @@ -0,0 +1,81 @@ + fn () => $this->user(), + 'fields' => [ + 'avatar' => fn (User $user) => $user->avatar()?->crop(512), + 'blueprint' => fn (User $user) => $user->blueprint(), + 'content' => fn (User $user) => Form::for($user)->values(), + 'email' => fn (User $user) => $user->email(), + 'files' => fn (User $user) => $user->files()->sorted(), + 'id' => fn (User $user) => $user->id(), + 'language' => fn (User $user) => $user->language(), + 'name' => fn (User $user) => $user->name()->value(), + 'next' => fn (User $user) => $user->next(), + 'options' => fn (User $user) => $user->panel()->options(), + 'panelImage' => fn (User $user) => $user->panel()->image(), + 'permissions' => fn (User $user) => $user->role()->permissions()->toArray(), + 'prev' => fn (User $user) => $user->prev(), + 'role' => fn (User $user) => $user->role(), + 'roles' => fn (User $user) => $user->roles(), + 'username' => fn (User $user) => $user->username(), + 'uuid' => fn (User $user) => $user->uuid()?->toString() + ], + 'type' => User::class, + 'views' => [ + 'default' => [ + 'avatar', + 'content', + 'email', + 'id', + 'language', + 'name', + 'next' => 'compact', + 'options', + 'prev' => 'compact', + 'role', + 'username', + 'uuid' + ], + 'compact' => [ + 'avatar' => 'compact', + 'id', + 'email', + 'language', + 'name', + 'role' => 'compact', + 'username', + 'uuid' + ], + 'auth' => [ + 'avatar' => 'compact', + 'permissions', + 'email', + 'id', + 'name', + 'role', + 'language' + ], + 'panel' => [ + 'avatar' => 'compact', + 'blueprint', + 'content', + 'email', + 'id', + 'language', + 'name', + 'next' => ['id', 'name'], + 'options', + 'prev' => ['id', 'name'], + 'role', + 'username', + 'uuid' + ], + ] +]; diff --git a/kirby/config/api/models/UserBlueprint.php b/kirby/config/api/models/UserBlueprint.php new file mode 100644 index 0000000..2fa83e9 --- /dev/null +++ b/kirby/config/api/models/UserBlueprint.php @@ -0,0 +1,17 @@ + [ + 'name' => fn (UserBlueprint $blueprint) => $blueprint->name(), + 'options' => fn (UserBlueprint $blueprint) => $blueprint->options(), + 'tabs' => fn (UserBlueprint $blueprint) => $blueprint->tabs(), + 'title' => fn (UserBlueprint $blueprint) => $blueprint->title(), + ], + 'type' => UserBlueprint::class, + 'views' => [], +]; diff --git a/kirby/config/api/routes.php b/kirby/config/api/routes.php new file mode 100644 index 0000000..aca9e79 --- /dev/null +++ b/kirby/config/api/routes.php @@ -0,0 +1,29 @@ +option('languages', false) !== false) { + $routes = array_merge( + $routes, + include __DIR__ . '/routes/languages.php' + ); + } + + return $routes; +}; diff --git a/kirby/config/api/routes/auth.php b/kirby/config/api/routes/auth.php new file mode 100644 index 0000000..97b81a1 --- /dev/null +++ b/kirby/config/api/routes/auth.php @@ -0,0 +1,116 @@ + 'auth', + 'method' => 'GET', + 'action' => function () { + if ($user = $this->kirby()->auth()->user()) { + return $this->resolve($user)->view('auth'); + } + + throw new NotFoundException('The user cannot be found'); + } + ], + [ + 'pattern' => 'auth/code', + 'method' => 'POST', + 'auth' => false, + 'action' => function () { + $auth = $this->kirby()->auth(); + + // csrf token check + if ($auth->type() === 'session' && $auth->csrf() === false) { + throw new InvalidArgumentException('Invalid CSRF token'); + } + + $user = $auth->verifyChallenge($this->requestBody('code')); + + return [ + 'code' => 200, + 'status' => 'ok', + 'user' => $this->resolve($user)->view('auth')->toArray() + ]; + } + ], + [ + 'pattern' => 'auth/login', + 'method' => 'POST', + 'auth' => false, + 'action' => function () { + $auth = $this->kirby()->auth(); + $methods = $this->kirby()->system()->loginMethods(); + + // csrf token check + if ($auth->type() === 'session' && $auth->csrf() === false) { + throw new InvalidArgumentException('Invalid CSRF token'); + } + + $email = $this->requestBody('email'); + $long = $this->requestBody('long'); + $password = $this->requestBody('password'); + + if ($password) { + if (isset($methods['password']) !== true) { + throw new InvalidArgumentException('Login with password is not enabled'); + } + + if ( + isset($methods['password']['2fa']) === true && + $methods['password']['2fa'] === true + ) { + $status = $auth->login2fa($email, $password, $long); + } else { + $user = $auth->login($email, $password, $long); + } + } else { + $mode = match (true) { + isset($methods['code']) => 'login', + isset($methods['password-reset']) => 'password-reset', + default => throw new InvalidArgumentException('Login without password is not enabled') + }; + + $status = $auth->createChallenge($email, $long, $mode); + } + + if (isset($user)) { + return [ + 'code' => 200, + 'status' => 'ok', + 'user' => $this->resolve($user)->view('auth')->toArray() + ]; + } + + return [ + 'code' => 200, + 'status' => 'ok', + 'challenge' => $status->challenge() + ]; + } + ], + [ + 'pattern' => 'auth/logout', + 'method' => 'POST', + 'auth' => false, + 'action' => function () { + $this->kirby()->auth()->logout(); + return true; + } + ], + [ + 'pattern' => 'auth/ping', + 'method' => 'POST', + 'auth' => false, + 'action' => function () { + // refresh the session timeout + $this->kirby()->session(); + return true; + } + ], +]; diff --git a/kirby/config/api/routes/files.php b/kirby/config/api/routes/files.php new file mode 100644 index 0000000..7cf1073 --- /dev/null +++ b/kirby/config/api/routes/files.php @@ -0,0 +1,148 @@ + $filePattern . '/fields/(:any)/(:all?)', + 'method' => 'ALL', + 'action' => function (string $parent, string $filename, string $fieldName, string|null $path = null) { + if ($file = $this->file($parent, $filename)) { + return $this->fieldApi($file, $fieldName, $path); + } + } + ], + [ + 'pattern' => $filePattern . '/sections/(:any)', + 'method' => 'GET', + 'action' => function (string $path, string $filename, string $sectionName) { + return $this->file($path, $filename)->blueprint()->section($sectionName)?->toResponse(); + } + ], + [ + 'pattern' => $filePattern . '/sections/(:any)/(:all?)', + 'method' => 'ALL', + 'action' => function (string $parent, string $filename, string $sectionName, string|null $path = null) { + if ($file = $this->file($parent, $filename)) { + return $this->sectionApi($file, $sectionName, $path); + } + } + ], + [ + 'pattern' => $parentPattern, + 'method' => 'GET', + 'action' => function (string $path) { + return $this->files($path)->sorted(); + } + ], + [ + 'pattern' => $parentPattern, + 'method' => 'POST', + 'action' => function (string $path) { + // move_uploaded_file() not working with unit test + // @codeCoverageIgnoreStart + return $this->upload(function ($source, $filename) use ($path) { + $props = [ + 'content' => [ + 'sort' => $this->requestBody('sort') + ], + 'source' => $source, + 'template' => $this->requestBody('template'), + 'filename' => $filename + ]; + + // move the source file from the temp dir + return $this->parent($path)->createFile($props, true); + }); + // @codeCoverageIgnoreEnd + } + ], + [ + 'pattern' => $parentPattern . '/search', + 'method' => 'GET|POST', + 'action' => function (string $path) { + $files = $this->files($path); + + if ($this->requestMethod() === 'GET') { + return $files->search($this->requestQuery('q')); + } + + return $files->query($this->requestBody()); + } + ], + [ + 'pattern' => $parentPattern . '/sort', + 'method' => 'PATCH', + 'action' => function (string $path) { + return $this->files($path)->changeSort( + $this->requestBody('files'), + $this->requestBody('index') + ); + } + ], + [ + 'pattern' => $filePattern, + 'method' => 'GET', + 'action' => function (string $path, string $filename) { + return $this->file($path, $filename); + } + ], + [ + 'pattern' => $filePattern, + 'method' => 'PATCH', + 'action' => function (string $path, string $filename) { + return $this->file($path, $filename)->update( + $this->requestBody(), + $this->language(), + true + ); + } + ], + [ + 'pattern' => $filePattern, + 'method' => 'POST', + 'action' => function (string $path, string $filename) { + // move the source file from the temp dir + return $this->upload( + fn ($source) => $this->file($path, $filename)->replace($source, true) + ); + } + ], + [ + 'pattern' => $filePattern, + 'method' => 'DELETE', + 'action' => function (string $path, string $filename) { + return $this->file($path, $filename)->delete(); + } + ], + [ + 'pattern' => $filePattern . '/name', + 'method' => 'PATCH', + 'action' => function (string $path, string $filename) { + return $this->file($path, $filename)->changeName($this->requestBody('name')); + } + ], + [ + 'pattern' => $parentPattern . '/search', + 'method' => 'GET|POST', + 'action' => function () { + $files = $this + ->site() + ->index(true) + ->filter('isListable', true) + ->files() + ->filter('isListable', true); + + if ($this->requestMethod() === 'GET') { + return $files->search($this->requestQuery('q')); + } + + return $files->query($this->requestBody()); + } + ], +]; diff --git a/kirby/config/api/routes/kql.php b/kirby/config/api/routes/kql.php new file mode 100644 index 0000000..68710ec --- /dev/null +++ b/kirby/config/api/routes/kql.php @@ -0,0 +1,35 @@ + function ($kirby) { + return [ + [ + 'pattern' => 'query', + 'method' => 'POST|GET', + 'auth' => $kirby->option('kql.auth') !== false, + 'action' => function () use ($kirby) { + $kql = '\Kirby\Kql\Kql'; + + if (class_exists($kql) === false) { + return [ + 'code' => 500, + 'status' => 'error', + 'message' => 'KQL plugin is not installed', + ]; + } + + $input = $kirby->request()->get(); + $result = $kql::run($input); + + return [ + 'code' => 200, + 'result' => $result, + 'status' => 'ok', + ]; + } + ] + ]; + } +]; +// @codeCoverageIgnoreEnd diff --git a/kirby/config/api/routes/languages.php b/kirby/config/api/routes/languages.php new file mode 100644 index 0000000..e2d4f6b --- /dev/null +++ b/kirby/config/api/routes/languages.php @@ -0,0 +1,42 @@ + 'languages', + 'method' => 'GET', + 'action' => function () { + return $this->kirby()->languages(); + } + ], + [ + 'pattern' => 'languages', + 'method' => 'POST', + 'action' => function () { + return $this->kirby()->languages()->create($this->requestBody()); + } + ], + [ + 'pattern' => 'languages/(:any)', + 'method' => 'GET', + 'action' => function (string $code) { + return $this->kirby()->languages()->find($code); + } + ], + [ + 'pattern' => 'languages/(:any)', + 'method' => 'PATCH', + 'action' => function (string $code) { + return $this->kirby()->languages()->find($code)?->update($this->requestBody()); + } + ], + [ + 'pattern' => 'languages/(:any)', + 'method' => 'DELETE', + 'action' => function (string $code) { + return $this->kirby()->languages()->find($code)?->delete(); + } + ] +]; diff --git a/kirby/config/api/routes/lock.php b/kirby/config/api/routes/lock.php new file mode 100644 index 0000000..c7095d9 --- /dev/null +++ b/kirby/config/api/routes/lock.php @@ -0,0 +1,56 @@ + '(:all)/lock', + 'method' => 'GET', + 'action' => function (string $path) { + return [ + 'lock' => $this->parent($path)->lock()?->toArray() ?? false + ]; + } + ], + [ + 'pattern' => '(:all)/lock', + 'method' => 'PATCH', + 'action' => function (string $path) { + return $this->parent($path)->lock()?->create(); + } + ], + [ + 'pattern' => '(:all)/lock', + 'method' => 'DELETE', + 'action' => function (string $path) { + try { + return $this->parent($path)->lock()?->remove(); + } catch (NotFoundException) { + return true; + } + } + ], + [ + 'pattern' => '(:all)/unlock', + 'method' => 'PATCH', + 'action' => function (string $path) { + return $this->parent($path)->lock()?->unlock(); + } + ], + [ + 'pattern' => '(:all)/unlock', + 'method' => 'DELETE', + 'action' => function (string $path) { + try { + return $this->parent($path)->lock()?->resolve(); + } catch (NotFoundException) { + return true; + } + } + ], +]; diff --git a/kirby/config/api/routes/pages.php b/kirby/config/api/routes/pages.php new file mode 100644 index 0000000..6de9c1a --- /dev/null +++ b/kirby/config/api/routes/pages.php @@ -0,0 +1,129 @@ + 'pages/(:any)', + 'method' => 'GET', + 'action' => function (string $id) { + return $this->page($id); + } + ], + [ + 'pattern' => 'pages/(:any)', + 'method' => 'PATCH', + 'action' => function (string $id) { + return $this->page($id)->update($this->requestBody(), $this->language(), true); + } + ], + [ + 'pattern' => 'pages/(:any)', + 'method' => 'DELETE', + 'action' => function (string $id) { + return $this->page($id)->delete($this->requestBody('force', false)); + } + ], + [ + 'pattern' => 'pages/(:any)/blueprint', + 'method' => 'GET', + 'action' => function (string $id) { + return $this->page($id)->blueprint(); + } + ], + [ + 'pattern' => 'pages/(:any)/blueprints', + 'method' => 'GET', + 'action' => function (string $id) { + return $this->page($id)->blueprints($this->requestQuery('section')); + } + ], + [ + 'pattern' => 'pages/(:any)/children', + 'method' => 'GET', + 'action' => function (string $id) { + return $this->pages($id, $this->requestQuery('status')); + } + ], + [ + 'pattern' => 'pages/(:any)/children', + 'method' => 'POST', + 'action' => function (string $id) { + return $this->page($id)->createChild($this->requestBody()); + } + ], + [ + 'pattern' => 'pages/(:any)/children/search', + 'method' => 'GET|POST', + 'action' => function (string $id) { + return $this->searchPages($id); + } + ], + [ + 'pattern' => 'pages/(:any)/duplicate', + 'method' => 'POST', + 'action' => function (string $id) { + return $this->page($id)->duplicate($this->requestBody('slug'), [ + 'children' => $this->requestBody('children'), + 'files' => $this->requestBody('files'), + ]); + } + ], + [ + 'pattern' => 'pages/(:any)/slug', + 'method' => 'PATCH', + 'action' => function (string $id) { + return $this->page($id)->changeSlug($this->requestBody('slug')); + } + ], + [ + 'pattern' => 'pages/(:any)/status', + 'method' => 'PATCH', + 'action' => function (string $id) { + return $this->page($id)->changeStatus($this->requestBody('status'), $this->requestBody('position')); + } + ], + [ + 'pattern' => 'pages/(:any)/template', + 'method' => 'PATCH', + 'action' => function (string $id) { + return $this->page($id)->changeTemplate($this->requestBody('template')); + } + ], + [ + 'pattern' => 'pages/(:any)/title', + 'method' => 'PATCH', + 'action' => function (string $id) { + return $this->page($id)->changeTitle($this->requestBody('title')); + } + ], + [ + 'pattern' => 'pages/(:any)/fields/(:any)/(:all?)', + 'method' => 'ALL', + 'action' => function (string $id, string $fieldName, string|null $path = null) { + if ($page = $this->page($id)) { + return $this->fieldApi($page, $fieldName, $path); + } + } + ], + [ + 'pattern' => 'pages/(:any)/sections/(:any)', + 'method' => 'GET', + 'action' => function (string $id, string $sectionName) { + return $this->page($id)->blueprint()->section($sectionName)?->toResponse(); + } + ], + [ + 'pattern' => 'pages/(:any)/sections/(:any)/(:all?)', + 'method' => 'ALL', + 'action' => function (string $id, string $sectionName, string|null $path = null) { + if ($page = $this->page($id)) { + return $this->sectionApi($page, $sectionName, $path); + } + } + ], + // @codeCoverageIgnoreEnd +]; diff --git a/kirby/config/api/routes/roles.php b/kirby/config/api/routes/roles.php new file mode 100644 index 0000000..56ecfea --- /dev/null +++ b/kirby/config/api/routes/roles.php @@ -0,0 +1,27 @@ + 'roles', + 'method' => 'GET', + 'action' => function () { + $kirby = $this->kirby(); + + return match ($kirby->request()->get('canBe')) { + 'changed' => $kirby->roles()->canBeChanged(), + 'created' => $kirby->roles()->canBeCreated(), + default => $kirby->roles() + }; + } + ], + [ + 'pattern' => 'roles/(:any)', + 'method' => 'GET', + 'action' => function (string $name) { + return $this->kirby()->roles()->find($name); + } + ] +]; diff --git a/kirby/config/api/routes/site.php b/kirby/config/api/routes/site.php new file mode 100644 index 0000000..abc2ac5 --- /dev/null +++ b/kirby/config/api/routes/site.php @@ -0,0 +1,109 @@ + 'site', + 'action' => function () { + return $this->site(); + } + ], + [ + 'pattern' => 'site', + 'method' => 'PATCH', + 'action' => function () { + return $this->site()->update($this->requestBody(), $this->language(), true); + } + ], + [ + 'pattern' => 'site/children', + 'method' => 'GET', + 'action' => function () { + return $this->pages(null, $this->requestQuery('status')); + } + ], + [ + 'pattern' => 'site/children', + 'method' => 'POST', + 'action' => function () { + return $this->site()->createChild($this->requestBody()); + } + ], + [ + 'pattern' => 'site/children/search', + 'method' => 'GET|POST', + 'action' => function () { + return $this->searchPages(); + } + ], + [ + 'pattern' => 'site/blueprint', + 'method' => 'GET', + 'action' => function () { + return $this->site()->blueprint(); + } + ], + [ + 'pattern' => 'site/blueprints', + 'method' => 'GET', + 'action' => function () { + return $this->site()->blueprints($this->requestQuery('section')); + } + ], + [ + 'pattern' => 'site/find', + 'method' => 'POST', + 'action' => function () { + return $this->site()->find(false, ...$this->requestBody()); + } + ], + [ + 'pattern' => 'site/title', + 'method' => 'PATCH', + 'action' => function () { + return $this->site()->changeTitle($this->requestBody('title')); + } + ], + [ + 'pattern' => 'site/search', + 'method' => 'GET|POST', + 'action' => function () { + $pages = $this + ->site() + ->index(true) + ->filter('isListable', true); + + if ($this->requestMethod() === 'GET') { + return $pages->search($this->requestQuery('q')); + } + + return $pages->query($this->requestBody()); + } + ], + [ + 'pattern' => 'site/fields/(:any)/(:all?)', + 'method' => 'ALL', + 'action' => function (string $fieldName, string|null $path = null) { + return $this->fieldApi($this->site(), $fieldName, $path); + } + ], + [ + 'pattern' => 'site/sections/(:any)', + 'method' => 'GET', + 'action' => function (string $sectionName) { + return $this->site()->blueprint()->section($sectionName)?->toResponse(); + } + ], + [ + 'pattern' => 'site/sections/(:any)/(:all?)', + 'method' => 'ALL', + 'action' => function (string $sectionName, string|null $path = null) { + return $this->sectionApi($this->site(), $sectionName, $path); + } + ], + // @codeCoverageIgnoreEnd +]; diff --git a/kirby/config/api/routes/system.php b/kirby/config/api/routes/system.php new file mode 100644 index 0000000..103e826 --- /dev/null +++ b/kirby/config/api/routes/system.php @@ -0,0 +1,78 @@ + 'system', + 'method' => 'GET', + 'auth' => false, + 'action' => function () { + $system = $this->kirby()->system(); + + if ($this->kirby()->user()) { + return $system; + } + + $info = match ($system->isOk()) { + true => $this->resolve($system)->view('login')->toArray(), + false => $this->resolve($system)->view('troubleshooting')->toArray() + }; + + return [ + 'status' => 'ok', + 'data' => $info, + 'type' => 'model' + ]; + } + ], + [ + 'pattern' => 'system/register', + 'method' => 'POST', + 'action' => function () { + return $this->kirby()->system()->register($this->requestBody('license'), $this->requestBody('email')); + } + ], + [ + 'pattern' => 'system/install', + 'method' => 'POST', + 'auth' => false, + 'action' => function () { + $system = $this->kirby()->system(); + $auth = $this->kirby()->auth(); + + // csrf token check + if ($auth->type() === 'session' && $auth->csrf() === false) { + throw new InvalidArgumentException('Invalid CSRF token'); + } + + if ($system->isOk() === false) { + throw new Exception('The server is not setup correctly'); + } + + if ($system->isInstallable() === false) { + throw new Exception('The Panel cannot be installed'); + } + + if ($system->isInstalled() === true) { + throw new Exception('The Panel is already installed'); + } + + // create the first user + $user = $this->users()->create($this->requestBody()); + $token = $user->login($this->requestBody('password')); + + return [ + 'status' => 'ok', + 'token' => $token, + 'user' => $this->resolve($user)->view('auth')->toArray() + ]; + } + ] + +]; diff --git a/kirby/config/api/routes/translations.php b/kirby/config/api/routes/translations.php new file mode 100644 index 0000000..2d949c5 --- /dev/null +++ b/kirby/config/api/routes/translations.php @@ -0,0 +1,24 @@ + 'translations', + 'method' => 'GET', + 'auth' => false, + 'action' => function () { + return $this->kirby()->translations(); + } + ], + [ + 'pattern' => 'translations/(:any)', + 'method' => 'GET', + 'auth' => false, + 'action' => function (string $code) { + return $this->kirby()->translations()->find($code); + } + ] + +]; diff --git a/kirby/config/api/routes/users.php b/kirby/config/api/routes/users.php new file mode 100644 index 0000000..88658d8 --- /dev/null +++ b/kirby/config/api/routes/users.php @@ -0,0 +1,242 @@ + 'users', + 'method' => 'GET', + 'action' => function () { + return $this->users()->sort('username', 'asc', 'email', 'asc'); + } + ], + [ + 'pattern' => 'users', + 'method' => 'POST', + 'action' => function () { + return $this->users()->create($this->requestBody()); + } + ], + [ + 'pattern' => 'users/search', + 'method' => 'GET|POST', + 'action' => function () { + if ($this->requestMethod() === 'GET') { + return $this->users()->search($this->requestQuery('q')); + } + + return $this->users()->query($this->requestBody()); + } + ], + [ + 'pattern' => [ + '(account)', + 'users/(:any)', + ], + 'method' => 'GET', + 'action' => function (string $id) { + return $this->user($id); + } + ], + [ + 'pattern' => [ + '(account)', + 'users/(:any)', + ], + 'method' => 'PATCH', + 'action' => function (string $id) { + return $this->user($id)->update($this->requestBody(), $this->language(), true); + } + ], + [ + 'pattern' => [ + '(account)', + 'users/(:any)', + ], + 'method' => 'DELETE', + 'action' => function (string $id) { + return $this->user($id)->delete(); + } + ], + [ + 'pattern' => [ + '(account)/avatar', + 'users/(:any)/avatar', + ], + 'method' => 'GET', + 'action' => function (string $id) { + return $this->user($id)->avatar(); + } + ], + // @codeCoverageIgnoreStart + [ + 'pattern' => [ + '(account)/avatar', + 'users/(:any)/avatar', + ], + 'method' => 'POST', + 'action' => function (string $id) { + return $this->upload( + function ($source, $filename) use ($id) { + $type = F::type($filename); + if ($type !== 'image') { + throw new Exception([ + 'key' => 'file.type.invalid', + 'data' => compact('type') + ]); + } + + $mime = F::mime($source); + if (Str::startsWith($mime, 'image/') !== true) { + throw new Exception([ + 'key' => 'file.mime.invalid', + 'data' => compact('mime') + ]); + } + + // delete the old avatar + $this->user($id)->avatar()?->delete(); + + $props = [ + 'filename' => 'profile.' . F::extension($filename), + 'template' => 'avatar', + 'source' => $source + ]; + + // move the source file from the temp dir + return $this->user($id)->createFile($props, true); + }, + single: true + ); + } + ], + // @codeCoverageIgnoreEnd + [ + 'pattern' => [ + '(account)/avatar', + 'users/(:any)/avatar', + ], + 'method' => 'DELETE', + 'action' => function (string $id) { + return $this->user($id)->avatar()->delete(); + } + ], + [ + 'pattern' => [ + '(account)/blueprint', + 'users/(:any)/blueprint', + ], + 'method' => 'GET', + 'action' => function (string $id) { + return $this->user($id)->blueprint(); + } + ], + [ + 'pattern' => [ + '(account)/blueprints', + 'users/(:any)/blueprints', + ], + 'method' => 'GET', + 'action' => function (string $id) { + return $this->user($id)->blueprints($this->requestQuery('section')); + } + ], + [ + 'pattern' => [ + '(account)/email', + 'users/(:any)/email', + ], + 'method' => 'PATCH', + 'action' => function (string $id) { + return $this->user($id)->changeEmail($this->requestBody('email')); + } + ], + [ + 'pattern' => [ + '(account)/language', + 'users/(:any)/language', + ], + 'method' => 'PATCH', + 'action' => function (string $id) { + return $this->user($id)->changeLanguage($this->requestBody('language')); + } + ], + [ + 'pattern' => [ + '(account)/name', + 'users/(:any)/name', + ], + 'method' => 'PATCH', + 'action' => function (string $id) { + return $this->user($id)->changeName($this->requestBody('name')); + } + ], + [ + 'pattern' => [ + '(account)/password', + 'users/(:any)/password', + ], + 'method' => 'PATCH', + 'action' => function (string $id) { + return $this->user($id)->changePassword($this->requestBody('password')); + } + ], + [ + 'pattern' => [ + '(account)/role', + 'users/(:any)/role', + ], + 'method' => 'PATCH', + 'action' => function (string $id) { + return $this->user($id)->changeRole($this->requestBody('role')); + } + ], + [ + 'pattern' => [ + '(account)/roles', + 'users/(:any)/roles', + ], + 'action' => function (string $id) { + return $this->user($id)->roles(); + } + ], + [ + 'pattern' => [ + '(account)/fields/(:any)/(:all?)', + 'users/(:any)/fields/(:any)/(:all?)', + ], + 'method' => 'ALL', + 'action' => function (string $id, string $fieldName, string|null $path = null) { + return $this->fieldApi($this->user($id), $fieldName, $path); + } + ], + [ + 'pattern' => [ + '(account)/sections/(:any)', + 'users/(:any)/sections/(:any)', + ], + 'method' => 'GET', + 'action' => function (string $id, string $sectionName) { + if ($section = $this->user($id)->blueprint()->section($sectionName)) { + return $section->toResponse(); + } + } + ], + [ + 'pattern' => [ + '(account)/sections/(:any)/(:all?)', + 'users/(:any)/sections/(:any)/(:all?)', + ], + 'method' => 'ALL', + 'action' => function (string $id, string $sectionName, string|null $path = null) { + return $this->sectionApi($this->user($id), $sectionName, $path); + } + ], + // @codeCoverageIgnoreEnd +]; diff --git a/kirby/config/areas/account.php b/kirby/config/areas/account.php new file mode 100644 index 0000000..e138cab --- /dev/null +++ b/kirby/config/areas/account.php @@ -0,0 +1,15 @@ + 'account', + 'label' => I18n::translate('view.account'), + 'search' => 'users', + 'dialogs' => require __DIR__ . '/account/dialogs.php', + 'drawers' => require __DIR__ . '/account/drawers.php', + 'dropdowns' => require __DIR__ . '/account/dropdowns.php', + 'views' => require __DIR__ . '/account/views.php' + ]; +}; diff --git a/kirby/config/areas/account/dialogs.php b/kirby/config/areas/account/dialogs.php new file mode 100644 index 0000000..93635ce --- /dev/null +++ b/kirby/config/areas/account/dialogs.php @@ -0,0 +1,106 @@ + [ + 'pattern' => '(account)/changeEmail', + 'load' => $dialogs['user.changeEmail']['load'], + 'submit' => $dialogs['user.changeEmail']['submit'], + ], + + // change language + 'account.changeLanguage' => [ + 'pattern' => '(account)/changeLanguage', + 'load' => $dialogs['user.changeLanguage']['load'], + 'submit' => $dialogs['user.changeLanguage']['submit'], + ], + + // change name + 'account.changeName' => [ + 'pattern' => '(account)/changeName', + 'load' => $dialogs['user.changeName']['load'], + 'submit' => $dialogs['user.changeName']['submit'], + ], + + // change password + 'account.changePassword' => [ + 'pattern' => '(account)/changePassword', + 'load' => $dialogs['user.changePassword']['load'], + 'submit' => $dialogs['user.changePassword']['submit'], + ], + + // change role + 'account.changeRole' => [ + 'pattern' => '(account)/changeRole', + 'load' => $dialogs['user.changeRole']['load'], + 'submit' => $dialogs['user.changeRole']['submit'], + ], + + // delete + 'account.delete' => [ + 'pattern' => '(account)/delete', + 'load' => $dialogs['user.delete']['load'], + 'submit' => $dialogs['user.delete']['submit'], + ], + + // account fields dialogs + 'account.fields' => [ + 'pattern' => '(account)/files/(:any)/fields/(:any)/(:all?)', + 'load' => $dialogs['user.fields']['load'], + 'submit' => $dialogs['user.fields']['submit'] + ], + + // change file name + 'account.file.changeName' => [ + 'pattern' => '(account)/files/(:any)/changeName', + 'load' => $dialogs['user.file.changeName']['load'], + 'submit' => $dialogs['user.file.changeName']['submit'], + ], + + // change file sort + 'account.file.changeSort' => [ + 'pattern' => '(account)/files/(:any)/changeSort', + 'load' => $dialogs['user.file.changeSort']['load'], + 'submit' => $dialogs['user.file.changeSort']['submit'], + ], + + // change file template + 'account.file.changeTemplate' => [ + 'pattern' => '(account)/files/(:any)/changeTemplate', + 'load' => $dialogs['user.file.changeTemplate']['load'], + 'submit' => $dialogs['user.file.changeTemplate']['submit'], + ], + + // delete + 'account.file.delete' => [ + 'pattern' => '(account)/files/(:any)/delete', + 'load' => $dialogs['user.file.delete']['load'], + 'submit' => $dialogs['user.file.delete']['submit'], + ], + + // account file fields dialogs + 'account.file.fields' => [ + 'pattern' => '(account)/files/(:any)/fields/(:any)/(:all?)', + 'load' => $dialogs['user.file.fields']['load'], + 'submit' => $dialogs['user.file.fields']['submit'] + ], + + // account enable TOTP + 'account.totp.enable' => [ + 'pattern' => '(account)/totp/enable', + 'load' => fn () => (new UserTotpEnableDialog())->load(), + 'submit' => fn () => (new UserTotpEnableDialog())->submit() + ], + + // account disable TOTP + 'account.totp.disable' => [ + 'pattern' => '(account)/totp/disable', + 'load' => $dialogs['user.totp.disable']['load'], + 'submit' => $dialogs['user.totp.disable']['submit'] + ], +]; diff --git a/kirby/config/areas/account/drawers.php b/kirby/config/areas/account/drawers.php new file mode 100644 index 0000000..01bb0b6 --- /dev/null +++ b/kirby/config/areas/account/drawers.php @@ -0,0 +1,19 @@ + [ + 'pattern' => '(account)/files/(:any)/fields/(:any)/(:all?)', + 'load' => $drawers['user.fields']['load'], + 'submit' => $drawers['user.fields']['submit'] + ], + + // account file fields drawers + 'account.file.fields' => [ + 'pattern' => '(account)/files/(:any)/fields/(:any)/(:all?)', + 'load' => $drawers['user.file.fields']['load'], + 'submit' => $drawers['user.file.fields']['submit'] + ], +]; diff --git a/kirby/config/areas/account/dropdowns.php b/kirby/config/areas/account/dropdowns.php new file mode 100644 index 0000000..d739971 --- /dev/null +++ b/kirby/config/areas/account/dropdowns.php @@ -0,0 +1,14 @@ + [ + 'pattern' => '(account)', + 'options' => $dropdowns['user']['options'] + ], + 'account.file' => [ + 'pattern' => '(account)/files/(:any)', + 'options' => $dropdowns['user.file']['options'] + ], +]; diff --git a/kirby/config/areas/account/views.php b/kirby/config/areas/account/views.php new file mode 100644 index 0000000..933e0a4 --- /dev/null +++ b/kirby/config/areas/account/views.php @@ -0,0 +1,32 @@ + [ + 'pattern' => 'account', + 'action' => fn () => [ + 'component' => 'k-account-view', + 'props' => App::instance()->user()->panel()->props(), + ], + ], + 'account.file' => [ + 'pattern' => 'account/files/(:any)', + 'action' => function (string $filename) { + return Find::file('account', $filename)->panel()->view(); + } + ], + 'account.password' => [ + 'pattern' => 'reset-password', + 'action' => fn () => [ + 'component' => 'k-reset-password-view', + 'breadcrumb' => [ + [ + 'label' => I18n::translate('view.resetPassword') + ] + ] + ] + ] +]; diff --git a/kirby/config/areas/fields/dialogs.php b/kirby/config/areas/fields/dialogs.php new file mode 100644 index 0000000..ca14e08 --- /dev/null +++ b/kirby/config/areas/fields/dialogs.php @@ -0,0 +1,61 @@ + [ + 'load' => function ( + string $modelPath, + string $fieldName, + string|null $path = null + ) { + return Field::dialog( + model: Find::parent($modelPath), + fieldName: $fieldName, + path: $path, + method: 'GET' + ); + }, + 'submit' => function ( + string $modelPath, + string $fieldName, + string|null $path = null + ) { + return Field::dialog( + model: Find::parent($modelPath), + fieldName: $fieldName, + path: $path, + method: 'POST' + ); + } + ], + 'file' => [ + 'load' => function ( + string $modelPath, + string $filename, + string $fieldName, + string|null $path = null + ) { + return Field::dialog( + model: Find::file($modelPath, $filename), + fieldName: $fieldName, + path: $path, + method: 'GET' + ); + }, + 'submit' => function ( + string $modelPath, + string $filename, + string $fieldName, + string|null $path = null + ) { + return Field::dialog( + model: Find::file($modelPath, $filename), + fieldName: $fieldName, + path: $path, + method: 'POST' + ); + } + ], +]; diff --git a/kirby/config/areas/fields/drawers.php b/kirby/config/areas/fields/drawers.php new file mode 100644 index 0000000..1280a68 --- /dev/null +++ b/kirby/config/areas/fields/drawers.php @@ -0,0 +1,61 @@ + [ + 'load' => function ( + string $modelPath, + string $fieldName, + string|null $path = null + ) { + return Field::drawer( + model: Find::parent($modelPath), + fieldName: $fieldName, + path: $path, + method: 'GET' + ); + }, + 'submit' => function ( + string $modelPath, + string $fieldName, + string|null $path = null + ) { + return Field::drawer( + model: Find::parent($modelPath), + fieldName: $fieldName, + path: $path, + method: 'POST' + ); + } + ], + 'file' => [ + 'load' => function ( + string $modelPath, + string $filename, + string $fieldName, + string|null $path = null + ) { + return Field::drawer( + model: Find::file($modelPath, $filename), + fieldName: $fieldName, + path: $path, + method: 'GET' + ); + }, + 'submit' => function ( + string $modelPath, + string $filename, + string $fieldName, + string|null $path = null + ) { + return Field::drawer( + model: Find::file($modelPath, $filename), + fieldName: $fieldName, + path: $path, + method: 'POST' + ); + } + ], +]; diff --git a/kirby/config/areas/files/dialogs.php b/kirby/config/areas/files/dialogs.php new file mode 100644 index 0000000..8707bd0 --- /dev/null +++ b/kirby/config/areas/files/dialogs.php @@ -0,0 +1,172 @@ + [ + 'load' => function (string $path, string $filename) { + $file = Find::file($path, $filename); + return [ + 'component' => 'k-form-dialog', + 'props' => [ + 'fields' => [ + 'name' => [ + 'label' => I18n::translate('name'), + 'type' => 'slug', + 'required' => true, + 'icon' => 'title', + 'allow' => 'a-z0-9@._-', + 'after' => '.' . $file->extension(), + 'preselect' => true + ] + ], + 'submitButton' => I18n::translate('rename'), + 'value' => [ + 'name' => $file->name(), + ] + ] + ]; + }, + 'submit' => function (string $path, string $filename) { + $file = Find::file($path, $filename); + $name = $file->kirby()->request()->get('name'); + $renamed = $file->changeName($name); + $oldUrl = $file->panel()->url(true); + $newUrl = $renamed->panel()->url(true); + $response = [ + 'event' => 'file.changeName', + 'dispatch' => [ + 'content/move' => [ + $oldUrl, + $newUrl + ] + ], + ]; + + // check for a necessary redirect after the filename has changed + if (Panel::referrer() === $oldUrl && $oldUrl !== $newUrl) { + $response['redirect'] = $newUrl; + } + + return $response; + } + ], + + 'changeSort' => [ + 'load' => function (string $path, string $filename) { + $file = Find::file($path, $filename); + return [ + 'component' => 'k-form-dialog', + 'props' => [ + 'fields' => [ + 'position' => Field::filePosition($file) + ], + 'submitButton' => I18n::translate('change'), + 'value' => [ + 'position' => $file->sort()->isEmpty() ? $file->siblings(false)->count() + 1 : $file->sort()->toInt(), + ] + ] + ]; + }, + 'submit' => function (string $path, string $filename) { + $file = Find::file($path, $filename); + $files = $file->siblings()->sorted(); + $ids = $files->keys(); + $newIndex = (int)($file->kirby()->request()->get('position')) - 1; + $oldIndex = $files->indexOf($file); + + array_splice($ids, $oldIndex, 1); + array_splice($ids, $newIndex, 0, $file->id()); + + $files->changeSort($ids); + + return [ + 'event' => 'file.sort', + ]; + } + ], + + 'changeTemplate' => [ + 'load' => function (string $path, string $filename) { + $file = Find::file($path, $filename); + $blueprints = $file->blueprints(); + + return [ + 'component' => 'k-form-dialog', + 'props' => [ + 'fields' => [ + 'warning' => [ + 'type' => 'info', + 'theme' => 'notice', + 'text' => I18n::translate('file.changeTemplate.notice') + ], + 'template' => Field::template($blueprints, [ + 'required' => true + ]) + ], + 'theme' => 'notice', + 'submitButton' => I18n::translate('change'), + 'value' => [ + 'template' => $file->template() + ] + ] + ]; + }, + 'submit' => function (string $path, string $filename) { + $file = Find::file($path, $filename); + $template = $file->kirby()->request()->get('template'); + + $file->changeTemplate($template); + + return [ + 'event' => 'file.changeTemplate', + ]; + } + ], + + 'delete' => [ + 'load' => function (string $path, string $filename) { + $file = Find::file($path, $filename); + return [ + 'component' => 'k-remove-dialog', + 'props' => [ + 'text' => I18n::template('file.delete.confirm', [ + 'filename' => Escape::html($file->filename()) + ]), + ] + ]; + }, + 'submit' => function (string $path, string $filename) { + $file = Find::file($path, $filename); + $redirect = false; + $referrer = Panel::referrer(); + $url = $file->panel()->url(true); + + $file->delete(); + + // redirect to the parent model URL + // if the dialog has been opened in the file view + if ($referrer === $url) { + $redirect = $file->parent()->panel()->url(true); + } + + return [ + 'event' => 'file.delete', + 'dispatch' => ['content/remove' => [$url]], + 'redirect' => $redirect + ]; + } + ], + +]; diff --git a/kirby/config/areas/files/dropdowns.php b/kirby/config/areas/files/dropdowns.php new file mode 100644 index 0000000..8687a54 --- /dev/null +++ b/kirby/config/areas/files/dropdowns.php @@ -0,0 +1,9 @@ + function (string $parent, string $filename) { + return Find::file($parent, $filename)->panel()->dropdown(); + } +]; diff --git a/kirby/config/areas/installation.php b/kirby/config/areas/installation.php new file mode 100644 index 0000000..7f707cb --- /dev/null +++ b/kirby/config/areas/installation.php @@ -0,0 +1,40 @@ + 'settings', + 'label' => I18n::translate('view.installation'), + 'views' => [ + 'installation' => [ + 'pattern' => 'installation', + 'auth' => false, + 'action' => function () use ($kirby) { + $system = $kirby->system(); + return [ + 'component' => 'k-installation-view', + 'props' => [ + 'isInstallable' => $system->isInstallable(), + 'isInstalled' => $system->isInstalled(), + 'isOk' => $system->isOk(), + 'requirements' => $system->status(), + 'translations' => $kirby->translations()->values(function ($translation) { + return [ + 'text' => $translation->name(), + 'value' => $translation->code(), + ]; + }), + ] + ]; + } + ], + 'installation.fallback' => [ + 'pattern' => '(:all)', + 'auth' => false, + 'action' => fn () => Panel::go('installation') + ] + ] + ]; +}; diff --git a/kirby/config/areas/lab.php b/kirby/config/areas/lab.php new file mode 100644 index 0000000..580a9fb --- /dev/null +++ b/kirby/config/areas/lab.php @@ -0,0 +1,11 @@ + 'lab', + 'label' => 'Lab', + 'menu' => false, + 'drawers' => require __DIR__ . '/lab/drawers.php', + 'views' => require __DIR__ . '/lab/views.php' + ]; +}; diff --git a/kirby/config/areas/lab/drawers.php b/kirby/config/areas/lab/drawers.php new file mode 100644 index 0000000..9d16d81 --- /dev/null +++ b/kirby/config/areas/lab/drawers.php @@ -0,0 +1,30 @@ + [ + 'pattern' => 'lab/docs/(:any)', + 'load' => function (string $component) { + if (Docs::installed() === false) { + return [ + 'component' => 'k-text-drawer', + 'props' => [ + 'text' => 'The UI docs are not installed.' + ] + ]; + } + + $docs = new Docs($component); + + return [ + 'component' => 'k-lab-docs-drawer', + 'props' => [ + 'icon' => 'book', + 'title' => $component, + 'docs' => $docs->toArray() + ] + ]; + }, + ], +]; diff --git a/kirby/config/areas/lab/views.php b/kirby/config/areas/lab/views.php new file mode 100644 index 0000000..c1cf42d --- /dev/null +++ b/kirby/config/areas/lab/views.php @@ -0,0 +1,148 @@ + [ + 'pattern' => 'lab', + 'action' => function () { + return [ + 'component' => 'k-lab-index-view', + 'props' => [ + 'categories' => Category::all(), + 'info' => Category::installed() ? null : 'The default Lab examples are not installed.', + 'tab' => 'examples', + ], + ]; + } + ], + 'lab.docs' => [ + 'pattern' => 'lab/docs', + 'action' => function () { + $props = match (Docs::installed()) { + true => [ + 'categories' => [['examples' => Docs::all()]], + 'tab' => 'docs', + ], + false => [ + 'info' => 'The UI docs are not installed.', + 'tab' => 'docs', + ] + }; + + return [ + 'component' => 'k-lab-index-view', + 'title' => 'Docs', + 'breadcrumb' => [ + [ + 'label' => 'Docs', + 'link' => 'lab/docs' + ] + ], + 'props' => $props, + ]; + } + ], + 'lab.doc' => [ + 'pattern' => 'lab/docs/(:any)', + 'action' => function (string $component) { + $crumbs = [ + [ + 'label' => 'Docs', + 'link' => 'lab/docs' + ], + [ + 'label' => $component, + 'link' => 'lab/docs/' . $component + ] + ]; + + if (Docs::installed() === false) { + return [ + 'component' => 'k-lab-index-view', + 'title' => $component, + 'breadcrumb' => $crumbs, + 'props' => [ + 'info' => 'The UI docs are not installed.', + 'tab' => 'docs', + ], + ]; + } + + $docs = new Docs($component); + + return [ + 'component' => 'k-lab-docs-view', + 'title' => $component, + 'breadcrumb' => $crumbs, + 'props' => [ + 'component' => $component, + 'docs' => $docs->toArray(), + 'lab' => $docs->lab() + ] + ]; + } + ], + 'lab.vue' => [ + 'pattern' => [ + 'lab/(:any)/(:any)/index.vue', + 'lab/(:any)/(:any)/(:any)/index.vue' + ], + 'action' => function ( + string $category, + string $id, + string|null $tab = null + ) { + return Category::factory($category)->example($id, $tab)->serve(); + } + ], + 'lab.example' => [ + 'pattern' => 'lab/(:any)/(:any)/(:any?)', + 'action' => function ( + string $category, + string $id, + string|null $tab = null + ) { + $category = Category::factory($category); + $example = $category->example($id, $tab); + $props = $example->props(); + $vue = $example->vue(); + + if (Docs::installed() === true && $docs = $props['docs'] ?? null) { + $docs = new Docs($docs); + } + + $github = $docs?->github(); + + if ($source = $props['source'] ?? null) { + $github ??= 'https://github.com/getkirby/kirby/tree/main/' . $source; + } + + return [ + 'component' => 'k-lab-playground-view', + 'breadcrumb' => [ + [ + 'label' => $category->name(), + ], + [ + 'label' => $example->title(), + 'link' => $example->url() + ] + ], + 'props' => [ + 'docs' => $docs?->name(), + 'examples' => $vue['examples'], + 'file' => $example->module(), + 'github' => $github, + 'props' => $props, + 'styles' => $vue['style'], + 'tab' => $example->tab(), + 'tabs' => array_values($example->tabs()), + 'template' => $vue['template'], + 'title' => $example->title(), + ], + ]; + } + ] +]; diff --git a/kirby/config/areas/languages.php b/kirby/config/areas/languages.php new file mode 100644 index 0000000..263ffd7 --- /dev/null +++ b/kirby/config/areas/languages.php @@ -0,0 +1,13 @@ + 'translate', + 'label' => I18n::translate('view.languages'), + 'menu' => true, + 'dialogs' => require __DIR__ . '/languages/dialogs.php', + 'views' => require __DIR__ . '/languages/views.php' + ]; +}; diff --git a/kirby/config/areas/languages/dialogs.php b/kirby/config/areas/languages/dialogs.php new file mode 100644 index 0000000..fe88ff3 --- /dev/null +++ b/kirby/config/areas/languages/dialogs.php @@ -0,0 +1,266 @@ + [ + 'counter' => false, + 'label' => I18n::translate('language.name'), + 'type' => 'text', + 'required' => true, + 'icon' => 'title' + ], + 'code' => [ + 'label' => I18n::translate('language.code'), + 'type' => 'text', + 'required' => true, + 'counter' => false, + 'icon' => 'translate', + 'width' => '1/2' + ], + 'direction' => [ + 'label' => I18n::translate('language.direction'), + 'type' => 'select', + 'required' => true, + 'empty' => false, + 'options' => [ + ['value' => 'ltr', 'text' => I18n::translate('language.direction.ltr')], + ['value' => 'rtl', 'text' => I18n::translate('language.direction.rtl')] + ], + 'width' => '1/2' + ], + 'locale' => [ + 'counter' => false, + 'label' => I18n::translate('language.locale'), + 'type' => 'text', + ], +]; + +$translationDialogFields = [ + 'key' => [ + 'counter' => false, + 'icon' => null, + 'label' => I18n::translate('language.variable.key'), + 'type' => 'text' + ], + 'value' => [ + 'buttons' => false, + 'counter' => false, + 'label' => I18n::translate('language.variable.value'), + 'type' => 'textarea' + ] +]; + +return [ + + // create language + 'language.create' => [ + 'pattern' => 'languages/create', + 'load' => function () use ($languageDialogFields) { + return [ + 'component' => 'k-language-dialog', + 'props' => [ + 'fields' => $languageDialogFields, + 'submitButton' => I18n::translate('language.create'), + 'value' => [ + 'code' => '', + 'direction' => 'ltr', + 'locale' => '', + 'name' => '', + ] + ] + ]; + }, + 'submit' => function () { + $kirby = App::instance(); + + $data = $kirby->request()->get([ + 'code', + 'direction', + 'locale', + 'name' + ]); + $kirby->languages()->create($data); + + return [ + 'event' => 'language.create' + ]; + } + ], + + // delete language + 'language.delete' => [ + 'pattern' => 'languages/(:any)/delete', + 'load' => function (string $id) { + $language = Find::language($id); + return [ + 'component' => 'k-remove-dialog', + 'props' => [ + 'text' => I18n::template('language.delete.confirm', [ + 'name' => Escape::html($language->name()) + ]) + ] + ]; + }, + 'submit' => function (string $id) { + Find::language($id)->delete(); + + return [ + 'event' => 'language.delete', + 'redirect' => 'languages' + ]; + } + ], + + // update language + 'language.update' => [ + 'pattern' => 'languages/(:any)/update', + 'load' => function (string $id) use ($languageDialogFields) { + $language = Find::language($id); + $fields = $languageDialogFields; + $locale = $language->locale(); + + // use the first locale key if there's only one + if (count($locale) === 1) { + $locale = A::first($locale); + } + + // the code of an existing language cannot be changed + $fields['code']['disabled'] = true; + + // if the locale settings is more complex than just a + // single string, the text field won't do it anymore. + // Changes can only be made in the language file and + // we display a warning box instead. + if (is_array($locale) === true) { + $fields['locale'] = [ + 'label' => $fields['locale']['label'], + 'type' => 'info', + 'text' => I18n::translate('language.locale.warning') + ]; + } + + return [ + 'component' => 'k-language-dialog', + 'props' => [ + 'fields' => $fields, + 'submitButton' => I18n::translate('save'), + 'value' => [ + 'code' => $language->code(), + 'direction' => $language->direction(), + 'locale' => $locale, + 'name' => $language->name(), + 'rules' => $language->rules(), + ] + ] + ]; + }, + 'submit' => function (string $id) { + $kirby = App::instance(); + + $data = $kirby->request()->get(['direction', 'locale', 'name']); + $language = Find::language($id)->update($data); + + return [ + 'event' => 'language.update' + ]; + } + ], + + 'language.translation.create' => [ + 'pattern' => 'languages/(:any)/translations/create', + 'load' => function (string $languageCode) use ($translationDialogFields) { + // find the language to make sure it exists + Find::language($languageCode); + + return [ + 'component' => 'k-form-dialog', + 'props' => [ + 'fields' => $translationDialogFields, + 'size' => 'large', + ], + ]; + }, + 'submit' => function (string $languageCode) { + $request = App::instance()->request(); + $language = Find::language($languageCode); + + $key = $request->get('key', ''); + $value = $request->get('value', ''); + + LanguageVariable::create($key, $value); + + if ($language->isDefault() === false) { + $language->variable($key)->update($value); + } + + return true; + } + ], + 'language.translation.delete' => [ + 'pattern' => 'languages/(:any)/translations/(:any)/delete', + 'load' => function (string $languageCode, string $translationKey) { + $variable = Find::language($languageCode)->variable($translationKey, true); + + if ($variable->exists() === false) { + throw new NotFoundException([ + 'key' => 'language.variable.notFound' + ]); + } + + return [ + 'component' => 'k-remove-dialog', + 'props' => [ + 'text' => I18n::template('language.variable.delete.confirm', [ + 'key' => Escape::html($variable->key()) + ]) + ], + ]; + }, + 'submit' => function (string $languageCode, string $translationKey) { + return Find::language($languageCode)->variable($translationKey, true)->delete(); + } + ], + 'language.translation.update' => [ + 'pattern' => 'languages/(:any)/translations/(:any)/update', + 'load' => function (string $languageCode, string $translationKey) use ($translationDialogFields) { + $variable = Find::language($languageCode)->variable($translationKey, true); + + if ($variable->exists() === false) { + throw new NotFoundException([ + 'key' => 'language.variable.notFound' + ]); + } + + $fields = $translationDialogFields; + $fields['key']['disabled'] = true; + $fields['value']['autofocus'] = true; + + return [ + 'component' => 'k-form-dialog', + 'props' => [ + 'fields' => $fields, + 'size' => 'large', + 'value' => [ + 'key' => $variable->key(), + 'value' => $variable->value() + ] + ], + ]; + }, + 'submit' => function (string $languageCode, string $translationKey) { + Find::language($languageCode)->variable($translationKey, true)->update( + App::instance()->request()->get('value') + ); + + return true; + } + ] + +]; diff --git a/kirby/config/areas/languages/views.php b/kirby/config/areas/languages/views.php new file mode 100644 index 0000000..ac2d6d4 --- /dev/null +++ b/kirby/config/areas/languages/views.php @@ -0,0 +1,128 @@ + [ + 'pattern' => 'languages/(:any)', + 'when' => function (): bool { + return App::instance()->option('languages.variables', true) !== false; + }, + 'action' => function (string $code) { + $kirby = App::instance(); + $language = Find::language($code); + $link = '/languages/' . $language->code(); + $strings = []; + $foundation = $kirby->defaultLanguage()->translations(); + $translations = $language->translations(); + + // TODO: update following line and adapt for update and delete options + // when new `languageVariables.*` permissions available + $canUpdate = $kirby->user()?->role()->permissions()->for('languages', 'update') === true; + + ksort($foundation); + + foreach ($foundation as $key => $value) { + $strings[] = [ + 'key' => $key, + 'value' => $translations[$key] ?? null, + 'options' => [ + [ + 'click' => 'update', + 'disabled' => $canUpdate === false, + 'icon' => 'edit', + 'text' => I18n::translate('edit'), + ], + [ + 'click' => 'delete', + 'disabled' => $canUpdate === false || $language->isDefault() === false, + 'icon' => 'trash', + 'text' => I18n::translate('delete'), + ] + ] + ]; + } + + $next = function () use ($language) { + if ($next = $language->next()) { + return [ + 'link' => '/languages/' . $next->code(), + 'title' => $next->name(), + ]; + } + }; + + $prev = function () use ($language) { + if ($prev = $language->prev()) { + return [ + 'link' => '/languages/' . $prev->code(), + 'title' => $prev->name(), + ]; + } + }; + + return [ + 'component' => 'k-language-view', + 'breadcrumb' => [ + [ + 'label' => $name = $language->name(), + 'link' => $link, + ] + ], + 'props' => [ + 'deletable' => $language->isDeletable(), + 'code' => Escape::html($language->code()), + 'default' => $language->isDefault(), + 'direction' => $language->direction(), + 'id' => $language->code(), + 'info' => [ + [ + 'label' => 'Status', + 'value' => I18n::translate('language.' . ($language->isDefault() ? 'default' : 'secondary')), + ], + [ + 'label' => I18n::translate('language.code'), + 'value' => $language->code(), + ], + [ + 'label' => I18n::translate('language.locale'), + 'value' => $language->locale(LC_ALL) + ], + [ + 'label' => I18n::translate('language.direction'), + 'value' => I18n::translate('language.direction.' . $language->direction()), + ], + ], + 'name' => $name, + 'next' => $next, + 'prev' => $prev, + 'translations' => $strings, + 'url' => $language->url(), + ] + ]; + } + ], + 'languages' => [ + 'pattern' => 'languages', + 'action' => function () { + $kirby = App::instance(); + + return [ + 'component' => 'k-languages-view', + 'props' => [ + 'languages' => $kirby->languages()->values(fn ($language) => [ + 'deletable' => $language->isDeletable(), + 'default' => $language->isDefault(), + 'id' => $language->code(), + 'info' => Escape::html($language->code()), + 'text' => Escape::html($language->name()), + ]), + 'variables' => $kirby->option('languages.variables', true) + ] + ]; + } + ] +]; diff --git a/kirby/config/areas/login.php b/kirby/config/areas/login.php new file mode 100644 index 0000000..56f30cb --- /dev/null +++ b/kirby/config/areas/login.php @@ -0,0 +1,44 @@ + 'user', + 'label' => I18n::translate('login'), + 'views' => [ + 'login' => [ + 'pattern' => 'login', + 'auth' => false, + 'action' => function () use ($kirby) { + $system = $kirby->system(); + $status = $kirby->auth()->status(); + return [ + 'component' => 'k-login-view', + 'props' => [ + 'methods' => array_keys($system->loginMethods()), + 'pending' => [ + 'email' => $status->email(), + 'challenge' => $status->challenge() + ] + ], + ]; + } + ], + 'login.fallback' => [ + 'pattern' => '(:all)', + 'auth' => false, + 'action' => function ($path) use ($kirby) { + /** + * Store the current path in the session + * Once the user is logged in, the path will + * be used to redirect to that view again + */ + $kirby->session()->set('panel.path', $path); + Panel::go('login'); + } + ] + ] + ]; +}; diff --git a/kirby/config/areas/logout.php b/kirby/config/areas/logout.php new file mode 100644 index 0000000..5dc4a50 --- /dev/null +++ b/kirby/config/areas/logout.php @@ -0,0 +1,21 @@ + 'user', + 'label' => I18n::translate('logout'), + 'views' => [ + 'logout' => [ + 'pattern' => 'logout', + 'auth' => false, + 'action' => function () use ($kirby) { + $kirby->auth()->logout(); + Panel::go('login'); + }, + ] + ] + ]; +}; diff --git a/kirby/config/areas/search.php b/kirby/config/areas/search.php new file mode 100644 index 0000000..2f7474e --- /dev/null +++ b/kirby/config/areas/search.php @@ -0,0 +1,11 @@ + 'search', + 'label' => I18n::translate('search'), + 'views' => require __DIR__ . '/search/views.php' + ]; +}; diff --git a/kirby/config/areas/search/views.php b/kirby/config/areas/search/views.php new file mode 100644 index 0000000..365e834 --- /dev/null +++ b/kirby/config/areas/search/views.php @@ -0,0 +1,17 @@ + [ + 'pattern' => 'search', + 'action' => function () { + return [ + 'component' => 'k-search-view', + 'props' => [ + 'type' => App::instance()->request()->get('type'), + ] + ]; + } + ], +]; diff --git a/kirby/config/areas/site.php b/kirby/config/areas/site.php new file mode 100644 index 0000000..ab2eb78 --- /dev/null +++ b/kirby/config/areas/site.php @@ -0,0 +1,20 @@ + function () use ($kirby) { + return $kirby->site()->title()->or(I18n::translate('view.site'))->toString(); + }, + 'icon' => 'home', + 'label' => $kirby->site()->blueprint()->title() ?? I18n::translate('view.site'), + 'menu' => true, + 'dialogs' => require __DIR__ . '/site/dialogs.php', + 'drawers' => require __DIR__ . '/site/drawers.php', + 'dropdowns' => require __DIR__ . '/site/dropdowns.php', + 'requests' => require __DIR__ . '/site/requests.php', + 'searches' => require __DIR__ . '/site/searches.php', + 'views' => require __DIR__ . '/site/views.php', + ]; +}; diff --git a/kirby/config/areas/site/dialogs.php b/kirby/config/areas/site/dialogs.php new file mode 100644 index 0000000..f797139 --- /dev/null +++ b/kirby/config/areas/site/dialogs.php @@ -0,0 +1,643 @@ + [ + 'pattern' => 'pages/(:any)/changeSort', + 'load' => function (string $id) { + $page = Find::page($id); + + if ($page->blueprint()->num() !== 'default') { + throw new PermissionException([ + 'key' => 'page.sort.permission', + 'data' => [ + 'slug' => $page->slug() + ] + ]); + } + + return [ + 'component' => 'k-form-dialog', + 'props' => [ + 'fields' => [ + 'position' => Field::pagePosition($page), + ], + 'submitButton' => I18n::translate('change'), + 'value' => [ + 'position' => $page->panel()->position() + ] + ] + ]; + }, + 'submit' => function (string $id) { + $request = App::instance()->request(); + + Find::page($id)->changeStatus( + 'listed', + $request->get('position') + ); + + return [ + 'event' => 'page.sort', + ]; + } + ], + + // change page status + 'page.changeStatus' => [ + 'pattern' => 'pages/(:any)/changeStatus', + 'load' => function (string $id) { + $page = Find::page($id); + $blueprint = $page->blueprint(); + $status = $page->status(); + $states = []; + $position = null; + + foreach ($blueprint->status() as $key => $state) { + $states[] = [ + 'value' => $key, + 'text' => $state['label'], + 'info' => $state['text'], + ]; + } + + if ($status === 'draft') { + $errors = $page->errors(); + + // switch to the error dialog if there are + // errors and the draft cannot be published + if (count($errors) > 0) { + return [ + 'component' => 'k-error-dialog', + 'props' => [ + 'message' => I18n::translate('error.page.changeStatus.incomplete'), + 'details' => $errors, + ] + ]; + } + } + + $fields = [ + 'status' => [ + 'label' => I18n::translate('page.changeStatus.select'), + 'type' => 'radio', + 'required' => true, + 'options' => $states + ] + ]; + + if ($blueprint->num() === 'default') { + $fields['position'] = Field::pagePosition($page, [ + 'when' => [ + 'status' => 'listed' + ] + ]); + + $position = $page->panel()->position(); + } + + return [ + 'component' => 'k-form-dialog', + 'props' => [ + 'fields' => $fields, + 'submitButton' => I18n::translate('change'), + 'value' => [ + 'status' => $status, + 'position' => $position + ] + ] + ]; + }, + 'submit' => function (string $id) { + $request = App::instance()->request(); + + Find::page($id)->changeStatus( + $request->get('status'), + $request->get('position') + ); + + return [ + 'event' => 'page.changeStatus', + ]; + } + ], + + // change template + 'page.changeTemplate' => [ + 'pattern' => 'pages/(:any)/changeTemplate', + 'load' => function (string $id) { + $page = Find::page($id); + $blueprints = $page->blueprints(); + + if (count($blueprints) <= 1) { + throw new Exception([ + 'key' => 'page.changeTemplate.invalid', + 'data' => [ + 'slug' => $id + ] + ]); + } + + return [ + 'component' => 'k-form-dialog', + 'props' => [ + 'fields' => [ + 'notice' => [ + 'type' => 'info', + 'theme' => 'notice', + 'text' => I18n::translate('page.changeTemplate.notice') + ], + 'template' => Field::template($blueprints, [ + 'required' => true + ]) + ], + 'theme' => 'notice', + 'submitButton' => I18n::translate('change'), + 'value' => [ + 'template' => $page->intendedTemplate()->name() + ] + ] + ]; + }, + 'submit' => function (string $id) { + $page = Find::page($id); + $template = App::instance()->request()->get('template'); + + $page->changeTemplate($template); + + return [ + 'event' => 'page.changeTemplate', + ]; + } + ], + + // change title + 'page.changeTitle' => [ + 'pattern' => 'pages/(:any)/changeTitle', + 'load' => function (string $id) { + $request = App::instance()->request(); + + $page = Find::page($id); + $permissions = $page->permissions(); + $select = $request->get('select', 'title'); + + return [ + 'component' => 'k-form-dialog', + 'props' => [ + 'fields' => [ + 'title' => Field::title([ + 'required' => true, + 'preselect' => $select === 'title', + 'disabled' => $permissions->can('changeTitle') === false + ]), + 'slug' => Field::slug([ + 'required' => true, + 'preselect' => $select === 'slug', + 'path' => $page->parent() ? '/' . $page->parent()->uri() . '/' : '/', + 'disabled' => $permissions->can('changeSlug') === false, + 'wizard' => [ + 'text' => I18n::translate('page.changeSlug.fromTitle'), + 'field' => 'title' + ] + ]) + ], + 'autofocus' => false, + 'submitButton' => I18n::translate('change'), + 'value' => [ + 'title' => $page->title()->value(), + 'slug' => $page->slug(), + ] + ] + ]; + }, + 'submit' => function (string $id) { + $request = App::instance()->request(); + + $page = Find::page($id); + $title = trim($request->get('title', '')); + $slug = trim($request->get('slug', '')); + + // basic input validation before we move on + PageRules::validateTitleLength($title); + PageRules::validateSlugLength($slug); + + // nothing changed + if ($page->title()->value() === $title && $page->slug() === $slug) { + return true; + } + + // prepare the response + $response = [ + 'event' => [] + ]; + + // the page title changed + if ($page->title()->value() !== $title) { + $page->changeTitle($title); + $response['event'][] = 'page.changeTitle'; + } + + // the slug changed + if ($page->slug() !== $slug) { + $newPage = $page->changeSlug($slug); + $response['event'][] = 'page.changeSlug'; + $response['dispatch'] = [ + 'content/move' => [ + $oldUrl = $page->panel()->url(true), + $newUrl = $newPage->panel()->url(true) + ] + ]; + + // check for a necessary redirect after the slug has changed + if (Panel::referrer() === $oldUrl && $oldUrl !== $newUrl) { + $response['redirect'] = $newUrl; + } + } + + return $response; + } + ], + + // create a new page + 'page.create' => [ + 'pattern' => 'pages/create', + 'load' => function () { + $request = App::instance()->request(); + $dialog = new PageCreateDialog( + parentId: $request->get('parent'), + sectionId: $request->get('section'), + slug: $request->get('slug'), + template: $request->get('template'), + title: $request->get('title'), + viewId: $request->get('view'), + ); + + return $dialog->load(); + }, + 'submit' => function () { + $request = App::instance()->request(); + $dialog = new PageCreateDialog( + parentId: $request->get('parent'), + sectionId: $request->get('section'), + slug: $request->get('slug'), + template: $request->get('template'), + title: $request->get('title'), + viewId: $request->get('view'), + ); + + return $dialog->submit($request->get()); + } + ], + + // delete page + 'page.delete' => [ + 'pattern' => 'pages/(:any)/delete', + 'load' => function (string $id) { + $page = Find::page($id); + $text = I18n::template('page.delete.confirm', [ + 'title' => Escape::html($page->title()->value()) + ]); + + if ($page->childrenAndDrafts()->count() > 0) { + return [ + 'component' => 'k-form-dialog', + 'props' => [ + 'fields' => [ + 'info' => [ + 'type' => 'info', + 'theme' => 'negative', + 'text' => I18n::translate('page.delete.confirm.subpages') + ], + 'check' => [ + 'label' => I18n::translate('page.delete.confirm.title'), + 'type' => 'text', + 'counter' => false + ] + ], + 'size' => 'medium', + 'submitButton' => I18n::translate('delete'), + 'text' => $text, + 'theme' => 'negative', + ] + ]; + } + + return [ + 'component' => 'k-remove-dialog', + 'props' => [ + 'text' => $text + ] + ]; + }, + 'submit' => function (string $id) { + $request = App::instance()->request(); + + $page = Find::page($id); + $redirect = false; + $referrer = Panel::referrer(); + $url = $page->panel()->url(true); + + if ( + $page->childrenAndDrafts()->count() > 0 && + $request->get('check') !== $page->title()->value() + ) { + throw new InvalidArgumentException(['key' => 'page.delete.confirm']); + } + + $page->delete(true); + + // redirect to the parent model URL + // if the dialog has been opened in the page view + if ($referrer === $url) { + $redirect = $page->parentModel()->panel()->url(true); + } + + return [ + 'event' => 'page.delete', + 'dispatch' => ['content/remove' => [$url]], + 'redirect' => $redirect + ]; + } + ], + + // duplicate page + 'page.duplicate' => [ + 'pattern' => 'pages/(:any)/duplicate', + 'load' => function (string $id) { + $page = Find::page($id); + $hasChildren = $page->hasChildren(); + $hasFiles = $page->hasFiles(); + $toggleWidth = '1/' . count(array_filter([$hasChildren, $hasFiles])); + + $fields = [ + 'title' => Field::title([ + 'required' => true + ]), + 'slug' => Field::slug([ + 'required' => true, + 'path' => $page->parent() ? '/' . $page->parent()->id() . '/' : '/', + 'wizard' => [ + 'text' => I18n::translate('page.changeSlug.fromTitle'), + 'field' => 'title' + ] + ]) + ]; + + if ($hasFiles === true) { + $fields['files'] = [ + 'label' => I18n::translate('page.duplicate.files'), + 'type' => 'toggle', + 'required' => true, + 'width' => $toggleWidth + ]; + } + + if ($hasChildren === true) { + $fields['children'] = [ + 'label' => I18n::translate('page.duplicate.pages'), + 'type' => 'toggle', + 'required' => true, + 'width' => $toggleWidth + ]; + } + + $slugAppendix = Str::slug(I18n::translate('page.duplicate.appendix')); + $titleAppendix = I18n::translate('page.duplicate.appendix'); + + // if the item to be duplicated already exists + // add a suffix at the end of slug and title + $duplicateSlug = $page->slug() . '-' . $slugAppendix; + $siblingKeys = $page->parentModel()->childrenAndDrafts()->pluck('uid'); + + if (in_array($duplicateSlug, $siblingKeys) === true) { + $suffixCounter = 2; + $newSlug = $duplicateSlug . $suffixCounter; + + while (in_array($newSlug, $siblingKeys) === true) { + $newSlug = $duplicateSlug . ++$suffixCounter; + } + + $slugAppendix .= $suffixCounter; + $titleAppendix .= ' ' . $suffixCounter; + } + + return [ + 'component' => 'k-form-dialog', + 'props' => [ + 'fields' => $fields, + 'submitButton' => I18n::translate('duplicate'), + 'value' => [ + 'children' => false, + 'files' => false, + 'slug' => $page->slug() . '-' . $slugAppendix, + 'title' => $page->title() . ' ' . $titleAppendix + ] + ] + ]; + }, + 'submit' => function (string $id) { + $request = App::instance()->request(); + + $newPage = Find::page($id)->duplicate($request->get('slug'), [ + 'children' => (bool)$request->get('children'), + 'files' => (bool)$request->get('files'), + 'title' => (string)$request->get('title'), + ]); + + return [ + 'event' => 'page.duplicate', + 'redirect' => $newPage->panel()->url(true) + ]; + } + ], + + // page field dialogs + 'page.fields' => [ + 'pattern' => '(pages/.*?)/fields/(:any)/(:all?)', + 'load' => $fields['model']['load'], + 'submit' => $fields['model']['submit'] + ], + + // change filename + 'page.file.changeName' => [ + 'pattern' => '(pages/.*?)/files/(:any)/changeName', + 'load' => $files['changeName']['load'], + 'submit' => $files['changeName']['submit'], + ], + + // change sort + 'page.file.changeSort' => [ + 'pattern' => '(pages/.*?)/files/(:any)/changeSort', + 'load' => $files['changeSort']['load'], + 'submit' => $files['changeSort']['submit'], + ], + + // change template + 'page.file.changeTemplate' => [ + 'pattern' => '(pages/.*?)/files/(:any)/changeTemplate', + 'load' => $files['changeTemplate']['load'], + 'submit' => $files['changeTemplate']['submit'], + ], + + // delete + 'page.file.delete' => [ + 'pattern' => '(pages/.*?)/files/(:any)/delete', + 'load' => $files['delete']['load'], + 'submit' => $files['delete']['submit'], + ], + + // page file field dialogs + 'page.file.fields' => [ + 'pattern' => '(pages/.*?)/files/(:any)/fields/(:any)/(:all?)', + 'load' => $fields['file']['load'], + 'submit' => $fields['file']['submit'], + ], + + // move page + 'page.move' => [ + 'pattern' => 'pages/(:any)/move', + 'load' => function (string $id) { + $page = Find::page($id); + $parent = $page->parentModel(); + + if (Uuids::enabled() === false) { + $parentId = $parent?->id() ?? '/'; + } else { + $parentId = $parent?->uuid()->toString() ?? 'site://'; + } + + return [ + 'component' => 'k-page-move-dialog', + 'props' => [ + 'value' => [ + 'move' => $page->panel()->url(true), + 'parent' => $parentId + ] + ] + ]; + }, + 'submit' => function (string $id) { + $kirby = App::instance(); + $parentId = $kirby->request()->get('parent'); + $parent = (empty($parentId) === true || $parentId === '/' || $parentId === 'site://') ? $kirby->site() : Find::page($parentId); + $oldPage = Find::page($id); + $newPage = $oldPage->move($parent); + + return [ + 'event' => 'page.move', + 'redirect' => $newPage->panel()->url(true), + 'dispatch' => [ + 'content/move' => [ + $oldPage->panel()->url(true), + $newPage->panel()->url(true) + ] + ], + ]; + } + ], + + // change site title + 'site.changeTitle' => [ + 'pattern' => 'site/changeTitle', + 'load' => function () { + return [ + 'component' => 'k-form-dialog', + 'props' => [ + 'fields' => [ + 'title' => Field::title([ + 'required' => true, + 'preselect' => true + ]) + ], + 'submitButton' => I18n::translate('rename'), + 'value' => [ + 'title' => App::instance()->site()->title()->value() + ] + ] + ]; + }, + 'submit' => function () { + $kirby = App::instance(); + $kirby->site()->changeTitle($kirby->request()->get('title')); + + return [ + 'event' => 'site.changeTitle', + ]; + } + ], + + // site field dialogs + 'site.fields' => [ + 'pattern' => '(site)/fields/(:any)/(:all?)', + 'load' => $fields['model']['load'], + 'submit' => $fields['model']['submit'], + ], + + // change filename + 'site.file.changeName' => [ + 'pattern' => '(site)/files/(:any)/changeName', + 'load' => $files['changeName']['load'], + 'submit' => $files['changeName']['submit'], + ], + + // change sort + 'site.file.changeSort' => [ + 'pattern' => '(site)/files/(:any)/changeSort', + 'load' => $files['changeSort']['load'], + 'submit' => $files['changeSort']['submit'], + ], + + // change template + 'site.file.changeTemplate' => [ + 'pattern' => '(site)/files/(:any)/changeTemplate', + 'load' => $files['changeTemplate']['load'], + 'submit' => $files['changeTemplate']['submit'], + ], + + // delete + 'site.file.delete' => [ + 'pattern' => '(site)/files/(:any)/delete', + 'load' => $files['delete']['load'], + 'submit' => $files['delete']['submit'], + ], + + // site file field dialogs + 'site.file.fields' => [ + 'pattern' => '(site)/files/(:any)/fields/(:any)/(:all?)', + 'load' => $fields['file']['load'], + 'submit' => $fields['file']['submit'], + ], + + // content changes + 'changes' => [ + 'pattern' => 'changes', + 'load' => function () { + $dialog = new ChangesDialog(); + return $dialog->load(); + }, + 'submit' => function () { + $dialog = new ChangesDialog(); + $ids = App::instance()->request()->get('ids'); + return $dialog->submit($ids); + } + ], +]; diff --git a/kirby/config/areas/site/drawers.php b/kirby/config/areas/site/drawers.php new file mode 100644 index 0000000..7bdf4da --- /dev/null +++ b/kirby/config/areas/site/drawers.php @@ -0,0 +1,33 @@ + [ + 'pattern' => '(pages/.*?)/fields/(:any)/(:all?)', + 'load' => $fields['model']['load'], + 'submit' => $fields['model']['submit'] + ], + + // page file field drawers + 'page.file.fields' => [ + 'pattern' => '(pages/.*?)/files/(:any)/fields/(:any)/(:all?)', + 'load' => $fields['file']['load'], + 'submit' => $fields['file']['submit'], + ], + + // site field drawers + 'site.fields' => [ + 'pattern' => '(site)/fields/(:any)/(:all?)', + 'load' => $fields['model']['load'], + 'submit' => $fields['model']['submit'], + ], + + // site file field drawers + 'site.file.fields' => [ + 'pattern' => '(site)/files/(:any)/fields/(:any)/(:all?)', + 'load' => $fields['file']['load'], + 'submit' => $fields['file']['submit'], + ], +]; diff --git a/kirby/config/areas/site/dropdowns.php b/kirby/config/areas/site/dropdowns.php new file mode 100644 index 0000000..b756cf4 --- /dev/null +++ b/kirby/config/areas/site/dropdowns.php @@ -0,0 +1,21 @@ + [ + 'pattern' => 'pages/(:any)', + 'options' => function (string $path) { + return Find::page($path)->panel()->dropdown(); + } + ], + 'page.file' => [ + 'pattern' => '(pages/.*?)/files/(:any)', + 'options' => $files['file'] + ], + 'site.file' => [ + 'pattern' => '(site)/files/(:any)', + 'options' => $files['file'] + ] +]; diff --git a/kirby/config/areas/site/requests.php b/kirby/config/areas/site/requests.php new file mode 100644 index 0000000..352334a --- /dev/null +++ b/kirby/config/areas/site/requests.php @@ -0,0 +1,66 @@ + [ + 'pattern' => 'site/tree', + 'action' => function () { + $kirby = App::instance(); + $request = $kirby->request(); + $move = $request->get('move'); + $move = $move ? Find::parent($move) : null; + $parent = $request->get('parent'); + + if ($parent === null) { + $site = $kirby->site(); + $panel = $site->panel(); + $uuid = $site->uuid()?->toString(); + $url = $site->url(); + $value = $uuid ?? '/'; + + return [ + [ + 'children' => $panel->url(true), + 'disabled' => $move?->isMovableTo($site) === false, + 'hasChildren' => true, + 'icon' => 'home', + 'id' => '/', + 'label' => I18n::translate('view.site'), + 'open' => false, + 'url' => $url, + 'uuid' => $uuid, + 'value' => $value + ] + ]; + } + + $parent = Find::parent($parent); + $pages = []; + + foreach ($parent->childrenAndDrafts()->filterBy('isListable', true) as $child) { + $panel = $child->panel(); + $uuid = $child->uuid()?->toString(); + $url = $child->url(); + $value = $uuid ?? $child->id(); + + $pages[] = [ + 'children' => $panel->url(true), + 'disabled' => $move?->isMovableTo($child) === false, + 'hasChildren' => $child->hasChildren() === true || $child->hasDrafts() === true, + 'icon' => $panel->image()['icon'] ?? null, + 'id' => $child->id(), + 'open' => false, + 'label' => $child->title()->value(), + 'url' => $url, + 'uuid' => $uuid, + 'value' => $value + ]; + } + + return $pages; + } + ] +]; diff --git a/kirby/config/areas/site/searches.php b/kirby/config/areas/site/searches.php new file mode 100644 index 0000000..4cefefe --- /dev/null +++ b/kirby/config/areas/site/searches.php @@ -0,0 +1,56 @@ + [ + 'label' => I18n::translate('pages'), + 'icon' => 'page', + 'query' => function (string $query = null, int $limit, int $page) { + $kirby = App::instance(); + $pages = $kirby->site() + ->index(true) + ->search($query) + ->filter('isListable', true) + ->paginate($limit, $page); + + return [ + 'results' => $pages->values(fn ($page) => [ + 'image' => $page->panel()->image(), + 'text' => Escape::html($page->title()->value()), + 'link' => $page->panel()->url(true), + 'info' => Escape::html($page->id()), + 'uuid' => $page->uuid()?->toString(), + ]), + 'pagination' => $pages->pagination()->toArray() + ]; + } + ], + 'files' => [ + 'label' => I18n::translate('files'), + 'icon' => 'image', + 'query' => function (string $query = null, int $limit, int $page) { + $kirby = App::instance(); + $files = $kirby->site() + ->index(true) + ->filter('isListable', true) + ->files() + ->filter('isListable', true) + ->search($query) + ->paginate($limit, $page); + + return [ + 'results' => $files->values(fn ($file) => [ + 'image' => $file->panel()->image(), + 'text' => Escape::html($file->filename()), + 'link' => $file->panel()->url(true), + 'info' => Escape::html($file->id()), + 'uuid' => $file->uuid()->toString(), + ]), + 'pagination' => $files->pagination()->toArray() + ]; + } + ] +]; diff --git a/kirby/config/areas/site/views.php b/kirby/config/areas/site/views.php new file mode 100644 index 0000000..7465d2e --- /dev/null +++ b/kirby/config/areas/site/views.php @@ -0,0 +1,27 @@ + [ + 'pattern' => 'pages/(:any)', + 'action' => fn (string $path) => Find::page($path)->panel()->view() + ], + 'page.file' => [ + 'pattern' => 'pages/(:any)/files/(:any)', + 'action' => function (string $id, string $filename) { + return Find::file('pages/' . $id, $filename)->panel()->view(); + } + ], + 'site' => [ + 'pattern' => 'site', + 'action' => fn () => App::instance()->site()->panel()->view() + ], + 'site.file' => [ + 'pattern' => 'site/files/(:any)', + 'action' => function (string $filename) { + return Find::file('site', $filename)->panel()->view(); + } + ], +]; diff --git a/kirby/config/areas/system.php b/kirby/config/areas/system.php new file mode 100644 index 0000000..9f3075a --- /dev/null +++ b/kirby/config/areas/system.php @@ -0,0 +1,13 @@ + 'settings', + 'label' => I18n::translate('view.system'), + 'menu' => true, + 'dialogs' => require __DIR__ . '/system/dialogs.php', + 'views' => require __DIR__ . '/system/views.php' + ]; +}; diff --git a/kirby/config/areas/system/dialogs.php b/kirby/config/areas/system/dialogs.php new file mode 100644 index 0000000..e8dd694 --- /dev/null +++ b/kirby/config/areas/system/dialogs.php @@ -0,0 +1,113 @@ + [ + 'load' => function () { + $kirby = App::instance(); + $license = $kirby->system()->license(); + $obfuscated = $kirby->user()->isAdmin() === false; + $status = $license->status(); + $renewable = $status->renewable(); + + return [ + 'component' => 'k-license-dialog', + 'props' => [ + 'license' => [ + 'code' => $license->code($obfuscated), + 'icon' => $status->icon(), + 'info' => $status->info($license->renewal('Y-m-d', 'date')), + 'theme' => $status->theme(), + 'type' => $license->label(), + ], + 'cancelButton' => $renewable, + 'submitButton' => $renewable ? [ + 'icon' => 'refresh', + 'text' => I18n::translate('renew'), + 'theme' => 'love', + ] : false, + ] + ]; + }, + 'submit' => function () { + // @codeCoverageIgnoreStart + $response = App::instance()->system()->license()->upgrade(); + + // the upgrade is still needed + if ($response['status'] === 'upgrade') { + return [ + 'redirect' => $response['url'] + ]; + } + + // the upgrade has already been completed + if ($response['status'] === 'complete') { + return [ + 'event' => 'system.renew', + 'message' => I18n::translate('license.success') + ]; + } + + throw new LogicException('The upgrade failed'); + // @codeCoverageIgnoreEnd + } + ], + // license registration + 'registration' => [ + 'load' => function () { + $system = App::instance()->system(); + $local = $system->isLocal(); + + return [ + 'component' => 'k-form-dialog', + 'props' => [ + 'fields' => [ + 'domain' => [ + 'label' => I18n::translate('license.activate.label'), + 'type' => 'info', + 'theme' => $local ? 'warning' : 'info', + 'text' => I18n::template('license.activate.' . ($local ? 'local' : 'domain'), ['host' => $system->indexUrl()]) + ], + 'license' => [ + 'label' => I18n::translate('license.code.label'), + 'type' => 'text', + 'required' => true, + 'counter' => false, + 'placeholder' => 'K-', + 'help' => I18n::translate('license.code.help') . ' ' . '' . I18n::translate('license.buy') . ' →' + ], + 'email' => Field::email(['required' => true]) + ], + 'submitButton' => [ + 'icon' => 'key', + 'text' => I18n::translate('activate'), + 'theme' => 'love', + ], + 'value' => [ + 'license' => null, + 'email' => null + ] + ] + ]; + }, + 'submit' => function () { + // @codeCoverageIgnoreStart + $kirby = App::instance(); + $kirby->system()->register( + $kirby->request()->get('license'), + $kirby->request()->get('email') + ); + + return [ + 'event' => 'system.register', + 'message' => I18n::translate('license.success') + ]; + // @codeCoverageIgnoreEnd + } + ], +]; diff --git a/kirby/config/areas/system/views.php b/kirby/config/areas/system/views.php new file mode 100644 index 0000000..a24d1bc --- /dev/null +++ b/kirby/config/areas/system/views.php @@ -0,0 +1,101 @@ + [ + 'pattern' => 'system', + 'action' => function () { + $kirby = App::instance(); + $system = $kirby->system(); + $updateStatus = $system->updateStatus(); + $license = $system->license(); + + $environment = [ + [ + 'label' => $license->status()->label(), + 'value' => $license->label(), + 'theme' => $license->status()->theme(), + 'icon' => $license->status()->icon(), + 'dialog' => $license->status()->dialog() + ], + [ + 'label' => $updateStatus?->label() ?? I18n::translate('version'), + 'value' => $kirby->version(), + 'link' => $updateStatus?->url() ?? + 'https://github.com/getkirby/kirby/releases/tag/' . $kirby->version(), + 'theme' => $updateStatus?->theme(), + 'icon' => $updateStatus?->icon() ?? 'info' + ], + [ + 'label' => 'PHP', + 'value' => phpversion(), + 'icon' => 'code' + ], + [ + 'label' => I18n::translate('server'), + 'value' => $system->serverSoftware() ?? '?', + 'icon' => 'server' + ] + ]; + + $exceptions = $updateStatus?->exceptionMessages() ?? []; + + $plugins = $system->plugins()->values(function ($plugin) use (&$exceptions) { + $authors = $plugin->authorsNames(); + $updateStatus = $plugin->updateStatus(); + $version = $updateStatus?->toArray() ?? $plugin->version() ?? '–'; + + if ($updateStatus !== null) { + $exceptions = array_merge($exceptions, $updateStatus->exceptionMessages()); + } + + return [ + 'author' => empty($authors) ? '–' : $authors, + 'license' => $plugin->license() ?? '–', + 'name' => [ + 'text' => $plugin->name() ?? '–', + 'href' => $plugin->link(), + ], + 'version' => $version, + ]; + }); + + $security = $updateStatus?->messages() ?? []; + + if ($kirby->option('debug', false) === true) { + $security[] = [ + 'id' => 'debug', + 'text' => I18n::translate('system.issues.debug'), + 'link' => 'https://getkirby.com/security/debug' + ]; + } + + if ($kirby->environment()->https() !== true) { + $security[] = [ + 'id' => 'https', + 'text' => I18n::translate('system.issues.https'), + 'link' => 'https://getkirby.com/security/https' + ]; + } + + return [ + 'component' => 'k-system-view', + 'props' => [ + 'environment' => $environment, + 'exceptions' => $kirby->option('debug') === true ? $exceptions : [], + 'info' => $system->info(), + 'plugins' => $plugins, + 'security' => $security, + 'urls' => [ + 'content' => $system->exposedFileUrl('content'), + 'git' => $system->exposedFileUrl('git'), + 'kirby' => $system->exposedFileUrl('kirby'), + 'site' => $system->exposedFileUrl('site') + ] + ] + ]; + } + ], +]; diff --git a/kirby/config/areas/users.php b/kirby/config/areas/users.php new file mode 100644 index 0000000..dbccc5f --- /dev/null +++ b/kirby/config/areas/users.php @@ -0,0 +1,17 @@ + 'users', + 'label' => I18n::translate('view.users'), + 'search' => 'users', + 'menu' => true, + 'dialogs' => require __DIR__ . '/users/dialogs.php', + 'drawers' => require __DIR__ . '/users/drawers.php', + 'dropdowns' => require __DIR__ . '/users/dropdowns.php', + 'searches' => require __DIR__ . '/users/searches.php', + 'views' => require __DIR__ . '/users/views.php' + ]; +}; diff --git a/kirby/config/areas/users/dialogs.php b/kirby/config/areas/users/dialogs.php new file mode 100644 index 0000000..1f1da96 --- /dev/null +++ b/kirby/config/areas/users/dialogs.php @@ -0,0 +1,346 @@ + [ + 'pattern' => 'users/create', + 'load' => function () { + $kirby = App::instance(); + + // get default value for role + if ($role = $kirby->request()->get('role')) { + $role = $kirby->roles()->find($role)?->id(); + } + + return [ + 'component' => 'k-form-dialog', + 'props' => [ + 'fields' => [ + 'name' => Field::username(), + 'email' => Field::email([ + 'link' => false, + 'required' => true + ]), + 'password' => Field::password(), + 'translation' => Field::translation([ + 'required' => true + ]), + 'role' => Field::role([ + 'required' => true + ]) + ], + 'submitButton' => I18n::translate('create'), + 'value' => [ + 'name' => '', + 'email' => '', + 'password' => '', + 'translation' => $kirby->panelLanguage(), + 'role' => $role ?? $kirby->user()->role()->name() + ] + ] + ]; + }, + 'submit' => function () { + $kirby = App::instance(); + + $kirby->users()->create([ + 'name' => $kirby->request()->get('name'), + 'email' => $kirby->request()->get('email'), + 'password' => $kirby->request()->get('password'), + 'language' => $kirby->request()->get('translation'), + 'role' => $kirby->request()->get('role') + ]); + + return [ + 'event' => 'user.create' + ]; + } + ], + + // change email + 'user.changeEmail' => [ + 'pattern' => 'users/(:any)/changeEmail', + 'load' => function (string $id) { + $user = Find::user($id); + + return [ + 'component' => 'k-form-dialog', + 'props' => [ + 'fields' => [ + 'email' => [ + 'label' => I18n::translate('email'), + 'required' => true, + 'type' => 'email', + 'preselect' => true + ] + ], + 'submitButton' => I18n::translate('change'), + 'value' => [ + 'email' => $user->email() + ] + ] + ]; + }, + 'submit' => function (string $id) { + $request = App::instance()->request(); + + Find::user($id)->changeEmail($request->get('email')); + + return [ + 'event' => 'user.changeEmail' + ]; + } + ], + + // change language + 'user.changeLanguage' => [ + 'pattern' => 'users/(:any)/changeLanguage', + 'load' => function (string $id) { + $user = Find::user($id); + + return [ + 'component' => 'k-form-dialog', + 'props' => [ + 'fields' => [ + 'translation' => Field::translation(['required' => true]) + ], + 'submitButton' => I18n::translate('change'), + 'value' => [ + 'translation' => $user->language() + ] + ] + ]; + }, + 'submit' => function (string $id) { + $request = App::instance()->request(); + + Find::user($id)->changeLanguage($request->get('translation')); + + return [ + 'event' => 'user.changeLanguage', + 'reload' => [ + 'globals' => '$translation' + ] + ]; + } + ], + + // change name + 'user.changeName' => [ + 'pattern' => 'users/(:any)/changeName', + 'load' => function (string $id) { + $user = Find::user($id); + + return [ + 'component' => 'k-form-dialog', + 'props' => [ + 'fields' => [ + 'name' => Field::username([ + 'preselect' => true + ]) + ], + 'submitButton' => I18n::translate('rename'), + 'value' => [ + 'name' => $user->name()->value() + ] + ] + ]; + }, + 'submit' => function (string $id) { + $request = App::instance()->request(); + + Find::user($id)->changeName($request->get('name')); + + return [ + 'event' => 'user.changeName' + ]; + } + ], + + // change password + 'user.changePassword' => [ + 'pattern' => 'users/(:any)/changePassword', + 'load' => function (string $id) { + $user = Find::user($id); + + return [ + 'component' => 'k-form-dialog', + 'props' => [ + 'fields' => [ + 'password' => Field::password([ + 'label' => I18n::translate('user.changePassword.new'), + ]), + 'passwordConfirmation' => Field::password([ + 'label' => I18n::translate('user.changePassword.new.confirm'), + ]) + ], + 'submitButton' => I18n::translate('change'), + ] + ]; + }, + 'submit' => function (string $id) { + $request = App::instance()->request(); + + $user = Find::user($id); + $password = $request->get('password'); + $passwordConfirmation = $request->get('passwordConfirmation'); + + // validate the password + UserRules::validPassword($user, $password ?? ''); + + // compare passwords + if ($password !== $passwordConfirmation) { + throw new InvalidArgumentException([ + 'key' => 'user.password.notSame' + ]); + } + + // change password if everything's fine + $user->changePassword($password); + + return [ + 'event' => 'user.changePassword' + ]; + } + ], + + // change role + 'user.changeRole' => [ + 'pattern' => 'users/(:any)/changeRole', + 'load' => function (string $id) { + $user = Find::user($id); + + return [ + 'component' => 'k-form-dialog', + 'props' => [ + 'fields' => [ + 'role' => Field::role([ + 'label' => I18n::translate('user.changeRole.select'), + 'required' => true, + ]) + ], + 'submitButton' => I18n::translate('user.changeRole'), + 'value' => [ + 'role' => $user->role()->name() + ] + ] + ]; + }, + 'submit' => function (string $id) { + $request = App::instance()->request(); + + $user = Find::user($id)->changeRole($request->get('role')); + + return [ + 'event' => 'user.changeRole', + 'user' => $user->toArray() + ]; + } + ], + + // delete + 'user.delete' => [ + 'pattern' => 'users/(:any)/delete', + 'load' => function (string $id) { + $user = Find::user($id); + $i18nPrefix = $user->isLoggedIn() ? 'account' : 'user'; + + return [ + 'component' => 'k-remove-dialog', + 'props' => [ + 'text' => I18n::template($i18nPrefix . '.delete.confirm', [ + 'email' => Escape::html($user->email()) + ]) + ] + ]; + }, + 'submit' => function (string $id) { + $user = Find::user($id); + $redirect = false; + $referrer = Panel::referrer(); + $url = $user->panel()->url(true); + + $user->delete(); + + // redirect to the users view + // if the dialog has been opened in the user view + if ($referrer === $url) { + $redirect = '/users'; + } + + // logout the user if they deleted themselves + if ($user->isLoggedIn()) { + $redirect = '/logout'; + } + + return [ + 'event' => 'user.delete', + 'dispatch' => ['content/remove' => [$url]], + 'redirect' => $redirect + ]; + } + ], + + // user field dialogs + 'user.fields' => [ + 'pattern' => '(users/.*?)/fields/(:any)/(:all?)', + 'load' => $fields['model']['load'], + 'submit' => $fields['model']['submit'] + ], + + // change file name + 'user.file.changeName' => [ + 'pattern' => '(users/.*?)/files/(:any)/changeName', + 'load' => $files['changeName']['load'], + 'submit' => $files['changeName']['submit'], + ], + + // change file sort + 'user.file.changeSort' => [ + 'pattern' => '(users/.*?)/files/(:any)/changeSort', + 'load' => $files['changeSort']['load'], + 'submit' => $files['changeSort']['submit'], + ], + + // change file template + 'user.file.changeTemplate' => [ + 'pattern' => '(users/.*?)/files/(:any)/changeTemplate', + 'load' => $files['changeTemplate']['load'], + 'submit' => $files['changeTemplate']['submit'], + ], + + // delete file + 'user.file.delete' => [ + 'pattern' => '(users/.*?)/files/(:any)/delete', + 'load' => $files['delete']['load'], + 'submit' => $files['delete']['submit'], + ], + + // user file fields dialogs + 'user.file.fields' => [ + 'pattern' => '(users/.*?)/files/(:any)/fields/(:any)/(:all?)', + 'load' => $fields['file']['load'], + 'submit' => $fields['file']['submit'] + ], + + // user disable TOTP + 'user.totp.disable' => [ + 'pattern' => 'users/(:any)/totp/disable', + 'load' => fn (string $id) => (new UserTotpDisableDialog($id))->load(), + 'submit' => fn (string $id) => (new UserTotpDisableDialog($id))->submit() + ], +]; diff --git a/kirby/config/areas/users/drawers.php b/kirby/config/areas/users/drawers.php new file mode 100644 index 0000000..10d6bd1 --- /dev/null +++ b/kirby/config/areas/users/drawers.php @@ -0,0 +1,18 @@ + [ + 'pattern' => '(users/.*?)/fields/(:any)/(:all?)', + 'load' => $fields['model']['load'], + 'submit' => $fields['model']['submit'] + ], + // user file fields drawers + 'user.file.fields' => [ + 'pattern' => '(users/.*?)/files/(:any)/fields/(:any)/(:all?)', + 'load' => $fields['file']['load'], + 'submit' => $fields['file']['submit'] + ], +]; diff --git a/kirby/config/areas/users/dropdowns.php b/kirby/config/areas/users/dropdowns.php new file mode 100644 index 0000000..ec30a5f --- /dev/null +++ b/kirby/config/areas/users/dropdowns.php @@ -0,0 +1,18 @@ + [ + 'pattern' => 'users/(:any)', + 'options' => function (string $id) { + return Find::user($id)->panel()->dropdown(); + } + ], + 'user.file' => [ + 'pattern' => '(users/.*?)/files/(:any)', + 'options' => $files['file'] + ] +]; diff --git a/kirby/config/areas/users/searches.php b/kirby/config/areas/users/searches.php new file mode 100644 index 0000000..82bce90 --- /dev/null +++ b/kirby/config/areas/users/searches.php @@ -0,0 +1,29 @@ + [ + 'label' => I18n::translate('users'), + 'icon' => 'users', + 'query' => function (string $query = null, int $limit, int $page) { + $kirby = App::instance(); + $users = $kirby->users() + ->search($query) + ->paginate($limit, $page); + + return [ + 'results' => $users->values(fn ($user) => [ + 'image' => $user->panel()->image(), + 'text' => Escape::html($user->username()), + 'link' => $user->panel()->url(true), + 'info' => Escape::html($user->role()->title()), + 'uuid' => $user->uuid()->toString(), + ]), + 'pagination' => $users->pagination()->toArray() + ]; + } + ] +]; diff --git a/kirby/config/areas/users/views.php b/kirby/config/areas/users/views.php new file mode 100644 index 0000000..5f0ce9d --- /dev/null +++ b/kirby/config/areas/users/views.php @@ -0,0 +1,70 @@ + [ + 'pattern' => 'users', + 'action' => function () { + $kirby = App::instance(); + $role = $kirby->request()->get('role'); + $roles = $kirby->roles()->toArray(fn ($role) => [ + 'id' => $role->id(), + 'title' => $role->title(), + ]); + + return [ + 'component' => 'k-users-view', + 'props' => [ + 'role' => function () use ($kirby, $roles, $role) { + if ($role) { + return $roles[$role] ?? null; + } + }, + 'roles' => array_values($roles), + 'users' => function () use ($kirby, $role) { + $users = $kirby->users(); + + if (empty($role) === false) { + $users = $users->role($role); + } + + // sort users alphabetically + $users = $users->sortBy('username', 'asc'); + + // paginate + $users = $users->paginate([ + 'limit' => 20, + 'page' => $kirby->request()->get('page') + ]); + + return [ + 'data' => $users->values(fn ($user) => [ + 'id' => $user->id(), + 'image' => $user->panel()->image(), + 'info' => Escape::html($user->role()->title()), + 'link' => $user->panel()->url(true), + 'text' => Escape::html($user->username()) + ]), + 'pagination' => $users->pagination()->toArray() + ]; + }, + ] + ]; + } + ], + 'user' => [ + 'pattern' => 'users/(:any)', + 'action' => function (string $id) { + return Find::user($id)->panel()->view(); + } + ], + 'user.file' => [ + 'pattern' => 'users/(:any)/files/(:any)', + 'action' => function (string $id, string $filename) { + return Find::file('users/' . $id, $filename)->panel()->view(); + } + ], +]; diff --git a/kirby/config/blocks/code/code.php b/kirby/config/blocks/code/code.php new file mode 100644 index 0000000..a7f88ff --- /dev/null +++ b/kirby/config/blocks/code/code.php @@ -0,0 +1,2 @@ + +
code()->html(false) ?>
diff --git a/kirby/config/blocks/code/code.yml b/kirby/config/blocks/code/code.yml new file mode 100644 index 0000000..b697784 --- /dev/null +++ b/kirby/config/blocks/code/code.yml @@ -0,0 +1,59 @@ +name: field.blocks.code.name +icon: code +wysiwyg: true +preview: code +fields: + code: + label: field.blocks.code.name + type: textarea + placeholder: field.blocks.code.placeholder + buttons: false + font: monospace + language: + label: field.blocks.code.language + type: select + default: text + options: + bash: Bash + basic: BASIC + c: C + clojure: Clojure + cpp: C++ + csharp: C# + css: CSS + diff: Diff + elixir: Elixir + elm: Elm + erlang: Erlang + go: Go + graphql: GraphQL + haskell: Haskell + html: HTML + java: Java + js: JavaScript + json: JSON + latext: LaTeX + less: Less + lisp: Lisp + lua: Lua + makefile: Makefile + markdown: Markdown + markup: Markup + objectivec: Objective-C + pascal: Pascal + perl: Perl + php: PHP + text: Plain Text + python: Python + r: R + ruby: Ruby + rust: Rust + sass: Sass + scss: SCSS + shell: Shell + sql: SQL + swift: Swift + typescript: TypeScript + vbnet: VB.net + xml: XML + yaml: YAML diff --git a/kirby/config/blocks/gallery/gallery.php b/kirby/config/blocks/gallery/gallery.php new file mode 100644 index 0000000..033575b --- /dev/null +++ b/kirby/config/blocks/gallery/gallery.php @@ -0,0 +1,20 @@ +caption(); +$crop = $block->crop()->isTrue(); +$ratio = $block->ratio()->or('auto'); +?> + $ratio, 'data-crop' => $crop], null, ' ') ?>> +
    + images()->toFiles() as $image): ?> +
  • + +
  • + +
+ isNotEmpty()): ?> +
+ +
+ + diff --git a/kirby/config/blocks/gallery/gallery.yml b/kirby/config/blocks/gallery/gallery.yml new file mode 100644 index 0000000..3c6aad9 --- /dev/null +++ b/kirby/config/blocks/gallery/gallery.yml @@ -0,0 +1,40 @@ +name: field.blocks.gallery.name +icon: dashboard +preview: gallery +fields: + images: + label: field.blocks.gallery.images.label + type: files + query: model.images + multiple: true + layout: cards + size: small + empty: field.blocks.gallery.images.empty + uploads: + template: blocks/image + image: + ratio: 1/1 + caption: + label: field.blocks.image.caption + type: writer + icon: text + inline: true + ratio: + label: field.blocks.image.ratio + type: select + placeholder: Auto + width: 1/2 + options: + 1/1: "1:1" + 16/9: "16:9" + 10/8: "10:8" + 21/9: "21:9" + 7/5: "7:5" + 4/3: "4:3" + 5/3: "5:3" + 3/2: "3:2" + 3/1: "3:1" + crop: + label: field.blocks.image.crop + type: toggle + width: 1/2 diff --git a/kirby/config/blocks/heading/heading.php b/kirby/config/blocks/heading/heading.php new file mode 100644 index 0000000..e864bbf --- /dev/null +++ b/kirby/config/blocks/heading/heading.php @@ -0,0 +1,2 @@ + +<level()->or('h2') ?>>text() ?>> diff --git a/kirby/config/blocks/heading/heading.yml b/kirby/config/blocks/heading/heading.yml new file mode 100644 index 0000000..f34fe53 --- /dev/null +++ b/kirby/config/blocks/heading/heading.yml @@ -0,0 +1,35 @@ +name: field.blocks.heading.name +icon: title +wysiwyg: true +preview: heading +fields: + level: + label: field.blocks.heading.level + type: toggles + empty: false + default: "h2" + labels: false + options: + - value: h1 + icon: h1 + text: H1 + - value: h2 + icon: h2 + text: H2 + - value: h3 + icon: h3 + text: H3 + - value: h4 + icon: h4 + text: H4 + - value: h5 + icon: h5 + text: H5 + - value: h6 + icon: h6 + text: H6 + text: + label: field.blocks.heading.text + type: writer + inline: true + placeholder: field.blocks.heading.placeholder diff --git a/kirby/config/blocks/image/image.php b/kirby/config/blocks/image/image.php new file mode 100644 index 0000000..1638744 --- /dev/null +++ b/kirby/config/blocks/image/image.php @@ -0,0 +1,35 @@ +alt(); +$caption = $block->caption(); +$crop = $block->crop()->isTrue(); +$link = $block->link(); +$ratio = $block->ratio()->or('auto'); +$src = null; + +if ($block->location() == 'web') { + $src = $block->src()->esc(); +} elseif ($image = $block->image()->toFile()) { + $alt = $alt->or($image->alt()); + $src = $image->url(); +} + +?> + + $ratio, 'data-crop' => $crop], null, ' ') ?>> + isNotEmpty()): ?> + + <?= $alt->esc() ?> + + + <?= $alt->esc() ?> + + + isNotEmpty()): ?> +
+ +
+ + + diff --git a/kirby/config/blocks/image/image.yml b/kirby/config/blocks/image/image.yml new file mode 100644 index 0000000..ada9313 --- /dev/null +++ b/kirby/config/blocks/image/image.yml @@ -0,0 +1,60 @@ +name: field.blocks.image.name +icon: image +preview: image +fields: + location: + label: field.blocks.image.location + type: radio + columns: 2 + default: "kirby" + options: + kirby: "{{ t('field.blocks.image.location.internal') }}" + web: "{{ t('field.blocks.image.location.external') }}" + image: + label: field.blocks.image.name + type: files + query: model.images + multiple: false + image: + back: black + uploads: + template: blocks/image + when: + location: kirby + src: + label: field.blocks.image.url + type: url + when: + location: web + alt: + label: field.blocks.image.alt + type: text + icon: title + caption: + label: field.blocks.image.caption + type: writer + icon: text + inline: true + link: + label: field.blocks.image.link + type: text + icon: url + ratio: + label: field.blocks.image.ratio + type: select + placeholder: Auto + width: 1/2 + options: + 1/1: "1:1" + 16/9: "16:9" + 10/8: "10:8" + 21/9: "21:9" + 7/5: "7:5" + 4/3: "4:3" + 5/3: "5:3" + 3/2: "3:2" + 3/1: "3:1" + crop: + label: field.blocks.image.crop + type: toggle + width: 1/2 diff --git a/kirby/config/blocks/line/line.php b/kirby/config/blocks/line/line.php new file mode 100644 index 0000000..09d5649 --- /dev/null +++ b/kirby/config/blocks/line/line.php @@ -0,0 +1 @@ +
diff --git a/kirby/config/blocks/line/line.yml b/kirby/config/blocks/line/line.yml new file mode 100644 index 0000000..dcff956 --- /dev/null +++ b/kirby/config/blocks/line/line.yml @@ -0,0 +1,4 @@ +name: field.blocks.line.name +icon: divider +preview: line +wysiwyg: true diff --git a/kirby/config/blocks/list/list.php b/kirby/config/blocks/list/list.php new file mode 100644 index 0000000..012a156 --- /dev/null +++ b/kirby/config/blocks/list/list.php @@ -0,0 +1,2 @@ + +text(); diff --git a/kirby/config/blocks/list/list.yml b/kirby/config/blocks/list/list.yml new file mode 100644 index 0000000..ded7519 --- /dev/null +++ b/kirby/config/blocks/list/list.yml @@ -0,0 +1,8 @@ +name: field.blocks.list.name +icon: list-bullet +wysiwyg: true +preview: list +fields: + text: + label: field.blocks.list.name + type: list diff --git a/kirby/config/blocks/markdown/markdown.php b/kirby/config/blocks/markdown/markdown.php new file mode 100644 index 0000000..7ab685c --- /dev/null +++ b/kirby/config/blocks/markdown/markdown.php @@ -0,0 +1,2 @@ + +text()->kt(); diff --git a/kirby/config/blocks/markdown/markdown.yml b/kirby/config/blocks/markdown/markdown.yml new file mode 100644 index 0000000..cecafe4 --- /dev/null +++ b/kirby/config/blocks/markdown/markdown.yml @@ -0,0 +1,11 @@ +name: field.blocks.markdown.name +icon: markdown +preview: markdown +wysiwyg: true +fields: + text: + label: field.blocks.markdown.label + placeholder: field.blocks.markdown.placeholder + type: textarea + buttons: false + font: monospace diff --git a/kirby/config/blocks/quote/quote.php b/kirby/config/blocks/quote/quote.php new file mode 100644 index 0000000..6ec1290 --- /dev/null +++ b/kirby/config/blocks/quote/quote.php @@ -0,0 +1,9 @@ + +
+ text() ?> + citation()->isNotEmpty()): ?> +
+ citation() ?> +
+ +
diff --git a/kirby/config/blocks/quote/quote.yml b/kirby/config/blocks/quote/quote.yml new file mode 100644 index 0000000..b14e126 --- /dev/null +++ b/kirby/config/blocks/quote/quote.yml @@ -0,0 +1,17 @@ +name: field.blocks.quote.name +icon: quote +wysiwyg: true +preview: quote +fields: + text: + label: field.blocks.quote.text.label + placeholder: field.blocks.quote.text.placeholder + type: writer + inline: true + icon: quote + citation: + label: field.blocks.quote.citation.label + placeholder: field.blocks.quote.citation.placeholder + type: writer + inline: true + icon: user diff --git a/kirby/config/blocks/table/table.yml b/kirby/config/blocks/table/table.yml new file mode 100644 index 0000000..8e0d0b2 --- /dev/null +++ b/kirby/config/blocks/table/table.yml @@ -0,0 +1,3 @@ +name: Table +icon: menu +preview: table diff --git a/kirby/config/blocks/text/text.php b/kirby/config/blocks/text/text.php new file mode 100644 index 0000000..012a156 --- /dev/null +++ b/kirby/config/blocks/text/text.php @@ -0,0 +1,2 @@ + +text(); diff --git a/kirby/config/blocks/text/text.yml b/kirby/config/blocks/text/text.yml new file mode 100644 index 0000000..90117a5 --- /dev/null +++ b/kirby/config/blocks/text/text.yml @@ -0,0 +1,9 @@ +name: field.blocks.text.name +icon: text +wysiwyg: true +preview: text +fields: + text: + type: writer + nodes: false + placeholder: field.blocks.text.placeholder diff --git a/kirby/config/blocks/video/video.php b/kirby/config/blocks/video/video.php new file mode 100644 index 0000000..a1b1a31 --- /dev/null +++ b/kirby/config/blocks/video/video.php @@ -0,0 +1,31 @@ +caption(); + +if ( + $block->location() == 'kirby' && + $video = $block->video()->toFile() +) { + $url = $video->url(); + $attrs = array_filter([ + 'autoplay' => $block->autoplay()->toBool(), + 'controls' => $block->controls()->toBool(), + 'loop' => $block->loop()->toBool(), + 'muted' => $block->muted()->toBool(), + 'poster' => $block->poster()->toFile()?->url(), + 'preload' => $block->preload()->value(), + ]); +} else { + $url = $block->url(); +} +?> + +
+ + isNotEmpty()): ?> +
+ +
+ diff --git a/kirby/config/blocks/video/video.yml b/kirby/config/blocks/video/video.yml new file mode 100644 index 0000000..b5fc104 --- /dev/null +++ b/kirby/config/blocks/video/video.yml @@ -0,0 +1,78 @@ +name: field.blocks.video.name +icon: video +preview: video +fields: + location: + label: field.blocks.video.location + type: radio + columns: 2 + default: "web" + options: + kirby: "{{ t('field.blocks.image.location.internal') }}" + web: "{{ t('field.blocks.image.location.external') }}" + url: + label: field.blocks.video.url.label + type: url + placeholder: field.blocks.video.url.placeholder + when: + location: web + video: + label: field.blocks.video.name + type: files + query: model.videos + multiple: false + # you might want to add a template for videos here + when: + location: kirby + poster: + label: field.blocks.video.poster + type: files + query: model.images + multiple: false + image: + back: black + uploads: + template: blocks/image + when: + location: kirby + caption: + label: field.blocks.video.caption + type: writer + inline: true + autoplay: + label: field.blocks.video.autoplay + type: toggle + width: 1/3 + when: + location: kirby + muted: + label: field.blocks.video.muted + type: toggle + width: 1/3 + default: true + when: + location: kirby + loop: + label: field.blocks.video.loop + type: toggle + width: 1/3 + when: + location: kirby + controls: + label: field.blocks.video.controls + type: toggle + width: 1/3 + default: true + when: + location: kirby + preload: + label: field.blocks.video.preload + type: select + width: 2/3 + default: auto + options: + - auto + - metadata + - none + when: + location: kirby diff --git a/kirby/config/components.php b/kirby/config/components.php new file mode 100644 index 0000000..637e96f --- /dev/null +++ b/kirby/config/components.php @@ -0,0 +1,427 @@ + fn (App $kirby, string $url, $options = null): string => $url, + + /** + * Add your own email provider + */ + 'email' => function ( + App $kirby, + array $props = [], + bool $debug = false + ) { + return new Emailer($props, $debug); + }, + + /** + * Modify URLs for file objects + * + * @param \Kirby\Cms\File $file The original file object + */ + 'file::url' => function ( + App $kirby, + File $file + ): string { + return $file->mediaUrl(); + }, + + /** + * Adapt file characteristics + * + * @param \Kirby\Cms\File|\Kirby\Filesystem\Asset $file The file object + * @param array $options All thumb options (width, height, crop, blur, grayscale) + * @return \Kirby\Cms\File|\Kirby\Cms\FileVersion|\Kirby\Filesystem\Asset + */ + 'file::version' => function ( + App $kirby, + $file, + array $options = [] + ) { + // if file is not resizable, return + if ($file->isResizable() === false) { + return $file; + } + + // create url and root + $mediaRoot = dirname($file->mediaRoot()); + $template = $mediaRoot . '/{{ name }}{{ attributes }}.{{ extension }}'; + $thumbRoot = (new Filename($file->root(), $template, $options))->toString(); + $thumbName = basename($thumbRoot); + + // check if the thumb already exists + if (file_exists($thumbRoot) === false) { + // if not, create job file + $job = $mediaRoot . '/.jobs/' . $thumbName . '.json'; + + try { + Data::write($job, array_merge($options, [ + 'filename' => $file->filename() + ])); + } catch (Throwable) { + // if thumb doesn't exist yet and job file cannot + // be created, return + return $file; + } + } + + return new FileVersion([ + 'modifications' => $options, + 'original' => $file, + 'root' => $thumbRoot, + 'url' => dirname($file->mediaUrl()) . '/' . $thumbName, + ]); + }, + + /** + * Used by the `js()` helper + * + * @param string $url Relative or absolute URL + * @param string|array $options An array of attributes for the link tag or a media attribute string + */ + 'js' => fn (App $kirby, string $url, $options = null): string => $url, + + /** + * Add your own Markdown parser + * + * @param string $text Text to parse + * @param array $options Markdown options + */ + 'markdown' => function ( + App $kirby, + string $text = null, + array $options = [] + ): string { + static $markdown; + static $config; + + // if the config options have changed or the component is called for the first time, + // (re-)initialize the parser object + if ($config !== $options) { + $markdown = new Markdown($options); + $config = $options; + } + + return $markdown->parse($text, $options['inline'] ?? false); + }, + + /** + * Add your own search engine + * + * @param \Kirby\Cms\Collection $collection Collection of searchable models + */ + 'search' => function ( + App $kirby, + Collection $collection, + string|null $query = null, + string|array $params = [] + ): Collection { + if (is_string($params) === true) { + $params = ['fields' => Str::split($params, '|')]; + } + + $defaults = [ + 'fields' => [], + 'minlength' => 2, + 'score' => [], + 'words' => false, + ]; + + $collection = clone $collection; + $options = array_merge($defaults, $params); + $query = trim($query ?? ''); + + // empty or too short search query + if (Str::length($query) < $options['minlength']) { + return $collection->limit(0); + } + + $words = preg_replace('/(\s)/u', ',', $query); + $words = Str::split($words, ',', $options['minlength']); + + if (empty($options['stopwords']) === false) { + $words = array_diff($words, $options['stopwords']); + } + + // returns an empty collection if there is no search word + if (empty($words) === true) { + return $collection->limit(0); + } + + $words = A::map( + $words, + fn ($value) => Str::wrap(preg_quote($value), $options['words'] ? '\b' : '') + ); + + $exact = preg_quote($query); + + if ($options['words']) { + $exact = '(\b' . $exact . '\b)'; + } + + $query = Str::lower($query); + $preg = '!(' . implode('|', $words) . ')!iu'; + $scores = []; + + $results = $collection->filter(function ($item) use ($query, $exact, $preg, $options, &$scores) { + $data = $item->content()->toArray(); + $keys = array_keys($data); + $keys[] = 'id'; + + if ($item instanceof User) { + $keys[] = 'name'; + $keys[] = 'email'; + $keys[] = 'role'; + } elseif ($item instanceof Page) { + // apply the default score for pages + $options['score'] = array_merge( + ['id' => 64, 'title' => 64], + $options['score'] + ); + } + + if (empty($options['fields']) === false) { + $fields = array_map('strtolower', $options['fields']); + $keys = array_intersect($keys, $fields); + } + + $scoring = [ + 'hits' => 0, + 'score' => 0 + ]; + + foreach ($keys as $key) { + $score = $options['score'][$key] ?? 1; + $value = $data[$key] ?? (string)$item->$key(); + + $lowerValue = Str::lower($value); + + // check for exact matches + if ($query == $lowerValue) { + $scoring['score'] += 16 * $score; + $scoring['hits'] += 1; + + // check for exact beginning matches + } elseif ( + $options['words'] === false && + Str::startsWith($lowerValue, $query) === true + ) { + $scoring['score'] += 8 * $score; + $scoring['hits'] += 1; + + // check for exact query matches + } elseif ($matches = preg_match_all('!' . $exact . '!ui', $value, $r)) { + $scoring['score'] += 2 * $score; + $scoring['hits'] += $matches; + } + + // check for any match + if ($matches = preg_match_all($preg, $value, $r)) { + $scoring['score'] += $matches * $score; + $scoring['hits'] += $matches; + } + } + + $scores[$item->id()] = $scoring; + + return $scoring['hits'] > 0; + }); + + return $results->sort( + fn ($item) => $scores[$item->id()]['score'], + 'desc' + ); + }, + + /** + * Add your own SmartyPants parser + * + * @param string $text Text to parse + * @param array $options SmartyPants options + */ + 'smartypants' => function ( + App $kirby, + string $text = null, + array $options = [] + ): string { + static $smartypants; + static $config; + + // if the config options have changed or the component is called for the first time, + // (re-)initialize the parser object + if ($config !== $options) { + $smartypants = new Smartypants($options); + $config = $options; + } + + return $smartypants->parse($text); + }, + + /** + * Add your own snippet loader + * + * @param string|array $name Snippet name + * @param array $data Data array for the snippet + */ + 'snippet' => function ( + App $kirby, + string|array|null $name, + array $data = [], + bool $slots = false + ): Snippet|string { + return Snippet::factory($name, $data, $slots); + }, + + /** + * Add your own template engine + * + * @param string $name Template name + * @param string $type Extension type + * @param string $defaultType Default extension type + * @return \Kirby\Template\Template + */ + 'template' => function ( + App $kirby, + string $name, + string $type = 'html', + string $defaultType = 'html' + ) { + return new Template($name, $type, $defaultType); + }, + + /** + * Add your own thumb generator + * + * @param string $src Root of the original file + * @param string $dst Template string for the root to the desired destination + * @param array $options All thumb options that should be applied: `width`, `height`, `crop`, `blur`, `grayscale` + * @return string + */ + 'thumb' => function ( + App $kirby, + string $src, + string $dst, + array $options + ): string { + $darkroom = Darkroom::factory( + $kirby->option('thumbs.driver', 'gd'), + $kirby->option('thumbs', []) + ); + $options = $darkroom->preprocess($src, $options); + $root = (new Filename($src, $dst, $options))->toString(); + + F::copy($src, $root, true); + $darkroom->process($root, $options); + + return $root; + }, + + /** + * Modify all URLs + * + * @param string|null $path URL path + * @param array|string|null $options Array of options for the Uri class + * @throws \Kirby\Exception\NotFoundException If an invalid UUID was passed + */ + 'url' => function ( + App $kirby, + string $path = null, + $options = null + ): string { + $language = null; + + // get language from simple string option + if (is_string($options) === true) { + $language = $options; + $options = null; + } + + // get language from array + if (is_array($options) === true && isset($options['language']) === true) { + $language = $options['language']; + unset($options['language']); + } + + // get a language url for the linked page, if the page can be found + if ($kirby->multilang() === true) { + $parts = Str::split($path, '#'); + + if ($parts[0] ?? null) { + $page = $kirby->site()->find($parts[0]); + } else { + $page = $kirby->site()->page(); + } + + if ($page) { + $path = $page->url($language); + + if (isset($parts[1]) === true) { + $path .= '#' . $parts[1]; + } + } + } + + // keep relative urls + if ( + $path !== null && + (substr($path, 0, 2) === './' || substr($path, 0, 3) === '../') + ) { + return $path; + } + + // support UUIDs + if ( + $path !== null && + ( + Uuid::is($path, 'page') === true || + Uuid::is($path, 'file') === true + ) + ) { + $model = Uuid::for($path)->model(); + + if ($model === null) { + throw new NotFoundException('The model could not be found for "' . $path . '" uuid'); + } + + $path = $model->url(); + } + + $url = Url::makeAbsolute($path, $kirby->url()); + + if ($options === null) { + return $url; + } + + return (new Uri($url, $options))->toString(); + }, + +]; diff --git a/kirby/config/fields/checkboxes.php b/kirby/config/fields/checkboxes.php new file mode 100644 index 0000000..c8d962d --- /dev/null +++ b/kirby/config/fields/checkboxes.php @@ -0,0 +1,61 @@ + ['min', 'options'], + 'props' => [ + /** + * Unset inherited props + */ + 'after' => null, + 'before' => null, + 'icon' => null, + 'placeholder' => null, + + /** + * Arranges the checkboxes in the given number of columns + */ + 'columns' => function (int $columns = 1) { + return $columns; + }, + /** + * Default value for the field, which will be used when a page/file/user is created + */ + 'default' => function ($default = null) { + return Str::split($default, ','); + }, + /** + * Maximum number of checked boxes + */ + 'max' => function (int $max = null) { + return $max; + }, + /** + * Minimum number of checked boxes + */ + 'min' => function (int $min = null) { + return $min; + }, + 'value' => function ($value = null) { + return Str::split($value, ','); + }, + ], + 'computed' => [ + 'default' => function () { + return $this->sanitizeOptions($this->default); + }, + 'value' => function () { + return $this->sanitizeOptions($this->value); + }, + ], + 'save' => function ($value): string { + return A::join($value, ', '); + }, + 'validations' => [ + 'options', + 'max', + 'min' + ] +]; diff --git a/kirby/config/fields/color.php b/kirby/config/fields/color.php new file mode 100644 index 0000000..8d473f1 --- /dev/null +++ b/kirby/config/fields/color.php @@ -0,0 +1,145 @@ + [ + /** + * Unset inherited props + */ + 'after' => null, + 'before' => null, + + /** + * Whether to allow alpha transparency in the color + */ + 'alpha' => function (bool $alpha = false) { + return $alpha; + }, + /** + * The CSS format (hex, rgb, hsl) to display and store the value + */ + 'format' => function (string $format = 'hex'): string { + if (in_array($format, ['hex', 'hsl', 'rgb']) === false) { + throw new InvalidArgumentException('Unsupported format for color field (supported: hex, rgb, hsl)'); + } + + return $format; + }, + /** + * Change mode to disable the color picker (`input`) or to only + * show the `options` as toggles + */ + 'mode' => function (string $mode = 'picker'): string { + if (in_array($mode, ['picker', 'input', 'options']) === false) { + throw new InvalidArgumentException('Unsupported mode for color field (supported: picker, input, options)'); + } + + return $mode; + }, + /** + * List of colors that will be shown as buttons + * to directly select them + */ + 'options' => function (array $options = []): array { + return $options; + } + ], + 'computed' => [ + 'default' => function (): string { + return Str::lower($this->default); + }, + 'options' => function (): array { + // resolve options to support manual arrays + // alongside api and query options + $props = FieldOptions::polyfill($this->props); + $options = FieldOptions::factory([ + 'text' => '{{ item.value }}', + 'value' => '{{ item.key }}', + ...$props['options'] + ]); + + $options = $options->render($this->model()); + + if (empty($options) === true) { + return []; + } + + $options = match (true) { + // simple array of values + // or value=text (from Options class) + is_numeric($options[0]['value']) || + $options[0]['value'] === $options[0]['text'] + => A::map($options, fn ($option) => [ + 'value' => $option['text'] + ]), + + // deprecated: name => value, flipping + // TODO: start throwing in warning in v5 + $this->isColor($options[0]['text']) + => A::map($options, fn ($option) => [ + 'value' => $option['text'], + // ensure that any HTML in the new text is escaped + 'text' => Escape::html($option['value']) + ]), + + default + => A::map($options, fn ($option) => [ + 'value' => $option['value'], + 'text' => $option['text'] + ]), + }; + + return $options; + } + ], + 'methods' => [ + 'isColor' => function (string $value): bool { + return + $this->isHex($value) || + $this->isRgb($value) || + $this->isHsl($value); + }, + 'isHex' => function (string $value): bool { + return preg_match('/^#([\da-f]{3,4}){1,2}$/i', $value) === 1; + }, + 'isHsl' => function (string $value): bool { + return preg_match('/^hsla?\(\s*(\d{1,3}\.?\d*)(deg|rad|grad|turn)?(?:,|\s)+(\d{1,3})%(?:,|\s)+(\d{1,3})%(?:,|\s|\/)*(\d*(?:\.\d+)?)(%?)\s*\)?$/i', $value) === 1; + }, + 'isRgb' => function (string $value): bool { + return preg_match('/^rgba?\(\s*(\d{1,3})(%?)(?:,|\s)+(\d{1,3})(%?)(?:,|\s)+(\d{1,3})(%?)(?:,|\s|\/)*(\d*(?:\.\d+)?)(%?)\s*\)?$/i', $value) === 1; + }, + ], + 'validations' => [ + 'color' => function ($value) { + if (empty($value) === true) { + return true; + } + + if ($this->format === 'hex' && $this->isHex($value) === false) { + throw new InvalidArgumentException([ + 'key' => 'validation.color', + 'data' => ['format' => 'hex'] + ]); + } + + if ($this->format === 'rgb' && $this->isRgb($value) === false) { + throw new InvalidArgumentException([ + 'key' => 'validation.color', + 'data' => ['format' => 'rgb'] + ]); + } + + if ($this->format === 'hsl' && $this->isHsl($value) === false) { + throw new InvalidArgumentException([ + 'key' => 'validation.color', + 'data' => ['format' => 'hsl'] + ]); + } + } + ] +]; diff --git a/kirby/config/fields/date.php b/kirby/config/fields/date.php new file mode 100644 index 0000000..1cfa41c --- /dev/null +++ b/kirby/config/fields/date.php @@ -0,0 +1,154 @@ + ['datetime'], + 'props' => [ + /** + * Unset inherited props + */ + 'placeholder' => null, + + /** + * Activate/deactivate the dropdown calendar + */ + 'calendar' => function (bool $calendar = true) { + return $calendar; + }, + + /** + * Default date when a new page/file/user gets created + */ + 'default' => function (string $default = null): string { + return $this->toDatetime($default) ?? ''; + }, + + /** + * Custom format (dayjs tokens: `DD`, `MM`, `YYYY`) that is + * used to display the field in the Panel + */ + 'display' => function ($display = 'YYYY-MM-DD') { + return I18n::translate($display, $display); + }, + + /** + * Changes the calendar icon to something custom + */ + 'icon' => function (string $icon = 'calendar') { + return $icon; + }, + + /** + * Latest date, which can be selected/saved (Y-m-d) + */ + 'max' => function (string $max = null): string|null { + return Date::optional($max); + }, + /** + * Earliest date, which can be selected/saved (Y-m-d) + */ + 'min' => function (string $min = null): string|null { + return Date::optional($min); + }, + + /** + * Round to the nearest: sub-options for `unit` (day) and `size` (1) + */ + 'step' => function ($step = null) { + return $step; + }, + + /** + * Pass `true` or an array of time field options to show the time selector. + */ + 'time' => function ($time = false) { + return $time; + }, + /** + * Must be a parseable date string + */ + 'value' => function ($value = null) { + return $value; + } + ], + 'computed' => [ + 'display' => function () { + if ($this->display) { + return Str::upper($this->display); + } + }, + 'format' => function () { + return $this->props['format'] ?? ($this->time === false ? 'Y-m-d' : 'Y-m-d H:i:s'); + }, + 'time' => function () { + if ($this->time === false) { + return false; + } + + $props = is_array($this->time) ? $this->time : []; + $props['model'] = $this->model(); + $field = new Field('time', $props); + return $field->toArray(); + }, + 'step' => function () { + if ($this->time === false || empty($this->time['step']) === true) { + return Date::stepConfig($this->step, [ + 'size' => 1, + 'unit' => 'day' + ]); + } + + return Date::stepConfig($this->time['step'], [ + 'size' => 5, + 'unit' => 'minute' + ]); + }, + 'value' => function (): string { + return $this->toDatetime($this->value) ?? ''; + }, + ], + 'validations' => [ + 'date', + 'minMax' => function ($value) { + if (!$value = Date::optional($value)) { + return true; + } + + $min = Date::optional($this->min); + $max = Date::optional($this->max); + + $format = $this->time === false ? 'd.m.Y' : 'd.m.Y H:i'; + + if ($min && $max && $value->isBetween($min, $max) === false) { + throw new Exception([ + 'key' => 'validation.date.between', + 'data' => [ + 'min' => $min->format($format), + 'max' => $max->format($format) + ] + ]); + } elseif ($min && $value->isMin($min) === false) { + throw new Exception([ + 'key' => 'validation.date.after', + 'data' => [ + 'date' => $min->format($format), + ] + ]); + } elseif ($max && $value->isMax($max) === false) { + throw new Exception([ + 'key' => 'validation.date.before', + 'data' => [ + 'date' => $max->format($format), + ] + ]); + } + + return true; + }, + ] +]; diff --git a/kirby/config/fields/email.php b/kirby/config/fields/email.php new file mode 100644 index 0000000..5c4630f --- /dev/null +++ b/kirby/config/fields/email.php @@ -0,0 +1,40 @@ + 'text', + 'props' => [ + /** + * Unset inherited props + */ + 'converter' => null, + 'counter' => null, + + /** + * Sets the HTML5 autocomplete mode for the input + */ + 'autocomplete' => function (string $autocomplete = 'email') { + return $autocomplete; + }, + + /** + * Changes the email icon to something custom + */ + 'icon' => function (string $icon = 'email') { + return $icon; + }, + + /** + * Custom placeholder text, when the field is empty. + */ + 'placeholder' => function ($value = null) { + return I18n::translate($value, $value) ?? I18n::translate('email.placeholder'); + } + ], + 'validations' => [ + 'minlength', + 'maxlength', + 'email' + ] +]; diff --git a/kirby/config/fields/files.php b/kirby/config/fields/files.php new file mode 100644 index 0000000..4f37765 --- /dev/null +++ b/kirby/config/fields/files.php @@ -0,0 +1,141 @@ + [ + 'filepicker', + 'layout', + 'min', + 'picker', + 'upload' + ], + 'props' => [ + /** + * Unset inherited props + */ + 'after' => null, + 'before' => null, + 'autofocus' => null, + 'icon' => null, + 'placeholder' => null, + + /** + * Sets the file(s), which are selected by default when a new page is created + */ + 'default' => function ($default = null) { + return $default; + }, + + 'value' => function ($value = null) { + return $value; + } + ], + 'computed' => [ + 'parentModel' => function () { + if ( + is_string($this->parent) === true && + $model = $this->model()->query( + $this->parent, + ModelWithContent::class + ) + ) { + return $model; + } + + return $this->model(); + }, + 'parent' => function () { + return $this->parentModel->apiUrl(true); + }, + 'query' => function () { + return $this->query ?? $this->parentModel::CLASS_ALIAS . '.files'; + }, + 'default' => function () { + return $this->toFiles($this->default); + }, + 'value' => function () { + return $this->toFiles($this->value); + }, + ], + 'methods' => [ + 'fileResponse' => function ($file) { + return $file->panel()->pickerData([ + 'image' => $this->image, + 'info' => $this->info ?? false, + 'layout' => $this->layout, + 'model' => $this->model(), + 'text' => $this->text, + ]); + }, + 'toFiles' => function ($value = null) { + $files = []; + + foreach (Data::decode($value, 'yaml') as $id) { + if (is_array($id) === true) { + $id = $id['uuid'] ?? $id['id'] ?? null; + } + + if ( + $id !== null && + ($file = $this->kirby()->file($id, $this->model())) + ) { + $files[] = $this->fileResponse($file); + } + } + + return $files; + } + ], + 'api' => function () { + return [ + [ + 'pattern' => '/', + 'action' => function () { + $field = $this->field(); + + return $field->filepicker([ + 'image' => $field->image(), + 'info' => $field->info(), + 'layout' => $field->layout(), + 'limit' => $field->limit(), + 'page' => $this->requestQuery('page'), + 'query' => $field->query(), + 'search' => $this->requestQuery('search'), + 'text' => $field->text() + ]); + } + ], + [ + 'pattern' => 'upload', + 'method' => 'POST', + 'action' => function () { + $field = $this->field(); + $uploads = $field->uploads(); + + // move_uploaded_file() not working with unit test + // @codeCoverageIgnoreStart + return $field->upload($this, $uploads, function ($file, $parent) use ($field) { + return $file->panel()->pickerData([ + 'image' => $field->image(), + 'info' => $field->info(), + 'layout' => $field->layout(), + 'model' => $field->model(), + 'text' => $field->text(), + ]); + }); + // @codeCoverageIgnoreEnd + } + ] + ]; + }, + 'save' => function ($value = null) { + return A::pluck($value, $this->store); + }, + 'validations' => [ + 'max', + 'min' + ] +]; diff --git a/kirby/config/fields/gap.php b/kirby/config/fields/gap.php new file mode 100644 index 0000000..b2dbd70 --- /dev/null +++ b/kirby/config/fields/gap.php @@ -0,0 +1,5 @@ + false +]; diff --git a/kirby/config/fields/headline.php b/kirby/config/fields/headline.php new file mode 100644 index 0000000..3a4509e --- /dev/null +++ b/kirby/config/fields/headline.php @@ -0,0 +1,19 @@ + false, + 'props' => [ + /** + * Unset inherited props + */ + 'after' => null, + 'autofocus' => null, + 'before' => null, + 'default' => null, + 'disabled' => null, + 'icon' => null, + 'placeholder' => null, + 'required' => null, + 'translate' => null + ] +]; diff --git a/kirby/config/fields/hidden.php b/kirby/config/fields/hidden.php new file mode 100644 index 0000000..4b40df5 --- /dev/null +++ b/kirby/config/fields/hidden.php @@ -0,0 +1,5 @@ + true +]; diff --git a/kirby/config/fields/info.php b/kirby/config/fields/info.php new file mode 100644 index 0000000..e65dc83 --- /dev/null +++ b/kirby/config/fields/info.php @@ -0,0 +1,43 @@ + [ + /** + * Unset inherited props + */ + 'after' => null, + 'autofocus' => null, + 'before' => null, + 'default' => null, + 'disabled' => null, + 'placeholder' => null, + 'required' => null, + 'translate' => null, + + /** + * Text to be displayed + */ + 'text' => function ($value = null) { + return I18n::translate($value, $value); + }, + + /** + * Change the design of the info box + */ + 'theme' => function (string $theme = null) { + return $theme; + } + ], + 'computed' => [ + 'text' => function () { + if ($text = $this->text) { + $text = $this->model()->toSafeString($text); + $text = $this->kirby()->kirbytext($text); + return $text; + } + } + ], + 'save' => false, +]; diff --git a/kirby/config/fields/line.php b/kirby/config/fields/line.php new file mode 100644 index 0000000..b2dbd70 --- /dev/null +++ b/kirby/config/fields/line.php @@ -0,0 +1,5 @@ + false +]; diff --git a/kirby/config/fields/link.php b/kirby/config/fields/link.php new file mode 100644 index 0000000..885eb87 --- /dev/null +++ b/kirby/config/fields/link.php @@ -0,0 +1,155 @@ + [ + 'after' => null, + 'before' => null, + 'icon' => null, + 'placeholder' => null, + + /** + * @values 'anchor', 'url, 'page, 'file', 'email', 'tel', 'custom' + */ + 'options' => function (array|null $options = null): array { + return $options ?? [ + 'url', + 'page', + 'file', + 'email', + 'tel', + 'anchor' + ]; + }, + 'value' => function (string|null $value = null) { + return $value ?? ''; + } + ], + 'methods' => [ + 'activeTypes' => function () { + return array_filter($this->availableTypes(), function (string $type) { + return in_array($type, $this->props['options']) === true; + }, ARRAY_FILTER_USE_KEY); + }, + 'availableTypes' => function () { + return [ + 'anchor' => [ + 'detect' => function (string $value): bool { + return Str::startsWith($value, '#') === true; + }, + 'link' => function (string $value): string { + return $value; + }, + 'validate' => function (string $value): bool { + return Str::startsWith($value, '#') === true; + }, + ], + 'email' => [ + 'detect' => function (string $value): bool { + return Str::startsWith($value, 'mailto:') === true; + }, + 'link' => function (string $value): string { + return str_replace('mailto:', '', $value); + }, + 'validate' => function (string $value): bool { + return V::email($value); + }, + ], + 'file' => [ + 'detect' => function (string $value): bool { + return Str::startsWith($value, 'file://') === true; + }, + 'link' => function (string $value): string { + return $value; + }, + 'validate' => function (string $value): bool { + return V::uuid($value, 'file'); + }, + ], + 'page' => [ + 'detect' => function (string $value): bool { + return Str::startsWith($value, 'page://') === true; + }, + 'link' => function (string $value): string { + return $value; + }, + 'validate' => function (string $value): bool { + return V::uuid($value, 'page'); + }, + ], + 'tel' => [ + 'detect' => function (string $value): bool { + return Str::startsWith($value, 'tel:') === true; + }, + 'link' => function (string $value): string { + return str_replace('tel:', '', $value); + }, + 'validate' => function (string $value): bool { + return V::tel($value); + }, + ], + 'url' => [ + 'detect' => function (string $value): bool { + return Str::startsWith($value, 'http://') === true || Str::startsWith($value, 'https://') === true; + }, + 'link' => function (string $value): string { + return $value; + }, + 'validate' => function (string $value): bool { + return V::url($value); + }, + ], + + // needs to come last + 'custom' => [ + 'detect' => function (string $value): bool { + return true; + }, + 'link' => function (string $value): string { + return $value; + }, + 'validate' => function (): bool { + return true; + }, + ] + ]; + }, + ], + 'validations' => [ + 'value' => function (string|null $value) { + if (empty($value) === true) { + return true; + } + + $detected = false; + + foreach ($this->activeTypes() as $type => $options) { + if ($options['detect']($value) !== true) { + continue; + } + + $link = $options['link']($value); + $detected = true; + + if ($options['validate']($link) === false) { + throw new InvalidArgumentException([ + 'key' => 'validation.' . $type + ]); + } + } + + // none of the configured types has been detected + if ($detected === false) { + throw new InvalidArgumentException([ + 'key' => 'validation.linkType' + ]); + } + + return true; + }, + ] +]; diff --git a/kirby/config/fields/list.php b/kirby/config/fields/list.php new file mode 100644 index 0000000..d1917f2 --- /dev/null +++ b/kirby/config/fields/list.php @@ -0,0 +1,23 @@ + [ + /** + * Sets the allowed HTML formats. Available formats: `bold`, `italic`, `underline`, `strike`, `code`, `link`. Activate them all by passing `true`. Deactivate them all by passing `false` + */ + 'marks' => function ($marks = true) { + return $marks; + }, + /** + * Sets the allowed nodes. Available nodes: `bulletList`, `orderedList` + */ + 'nodes' => function ($nodes = null) { + return $nodes; + } + ], + 'computed' => [ + 'value' => function () { + return trim($this->value ?? ''); + } + ] +]; diff --git a/kirby/config/fields/mixins/datetime.php b/kirby/config/fields/mixins/datetime.php new file mode 100644 index 0000000..b47a865 --- /dev/null +++ b/kirby/config/fields/mixins/datetime.php @@ -0,0 +1,35 @@ + [ + /** + * Defines a custom format that is used when the field is saved + */ + 'format' => function (string $format = null) { + return $format; + } + ], + 'methods' => [ + 'toDatetime' => function ($value, string $format = 'Y-m-d H:i:s') { + if ($date = Date::optional($value)) { + if ($this->step) { + $step = Date::stepConfig($this->step); + $date->round($step['unit'], $step['size']); + } + + return $date->format($format); + } + + return null; + } + ], + 'save' => function ($value) { + if ($date = Date::optional($value)) { + return $date->format($this->format); + } + + return ''; + }, +]; diff --git a/kirby/config/fields/mixins/filepicker.php b/kirby/config/fields/mixins/filepicker.php new file mode 100644 index 0000000..092adc9 --- /dev/null +++ b/kirby/config/fields/mixins/filepicker.php @@ -0,0 +1,14 @@ + [ + 'filepicker' => function (array $params = []) { + // fetch the parent model + $params['model'] = $this->model(); + + return (new FilePicker($params))->toArray(); + } + ] +]; diff --git a/kirby/config/fields/mixins/layout.php b/kirby/config/fields/mixins/layout.php new file mode 100644 index 0000000..4f94b0f --- /dev/null +++ b/kirby/config/fields/mixins/layout.php @@ -0,0 +1,21 @@ + [ + /** + * Changes the layout of the selected entries. + * Available layouts: `list`, `cardlets`, `cards` + */ + 'layout' => function (string $layout = 'list') { + $layouts = ['list', 'cardlets', 'cards']; + return in_array($layout, $layouts) ? $layout : 'list'; + }, + + /** + * Layout size for cards: `tiny`, `small`, `medium`, `large`, `huge`, `full` + */ + 'size' => function (string $size = 'auto') { + return $size; + }, + ] +]; diff --git a/kirby/config/fields/mixins/min.php b/kirby/config/fields/mixins/min.php new file mode 100644 index 0000000..f5262ea --- /dev/null +++ b/kirby/config/fields/mixins/min.php @@ -0,0 +1,22 @@ + [ + 'min' => function () { + // set min to at least 1, if required + if ($this->required === true) { + return $this->min ?? 1; + } + + return $this->min; + }, + 'required' => function () { + // set required to true if min is set + if ($this->min) { + return true; + } + + return $this->required; + } + ] +]; diff --git a/kirby/config/fields/mixins/options.php b/kirby/config/fields/mixins/options.php new file mode 100644 index 0000000..a3625f3 --- /dev/null +++ b/kirby/config/fields/mixins/options.php @@ -0,0 +1,47 @@ + [ + /** + * API settings for options requests. This will only take affect when `options` is set to `api`. + */ + 'api' => function ($api = null) { + return $api; + }, + /** + * An array with options + */ + 'options' => function ($options = []) { + return $options; + }, + /** + * Query settings for options queries. This will only take affect when `options` is set to `query`. + */ + 'query' => function ($query = null) { + return $query; + }, + ], + 'computed' => [ + 'options' => function (): array { + return $this->getOptions(); + } + ], + 'methods' => [ + 'getOptions' => function () { + $props = FieldOptions::polyfill($this->props); + $options = FieldOptions::factory($props['options']); + return $options->render($this->model()); + }, + 'sanitizeOption' => function ($value) { + $options = array_column($this->options(), 'value'); + return in_array($value, $options) === true ? $value : null; + }, + 'sanitizeOptions' => function ($values) { + $options = array_column($this->options(), 'value'); + $options = array_intersect($values, $options); + return array_values($options); + }, + ] +]; diff --git a/kirby/config/fields/mixins/pagepicker.php b/kirby/config/fields/mixins/pagepicker.php new file mode 100644 index 0000000..276d8c7 --- /dev/null +++ b/kirby/config/fields/mixins/pagepicker.php @@ -0,0 +1,14 @@ + [ + 'pagepicker' => function (array $params = []) { + // inject the current model + $params['model'] = $this->model(); + + return (new PagePicker($params))->toArray(); + } + ] +]; diff --git a/kirby/config/fields/mixins/picker.php b/kirby/config/fields/mixins/picker.php new file mode 100644 index 0000000..5d95e45 --- /dev/null +++ b/kirby/config/fields/mixins/picker.php @@ -0,0 +1,88 @@ + [ + /** + * The placeholder text if none have been selected yet + */ + 'empty' => function ($empty = null) { + return I18n::translate($empty, $empty); + }, + + /** + * Image settings for each item + */ + 'image' => function ($image = null) { + return $image; + }, + + /** + * Info text for each item + */ + 'info' => function (string $info = null) { + return $info; + }, + + /** + * Whether each item should be clickable + */ + 'link' => function (bool $link = true) { + return $link; + }, + + /** + * The minimum number of required selected + */ + 'min' => function (int $min = null) { + return $min; + }, + + /** + * The maximum number of allowed selected + */ + 'max' => function (int $max = null) { + return $max; + }, + + /** + * If `false`, only a single one can be selected + */ + 'multiple' => function (bool $multiple = true) { + return $multiple; + }, + + /** + * Query for the items to be included in the picker + */ + 'query' => function (string $query = null) { + return $query; + }, + + /** + * Enable/disable the search field in the picker + */ + 'search' => function (bool $search = true) { + return $search; + }, + + /** + * Whether to store UUID or ID in the + * content file of the model + * + * @param string $store 'uuid'|'id' + */ + 'store' => function (string $store = 'uuid') { + return Str::lower($store); + }, + + /** + * Main text for each item + */ + 'text' => function (string $text = null) { + return $text; + }, + ], +]; diff --git a/kirby/config/fields/mixins/upload.php b/kirby/config/fields/mixins/upload.php new file mode 100644 index 0000000..aad3933 --- /dev/null +++ b/kirby/config/fields/mixins/upload.php @@ -0,0 +1,87 @@ + [ + /** + * Sets the upload options for linked files (since 3.2.0) + */ + 'uploads' => function ($uploads = []) { + if ($uploads === false) { + return false; + } + + if (is_string($uploads) === true) { + $uploads = ['template' => $uploads]; + } + + if (is_array($uploads) === false) { + $uploads = []; + } + + $uploads['accept'] = '*'; + + if ($template = $uploads['template'] ?? null) { + // get parent object for upload target + $parent = $this->uploadParent($uploads['parent'] ?? null); + + if ($parent === null) { + throw new InvalidArgumentException('"' . $uploads['parent'] . '" could not be resolved as a valid parent for the upload'); + } + + $file = new File([ + 'filename' => 'tmp', + 'parent' => $parent, + 'template' => $template + ]); + + $uploads['accept'] = $file->blueprint()->acceptAttribute(); + } + + return $uploads; + }, + ], + 'methods' => [ + 'upload' => function (Api $api, $params, Closure $map) { + if ($params === false) { + throw new Exception('Uploads are disabled for this field'); + } + + $parent = $this->uploadParent($params['parent'] ?? null); + + return $api->upload(function ($source, $filename) use ($parent, $params, $map) { + $props = [ + 'source' => $source, + 'template' => $params['template'] ?? null, + 'filename' => $filename, + ]; + + // move the source file from the temp dir + $file = $parent->createFile($props, true); + + if ($file instanceof File === false) { + throw new Exception('The file could not be uploaded'); + } + + return $map($file, $parent); + }); + }, + 'uploadParent' => function (string $parentQuery = null) { + $parent = $this->model(); + + if ($parentQuery) { + $parent = $parent->query($parentQuery); + } + + if ($parent instanceof File) { + $parent = $parent->parent(); + } + + return $parent; + } + ] +]; diff --git a/kirby/config/fields/mixins/userpicker.php b/kirby/config/fields/mixins/userpicker.php new file mode 100644 index 0000000..4f8556c --- /dev/null +++ b/kirby/config/fields/mixins/userpicker.php @@ -0,0 +1,13 @@ + [ + 'userpicker' => function (array $params = []) { + $params['model'] = $this->model(); + + return (new UserPicker($params))->toArray(); + } + ] +]; diff --git a/kirby/config/fields/multiselect.php b/kirby/config/fields/multiselect.php new file mode 100644 index 0000000..6633ee3 --- /dev/null +++ b/kirby/config/fields/multiselect.php @@ -0,0 +1,35 @@ + 'tags', + 'props' => [ + /** + * If set to `all`, any type of input is accepted. If set to `options` only the predefined options are accepted as input. + */ + 'accept' => function ($value = 'options') { + return V::in($value, ['all', 'options']) ? $value : 'all'; + }, + /** + * Custom icon to replace the arrow down. + */ + 'icon' => function (string $icon = 'checklist') { + return $icon; + }, + ], + 'methods' => [ + 'toValues' => function ($value) { + if (is_null($value) === true) { + return []; + } + + if (is_array($value) === false) { + $value = Str::split($value, $this->separator()); + } + + return $this->sanitizeOptions($value); + } + ], +]; diff --git a/kirby/config/fields/number.php b/kirby/config/fields/number.php new file mode 100644 index 0000000..11334e8 --- /dev/null +++ b/kirby/config/fields/number.php @@ -0,0 +1,48 @@ + [ + /** + * Default number that will be saved when a new page/user/file is created + */ + 'default' => function ($default = null) { + return $this->toNumber($default) ?? ''; + }, + /** + * The lowest allowed number + */ + 'min' => function (float $min = null) { + return $min; + }, + /** + * The highest allowed number + */ + 'max' => function (float $max = null) { + return $max; + }, + /** + * Allowed incremental steps between numbers (i.e `0.5`) + */ + 'step' => function ($step = null) { + return $this->toNumber($step) ?? ''; + }, + 'value' => function ($value = null) { + return $this->toNumber($value) ?? ''; + } + ], + 'methods' => [ + 'toNumber' => function ($value) { + if ($this->isEmpty($value) === true) { + return null; + } + + return is_float($value) === true ? $value : (float)Str::float($value); + } + ], + 'validations' => [ + 'min', + 'max' + ] +]; diff --git a/kirby/config/fields/object.php b/kirby/config/fields/object.php new file mode 100644 index 0000000..57cd2e4 --- /dev/null +++ b/kirby/config/fields/object.php @@ -0,0 +1,104 @@ + [ + /** + * Unset inherited props + */ + 'after' => null, + 'before' => null, + 'autofocus' => null, + 'icon' => null, + 'placeholder' => null, + + /** + * Set the default values for the object + */ + 'default' => function ($default = null) { + return $default; + }, + + /** + * The placeholder text if no information has been added yet + */ + 'empty' => function ($empty = null) { + return I18n::translate($empty, $empty); + }, + + /** + * Fields setup for the object form. Works just like fields in regular forms. + */ + 'fields' => function (array $fields = []) { + return $fields; + } + ], + 'computed' => [ + 'default' => function () { + if (empty($this->default) === true) { + return ''; + } + + return $this->form($this->default)->values(); + }, + 'fields' => function () { + if (empty($this->fields) === true) { + return []; + } + + return $this->form()->fields()->toArray(); + }, + 'value' => function () { + $data = Data::decode($this->value, 'yaml'); + + if (empty($data) === true) { + return ''; + } + + return $this->form($data)->values(); + } + ], + 'methods' => [ + 'form' => function (array $values = []) { + return new Form([ + 'fields' => $this->attrs['fields'], + 'values' => $values, + 'model' => $this->model + ]); + }, + ], + 'save' => function ($value) { + if (empty($value) === true) { + return ''; + } + + return $this->form($value)->content(); + }, + 'validations' => [ + 'object' => function ($value) { + if (empty($value) === true) { + return true; + } + + $errors = $this->form($value)->errors(); + + if (empty($errors) === false) { + // use the first error for details + $name = array_key_first($errors); + $error = $errors[$name]; + + throw new InvalidArgumentException([ + 'key' => 'object.validation', + 'data' => [ + 'label' => $error['label'] ?? $name, + 'message' => implode("\n", $error['message']) + ] + ]); + } + } + ] +]; diff --git a/kirby/config/fields/pages.php b/kirby/config/fields/pages.php new file mode 100644 index 0000000..54d9aa8 --- /dev/null +++ b/kirby/config/fields/pages.php @@ -0,0 +1,111 @@ + [ + 'layout', + 'min', + 'pagepicker', + 'picker', + ], + 'props' => [ + /** + * Unset inherited props + */ + 'after' => null, + 'autofocus' => null, + 'before' => null, + 'icon' => null, + 'placeholder' => null, + + /** + * Default selected page(s) when a new page/file/user is created + */ + 'default' => function ($default = null) { + return $this->toPages($default); + }, + + /** + * Optional query to select a specific set of pages + */ + 'query' => function (string $query = null) { + return $query; + }, + + /** + * Optionally include subpages of pages + */ + 'subpages' => function (bool $subpages = true) { + return $subpages; + }, + + 'value' => function ($value = null) { + return $this->toPages($value); + }, + ], + 'computed' => [ + /** + * Unset inherited computed + */ + 'default' => null + ], + 'methods' => [ + 'pageResponse' => function ($page) { + return $page->panel()->pickerData([ + 'image' => $this->image, + 'info' => $this->info, + 'layout' => $this->layout, + 'text' => $this->text, + ]); + }, + 'toPages' => function ($value = null) { + $pages = []; + $kirby = App::instance(); + + foreach (Data::decode($value, 'yaml') as $id) { + if (is_array($id) === true) { + $id = $id['uuid'] ?? $id['id'] ?? null; + } + + if ($id !== null && ($page = $kirby->page($id))) { + $pages[] = $this->pageResponse($page); + } + } + + return $pages; + } + ], + 'api' => function () { + return [ + [ + 'pattern' => '/', + 'action' => function () { + $field = $this->field(); + + return $field->pagepicker([ + 'image' => $field->image(), + 'info' => $field->info(), + 'layout' => $field->layout(), + 'limit' => $field->limit(), + 'page' => $this->requestQuery('page'), + 'parent' => $this->requestQuery('parent'), + 'query' => $field->query(), + 'search' => $this->requestQuery('search'), + 'subpages' => $field->subpages(), + 'text' => $field->text() + ]); + } + ] + ]; + }, + 'save' => function ($value = null) { + return A::pluck($value, $this->store); + }, + 'validations' => [ + 'max', + 'min' + ] +]; diff --git a/kirby/config/fields/radio.php b/kirby/config/fields/radio.php new file mode 100644 index 0000000..4846053 --- /dev/null +++ b/kirby/config/fields/radio.php @@ -0,0 +1,29 @@ + ['options'], + 'props' => [ + /** + * Unset inherited props + */ + 'after' => null, + 'before' => null, + 'icon' => null, + 'placeholder' => null, + + /** + * Arranges the radio buttons in the given number of columns + */ + 'columns' => function (int $columns = 1) { + return $columns; + }, + ], + 'computed' => [ + 'default' => function () { + return $this->sanitizeOption($this->default); + }, + 'value' => function () { + return $this->sanitizeOption($this->value) ?? ''; + } + ] +]; diff --git a/kirby/config/fields/range.php b/kirby/config/fields/range.php new file mode 100644 index 0000000..d203a7e --- /dev/null +++ b/kirby/config/fields/range.php @@ -0,0 +1,33 @@ + 'number', + 'props' => [ + /** + * Unset inherited props + */ + 'placeholder' => null, + + /** + * The maximum value on the slider + */ + 'max' => function (float $max = 100) { + return $max; + }, + /** + * Enables/disables the tooltip and set the before and after values + */ + 'tooltip' => function ($tooltip = true) { + if (is_array($tooltip) === true) { + $after = $tooltip['after'] ?? null; + $before = $tooltip['before'] ?? null; + $tooltip['after'] = I18n::translate($after, $after); + $tooltip['before'] = I18n::translate($before, $before); + } + + return $tooltip; + }, + ] +]; diff --git a/kirby/config/fields/select.php b/kirby/config/fields/select.php new file mode 100644 index 0000000..4c06b5b --- /dev/null +++ b/kirby/config/fields/select.php @@ -0,0 +1,37 @@ + 'radio', + 'props' => [ + /** + * Unset inherited props + */ + 'columns' => null, + + /** + * Custom icon to replace the arrow down. + */ + 'icon' => function (string $icon = null) { + return $icon; + }, + /** + * Custom placeholder string for empty option. + */ + 'placeholder' => function (string $placeholder = '—') { + return $placeholder; + }, + ], + 'methods' => [ + 'getOptions' => function () { + $props = FieldOptions::polyfill($this->props); + + // disable safe mode as the select field does not + // render HTML for the option text + $options = FieldOptions::factory($props['options'], false); + + return $options->render($this->model()); + } + ] +]; diff --git a/kirby/config/fields/slug.php b/kirby/config/fields/slug.php new file mode 100644 index 0000000..9d8efb5 --- /dev/null +++ b/kirby/config/fields/slug.php @@ -0,0 +1,55 @@ + 'text', + 'props' => [ + /** + * Unset inherited props + */ + 'converter' => null, + 'counter' => null, + 'spellcheck' => null, + + /** + * Set of characters allowed in the slug + */ + 'allow' => function (string $allow = '') { + return $allow; + }, + + /** + * Changes the link icon + */ + 'icon' => function (string $icon = 'url') { + return $icon; + }, + + /** + * Set prefix for the help text + */ + 'path' => function (string $path = null) { + return $path; + }, + + /** + * Name of another field that should be used to + * automatically update this field's value + */ + 'sync' => function (string $sync = null) { + return $sync; + }, + + /** + * Set to object with keys `field` and `text` to add + * button to generate from another field + */ + 'wizard' => function ($wizard = false) { + return $wizard; + } + ], + 'validations' => [ + 'minlength', + 'maxlength' + ], +]; diff --git a/kirby/config/fields/structure.php b/kirby/config/fields/structure.php new file mode 100644 index 0000000..510459b --- /dev/null +++ b/kirby/config/fields/structure.php @@ -0,0 +1,225 @@ + ['min'], + 'props' => [ + /** + * Unset inherited props + */ + 'after' => null, + 'before' => null, + 'autofocus' => null, + 'icon' => null, + 'placeholder' => null, + + /** + * Optional columns definition to only show selected fields in the structure table. + */ + 'columns' => function (array $columns = []) { + // lower case all keys, because field names will + // be lowercase as well. + return array_change_key_case($columns); + }, + + /** + * Toggles duplicating rows for the structure + */ + 'duplicate' => function (bool $duplicate = true) { + return $duplicate; + }, + + /** + * The placeholder text if no items have been added yet + */ + 'empty' => function ($empty = null) { + return I18n::translate($empty, $empty); + }, + + /** + * Set the default rows for the structure + */ + 'default' => function (array $default = null) { + return $default; + }, + + /** + * Fields setup for the structure form. Works just like fields in regular forms. + */ + 'fields' => function (array $fields = []) { + return $fields; + }, + /** + * The number of entries that will be displayed on a single page. Afterwards pagination kicks in. + */ + 'limit' => function (int $limit = null) { + return $limit; + }, + /** + * Maximum allowed entries in the structure. Afterwards the "Add" button will be switched off. + */ + 'max' => function (int $max = null) { + return $max; + }, + /** + * Minimum required entries in the structure + */ + 'min' => function (int $min = null) { + return $min; + }, + /** + * Toggles adding to the top or bottom of the list + */ + 'prepend' => function (bool $prepend = null) { + return $prepend; + }, + /** + * Toggles drag & drop sorting + */ + 'sortable' => function (bool $sortable = null) { + return $sortable; + }, + /** + * Sorts the entries by the given field and order (i.e. `title desc`) + * Drag & drop is disabled in this case + */ + 'sortBy' => function (string $sort = null) { + return $sort; + } + ], + 'computed' => [ + 'default' => function () { + return $this->rows($this->default); + }, + 'value' => function () { + return $this->rows($this->value); + }, + 'fields' => function () { + if (empty($this->fields) === true) { + return []; + } + + return $this->form()->fields()->toArray(); + }, + 'columns' => function () { + $columns = []; + $blueprint = $this->columns; + + // if no custom columns have been defined, + // gather all fields as columns + if (empty($blueprint) === true) { + // skip hidden fields + $fields = array_filter( + $this->fields, + fn ($field) => + $field['type'] !== 'hidden' && $field['hidden'] !== true + ); + $fields = array_column($fields, 'name'); + $blueprint = array_fill_keys($fields, true); + } + + foreach ($blueprint as $name => $column) { + $field = $this->fields[$name] ?? null; + + // Skip empty and unsaveable fields + // They should never be included as column + if ( + empty($field) === true || + $field['saveable'] === false + ) { + continue; + } + + if (is_array($column) === false) { + $column = []; + } + + $column['type'] ??= $field['type']; + $column['label'] ??= $field['label'] ?? $name; + $column['label'] = I18n::translate($column['label'], $column['label']); + + $columns[$name] = $column; + } + + // make the first column visible on mobile + // if no other mobile columns are defined + if (in_array(true, array_column($columns, 'mobile')) === false) { + $columns[array_key_first($columns)]['mobile'] = true; + } + + return $columns; + } + ], + 'methods' => [ + 'rows' => function ($value) { + $rows = Data::decode($value, 'yaml'); + $value = []; + + foreach ($rows as $index => $row) { + if (is_array($row) === false) { + continue; + } + + $value[] = $this->form($row)->values(); + } + + return $value; + }, + 'form' => function (array $values = []) { + return new Form([ + 'fields' => $this->attrs['fields'] ?? [], + 'values' => $values, + 'model' => $this->model + ]); + }, + ], + 'save' => function ($value) { + $data = []; + + foreach ($value as $row) { + $row = $this->form($row)->content(); + + // remove frontend helper id + unset($row['_id']); + + $data[] = $row; + } + + return $data; + }, + 'validations' => [ + 'min', + 'max', + 'structure' => function ($value) { + if (empty($value) === true) { + return true; + } + + $values = A::wrap($value); + + foreach ($values as $index => $value) { + $form = $this->form($value); + + foreach ($form->fields() as $field) { + $errors = $field->errors(); + + if (empty($errors) === false) { + throw new InvalidArgumentException([ + 'key' => 'structure.validation', + 'data' => [ + 'field' => $field->label() ?? Str::ucfirst($field->name()), + 'index' => $index + 1 + ] + ]); + } + } + } + } + ] +]; diff --git a/kirby/config/fields/tags.php b/kirby/config/fields/tags.php new file mode 100644 index 0000000..b5b6c9e --- /dev/null +++ b/kirby/config/fields/tags.php @@ -0,0 +1,106 @@ + ['min', 'options'], + 'props' => [ + + /** + * Unset inherited props + */ + 'after' => null, + 'before' => null, + 'placeholder' => null, + + /** + * If set to `all`, any type of input is accepted. If set to `options` only the predefined options are accepted as input. + */ + 'accept' => function ($value = 'all') { + return V::in($value, ['all', 'options']) ? $value : 'all'; + }, + /** + * Changes the tag icon + */ + 'icon' => function ($icon = 'tag') { + return $icon; + }, + /** + * Set to `list` to display each tag with 100% width, + * otherwise the tags are displayed inline + */ + 'layout' => function (string|null $layout = null) { + return $layout; + }, + /** + * Minimum number of required entries/tags + */ + 'min' => function (int $min = null) { + return $min; + }, + /** + * Maximum number of allowed entries/tags + */ + 'max' => function (int $max = null) { + return $max; + }, + /** + * Enable/disable the search in the dropdown + * Also limit displayed items (display: 20) + * and set minimum number of characters to search (min: 3) + */ + 'search' => function (bool|array $search = true) { + return $search; + }, + /** + * Custom tags separator, which will be used to store tags in the content file + */ + 'separator' => function (string $separator = ',') { + return $separator; + }, + /** + * If `true`, selected entries will be sorted + * according to their position in the dropdown + */ + 'sort' => function (bool $sort = false) { + return $sort; + }, + ], + 'computed' => [ + 'default' => function (): array { + return $this->toValues($this->default); + }, + 'value' => function (): array { + return $this->toValues($this->value); + } + ], + 'methods' => [ + 'toValues' => function ($value) { + if (is_null($value) === true) { + return []; + } + + if (is_array($value) === false) { + $value = Str::split($value, $this->separator()); + } + + if ($this->accept === 'options') { + $value = $this->sanitizeOptions($value); + } + + return $value; + } + ], + 'save' => function (array $value = null): string { + return A::join( + $value, + $this->separator() . ' ' + ); + }, + 'validations' => [ + 'min', + 'max' + ] +]; diff --git a/kirby/config/fields/tel.php b/kirby/config/fields/tel.php new file mode 100644 index 0000000..715d587 --- /dev/null +++ b/kirby/config/fields/tel.php @@ -0,0 +1,27 @@ + 'text', + 'props' => [ + /** + * Unset inherited props + */ + 'converter' => null, + 'counter' => null, + 'spellcheck' => null, + + /** + * Sets the HTML5 autocomplete attribute + */ + 'autocomplete' => function (string $autocomplete = 'tel') { + return $autocomplete; + }, + + /** + * Changes the phone icon + */ + 'icon' => function (string $icon = 'phone') { + return $icon; + } + ] +]; diff --git a/kirby/config/fields/text.php b/kirby/config/fields/text.php new file mode 100644 index 0000000..574a4ec --- /dev/null +++ b/kirby/config/fields/text.php @@ -0,0 +1,109 @@ + [ + + /** + * The field value will be converted with the selected converter before the value gets saved. Available converters: `lower`, `upper`, `ucfirst`, `slug` + */ + 'converter' => function ($value = null) { + if ($value !== null && array_key_exists($value, $this->converters()) === false) { + throw new InvalidArgumentException([ + 'key' => 'field.converter.invalid', + 'data' => ['converter' => $value] + ]); + } + + return $value; + }, + + /** + * Shows or hides the character counter in the top right corner + */ + 'counter' => function (bool $counter = true) { + return $counter; + }, + + /** + * Sets the font family (sans or monospace) + */ + 'font' => function (string $font = null) { + return $font === 'monospace' ? 'monospace' : 'sans-serif'; + }, + + /** + * Maximum number of allowed characters + */ + 'maxlength' => function (int $maxlength = null) { + return $maxlength; + }, + + /** + * Minimum number of required characters + */ + 'minlength' => function (int $minlength = null) { + return $minlength; + }, + + /** + * A regular expression, which will be used to validate the input + */ + 'pattern' => function (string $pattern = null) { + return $pattern; + }, + + /** + * If `false`, spellcheck will be switched off + */ + 'spellcheck' => function (bool $spellcheck = false) { + return $spellcheck; + }, + ], + 'computed' => [ + 'default' => function () { + return $this->convert($this->default); + }, + 'value' => function () { + return (string)$this->convert($this->value); + } + ], + 'methods' => [ + 'convert' => function ($value) { + if ($this->converter() === null) { + return $value; + } + + $converter = $this->converters()[$this->converter()]; + + if (is_array($value) === true) { + return array_map($converter, $value); + } + + return call_user_func($converter, trim($value ?? '')); + }, + 'converters' => function (): array { + return [ + 'lower' => function ($value) { + return Str::lower($value); + }, + 'slug' => function ($value) { + return Str::slug($value); + }, + 'ucfirst' => function ($value) { + return Str::ucfirst($value); + }, + 'upper' => function ($value) { + return Str::upper($value); + }, + ]; + }, + ], + 'validations' => [ + 'minlength', + 'maxlength', + 'pattern' + ] +]; diff --git a/kirby/config/fields/textarea.php b/kirby/config/fields/textarea.php new file mode 100644 index 0000000..7b51c1f --- /dev/null +++ b/kirby/config/fields/textarea.php @@ -0,0 +1,123 @@ + ['filepicker', 'upload'], + 'props' => [ + /** + * Unset inherited props + */ + 'after' => null, + 'before' => null, + + /** + * Enables/disables the format buttons. Can either be `true`/`false` or a list of allowed buttons. Available buttons: `headlines`, `italic`, `bold`, `link`, `email`, `file`, `code`, `ul`, `ol` (as well as `|` for a divider) + */ + 'buttons' => function ($buttons = true) { + return $buttons; + }, + + /** + * Enables/disables the character counter in the top right corner + */ + 'counter' => function (bool $counter = true) { + return $counter; + }, + + /** + * Sets the default text when a new page/file/user is created + */ + 'default' => function (string $default = null) { + return trim($default ?? ''); + }, + + /** + * Sets the options for the files picker + */ + 'files' => function ($files = []) { + if (is_string($files) === true) { + return ['query' => $files]; + } + + if (is_array($files) === false) { + $files = []; + } + + return $files; + }, + + /** + * Sets the font family (sans or monospace) + */ + 'font' => function (string $font = null) { + return $font === 'monospace' ? 'monospace' : 'sans-serif'; + }, + + /** + * Maximum number of allowed characters + */ + 'maxlength' => function (int $maxlength = null) { + return $maxlength; + }, + + /** + * Minimum number of required characters + */ + 'minlength' => function (int $minlength = null) { + return $minlength; + }, + + /** + * Changes the size of the textarea. Available sizes: `small`, `medium`, `large`, `huge` + */ + 'size' => function (string $size = null) { + return $size; + }, + + /** + * If `false`, spellcheck will be switched off + */ + 'spellcheck' => function (bool $spellcheck = true) { + return $spellcheck; + }, + + 'value' => function (string $value = null) { + return trim($value ?? ''); + } + ], + 'api' => function () { + return [ + [ + 'pattern' => 'files', + 'action' => function () { + $params = array_merge($this->field()->files(), [ + 'page' => $this->requestQuery('page'), + 'search' => $this->requestQuery('search') + ]); + + return $this->field()->filepicker($params); + } + ], + [ + 'pattern' => 'upload', + 'method' => 'POST', + 'action' => function () { + $field = $this->field(); + $uploads = $field->uploads(); + + return $this->field()->upload($this, $uploads, function ($file, $parent) use ($field) { + $absolute = $field->model()->is($parent) === false; + + return [ + 'filename' => $file->filename(), + 'dragText' => $file->panel()->dragText('auto', $absolute), + ]; + }); + } + ] + ]; + }, + 'validations' => [ + 'minlength', + 'maxlength' + ] +]; diff --git a/kirby/config/fields/time.php b/kirby/config/fields/time.php new file mode 100644 index 0000000..4a0b6fc --- /dev/null +++ b/kirby/config/fields/time.php @@ -0,0 +1,126 @@ + ['datetime'], + 'props' => [ + /** + * Unset inherited props + */ + 'placeholder' => null, + + /** + * Sets the default time when a new page/file/user is created + */ + 'default' => function ($default = null): string|null { + return $default; + }, + + /** + * Custom format (dayjs tokens: `HH`, `hh`, `mm`, `ss`, `a`) that is + * used to display the field in the Panel + */ + 'display' => function ($display = null) { + return I18n::translate($display, $display); + }, + + /** + * Changes the clock icon + */ + 'icon' => function (string $icon = 'clock') { + return $icon; + }, + /** + * Latest time, which can be selected/saved (H:i or H:i:s) + */ + 'max' => function (string $max = null): string|null { + return Date::optional($max); + }, + /** + * Earliest time, which can be selected/saved (H:i or H:i:s) + */ + 'min' => function (string $min = null): string|null { + return Date::optional($min); + }, + + /** + * `12` or `24` hour notation. If `12`, an AM/PM selector will be shown. + * If `display` is defined, that option will take priority. + */ + 'notation' => function (int $value = 24) { + return $value === 24 ? 24 : 12; + }, + /** + * Round to the nearest: sub-options for `unit` (minute) and `size` (5) + */ + 'step' => function ($step = null) { + return Date::stepConfig($step, [ + 'size' => 5, + 'unit' => 'minute', + ]); + }, + 'value' => function ($value = null): string|null { + return $value; + } + ], + 'computed' => [ + 'display' => function () { + if ($this->display) { + return $this->display; + } + + return $this->notation === 24 ? 'HH:mm' : 'hh:mm a'; + }, + 'default' => function (): string { + return $this->toDatetime($this->default, 'H:i:s') ?? ''; + }, + 'format' => function () { + return $this->props['format'] ?? 'H:i:s'; + }, + 'value' => function (): string|null { + return $this->toDatetime($this->value, 'H:i:s') ?? ''; + } + ], + 'validations' => [ + 'time', + 'minMax' => function ($value) { + if (!$value = Date::optional($value)) { + return true; + } + + $min = Date::optional($this->min); + $max = Date::optional($this->max); + + $format = 'H:i:s'; + + if ($min && $max && $value->isBetween($min, $max) === false) { + throw new Exception([ + 'key' => 'validation.time.between', + 'data' => [ + 'min' => $min->format($format), + 'max' => $min->format($format) + ] + ]); + } elseif ($min && $value->isMin($min) === false) { + throw new Exception([ + 'key' => 'validation.time.after', + 'data' => [ + 'time' => $min->format($format), + ] + ]); + } elseif ($max && $value->isMax($max) === false) { + throw new Exception([ + 'key' => 'validation.time.before', + 'data' => [ + 'time' => $max->format($format), + ] + ]); + } + + return true; + }, + ] +]; diff --git a/kirby/config/fields/toggle.php b/kirby/config/fields/toggle.php new file mode 100644 index 0000000..a9b7897 --- /dev/null +++ b/kirby/config/fields/toggle.php @@ -0,0 +1,73 @@ + [ + /** + * Unset inherited props + */ + 'placeholder' => null, + + /** + * Default value which will be saved when a new page/user/file is created + */ + 'default' => function ($default = null) { + return $this->default = $default; + }, + /** + * Sets the text next to the toggle. The text can be a string or an array of two options. The first one is the negative text and the second one the positive. The text will automatically switch when the toggle is triggered. + */ + 'text' => function ($value = null) { + $model = $this->model(); + + if (is_array($value) === true) { + if (A::isAssociative($value) === true) { + return $model->toSafeString(I18n::translate($value, $value)); + } + + foreach ($value as $key => $val) { + $value[$key] = $model->toSafeString(I18n::translate($val, $val)); + } + + return $value; + } + + if (empty($value) === false) { + return $model->toSafeString(I18n::translate($value, $value)); + } + + return $value; + }, + ], + 'computed' => [ + 'default' => function () { + return $this->toBool($this->default); + }, + 'value' => function () { + if ($this->props['value'] === null) { + return $this->default(); + } + + return $this->toBool($this->props['value']); + } + ], + 'methods' => [ + 'toBool' => function ($value) { + return in_array($value, [true, 'true', 1, '1', 'on'], true) === true; + } + ], + 'save' => function (): string { + return $this->value() === true ? 'true' : 'false'; + }, + 'validations' => [ + 'boolean', + 'required' => function ($value) { + if ($this->isRequired() && ($value === false || $this->isEmpty($value))) { + throw new InvalidArgumentException(I18n::translate('field.required')); + } + }, + ] +]; diff --git a/kirby/config/fields/toggles.php b/kirby/config/fields/toggles.php new file mode 100644 index 0000000..c922c2b --- /dev/null +++ b/kirby/config/fields/toggles.php @@ -0,0 +1,41 @@ + ['options'], + 'props' => [ + /** + * Unset inherited props + */ + 'after' => null, + 'before' => null, + 'icon' => null, + 'placeholder' => null, + + /** + * Toggles will automatically span the full width of the field. With the grow option, you can disable this behaviour for a more compact layout. + */ + 'grow' => function (bool $grow = true) { + return $grow; + }, + /** + * If `false` all labels will be hidden for icon-only toggles. + */ + 'labels' => function (bool $labels = true) { + return $labels; + }, + /** + * A toggle can be deactivated on click. If reset is `false` deactivating a toggle is no longer possible. + */ + 'reset' => function (bool $reset = true) { + return $reset; + } + ], + 'computed' => [ + 'default' => function () { + return $this->sanitizeOption($this->default); + }, + 'value' => function () { + return $this->sanitizeOption($this->value) ?? ''; + }, + ] +]; diff --git a/kirby/config/fields/url.php b/kirby/config/fields/url.php new file mode 100644 index 0000000..1ecab71 --- /dev/null +++ b/kirby/config/fields/url.php @@ -0,0 +1,42 @@ + 'text', + 'props' => [ + /** + * Unset inherited props + */ + 'converter' => null, + 'counter' => null, + 'pattern' => null, + 'spellcheck' => null, + + /** + * Sets the HTML5 autocomplete attribute + */ + 'autocomplete' => function (string $autocomplete = 'url') { + return $autocomplete; + }, + + /** + * Changes the link icon + */ + 'icon' => function (string $icon = 'url') { + return $icon; + }, + + /** + * Sets custom placeholder text, when the field is empty + */ + 'placeholder' => function ($value = null) { + return I18n::translate($value, $value) ?? 'https://example.com'; + } + ], + 'validations' => [ + 'minlength', + 'maxlength', + 'url' + ], +]; diff --git a/kirby/config/fields/users.php b/kirby/config/fields/users.php new file mode 100644 index 0000000..f30f6ab --- /dev/null +++ b/kirby/config/fields/users.php @@ -0,0 +1,107 @@ + [ + 'layout', + 'min', + 'picker', + 'userpicker' + ], + 'props' => [ + /** + * Unset inherited props + */ + 'after' => null, + 'autofocus' => null, + 'before' => null, + 'icon' => null, + 'placeholder' => null, + + /** + * Default selected user(s) when a new page/file/user is created + */ + 'default' => function (string|array|bool|null $default = null) { + return $default; + }, + + 'value' => function ($value = null) { + return $this->toUsers($value); + }, + ], + 'computed' => [ + 'default' => function (): array { + if ($this->default === false) { + return []; + } + + if ( + $this->default === true && + $user = $this->kirby()->user() + ) { + return [ + $this->userResponse($user) + ]; + } + + return $this->toUsers($this->default); + } + ], + 'methods' => [ + 'userResponse' => function ($user) { + return $user->panel()->pickerData([ + 'info' => $this->info, + 'image' => $this->image, + 'layout' => $this->layout, + 'text' => $this->text, + ]); + }, + 'toUsers' => function ($value = null): array { + $users = []; + $kirby = App::instance(); + + foreach (Data::decode($value, 'yaml') as $email) { + if (is_array($email) === true) { + $email = $email['email'] ?? null; + } + + if ($email !== null && ($user = $kirby->user($email))) { + $users[] = $this->userResponse($user); + } + } + + return $users; + } + ], + 'api' => function () { + return [ + [ + 'pattern' => '/', + 'action' => function () { + $field = $this->field(); + + return $field->userpicker([ + 'image' => $field->image(), + 'info' => $field->info(), + 'layout' => $field->layout(), + 'limit' => $field->limit(), + 'page' => $this->requestQuery('page'), + 'query' => $field->query(), + 'search' => $this->requestQuery('search'), + 'text' => $field->text() + ]); + } + ] + ]; + }, + 'save' => function ($value = null) { + return A::pluck($value, $this->store); + }, + 'validations' => [ + 'max', + 'min' + ] +]; diff --git a/kirby/config/fields/writer.php b/kirby/config/fields/writer.php new file mode 100644 index 0000000..fc4a393 --- /dev/null +++ b/kirby/config/fields/writer.php @@ -0,0 +1,93 @@ + [ + /** + * Enables/disables the character counter in the top right corner + */ + 'counter' => function (bool $counter = true) { + return $counter; + }, + /** + * Available heading levels + */ + 'headings' => function (array|null $headings = null) { + return array_intersect($headings ?? range(1, 6), range(1, 6)); + }, + /** + * Enables inline mode, which will not wrap new lines in paragraphs and creates hard breaks instead. + * + * @param bool $inline + */ + 'inline' => function (bool $inline = false) { + return $inline; + }, + /** + * Sets the allowed HTML formats. Available formats: `bold`, `italic`, `underline`, `strike`, `code`, `link`, `email`. Activate/deactivate them all by passing `true`/`false`. Default marks are `bold`, `italic`, `underline`, `strike`, `link`, `email` + * @param array|bool $marks + */ + 'marks' => function ($marks = null) { + return $marks; + }, + /** + * Maximum number of allowed characters + */ + 'maxlength' => function (int $maxlength = null) { + return $maxlength; + }, + + /** + * Minimum number of required characters + */ + 'minlength' => function (int $minlength = null) { + return $minlength; + }, + /** + * Sets the allowed nodes. Available nodes: `paragraph`, `heading`, `bulletList`, `orderedList`, `quote`. Activate/deactivate them all by passing `true`/`false`. Default nodes are `paragraph`, `heading`, `bulletList`, `orderedList`. + * @param array|bool|null $nodes + */ + 'nodes' => function ($nodes = null) { + return $nodes; + }, + /** + * Toolbar options, incl. `marks` (to narrow down which marks should have toolbar buttons), `nodes` (to narrow down which nodes should have toolbar dropdown entries) and `inline` to set the position of the toolbar (false = sticking on top of the field) + */ + 'toolbar' => function ($toolbar = null) { + return $toolbar; + } + ], + 'computed' => [ + 'value' => function () { + $value = trim($this->value ?? ''); + return Sane::sanitize($value, 'html'); + } + ], + 'validations' => [ + 'minlength' => function ($value) { + if ( + $this->minlength && + V::minLength(strip_tags($value), $this->minlength) === false + ) { + throw new InvalidArgumentException([ + 'key' => 'validation.minlength', + 'data' => ['min' => $this->minlength] + ]); + } + }, + 'maxlength' => function ($value) { + if ( + $this->maxlength && + V::maxLength(strip_tags($value), $this->maxlength) === false + ) { + throw new InvalidArgumentException([ + 'key' => 'validation.maxlength', + 'data' => ['max' => $this->maxlength] + ]); + } + }, + ] +]; diff --git a/kirby/config/helpers.php b/kirby/config/helpers.php new file mode 100644 index 0000000..2dc83d8 --- /dev/null +++ b/kirby/config/helpers.php @@ -0,0 +1,690 @@ +collection($name, $options); + } +} + +if (Helpers::hasOverride('csrf') === false) { // @codeCoverageIgnore + /** + * Checks / returns a CSRF token + * + * @param string|null $check Pass a token here to compare it to the one in the session + * @return string|bool Either the token or a boolean check result + */ + function csrf(string|null $check = null): string|bool + { + // check explicitly if there have been no arguments at all; + // checking for null introduces a security issue because null could come + // from user input or bugs in the calling code! + if (func_num_args() === 0) { + return App::instance()->csrf(); + } + + return App::instance()->csrf($check); + } +} + +if (Helpers::hasOverride('css') === false) { // @codeCoverageIgnore + /** + * Creates one or multiple CSS link tags + * + * @param string|array $url Relative or absolute URLs, an array of URLs or `@auto` for automatic template css loading + * @param string|array|null $options Pass an array of attributes for the link tag or a media attribute string + */ + function css( + string|array $url, + string|array|null $options = null + ): string|null { + return Html::css($url, $options); + } +} + +if (Helpers::hasOverride('deprecated') === false) { // @codeCoverageIgnore + /** + * Triggers a deprecation warning if debug mode is active + * @since 3.3.0 + * + * @return bool Whether the warning was triggered + */ + function deprecated(string $message): bool + { + return Helpers::deprecated($message); + } +} + +if (Helpers::hasOverride('dump') === false && function_exists('dump') === false) { // @codeCoverageIgnore + /** + * Simple object and variable dumper + * to help with debugging. + */ + function dump(mixed $variable, bool $echo = true): string + { + return Helpers::dump($variable, $echo); + } +} + +if (Helpers::hasOverride('e') === false) { // @codeCoverageIgnore + /** + * Smart version of echo with an if condition as first argument + * + * @param mixed $value The string to be echoed if the condition is true + * @param mixed $alternative An alternative string which should be echoed when the condition is false + */ + function e(mixed $condition, mixed $value, mixed $alternative = null): void + { + echo $condition ? $value : $alternative; + } +} + +if (Helpers::hasOverride('endslot') === false) { // @codeCoverageIgnore + /** + * Ends the last started template slot + */ + function endslot(): void + { + Slot::end(); + } +} + +if (Helpers::hasOverride('endsnippet') === false) { // @codeCoverageIgnore + /** + * Renders the currently active snippet with slots + */ + function endsnippet(): void + { + Snippet::end(); + } +} + +if (Helpers::hasOverride('esc') === false) { // @codeCoverageIgnore + /** + * Escape context specific output + * + * @param string $string Untrusted data + * @param string $context Location of output (`html`, `attr`, `js`, `css`, `url` or `xml`) + * @return string Escaped data + */ + function esc(string $string, string $context = 'html'): string + { + return Str::esc($string, $context); + } +} + +if (Helpers::hasOverride('get') === false) { // @codeCoverageIgnore + /** + * Shortcut for $kirby->request()->get() + * + * @param mixed $key The key to look for. Pass false or null to return the entire request array. + * @param mixed $default Optional default value, which should be returned if no element has been found + */ + function get(mixed $key = null, mixed $default = null): mixed + { + return App::instance()->request()->get($key, $default); + } +} + +if (Helpers::hasOverride('gist') === false) { // @codeCoverageIgnore + /** + * Embeds a Github Gist + */ + function gist(string $url, string|null $file = null): string + { + return App::instance()->kirbytag([ + 'gist' => $url, + 'file' => $file, + ]); + } +} + +if (Helpers::hasOverride('go') === false) { // @codeCoverageIgnore + /** + * Redirects to the given Urls + * Urls can be relative or absolute. + */ + function go(string $url = '/', int $code = 302): never + { + Response::go($url, $code); + } +} + +if (Helpers::hasOverride('h') === false) { // @codeCoverageIgnore + /** + * Shortcut for html() + * + * @param string|null $string unencoded text + */ + function h(string|null $string, bool $keepTags = false): string + { + return Html::encode($string, $keepTags); + } +} + +if (Helpers::hasOverride('html') === false) { // @codeCoverageIgnore + /** + * Creates safe html by encoding special characters + * + * @param string|null $string unencoded text + */ + function html(string|null $string, bool $keepTags = false): string + { + return Html::encode($string, $keepTags); + } +} + +if (Helpers::hasOverride('image') === false) { // @codeCoverageIgnore + /** + * Return an image from any page + * specified by the path + * + * Example: + * + */ + function image(string|null $path = null): File|null + { + return App::instance()->image($path); + } +} + +if (Helpers::hasOverride('invalid') === false) { // @codeCoverageIgnore + /** + * Runs a number of validators on a set of data and checks if the data is invalid + */ + function invalid( + array $data = [], + array $rules = [], + array $messages = [] + ): array { + return V::invalid($data, $rules, $messages); + } +} + +if (Helpers::hasOverride('js') === false) { // @codeCoverageIgnore + /** + * Creates a script tag to load a javascript file + */ + function js( + string|array $url, + string|array|bool|null $options = null + ): string|null { + return Html::js($url, $options); + } +} + +if (Helpers::hasOverride('kirby') === false) { // @codeCoverageIgnore + /** + * Returns the Kirby object in any situation + */ + function kirby(): App + { + return App::instance(); + } +} + +if (Helpers::hasOverride('kirbytag') === false) { // @codeCoverageIgnore + /** + * Makes it possible to use any defined Kirbytag as standalone function + */ + function kirbytag( + string|array $type, + string|null $value = null, + array $attr = [], + array $data = [] + ): string { + return App::instance()->kirbytag($type, $value, $attr, $data); + } +} + +if (Helpers::hasOverride('kirbytags') === false) { // @codeCoverageIgnore + /** + * Parses KirbyTags in the given string. Shortcut + * for `$kirby->kirbytags($text, $data)` + */ + function kirbytags(string|null $text = null, array $data = []): string + { + return App::instance()->kirbytags($text, $data); + } +} + +if (Helpers::hasOverride('kirbytext') === false) { // @codeCoverageIgnore + /** + * Parses KirbyTags and Markdown in the + * given string. Shortcut for `$kirby->kirbytext()` + */ + function kirbytext(string|null $text = null, array $data = []): string + { + return App::instance()->kirbytext($text, $data); + } +} + +if (Helpers::hasOverride('kirbytextinline') === false) { // @codeCoverageIgnore + /** + * Parses KirbyTags and inline Markdown in the + * given string. + * @since 3.1.0 + */ + function kirbytextinline(string|null $text = null, array $options = []): string + { + $options['markdown']['inline'] = true; + return App::instance()->kirbytext($text, $options); + } +} + +if (Helpers::hasOverride('kt') === false) { // @codeCoverageIgnore + /** + * Shortcut for `kirbytext()` helper + */ + function kt(string|null $text = null, array $data = []): string + { + return App::instance()->kirbytext($text, $data); + } +} + +if (Helpers::hasOverride('kti') === false) { // @codeCoverageIgnore + /** + * Shortcut for `kirbytextinline()` helper + * @since 3.1.0 + */ + function kti(string|null $text = null, array $options = []): string + { + $options['markdown']['inline'] = true; + return App::instance()->kirbytext($text, $options); + } +} + +if (Helpers::hasOverride('load') === false) { // @codeCoverageIgnore + /** + * A super simple class autoloader + */ + function load(array $classmap, string|null $base = null): void + { + F::loadClasses($classmap, $base); + } +} + +if (Helpers::hasOverride('markdown') === false) { // @codeCoverageIgnore + /** + * Parses markdown in the given string. Shortcut for + * `$kirby->markdown($text)` + */ + function markdown(string|null $text = null, array $options = []): string + { + return App::instance()->markdown($text, $options); + } +} + +if (Helpers::hasOverride('option') === false) { // @codeCoverageIgnore + /** + * Shortcut for `$kirby->option($key, $default)` + */ + function option(string $key, mixed $default = null): mixed + { + return App::instance()->option($key, $default); + } +} + +if (Helpers::hasOverride('page') === false) { // @codeCoverageIgnore + /** + * Fetches a single page by id or + * the current page when no id is specified + */ + function page(string|null $id = null): Page|null + { + if (empty($id) === true) { + return App::instance()->site()->page(); + } + + return App::instance()->site()->find($id); + } +} + +if (Helpers::hasOverride('pages') === false) { // @codeCoverageIgnore + /** + * Helper to build pages collection + */ + function pages(string|array ...$id): Pages|null + { + // ensure that a list of string arguments and an array + // as the first argument are treated the same + if (count($id) === 1 && is_array($id[0]) === true) { + $id = $id[0]; + } + + // always passes $id an array; ensures we get a + // collection even if only one ID is passed + return App::instance()->site()->find($id); + } +} + +if (Helpers::hasOverride('param') === false) { // @codeCoverageIgnore + /** + * Returns a single param from the URL + * + * @psalm-return ($fallback is string ? string : string|null) + */ + function param(string $key, string|null $fallback = null): string|null + { + return App::instance()->request()->url()->params()->$key ?? $fallback; + } +} + +if (Helpers::hasOverride('params') === false) { // @codeCoverageIgnore + /** + * Returns all params from the current Url + */ + function params(): array + { + return App::instance()->request()->url()->params()->toArray(); + } +} + +if (Helpers::hasOverride('qr') === false) { // @codeCoverageIgnore + /** + * Creates a QR code object + */ + function qr(string|ModelWithContent $data): QrCode + { + if ($data instanceof ModelWithContent) { + $data = $data->url(); + } + + return new QrCode($data); + } +} + +if (Helpers::hasOverride('r') === false) { // @codeCoverageIgnore + /** + * Smart version of return with an if condition as first argument + * + * @param mixed $value The string to be returned if the condition is true + * @param mixed $alternative An alternative string which should be returned when the condition is false + */ + function r(mixed $condition, mixed $value, mixed $alternative = null): mixed + { + return $condition ? $value : $alternative; + } +} + +if (Helpers::hasOverride('router') === false) { // @codeCoverageIgnore + /** + * Creates a micro-router and executes + * the routing action immediately + * @since 3.6.0 + */ + function router( + string|null $path = null, + string $method = 'GET', + array $routes = [], + Closure|null $callback = null + ): mixed { + return Router::execute($path, $method, $routes, $callback); + } +} + +if (Helpers::hasOverride('site') === false) { // @codeCoverageIgnore + /** + * Returns the current site object + */ + function site(): Site + { + return App::instance()->site(); + } +} + +if (Helpers::hasOverride('size') === false) { // @codeCoverageIgnore + /** + * Determines the size/length of numbers, strings, arrays and countable objects + */ + function size(mixed $value): int + { + return Helpers::size($value); + } +} + +if (Helpers::hasOverride('slot') === false) { // @codeCoverageIgnore + /** + * Starts a new template slot + */ + function slot(string $name = 'default'): void + { + Slot::begin($name); + } +} + +if (Helpers::hasOverride('smartypants') === false) { // @codeCoverageIgnore + /** + * Enhances the given string with + * smartypants. Shortcut for `$kirby->smartypants($text)` + */ + function smartypants(string|null $text = null): string + { + return App::instance()->smartypants($text); + } +} + +if (Helpers::hasOverride('snippet') === false) { // @codeCoverageIgnore + /** + * Embeds a snippet from the snippet folder + */ + function snippet( + $name, + $data = [], + bool $return = false, + bool $slots = false + ): Snippet|string|null { + return App::instance()->snippet($name, $data, $return, $slots); + } +} + +if (Helpers::hasOverride('svg') === false) { // @codeCoverageIgnore + /** + * Includes an SVG file by absolute or + * relative file path. + */ + function svg(string|File $file): string|false + { + return Html::svg($file); + } +} + +if (Helpers::hasOverride('t') === false) { // @codeCoverageIgnore + /** + * Returns translate string for key from translation file + */ + function t( + string|array $key, + string|null $fallback = null, + string|null $locale = null + ): string|array|Closure|null { + return I18n::translate($key, $fallback, $locale); + } +} + +if (Helpers::hasOverride('tc') === false) { // @codeCoverageIgnore + /** + * Translates a count + * + * @param bool $formatNumber If set to `false`, the count is not formatted + */ + function tc( + string $key, + int $count, + string|null $locale = null, + bool $formatNumber = true + ): mixed { + return I18n::translateCount($key, $count, $locale, $formatNumber); + } +} + +if (Helpers::hasOverride('timestamp') === false) { // @codeCoverageIgnore + /** + * Rounds the minutes of the given date + * by the defined step + * + * @param int|array|null $step array of `unit` and `size` to round to nearest + */ + function timestamp( + string|null $date = null, + int|array|null $step = null + ): int|null { + return Date::roundedTimestamp($date, $step); + } +} + +if (Helpers::hasOverride('tt') === false) { // @codeCoverageIgnore + /** + * Translate by key and then replace + * placeholders in the text + */ + function tt( + string $key, + string|array|null $fallback = null, + array|null $replace = null, + string|null $locale = null + ): string { + return I18n::template($key, $fallback, $replace, $locale); + } +} + +if (Helpers::hasOverride('u') === false) { // @codeCoverageIgnore + /** + * Shortcut for url() + */ + function u( + string|null $path = null, + array|string|null $options = null + ): string { + return Url::to($path, $options); + } +} + +if (Helpers::hasOverride('url') === false) { // @codeCoverageIgnore + /** + * Builds an absolute URL for a given path + */ + function url( + string|null $path = null, + array|string|null $options = null + ): string { + return Url::to($path, $options); + } +} + +if (Helpers::hasOverride('uuid') === false) { // @codeCoverageIgnore + /** + * Creates a compliant v4 UUID + */ + function uuid(): string + { + return Str::uuid(); + } +} + +if (Helpers::hasOverride('video') === false) { // @codeCoverageIgnore + /** + * Creates a video embed via iframe for Youtube or Vimeo + * videos. The embed Urls are automatically detected from + * the given Url. + */ + function video( + string $url, + array $options = [], + array $attr = [] + ): string|null { + return Html::video($url, $options, $attr); + } +} + +if (Helpers::hasOverride('vimeo') === false) { // @codeCoverageIgnore + /** + * Embeds a Vimeo video by URL in an iframe + */ + function vimeo( + string $url, + array $options = [], + array $attr = [] + ): string|null { + return Html::vimeo($url, $options, $attr); + } +} + +if (Helpers::hasOverride('widont') === false) { // @codeCoverageIgnore + /** + * The widont function makes sure that there are no + * typographical widows at the end of a paragraph – + * that's a single word in the last line + */ + function widont(string|null $string = null): string + { + return Str::widont($string); + } +} + +if (Helpers::hasOverride('youtube') === false) { // @codeCoverageIgnore + /** + * Embeds a Youtube video by URL in an iframe + */ + function youtube( + string $url, + array $options = [], + array $attr = [] + ): string|null { + return Html::youtube($url, $options, $attr); + } +} diff --git a/kirby/config/methods.php b/kirby/config/methods.php new file mode 100644 index 0000000..870c243 --- /dev/null +++ b/kirby/config/methods.php @@ -0,0 +1,618 @@ + function (Field $field): bool { + return $field->toBool() === false; + }, + + /** + * Converts the field value into a proper boolean + */ + 'isTrue' => function (Field $field): bool { + return $field->toBool() === true; + }, + + /** + * Validates the field content with the given validator and parameters + * + * @param mixed ...$arguments A list of optional validator arguments + */ + 'isValid' => function ( + Field $field, + string $validator, + ...$arguments + ): bool { + return V::$validator($field->value, ...$arguments); + }, + + // converters + /** + * Converts a yaml or json field to a Blocks object + */ + 'toBlocks' => function (Field $field): Blocks { + try { + $blocks = Blocks::parse($field->value()); + $blocks = Blocks::factory($blocks, [ + 'parent' => $field->parent(), + 'field' => $field, + ]); + return $blocks->filter('isHidden', false); + } catch (Throwable) { + $message = 'Invalid blocks data for "' . $field->key() . '" field'; + + if ($parent = $field->parent()) { + $message .= ' on parent "' . $parent->title() . '"'; + } + + throw new InvalidArgumentException($message); + } + }, + + /** + * Converts the field value into a proper boolean + * + * @param bool $default Default value if the field is empty + */ + 'toBool' => function (Field $field, bool $default = false): bool { + $value = $field->isEmpty() ? $default : $field->value; + return filter_var($value, FILTER_VALIDATE_BOOLEAN); + }, + + /** + * Parses the field value with the given method + * + * @param string $method [',', 'yaml', 'json'] + */ + 'toData' => function (Field $field, string $method = ','): array { + return match ($method) { + 'yaml', 'json' => Data::decode($field->value, $method), + default => $field->split($method) + }; + }, + + /** + * Converts the field value to a timestamp or a formatted date + * + * @param string|\IntlDateFormatter|null $format PHP date formatting string + * @param string|null $fallback Fallback string for `strtotime` + */ + 'toDate' => function ( + Field $field, + string|IntlDateFormatter|null $format = null, + string $fallback = null + ) use ($app): string|int|null { + if (empty($field->value) === true && $fallback === null) { + return null; + } + + if (empty($field->value) === false) { + $time = $field->toTimestamp(); + } else { + $time = strtotime($fallback); + } + + return Str::date($time, $format); + }, + + /** + * Returns a file object from a filename in the field + */ + 'toFile' => function (Field $field): File|null { + return $field->toFiles()->first(); + }, + + /** + * Returns a file collection from a yaml list of filenames in the field + */ + 'toFiles' => function ( + Field $field, + string $separator = 'yaml' + ): Files { + $parent = $field->parent(); + $files = new Files([]); + + foreach ($field->toData($separator) as $id) { + if (is_string($id) === true && $file = $parent->kirby()->file($id, $parent)) { + $files->add($file); + } + } + + return $files; + }, + + /** + * Converts the field value into a proper float + * + * @param float $default Default value if the field is empty + */ + 'toFloat' => function (Field $field, float $default = 0): float { + $value = $field->isEmpty() ? $default : $field->value; + return (float)$value; + }, + + /** + * Converts the field value into a proper integer + * + * @param int $default Default value if the field is empty + */ + 'toInt' => function (Field $field, int $default = 0): int { + $value = $field->isEmpty() ? $default : $field->value; + return (int)$value; + }, + + /** + * Parse layouts and turn them into Layout objects + */ + 'toLayouts' => function (Field $field): Layouts { + return Layouts::factory(Layouts::parse($field->value()), [ + 'parent' => $field->parent(), + 'field' => $field, + ]); + }, + + /** + * Wraps a link tag around the field value. The field value is used as the link text + * + * @param mixed $attr1 Can be an optional Url. If no Url is set, the Url of the Page, File or Site will be used. Can also be an array of link attributes + * @param mixed $attr2 If `$attr1` is used to set the Url, you can use `$attr2` to pass an array of additional attributes. + */ + 'toLink' => function ( + Field $field, + string|array|null $attr1 = null, + array|null $attr2 = null + ): string { + if (is_string($attr1) === true) { + $href = $attr1; + $attr = $attr2; + } else { + $href = $field->parent()->url(); + $attr = $attr1; + } + + if ($field->parent()->isActive()) { + $attr['aria-current'] = 'page'; + } + + return Html::a($href, $field->value, $attr ?? []); + }, + + /** + * Parse yaml data and convert it to a + * content object + */ + 'toObject' => function (Field $field): Content { + return new Content($field->yaml(), $field->parent(), true); + }, + + /** + * Returns a page object from a page id in the field + */ + 'toPage' => function (Field $field): Page|null { + return $field->toPages()->first(); + }, + + /** + * Returns a pages collection from a yaml list of page ids in the field + * + * @param string $separator Can be any other separator to split the field value by + */ + 'toPages' => function ( + Field $field, + string $separator = 'yaml' + ) use ($app): Pages { + return $app->site()->find( + false, + false, + ...$field->toData($separator) + ); + }, + + /** + * Turns the field value into an QR code object + */ + 'toQrCode' => function (Field $field): QrCode|null { + return $field->isNotEmpty() ? new QrCode($field->value) : null; + }, + + /** + * Converts a yaml field to a Structure object + */ + 'toStructure' => function (Field $field): Structure { + try { + return Structure::factory( + Data::decode($field->value, 'yaml'), + ['parent' => $field->parent(), 'field' => $field] + ); + } catch (Exception) { + $message = 'Invalid structure data for "' . $field->key() . '" field'; + + if ($parent = $field->parent()) { + $message .= ' on parent "' . $parent->id() . '"'; + } + + throw new InvalidArgumentException($message); + } + }, + + /** + * Converts the field value to a Unix timestamp + */ + 'toTimestamp' => function (Field $field): int|false { + return strtotime($field->value ?? ''); + }, + + /** + * Turns the field value into an absolute Url + */ + 'toUrl' => function (Field $field): string|null { + try { + return $field->isNotEmpty() ? Url::to($field->value) : null; + } catch (NotFoundException) { + return null; + } + }, + + /** + * Converts a user email address to a user object + */ + 'toUser' => function (Field $field): User|null { + return $field->toUsers()->first(); + }, + + /** + * Returns a users collection from a yaml list + * of user email addresses in the field + */ + 'toUsers' => function ( + Field $field, + string $separator = 'yaml' + ) use ($app): Users { + return $app->users()->find( + false, + false, + ...$field->toData($separator) + ); + }, + + // inspectors + + /** + * Returns the length of the field content + */ + 'length' => function (Field $field): int { + return Str::length($field->value); + }, + + /** + * Returns the number of words in the text + */ + 'words' => function (Field $field): int { + return str_word_count(strip_tags($field->value ?? '')); + }, + + // manipulators + + /** + * Applies the callback function to the field + * @since 3.4.0 + */ + 'callback' => function (Field $field, Closure $callback): mixed { + return $callback($field); + }, + + /** + * Escapes the field value to be safely used in HTML + * templates without the risk of XSS attacks + * + * @param string $context Location of output (`html`, `attr`, `js`, `css`, `url` or `xml`) + */ + 'escape' => function (Field $field, string $context = 'html'): Field { + $field->value = Str::esc($field->value ?? '', $context); + return $field; + }, + + /** + * Creates an excerpt of the field value without html + * or any other formatting. + */ + 'excerpt' => function ( + Field $field, + int $chars = 0, + bool $strip = true, + string $rep = ' …' + ): Field { + $field->value = Str::excerpt( + $field->kirbytext()->value(), + $chars, + $strip, + $rep + ); + return $field; + }, + + /** + * Converts the field content to valid HTML + */ + 'html' => function (Field $field): Field { + $field->value = Html::encode($field->value); + return $field; + }, + + /** + * Strips all block-level HTML elements from the field value, + * it can be safely placed inside of other inline elements + * without the risk of breaking the HTML structure. + * @since 3.3.0 + */ + 'inline' => function (Field $field): Field { + // List of valid inline elements taken from: https://developer.mozilla.org/de/docs/Web/HTML/Inline_elemente + // Obsolete elements, script tags, image maps and form elements have + // been excluded for safety reasons and as they are most likely not + // needed in most cases. + $field->value = strip_tags($field->value ?? '', Html::$inlineList); + return $field; + }, + + /** + * Converts the field content from Markdown/Kirbytext to valid HTML + */ + 'kirbytext' => function ( + Field $field, + array $options = [] + ) use ($app): Field { + $field->value = $app->kirbytext($field->value, A::merge($options, [ + 'parent' => $field->parent(), + 'field' => $field + ])); + + return $field; + }, + + /** + * Converts the field content from inline Markdown/Kirbytext + * to valid HTML + * @since 3.1.0 + */ + 'kirbytextinline' => function ( + Field $field, + array $options = [] + ) use ($app): Field { + $field->value = $app->kirbytext($field->value, A::merge($options, [ + 'parent' => $field->parent(), + 'field' => $field, + 'markdown' => [ + 'inline' => true + ] + ])); + + return $field; + }, + + /** + * Parses all KirbyTags without also parsing Markdown + */ + 'kirbytags' => function (Field $field) use ($app): Field { + $field->value = $app->kirbytags($field->value, [ + 'parent' => $field->parent(), + 'field' => $field + ]); + + return $field; + }, + + /** + * Converts the field content to lowercase + */ + 'lower' => function (Field $field): Field { + $field->value = Str::lower($field->value); + return $field; + }, + + /** + * Converts markdown to valid HTML + */ + 'markdown' => function ( + Field $field, + array $options = [] + ) use ($app): Field { + $field->value = $app->markdown($field->value, $options); + return $field; + }, + + /** + * Converts all line breaks in the field content to `
` tags. + * @since 3.3.0 + */ + 'nl2br' => function (Field $field): Field { + $field->value = nl2br($field->value ?? '', false); + return $field; + }, + + /** + * Parses the field value as DOM and replaces + * any permalinks in href/src attributes with + * the regular url + * + * This method is still experimental! You can use + * it to solve potential problems with permalinks + * already, but it might change in the future. + */ + 'permalinksToUrls' => function (Field $field): Field { + if ($field->isNotEmpty() === true) { + $dom = new Dom($field->value); + $attributes = ['href', 'src']; + $elements = $dom->query('//*[' . implode(' | ', A::map($attributes, fn ($attribute) => '@' . $attribute)) . ']'); + + foreach ($elements as $element) { + foreach ($attributes as $attribute) { + if ($element->hasAttribute($attribute) && $uuid = $element->getAttribute($attribute)) { + try { + if ($url = Uuid::for($uuid)?->model()?->url()) { + $element->setAttribute($attribute, $url); + } + } catch (InvalidArgumentException) { + // ignore anything else than permalinks + } + } + } + } + + $field->value = $dom->toString(); + } + + return $field; + }, + + /** + * Uses the field value as Kirby query + */ + 'query' => function ( + Field $field, + string $expect = null + ) use ($app): mixed { + if ($parent = $field->parent()) { + return $parent->query($field->value, $expect); + } + + return Str::query($field->value, [ + 'kirby' => $app, + 'site' => $app->site(), + 'page' => $app->page() + ]); + }, + + /** + * It parses any queries found in the field value. + * + * @param string|null $fallback Fallback for tokens in the template that cannot be replaced (`null` to keep the original token) + */ + 'replace' => function ( + Field $field, + array $data = [], + string|null $fallback = '' + ) use ($app): Field { + if ($parent = $field->parent()) { + // never pass `null` as the $template to avoid the fallback to the model ID + $field->value = $parent->toString($field->value ?? '', $data, $fallback); + } else { + $field->value = Str::template($field->value, array_replace([ + 'kirby' => $app, + 'site' => $app->site(), + 'page' => $app->page() + ], $data), ['fallback' => $fallback]); + } + + return $field; + }, + + /** + * Cuts the string after the given length and + * adds "…" if it is longer + * + * @param int $length The number of characters in the string + * @param string $appendix An optional replacement for the missing rest + */ + 'short' => function ( + Field $field, + int $length, + string $appendix = '…' + ): Field { + $field->value = Str::short($field->value, $length, $appendix); + return $field; + }, + + /** + * Converts the field content to a slug + */ + 'slug' => function (Field $field): Field { + $field->value = Str::slug($field->value); + return $field; + }, + + /** + * Applies SmartyPants to the field + */ + 'smartypants' => function (Field $field) use ($app): Field { + $field->value = $app->smartypants($field->value); + return $field; + }, + + /** + * Splits the field content into an array + */ + 'split' => function (Field $field, $separator = ','): array { + return Str::split((string)$field->value, $separator); + }, + + /** + * Converts the field content to uppercase + */ + 'upper' => function (Field $field): Field { + $field->value = Str::upper($field->value); + return $field; + }, + + /** + * Avoids typographical widows in strings by replacing + * the last space with ` ` + */ + 'widont' => function (Field $field): Field { + $field->value = Str::widont($field->value); + return $field; + }, + + /** + * Converts the field content to valid XML + */ + 'xml' => function (Field $field): Field { + $field->value = Xml::encode($field->value); + return $field; + }, + + // aliases + + /** + * Parses yaml in the field content and returns an array + */ + 'yaml' => function (Field $field): array { + return $field->toData('yaml'); + }, + + ]; +}; diff --git a/kirby/config/presets/files.php b/kirby/config/presets/files.php new file mode 100644 index 0000000..aefc535 --- /dev/null +++ b/kirby/config/presets/files.php @@ -0,0 +1,27 @@ + [ + 'label' => $props['label'] ?? $props['headline'] ?? I18n::translate('files'), + 'type' => 'files', + 'layout' => $props['layout'] ?? 'cards', + 'template' => $props['template'] ?? null, + 'image' => $props['image'] ?? null, + 'info' => '{{ file.dimensions }}' + ] + ]; + + // remove global options + unset( + $props['headline'], + $props['label'], + $props['layout'], + $props['template'], + $props['image'] + ); + + return $props; +}; diff --git a/kirby/config/presets/page.php b/kirby/config/presets/page.php new file mode 100644 index 0000000..a2102ef --- /dev/null +++ b/kirby/config/presets/page.php @@ -0,0 +1,74 @@ + $props + ]; + } + + return array_replace_recursive($defaults, $props); + }; + + if (empty($props['sidebar']) === false) { + $sidebar = $props['sidebar']; + } else { + $sidebar = []; + + $pages = $props['pages'] ?? []; + $files = $props['files'] ?? []; + + if ($pages !== false) { + $sidebar['pages'] = $section([ + 'label' => I18n::translate('pages'), + 'type' => 'pages', + 'status' => 'all', + 'layout' => 'list', + ], $pages); + } + + if ($files !== false) { + $sidebar['files'] = $section([ + 'label' => I18n::translate('files'), + 'type' => 'files', + 'layout' => 'list' + ], $files); + } + } + + if (empty($sidebar) === true) { + $props['fields'] ??= []; + + unset( + $props['files'], + $props['pages'] + ); + } else { + $props['columns'] = [ + [ + 'width' => '2/3', + 'fields' => $props['fields'] ?? [] + ], + [ + 'width' => '1/3', + 'sections' => $sidebar + ], + ]; + + unset( + $props['fields'], + $props['files'], + $props['pages'], + $props['sidebar'] + ); + } + + return $props; +}; diff --git a/kirby/config/presets/pages.php b/kirby/config/presets/pages.php new file mode 100644 index 0000000..a2c7714 --- /dev/null +++ b/kirby/config/presets/pages.php @@ -0,0 +1,58 @@ + $label, + 'type' => 'pages', + 'layout' => 'list', + 'status' => $status + ]; + + if ($props === true) { + $props = []; + } + + if (is_string($props) === true) { + $props = [ + 'label' => $props + ]; + } + + // inject the global templates definition + if (empty($templates) === false) { + $props['templates'] ??= $templates; + } + + return array_replace_recursive($defaults, $props); + }; + + $sections = []; + + $drafts = $props['drafts'] ?? []; + $unlisted = $props['unlisted'] ?? false; + $listed = $props['listed'] ?? []; + + + if ($drafts !== false) { + $sections['drafts'] = $section(I18n::translate('pages.status.draft'), 'drafts', $drafts); + } + + if ($unlisted !== false) { + $sections['unlisted'] = $section(I18n::translate('pages.status.unlisted'), 'unlisted', $unlisted); + } + + if ($listed !== false) { + $sections['listed'] = $section(I18n::translate('pages.status.listed'), 'listed', $listed); + } + + // cleaning up + unset($props['drafts'], $props['unlisted'], $props['listed'], $props['templates']); + + return array_merge($props, ['sections' => $sections]); +}; diff --git a/kirby/config/routes.php b/kirby/config/routes.php new file mode 100644 index 0000000..cd7924d --- /dev/null +++ b/kirby/config/routes.php @@ -0,0 +1,195 @@ +option('api.slug', 'api'); + $panel = $kirby->option('panel.slug', 'panel'); + $index = $kirby->url('index'); + $media = $kirby->url('media'); + + if (Str::startsWith($media, $index) === true) { + $media = Str::after($media, $index); + } else { + // media URL is outside of the site, we can't make routing work; + // fall back to the standard media route + $media = 'media'; + } + + /** + * Before routes are running before the + * plugin routes and cannot be overwritten by + * plugins. + */ + $before = [ + [ + 'pattern' => $api . '/(:all)', + 'method' => 'ALL', + 'env' => 'api', + 'action' => function (string $path = null) use ($kirby) { + if ($kirby->option('api') === false) { + return null; + } + + $request = $kirby->request(); + + return $kirby->api()->render($path, $this->method(), [ + 'body' => $request->body()->toArray(), + 'files' => $request->files()->toArray(), + 'headers' => $request->headers(), + 'query' => $request->query()->toArray(), + ]); + } + ], + [ + 'pattern' => $media . '/plugins/index.(css|js)', + 'env' => 'media', + 'action' => function (string $type) use ($kirby) { + $plugins = new Plugins(); + + return $kirby + ->response() + ->type($type) + ->body($plugins->read($type)); + } + ], + [ + // TODO: change to '/plugins/(:any)/(:any)/(:any)/(:all)' once + // the hash is made mandatory + 'pattern' => $media . '/plugins/(:any)/(:any)/(?:(:any)/)?(:all)', + 'env' => 'media', + 'action' => function ( + string $provider, + string $pluginName, + string $hash, + string $path + ) { + return PluginAssets::resolve( + $provider . '/' . $pluginName, + $hash, + $path + ); + } + ], + [ + 'pattern' => $media . '/pages/(:all)/(:any)/(:any)', + 'env' => 'media', + 'action' => function ( + string $path, + string $hash, + string $filename + ) use ($kirby) { + return Media::link($kirby->page($path), $hash, $filename); + } + ], + [ + 'pattern' => $media . '/site/(:any)/(:any)', + 'env' => 'media', + 'action' => function ( + string $hash, + string $filename + ) use ($kirby) { + return Media::link($kirby->site(), $hash, $filename); + } + ], + [ + 'pattern' => $media . '/users/(:any)/(:any)/(:any)', + 'env' => 'media', + 'action' => function ( + string $id, + string $hash, + string $filename + ) use ($kirby) { + return Media::link($kirby->user($id), $hash, $filename); + } + ], + [ + 'pattern' => $media . '/assets/(:all)/(:any)/(:any)', + 'env' => 'media', + 'action' => function ( + string $path, + string $hash, + string $filename + ) { + return Media::thumb($path, $hash, $filename); + } + ], + [ + 'pattern' => $panel . '/(:all?)', + 'method' => 'ALL', + 'env' => 'panel', + 'action' => function (string $path = null) { + return Panel::router($path); + } + ], + // permalinks for page/file UUIDs + [ + 'pattern' => '@/(page|file)/(:all)', + 'method' => 'ALL', + 'env' => 'site', + 'action' => function (string $type, string $id) use ($kirby) { + // try to resolve to model, but only from UUID cache; + // this ensures that only existing UUIDs can be queried + // and attackers can't force Kirby to go through the whole + // site index with a non-existing UUID + if ($model = Uuid::for($type . '://' . $id)?->model(true)) { + return $kirby + ->response() + ->redirect($model->url()); + } + + // render the error page + return false; + } + ], + ]; + + // Multi-language setup + if ($kirby->multilang() === true) { + $after = LanguageRoutes::create($kirby); + } else { + // Single-language home + $after[] = [ + 'pattern' => '', + 'method' => 'ALL', + 'env' => 'site', + 'action' => function () use ($kirby) { + return $kirby->resolve(); + } + ]; + + // redirect the home page folder to the real homepage + $after[] = [ + 'pattern' => $kirby->option('home', 'home'), + 'method' => 'ALL', + 'env' => 'site', + 'action' => function () use ($kirby) { + return $kirby + ->response() + ->redirect($kirby->site()->url()); + } + ]; + + // Single-language subpages + $after[] = [ + 'pattern' => '(:all)', + 'method' => 'ALL', + 'env' => 'site', + 'action' => function (string $path) use ($kirby) { + return $kirby->resolve($path); + } + ]; + } + + return [ + 'before' => $before, + 'after' => $after + ]; +}; diff --git a/kirby/config/sections/fields.php b/kirby/config/sections/fields.php new file mode 100644 index 0000000..7eb79ba --- /dev/null +++ b/kirby/config/sections/fields.php @@ -0,0 +1,62 @@ + [ + 'fields' => function (array $fields = []) { + return $fields; + } + ], + 'computed' => [ + 'form' => function () { + $fields = $this->fields; + $disabled = $this->model->permissions()->update() === false; + $lang = $this->model->kirby()->languageCode(); + $content = $this->model->content($lang)->toArray(); + + if ($disabled === true) { + foreach ($fields as $key => $props) { + $fields[$key]['disabled'] = true; + } + } + + return new Form([ + 'fields' => $fields, + 'values' => $content, + 'model' => $this->model, + 'strict' => true + ]); + }, + 'fields' => function () { + $fields = $this->form->fields()->toArray(); + + if ( + $this->model instanceof Page || + $this->model instanceof Site + ) { + // the title should never be updated directly via + // fields section to avoid conflicts with the rename dialog + unset($fields['title']); + } + + foreach ($fields as $index => $props) { + unset($fields[$index]['value']); + } + + return $fields; + } + ], + 'methods' => [ + 'errors' => function () { + return $this->form->errors(); + } + ], + 'toArray' => function () { + return [ + 'fields' => $this->fields, + ]; + } +]; diff --git a/kirby/config/sections/files.php b/kirby/config/sections/files.php new file mode 100644 index 0000000..bb8532f --- /dev/null +++ b/kirby/config/sections/files.php @@ -0,0 +1,249 @@ + [ + 'details', + 'empty', + 'headline', + 'help', + 'layout', + 'min', + 'max', + 'pagination', + 'parent', + 'search', + 'sort' + ], + 'props' => [ + /** + * Filters pages by a query. Sorting will be disabled + */ + 'query' => function (string|null $query = null) { + return $query; + }, + /** + * Filters all files by template and also sets the template, which will be used for all uploads + */ + 'template' => function (string $template = null) { + return $template; + }, + /** + * Setup for the main text in the list or cards. By default this will display the filename. + */ + 'text' => function ($text = '{{ file.filename }}') { + return I18n::translate($text, $text); + } + ], + 'computed' => [ + 'accept' => function () { + if ($this->template) { + $file = new File([ + 'filename' => 'tmp', + 'parent' => $this->model(), + 'template' => $this->template + ]); + + return $file->blueprint()->acceptAttribute(); + } + + return null; + }, + 'parent' => function () { + return $this->parentModel(); + }, + 'models' => function () { + if ($this->query !== null) { + $files = $this->parent->query($this->query, Files::class) ?? new Files([]); + } else { + $files = $this->parent->files(); + } + + // filter files by template + $files = $files->template($this->template); + + // filter out all protected and hidden files + $files = $files->filter('isListable', true); + + // search + if ($this->search === true && empty($this->searchterm()) === false) { + $files = $files->search($this->searchterm()); + + // disable flip and sortBy while searching + // to show most relevant results + $this->flip = false; + $this->sortBy = null; + } + + // sort + if ($this->sortBy) { + $files = $files->sort(...$files::sortArgs($this->sortBy)); + } else { + $files = $files->sorted(); + } + + // flip + if ($this->flip === true) { + $files = $files->flip(); + } + + // apply the default pagination + $files = $files->paginate([ + 'page' => $this->page, + 'limit' => $this->limit, + 'method' => 'none' // the page is manually provided + ]); + + return $files; + }, + 'files' => function () { + return $this->models; + }, + 'data' => function () { + $data = []; + + // the drag text needs to be absolute when the files come from + // a different parent model + $dragTextAbsolute = $this->model->is($this->parent) === false; + + foreach ($this->models as $file) { + $panel = $file->panel(); + + $item = [ + 'dragText' => $panel->dragText('auto', $dragTextAbsolute), + 'extension' => $file->extension(), + 'filename' => $file->filename(), + 'id' => $file->id(), + 'image' => $panel->image( + $this->image, + $this->layout === 'table' ? 'list' : $this->layout + ), + 'info' => $file->toSafeString($this->info ?? false), + 'link' => $panel->url(true), + 'mime' => $file->mime(), + 'parent' => $file->parent()->panel()->path(), + 'template' => $file->template(), + 'text' => $file->toSafeString($this->text), + 'url' => $file->url(), + ]; + + if ($this->layout === 'table') { + $item = $this->columnsValues($item, $file); + } + + $data[] = $item; + } + + return $data; + }, + 'total' => function () { + return $this->models->pagination()->total(); + }, + 'errors' => function () { + $errors = []; + + if ($this->validateMax() === false) { + $errors['max'] = I18n::template('error.section.files.max.' . I18n::form($this->max), [ + 'max' => $this->max, + 'section' => $this->headline + ]); + } + + if ($this->validateMin() === false) { + $errors['min'] = I18n::template('error.section.files.min.' . I18n::form($this->min), [ + 'min' => $this->min, + 'section' => $this->headline + ]); + } + + if (empty($errors) === true) { + return []; + } + + return [ + $this->name => [ + 'label' => $this->headline, + 'message' => $errors, + ] + ]; + }, + 'pagination' => function () { + return $this->pagination(); + }, + 'upload' => function () { + if ($this->isFull() === true) { + return false; + } + + // count all uploaded files + $max = $this->max ? $this->max - $this->total : null; + + if ($this->max && $this->total === $this->max - 1) { + $multiple = false; + } else { + $multiple = true; + } + + $template = $this->template === 'default' ? null : $this->template; + + return [ + 'accept' => $this->accept, + 'multiple' => $multiple, + 'max' => $max, + 'api' => $this->parent->apiUrl(true) . '/files', + 'attributes' => [ + // TODO: an edge issue that needs to be solved: + // if multiple users load the same section + // at the same time and upload a file, + // uploaded files have the same sort number + 'sort' => $this->sortable === true ? $this->total + 1 : null, + 'template' => $template + ] + ]; + } + ], + // @codeCoverageIgnoreStart + 'api' => function () { + return [ + [ + 'pattern' => 'sort', + 'method' => 'PATCH', + 'action' => function () { + $this->section()->model()->files()->changeSort( + $this->requestBody('files'), + $this->requestBody('index') + ); + + return true; + } + ] + ]; + }, + // @codeCoverageIgnoreEnd + 'toArray' => function () { + return [ + 'data' => $this->data, + 'errors' => $this->errors, + 'options' => [ + 'accept' => $this->accept, + 'apiUrl' => $this->parent->apiUrl(true) . '/sections/' . $this->name, + 'columns' => $this->columnsWithTypes(), + 'empty' => $this->empty, + 'headline' => $this->headline, + 'help' => $this->help, + 'layout' => $this->layout, + 'link' => $this->link(), + 'max' => $this->max, + 'min' => $this->min, + 'search' => $this->search, + 'size' => $this->size, + 'sortable' => $this->sortable, + 'upload' => $this->upload + ], + 'pagination' => $this->pagination + ]; + } +]; diff --git a/kirby/config/sections/info.php b/kirby/config/sections/info.php new file mode 100644 index 0000000..7999aac --- /dev/null +++ b/kirby/config/sections/info.php @@ -0,0 +1,37 @@ + [ + 'headline', + ], + 'props' => [ + 'icon' => function (string $icon = null) { + return $icon; + }, + 'text' => function ($text = null) { + return I18n::translate($text, $text); + }, + 'theme' => function (string $theme = null) { + return $theme; + } + ], + 'computed' => [ + 'text' => function () { + if ($this->text) { + $text = $this->model()->toSafeString($this->text); + $text = $this->kirby()->kirbytext($text); + return $text; + } + }, + ], + 'toArray' => function () { + return [ + 'icon' => $this->icon, + 'label' => $this->headline, + 'text' => $this->text, + 'theme' => $this->theme + ]; + } +]; diff --git a/kirby/config/sections/mixins/details.php b/kirby/config/sections/mixins/details.php new file mode 100644 index 0000000..3d2c928 --- /dev/null +++ b/kirby/config/sections/mixins/details.php @@ -0,0 +1,36 @@ + [ + /** + * Image options to control the source and look of preview + */ + 'image' => function ($image = null) { + return $image ?? []; + }, + /** + * Optional info text setup. Info text is shown on the right (lists, cardlets) or below (cards) the title. + */ + 'info' => function ($info = null) { + return I18n::translate($info, $info); + }, + /** + * Setup for the main text in the list or cards. By default this will display the title. + */ + 'text' => function ($text = '{{ model.title }}') { + return I18n::translate($text, $text); + } + ], + 'methods' => [ + 'link' => function () { + $modelLink = $this->model->panel()->url(true); + $parentLink = $this->parent->panel()->url(true); + + if ($modelLink !== $parentLink) { + return $parentLink; + } + } + ] +]; diff --git a/kirby/config/sections/mixins/empty.php b/kirby/config/sections/mixins/empty.php new file mode 100644 index 0000000..97c2404 --- /dev/null +++ b/kirby/config/sections/mixins/empty.php @@ -0,0 +1,21 @@ + [ + /** + * Sets the text for the empty state box + */ + 'empty' => function ($empty = null) { + return I18n::translate($empty, $empty); + } + ], + 'computed' => [ + 'empty' => function () { + if ($this->empty) { + return $this->model()->toSafeString($this->empty); + } + } + ] +]; diff --git a/kirby/config/sections/mixins/headline.php b/kirby/config/sections/mixins/headline.php new file mode 100644 index 0000000..ebc2bb7 --- /dev/null +++ b/kirby/config/sections/mixins/headline.php @@ -0,0 +1,36 @@ + [ + /** + * The headline for the section. This can be a simple string or a template with additional info from the parent page. + * @deprecated 3.8.0 Use `label` instead + */ + 'headline' => function ($headline = null) { + return I18n::translate($headline, $headline); + }, + /** + * The label for the section. This can be a simple string or + * a template with additional info from the parent page. + * Replaces the `headline` prop. + */ + 'label' => function ($label = null) { + return I18n::translate($label, $label); + } + ], + 'computed' => [ + 'headline' => function () { + if ($this->label) { + return $this->model()->toString($this->label); + } + + if ($this->headline) { + return $this->model()->toString($this->headline); + } + + return ucfirst($this->name); + } + ] +]; diff --git a/kirby/config/sections/mixins/help.php b/kirby/config/sections/mixins/help.php new file mode 100644 index 0000000..c95db08 --- /dev/null +++ b/kirby/config/sections/mixins/help.php @@ -0,0 +1,23 @@ + [ + /** + * Sets the help text + */ + 'help' => function ($help = null) { + return I18n::translate($help, $help); + } + ], + 'computed' => [ + 'help' => function () { + if ($this->help) { + $help = $this->model()->toSafeString($this->help); + $help = $this->kirby()->kirbytext($help); + return $help; + } + } + ] +]; diff --git a/kirby/config/sections/mixins/layout.php b/kirby/config/sections/mixins/layout.php new file mode 100644 index 0000000..150498f --- /dev/null +++ b/kirby/config/sections/mixins/layout.php @@ -0,0 +1,155 @@ + [ + /** + * Columns config for `layout: table` + */ + 'columns' => function (array $columns = null) { + return $columns ?? []; + }, + /** + * Section layout. + * Available layout methods: `list`, `cardlets`, `cards`, `table`. + */ + 'layout' => function (string $layout = 'list') { + $layouts = ['list', 'cardlets', 'cards', 'table']; + return in_array($layout, $layouts) ? $layout : 'list'; + }, + /** + * The size option controls the size of cards. By default cards are auto-sized and the cards grid will always fill the full width. With a size you can disable auto-sizing. Available sizes: `tiny`, `small`, `medium`, `large`, `huge`, `full` + */ + 'size' => function (string $size = 'auto') { + return $size; + }, + ], + 'computed' => [ + 'columns' => function () { + $columns = []; + + if ($this->layout !== 'table') { + return []; + } + + if ($this->image !== false) { + $columns['image'] = [ + 'label' => ' ', + 'mobile' => true, + 'type' => 'image', + 'width' => 'var(--table-row-height)' + ]; + } + + if ($this->text) { + $columns['title'] = [ + 'label' => I18n::translate('title'), + 'mobile' => true, + 'type' => 'url', + ]; + } + + if ($this->info) { + $columns['info'] = [ + 'label' => I18n::translate('info'), + 'type' => 'text', + ]; + } + + foreach ($this->columns as $columnName => $column) { + if ($column === true) { + $column = []; + } + + if ($column === false) { + continue; + } + + // fallback for labels + $column['label'] ??= Str::ucfirst($columnName); + + // make sure to translate labels + $column['label'] = I18n::translate($column['label'], $column['label']); + + // keep the original column name as id + $column['id'] = $columnName; + + // add the custom column to the array + // allowing to extend/overwrite existing columns + $columns[$columnName] = [ + ...$columns[$columnName] ?? [], + ...$column + ]; + } + + if ($this->type === 'pages') { + $columns['flag'] = [ + 'label' => ' ', + 'mobile' => true, + 'type' => 'flag', + 'width' => 'var(--table-row-height)', + ]; + } + + return $columns; + }, + ], + 'methods' => [ + 'columnsWithTypes' => function () { + $columns = $this->columns; + + // add the type to the columns for the table layout + if ($this->layout === 'table') { + $blueprint = $this->models->first()?->blueprint(); + + if ($blueprint === null) { + return $columns; + } + + foreach ($columns as $columnName => $column) { + if ($id = $column['id'] ?? null) { + $columns[$columnName]['type'] ??= $blueprint->field($id)['type'] ?? null; + } + } + } + + return $columns; + }, + 'columnsValues' => function (array $item, ModelWithContent $model) { + $item['title'] = [ + // override toSafeString() coming from `$item` + // because the table cells don't use v-html + 'text' => $model->toString($this->text), + 'href' => $model->panel()->url(true) + ]; + + if ($this->info) { + // override toSafeString() coming from `$item` + // because the table cells don't use v-html + $item['info'] = $model->toString($this->info); + } + + // Use form to get the proper values for the columns + $form = Form::for($model)->values(); + + foreach ($this->columns as $columnName => $column) { + $item[$columnName] = match (empty($column['value'])) { + // if column value defined, resolve the query + false => $model->toString($column['value']), + // otherwise use the form value, + // but don't overwrite columns + default => + $item[$columnName] ?? + $form[$column['id'] ?? $columnName] ?? + null, + }; + } + + return $item; + } + ], +]; diff --git a/kirby/config/sections/mixins/max.php b/kirby/config/sections/mixins/max.php new file mode 100644 index 0000000..a87c1cc --- /dev/null +++ b/kirby/config/sections/mixins/max.php @@ -0,0 +1,28 @@ + [ + /** + * Sets the maximum number of allowed entries in the section + */ + 'max' => function (int $max = null) { + return $max; + } + ], + 'methods' => [ + 'isFull' => function () { + if ($this->max) { + return $this->total >= $this->max; + } + + return false; + }, + 'validateMax' => function () { + if ($this->max && $this->total > $this->max) { + return false; + } + + return true; + } + ] +]; diff --git a/kirby/config/sections/mixins/min.php b/kirby/config/sections/mixins/min.php new file mode 100644 index 0000000..6295f2d --- /dev/null +++ b/kirby/config/sections/mixins/min.php @@ -0,0 +1,21 @@ + [ + /** + * Sets the minimum number of required entries in the section + */ + 'min' => function (int $min = null) { + return $min; + } + ], + 'methods' => [ + 'validateMin' => function () { + if ($this->min && $this->min > $this->total) { + return false; + } + + return true; + } + ] +]; diff --git a/kirby/config/sections/mixins/pagination.php b/kirby/config/sections/mixins/pagination.php new file mode 100644 index 0000000..3b2a2b0 --- /dev/null +++ b/kirby/config/sections/mixins/pagination.php @@ -0,0 +1,37 @@ + [ + /** + * Sets the number of items per page. If there are more items the pagination navigation will be shown at the bottom of the section. + */ + 'limit' => function (int $limit = 20) { + return $limit; + }, + /** + * Sets the default page for the pagination. This will overwrite default pagination. + */ + 'page' => function (int $page = null) { + return App::instance()->request()->get('page', $page); + }, + ], + 'methods' => [ + 'pagination' => function () { + $pagination = new Pagination([ + 'limit' => $this->limit, + 'page' => $this->page, + 'total' => $this->total + ]); + + return [ + 'limit' => $pagination->limit(), + 'offset' => $pagination->offset(), + 'page' => $pagination->page(), + 'total' => $pagination->total(), + ]; + } + ] +]; diff --git a/kirby/config/sections/mixins/parent.php b/kirby/config/sections/mixins/parent.php new file mode 100644 index 0000000..1096930 --- /dev/null +++ b/kirby/config/sections/mixins/parent.php @@ -0,0 +1,47 @@ + [ + /** + * Sets the query to a parent to find items for the list + */ + 'parent' => function (string $parent = null) { + return $parent; + } + ], + 'methods' => [ + 'parentModel' => function () { + $parent = $this->parent; + + if (is_string($parent) === true) { + $query = $parent; + $parent = $this->model->query($query); + + if (!$parent) { + throw new Exception('The parent for the query "' . $query . '" cannot be found in the section "' . $this->name() . '"'); + } + + if ( + $parent instanceof Page === false && + $parent instanceof Site === false && + $parent instanceof File === false && + $parent instanceof User === false + ) { + throw new Exception('The parent for the section "' . $this->name() . '" has to be a page, site or user object'); + } + } + + if ($parent === null) { + return $this->model; + } + + return $parent; + } + ] +]; diff --git a/kirby/config/sections/mixins/search.php b/kirby/config/sections/mixins/search.php new file mode 100644 index 0000000..0791152 --- /dev/null +++ b/kirby/config/sections/mixins/search.php @@ -0,0 +1,19 @@ + [ + /** + * Enable/disable the search in the sections + */ + 'search' => function (bool $search = false): bool { + return $search; + } + ], + 'methods' => [ + 'searchterm' => function (): string|null { + return App::instance()->request()->get('searchterm'); + } + ] +]; diff --git a/kirby/config/sections/mixins/sort.php b/kirby/config/sections/mixins/sort.php new file mode 100644 index 0000000..5b994ec --- /dev/null +++ b/kirby/config/sections/mixins/sort.php @@ -0,0 +1,57 @@ + [ + /** + * Enables/disables reverse sorting + */ + 'flip' => function (bool $flip = false) { + return $flip; + }, + /** + * Enables/disables manual sorting + */ + 'sortable' => function (bool $sortable = true) { + return $sortable; + }, + /** + * Overwrites manual sorting and sorts by the given field and sorting direction (i.e. `date desc`) + */ + 'sortBy' => function (string $sortBy = null) { + return $sortBy; + }, + ], + 'computed' => [ + 'sortable' => function () { + if ($this->sortable === false) { + return false; + } + + if ( + $this->type === 'pages' && + in_array($this->status, ['listed', 'published', 'all']) === false + ) { + return false; + } + + // don't allow sorting while search filter is active + if (empty($this->searchterm()) === false) { + return false; + } + + if ($this->query !== null) { + return false; + } + + if ($this->sortBy !== null) { + return false; + } + + if ($this->flip === true) { + return false; + } + + return true; + } + ] +]; diff --git a/kirby/config/sections/pages.php b/kirby/config/sections/pages.php new file mode 100644 index 0000000..7f142ae --- /dev/null +++ b/kirby/config/sections/pages.php @@ -0,0 +1,337 @@ + [ + 'details', + 'empty', + 'headline', + 'help', + 'layout', + 'min', + 'max', + 'pagination', + 'parent', + 'search', + 'sort' + ], + 'props' => [ + /** + * Optional array of templates that should only be allowed to add + * or `false` to completely disable page creation + */ + 'create' => function ($create = null) { + return $create; + }, + /** + * Filters pages by a query. Sorting will be disabled + */ + 'query' => function (string|null $query = null) { + return $query; + }, + /** + * Filters pages by their status. Available status settings: `draft`, `unlisted`, `listed`, `published`, `all`. + */ + 'status' => function (string $status = '') { + if ($status === 'drafts') { + $status = 'draft'; + } + + if (in_array($status, ['all', 'draft', 'published', 'listed', 'unlisted']) === false) { + $status = 'all'; + } + + return $status; + }, + /** + * Filters the list by single template. + */ + 'template' => function (string|array $template = null) { + return $template; + }, + /** + * Filters the list by templates and sets template options when adding new pages to the section. + */ + 'templates' => function ($templates = null) { + return A::wrap($templates ?? $this->template); + }, + /** + * Excludes the selected templates. + */ + 'templatesIgnore' => function ($templates = null) { + return A::wrap($templates); + } + ], + 'computed' => [ + 'parent' => function () { + $parent = $this->parentModel(); + + if ( + $parent instanceof Site === false && + $parent instanceof Page === false + ) { + throw new InvalidArgumentException('The parent is invalid. You must choose the site or a page as parent.'); + } + + return $parent; + }, + 'models' => function () { + if ($this->query !== null) { + $pages = $this->parent->query($this->query, Pages::class) ?? new Pages([]); + } else { + $pages = match ($this->status) { + 'draft' => $this->parent->drafts(), + 'listed' => $this->parent->children()->listed(), + 'published' => $this->parent->children(), + 'unlisted' => $this->parent->children()->unlisted(), + default => $this->parent->childrenAndDrafts() + }; + } + + // filters pages that are protected and not in the templates list + // internal `filter()` method used instead of foreach loop that previously included `unset()` + // because `unset()` is updating the original data, `filter()` is just filtering + // also it has been tested that there is no performance difference + // even in 0.1 seconds on 100k virtual pages + $pages = $pages->filter(function ($page) { + // remove all protected and hidden pages + if ($page->isListable() === false) { + return false; + } + + $intendedTemplate = $page->intendedTemplate()->name(); + + // filter by all set templates + if ( + $this->templates && + in_array($intendedTemplate, $this->templates) === false + ) { + return false; + } + + // exclude by all ignored templates + if ( + $this->templatesIgnore && + in_array($intendedTemplate, $this->templatesIgnore) === true + ) { + return false; + } + + return true; + }); + + // search + if ($this->search === true && empty($this->searchterm()) === false) { + $pages = $pages->search($this->searchterm()); + + // disable flip and sortBy while searching + // to show most relevant results + $this->flip = false; + $this->sortBy = null; + } + + // sort + if ($this->sortBy) { + $pages = $pages->sort(...$pages::sortArgs($this->sortBy)); + } + + // flip + if ($this->flip === true) { + $pages = $pages->flip(); + } + + // pagination + $pages = $pages->paginate([ + 'page' => $this->page, + 'limit' => $this->limit, + 'method' => 'none' // the page is manually provided + ]); + + return $pages; + }, + 'pages' => function () { + return $this->models; + }, + 'total' => function () { + return $this->models->pagination()->total(); + }, + 'data' => function () { + $data = []; + + foreach ($this->models as $page) { + $panel = $page->panel(); + $permissions = $page->permissions(); + + $item = [ + 'dragText' => $panel->dragText(), + 'id' => $page->id(), + 'image' => $panel->image( + $this->image, + $this->layout === 'table' ? 'list' : $this->layout + ), + 'info' => $page->toSafeString($this->info ?? false), + 'link' => $panel->url(true), + 'parent' => $page->parentId(), + 'permissions' => [ + 'sort' => $permissions->can('sort'), + 'changeSlug' => $permissions->can('changeSlug'), + 'changeStatus' => $permissions->can('changeStatus'), + 'changeTitle' => $permissions->can('changeTitle'), + ], + 'status' => $page->status(), + 'template' => $page->intendedTemplate()->name(), + 'text' => $page->toSafeString($this->text), + ]; + + if ($this->layout === 'table') { + $item = $this->columnsValues($item, $page); + } + + $data[] = $item; + } + + return $data; + }, + 'errors' => function () { + $errors = []; + + if ($this->validateMax() === false) { + $errors['max'] = I18n::template('error.section.pages.max.' . I18n::form($this->max), [ + 'max' => $this->max, + 'section' => $this->headline + ]); + } + + if ($this->validateMin() === false) { + $errors['min'] = I18n::template('error.section.pages.min.' . I18n::form($this->min), [ + 'min' => $this->min, + 'section' => $this->headline + ]); + } + + if (empty($errors) === true) { + return []; + } + + return [ + $this->name => [ + 'label' => $this->headline, + 'message' => $errors, + ] + ]; + }, + 'add' => function () { + if ($this->create === false) { + return false; + } + + if ($this->isFull() === true) { + return false; + } + + // form here on, we need to check with which status + // the pages are created and if the section can show + // these newly created pages + + // if the section shows pages no matter what status they have, + // we can always show the add button + if ($this->status === 'all') { + return true; + } + + // collect all statuses of the blueprints + // that are allowed to be created + $statuses = []; + + foreach ($this->blueprintNames() as $blueprint) { + try { + $props = Blueprint::load('pages/' . $blueprint); + $statuses[] = $props['create']['status'] ?? 'draft'; + } catch (Throwable) { + $statuses[] = 'draft'; // @codeCoverageIgnore + } + } + + $statuses = array_unique($statuses); + + // if there are multiple statuses or if the section is showing + // a different status than new pages would be created with, + // we cannot show the add button + if (count($statuses) > 1 || $this->status !== $statuses[0]) { + return false; + } + + return true; + }, + 'pagination' => function () { + return $this->pagination(); + } + ], + 'methods' => [ + 'blueprints' => function () { + $blueprints = []; + + // convert every template to a usable option array + // for the template select box + foreach ($this->blueprintNames() as $blueprint) { + try { + $props = Blueprint::load('pages/' . $blueprint); + + $blueprints[] = [ + 'name' => basename($props['name']), + 'title' => $props['title'], + ]; + } catch (Throwable) { + $blueprints[] = [ + 'name' => basename($blueprint), + 'title' => ucfirst($blueprint), + ]; + } + } + + return $blueprints; + }, + 'blueprintNames' => function () { + $blueprints = empty($this->create) === false ? A::wrap($this->create) : $this->templates; + + if (empty($blueprints) === true) { + $blueprints = $this->kirby()->blueprints(); + } + + // excludes ignored templates + if ($templatesIgnore = $this->templatesIgnore) { + $blueprints = array_diff($blueprints, $templatesIgnore); + } + + return $blueprints; + }, + ], + 'toArray' => function () { + return [ + 'data' => $this->data, + 'errors' => $this->errors, + 'options' => [ + 'add' => $this->add, + 'columns' => $this->columnsWithTypes(), + 'empty' => $this->empty, + 'headline' => $this->headline, + 'help' => $this->help, + 'layout' => $this->layout, + 'link' => $this->link(), + 'max' => $this->max, + 'min' => $this->min, + 'search' => $this->search, + 'size' => $this->size, + 'sortable' => $this->sortable + ], + 'pagination' => $this->pagination, + ]; + } +]; diff --git a/kirby/config/sections/stats.php b/kirby/config/sections/stats.php new file mode 100644 index 0000000..86efe96 --- /dev/null +++ b/kirby/config/sections/stats.php @@ -0,0 +1,68 @@ + [ + 'headline', + ], + 'props' => [ + /** + * Array or query string for reports. Each report needs a `label` and `value` and can have additional `info`, `link`, `icon` and `theme` settings. + */ + 'reports' => function ($reports = null) { + if ($reports === null) { + return []; + } + + if (is_string($reports) === true) { + $reports = $this->model()->query($reports); + } + + if (is_array($reports) === false) { + return []; + } + + return $reports; + }, + /** + * The size of the report cards. Available sizes: `tiny`, `small`, `medium`, `large` + */ + 'size' => function (string $size = 'large') { + return $size; + } + ], + 'computed' => [ + 'reports' => function () { + $reports = []; + $model = $this->model(); + $toString = fn ($value) => $value === null ? null : $model->toString($value); + + foreach ($this->reports as $report) { + if (is_string($report) === true) { + $report = $model->query($report); + } + + if (is_array($report) === false) { + continue; + } + + $info = $report['info'] ?? null; + $label = $report['label'] ?? null; + $link = $report['link'] ?? null; + $value = $report['value'] ?? null; + + $reports[] = [ + 'icon' => $toString($report['icon'] ?? null), + 'info' => $toString(I18n::translate($info, $info)), + 'label' => $toString(I18n::translate($label, $label)), + 'link' => $toString(I18n::translate($link, $link)), + 'theme' => $toString($report['theme'] ?? null), + 'value' => $toString(I18n::translate($value, $value)) + ]; + } + + return $reports; + } + ] +]; diff --git a/kirby/config/setup.php b/kirby/config/setup.php new file mode 100644 index 0000000..09b73bb --- /dev/null +++ b/kirby/config/setup.php @@ -0,0 +1,31 @@ + [ + 'attr' => [], + 'html' => function (KirbyTag $tag): string { + if (strtolower($tag->date) === 'year') { + return date('Y'); + } + + return date($tag->date); + } + ], + + /** + * Email + */ + 'email' => [ + 'attr' => [ + 'class', + 'rel', + 'target', + 'text', + 'title' + ], + 'html' => function (KirbyTag $tag): string { + return Html::email($tag->value, $tag->text, [ + 'class' => $tag->class, + 'rel' => $tag->rel, + 'target' => $tag->target, + 'title' => $tag->title, + ]); + } + ], + + /** + * File + */ + 'file' => [ + 'attr' => [ + 'class', + 'download', + 'rel', + 'target', + 'text', + 'title' + ], + 'html' => function (KirbyTag $tag): string { + if (!$file = $tag->file($tag->value)) { + return $tag->text ?? $tag->value; + } + + // use filename if the text is empty and make sure to + // ignore markdown italic underscores in filenames + if (empty($tag->text) === true) { + $tag->text = str_replace('_', '\_', $file->filename()); + } + + return Html::a($file->url(), $tag->text, [ + 'class' => $tag->class, + 'download' => $tag->download !== 'false', + 'rel' => $tag->rel, + 'target' => $tag->target, + 'title' => $tag->title, + ]); + } + ], + + /** + * Gist + */ + 'gist' => [ + 'attr' => [ + 'file' + ], + 'html' => function (KirbyTag $tag): string { + return Html::gist($tag->value, $tag->file); + } + ], + + /** + * Image + */ + 'image' => [ + 'attr' => [ + 'alt', + 'caption', + 'class', + 'height', + 'imgclass', + 'link', + 'linkclass', + 'rel', + 'srcset', + 'target', + 'title', + 'width' + ], + 'html' => function (KirbyTag $tag): string { + if ($tag->file = $tag->file($tag->value)) { + $tag->src = $tag->file->url(); + $tag->alt ??= $tag->file->alt()->or('')->value(); + $tag->title ??= $tag->file->title()->value(); + $tag->caption ??= $tag->file->caption()->value(); + + if ($srcset = $tag->srcset) { + $srcset = Str::split($srcset); + $srcset = match (count($srcset) > 1) { + // comma-separated list of sizes + true => A::map($srcset, fn ($size) => (int)trim($size)), + // srcset config name + default => $srcset[0] + }; + + $tag->srcset = $tag->file->srcset($srcset); + } + } else { + $tag->src = Url::to($tag->value); + } + + $link = function ($img) use ($tag) { + if (empty($tag->link) === true) { + return $img; + } + + $link = $tag->file($tag->link)?->url(); + $link ??= $tag->link === 'self' ? $tag->src : $tag->link; + + return Html::a($link, [$img], [ + 'rel' => $tag->rel, + 'class' => $tag->linkclass, + 'target' => $tag->target + ]); + }; + + $image = Html::img($tag->src, [ + 'srcset' => $tag->srcset, + 'width' => $tag->width, + 'height' => $tag->height, + 'class' => $tag->imgclass, + 'title' => $tag->title, + 'alt' => $tag->alt ?? '' + ]); + + if ($tag->kirby()->option('kirbytext.image.figure', true) === false) { + return $link($image); + } + + // render KirbyText in caption + if ($tag->caption) { + $options = ['markdown' => ['inline' => true]]; + $caption = $tag->kirby()->kirbytext($tag->caption, $options); + $tag->caption = [$caption]; + } + + return Html::figure([$link($image)], $tag->caption, [ + 'class' => $tag->class + ]); + } + ], + + /** + * Link + */ + 'link' => [ + 'attr' => [ + 'class', + 'lang', + 'rel', + 'role', + 'target', + 'title', + 'text', + ], + 'html' => function (KirbyTag $tag): string { + if (empty($tag->lang) === false) { + $tag->value = Url::to($tag->value, $tag->lang); + } + + // if value is a UUID, resolve to page/file model + // and use the URL as value + if ( + Uuid::is($tag->value, 'page') === true || + Uuid::is($tag->value, 'file') === true + ) { + $tag->value = Uuid::for($tag->value)->model()?->url(); + } + + // if url is empty, throw exception or link to the error page + if ($tag->value === null) { + if ($tag->kirby()->option('debug', false) === true) { + if (empty($tag->text) === false) { + throw new NotFoundException('The linked page cannot be found for the link text "' . $tag->text . '"'); + } else { + throw new NotFoundException('The linked page cannot be found'); + } + } else { + $tag->value = Url::to($tag->kirby()->site()->errorPageId()); + } + } + + return Html::a($tag->value, $tag->text, [ + 'rel' => $tag->rel, + 'class' => $tag->class, + 'role' => $tag->role, + 'title' => $tag->title, + 'target' => $tag->target, + ]); + } + ], + + /** + * Tel + */ + 'tel' => [ + 'attr' => [ + 'class', + 'rel', + 'text', + 'title' + ], + 'html' => function (KirbyTag $tag): string { + return Html::tel($tag->value, $tag->text, [ + 'class' => $tag->class, + 'rel' => $tag->rel, + 'title' => $tag->title + ]); + } + ], + + /** + * Video + */ + 'video' => [ + 'attr' => [ + 'autoplay', + 'caption', + 'controls', + 'class', + 'disablepictureinpicture', + 'height', + 'loop', + 'muted', + 'playsinline', + 'poster', + 'preload', + 'style', + 'width', + ], + 'html' => function (KirbyTag $tag): string { + // checks and gets if poster is local file + if ( + empty($tag->poster) === false && + Str::startsWith($tag->poster, 'http://') !== true && + Str::startsWith($tag->poster, 'https://') !== true + ) { + if ($poster = $tag->file($tag->poster)) { + $tag->poster = $poster->url(); + } + } + + // checks video is local or provider(remote) + $isLocalVideo = ( + Str::startsWith($tag->value, 'http://') !== true && + Str::startsWith($tag->value, 'https://') !== true + ); + $isProviderVideo = ( + $isLocalVideo === false && + ( + Str::contains($tag->value, 'youtu', true) === true || + Str::contains($tag->value, 'vimeo', true) === true + ) + ); + + // default attributes for local and remote videos + $attrs = [ + 'height' => $tag->height, + 'width' => $tag->width + ]; + + // don't use attributes that iframe doesn't support + if ($isProviderVideo === false) { + // convert tag attributes to supported formats (bool, string) + // to output correct html attributes + // + // for ex: + // `autoplay` will not work if `false` is a string + // instead of a boolean + $attrs['autoplay'] = $autoplay = Str::toType($tag->autoplay, 'bool'); + $attrs['controls'] = Str::toType($tag->controls ?? true, 'bool'); + $attrs['disablepictureinpicture'] = Str::toType($tag->disablepictureinpicture ?? false, 'bool'); + $attrs['loop'] = Str::toType($tag->loop, 'bool'); + $attrs['muted'] = Str::toType($tag->muted ?? $autoplay, 'bool'); + $attrs['playsinline'] = Str::toType($tag->playsinline ?? $autoplay, 'bool'); + $attrs['poster'] = $tag->poster; + $attrs['preload'] = $tag->preload; + } + + // handles local and remote video file + if ($isLocalVideo === true) { + // handles local video file + if ($tag->file = $tag->file($tag->value)) { + $source = Html::tag('source', '', [ + 'src' => $tag->file->url(), + 'type' => $tag->file->mime() + ]); + $video = Html::tag('video', [$source], $attrs); + } + } else { + $video = Html::video( + $tag->value, + $tag->kirby()->option('kirbytext.video.options', []), + $attrs + ); + } + + return Html::figure([$video ?? ''], $tag->caption, [ + 'class' => $tag->class ?? 'video', + 'style' => $tag->style + ]); + } + ], + +]; diff --git a/kirby/config/templates/emails/auth/login.php b/kirby/config/templates/emails/auth/login.php new file mode 100644 index 0000000..cacea18 --- /dev/null +++ b/kirby/config/templates/emails/auth/login.php @@ -0,0 +1,16 @@ +language() +); diff --git a/kirby/config/templates/emails/auth/password-reset.php b/kirby/config/templates/emails/auth/password-reset.php new file mode 100644 index 0000000..4480f31 --- /dev/null +++ b/kirby/config/templates/emails/auth/password-reset.php @@ -0,0 +1,16 @@ +language() +); diff --git a/kirby/dependencies/parsedown-extra/ParsedownExtra.php b/kirby/dependencies/parsedown-extra/ParsedownExtra.php new file mode 100644 index 0000000..2f9c62d --- /dev/null +++ b/kirby/dependencies/parsedown-extra/ParsedownExtra.php @@ -0,0 +1,637 @@ +BlockTypes[':'] []= 'DefinitionList'; + $this->BlockTypes['*'] []= 'Abbreviation'; + + # identify footnote definitions before reference definitions + array_unshift($this->BlockTypes['['], 'Footnote'); + + # identify footnote markers before before links + array_unshift($this->InlineTypes['['], 'FootnoteMarker'); + } + + # + # ~ + + public function text($text) + { + $Elements = $this->textElements($text); + + # convert to markup + $markup = $this->elements($Elements); + + # trim line breaks + $markup = trim($markup, "\n"); + + # merge consecutive dl elements + + $markup = preg_replace('/<\/dl>\s+
\s+/', '', $markup); + + # add footnotes + + if (isset($this->DefinitionData['Footnote'])) { + $Element = $this->buildFootnoteElement(); + + $markup .= "\n" . $this->element($Element); + } + + return $markup; + } + + # + # Blocks + # + + # + # Abbreviation + + protected function blockAbbreviation($Line) + { + if (preg_match('/^\*\[(.+?)\]:[ ]*(.+?)[ ]*$/', $Line['text'], $matches)) { + $this->DefinitionData['Abbreviation'][$matches[1]] = $matches[2]; + + $Block = array( + 'hidden' => true, + ); + + return $Block; + } + } + + # + # Footnote + + protected function blockFootnote($Line) + { + if (preg_match('/^\[\^(.+?)\]:[ ]?(.*)$/', $Line['text'], $matches)) { + $Block = array( + 'label' => $matches[1], + 'text' => $matches[2], + 'hidden' => true, + ); + + return $Block; + } + } + + protected function blockFootnoteContinue($Line, $Block) + { + if ($Line['text'][0] === '[' and preg_match('/^\[\^(.+?)\]:/', $Line['text'])) { + return; + } + + if (isset($Block['interrupted'])) { + if ($Line['indent'] >= 4) { + $Block['text'] .= "\n\n" . $Line['text']; + + return $Block; + } + } else { + $Block['text'] .= "\n" . $Line['text']; + + return $Block; + } + } + + protected function blockFootnoteComplete($Block) + { + $this->DefinitionData['Footnote'][$Block['label']] = array( + 'text' => $Block['text'], + 'count' => null, + 'number' => null, + ); + + return $Block; + } + + # + # Definition List + + protected function blockDefinitionList($Line, $Block) + { + if (! isset($Block) or $Block['type'] !== 'Paragraph') { + return; + } + + $Element = array( + 'name' => 'dl', + 'elements' => array(), + ); + + $terms = explode("\n", $Block['element']['handler']['argument']); + + foreach ($terms as $term) { + $Element['elements'] []= array( + 'name' => 'dt', + 'handler' => array( + 'function' => 'lineElements', + 'argument' => $term, + 'destination' => 'elements' + ), + ); + } + + $Block['element'] = $Element; + + $Block = $this->addDdElement($Line, $Block); + + return $Block; + } + + protected function blockDefinitionListContinue($Line, array $Block) + { + if ($Line['text'][0] === ':') { + $Block = $this->addDdElement($Line, $Block); + + return $Block; + } else { + if (isset($Block['interrupted']) and $Line['indent'] === 0) { + return; + } + + if (isset($Block['interrupted'])) { + $Block['dd']['handler']['function'] = 'textElements'; + $Block['dd']['handler']['argument'] .= "\n\n"; + + $Block['dd']['handler']['destination'] = 'elements'; + + unset($Block['interrupted']); + } + + $text = substr($Line['body'], min($Line['indent'], 4)); + + $Block['dd']['handler']['argument'] .= "\n" . $text; + + return $Block; + } + } + + # + # Header + + protected function blockHeader($Line) + { + $Block = parent::blockHeader($Line); + + if (preg_match('/[ #]*{('.$this->regexAttribute.'+)}[ ]*$/', $Block['element']['handler']['argument'], $matches, PREG_OFFSET_CAPTURE)) { + $attributeString = $matches[1][0]; + + $Block['element']['attributes'] = $this->parseAttributeData($attributeString); + + $Block['element']['handler']['argument'] = substr($Block['element']['handler']['argument'], 0, $matches[0][1]); + } + + return $Block; + } + + # + # Markup + + protected function blockMarkup($Line) + { + if ($this->markupEscaped or $this->safeMode) { + return; + } + + if (preg_match('/^<(\w[\w-]*)(?:[ ]*'.$this->regexHtmlAttribute.')*[ ]*(\/)?>/', $Line['text'], $matches)) { + $element = strtolower($matches[1]); + + if (in_array($element, $this->textLevelElements)) { + return; + } + + $Block = array( + 'name' => $matches[1], + 'depth' => 0, + 'element' => array( + 'rawHtml' => $Line['text'], + 'autobreak' => true, + ), + ); + + $length = strlen($matches[0]); + $remainder = substr($Line['text'], $length); + + if (trim($remainder) === '') { + if (isset($matches[2]) or in_array($matches[1], $this->voidElements)) { + $Block['closed'] = true; + $Block['void'] = true; + } + } else { + if (isset($matches[2]) or in_array($matches[1], $this->voidElements)) { + return; + } + if (preg_match('/<\/'.$matches[1].'>[ ]*$/i', $remainder)) { + $Block['closed'] = true; + } + } + + return $Block; + } + } + + protected function blockMarkupContinue($Line, array $Block) + { + if (isset($Block['closed'])) { + return; + } + + if (preg_match('/^<'.$Block['name'].'(?:[ ]*'.$this->regexHtmlAttribute.')*[ ]*>/i', $Line['text'])) { # open + $Block['depth'] ++; + } + + if (preg_match('/(.*?)<\/'.$Block['name'].'>[ ]*$/i', $Line['text'], $matches)) { # close + if ($Block['depth'] > 0) { + $Block['depth'] --; + } else { + $Block['closed'] = true; + } + } + + if (isset($Block['interrupted'])) { + $Block['element']['rawHtml'] .= "\n"; + unset($Block['interrupted']); + } + + $Block['element']['rawHtml'] .= "\n".$Line['body']; + + return $Block; + } + + protected function blockMarkupComplete($Block) + { + if (! isset($Block['void'])) { + $Block['element']['rawHtml'] = $this->processTag($Block['element']['rawHtml']); + } + + return $Block; + } + + # + # Setext + + protected function blockSetextHeader($Line, array $Block = null) + { + $Block = parent::blockSetextHeader($Line, $Block); + + if (preg_match('/[ ]*{('.$this->regexAttribute.'+)}[ ]*$/', $Block['element']['handler']['argument'], $matches, PREG_OFFSET_CAPTURE)) { + $attributeString = $matches[1][0]; + + $Block['element']['attributes'] = $this->parseAttributeData($attributeString); + + $Block['element']['handler']['argument'] = substr($Block['element']['handler']['argument'], 0, $matches[0][1]); + } + + return $Block; + } + + # + # Inline Elements + # + + # + # Footnote Marker + + protected function inlineFootnoteMarker($Excerpt) + { + if (preg_match('/^\[\^(.+?)\]/', $Excerpt['text'], $matches)) { + $name = $matches[1]; + + if (! isset($this->DefinitionData['Footnote'][$name])) { + return; + } + + $this->DefinitionData['Footnote'][$name]['count'] ++; + + if (! isset($this->DefinitionData['Footnote'][$name]['number'])) { + $this->DefinitionData['Footnote'][$name]['number'] = ++ $this->footnoteCount; # » & + } + + $Element = array( + 'name' => 'sup', + 'attributes' => array('id' => 'fnref'.$this->DefinitionData['Footnote'][$name]['count'].':'.$name), + 'element' => array( + 'name' => 'a', + 'attributes' => array('href' => '#fn:'.$name, 'class' => 'footnote-ref'), + 'text' => $this->DefinitionData['Footnote'][$name]['number'], + ), + ); + + return array( + 'extent' => strlen($matches[0]), + 'element' => $Element, + ); + } + } + + private $footnoteCount = 0; + + # + # Link + + protected function inlineLink($Excerpt) + { + $Link = parent::inlineLink($Excerpt); + + $remainder = substr($Excerpt['text'], $Link['extent']); + + if (preg_match('/^[ ]*{('.$this->regexAttribute.'+)}/', $remainder, $matches)) { + $Link['element']['attributes'] += $this->parseAttributeData($matches[1]); + + $Link['extent'] += strlen($matches[0]); + } + + return $Link; + } + + # + # ~ + # + + private $currentAbreviation; + private $currentMeaning; + + protected function insertAbreviation(array $Element) + { + if (isset($Element['text'])) { + $Element['elements'] = self::pregReplaceElements( + '/\b'.preg_quote($this->currentAbreviation, '/').'\b/', + array( + array( + 'name' => 'abbr', + 'attributes' => array( + 'title' => $this->currentMeaning, + ), + 'text' => $this->currentAbreviation, + ) + ), + $Element['text'] + ); + + unset($Element['text']); + } + + return $Element; + } + + protected function inlineText($text) + { + $Inline = parent::inlineText($text); + + if (isset($this->DefinitionData['Abbreviation'])) { + foreach ($this->DefinitionData['Abbreviation'] as $abbreviation => $meaning) { + $this->currentAbreviation = $abbreviation; + $this->currentMeaning = $meaning; + + $Inline['element'] = $this->elementApplyRecursiveDepthFirst( + array($this, 'insertAbreviation'), + $Inline['element'] + ); + } + } + + return $Inline; + } + + # + # Util Methods + # + + protected function addDdElement(array $Line, array $Block) + { + $text = substr($Line['text'], 1); + $text = trim($text); + + unset($Block['dd']); + + $Block['dd'] = array( + 'name' => 'dd', + 'handler' => array( + 'function' => 'lineElements', + 'argument' => $text, + 'destination' => 'elements' + ), + ); + + if (isset($Block['interrupted'])) { + $Block['dd']['handler']['function'] = 'textElements'; + + unset($Block['interrupted']); + } + + $Block['element']['elements'] []= & $Block['dd']; + + return $Block; + } + + protected function buildFootnoteElement() + { + $Element = array( + 'name' => 'div', + 'attributes' => array('class' => 'footnotes'), + 'elements' => array( + array('name' => 'hr'), + array( + 'name' => 'ol', + 'elements' => array(), + ), + ), + ); + + uasort($this->DefinitionData['Footnote'], [$this,'sortFootnotes']); + + foreach ($this->DefinitionData['Footnote'] as $definitionId => $DefinitionData) { + if (! isset($DefinitionData['number'])) { + continue; + } + + $text = $DefinitionData['text']; + + $textElements = parent::textElements($text); + + $numbers = range(1, $DefinitionData['count']); + + $backLinkElements = array(); + + foreach ($numbers as $number) { + $backLinkElements[] = array('text' => ' '); + $backLinkElements[] = array( + 'name' => 'a', + 'attributes' => array( + 'href' => "#fnref$number:$definitionId", + 'rev' => 'footnote', + 'class' => 'footnote-backref', + ), + 'rawHtml' => '↩', + 'allowRawHtmlInSafeMode' => true, + 'autobreak' => false, + ); + } + + unset($backLinkElements[0]); + + $n = count($textElements) -1; + + if ($textElements[$n]['name'] === 'p') { + $backLinkElements = array_merge( + array( + array( + 'rawHtml' => ' ', + 'allowRawHtmlInSafeMode' => true, + ), + ), + $backLinkElements + ); + + unset($textElements[$n]['name']); + + $textElements[$n] = array( + 'name' => 'p', + 'elements' => array_merge( + array($textElements[$n]), + $backLinkElements + ), + ); + } else { + $textElements[] = array( + 'name' => 'p', + 'elements' => $backLinkElements + ); + } + + $Element['elements'][1]['elements'] []= array( + 'name' => 'li', + 'attributes' => array('id' => 'fn:'.$definitionId), + 'elements' => array_merge( + $textElements + ), + ); + } + + return $Element; + } + + # ~ + + protected function parseAttributeData($attributeString) + { + $Data = array(); + + $attributes = preg_split('/[ ]+/', $attributeString, - 1, PREG_SPLIT_NO_EMPTY); + + foreach ($attributes as $attribute) { + if ($attribute[0] === '#') { + $Data['id'] = substr($attribute, 1); + } else { # "." + $classes []= substr($attribute, 1); + } + } + + if (isset($classes)) { + $Data['class'] = implode(' ', $classes); + } + + return $Data; + } + + # ~ + + protected function processTag($elementMarkup) # recursive + { + # http://stackoverflow.com/q/1148928/200145 + libxml_use_internal_errors(true); + + $DOMDocument = new DOMDocument(); + + // Migrating away from `mb_convert_encoding($elementMarkup, + //'HTML-ENTITIES', 'UTF-8');` has caused multibyte characters like + // emojis not to be converted into entities, which is needed so that + // the `DOM` extension can properly parse the markup. + // The following line works like this: It treats the input string + // as UTF-8 and converts every Unicode character with 8 or more bits + // (= character code starting at 128 or 0x80 up to the Unicode limit + // of 0x10ffff) to an entity; the third and fourth arguments for the + // map are not needed for our use case and are set to the default values + // (no offset and a full mask) + // [http://stackoverflow.com/q/11309194/200145] + $elementMarkup = mb_encode_numericentity($elementMarkup, [0x80, 0x10ffff, 0, 0xffffff], 'UTF-8'); + + # Ensure that saveHTML() is not remove new line characters. New lines will be split by this character. + $DOMDocument->formatOutput = true; + + # http://stackoverflow.com/q/4879946/200145 + $DOMDocument->loadHTML($elementMarkup); + $DOMDocument->removeChild($DOMDocument->doctype); + $DOMDocument->replaceChild($DOMDocument->firstChild->firstChild->firstChild, $DOMDocument->firstChild); + + $elementText = ''; + + if ($DOMDocument->documentElement->getAttribute('markdown') === '1') { + foreach ($DOMDocument->documentElement->childNodes as $Node) { + $elementText .= $DOMDocument->saveHTML($Node); + } + + $DOMDocument->documentElement->removeAttribute('markdown'); + + $elementText = "\n".$this->text($elementText)."\n"; + } else { + foreach ($DOMDocument->documentElement->childNodes as $Node) { + $nodeMarkup = $DOMDocument->saveHTML($Node); + + if ($Node instanceof DOMElement and ! in_array($Node->nodeName, $this->textLevelElements)) { + $elementText .= $this->processTag($nodeMarkup); + } else { + $elementText .= $nodeMarkup; + } + } + } + + # because we don't want for markup to get encoded + $DOMDocument->documentElement->nodeValue = 'placeholder\x1A'; + + $markup = $DOMDocument->saveHTML($DOMDocument->documentElement); + $markup = str_replace('placeholder\x1A', $elementText, $markup); + + return $markup; + } + + # ~ + + protected function sortFootnotes($A, $B) # callback + { + return $A['number'] - $B['number']; + } + + # + # Fields + # + + protected $regexAttribute = '(?:[#.][-\w]+[ ]*)'; +} diff --git a/kirby/dependencies/parsedown/Parsedown.php b/kirby/dependencies/parsedown/Parsedown.php new file mode 100644 index 0000000..ab72225 --- /dev/null +++ b/kirby/dependencies/parsedown/Parsedown.php @@ -0,0 +1,1818 @@ +textElements($text); + + # convert to markup + $markup = $this->elements($Elements); + + # trim line breaks + $markup = trim($markup, "\n"); + + return $markup; + } + + protected function textElements($text) + { + # make sure no definitions are set + $this->DefinitionData = array(); + + # standardize line breaks + $text = str_replace(array("\r\n", "\r"), "\n", $text); + + # remove surrounding line breaks + $text = trim($text, "\n"); + + # split text into lines + $lines = explode("\n", $text); + + # iterate through lines to identify blocks + return $this->linesElements($lines); + } + + # + # Setters + # + + public function setBreaksEnabled($breaksEnabled) + { + $this->breaksEnabled = $breaksEnabled; + + return $this; + } + + protected $breaksEnabled; + + public function setMarkupEscaped($markupEscaped) + { + $this->markupEscaped = $markupEscaped; + + return $this; + } + + protected $markupEscaped; + + public function setUrlsLinked($urlsLinked) + { + $this->urlsLinked = $urlsLinked; + + return $this; + } + + protected $urlsLinked = true; + + public function setSafeMode($safeMode) + { + $this->safeMode = (bool) $safeMode; + + return $this; + } + + protected $safeMode; + + public function setStrictMode($strictMode) + { + $this->strictMode = (bool) $strictMode; + + return $this; + } + + protected $strictMode; + + protected $safeLinksWhitelist = array( + 'http://', + 'https://', + 'ftp://', + 'ftps://', + 'mailto:', + 'data:image/png;base64,', + 'data:image/gif;base64,', + 'data:image/jpeg;base64,', + 'irc:', + 'ircs:', + 'git:', + 'ssh:', + 'news:', + 'steam:', + ); + + # + # Lines + # + + protected $BlockTypes = array( + '#' => array('Header'), + '*' => array('Rule', 'List'), + '+' => array('List'), + '-' => array('SetextHeader', 'Table', 'Rule', 'List'), + '0' => array('List'), + '1' => array('List'), + '2' => array('List'), + '3' => array('List'), + '4' => array('List'), + '5' => array('List'), + '6' => array('List'), + '7' => array('List'), + '8' => array('List'), + '9' => array('List'), + ':' => array('Table'), + '<' => array('Comment', 'Markup'), + '=' => array('SetextHeader'), + '>' => array('Quote'), + '[' => array('Reference'), + '_' => array('Rule'), + '`' => array('FencedCode'), + '|' => array('Table'), + '~' => array('FencedCode'), + ); + + # ~ + + protected $unmarkedBlockTypes = array( + 'Code', + ); + + # + # Blocks + # + + protected function lines(array $lines) + { + return $this->elements($this->linesElements($lines)); + } + + protected function linesElements(array $lines) + { + $Elements = array(); + $CurrentBlock = null; + + foreach ($lines as $line) { + if (chop($line) === '') { + if (isset($CurrentBlock)) { + $CurrentBlock['interrupted'] = ( + isset($CurrentBlock['interrupted']) + ? $CurrentBlock['interrupted'] + 1 : 1 + ); + } + + continue; + } + + while (($beforeTab = strstr($line, "\t", true)) !== false) { + $shortage = 4 - mb_strlen($beforeTab, 'utf-8') % 4; + + $line = $beforeTab + . str_repeat(' ', $shortage) + . substr($line, strlen($beforeTab) + 1) + ; + } + + $indent = strspn($line, ' '); + + $text = $indent > 0 ? substr($line, $indent) : $line; + + # ~ + + $Line = array('body' => $line, 'indent' => $indent, 'text' => $text); + + # ~ + + if (isset($CurrentBlock['continuable'])) { + $methodName = 'block' . $CurrentBlock['type'] . 'Continue'; + $Block = $this->$methodName($Line, $CurrentBlock); + + if (isset($Block)) { + $CurrentBlock = $Block; + + continue; + } elseif ($this->isBlockCompletable($CurrentBlock['type'])) { + $methodName = 'block' . $CurrentBlock['type'] . 'Complete'; + $CurrentBlock = $this->$methodName($CurrentBlock); + } + } + + # ~ + + $marker = $text[0]; + + # ~ + + $blockTypes = $this->unmarkedBlockTypes; + + if (isset($this->BlockTypes[$marker])) { + foreach ($this->BlockTypes[$marker] as $blockType) { + $blockTypes []= $blockType; + } + } + + # + # ~ + + foreach ($blockTypes as $blockType) { + $Block = $this->{"block$blockType"}($Line, $CurrentBlock); + + if (isset($Block)) { + $Block['type'] = $blockType; + + if (! isset($Block['identified'])) { + if (isset($CurrentBlock)) { + $Elements[] = $this->extractElement($CurrentBlock); + } + + $Block['identified'] = true; + } + + if ($this->isBlockContinuable($blockType)) { + $Block['continuable'] = true; + } + + $CurrentBlock = $Block; + + continue 2; + } + } + + # ~ + + if (isset($CurrentBlock) and $CurrentBlock['type'] === 'Paragraph') { + $Block = $this->paragraphContinue($Line, $CurrentBlock); + } + + if (isset($Block)) { + $CurrentBlock = $Block; + } else { + if (isset($CurrentBlock)) { + $Elements[] = $this->extractElement($CurrentBlock); + } + + $CurrentBlock = $this->paragraph($Line); + + $CurrentBlock['identified'] = true; + } + } + + # ~ + + if (isset($CurrentBlock['continuable']) and $this->isBlockCompletable($CurrentBlock['type'])) { + $methodName = 'block' . $CurrentBlock['type'] . 'Complete'; + $CurrentBlock = $this->$methodName($CurrentBlock); + } + + # ~ + + if (isset($CurrentBlock)) { + $Elements[] = $this->extractElement($CurrentBlock); + } + + # ~ + + return $Elements; + } + + protected function extractElement(array $Component) + { + if (! isset($Component['element'])) { + if (isset($Component['markup'])) { + $Component['element'] = array('rawHtml' => $Component['markup']); + } elseif (isset($Component['hidden'])) { + $Component['element'] = array(); + } + } + + return $Component['element']; + } + + protected function isBlockContinuable($Type) + { + return method_exists($this, 'block' . $Type . 'Continue'); + } + + protected function isBlockCompletable($Type) + { + return method_exists($this, 'block' . $Type . 'Complete'); + } + + # + # Code + + protected function blockCode($Line, $Block = null) + { + if (isset($Block) and $Block['type'] === 'Paragraph' and ! isset($Block['interrupted'])) { + return; + } + + if ($Line['indent'] >= 4) { + $text = substr($Line['body'], 4); + + $Block = array( + 'element' => array( + 'name' => 'pre', + 'element' => array( + 'name' => 'code', + 'text' => $text, + ), + ), + ); + + return $Block; + } + } + + protected function blockCodeContinue($Line, $Block) + { + if ($Line['indent'] >= 4) { + if (isset($Block['interrupted'])) { + $Block['element']['element']['text'] .= str_repeat("\n", $Block['interrupted']); + + unset($Block['interrupted']); + } + + $Block['element']['element']['text'] .= "\n"; + + $text = substr($Line['body'], 4); + + $Block['element']['element']['text'] .= $text; + + return $Block; + } + } + + protected function blockCodeComplete($Block) + { + return $Block; + } + + # + # Comment + + protected function blockComment($Line) + { + if ($this->markupEscaped or $this->safeMode) { + return; + } + + if (strpos($Line['text'], '') !== false) { + $Block['closed'] = true; + } + + return $Block; + } + } + + protected function blockCommentContinue($Line, array $Block) + { + if (isset($Block['closed'])) { + return; + } + + $Block['element']['rawHtml'] .= "\n" . $Line['body']; + + if (strpos($Line['text'], '-->') !== false) { + $Block['closed'] = true; + } + + return $Block; + } + + # + # Fenced Code + + protected function blockFencedCode($Line) + { + $marker = $Line['text'][0]; + + $openerLength = strspn($Line['text'], $marker); + + if ($openerLength < 3) { + return; + } + + $infostring = trim(substr($Line['text'], $openerLength), "\t "); + + if (strpos($infostring, '`') !== false) { + return; + } + + $Element = array( + 'name' => 'code', + 'text' => '', + ); + + if ($infostring !== '') { + /** + * https://www.w3.org/TR/2011/WD-html5-20110525/elements.html#classes + * Every HTML element may have a class attribute specified. + * The attribute, if specified, must have a value that is a set + * of space-separated tokens representing the various classes + * that the element belongs to. + * [...] + * The space characters, for the purposes of this specification, + * are U+0020 SPACE, U+0009 CHARACTER TABULATION (tab), + * U+000A LINE FEED (LF), U+000C FORM FEED (FF), and + * U+000D CARRIAGE RETURN (CR). + */ + $language = substr($infostring, 0, strcspn($infostring, " \t\n\f\r")); + + $Element['attributes'] = array('class' => "language-$language"); + } + + $Block = array( + 'char' => $marker, + 'openerLength' => $openerLength, + 'element' => array( + 'name' => 'pre', + 'element' => $Element, + ), + ); + + return $Block; + } + + protected function blockFencedCodeContinue($Line, $Block) + { + if (isset($Block['complete'])) { + return; + } + + if (isset($Block['interrupted'])) { + $Block['element']['element']['text'] .= str_repeat("\n", $Block['interrupted']); + + unset($Block['interrupted']); + } + + if (($len = strspn($Line['text'], $Block['char'])) >= $Block['openerLength'] + and chop(substr($Line['text'], $len), ' ') === '' + ) { + $Block['element']['element']['text'] = substr($Block['element']['element']['text'], 1); + + $Block['complete'] = true; + + return $Block; + } + + $Block['element']['element']['text'] .= "\n" . $Line['body']; + + return $Block; + } + + protected function blockFencedCodeComplete($Block) + { + return $Block; + } + + # + # Header + + protected function blockHeader($Line) + { + $level = strspn($Line['text'], '#'); + + if ($level > 6) { + return; + } + + $text = trim($Line['text'], '#'); + + if ($this->strictMode and isset($text[0]) and $text[0] !== ' ') { + return; + } + + $text = trim($text, ' '); + + $Block = array( + 'element' => array( + 'name' => 'h' . min(6, $level), + 'handler' => array( + 'function' => 'lineElements', + 'argument' => $text, + 'destination' => 'elements', + ) + ), + ); + + return $Block; + } + + # + # List + + protected function blockList($Line, array $CurrentBlock = null) + { + list($name, $pattern) = $Line['text'][0] <= '-' ? array('ul', '[*+-]') : array('ol', '[0-9]{1,9}+[.\)]'); + + if (preg_match('/^('.$pattern.'([ ]++|$))(.*+)/', $Line['text'], $matches)) { + $contentIndent = strlen($matches[2]); + + if ($contentIndent >= 5) { + $contentIndent -= 1; + $matches[1] = substr($matches[1], 0, -$contentIndent); + $matches[3] = str_repeat(' ', $contentIndent) . $matches[3]; + } elseif ($contentIndent === 0) { + $matches[1] .= ' '; + } + + $markerWithoutWhitespace = strstr($matches[1], ' ', true); + + $Block = array( + 'indent' => $Line['indent'], + 'pattern' => $pattern, + 'data' => array( + 'type' => $name, + 'marker' => $matches[1], + 'markerType' => ($name === 'ul' ? $markerWithoutWhitespace : substr($markerWithoutWhitespace, -1)), + ), + 'element' => array( + 'name' => $name, + 'elements' => array(), + ), + ); + $Block['data']['markerTypeRegex'] = preg_quote($Block['data']['markerType'], '/'); + + if ($name === 'ol') { + $listStart = ltrim(strstr($matches[1], $Block['data']['markerType'], true), '0') ?: '0'; + + if ($listStart !== '1') { + if ( + isset($CurrentBlock) + and $CurrentBlock['type'] === 'Paragraph' + and ! isset($CurrentBlock['interrupted']) + ) { + return; + } + + $Block['element']['attributes'] = array('start' => $listStart); + } + } + + $Block['li'] = array( + 'name' => 'li', + 'handler' => array( + 'function' => 'li', + 'argument' => !empty($matches[3]) ? array($matches[3]) : array(), + 'destination' => 'elements' + ) + ); + + $Block['element']['elements'] []= & $Block['li']; + + return $Block; + } + } + + protected function blockListContinue($Line, array $Block) + { + if (isset($Block['interrupted']) and empty($Block['li']['handler']['argument'])) { + return null; + } + + $requiredIndent = ($Block['indent'] + strlen($Block['data']['marker'])); + + if ($Line['indent'] < $requiredIndent + and ( + ( + $Block['data']['type'] === 'ol' + and preg_match('/^[0-9]++'.$Block['data']['markerTypeRegex'].'(?:[ ]++(.*)|$)/', $Line['text'], $matches) + ) or ( + $Block['data']['type'] === 'ul' + and preg_match('/^'.$Block['data']['markerTypeRegex'].'(?:[ ]++(.*)|$)/', $Line['text'], $matches) + ) + ) + ) { + if (isset($Block['interrupted'])) { + $Block['li']['handler']['argument'] []= ''; + + $Block['loose'] = true; + + unset($Block['interrupted']); + } + + unset($Block['li']); + + $text = isset($matches[1]) ? $matches[1] : ''; + + $Block['indent'] = $Line['indent']; + + $Block['li'] = array( + 'name' => 'li', + 'handler' => array( + 'function' => 'li', + 'argument' => array($text), + 'destination' => 'elements' + ) + ); + + $Block['element']['elements'] []= & $Block['li']; + + return $Block; + } elseif ($Line['indent'] < $requiredIndent and $this->blockList($Line)) { + return null; + } + + if ($Line['text'][0] === '[' and $this->blockReference($Line)) { + return $Block; + } + + if ($Line['indent'] >= $requiredIndent) { + if (isset($Block['interrupted'])) { + $Block['li']['handler']['argument'] []= ''; + + $Block['loose'] = true; + + unset($Block['interrupted']); + } + + $text = substr($Line['body'], $requiredIndent); + + $Block['li']['handler']['argument'] []= $text; + + return $Block; + } + + if (! isset($Block['interrupted'])) { + $text = preg_replace('/^[ ]{0,'.$requiredIndent.'}+/', '', $Line['body']); + + $Block['li']['handler']['argument'] []= $text; + + return $Block; + } + } + + protected function blockListComplete(array $Block) + { + if (isset($Block['loose'])) { + foreach ($Block['element']['elements'] as &$li) { + if (end($li['handler']['argument']) !== '') { + $li['handler']['argument'] []= ''; + } + } + } + + return $Block; + } + + # + # Quote + + protected function blockQuote($Line) + { + if (preg_match('/^>[ ]?+(.*+)/', $Line['text'], $matches)) { + $Block = array( + 'element' => array( + 'name' => 'blockquote', + 'handler' => array( + 'function' => 'linesElements', + 'argument' => (array) $matches[1], + 'destination' => 'elements', + ) + ), + ); + + return $Block; + } + } + + protected function blockQuoteContinue($Line, array $Block) + { + if (isset($Block['interrupted'])) { + return; + } + + if ($Line['text'][0] === '>' and preg_match('/^>[ ]?+(.*+)/', $Line['text'], $matches)) { + $Block['element']['handler']['argument'] []= $matches[1]; + + return $Block; + } + + if (! isset($Block['interrupted'])) { + $Block['element']['handler']['argument'] []= $Line['text']; + + return $Block; + } + } + + # + # Rule + + protected function blockRule($Line) + { + $marker = $Line['text'][0]; + + if (substr_count($Line['text'], $marker) >= 3 and chop($Line['text'], " $marker") === '') { + $Block = array( + 'element' => array( + 'name' => 'hr', + ), + ); + + return $Block; + } + } + + # + # Setext + + protected function blockSetextHeader($Line, array $Block = null) + { + if (! isset($Block) or $Block['type'] !== 'Paragraph' or isset($Block['interrupted'])) { + return; + } + + if ($Line['indent'] < 4 and chop(chop($Line['text'], ' '), $Line['text'][0]) === '') { + $Block['element']['name'] = $Line['text'][0] === '=' ? 'h1' : 'h2'; + + return $Block; + } + } + + # + # Markup + + protected function blockMarkup($Line) + { + if ($this->markupEscaped or $this->safeMode) { + return; + } + + if (preg_match('/^<[\/]?+(\w*)(?:[ ]*+'.$this->regexHtmlAttribute.')*+[ ]*+(\/)?>/', $Line['text'], $matches)) { + $element = strtolower($matches[1]); + + if (in_array($element, $this->textLevelElements)) { + return; + } + + $Block = array( + 'name' => $matches[1], + 'element' => array( + 'rawHtml' => $Line['text'], + 'autobreak' => true, + ), + ); + + return $Block; + } + } + + protected function blockMarkupContinue($Line, array $Block) + { + if (isset($Block['closed']) or isset($Block['interrupted'])) { + return; + } + + $Block['element']['rawHtml'] .= "\n" . $Line['body']; + + return $Block; + } + + # + # Reference + + protected function blockReference($Line) + { + if (strpos($Line['text'], ']') !== false + and preg_match('/^\[(.+?)\]:[ ]*+?(?:[ ]+["\'(](.+)["\')])?[ ]*+$/', $Line['text'], $matches) + ) { + $id = strtolower($matches[1]); + + $Data = array( + 'url' => $matches[2], + 'title' => isset($matches[3]) ? $matches[3] : null, + ); + + $this->DefinitionData['Reference'][$id] = $Data; + + $Block = array( + 'element' => array(), + ); + + return $Block; + } + } + + # + # Table + + protected function blockTable($Line, array $Block = null) + { + if (! isset($Block) or $Block['type'] !== 'Paragraph' or isset($Block['interrupted'])) { + return; + } + + if ( + strpos($Block['element']['handler']['argument'], '|') === false + and strpos($Line['text'], '|') === false + and strpos($Line['text'], ':') === false + or strpos($Block['element']['handler']['argument'], "\n") !== false + ) { + return; + } + + if (chop($Line['text'], ' -:|') !== '') { + return; + } + + $alignments = array(); + + $divider = $Line['text']; + + $divider = trim($divider); + $divider = trim($divider, '|'); + + $dividerCells = explode('|', $divider); + + foreach ($dividerCells as $dividerCell) { + $dividerCell = trim($dividerCell); + + if ($dividerCell === '') { + return; + } + + $alignment = null; + + if ($dividerCell[0] === ':') { + $alignment = 'left'; + } + + if (substr($dividerCell, - 1) === ':') { + $alignment = $alignment === 'left' ? 'center' : 'right'; + } + + $alignments []= $alignment; + } + + # ~ + + $HeaderElements = array(); + + $header = $Block['element']['handler']['argument']; + + $header = trim($header); + $header = trim($header, '|'); + + $headerCells = explode('|', $header); + + if (count($headerCells) !== count($alignments)) { + return; + } + + foreach ($headerCells as $index => $headerCell) { + $headerCell = trim($headerCell); + + $HeaderElement = array( + 'name' => 'th', + 'handler' => array( + 'function' => 'lineElements', + 'argument' => $headerCell, + 'destination' => 'elements', + ) + ); + + if (isset($alignments[$index])) { + $alignment = $alignments[$index]; + + $HeaderElement['attributes'] = array( + 'style' => "text-align: $alignment;", + ); + } + + $HeaderElements []= $HeaderElement; + } + + # ~ + + $Block = array( + 'alignments' => $alignments, + 'identified' => true, + 'element' => array( + 'name' => 'table', + 'elements' => array(), + ), + ); + + $Block['element']['elements'] []= array( + 'name' => 'thead', + ); + + $Block['element']['elements'] []= array( + 'name' => 'tbody', + 'elements' => array(), + ); + + $Block['element']['elements'][0]['elements'] []= array( + 'name' => 'tr', + 'elements' => $HeaderElements, + ); + + return $Block; + } + + protected function blockTableContinue($Line, array $Block) + { + if (isset($Block['interrupted'])) { + return; + } + + if (count($Block['alignments']) === 1 or $Line['text'][0] === '|' or strpos($Line['text'], '|')) { + $Elements = array(); + + $row = $Line['text']; + + $row = trim($row); + $row = trim($row, '|'); + + preg_match_all('/(?:(\\\\[|])|[^|`]|`[^`]++`|`)++/', $row, $matches); + + $cells = array_slice($matches[0], 0, count($Block['alignments'])); + + foreach ($cells as $index => $cell) { + $cell = trim($cell); + + $Element = array( + 'name' => 'td', + 'handler' => array( + 'function' => 'lineElements', + 'argument' => $cell, + 'destination' => 'elements', + ) + ); + + if (isset($Block['alignments'][$index])) { + $Element['attributes'] = array( + 'style' => 'text-align: ' . $Block['alignments'][$index] . ';', + ); + } + + $Elements []= $Element; + } + + $Element = array( + 'name' => 'tr', + 'elements' => $Elements, + ); + + $Block['element']['elements'][1]['elements'] []= $Element; + + return $Block; + } + } + + # + # ~ + # + + protected function paragraph($Line) + { + return array( + 'type' => 'Paragraph', + 'element' => array( + 'name' => 'p', + 'handler' => array( + 'function' => 'lineElements', + 'argument' => $Line['text'], + 'destination' => 'elements', + ), + ), + ); + } + + protected function paragraphContinue($Line, array $Block) + { + if (isset($Block['interrupted'])) { + return; + } + + $Block['element']['handler']['argument'] .= "\n".$Line['text']; + + return $Block; + } + + # + # Inline Elements + # + + protected $InlineTypes = array( + '!' => array('Image'), + '&' => array('SpecialCharacter'), + '*' => array('Emphasis'), + ':' => array('Url'), + '<' => array('UrlTag', 'EmailTag', 'Markup'), + '[' => array('Link'), + '_' => array('Emphasis'), + '`' => array('Code'), + '~' => array('Strikethrough'), + '\\' => array('EscapeSequence'), + ); + + # ~ + + protected $inlineMarkerList = '!*_&[:<`~\\'; + + # + # ~ + # + + public function line($text, $nonNestables = array()) + { + return $this->elements($this->lineElements($text, $nonNestables)); + } + + protected function lineElements($text, $nonNestables = array()) + { + $Elements = array(); + + $nonNestables = ( + empty($nonNestables) + ? array() + : array_combine($nonNestables, $nonNestables) + ); + + # $excerpt is based on the first occurrence of a marker + + while ($excerpt = strpbrk($text, $this->inlineMarkerList)) { + $marker = $excerpt[0]; + + $markerPosition = strlen($text) - strlen($excerpt); + + $Excerpt = array('text' => $excerpt, 'context' => $text); + + foreach ($this->InlineTypes[$marker] as $inlineType) { + # check to see if the current inline type is nestable in the current context + + if (isset($nonNestables[$inlineType])) { + continue; + } + + $Inline = $this->{"inline$inlineType"}($Excerpt); + + if (! isset($Inline)) { + continue; + } + + # makes sure that the inline belongs to "our" marker + + if (isset($Inline['position']) and $Inline['position'] > $markerPosition) { + continue; + } + + # sets a default inline position + + if (! isset($Inline['position'])) { + $Inline['position'] = $markerPosition; + } + + # cause the new element to 'inherit' our non nestables + + + $Inline['element']['nonNestables'] = isset($Inline['element']['nonNestables']) + ? array_merge($Inline['element']['nonNestables'], $nonNestables) + : $nonNestables + ; + + # the text that comes before the inline + $unmarkedText = substr($text, 0, $Inline['position']); + + # compile the unmarked text + $InlineText = $this->inlineText($unmarkedText); + $Elements[] = $InlineText['element']; + + # compile the inline + $Elements[] = $this->extractElement($Inline); + + # remove the examined text + $text = substr($text, $Inline['position'] + $Inline['extent']); + + continue 2; + } + + # the marker does not belong to an inline + + $unmarkedText = substr($text, 0, $markerPosition + 1); + + $InlineText = $this->inlineText($unmarkedText); + $Elements[] = $InlineText['element']; + + $text = substr($text, $markerPosition + 1); + } + + $InlineText = $this->inlineText($text); + $Elements[] = $InlineText['element']; + + foreach ($Elements as &$Element) { + if (! isset($Element['autobreak'])) { + $Element['autobreak'] = false; + } + } + + return $Elements; + } + + # + # ~ + # + + protected function inlineText($text) + { + $Inline = array( + 'extent' => strlen($text), + 'element' => array(), + ); + + $Inline['element']['elements'] = self::pregReplaceElements( + $this->breaksEnabled ? '/[ ]*+\n/' : '/(?:[ ]*+\\\\|[ ]{2,}+)\n/', + array( + array('name' => 'br'), + array('text' => "\n"), + ), + $text + ); + + return $Inline; + } + + protected function inlineCode($Excerpt) + { + $marker = $Excerpt['text'][0]; + + if (preg_match('/^(['.$marker.']++)[ ]*+(.+?)[ ]*+(? strlen($matches[0]), + 'element' => array( + 'name' => 'code', + 'text' => $text, + ), + ); + } + } + + protected function inlineEmailTag($Excerpt) + { + $hostnameLabel = '[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?'; + + $commonMarkEmail = '[a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]++@' + . $hostnameLabel . '(?:\.' . $hostnameLabel . ')*'; + + if (strpos($Excerpt['text'], '>') !== false + and preg_match("/^<((mailto:)?$commonMarkEmail)>/i", $Excerpt['text'], $matches) + ) { + $url = $matches[1]; + + if (! isset($matches[2])) { + $url = "mailto:$url"; + } + + return array( + 'extent' => strlen($matches[0]), + 'element' => array( + 'name' => 'a', + 'text' => $matches[1], + 'attributes' => array( + 'href' => $url, + ), + ), + ); + } + } + + protected function inlineEmphasis($Excerpt) + { + if (! isset($Excerpt['text'][1])) { + return; + } + + $marker = $Excerpt['text'][0]; + + if ($Excerpt['text'][1] === $marker and preg_match($this->StrongRegex[$marker], $Excerpt['text'], $matches)) { + $emphasis = 'strong'; + } elseif (preg_match($this->EmRegex[$marker], $Excerpt['text'], $matches)) { + $emphasis = 'em'; + } else { + return; + } + + return array( + 'extent' => strlen($matches[0]), + 'element' => array( + 'name' => $emphasis, + 'handler' => array( + 'function' => 'lineElements', + 'argument' => $matches[1], + 'destination' => 'elements', + ) + ), + ); + } + + protected function inlineEscapeSequence($Excerpt) + { + if (isset($Excerpt['text'][1]) and in_array($Excerpt['text'][1], $this->specialCharacters)) { + return array( + 'element' => array('rawHtml' => $Excerpt['text'][1]), + 'extent' => 2, + ); + } + } + + protected function inlineImage($Excerpt) + { + if (! isset($Excerpt['text'][1]) or $Excerpt['text'][1] !== '[') { + return; + } + + $Excerpt['text']= substr($Excerpt['text'], 1); + + $Link = $this->inlineLink($Excerpt); + + if ($Link === null) { + return; + } + + $Inline = array( + 'extent' => $Link['extent'] + 1, + 'element' => array( + 'name' => 'img', + 'attributes' => array( + 'src' => $Link['element']['attributes']['href'], + 'alt' => $Link['element']['handler']['argument'], + ), + 'autobreak' => true, + ), + ); + + $Inline['element']['attributes'] += $Link['element']['attributes']; + + unset($Inline['element']['attributes']['href']); + + return $Inline; + } + + protected function inlineLink($Excerpt) + { + $Element = array( + 'name' => 'a', + 'handler' => array( + 'function' => 'lineElements', + 'argument' => null, + 'destination' => 'elements', + ), + 'nonNestables' => array('Url', 'Link'), + 'attributes' => array( + 'href' => null, + 'title' => null, + ), + ); + + $extent = 0; + + $remainder = $Excerpt['text']; + + if (preg_match('/\[((?:[^][]++|(?R))*+)\]/', $remainder, $matches)) { + $Element['handler']['argument'] = $matches[1]; + + $extent += strlen($matches[0]); + + $remainder = substr($remainder, $extent); + } else { + return; + } + + if (preg_match('/^[(]\s*+((?:[^ ()]++|[(][^ )]+[)])++)(?:[ ]+("[^"]*+"|\'[^\']*+\'))?\s*+[)]/', $remainder, $matches)) { + $Element['attributes']['href'] = $matches[1]; + + if (isset($matches[2])) { + $Element['attributes']['title'] = substr($matches[2], 1, - 1); + } + + $extent += strlen($matches[0]); + } else { + if (preg_match('/^\s*\[(.*?)\]/', $remainder, $matches)) { + $definition = strlen($matches[1]) ? $matches[1] : $Element['handler']['argument']; + $definition = strtolower($definition); + + $extent += strlen($matches[0]); + } else { + $definition = strtolower($Element['handler']['argument']); + } + + if (! isset($this->DefinitionData['Reference'][$definition])) { + return; + } + + $Definition = $this->DefinitionData['Reference'][$definition]; + + $Element['attributes']['href'] = $Definition['url']; + $Element['attributes']['title'] = $Definition['title']; + } + + return array( + 'extent' => $extent, + 'element' => $Element, + ); + } + + protected function inlineMarkup($Excerpt) + { + if ($this->markupEscaped or $this->safeMode or strpos($Excerpt['text'], '>') === false) { + return; + } + + if ($Excerpt['text'][1] === '/' and preg_match('/^<\/\w[\w-]*+[ ]*+>/s', $Excerpt['text'], $matches)) { + return array( + 'element' => array('rawHtml' => $matches[0]), + 'extent' => strlen($matches[0]), + ); + } + + if ($Excerpt['text'][1] === '!' and preg_match('/^/s', $Excerpt['text'], $matches)) { + return array( + 'element' => array('rawHtml' => $matches[0]), + 'extent' => strlen($matches[0]), + ); + } + + if ($Excerpt['text'][1] !== ' ' and preg_match('/^<\w[\w-]*+(?:[ ]*+'.$this->regexHtmlAttribute.')*+[ ]*+\/?>/s', $Excerpt['text'], $matches)) { + return array( + 'element' => array('rawHtml' => $matches[0]), + 'extent' => strlen($matches[0]), + ); + } + } + + protected function inlineSpecialCharacter($Excerpt) + { + if ($Excerpt['text'][1] !== ' ' and strpos($Excerpt['text'], ';') !== false + and preg_match('/^&(#?+[0-9a-zA-Z]++);/', $Excerpt['text'], $matches) + ) { + return array( + 'element' => array('rawHtml' => '&' . $matches[1] . ';'), + 'extent' => strlen($matches[0]), + ); + } + + return; + } + + protected function inlineStrikethrough($Excerpt) + { + if (! isset($Excerpt['text'][1])) { + return; + } + + if ($Excerpt['text'][1] === '~' and preg_match('/^~~(?=\S)(.+?)(?<=\S)~~/', $Excerpt['text'], $matches)) { + return array( + 'extent' => strlen($matches[0]), + 'element' => array( + 'name' => 'del', + 'handler' => array( + 'function' => 'lineElements', + 'argument' => $matches[1], + 'destination' => 'elements', + ) + ), + ); + } + } + + protected function inlineUrl($Excerpt) + { + if ($this->urlsLinked !== true or ! isset($Excerpt['text'][2]) or $Excerpt['text'][2] !== '/') { + return; + } + + if (strpos($Excerpt['context'], 'http') !== false + and preg_match('/\bhttps?+:[\/]{2}[^\s<]+\b\/*+/ui', $Excerpt['context'], $matches, PREG_OFFSET_CAPTURE) + ) { + $url = $matches[0][0]; + + $Inline = array( + 'extent' => strlen($matches[0][0]), + 'position' => $matches[0][1], + 'element' => array( + 'name' => 'a', + 'text' => $url, + 'attributes' => array( + 'href' => $url, + ), + ), + ); + + return $Inline; + } + } + + protected function inlineUrlTag($Excerpt) + { + if (strpos($Excerpt['text'], '>') !== false and preg_match('/^<(\w++:\/{2}[^ >]++)>/i', $Excerpt['text'], $matches)) { + $url = $matches[1]; + + return array( + 'extent' => strlen($matches[0]), + 'element' => array( + 'name' => 'a', + 'text' => $url, + 'attributes' => array( + 'href' => $url, + ), + ), + ); + } + } + + # ~ + + protected function unmarkedText($text) + { + $Inline = $this->inlineText($text); + return $this->element($Inline['element']); + } + + # + # Handlers + # + + protected function handle(array $Element) + { + if (isset($Element['handler'])) { + if (!isset($Element['nonNestables'])) { + $Element['nonNestables'] = array(); + } + + if (is_string($Element['handler'])) { + $function = $Element['handler']; + $argument = $Element['text']; + unset($Element['text']); + $destination = 'rawHtml'; + } else { + $function = $Element['handler']['function']; + $argument = $Element['handler']['argument']; + $destination = $Element['handler']['destination']; + } + + $Element[$destination] = $this->{$function}($argument, $Element['nonNestables']); + + if ($destination === 'handler') { + $Element = $this->handle($Element); + } + + unset($Element['handler']); + } + + return $Element; + } + + protected function handleElementRecursive(array $Element) + { + return $this->elementApplyRecursive(array($this, 'handle'), $Element); + } + + protected function handleElementsRecursive(array $Elements) + { + return $this->elementsApplyRecursive(array($this, 'handle'), $Elements); + } + + protected function elementApplyRecursive($closure, array $Element) + { + $Element = call_user_func($closure, $Element); + + if (isset($Element['elements'])) { + $Element['elements'] = $this->elementsApplyRecursive($closure, $Element['elements']); + } elseif (isset($Element['element'])) { + $Element['element'] = $this->elementApplyRecursive($closure, $Element['element']); + } + + return $Element; + } + + protected function elementApplyRecursiveDepthFirst($closure, array $Element) + { + if (isset($Element['elements'])) { + $Element['elements'] = $this->elementsApplyRecursiveDepthFirst($closure, $Element['elements']); + } elseif (isset($Element['element'])) { + $Element['element'] = $this->elementsApplyRecursiveDepthFirst($closure, $Element['element']); + } + + $Element = call_user_func($closure, $Element); + + return $Element; + } + + protected function elementsApplyRecursive($closure, array $Elements) + { + foreach ($Elements as &$Element) { + $Element = $this->elementApplyRecursive($closure, $Element); + } + + return $Elements; + } + + protected function elementsApplyRecursiveDepthFirst($closure, array $Elements) + { + foreach ($Elements as &$Element) { + $Element = $this->elementApplyRecursiveDepthFirst($closure, $Element); + } + + return $Elements; + } + + protected function element(array $Element) + { + if ($this->safeMode) { + $Element = $this->sanitiseElement($Element); + } + + # identity map if element has no handler + $Element = $this->handle($Element); + + $hasName = isset($Element['name']); + + $markup = ''; + + if ($hasName) { + $markup .= '<' . $Element['name']; + + if (isset($Element['attributes'])) { + foreach ($Element['attributes'] as $name => $value) { + if ($value === null) { + continue; + } + + $markup .= " $name=\"".self::escape($value).'"'; + } + } + } + + $permitRawHtml = false; + + if (isset($Element['text'])) { + $text = $Element['text']; + } + // very strongly consider an alternative if you're writing an + // extension + elseif (isset($Element['rawHtml'])) { + $text = $Element['rawHtml']; + + $allowRawHtmlInSafeMode = isset($Element['allowRawHtmlInSafeMode']) && $Element['allowRawHtmlInSafeMode']; + $permitRawHtml = !$this->safeMode || $allowRawHtmlInSafeMode; + } + + $hasContent = isset($text) || isset($Element['element']) || isset($Element['elements']); + + if ($hasContent) { + $markup .= $hasName ? '>' : ''; + + if (isset($Element['elements'])) { + $markup .= $this->elements($Element['elements']); + } elseif (isset($Element['element'])) { + $markup .= $this->element($Element['element']); + } elseif (!$permitRawHtml) { + $markup .= self::escape($text, true); + } else { + $markup .= $text; + } + + $markup .= $hasName ? '' : ''; + } elseif ($hasName) { + $markup .= ' />'; + } + + return $markup; + } + + protected function elements(array $Elements) + { + $markup = ''; + + $autoBreak = true; + + foreach ($Elements as $Element) { + if (empty($Element)) { + continue; + } + + $autoBreakNext = ( + isset($Element['autobreak']) + ? $Element['autobreak'] : isset($Element['name']) + ); + // (autobreak === false) covers both sides of an element + $autoBreak = !$autoBreak ? $autoBreak : $autoBreakNext; + + $markup .= ($autoBreak ? "\n" : '') . $this->element($Element); + $autoBreak = $autoBreakNext; + } + + $markup .= $autoBreak ? "\n" : ''; + + return $markup; + } + + # ~ + + protected function li($lines) + { + $Elements = $this->linesElements($lines); + + if (! in_array('', $lines) + and isset($Elements[0]) and isset($Elements[0]['name']) + and $Elements[0]['name'] === 'p' + ) { + unset($Elements[0]['name']); + } + + return $Elements; + } + + # + # AST Convenience + # + + /** + * Replace occurrences $regexp with $Elements in $text. Return an array of + * elements representing the replacement. + */ + protected static function pregReplaceElements($regexp, $Elements, $text) + { + $newElements = array(); + + while (preg_match($regexp, $text, $matches, PREG_OFFSET_CAPTURE)) { + $offset = $matches[0][1]; + $before = substr($text, 0, $offset); + $after = substr($text, $offset + strlen($matches[0][0])); + + $newElements[] = array('text' => $before); + + foreach ($Elements as $Element) { + $newElements[] = $Element; + } + + $text = $after; + } + + $newElements[] = array('text' => $text); + + return $newElements; + } + + # + # Deprecated Methods + # + + public function parse($text) + { + $markup = $this->text($text); + + return $markup; + } + + protected function sanitiseElement(array $Element) + { + static $goodAttribute = '/^[a-zA-Z0-9][a-zA-Z0-9-_]*+$/'; + static $safeUrlNameToAtt = array( + 'a' => 'href', + 'img' => 'src', + ); + + if (! isset($Element['name'])) { + unset($Element['attributes']); + return $Element; + } + + if (isset($safeUrlNameToAtt[$Element['name']])) { + $Element = $this->filterUnsafeUrlInAttribute($Element, $safeUrlNameToAtt[$Element['name']]); + } + + if (! empty($Element['attributes'])) { + foreach ($Element['attributes'] as $att => $val) { + # filter out badly parsed attribute + if (! preg_match($goodAttribute, $att)) { + unset($Element['attributes'][$att]); + } + # dump onevent attribute + elseif (self::striAtStart($att, 'on')) { + unset($Element['attributes'][$att]); + } + } + } + + return $Element; + } + + protected function filterUnsafeUrlInAttribute(array $Element, $attribute) + { + foreach ($this->safeLinksWhitelist as $scheme) { + if (self::striAtStart($Element['attributes'][$attribute], $scheme)) { + return $Element; + } + } + + $Element['attributes'][$attribute] = str_replace(':', '%3A', $Element['attributes'][$attribute]); + + return $Element; + } + + # + # Static Methods + # + + protected static function escape($text, $allowQuotes = false) + { + return htmlspecialchars($text, $allowQuotes ? ENT_NOQUOTES : ENT_QUOTES, 'UTF-8'); + } + + protected static function striAtStart($string, $needle) + { + $len = strlen($needle); + + if ($len > strlen($string)) { + return false; + } else { + return strtolower(substr($string, 0, $len)) === strtolower($needle); + } + } + + public static function instance($name = 'default') + { + if (isset(self::$instances[$name])) { + return self::$instances[$name]; + } + + $instance = new static(); + + self::$instances[$name] = $instance; + + return $instance; + } + + private static $instances = array(); + + # + # Fields + # + + protected $DefinitionData; + + # + # Read-Only + + protected $specialCharacters = array( + '\\', '`', '*', '_', '{', '}', '[', ']', '(', ')', '>', '#', '+', '-', '.', '!', '|', '~' + ); + + protected $StrongRegex = array( + '*' => '/^[*]{2}((?:\\\\\*|[^*]|[*][^*]*+[*])+?)[*]{2}(?![*])/s', + '_' => '/^__((?:\\\\_|[^_]|_[^_]*+_)+?)__(?!_)/us', + ); + + protected $EmRegex = array( + '*' => '/^[*]((?:\\\\\*|[^*]|[*][*][^*]+?[*][*])+?)[*](?![*])/s', + '_' => '/^_((?:\\\\_|[^_]|__[^_]*__)+?)_(?!_)\b/us', + ); + + protected $regexHtmlAttribute = '[a-zA-Z_:][\w:.-]*+(?:\s*+=\s*+(?:[^"\'=<>`\s]+|"[^"]*+"|\'[^\']*+\'))?+'; + + protected $voidElements = array( + 'area', 'base', 'br', 'col', 'command', 'embed', 'hr', 'img', 'input', 'link', 'meta', 'param', 'source', + ); + + protected $textLevelElements = array( + 'a', 'br', 'bdo', 'abbr', 'blink', 'nextid', 'acronym', 'basefont', + 'b', 'em', 'big', 'cite', 'small', 'spacer', 'listing', + 'i', 'rp', 'del', 'code', 'strike', 'marquee', + 'q', 'rt', 'ins', 'font', 'strong', + 's', 'tt', 'kbd', 'mark', + 'u', 'xm', 'sub', 'nobr', + 'sup', 'ruby', + 'var', 'span', + 'wbr', 'time', + ); +} diff --git a/kirby/dependencies/spyc/COPYING b/kirby/dependencies/spyc/COPYING new file mode 100644 index 0000000..8e7ddbc --- /dev/null +++ b/kirby/dependencies/spyc/COPYING @@ -0,0 +1,21 @@ +The MIT License + +Copyright (c) 2011 Vladimir Andersen + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. \ No newline at end of file diff --git a/kirby/dependencies/spyc/Spyc.php b/kirby/dependencies/spyc/Spyc.php new file mode 100644 index 0000000..06a2270 --- /dev/null +++ b/kirby/dependencies/spyc/Spyc.php @@ -0,0 +1,1196 @@ + + * @author Chris Wanstrath + * @link https://github.com/mustangostang/spyc/ + * @copyright Copyright 2005-2006 Chris Wanstrath, 2006-2011 Vlad Andersen + * @license http://www.opensource.org/licenses/mit-license.php MIT License + * @package Spyc + */ +class Spyc +{ + // SETTINGS + + public const REMPTY = "\0\0\0\0\0"; + + /** + * Setting this to true will force YAMLDump to enclose any string value in + * quotes. False by default. + * + * @var bool + */ + public $setting_dump_force_quotes = false; + + /** + * Setting this to true will forse YAMLLoad to use syck_load function when + * possible. False by default. + * @var bool + */ + public $setting_use_syck_is_possible = false; + + /** + * Setting this to true will forse YAMLLoad to use syck_load function when + * possible. False by default. + * @var bool + */ + public $setting_empty_hash_as_object = false; + + /**#@+ + * @access private + * @var mixed + */ + private $_dumpIndent; + private $_dumpWordWrap; + private $_containsGroupAnchor = false; + private $_containsGroupAlias = false; + private $path; + private $result; + private $LiteralPlaceHolder = '___YAML_Literal_Block___'; + private $SavedGroups = array(); + private $indent; + /** + * Path modifier that should be applied after adding current element. + * @var array + */ + private $delayedPath = array(); + + /**#@+ + * @access public + * @var mixed + */ + public $_nodeId; + + /** + * Load a valid YAML string to Spyc. + * @param string $input + * @return array + */ + public function load($input) + { + return $this->_loadString($input); + } + + /** + * Load a valid YAML file to Spyc. + * @param string $file + * @return array + */ + public function loadFile($file) + { + return $this->_load($file); + } + + /** + * Load YAML into a PHP array statically + * + * The load method, when supplied with a YAML stream (string or file), + * will do its best to convert YAML in a file into a PHP array. Pretty + * simple. + * Usage: + * + * $array = Spyc::YAMLLoad('lucky.yaml'); + * print_r($array); + * + * @access public + * @param string $input Path of YAML file or string containing YAML + * @param array set options + * @return array + */ + public static function YAMLLoad($input, $options = []) + { + $Spyc = new Spyc(); + foreach ($options as $key => $value) { + if (property_exists($Spyc, $key)) { + $Spyc->$key = $value; + } + } + return $Spyc->_load($input); + } + + /** + * Load a string of YAML into a PHP array statically + * + * The load method, when supplied with a YAML string, will do its best + * to convert YAML in a string into a PHP array. Pretty simple. + * + * Note: use this function if you don't want files from the file system + * loaded and processed as YAML. This is of interest to people concerned + * about security whose input is from a string. + * + * Usage: + * + * $array = Spyc::YAMLLoadString("---\n0: hello world\n"); + * print_r($array); + * + * @access public + * @param string $input String containing YAML + * @param array set options + * @return array + */ + public static function YAMLLoadString($input, $options = []) + { + $Spyc = new Spyc(); + foreach ($options as $key => $value) { + if (property_exists($Spyc, $key)) { + $Spyc->$key = $value; + } + } + return $Spyc->_loadString($input); + } + + /** + * Dump YAML from PHP array statically + * + * The dump method, when supplied with an array, will do its best + * to convert the array into friendly YAML. Pretty simple. Feel free to + * save the returned string as nothing.yaml and pass it around. + * + * Oh, and you can decide how big the indent is and what the wordwrap + * for folding is. Pretty cool -- just pass in 'false' for either if + * you want to use the default. + * + * Indent's default is 2 spaces, wordwrap's default is 40 characters. And + * you can turn off wordwrap by passing in 0. + * + * @access public + * @param array|\stdClass $array PHP array + * @param int $indent Pass in false to use the default, which is 2 + * @param int $wordwrap Pass in 0 for no wordwrap, false for default (40) + * @param bool $no_opening_dashes Do not start YAML file with "---\n" + * @return string + */ + public static function YAMLDump($array, $indent = false, $wordwrap = false, $no_opening_dashes = false) + { + $spyc = new Spyc(); + return $spyc->dump($array, $indent, $wordwrap, $no_opening_dashes); + } + + /** + * Dump PHP array to YAML + * + * The dump method, when supplied with an array, will do its best + * to convert the array into friendly YAML. Pretty simple. Feel free to + * save the returned string as tasteful.yaml and pass it around. + * + * Oh, and you can decide how big the indent is and what the wordwrap + * for folding is. Pretty cool -- just pass in 'false' for either if + * you want to use the default. + * + * Indent's default is 2 spaces, wordwrap's default is 40 characters. And + * you can turn off wordwrap by passing in 0. + * + * @access public + * @param array $array PHP array + * @param int $indent Pass in false to use the default, which is 2 + * @param int $wordwrap Pass in 0 for no wordwrap, false for default (40) + * @return string + */ + public function dump($array, $indent = false, $wordwrap = false, $no_opening_dashes = false) + { + // Dumps to some very clean YAML. We'll have to add some more features + // and options soon. And better support for folding. + + // New features and options. + if ($indent === false or !is_numeric($indent)) { + $this->_dumpIndent = 2; + } else { + $this->_dumpIndent = $indent; + } + + if ($wordwrap === false or !is_numeric($wordwrap)) { + $this->_dumpWordWrap = 40; + } else { + $this->_dumpWordWrap = $wordwrap; + } + + // New YAML document + $string = ""; + if (!$no_opening_dashes) $string = "---\n"; + + // Start at the base of the array and move through it. + if ($array) { + $array = (array)$array; + $previous_key = -1; + foreach ($array as $key => $value) { + if (!isset($first_key)) $first_key = $key; + $string .= $this->_yamlize($key, $value, 0, $previous_key, $first_key, $array); + $previous_key = $key; + } + } + return $string; + } + + /** + * Attempts to convert a key / value array item to YAML + * @access private + * @param $key The name of the key + * @param $value The value of the item + * @param $indent The indent of the current node + * @return string + */ + private function _yamlize($key, $value, $indent, $previous_key = -1, $first_key = 0, $source_array = null) + { + if (is_object($value)) $value = (array)$value; + if (is_array($value)) { + if (empty ($value)) + return $this->_dumpNode($key, array(), $indent, $previous_key, $first_key, $source_array); + // It has children. What to do? + // Make it the right kind of item + $string = $this->_dumpNode($key, self::REMPTY, $indent, $previous_key, $first_key, $source_array); + // Add the indent + $indent += $this->_dumpIndent; + // Yamlize the array + $string .= $this->_yamlizeArray($value, $indent); + } elseif (!is_array($value)) { + // It doesn't have children. Yip. + $string = $this->_dumpNode($key, $value, $indent, $previous_key, $first_key, $source_array); + } + return $string; + } + + /** + * Attempts to convert an array to YAML + * @access private + * @param $array The array you want to convert + * @param $indent The indent of the current level + * @return string + */ + private function _yamlizeArray($array, $indent) + { + if (is_array($array)) { + $string = ''; + $previous_key = -1; + foreach ($array as $key => $value) { + if (!isset($first_key)) $first_key = $key; + $string .= $this->_yamlize($key, $value, $indent, $previous_key, $first_key, $array); + $previous_key = $key; + } + return $string; + } else { + return false; + } + } + + /** + * Returns YAML from a key and a value + * @access private + * @param $key The name of the key + * @param $value The value of the item + * @param $indent The indent of the current node + * @return string + */ + private function _dumpNode($key, $value, $indent, $previous_key = -1, $first_key = 0, $source_array = null) + { + // do some folding here, for blocks + if ( + is_string($value) && + ( + strpos($value, "\n") !== false || + strpos($value, ": ") !== false || + strpos($value, "- ") !== false || + strpos($value, "*") !== false || + strpos($value, "#") !== false || + strpos($value, "<") !== false || + strpos($value, ">") !== false || + strpos($value, '%') !== false || + strpos($value, ' ') !== false || + strpos($value, "[") !== false || + strpos($value, "]") !== false || + strpos($value, "{") !== false || + strpos($value, "}") !== false || + strpos($value, "&") !== false || + strpos($value, "'") !== false || + strpos($value, "!") === 0 || + substr($value, -1, 1) == ':' + ) + ) { + $value = $this->_doLiteralBlock($value, $indent); + } else { + $value = $this->_doFolding($value, $indent); + } + + if ($value === array()) $value = '[ ]'; + if ($value === "") $value = '""'; + if (self::isTranslationWord($value)) { + $value = $this->_doLiteralBlock($value, $indent); + } + if (trim($value ?? '') != $value) + $value = $this->_doLiteralBlock($value, $indent); + + if (is_bool($value)) { + $value = $value ? "true" : "false"; + } + + if ($value === null) $value = 'null'; + if ($value === "'" . self::REMPTY . "'") $value = null; + + $spaces = str_repeat(' ', $indent); + + //if (is_int($key) && $key - 1 == $previous_key && $first_key===0) { + if (is_array($source_array) && array_keys($source_array) === range(0, count($source_array) - 1)) { + // It's a sequence + $string = $spaces . '- ' . $value . "\n"; + } else { + // if ($first_key===0) throw new Exception('Keys are all screwy. The first one was zero, now it\'s "'. $key .'"'); + // It's mapped + if (strpos($key, ":") !== false || strpos($key, "#") !== false) { + $key = '"' . $key . '"'; + } + $string = rtrim($spaces . $key . ': ' . $value) . "\n"; + } + return $string; + } + + /** + * Creates a literal block for dumping + * @access private + * @param $value + * @param $indent int The value of the indent + * @return string + */ + private function _doLiteralBlock($value, $indent) + { + $value ??= ''; + + if ($value === "\n") return '\n'; + if (strpos($value, "\n") === false && strpos($value, "'") === false) { + return sprintf("'%s'", $value); + } + if (strpos($value, "\n") === false && strpos($value, '"') === false) { + return sprintf('"%s"', $value); + } + $exploded = explode("\n", $value); + $newValue = '|'; + if (isset($exploded[0]) && ($exploded[0] == "|" || $exploded[0] == "|-" || $exploded[0] == ">")) { + $newValue = $exploded[0]; + unset($exploded[0]); + } + $indent += $this->_dumpIndent; + $spaces = str_repeat(' ', $indent); + foreach ($exploded as $line) { + $line = trim($line); + if (strpos($line, '"') === 0 && strrpos($line, '"') == (strlen($line) - 1) || strpos($line, "'") === 0 && strrpos($line, "'") == (strlen($line) - 1)) { + $line = substr($line, 1, -1); + } + $newValue .= "\n" . $spaces . ($line); + } + return $newValue; + } + + /** + * Folds a string of text, if necessary + * @access private + * @param $value The string you wish to fold + * @return string + */ + private function _doFolding($value, $indent) + { + // Don't do anything if wordwrap is set to 0 + if ($this->_dumpWordWrap !== 0 && is_string($value) && strlen($value) > $this->_dumpWordWrap) { + $indent += $this->_dumpIndent; + $indent = str_repeat(' ', $indent); + $wrapped = wordwrap($value, $this->_dumpWordWrap, "\n$indent"); + $value = ">\n" . $indent . $wrapped; + } else { + if ($this->setting_dump_force_quotes && is_string($value) && $value !== self::REMPTY) + $value = '"' . $value . '"'; + if (is_numeric($value) && is_string($value)) + $value = '"' . $value . '"'; + } + + + return $value; + } + + private function isTrueWord($value) + { + $words = self::getTranslations(array('true', 'on', 'yes', 'y')); + return in_array($value, $words, true); + } + + private function isFalseWord($value) + { + $words = self::getTranslations(array('false', 'off', 'no', 'n')); + return in_array($value, $words, true); + } + + private function isNullWord($value) + { + $words = self::getTranslations(array('null', '~')); + return in_array($value, $words, true); + } + + private function isTranslationWord($value) + { + return ( + self::isTrueWord($value) || + self::isFalseWord($value) || + self::isNullWord($value) + ); + } + + /** + * Coerce a string into a native type + * Reference: http://yaml.org/type/bool.html + * TODO: Use only words from the YAML spec. + * @access private + * @param $value The value to coerce + */ + private function coerceValue(&$value) + { + if (self::isTrueWord($value)) { + $value = true; + } elseif (self::isFalseWord($value)) { + $value = false; + } elseif (self::isNullWord($value)) { + $value = null; + } + } + + /** + * Given a set of words, perform the appropriate translations on them to + * match the YAML 1.1 specification for type coercing. + * @param $words The words to translate + * @access private + */ + private static function getTranslations(array $words) + { + $result = array(); + foreach ($words as $i) { + $result = array_merge($result, array(ucfirst($i), strtoupper($i), strtolower($i))); + } + return $result; + } + + // LOADING FUNCTIONS + + private function _load($input) + { + $Source = $this->loadFromSource($input); + return $this->loadWithSource($Source); + } + + private function _loadString($input) + { + $Source = $this->loadFromString($input); + return $this->loadWithSource($Source); + } + + private function loadWithSource($Source) + { + if (empty ($Source)) return array(); + if ($this->setting_use_syck_is_possible && function_exists('syck_load')) { + $array = syck_load(implode("\n", $Source)); + return is_array($array) ? $array : array(); + } + + $this->path = array(); + $this->result = array(); + + $cnt = count($Source); + for ($i = 0; $i < $cnt; $i++) { + $line = $Source[$i]; + + $this->indent = strlen($line) - strlen(ltrim($line)); + $tempPath = $this->getParentPathByIndent($this->indent); + $line = self::stripIndent($line, $this->indent); + if (self::isComment($line)) continue; + if (self::isEmpty($line)) continue; + $this->path = $tempPath; + + $literalBlockStyle = self::startsLiteralBlock($line); + if ($literalBlockStyle) { + $line = rtrim($line, $literalBlockStyle . " \n"); + $literalBlock = ''; + $line .= ' ' . $this->LiteralPlaceHolder; + $literal_block_indent = strlen($Source[$i + 1]) - strlen(ltrim($Source[$i + 1])); + while (++$i < $cnt && $this->literalBlockContinues($Source[$i], $this->indent)) { + $literalBlock = $this->addLiteralLine($literalBlock, $Source[$i], $literalBlockStyle, $literal_block_indent); + } + $i--; + } + + // Strip out comments + if (strpos($line, '#')) { + $line = preg_replace('/\s*#([^"\']+)$/', '', $line); + } + + while (++$i < $cnt && self::greedilyNeedNextLine($line)) { + $line = rtrim($line, " \n\t\r") . ' ' . ltrim($Source[$i], " \t"); + } + $i--; + + $lineArray = $this->_parseLine($line); + + if ($literalBlockStyle) + $lineArray = $this->revertLiteralPlaceHolder($lineArray, $literalBlock); + + $this->addArray($lineArray, $this->indent); + + foreach ($this->delayedPath as $indent => $delayedPath) + $this->path[$indent] = $delayedPath; + + $this->delayedPath = array(); + + } + return $this->result; + } + + private function loadFromSource($input) + { + if (!empty($input) && strpos($input, "\n") === false && file_exists($input)) + $input = file_get_contents($input); + + return $this->loadFromString($input); + } + + private function loadFromString($input) + { + $lines = explode("\n", $input); + foreach ($lines as $k => $_) { + $lines[$k] = rtrim($_, "\r"); + } + return $lines; + } + + /** + * Parses YAML code and returns an array for a node + * @access private + * @param string $line A line from the YAML file + * @return array + */ + private function _parseLine($line) + { + if (!$line) return array(); + $line = trim($line); + if (!$line) return array(); + + $group = $this->nodeContainsGroup($line); + if ($group) { + $this->addGroup($line, $group); + $line = $this->stripGroup($line, $group); + } + + if ($this->startsMappedSequence($line)) { + return $this->returnMappedSequence($line); + } + + if ($this->startsMappedValue($line)) { + return $this->returnMappedValue($line); + } + + if ($this->isArrayElement($line)) + return $this->returnArrayElement($line); + + if ($this->isPlainArray($line)) + return $this->returnPlainArray($line); + + return $this->returnKeyValuePair($line); + } + + /** + * Finds the type of the passed value, returns the value as the new type. + * @access private + * @param string $value + * @return mixed + */ + private function _toType($value) + { + if ($value === '') return ""; + + if ($this->setting_empty_hash_as_object && $value === '{}') { + return new stdClass(); + } + + $first_character = $value[0]; + $last_character = substr($value, -1, 1); + + $is_quoted = false; + do { + if (!$value) break; + if ($first_character != '"' && $first_character != "'") break; + if ($last_character != '"' && $last_character != "'") break; + $is_quoted = true; + } while (0); + + if ($is_quoted) { + $value = str_replace('\n', "\n", $value); + if ($first_character == "'") + return strtr(substr($value, 1, -1), array('\'\'' => '\'', '\\\'' => '\'')); + return strtr(substr($value, 1, -1), array('\\"' => '"', '\\\'' => '\'')); + } + + if (strpos($value, ' #') !== false && !$is_quoted) + $value = preg_replace('/\s+#(.+)$/', '', $value); + + if ($first_character == '[' && $last_character == ']') { + // Take out strings sequences and mappings + $innerValue = trim(substr($value, 1, -1)); + if ($innerValue === '') return array(); + $explode = $this->_inlineEscape($innerValue); + // Propagate value array + $value = array(); + foreach ($explode as $v) { + $value[] = $this->_toType($v); + } + return $value; + } + + if (strpos($value, ': ') !== false && $first_character != '{') { + $array = explode(': ', $value); + $key = trim($array[0]); + array_shift($array); + $value = trim(implode(': ', $array)); + $value = $this->_toType($value); + return array($key => $value); + } + + if ($first_character == '{' && $last_character == '}') { + $innerValue = trim(substr($value, 1, -1)); + if ($innerValue === '') return array(); + // Inline Mapping + // Take out strings sequences and mappings + $explode = $this->_inlineEscape($innerValue); + // Propagate value array + $array = array(); + foreach ($explode as $v) { + $SubArr = $this->_toType($v); + if (empty($SubArr)) continue; + if (is_array($SubArr)) { + $array[key($SubArr)] = $SubArr[key($SubArr)]; + continue; + } + $array[] = $SubArr; + } + return $array; + } + + if ($value == 'null' || $value == 'NULL' || $value == 'Null' || $value == '' || $value == '~') { + return null; + } + + if (is_numeric($value) && preg_match('/^(-|)[1-9]+[0-9]*$/', $value)) { + $intvalue = (int)$value; + if ($intvalue != PHP_INT_MAX && $intvalue != ~PHP_INT_MAX) + $value = $intvalue; + return $value; + } + + if (is_string($value) && preg_match('/^0[xX][0-9a-fA-F]+$/', $value)) { + // Hexadecimal value. + return hexdec($value); + } + + $this->coerceValue($value); + + if (is_numeric($value)) { + if ($value === '0') return 0; + if (rtrim($value, 0) === $value) + $value = (float)$value; + return $value; + } + + return $value; + } + + /** + * Used in inlines to check for more inlines or quoted strings + * @access private + * @return array + */ + private function _inlineEscape($inline) + { + // There's gotta be a cleaner way to do this... + // While pure sequences seem to be nesting just fine, + // pure mappings and mappings with sequences inside can't go very + // deep. This needs to be fixed. + + $seqs = array(); + $maps = array(); + $saved_strings = array(); + $saved_empties = array(); + + // Check for empty strings + $regex = '/("")|(\'\')/'; + if (preg_match_all($regex, $inline, $strings)) { + $saved_empties = $strings[0]; + $inline = preg_replace($regex, 'YAMLEmpty', $inline); + } + unset($regex); + + // Check for strings + $regex = '/(?:(")|(?:\'))((?(1)[^"]+|[^\']+))(?(1)"|\')/'; + if (preg_match_all($regex, $inline, $strings)) { + $saved_strings = $strings[0]; + $inline = preg_replace($regex, 'YAMLString', $inline); + } + unset($regex); + + $i = 0; + do { + + // Check for sequences + while (preg_match('/\[([^{}\[\]]+)\]/U', $inline, $matchseqs)) { + $seqs[] = $matchseqs[0]; + $inline = preg_replace('/\[([^{}\[\]]+)\]/U', ('YAMLSeq' . (count($seqs) - 1) . 's'), $inline, 1); + } + + // Check for mappings + while (preg_match('/{([^\[\]{}]+)}/U', $inline, $matchmaps)) { + $maps[] = $matchmaps[0]; + $inline = preg_replace('/{([^\[\]{}]+)}/U', ('YAMLMap' . (count($maps) - 1) . 's'), $inline, 1); + } + + if ($i++ >= 10) break; + + } while (strpos($inline, '[') !== false || strpos($inline, '{') !== false); + + $explode = explode(',', $inline); + $explode = array_map('trim', $explode); + $stringi = 0; + $i = 0; + + while (1) { + + // Re-add the sequences + if (!empty($seqs)) { + foreach ($explode as $key => $value) { + if (strpos($value, 'YAMLSeq') !== false) { + foreach ($seqs as $seqk => $seq) { + $explode[$key] = str_replace(('YAMLSeq' . $seqk . 's'), $seq, $value); + $value = $explode[$key]; + } + } + } + } + + // Re-add the mappings + if (!empty($maps)) { + foreach ($explode as $key => $value) { + if (strpos($value, 'YAMLMap') !== false) { + foreach ($maps as $mapk => $map) { + $explode[$key] = str_replace(('YAMLMap' . $mapk . 's'), $map, $value); + $value = $explode[$key]; + } + } + } + } + + // Re-add the strings + if (!empty($saved_strings)) { + foreach ($explode as $key => $value) { + while (strpos($value, 'YAMLString') !== false) { + $explode[$key] = preg_replace('/YAMLString/', $saved_strings[$stringi], $value, 1); + unset($saved_strings[$stringi]); + ++$stringi; + $value = $explode[$key]; + } + } + } + + + // Re-add the empties + if (!empty($saved_empties)) { + foreach ($explode as $key => $value) { + while (strpos($value, 'YAMLEmpty') !== false) { + $explode[$key] = preg_replace('/YAMLEmpty/', '', $value, 1); + $value = $explode[$key]; + } + } + } + + $finished = true; + foreach ($explode as $key => $value) { + if (strpos($value, 'YAMLSeq') !== false) { + $finished = false; + break; + } + if (strpos($value, 'YAMLMap') !== false) { + $finished = false; + break; + } + if (strpos($value, 'YAMLString') !== false) { + $finished = false; + break; + } + if (strpos($value, 'YAMLEmpty') !== false) { + $finished = false; + break; + } + } + if ($finished) break; + + $i++; + if ($i > 10) + break; // Prevent infinite loops. + } + + return $explode; + } + + private function literalBlockContinues($line, $lineIndent) + { + if (!trim($line ?? '')) return true; + if (strlen($line) - strlen(ltrim($line)) > $lineIndent) return true; + return false; + } + + private function referenceContentsByAlias($alias) + { + do { + if (!isset($this->SavedGroups[$alias])) { + echo "Bad group name: $alias."; + break; + } + $groupPath = $this->SavedGroups[$alias]; + $value = $this->result; + foreach ($groupPath as $k) { + $value = $value[$k]; + } + } while (false); + return $value; + } + + private function addArrayInline($array, $indent) + { + $CommonGroupPath = $this->path; + if (empty ($array)) return false; + + foreach ($array as $k => $_) { + $this->addArray(array($k => $_), $indent); + $this->path = $CommonGroupPath; + } + return true; + } + + private function addArray($incoming_data, $incoming_indent) + { + if (count($incoming_data) > 1) + return $this->addArrayInline($incoming_data, $incoming_indent); + + $key = key($incoming_data); + $value = isset($incoming_data[$key]) ? $incoming_data[$key] : null; + if ($key === '__!YAMLZero') $key = '0'; + + if ($incoming_indent == 0 && !$this->_containsGroupAlias && !$this->_containsGroupAnchor) { // Shortcut for root-level values. + if ($key || $key === '' || $key === '0') { + $this->result[$key] = $value; + } else { + $this->result[] = $value; + end($this->result); + $key = key($this->result); + } + $this->path[$incoming_indent] = $key; + return; + } + + $history = array(); + // Unfolding inner array tree. + $history[] = $_arr = $this->result; + foreach ($this->path as $k) { + $history[] = $_arr = $_arr[$k]; + } + + if ($this->_containsGroupAlias) { + $value = $this->referenceContentsByAlias($this->_containsGroupAlias); + $this->_containsGroupAlias = false; + } + + + // Adding string or numeric key to the innermost level or $this->arr. + if (is_string($key) && $key == '<<') { + if (!is_array($_arr)) { + $_arr = array(); + } + + $_arr = array_merge($_arr, $value); + } elseif ($key || $key === '' || $key === '0') { + if (!is_array($_arr)) + $_arr = array($key => $value); + else + $_arr[$key] = $value; + } elseif (!is_array($_arr)) { + $_arr = array($value); + $key = 0; + } else { + $_arr[] = $value; + end($_arr); + $key = key($_arr); + } + + $reverse_path = array_reverse($this->path); + $reverse_history = array_reverse($history); + $reverse_history[0] = $_arr; + $cnt = count($reverse_history) - 1; + for ($i = 0; $i < $cnt; $i++) { + $reverse_history[$i + 1][$reverse_path[$i]] = $reverse_history[$i]; + } + $this->result = $reverse_history[$cnt]; + + $this->path[$incoming_indent] = $key; + + if ($this->_containsGroupAnchor) { + $this->SavedGroups[$this->_containsGroupAnchor] = $this->path; + if (is_array($value)) { + $k = key($value); + if (!is_int($k)) { + $this->SavedGroups[$this->_containsGroupAnchor][$incoming_indent + 2] = $k; + } + } + $this->_containsGroupAnchor = false; + } + + } + + private static function startsLiteralBlock($line) + { + $lastChar = substr(trim($line ?? ''), -1); + if ($lastChar != '>' && $lastChar != '|') return false; + if ($lastChar == '|') return $lastChar; + // HTML tags should not be counted as literal blocks. + if (preg_match('#<.*?>$#', $line)) return false; + return $lastChar; + } + + private static function greedilyNeedNextLine($line) + { + $line = trim($line ?? ''); + if (!strlen($line)) return false; + if (substr($line, -1, 1) == ']') return false; + if ($line[0] == '[') return true; + if (preg_match('#^[^:]+?:\s*\[#', $line)) return true; + return false; + } + + private function addLiteralLine($literalBlock, $line, $literalBlockStyle, $indent = -1) + { + $line = self::stripIndent($line, $indent); + if ($literalBlockStyle !== '|') { + $line = self::stripIndent($line); + } + $line = rtrim($line, "\r\n\t ") . "\n"; + if ($literalBlockStyle == '|') { + return $literalBlock . $line; + } + if (strlen($line) == 0) + return rtrim($literalBlock, ' ') . "\n"; + if ($line == "\n" && $literalBlockStyle == '>') { + return rtrim($literalBlock, " \t") . "\n"; + } + if ($line != "\n") + $line = trim($line, "\r\n ") . " "; + return $literalBlock . $line; + } + + public function revertLiteralPlaceHolder($lineArray, $literalBlock) + { + foreach ($lineArray as $k => $_) { + if (is_array($_)) + $lineArray[$k] = $this->revertLiteralPlaceHolder($_, $literalBlock); + elseif (substr($_, -1 * strlen($this->LiteralPlaceHolder)) == $this->LiteralPlaceHolder) + $lineArray[$k] = rtrim($literalBlock, " \r\n"); + } + return $lineArray; + } + + private static function stripIndent($line, $indent = -1) + { + $line ??= ''; + + if ($indent == -1) $indent = strlen($line) - strlen(ltrim($line)); + return substr($line, $indent); + } + + private function getParentPathByIndent($indent) + { + if ($indent == 0) return array(); + $linePath = $this->path; + do { + end($linePath); + $lastIndentInParentPath = key($linePath); + if ($indent <= $lastIndentInParentPath) array_pop($linePath); + } while ($indent <= $lastIndentInParentPath); + return $linePath; + } + + private function clearBiggerPathValues($indent) + { + if ($indent == 0) $this->path = array(); + if (empty ($this->path)) return true; + + foreach ($this->path as $k => $_) { + if ($k > $indent) unset ($this->path[$k]); + } + + return true; + } + + private static function isComment($line) + { + if (!$line) return false; + if ($line[0] == '#') return true; + if (trim($line, " \r\n\t") == '---') return true; + return false; + } + + private static function isEmpty($line) + { + return (trim($line ?? '') === ''); + } + + private function isArrayElement($line) + { + if (!$line || !is_scalar($line)) return false; + if (substr($line, 0, 2) != '- ') return false; + if (strlen($line) > 3) + if (substr($line, 0, 3) == '---') return false; + + return true; + } + + private function isHashElement($line) + { + return strpos($line, ':'); + } + + private function isLiteral($line) + { + if ($this->isArrayElement($line)) return false; + if ($this->isHashElement($line)) return false; + return true; + } + + + private static function unquote($value) + { + if (!$value) return $value; + if (!is_string($value)) return $value; + if ($value[0] == '\'') return trim($value, '\''); + if ($value[0] == '"') return trim($value, '"'); + return $value; + } + + private function startsMappedSequence($line) + { + return (substr($line ?? '', 0, 2) == '- ' && substr($line ?? '', -1, 1) == ':'); + } + + private function returnMappedSequence($line) + { + $array = array(); + $key = self::unquote(trim(substr($line ?? '', 1, -1))); + $array[$key] = array(); + $this->delayedPath = array(strpos($line ?? '', $key) + $this->indent => $key); + return array($array); + } + + private function checkKeysInValue($value) + { + if (strchr('[{"\'', $value[0] ?? '') === false) { + if (strchr($value ?? '', ': ') !== false) { + throw new Exception('Too many keys: ' . $value); + } + } + } + + private function returnMappedValue($line) + { + $this->checkKeysInValue($line); + $array = array(); + $key = self::unquote(trim(substr($line ?? '', 0, -1))); + $array[$key] = ''; + return $array; + } + + private function startsMappedValue($line) + { + return (substr($line, -1, 1) == ':'); + } + + private function isPlainArray($line) + { + return ($line[0] == '[' && substr($line, -1, 1) == ']'); + } + + private function returnPlainArray($line) + { + return $this->_toType($line); + } + + private function returnKeyValuePair($line) + { + $array = array(); + $key = ''; + if (strpos($line ?? '', ': ')) { + // It's a key/value pair most likely + // If the key is in double quotes pull it out + if (($line[0] == '"' || $line[0] == "'") && preg_match('/^(["\'](.*)["\'](\s)*:)/', $line, $matches)) { + $value = trim(str_replace($matches[1], '', $line)); + $key = $matches[2]; + } else { + // Do some guesswork as to the key and the value + $explode = explode(': ', $line); + $key = trim(array_shift($explode)); + $value = trim(implode(': ', $explode)); + $this->checkKeysInValue($value); + } + // Set the type of the value. Int, string, etc + $value = $this->_toType($value); + + if ($key === '0') $key = '__!YAMLZero'; + $array[$key] = $value; + } else { + $array = array($line); + } + return $array; + + } + + + private function returnArrayElement($line) + { + if (strlen($line ?? '') <= 1) return array(array()); // Weird %) + $array = array(); + $value = trim(substr($line, 1)); + $value = $this->_toType($value); + if ($this->isArrayElement($value)) { + $value = $this->returnArrayElement($value); + } + $array[] = $value; + return $array; + } + + + private function nodeContainsGroup($line) + { + $symbolsForReference = 'A-z0-9_\-'; + if (strpos($line, '&') === false && strpos($line, '*') === false) return false; // Please die fast ;-) + if ($line[0] == '&' && preg_match('/^(&[' . $symbolsForReference . ']+)/', $line, $matches)) return $matches[1]; + if ($line[0] == '*' && preg_match('/^(\*[' . $symbolsForReference . ']+)/', $line, $matches)) return $matches[1]; + if (preg_match('/(&[' . $symbolsForReference . ']+)$/', $line, $matches)) return $matches[1]; + if (preg_match('/(\*[' . $symbolsForReference . ']+$)/', $line, $matches)) return $matches[1]; + if (preg_match('#^\s*<<\s*:\s*(\*[^\s]+).*$#', $line, $matches)) return $matches[1]; + return false; + + } + + private function addGroup($line, $group) + { + if ($group[0] == '&') $this->_containsGroupAnchor = substr($group ?? '', 1); + if ($group[0] == '*') $this->_containsGroupAlias = substr($group ?? '', 1); + } + + private function stripGroup($line, $group) + { + $line = trim(str_replace($group ?? '', '', $line)); + return $line; + } +} diff --git a/kirby/i18n/rules/LICENSE b/kirby/i18n/rules/LICENSE new file mode 100644 index 0000000..36c3036 --- /dev/null +++ b/kirby/i18n/rules/LICENSE @@ -0,0 +1,9 @@ +The MIT License (MIT) + +Copyright (c) 2012-217 Florian Eckerstorfer + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/kirby/i18n/rules/ar.json b/kirby/i18n/rules/ar.json new file mode 100644 index 0000000..e46915f --- /dev/null +++ b/kirby/i18n/rules/ar.json @@ -0,0 +1,30 @@ +{ + "أ" : "a", + "ب" : "b", + "ت" : "t", + "ث" : "th", + "ج" : "g", + "ح" : "h", + "خ" : "kh", + "د" : "d", + "ذ" : "th", + "ر" : "r", + "ز" : "z", + "س" : "s", + "ش" : "sh", + "ص" : "s", + "ض" : "d", + "ط" : "t", + "ظ" : "th", + "ع" : "aa", + "غ" : "gh", + "ف" : "f", + "ق" : "k", + "ك" : "k", + "ل" : "l", + "م" : "m", + "ن" : "n", + "ه" : "h", + "و" : "o", + "ي" : "y" +} diff --git a/kirby/i18n/rules/az.json b/kirby/i18n/rules/az.json new file mode 100644 index 0000000..ad6e2a9 --- /dev/null +++ b/kirby/i18n/rules/az.json @@ -0,0 +1,16 @@ +{ + "Ə": "E", + "Ç": "C", + "Ğ": "G", + "İ": "I", + "Ş": "S", + "Ö": "O", + "Ü": "U", + "ə": "e", + "ç": "c", + "ğ": "g", + "ı": "i", + "ş": "s", + "ö": "o", + "ü": "u" +} diff --git a/kirby/i18n/rules/bg.json b/kirby/i18n/rules/bg.json new file mode 100644 index 0000000..4c45ca1 --- /dev/null +++ b/kirby/i18n/rules/bg.json @@ -0,0 +1,65 @@ +{ + "А": "A", + "Б": "B", + "В": "V", + "Г": "G", + "Д": "D", + "Е": "E", + "Ж": "J", + "З": "Z", + "И": "I", + "Й": "Y", + "К": "K", + "Л": "L", + "М": "M", + "Н": "N", + "О": "O", + "П": "P", + "Р": "R", + "С": "S", + "Т": "T", + "У": "U", + "Ф": "F", + "Х": "H", + "Ц": "Ts", + "Ч": "Ch", + "Ш": "Sh", + "Щ": "Sht", + "Ъ": "A", + "Ь": "I", + "Ю": "Iu", + "Я": "Ia", + "а": "a", + "б": "b", + "в": "v", + "г": "g", + "д": "d", + "е": "e", + "ж": "j", + "з": "z", + "и": "i", + "й": "y", + "к": "k", + "л": "l", + "м": "m", + "н": "n", + "о": "o", + "п": "p", + "р": "r", + "с": "s", + "т": "t", + "у": "u", + "ф": "f", + "х": "h", + "ц": "ts", + "ч": "ch", + "ш": "sh", + "щ": "sht", + "ъ": "a", + "ь": "i", + "ю": "iu", + "я": "ia", + "ия": "ia", + "йо": "iо", + "ьо": "io" +} diff --git a/kirby/i18n/rules/cs.json b/kirby/i18n/rules/cs.json new file mode 100644 index 0000000..549f805 --- /dev/null +++ b/kirby/i18n/rules/cs.json @@ -0,0 +1,20 @@ +{ + "Č": "C", + "Ď": "D", + "Ě": "E", + "Ň": "N", + "Ř": "R", + "Š": "S", + "Ť": "T", + "Ů": "U", + "Ž": "Z", + "č": "c", + "ď": "d", + "ě": "e", + "ň": "n", + "ř": "r", + "š": "s", + "ť": "t", + "ů": "u", + "ž": "z" +} diff --git a/kirby/i18n/rules/da.json b/kirby/i18n/rules/da.json new file mode 100644 index 0000000..b88c17c --- /dev/null +++ b/kirby/i18n/rules/da.json @@ -0,0 +1,10 @@ +{ + "Æ": "Ae", + "æ": "ae", + "Ø": "Oe", + "ø": "oe", + "Å": "Aa", + "å": "aa", + "É": "E", + "é": "e" +} diff --git a/kirby/i18n/rules/de.json b/kirby/i18n/rules/de.json new file mode 100644 index 0000000..881b68c --- /dev/null +++ b/kirby/i18n/rules/de.json @@ -0,0 +1,9 @@ +{ + "Ä": "AE", + "Ö": "OE", + "Ü": "UE", + "ß": "ss", + "ä": "ae", + "ö": "oe", + "ü": "ue" +} diff --git a/kirby/i18n/rules/el.json b/kirby/i18n/rules/el.json new file mode 100644 index 0000000..767a223 --- /dev/null +++ b/kirby/i18n/rules/el.json @@ -0,0 +1,111 @@ +{ + "ΑΥ": "AU", + "Αυ": "Au", + "ΟΥ": "OU", + "Ου": "Ou", + "ΕΥ": "EU", + "Ευ": "Eu", + "ΕΙ": "I", + "Ει": "I", + "ΟΙ": "I", + "Οι": "I", + "ΥΙ": "I", + "Υι": "I", + "ΑΎ": "AU", + "Αύ": "Au", + "ΟΎ": "OU", + "Ού": "Ou", + "ΕΎ": "EU", + "Εύ": "Eu", + "ΕΊ": "I", + "Εί": "I", + "ΟΊ": "I", + "Οί": "I", + "ΎΙ": "I", + "Ύι": "I", + "ΥΊ": "I", + "Υί": "I", + "αυ": "au", + "ου": "ou", + "ευ": "eu", + "ει": "i", + "οι": "i", + "υι": "i", + "αύ": "au", + "ού": "ou", + "εύ": "eu", + "εί": "i", + "οί": "i", + "ύι": "i", + "υί": "i", + "Α": "A", + "Β": "V", + "Γ": "G", + "Δ": "D", + "Ε": "E", + "Ζ": "Z", + "Η": "I", + "Θ": "Th", + "Ι": "I", + "Κ": "K", + "Λ": "L", + "Μ": "M", + "Ν": "N", + "Ξ": "X", + "Ο": "O", + "Π": "P", + "Ρ": "R", + "Σ": "S", + "Τ": "T", + "Υ": "I", + "Φ": "F", + "Χ": "Ch", + "Ψ": "Ps", + "Ω": "O", + "Ά": "A", + "Έ": "E", + "Ή": "I", + "Ί": "I", + "Ό": "O", + "Ύ": "I", + "Ϊ": "I", + "Ϋ": "I", + "ϒ": "I", + "α": "a", + "β": "v", + "γ": "g", + "δ": "d", + "ε": "e", + "ζ": "z", + "η": "i", + "θ": "th", + "ι": "i", + "κ": "k", + "λ": "l", + "μ": "m", + "ν": "n", + "ξ": "x", + "ο": "o", + "π": "p", + "ρ": "r", + "ς": "s", + "σ": "s", + "τ": "t", + "υ": "i", + "φ": "f", + "χ": "ch", + "ψ": "ps", + "ω": "o", + "ά": "a", + "έ": "e", + "ή": "i", + "ί": "i", + "ό": "o", + "ύ": "i", + "ϊ": "i", + "ϋ": "i", + "ΰ": "i", + "ώ": "o", + "ϐ": "v", + "ϑ": "th" +} diff --git a/kirby/i18n/rules/eo.json b/kirby/i18n/rules/eo.json new file mode 100644 index 0000000..9a4e658 --- /dev/null +++ b/kirby/i18n/rules/eo.json @@ -0,0 +1,14 @@ +{ + "ĉ": "cx", + "ĝ": "gx", + "ĥ": "hx", + "ĵ": "jx", + "ŝ": "sx", + "ŭ": "ux", + "Ĉ": "CX", + "Ĝ": "GX", + "Ĥ": "HX", + "Ĵ": "JX", + "Ŝ": "SX", + "Ŭ": "UX" +} diff --git a/kirby/i18n/rules/et.json b/kirby/i18n/rules/et.json new file mode 100644 index 0000000..fcea469 --- /dev/null +++ b/kirby/i18n/rules/et.json @@ -0,0 +1,14 @@ +{ + "Š": "S", + "Ž": "Z", + "Õ": "O", + "Ä": "A", + "Ö": "O", + "Ü": "U", + "š": "s", + "ž": "z", + "õ": "o", + "ä": "a", + "ö": "o", + "ü": "u" +} \ No newline at end of file diff --git a/kirby/i18n/rules/fa.json b/kirby/i18n/rules/fa.json new file mode 100644 index 0000000..0448016 --- /dev/null +++ b/kirby/i18n/rules/fa.json @@ -0,0 +1,36 @@ +{ + "آ" : "A", + "ا" : "a", + "ب" : "b", + "پ" : "p", + "ت" : "t", + "ث" : "th", + "ج" : "j", + "چ" : "ch", + "ح" : "h", + "خ" : "kh", + "د" : "d", + "ذ" : "th", + "ر" : "r", + "ز" : "z", + "ژ" : "zh", + "س" : "s", + "ش" : "sh", + "ص" : "s", + "ض" : "z", + "ط" : "t", + "ظ" : "z", + "ع" : "a", + "غ" : "gh", + "ف" : "f", + "ق" : "g", + "ك" : "k", + "ک" : "k", + "گ" : "g", + "ل" : "l", + "م" : "m", + "ن" : "n", + "و" : "o", + "ه" : "h", + "ی" : "y" +} diff --git a/kirby/i18n/rules/fi.json b/kirby/i18n/rules/fi.json new file mode 100644 index 0000000..fd35423 --- /dev/null +++ b/kirby/i18n/rules/fi.json @@ -0,0 +1,6 @@ +{ + "Ä": "A", + "Ö": "O", + "ä": "a", + "ö": "o" +} diff --git a/kirby/i18n/rules/fr.json b/kirby/i18n/rules/fr.json new file mode 100644 index 0000000..29c94b9 --- /dev/null +++ b/kirby/i18n/rules/fr.json @@ -0,0 +1,34 @@ +{ + "À": "A", + "Â": "A", + "Æ": "AE", + "Ç": "C", + "É": "E", + "È": "E", + "Ê": "E", + "Ë": "E", + "Ï": "I", + "Î": "I", + "Ô": "O", + "Œ": "OE", + "Ù": "U", + "Û": "U", + "Ü": "U", + "à": "a", + "â": "a", + "æ": "ae", + "ç": "c", + "é": "e", + "è": "e", + "ê": "e", + "ë": "e", + "ï": "i", + "î": "i", + "ô": "o", + "œ": "oe", + "ù": "u", + "û": "u", + "ü": "u", + "ÿ": "y", + "Ÿ": "Y" +} diff --git a/kirby/i18n/rules/hi.json b/kirby/i18n/rules/hi.json new file mode 100644 index 0000000..f653f15 --- /dev/null +++ b/kirby/i18n/rules/hi.json @@ -0,0 +1,66 @@ +{ + "अ": "a", + "आ": "aa", + "ए": "e", + "ई": "ii", + "ऍ": "ei", + "ऎ": "ae", + "ऐ": "ai", + "इ": "i", + "ओ": "o", + "ऑ": "oi", + "ऒ": "oii", + "ऊ": "uu", + "औ": "ou", + "उ": "u", + "ब": "B", + "भ": "Bha", + "च": "Ca", + "छ": "Chha", + "ड": "Da", + "ढ": "Dha", + "फ": "Fa", + "फ़": "Fi", + "ग": "Ga", + "घ": "Gha", + "ग़": "Ghi", + "ह": "Ha", + "ज": "Ja", + "झ": "Jha", + "क": "Ka", + "ख": "Kha", + "ख़": "Khi", + "ल": "L", + "ळ": "Li", + "ऌ": "Li", + "ऴ": "Lii", + "ॡ": "Lii", + "म": "Ma", + "न": "Na", + "ङ": "Na", + "ञ": "Nia", + "ण": "Nae", + "ऩ": "Ni", + "ॐ": "oms", + "प": "Pa", + "क़": "Qi", + "र": "Ra", + "ऋ": "Ri", + "ॠ": "Ri", + "ऱ": "Ri", + "स": "Sa", + "श": "Sha", + "ष": "Shha", + "ट": "Ta", + "त": "Ta", + "ठ": "Tha", + "द": "Tha", + "थ": "Tha", + "ध": "Thha", + "ड़": "ugDha", + "ढ़": "ugDhha", + "व": "Va", + "य": "Ya", + "य़": "Yi", + "ज़": "Za" +} diff --git a/kirby/i18n/rules/hr.json b/kirby/i18n/rules/hr.json new file mode 100644 index 0000000..bf2b10d --- /dev/null +++ b/kirby/i18n/rules/hr.json @@ -0,0 +1,12 @@ +{ + "Č": "C", + "Ć": "C", + "Ž": "Z", + "Š": "S", + "Đ": "Dj", + "č": "c", + "ć": "c", + "ž": "z", + "š": "s", + "đ": "dj" +} \ No newline at end of file diff --git a/kirby/i18n/rules/hu.json b/kirby/i18n/rules/hu.json new file mode 100644 index 0000000..2bb2f3a --- /dev/null +++ b/kirby/i18n/rules/hu.json @@ -0,0 +1,20 @@ +{ + "Á": "a", + "É": "e", + "Í": "i", + "Ó": "o", + "Ö": "o", + "Ő": "o", + "Ú": "u", + "Ü": "u", + "Ű": "u", + "á": "a", + "é": "e", + "í": "i", + "ó": "o", + "ö": "o", + "ő": "o", + "ú": "u", + "ü": "u", + "ű": "u" +} diff --git a/kirby/i18n/rules/hy.json b/kirby/i18n/rules/hy.json new file mode 100644 index 0000000..08188e6 --- /dev/null +++ b/kirby/i18n/rules/hy.json @@ -0,0 +1,79 @@ +{ + "Ա": "A", + "Բ": "B", + "Գ": "G", + "Դ": "D", + "Ե": "E", + "Զ": "Z", + "Է": "E", + "Ը": "Y", + "Թ": "Th", + "Ժ": "Zh", + "Ի": "I", + "Լ": "L", + "Խ": "Kh", + "Ծ": "Ts", + "Կ": "K", + "Հ": "H", + "Ձ": "Dz", + "Ղ": "Gh", + "Ճ": "Tch", + "Մ": "M", + "Յ": "Y", + "Ն": "N", + "Շ": "Sh", + "Ո": "Vo", + "Չ": "Ch", + "Պ": "P", + "Ջ": "J", + "Ռ": "R", + "Ս": "S", + "Վ": "V", + "Տ": "T", + "Ր": "R", + "Ց": "C", + "Ւ": "u", + "Փ": "Ph", + "Ք": "Q", + "և": "ev", + "Օ": "O", + "Ֆ": "F", + "ա": "a", + "բ": "b", + "գ": "g", + "դ": "d", + "ե": "e", + "զ": "z", + "է": "e", + "ը": "y", + "թ": "th", + "ժ": "zh", + "ի": "i", + "լ": "l", + "խ": "kh", + "ծ": "ts", + "կ": "k", + "հ": "h", + "ձ": "dz", + "ղ": "gh", + "ճ": "tch", + "մ": "m", + "յ": "y", + "ն": "n", + "շ": "sh", + "ո": "vo", + "չ": "ch", + "պ": "p", + "ջ": "j", + "ռ": "r", + "ս": "s", + "վ": "v", + "տ": "t", + "ր": "r", + "ց": "c", + "ւ": "u", + "փ": "ph", + "ք": "q", + "օ": "o", + "ֆ": "f" +} diff --git a/kirby/i18n/rules/is_IS.json b/kirby/i18n/rules/is_IS.json new file mode 100644 index 0000000..7035056 --- /dev/null +++ b/kirby/i18n/rules/is_IS.json @@ -0,0 +1,22 @@ +{ + "Æ": "Ae", + "æ": "ae", + "Ö": "O", + "ö": "o", + "Þ": "Th", + "þ": "th", + "Ð": "D", + "ð": "d", + "Á": "A", + "á": "a", + "É": "E", + "é": "e", + "Í": "I", + "í": "i", + "Ó": "O", + "ó": "o", + "Ú": "U", + "ú": "u", + "Ý": "Y", + "ý": "y" +} diff --git a/kirby/i18n/rules/it.json b/kirby/i18n/rules/it.json new file mode 100644 index 0000000..647c2cf --- /dev/null +++ b/kirby/i18n/rules/it.json @@ -0,0 +1,13 @@ +{ + "À": "a", + "È": "e", + "Ì": "i", + "Ò": "o", + "Ù": "u", + "à": "a", + "é": "e", + "è": "e", + "ì": "i", + "ò": "o", + "ù": "u" +} diff --git a/kirby/i18n/rules/iu.json b/kirby/i18n/rules/iu.json new file mode 100644 index 0000000..2ec5018 --- /dev/null +++ b/kirby/i18n/rules/iu.json @@ -0,0 +1,163 @@ +{ + "ᐁ": "ai", + "ᐃ": "i", + "ᐄ": "ii", + "ᐅ": "u", + "ᐆ": "uu", + "ᐊ": "a", + "ᐋ": "aa", + + "ᐯ": "pai", + "ᐱ": "pi", + "ᐲ": "pii", + "ᐳ": "pu", + "ᐴ": "puu", + "ᐸ": "pa", + "ᐹ": "paa", + + "ᑌ": "tai", + "ᑎ": "ti", + "ᑏ": "tii", + "ᑐ": "tu", + "ᑑ": "tuu", + "ᑕ": "ta", + "ᑖ": "taa", + + "ᕴ": "hai", + "ᕵ": "hi", + "ᕶ": "hii", + "ᕷ": "hu", + "ᕸ": "huu", + "ᕹ": "ha", + "ᕺ": "haa", + + "ᒉ": "gai", + "ᒋ": "gi", + "ᒌ": "gii", + "ᒍ": "gu", + "ᒎ": "guu", + "ᒐ": "ga", + "ᒑ": "gaa", + + "ᒣ": "mai", + "ᒥ": "mi", + "ᒦ": "mii", + "ᒧ": "mu", + "ᒨ": "muu", + "ᒪ": "ma", + "ᒫ": "maa", + + "ᓀ": "nai", + "ᓂ": "ni", + "ᓃ": "nii", + "ᓄ": "nu", + "ᓅ": "nuu", + "ᓇ": "na", + "ᓈ": "naa", + + "ᓭ": "sai", + "ᓯ": "si", + "ᓰ": "sii", + "ᓱ": "su", + "ᓲ": "suu", + "ᓴ": "sa", + "ᓵ": "saa", + + "ᓓ": "lai", + "ᓕ": "li", + "ᓖ": "lii", + "ᓗ": "lu", + "ᓘ": "luu", + "ᓚ": "la", + "ᓛ": "laa", + + "ᔦ": "jai", + "ᔨ": "ji", + "ᔩ": "jii", + "ᔪ": "ju", + "ᔫ": "juu", + "ᔭ": "ja", + "ᔮ": "jaa", + + "ᕓ": "vai", + "ᕕ": "vi", + "ᕖ": "vii", + "ᕗ": "vu", + "ᕘ": "vuu", + "ᕙ": "va", + "ᕚ": "vaa", + + "ᕃ": "rai", + "ᕆ": "ri", + "ᕇ": "rii", + "ᕈ": "ru", + "ᕉ": "ruu", + "ᕋ": "ra", + "ᕌ": "raa", + + "ᖅᑫ": "qqai", + "ᖅᑭ": "qqi", + "ᖅᑮ": "qqii", + "ᖅᑯ": "qqu", + "ᖅᑰ": "qquu", + "ᖅᑲ": "qqa", + "ᖅᑳ": "qqaa", + "ᖅᒃ": "qq", + + "ᙯ": "qai", + "ᕿ": "qi", + "ᖀ": "qii", + "ᖁ": "qu", + "ᖂ": "quu", + "ᖃ": "qa", + "ᖄ": "qaa", + + "ᑫ": "kai", + "ᑭ": "ki", + "ᑮ": "kii", + "ᑯ": "ku", + "ᑰ": "kuu", + "ᑲ": "ka", + "ᑳ": "kaa", + + "ᙰ": "ngai", + "ᖏ": "ngi", + "ᖐ": "ngii", + "ᖑ": "ngu", + "ᖒ": "nguu", + "ᖓ": "nga", + "ᖔ": "ngaa", + + "ᙱ": "nngi", + "ᙲ": "nngii", + "ᙳ": "nngu", + "ᙴ": "nnguu", + "ᙵ": "nnga", + "ᙶ": "nngaa", + + "ᖠ": "lhi", + "ᖡ": "lhii", + "ᖢ": "lhu", + "ᖣ": "lhuu", + "ᖤ": "lha", + "ᖥ": "lhaa", + + "ᑉ": "p", + "ᑦ": "t", + "ᒃ": "k", + "ᒡ": "g", + "ᒻ": "m", + "ᓐ": "n", + "ᔅ": "s", + "ᓪ": "l", + "ᔾ": "j", + "ᕝ": "v", + "ᕐ": "r", + "ᖅ": "q", + "ᖕ": "ng", + "ᖖ": "nng", + "ᖦ": "lh", + + "ᖯ": "b", + "ᕼ": "h" +} \ No newline at end of file diff --git a/kirby/i18n/rules/ja.json b/kirby/i18n/rules/ja.json new file mode 100644 index 0000000..12f842d --- /dev/null +++ b/kirby/i18n/rules/ja.json @@ -0,0 +1,182 @@ +{ + "きゃ": "kya", + "しゃ": "sha", + "ちゃ": "cha", + "にゃ": "nya", + "ひゃ": "hya", + "みゃ": "mya", + "りゃ": "rya", + "ぎゃ": "gya", + "じゃ": "ja", + "ぢゃ": "ja", + "びゃ": "bya", + "ぴゃ": "pya", + + "きゅ": "kyu", + "しゅ": "shu", + "ちゅ": "chu", + "にゅ": "nyu", + "ひゅ": "hyu", + "みゅ": "myu", + "りゅ": "ryu", + "ぎゅ": "gyu", + "じゅ": "ju", + "ぢゅ": "ju", + "びゅ": "byu", + "ぴゅ": "pyu", + + "きょ": "kyo", + "しょ": "sho", + "ちょ": "cho", + "にょ": "nyo", + "ひょ": "hyo", + "みょ": "myo", + "りょ": "ryo", + "ぎょ": "gyo", + "じょ": "jo", + "ぢょ": "jo", + "びょ": "byo", + "ぴょ": "pyo", + + "あ": "a", + "ア": "a", + "か": "ka", + "カ": "ka", + "さ": "sa", + "サ": "sa", + "た": "ta", + "タ": "ta", + "な": "na", + "ナ": "na", + "は": "ha", + "ハ": "ha", + "ま": "ma", + "マ": "ma", + "や": "ya", + "ヤ": "ya", + "ら": "ra", + "ラ": "ra", + "わ": "wa", + "ワ": "wa", + "が": "ga", + "ざ": "za", + "ザ": "za", + "だ": "da", + "ば": "ba", + "ぱ": "pa", + "中": "naka", + "場": "ba", + "版": "han", + + "い": "i", + "イ": "i", + "き": "ki", + "キ": "ki", + "し": "shi", + "シ": "shi", + "ち": "chi", + "チ": "chi", + "に": "ni", + "ニ": "ni", + "ひ": "hi", + "ヒ": "hi", + "み": "mi", + "ミ": "mi", + "り": "ri", + "リ": "ri", + "ゐ": "wi", + "ヰ": "wi", + "ぎ": "gi", + "じ": "dji", + "ぢ": "ji", + "び": "bi", + "ぴ": "pi", + "仮": "kari", + "国": "kuni", + "鳥": "tori", + "劇": "geki", + + "う": "u", + "ウ": "u", + "く": "ku", + "ク": "ku", + "す": "su", + "ス": "su", + "つ": "tsu", + "ツ": "tsu", + "ぬ": "nu", + "ヌ": "nu", + "ふ": "fu", + "フ": "fu", + "む": "mu", + "ム": "mu", + "ゆ": "yu", + "ユ": "yu", + "る": "ru", + "ル": "ru", + "ぐ": "gu", + "ず": "zu", + "づ": "dzu", + "ぶ": "bu", + "ぷ": "pu", + "プ": "pu", + "ズ": "zu", + "グ": "gu", + + "え": "e", + "エ": "e", + "け": "ke", + "ケ": "ke", + "せ": "se", + "セ": "se", + "て": "te", + "テ": "te", + "ね": "ne", + "ネ": "ne", + "へ": "he", + "ヘ": "he", + "め": "me", + "メ": "me", + "れ": "re", + "レ": "re", + "ゑ": "we", + "ヱ": "we", + "げ": "ge", + "ぜ": "ze", + "で": "de", + "べ": "be", + "ぺ": "pe", + "面": "men", + + "お": "o", + "オ": "o", + "こ": "ko", + "コ": "ko", + "そ": "so", + "ソ": "so", + "と": "to", + "ト": "to", + "の": "no", + "ノ": "no", + "ほ": "ho", + "ホ": "ho", + "も": "mo", + "モ": "mo", + "よ": "yo", + "ヨ": "yo", + "ろ": "ro", + "ロ": "ro", + "を": "wo", + "ヲ": "wo", + "ん": "n", + "ン": "n", + "ご": "go", + "ぞ": "zo", + "ど": "do", + "ド": "do", + "ぼ": "bo", + "ポ": "po", + "ぽ": "po", + "男": "otoko", + "人": "hito" +} diff --git a/kirby/i18n/rules/ka.json b/kirby/i18n/rules/ka.json new file mode 100644 index 0000000..2c63573 --- /dev/null +++ b/kirby/i18n/rules/ka.json @@ -0,0 +1,35 @@ +{ + "ა": "a", + "ბ": "b", + "გ": "g", + "დ": "d", + "ე": "e", + "ვ": "v", + "ზ": "z", + "თ": "t", + "ი": "i", + "კ": "k", + "ლ": "l", + "მ": "m", + "ნ": "n", + "ო": "o", + "პ": "p", + "ჟ": "zh", + "რ": "r", + "ს": "s", + "ტ": "t", + "უ": "u", + "ფ": "f", + "ქ": "k", + "ღ": "gh", + "ყ": "q", + "შ": "sh", + "ჩ": "ch", + "ც": "ts", + "ძ": "dz", + "წ": "ts", + "ჭ": "ch", + "ხ": "kh", + "ჯ": "j", + "ჰ": "h" +} diff --git a/kirby/i18n/rules/ko.json b/kirby/i18n/rules/ko.json new file mode 100644 index 0000000..8dad2c0 --- /dev/null +++ b/kirby/i18n/rules/ko.json @@ -0,0 +1,11174 @@ +{ + "가": "ga", + "각": "gak", + "갂": "gakk", + "갃": "gak", + "간": "gan", + "갅": "gan", + "갆": "gan", + "갇": "gat", + "갈": "gal", + "갉": "gak", + "갊": "gam", + "갋": "gap", + "갌": "gat", + "갍": "gat", + "갎": "gap", + "갏": "gal", + "감": "gam", + "갑": "gap", + "값": "gap", + "갓": "gat", + "갔": "gat", + "강": "gang", + "갖": "gat", + "갗": "gat", + "갘": "gak", + "같": "gat", + "갚": "gap", + "갛": "gat", + "개": "gae", + "객": "gaek", + "갞": "gaekk", + "갟": "gaek", + "갠": "gaen", + "갡": "gaen", + "갢": "gaen", + "갣": "gaet", + "갤": "gael", + "갥": "gaek", + "갦": "gaem", + "갧": "gaep", + "갨": "gaet", + "갩": "gaet", + "갪": "gaep", + "갫": "gael", + "갬": "gaem", + "갭": "gaep", + "갮": "gaep", + "갯": "gaet", + "갰": "gaet", + "갱": "gaeng", + "갲": "gaet", + "갳": "gaet", + "갴": "gaek", + "갵": "gaet", + "갶": "gaep", + "갷": "gaet", + "갸": "gya", + "갹": "gyak", + "갺": "gyakk", + "갻": "gyak", + "갼": "gyan", + "갽": "gyan", + "갾": "gyan", + "갿": "gyat", + "걀": "gyal", + "걁": "gyak", + "걂": "gyam", + "걃": "gyap", + "걄": "gyat", + "걅": "gyat", + "걆": "gyap", + "걇": "gyal", + "걈": "gyam", + "걉": "gyap", + "걊": "gyap", + "걋": "gyat", + "걌": "gyat", + "걍": "gyang", + "걎": "gyat", + "걏": "gyat", + "걐": "gyak", + "걑": "gyat", + "걒": "gyap", + "걓": "gyat", + "걔": "gyae", + "걕": "gyaek", + "걖": "gyaekk", + "걗": "gyaek", + "걘": "gyaen", + "걙": "gyaen", + "걚": "gyaen", + "걛": "gyaet", + "걜": "gyael", + "걝": "gyaek", + "걞": "gyaem", + "걟": "gyaep", + "걠": "gyaet", + "걡": "gyaet", + "걢": "gyaep", + "걣": "gyael", + "걤": "gyaem", + "걥": "gyaep", + "걦": "gyaep", + "걧": "gyaet", + "걨": "gyaet", + "걩": "gyaeng", + "걪": "gyaet", + "걫": "gyaet", + "걬": "gyaek", + "걭": "gyaet", + "걮": "gyaep", + "걯": "gyaet", + "거": "geo", + "걱": "geok", + "걲": "geokk", + "걳": "geok", + "건": "geon", + "걵": "geon", + "걶": "geon", + "걷": "geot", + "걸": "geol", + "걹": "geok", + "걺": "geom", + "걻": "geop", + "걼": "geot", + "걽": "geot", + "걾": "geop", + "걿": "geol", + "검": "geom", + "겁": "geop", + "겂": "geop", + "것": "geot", + "겄": "geot", + "겅": "geong", + "겆": "geot", + "겇": "geot", + "겈": "geok", + "겉": "geot", + "겊": "geop", + "겋": "geot", + "게": "ge", + "겍": "gek", + "겎": "gekk", + "겏": "gek", + "겐": "gen", + "겑": "gen", + "겒": "gen", + "겓": "get", + "겔": "gel", + "겕": "gek", + "겖": "gem", + "겗": "gep", + "겘": "get", + "겙": "get", + "겚": "gep", + "겛": "gel", + "겜": "gem", + "겝": "gep", + "겞": "gep", + "겟": "get", + "겠": "get", + "겡": "geng", + "겢": "get", + "겣": "get", + "겤": "gek", + "겥": "get", + "겦": "gep", + "겧": "get", + "겨": "gyeo", + "격": "gyeok", + "겪": "gyeokk", + "겫": "gyeok", + "견": "gyeon", + "겭": "gyeon", + "겮": "gyeon", + "겯": "gyeot", + "결": "gyeol", + "겱": "gyeok", + "겲": "gyeom", + "겳": "gyeop", + "겴": "gyeot", + "겵": "gyeot", + "겶": "gyeop", + "겷": "gyeol", + "겸": "gyeom", + "겹": "gyeop", + "겺": "gyeop", + "겻": "gyeot", + "겼": "gyeot", + "경": "gyeong", + "겾": "gyeot", + "겿": "gyeot", + "곀": "gyeok", + "곁": "gyeot", + "곂": "gyeop", + "곃": "gyeot", + "계": "gye", + "곅": "gyek", + "곆": "gyekk", + "곇": "gyek", + "곈": "gyen", + "곉": "gyen", + "곊": "gyen", + "곋": "gyet", + "곌": "gyel", + "곍": "gyek", + "곎": "gyem", + "곏": "gyep", + "곐": "gyet", + "곑": "gyet", + "곒": "gyep", + "곓": "gyel", + "곔": "gyem", + "곕": "gyep", + "곖": "gyep", + "곗": "gyet", + "곘": "gyet", + "곙": "gyeng", + "곚": "gyet", + "곛": "gyet", + "곜": "gyek", + "곝": "gyet", + "곞": "gyep", + "곟": "gyet", + "고": "go", + "곡": "gok", + "곢": "gokk", + "곣": "gok", + "곤": "gon", + "곥": "gon", + "곦": "gon", + "곧": "got", + "골": "gol", + "곩": "gok", + "곪": "gom", + "곫": "gop", + "곬": "got", + "곭": "got", + "곮": "gop", + "곯": "gol", + "곰": "gom", + "곱": "gop", + "곲": "gop", + "곳": "got", + "곴": "got", + "공": "gong", + "곶": "got", + "곷": "got", + "곸": "gok", + "곹": "got", + "곺": "gop", + "곻": "got", + "과": "gwa", + "곽": "gwak", + "곾": "gwakk", + "곿": "gwak", + "관": "gwan", + "괁": "gwan", + "괂": "gwan", + "괃": "gwat", + "괄": "gwal", + "괅": "gwak", + "괆": "gwam", + "괇": "gwap", + "괈": "gwat", + "괉": "gwat", + "괊": "gwap", + "괋": "gwal", + "괌": "gwam", + "괍": "gwap", + "괎": "gwap", + "괏": "gwat", + "괐": "gwat", + "광": "gwang", + "괒": "gwat", + "괓": "gwat", + "괔": "gwak", + "괕": "gwat", + "괖": "gwap", + "괗": "gwat", + "괘": "gwae", + "괙": "gwaek", + "괚": "gwaekk", + "괛": "gwaek", + "괜": "gwaen", + "괝": "gwaen", + "괞": "gwaen", + "괟": "gwaet", + "괠": "gwael", + "괡": "gwaek", + "괢": "gwaem", + "괣": "gwaep", + "괤": "gwaet", + "괥": "gwaet", + "괦": "gwaep", + "괧": "gwael", + "괨": "gwaem", + "괩": "gwaep", + "괪": "gwaep", + "괫": "gwaet", + "괬": "gwaet", + "괭": "gwaeng", + "괮": "gwaet", + "괯": "gwaet", + "괰": "gwaek", + "괱": "gwaet", + "괲": "gwaep", + "괳": "gwaet", + "괴": "goe", + "괵": "goek", + "괶": "goekk", + "괷": "goek", + "괸": "goen", + "괹": "goen", + "괺": "goen", + "괻": "goet", + "괼": "goel", + "괽": "goek", + "괾": "goem", + "괿": "goep", + "굀": "goet", + "굁": "goet", + "굂": "goep", + "굃": "goel", + "굄": "goem", + "굅": "goep", + "굆": "goep", + "굇": "goet", + "굈": "goet", + "굉": "goeng", + "굊": "goet", + "굋": "goet", + "굌": "goek", + "굍": "goet", + "굎": "goep", + "굏": "goet", + "교": "gyo", + "굑": "gyok", + "굒": "gyokk", + "굓": "gyok", + "굔": "gyon", + "굕": "gyon", + "굖": "gyon", + "굗": "gyot", + "굘": "gyol", + "굙": "gyok", + "굚": "gyom", + "굛": "gyop", + "굜": "gyot", + "굝": "gyot", + "굞": "gyop", + "굟": "gyol", + "굠": "gyom", + "굡": "gyop", + "굢": "gyop", + "굣": "gyot", + "굤": "gyot", + "굥": "gyong", + "굦": "gyot", + "굧": "gyot", + "굨": "gyok", + "굩": "gyot", + "굪": "gyop", + "굫": "gyot", + "구": "gu", + "국": "guk", + "굮": "gukk", + "굯": "guk", + "군": "gun", + "굱": "gun", + "굲": "gun", + "굳": "gut", + "굴": "gul", + "굵": "guk", + "굶": "gum", + "굷": "gup", + "굸": "gut", + "굹": "gut", + "굺": "gup", + "굻": "gul", + "굼": "gum", + "굽": "gup", + "굾": "gup", + "굿": "gut", + "궀": "gut", + "궁": "gung", + "궂": "gut", + "궃": "gut", + "궄": "guk", + "궅": "gut", + "궆": "gup", + "궇": "gut", + "궈": "gwo", + "궉": "gwok", + "궊": "gwokk", + "궋": "gwok", + "권": "gwon", + "궍": "gwon", + "궎": "gwon", + "궏": "gwot", + "궐": "gwol", + "궑": "gwok", + "궒": "gwom", + "궓": "gwop", + "궔": "gwot", + "궕": "gwot", + "궖": "gwop", + "궗": "gwol", + "궘": "gwom", + "궙": "gwop", + "궚": "gwop", + "궛": "gwot", + "궜": "gwot", + "궝": "gwong", + "궞": "gwot", + "궟": "gwot", + "궠": "gwok", + "궡": "gwot", + "궢": "gwop", + "궣": "gwot", + "궤": "gwe", + "궥": "gwek", + "궦": "gwekk", + "궧": "gwek", + "궨": "gwen", + "궩": "gwen", + "궪": "gwen", + "궫": "gwet", + "궬": "gwel", + "궭": "gwek", + "궮": "gwem", + "궯": "gwep", + "궰": "gwet", + "궱": "gwet", + "궲": "gwep", + "궳": "gwel", + "궴": "gwem", + "궵": "gwep", + "궶": "gwep", + "궷": "gwet", + "궸": "gwet", + "궹": "gweng", + "궺": "gwet", + "궻": "gwet", + "궼": "gwek", + "궽": "gwet", + "궾": "gwep", + "궿": "gwet", + "귀": "gwi", + "귁": "gwik", + "귂": "gwikk", + "귃": "gwik", + "귄": "gwin", + "귅": "gwin", + "귆": "gwin", + "귇": "gwit", + "귈": "gwil", + "귉": "gwik", + "귊": "gwim", + "귋": "gwip", + "귌": "gwit", + "귍": "gwit", + "귎": "gwip", + "귏": "gwil", + "귐": "gwim", + "귑": "gwip", + "귒": "gwip", + "귓": "gwit", + "귔": "gwit", + "귕": "gwing", + "귖": "gwit", + "귗": "gwit", + "귘": "gwik", + "귙": "gwit", + "귚": "gwip", + "귛": "gwit", + "규": "gyu", + "귝": "gyuk", + "귞": "gyukk", + "귟": "gyuk", + "균": "gyun", + "귡": "gyun", + "귢": "gyun", + "귣": "gyut", + "귤": "gyul", + "귥": "gyuk", + "귦": "gyum", + "귧": "gyup", + "귨": "gyut", + "귩": "gyut", + "귪": "gyup", + "귫": "gyul", + "귬": "gyum", + "귭": "gyup", + "귮": "gyup", + "귯": "gyut", + "귰": "gyut", + "귱": "gyung", + "귲": "gyut", + "귳": "gyut", + "귴": "gyuk", + "귵": "gyut", + "귶": "gyup", + "귷": "gyut", + "그": "geu", + "극": "geuk", + "귺": "geukk", + "귻": "geuk", + "근": "geun", + "귽": "geun", + "귾": "geun", + "귿": "geut", + "글": "geul", + "긁": "geuk", + "긂": "geum", + "긃": "geup", + "긄": "geut", + "긅": "geut", + "긆": "geup", + "긇": "geul", + "금": "geum", + "급": "geup", + "긊": "geup", + "긋": "geut", + "긌": "geut", + "긍": "geung", + "긎": "geut", + "긏": "geut", + "긐": "geuk", + "긑": "geut", + "긒": "geup", + "긓": "geut", + "긔": "geui", + "긕": "geuik", + "긖": "geuikk", + "긗": "geuik", + "긘": "geuin", + "긙": "geuin", + "긚": "geuin", + "긛": "geuit", + "긜": "geuil", + "긝": "geuik", + "긞": "geuim", + "긟": "geuip", + "긠": "geuit", + "긡": "geuit", + "긢": "geuip", + "긣": "geuil", + "긤": "geuim", + "긥": "geuip", + "긦": "geuip", + "긧": "geuit", + "긨": "geuit", + "긩": "geuing", + "긪": "geuit", + "긫": "geuit", + "긬": "geuik", + "긭": "geuit", + "긮": "geuip", + "긯": "geuit", + "기": "gi", + "긱": "gik", + "긲": "gikk", + "긳": "gik", + "긴": "gin", + "긵": "gin", + "긶": "gin", + "긷": "git", + "길": "gil", + "긹": "gik", + "긺": "gim", + "긻": "gip", + "긼": "git", + "긽": "git", + "긾": "gip", + "긿": "gil", + "김": "gim", + "깁": "gip", + "깂": "gip", + "깃": "git", + "깄": "git", + "깅": "ging", + "깆": "git", + "깇": "git", + "깈": "gik", + "깉": "git", + "깊": "gip", + "깋": "git", + "까": "kka", + "깍": "kkak", + "깎": "kkakk", + "깏": "kkak", + "깐": "kkan", + "깑": "kkan", + "깒": "kkan", + "깓": "kkat", + "깔": "kkal", + "깕": "kkak", + "깖": "kkam", + "깗": "kkap", + "깘": "kkat", + "깙": "kkat", + "깚": "kkap", + "깛": "kkal", + "깜": "kkam", + "깝": "kkap", + "깞": "kkap", + "깟": "kkat", + "깠": "kkat", + "깡": "kkang", + "깢": "kkat", + "깣": "kkat", + "깤": "kkak", + "깥": "kkat", + "깦": "kkap", + "깧": "kkat", + "깨": "kkae", + "깩": "kkaek", + "깪": "kkaekk", + "깫": "kkaek", + "깬": "kkaen", + "깭": "kkaen", + "깮": "kkaen", + "깯": "kkaet", + "깰": "kkael", + "깱": "kkaek", + "깲": "kkaem", + "깳": "kkaep", + "깴": "kkaet", + "깵": "kkaet", + "깶": "kkaep", + "깷": "kkael", + "깸": "kkaem", + "깹": "kkaep", + "깺": "kkaep", + "깻": "kkaet", + "깼": "kkaet", + "깽": "kkaeng", + "깾": "kkaet", + "깿": "kkaet", + "꺀": "kkaek", + "꺁": "kkaet", + "꺂": "kkaep", + "꺃": "kkaet", + "꺄": "kkya", + "꺅": "kkyak", + "꺆": "kkyakk", + "꺇": "kkyak", + "꺈": "kkyan", + "꺉": "kkyan", + "꺊": "kkyan", + "꺋": "kkyat", + "꺌": "kkyal", + "꺍": "kkyak", + "꺎": "kkyam", + "꺏": "kkyap", + "꺐": "kkyat", + "꺑": "kkyat", + "꺒": "kkyap", + "꺓": "kkyal", + "꺔": "kkyam", + "꺕": "kkyap", + "꺖": "kkyap", + "꺗": "kkyat", + "꺘": "kkyat", + "꺙": "kkyang", + "꺚": "kkyat", + "꺛": "kkyat", + "꺜": "kkyak", + "꺝": "kkyat", + "꺞": "kkyap", + "꺟": "kkyat", + "꺠": "kkyae", + "꺡": "kkyaek", + "꺢": "kkyaekk", + "꺣": "kkyaek", + "꺤": "kkyaen", + "꺥": "kkyaen", + "꺦": "kkyaen", + "꺧": "kkyaet", + "꺨": "kkyael", + "꺩": "kkyaek", + "꺪": "kkyaem", + "꺫": "kkyaep", + "꺬": "kkyaet", + "꺭": "kkyaet", + "꺮": "kkyaep", + "꺯": "kkyael", + "꺰": "kkyaem", + "꺱": "kkyaep", + "꺲": "kkyaep", + "꺳": "kkyaet", + "꺴": "kkyaet", + "꺵": "kkyaeng", + "꺶": "kkyaet", + "꺷": "kkyaet", + "꺸": "kkyaek", + "꺹": "kkyaet", + "꺺": "kkyaep", + "꺻": "kkyaet", + "꺼": "kkeo", + "꺽": "kkeok", + "꺾": "kkeokk", + "꺿": "kkeok", + "껀": "kkeon", + "껁": "kkeon", + "껂": "kkeon", + "껃": "kkeot", + "껄": "kkeol", + "껅": "kkeok", + "껆": "kkeom", + "껇": "kkeop", + "껈": "kkeot", + "껉": "kkeot", + "껊": "kkeop", + "껋": "kkeol", + "껌": "kkeom", + "껍": "kkeop", + "껎": "kkeop", + "껏": "kkeot", + "껐": "kkeot", + "껑": "kkeong", + "껒": "kkeot", + "껓": "kkeot", + "껔": "kkeok", + "껕": "kkeot", + "껖": "kkeop", + "껗": "kkeot", + "께": "kke", + "껙": "kkek", + "껚": "kkekk", + "껛": "kkek", + "껜": "kken", + "껝": "kken", + "껞": "kken", + "껟": "kket", + "껠": "kkel", + "껡": "kkek", + "껢": "kkem", + "껣": "kkep", + "껤": "kket", + "껥": "kket", + "껦": "kkep", + "껧": "kkel", + "껨": "kkem", + "껩": "kkep", + "껪": "kkep", + "껫": "kket", + "껬": "kket", + "껭": "kkeng", + "껮": "kket", + "껯": "kket", + "껰": "kkek", + "껱": "kket", + "껲": "kkep", + "껳": "kket", + "껴": "kkyeo", + "껵": "kkyeok", + "껶": "kkyeokk", + "껷": "kkyeok", + "껸": "kkyeon", + "껹": "kkyeon", + "껺": "kkyeon", + "껻": "kkyeot", + "껼": "kkyeol", + "껽": "kkyeok", + "껾": "kkyeom", + "껿": "kkyeop", + "꼀": "kkyeot", + "꼁": "kkyeot", + "꼂": "kkyeop", + "꼃": "kkyeol", + "꼄": "kkyeom", + "꼅": "kkyeop", + "꼆": "kkyeop", + "꼇": "kkyeot", + "꼈": "kkyeot", + "꼉": "kkyeong", + "꼊": "kkyeot", + "꼋": "kkyeot", + "꼌": "kkyeok", + "꼍": "kkyeot", + "꼎": "kkyeop", + "꼏": "kkyeot", + "꼐": "kkye", + "꼑": "kkyek", + "꼒": "kkyekk", + "꼓": "kkyek", + "꼔": "kkyen", + "꼕": "kkyen", + "꼖": "kkyen", + "꼗": "kkyet", + "꼘": "kkyel", + "꼙": "kkyek", + "꼚": "kkyem", + "꼛": "kkyep", + "꼜": "kkyet", + "꼝": "kkyet", + "꼞": "kkyep", + "꼟": "kkyel", + "꼠": "kkyem", + "꼡": "kkyep", + "꼢": "kkyep", + "꼣": "kkyet", + "꼤": "kkyet", + "꼥": "kkyeng", + "꼦": "kkyet", + "꼧": "kkyet", + "꼨": "kkyek", + "꼩": "kkyet", + "꼪": "kkyep", + "꼫": "kkyet", + "꼬": "kko", + "꼭": "kkok", + "꼮": "kkokk", + "꼯": "kkok", + "꼰": "kkon", + "꼱": "kkon", + "꼲": "kkon", + "꼳": "kkot", + "꼴": "kkol", + "꼵": "kkok", + "꼶": "kkom", + "꼷": "kkop", + "꼸": "kkot", + "꼹": "kkot", + "꼺": "kkop", + "꼻": "kkol", + "꼼": "kkom", + "꼽": "kkop", + "꼾": "kkop", + "꼿": "kkot", + "꽀": "kkot", + "꽁": "kkong", + "꽂": "kkot", + "꽃": "kkot", + "꽄": "kkok", + "꽅": "kkot", + "꽆": "kkop", + "꽇": "kkot", + "꽈": "kkwa", + "꽉": "kkwak", + "꽊": "kkwakk", + "꽋": "kkwak", + "꽌": "kkwan", + "꽍": "kkwan", + "꽎": "kkwan", + "꽏": "kkwat", + "꽐": "kkwal", + "꽑": "kkwak", + "꽒": "kkwam", + "꽓": "kkwap", + "꽔": "kkwat", + "꽕": "kkwat", + "꽖": "kkwap", + "꽗": "kkwal", + "꽘": "kkwam", + "꽙": "kkwap", + "꽚": "kkwap", + "꽛": "kkwat", + "꽜": "kkwat", + "꽝": "kkwang", + "꽞": "kkwat", + "꽟": "kkwat", + "꽠": "kkwak", + "꽡": "kkwat", + "꽢": "kkwap", + "꽣": "kkwat", + "꽤": "kkwae", + "꽥": "kkwaek", + "꽦": "kkwaekk", + "꽧": "kkwaek", + "꽨": "kkwaen", + "꽩": "kkwaen", + "꽪": "kkwaen", + "꽫": "kkwaet", + "꽬": "kkwael", + "꽭": "kkwaek", + "꽮": "kkwaem", + "꽯": "kkwaep", + "꽰": "kkwaet", + "꽱": "kkwaet", + "꽲": "kkwaep", + "꽳": "kkwael", + "꽴": "kkwaem", + "꽵": "kkwaep", + "꽶": "kkwaep", + "꽷": "kkwaet", + "꽸": "kkwaet", + "꽹": "kkwaeng", + "꽺": "kkwaet", + "꽻": "kkwaet", + "꽼": "kkwaek", + "꽽": "kkwaet", + "꽾": "kkwaep", + "꽿": "kkwaet", + "꾀": "kkoe", + "꾁": "kkoek", + "꾂": "kkoekk", + "꾃": "kkoek", + "꾄": "kkoen", + "꾅": "kkoen", + "꾆": "kkoen", + "꾇": "kkoet", + "꾈": "kkoel", + "꾉": "kkoek", + "꾊": "kkoem", + "꾋": "kkoep", + "꾌": "kkoet", + "꾍": "kkoet", + "꾎": "kkoep", + "꾏": "kkoel", + "꾐": "kkoem", + "꾑": "kkoep", + "꾒": "kkoep", + "꾓": "kkoet", + "꾔": "kkoet", + "꾕": "kkoeng", + "꾖": "kkoet", + "꾗": "kkoet", + "꾘": "kkoek", + "꾙": "kkoet", + "꾚": "kkoep", + "꾛": "kkoet", + "꾜": "kkyo", + "꾝": "kkyok", + "꾞": "kkyokk", + "꾟": "kkyok", + "꾠": "kkyon", + "꾡": "kkyon", + "꾢": "kkyon", + "꾣": "kkyot", + "꾤": "kkyol", + "꾥": "kkyok", + "꾦": "kkyom", + "꾧": "kkyop", + "꾨": "kkyot", + "꾩": "kkyot", + "꾪": "kkyop", + "꾫": "kkyol", + "꾬": "kkyom", + "꾭": "kkyop", + "꾮": "kkyop", + "꾯": "kkyot", + "꾰": "kkyot", + "꾱": "kkyong", + "꾲": "kkyot", + "꾳": "kkyot", + "꾴": "kkyok", + "꾵": "kkyot", + "꾶": "kkyop", + "꾷": "kkyot", + "꾸": "kku", + "꾹": "kkuk", + "꾺": "kkukk", + "꾻": "kkuk", + "꾼": "kkun", + "꾽": "kkun", + "꾾": "kkun", + "꾿": "kkut", + "꿀": "kkul", + "꿁": "kkuk", + "꿂": "kkum", + "꿃": "kkup", + "꿄": "kkut", + "꿅": "kkut", + "꿆": "kkup", + "꿇": "kkul", + "꿈": "kkum", + "꿉": "kkup", + "꿊": "kkup", + "꿋": "kkut", + "꿌": "kkut", + "꿍": "kkung", + "꿎": "kkut", + "꿏": "kkut", + "꿐": "kkuk", + "꿑": "kkut", + "꿒": "kkup", + "꿓": "kkut", + "꿔": "kkwo", + "꿕": "kkwok", + "꿖": "kkwokk", + "꿗": "kkwok", + "꿘": "kkwon", + "꿙": "kkwon", + "꿚": "kkwon", + "꿛": "kkwot", + "꿜": "kkwol", + "꿝": "kkwok", + "꿞": "kkwom", + "꿟": "kkwop", + "꿠": "kkwot", + "꿡": "kkwot", + "꿢": "kkwop", + "꿣": "kkwol", + "꿤": "kkwom", + "꿥": "kkwop", + "꿦": "kkwop", + "꿧": "kkwot", + "꿨": "kkwot", + "꿩": "kkwong", + "꿪": "kkwot", + "꿫": "kkwot", + "꿬": "kkwok", + "꿭": "kkwot", + "꿮": "kkwop", + "꿯": "kkwot", + "꿰": "kkwe", + "꿱": "kkwek", + "꿲": "kkwekk", + "꿳": "kkwek", + "꿴": "kkwen", + "꿵": "kkwen", + "꿶": "kkwen", + "꿷": "kkwet", + "꿸": "kkwel", + "꿹": "kkwek", + "꿺": "kkwem", + "꿻": "kkwep", + "꿼": "kkwet", + "꿽": "kkwet", + "꿾": "kkwep", + "꿿": "kkwel", + "뀀": "kkwem", + "뀁": "kkwep", + "뀂": "kkwep", + "뀃": "kkwet", + "뀄": "kkwet", + "뀅": "kkweng", + "뀆": "kkwet", + "뀇": "kkwet", + "뀈": "kkwek", + "뀉": "kkwet", + "뀊": "kkwep", + "뀋": "kkwet", + "뀌": "kkwi", + "뀍": "kkwik", + "뀎": "kkwikk", + "뀏": "kkwik", + "뀐": "kkwin", + "뀑": "kkwin", + "뀒": "kkwin", + "뀓": "kkwit", + "뀔": "kkwil", + "뀕": "kkwik", + "뀖": "kkwim", + "뀗": "kkwip", + "뀘": "kkwit", + "뀙": "kkwit", + "뀚": "kkwip", + "뀛": "kkwil", + "뀜": "kkwim", + "뀝": "kkwip", + "뀞": "kkwip", + "뀟": "kkwit", + "뀠": "kkwit", + "뀡": "kkwing", + "뀢": "kkwit", + "뀣": "kkwit", + "뀤": "kkwik", + "뀥": "kkwit", + "뀦": "kkwip", + "뀧": "kkwit", + "뀨": "kkyu", + "뀩": "kkyuk", + "뀪": "kkyukk", + "뀫": "kkyuk", + "뀬": "kkyun", + "뀭": "kkyun", + "뀮": "kkyun", + "뀯": "kkyut", + "뀰": "kkyul", + "뀱": "kkyuk", + "뀲": "kkyum", + "뀳": "kkyup", + "뀴": "kkyut", + "뀵": "kkyut", + "뀶": "kkyup", + "뀷": "kkyul", + "뀸": "kkyum", + "뀹": "kkyup", + "뀺": "kkyup", + "뀻": "kkyut", + "뀼": "kkyut", + "뀽": "kkyung", + "뀾": "kkyut", + "뀿": "kkyut", + "끀": "kkyuk", + "끁": "kkyut", + "끂": "kkyup", + "끃": "kkyut", + "끄": "kkeu", + "끅": "kkeuk", + "끆": "kkeukk", + "끇": "kkeuk", + "끈": "kkeun", + "끉": "kkeun", + "끊": "kkeun", + "끋": "kkeut", + "끌": "kkeul", + "끍": "kkeuk", + "끎": "kkeum", + "끏": "kkeup", + "끐": "kkeut", + "끑": "kkeut", + "끒": "kkeup", + "끓": "kkeul", + "끔": "kkeum", + "끕": "kkeup", + "끖": "kkeup", + "끗": "kkeut", + "끘": "kkeut", + "끙": "kkeung", + "끚": "kkeut", + "끛": "kkeut", + "끜": "kkeuk", + "끝": "kkeut", + "끞": "kkeup", + "끟": "kkeut", + "끠": "kkeui", + "끡": "kkeuik", + "끢": "kkeuikk", + "끣": "kkeuik", + "끤": "kkeuin", + "끥": "kkeuin", + "끦": "kkeuin", + "끧": "kkeuit", + "끨": "kkeuil", + "끩": "kkeuik", + "끪": "kkeuim", + "끫": "kkeuip", + "끬": "kkeuit", + "끭": "kkeuit", + "끮": "kkeuip", + "끯": "kkeuil", + "끰": "kkeuim", + "끱": "kkeuip", + "끲": "kkeuip", + "끳": "kkeuit", + "끴": "kkeuit", + "끵": "kkeuing", + "끶": "kkeuit", + "끷": "kkeuit", + "끸": "kkeuik", + "끹": "kkeuit", + "끺": "kkeuip", + "끻": "kkeuit", + "끼": "kki", + "끽": "kkik", + "끾": "kkikk", + "끿": "kkik", + "낀": "kkin", + "낁": "kkin", + "낂": "kkin", + "낃": "kkit", + "낄": "kkil", + "낅": "kkik", + "낆": "kkim", + "낇": "kkip", + "낈": "kkit", + "낉": "kkit", + "낊": "kkip", + "낋": "kkil", + "낌": "kkim", + "낍": "kkip", + "낎": "kkip", + "낏": "kkit", + "낐": "kkit", + "낑": "kking", + "낒": "kkit", + "낓": "kkit", + "낔": "kkik", + "낕": "kkit", + "낖": "kkip", + "낗": "kkit", + "나": "na", + "낙": "nak", + "낚": "nakk", + "낛": "nak", + "난": "nan", + "낝": "nan", + "낞": "nan", + "낟": "nat", + "날": "nal", + "낡": "nak", + "낢": "nam", + "낣": "nap", + "낤": "nat", + "낥": "nat", + "낦": "nap", + "낧": "nal", + "남": "nam", + "납": "nap", + "낪": "nap", + "낫": "nat", + "났": "nat", + "낭": "nang", + "낮": "nat", + "낯": "nat", + "낰": "nak", + "낱": "nat", + "낲": "nap", + "낳": "nat", + "내": "nae", + "낵": "naek", + "낶": "naekk", + "낷": "naek", + "낸": "naen", + "낹": "naen", + "낺": "naen", + "낻": "naet", + "낼": "nael", + "낽": "naek", + "낾": "naem", + "낿": "naep", + "냀": "naet", + "냁": "naet", + "냂": "naep", + "냃": "nael", + "냄": "naem", + "냅": "naep", + "냆": "naep", + "냇": "naet", + "냈": "naet", + "냉": "naeng", + "냊": "naet", + "냋": "naet", + "냌": "naek", + "냍": "naet", + "냎": "naep", + "냏": "naet", + "냐": "nya", + "냑": "nyak", + "냒": "nyakk", + "냓": "nyak", + "냔": "nyan", + "냕": "nyan", + "냖": "nyan", + "냗": "nyat", + "냘": "nyal", + "냙": "nyak", + "냚": "nyam", + "냛": "nyap", + "냜": "nyat", + "냝": "nyat", + "냞": "nyap", + "냟": "nyal", + "냠": "nyam", + "냡": "nyap", + "냢": "nyap", + "냣": "nyat", + "냤": "nyat", + "냥": "nyang", + "냦": "nyat", + "냧": "nyat", + "냨": "nyak", + "냩": "nyat", + "냪": "nyap", + "냫": "nyat", + "냬": "nyae", + "냭": "nyaek", + "냮": "nyaekk", + "냯": "nyaek", + "냰": "nyaen", + "냱": "nyaen", + "냲": "nyaen", + "냳": "nyaet", + "냴": "nyael", + "냵": "nyaek", + "냶": "nyaem", + "냷": "nyaep", + "냸": "nyaet", + "냹": "nyaet", + "냺": "nyaep", + "냻": "nyael", + "냼": "nyaem", + "냽": "nyaep", + "냾": "nyaep", + "냿": "nyaet", + "넀": "nyaet", + "넁": "nyaeng", + "넂": "nyaet", + "넃": "nyaet", + "넄": "nyaek", + "넅": "nyaet", + "넆": "nyaep", + "넇": "nyaet", + "너": "neo", + "넉": "neok", + "넊": "neokk", + "넋": "neok", + "넌": "neon", + "넍": "neon", + "넎": "neon", + "넏": "neot", + "널": "neol", + "넑": "neok", + "넒": "neom", + "넓": "neop", + "넔": "neot", + "넕": "neot", + "넖": "neop", + "넗": "neol", + "넘": "neom", + "넙": "neop", + "넚": "neop", + "넛": "neot", + "넜": "neot", + "넝": "neong", + "넞": "neot", + "넟": "neot", + "넠": "neok", + "넡": "neot", + "넢": "neop", + "넣": "neot", + "네": "ne", + "넥": "nek", + "넦": "nekk", + "넧": "nek", + "넨": "nen", + "넩": "nen", + "넪": "nen", + "넫": "net", + "넬": "nel", + "넭": "nek", + "넮": "nem", + "넯": "nep", + "넰": "net", + "넱": "net", + "넲": "nep", + "넳": "nel", + "넴": "nem", + "넵": "nep", + "넶": "nep", + "넷": "net", + "넸": "net", + "넹": "neng", + "넺": "net", + "넻": "net", + "넼": "nek", + "넽": "net", + "넾": "nep", + "넿": "net", + "녀": "nyeo", + "녁": "nyeok", + "녂": "nyeokk", + "녃": "nyeok", + "년": "nyeon", + "녅": "nyeon", + "녆": "nyeon", + "녇": "nyeot", + "녈": "nyeol", + "녉": "nyeok", + "녊": "nyeom", + "녋": "nyeop", + "녌": "nyeot", + "녍": "nyeot", + "녎": "nyeop", + "녏": "nyeol", + "념": "nyeom", + "녑": "nyeop", + "녒": "nyeop", + "녓": "nyeot", + "녔": "nyeot", + "녕": "nyeong", + "녖": "nyeot", + "녗": "nyeot", + "녘": "nyeok", + "녙": "nyeot", + "녚": "nyeop", + "녛": "nyeot", + "녜": "nye", + "녝": "nyek", + "녞": "nyekk", + "녟": "nyek", + "녠": "nyen", + "녡": "nyen", + "녢": "nyen", + "녣": "nyet", + "녤": "nyel", + "녥": "nyek", + "녦": "nyem", + "녧": "nyep", + "녨": "nyet", + "녩": "nyet", + "녪": "nyep", + "녫": "nyel", + "녬": "nyem", + "녭": "nyep", + "녮": "nyep", + "녯": "nyet", + "녰": "nyet", + "녱": "nyeng", + "녲": "nyet", + "녳": "nyet", + "녴": "nyek", + "녵": "nyet", + "녶": "nyep", + "녷": "nyet", + "노": "no", + "녹": "nok", + "녺": "nokk", + "녻": "nok", + "논": "non", + "녽": "non", + "녾": "non", + "녿": "not", + "놀": "nol", + "놁": "nok", + "놂": "nom", + "놃": "nop", + "놄": "not", + "놅": "not", + "놆": "nop", + "놇": "nol", + "놈": "nom", + "놉": "nop", + "놊": "nop", + "놋": "not", + "놌": "not", + "농": "nong", + "놎": "not", + "놏": "not", + "놐": "nok", + "놑": "not", + "높": "nop", + "놓": "not", + "놔": "nwa", + "놕": "nwak", + "놖": "nwakk", + "놗": "nwak", + "놘": "nwan", + "놙": "nwan", + "놚": "nwan", + "놛": "nwat", + "놜": "nwal", + "놝": "nwak", + "놞": "nwam", + "놟": "nwap", + "놠": "nwat", + "놡": "nwat", + "놢": "nwap", + "놣": "nwal", + "놤": "nwam", + "놥": "nwap", + "놦": "nwap", + "놧": "nwat", + "놨": "nwat", + "놩": "nwang", + "놪": "nwat", + "놫": "nwat", + "놬": "nwak", + "놭": "nwat", + "놮": "nwap", + "놯": "nwat", + "놰": "nwae", + "놱": "nwaek", + "놲": "nwaekk", + "놳": "nwaek", + "놴": "nwaen", + "놵": "nwaen", + "놶": "nwaen", + "놷": "nwaet", + "놸": "nwael", + "놹": "nwaek", + "놺": "nwaem", + "놻": "nwaep", + "놼": "nwaet", + "놽": "nwaet", + "놾": "nwaep", + "놿": "nwael", + "뇀": "nwaem", + "뇁": "nwaep", + "뇂": "nwaep", + "뇃": "nwaet", + "뇄": "nwaet", + "뇅": "nwaeng", + "뇆": "nwaet", + "뇇": "nwaet", + "뇈": "nwaek", + "뇉": "nwaet", + "뇊": "nwaep", + "뇋": "nwaet", + "뇌": "noe", + "뇍": "noek", + "뇎": "noekk", + "뇏": "noek", + "뇐": "noen", + "뇑": "noen", + "뇒": "noen", + "뇓": "noet", + "뇔": "noel", + "뇕": "noek", + "뇖": "noem", + "뇗": "noep", + "뇘": "noet", + "뇙": "noet", + "뇚": "noep", + "뇛": "noel", + "뇜": "noem", + "뇝": "noep", + "뇞": "noep", + "뇟": "noet", + "뇠": "noet", + "뇡": "noeng", + "뇢": "noet", + "뇣": "noet", + "뇤": "noek", + "뇥": "noet", + "뇦": "noep", + "뇧": "noet", + "뇨": "nyo", + "뇩": "nyok", + "뇪": "nyokk", + "뇫": "nyok", + "뇬": "nyon", + "뇭": "nyon", + "뇮": "nyon", + "뇯": "nyot", + "뇰": "nyol", + "뇱": "nyok", + "뇲": "nyom", + "뇳": "nyop", + "뇴": "nyot", + "뇵": "nyot", + "뇶": "nyop", + "뇷": "nyol", + "뇸": "nyom", + "뇹": "nyop", + "뇺": "nyop", + "뇻": "nyot", + "뇼": "nyot", + "뇽": "nyong", + "뇾": "nyot", + "뇿": "nyot", + "눀": "nyok", + "눁": "nyot", + "눂": "nyop", + "눃": "nyot", + "누": "nu", + "눅": "nuk", + "눆": "nukk", + "눇": "nuk", + "눈": "nun", + "눉": "nun", + "눊": "nun", + "눋": "nut", + "눌": "nul", + "눍": "nuk", + "눎": "num", + "눏": "nup", + "눐": "nut", + "눑": "nut", + "눒": "nup", + "눓": "nul", + "눔": "num", + "눕": "nup", + "눖": "nup", + "눗": "nut", + "눘": "nut", + "눙": "nung", + "눚": "nut", + "눛": "nut", + "눜": "nuk", + "눝": "nut", + "눞": "nup", + "눟": "nut", + "눠": "nwo", + "눡": "nwok", + "눢": "nwokk", + "눣": "nwok", + "눤": "nwon", + "눥": "nwon", + "눦": "nwon", + "눧": "nwot", + "눨": "nwol", + "눩": "nwok", + "눪": "nwom", + "눫": "nwop", + "눬": "nwot", + "눭": "nwot", + "눮": "nwop", + "눯": "nwol", + "눰": "nwom", + "눱": "nwop", + "눲": "nwop", + "눳": "nwot", + "눴": "nwot", + "눵": "nwong", + "눶": "nwot", + "눷": "nwot", + "눸": "nwok", + "눹": "nwot", + "눺": "nwop", + "눻": "nwot", + "눼": "nwe", + "눽": "nwek", + "눾": "nwekk", + "눿": "nwek", + "뉀": "nwen", + "뉁": "nwen", + "뉂": "nwen", + "뉃": "nwet", + "뉄": "nwel", + "뉅": "nwek", + "뉆": "nwem", + "뉇": "nwep", + "뉈": "nwet", + "뉉": "nwet", + "뉊": "nwep", + "뉋": "nwel", + "뉌": "nwem", + "뉍": "nwep", + "뉎": "nwep", + "뉏": "nwet", + "뉐": "nwet", + "뉑": "nweng", + "뉒": "nwet", + "뉓": "nwet", + "뉔": "nwek", + "뉕": "nwet", + "뉖": "nwep", + "뉗": "nwet", + "뉘": "nwi", + "뉙": "nwik", + "뉚": "nwikk", + "뉛": "nwik", + "뉜": "nwin", + "뉝": "nwin", + "뉞": "nwin", + "뉟": "nwit", + "뉠": "nwil", + "뉡": "nwik", + "뉢": "nwim", + "뉣": "nwip", + "뉤": "nwit", + "뉥": "nwit", + "뉦": "nwip", + "뉧": "nwil", + "뉨": "nwim", + "뉩": "nwip", + "뉪": "nwip", + "뉫": "nwit", + "뉬": "nwit", + "뉭": "nwing", + "뉮": "nwit", + "뉯": "nwit", + "뉰": "nwik", + "뉱": "nwit", + "뉲": "nwip", + "뉳": "nwit", + "뉴": "nyu", + "뉵": "nyuk", + "뉶": "nyukk", + "뉷": "nyuk", + "뉸": "nyun", + "뉹": "nyun", + "뉺": "nyun", + "뉻": "nyut", + "뉼": "nyul", + "뉽": "nyuk", + "뉾": "nyum", + "뉿": "nyup", + "늀": "nyut", + "늁": "nyut", + "늂": "nyup", + "늃": "nyul", + "늄": "nyum", + "늅": "nyup", + "늆": "nyup", + "늇": "nyut", + "늈": "nyut", + "늉": "nyung", + "늊": "nyut", + "늋": "nyut", + "늌": "nyuk", + "늍": "nyut", + "늎": "nyup", + "늏": "nyut", + "느": "neu", + "늑": "neuk", + "늒": "neukk", + "늓": "neuk", + "는": "neun", + "늕": "neun", + "늖": "neun", + "늗": "neut", + "늘": "neul", + "늙": "neuk", + "늚": "neum", + "늛": "neup", + "늜": "neut", + "늝": "neut", + "늞": "neup", + "늟": "neul", + "늠": "neum", + "늡": "neup", + "늢": "neup", + "늣": "neut", + "늤": "neut", + "능": "neung", + "늦": "neut", + "늧": "neut", + "늨": "neuk", + "늩": "neut", + "늪": "neup", + "늫": "neut", + "늬": "neui", + "늭": "neuik", + "늮": "neuikk", + "늯": "neuik", + "늰": "neuin", + "늱": "neuin", + "늲": "neuin", + "늳": "neuit", + "늴": "neuil", + "늵": "neuik", + "늶": "neuim", + "늷": "neuip", + "늸": "neuit", + "늹": "neuit", + "늺": "neuip", + "늻": "neuil", + "늼": "neuim", + "늽": "neuip", + "늾": "neuip", + "늿": "neuit", + "닀": "neuit", + "닁": "neuing", + "닂": "neuit", + "닃": "neuit", + "닄": "neuik", + "닅": "neuit", + "닆": "neuip", + "닇": "neuit", + "니": "ni", + "닉": "nik", + "닊": "nikk", + "닋": "nik", + "닌": "nin", + "닍": "nin", + "닎": "nin", + "닏": "nit", + "닐": "nil", + "닑": "nik", + "닒": "nim", + "닓": "nip", + "닔": "nit", + "닕": "nit", + "닖": "nip", + "닗": "nil", + "님": "nim", + "닙": "nip", + "닚": "nip", + "닛": "nit", + "닜": "nit", + "닝": "ning", + "닞": "nit", + "닟": "nit", + "닠": "nik", + "닡": "nit", + "닢": "nip", + "닣": "nit", + "다": "da", + "닥": "dak", + "닦": "dakk", + "닧": "dak", + "단": "dan", + "닩": "dan", + "닪": "dan", + "닫": "dat", + "달": "dal", + "닭": "dak", + "닮": "dam", + "닯": "dap", + "닰": "dat", + "닱": "dat", + "닲": "dap", + "닳": "dal", + "담": "dam", + "답": "dap", + "닶": "dap", + "닷": "dat", + "닸": "dat", + "당": "dang", + "닺": "dat", + "닻": "dat", + "닼": "dak", + "닽": "dat", + "닾": "dap", + "닿": "dat", + "대": "dae", + "댁": "daek", + "댂": "daekk", + "댃": "daek", + "댄": "daen", + "댅": "daen", + "댆": "daen", + "댇": "daet", + "댈": "dael", + "댉": "daek", + "댊": "daem", + "댋": "daep", + "댌": "daet", + "댍": "daet", + "댎": "daep", + "댏": "dael", + "댐": "daem", + "댑": "daep", + "댒": "daep", + "댓": "daet", + "댔": "daet", + "댕": "daeng", + "댖": "daet", + "댗": "daet", + "댘": "daek", + "댙": "daet", + "댚": "daep", + "댛": "daet", + "댜": "dya", + "댝": "dyak", + "댞": "dyakk", + "댟": "dyak", + "댠": "dyan", + "댡": "dyan", + "댢": "dyan", + "댣": "dyat", + "댤": "dyal", + "댥": "dyak", + "댦": "dyam", + "댧": "dyap", + "댨": "dyat", + "댩": "dyat", + "댪": "dyap", + "댫": "dyal", + "댬": "dyam", + "댭": "dyap", + "댮": "dyap", + "댯": "dyat", + "댰": "dyat", + "댱": "dyang", + "댲": "dyat", + "댳": "dyat", + "댴": "dyak", + "댵": "dyat", + "댶": "dyap", + "댷": "dyat", + "댸": "dyae", + "댹": "dyaek", + "댺": "dyaekk", + "댻": "dyaek", + "댼": "dyaen", + "댽": "dyaen", + "댾": "dyaen", + "댿": "dyaet", + "덀": "dyael", + "덁": "dyaek", + "덂": "dyaem", + "덃": "dyaep", + "덄": "dyaet", + "덅": "dyaet", + "덆": "dyaep", + "덇": "dyael", + "덈": "dyaem", + "덉": "dyaep", + "덊": "dyaep", + "덋": "dyaet", + "덌": "dyaet", + "덍": "dyaeng", + "덎": "dyaet", + "덏": "dyaet", + "덐": "dyaek", + "덑": "dyaet", + "덒": "dyaep", + "덓": "dyaet", + "더": "deo", + "덕": "deok", + "덖": "deokk", + "덗": "deok", + "던": "deon", + "덙": "deon", + "덚": "deon", + "덛": "deot", + "덜": "deol", + "덝": "deok", + "덞": "deom", + "덟": "deop", + "덠": "deot", + "덡": "deot", + "덢": "deop", + "덣": "deol", + "덤": "deom", + "덥": "deop", + "덦": "deop", + "덧": "deot", + "덨": "deot", + "덩": "deong", + "덪": "deot", + "덫": "deot", + "덬": "deok", + "덭": "deot", + "덮": "deop", + "덯": "deot", + "데": "de", + "덱": "dek", + "덲": "dekk", + "덳": "dek", + "덴": "den", + "덵": "den", + "덶": "den", + "덷": "det", + "델": "del", + "덹": "dek", + "덺": "dem", + "덻": "dep", + "덼": "det", + "덽": "det", + "덾": "dep", + "덿": "del", + "뎀": "dem", + "뎁": "dep", + "뎂": "dep", + "뎃": "det", + "뎄": "det", + "뎅": "deng", + "뎆": "det", + "뎇": "det", + "뎈": "dek", + "뎉": "det", + "뎊": "dep", + "뎋": "det", + "뎌": "dyeo", + "뎍": "dyeok", + "뎎": "dyeokk", + "뎏": "dyeok", + "뎐": "dyeon", + "뎑": "dyeon", + "뎒": "dyeon", + "뎓": "dyeot", + "뎔": "dyeol", + "뎕": "dyeok", + "뎖": "dyeom", + "뎗": "dyeop", + "뎘": "dyeot", + "뎙": "dyeot", + "뎚": "dyeop", + "뎛": "dyeol", + "뎜": "dyeom", + "뎝": "dyeop", + "뎞": "dyeop", + "뎟": "dyeot", + "뎠": "dyeot", + "뎡": "dyeong", + "뎢": "dyeot", + "뎣": "dyeot", + "뎤": "dyeok", + "뎥": "dyeot", + "뎦": "dyeop", + "뎧": "dyeot", + "뎨": "dye", + "뎩": "dyek", + "뎪": "dyekk", + "뎫": "dyek", + "뎬": "dyen", + "뎭": "dyen", + "뎮": "dyen", + "뎯": "dyet", + "뎰": "dyel", + "뎱": "dyek", + "뎲": "dyem", + "뎳": "dyep", + "뎴": "dyet", + "뎵": "dyet", + "뎶": "dyep", + "뎷": "dyel", + "뎸": "dyem", + "뎹": "dyep", + "뎺": "dyep", + "뎻": "dyet", + "뎼": "dyet", + "뎽": "dyeng", + "뎾": "dyet", + "뎿": "dyet", + "돀": "dyek", + "돁": "dyet", + "돂": "dyep", + "돃": "dyet", + "도": "do", + "독": "dok", + "돆": "dokk", + "돇": "dok", + "돈": "don", + "돉": "don", + "돊": "don", + "돋": "dot", + "돌": "dol", + "돍": "dok", + "돎": "dom", + "돏": "dop", + "돐": "dot", + "돑": "dot", + "돒": "dop", + "돓": "dol", + "돔": "dom", + "돕": "dop", + "돖": "dop", + "돗": "dot", + "돘": "dot", + "동": "dong", + "돚": "dot", + "돛": "dot", + "돜": "dok", + "돝": "dot", + "돞": "dop", + "돟": "dot", + "돠": "dwa", + "돡": "dwak", + "돢": "dwakk", + "돣": "dwak", + "돤": "dwan", + "돥": "dwan", + "돦": "dwan", + "돧": "dwat", + "돨": "dwal", + "돩": "dwak", + "돪": "dwam", + "돫": "dwap", + "돬": "dwat", + "돭": "dwat", + "돮": "dwap", + "돯": "dwal", + "돰": "dwam", + "돱": "dwap", + "돲": "dwap", + "돳": "dwat", + "돴": "dwat", + "돵": "dwang", + "돶": "dwat", + "돷": "dwat", + "돸": "dwak", + "돹": "dwat", + "돺": "dwap", + "돻": "dwat", + "돼": "dwae", + "돽": "dwaek", + "돾": "dwaekk", + "돿": "dwaek", + "됀": "dwaen", + "됁": "dwaen", + "됂": "dwaen", + "됃": "dwaet", + "됄": "dwael", + "됅": "dwaek", + "됆": "dwaem", + "됇": "dwaep", + "됈": "dwaet", + "됉": "dwaet", + "됊": "dwaep", + "됋": "dwael", + "됌": "dwaem", + "됍": "dwaep", + "됎": "dwaep", + "됏": "dwaet", + "됐": "dwaet", + "됑": "dwaeng", + "됒": "dwaet", + "됓": "dwaet", + "됔": "dwaek", + "됕": "dwaet", + "됖": "dwaep", + "됗": "dwaet", + "되": "doe", + "됙": "doek", + "됚": "doekk", + "됛": "doek", + "된": "doen", + "됝": "doen", + "됞": "doen", + "됟": "doet", + "될": "doel", + "됡": "doek", + "됢": "doem", + "됣": "doep", + "됤": "doet", + "됥": "doet", + "됦": "doep", + "됧": "doel", + "됨": "doem", + "됩": "doep", + "됪": "doep", + "됫": "doet", + "됬": "doet", + "됭": "doeng", + "됮": "doet", + "됯": "doet", + "됰": "doek", + "됱": "doet", + "됲": "doep", + "됳": "doet", + "됴": "dyo", + "됵": "dyok", + "됶": "dyokk", + "됷": "dyok", + "됸": "dyon", + "됹": "dyon", + "됺": "dyon", + "됻": "dyot", + "됼": "dyol", + "됽": "dyok", + "됾": "dyom", + "됿": "dyop", + "둀": "dyot", + "둁": "dyot", + "둂": "dyop", + "둃": "dyol", + "둄": "dyom", + "둅": "dyop", + "둆": "dyop", + "둇": "dyot", + "둈": "dyot", + "둉": "dyong", + "둊": "dyot", + "둋": "dyot", + "둌": "dyok", + "둍": "dyot", + "둎": "dyop", + "둏": "dyot", + "두": "du", + "둑": "duk", + "둒": "dukk", + "둓": "duk", + "둔": "dun", + "둕": "dun", + "둖": "dun", + "둗": "dut", + "둘": "dul", + "둙": "duk", + "둚": "dum", + "둛": "dup", + "둜": "dut", + "둝": "dut", + "둞": "dup", + "둟": "dul", + "둠": "dum", + "둡": "dup", + "둢": "dup", + "둣": "dut", + "둤": "dut", + "둥": "dung", + "둦": "dut", + "둧": "dut", + "둨": "duk", + "둩": "dut", + "둪": "dup", + "둫": "dut", + "둬": "dwo", + "둭": "dwok", + "둮": "dwokk", + "둯": "dwok", + "둰": "dwon", + "둱": "dwon", + "둲": "dwon", + "둳": "dwot", + "둴": "dwol", + "둵": "dwok", + "둶": "dwom", + "둷": "dwop", + "둸": "dwot", + "둹": "dwot", + "둺": "dwop", + "둻": "dwol", + "둼": "dwom", + "둽": "dwop", + "둾": "dwop", + "둿": "dwot", + "뒀": "dwot", + "뒁": "dwong", + "뒂": "dwot", + "뒃": "dwot", + "뒄": "dwok", + "뒅": "dwot", + "뒆": "dwop", + "뒇": "dwot", + "뒈": "dwe", + "뒉": "dwek", + "뒊": "dwekk", + "뒋": "dwek", + "뒌": "dwen", + "뒍": "dwen", + "뒎": "dwen", + "뒏": "dwet", + "뒐": "dwel", + "뒑": "dwek", + "뒒": "dwem", + "뒓": "dwep", + "뒔": "dwet", + "뒕": "dwet", + "뒖": "dwep", + "뒗": "dwel", + "뒘": "dwem", + "뒙": "dwep", + "뒚": "dwep", + "뒛": "dwet", + "뒜": "dwet", + "뒝": "dweng", + "뒞": "dwet", + "뒟": "dwet", + "뒠": "dwek", + "뒡": "dwet", + "뒢": "dwep", + "뒣": "dwet", + "뒤": "dwi", + "뒥": "dwik", + "뒦": "dwikk", + "뒧": "dwik", + "뒨": "dwin", + "뒩": "dwin", + "뒪": "dwin", + "뒫": "dwit", + "뒬": "dwil", + "뒭": "dwik", + "뒮": "dwim", + "뒯": "dwip", + "뒰": "dwit", + "뒱": "dwit", + "뒲": "dwip", + "뒳": "dwil", + "뒴": "dwim", + "뒵": "dwip", + "뒶": "dwip", + "뒷": "dwit", + "뒸": "dwit", + "뒹": "dwing", + "뒺": "dwit", + "뒻": "dwit", + "뒼": "dwik", + "뒽": "dwit", + "뒾": "dwip", + "뒿": "dwit", + "듀": "dyu", + "듁": "dyuk", + "듂": "dyukk", + "듃": "dyuk", + "듄": "dyun", + "듅": "dyun", + "듆": "dyun", + "듇": "dyut", + "듈": "dyul", + "듉": "dyuk", + "듊": "dyum", + "듋": "dyup", + "듌": "dyut", + "듍": "dyut", + "듎": "dyup", + "듏": "dyul", + "듐": "dyum", + "듑": "dyup", + "듒": "dyup", + "듓": "dyut", + "듔": "dyut", + "듕": "dyung", + "듖": "dyut", + "듗": "dyut", + "듘": "dyuk", + "듙": "dyut", + "듚": "dyup", + "듛": "dyut", + "드": "deu", + "득": "deuk", + "듞": "deukk", + "듟": "deuk", + "든": "deun", + "듡": "deun", + "듢": "deun", + "듣": "deut", + "들": "deul", + "듥": "deuk", + "듦": "deum", + "듧": "deup", + "듨": "deut", + "듩": "deut", + "듪": "deup", + "듫": "deul", + "듬": "deum", + "듭": "deup", + "듮": "deup", + "듯": "deut", + "듰": "deut", + "등": "deung", + "듲": "deut", + "듳": "deut", + "듴": "deuk", + "듵": "deut", + "듶": "deup", + "듷": "deut", + "듸": "deui", + "듹": "deuik", + "듺": "deuikk", + "듻": "deuik", + "듼": "deuin", + "듽": "deuin", + "듾": "deuin", + "듿": "deuit", + "딀": "deuil", + "딁": "deuik", + "딂": "deuim", + "딃": "deuip", + "딄": "deuit", + "딅": "deuit", + "딆": "deuip", + "딇": "deuil", + "딈": "deuim", + "딉": "deuip", + "딊": "deuip", + "딋": "deuit", + "딌": "deuit", + "딍": "deuing", + "딎": "deuit", + "딏": "deuit", + "딐": "deuik", + "딑": "deuit", + "딒": "deuip", + "딓": "deuit", + "디": "di", + "딕": "dik", + "딖": "dikk", + "딗": "dik", + "딘": "din", + "딙": "din", + "딚": "din", + "딛": "dit", + "딜": "dil", + "딝": "dik", + "딞": "dim", + "딟": "dip", + "딠": "dit", + "딡": "dit", + "딢": "dip", + "딣": "dil", + "딤": "dim", + "딥": "dip", + "딦": "dip", + "딧": "dit", + "딨": "dit", + "딩": "ding", + "딪": "dit", + "딫": "dit", + "딬": "dik", + "딭": "dit", + "딮": "dip", + "딯": "dit", + "따": "tta", + "딱": "ttak", + "딲": "ttakk", + "딳": "ttak", + "딴": "ttan", + "딵": "ttan", + "딶": "ttan", + "딷": "ttat", + "딸": "ttal", + "딹": "ttak", + "딺": "ttam", + "딻": "ttap", + "딼": "ttat", + "딽": "ttat", + "딾": "ttap", + "딿": "ttal", + "땀": "ttam", + "땁": "ttap", + "땂": "ttap", + "땃": "ttat", + "땄": "ttat", + "땅": "ttang", + "땆": "ttat", + "땇": "ttat", + "땈": "ttak", + "땉": "ttat", + "땊": "ttap", + "땋": "ttat", + "때": "ttae", + "땍": "ttaek", + "땎": "ttaekk", + "땏": "ttaek", + "땐": "ttaen", + "땑": "ttaen", + "땒": "ttaen", + "땓": "ttaet", + "땔": "ttael", + "땕": "ttaek", + "땖": "ttaem", + "땗": "ttaep", + "땘": "ttaet", + "땙": "ttaet", + "땚": "ttaep", + "땛": "ttael", + "땜": "ttaem", + "땝": "ttaep", + "땞": "ttaep", + "땟": "ttaet", + "땠": "ttaet", + "땡": "ttaeng", + "땢": "ttaet", + "땣": "ttaet", + "땤": "ttaek", + "땥": "ttaet", + "땦": "ttaep", + "땧": "ttaet", + "땨": "ttya", + "땩": "ttyak", + "땪": "ttyakk", + "땫": "ttyak", + "땬": "ttyan", + "땭": "ttyan", + "땮": "ttyan", + "땯": "ttyat", + "땰": "ttyal", + "땱": "ttyak", + "땲": "ttyam", + "땳": "ttyap", + "땴": "ttyat", + "땵": "ttyat", + "땶": "ttyap", + "땷": "ttyal", + "땸": "ttyam", + "땹": "ttyap", + "땺": "ttyap", + "땻": "ttyat", + "땼": "ttyat", + "땽": "ttyang", + "땾": "ttyat", + "땿": "ttyat", + "떀": "ttyak", + "떁": "ttyat", + "떂": "ttyap", + "떃": "ttyat", + "떄": "ttyae", + "떅": "ttyaek", + "떆": "ttyaekk", + "떇": "ttyaek", + "떈": "ttyaen", + "떉": "ttyaen", + "떊": "ttyaen", + "떋": "ttyaet", + "떌": "ttyael", + "떍": "ttyaek", + "떎": "ttyaem", + "떏": "ttyaep", + "떐": "ttyaet", + "떑": "ttyaet", + "떒": "ttyaep", + "떓": "ttyael", + "떔": "ttyaem", + "떕": "ttyaep", + "떖": "ttyaep", + "떗": "ttyaet", + "떘": "ttyaet", + "떙": "ttyaeng", + "떚": "ttyaet", + "떛": "ttyaet", + "떜": "ttyaek", + "떝": "ttyaet", + "떞": "ttyaep", + "떟": "ttyaet", + "떠": "tteo", + "떡": "tteok", + "떢": "tteokk", + "떣": "tteok", + "떤": "tteon", + "떥": "tteon", + "떦": "tteon", + "떧": "tteot", + "떨": "tteol", + "떩": "tteok", + "떪": "tteom", + "떫": "tteop", + "떬": "tteot", + "떭": "tteot", + "떮": "tteop", + "떯": "tteol", + "떰": "tteom", + "떱": "tteop", + "떲": "tteop", + "떳": "tteot", + "떴": "tteot", + "떵": "tteong", + "떶": "tteot", + "떷": "tteot", + "떸": "tteok", + "떹": "tteot", + "떺": "tteop", + "떻": "tteot", + "떼": "tte", + "떽": "ttek", + "떾": "ttekk", + "떿": "ttek", + "뗀": "tten", + "뗁": "tten", + "뗂": "tten", + "뗃": "ttet", + "뗄": "ttel", + "뗅": "ttek", + "뗆": "ttem", + "뗇": "ttep", + "뗈": "ttet", + "뗉": "ttet", + "뗊": "ttep", + "뗋": "ttel", + "뗌": "ttem", + "뗍": "ttep", + "뗎": "ttep", + "뗏": "ttet", + "뗐": "ttet", + "뗑": "tteng", + "뗒": "ttet", + "뗓": "ttet", + "뗔": "ttek", + "뗕": "ttet", + "뗖": "ttep", + "뗗": "ttet", + "뗘": "ttyeo", + "뗙": "ttyeok", + "뗚": "ttyeokk", + "뗛": "ttyeok", + "뗜": "ttyeon", + "뗝": "ttyeon", + "뗞": "ttyeon", + "뗟": "ttyeot", + "뗠": "ttyeol", + "뗡": "ttyeok", + "뗢": "ttyeom", + "뗣": "ttyeop", + "뗤": "ttyeot", + "뗥": "ttyeot", + "뗦": "ttyeop", + "뗧": "ttyeol", + "뗨": "ttyeom", + "뗩": "ttyeop", + "뗪": "ttyeop", + "뗫": "ttyeot", + "뗬": "ttyeot", + "뗭": "ttyeong", + "뗮": "ttyeot", + "뗯": "ttyeot", + "뗰": "ttyeok", + "뗱": "ttyeot", + "뗲": "ttyeop", + "뗳": "ttyeot", + "뗴": "ttye", + "뗵": "ttyek", + "뗶": "ttyekk", + "뗷": "ttyek", + "뗸": "ttyen", + "뗹": "ttyen", + "뗺": "ttyen", + "뗻": "ttyet", + "뗼": "ttyel", + "뗽": "ttyek", + "뗾": "ttyem", + "뗿": "ttyep", + "똀": "ttyet", + "똁": "ttyet", + "똂": "ttyep", + "똃": "ttyel", + "똄": "ttyem", + "똅": "ttyep", + "똆": "ttyep", + "똇": "ttyet", + "똈": "ttyet", + "똉": "ttyeng", + "똊": "ttyet", + "똋": "ttyet", + "똌": "ttyek", + "똍": "ttyet", + "똎": "ttyep", + "똏": "ttyet", + "또": "tto", + "똑": "ttok", + "똒": "ttokk", + "똓": "ttok", + "똔": "tton", + "똕": "tton", + "똖": "tton", + "똗": "ttot", + "똘": "ttol", + "똙": "ttok", + "똚": "ttom", + "똛": "ttop", + "똜": "ttot", + "똝": "ttot", + "똞": "ttop", + "똟": "ttol", + "똠": "ttom", + "똡": "ttop", + "똢": "ttop", + "똣": "ttot", + "똤": "ttot", + "똥": "ttong", + "똦": "ttot", + "똧": "ttot", + "똨": "ttok", + "똩": "ttot", + "똪": "ttop", + "똫": "ttot", + "똬": "ttwa", + "똭": "ttwak", + "똮": "ttwakk", + "똯": "ttwak", + "똰": "ttwan", + "똱": "ttwan", + "똲": "ttwan", + "똳": "ttwat", + "똴": "ttwal", + "똵": "ttwak", + "똶": "ttwam", + "똷": "ttwap", + "똸": "ttwat", + "똹": "ttwat", + "똺": "ttwap", + "똻": "ttwal", + "똼": "ttwam", + "똽": "ttwap", + "똾": "ttwap", + "똿": "ttwat", + "뙀": "ttwat", + "뙁": "ttwang", + "뙂": "ttwat", + "뙃": "ttwat", + "뙄": "ttwak", + "뙅": "ttwat", + "뙆": "ttwap", + "뙇": "ttwat", + "뙈": "ttwae", + "뙉": "ttwaek", + "뙊": "ttwaekk", + "뙋": "ttwaek", + "뙌": "ttwaen", + "뙍": "ttwaen", + "뙎": "ttwaen", + "뙏": "ttwaet", + "뙐": "ttwael", + "뙑": "ttwaek", + "뙒": "ttwaem", + "뙓": "ttwaep", + "뙔": "ttwaet", + "뙕": "ttwaet", + "뙖": "ttwaep", + "뙗": "ttwael", + "뙘": "ttwaem", + "뙙": "ttwaep", + "뙚": "ttwaep", + "뙛": "ttwaet", + "뙜": "ttwaet", + "뙝": "ttwaeng", + "뙞": "ttwaet", + "뙟": "ttwaet", + "뙠": "ttwaek", + "뙡": "ttwaet", + "뙢": "ttwaep", + "뙣": "ttwaet", + "뙤": "ttoe", + "뙥": "ttoek", + "뙦": "ttoekk", + "뙧": "ttoek", + "뙨": "ttoen", + "뙩": "ttoen", + "뙪": "ttoen", + "뙫": "ttoet", + "뙬": "ttoel", + "뙭": "ttoek", + "뙮": "ttoem", + "뙯": "ttoep", + "뙰": "ttoet", + "뙱": "ttoet", + "뙲": "ttoep", + "뙳": "ttoel", + "뙴": "ttoem", + "뙵": "ttoep", + "뙶": "ttoep", + "뙷": "ttoet", + "뙸": "ttoet", + "뙹": "ttoeng", + "뙺": "ttoet", + "뙻": "ttoet", + "뙼": "ttoek", + "뙽": "ttoet", + "뙾": "ttoep", + "뙿": "ttoet", + "뚀": "ttyo", + "뚁": "ttyok", + "뚂": "ttyokk", + "뚃": "ttyok", + "뚄": "ttyon", + "뚅": "ttyon", + "뚆": "ttyon", + "뚇": "ttyot", + "뚈": "ttyol", + "뚉": "ttyok", + "뚊": "ttyom", + "뚋": "ttyop", + "뚌": "ttyot", + "뚍": "ttyot", + "뚎": "ttyop", + "뚏": "ttyol", + "뚐": "ttyom", + "뚑": "ttyop", + "뚒": "ttyop", + "뚓": "ttyot", + "뚔": "ttyot", + "뚕": "ttyong", + "뚖": "ttyot", + "뚗": "ttyot", + "뚘": "ttyok", + "뚙": "ttyot", + "뚚": "ttyop", + "뚛": "ttyot", + "뚜": "ttu", + "뚝": "ttuk", + "뚞": "ttukk", + "뚟": "ttuk", + "뚠": "ttun", + "뚡": "ttun", + "뚢": "ttun", + "뚣": "ttut", + "뚤": "ttul", + "뚥": "ttuk", + "뚦": "ttum", + "뚧": "ttup", + "뚨": "ttut", + "뚩": "ttut", + "뚪": "ttup", + "뚫": "ttul", + "뚬": "ttum", + "뚭": "ttup", + "뚮": "ttup", + "뚯": "ttut", + "뚰": "ttut", + "뚱": "ttung", + "뚲": "ttut", + "뚳": "ttut", + "뚴": "ttuk", + "뚵": "ttut", + "뚶": "ttup", + "뚷": "ttut", + "뚸": "ttwo", + "뚹": "ttwok", + "뚺": "ttwokk", + "뚻": "ttwok", + "뚼": "ttwon", + "뚽": "ttwon", + "뚾": "ttwon", + "뚿": "ttwot", + "뛀": "ttwol", + "뛁": "ttwok", + "뛂": "ttwom", + "뛃": "ttwop", + "뛄": "ttwot", + "뛅": "ttwot", + "뛆": "ttwop", + "뛇": "ttwol", + "뛈": "ttwom", + "뛉": "ttwop", + "뛊": "ttwop", + "뛋": "ttwot", + "뛌": "ttwot", + "뛍": "ttwong", + "뛎": "ttwot", + "뛏": "ttwot", + "뛐": "ttwok", + "뛑": "ttwot", + "뛒": "ttwop", + "뛓": "ttwot", + "뛔": "ttwe", + "뛕": "ttwek", + "뛖": "ttwekk", + "뛗": "ttwek", + "뛘": "ttwen", + "뛙": "ttwen", + "뛚": "ttwen", + "뛛": "ttwet", + "뛜": "ttwel", + "뛝": "ttwek", + "뛞": "ttwem", + "뛟": "ttwep", + "뛠": "ttwet", + "뛡": "ttwet", + "뛢": "ttwep", + "뛣": "ttwel", + "뛤": "ttwem", + "뛥": "ttwep", + "뛦": "ttwep", + "뛧": "ttwet", + "뛨": "ttwet", + "뛩": "ttweng", + "뛪": "ttwet", + "뛫": "ttwet", + "뛬": "ttwek", + "뛭": "ttwet", + "뛮": "ttwep", + "뛯": "ttwet", + "뛰": "ttwi", + "뛱": "ttwik", + "뛲": "ttwikk", + "뛳": "ttwik", + "뛴": "ttwin", + "뛵": "ttwin", + "뛶": "ttwin", + "뛷": "ttwit", + "뛸": "ttwil", + "뛹": "ttwik", + "뛺": "ttwim", + "뛻": "ttwip", + "뛼": "ttwit", + "뛽": "ttwit", + "뛾": "ttwip", + "뛿": "ttwil", + "뜀": "ttwim", + "뜁": "ttwip", + "뜂": "ttwip", + "뜃": "ttwit", + "뜄": "ttwit", + "뜅": "ttwing", + "뜆": "ttwit", + "뜇": "ttwit", + "뜈": "ttwik", + "뜉": "ttwit", + "뜊": "ttwip", + "뜋": "ttwit", + "뜌": "ttyu", + "뜍": "ttyuk", + "뜎": "ttyukk", + "뜏": "ttyuk", + "뜐": "ttyun", + "뜑": "ttyun", + "뜒": "ttyun", + "뜓": "ttyut", + "뜔": "ttyul", + "뜕": "ttyuk", + "뜖": "ttyum", + "뜗": "ttyup", + "뜘": "ttyut", + "뜙": "ttyut", + "뜚": "ttyup", + "뜛": "ttyul", + "뜜": "ttyum", + "뜝": "ttyup", + "뜞": "ttyup", + "뜟": "ttyut", + "뜠": "ttyut", + "뜡": "ttyung", + "뜢": "ttyut", + "뜣": "ttyut", + "뜤": "ttyuk", + "뜥": "ttyut", + "뜦": "ttyup", + "뜧": "ttyut", + "뜨": "tteu", + "뜩": "tteuk", + "뜪": "tteukk", + "뜫": "tteuk", + "뜬": "tteun", + "뜭": "tteun", + "뜮": "tteun", + "뜯": "tteut", + "뜰": "tteul", + "뜱": "tteuk", + "뜲": "tteum", + "뜳": "tteup", + "뜴": "tteut", + "뜵": "tteut", + "뜶": "tteup", + "뜷": "tteul", + "뜸": "tteum", + "뜹": "tteup", + "뜺": "tteup", + "뜻": "tteut", + "뜼": "tteut", + "뜽": "tteung", + "뜾": "tteut", + "뜿": "tteut", + "띀": "tteuk", + "띁": "tteut", + "띂": "tteup", + "띃": "tteut", + "띄": "tteui", + "띅": "tteuik", + "띆": "tteuikk", + "띇": "tteuik", + "띈": "tteuin", + "띉": "tteuin", + "띊": "tteuin", + "띋": "tteuit", + "띌": "tteuil", + "띍": "tteuik", + "띎": "tteuim", + "띏": "tteuip", + "띐": "tteuit", + "띑": "tteuit", + "띒": "tteuip", + "띓": "tteuil", + "띔": "tteuim", + "띕": "tteuip", + "띖": "tteuip", + "띗": "tteuit", + "띘": "tteuit", + "띙": "tteuing", + "띚": "tteuit", + "띛": "tteuit", + "띜": "tteuik", + "띝": "tteuit", + "띞": "tteuip", + "띟": "tteuit", + "띠": "tti", + "띡": "ttik", + "띢": "ttikk", + "띣": "ttik", + "띤": "ttin", + "띥": "ttin", + "띦": "ttin", + "띧": "ttit", + "띨": "ttil", + "띩": "ttik", + "띪": "ttim", + "띫": "ttip", + "띬": "ttit", + "띭": "ttit", + "띮": "ttip", + "띯": "ttil", + "띰": "ttim", + "띱": "ttip", + "띲": "ttip", + "띳": "ttit", + "띴": "ttit", + "띵": "tting", + "띶": "ttit", + "띷": "ttit", + "띸": "ttik", + "띹": "ttit", + "띺": "ttip", + "띻": "ttit", + "라": "ra", + "락": "rak", + "띾": "rakk", + "띿": "rak", + "란": "ran", + "랁": "ran", + "랂": "ran", + "랃": "rat", + "랄": "ral", + "랅": "rak", + "랆": "ram", + "랇": "rap", + "랈": "rat", + "랉": "rat", + "랊": "rap", + "랋": "ral", + "람": "ram", + "랍": "rap", + "랎": "rap", + "랏": "rat", + "랐": "rat", + "랑": "rang", + "랒": "rat", + "랓": "rat", + "랔": "rak", + "랕": "rat", + "랖": "rap", + "랗": "rat", + "래": "rae", + "랙": "raek", + "랚": "raekk", + "랛": "raek", + "랜": "raen", + "랝": "raen", + "랞": "raen", + "랟": "raet", + "랠": "rael", + "랡": "raek", + "랢": "raem", + "랣": "raep", + "랤": "raet", + "랥": "raet", + "랦": "raep", + "랧": "rael", + "램": "raem", + "랩": "raep", + "랪": "raep", + "랫": "raet", + "랬": "raet", + "랭": "raeng", + "랮": "raet", + "랯": "raet", + "랰": "raek", + "랱": "raet", + "랲": "raep", + "랳": "raet", + "랴": "rya", + "략": "ryak", + "랶": "ryakk", + "랷": "ryak", + "랸": "ryan", + "랹": "ryan", + "랺": "ryan", + "랻": "ryat", + "랼": "ryal", + "랽": "ryak", + "랾": "ryam", + "랿": "ryap", + "럀": "ryat", + "럁": "ryat", + "럂": "ryap", + "럃": "ryal", + "럄": "ryam", + "럅": "ryap", + "럆": "ryap", + "럇": "ryat", + "럈": "ryat", + "량": "ryang", + "럊": "ryat", + "럋": "ryat", + "럌": "ryak", + "럍": "ryat", + "럎": "ryap", + "럏": "ryat", + "럐": "ryae", + "럑": "ryaek", + "럒": "ryaekk", + "럓": "ryaek", + "럔": "ryaen", + "럕": "ryaen", + "럖": "ryaen", + "럗": "ryaet", + "럘": "ryael", + "럙": "ryaek", + "럚": "ryaem", + "럛": "ryaep", + "럜": "ryaet", + "럝": "ryaet", + "럞": "ryaep", + "럟": "ryael", + "럠": "ryaem", + "럡": "ryaep", + "럢": "ryaep", + "럣": "ryaet", + "럤": "ryaet", + "럥": "ryaeng", + "럦": "ryaet", + "럧": "ryaet", + "럨": "ryaek", + "럩": "ryaet", + "럪": "ryaep", + "럫": "ryaet", + "러": "reo", + "럭": "reok", + "럮": "reokk", + "럯": "reok", + "런": "reon", + "럱": "reon", + "럲": "reon", + "럳": "reot", + "럴": "reol", + "럵": "reok", + "럶": "reom", + "럷": "reop", + "럸": "reot", + "럹": "reot", + "럺": "reop", + "럻": "reol", + "럼": "reom", + "럽": "reop", + "럾": "reop", + "럿": "reot", + "렀": "reot", + "렁": "reong", + "렂": "reot", + "렃": "reot", + "렄": "reok", + "렅": "reot", + "렆": "reop", + "렇": "reot", + "레": "re", + "렉": "rek", + "렊": "rekk", + "렋": "rek", + "렌": "ren", + "렍": "ren", + "렎": "ren", + "렏": "ret", + "렐": "rel", + "렑": "rek", + "렒": "rem", + "렓": "rep", + "렔": "ret", + "렕": "ret", + "렖": "rep", + "렗": "rel", + "렘": "rem", + "렙": "rep", + "렚": "rep", + "렛": "ret", + "렜": "ret", + "렝": "reng", + "렞": "ret", + "렟": "ret", + "렠": "rek", + "렡": "ret", + "렢": "rep", + "렣": "ret", + "려": "ryeo", + "력": "ryeok", + "렦": "ryeokk", + "렧": "ryeok", + "련": "ryeon", + "렩": "ryeon", + "렪": "ryeon", + "렫": "ryeot", + "렬": "ryeol", + "렭": "ryeok", + "렮": "ryeom", + "렯": "ryeop", + "렰": "ryeot", + "렱": "ryeot", + "렲": "ryeop", + "렳": "ryeol", + "렴": "ryeom", + "렵": "ryeop", + "렶": "ryeop", + "렷": "ryeot", + "렸": "ryeot", + "령": "ryeong", + "렺": "ryeot", + "렻": "ryeot", + "렼": "ryeok", + "렽": "ryeot", + "렾": "ryeop", + "렿": "ryeot", + "례": "rye", + "롁": "ryek", + "롂": "ryekk", + "롃": "ryek", + "롄": "ryen", + "롅": "ryen", + "롆": "ryen", + "롇": "ryet", + "롈": "ryel", + "롉": "ryek", + "롊": "ryem", + "롋": "ryep", + "롌": "ryet", + "롍": "ryet", + "롎": "ryep", + "롏": "ryel", + "롐": "ryem", + "롑": "ryep", + "롒": "ryep", + "롓": "ryet", + "롔": "ryet", + "롕": "ryeng", + "롖": "ryet", + "롗": "ryet", + "롘": "ryek", + "롙": "ryet", + "롚": "ryep", + "롛": "ryet", + "로": "ro", + "록": "rok", + "롞": "rokk", + "롟": "rok", + "론": "ron", + "롡": "ron", + "롢": "ron", + "롣": "rot", + "롤": "rol", + "롥": "rok", + "롦": "rom", + "롧": "rop", + "롨": "rot", + "롩": "rot", + "롪": "rop", + "롫": "rol", + "롬": "rom", + "롭": "rop", + "롮": "rop", + "롯": "rot", + "롰": "rot", + "롱": "rong", + "롲": "rot", + "롳": "rot", + "롴": "rok", + "롵": "rot", + "롶": "rop", + "롷": "rot", + "롸": "rwa", + "롹": "rwak", + "롺": "rwakk", + "롻": "rwak", + "롼": "rwan", + "롽": "rwan", + "롾": "rwan", + "롿": "rwat", + "뢀": "rwal", + "뢁": "rwak", + "뢂": "rwam", + "뢃": "rwap", + "뢄": "rwat", + "뢅": "rwat", + "뢆": "rwap", + "뢇": "rwal", + "뢈": "rwam", + "뢉": "rwap", + "뢊": "rwap", + "뢋": "rwat", + "뢌": "rwat", + "뢍": "rwang", + "뢎": "rwat", + "뢏": "rwat", + "뢐": "rwak", + "뢑": "rwat", + "뢒": "rwap", + "뢓": "rwat", + "뢔": "rwae", + "뢕": "rwaek", + "뢖": "rwaekk", + "뢗": "rwaek", + "뢘": "rwaen", + "뢙": "rwaen", + "뢚": "rwaen", + "뢛": "rwaet", + "뢜": "rwael", + "뢝": "rwaek", + "뢞": "rwaem", + "뢟": "rwaep", + "뢠": "rwaet", + "뢡": "rwaet", + "뢢": "rwaep", + "뢣": "rwael", + "뢤": "rwaem", + "뢥": "rwaep", + "뢦": "rwaep", + "뢧": "rwaet", + "뢨": "rwaet", + "뢩": "rwaeng", + "뢪": "rwaet", + "뢫": "rwaet", + "뢬": "rwaek", + "뢭": "rwaet", + "뢮": "rwaep", + "뢯": "rwaet", + "뢰": "roe", + "뢱": "roek", + "뢲": "roekk", + "뢳": "roek", + "뢴": "roen", + "뢵": "roen", + "뢶": "roen", + "뢷": "roet", + "뢸": "roel", + "뢹": "roek", + "뢺": "roem", + "뢻": "roep", + "뢼": "roet", + "뢽": "roet", + "뢾": "roep", + "뢿": "roel", + "룀": "roem", + "룁": "roep", + "룂": "roep", + "룃": "roet", + "룄": "roet", + "룅": "roeng", + "룆": "roet", + "룇": "roet", + "룈": "roek", + "룉": "roet", + "룊": "roep", + "룋": "roet", + "료": "ryo", + "룍": "ryok", + "룎": "ryokk", + "룏": "ryok", + "룐": "ryon", + "룑": "ryon", + "룒": "ryon", + "룓": "ryot", + "룔": "ryol", + "룕": "ryok", + "룖": "ryom", + "룗": "ryop", + "룘": "ryot", + "룙": "ryot", + "룚": "ryop", + "룛": "ryol", + "룜": "ryom", + "룝": "ryop", + "룞": "ryop", + "룟": "ryot", + "룠": "ryot", + "룡": "ryong", + "룢": "ryot", + "룣": "ryot", + "룤": "ryok", + "룥": "ryot", + "룦": "ryop", + "룧": "ryot", + "루": "ru", + "룩": "ruk", + "룪": "rukk", + "룫": "ruk", + "룬": "run", + "룭": "run", + "룮": "run", + "룯": "rut", + "룰": "rul", + "룱": "ruk", + "룲": "rum", + "룳": "rup", + "룴": "rut", + "룵": "rut", + "룶": "rup", + "룷": "rul", + "룸": "rum", + "룹": "rup", + "룺": "rup", + "룻": "rut", + "룼": "rut", + "룽": "rung", + "룾": "rut", + "룿": "rut", + "뤀": "ruk", + "뤁": "rut", + "뤂": "rup", + "뤃": "rut", + "뤄": "rwo", + "뤅": "rwok", + "뤆": "rwokk", + "뤇": "rwok", + "뤈": "rwon", + "뤉": "rwon", + "뤊": "rwon", + "뤋": "rwot", + "뤌": "rwol", + "뤍": "rwok", + "뤎": "rwom", + "뤏": "rwop", + "뤐": "rwot", + "뤑": "rwot", + "뤒": "rwop", + "뤓": "rwol", + "뤔": "rwom", + "뤕": "rwop", + "뤖": "rwop", + "뤗": "rwot", + "뤘": "rwot", + "뤙": "rwong", + "뤚": "rwot", + "뤛": "rwot", + "뤜": "rwok", + "뤝": "rwot", + "뤞": "rwop", + "뤟": "rwot", + "뤠": "rwe", + "뤡": "rwek", + "뤢": "rwekk", + "뤣": "rwek", + "뤤": "rwen", + "뤥": "rwen", + "뤦": "rwen", + "뤧": "rwet", + "뤨": "rwel", + "뤩": "rwek", + "뤪": "rwem", + "뤫": "rwep", + "뤬": "rwet", + "뤭": "rwet", + "뤮": "rwep", + "뤯": "rwel", + "뤰": "rwem", + "뤱": "rwep", + "뤲": "rwep", + "뤳": "rwet", + "뤴": "rwet", + "뤵": "rweng", + "뤶": "rwet", + "뤷": "rwet", + "뤸": "rwek", + "뤹": "rwet", + "뤺": "rwep", + "뤻": "rwet", + "뤼": "rwi", + "뤽": "rwik", + "뤾": "rwikk", + "뤿": "rwik", + "륀": "rwin", + "륁": "rwin", + "륂": "rwin", + "륃": "rwit", + "륄": "rwil", + "륅": "rwik", + "륆": "rwim", + "륇": "rwip", + "륈": "rwit", + "륉": "rwit", + "륊": "rwip", + "륋": "rwil", + "륌": "rwim", + "륍": "rwip", + "륎": "rwip", + "륏": "rwit", + "륐": "rwit", + "륑": "rwing", + "륒": "rwit", + "륓": "rwit", + "륔": "rwik", + "륕": "rwit", + "륖": "rwip", + "륗": "rwit", + "류": "ryu", + "륙": "ryuk", + "륚": "ryukk", + "륛": "ryuk", + "륜": "ryun", + "륝": "ryun", + "륞": "ryun", + "륟": "ryut", + "률": "ryul", + "륡": "ryuk", + "륢": "ryum", + "륣": "ryup", + "륤": "ryut", + "륥": "ryut", + "륦": "ryup", + "륧": "ryul", + "륨": "ryum", + "륩": "ryup", + "륪": "ryup", + "륫": "ryut", + "륬": "ryut", + "륭": "ryung", + "륮": "ryut", + "륯": "ryut", + "륰": "ryuk", + "륱": "ryut", + "륲": "ryup", + "륳": "ryut", + "르": "reu", + "륵": "reuk", + "륶": "reukk", + "륷": "reuk", + "른": "reun", + "륹": "reun", + "륺": "reun", + "륻": "reut", + "를": "reul", + "륽": "reuk", + "륾": "reum", + "륿": "reup", + "릀": "reut", + "릁": "reut", + "릂": "reup", + "릃": "reul", + "름": "reum", + "릅": "reup", + "릆": "reup", + "릇": "reut", + "릈": "reut", + "릉": "reung", + "릊": "reut", + "릋": "reut", + "릌": "reuk", + "릍": "reut", + "릎": "reup", + "릏": "reut", + "릐": "reui", + "릑": "reuik", + "릒": "reuikk", + "릓": "reuik", + "릔": "reuin", + "릕": "reuin", + "릖": "reuin", + "릗": "reuit", + "릘": "reuil", + "릙": "reuik", + "릚": "reuim", + "릛": "reuip", + "릜": "reuit", + "릝": "reuit", + "릞": "reuip", + "릟": "reuil", + "릠": "reuim", + "릡": "reuip", + "릢": "reuip", + "릣": "reuit", + "릤": "reuit", + "릥": "reuing", + "릦": "reuit", + "릧": "reuit", + "릨": "reuik", + "릩": "reuit", + "릪": "reuip", + "릫": "reuit", + "리": "ri", + "릭": "rik", + "릮": "rikk", + "릯": "rik", + "린": "rin", + "릱": "rin", + "릲": "rin", + "릳": "rit", + "릴": "ril", + "릵": "rik", + "릶": "rim", + "릷": "rip", + "릸": "rit", + "릹": "rit", + "릺": "rip", + "릻": "ril", + "림": "rim", + "립": "rip", + "릾": "rip", + "릿": "rit", + "맀": "rit", + "링": "ring", + "맂": "rit", + "맃": "rit", + "맄": "rik", + "맅": "rit", + "맆": "rip", + "맇": "rit", + "마": "ma", + "막": "mak", + "맊": "makk", + "맋": "mak", + "만": "man", + "맍": "man", + "많": "man", + "맏": "mat", + "말": "mal", + "맑": "mak", + "맒": "mam", + "맓": "map", + "맔": "mat", + "맕": "mat", + "맖": "map", + "맗": "mal", + "맘": "mam", + "맙": "map", + "맚": "map", + "맛": "mat", + "맜": "mat", + "망": "mang", + "맞": "mat", + "맟": "mat", + "맠": "mak", + "맡": "mat", + "맢": "map", + "맣": "mat", + "매": "mae", + "맥": "maek", + "맦": "maekk", + "맧": "maek", + "맨": "maen", + "맩": "maen", + "맪": "maen", + "맫": "maet", + "맬": "mael", + "맭": "maek", + "맮": "maem", + "맯": "maep", + "맰": "maet", + "맱": "maet", + "맲": "maep", + "맳": "mael", + "맴": "maem", + "맵": "maep", + "맶": "maep", + "맷": "maet", + "맸": "maet", + "맹": "maeng", + "맺": "maet", + "맻": "maet", + "맼": "maek", + "맽": "maet", + "맾": "maep", + "맿": "maet", + "먀": "mya", + "먁": "myak", + "먂": "myakk", + "먃": "myak", + "먄": "myan", + "먅": "myan", + "먆": "myan", + "먇": "myat", + "먈": "myal", + "먉": "myak", + "먊": "myam", + "먋": "myap", + "먌": "myat", + "먍": "myat", + "먎": "myap", + "먏": "myal", + "먐": "myam", + "먑": "myap", + "먒": "myap", + "먓": "myat", + "먔": "myat", + "먕": "myang", + "먖": "myat", + "먗": "myat", + "먘": "myak", + "먙": "myat", + "먚": "myap", + "먛": "myat", + "먜": "myae", + "먝": "myaek", + "먞": "myaekk", + "먟": "myaek", + "먠": "myaen", + "먡": "myaen", + "먢": "myaen", + "먣": "myaet", + "먤": "myael", + "먥": "myaek", + "먦": "myaem", + "먧": "myaep", + "먨": "myaet", + "먩": "myaet", + "먪": "myaep", + "먫": "myael", + "먬": "myaem", + "먭": "myaep", + "먮": "myaep", + "먯": "myaet", + "먰": "myaet", + "먱": "myaeng", + "먲": "myaet", + "먳": "myaet", + "먴": "myaek", + "먵": "myaet", + "먶": "myaep", + "먷": "myaet", + "머": "meo", + "먹": "meok", + "먺": "meokk", + "먻": "meok", + "먼": "meon", + "먽": "meon", + "먾": "meon", + "먿": "meot", + "멀": "meol", + "멁": "meok", + "멂": "meom", + "멃": "meop", + "멄": "meot", + "멅": "meot", + "멆": "meop", + "멇": "meol", + "멈": "meom", + "멉": "meop", + "멊": "meop", + "멋": "meot", + "멌": "meot", + "멍": "meong", + "멎": "meot", + "멏": "meot", + "멐": "meok", + "멑": "meot", + "멒": "meop", + "멓": "meot", + "메": "me", + "멕": "mek", + "멖": "mekk", + "멗": "mek", + "멘": "men", + "멙": "men", + "멚": "men", + "멛": "met", + "멜": "mel", + "멝": "mek", + "멞": "mem", + "멟": "mep", + "멠": "met", + "멡": "met", + "멢": "mep", + "멣": "mel", + "멤": "mem", + "멥": "mep", + "멦": "mep", + "멧": "met", + "멨": "met", + "멩": "meng", + "멪": "met", + "멫": "met", + "멬": "mek", + "멭": "met", + "멮": "mep", + "멯": "met", + "며": "myeo", + "멱": "myeok", + "멲": "myeokk", + "멳": "myeok", + "면": "myeon", + "멵": "myeon", + "멶": "myeon", + "멷": "myeot", + "멸": "myeol", + "멹": "myeok", + "멺": "myeom", + "멻": "myeop", + "멼": "myeot", + "멽": "myeot", + "멾": "myeop", + "멿": "myeol", + "몀": "myeom", + "몁": "myeop", + "몂": "myeop", + "몃": "myeot", + "몄": "myeot", + "명": "myeong", + "몆": "myeot", + "몇": "myeot", + "몈": "myeok", + "몉": "myeot", + "몊": "myeop", + "몋": "myeot", + "몌": "mye", + "몍": "myek", + "몎": "myekk", + "몏": "myek", + "몐": "myen", + "몑": "myen", + "몒": "myen", + "몓": "myet", + "몔": "myel", + "몕": "myek", + "몖": "myem", + "몗": "myep", + "몘": "myet", + "몙": "myet", + "몚": "myep", + "몛": "myel", + "몜": "myem", + "몝": "myep", + "몞": "myep", + "몟": "myet", + "몠": "myet", + "몡": "myeng", + "몢": "myet", + "몣": "myet", + "몤": "myek", + "몥": "myet", + "몦": "myep", + "몧": "myet", + "모": "mo", + "목": "mok", + "몪": "mokk", + "몫": "mok", + "몬": "mon", + "몭": "mon", + "몮": "mon", + "몯": "mot", + "몰": "mol", + "몱": "mok", + "몲": "mom", + "몳": "mop", + "몴": "mot", + "몵": "mot", + "몶": "mop", + "몷": "mol", + "몸": "mom", + "몹": "mop", + "몺": "mop", + "못": "mot", + "몼": "mot", + "몽": "mong", + "몾": "mot", + "몿": "mot", + "뫀": "mok", + "뫁": "mot", + "뫂": "mop", + "뫃": "mot", + "뫄": "mwa", + "뫅": "mwak", + "뫆": "mwakk", + "뫇": "mwak", + "뫈": "mwan", + "뫉": "mwan", + "뫊": "mwan", + "뫋": "mwat", + "뫌": "mwal", + "뫍": "mwak", + "뫎": "mwam", + "뫏": "mwap", + "뫐": "mwat", + "뫑": "mwat", + "뫒": "mwap", + "뫓": "mwal", + "뫔": "mwam", + "뫕": "mwap", + "뫖": "mwap", + "뫗": "mwat", + "뫘": "mwat", + "뫙": "mwang", + "뫚": "mwat", + "뫛": "mwat", + "뫜": "mwak", + "뫝": "mwat", + "뫞": "mwap", + "뫟": "mwat", + "뫠": "mwae", + "뫡": "mwaek", + "뫢": "mwaekk", + "뫣": "mwaek", + "뫤": "mwaen", + "뫥": "mwaen", + "뫦": "mwaen", + "뫧": "mwaet", + "뫨": "mwael", + "뫩": "mwaek", + "뫪": "mwaem", + "뫫": "mwaep", + "뫬": "mwaet", + "뫭": "mwaet", + "뫮": "mwaep", + "뫯": "mwael", + "뫰": "mwaem", + "뫱": "mwaep", + "뫲": "mwaep", + "뫳": "mwaet", + "뫴": "mwaet", + "뫵": "mwaeng", + "뫶": "mwaet", + "뫷": "mwaet", + "뫸": "mwaek", + "뫹": "mwaet", + "뫺": "mwaep", + "뫻": "mwaet", + "뫼": "moe", + "뫽": "moek", + "뫾": "moekk", + "뫿": "moek", + "묀": "moen", + "묁": "moen", + "묂": "moen", + "묃": "moet", + "묄": "moel", + "묅": "moek", + "묆": "moem", + "묇": "moep", + "묈": "moet", + "묉": "moet", + "묊": "moep", + "묋": "moel", + "묌": "moem", + "묍": "moep", + "묎": "moep", + "묏": "moet", + "묐": "moet", + "묑": "moeng", + "묒": "moet", + "묓": "moet", + "묔": "moek", + "묕": "moet", + "묖": "moep", + "묗": "moet", + "묘": "myo", + "묙": "myok", + "묚": "myokk", + "묛": "myok", + "묜": "myon", + "묝": "myon", + "묞": "myon", + "묟": "myot", + "묠": "myol", + "묡": "myok", + "묢": "myom", + "묣": "myop", + "묤": "myot", + "묥": "myot", + "묦": "myop", + "묧": "myol", + "묨": "myom", + "묩": "myop", + "묪": "myop", + "묫": "myot", + "묬": "myot", + "묭": "myong", + "묮": "myot", + "묯": "myot", + "묰": "myok", + "묱": "myot", + "묲": "myop", + "묳": "myot", + "무": "mu", + "묵": "muk", + "묶": "mukk", + "묷": "muk", + "문": "mun", + "묹": "mun", + "묺": "mun", + "묻": "mut", + "물": "mul", + "묽": "muk", + "묾": "mum", + "묿": "mup", + "뭀": "mut", + "뭁": "mut", + "뭂": "mup", + "뭃": "mul", + "뭄": "mum", + "뭅": "mup", + "뭆": "mup", + "뭇": "mut", + "뭈": "mut", + "뭉": "mung", + "뭊": "mut", + "뭋": "mut", + "뭌": "muk", + "뭍": "mut", + "뭎": "mup", + "뭏": "mut", + "뭐": "mwo", + "뭑": "mwok", + "뭒": "mwokk", + "뭓": "mwok", + "뭔": "mwon", + "뭕": "mwon", + "뭖": "mwon", + "뭗": "mwot", + "뭘": "mwol", + "뭙": "mwok", + "뭚": "mwom", + "뭛": "mwop", + "뭜": "mwot", + "뭝": "mwot", + "뭞": "mwop", + "뭟": "mwol", + "뭠": "mwom", + "뭡": "mwop", + "뭢": "mwop", + "뭣": "mwot", + "뭤": "mwot", + "뭥": "mwong", + "뭦": "mwot", + "뭧": "mwot", + "뭨": "mwok", + "뭩": "mwot", + "뭪": "mwop", + "뭫": "mwot", + "뭬": "mwe", + "뭭": "mwek", + "뭮": "mwekk", + "뭯": "mwek", + "뭰": "mwen", + "뭱": "mwen", + "뭲": "mwen", + "뭳": "mwet", + "뭴": "mwel", + "뭵": "mwek", + "뭶": "mwem", + "뭷": "mwep", + "뭸": "mwet", + "뭹": "mwet", + "뭺": "mwep", + "뭻": "mwel", + "뭼": "mwem", + "뭽": "mwep", + "뭾": "mwep", + "뭿": "mwet", + "뮀": "mwet", + "뮁": "mweng", + "뮂": "mwet", + "뮃": "mwet", + "뮄": "mwek", + "뮅": "mwet", + "뮆": "mwep", + "뮇": "mwet", + "뮈": "mwi", + "뮉": "mwik", + "뮊": "mwikk", + "뮋": "mwik", + "뮌": "mwin", + "뮍": "mwin", + "뮎": "mwin", + "뮏": "mwit", + "뮐": "mwil", + "뮑": "mwik", + "뮒": "mwim", + "뮓": "mwip", + "뮔": "mwit", + "뮕": "mwit", + "뮖": "mwip", + "뮗": "mwil", + "뮘": "mwim", + "뮙": "mwip", + "뮚": "mwip", + "뮛": "mwit", + "뮜": "mwit", + "뮝": "mwing", + "뮞": "mwit", + "뮟": "mwit", + "뮠": "mwik", + "뮡": "mwit", + "뮢": "mwip", + "뮣": "mwit", + "뮤": "myu", + "뮥": "myuk", + "뮦": "myukk", + "뮧": "myuk", + "뮨": "myun", + "뮩": "myun", + "뮪": "myun", + "뮫": "myut", + "뮬": "myul", + "뮭": "myuk", + "뮮": "myum", + "뮯": "myup", + "뮰": "myut", + "뮱": "myut", + "뮲": "myup", + "뮳": "myul", + "뮴": "myum", + "뮵": "myup", + "뮶": "myup", + "뮷": "myut", + "뮸": "myut", + "뮹": "myung", + "뮺": "myut", + "뮻": "myut", + "뮼": "myuk", + "뮽": "myut", + "뮾": "myup", + "뮿": "myut", + "므": "meu", + "믁": "meuk", + "믂": "meukk", + "믃": "meuk", + "믄": "meun", + "믅": "meun", + "믆": "meun", + "믇": "meut", + "믈": "meul", + "믉": "meuk", + "믊": "meum", + "믋": "meup", + "믌": "meut", + "믍": "meut", + "믎": "meup", + "믏": "meul", + "믐": "meum", + "믑": "meup", + "믒": "meup", + "믓": "meut", + "믔": "meut", + "믕": "meung", + "믖": "meut", + "믗": "meut", + "믘": "meuk", + "믙": "meut", + "믚": "meup", + "믛": "meut", + "믜": "meui", + "믝": "meuik", + "믞": "meuikk", + "믟": "meuik", + "믠": "meuin", + "믡": "meuin", + "믢": "meuin", + "믣": "meuit", + "믤": "meuil", + "믥": "meuik", + "믦": "meuim", + "믧": "meuip", + "믨": "meuit", + "믩": "meuit", + "믪": "meuip", + "믫": "meuil", + "믬": "meuim", + "믭": "meuip", + "믮": "meuip", + "믯": "meuit", + "믰": "meuit", + "믱": "meuing", + "믲": "meuit", + "믳": "meuit", + "믴": "meuik", + "믵": "meuit", + "믶": "meuip", + "믷": "meuit", + "미": "mi", + "믹": "mik", + "믺": "mikk", + "믻": "mik", + "민": "min", + "믽": "min", + "믾": "min", + "믿": "mit", + "밀": "mil", + "밁": "mik", + "밂": "mim", + "밃": "mip", + "밄": "mit", + "밅": "mit", + "밆": "mip", + "밇": "mil", + "밈": "mim", + "밉": "mip", + "밊": "mip", + "밋": "mit", + "밌": "mit", + "밍": "ming", + "밎": "mit", + "및": "mit", + "밐": "mik", + "밑": "mit", + "밒": "mip", + "밓": "mit", + "바": "ba", + "박": "bak", + "밖": "bakk", + "밗": "bak", + "반": "ban", + "밙": "ban", + "밚": "ban", + "받": "bat", + "발": "bal", + "밝": "bak", + "밞": "bam", + "밟": "bap", + "밠": "bat", + "밡": "bat", + "밢": "bap", + "밣": "bal", + "밤": "bam", + "밥": "bap", + "밦": "bap", + "밧": "bat", + "밨": "bat", + "방": "bang", + "밪": "bat", + "밫": "bat", + "밬": "bak", + "밭": "bat", + "밮": "bap", + "밯": "bat", + "배": "bae", + "백": "baek", + "밲": "baekk", + "밳": "baek", + "밴": "baen", + "밵": "baen", + "밶": "baen", + "밷": "baet", + "밸": "bael", + "밹": "baek", + "밺": "baem", + "밻": "baep", + "밼": "baet", + "밽": "baet", + "밾": "baep", + "밿": "bael", + "뱀": "baem", + "뱁": "baep", + "뱂": "baep", + "뱃": "baet", + "뱄": "baet", + "뱅": "baeng", + "뱆": "baet", + "뱇": "baet", + "뱈": "baek", + "뱉": "baet", + "뱊": "baep", + "뱋": "baet", + "뱌": "bya", + "뱍": "byak", + "뱎": "byakk", + "뱏": "byak", + "뱐": "byan", + "뱑": "byan", + "뱒": "byan", + "뱓": "byat", + "뱔": "byal", + "뱕": "byak", + "뱖": "byam", + "뱗": "byap", + "뱘": "byat", + "뱙": "byat", + "뱚": "byap", + "뱛": "byal", + "뱜": "byam", + "뱝": "byap", + "뱞": "byap", + "뱟": "byat", + "뱠": "byat", + "뱡": "byang", + "뱢": "byat", + "뱣": "byat", + "뱤": "byak", + "뱥": "byat", + "뱦": "byap", + "뱧": "byat", + "뱨": "byae", + "뱩": "byaek", + "뱪": "byaekk", + "뱫": "byaek", + "뱬": "byaen", + "뱭": "byaen", + "뱮": "byaen", + "뱯": "byaet", + "뱰": "byael", + "뱱": "byaek", + "뱲": "byaem", + "뱳": "byaep", + "뱴": "byaet", + "뱵": "byaet", + "뱶": "byaep", + "뱷": "byael", + "뱸": "byaem", + "뱹": "byaep", + "뱺": "byaep", + "뱻": "byaet", + "뱼": "byaet", + "뱽": "byaeng", + "뱾": "byaet", + "뱿": "byaet", + "벀": "byaek", + "벁": "byaet", + "벂": "byaep", + "벃": "byaet", + "버": "beo", + "벅": "beok", + "벆": "beokk", + "벇": "beok", + "번": "beon", + "벉": "beon", + "벊": "beon", + "벋": "beot", + "벌": "beol", + "벍": "beok", + "벎": "beom", + "벏": "beop", + "벐": "beot", + "벑": "beot", + "벒": "beop", + "벓": "beol", + "범": "beom", + "법": "beop", + "벖": "beop", + "벗": "beot", + "벘": "beot", + "벙": "beong", + "벚": "beot", + "벛": "beot", + "벜": "beok", + "벝": "beot", + "벞": "beop", + "벟": "beot", + "베": "be", + "벡": "bek", + "벢": "bekk", + "벣": "bek", + "벤": "ben", + "벥": "ben", + "벦": "ben", + "벧": "bet", + "벨": "bel", + "벩": "bek", + "벪": "bem", + "벫": "bep", + "벬": "bet", + "벭": "bet", + "벮": "bep", + "벯": "bel", + "벰": "bem", + "벱": "bep", + "벲": "bep", + "벳": "bet", + "벴": "bet", + "벵": "beng", + "벶": "bet", + "벷": "bet", + "벸": "bek", + "벹": "bet", + "벺": "bep", + "벻": "bet", + "벼": "byeo", + "벽": "byeok", + "벾": "byeokk", + "벿": "byeok", + "변": "byeon", + "볁": "byeon", + "볂": "byeon", + "볃": "byeot", + "별": "byeol", + "볅": "byeok", + "볆": "byeom", + "볇": "byeop", + "볈": "byeot", + "볉": "byeot", + "볊": "byeop", + "볋": "byeol", + "볌": "byeom", + "볍": "byeop", + "볎": "byeop", + "볏": "byeot", + "볐": "byeot", + "병": "byeong", + "볒": "byeot", + "볓": "byeot", + "볔": "byeok", + "볕": "byeot", + "볖": "byeop", + "볗": "byeot", + "볘": "bye", + "볙": "byek", + "볚": "byekk", + "볛": "byek", + "볜": "byen", + "볝": "byen", + "볞": "byen", + "볟": "byet", + "볠": "byel", + "볡": "byek", + "볢": "byem", + "볣": "byep", + "볤": "byet", + "볥": "byet", + "볦": "byep", + "볧": "byel", + "볨": "byem", + "볩": "byep", + "볪": "byep", + "볫": "byet", + "볬": "byet", + "볭": "byeng", + "볮": "byet", + "볯": "byet", + "볰": "byek", + "볱": "byet", + "볲": "byep", + "볳": "byet", + "보": "bo", + "복": "bok", + "볶": "bokk", + "볷": "bok", + "본": "bon", + "볹": "bon", + "볺": "bon", + "볻": "bot", + "볼": "bol", + "볽": "bok", + "볾": "bom", + "볿": "bop", + "봀": "bot", + "봁": "bot", + "봂": "bop", + "봃": "bol", + "봄": "bom", + "봅": "bop", + "봆": "bop", + "봇": "bot", + "봈": "bot", + "봉": "bong", + "봊": "bot", + "봋": "bot", + "봌": "bok", + "봍": "bot", + "봎": "bop", + "봏": "bot", + "봐": "bwa", + "봑": "bwak", + "봒": "bwakk", + "봓": "bwak", + "봔": "bwan", + "봕": "bwan", + "봖": "bwan", + "봗": "bwat", + "봘": "bwal", + "봙": "bwak", + "봚": "bwam", + "봛": "bwap", + "봜": "bwat", + "봝": "bwat", + "봞": "bwap", + "봟": "bwal", + "봠": "bwam", + "봡": "bwap", + "봢": "bwap", + "봣": "bwat", + "봤": "bwat", + "봥": "bwang", + "봦": "bwat", + "봧": "bwat", + "봨": "bwak", + "봩": "bwat", + "봪": "bwap", + "봫": "bwat", + "봬": "bwae", + "봭": "bwaek", + "봮": "bwaekk", + "봯": "bwaek", + "봰": "bwaen", + "봱": "bwaen", + "봲": "bwaen", + "봳": "bwaet", + "봴": "bwael", + "봵": "bwaek", + "봶": "bwaem", + "봷": "bwaep", + "봸": "bwaet", + "봹": "bwaet", + "봺": "bwaep", + "봻": "bwael", + "봼": "bwaem", + "봽": "bwaep", + "봾": "bwaep", + "봿": "bwaet", + "뵀": "bwaet", + "뵁": "bwaeng", + "뵂": "bwaet", + "뵃": "bwaet", + "뵄": "bwaek", + "뵅": "bwaet", + "뵆": "bwaep", + "뵇": "bwaet", + "뵈": "boe", + "뵉": "boek", + "뵊": "boekk", + "뵋": "boek", + "뵌": "boen", + "뵍": "boen", + "뵎": "boen", + "뵏": "boet", + "뵐": "boel", + "뵑": "boek", + "뵒": "boem", + "뵓": "boep", + "뵔": "boet", + "뵕": "boet", + "뵖": "boep", + "뵗": "boel", + "뵘": "boem", + "뵙": "boep", + "뵚": "boep", + "뵛": "boet", + "뵜": "boet", + "뵝": "boeng", + "뵞": "boet", + "뵟": "boet", + "뵠": "boek", + "뵡": "boet", + "뵢": "boep", + "뵣": "boet", + "뵤": "byo", + "뵥": "byok", + "뵦": "byokk", + "뵧": "byok", + "뵨": "byon", + "뵩": "byon", + "뵪": "byon", + "뵫": "byot", + "뵬": "byol", + "뵭": "byok", + "뵮": "byom", + "뵯": "byop", + "뵰": "byot", + "뵱": "byot", + "뵲": "byop", + "뵳": "byol", + "뵴": "byom", + "뵵": "byop", + "뵶": "byop", + "뵷": "byot", + "뵸": "byot", + "뵹": "byong", + "뵺": "byot", + "뵻": "byot", + "뵼": "byok", + "뵽": "byot", + "뵾": "byop", + "뵿": "byot", + "부": "bu", + "북": "buk", + "붂": "bukk", + "붃": "buk", + "분": "bun", + "붅": "bun", + "붆": "bun", + "붇": "but", + "불": "bul", + "붉": "buk", + "붊": "bum", + "붋": "bup", + "붌": "but", + "붍": "but", + "붎": "bup", + "붏": "bul", + "붐": "bum", + "붑": "bup", + "붒": "bup", + "붓": "but", + "붔": "but", + "붕": "bung", + "붖": "but", + "붗": "but", + "붘": "buk", + "붙": "but", + "붚": "bup", + "붛": "but", + "붜": "bwo", + "붝": "bwok", + "붞": "bwokk", + "붟": "bwok", + "붠": "bwon", + "붡": "bwon", + "붢": "bwon", + "붣": "bwot", + "붤": "bwol", + "붥": "bwok", + "붦": "bwom", + "붧": "bwop", + "붨": "bwot", + "붩": "bwot", + "붪": "bwop", + "붫": "bwol", + "붬": "bwom", + "붭": "bwop", + "붮": "bwop", + "붯": "bwot", + "붰": "bwot", + "붱": "bwong", + "붲": "bwot", + "붳": "bwot", + "붴": "bwok", + "붵": "bwot", + "붶": "bwop", + "붷": "bwot", + "붸": "bwe", + "붹": "bwek", + "붺": "bwekk", + "붻": "bwek", + "붼": "bwen", + "붽": "bwen", + "붾": "bwen", + "붿": "bwet", + "뷀": "bwel", + "뷁": "bwek", + "뷂": "bwem", + "뷃": "bwep", + "뷄": "bwet", + "뷅": "bwet", + "뷆": "bwep", + "뷇": "bwel", + "뷈": "bwem", + "뷉": "bwep", + "뷊": "bwep", + "뷋": "bwet", + "뷌": "bwet", + "뷍": "bweng", + "뷎": "bwet", + "뷏": "bwet", + "뷐": "bwek", + "뷑": "bwet", + "뷒": "bwep", + "뷓": "bwet", + "뷔": "bwi", + "뷕": "bwik", + "뷖": "bwikk", + "뷗": "bwik", + "뷘": "bwin", + "뷙": "bwin", + "뷚": "bwin", + "뷛": "bwit", + "뷜": "bwil", + "뷝": "bwik", + "뷞": "bwim", + "뷟": "bwip", + "뷠": "bwit", + "뷡": "bwit", + "뷢": "bwip", + "뷣": "bwil", + "뷤": "bwim", + "뷥": "bwip", + "뷦": "bwip", + "뷧": "bwit", + "뷨": "bwit", + "뷩": "bwing", + "뷪": "bwit", + "뷫": "bwit", + "뷬": "bwik", + "뷭": "bwit", + "뷮": "bwip", + "뷯": "bwit", + "뷰": "byu", + "뷱": "byuk", + "뷲": "byukk", + "뷳": "byuk", + "뷴": "byun", + "뷵": "byun", + "뷶": "byun", + "뷷": "byut", + "뷸": "byul", + "뷹": "byuk", + "뷺": "byum", + "뷻": "byup", + "뷼": "byut", + "뷽": "byut", + "뷾": "byup", + "뷿": "byul", + "븀": "byum", + "븁": "byup", + "븂": "byup", + "븃": "byut", + "븄": "byut", + "븅": "byung", + "븆": "byut", + "븇": "byut", + "븈": "byuk", + "븉": "byut", + "븊": "byup", + "븋": "byut", + "브": "beu", + "븍": "beuk", + "븎": "beukk", + "븏": "beuk", + "븐": "beun", + "븑": "beun", + "븒": "beun", + "븓": "beut", + "블": "beul", + "븕": "beuk", + "븖": "beum", + "븗": "beup", + "븘": "beut", + "븙": "beut", + "븚": "beup", + "븛": "beul", + "븜": "beum", + "븝": "beup", + "븞": "beup", + "븟": "beut", + "븠": "beut", + "븡": "beung", + "븢": "beut", + "븣": "beut", + "븤": "beuk", + "븥": "beut", + "븦": "beup", + "븧": "beut", + "븨": "beui", + "븩": "beuik", + "븪": "beuikk", + "븫": "beuik", + "븬": "beuin", + "븭": "beuin", + "븮": "beuin", + "븯": "beuit", + "븰": "beuil", + "븱": "beuik", + "븲": "beuim", + "븳": "beuip", + "븴": "beuit", + "븵": "beuit", + "븶": "beuip", + "븷": "beuil", + "븸": "beuim", + "븹": "beuip", + "븺": "beuip", + "븻": "beuit", + "븼": "beuit", + "븽": "beuing", + "븾": "beuit", + "븿": "beuit", + "빀": "beuik", + "빁": "beuit", + "빂": "beuip", + "빃": "beuit", + "비": "bi", + "빅": "bik", + "빆": "bikk", + "빇": "bik", + "빈": "bin", + "빉": "bin", + "빊": "bin", + "빋": "bit", + "빌": "bil", + "빍": "bik", + "빎": "bim", + "빏": "bip", + "빐": "bit", + "빑": "bit", + "빒": "bip", + "빓": "bil", + "빔": "bim", + "빕": "bip", + "빖": "bip", + "빗": "bit", + "빘": "bit", + "빙": "bing", + "빚": "bit", + "빛": "bit", + "빜": "bik", + "빝": "bit", + "빞": "bip", + "빟": "bit", + "빠": "ppa", + "빡": "ppak", + "빢": "ppakk", + "빣": "ppak", + "빤": "ppan", + "빥": "ppan", + "빦": "ppan", + "빧": "ppat", + "빨": "ppal", + "빩": "ppak", + "빪": "ppam", + "빫": "ppap", + "빬": "ppat", + "빭": "ppat", + "빮": "ppap", + "빯": "ppal", + "빰": "ppam", + "빱": "ppap", + "빲": "ppap", + "빳": "ppat", + "빴": "ppat", + "빵": "ppang", + "빶": "ppat", + "빷": "ppat", + "빸": "ppak", + "빹": "ppat", + "빺": "ppap", + "빻": "ppat", + "빼": "ppae", + "빽": "ppaek", + "빾": "ppaekk", + "빿": "ppaek", + "뺀": "ppaen", + "뺁": "ppaen", + "뺂": "ppaen", + "뺃": "ppaet", + "뺄": "ppael", + "뺅": "ppaek", + "뺆": "ppaem", + "뺇": "ppaep", + "뺈": "ppaet", + "뺉": "ppaet", + "뺊": "ppaep", + "뺋": "ppael", + "뺌": "ppaem", + "뺍": "ppaep", + "뺎": "ppaep", + "뺏": "ppaet", + "뺐": "ppaet", + "뺑": "ppaeng", + "뺒": "ppaet", + "뺓": "ppaet", + "뺔": "ppaek", + "뺕": "ppaet", + "뺖": "ppaep", + "뺗": "ppaet", + "뺘": "ppya", + "뺙": "ppyak", + "뺚": "ppyakk", + "뺛": "ppyak", + "뺜": "ppyan", + "뺝": "ppyan", + "뺞": "ppyan", + "뺟": "ppyat", + "뺠": "ppyal", + "뺡": "ppyak", + "뺢": "ppyam", + "뺣": "ppyap", + "뺤": "ppyat", + "뺥": "ppyat", + "뺦": "ppyap", + "뺧": "ppyal", + "뺨": "ppyam", + "뺩": "ppyap", + "뺪": "ppyap", + "뺫": "ppyat", + "뺬": "ppyat", + "뺭": "ppyang", + "뺮": "ppyat", + "뺯": "ppyat", + "뺰": "ppyak", + "뺱": "ppyat", + "뺲": "ppyap", + "뺳": "ppyat", + "뺴": "ppyae", + "뺵": "ppyaek", + "뺶": "ppyaekk", + "뺷": "ppyaek", + "뺸": "ppyaen", + "뺹": "ppyaen", + "뺺": "ppyaen", + "뺻": "ppyaet", + "뺼": "ppyael", + "뺽": "ppyaek", + "뺾": "ppyaem", + "뺿": "ppyaep", + "뻀": "ppyaet", + "뻁": "ppyaet", + "뻂": "ppyaep", + "뻃": "ppyael", + "뻄": "ppyaem", + "뻅": "ppyaep", + "뻆": "ppyaep", + "뻇": "ppyaet", + "뻈": "ppyaet", + "뻉": "ppyaeng", + "뻊": "ppyaet", + "뻋": "ppyaet", + "뻌": "ppyaek", + "뻍": "ppyaet", + "뻎": "ppyaep", + "뻏": "ppyaet", + "뻐": "ppeo", + "뻑": "ppeok", + "뻒": "ppeokk", + "뻓": "ppeok", + "뻔": "ppeon", + "뻕": "ppeon", + "뻖": "ppeon", + "뻗": "ppeot", + "뻘": "ppeol", + "뻙": "ppeok", + "뻚": "ppeom", + "뻛": "ppeop", + "뻜": "ppeot", + "뻝": "ppeot", + "뻞": "ppeop", + "뻟": "ppeol", + "뻠": "ppeom", + "뻡": "ppeop", + "뻢": "ppeop", + "뻣": "ppeot", + "뻤": "ppeot", + "뻥": "ppeong", + "뻦": "ppeot", + "뻧": "ppeot", + "뻨": "ppeok", + "뻩": "ppeot", + "뻪": "ppeop", + "뻫": "ppeot", + "뻬": "ppe", + "뻭": "ppek", + "뻮": "ppekk", + "뻯": "ppek", + "뻰": "ppen", + "뻱": "ppen", + "뻲": "ppen", + "뻳": "ppet", + "뻴": "ppel", + "뻵": "ppek", + "뻶": "ppem", + "뻷": "ppep", + "뻸": "ppet", + "뻹": "ppet", + "뻺": "ppep", + "뻻": "ppel", + "뻼": "ppem", + "뻽": "ppep", + "뻾": "ppep", + "뻿": "ppet", + "뼀": "ppet", + "뼁": "ppeng", + "뼂": "ppet", + "뼃": "ppet", + "뼄": "ppek", + "뼅": "ppet", + "뼆": "ppep", + "뼇": "ppet", + "뼈": "ppyeo", + "뼉": "ppyeok", + "뼊": "ppyeokk", + "뼋": "ppyeok", + "뼌": "ppyeon", + "뼍": "ppyeon", + "뼎": "ppyeon", + "뼏": "ppyeot", + "뼐": "ppyeol", + "뼑": "ppyeok", + "뼒": "ppyeom", + "뼓": "ppyeop", + "뼔": "ppyeot", + "뼕": "ppyeot", + "뼖": "ppyeop", + "뼗": "ppyeol", + "뼘": "ppyeom", + "뼙": "ppyeop", + "뼚": "ppyeop", + "뼛": "ppyeot", + "뼜": "ppyeot", + "뼝": "ppyeong", + "뼞": "ppyeot", + "뼟": "ppyeot", + "뼠": "ppyeok", + "뼡": "ppyeot", + "뼢": "ppyeop", + "뼣": "ppyeot", + "뼤": "ppye", + "뼥": "ppyek", + "뼦": "ppyekk", + "뼧": "ppyek", + "뼨": "ppyen", + "뼩": "ppyen", + "뼪": "ppyen", + "뼫": "ppyet", + "뼬": "ppyel", + "뼭": "ppyek", + "뼮": "ppyem", + "뼯": "ppyep", + "뼰": "ppyet", + "뼱": "ppyet", + "뼲": "ppyep", + "뼳": "ppyel", + "뼴": "ppyem", + "뼵": "ppyep", + "뼶": "ppyep", + "뼷": "ppyet", + "뼸": "ppyet", + "뼹": "ppyeng", + "뼺": "ppyet", + "뼻": "ppyet", + "뼼": "ppyek", + "뼽": "ppyet", + "뼾": "ppyep", + "뼿": "ppyet", + "뽀": "ppo", + "뽁": "ppok", + "뽂": "ppokk", + "뽃": "ppok", + "뽄": "ppon", + "뽅": "ppon", + "뽆": "ppon", + "뽇": "ppot", + "뽈": "ppol", + "뽉": "ppok", + "뽊": "ppom", + "뽋": "ppop", + "뽌": "ppot", + "뽍": "ppot", + "뽎": "ppop", + "뽏": "ppol", + "뽐": "ppom", + "뽑": "ppop", + "뽒": "ppop", + "뽓": "ppot", + "뽔": "ppot", + "뽕": "ppong", + "뽖": "ppot", + "뽗": "ppot", + "뽘": "ppok", + "뽙": "ppot", + "뽚": "ppop", + "뽛": "ppot", + "뽜": "ppwa", + "뽝": "ppwak", + "뽞": "ppwakk", + "뽟": "ppwak", + "뽠": "ppwan", + "뽡": "ppwan", + "뽢": "ppwan", + "뽣": "ppwat", + "뽤": "ppwal", + "뽥": "ppwak", + "뽦": "ppwam", + "뽧": "ppwap", + "뽨": "ppwat", + "뽩": "ppwat", + "뽪": "ppwap", + "뽫": "ppwal", + "뽬": "ppwam", + "뽭": "ppwap", + "뽮": "ppwap", + "뽯": "ppwat", + "뽰": "ppwat", + "뽱": "ppwang", + "뽲": "ppwat", + "뽳": "ppwat", + "뽴": "ppwak", + "뽵": "ppwat", + "뽶": "ppwap", + "뽷": "ppwat", + "뽸": "ppwae", + "뽹": "ppwaek", + "뽺": "ppwaekk", + "뽻": "ppwaek", + "뽼": "ppwaen", + "뽽": "ppwaen", + "뽾": "ppwaen", + "뽿": "ppwaet", + "뾀": "ppwael", + "뾁": "ppwaek", + "뾂": "ppwaem", + "뾃": "ppwaep", + "뾄": "ppwaet", + "뾅": "ppwaet", + "뾆": "ppwaep", + "뾇": "ppwael", + "뾈": "ppwaem", + "뾉": "ppwaep", + "뾊": "ppwaep", + "뾋": "ppwaet", + "뾌": "ppwaet", + "뾍": "ppwaeng", + "뾎": "ppwaet", + "뾏": "ppwaet", + "뾐": "ppwaek", + "뾑": "ppwaet", + "뾒": "ppwaep", + "뾓": "ppwaet", + "뾔": "ppoe", + "뾕": "ppoek", + "뾖": "ppoekk", + "뾗": "ppoek", + "뾘": "ppoen", + "뾙": "ppoen", + "뾚": "ppoen", + "뾛": "ppoet", + "뾜": "ppoel", + "뾝": "ppoek", + "뾞": "ppoem", + "뾟": "ppoep", + "뾠": "ppoet", + "뾡": "ppoet", + "뾢": "ppoep", + "뾣": "ppoel", + "뾤": "ppoem", + "뾥": "ppoep", + "뾦": "ppoep", + "뾧": "ppoet", + "뾨": "ppoet", + "뾩": "ppoeng", + "뾪": "ppoet", + "뾫": "ppoet", + "뾬": "ppoek", + "뾭": "ppoet", + "뾮": "ppoep", + "뾯": "ppoet", + "뾰": "ppyo", + "뾱": "ppyok", + "뾲": "ppyokk", + "뾳": "ppyok", + "뾴": "ppyon", + "뾵": "ppyon", + "뾶": "ppyon", + "뾷": "ppyot", + "뾸": "ppyol", + "뾹": "ppyok", + "뾺": "ppyom", + "뾻": "ppyop", + "뾼": "ppyot", + "뾽": "ppyot", + "뾾": "ppyop", + "뾿": "ppyol", + "뿀": "ppyom", + "뿁": "ppyop", + "뿂": "ppyop", + "뿃": "ppyot", + "뿄": "ppyot", + "뿅": "ppyong", + "뿆": "ppyot", + "뿇": "ppyot", + "뿈": "ppyok", + "뿉": "ppyot", + "뿊": "ppyop", + "뿋": "ppyot", + "뿌": "ppu", + "뿍": "ppuk", + "뿎": "ppukk", + "뿏": "ppuk", + "뿐": "ppun", + "뿑": "ppun", + "뿒": "ppun", + "뿓": "pput", + "뿔": "ppul", + "뿕": "ppuk", + "뿖": "ppum", + "뿗": "ppup", + "뿘": "pput", + "뿙": "pput", + "뿚": "ppup", + "뿛": "ppul", + "뿜": "ppum", + "뿝": "ppup", + "뿞": "ppup", + "뿟": "pput", + "뿠": "pput", + "뿡": "ppung", + "뿢": "pput", + "뿣": "pput", + "뿤": "ppuk", + "뿥": "pput", + "뿦": "ppup", + "뿧": "pput", + "뿨": "ppwo", + "뿩": "ppwok", + "뿪": "ppwokk", + "뿫": "ppwok", + "뿬": "ppwon", + "뿭": "ppwon", + "뿮": "ppwon", + "뿯": "ppwot", + "뿰": "ppwol", + "뿱": "ppwok", + "뿲": "ppwom", + "뿳": "ppwop", + "뿴": "ppwot", + "뿵": "ppwot", + "뿶": "ppwop", + "뿷": "ppwol", + "뿸": "ppwom", + "뿹": "ppwop", + "뿺": "ppwop", + "뿻": "ppwot", + "뿼": "ppwot", + "뿽": "ppwong", + "뿾": "ppwot", + "뿿": "ppwot", + "쀀": "ppwok", + "쀁": "ppwot", + "쀂": "ppwop", + "쀃": "ppwot", + "쀄": "ppwe", + "쀅": "ppwek", + "쀆": "ppwekk", + "쀇": "ppwek", + "쀈": "ppwen", + "쀉": "ppwen", + "쀊": "ppwen", + "쀋": "ppwet", + "쀌": "ppwel", + "쀍": "ppwek", + "쀎": "ppwem", + "쀏": "ppwep", + "쀐": "ppwet", + "쀑": "ppwet", + "쀒": "ppwep", + "쀓": "ppwel", + "쀔": "ppwem", + "쀕": "ppwep", + "쀖": "ppwep", + "쀗": "ppwet", + "쀘": "ppwet", + "쀙": "ppweng", + "쀚": "ppwet", + "쀛": "ppwet", + "쀜": "ppwek", + "쀝": "ppwet", + "쀞": "ppwep", + "쀟": "ppwet", + "쀠": "ppwi", + "쀡": "ppwik", + "쀢": "ppwikk", + "쀣": "ppwik", + "쀤": "ppwin", + "쀥": "ppwin", + "쀦": "ppwin", + "쀧": "ppwit", + "쀨": "ppwil", + "쀩": "ppwik", + "쀪": "ppwim", + "쀫": "ppwip", + "쀬": "ppwit", + "쀭": "ppwit", + "쀮": "ppwip", + "쀯": "ppwil", + "쀰": "ppwim", + "쀱": "ppwip", + "쀲": "ppwip", + "쀳": "ppwit", + "쀴": "ppwit", + "쀵": "ppwing", + "쀶": "ppwit", + "쀷": "ppwit", + "쀸": "ppwik", + "쀹": "ppwit", + "쀺": "ppwip", + "쀻": "ppwit", + "쀼": "ppyu", + "쀽": "ppyuk", + "쀾": "ppyukk", + "쀿": "ppyuk", + "쁀": "ppyun", + "쁁": "ppyun", + "쁂": "ppyun", + "쁃": "ppyut", + "쁄": "ppyul", + "쁅": "ppyuk", + "쁆": "ppyum", + "쁇": "ppyup", + "쁈": "ppyut", + "쁉": "ppyut", + "쁊": "ppyup", + "쁋": "ppyul", + "쁌": "ppyum", + "쁍": "ppyup", + "쁎": "ppyup", + "쁏": "ppyut", + "쁐": "ppyut", + "쁑": "ppyung", + "쁒": "ppyut", + "쁓": "ppyut", + "쁔": "ppyuk", + "쁕": "ppyut", + "쁖": "ppyup", + "쁗": "ppyut", + "쁘": "ppeu", + "쁙": "ppeuk", + "쁚": "ppeukk", + "쁛": "ppeuk", + "쁜": "ppeun", + "쁝": "ppeun", + "쁞": "ppeun", + "쁟": "ppeut", + "쁠": "ppeul", + "쁡": "ppeuk", + "쁢": "ppeum", + "쁣": "ppeup", + "쁤": "ppeut", + "쁥": "ppeut", + "쁦": "ppeup", + "쁧": "ppeul", + "쁨": "ppeum", + "쁩": "ppeup", + "쁪": "ppeup", + "쁫": "ppeut", + "쁬": "ppeut", + "쁭": "ppeung", + "쁮": "ppeut", + "쁯": "ppeut", + "쁰": "ppeuk", + "쁱": "ppeut", + "쁲": "ppeup", + "쁳": "ppeut", + "쁴": "ppeui", + "쁵": "ppeuik", + "쁶": "ppeuikk", + "쁷": "ppeuik", + "쁸": "ppeuin", + "쁹": "ppeuin", + "쁺": "ppeuin", + "쁻": "ppeuit", + "쁼": "ppeuil", + "쁽": "ppeuik", + "쁾": "ppeuim", + "쁿": "ppeuip", + "삀": "ppeuit", + "삁": "ppeuit", + "삂": "ppeuip", + "삃": "ppeuil", + "삄": "ppeuim", + "삅": "ppeuip", + "삆": "ppeuip", + "삇": "ppeuit", + "삈": "ppeuit", + "삉": "ppeuing", + "삊": "ppeuit", + "삋": "ppeuit", + "삌": "ppeuik", + "삍": "ppeuit", + "삎": "ppeuip", + "삏": "ppeuit", + "삐": "ppi", + "삑": "ppik", + "삒": "ppikk", + "삓": "ppik", + "삔": "ppin", + "삕": "ppin", + "삖": "ppin", + "삗": "ppit", + "삘": "ppil", + "삙": "ppik", + "삚": "ppim", + "삛": "ppip", + "삜": "ppit", + "삝": "ppit", + "삞": "ppip", + "삟": "ppil", + "삠": "ppim", + "삡": "ppip", + "삢": "ppip", + "삣": "ppit", + "삤": "ppit", + "삥": "pping", + "삦": "ppit", + "삧": "ppit", + "삨": "ppik", + "삩": "ppit", + "삪": "ppip", + "삫": "ppit", + "사": "sa", + "삭": "sak", + "삮": "sakk", + "삯": "sak", + "산": "san", + "삱": "san", + "삲": "san", + "삳": "sat", + "살": "sal", + "삵": "sak", + "삶": "sam", + "삷": "sap", + "삸": "sat", + "삹": "sat", + "삺": "sap", + "삻": "sal", + "삼": "sam", + "삽": "sap", + "삾": "sap", + "삿": "sat", + "샀": "sat", + "상": "sang", + "샂": "sat", + "샃": "sat", + "샄": "sak", + "샅": "sat", + "샆": "sap", + "샇": "sat", + "새": "sae", + "색": "saek", + "샊": "saekk", + "샋": "saek", + "샌": "saen", + "샍": "saen", + "샎": "saen", + "샏": "saet", + "샐": "sael", + "샑": "saek", + "샒": "saem", + "샓": "saep", + "샔": "saet", + "샕": "saet", + "샖": "saep", + "샗": "sael", + "샘": "saem", + "샙": "saep", + "샚": "saep", + "샛": "saet", + "샜": "saet", + "생": "saeng", + "샞": "saet", + "샟": "saet", + "샠": "saek", + "샡": "saet", + "샢": "saep", + "샣": "saet", + "샤": "sya", + "샥": "syak", + "샦": "syakk", + "샧": "syak", + "샨": "syan", + "샩": "syan", + "샪": "syan", + "샫": "syat", + "샬": "syal", + "샭": "syak", + "샮": "syam", + "샯": "syap", + "샰": "syat", + "샱": "syat", + "샲": "syap", + "샳": "syal", + "샴": "syam", + "샵": "syap", + "샶": "syap", + "샷": "syat", + "샸": "syat", + "샹": "syang", + "샺": "syat", + "샻": "syat", + "샼": "syak", + "샽": "syat", + "샾": "syap", + "샿": "syat", + "섀": "syae", + "섁": "syaek", + "섂": "syaekk", + "섃": "syaek", + "섄": "syaen", + "섅": "syaen", + "섆": "syaen", + "섇": "syaet", + "섈": "syael", + "섉": "syaek", + "섊": "syaem", + "섋": "syaep", + "섌": "syaet", + "섍": "syaet", + "섎": "syaep", + "섏": "syael", + "섐": "syaem", + "섑": "syaep", + "섒": "syaep", + "섓": "syaet", + "섔": "syaet", + "섕": "syaeng", + "섖": "syaet", + "섗": "syaet", + "섘": "syaek", + "섙": "syaet", + "섚": "syaep", + "섛": "syaet", + "서": "seo", + "석": "seok", + "섞": "seokk", + "섟": "seok", + "선": "seon", + "섡": "seon", + "섢": "seon", + "섣": "seot", + "설": "seol", + "섥": "seok", + "섦": "seom", + "섧": "seop", + "섨": "seot", + "섩": "seot", + "섪": "seop", + "섫": "seol", + "섬": "seom", + "섭": "seop", + "섮": "seop", + "섯": "seot", + "섰": "seot", + "성": "seong", + "섲": "seot", + "섳": "seot", + "섴": "seok", + "섵": "seot", + "섶": "seop", + "섷": "seot", + "세": "se", + "섹": "sek", + "섺": "sekk", + "섻": "sek", + "센": "sen", + "섽": "sen", + "섾": "sen", + "섿": "set", + "셀": "sel", + "셁": "sek", + "셂": "sem", + "셃": "sep", + "셄": "set", + "셅": "set", + "셆": "sep", + "셇": "sel", + "셈": "sem", + "셉": "sep", + "셊": "sep", + "셋": "set", + "셌": "set", + "셍": "seng", + "셎": "set", + "셏": "set", + "셐": "sek", + "셑": "set", + "셒": "sep", + "셓": "set", + "셔": "syeo", + "셕": "syeok", + "셖": "syeokk", + "셗": "syeok", + "션": "syeon", + "셙": "syeon", + "셚": "syeon", + "셛": "syeot", + "셜": "syeol", + "셝": "syeok", + "셞": "syeom", + "셟": "syeop", + "셠": "syeot", + "셡": "syeot", + "셢": "syeop", + "셣": "syeol", + "셤": "syeom", + "셥": "syeop", + "셦": "syeop", + "셧": "syeot", + "셨": "syeot", + "셩": "syeong", + "셪": "syeot", + "셫": "syeot", + "셬": "syeok", + "셭": "syeot", + "셮": "syeop", + "셯": "syeot", + "셰": "sye", + "셱": "syek", + "셲": "syekk", + "셳": "syek", + "셴": "syen", + "셵": "syen", + "셶": "syen", + "셷": "syet", + "셸": "syel", + "셹": "syek", + "셺": "syem", + "셻": "syep", + "셼": "syet", + "셽": "syet", + "셾": "syep", + "셿": "syel", + "솀": "syem", + "솁": "syep", + "솂": "syep", + "솃": "syet", + "솄": "syet", + "솅": "syeng", + "솆": "syet", + "솇": "syet", + "솈": "syek", + "솉": "syet", + "솊": "syep", + "솋": "syet", + "소": "so", + "속": "sok", + "솎": "sokk", + "솏": "sok", + "손": "son", + "솑": "son", + "솒": "son", + "솓": "sot", + "솔": "sol", + "솕": "sok", + "솖": "som", + "솗": "sop", + "솘": "sot", + "솙": "sot", + "솚": "sop", + "솛": "sol", + "솜": "som", + "솝": "sop", + "솞": "sop", + "솟": "sot", + "솠": "sot", + "송": "song", + "솢": "sot", + "솣": "sot", + "솤": "sok", + "솥": "sot", + "솦": "sop", + "솧": "sot", + "솨": "swa", + "솩": "swak", + "솪": "swakk", + "솫": "swak", + "솬": "swan", + "솭": "swan", + "솮": "swan", + "솯": "swat", + "솰": "swal", + "솱": "swak", + "솲": "swam", + "솳": "swap", + "솴": "swat", + "솵": "swat", + "솶": "swap", + "솷": "swal", + "솸": "swam", + "솹": "swap", + "솺": "swap", + "솻": "swat", + "솼": "swat", + "솽": "swang", + "솾": "swat", + "솿": "swat", + "쇀": "swak", + "쇁": "swat", + "쇂": "swap", + "쇃": "swat", + "쇄": "swae", + "쇅": "swaek", + "쇆": "swaekk", + "쇇": "swaek", + "쇈": "swaen", + "쇉": "swaen", + "쇊": "swaen", + "쇋": "swaet", + "쇌": "swael", + "쇍": "swaek", + "쇎": "swaem", + "쇏": "swaep", + "쇐": "swaet", + "쇑": "swaet", + "쇒": "swaep", + "쇓": "swael", + "쇔": "swaem", + "쇕": "swaep", + "쇖": "swaep", + "쇗": "swaet", + "쇘": "swaet", + "쇙": "swaeng", + "쇚": "swaet", + "쇛": "swaet", + "쇜": "swaek", + "쇝": "swaet", + "쇞": "swaep", + "쇟": "swaet", + "쇠": "soe", + "쇡": "soek", + "쇢": "soekk", + "쇣": "soek", + "쇤": "soen", + "쇥": "soen", + "쇦": "soen", + "쇧": "soet", + "쇨": "soel", + "쇩": "soek", + "쇪": "soem", + "쇫": "soep", + "쇬": "soet", + "쇭": "soet", + "쇮": "soep", + "쇯": "soel", + "쇰": "soem", + "쇱": "soep", + "쇲": "soep", + "쇳": "soet", + "쇴": "soet", + "쇵": "soeng", + "쇶": "soet", + "쇷": "soet", + "쇸": "soek", + "쇹": "soet", + "쇺": "soep", + "쇻": "soet", + "쇼": "syo", + "쇽": "syok", + "쇾": "syokk", + "쇿": "syok", + "숀": "syon", + "숁": "syon", + "숂": "syon", + "숃": "syot", + "숄": "syol", + "숅": "syok", + "숆": "syom", + "숇": "syop", + "숈": "syot", + "숉": "syot", + "숊": "syop", + "숋": "syol", + "숌": "syom", + "숍": "syop", + "숎": "syop", + "숏": "syot", + "숐": "syot", + "숑": "syong", + "숒": "syot", + "숓": "syot", + "숔": "syok", + "숕": "syot", + "숖": "syop", + "숗": "syot", + "수": "su", + "숙": "suk", + "숚": "sukk", + "숛": "suk", + "순": "sun", + "숝": "sun", + "숞": "sun", + "숟": "sut", + "술": "sul", + "숡": "suk", + "숢": "sum", + "숣": "sup", + "숤": "sut", + "숥": "sut", + "숦": "sup", + "숧": "sul", + "숨": "sum", + "숩": "sup", + "숪": "sup", + "숫": "sut", + "숬": "sut", + "숭": "sung", + "숮": "sut", + "숯": "sut", + "숰": "suk", + "숱": "sut", + "숲": "sup", + "숳": "sut", + "숴": "swo", + "숵": "swok", + "숶": "swokk", + "숷": "swok", + "숸": "swon", + "숹": "swon", + "숺": "swon", + "숻": "swot", + "숼": "swol", + "숽": "swok", + "숾": "swom", + "숿": "swop", + "쉀": "swot", + "쉁": "swot", + "쉂": "swop", + "쉃": "swol", + "쉄": "swom", + "쉅": "swop", + "쉆": "swop", + "쉇": "swot", + "쉈": "swot", + "쉉": "swong", + "쉊": "swot", + "쉋": "swot", + "쉌": "swok", + "쉍": "swot", + "쉎": "swop", + "쉏": "swot", + "쉐": "swe", + "쉑": "swek", + "쉒": "swekk", + "쉓": "swek", + "쉔": "swen", + "쉕": "swen", + "쉖": "swen", + "쉗": "swet", + "쉘": "swel", + "쉙": "swek", + "쉚": "swem", + "쉛": "swep", + "쉜": "swet", + "쉝": "swet", + "쉞": "swep", + "쉟": "swel", + "쉠": "swem", + "쉡": "swep", + "쉢": "swep", + "쉣": "swet", + "쉤": "swet", + "쉥": "sweng", + "쉦": "swet", + "쉧": "swet", + "쉨": "swek", + "쉩": "swet", + "쉪": "swep", + "쉫": "swet", + "쉬": "swi", + "쉭": "swik", + "쉮": "swikk", + "쉯": "swik", + "쉰": "swin", + "쉱": "swin", + "쉲": "swin", + "쉳": "swit", + "쉴": "swil", + "쉵": "swik", + "쉶": "swim", + "쉷": "swip", + "쉸": "swit", + "쉹": "swit", + "쉺": "swip", + "쉻": "swil", + "쉼": "swim", + "쉽": "swip", + "쉾": "swip", + "쉿": "swit", + "슀": "swit", + "슁": "swing", + "슂": "swit", + "슃": "swit", + "슄": "swik", + "슅": "swit", + "슆": "swip", + "슇": "swit", + "슈": "syu", + "슉": "syuk", + "슊": "syukk", + "슋": "syuk", + "슌": "syun", + "슍": "syun", + "슎": "syun", + "슏": "syut", + "슐": "syul", + "슑": "syuk", + "슒": "syum", + "슓": "syup", + "슔": "syut", + "슕": "syut", + "슖": "syup", + "슗": "syul", + "슘": "syum", + "슙": "syup", + "슚": "syup", + "슛": "syut", + "슜": "syut", + "슝": "syung", + "슞": "syut", + "슟": "syut", + "슠": "syuk", + "슡": "syut", + "슢": "syup", + "슣": "syut", + "스": "seu", + "슥": "seuk", + "슦": "seukk", + "슧": "seuk", + "슨": "seun", + "슩": "seun", + "슪": "seun", + "슫": "seut", + "슬": "seul", + "슭": "seuk", + "슮": "seum", + "슯": "seup", + "슰": "seut", + "슱": "seut", + "슲": "seup", + "슳": "seul", + "슴": "seum", + "습": "seup", + "슶": "seup", + "슷": "seut", + "슸": "seut", + "승": "seung", + "슺": "seut", + "슻": "seut", + "슼": "seuk", + "슽": "seut", + "슾": "seup", + "슿": "seut", + "싀": "seui", + "싁": "seuik", + "싂": "seuikk", + "싃": "seuik", + "싄": "seuin", + "싅": "seuin", + "싆": "seuin", + "싇": "seuit", + "싈": "seuil", + "싉": "seuik", + "싊": "seuim", + "싋": "seuip", + "싌": "seuit", + "싍": "seuit", + "싎": "seuip", + "싏": "seuil", + "싐": "seuim", + "싑": "seuip", + "싒": "seuip", + "싓": "seuit", + "싔": "seuit", + "싕": "seuing", + "싖": "seuit", + "싗": "seuit", + "싘": "seuik", + "싙": "seuit", + "싚": "seuip", + "싛": "seuit", + "시": "si", + "식": "sik", + "싞": "sikk", + "싟": "sik", + "신": "sin", + "싡": "sin", + "싢": "sin", + "싣": "sit", + "실": "sil", + "싥": "sik", + "싦": "sim", + "싧": "sip", + "싨": "sit", + "싩": "sit", + "싪": "sip", + "싫": "sil", + "심": "sim", + "십": "sip", + "싮": "sip", + "싯": "sit", + "싰": "sit", + "싱": "sing", + "싲": "sit", + "싳": "sit", + "싴": "sik", + "싵": "sit", + "싶": "sip", + "싷": "sit", + "싸": "ssa", + "싹": "ssak", + "싺": "ssakk", + "싻": "ssak", + "싼": "ssan", + "싽": "ssan", + "싾": "ssan", + "싿": "ssat", + "쌀": "ssal", + "쌁": "ssak", + "쌂": "ssam", + "쌃": "ssap", + "쌄": "ssat", + "쌅": "ssat", + "쌆": "ssap", + "쌇": "ssal", + "쌈": "ssam", + "쌉": "ssap", + "쌊": "ssap", + "쌋": "ssat", + "쌌": "ssat", + "쌍": "ssang", + "쌎": "ssat", + "쌏": "ssat", + "쌐": "ssak", + "쌑": "ssat", + "쌒": "ssap", + "쌓": "ssat", + "쌔": "ssae", + "쌕": "ssaek", + "쌖": "ssaekk", + "쌗": "ssaek", + "쌘": "ssaen", + "쌙": "ssaen", + "쌚": "ssaen", + "쌛": "ssaet", + "쌜": "ssael", + "쌝": "ssaek", + "쌞": "ssaem", + "쌟": "ssaep", + "쌠": "ssaet", + "쌡": "ssaet", + "쌢": "ssaep", + "쌣": "ssael", + "쌤": "ssaem", + "쌥": "ssaep", + "쌦": "ssaep", + "쌧": "ssaet", + "쌨": "ssaet", + "쌩": "ssaeng", + "쌪": "ssaet", + "쌫": "ssaet", + "쌬": "ssaek", + "쌭": "ssaet", + "쌮": "ssaep", + "쌯": "ssaet", + "쌰": "ssya", + "쌱": "ssyak", + "쌲": "ssyakk", + "쌳": "ssyak", + "쌴": "ssyan", + "쌵": "ssyan", + "쌶": "ssyan", + "쌷": "ssyat", + "쌸": "ssyal", + "쌹": "ssyak", + "쌺": "ssyam", + "쌻": "ssyap", + "쌼": "ssyat", + "쌽": "ssyat", + "쌾": "ssyap", + "쌿": "ssyal", + "썀": "ssyam", + "썁": "ssyap", + "썂": "ssyap", + "썃": "ssyat", + "썄": "ssyat", + "썅": "ssyang", + "썆": "ssyat", + "썇": "ssyat", + "썈": "ssyak", + "썉": "ssyat", + "썊": "ssyap", + "썋": "ssyat", + "썌": "ssyae", + "썍": "ssyaek", + "썎": "ssyaekk", + "썏": "ssyaek", + "썐": "ssyaen", + "썑": "ssyaen", + "썒": "ssyaen", + "썓": "ssyaet", + "썔": "ssyael", + "썕": "ssyaek", + "썖": "ssyaem", + "썗": "ssyaep", + "썘": "ssyaet", + "썙": "ssyaet", + "썚": "ssyaep", + "썛": "ssyael", + "썜": "ssyaem", + "썝": "ssyaep", + "썞": "ssyaep", + "썟": "ssyaet", + "썠": "ssyaet", + "썡": "ssyaeng", + "썢": "ssyaet", + "썣": "ssyaet", + "썤": "ssyaek", + "썥": "ssyaet", + "썦": "ssyaep", + "썧": "ssyaet", + "써": "sseo", + "썩": "sseok", + "썪": "sseokk", + "썫": "sseok", + "썬": "sseon", + "썭": "sseon", + "썮": "sseon", + "썯": "sseot", + "썰": "sseol", + "썱": "sseok", + "썲": "sseom", + "썳": "sseop", + "썴": "sseot", + "썵": "sseot", + "썶": "sseop", + "썷": "sseol", + "썸": "sseom", + "썹": "sseop", + "썺": "sseop", + "썻": "sseot", + "썼": "sseot", + "썽": "sseong", + "썾": "sseot", + "썿": "sseot", + "쎀": "sseok", + "쎁": "sseot", + "쎂": "sseop", + "쎃": "sseot", + "쎄": "sse", + "쎅": "ssek", + "쎆": "ssekk", + "쎇": "ssek", + "쎈": "ssen", + "쎉": "ssen", + "쎊": "ssen", + "쎋": "sset", + "쎌": "ssel", + "쎍": "ssek", + "쎎": "ssem", + "쎏": "ssep", + "쎐": "sset", + "쎑": "sset", + "쎒": "ssep", + "쎓": "ssel", + "쎔": "ssem", + "쎕": "ssep", + "쎖": "ssep", + "쎗": "sset", + "쎘": "sset", + "쎙": "sseng", + "쎚": "sset", + "쎛": "sset", + "쎜": "ssek", + "쎝": "sset", + "쎞": "ssep", + "쎟": "sset", + "쎠": "ssyeo", + "쎡": "ssyeok", + "쎢": "ssyeokk", + "쎣": "ssyeok", + "쎤": "ssyeon", + "쎥": "ssyeon", + "쎦": "ssyeon", + "쎧": "ssyeot", + "쎨": "ssyeol", + "쎩": "ssyeok", + "쎪": "ssyeom", + "쎫": "ssyeop", + "쎬": "ssyeot", + "쎭": "ssyeot", + "쎮": "ssyeop", + "쎯": "ssyeol", + "쎰": "ssyeom", + "쎱": "ssyeop", + "쎲": "ssyeop", + "쎳": "ssyeot", + "쎴": "ssyeot", + "쎵": "ssyeong", + "쎶": "ssyeot", + "쎷": "ssyeot", + "쎸": "ssyeok", + "쎹": "ssyeot", + "쎺": "ssyeop", + "쎻": "ssyeot", + "쎼": "ssye", + "쎽": "ssyek", + "쎾": "ssyekk", + "쎿": "ssyek", + "쏀": "ssyen", + "쏁": "ssyen", + "쏂": "ssyen", + "쏃": "ssyet", + "쏄": "ssyel", + "쏅": "ssyek", + "쏆": "ssyem", + "쏇": "ssyep", + "쏈": "ssyet", + "쏉": "ssyet", + "쏊": "ssyep", + "쏋": "ssyel", + "쏌": "ssyem", + "쏍": "ssyep", + "쏎": "ssyep", + "쏏": "ssyet", + "쏐": "ssyet", + "쏑": "ssyeng", + "쏒": "ssyet", + "쏓": "ssyet", + "쏔": "ssyek", + "쏕": "ssyet", + "쏖": "ssyep", + "쏗": "ssyet", + "쏘": "sso", + "쏙": "ssok", + "쏚": "ssokk", + "쏛": "ssok", + "쏜": "sson", + "쏝": "sson", + "쏞": "sson", + "쏟": "ssot", + "쏠": "ssol", + "쏡": "ssok", + "쏢": "ssom", + "쏣": "ssop", + "쏤": "ssot", + "쏥": "ssot", + "쏦": "ssop", + "쏧": "ssol", + "쏨": "ssom", + "쏩": "ssop", + "쏪": "ssop", + "쏫": "ssot", + "쏬": "ssot", + "쏭": "ssong", + "쏮": "ssot", + "쏯": "ssot", + "쏰": "ssok", + "쏱": "ssot", + "쏲": "ssop", + "쏳": "ssot", + "쏴": "sswa", + "쏵": "sswak", + "쏶": "sswakk", + "쏷": "sswak", + "쏸": "sswan", + "쏹": "sswan", + "쏺": "sswan", + "쏻": "sswat", + "쏼": "sswal", + "쏽": "sswak", + "쏾": "sswam", + "쏿": "sswap", + "쐀": "sswat", + "쐁": "sswat", + "쐂": "sswap", + "쐃": "sswal", + "쐄": "sswam", + "쐅": "sswap", + "쐆": "sswap", + "쐇": "sswat", + "쐈": "sswat", + "쐉": "sswang", + "쐊": "sswat", + "쐋": "sswat", + "쐌": "sswak", + "쐍": "sswat", + "쐎": "sswap", + "쐏": "sswat", + "쐐": "sswae", + "쐑": "sswaek", + "쐒": "sswaekk", + "쐓": "sswaek", + "쐔": "sswaen", + "쐕": "sswaen", + "쐖": "sswaen", + "쐗": "sswaet", + "쐘": "sswael", + "쐙": "sswaek", + "쐚": "sswaem", + "쐛": "sswaep", + "쐜": "sswaet", + "쐝": "sswaet", + "쐞": "sswaep", + "쐟": "sswael", + "쐠": "sswaem", + "쐡": "sswaep", + "쐢": "sswaep", + "쐣": "sswaet", + "쐤": "sswaet", + "쐥": "sswaeng", + "쐦": "sswaet", + "쐧": "sswaet", + "쐨": "sswaek", + "쐩": "sswaet", + "쐪": "sswaep", + "쐫": "sswaet", + "쐬": "ssoe", + "쐭": "ssoek", + "쐮": "ssoekk", + "쐯": "ssoek", + "쐰": "ssoen", + "쐱": "ssoen", + "쐲": "ssoen", + "쐳": "ssoet", + "쐴": "ssoel", + "쐵": "ssoek", + "쐶": "ssoem", + "쐷": "ssoep", + "쐸": "ssoet", + "쐹": "ssoet", + "쐺": "ssoep", + "쐻": "ssoel", + "쐼": "ssoem", + "쐽": "ssoep", + "쐾": "ssoep", + "쐿": "ssoet", + "쑀": "ssoet", + "쑁": "ssoeng", + "쑂": "ssoet", + "쑃": "ssoet", + "쑄": "ssoek", + "쑅": "ssoet", + "쑆": "ssoep", + "쑇": "ssoet", + "쑈": "ssyo", + "쑉": "ssyok", + "쑊": "ssyokk", + "쑋": "ssyok", + "쑌": "ssyon", + "쑍": "ssyon", + "쑎": "ssyon", + "쑏": "ssyot", + "쑐": "ssyol", + "쑑": "ssyok", + "쑒": "ssyom", + "쑓": "ssyop", + "쑔": "ssyot", + "쑕": "ssyot", + "쑖": "ssyop", + "쑗": "ssyol", + "쑘": "ssyom", + "쑙": "ssyop", + "쑚": "ssyop", + "쑛": "ssyot", + "쑜": "ssyot", + "쑝": "ssyong", + "쑞": "ssyot", + "쑟": "ssyot", + "쑠": "ssyok", + "쑡": "ssyot", + "쑢": "ssyop", + "쑣": "ssyot", + "쑤": "ssu", + "쑥": "ssuk", + "쑦": "ssukk", + "쑧": "ssuk", + "쑨": "ssun", + "쑩": "ssun", + "쑪": "ssun", + "쑫": "ssut", + "쑬": "ssul", + "쑭": "ssuk", + "쑮": "ssum", + "쑯": "ssup", + "쑰": "ssut", + "쑱": "ssut", + "쑲": "ssup", + "쑳": "ssul", + "쑴": "ssum", + "쑵": "ssup", + "쑶": "ssup", + "쑷": "ssut", + "쑸": "ssut", + "쑹": "ssung", + "쑺": "ssut", + "쑻": "ssut", + "쑼": "ssuk", + "쑽": "ssut", + "쑾": "ssup", + "쑿": "ssut", + "쒀": "sswo", + "쒁": "sswok", + "쒂": "sswokk", + "쒃": "sswok", + "쒄": "sswon", + "쒅": "sswon", + "쒆": "sswon", + "쒇": "sswot", + "쒈": "sswol", + "쒉": "sswok", + "쒊": "sswom", + "쒋": "sswop", + "쒌": "sswot", + "쒍": "sswot", + "쒎": "sswop", + "쒏": "sswol", + "쒐": "sswom", + "쒑": "sswop", + "쒒": "sswop", + "쒓": "sswot", + "쒔": "sswot", + "쒕": "sswong", + "쒖": "sswot", + "쒗": "sswot", + "쒘": "sswok", + "쒙": "sswot", + "쒚": "sswop", + "쒛": "sswot", + "쒜": "sswe", + "쒝": "sswek", + "쒞": "sswekk", + "쒟": "sswek", + "쒠": "sswen", + "쒡": "sswen", + "쒢": "sswen", + "쒣": "sswet", + "쒤": "sswel", + "쒥": "sswek", + "쒦": "sswem", + "쒧": "sswep", + "쒨": "sswet", + "쒩": "sswet", + "쒪": "sswep", + "쒫": "sswel", + "쒬": "sswem", + "쒭": "sswep", + "쒮": "sswep", + "쒯": "sswet", + "쒰": "sswet", + "쒱": "ssweng", + "쒲": "sswet", + "쒳": "sswet", + "쒴": "sswek", + "쒵": "sswet", + "쒶": "sswep", + "쒷": "sswet", + "쒸": "sswi", + "쒹": "sswik", + "쒺": "sswikk", + "쒻": "sswik", + "쒼": "sswin", + "쒽": "sswin", + "쒾": "sswin", + "쒿": "sswit", + "쓀": "sswil", + "쓁": "sswik", + "쓂": "sswim", + "쓃": "sswip", + "쓄": "sswit", + "쓅": "sswit", + "쓆": "sswip", + "쓇": "sswil", + "쓈": "sswim", + "쓉": "sswip", + "쓊": "sswip", + "쓋": "sswit", + "쓌": "sswit", + "쓍": "sswing", + "쓎": "sswit", + "쓏": "sswit", + "쓐": "sswik", + "쓑": "sswit", + "쓒": "sswip", + "쓓": "sswit", + "쓔": "ssyu", + "쓕": "ssyuk", + "쓖": "ssyukk", + "쓗": "ssyuk", + "쓘": "ssyun", + "쓙": "ssyun", + "쓚": "ssyun", + "쓛": "ssyut", + "쓜": "ssyul", + "쓝": "ssyuk", + "쓞": "ssyum", + "쓟": "ssyup", + "쓠": "ssyut", + "쓡": "ssyut", + "쓢": "ssyup", + "쓣": "ssyul", + "쓤": "ssyum", + "쓥": "ssyup", + "쓦": "ssyup", + "쓧": "ssyut", + "쓨": "ssyut", + "쓩": "ssyung", + "쓪": "ssyut", + "쓫": "ssyut", + "쓬": "ssyuk", + "쓭": "ssyut", + "쓮": "ssyup", + "쓯": "ssyut", + "쓰": "sseu", + "쓱": "sseuk", + "쓲": "sseukk", + "쓳": "sseuk", + "쓴": "sseun", + "쓵": "sseun", + "쓶": "sseun", + "쓷": "sseut", + "쓸": "sseul", + "쓹": "sseuk", + "쓺": "sseum", + "쓻": "sseup", + "쓼": "sseut", + "쓽": "sseut", + "쓾": "sseup", + "쓿": "sseul", + "씀": "sseum", + "씁": "sseup", + "씂": "sseup", + "씃": "sseut", + "씄": "sseut", + "씅": "sseung", + "씆": "sseut", + "씇": "sseut", + "씈": "sseuk", + "씉": "sseut", + "씊": "sseup", + "씋": "sseut", + "씌": "sseui", + "씍": "sseuik", + "씎": "sseuikk", + "씏": "sseuik", + "씐": "sseuin", + "씑": "sseuin", + "씒": "sseuin", + "씓": "sseuit", + "씔": "sseuil", + "씕": "sseuik", + "씖": "sseuim", + "씗": "sseuip", + "씘": "sseuit", + "씙": "sseuit", + "씚": "sseuip", + "씛": "sseuil", + "씜": "sseuim", + "씝": "sseuip", + "씞": "sseuip", + "씟": "sseuit", + "씠": "sseuit", + "씡": "sseuing", + "씢": "sseuit", + "씣": "sseuit", + "씤": "sseuik", + "씥": "sseuit", + "씦": "sseuip", + "씧": "sseuit", + "씨": "ssi", + "씩": "ssik", + "씪": "ssikk", + "씫": "ssik", + "씬": "ssin", + "씭": "ssin", + "씮": "ssin", + "씯": "ssit", + "씰": "ssil", + "씱": "ssik", + "씲": "ssim", + "씳": "ssip", + "씴": "ssit", + "씵": "ssit", + "씶": "ssip", + "씷": "ssil", + "씸": "ssim", + "씹": "ssip", + "씺": "ssip", + "씻": "ssit", + "씼": "ssit", + "씽": "ssing", + "씾": "ssit", + "씿": "ssit", + "앀": "ssik", + "앁": "ssit", + "앂": "ssip", + "앃": "ssit", + "아": "a", + "악": "ak", + "앆": "akk", + "앇": "ak", + "안": "an", + "앉": "an", + "않": "an", + "앋": "at", + "알": "al", + "앍": "ak", + "앎": "am", + "앏": "ap", + "앐": "at", + "앑": "at", + "앒": "ap", + "앓": "al", + "암": "am", + "압": "ap", + "앖": "ap", + "앗": "at", + "았": "at", + "앙": "ang", + "앚": "at", + "앛": "at", + "앜": "ak", + "앝": "at", + "앞": "ap", + "앟": "at", + "애": "ae", + "액": "aek", + "앢": "aekk", + "앣": "aek", + "앤": "aen", + "앥": "aen", + "앦": "aen", + "앧": "aet", + "앨": "ael", + "앩": "aek", + "앪": "aem", + "앫": "aep", + "앬": "aet", + "앭": "aet", + "앮": "aep", + "앯": "ael", + "앰": "aem", + "앱": "aep", + "앲": "aep", + "앳": "aet", + "앴": "aet", + "앵": "aeng", + "앶": "aet", + "앷": "aet", + "앸": "aek", + "앹": "aet", + "앺": "aep", + "앻": "aet", + "야": "ya", + "약": "yak", + "앾": "yakk", + "앿": "yak", + "얀": "yan", + "얁": "yan", + "얂": "yan", + "얃": "yat", + "얄": "yal", + "얅": "yak", + "얆": "yam", + "얇": "yap", + "얈": "yat", + "얉": "yat", + "얊": "yap", + "얋": "yal", + "얌": "yam", + "얍": "yap", + "얎": "yap", + "얏": "yat", + "얐": "yat", + "양": "yang", + "얒": "yat", + "얓": "yat", + "얔": "yak", + "얕": "yat", + "얖": "yap", + "얗": "yat", + "얘": "yae", + "얙": "yaek", + "얚": "yaekk", + "얛": "yaek", + "얜": "yaen", + "얝": "yaen", + "얞": "yaen", + "얟": "yaet", + "얠": "yael", + "얡": "yaek", + "얢": "yaem", + "얣": "yaep", + "얤": "yaet", + "얥": "yaet", + "얦": "yaep", + "얧": "yael", + "얨": "yaem", + "얩": "yaep", + "얪": "yaep", + "얫": "yaet", + "얬": "yaet", + "얭": "yaeng", + "얮": "yaet", + "얯": "yaet", + "얰": "yaek", + "얱": "yaet", + "얲": "yaep", + "얳": "yaet", + "어": "eo", + "억": "eok", + "얶": "eokk", + "얷": "eok", + "언": "eon", + "얹": "eon", + "얺": "eon", + "얻": "eot", + "얼": "eol", + "얽": "eok", + "얾": "eom", + "얿": "eop", + "엀": "eot", + "엁": "eot", + "엂": "eop", + "엃": "eol", + "엄": "eom", + "업": "eop", + "없": "eop", + "엇": "eot", + "었": "eot", + "엉": "eong", + "엊": "eot", + "엋": "eot", + "엌": "eok", + "엍": "eot", + "엎": "eop", + "엏": "eot", + "에": "e", + "엑": "ek", + "엒": "ekk", + "엓": "ek", + "엔": "en", + "엕": "en", + "엖": "en", + "엗": "et", + "엘": "el", + "엙": "ek", + "엚": "em", + "엛": "ep", + "엜": "et", + "엝": "et", + "엞": "ep", + "엟": "el", + "엠": "em", + "엡": "ep", + "엢": "ep", + "엣": "et", + "엤": "et", + "엥": "eng", + "엦": "et", + "엧": "et", + "엨": "ek", + "엩": "et", + "엪": "ep", + "엫": "et", + "여": "yeo", + "역": "yeok", + "엮": "yeokk", + "엯": "yeok", + "연": "yeon", + "엱": "yeon", + "엲": "yeon", + "엳": "yeot", + "열": "yeol", + "엵": "yeok", + "엶": "yeom", + "엷": "yeop", + "엸": "yeot", + "엹": "yeot", + "엺": "yeop", + "엻": "yeol", + "염": "yeom", + "엽": "yeop", + "엾": "yeop", + "엿": "yeot", + "였": "yeot", + "영": "yeong", + "옂": "yeot", + "옃": "yeot", + "옄": "yeok", + "옅": "yeot", + "옆": "yeop", + "옇": "yeot", + "예": "ye", + "옉": "yek", + "옊": "yekk", + "옋": "yek", + "옌": "yen", + "옍": "yen", + "옎": "yen", + "옏": "yet", + "옐": "yel", + "옑": "yek", + "옒": "yem", + "옓": "yep", + "옔": "yet", + "옕": "yet", + "옖": "yep", + "옗": "yel", + "옘": "yem", + "옙": "yep", + "옚": "yep", + "옛": "yet", + "옜": "yet", + "옝": "yeng", + "옞": "yet", + "옟": "yet", + "옠": "yek", + "옡": "yet", + "옢": "yep", + "옣": "yet", + "오": "o", + "옥": "ok", + "옦": "okk", + "옧": "ok", + "온": "on", + "옩": "on", + "옪": "on", + "옫": "ot", + "올": "ol", + "옭": "ok", + "옮": "om", + "옯": "op", + "옰": "ot", + "옱": "ot", + "옲": "op", + "옳": "ol", + "옴": "om", + "옵": "op", + "옶": "op", + "옷": "ot", + "옸": "ot", + "옹": "ong", + "옺": "ot", + "옻": "ot", + "옼": "ok", + "옽": "ot", + "옾": "op", + "옿": "ot", + "와": "wa", + "왁": "wak", + "왂": "wakk", + "왃": "wak", + "완": "wan", + "왅": "wan", + "왆": "wan", + "왇": "wat", + "왈": "wal", + "왉": "wak", + "왊": "wam", + "왋": "wap", + "왌": "wat", + "왍": "wat", + "왎": "wap", + "왏": "wal", + "왐": "wam", + "왑": "wap", + "왒": "wap", + "왓": "wat", + "왔": "wat", + "왕": "wang", + "왖": "wat", + "왗": "wat", + "왘": "wak", + "왙": "wat", + "왚": "wap", + "왛": "wat", + "왜": "wae", + "왝": "waek", + "왞": "waekk", + "왟": "waek", + "왠": "waen", + "왡": "waen", + "왢": "waen", + "왣": "waet", + "왤": "wael", + "왥": "waek", + "왦": "waem", + "왧": "waep", + "왨": "waet", + "왩": "waet", + "왪": "waep", + "왫": "wael", + "왬": "waem", + "왭": "waep", + "왮": "waep", + "왯": "waet", + "왰": "waet", + "왱": "waeng", + "왲": "waet", + "왳": "waet", + "왴": "waek", + "왵": "waet", + "왶": "waep", + "왷": "waet", + "외": "oe", + "왹": "oek", + "왺": "oekk", + "왻": "oek", + "왼": "oen", + "왽": "oen", + "왾": "oen", + "왿": "oet", + "욀": "oel", + "욁": "oek", + "욂": "oem", + "욃": "oep", + "욄": "oet", + "욅": "oet", + "욆": "oep", + "욇": "oel", + "욈": "oem", + "욉": "oep", + "욊": "oep", + "욋": "oet", + "욌": "oet", + "욍": "oeng", + "욎": "oet", + "욏": "oet", + "욐": "oek", + "욑": "oet", + "욒": "oep", + "욓": "oet", + "요": "yo", + "욕": "yok", + "욖": "yokk", + "욗": "yok", + "욘": "yon", + "욙": "yon", + "욚": "yon", + "욛": "yot", + "욜": "yol", + "욝": "yok", + "욞": "yom", + "욟": "yop", + "욠": "yot", + "욡": "yot", + "욢": "yop", + "욣": "yol", + "욤": "yom", + "욥": "yop", + "욦": "yop", + "욧": "yot", + "욨": "yot", + "용": "yong", + "욪": "yot", + "욫": "yot", + "욬": "yok", + "욭": "yot", + "욮": "yop", + "욯": "yot", + "우": "u", + "욱": "uk", + "욲": "ukk", + "욳": "uk", + "운": "un", + "욵": "un", + "욶": "un", + "욷": "ut", + "울": "ul", + "욹": "uk", + "욺": "um", + "욻": "up", + "욼": "ut", + "욽": "ut", + "욾": "up", + "욿": "ul", + "움": "um", + "웁": "up", + "웂": "up", + "웃": "ut", + "웄": "ut", + "웅": "ung", + "웆": "ut", + "웇": "ut", + "웈": "uk", + "웉": "ut", + "웊": "up", + "웋": "ut", + "워": "wo", + "웍": "wok", + "웎": "wokk", + "웏": "wok", + "원": "won", + "웑": "won", + "웒": "won", + "웓": "wot", + "월": "wol", + "웕": "wok", + "웖": "wom", + "웗": "wop", + "웘": "wot", + "웙": "wot", + "웚": "wop", + "웛": "wol", + "웜": "wom", + "웝": "wop", + "웞": "wop", + "웟": "wot", + "웠": "wot", + "웡": "wong", + "웢": "wot", + "웣": "wot", + "웤": "wok", + "웥": "wot", + "웦": "wop", + "웧": "wot", + "웨": "we", + "웩": "wek", + "웪": "wekk", + "웫": "wek", + "웬": "wen", + "웭": "wen", + "웮": "wen", + "웯": "wet", + "웰": "wel", + "웱": "wek", + "웲": "wem", + "웳": "wep", + "웴": "wet", + "웵": "wet", + "웶": "wep", + "웷": "wel", + "웸": "wem", + "웹": "wep", + "웺": "wep", + "웻": "wet", + "웼": "wet", + "웽": "weng", + "웾": "wet", + "웿": "wet", + "윀": "wek", + "윁": "wet", + "윂": "wep", + "윃": "wet", + "위": "wi", + "윅": "wik", + "윆": "wikk", + "윇": "wik", + "윈": "win", + "윉": "win", + "윊": "win", + "윋": "wit", + "윌": "wil", + "윍": "wik", + "윎": "wim", + "윏": "wip", + "윐": "wit", + "윑": "wit", + "윒": "wip", + "윓": "wil", + "윔": "wim", + "윕": "wip", + "윖": "wip", + "윗": "wit", + "윘": "wit", + "윙": "wing", + "윚": "wit", + "윛": "wit", + "윜": "wik", + "윝": "wit", + "윞": "wip", + "윟": "wit", + "유": "yu", + "육": "yuk", + "윢": "yukk", + "윣": "yuk", + "윤": "yun", + "윥": "yun", + "윦": "yun", + "윧": "yut", + "율": "yul", + "윩": "yuk", + "윪": "yum", + "윫": "yup", + "윬": "yut", + "윭": "yut", + "윮": "yup", + "윯": "yul", + "윰": "yum", + "윱": "yup", + "윲": "yup", + "윳": "yut", + "윴": "yut", + "융": "yung", + "윶": "yut", + "윷": "yut", + "윸": "yuk", + "윹": "yut", + "윺": "yup", + "윻": "yut", + "으": "eu", + "윽": "euk", + "윾": "eukk", + "윿": "euk", + "은": "eun", + "읁": "eun", + "읂": "eun", + "읃": "eut", + "을": "eul", + "읅": "euk", + "읆": "eum", + "읇": "eup", + "읈": "eut", + "읉": "eut", + "읊": "eup", + "읋": "eul", + "음": "eum", + "읍": "eup", + "읎": "eup", + "읏": "eut", + "읐": "eut", + "응": "eung", + "읒": "eut", + "읓": "eut", + "읔": "euk", + "읕": "eut", + "읖": "eup", + "읗": "eut", + "의": "eui", + "읙": "euik", + "읚": "euikk", + "읛": "euik", + "읜": "euin", + "읝": "euin", + "읞": "euin", + "읟": "euit", + "읠": "euil", + "읡": "euik", + "읢": "euim", + "읣": "euip", + "읤": "euit", + "읥": "euit", + "읦": "euip", + "읧": "euil", + "읨": "euim", + "읩": "euip", + "읪": "euip", + "읫": "euit", + "읬": "euit", + "읭": "euing", + "읮": "euit", + "읯": "euit", + "읰": "euik", + "읱": "euit", + "읲": "euip", + "읳": "euit", + "이": "i", + "익": "ik", + "읶": "ikk", + "읷": "ik", + "인": "in", + "읹": "in", + "읺": "in", + "읻": "it", + "일": "il", + "읽": "ik", + "읾": "im", + "읿": "ip", + "잀": "it", + "잁": "it", + "잂": "ip", + "잃": "il", + "임": "im", + "입": "ip", + "잆": "ip", + "잇": "it", + "있": "it", + "잉": "ing", + "잊": "it", + "잋": "it", + "잌": "ik", + "잍": "it", + "잎": "ip", + "잏": "it", + "자": "ja", + "작": "jak", + "잒": "jakk", + "잓": "jak", + "잔": "jan", + "잕": "jan", + "잖": "jan", + "잗": "jat", + "잘": "jal", + "잙": "jak", + "잚": "jam", + "잛": "jap", + "잜": "jat", + "잝": "jat", + "잞": "jap", + "잟": "jal", + "잠": "jam", + "잡": "jap", + "잢": "jap", + "잣": "jat", + "잤": "jat", + "장": "jang", + "잦": "jat", + "잧": "jat", + "잨": "jak", + "잩": "jat", + "잪": "jap", + "잫": "jat", + "재": "jae", + "잭": "jaek", + "잮": "jaekk", + "잯": "jaek", + "잰": "jaen", + "잱": "jaen", + "잲": "jaen", + "잳": "jaet", + "잴": "jael", + "잵": "jaek", + "잶": "jaem", + "잷": "jaep", + "잸": "jaet", + "잹": "jaet", + "잺": "jaep", + "잻": "jael", + "잼": "jaem", + "잽": "jaep", + "잾": "jaep", + "잿": "jaet", + "쟀": "jaet", + "쟁": "jaeng", + "쟂": "jaet", + "쟃": "jaet", + "쟄": "jaek", + "쟅": "jaet", + "쟆": "jaep", + "쟇": "jaet", + "쟈": "jya", + "쟉": "jyak", + "쟊": "jyakk", + "쟋": "jyak", + "쟌": "jyan", + "쟍": "jyan", + "쟎": "jyan", + "쟏": "jyat", + "쟐": "jyal", + "쟑": "jyak", + "쟒": "jyam", + "쟓": "jyap", + "쟔": "jyat", + "쟕": "jyat", + "쟖": "jyap", + "쟗": "jyal", + "쟘": "jyam", + "쟙": "jyap", + "쟚": "jyap", + "쟛": "jyat", + "쟜": "jyat", + "쟝": "jyang", + "쟞": "jyat", + "쟟": "jyat", + "쟠": "jyak", + "쟡": "jyat", + "쟢": "jyap", + "쟣": "jyat", + "쟤": "jyae", + "쟥": "jyaek", + "쟦": "jyaekk", + "쟧": "jyaek", + "쟨": "jyaen", + "쟩": "jyaen", + "쟪": "jyaen", + "쟫": "jyaet", + "쟬": "jyael", + "쟭": "jyaek", + "쟮": "jyaem", + "쟯": "jyaep", + "쟰": "jyaet", + "쟱": "jyaet", + "쟲": "jyaep", + "쟳": "jyael", + "쟴": "jyaem", + "쟵": "jyaep", + "쟶": "jyaep", + "쟷": "jyaet", + "쟸": "jyaet", + "쟹": "jyaeng", + "쟺": "jyaet", + "쟻": "jyaet", + "쟼": "jyaek", + "쟽": "jyaet", + "쟾": "jyaep", + "쟿": "jyaet", + "저": "jeo", + "적": "jeok", + "젂": "jeokk", + "젃": "jeok", + "전": "jeon", + "젅": "jeon", + "젆": "jeon", + "젇": "jeot", + "절": "jeol", + "젉": "jeok", + "젊": "jeom", + "젋": "jeop", + "젌": "jeot", + "젍": "jeot", + "젎": "jeop", + "젏": "jeol", + "점": "jeom", + "접": "jeop", + "젒": "jeop", + "젓": "jeot", + "젔": "jeot", + "정": "jeong", + "젖": "jeot", + "젗": "jeot", + "젘": "jeok", + "젙": "jeot", + "젚": "jeop", + "젛": "jeot", + "제": "je", + "젝": "jek", + "젞": "jekk", + "젟": "jek", + "젠": "jen", + "젡": "jen", + "젢": "jen", + "젣": "jet", + "젤": "jel", + "젥": "jek", + "젦": "jem", + "젧": "jep", + "젨": "jet", + "젩": "jet", + "젪": "jep", + "젫": "jel", + "젬": "jem", + "젭": "jep", + "젮": "jep", + "젯": "jet", + "젰": "jet", + "젱": "jeng", + "젲": "jet", + "젳": "jet", + "젴": "jek", + "젵": "jet", + "젶": "jep", + "젷": "jet", + "져": "jyeo", + "젹": "jyeok", + "젺": "jyeokk", + "젻": "jyeok", + "젼": "jyeon", + "젽": "jyeon", + "젾": "jyeon", + "젿": "jyeot", + "졀": "jyeol", + "졁": "jyeok", + "졂": "jyeom", + "졃": "jyeop", + "졄": "jyeot", + "졅": "jyeot", + "졆": "jyeop", + "졇": "jyeol", + "졈": "jyeom", + "졉": "jyeop", + "졊": "jyeop", + "졋": "jyeot", + "졌": "jyeot", + "졍": "jyeong", + "졎": "jyeot", + "졏": "jyeot", + "졐": "jyeok", + "졑": "jyeot", + "졒": "jyeop", + "졓": "jyeot", + "졔": "jye", + "졕": "jyek", + "졖": "jyekk", + "졗": "jyek", + "졘": "jyen", + "졙": "jyen", + "졚": "jyen", + "졛": "jyet", + "졜": "jyel", + "졝": "jyek", + "졞": "jyem", + "졟": "jyep", + "졠": "jyet", + "졡": "jyet", + "졢": "jyep", + "졣": "jyel", + "졤": "jyem", + "졥": "jyep", + "졦": "jyep", + "졧": "jyet", + "졨": "jyet", + "졩": "jyeng", + "졪": "jyet", + "졫": "jyet", + "졬": "jyek", + "졭": "jyet", + "졮": "jyep", + "졯": "jyet", + "조": "jo", + "족": "jok", + "졲": "jokk", + "졳": "jok", + "존": "jon", + "졵": "jon", + "졶": "jon", + "졷": "jot", + "졸": "jol", + "졹": "jok", + "졺": "jom", + "졻": "jop", + "졼": "jot", + "졽": "jot", + "졾": "jop", + "졿": "jol", + "좀": "jom", + "좁": "jop", + "좂": "jop", + "좃": "jot", + "좄": "jot", + "종": "jong", + "좆": "jot", + "좇": "jot", + "좈": "jok", + "좉": "jot", + "좊": "jop", + "좋": "jot", + "좌": "jwa", + "좍": "jwak", + "좎": "jwakk", + "좏": "jwak", + "좐": "jwan", + "좑": "jwan", + "좒": "jwan", + "좓": "jwat", + "좔": "jwal", + "좕": "jwak", + "좖": "jwam", + "좗": "jwap", + "좘": "jwat", + "좙": "jwat", + "좚": "jwap", + "좛": "jwal", + "좜": "jwam", + "좝": "jwap", + "좞": "jwap", + "좟": "jwat", + "좠": "jwat", + "좡": "jwang", + "좢": "jwat", + "좣": "jwat", + "좤": "jwak", + "좥": "jwat", + "좦": "jwap", + "좧": "jwat", + "좨": "jwae", + "좩": "jwaek", + "좪": "jwaekk", + "좫": "jwaek", + "좬": "jwaen", + "좭": "jwaen", + "좮": "jwaen", + "좯": "jwaet", + "좰": "jwael", + "좱": "jwaek", + "좲": "jwaem", + "좳": "jwaep", + "좴": "jwaet", + "좵": "jwaet", + "좶": "jwaep", + "좷": "jwael", + "좸": "jwaem", + "좹": "jwaep", + "좺": "jwaep", + "좻": "jwaet", + "좼": "jwaet", + "좽": "jwaeng", + "좾": "jwaet", + "좿": "jwaet", + "죀": "jwaek", + "죁": "jwaet", + "죂": "jwaep", + "죃": "jwaet", + "죄": "joe", + "죅": "joek", + "죆": "joekk", + "죇": "joek", + "죈": "joen", + "죉": "joen", + "죊": "joen", + "죋": "joet", + "죌": "joel", + "죍": "joek", + "죎": "joem", + "죏": "joep", + "죐": "joet", + "죑": "joet", + "죒": "joep", + "죓": "joel", + "죔": "joem", + "죕": "joep", + "죖": "joep", + "죗": "joet", + "죘": "joet", + "죙": "joeng", + "죚": "joet", + "죛": "joet", + "죜": "joek", + "죝": "joet", + "죞": "joep", + "죟": "joet", + "죠": "jyo", + "죡": "jyok", + "죢": "jyokk", + "죣": "jyok", + "죤": "jyon", + "죥": "jyon", + "죦": "jyon", + "죧": "jyot", + "죨": "jyol", + "죩": "jyok", + "죪": "jyom", + "죫": "jyop", + "죬": "jyot", + "죭": "jyot", + "죮": "jyop", + "죯": "jyol", + "죰": "jyom", + "죱": "jyop", + "죲": "jyop", + "죳": "jyot", + "죴": "jyot", + "죵": "jyong", + "죶": "jyot", + "죷": "jyot", + "죸": "jyok", + "죹": "jyot", + "죺": "jyop", + "죻": "jyot", + "주": "ju", + "죽": "juk", + "죾": "jukk", + "죿": "juk", + "준": "jun", + "줁": "jun", + "줂": "jun", + "줃": "jut", + "줄": "jul", + "줅": "juk", + "줆": "jum", + "줇": "jup", + "줈": "jut", + "줉": "jut", + "줊": "jup", + "줋": "jul", + "줌": "jum", + "줍": "jup", + "줎": "jup", + "줏": "jut", + "줐": "jut", + "중": "jung", + "줒": "jut", + "줓": "jut", + "줔": "juk", + "줕": "jut", + "줖": "jup", + "줗": "jut", + "줘": "jwo", + "줙": "jwok", + "줚": "jwokk", + "줛": "jwok", + "줜": "jwon", + "줝": "jwon", + "줞": "jwon", + "줟": "jwot", + "줠": "jwol", + "줡": "jwok", + "줢": "jwom", + "줣": "jwop", + "줤": "jwot", + "줥": "jwot", + "줦": "jwop", + "줧": "jwol", + "줨": "jwom", + "줩": "jwop", + "줪": "jwop", + "줫": "jwot", + "줬": "jwot", + "줭": "jwong", + "줮": "jwot", + "줯": "jwot", + "줰": "jwok", + "줱": "jwot", + "줲": "jwop", + "줳": "jwot", + "줴": "jwe", + "줵": "jwek", + "줶": "jwekk", + "줷": "jwek", + "줸": "jwen", + "줹": "jwen", + "줺": "jwen", + "줻": "jwet", + "줼": "jwel", + "줽": "jwek", + "줾": "jwem", + "줿": "jwep", + "쥀": "jwet", + "쥁": "jwet", + "쥂": "jwep", + "쥃": "jwel", + "쥄": "jwem", + "쥅": "jwep", + "쥆": "jwep", + "쥇": "jwet", + "쥈": "jwet", + "쥉": "jweng", + "쥊": "jwet", + "쥋": "jwet", + "쥌": "jwek", + "쥍": "jwet", + "쥎": "jwep", + "쥏": "jwet", + "쥐": "jwi", + "쥑": "jwik", + "쥒": "jwikk", + "쥓": "jwik", + "쥔": "jwin", + "쥕": "jwin", + "쥖": "jwin", + "쥗": "jwit", + "쥘": "jwil", + "쥙": "jwik", + "쥚": "jwim", + "쥛": "jwip", + "쥜": "jwit", + "쥝": "jwit", + "쥞": "jwip", + "쥟": "jwil", + "쥠": "jwim", + "쥡": "jwip", + "쥢": "jwip", + "쥣": "jwit", + "쥤": "jwit", + "쥥": "jwing", + "쥦": "jwit", + "쥧": "jwit", + "쥨": "jwik", + "쥩": "jwit", + "쥪": "jwip", + "쥫": "jwit", + "쥬": "jyu", + "쥭": "jyuk", + "쥮": "jyukk", + "쥯": "jyuk", + "쥰": "jyun", + "쥱": "jyun", + "쥲": "jyun", + "쥳": "jyut", + "쥴": "jyul", + "쥵": "jyuk", + "쥶": "jyum", + "쥷": "jyup", + "쥸": "jyut", + "쥹": "jyut", + "쥺": "jyup", + "쥻": "jyul", + "쥼": "jyum", + "쥽": "jyup", + "쥾": "jyup", + "쥿": "jyut", + "즀": "jyut", + "즁": "jyung", + "즂": "jyut", + "즃": "jyut", + "즄": "jyuk", + "즅": "jyut", + "즆": "jyup", + "즇": "jyut", + "즈": "jeu", + "즉": "jeuk", + "즊": "jeukk", + "즋": "jeuk", + "즌": "jeun", + "즍": "jeun", + "즎": "jeun", + "즏": "jeut", + "즐": "jeul", + "즑": "jeuk", + "즒": "jeum", + "즓": "jeup", + "즔": "jeut", + "즕": "jeut", + "즖": "jeup", + "즗": "jeul", + "즘": "jeum", + "즙": "jeup", + "즚": "jeup", + "즛": "jeut", + "즜": "jeut", + "증": "jeung", + "즞": "jeut", + "즟": "jeut", + "즠": "jeuk", + "즡": "jeut", + "즢": "jeup", + "즣": "jeut", + "즤": "jeui", + "즥": "jeuik", + "즦": "jeuikk", + "즧": "jeuik", + "즨": "jeuin", + "즩": "jeuin", + "즪": "jeuin", + "즫": "jeuit", + "즬": "jeuil", + "즭": "jeuik", + "즮": "jeuim", + "즯": "jeuip", + "즰": "jeuit", + "즱": "jeuit", + "즲": "jeuip", + "즳": "jeuil", + "즴": "jeuim", + "즵": "jeuip", + "즶": "jeuip", + "즷": "jeuit", + "즸": "jeuit", + "즹": "jeuing", + "즺": "jeuit", + "즻": "jeuit", + "즼": "jeuik", + "즽": "jeuit", + "즾": "jeuip", + "즿": "jeuit", + "지": "ji", + "직": "jik", + "짂": "jikk", + "짃": "jik", + "진": "jin", + "짅": "jin", + "짆": "jin", + "짇": "jit", + "질": "jil", + "짉": "jik", + "짊": "jim", + "짋": "jip", + "짌": "jit", + "짍": "jit", + "짎": "jip", + "짏": "jil", + "짐": "jim", + "집": "jip", + "짒": "jip", + "짓": "jit", + "짔": "jit", + "징": "jing", + "짖": "jit", + "짗": "jit", + "짘": "jik", + "짙": "jit", + "짚": "jip", + "짛": "jit", + "짜": "jja", + "짝": "jjak", + "짞": "jjakk", + "짟": "jjak", + "짠": "jjan", + "짡": "jjan", + "짢": "jjan", + "짣": "jjat", + "짤": "jjal", + "짥": "jjak", + "짦": "jjam", + "짧": "jjap", + "짨": "jjat", + "짩": "jjat", + "짪": "jjap", + "짫": "jjal", + "짬": "jjam", + "짭": "jjap", + "짮": "jjap", + "짯": "jjat", + "짰": "jjat", + "짱": "jjang", + "짲": "jjat", + "짳": "jjat", + "짴": "jjak", + "짵": "jjat", + "짶": "jjap", + "짷": "jjat", + "째": "jjae", + "짹": "jjaek", + "짺": "jjaekk", + "짻": "jjaek", + "짼": "jjaen", + "짽": "jjaen", + "짾": "jjaen", + "짿": "jjaet", + "쨀": "jjael", + "쨁": "jjaek", + "쨂": "jjaem", + "쨃": "jjaep", + "쨄": "jjaet", + "쨅": "jjaet", + "쨆": "jjaep", + "쨇": "jjael", + "쨈": "jjaem", + "쨉": "jjaep", + "쨊": "jjaep", + "쨋": "jjaet", + "쨌": "jjaet", + "쨍": "jjaeng", + "쨎": "jjaet", + "쨏": "jjaet", + "쨐": "jjaek", + "쨑": "jjaet", + "쨒": "jjaep", + "쨓": "jjaet", + "쨔": "jjya", + "쨕": "jjyak", + "쨖": "jjyakk", + "쨗": "jjyak", + "쨘": "jjyan", + "쨙": "jjyan", + "쨚": "jjyan", + "쨛": "jjyat", + "쨜": "jjyal", + "쨝": "jjyak", + "쨞": "jjyam", + "쨟": "jjyap", + "쨠": "jjyat", + "쨡": "jjyat", + "쨢": "jjyap", + "쨣": "jjyal", + "쨤": "jjyam", + "쨥": "jjyap", + "쨦": "jjyap", + "쨧": "jjyat", + "쨨": "jjyat", + "쨩": "jjyang", + "쨪": "jjyat", + "쨫": "jjyat", + "쨬": "jjyak", + "쨭": "jjyat", + "쨮": "jjyap", + "쨯": "jjyat", + "쨰": "jjyae", + "쨱": "jjyaek", + "쨲": "jjyaekk", + "쨳": "jjyaek", + "쨴": "jjyaen", + "쨵": "jjyaen", + "쨶": "jjyaen", + "쨷": "jjyaet", + "쨸": "jjyael", + "쨹": "jjyaek", + "쨺": "jjyaem", + "쨻": "jjyaep", + "쨼": "jjyaet", + "쨽": "jjyaet", + "쨾": "jjyaep", + "쨿": "jjyael", + "쩀": "jjyaem", + "쩁": "jjyaep", + "쩂": "jjyaep", + "쩃": "jjyaet", + "쩄": "jjyaet", + "쩅": "jjyaeng", + "쩆": "jjyaet", + "쩇": "jjyaet", + "쩈": "jjyaek", + "쩉": "jjyaet", + "쩊": "jjyaep", + "쩋": "jjyaet", + "쩌": "jjeo", + "쩍": "jjeok", + "쩎": "jjeokk", + "쩏": "jjeok", + "쩐": "jjeon", + "쩑": "jjeon", + "쩒": "jjeon", + "쩓": "jjeot", + "쩔": "jjeol", + "쩕": "jjeok", + "쩖": "jjeom", + "쩗": "jjeop", + "쩘": "jjeot", + "쩙": "jjeot", + "쩚": "jjeop", + "쩛": "jjeol", + "쩜": "jjeom", + "쩝": "jjeop", + "쩞": "jjeop", + "쩟": "jjeot", + "쩠": "jjeot", + "쩡": "jjeong", + "쩢": "jjeot", + "쩣": "jjeot", + "쩤": "jjeok", + "쩥": "jjeot", + "쩦": "jjeop", + "쩧": "jjeot", + "쩨": "jje", + "쩩": "jjek", + "쩪": "jjekk", + "쩫": "jjek", + "쩬": "jjen", + "쩭": "jjen", + "쩮": "jjen", + "쩯": "jjet", + "쩰": "jjel", + "쩱": "jjek", + "쩲": "jjem", + "쩳": "jjep", + "쩴": "jjet", + "쩵": "jjet", + "쩶": "jjep", + "쩷": "jjel", + "쩸": "jjem", + "쩹": "jjep", + "쩺": "jjep", + "쩻": "jjet", + "쩼": "jjet", + "쩽": "jjeng", + "쩾": "jjet", + "쩿": "jjet", + "쪀": "jjek", + "쪁": "jjet", + "쪂": "jjep", + "쪃": "jjet", + "쪄": "jjyeo", + "쪅": "jjyeok", + "쪆": "jjyeokk", + "쪇": "jjyeok", + "쪈": "jjyeon", + "쪉": "jjyeon", + "쪊": "jjyeon", + "쪋": "jjyeot", + "쪌": "jjyeol", + "쪍": "jjyeok", + "쪎": "jjyeom", + "쪏": "jjyeop", + "쪐": "jjyeot", + "쪑": "jjyeot", + "쪒": "jjyeop", + "쪓": "jjyeol", + "쪔": "jjyeom", + "쪕": "jjyeop", + "쪖": "jjyeop", + "쪗": "jjyeot", + "쪘": "jjyeot", + "쪙": "jjyeong", + "쪚": "jjyeot", + "쪛": "jjyeot", + "쪜": "jjyeok", + "쪝": "jjyeot", + "쪞": "jjyeop", + "쪟": "jjyeot", + "쪠": "jjye", + "쪡": "jjyek", + "쪢": "jjyekk", + "쪣": "jjyek", + "쪤": "jjyen", + "쪥": "jjyen", + "쪦": "jjyen", + "쪧": "jjyet", + "쪨": "jjyel", + "쪩": "jjyek", + "쪪": "jjyem", + "쪫": "jjyep", + "쪬": "jjyet", + "쪭": "jjyet", + "쪮": "jjyep", + "쪯": "jjyel", + "쪰": "jjyem", + "쪱": "jjyep", + "쪲": "jjyep", + "쪳": "jjyet", + "쪴": "jjyet", + "쪵": "jjyeng", + "쪶": "jjyet", + "쪷": "jjyet", + "쪸": "jjyek", + "쪹": "jjyet", + "쪺": "jjyep", + "쪻": "jjyet", + "쪼": "jjo", + "쪽": "jjok", + "쪾": "jjokk", + "쪿": "jjok", + "쫀": "jjon", + "쫁": "jjon", + "쫂": "jjon", + "쫃": "jjot", + "쫄": "jjol", + "쫅": "jjok", + "쫆": "jjom", + "쫇": "jjop", + "쫈": "jjot", + "쫉": "jjot", + "쫊": "jjop", + "쫋": "jjol", + "쫌": "jjom", + "쫍": "jjop", + "쫎": "jjop", + "쫏": "jjot", + "쫐": "jjot", + "쫑": "jjong", + "쫒": "jjot", + "쫓": "jjot", + "쫔": "jjok", + "쫕": "jjot", + "쫖": "jjop", + "쫗": "jjot", + "쫘": "jjwa", + "쫙": "jjwak", + "쫚": "jjwakk", + "쫛": "jjwak", + "쫜": "jjwan", + "쫝": "jjwan", + "쫞": "jjwan", + "쫟": "jjwat", + "쫠": "jjwal", + "쫡": "jjwak", + "쫢": "jjwam", + "쫣": "jjwap", + "쫤": "jjwat", + "쫥": "jjwat", + "쫦": "jjwap", + "쫧": "jjwal", + "쫨": "jjwam", + "쫩": "jjwap", + "쫪": "jjwap", + "쫫": "jjwat", + "쫬": "jjwat", + "쫭": "jjwang", + "쫮": "jjwat", + "쫯": "jjwat", + "쫰": "jjwak", + "쫱": "jjwat", + "쫲": "jjwap", + "쫳": "jjwat", + "쫴": "jjwae", + "쫵": "jjwaek", + "쫶": "jjwaekk", + "쫷": "jjwaek", + "쫸": "jjwaen", + "쫹": "jjwaen", + "쫺": "jjwaen", + "쫻": "jjwaet", + "쫼": "jjwael", + "쫽": "jjwaek", + "쫾": "jjwaem", + "쫿": "jjwaep", + "쬀": "jjwaet", + "쬁": "jjwaet", + "쬂": "jjwaep", + "쬃": "jjwael", + "쬄": "jjwaem", + "쬅": "jjwaep", + "쬆": "jjwaep", + "쬇": "jjwaet", + "쬈": "jjwaet", + "쬉": "jjwaeng", + "쬊": "jjwaet", + "쬋": "jjwaet", + "쬌": "jjwaek", + "쬍": "jjwaet", + "쬎": "jjwaep", + "쬏": "jjwaet", + "쬐": "jjoe", + "쬑": "jjoek", + "쬒": "jjoekk", + "쬓": "jjoek", + "쬔": "jjoen", + "쬕": "jjoen", + "쬖": "jjoen", + "쬗": "jjoet", + "쬘": "jjoel", + "쬙": "jjoek", + "쬚": "jjoem", + "쬛": "jjoep", + "쬜": "jjoet", + "쬝": "jjoet", + "쬞": "jjoep", + "쬟": "jjoel", + "쬠": "jjoem", + "쬡": "jjoep", + "쬢": "jjoep", + "쬣": "jjoet", + "쬤": "jjoet", + "쬥": "jjoeng", + "쬦": "jjoet", + "쬧": "jjoet", + "쬨": "jjoek", + "쬩": "jjoet", + "쬪": "jjoep", + "쬫": "jjoet", + "쬬": "jjyo", + "쬭": "jjyok", + "쬮": "jjyokk", + "쬯": "jjyok", + "쬰": "jjyon", + "쬱": "jjyon", + "쬲": "jjyon", + "쬳": "jjyot", + "쬴": "jjyol", + "쬵": "jjyok", + "쬶": "jjyom", + "쬷": "jjyop", + "쬸": "jjyot", + "쬹": "jjyot", + "쬺": "jjyop", + "쬻": "jjyol", + "쬼": "jjyom", + "쬽": "jjyop", + "쬾": "jjyop", + "쬿": "jjyot", + "쭀": "jjyot", + "쭁": "jjyong", + "쭂": "jjyot", + "쭃": "jjyot", + "쭄": "jjyok", + "쭅": "jjyot", + "쭆": "jjyop", + "쭇": "jjyot", + "쭈": "jju", + "쭉": "jjuk", + "쭊": "jjukk", + "쭋": "jjuk", + "쭌": "jjun", + "쭍": "jjun", + "쭎": "jjun", + "쭏": "jjut", + "쭐": "jjul", + "쭑": "jjuk", + "쭒": "jjum", + "쭓": "jjup", + "쭔": "jjut", + "쭕": "jjut", + "쭖": "jjup", + "쭗": "jjul", + "쭘": "jjum", + "쭙": "jjup", + "쭚": "jjup", + "쭛": "jjut", + "쭜": "jjut", + "쭝": "jjung", + "쭞": "jjut", + "쭟": "jjut", + "쭠": "jjuk", + "쭡": "jjut", + "쭢": "jjup", + "쭣": "jjut", + "쭤": "jjwo", + "쭥": "jjwok", + "쭦": "jjwokk", + "쭧": "jjwok", + "쭨": "jjwon", + "쭩": "jjwon", + "쭪": "jjwon", + "쭫": "jjwot", + "쭬": "jjwol", + "쭭": "jjwok", + "쭮": "jjwom", + "쭯": "jjwop", + "쭰": "jjwot", + "쭱": "jjwot", + "쭲": "jjwop", + "쭳": "jjwol", + "쭴": "jjwom", + "쭵": "jjwop", + "쭶": "jjwop", + "쭷": "jjwot", + "쭸": "jjwot", + "쭹": "jjwong", + "쭺": "jjwot", + "쭻": "jjwot", + "쭼": "jjwok", + "쭽": "jjwot", + "쭾": "jjwop", + "쭿": "jjwot", + "쮀": "jjwe", + "쮁": "jjwek", + "쮂": "jjwekk", + "쮃": "jjwek", + "쮄": "jjwen", + "쮅": "jjwen", + "쮆": "jjwen", + "쮇": "jjwet", + "쮈": "jjwel", + "쮉": "jjwek", + "쮊": "jjwem", + "쮋": "jjwep", + "쮌": "jjwet", + "쮍": "jjwet", + "쮎": "jjwep", + "쮏": "jjwel", + "쮐": "jjwem", + "쮑": "jjwep", + "쮒": "jjwep", + "쮓": "jjwet", + "쮔": "jjwet", + "쮕": "jjweng", + "쮖": "jjwet", + "쮗": "jjwet", + "쮘": "jjwek", + "쮙": "jjwet", + "쮚": "jjwep", + "쮛": "jjwet", + "쮜": "jjwi", + "쮝": "jjwik", + "쮞": "jjwikk", + "쮟": "jjwik", + "쮠": "jjwin", + "쮡": "jjwin", + "쮢": "jjwin", + "쮣": "jjwit", + "쮤": "jjwil", + "쮥": "jjwik", + "쮦": "jjwim", + "쮧": "jjwip", + "쮨": "jjwit", + "쮩": "jjwit", + "쮪": "jjwip", + "쮫": "jjwil", + "쮬": "jjwim", + "쮭": "jjwip", + "쮮": "jjwip", + "쮯": "jjwit", + "쮰": "jjwit", + "쮱": "jjwing", + "쮲": "jjwit", + "쮳": "jjwit", + "쮴": "jjwik", + "쮵": "jjwit", + "쮶": "jjwip", + "쮷": "jjwit", + "쮸": "jjyu", + "쮹": "jjyuk", + "쮺": "jjyukk", + "쮻": "jjyuk", + "쮼": "jjyun", + "쮽": "jjyun", + "쮾": "jjyun", + "쮿": "jjyut", + "쯀": "jjyul", + "쯁": "jjyuk", + "쯂": "jjyum", + "쯃": "jjyup", + "쯄": "jjyut", + "쯅": "jjyut", + "쯆": "jjyup", + "쯇": "jjyul", + "쯈": "jjyum", + "쯉": "jjyup", + "쯊": "jjyup", + "쯋": "jjyut", + "쯌": "jjyut", + "쯍": "jjyung", + "쯎": "jjyut", + "쯏": "jjyut", + "쯐": "jjyuk", + "쯑": "jjyut", + "쯒": "jjyup", + "쯓": "jjyut", + "쯔": "jjeu", + "쯕": "jjeuk", + "쯖": "jjeukk", + "쯗": "jjeuk", + "쯘": "jjeun", + "쯙": "jjeun", + "쯚": "jjeun", + "쯛": "jjeut", + "쯜": "jjeul", + "쯝": "jjeuk", + "쯞": "jjeum", + "쯟": "jjeup", + "쯠": "jjeut", + "쯡": "jjeut", + "쯢": "jjeup", + "쯣": "jjeul", + "쯤": "jjeum", + "쯥": "jjeup", + "쯦": "jjeup", + "쯧": "jjeut", + "쯨": "jjeut", + "쯩": "jjeung", + "쯪": "jjeut", + "쯫": "jjeut", + "쯬": "jjeuk", + "쯭": "jjeut", + "쯮": "jjeup", + "쯯": "jjeut", + "쯰": "jjeui", + "쯱": "jjeuik", + "쯲": "jjeuikk", + "쯳": "jjeuik", + "쯴": "jjeuin", + "쯵": "jjeuin", + "쯶": "jjeuin", + "쯷": "jjeuit", + "쯸": "jjeuil", + "쯹": "jjeuik", + "쯺": "jjeuim", + "쯻": "jjeuip", + "쯼": "jjeuit", + "쯽": "jjeuit", + "쯾": "jjeuip", + "쯿": "jjeuil", + "찀": "jjeuim", + "찁": "jjeuip", + "찂": "jjeuip", + "찃": "jjeuit", + "찄": "jjeuit", + "찅": "jjeuing", + "찆": "jjeuit", + "찇": "jjeuit", + "찈": "jjeuik", + "찉": "jjeuit", + "찊": "jjeuip", + "찋": "jjeuit", + "찌": "jji", + "찍": "jjik", + "찎": "jjikk", + "찏": "jjik", + "찐": "jjin", + "찑": "jjin", + "찒": "jjin", + "찓": "jjit", + "찔": "jjil", + "찕": "jjik", + "찖": "jjim", + "찗": "jjip", + "찘": "jjit", + "찙": "jjit", + "찚": "jjip", + "찛": "jjil", + "찜": "jjim", + "찝": "jjip", + "찞": "jjip", + "찟": "jjit", + "찠": "jjit", + "찡": "jjing", + "찢": "jjit", + "찣": "jjit", + "찤": "jjik", + "찥": "jjit", + "찦": "jjip", + "찧": "jjit", + "차": "cha", + "착": "chak", + "찪": "chakk", + "찫": "chak", + "찬": "chan", + "찭": "chan", + "찮": "chan", + "찯": "chat", + "찰": "chal", + "찱": "chak", + "찲": "cham", + "찳": "chap", + "찴": "chat", + "찵": "chat", + "찶": "chap", + "찷": "chal", + "참": "cham", + "찹": "chap", + "찺": "chap", + "찻": "chat", + "찼": "chat", + "창": "chang", + "찾": "chat", + "찿": "chat", + "챀": "chak", + "챁": "chat", + "챂": "chap", + "챃": "chat", + "채": "chae", + "책": "chaek", + "챆": "chaekk", + "챇": "chaek", + "챈": "chaen", + "챉": "chaen", + "챊": "chaen", + "챋": "chaet", + "챌": "chael", + "챍": "chaek", + "챎": "chaem", + "챏": "chaep", + "챐": "chaet", + "챑": "chaet", + "챒": "chaep", + "챓": "chael", + "챔": "chaem", + "챕": "chaep", + "챖": "chaep", + "챗": "chaet", + "챘": "chaet", + "챙": "chaeng", + "챚": "chaet", + "챛": "chaet", + "챜": "chaek", + "챝": "chaet", + "챞": "chaep", + "챟": "chaet", + "챠": "chya", + "챡": "chyak", + "챢": "chyakk", + "챣": "chyak", + "챤": "chyan", + "챥": "chyan", + "챦": "chyan", + "챧": "chyat", + "챨": "chyal", + "챩": "chyak", + "챪": "chyam", + "챫": "chyap", + "챬": "chyat", + "챭": "chyat", + "챮": "chyap", + "챯": "chyal", + "챰": "chyam", + "챱": "chyap", + "챲": "chyap", + "챳": "chyat", + "챴": "chyat", + "챵": "chyang", + "챶": "chyat", + "챷": "chyat", + "챸": "chyak", + "챹": "chyat", + "챺": "chyap", + "챻": "chyat", + "챼": "chyae", + "챽": "chyaek", + "챾": "chyaekk", + "챿": "chyaek", + "첀": "chyaen", + "첁": "chyaen", + "첂": "chyaen", + "첃": "chyaet", + "첄": "chyael", + "첅": "chyaek", + "첆": "chyaem", + "첇": "chyaep", + "첈": "chyaet", + "첉": "chyaet", + "첊": "chyaep", + "첋": "chyael", + "첌": "chyaem", + "첍": "chyaep", + "첎": "chyaep", + "첏": "chyaet", + "첐": "chyaet", + "첑": "chyaeng", + "첒": "chyaet", + "첓": "chyaet", + "첔": "chyaek", + "첕": "chyaet", + "첖": "chyaep", + "첗": "chyaet", + "처": "cheo", + "척": "cheok", + "첚": "cheokk", + "첛": "cheok", + "천": "cheon", + "첝": "cheon", + "첞": "cheon", + "첟": "cheot", + "철": "cheol", + "첡": "cheok", + "첢": "cheom", + "첣": "cheop", + "첤": "cheot", + "첥": "cheot", + "첦": "cheop", + "첧": "cheol", + "첨": "cheom", + "첩": "cheop", + "첪": "cheop", + "첫": "cheot", + "첬": "cheot", + "청": "cheong", + "첮": "cheot", + "첯": "cheot", + "첰": "cheok", + "첱": "cheot", + "첲": "cheop", + "첳": "cheot", + "체": "che", + "첵": "chek", + "첶": "chekk", + "첷": "chek", + "첸": "chen", + "첹": "chen", + "첺": "chen", + "첻": "chet", + "첼": "chel", + "첽": "chek", + "첾": "chem", + "첿": "chep", + "쳀": "chet", + "쳁": "chet", + "쳂": "chep", + "쳃": "chel", + "쳄": "chem", + "쳅": "chep", + "쳆": "chep", + "쳇": "chet", + "쳈": "chet", + "쳉": "cheng", + "쳊": "chet", + "쳋": "chet", + "쳌": "chek", + "쳍": "chet", + "쳎": "chep", + "쳏": "chet", + "쳐": "chyeo", + "쳑": "chyeok", + "쳒": "chyeokk", + "쳓": "chyeok", + "쳔": "chyeon", + "쳕": "chyeon", + "쳖": "chyeon", + "쳗": "chyeot", + "쳘": "chyeol", + "쳙": "chyeok", + "쳚": "chyeom", + "쳛": "chyeop", + "쳜": "chyeot", + "쳝": "chyeot", + "쳞": "chyeop", + "쳟": "chyeol", + "쳠": "chyeom", + "쳡": "chyeop", + "쳢": "chyeop", + "쳣": "chyeot", + "쳤": "chyeot", + "쳥": "chyeong", + "쳦": "chyeot", + "쳧": "chyeot", + "쳨": "chyeok", + "쳩": "chyeot", + "쳪": "chyeop", + "쳫": "chyeot", + "쳬": "chye", + "쳭": "chyek", + "쳮": "chyekk", + "쳯": "chyek", + "쳰": "chyen", + "쳱": "chyen", + "쳲": "chyen", + "쳳": "chyet", + "쳴": "chyel", + "쳵": "chyek", + "쳶": "chyem", + "쳷": "chyep", + "쳸": "chyet", + "쳹": "chyet", + "쳺": "chyep", + "쳻": "chyel", + "쳼": "chyem", + "쳽": "chyep", + "쳾": "chyep", + "쳿": "chyet", + "촀": "chyet", + "촁": "chyeng", + "촂": "chyet", + "촃": "chyet", + "촄": "chyek", + "촅": "chyet", + "촆": "chyep", + "촇": "chyet", + "초": "cho", + "촉": "chok", + "촊": "chokk", + "촋": "chok", + "촌": "chon", + "촍": "chon", + "촎": "chon", + "촏": "chot", + "촐": "chol", + "촑": "chok", + "촒": "chom", + "촓": "chop", + "촔": "chot", + "촕": "chot", + "촖": "chop", + "촗": "chol", + "촘": "chom", + "촙": "chop", + "촚": "chop", + "촛": "chot", + "촜": "chot", + "총": "chong", + "촞": "chot", + "촟": "chot", + "촠": "chok", + "촡": "chot", + "촢": "chop", + "촣": "chot", + "촤": "chwa", + "촥": "chwak", + "촦": "chwakk", + "촧": "chwak", + "촨": "chwan", + "촩": "chwan", + "촪": "chwan", + "촫": "chwat", + "촬": "chwal", + "촭": "chwak", + "촮": "chwam", + "촯": "chwap", + "촰": "chwat", + "촱": "chwat", + "촲": "chwap", + "촳": "chwal", + "촴": "chwam", + "촵": "chwap", + "촶": "chwap", + "촷": "chwat", + "촸": "chwat", + "촹": "chwang", + "촺": "chwat", + "촻": "chwat", + "촼": "chwak", + "촽": "chwat", + "촾": "chwap", + "촿": "chwat", + "쵀": "chwae", + "쵁": "chwaek", + "쵂": "chwaekk", + "쵃": "chwaek", + "쵄": "chwaen", + "쵅": "chwaen", + "쵆": "chwaen", + "쵇": "chwaet", + "쵈": "chwael", + "쵉": "chwaek", + "쵊": "chwaem", + "쵋": "chwaep", + "쵌": "chwaet", + "쵍": "chwaet", + "쵎": "chwaep", + "쵏": "chwael", + "쵐": "chwaem", + "쵑": "chwaep", + "쵒": "chwaep", + "쵓": "chwaet", + "쵔": "chwaet", + "쵕": "chwaeng", + "쵖": "chwaet", + "쵗": "chwaet", + "쵘": "chwaek", + "쵙": "chwaet", + "쵚": "chwaep", + "쵛": "chwaet", + "최": "choe", + "쵝": "choek", + "쵞": "choekk", + "쵟": "choek", + "쵠": "choen", + "쵡": "choen", + "쵢": "choen", + "쵣": "choet", + "쵤": "choel", + "쵥": "choek", + "쵦": "choem", + "쵧": "choep", + "쵨": "choet", + "쵩": "choet", + "쵪": "choep", + "쵫": "choel", + "쵬": "choem", + "쵭": "choep", + "쵮": "choep", + "쵯": "choet", + "쵰": "choet", + "쵱": "choeng", + "쵲": "choet", + "쵳": "choet", + "쵴": "choek", + "쵵": "choet", + "쵶": "choep", + "쵷": "choet", + "쵸": "chyo", + "쵹": "chyok", + "쵺": "chyokk", + "쵻": "chyok", + "쵼": "chyon", + "쵽": "chyon", + "쵾": "chyon", + "쵿": "chyot", + "춀": "chyol", + "춁": "chyok", + "춂": "chyom", + "춃": "chyop", + "춄": "chyot", + "춅": "chyot", + "춆": "chyop", + "춇": "chyol", + "춈": "chyom", + "춉": "chyop", + "춊": "chyop", + "춋": "chyot", + "춌": "chyot", + "춍": "chyong", + "춎": "chyot", + "춏": "chyot", + "춐": "chyok", + "춑": "chyot", + "춒": "chyop", + "춓": "chyot", + "추": "chu", + "축": "chuk", + "춖": "chukk", + "춗": "chuk", + "춘": "chun", + "춙": "chun", + "춚": "chun", + "춛": "chut", + "출": "chul", + "춝": "chuk", + "춞": "chum", + "춟": "chup", + "춠": "chut", + "춡": "chut", + "춢": "chup", + "춣": "chul", + "춤": "chum", + "춥": "chup", + "춦": "chup", + "춧": "chut", + "춨": "chut", + "충": "chung", + "춪": "chut", + "춫": "chut", + "춬": "chuk", + "춭": "chut", + "춮": "chup", + "춯": "chut", + "춰": "chwo", + "춱": "chwok", + "춲": "chwokk", + "춳": "chwok", + "춴": "chwon", + "춵": "chwon", + "춶": "chwon", + "춷": "chwot", + "춸": "chwol", + "춹": "chwok", + "춺": "chwom", + "춻": "chwop", + "춼": "chwot", + "춽": "chwot", + "춾": "chwop", + "춿": "chwol", + "췀": "chwom", + "췁": "chwop", + "췂": "chwop", + "췃": "chwot", + "췄": "chwot", + "췅": "chwong", + "췆": "chwot", + "췇": "chwot", + "췈": "chwok", + "췉": "chwot", + "췊": "chwop", + "췋": "chwot", + "췌": "chwe", + "췍": "chwek", + "췎": "chwekk", + "췏": "chwek", + "췐": "chwen", + "췑": "chwen", + "췒": "chwen", + "췓": "chwet", + "췔": "chwel", + "췕": "chwek", + "췖": "chwem", + "췗": "chwep", + "췘": "chwet", + "췙": "chwet", + "췚": "chwep", + "췛": "chwel", + "췜": "chwem", + "췝": "chwep", + "췞": "chwep", + "췟": "chwet", + "췠": "chwet", + "췡": "chweng", + "췢": "chwet", + "췣": "chwet", + "췤": "chwek", + "췥": "chwet", + "췦": "chwep", + "췧": "chwet", + "취": "chwi", + "췩": "chwik", + "췪": "chwikk", + "췫": "chwik", + "췬": "chwin", + "췭": "chwin", + "췮": "chwin", + "췯": "chwit", + "췰": "chwil", + "췱": "chwik", + "췲": "chwim", + "췳": "chwip", + "췴": "chwit", + "췵": "chwit", + "췶": "chwip", + "췷": "chwil", + "췸": "chwim", + "췹": "chwip", + "췺": "chwip", + "췻": "chwit", + "췼": "chwit", + "췽": "chwing", + "췾": "chwit", + "췿": "chwit", + "츀": "chwik", + "츁": "chwit", + "츂": "chwip", + "츃": "chwit", + "츄": "chyu", + "츅": "chyuk", + "츆": "chyukk", + "츇": "chyuk", + "츈": "chyun", + "츉": "chyun", + "츊": "chyun", + "츋": "chyut", + "츌": "chyul", + "츍": "chyuk", + "츎": "chyum", + "츏": "chyup", + "츐": "chyut", + "츑": "chyut", + "츒": "chyup", + "츓": "chyul", + "츔": "chyum", + "츕": "chyup", + "츖": "chyup", + "츗": "chyut", + "츘": "chyut", + "츙": "chyung", + "츚": "chyut", + "츛": "chyut", + "츜": "chyuk", + "츝": "chyut", + "츞": "chyup", + "츟": "chyut", + "츠": "cheu", + "측": "cheuk", + "츢": "cheukk", + "츣": "cheuk", + "츤": "cheun", + "츥": "cheun", + "츦": "cheun", + "츧": "cheut", + "츨": "cheul", + "츩": "cheuk", + "츪": "cheum", + "츫": "cheup", + "츬": "cheut", + "츭": "cheut", + "츮": "cheup", + "츯": "cheul", + "츰": "cheum", + "츱": "cheup", + "츲": "cheup", + "츳": "cheut", + "츴": "cheut", + "층": "cheung", + "츶": "cheut", + "츷": "cheut", + "츸": "cheuk", + "츹": "cheut", + "츺": "cheup", + "츻": "cheut", + "츼": "cheui", + "츽": "cheuik", + "츾": "cheuikk", + "츿": "cheuik", + "칀": "cheuin", + "칁": "cheuin", + "칂": "cheuin", + "칃": "cheuit", + "칄": "cheuil", + "칅": "cheuik", + "칆": "cheuim", + "칇": "cheuip", + "칈": "cheuit", + "칉": "cheuit", + "칊": "cheuip", + "칋": "cheuil", + "칌": "cheuim", + "칍": "cheuip", + "칎": "cheuip", + "칏": "cheuit", + "칐": "cheuit", + "칑": "cheuing", + "칒": "cheuit", + "칓": "cheuit", + "칔": "cheuik", + "칕": "cheuit", + "칖": "cheuip", + "칗": "cheuit", + "치": "chi", + "칙": "chik", + "칚": "chikk", + "칛": "chik", + "친": "chin", + "칝": "chin", + "칞": "chin", + "칟": "chit", + "칠": "chil", + "칡": "chik", + "칢": "chim", + "칣": "chip", + "칤": "chit", + "칥": "chit", + "칦": "chip", + "칧": "chil", + "침": "chim", + "칩": "chip", + "칪": "chip", + "칫": "chit", + "칬": "chit", + "칭": "ching", + "칮": "chit", + "칯": "chit", + "칰": "chik", + "칱": "chit", + "칲": "chip", + "칳": "chit", + "카": "ka", + "칵": "kak", + "칶": "kakk", + "칷": "kak", + "칸": "kan", + "칹": "kan", + "칺": "kan", + "칻": "kat", + "칼": "kal", + "칽": "kak", + "칾": "kam", + "칿": "kap", + "캀": "kat", + "캁": "kat", + "캂": "kap", + "캃": "kal", + "캄": "kam", + "캅": "kap", + "캆": "kap", + "캇": "kat", + "캈": "kat", + "캉": "kang", + "캊": "kat", + "캋": "kat", + "캌": "kak", + "캍": "kat", + "캎": "kap", + "캏": "kat", + "캐": "kae", + "캑": "kaek", + "캒": "kaekk", + "캓": "kaek", + "캔": "kaen", + "캕": "kaen", + "캖": "kaen", + "캗": "kaet", + "캘": "kael", + "캙": "kaek", + "캚": "kaem", + "캛": "kaep", + "캜": "kaet", + "캝": "kaet", + "캞": "kaep", + "캟": "kael", + "캠": "kaem", + "캡": "kaep", + "캢": "kaep", + "캣": "kaet", + "캤": "kaet", + "캥": "kaeng", + "캦": "kaet", + "캧": "kaet", + "캨": "kaek", + "캩": "kaet", + "캪": "kaep", + "캫": "kaet", + "캬": "kya", + "캭": "kyak", + "캮": "kyakk", + "캯": "kyak", + "캰": "kyan", + "캱": "kyan", + "캲": "kyan", + "캳": "kyat", + "캴": "kyal", + "캵": "kyak", + "캶": "kyam", + "캷": "kyap", + "캸": "kyat", + "캹": "kyat", + "캺": "kyap", + "캻": "kyal", + "캼": "kyam", + "캽": "kyap", + "캾": "kyap", + "캿": "kyat", + "컀": "kyat", + "컁": "kyang", + "컂": "kyat", + "컃": "kyat", + "컄": "kyak", + "컅": "kyat", + "컆": "kyap", + "컇": "kyat", + "컈": "kyae", + "컉": "kyaek", + "컊": "kyaekk", + "컋": "kyaek", + "컌": "kyaen", + "컍": "kyaen", + "컎": "kyaen", + "컏": "kyaet", + "컐": "kyael", + "컑": "kyaek", + "컒": "kyaem", + "컓": "kyaep", + "컔": "kyaet", + "컕": "kyaet", + "컖": "kyaep", + "컗": "kyael", + "컘": "kyaem", + "컙": "kyaep", + "컚": "kyaep", + "컛": "kyaet", + "컜": "kyaet", + "컝": "kyaeng", + "컞": "kyaet", + "컟": "kyaet", + "컠": "kyaek", + "컡": "kyaet", + "컢": "kyaep", + "컣": "kyaet", + "커": "keo", + "컥": "keok", + "컦": "keokk", + "컧": "keok", + "컨": "keon", + "컩": "keon", + "컪": "keon", + "컫": "keot", + "컬": "keol", + "컭": "keok", + "컮": "keom", + "컯": "keop", + "컰": "keot", + "컱": "keot", + "컲": "keop", + "컳": "keol", + "컴": "keom", + "컵": "keop", + "컶": "keop", + "컷": "keot", + "컸": "keot", + "컹": "keong", + "컺": "keot", + "컻": "keot", + "컼": "keok", + "컽": "keot", + "컾": "keop", + "컿": "keot", + "케": "ke", + "켁": "kek", + "켂": "kekk", + "켃": "kek", + "켄": "ken", + "켅": "ken", + "켆": "ken", + "켇": "ket", + "켈": "kel", + "켉": "kek", + "켊": "kem", + "켋": "kep", + "켌": "ket", + "켍": "ket", + "켎": "kep", + "켏": "kel", + "켐": "kem", + "켑": "kep", + "켒": "kep", + "켓": "ket", + "켔": "ket", + "켕": "keng", + "켖": "ket", + "켗": "ket", + "켘": "kek", + "켙": "ket", + "켚": "kep", + "켛": "ket", + "켜": "kyeo", + "켝": "kyeok", + "켞": "kyeokk", + "켟": "kyeok", + "켠": "kyeon", + "켡": "kyeon", + "켢": "kyeon", + "켣": "kyeot", + "켤": "kyeol", + "켥": "kyeok", + "켦": "kyeom", + "켧": "kyeop", + "켨": "kyeot", + "켩": "kyeot", + "켪": "kyeop", + "켫": "kyeol", + "켬": "kyeom", + "켭": "kyeop", + "켮": "kyeop", + "켯": "kyeot", + "켰": "kyeot", + "켱": "kyeong", + "켲": "kyeot", + "켳": "kyeot", + "켴": "kyeok", + "켵": "kyeot", + "켶": "kyeop", + "켷": "kyeot", + "켸": "kye", + "켹": "kyek", + "켺": "kyekk", + "켻": "kyek", + "켼": "kyen", + "켽": "kyen", + "켾": "kyen", + "켿": "kyet", + "콀": "kyel", + "콁": "kyek", + "콂": "kyem", + "콃": "kyep", + "콄": "kyet", + "콅": "kyet", + "콆": "kyep", + "콇": "kyel", + "콈": "kyem", + "콉": "kyep", + "콊": "kyep", + "콋": "kyet", + "콌": "kyet", + "콍": "kyeng", + "콎": "kyet", + "콏": "kyet", + "콐": "kyek", + "콑": "kyet", + "콒": "kyep", + "콓": "kyet", + "코": "ko", + "콕": "kok", + "콖": "kokk", + "콗": "kok", + "콘": "kon", + "콙": "kon", + "콚": "kon", + "콛": "kot", + "콜": "kol", + "콝": "kok", + "콞": "kom", + "콟": "kop", + "콠": "kot", + "콡": "kot", + "콢": "kop", + "콣": "kol", + "콤": "kom", + "콥": "kop", + "콦": "kop", + "콧": "kot", + "콨": "kot", + "콩": "kong", + "콪": "kot", + "콫": "kot", + "콬": "kok", + "콭": "kot", + "콮": "kop", + "콯": "kot", + "콰": "kwa", + "콱": "kwak", + "콲": "kwakk", + "콳": "kwak", + "콴": "kwan", + "콵": "kwan", + "콶": "kwan", + "콷": "kwat", + "콸": "kwal", + "콹": "kwak", + "콺": "kwam", + "콻": "kwap", + "콼": "kwat", + "콽": "kwat", + "콾": "kwap", + "콿": "kwal", + "쾀": "kwam", + "쾁": "kwap", + "쾂": "kwap", + "쾃": "kwat", + "쾄": "kwat", + "쾅": "kwang", + "쾆": "kwat", + "쾇": "kwat", + "쾈": "kwak", + "쾉": "kwat", + "쾊": "kwap", + "쾋": "kwat", + "쾌": "kwae", + "쾍": "kwaek", + "쾎": "kwaekk", + "쾏": "kwaek", + "쾐": "kwaen", + "쾑": "kwaen", + "쾒": "kwaen", + "쾓": "kwaet", + "쾔": "kwael", + "쾕": "kwaek", + "쾖": "kwaem", + "쾗": "kwaep", + "쾘": "kwaet", + "쾙": "kwaet", + "쾚": "kwaep", + "쾛": "kwael", + "쾜": "kwaem", + "쾝": "kwaep", + "쾞": "kwaep", + "쾟": "kwaet", + "쾠": "kwaet", + "쾡": "kwaeng", + "쾢": "kwaet", + "쾣": "kwaet", + "쾤": "kwaek", + "쾥": "kwaet", + "쾦": "kwaep", + "쾧": "kwaet", + "쾨": "koe", + "쾩": "koek", + "쾪": "koekk", + "쾫": "koek", + "쾬": "koen", + "쾭": "koen", + "쾮": "koen", + "쾯": "koet", + "쾰": "koel", + "쾱": "koek", + "쾲": "koem", + "쾳": "koep", + "쾴": "koet", + "쾵": "koet", + "쾶": "koep", + "쾷": "koel", + "쾸": "koem", + "쾹": "koep", + "쾺": "koep", + "쾻": "koet", + "쾼": "koet", + "쾽": "koeng", + "쾾": "koet", + "쾿": "koet", + "쿀": "koek", + "쿁": "koet", + "쿂": "koep", + "쿃": "koet", + "쿄": "kyo", + "쿅": "kyok", + "쿆": "kyokk", + "쿇": "kyok", + "쿈": "kyon", + "쿉": "kyon", + "쿊": "kyon", + "쿋": "kyot", + "쿌": "kyol", + "쿍": "kyok", + "쿎": "kyom", + "쿏": "kyop", + "쿐": "kyot", + "쿑": "kyot", + "쿒": "kyop", + "쿓": "kyol", + "쿔": "kyom", + "쿕": "kyop", + "쿖": "kyop", + "쿗": "kyot", + "쿘": "kyot", + "쿙": "kyong", + "쿚": "kyot", + "쿛": "kyot", + "쿜": "kyok", + "쿝": "kyot", + "쿞": "kyop", + "쿟": "kyot", + "쿠": "ku", + "쿡": "kuk", + "쿢": "kukk", + "쿣": "kuk", + "쿤": "kun", + "쿥": "kun", + "쿦": "kun", + "쿧": "kut", + "쿨": "kul", + "쿩": "kuk", + "쿪": "kum", + "쿫": "kup", + "쿬": "kut", + "쿭": "kut", + "쿮": "kup", + "쿯": "kul", + "쿰": "kum", + "쿱": "kup", + "쿲": "kup", + "쿳": "kut", + "쿴": "kut", + "쿵": "kung", + "쿶": "kut", + "쿷": "kut", + "쿸": "kuk", + "쿹": "kut", + "쿺": "kup", + "쿻": "kut", + "쿼": "kwo", + "쿽": "kwok", + "쿾": "kwokk", + "쿿": "kwok", + "퀀": "kwon", + "퀁": "kwon", + "퀂": "kwon", + "퀃": "kwot", + "퀄": "kwol", + "퀅": "kwok", + "퀆": "kwom", + "퀇": "kwop", + "퀈": "kwot", + "퀉": "kwot", + "퀊": "kwop", + "퀋": "kwol", + "퀌": "kwom", + "퀍": "kwop", + "퀎": "kwop", + "퀏": "kwot", + "퀐": "kwot", + "퀑": "kwong", + "퀒": "kwot", + "퀓": "kwot", + "퀔": "kwok", + "퀕": "kwot", + "퀖": "kwop", + "퀗": "kwot", + "퀘": "kwe", + "퀙": "kwek", + "퀚": "kwekk", + "퀛": "kwek", + "퀜": "kwen", + "퀝": "kwen", + "퀞": "kwen", + "퀟": "kwet", + "퀠": "kwel", + "퀡": "kwek", + "퀢": "kwem", + "퀣": "kwep", + "퀤": "kwet", + "퀥": "kwet", + "퀦": "kwep", + "퀧": "kwel", + "퀨": "kwem", + "퀩": "kwep", + "퀪": "kwep", + "퀫": "kwet", + "퀬": "kwet", + "퀭": "kweng", + "퀮": "kwet", + "퀯": "kwet", + "퀰": "kwek", + "퀱": "kwet", + "퀲": "kwep", + "퀳": "kwet", + "퀴": "kwi", + "퀵": "kwik", + "퀶": "kwikk", + "퀷": "kwik", + "퀸": "kwin", + "퀹": "kwin", + "퀺": "kwin", + "퀻": "kwit", + "퀼": "kwil", + "퀽": "kwik", + "퀾": "kwim", + "퀿": "kwip", + "큀": "kwit", + "큁": "kwit", + "큂": "kwip", + "큃": "kwil", + "큄": "kwim", + "큅": "kwip", + "큆": "kwip", + "큇": "kwit", + "큈": "kwit", + "큉": "kwing", + "큊": "kwit", + "큋": "kwit", + "큌": "kwik", + "큍": "kwit", + "큎": "kwip", + "큏": "kwit", + "큐": "kyu", + "큑": "kyuk", + "큒": "kyukk", + "큓": "kyuk", + "큔": "kyun", + "큕": "kyun", + "큖": "kyun", + "큗": "kyut", + "큘": "kyul", + "큙": "kyuk", + "큚": "kyum", + "큛": "kyup", + "큜": "kyut", + "큝": "kyut", + "큞": "kyup", + "큟": "kyul", + "큠": "kyum", + "큡": "kyup", + "큢": "kyup", + "큣": "kyut", + "큤": "kyut", + "큥": "kyung", + "큦": "kyut", + "큧": "kyut", + "큨": "kyuk", + "큩": "kyut", + "큪": "kyup", + "큫": "kyut", + "크": "keu", + "큭": "keuk", + "큮": "keukk", + "큯": "keuk", + "큰": "keun", + "큱": "keun", + "큲": "keun", + "큳": "keut", + "클": "keul", + "큵": "keuk", + "큶": "keum", + "큷": "keup", + "큸": "keut", + "큹": "keut", + "큺": "keup", + "큻": "keul", + "큼": "keum", + "큽": "keup", + "큾": "keup", + "큿": "keut", + "킀": "keut", + "킁": "keung", + "킂": "keut", + "킃": "keut", + "킄": "keuk", + "킅": "keut", + "킆": "keup", + "킇": "keut", + "킈": "keui", + "킉": "keuik", + "킊": "keuikk", + "킋": "keuik", + "킌": "keuin", + "킍": "keuin", + "킎": "keuin", + "킏": "keuit", + "킐": "keuil", + "킑": "keuik", + "킒": "keuim", + "킓": "keuip", + "킔": "keuit", + "킕": "keuit", + "킖": "keuip", + "킗": "keuil", + "킘": "keuim", + "킙": "keuip", + "킚": "keuip", + "킛": "keuit", + "킜": "keuit", + "킝": "keuing", + "킞": "keuit", + "킟": "keuit", + "킠": "keuik", + "킡": "keuit", + "킢": "keuip", + "킣": "keuit", + "키": "ki", + "킥": "kik", + "킦": "kikk", + "킧": "kik", + "킨": "kin", + "킩": "kin", + "킪": "kin", + "킫": "kit", + "킬": "kil", + "킭": "kik", + "킮": "kim", + "킯": "kip", + "킰": "kit", + "킱": "kit", + "킲": "kip", + "킳": "kil", + "킴": "kim", + "킵": "kip", + "킶": "kip", + "킷": "kit", + "킸": "kit", + "킹": "king", + "킺": "kit", + "킻": "kit", + "킼": "kik", + "킽": "kit", + "킾": "kip", + "킿": "kit", + "타": "ta", + "탁": "tak", + "탂": "takk", + "탃": "tak", + "탄": "tan", + "탅": "tan", + "탆": "tan", + "탇": "tat", + "탈": "tal", + "탉": "tak", + "탊": "tam", + "탋": "tap", + "탌": "tat", + "탍": "tat", + "탎": "tap", + "탏": "tal", + "탐": "tam", + "탑": "tap", + "탒": "tap", + "탓": "tat", + "탔": "tat", + "탕": "tang", + "탖": "tat", + "탗": "tat", + "탘": "tak", + "탙": "tat", + "탚": "tap", + "탛": "tat", + "태": "tae", + "택": "taek", + "탞": "taekk", + "탟": "taek", + "탠": "taen", + "탡": "taen", + "탢": "taen", + "탣": "taet", + "탤": "tael", + "탥": "taek", + "탦": "taem", + "탧": "taep", + "탨": "taet", + "탩": "taet", + "탪": "taep", + "탫": "tael", + "탬": "taem", + "탭": "taep", + "탮": "taep", + "탯": "taet", + "탰": "taet", + "탱": "taeng", + "탲": "taet", + "탳": "taet", + "탴": "taek", + "탵": "taet", + "탶": "taep", + "탷": "taet", + "탸": "tya", + "탹": "tyak", + "탺": "tyakk", + "탻": "tyak", + "탼": "tyan", + "탽": "tyan", + "탾": "tyan", + "탿": "tyat", + "턀": "tyal", + "턁": "tyak", + "턂": "tyam", + "턃": "tyap", + "턄": "tyat", + "턅": "tyat", + "턆": "tyap", + "턇": "tyal", + "턈": "tyam", + "턉": "tyap", + "턊": "tyap", + "턋": "tyat", + "턌": "tyat", + "턍": "tyang", + "턎": "tyat", + "턏": "tyat", + "턐": "tyak", + "턑": "tyat", + "턒": "tyap", + "턓": "tyat", + "턔": "tyae", + "턕": "tyaek", + "턖": "tyaekk", + "턗": "tyaek", + "턘": "tyaen", + "턙": "tyaen", + "턚": "tyaen", + "턛": "tyaet", + "턜": "tyael", + "턝": "tyaek", + "턞": "tyaem", + "턟": "tyaep", + "턠": "tyaet", + "턡": "tyaet", + "턢": "tyaep", + "턣": "tyael", + "턤": "tyaem", + "턥": "tyaep", + "턦": "tyaep", + "턧": "tyaet", + "턨": "tyaet", + "턩": "tyaeng", + "턪": "tyaet", + "턫": "tyaet", + "턬": "tyaek", + "턭": "tyaet", + "턮": "tyaep", + "턯": "tyaet", + "터": "teo", + "턱": "teok", + "턲": "teokk", + "턳": "teok", + "턴": "teon", + "턵": "teon", + "턶": "teon", + "턷": "teot", + "털": "teol", + "턹": "teok", + "턺": "teom", + "턻": "teop", + "턼": "teot", + "턽": "teot", + "턾": "teop", + "턿": "teol", + "텀": "teom", + "텁": "teop", + "텂": "teop", + "텃": "teot", + "텄": "teot", + "텅": "teong", + "텆": "teot", + "텇": "teot", + "텈": "teok", + "텉": "teot", + "텊": "teop", + "텋": "teot", + "테": "te", + "텍": "tek", + "텎": "tekk", + "텏": "tek", + "텐": "ten", + "텑": "ten", + "텒": "ten", + "텓": "tet", + "텔": "tel", + "텕": "tek", + "텖": "tem", + "텗": "tep", + "텘": "tet", + "텙": "tet", + "텚": "tep", + "텛": "tel", + "템": "tem", + "텝": "tep", + "텞": "tep", + "텟": "tet", + "텠": "tet", + "텡": "teng", + "텢": "tet", + "텣": "tet", + "텤": "tek", + "텥": "tet", + "텦": "tep", + "텧": "tet", + "텨": "tyeo", + "텩": "tyeok", + "텪": "tyeokk", + "텫": "tyeok", + "텬": "tyeon", + "텭": "tyeon", + "텮": "tyeon", + "텯": "tyeot", + "텰": "tyeol", + "텱": "tyeok", + "텲": "tyeom", + "텳": "tyeop", + "텴": "tyeot", + "텵": "tyeot", + "텶": "tyeop", + "텷": "tyeol", + "텸": "tyeom", + "텹": "tyeop", + "텺": "tyeop", + "텻": "tyeot", + "텼": "tyeot", + "텽": "tyeong", + "텾": "tyeot", + "텿": "tyeot", + "톀": "tyeok", + "톁": "tyeot", + "톂": "tyeop", + "톃": "tyeot", + "톄": "tye", + "톅": "tyek", + "톆": "tyekk", + "톇": "tyek", + "톈": "tyen", + "톉": "tyen", + "톊": "tyen", + "톋": "tyet", + "톌": "tyel", + "톍": "tyek", + "톎": "tyem", + "톏": "tyep", + "톐": "tyet", + "톑": "tyet", + "톒": "tyep", + "톓": "tyel", + "톔": "tyem", + "톕": "tyep", + "톖": "tyep", + "톗": "tyet", + "톘": "tyet", + "톙": "tyeng", + "톚": "tyet", + "톛": "tyet", + "톜": "tyek", + "톝": "tyet", + "톞": "tyep", + "톟": "tyet", + "토": "to", + "톡": "tok", + "톢": "tokk", + "톣": "tok", + "톤": "ton", + "톥": "ton", + "톦": "ton", + "톧": "tot", + "톨": "tol", + "톩": "tok", + "톪": "tom", + "톫": "top", + "톬": "tot", + "톭": "tot", + "톮": "top", + "톯": "tol", + "톰": "tom", + "톱": "top", + "톲": "top", + "톳": "tot", + "톴": "tot", + "통": "tong", + "톶": "tot", + "톷": "tot", + "톸": "tok", + "톹": "tot", + "톺": "top", + "톻": "tot", + "톼": "twa", + "톽": "twak", + "톾": "twakk", + "톿": "twak", + "퇀": "twan", + "퇁": "twan", + "퇂": "twan", + "퇃": "twat", + "퇄": "twal", + "퇅": "twak", + "퇆": "twam", + "퇇": "twap", + "퇈": "twat", + "퇉": "twat", + "퇊": "twap", + "퇋": "twal", + "퇌": "twam", + "퇍": "twap", + "퇎": "twap", + "퇏": "twat", + "퇐": "twat", + "퇑": "twang", + "퇒": "twat", + "퇓": "twat", + "퇔": "twak", + "퇕": "twat", + "퇖": "twap", + "퇗": "twat", + "퇘": "twae", + "퇙": "twaek", + "퇚": "twaekk", + "퇛": "twaek", + "퇜": "twaen", + "퇝": "twaen", + "퇞": "twaen", + "퇟": "twaet", + "퇠": "twael", + "퇡": "twaek", + "퇢": "twaem", + "퇣": "twaep", + "퇤": "twaet", + "퇥": "twaet", + "퇦": "twaep", + "퇧": "twael", + "퇨": "twaem", + "퇩": "twaep", + "퇪": "twaep", + "퇫": "twaet", + "퇬": "twaet", + "퇭": "twaeng", + "퇮": "twaet", + "퇯": "twaet", + "퇰": "twaek", + "퇱": "twaet", + "퇲": "twaep", + "퇳": "twaet", + "퇴": "toe", + "퇵": "toek", + "퇶": "toekk", + "퇷": "toek", + "퇸": "toen", + "퇹": "toen", + "퇺": "toen", + "퇻": "toet", + "퇼": "toel", + "퇽": "toek", + "퇾": "toem", + "퇿": "toep", + "툀": "toet", + "툁": "toet", + "툂": "toep", + "툃": "toel", + "툄": "toem", + "툅": "toep", + "툆": "toep", + "툇": "toet", + "툈": "toet", + "툉": "toeng", + "툊": "toet", + "툋": "toet", + "툌": "toek", + "툍": "toet", + "툎": "toep", + "툏": "toet", + "툐": "tyo", + "툑": "tyok", + "툒": "tyokk", + "툓": "tyok", + "툔": "tyon", + "툕": "tyon", + "툖": "tyon", + "툗": "tyot", + "툘": "tyol", + "툙": "tyok", + "툚": "tyom", + "툛": "tyop", + "툜": "tyot", + "툝": "tyot", + "툞": "tyop", + "툟": "tyol", + "툠": "tyom", + "툡": "tyop", + "툢": "tyop", + "툣": "tyot", + "툤": "tyot", + "툥": "tyong", + "툦": "tyot", + "툧": "tyot", + "툨": "tyok", + "툩": "tyot", + "툪": "tyop", + "툫": "tyot", + "투": "tu", + "툭": "tuk", + "툮": "tukk", + "툯": "tuk", + "툰": "tun", + "툱": "tun", + "툲": "tun", + "툳": "tut", + "툴": "tul", + "툵": "tuk", + "툶": "tum", + "툷": "tup", + "툸": "tut", + "툹": "tut", + "툺": "tup", + "툻": "tul", + "툼": "tum", + "툽": "tup", + "툾": "tup", + "툿": "tut", + "퉀": "tut", + "퉁": "tung", + "퉂": "tut", + "퉃": "tut", + "퉄": "tuk", + "퉅": "tut", + "퉆": "tup", + "퉇": "tut", + "퉈": "two", + "퉉": "twok", + "퉊": "twokk", + "퉋": "twok", + "퉌": "twon", + "퉍": "twon", + "퉎": "twon", + "퉏": "twot", + "퉐": "twol", + "퉑": "twok", + "퉒": "twom", + "퉓": "twop", + "퉔": "twot", + "퉕": "twot", + "퉖": "twop", + "퉗": "twol", + "퉘": "twom", + "퉙": "twop", + "퉚": "twop", + "퉛": "twot", + "퉜": "twot", + "퉝": "twong", + "퉞": "twot", + "퉟": "twot", + "퉠": "twok", + "퉡": "twot", + "퉢": "twop", + "퉣": "twot", + "퉤": "twe", + "퉥": "twek", + "퉦": "twekk", + "퉧": "twek", + "퉨": "twen", + "퉩": "twen", + "퉪": "twen", + "퉫": "twet", + "퉬": "twel", + "퉭": "twek", + "퉮": "twem", + "퉯": "twep", + "퉰": "twet", + "퉱": "twet", + "퉲": "twep", + "퉳": "twel", + "퉴": "twem", + "퉵": "twep", + "퉶": "twep", + "퉷": "twet", + "퉸": "twet", + "퉹": "tweng", + "퉺": "twet", + "퉻": "twet", + "퉼": "twek", + "퉽": "twet", + "퉾": "twep", + "퉿": "twet", + "튀": "twi", + "튁": "twik", + "튂": "twikk", + "튃": "twik", + "튄": "twin", + "튅": "twin", + "튆": "twin", + "튇": "twit", + "튈": "twil", + "튉": "twik", + "튊": "twim", + "튋": "twip", + "튌": "twit", + "튍": "twit", + "튎": "twip", + "튏": "twil", + "튐": "twim", + "튑": "twip", + "튒": "twip", + "튓": "twit", + "튔": "twit", + "튕": "twing", + "튖": "twit", + "튗": "twit", + "튘": "twik", + "튙": "twit", + "튚": "twip", + "튛": "twit", + "튜": "tyu", + "튝": "tyuk", + "튞": "tyukk", + "튟": "tyuk", + "튠": "tyun", + "튡": "tyun", + "튢": "tyun", + "튣": "tyut", + "튤": "tyul", + "튥": "tyuk", + "튦": "tyum", + "튧": "tyup", + "튨": "tyut", + "튩": "tyut", + "튪": "tyup", + "튫": "tyul", + "튬": "tyum", + "튭": "tyup", + "튮": "tyup", + "튯": "tyut", + "튰": "tyut", + "튱": "tyung", + "튲": "tyut", + "튳": "tyut", + "튴": "tyuk", + "튵": "tyut", + "튶": "tyup", + "튷": "tyut", + "트": "teu", + "특": "teuk", + "튺": "teukk", + "튻": "teuk", + "튼": "teun", + "튽": "teun", + "튾": "teun", + "튿": "teut", + "틀": "teul", + "틁": "teuk", + "틂": "teum", + "틃": "teup", + "틄": "teut", + "틅": "teut", + "틆": "teup", + "틇": "teul", + "틈": "teum", + "틉": "teup", + "틊": "teup", + "틋": "teut", + "틌": "teut", + "틍": "teung", + "틎": "teut", + "틏": "teut", + "틐": "teuk", + "틑": "teut", + "틒": "teup", + "틓": "teut", + "틔": "teui", + "틕": "teuik", + "틖": "teuikk", + "틗": "teuik", + "틘": "teuin", + "틙": "teuin", + "틚": "teuin", + "틛": "teuit", + "틜": "teuil", + "틝": "teuik", + "틞": "teuim", + "틟": "teuip", + "틠": "teuit", + "틡": "teuit", + "틢": "teuip", + "틣": "teuil", + "틤": "teuim", + "틥": "teuip", + "틦": "teuip", + "틧": "teuit", + "틨": "teuit", + "틩": "teuing", + "틪": "teuit", + "틫": "teuit", + "틬": "teuik", + "틭": "teuit", + "틮": "teuip", + "틯": "teuit", + "티": "ti", + "틱": "tik", + "틲": "tikk", + "틳": "tik", + "틴": "tin", + "틵": "tin", + "틶": "tin", + "틷": "tit", + "틸": "til", + "틹": "tik", + "틺": "tim", + "틻": "tip", + "틼": "tit", + "틽": "tit", + "틾": "tip", + "틿": "til", + "팀": "tim", + "팁": "tip", + "팂": "tip", + "팃": "tit", + "팄": "tit", + "팅": "ting", + "팆": "tit", + "팇": "tit", + "팈": "tik", + "팉": "tit", + "팊": "tip", + "팋": "tit", + "파": "pa", + "팍": "pak", + "팎": "pakk", + "팏": "pak", + "판": "pan", + "팑": "pan", + "팒": "pan", + "팓": "pat", + "팔": "pal", + "팕": "pak", + "팖": "pam", + "팗": "pap", + "팘": "pat", + "팙": "pat", + "팚": "pap", + "팛": "pal", + "팜": "pam", + "팝": "pap", + "팞": "pap", + "팟": "pat", + "팠": "pat", + "팡": "pang", + "팢": "pat", + "팣": "pat", + "팤": "pak", + "팥": "pat", + "팦": "pap", + "팧": "pat", + "패": "pae", + "팩": "paek", + "팪": "paekk", + "팫": "paek", + "팬": "paen", + "팭": "paen", + "팮": "paen", + "팯": "paet", + "팰": "pael", + "팱": "paek", + "팲": "paem", + "팳": "paep", + "팴": "paet", + "팵": "paet", + "팶": "paep", + "팷": "pael", + "팸": "paem", + "팹": "paep", + "팺": "paep", + "팻": "paet", + "팼": "paet", + "팽": "paeng", + "팾": "paet", + "팿": "paet", + "퍀": "paek", + "퍁": "paet", + "퍂": "paep", + "퍃": "paet", + "퍄": "pya", + "퍅": "pyak", + "퍆": "pyakk", + "퍇": "pyak", + "퍈": "pyan", + "퍉": "pyan", + "퍊": "pyan", + "퍋": "pyat", + "퍌": "pyal", + "퍍": "pyak", + "퍎": "pyam", + "퍏": "pyap", + "퍐": "pyat", + "퍑": "pyat", + "퍒": "pyap", + "퍓": "pyal", + "퍔": "pyam", + "퍕": "pyap", + "퍖": "pyap", + "퍗": "pyat", + "퍘": "pyat", + "퍙": "pyang", + "퍚": "pyat", + "퍛": "pyat", + "퍜": "pyak", + "퍝": "pyat", + "퍞": "pyap", + "퍟": "pyat", + "퍠": "pyae", + "퍡": "pyaek", + "퍢": "pyaekk", + "퍣": "pyaek", + "퍤": "pyaen", + "퍥": "pyaen", + "퍦": "pyaen", + "퍧": "pyaet", + "퍨": "pyael", + "퍩": "pyaek", + "퍪": "pyaem", + "퍫": "pyaep", + "퍬": "pyaet", + "퍭": "pyaet", + "퍮": "pyaep", + "퍯": "pyael", + "퍰": "pyaem", + "퍱": "pyaep", + "퍲": "pyaep", + "퍳": "pyaet", + "퍴": "pyaet", + "퍵": "pyaeng", + "퍶": "pyaet", + "퍷": "pyaet", + "퍸": "pyaek", + "퍹": "pyaet", + "퍺": "pyaep", + "퍻": "pyaet", + "퍼": "peo", + "퍽": "peok", + "퍾": "peokk", + "퍿": "peok", + "펀": "peon", + "펁": "peon", + "펂": "peon", + "펃": "peot", + "펄": "peol", + "펅": "peok", + "펆": "peom", + "펇": "peop", + "펈": "peot", + "펉": "peot", + "펊": "peop", + "펋": "peol", + "펌": "peom", + "펍": "peop", + "펎": "peop", + "펏": "peot", + "펐": "peot", + "펑": "peong", + "펒": "peot", + "펓": "peot", + "펔": "peok", + "펕": "peot", + "펖": "peop", + "펗": "peot", + "페": "pe", + "펙": "pek", + "펚": "pekk", + "펛": "pek", + "펜": "pen", + "펝": "pen", + "펞": "pen", + "펟": "pet", + "펠": "pel", + "펡": "pek", + "펢": "pem", + "펣": "pep", + "펤": "pet", + "펥": "pet", + "펦": "pep", + "펧": "pel", + "펨": "pem", + "펩": "pep", + "펪": "pep", + "펫": "pet", + "펬": "pet", + "펭": "peng", + "펮": "pet", + "펯": "pet", + "펰": "pek", + "펱": "pet", + "펲": "pep", + "펳": "pet", + "펴": "pyeo", + "펵": "pyeok", + "펶": "pyeokk", + "펷": "pyeok", + "편": "pyeon", + "펹": "pyeon", + "펺": "pyeon", + "펻": "pyeot", + "펼": "pyeol", + "펽": "pyeok", + "펾": "pyeom", + "펿": "pyeop", + "폀": "pyeot", + "폁": "pyeot", + "폂": "pyeop", + "폃": "pyeol", + "폄": "pyeom", + "폅": "pyeop", + "폆": "pyeop", + "폇": "pyeot", + "폈": "pyeot", + "평": "pyeong", + "폊": "pyeot", + "폋": "pyeot", + "폌": "pyeok", + "폍": "pyeot", + "폎": "pyeop", + "폏": "pyeot", + "폐": "pye", + "폑": "pyek", + "폒": "pyekk", + "폓": "pyek", + "폔": "pyen", + "폕": "pyen", + "폖": "pyen", + "폗": "pyet", + "폘": "pyel", + "폙": "pyek", + "폚": "pyem", + "폛": "pyep", + "폜": "pyet", + "폝": "pyet", + "폞": "pyep", + "폟": "pyel", + "폠": "pyem", + "폡": "pyep", + "폢": "pyep", + "폣": "pyet", + "폤": "pyet", + "폥": "pyeng", + "폦": "pyet", + "폧": "pyet", + "폨": "pyek", + "폩": "pyet", + "폪": "pyep", + "폫": "pyet", + "포": "po", + "폭": "pok", + "폮": "pokk", + "폯": "pok", + "폰": "pon", + "폱": "pon", + "폲": "pon", + "폳": "pot", + "폴": "pol", + "폵": "pok", + "폶": "pom", + "폷": "pop", + "폸": "pot", + "폹": "pot", + "폺": "pop", + "폻": "pol", + "폼": "pom", + "폽": "pop", + "폾": "pop", + "폿": "pot", + "퐀": "pot", + "퐁": "pong", + "퐂": "pot", + "퐃": "pot", + "퐄": "pok", + "퐅": "pot", + "퐆": "pop", + "퐇": "pot", + "퐈": "pwa", + "퐉": "pwak", + "퐊": "pwakk", + "퐋": "pwak", + "퐌": "pwan", + "퐍": "pwan", + "퐎": "pwan", + "퐏": "pwat", + "퐐": "pwal", + "퐑": "pwak", + "퐒": "pwam", + "퐓": "pwap", + "퐔": "pwat", + "퐕": "pwat", + "퐖": "pwap", + "퐗": "pwal", + "퐘": "pwam", + "퐙": "pwap", + "퐚": "pwap", + "퐛": "pwat", + "퐜": "pwat", + "퐝": "pwang", + "퐞": "pwat", + "퐟": "pwat", + "퐠": "pwak", + "퐡": "pwat", + "퐢": "pwap", + "퐣": "pwat", + "퐤": "pwae", + "퐥": "pwaek", + "퐦": "pwaekk", + "퐧": "pwaek", + "퐨": "pwaen", + "퐩": "pwaen", + "퐪": "pwaen", + "퐫": "pwaet", + "퐬": "pwael", + "퐭": "pwaek", + "퐮": "pwaem", + "퐯": "pwaep", + "퐰": "pwaet", + "퐱": "pwaet", + "퐲": "pwaep", + "퐳": "pwael", + "퐴": "pwaem", + "퐵": "pwaep", + "퐶": "pwaep", + "퐷": "pwaet", + "퐸": "pwaet", + "퐹": "pwaeng", + "퐺": "pwaet", + "퐻": "pwaet", + "퐼": "pwaek", + "퐽": "pwaet", + "퐾": "pwaep", + "퐿": "pwaet", + "푀": "poe", + "푁": "poek", + "푂": "poekk", + "푃": "poek", + "푄": "poen", + "푅": "poen", + "푆": "poen", + "푇": "poet", + "푈": "poel", + "푉": "poek", + "푊": "poem", + "푋": "poep", + "푌": "poet", + "푍": "poet", + "푎": "poep", + "푏": "poel", + "푐": "poem", + "푑": "poep", + "푒": "poep", + "푓": "poet", + "푔": "poet", + "푕": "poeng", + "푖": "poet", + "푗": "poet", + "푘": "poek", + "푙": "poet", + "푚": "poep", + "푛": "poet", + "표": "pyo", + "푝": "pyok", + "푞": "pyokk", + "푟": "pyok", + "푠": "pyon", + "푡": "pyon", + "푢": "pyon", + "푣": "pyot", + "푤": "pyol", + "푥": "pyok", + "푦": "pyom", + "푧": "pyop", + "푨": "pyot", + "푩": "pyot", + "푪": "pyop", + "푫": "pyol", + "푬": "pyom", + "푭": "pyop", + "푮": "pyop", + "푯": "pyot", + "푰": "pyot", + "푱": "pyong", + "푲": "pyot", + "푳": "pyot", + "푴": "pyok", + "푵": "pyot", + "푶": "pyop", + "푷": "pyot", + "푸": "pu", + "푹": "puk", + "푺": "pukk", + "푻": "puk", + "푼": "pun", + "푽": "pun", + "푾": "pun", + "푿": "put", + "풀": "pul", + "풁": "puk", + "풂": "pum", + "풃": "pup", + "풄": "put", + "풅": "put", + "풆": "pup", + "풇": "pul", + "품": "pum", + "풉": "pup", + "풊": "pup", + "풋": "put", + "풌": "put", + "풍": "pung", + "풎": "put", + "풏": "put", + "풐": "puk", + "풑": "put", + "풒": "pup", + "풓": "put", + "풔": "pwo", + "풕": "pwok", + "풖": "pwokk", + "풗": "pwok", + "풘": "pwon", + "풙": "pwon", + "풚": "pwon", + "풛": "pwot", + "풜": "pwol", + "풝": "pwok", + "풞": "pwom", + "풟": "pwop", + "풠": "pwot", + "풡": "pwot", + "풢": "pwop", + "풣": "pwol", + "풤": "pwom", + "풥": "pwop", + "풦": "pwop", + "풧": "pwot", + "풨": "pwot", + "풩": "pwong", + "풪": "pwot", + "풫": "pwot", + "풬": "pwok", + "풭": "pwot", + "풮": "pwop", + "풯": "pwot", + "풰": "pwe", + "풱": "pwek", + "풲": "pwekk", + "풳": "pwek", + "풴": "pwen", + "풵": "pwen", + "풶": "pwen", + "풷": "pwet", + "풸": "pwel", + "풹": "pwek", + "풺": "pwem", + "풻": "pwep", + "풼": "pwet", + "풽": "pwet", + "풾": "pwep", + "풿": "pwel", + "퓀": "pwem", + "퓁": "pwep", + "퓂": "pwep", + "퓃": "pwet", + "퓄": "pwet", + "퓅": "pweng", + "퓆": "pwet", + "퓇": "pwet", + "퓈": "pwek", + "퓉": "pwet", + "퓊": "pwep", + "퓋": "pwet", + "퓌": "pwi", + "퓍": "pwik", + "퓎": "pwikk", + "퓏": "pwik", + "퓐": "pwin", + "퓑": "pwin", + "퓒": "pwin", + "퓓": "pwit", + "퓔": "pwil", + "퓕": "pwik", + "퓖": "pwim", + "퓗": "pwip", + "퓘": "pwit", + "퓙": "pwit", + "퓚": "pwip", + "퓛": "pwil", + "퓜": "pwim", + "퓝": "pwip", + "퓞": "pwip", + "퓟": "pwit", + "퓠": "pwit", + "퓡": "pwing", + "퓢": "pwit", + "퓣": "pwit", + "퓤": "pwik", + "퓥": "pwit", + "퓦": "pwip", + "퓧": "pwit", + "퓨": "pyu", + "퓩": "pyuk", + "퓪": "pyukk", + "퓫": "pyuk", + "퓬": "pyun", + "퓭": "pyun", + "퓮": "pyun", + "퓯": "pyut", + "퓰": "pyul", + "퓱": "pyuk", + "퓲": "pyum", + "퓳": "pyup", + "퓴": "pyut", + "퓵": "pyut", + "퓶": "pyup", + "퓷": "pyul", + "퓸": "pyum", + "퓹": "pyup", + "퓺": "pyup", + "퓻": "pyut", + "퓼": "pyut", + "퓽": "pyung", + "퓾": "pyut", + "퓿": "pyut", + "픀": "pyuk", + "픁": "pyut", + "픂": "pyup", + "픃": "pyut", + "프": "peu", + "픅": "peuk", + "픆": "peukk", + "픇": "peuk", + "픈": "peun", + "픉": "peun", + "픊": "peun", + "픋": "peut", + "플": "peul", + "픍": "peuk", + "픎": "peum", + "픏": "peup", + "픐": "peut", + "픑": "peut", + "픒": "peup", + "픓": "peul", + "픔": "peum", + "픕": "peup", + "픖": "peup", + "픗": "peut", + "픘": "peut", + "픙": "peung", + "픚": "peut", + "픛": "peut", + "픜": "peuk", + "픝": "peut", + "픞": "peup", + "픟": "peut", + "픠": "peui", + "픡": "peuik", + "픢": "peuikk", + "픣": "peuik", + "픤": "peuin", + "픥": "peuin", + "픦": "peuin", + "픧": "peuit", + "픨": "peuil", + "픩": "peuik", + "픪": "peuim", + "픫": "peuip", + "픬": "peuit", + "픭": "peuit", + "픮": "peuip", + "픯": "peuil", + "픰": "peuim", + "픱": "peuip", + "픲": "peuip", + "픳": "peuit", + "픴": "peuit", + "픵": "peuing", + "픶": "peuit", + "픷": "peuit", + "픸": "peuik", + "픹": "peuit", + "픺": "peuip", + "픻": "peuit", + "피": "pi", + "픽": "pik", + "픾": "pikk", + "픿": "pik", + "핀": "pin", + "핁": "pin", + "핂": "pin", + "핃": "pit", + "필": "pil", + "핅": "pik", + "핆": "pim", + "핇": "pip", + "핈": "pit", + "핉": "pit", + "핊": "pip", + "핋": "pil", + "핌": "pim", + "핍": "pip", + "핎": "pip", + "핏": "pit", + "핐": "pit", + "핑": "ping", + "핒": "pit", + "핓": "pit", + "핔": "pik", + "핕": "pit", + "핖": "pip", + "핗": "pit", + "하": "ha", + "학": "hak", + "핚": "hakk", + "핛": "hak", + "한": "han", + "핝": "han", + "핞": "han", + "핟": "hat", + "할": "hal", + "핡": "hak", + "핢": "ham", + "핣": "hap", + "핤": "hat", + "핥": "hat", + "핦": "hap", + "핧": "hal", + "함": "ham", + "합": "hap", + "핪": "hap", + "핫": "hat", + "핬": "hat", + "항": "hang", + "핮": "hat", + "핯": "hat", + "핰": "hak", + "핱": "hat", + "핲": "hap", + "핳": "hat", + "해": "hae", + "핵": "haek", + "핶": "haekk", + "핷": "haek", + "핸": "haen", + "핹": "haen", + "핺": "haen", + "핻": "haet", + "핼": "hael", + "핽": "haek", + "핾": "haem", + "핿": "haep", + "햀": "haet", + "햁": "haet", + "햂": "haep", + "햃": "hael", + "햄": "haem", + "햅": "haep", + "햆": "haep", + "햇": "haet", + "했": "haet", + "행": "haeng", + "햊": "haet", + "햋": "haet", + "햌": "haek", + "햍": "haet", + "햎": "haep", + "햏": "haet", + "햐": "hya", + "햑": "hyak", + "햒": "hyakk", + "햓": "hyak", + "햔": "hyan", + "햕": "hyan", + "햖": "hyan", + "햗": "hyat", + "햘": "hyal", + "햙": "hyak", + "햚": "hyam", + "햛": "hyap", + "햜": "hyat", + "햝": "hyat", + "햞": "hyap", + "햟": "hyal", + "햠": "hyam", + "햡": "hyap", + "햢": "hyap", + "햣": "hyat", + "햤": "hyat", + "향": "hyang", + "햦": "hyat", + "햧": "hyat", + "햨": "hyak", + "햩": "hyat", + "햪": "hyap", + "햫": "hyat", + "햬": "hyae", + "햭": "hyaek", + "햮": "hyaekk", + "햯": "hyaek", + "햰": "hyaen", + "햱": "hyaen", + "햲": "hyaen", + "햳": "hyaet", + "햴": "hyael", + "햵": "hyaek", + "햶": "hyaem", + "햷": "hyaep", + "햸": "hyaet", + "햹": "hyaet", + "햺": "hyaep", + "햻": "hyael", + "햼": "hyaem", + "햽": "hyaep", + "햾": "hyaep", + "햿": "hyaet", + "헀": "hyaet", + "헁": "hyaeng", + "헂": "hyaet", + "헃": "hyaet", + "헄": "hyaek", + "헅": "hyaet", + "헆": "hyaep", + "헇": "hyaet", + "허": "heo", + "헉": "heok", + "헊": "heokk", + "헋": "heok", + "헌": "heon", + "헍": "heon", + "헎": "heon", + "헏": "heot", + "헐": "heol", + "헑": "heok", + "헒": "heom", + "헓": "heop", + "헔": "heot", + "헕": "heot", + "헖": "heop", + "헗": "heol", + "험": "heom", + "헙": "heop", + "헚": "heop", + "헛": "heot", + "헜": "heot", + "헝": "heong", + "헞": "heot", + "헟": "heot", + "헠": "heok", + "헡": "heot", + "헢": "heop", + "헣": "heot", + "헤": "he", + "헥": "hek", + "헦": "hekk", + "헧": "hek", + "헨": "hen", + "헩": "hen", + "헪": "hen", + "헫": "het", + "헬": "hel", + "헭": "hek", + "헮": "hem", + "헯": "hep", + "헰": "het", + "헱": "het", + "헲": "hep", + "헳": "hel", + "헴": "hem", + "헵": "hep", + "헶": "hep", + "헷": "het", + "헸": "het", + "헹": "heng", + "헺": "het", + "헻": "het", + "헼": "hek", + "헽": "het", + "헾": "hep", + "헿": "het", + "혀": "hyeo", + "혁": "hyeok", + "혂": "hyeokk", + "혃": "hyeok", + "현": "hyeon", + "혅": "hyeon", + "혆": "hyeon", + "혇": "hyeot", + "혈": "hyeol", + "혉": "hyeok", + "혊": "hyeom", + "혋": "hyeop", + "혌": "hyeot", + "혍": "hyeot", + "혎": "hyeop", + "혏": "hyeol", + "혐": "hyeom", + "협": "hyeop", + "혒": "hyeop", + "혓": "hyeot", + "혔": "hyeot", + "형": "hyeong", + "혖": "hyeot", + "혗": "hyeot", + "혘": "hyeok", + "혙": "hyeot", + "혚": "hyeop", + "혛": "hyeot", + "혜": "hye", + "혝": "hyek", + "혞": "hyekk", + "혟": "hyek", + "혠": "hyen", + "혡": "hyen", + "혢": "hyen", + "혣": "hyet", + "혤": "hyel", + "혥": "hyek", + "혦": "hyem", + "혧": "hyep", + "혨": "hyet", + "혩": "hyet", + "혪": "hyep", + "혫": "hyel", + "혬": "hyem", + "혭": "hyep", + "혮": "hyep", + "혯": "hyet", + "혰": "hyet", + "혱": "hyeng", + "혲": "hyet", + "혳": "hyet", + "혴": "hyek", + "혵": "hyet", + "혶": "hyep", + "혷": "hyet", + "호": "ho", + "혹": "hok", + "혺": "hokk", + "혻": "hok", + "혼": "hon", + "혽": "hon", + "혾": "hon", + "혿": "hot", + "홀": "hol", + "홁": "hok", + "홂": "hom", + "홃": "hop", + "홄": "hot", + "홅": "hot", + "홆": "hop", + "홇": "hol", + "홈": "hom", + "홉": "hop", + "홊": "hop", + "홋": "hot", + "홌": "hot", + "홍": "hong", + "홎": "hot", + "홏": "hot", + "홐": "hok", + "홑": "hot", + "홒": "hop", + "홓": "hot", + "화": "hwa", + "확": "hwak", + "홖": "hwakk", + "홗": "hwak", + "환": "hwan", + "홙": "hwan", + "홚": "hwan", + "홛": "hwat", + "활": "hwal", + "홝": "hwak", + "홞": "hwam", + "홟": "hwap", + "홠": "hwat", + "홡": "hwat", + "홢": "hwap", + "홣": "hwal", + "홤": "hwam", + "홥": "hwap", + "홦": "hwap", + "홧": "hwat", + "홨": "hwat", + "황": "hwang", + "홪": "hwat", + "홫": "hwat", + "홬": "hwak", + "홭": "hwat", + "홮": "hwap", + "홯": "hwat", + "홰": "hwae", + "홱": "hwaek", + "홲": "hwaekk", + "홳": "hwaek", + "홴": "hwaen", + "홵": "hwaen", + "홶": "hwaen", + "홷": "hwaet", + "홸": "hwael", + "홹": "hwaek", + "홺": "hwaem", + "홻": "hwaep", + "홼": "hwaet", + "홽": "hwaet", + "홾": "hwaep", + "홿": "hwael", + "횀": "hwaem", + "횁": "hwaep", + "횂": "hwaep", + "횃": "hwaet", + "횄": "hwaet", + "횅": "hwaeng", + "횆": "hwaet", + "횇": "hwaet", + "횈": "hwaek", + "횉": "hwaet", + "횊": "hwaep", + "횋": "hwaet", + "회": "hoe", + "획": "hoek", + "횎": "hoekk", + "횏": "hoek", + "횐": "hoen", + "횑": "hoen", + "횒": "hoen", + "횓": "hoet", + "횔": "hoel", + "횕": "hoek", + "횖": "hoem", + "횗": "hoep", + "횘": "hoet", + "횙": "hoet", + "횚": "hoep", + "횛": "hoel", + "횜": "hoem", + "횝": "hoep", + "횞": "hoep", + "횟": "hoet", + "횠": "hoet", + "횡": "hoeng", + "횢": "hoet", + "횣": "hoet", + "횤": "hoek", + "횥": "hoet", + "횦": "hoep", + "횧": "hoet", + "효": "hyo", + "횩": "hyok", + "횪": "hyokk", + "횫": "hyok", + "횬": "hyon", + "횭": "hyon", + "횮": "hyon", + "횯": "hyot", + "횰": "hyol", + "횱": "hyok", + "횲": "hyom", + "횳": "hyop", + "횴": "hyot", + "횵": "hyot", + "횶": "hyop", + "횷": "hyol", + "횸": "hyom", + "횹": "hyop", + "횺": "hyop", + "횻": "hyot", + "횼": "hyot", + "횽": "hyong", + "횾": "hyot", + "횿": "hyot", + "훀": "hyok", + "훁": "hyot", + "훂": "hyop", + "훃": "hyot", + "후": "hu", + "훅": "huk", + "훆": "hukk", + "훇": "huk", + "훈": "hun", + "훉": "hun", + "훊": "hun", + "훋": "hut", + "훌": "hul", + "훍": "huk", + "훎": "hum", + "훏": "hup", + "훐": "hut", + "훑": "hut", + "훒": "hup", + "훓": "hul", + "훔": "hum", + "훕": "hup", + "훖": "hup", + "훗": "hut", + "훘": "hut", + "훙": "hung", + "훚": "hut", + "훛": "hut", + "훜": "huk", + "훝": "hut", + "훞": "hup", + "훟": "hut", + "훠": "hwo", + "훡": "hwok", + "훢": "hwokk", + "훣": "hwok", + "훤": "hwon", + "훥": "hwon", + "훦": "hwon", + "훧": "hwot", + "훨": "hwol", + "훩": "hwok", + "훪": "hwom", + "훫": "hwop", + "훬": "hwot", + "훭": "hwot", + "훮": "hwop", + "훯": "hwol", + "훰": "hwom", + "훱": "hwop", + "훲": "hwop", + "훳": "hwot", + "훴": "hwot", + "훵": "hwong", + "훶": "hwot", + "훷": "hwot", + "훸": "hwok", + "훹": "hwot", + "훺": "hwop", + "훻": "hwot", + "훼": "hwe", + "훽": "hwek", + "훾": "hwekk", + "훿": "hwek", + "휀": "hwen", + "휁": "hwen", + "휂": "hwen", + "휃": "hwet", + "휄": "hwel", + "휅": "hwek", + "휆": "hwem", + "휇": "hwep", + "휈": "hwet", + "휉": "hwet", + "휊": "hwep", + "휋": "hwel", + "휌": "hwem", + "휍": "hwep", + "휎": "hwep", + "휏": "hwet", + "휐": "hwet", + "휑": "hweng", + "휒": "hwet", + "휓": "hwet", + "휔": "hwek", + "휕": "hwet", + "휖": "hwep", + "휗": "hwet", + "휘": "hwi", + "휙": "hwik", + "휚": "hwikk", + "휛": "hwik", + "휜": "hwin", + "휝": "hwin", + "휞": "hwin", + "휟": "hwit", + "휠": "hwil", + "휡": "hwik", + "휢": "hwim", + "휣": "hwip", + "휤": "hwit", + "휥": "hwit", + "휦": "hwip", + "휧": "hwil", + "휨": "hwim", + "휩": "hwip", + "휪": "hwip", + "휫": "hwit", + "휬": "hwit", + "휭": "hwing", + "휮": "hwit", + "휯": "hwit", + "휰": "hwik", + "휱": "hwit", + "휲": "hwip", + "휳": "hwit", + "휴": "hyu", + "휵": "hyuk", + "휶": "hyukk", + "휷": "hyuk", + "휸": "hyun", + "휹": "hyun", + "휺": "hyun", + "휻": "hyut", + "휼": "hyul", + "휽": "hyuk", + "휾": "hyum", + "휿": "hyup", + "흀": "hyut", + "흁": "hyut", + "흂": "hyup", + "흃": "hyul", + "흄": "hyum", + "흅": "hyup", + "흆": "hyup", + "흇": "hyut", + "흈": "hyut", + "흉": "hyung", + "흊": "hyut", + "흋": "hyut", + "흌": "hyuk", + "흍": "hyut", + "흎": "hyup", + "흏": "hyut", + "흐": "heu", + "흑": "heuk", + "흒": "heukk", + "흓": "heuk", + "흔": "heun", + "흕": "heun", + "흖": "heun", + "흗": "heut", + "흘": "heul", + "흙": "heuk", + "흚": "heum", + "흛": "heup", + "흜": "heut", + "흝": "heut", + "흞": "heup", + "흟": "heul", + "흠": "heum", + "흡": "heup", + "흢": "heup", + "흣": "heut", + "흤": "heut", + "흥": "heung", + "흦": "heut", + "흧": "heut", + "흨": "heuk", + "흩": "heut", + "흪": "heup", + "흫": "heut", + "희": "heui", + "흭": "heuik", + "흮": "heuikk", + "흯": "heuik", + "흰": "heuin", + "흱": "heuin", + "흲": "heuin", + "흳": "heuit", + "흴": "heuil", + "흵": "heuik", + "흶": "heuim", + "흷": "heuip", + "흸": "heuit", + "흹": "heuit", + "흺": "heuip", + "흻": "heuil", + "흼": "heuim", + "흽": "heuip", + "흾": "heuip", + "흿": "heuit", + "힀": "heuit", + "힁": "heuing", + "힂": "heuit", + "힃": "heuit", + "힄": "heuik", + "힅": "heuit", + "힆": "heuip", + "힇": "heuit", + "히": "hi", + "힉": "hik", + "힊": "hikk", + "힋": "hik", + "힌": "hin", + "힍": "hin", + "힎": "hin", + "힏": "hit", + "힐": "hil", + "힑": "hik", + "힒": "him", + "힓": "hip", + "힔": "hit", + "힕": "hit", + "힖": "hip", + "힗": "hil", + "힘": "him", + "힙": "hip", + "힚": "hip", + "힛": "hit", + "힜": "hit", + "힝": "hing", + "힞": "hit", + "힟": "hit", + "힠": "hik", + "힡": "hit", + "힢": "hip", + "힣": "hit" +} \ No newline at end of file diff --git a/kirby/i18n/rules/lt.json b/kirby/i18n/rules/lt.json new file mode 100644 index 0000000..23e0d70 --- /dev/null +++ b/kirby/i18n/rules/lt.json @@ -0,0 +1,20 @@ +{ + "Ą": "A", + "Č": "C", + "Ę": "E", + "Ė": "E", + "Į": "I", + "Š": "S", + "Ų": "U", + "Ū": "U", + "Ž": "Z", + "ą": "a", + "č": "c", + "ę": "e", + "ė": "e", + "į": "i", + "š": "s", + "ų": "u", + "ū": "u", + "ž": "z" +} diff --git a/kirby/i18n/rules/lv.json b/kirby/i18n/rules/lv.json new file mode 100644 index 0000000..d5b0010 --- /dev/null +++ b/kirby/i18n/rules/lv.json @@ -0,0 +1,18 @@ +{ + "Ā": "A", + "Ē": "E", + "Ģ": "G", + "Ī": "I", + "Ķ": "K", + "Ļ": "L", + "Ņ": "N", + "Ū": "U", + "ā": "a", + "ē": "e", + "ģ": "g", + "ī": "i", + "ķ": "k", + "ļ": "l", + "ņ": "n", + "ū": "u" +} diff --git a/kirby/i18n/rules/mk.json b/kirby/i18n/rules/mk.json new file mode 100644 index 0000000..7a87f46 --- /dev/null +++ b/kirby/i18n/rules/mk.json @@ -0,0 +1,64 @@ +{ + "А": "A", + "Б": "B", + "В": "V", + "Г": "G", + "Д": "D", + "Ѓ": "Gj", + "Е": "E", + "Ж": "Zh", + "З": "Z", + "Ѕ": "Dz", + "И": "I", + "Ј": "J", + "К": "K", + "Л": "L", + "Љ": "Lj", + "М": "M", + "Н": "N", + "Њ": "Nj", + "О": "O", + "П": "P", + "Р": "R", + "С": "S", + "Т": "T", + "Ќ": "Kj", + "У": "U", + "Ф": "F", + "Х": "H", + "Ц": "C", + "Ч": "Ch", + "Џ": "Dj", + "Ш": "Sh", + "а": "a", + "б": "b", + "в": "v", + "г": "g", + "д": "d", + "ѓ": "gj", + "е": "e", + "ж": "zh", + "з": "z", + "ѕ": "dz", + "и": "i", + "ј": "j", + "к": "k", + "л": "l", + "љ": "lj", + "м": "m", + "н": "n", + "њ": "nj", + "о": "o", + "п": "p", + "р": "r", + "с": "s", + "т": "t", + "ќ": "kj", + "у": "u", + "ф": "f", + "х": "h", + "ц": "c", + "ч": "ch", + "џ": "dj", + "ш": "sh" +} diff --git a/kirby/i18n/rules/my.json b/kirby/i18n/rules/my.json new file mode 100644 index 0000000..08f5a0a --- /dev/null +++ b/kirby/i18n/rules/my.json @@ -0,0 +1,121 @@ +{ + "က": "k", + "ခ": "kh", + "ဂ": "g", + "ဃ": "ga", + "င": "ng", + "စ": "s", + "ဆ": "sa", + "ဇ": "z", + "စျ" : "za", + "ည": "ny", + "ဋ": "t", + "ဌ": "ta", + "ဍ": "d", + "ဎ": "da", + "ဏ": "na", + "တ": "t", + "ထ": "ta", + "ဒ": "d", + "ဓ": "da", + "န": "n", + "ပ": "p", + "ဖ": "pa", + "ဗ": "b", + "ဘ": "ba", + "မ": "m", + "ယ": "y", + "ရ": "ya", + "လ": "l", + "ဝ": "w", + "သ": "th", + "ဟ": "h", + "ဠ": "la", + "အ": "a", + + "ြ": "y", + "ျ": "ya", + "ွ": "w", + "ြွ": "yw", + "ျွ": "ywa", + "ှ": "h", + + "ဧ": "e", + "၏": "-e", + "ဣ": "i", + "ဤ": "-i", + "ဉ": "u", + "ဦ": "-u", + "ဩ": "aw", + "သြော" : "aw", + "ဪ": "aw", + "၍": "ywae", + "၌": "hnaik", + + "၀": "0", + "၁": "1", + "၂": "2", + "၃": "3", + "၄": "4", + "၅": "5", + "၆": "6", + "၇": "7", + "၈": "8", + "၉": "9", + + "္": "", + "့": "", + "း": "", + + "ာ": "a", + "ါ": "a", + "ေ": "e", + "ဲ": "e", + "ိ": "i", + "ီ": "i", + "ို": "o", + "ု": "u", + "ူ": "u", + "ေါင်": "aung", + "ော": "aw", + "ော်": "aw", + "ေါ": "aw", + "ေါ်": "aw", + "်": "at", + "က်": "et", + "ိုက်" : "aik", + "ောက်" : "auk", + "င်" : "in", + "ိုင်" : "aing", + "ောင်" : "aung", + "စ်" : "it", + "ည်" : "i", + "တ်" : "at", + "ိတ်" : "eik", + "ုတ်" : "ok", + "ွတ်" : "ut", + "ေတ်" : "it", + "ဒ်" : "d", + "ိုဒ်" : "ok", + "ုဒ်" : "ait", + "န်" : "an", + "ာန်" : "an", + "ိန်" : "ein", + "ုန်" : "on", + "ွန်" : "un", + "ပ်" : "at", + "ိပ်" : "eik", + "ုပ်" : "ok", + "ွပ်" : "ut", + "န်ုပ်" : "nub", + "မ်" : "an", + "ိမ်" : "ein", + "ုမ်" : "on", + "ွမ်" : "un", + "ယ်" : "e", + "ိုလ်" : "ol", + "ဉ်" : "in", + "ံ": "an", + "ိံ" : "ein", + "ုံ" : "on" +} diff --git a/kirby/i18n/rules/nb.json b/kirby/i18n/rules/nb.json new file mode 100644 index 0000000..66000ba --- /dev/null +++ b/kirby/i18n/rules/nb.json @@ -0,0 +1,8 @@ +{ + "Æ": "AE", + "Ø": "OE", + "Å": "AA", + "æ": "ae", + "ø": "oe", + "å": "aa" +} diff --git a/kirby/i18n/rules/pl.json b/kirby/i18n/rules/pl.json new file mode 100644 index 0000000..5d0c123 --- /dev/null +++ b/kirby/i18n/rules/pl.json @@ -0,0 +1,20 @@ +{ + "Ą": "A", + "Ć": "C", + "Ę": "E", + "Ł": "L", + "Ń": "N", + "Ó": "O", + "Ś": "S", + "Ź": "Z", + "Ż": "Z", + "ą": "a", + "ć": "c", + "ę": "e", + "ł": "l", + "ń": "n", + "ó": "o", + "ś": "s", + "ź": "z", + "ż": "z" +} diff --git a/kirby/i18n/rules/pt_BR.json b/kirby/i18n/rules/pt_BR.json new file mode 100644 index 0000000..39bca6c --- /dev/null +++ b/kirby/i18n/rules/pt_BR.json @@ -0,0 +1,187 @@ + +{ + "°": "0", + "¹": "1", + "²": "2", + "³": "3", + "⁴": "4", + "⁵": "5", + "⁶": "6", + "⁷": "7", + "⁸": "8", + "⁹": "9", + + "₀": "0", + "₁": "1", + "₂": "2", + "₃": "3", + "₄": "4", + "₅": "5", + "₆": "6", + "₇": "7", + "₈": "8", + "₉": "9", + + + "æ": "ae", + "ǽ": "ae", + "À": "A", + "Á": "A", + "Â": "A", + "Ã": "A", + "Å": "AA", + "Ǻ": "A", + "Ă": "A", + "Ǎ": "A", + "Æ": "AE", + "Ǽ": "AE", + "à": "a", + "á": "a", + "â": "a", + "ã": "a", + "å": "aa", + "ǻ": "a", + "ă": "a", + "ǎ": "a", + "ª": "a", + "@": "at", + "Ĉ": "C", + "Ċ": "C", + "Ç": "Ç", + "ç": "ç", + "ĉ": "c", + "ċ": "c", + "©": "c", + "Ð": "Dj", + "Đ": "D", + "ð": "dj", + "đ": "d", + "È": "E", + "É": "E", + "Ê": "E", + "Ë": "E", + "Ĕ": "E", + "Ė": "E", + "è": "e", + "é": "é", + "ê": "e", + "ë": "e", + "ĕ": "e", + "ė": "e", + "ƒ": "f", + "Ĝ": "G", + "Ġ": "G", + "ĝ": "g", + "ġ": "g", + "Ĥ": "H", + "Ħ": "H", + "ĥ": "h", + "ħ": "h", + "Ì": "I", + "Í": "I", + "Î": "I", + "Ï": "I", + "Ĩ": "I", + "Ĭ": "I", + "Ǐ": "I", + "Į": "I", + "IJ": "IJ", + "ì": "i", + "í": "i", + "î": "i", + "ï": "i", + "ĩ": "i", + "ĭ": "i", + "ǐ": "i", + "į": "i", + "ij": "ij", + "Ĵ": "J", + "ĵ": "j", + "Ĺ": "L", + "Ľ": "L", + "Ŀ": "L", + "ĺ": "l", + "ľ": "l", + "ŀ": "l", + "Ñ": "N", + "ñ": "n", + "ʼn": "n", + "Ò": "O", + "Ó": "O", + "Ô": "O", + "Õ": "O", + "Ō": "O", + "Ŏ": "O", + "Ǒ": "O", + "Ő": "O", + "Ơ": "O", + "Ø": "OE", + "Ǿ": "O", + "Œ": "OE", + "ò": "o", + "ó": "o", + "ô": "o", + "õ": "o", + "ō": "o", + "ŏ": "o", + "ǒ": "o", + "ő": "o", + "ơ": "o", + "ø": "oe", + "ǿ": "o", + "º": "o", + "œ": "oe", + "Ŕ": "R", + "Ŗ": "R", + "ŕ": "r", + "ŗ": "r", + "Ŝ": "S", + "Ș": "S", + "ŝ": "s", + "ș": "s", + "ſ": "s", + "Ţ": "T", + "Ț": "T", + "Ŧ": "T", + "Þ": "TH", + "ţ": "t", + "ț": "t", + "ŧ": "t", + "þ": "th", + "Ù": "U", + "Ú": "U", + "Û": "U", + "Ü": "U", + "Ũ": "U", + "Ŭ": "U", + "Ű": "U", + "Ų": "U", + "Ư": "U", + "Ǔ": "U", + "Ǖ": "U", + "Ǘ": "U", + "Ǚ": "U", + "Ǜ": "U", + "ù": "u", + "ú": "u", + "û": "u", + "ü": "u", + "ũ": "u", + "ŭ": "u", + "ű": "u", + "ų": "u", + "ư": "u", + "ǔ": "u", + "ǖ": "u", + "ǘ": "u", + "ǚ": "u", + "ǜ": "u", + "Ŵ": "W", + "ŵ": "w", + "Ý": "Y", + "Ÿ": "Y", + "Ŷ": "Y", + "ý": "y", + "ÿ": "y", + "ŷ": "y" +} diff --git a/kirby/i18n/rules/ro.json b/kirby/i18n/rules/ro.json new file mode 100644 index 0000000..47b9d9b --- /dev/null +++ b/kirby/i18n/rules/ro.json @@ -0,0 +1,16 @@ +{ + "ă": "a", + "î": "i", + "â": "a", + "ş": "s", + "ș": "s", + "ţ": "t", + "ț": "t", + "Ă": "A", + "Î": "I", + "Â": "A", + "Ş": "S", + "Ș": "S", + "Ţ": "T", + "Ț": "T" +} diff --git a/kirby/i18n/rules/ru.json b/kirby/i18n/rules/ru.json new file mode 100644 index 0000000..b8b354c --- /dev/null +++ b/kirby/i18n/rules/ru.json @@ -0,0 +1,68 @@ +{ + "Ъ": "", + "Ь": "", + "А": "A", + "Б": "B", + "Ц": "C", + "Ч": "Ch", + "Д": "D", + "Е": "E", + "Ё": "E", + "Э": "E", + "Ф": "F", + "Г": "G", + "Х": "H", + "И": "I", + "Й": "Y", + "Я": "Ya", + "Ю": "Yu", + "К": "K", + "Л": "L", + "М": "M", + "Н": "N", + "О": "O", + "П": "P", + "Р": "R", + "С": "S", + "Ш": "Sh", + "Щ": "Shch", + "Т": "T", + "У": "U", + "В": "V", + "Ы": "Y", + "З": "Z", + "Ж": "Zh", + "ъ": "", + "ь": "", + "а": "a", + "б": "b", + "ц": "c", + "ч": "ch", + "д": "d", + "е": "e", + "ё": "e", + "э": "e", + "ф": "f", + "г": "g", + "х": "h", + "и": "i", + "й": "y", + "я": "ya", + "ю": "yu", + "к": "k", + "л": "l", + "м": "m", + "н": "n", + "о": "o", + "п": "p", + "р": "r", + "с": "s", + "ш": "sh", + "щ": "shch", + "т": "t", + "у": "u", + "в": "v", + "ы": "y", + "з": "z", + "ж": "zh" +} diff --git a/kirby/i18n/rules/sr.json b/kirby/i18n/rules/sr.json new file mode 100644 index 0000000..f4c11db --- /dev/null +++ b/kirby/i18n/rules/sr.json @@ -0,0 +1,72 @@ +{ + "а": "a", + "б": "b", + "в": "v", + "г": "g", + "д": "d", + "ђ": "dj", + "е": "e", + "ж": "z", + "з": "z", + "и": "i", + "ј": "j", + "к": "k", + "л": "l", + "љ": "lj", + "м": "m", + "н": "n", + "њ": "nj", + "о": "o", + "п": "p", + "р": "r", + "с": "s", + "т": "t", + "ћ": "c", + "у": "u", + "ф": "f", + "х": "h", + "ц": "c", + "ч": "c", + "џ": "dz", + "ш": "s", + "А": "A", + "Б": "B", + "В": "V", + "Г": "G", + "Д": "D", + "Ђ": "Dj", + "Е": "E", + "Ж": "Z", + "З": "Z", + "И": "I", + "Ј": "J", + "К": "K", + "Л": "L", + "Љ": "Lj", + "М": "M", + "Н": "N", + "Њ": "Nj", + "О": "O", + "П": "P", + "Р": "R", + "С": "S", + "Т": "T", + "Ћ": "C", + "У": "U", + "Ф": "F", + "Х": "H", + "Ц": "C", + "Ч": "C", + "Џ": "Dz", + "Ш": "S", + "š": "s", + "đ": "dj", + "ž": "z", + "ć": "c", + "č": "c", + "Š": "S", + "Đ": "DJ", + "Ž": "Z", + "Ć": "C", + "Č": "C" +} \ No newline at end of file diff --git a/kirby/i18n/rules/sv_SE.json b/kirby/i18n/rules/sv_SE.json new file mode 100644 index 0000000..a22f3eb --- /dev/null +++ b/kirby/i18n/rules/sv_SE.json @@ -0,0 +1,8 @@ +{ + "Ä": "A", + "Å": "a", + "Ö": "O", + "ä": "a", + "å": "a", + "ö": "o" +} diff --git a/kirby/i18n/rules/tr.json b/kirby/i18n/rules/tr.json new file mode 100644 index 0000000..07fbae5 --- /dev/null +++ b/kirby/i18n/rules/tr.json @@ -0,0 +1,14 @@ +{ + "Ç": "C", + "Ğ": "G", + "İ": "I", + "Ş": "S", + "Ö": "O", + "Ü": "U", + "ç": "c", + "ğ": "g", + "ı": "i", + "ş": "s", + "ö": "o", + "ü": "u" +} diff --git a/kirby/i18n/rules/uk.json b/kirby/i18n/rules/uk.json new file mode 100644 index 0000000..673b7ed --- /dev/null +++ b/kirby/i18n/rules/uk.json @@ -0,0 +1,10 @@ +{ + "Ґ": "G", + "І": "I", + "Ї": "Ji", + "Є": "Ye", + "ґ": "g", + "і": "i", + "ї": "ji", + "є": "ye" +} diff --git a/kirby/i18n/rules/vi.json b/kirby/i18n/rules/vi.json new file mode 100644 index 0000000..fdeff69 --- /dev/null +++ b/kirby/i18n/rules/vi.json @@ -0,0 +1,135 @@ +{ + "à": "a", + "ạ": "a", + "á": "a", + "ả": "a", + "ã": "a", + "â": "a", + "ầ": "a", + "ấ": "a", + "ậ": "a", + "ẩ": "a", + "ẫ": "a", + "ă": "a", + "ằ": "a", + "ắ": "a", + "ặ": "a", + "ẳ": "a", + "ẵ": "a", + "è": "e", + "é": "e", + "ẹ": "e", + "ẻ": "e", + "ẽ": "e", + "ê": "e", + "ề": "e", + "ế": "e", + "ệ": "e", + "ể": "e", + "ễ": "e", + "ì": "i", + "í": "i", + "ị": "i", + "ỉ": "i", + "ĩ": "i", + "ò": "o", + "ó": "o", + "ọ": "o", + "ỏ": "o", + "õ": "o", + "ô": "o", + "ồ": "o", + "ố": "o", + "ộ": "o", + "ổ": "o", + "ỗ": "o", + "ơ": "o", + "ờ": "o", + "ớ": "o", + "ợ": "o", + "ở": "o", + "ỡ": "o", + "ù": "u", + "ú": "u", + "ụ": "u", + "ủ": "u", + "ũ": "u", + "ư": "u", + "ừ": "u", + "ứ": "u", + "ự": "u", + "ử": "u", + "ữ": "u", + "y": "y", + "ỳ": "y", + "ý": "y", + "ỵ": "y", + "ỷ": "y", + "ỹ": "y", + "À": "A", + "Á": "A", + "Ạ": "A", + "Ả": "A", + "Ã": "A", + "Â": "A", + "Ầ": "A", + "Ấ": "A", + "Ậ": "A", + "Ẩ": "A", + "Ẫ": "A", + "Ă": "A", + "Ằ": "A", + "Ắ": "A", + "Ặ": "A", + "Ẳ": "A", + "Ẵ": "A", + "È": "E", + "É": "E", + "Ẹ": "E", + "Ẻ": "E", + "Ẽ": "E", + "Ê": "E", + "Ề": "E", + "Ế": "E", + "Ệ": "E", + "Ể": "E", + "Ễ": "E", + "Ì": "I", + "Í": "I", + "Ị": "I", + "Ỉ": "I", + "Ĩ": "I", + "Ò": "O", + "Ó": "O", + "Ọ": "O", + "Ỏ": "O", + "Õ": "O", + "Ô": "O", + "Ồ": "O", + "Ố": "O", + "Ộ": "O", + "Ổ": "O", + "Ỗ": "O", + "Ơ": "O", + "Ờ": "O", + "Ớ": "O", + "Ợ": "O", + "Ở": "O", + "Ỡ": "O", + "Ù": "U", + "Ụ": "U", + "Ủ": "U", + "Ũ": "U", + "Ư": "U", + "Ừ": "U", + "Ứ": "U", + "Ự": "U", + "Ử": "U", + "Ữ": "U", + "Y": "Y", + "Ỳ": "Y", + "Ý": "Y", + "Ỵ": "Y", + "Ỷ": "Y", + "Ỹ": "Y" +} diff --git a/kirby/i18n/rules/zh.json b/kirby/i18n/rules/zh.json new file mode 100644 index 0000000..21ec594 --- /dev/null +++ b/kirby/i18n/rules/zh.json @@ -0,0 +1,6937 @@ +{ + "腌" : "yan", + "嗄" : "a", + "迫" : "po", + "捱" : "ai", + "艾" : "ai", + "瑷" : "ai", + "嗌" : "ai", + "犴" : "an", + "鳌" : "ao", + "廒" : "ao", + "拗" : "niu", + "岙" : "ao", + "鏊" : "ao", + "扒" : "ba", + "岜" : "ba", + "耙" : "pa", + "鲅" : "ba", + "癍" : "ban", + "膀" : "pang", + "磅" : "bang", + "炮" : "pao", + "曝" : "pu", + "刨" : "pao", + "瀑" : "pu", + "陂" : "bei", + "埤" : "pi", + "鹎" : "bei", + "邶" : "bei", + "孛" : "bei", + "鐾" : "bei", + "鞴" : "bei", + "畚" : "ben", + "甏" : "beng", + "舭" : "bi", + "秘" : "mi", + "辟" : "pi", + "泌" : "mi", + "裨" : "bi", + "濞" : "bi", + "庳" : "bi", + "嬖" : "bi", + "畀" : "bi", + "筚" : "bi", + "箅" : "bi", + "襞" : "bi", + "跸" : "bi", + "笾" : "bian", + "扁" : "bian", + "碥" : "bian", + "窆" : "bian", + "便" : "bian", + "弁" : "bian", + "缏" : "bian", + "骠" : "biao", + "杓" : "shao", + "飚" : "biao", + "飑" : "biao", + "瘭" : "biao", + "髟" : "biao", + "玢" : "bin", + "豳" : "bin", + "镔" : "bin", + "膑" : "bin", + "屏" : "ping", + "泊" : "bo", + "逋" : "bu", + "晡" : "bu", + "钸" : "bu", + "醭" : "bu", + "埔" : "pu", + "瓿" : "bu", + "礤" : "ca", + "骖" : "can", + "藏" : "cang", + "艚" : "cao", + "侧" : "ce", + "喳" : "zha", + "刹" : "sha", + "瘥" : "chai", + "禅" : "chan", + "廛" : "chan", + "镡" : "tan", + "澶" : "chan", + "躔" : "chan", + "阊" : "chang", + "鲳" : "chang", + "长" : "chang", + "苌" : "chang", + "氅" : "chang", + "鬯" : "chang", + "焯" : "chao", + "朝" : "chao", + "车" : "che", + "琛" : "chen", + "谶" : "chen", + "榇" : "chen", + "蛏" : "cheng", + "埕" : "cheng", + "枨" : "cheng", + "塍" : "cheng", + "裎" : "cheng", + "螭" : "chi", + "眵" : "chi", + "墀" : "chi", + "篪" : "chi", + "坻" : "di", + "瘛" : "chi", + "种" : "zhong", + "重" : "zhong", + "仇" : "chou", + "帱" : "chou", + "俦" : "chou", + "雠" : "chou", + "臭" : "chou", + "楮" : "chu", + "畜" : "chu", + "嘬" : "zuo", + "膪" : "chuai", + "巛" : "chuan", + "椎" : "zhui", + "呲" : "ci", + "兹" : "zi", + "伺" : "si", + "璁" : "cong", + "楱" : "cou", + "攒" : "zan", + "爨" : "cuan", + "隹" : "zhui", + "榱" : "cui", + "撮" : "cuo", + "鹾" : "cuo", + "嗒" : "da", + "哒" : "da", + "沓" : "ta", + "骀" : "tai", + "绐" : "dai", + "埭" : "dai", + "甙" : "dai", + "弹" : "dan", + "澹" : "dan", + "叨" : "dao", + "纛" : "dao", + "簦" : "deng", + "提" : "ti", + "翟" : "zhai", + "绨" : "ti", + "丶" : "dian", + "佃" : "dian", + "簟" : "dian", + "癜" : "dian", + "调" : "tiao", + "铞" : "diao", + "佚" : "yi", + "堞" : "die", + "瓞" : "die", + "揲" : "die", + "垤" : "die", + "疔" : "ding", + "岽" : "dong", + "硐" : "dong", + "恫" : "dong", + "垌" : "dong", + "峒" : "dong", + "芏" : "du", + "煅" : "duan", + "碓" : "dui", + "镦" : "dui", + "囤" : "tun", + "铎" : "duo", + "缍" : "duo", + "驮" : "tuo", + "沲" : "tuo", + "柁" : "tuo", + "哦" : "o", + "恶" : "e", + "轭" : "e", + "锷" : "e", + "鹗" : "e", + "阏" : "e", + "诶" : "ea", + "鲕" : "er", + "珥" : "er", + "佴" : "er", + "番" : "fan", + "彷" : "pang", + "霏" : "fei", + "蜚" : "fei", + "鲱" : "fei", + "芾" : "fei", + "瀵" : "fen", + "鲼" : "fen", + "否" : "fou", + "趺" : "fu", + "桴" : "fu", + "莩" : "fu", + "菔" : "fu", + "幞" : "fu", + "郛" : "fu", + "绂" : "fu", + "绋" : "fu", + "祓" : "fu", + "砩" : "fu", + "黻" : "fu", + "罘" : "fu", + "蚨" : "fu", + "脯" : "pu", + "滏" : "fu", + "黼" : "fu", + "鲋" : "fu", + "鳆" : "fu", + "咖" : "ka", + "噶" : "ga", + "轧" : "zha", + "陔" : "gai", + "戤" : "gai", + "扛" : "kang", + "戆" : "gang", + "筻" : "gang", + "槔" : "gao", + "藁" : "gao", + "缟" : "gao", + "咯" : "ge", + "仡" : "yi", + "搿" : "ge", + "塥" : "ge", + "鬲" : "ge", + "哿" : "ge", + "句" : "ju", + "缑" : "gou", + "鞲" : "gou", + "笱" : "gou", + "遘" : "gou", + "瞽" : "gu", + "罟" : "gu", + "嘏" : "gu", + "牿" : "gu", + "鲴" : "gu", + "栝" : "kuo", + "莞" : "guan", + "纶" : "lun", + "涫" : "guan", + "涡" : "wo", + "呙" : "guo", + "馘" : "guo", + "猓" : "guo", + "咳" : "ke", + "氦" : "hai", + "颔" : "han", + "吭" : "keng", + "颃" : "hang", + "巷" : "xiang", + "蚵" : "ke", + "翮" : "he", + "吓" : "xia", + "桁" : "heng", + "泓" : "hong", + "蕻" : "hong", + "黉" : "hong", + "後" : "hou", + "唿" : "hu", + "煳" : "hu", + "浒" : "hu", + "祜" : "hu", + "岵" : "hu", + "鬟" : "huan", + "圜" : "huan", + "郇" : "xun", + "锾" : "huan", + "逭" : "huan", + "咴" : "hui", + "虺" : "hui", + "会" : "hui", + "溃" : "kui", + "哕" : "hui", + "缋" : "hui", + "锪" : "huo", + "蠖" : "huo", + "缉" : "ji", + "稽" : "ji", + "赍" : "ji", + "丌" : "ji", + "咭" : "ji", + "亟" : "ji", + "殛" : "ji", + "戢" : "ji", + "嵴" : "ji", + "蕺" : "ji", + "系" : "xi", + "蓟" : "ji", + "霁" : "ji", + "荠" : "qi", + "跽" : "ji", + "哜" : "ji", + "鲚" : "ji", + "洎" : "ji", + "芰" : "ji", + "茄" : "qie", + "珈" : "jia", + "迦" : "jia", + "笳" : "jia", + "葭" : "jia", + "跏" : "jia", + "郏" : "jia", + "恝" : "jia", + "铗" : "jia", + "袷" : "qia", + "蛱" : "jia", + "角" : "jiao", + "挢" : "jiao", + "岬" : "jia", + "徼" : "jiao", + "湫" : "qiu", + "敫" : "jiao", + "瘕" : "jia", + "浅" : "qian", + "蒹" : "jian", + "搛" : "jian", + "湔" : "jian", + "缣" : "jian", + "犍" : "jian", + "鹣" : "jian", + "鲣" : "jian", + "鞯" : "jian", + "蹇" : "jian", + "謇" : "jian", + "硷" : "jian", + "枧" : "jian", + "戬" : "jian", + "谫" : "jian", + "囝" : "jian", + "裥" : "jian", + "笕" : "jian", + "翦" : "jian", + "趼" : "jian", + "楗" : "jian", + "牮" : "jian", + "踺" : "jian", + "茳" : "jiang", + "礓" : "jiang", + "耩" : "jiang", + "降" : "jiang", + "绛" : "jiang", + "洚" : "jiang", + "鲛" : "jiao", + "僬" : "jiao", + "鹪" : "jiao", + "艽" : "jiao", + "茭" : "jiao", + "嚼" : "jiao", + "峤" : "qiao", + "觉" : "jiao", + "校" : "xiao", + "噍" : "jiao", + "醮" : "jiao", + "疖" : "jie", + "喈" : "jie", + "桔" : "ju", + "拮" : "jie", + "桀" : "jie", + "颉" : "jie", + "婕" : "jie", + "羯" : "jie", + "鲒" : "jie", + "蚧" : "jie", + "骱" : "jie", + "衿" : "jin", + "馑" : "jin", + "卺" : "jin", + "廑" : "jin", + "堇" : "jin", + "槿" : "jin", + "靳" : "jin", + "缙" : "jin", + "荩" : "jin", + "赆" : "jin", + "妗" : "jin", + "旌" : "jing", + "腈" : "jing", + "憬" : "jing", + "肼" : "jing", + "迳" : "jing", + "胫" : "jing", + "弪" : "jing", + "獍" : "jing", + "扃" : "jiong", + "鬏" : "jiu", + "疚" : "jiu", + "僦" : "jiu", + "桕" : "jiu", + "疽" : "ju", + "裾" : "ju", + "苴" : "ju", + "椐" : "ju", + "锔" : "ju", + "琚" : "ju", + "鞫" : "ju", + "踽" : "ju", + "榉" : "ju", + "莒" : "ju", + "遽" : "ju", + "倨" : "ju", + "钜" : "ju", + "犋" : "ju", + "屦" : "ju", + "榘" : "ju", + "窭" : "ju", + "讵" : "ju", + "醵" : "ju", + "苣" : "ju", + "圈" : "quan", + "镌" : "juan", + "蠲" : "juan", + "锩" : "juan", + "狷" : "juan", + "桊" : "juan", + "鄄" : "juan", + "獗" : "jue", + "攫" : "jue", + "孓" : "jue", + "橛" : "jue", + "珏" : "jue", + "桷" : "jue", + "劂" : "jue", + "爝" : "jue", + "镢" : "jue", + "觖" : "jue", + "筠" : "jun", + "麇" : "jun", + "捃" : "jun", + "浚" : "jun", + "喀" : "ka", + "卡" : "ka", + "佧" : "ka", + "胩" : "ka", + "锎" : "kai", + "蒈" : "kai", + "剀" : "kai", + "垲" : "kai", + "锴" : "kai", + "戡" : "kan", + "莰" : "kan", + "闶" : "kang", + "钪" : "kang", + "尻" : "kao", + "栲" : "kao", + "柯" : "ke", + "疴" : "ke", + "钶" : "ke", + "颏" : "ke", + "珂" : "ke", + "髁" : "ke", + "壳" : "ke", + "岢" : "ke", + "溘" : "ke", + "骒" : "ke", + "缂" : "ke", + "氪" : "ke", + "锞" : "ke", + "裉" : "ken", + "倥" : "kong", + "崆" : "kong", + "箜" : "kong", + "芤" : "kou", + "眍" : "kou", + "筘" : "kou", + "刳" : "ku", + "堀" : "ku", + "喾" : "ku", + "侉" : "kua", + "蒯" : "kuai", + "哙" : "kuai", + "狯" : "kuai", + "郐" : "kuai", + "匡" : "kuang", + "夼" : "kuang", + "邝" : "kuang", + "圹" : "kuang", + "纩" : "kuang", + "贶" : "kuang", + "岿" : "kui", + "悝" : "kui", + "睽" : "kui", + "逵" : "kui", + "馗" : "kui", + "夔" : "kui", + "喹" : "kui", + "隗" : "wei", + "暌" : "kui", + "揆" : "kui", + "蝰" : "kui", + "跬" : "kui", + "喟" : "kui", + "聩" : "kui", + "篑" : "kui", + "蒉" : "kui", + "愦" : "kui", + "锟" : "kun", + "醌" : "kun", + "琨" : "kun", + "髡" : "kun", + "悃" : "kun", + "阃" : "kun", + "蛞" : "kuo", + "砬" : "la", + "落" : "luo", + "剌" : "la", + "瘌" : "la", + "涞" : "lai", + "崃" : "lai", + "铼" : "lai", + "赉" : "lai", + "濑" : "lai", + "斓" : "lan", + "镧" : "lan", + "谰" : "lan", + "漤" : "lan", + "罱" : "lan", + "稂" : "lang", + "阆" : "lang", + "莨" : "liang", + "蒗" : "lang", + "铹" : "lao", + "痨" : "lao", + "醪" : "lao", + "栳" : "lao", + "铑" : "lao", + "耢" : "lao", + "勒" : "le", + "仂" : "le", + "叻" : "le", + "泐" : "le", + "鳓" : "le", + "了" : "le", + "镭" : "lei", + "嫘" : "lei", + "缧" : "lei", + "檑" : "lei", + "诔" : "lei", + "耒" : "lei", + "酹" : "lei", + "塄" : "leng", + "愣" : "leng", + "藜" : "li", + "骊" : "li", + "黧" : "li", + "缡" : "li", + "嫠" : "li", + "鲡" : "li", + "蓠" : "li", + "澧" : "li", + "锂" : "li", + "醴" : "li", + "鳢" : "li", + "俪" : "li", + "砺" : "li", + "郦" : "li", + "詈" : "li", + "猁" : "li", + "溧" : "li", + "栎" : "li", + "轹" : "li", + "傈" : "li", + "坜" : "li", + "苈" : "li", + "疠" : "li", + "疬" : "li", + "篥" : "li", + "粝" : "li", + "跞" : "li", + "俩" : "liang", + "裢" : "lian", + "濂" : "lian", + "臁" : "lian", + "奁" : "lian", + "蠊" : "lian", + "琏" : "lian", + "蔹" : "lian", + "裣" : "lian", + "楝" : "lian", + "潋" : "lian", + "椋" : "liang", + "墚" : "liang", + "寮" : "liao", + "鹩" : "liao", + "蓼" : "liao", + "钌" : "liao", + "廖" : "liao", + "尥" : "liao", + "洌" : "lie", + "捩" : "lie", + "埒" : "lie", + "躐" : "lie", + "鬣" : "lie", + "辚" : "lin", + "遴" : "lin", + "啉" : "lin", + "瞵" : "lin", + "懔" : "lin", + "廪" : "lin", + "蔺" : "lin", + "膦" : "lin", + "酃" : "ling", + "柃" : "ling", + "鲮" : "ling", + "呤" : "ling", + "镏" : "liu", + "旒" : "liu", + "骝" : "liu", + "鎏" : "liu", + "锍" : "liu", + "碌" : "lu", + "鹨" : "liu", + "茏" : "long", + "栊" : "long", + "泷" : "long", + "砻" : "long", + "癃" : "long", + "垅" : "long", + "偻" : "lou", + "蝼" : "lou", + "蒌" : "lou", + "耧" : "lou", + "嵝" : "lou", + "露" : "lu", + "瘘" : "lou", + "噜" : "lu", + "轳" : "lu", + "垆" : "lu", + "胪" : "lu", + "舻" : "lu", + "栌" : "lu", + "镥" : "lu", + "绿" : "lv", + "辘" : "lu", + "簏" : "lu", + "潞" : "lu", + "辂" : "lu", + "渌" : "lu", + "氇" : "lu", + "捋" : "lv", + "稆" : "lv", + "率" : "lv", + "闾" : "lv", + "栾" : "luan", + "銮" : "luan", + "滦" : "luan", + "娈" : "luan", + "脔" : "luan", + "锊" : "lve", + "猡" : "luo", + "椤" : "luo", + "脶" : "luo", + "镙" : "luo", + "倮" : "luo", + "蠃" : "luo", + "瘰" : "luo", + "珞" : "luo", + "泺" : "luo", + "荦" : "luo", + "雒" : "luo", + "呒" : "mu", + "抹" : "mo", + "唛" : "mai", + "杩" : "ma", + "么" : "me", + "埋" : "mai", + "荬" : "mai", + "脉" : "mai", + "劢" : "mai", + "颟" : "man", + "蔓" : "man", + "鳗" : "man", + "鞔" : "man", + "螨" : "man", + "墁" : "man", + "缦" : "man", + "熳" : "man", + "镘" : "man", + "邙" : "mang", + "硭" : "mang", + "旄" : "mao", + "茆" : "mao", + "峁" : "mao", + "泖" : "mao", + "昴" : "mao", + "耄" : "mao", + "瑁" : "mao", + "懋" : "mao", + "瞀" : "mao", + "麽" : "me", + "没" : "mei", + "嵋" : "mei", + "湄" : "mei", + "猸" : "mei", + "镅" : "mei", + "鹛" : "mei", + "浼" : "mei", + "钔" : "men", + "瞢" : "meng", + "甍" : "meng", + "礞" : "meng", + "艨" : "meng", + "黾" : "mian", + "鳘" : "min", + "溟" : "ming", + "暝" : "ming", + "模" : "mo", + "谟" : "mo", + "嫫" : "mo", + "镆" : "mo", + "瘼" : "mo", + "耱" : "mo", + "貊" : "mo", + "貘" : "mo", + "牟" : "mou", + "鍪" : "mou", + "蛑" : "mou", + "侔" : "mou", + "毪" : "mu", + "坶" : "mu", + "仫" : "mu", + "唔" : "wu", + "那" : "na", + "镎" : "na", + "哪" : "na", + "呢" : "ne", + "肭" : "na", + "艿" : "nai", + "鼐" : "nai", + "萘" : "nai", + "柰" : "nai", + "蝻" : "nan", + "馕" : "nang", + "攮" : "nang", + "曩" : "nang", + "猱" : "nao", + "铙" : "nao", + "硇" : "nao", + "蛲" : "nao", + "垴" : "nao", + "坭" : "ni", + "猊" : "ni", + "铌" : "ni", + "鲵" : "ni", + "祢" : "mi", + "睨" : "ni", + "慝" : "te", + "伲" : "ni", + "鲇" : "nian", + "鲶" : "nian", + "埝" : "nian", + "嬲" : "niao", + "茑" : "niao", + "脲" : "niao", + "啮" : "nie", + "陧" : "nie", + "颞" : "nie", + "臬" : "nie", + "蘖" : "nie", + "甯" : "ning", + "聍" : "ning", + "狃" : "niu", + "侬" : "nong", + "耨" : "nou", + "孥" : "nu", + "胬" : "nu", + "钕" : "nv", + "恧" : "nv", + "褰" : "qian", + "掮" : "qian", + "荨" : "xun", + "钤" : "qian", + "箝" : "qian", + "鬈" : "quan", + "缱" : "qian", + "肷" : "qian", + "纤" : "xian", + "茜" : "qian", + "慊" : "qian", + "椠" : "qian", + "戗" : "qiang", + "镪" : "qiang", + "锖" : "qiang", + "樯" : "qiang", + "嫱" : "qiang", + "雀" : "que", + "缲" : "qiao", + "硗" : "qiao", + "劁" : "qiao", + "樵" : "qiao", + "谯" : "qiao", + "鞒" : "qiao", + "愀" : "qiao", + "鞘" : "qiao", + "郄" : "xi", + "箧" : "qie", + "亲" : "qin", + "覃" : "tan", + "溱" : "qin", + "檎" : "qin", + "锓" : "qin", + "嗪" : "qin", + "螓" : "qin", + "揿" : "qin", + "吣" : "qin", + "圊" : "qing", + "鲭" : "qing", + "檠" : "qing", + "黥" : "qing", + "謦" : "qing", + "苘" : "qing", + "磬" : "qing", + "箐" : "qing", + "綮" : "qi", + "茕" : "qiong", + "邛" : "dao", + "蛩" : "tun", + "筇" : "qiong", + "跫" : "qiong", + "銎" : "qiong", + "楸" : "qiu", + "俅" : "qiu", + "赇" : "qiu", + "逑" : "qiu", + "犰" : "qiu", + "蝤" : "qiu", + "巯" : "qiu", + "鼽" : "qiu", + "糗" : "qiu", + "区" : "qu", + "祛" : "qu", + "麴" : "qu", + "诎" : "qu", + "衢" : "qu", + "癯" : "qu", + "劬" : "qu", + "璩" : "qu", + "氍" : "qu", + "朐" : "qu", + "磲" : "qu", + "鸲" : "qu", + "蕖" : "qu", + "蠼" : "qu", + "蘧" : "qu", + "阒" : "qu", + "颧" : "quan", + "荃" : "quan", + "铨" : "quan", + "辁" : "quan", + "筌" : "quan", + "绻" : "quan", + "畎" : "quan", + "阕" : "que", + "悫" : "que", + "髯" : "ran", + "禳" : "rang", + "穰" : "rang", + "仞" : "ren", + "妊" : "ren", + "轫" : "ren", + "衽" : "ren", + "狨" : "rong", + "肜" : "rong", + "蝾" : "rong", + "嚅" : "ru", + "濡" : "ru", + "薷" : "ru", + "襦" : "ru", + "颥" : "ru", + "洳" : "ru", + "溽" : "ru", + "蓐" : "ru", + "朊" : "ruan", + "蕤" : "rui", + "枘" : "rui", + "箬" : "ruo", + "挲" : "suo", + "脎" : "sa", + "塞" : "sai", + "鳃" : "sai", + "噻" : "sai", + "毵" : "san", + "馓" : "san", + "糁" : "san", + "霰" : "xian", + "磉" : "sang", + "颡" : "sang", + "缫" : "sao", + "鳋" : "sao", + "埽" : "sao", + "瘙" : "sao", + "色" : "se", + "杉" : "shan", + "鲨" : "sha", + "痧" : "sha", + "裟" : "sha", + "铩" : "sha", + "唼" : "sha", + "酾" : "shai", + "栅" : "zha", + "跚" : "shan", + "芟" : "shan", + "埏" : "shan", + "钐" : "shan", + "舢" : "shan", + "剡" : "yan", + "鄯" : "shan", + "疝" : "shan", + "蟮" : "shan", + "墒" : "shang", + "垧" : "shang", + "绱" : "shang", + "蛸" : "shao", + "筲" : "shao", + "苕" : "tiao", + "召" : "zhao", + "劭" : "shao", + "猞" : "she", + "畲" : "she", + "折" : "zhe", + "滠" : "she", + "歙" : "xi", + "厍" : "she", + "莘" : "shen", + "娠" : "shen", + "诜" : "shen", + "什" : "shen", + "谂" : "shen", + "渖" : "shen", + "矧" : "shen", + "胂" : "shen", + "椹" : "shen", + "省" : "sheng", + "眚" : "sheng", + "嵊" : "sheng", + "嘘" : "xu", + "蓍" : "shi", + "鲺" : "shi", + "识" : "shi", + "拾" : "shi", + "埘" : "shi", + "莳" : "shi", + "炻" : "shi", + "鲥" : "shi", + "豕" : "shi", + "似" : "si", + "噬" : "shi", + "贳" : "shi", + "铈" : "shi", + "螫" : "shi", + "筮" : "shi", + "殖" : "zhi", + "熟" : "shu", + "艏" : "shou", + "菽" : "shu", + "摅" : "shu", + "纾" : "shu", + "毹" : "shu", + "疋" : "shu", + "数" : "shu", + "属" : "shu", + "术" : "shu", + "澍" : "shu", + "沭" : "shu", + "丨" : "shu", + "腧" : "shu", + "说" : "shuo", + "妁" : "shuo", + "蒴" : "shuo", + "槊" : "shuo", + "搠" : "shuo", + "鸶" : "si", + "澌" : "si", + "缌" : "si", + "锶" : "si", + "厶" : "si", + "蛳" : "si", + "驷" : "si", + "泗" : "si", + "汜" : "si", + "兕" : "si", + "姒" : "si", + "耜" : "si", + "笥" : "si", + "忪" : "song", + "淞" : "song", + "崧" : "song", + "凇" : "song", + "菘" : "song", + "竦" : "song", + "溲" : "sou", + "飕" : "sou", + "蜩" : "tiao", + "萜" : "tie", + "汀" : "ting", + "葶" : "ting", + "莛" : "ting", + "梃" : "ting", + "佟" : "tong", + "酮" : "tong", + "仝" : "tong", + "茼" : "tong", + "砼" : "tong", + "钭" : "dou", + "酴" : "tu", + "钍" : "tu", + "堍" : "tu", + "抟" : "tuan", + "忒" : "te", + "煺" : "tui", + "暾" : "tun", + "氽" : "tun", + "乇" : "tuo", + "砣" : "tuo", + "沱" : "tuo", + "跎" : "tuo", + "坨" : "tuo", + "橐" : "tuo", + "酡" : "tuo", + "鼍" : "tuo", + "庹" : "tuo", + "拓" : "tuo", + "柝" : "tuo", + "箨" : "tuo", + "腽" : "wa", + "崴" : "wai", + "芄" : "wan", + "畹" : "wan", + "琬" : "wan", + "脘" : "wan", + "菀" : "wan", + "尢" : "you", + "辋" : "wang", + "魍" : "wang", + "逶" : "wei", + "葳" : "wei", + "隈" : "wei", + "惟" : "wei", + "帏" : "wei", + "圩" : "wei", + "囗" : "wei", + "潍" : "wei", + "嵬" : "wei", + "沩" : "wei", + "涠" : "wei", + "尾" : "wei", + "玮" : "wei", + "炜" : "wei", + "韪" : "wei", + "洧" : "wei", + "艉" : "wei", + "鲔" : "wei", + "遗" : "yi", + "尉" : "wei", + "軎" : "wei", + "璺" : "wen", + "阌" : "wen", + "蓊" : "weng", + "蕹" : "weng", + "渥" : "wo", + "硪" : "wo", + "龌" : "wo", + "圬" : "wu", + "吾" : "wu", + "浯" : "wu", + "鼯" : "wu", + "牾" : "wu", + "迕" : "wu", + "庑" : "wu", + "痦" : "wu", + "芴" : "wu", + "杌" : "wu", + "焐" : "wu", + "阢" : "wu", + "婺" : "wu", + "鋈" : "wu", + "樨" : "xi", + "栖" : "qi", + "郗" : "xi", + "蹊" : "qi", + "淅" : "xi", + "熹" : "xi", + "浠" : "xi", + "僖" : "xi", + "穸" : "xi", + "螅" : "xi", + "菥" : "xi", + "舾" : "xi", + "矽" : "xi", + "粞" : "xi", + "硒" : "xi", + "醯" : "xi", + "欷" : "xi", + "鼷" : "xi", + "檄" : "xi", + "隰" : "xi", + "觋" : "xi", + "屣" : "xi", + "葸" : "xi", + "蓰" : "xi", + "铣" : "xi", + "饩" : "xi", + "阋" : "xi", + "禊" : "xi", + "舄" : "xi", + "狎" : "xia", + "硖" : "xia", + "柙" : "xia", + "暹" : "xian", + "莶" : "xian", + "祆" : "xian", + "籼" : "xian", + "跹" : "xian", + "鹇" : "xian", + "痫" : "xian", + "猃" : "xian", + "燹" : "xian", + "蚬" : "xian", + "筅" : "xian", + "冼" : "xian", + "岘" : "xian", + "骧" : "xiang", + "葙" : "xiang", + "芗" : "xiang", + "缃" : "xiang", + "庠" : "xiang", + "鲞" : "xiang", + "蟓" : "xiang", + "削" : "xue", + "枵" : "xiao", + "绡" : "xiao", + "筱" : "xiao", + "邪" : "xie", + "勰" : "xie", + "缬" : "xie", + "血" : "xue", + "榭" : "xie", + "瀣" : "xie", + "薤" : "xie", + "燮" : "xie", + "躞" : "xie", + "廨" : "xie", + "绁" : "xie", + "渫" : "xie", + "榍" : "xie", + "獬" : "xie", + "昕" : "xin", + "忻" : "xin", + "囟" : "xin", + "陉" : "jing", + "荥" : "ying", + "饧" : "tang", + "硎" : "xing", + "荇" : "xing", + "芎" : "xiong", + "馐" : "xiu", + "庥" : "xiu", + "鸺" : "xiu", + "貅" : "xiu", + "髹" : "xiu", + "宿" : "xiu", + "岫" : "xiu", + "溴" : "xiu", + "吁" : "xu", + "盱" : "xu", + "顼" : "xu", + "糈" : "xu", + "醑" : "xu", + "洫" : "xu", + "溆" : "xu", + "蓿" : "xu", + "萱" : "xuan", + "谖" : "xuan", + "儇" : "xuan", + "煊" : "xuan", + "痃" : "xuan", + "铉" : "xuan", + "泫" : "xuan", + "碹" : "xuan", + "楦" : "xuan", + "镟" : "xuan", + "踅" : "xue", + "泶" : "xue", + "鳕" : "xue", + "埙" : "xun", + "曛" : "xun", + "窨" : "xun", + "獯" : "xun", + "峋" : "xun", + "洵" : "xun", + "恂" : "xun", + "浔" : "xun", + "鲟" : "xun", + "蕈" : "xun", + "垭" : "ya", + "岈" : "ya", + "琊" : "ya", + "痖" : "ya", + "迓" : "ya", + "砑" : "ya", + "咽" : "yan", + "鄢" : "yan", + "菸" : "yan", + "崦" : "yan", + "铅" : "qian", + "芫" : "yuan", + "兖" : "yan", + "琰" : "yan", + "罨" : "yan", + "厣" : "yan", + "焱" : "yan", + "酽" : "yan", + "谳" : "yan", + "鞅" : "yang", + "炀" : "yang", + "蛘" : "yang", + "约" : "yue", + "珧" : "yao", + "轺" : "yao", + "繇" : "yao", + "鳐" : "yao", + "崾" : "yao", + "钥" : "yao", + "曜" : "yao", + "铘" : "ye", + "烨" : "ye", + "邺" : "ye", + "靥" : "ye", + "晔" : "ye", + "猗" : "yi", + "铱" : "yi", + "欹" : "qi", + "黟" : "yi", + "怡" : "yi", + "沂" : "yi", + "圯" : "yi", + "荑" : "yi", + "诒" : "yi", + "眙" : "yi", + "嶷" : "yi", + "钇" : "yi", + "舣" : "yi", + "酏" : "yi", + "熠" : "yi", + "弋" : "yi", + "懿" : "yi", + "镒" : "yi", + "峄" : "yi", + "怿" : "yi", + "悒" : "yi", + "佾" : "yi", + "殪" : "yi", + "挹" : "yi", + "埸" : "yi", + "劓" : "yi", + "镱" : "yi", + "瘗" : "yi", + "癔" : "yi", + "翊" : "yi", + "蜴" : "yi", + "氤" : "yin", + "堙" : "yin", + "洇" : "yin", + "鄞" : "yin", + "狺" : "yin", + "夤" : "yin", + "圻" : "qi", + "饮" : "yin", + "吲" : "yin", + "胤" : "yin", + "茚" : "yin", + "璎" : "ying", + "撄" : "ying", + "嬴" : "ying", + "滢" : "ying", + "潆" : "ying", + "蓥" : "ying", + "瘿" : "ying", + "郢" : "ying", + "媵" : "ying", + "邕" : "yong", + "镛" : "yong", + "墉" : "yong", + "慵" : "yong", + "痈" : "yong", + "鳙" : "yong", + "饔" : "yong", + "喁" : "yong", + "俑" : "yong", + "莸" : "you", + "猷" : "you", + "疣" : "you", + "蚰" : "you", + "蝣" : "you", + "莜" : "you", + "牖" : "you", + "铕" : "you", + "卣" : "you", + "宥" : "you", + "侑" : "you", + "蚴" : "you", + "釉" : "you", + "馀" : "yu", + "萸" : "yu", + "禺" : "yu", + "妤" : "yu", + "欤" : "yu", + "觎" : "yu", + "窬" : "yu", + "蝓" : "yu", + "嵛" : "yu", + "舁" : "yu", + "雩" : "yu", + "龉" : "yu", + "伛" : "yu", + "圉" : "yu", + "庾" : "yu", + "瘐" : "yu", + "窳" : "yu", + "俣" : "yu", + "毓" : "yu", + "峪" : "yu", + "煜" : "yu", + "燠" : "yu", + "蓣" : "yu", + "饫" : "yu", + "阈" : "yu", + "鬻" : "yu", + "聿" : "yu", + "钰" : "yu", + "鹆" : "yu", + "蜮" : "yu", + "眢" : "yuan", + "箢" : "yuan", + "员" : "yuan", + "沅" : "yuan", + "橼" : "yuan", + "塬" : "yuan", + "爰" : "yuan", + "螈" : "yuan", + "鼋" : "yuan", + "掾" : "yuan", + "垸" : "yuan", + "瑗" : "yuan", + "刖" : "yue", + "瀹" : "yue", + "樾" : "yue", + "龠" : "yue", + "氲" : "yun", + "昀" : "yun", + "郧" : "yun", + "狁" : "yun", + "郓" : "yun", + "韫" : "yun", + "恽" : "yun", + "扎" : "zha", + "拶" : "za", + "咋" : "za", + "仔" : "zai", + "昝" : "zan", + "瓒" : "zan", + "藏" : "zang", + "奘" : "zang", + "唣" : "zao", + "择" : "ze", + "迮" : "ze", + "赜" : "ze", + "笮" : "ze", + "箦" : "ze", + "舴" : "ze", + "昃" : "ze", + "缯" : "zeng", + "罾" : "zeng", + "齄" : "zha", + "柞" : "zha", + "痄" : "zha", + "瘵" : "zhai", + "旃" : "zhan", + "璋" : "zhang", + "漳" : "zhang", + "嫜" : "zhang", + "鄣" : "zhang", + "仉" : "zhang", + "幛" : "zhang", + "着" : "zhe", + "啁" : "zhou", + "爪" : "zhao", + "棹" : "zhao", + "笊" : "zhao", + "摺" : "zhe", + "磔" : "zhe", + "这" : "zhe", + "柘" : "zhe", + "桢" : "zhen", + "蓁" : "zhen", + "祯" : "zhen", + "浈" : "zhen", + "畛" : "zhen", + "轸" : "zhen", + "稹" : "zhen", + "圳" : "zhen", + "徵" : "zhi", + "钲" : "zheng", + "卮" : "zhi", + "胝" : "zhi", + "祗" : "zhi", + "摭" : "zhi", + "絷" : "zhi", + "埴" : "zhi", + "轵" : "zhi", + "黹" : "zhi", + "帙" : "zhi", + "轾" : "zhi", + "贽" : "zhi", + "陟" : "zhi", + "忮" : "zhi", + "彘" : "zhi", + "膣" : "zhi", + "鸷" : "zhi", + "骘" : "zhi", + "踬" : "zhi", + "郅" : "zhi", + "觯" : "zhi", + "锺" : "zhong", + "螽" : "zhong", + "舯" : "zhong", + "碡" : "zhou", + "绉" : "zhou", + "荮" : "zhou", + "籀" : "zhou", + "酎" : "zhou", + "洙" : "zhu", + "邾" : "zhu", + "潴" : "zhu", + "槠" : "zhu", + "橥" : "zhu", + "舳" : "zhu", + "瘃" : "zhu", + "渚" : "zhu", + "麈" : "zhu", + "箸" : "zhu", + "炷" : "zhu", + "杼" : "zhu", + "翥" : "zhu", + "疰" : "zhu", + "颛" : "zhuan", + "赚" : "zhuan", + "馔" : "zhuan", + "僮" : "tong", + "缒" : "zhui", + "肫" : "zhun", + "窀" : "zhun", + "涿" : "zhuo", + "倬" : "zhuo", + "濯" : "zhuo", + "诼" : "zhuo", + "禚" : "zhuo", + "浞" : "zhuo", + "谘" : "zi", + "淄" : "zi", + "髭" : "zi", + "孳" : "zi", + "粢" : "zi", + "趑" : "zi", + "觜" : "zui", + "缁" : "zi", + "鲻" : "zi", + "嵫" : "zi", + "笫" : "zi", + "耔" : "zi", + "腙" : "zong", + "偬" : "zong", + "诹" : "zou", + "陬" : "zou", + "鄹" : "zou", + "驺" : "zou", + "鲰" : "zou", + "菹" : "ju", + "镞" : "zu", + "躜" : "zuan", + "缵" : "zuan", + "蕞" : "zui", + "撙" : "zun", + "胙" : "zuo", + "阿" : "a", + "阿" : "e", + "柏" : "bai", + "蚌" : "beng", + "薄" : "bo", + "堡" : "bao", + "呗" : "bei", + "贲" : "ben", + "臂" : "bi", + "瘪" : "bie", + "槟" : "bin", + "剥" : "bo", + "伯" : "bo", + "卜" : "bu", + "参" : "can", + "嚓" : "ca", + "差" : "cha", + "孱" : "chan", + "绰" : "chuo", + "称" : "cheng", + "澄" : "cheng", + "大" : "da", + "单" : "dan", + "得" : "de", + "的" : "de", + "地" : "di", + "都" : "dou", + "读" : "du", + "度" : "du", + "蹲" : "dun", + "佛" : "fo", + "伽" : "jia", + "盖" : "gai", + "镐" : "hao", + "给" : "gei", + "呱" : "gua", + "氿" : "jiu", + "桧" : "hui", + "掴" : "guo", + "蛤" : "ha", + "还" : "hai", + "和" : "he", + "核" : "he", + "哼" : "heng", + "鹄" : "hu", + "划" : "hua", + "夹" : "jia", + "贾" : "jia", + "芥" : "jie", + "劲" : "jin", + "荆" : "jing", + "颈" : "jing", + "貉" : "he", + "吖" : "a", + "啊" : "a", + "锕" : "a", + "哎" : "ai", + "哀" : "ai", + "埃" : "ai", + "唉" : "ai", + "欸" : "ai", + "锿" : "ai", + "挨" : "ai", + "皑" : "ai", + "癌" : "ai", + "毐" : "ai", + "矮" : "ai", + "蔼" : "ai", + "霭" : "ai", + "砹" : "ai", + "爱" : "ai", + "隘" : "ai", + "碍" : "ai", + "嗳" : "ai", + "嫒" : "ai", + "叆" : "ai", + "暧" : "ai", + "安" : "an", + "桉" : "an", + "氨" : "an", + "庵" : "an", + "谙" : "an", + "鹌" : "an", + "鞍" : "an", + "俺" : "an", + "埯" : "an", + "唵" : "an", + "铵" : "an", + "揞" : "an", + "岸" : "an", + "按" : "an", + "胺" : "an", + "案" : "an", + "暗" : "an", + "黯" : "an", + "玵" : "an", + "肮" : "ang", + "昂" : "ang", + "盎" : "ang", + "凹" : "ao", + "敖" : "ao", + "遨" : "ao", + "嗷" : "ao", + "獒" : "ao", + "熬" : "ao", + "聱" : "ao", + "螯" : "ao", + "翱" : "ao", + "謷" : "ao", + "鏖" : "ao", + "袄" : "ao", + "媪" : "ao", + "坳" : "ao", + "傲" : "ao", + "奥" : "ao", + "骜" : "ao", + "澳" : "ao", + "懊" : "ao", + "八" : "ba", + "巴" : "ba", + "叭" : "ba", + "芭" : "ba", + "疤" : "ba", + "捌" : "ba", + "笆" : "ba", + "粑" : "ba", + "拔" : "ba", + "茇" : "ba", + "妭" : "ba", + "菝" : "ba", + "跋" : "ba", + "魃" : "ba", + "把" : "ba", + "靶" : "ba", + "坝" : "ba", + "爸" : "ba", + "罢" : "ba", + "霸" : "ba", + "灞" : "ba", + "吧" : "ba", + "钯" : "ba", + "掰" : "bai", + "白" : "bai", + "百" : "bai", + "佰" : "bai", + "捭" : "bai", + "摆" : "bai", + "败" : "bai", + "拜" : "bai", + "稗" : "bai", + "扳" : "ban", + "攽" : "ban", + "班" : "ban", + "般" : "ban", + "颁" : "ban", + "斑" : "ban", + "搬" : "ban", + "瘢" : "ban", + "阪" : "ban", + "坂" : "ban", + "板" : "ban", + "版" : "ban", + "钣" : "ban", + "舨" : "ban", + "办" : "ban", + "半" : "ban", + "伴" : "ban", + "拌" : "ban", + "绊" : "ban", + "瓣" : "ban", + "扮" : "ban", + "邦" : "bang", + "帮" : "bang", + "梆" : "bang", + "浜" : "bang", + "绑" : "bang", + "榜" : "bang", + "棒" : "bang", + "傍" : "bang", + "谤" : "bang", + "蒡" : "bang", + "镑" : "bang", + "包" : "bao", + "苞" : "bao", + "孢" : "bao", + "胞" : "bao", + "龅" : "bao", + "煲" : "bao", + "褒" : "bao", + "雹" : "bao", + "饱" : "bao", + "宝" : "bao", + "保" : "bao", + "鸨" : "bao", + "葆" : "bao", + "褓" : "bao", + "报" : "bao", + "抱" : "bao", + "趵" : "bao", + "豹" : "bao", + "鲍" : "bao", + "暴" : "bao", + "爆" : "bao", + "枹" : "bao", + "杯" : "bei", + "卑" : "bei", + "悲" : "bei", + "碑" : "bei", + "北" : "bei", + "贝" : "bei", + "狈" : "bei", + "备" : "bei", + "背" : "bei", + "钡" : "bei", + "倍" : "bei", + "悖" : "bei", + "被" : "bei", + "辈" : "bei", + "惫" : "bei", + "焙" : "bei", + "蓓" : "bei", + "碚" : "bei", + "褙" : "bei", + "别" : "bei", + "蹩" : "bei", + "椑" : "bei", + "奔" : "ben", + "倴" : "ben", + "犇" : "ben", + "锛" : "ben", + "本" : "ben", + "苯" : "ben", + "坌" : "ben", + "笨" : "ben", + "崩" : "beng", + "绷" : "beng", + "嘣" : "beng", + "甭" : "beng", + "泵" : "beng", + "迸" : "beng", + "镚" : "beng", + "蹦" : "beng", + "屄" : "bi", + "逼" : "bi", + "荸" : "bi", + "鼻" : "bi", + "匕" : "bi", + "比" : "bi", + "吡" : "bi", + "沘" : "bi", + "妣" : "bi", + "彼" : "bi", + "秕" : "bi", + "笔" : "bi", + "俾" : "bi", + "鄙" : "bi", + "币" : "bi", + "必" : "bi", + "毕" : "bi", + "闭" : "bi", + "庇" : "bi", + "诐" : "bi", + "苾" : "bi", + "荜" : "bi", + "毖" : "bi", + "哔" : "bi", + "陛" : "bi", + "毙" : "bi", + "铋" : "bi", + "狴" : "bi", + "萆" : "bi", + "梐" : "bi", + "敝" : "bi", + "婢" : "bi", + "赑" : "bi", + "愎" : "bi", + "弼" : "bi", + "蓖" : "bi", + "痹" : "bi", + "滗" : "bi", + "碧" : "bi", + "蔽" : "bi", + "馝" : "bi", + "弊" : "bi", + "薜" : "bi", + "篦" : "bi", + "壁" : "bi", + "避" : "bi", + "髀" : "bi", + "璧" : "bi", + "芘" : "bi", + "边" : "bian", + "砭" : "bian", + "萹" : "bian", + "编" : "bian", + "煸" : "bian", + "蝙" : "bian", + "鳊" : "bian", + "鞭" : "bian", + "贬" : "bian", + "匾" : "bian", + "褊" : "bian", + "藊" : "bian", + "卞" : "bian", + "抃" : "bian", + "苄" : "bian", + "汴" : "bian", + "忭" : "bian", + "变" : "bian", + "遍" : "bian", + "辨" : "bian", + "辩" : "bian", + "辫" : "bian", + "标" : "biao", + "骉" : "biao", + "彪" : "biao", + "摽" : "biao", + "膘" : "biao", + "飙" : "biao", + "镖" : "biao", + "瀌" : "biao", + "镳" : "biao", + "表" : "biao", + "婊" : "biao", + "裱" : "biao", + "鳔" : "biao", + "憋" : "bie", + "鳖" : "bie", + "宾" : "bin", + "彬" : "bin", + "傧" : "bin", + "滨" : "bin", + "缤" : "bin", + "濒" : "bin", + "摈" : "bin", + "殡" : "bin", + "髌" : "bin", + "鬓" : "bin", + "冰" : "bing", + "兵" : "bing", + "丙" : "bing", + "邴" : "bing", + "秉" : "bing", + "柄" : "bing", + "饼" : "bing", + "炳" : "bing", + "禀" : "bing", + "并" : "bing", + "病" : "bing", + "摒" : "bing", + "拨" : "bo", + "波" : "bo", + "玻" : "bo", + "钵" : "bo", + "饽" : "bo", + "袯" : "bo", + "菠" : "bo", + "播" : "bo", + "驳" : "bo", + "帛" : "bo", + "勃" : "bo", + "钹" : "bo", + "铂" : "bo", + "亳" : "bo", + "舶" : "bo", + "脖" : "bo", + "博" : "bo", + "鹁" : "bo", + "渤" : "bo", + "搏" : "bo", + "馎" : "bo", + "箔" : "bo", + "膊" : "bo", + "踣" : "bo", + "馞" : "bo", + "礴" : "bo", + "跛" : "bo", + "檗" : "bo", + "擘" : "bo", + "簸" : "bo", + "啵" : "bo", + "蕃" : "bo", + "哱" : "bo", + "卟" : "bu", + "补" : "bu", + "捕" : "bu", + "哺" : "bu", + "不" : "bu", + "布" : "bu", + "步" : "bu", + "怖" : "bu", + "钚" : "bu", + "部" : "bu", + "埠" : "bu", + "簿" : "bu", + "擦" : "ca", + "猜" : "cai", + "才" : "cai", + "材" : "cai", + "财" : "cai", + "裁" : "cai", + "采" : "cai", + "彩" : "cai", + "睬" : "cai", + "踩" : "cai", + "菜" : "cai", + "蔡" : "cai", + "餐" : "can", + "残" : "can", + "蚕" : "can", + "惭" : "can", + "惨" : "can", + "黪" : "can", + "灿" : "can", + "粲" : "can", + "璨" : "can", + "穇" : "can", + "仓" : "cang", + "伧" : "cang", + "苍" : "cang", + "沧" : "cang", + "舱" : "cang", + "操" : "cao", + "糙" : "cao", + "曹" : "cao", + "嘈" : "cao", + "漕" : "cao", + "槽" : "cao", + "螬" : "cao", + "草" : "cao", + "册" : "ce", + "厕" : "ce", + "测" : "ce", + "恻" : "ce", + "策" : "ce", + "岑" : "cen", + "涔" : "cen", + "噌" : "ceng", + "层" : "ceng", + "嶒" : "ceng", + "蹭" : "ceng", + "叉" : "cha", + "杈" : "cha", + "插" : "cha", + "馇" : "cha", + "锸" : "cha", + "茬" : "cha", + "茶" : "cha", + "搽" : "cha", + "嵖" : "cha", + "猹" : "cha", + "槎" : "cha", + "碴" : "cha", + "察" : "cha", + "檫" : "cha", + "衩" : "cha", + "镲" : "cha", + "汊" : "cha", + "岔" : "cha", + "侘" : "cha", + "诧" : "cha", + "姹" : "cha", + "蹅" : "cha", + "拆" : "chai", + "钗" : "chai", + "侪" : "chai", + "柴" : "chai", + "豺" : "chai", + "虿" : "chai", + "茝" : "chai", + "觇" : "chan", + "掺" : "chan", + "搀" : "chan", + "襜" : "chan", + "谗" : "chan", + "婵" : "chan", + "馋" : "chan", + "缠" : "chan", + "蝉" : "chan", + "潺" : "chan", + "蟾" : "chan", + "巉" : "chan", + "产" : "chan", + "浐" : "chan", + "谄" : "chan", + "铲" : "chan", + "阐" : "chan", + "蒇" : "chan", + "骣" : "chan", + "冁" : "chan", + "忏" : "chan", + "颤" : "chan", + "羼" : "chan", + "韂" : "chan", + "伥" : "chang", + "昌" : "chang", + "菖" : "chang", + "猖" : "chang", + "娼" : "chang", + "肠" : "chang", + "尝" : "chang", + "常" : "chang", + "偿" : "chang", + "徜" : "chang", + "嫦" : "chang", + "厂" : "chang", + "场" : "chang", + "昶" : "chang", + "惝" : "chang", + "敞" : "chang", + "怅" : "chang", + "畅" : "chang", + "倡" : "chang", + "唱" : "chang", + "裳" : "chang", + "抄" : "chao", + "怊" : "chao", + "钞" : "chao", + "超" : "chao", + "晁" : "chao", + "巢" : "chao", + "嘲" : "chao", + "潮" : "chao", + "吵" : "chao", + "炒" : "chao", + "耖" : "chao", + "砗" : "che", + "扯" : "che", + "彻" : "che", + "坼" : "che", + "掣" : "che", + "撤" : "che", + "澈" : "che", + "瞮" : "che", + "抻" : "chen", + "郴" : "chen", + "嗔" : "chen", + "瞋" : "chen", + "臣" : "chen", + "尘" : "chen", + "辰" : "chen", + "沉" : "chen", + "忱" : "chen", + "陈" : "chen", + "宸" : "chen", + "晨" : "chen", + "谌" : "chen", + "碜" : "chen", + "衬" : "chen", + "龀" : "chen", + "趁" : "chen", + "柽" : "cheng", + "琤" : "cheng", + "撑" : "cheng", + "瞠" : "cheng", + "成" : "cheng", + "丞" : "cheng", + "呈" : "cheng", + "诚" : "cheng", + "承" : "cheng", + "城" : "cheng", + "铖" : "cheng", + "程" : "cheng", + "惩" : "cheng", + "酲" : "cheng", + "橙" : "cheng", + "逞" : "cheng", + "骋" : "cheng", + "秤" : "cheng", + "铛" : "cheng", + "樘" : "cheng", + "吃" : "chi", + "哧" : "chi", + "鸱" : "chi", + "蚩" : "chi", + "笞" : "chi", + "嗤" : "chi", + "痴" : "chi", + "媸" : "chi", + "魑" : "chi", + "池" : "chi", + "弛" : "chi", + "驰" : "chi", + "迟" : "chi", + "茌" : "chi", + "持" : "chi", + "踟" : "chi", + "尺" : "chi", + "齿" : "chi", + "侈" : "chi", + "耻" : "chi", + "豉" : "chi", + "褫" : "chi", + "彳" : "chi", + "叱" : "chi", + "斥" : "chi", + "赤" : "chi", + "饬" : "chi", + "炽" : "chi", + "翅" : "chi", + "敕" : "chi", + "啻" : "chi", + "傺" : "chi", + "匙" : "chi", + "冲" : "chong", + "充" : "chong", + "忡" : "chong", + "茺" : "chong", + "舂" : "chong", + "憧" : "chong", + "艟" : "chong", + "虫" : "chong", + "崇" : "chong", + "宠" : "chong", + "铳" : "chong", + "抽" : "chou", + "瘳" : "chou", + "惆" : "chou", + "绸" : "chou", + "畴" : "chou", + "酬" : "chou", + "稠" : "chou", + "愁" : "chou", + "筹" : "chou", + "踌" : "chou", + "丑" : "chou", + "瞅" : "chou", + "出" : "chu", + "初" : "chu", + "樗" : "chu", + "刍" : "chu", + "除" : "chu", + "厨" : "chu", + "锄" : "chu", + "滁" : "chu", + "蜍" : "chu", + "雏" : "chu", + "橱" : "chu", + "躇" : "chu", + "蹰" : "chu", + "杵" : "chu", + "础" : "chu", + "储" : "chu", + "楚" : "chu", + "褚" : "chu", + "亍" : "chu", + "处" : "chu", + "怵" : "chu", + "绌" : "chu", + "搐" : "chu", + "触" : "chu", + "憷" : "chu", + "黜" : "chu", + "矗" : "chu", + "揣" : "chuai", + "搋" : "chuai", + "膗" : "chuai", + "踹" : "chuai", + "川" : "chuan", + "氚" : "chuan", + "穿" : "chuan", + "舡" : "chuan", + "船" : "chuan", + "遄" : "chuan", + "椽" : "chuan", + "舛" : "chuan", + "喘" : "chuan", + "串" : "chuan", + "钏" : "chuan", + "疮" : "chuang", + "窗" : "chuang", + "床" : "chuang", + "闯" : "chuang", + "创" : "chuang", + "怆" : "chuang", + "吹" : "chui", + "炊" : "chui", + "垂" : "chui", + "陲" : "chui", + "捶" : "chui", + "棰" : "chui", + "槌" : "chui", + "锤" : "chui", + "春" : "chun", + "瑃" : "chun", + "椿" : "chun", + "蝽" : "chun", + "纯" : "chun", + "莼" : "chun", + "唇" : "chun", + "淳" : "chun", + "鹑" : "chun", + "醇" : "chun", + "蠢" : "chun", + "踔" : "chuo", + "戳" : "chuo", + "啜" : "chuo", + "惙" : "chuo", + "辍" : "chuo", + "龊" : "chuo", + "歠" : "chuo", + "疵" : "ci", + "词" : "ci", + "茈" : "ci", + "茨" : "ci", + "祠" : "ci", + "瓷" : "ci", + "辞" : "ci", + "慈" : "ci", + "磁" : "ci", + "雌" : "ci", + "鹚" : "ci", + "糍" : "ci", + "此" : "ci", + "泚" : "ci", + "跐" : "ci", + "次" : "ci", + "刺" : "ci", + "佽" : "ci", + "赐" : "ci", + "匆" : "cong", + "苁" : "cong", + "囱" : "cong", + "枞" : "cong", + "葱" : "cong", + "骢" : "cong", + "聪" : "cong", + "从" : "cong", + "丛" : "cong", + "淙" : "cong", + "悰" : "cong", + "琮" : "cong", + "凑" : "cou", + "辏" : "cou", + "腠" : "cou", + "粗" : "cu", + "徂" : "cu", + "殂" : "cu", + "促" : "cu", + "猝" : "cu", + "蔟" : "cu", + "醋" : "cu", + "踧" : "cu", + "簇" : "cu", + "蹙" : "cu", + "蹴" : "cu", + "汆" : "cuan", + "撺" : "cuan", + "镩" : "cuan", + "蹿" : "cuan", + "窜" : "cuan", + "篡" : "cuan", + "崔" : "cui", + "催" : "cui", + "摧" : "cui", + "璀" : "cui", + "脆" : "cui", + "萃" : "cui", + "啐" : "cui", + "淬" : "cui", + "悴" : "cui", + "毳" : "cui", + "瘁" : "cui", + "粹" : "cui", + "翠" : "cui", + "村" : "cun", + "皴" : "cun", + "存" : "cun", + "忖" : "cun", + "寸" : "cun", + "吋" : "cun", + "搓" : "cuo", + "磋" : "cuo", + "蹉" : "cuo", + "嵯" : "cuo", + "矬" : "cuo", + "痤" : "cuo", + "脞" : "cuo", + "挫" : "cuo", + "莝" : "cuo", + "厝" : "cuo", + "措" : "cuo", + "锉" : "cuo", + "错" : "cuo", + "酇" : "cuo", + "咑" : "da", + "垯" : "da", + "耷" : "da", + "搭" : "da", + "褡" : "da", + "达" : "da", + "怛" : "da", + "妲" : "da", + "荙" : "da", + "笪" : "da", + "答" : "da", + "跶" : "da", + "靼" : "da", + "瘩" : "da", + "鞑" : "da", + "打" : "da", + "呆" : "dai", + "歹" : "dai", + "逮" : "dai", + "傣" : "dai", + "代" : "dai", + "岱" : "dai", + "迨" : "dai", + "玳" : "dai", + "带" : "dai", + "殆" : "dai", + "贷" : "dai", + "待" : "dai", + "怠" : "dai", + "袋" : "dai", + "叇" : "dai", + "戴" : "dai", + "黛" : "dai", + "襶" : "dai", + "呔" : "dai", + "丹" : "dan", + "担" : "dan", + "眈" : "dan", + "耽" : "dan", + "郸" : "dan", + "聃" : "dan", + "殚" : "dan", + "瘅" : "dan", + "箪" : "dan", + "儋" : "dan", + "胆" : "dan", + "疸" : "dan", + "掸" : "dan", + "亶" : "dan", + "旦" : "dan", + "但" : "dan", + "诞" : "dan", + "萏" : "dan", + "啖" : "dan", + "淡" : "dan", + "惮" : "dan", + "蛋" : "dan", + "氮" : "dan", + "赕" : "dan", + "当" : "dang", + "裆" : "dang", + "挡" : "dang", + "档" : "dang", + "党" : "dang", + "谠" : "dang", + "凼" : "dang", + "砀" : "dang", + "宕" : "dang", + "荡" : "dang", + "菪" : "dang", + "刀" : "dao", + "忉" : "dao", + "氘" : "dao", + "舠" : "dao", + "导" : "dao", + "岛" : "dao", + "捣" : "dao", + "倒" : "dao", + "捯" : "dao", + "祷" : "dao", + "蹈" : "dao", + "到" : "dao", + "盗" : "dao", + "悼" : "dao", + "道" : "dao", + "稻" : "dao", + "焘" : "dao", + "锝" : "de", + "嘚" : "de", + "德" : "de", + "扽" : "den", + "灯" : "deng", + "登" : "deng", + "噔" : "deng", + "蹬" : "deng", + "等" : "deng", + "戥" : "deng", + "邓" : "deng", + "僜" : "deng", + "凳" : "deng", + "嶝" : "deng", + "磴" : "deng", + "瞪" : "deng", + "镫" : "deng", + "低" : "di", + "羝" : "di", + "堤" : "di", + "嘀" : "di", + "滴" : "di", + "狄" : "di", + "迪" : "di", + "籴" : "di", + "荻" : "di", + "敌" : "di", + "涤" : "di", + "笛" : "di", + "觌" : "di", + "嫡" : "di", + "镝" : "di", + "氐" : "di", + "邸" : "di", + "诋" : "di", + "抵" : "di", + "底" : "di", + "柢" : "di", + "砥" : "di", + "骶" : "di", + "玓" : "di", + "弟" : "di", + "帝" : "di", + "递" : "di", + "娣" : "di", + "第" : "di", + "谛" : "di", + "蒂" : "di", + "棣" : "di", + "睇" : "di", + "缔" : "di", + "碲" : "di", + "嗲" : "dia", + "掂" : "dian", + "滇" : "dian", + "颠" : "dian", + "巅" : "dian", + "癫" : "dian", + "典" : "dian", + "点" : "dian", + "碘" : "dian", + "踮" : "dian", + "电" : "dian", + "甸" : "dian", + "阽" : "dian", + "坫" : "dian", + "店" : "dian", + "玷" : "dian", + "垫" : "dian", + "钿" : "dian", + "淀" : "dian", + "惦" : "dian", + "奠" : "dian", + "殿" : "dian", + "靛" : "dian", + "刁" : "diao", + "叼" : "diao", + "汈" : "diao", + "凋" : "diao", + "貂" : "diao", + "碉" : "diao", + "雕" : "diao", + "鲷" : "diao", + "屌" : "diao", + "吊" : "diao", + "钓" : "diao", + "窎" : "diao", + "掉" : "diao", + "铫" : "diao", + "爹" : "die", + "跌" : "die", + "迭" : "die", + "谍" : "die", + "耋" : "die", + "喋" : "die", + "牒" : "die", + "叠" : "die", + "碟" : "die", + "嵽" : "die", + "蝶" : "die", + "蹀" : "die", + "鲽" : "die", + "仃" : "ding", + "叮" : "ding", + "玎" : "ding", + "盯" : "ding", + "町" : "ding", + "耵" : "ding", + "顶" : "ding", + "酊" : "ding", + "鼎" : "ding", + "订" : "ding", + "钉" : "ding", + "定" : "ding", + "啶" : "ding", + "腚" : "ding", + "碇" : "ding", + "锭" : "ding", + "丢" : "diu", + "铥" : "diu", + "东" : "dong", + "冬" : "dong", + "咚" : "dong", + "氡" : "dong", + "鸫" : "dong", + "董" : "dong", + "懂" : "dong", + "动" : "dong", + "冻" : "dong", + "侗" : "dong", + "栋" : "dong", + "胨" : "dong", + "洞" : "dong", + "胴" : "dong", + "兜" : "dou", + "蔸" : "dou", + "篼" : "dou", + "抖" : "dou", + "陡" : "dou", + "蚪" : "dou", + "斗" : "dou", + "豆" : "dou", + "逗" : "dou", + "痘" : "dou", + "窦" : "dou", + "督" : "du", + "嘟" : "du", + "毒" : "du", + "独" : "du", + "渎" : "du", + "椟" : "du", + "犊" : "du", + "牍" : "du", + "黩" : "du", + "髑" : "du", + "厾" : "du", + "笃" : "du", + "堵" : "du", + "赌" : "du", + "睹" : "du", + "杜" : "du", + "肚" : "du", + "妒" : "du", + "渡" : "du", + "镀" : "du", + "蠹" : "du", + "端" : "duan", + "短" : "duan", + "段" : "duan", + "断" : "duan", + "缎" : "duan", + "椴" : "duan", + "锻" : "duan", + "簖" : "duan", + "堆" : "dui", + "队" : "dui", + "对" : "dui", + "兑" : "dui", + "怼" : "dui", + "憝" : "dui", + "吨" : "dun", + "惇" : "dun", + "敦" : "dun", + "墩" : "dun", + "礅" : "dun", + "盹" : "dun", + "趸" : "dun", + "沌" : "dun", + "炖" : "dun", + "砘" : "dun", + "钝" : "dun", + "盾" : "dun", + "顿" : "dun", + "遁" : "dun", + "多" : "duo", + "咄" : "duo", + "哆" : "duo", + "掇" : "duo", + "裰" : "duo", + "夺" : "duo", + "踱" : "duo", + "朵" : "duo", + "垛" : "duo", + "哚" : "duo", + "躲" : "duo", + "亸" : "duo", + "剁" : "duo", + "舵" : "duo", + "堕" : "duo", + "惰" : "duo", + "跺" : "duo", + "屙" : "e", + "婀" : "e", + "讹" : "e", + "囮" : "e", + "俄" : "e", + "莪" : "e", + "峨" : "e", + "娥" : "e", + "锇" : "e", + "鹅" : "e", + "蛾" : "e", + "额" : "e", + "厄" : "e", + "扼" : "e", + "苊" : "e", + "呃" : "e", + "垩" : "e", + "饿" : "e", + "鄂" : "e", + "谔" : "e", + "萼" : "e", + "遏" : "e", + "愕" : "e", + "腭" : "e", + "颚" : "e", + "噩" : "e", + "鳄" : "e", + "恩" : "en", + "蒽" : "en", + "摁" : "en", + "鞥" : "eng", + "儿" : "er", + "而" : "er", + "鸸" : "er", + "尔" : "er", + "耳" : "er", + "迩" : "er", + "饵" : "er", + "洱" : "er", + "铒" : "er", + "二" : "er", + "贰" : "er", + "发" : "fa", + "乏" : "fa", + "伐" : "fa", + "罚" : "fa", + "垡" : "fa", + "阀" : "fa", + "筏" : "fa", + "法" : "fa", + "砝" : "fa", + "珐" : "fa", + "帆" : "fan", + "幡" : "fan", + "藩" : "fan", + "翻" : "fan", + "凡" : "fan", + "矾" : "fan", + "钒" : "fan", + "烦" : "fan", + "樊" : "fan", + "燔" : "fan", + "繁" : "fan", + "蹯" : "fan", + "蘩" : "fan", + "反" : "fan", + "返" : "fan", + "犯" : "fan", + "饭" : "fan", + "泛" : "fan", + "范" : "fan", + "贩" : "fan", + "畈" : "fan", + "梵" : "fan", + "方" : "fang", + "邡" : "fang", + "坊" : "fang", + "芳" : "fang", + "枋" : "fang", + "钫" : "fang", + "防" : "fang", + "妨" : "fang", + "肪" : "fang", + "房" : "fang", + "鲂" : "fang", + "仿" : "fang", + "访" : "fang", + "纺" : "fang", + "舫" : "fang", + "放" : "fang", + "飞" : "fei", + "妃" : "fei", + "非" : "fei", + "菲" : "fei", + "啡" : "fei", + "绯" : "fei", + "扉" : "fei", + "肥" : "fei", + "淝" : "fei", + "腓" : "fei", + "匪" : "fei", + "诽" : "fei", + "悱" : "fei", + "棐" : "fei", + "斐" : "fei", + "榧" : "fei", + "翡" : "fei", + "篚" : "fei", + "吠" : "fei", + "肺" : "fei", + "狒" : "fei", + "废" : "fei", + "沸" : "fei", + "费" : "fei", + "痱" : "fei", + "镄" : "fei", + "分" : "fen", + "芬" : "fen", + "吩" : "fen", + "纷" : "fen", + "氛" : "fen", + "酚" : "fen", + "坟" : "fen", + "汾" : "fen", + "棼" : "fen", + "焚" : "fen", + "鼢" : "fen", + "粉" : "fen", + "份" : "fen", + "奋" : "fen", + "忿" : "fen", + "偾" : "fen", + "粪" : "fen", + "愤" : "fen", + "丰" : "feng", + "风" : "feng", + "沣" : "feng", + "枫" : "feng", + "封" : "feng", + "砜" : "feng", + "疯" : "feng", + "峰" : "feng", + "烽" : "feng", + "葑" : "feng", + "锋" : "feng", + "蜂" : "feng", + "酆" : "feng", + "冯" : "feng", + "逢" : "feng", + "缝" : "feng", + "讽" : "feng", + "唪" : "feng", + "凤" : "feng", + "奉" : "feng", + "俸" : "feng", + "缶" : "fou", + "夫" : "fu", + "呋" : "fu", + "肤" : "fu", + "麸" : "fu", + "跗" : "fu", + "稃" : "fu", + "孵" : "fu", + "敷" : "fu", + "弗" : "fu", + "伏" : "fu", + "凫" : "fu", + "扶" : "fu", + "芙" : "fu", + "孚" : "fu", + "拂" : "fu", + "苻" : "fu", + "服" : "fu", + "怫" : "fu", + "茯" : "fu", + "氟" : "fu", + "俘" : "fu", + "浮" : "fu", + "符" : "fu", + "匐" : "fu", + "涪" : "fu", + "艴" : "fu", + "幅" : "fu", + "辐" : "fu", + "蜉" : "fu", + "福" : "fu", + "蝠" : "fu", + "抚" : "fu", + "甫" : "fu", + "拊" : "fu", + "斧" : "fu", + "府" : "fu", + "俯" : "fu", + "釜" : "fu", + "辅" : "fu", + "腑" : "fu", + "腐" : "fu", + "父" : "fu", + "讣" : "fu", + "付" : "fu", + "负" : "fu", + "妇" : "fu", + "附" : "fu", + "咐" : "fu", + "阜" : "fu", + "驸" : "fu", + "赴" : "fu", + "复" : "fu", + "副" : "fu", + "赋" : "fu", + "傅" : "fu", + "富" : "fu", + "腹" : "fu", + "缚" : "fu", + "赙" : "fu", + "蝮" : "fu", + "覆" : "fu", + "馥" : "fu", + "袱" : "fu", + "旮" : "ga", + "嘎" : "ga", + "钆" : "ga", + "尜" : "ga", + "尕" : "ga", + "尬" : "ga", + "该" : "gai", + "垓" : "gai", + "荄" : "gai", + "赅" : "gai", + "改" : "gai", + "丐" : "gai", + "钙" : "gai", + "溉" : "gai", + "概" : "gai", + "甘" : "gan", + "玕" : "gan", + "肝" : "gan", + "坩" : "gan", + "苷" : "gan", + "矸" : "gan", + "泔" : "gan", + "柑" : "gan", + "竿" : "gan", + "酐" : "gan", + "疳" : "gan", + "尴" : "gan", + "杆" : "gan", + "秆" : "gan", + "赶" : "gan", + "敢" : "gan", + "感" : "gan", + "澉" : "gan", + "橄" : "gan", + "擀" : "gan", + "干" : "gan", + "旰" : "gan", + "绀" : "gan", + "淦" : "gan", + "骭" : "gan", + "赣" : "gan", + "冈" : "gang", + "冮" : "gang", + "刚" : "gang", + "肛" : "gang", + "纲" : "gang", + "钢" : "gang", + "缸" : "gang", + "罡" : "gang", + "岗" : "gang", + "港" : "gang", + "杠" : "gang", + "皋" : "gao", + "高" : "gao", + "羔" : "gao", + "睾" : "gao", + "膏" : "gao", + "篙" : "gao", + "糕" : "gao", + "杲" : "gao", + "搞" : "gao", + "槁" : "gao", + "稿" : "gao", + "告" : "gao", + "郜" : "gao", + "诰" : "gao", + "锆" : "gao", + "戈" : "ge", + "圪" : "ge", + "纥" : "ge", + "疙" : "ge", + "哥" : "ge", + "胳" : "ge", + "鸽" : "ge", + "袼" : "ge", + "搁" : "ge", + "割" : "ge", + "歌" : "ge", + "革" : "ge", + "阁" : "ge", + "格" : "ge", + "隔" : "ge", + "嗝" : "ge", + "膈" : "ge", + "骼" : "ge", + "镉" : "ge", + "舸" : "ge", + "葛" : "ge", + "个" : "ge", + "各" : "ge", + "虼" : "ge", + "硌" : "ge", + "铬" : "ge", + "根" : "gen", + "跟" : "gen", + "哏" : "gen", + "亘" : "gen", + "艮" : "gen", + "茛" : "gen", + "庚" : "geng", + "耕" : "geng", + "浭" : "geng", + "赓" : "geng", + "羹" : "geng", + "埂" : "geng", + "耿" : "geng", + "哽" : "geng", + "绠" : "geng", + "梗" : "geng", + "鲠" : "geng", + "更" : "geng", + "工" : "gong", + "弓" : "gong", + "公" : "gong", + "功" : "gong", + "攻" : "gong", + "肱" : "gong", + "宫" : "gong", + "恭" : "gong", + "蚣" : "gong", + "躬" : "gong", + "龚" : "gong", + "塨" : "gong", + "觥" : "gong", + "巩" : "gong", + "汞" : "gong", + "拱" : "gong", + "珙" : "gong", + "共" : "gong", + "贡" : "gong", + "供" : "gong", + "勾" : "gou", + "佝" : "gou", + "沟" : "gou", + "钩" : "gou", + "篝" : "gou", + "苟" : "gou", + "岣" : "gou", + "狗" : "gou", + "枸" : "gou", + "构" : "gou", + "购" : "gou", + "诟" : "gou", + "垢" : "gou", + "够" : "gou", + "彀" : "gou", + "媾" : "gou", + "觏" : "gou", + "估" : "gu", + "咕" : "gu", + "沽" : "gu", + "孤" : "gu", + "姑" : "gu", + "轱" : "gu", + "鸪" : "gu", + "菰" : "gu", + "菇" : "gu", + "蛄" : "gu", + "蓇" : "gu", + "辜" : "gu", + "酤" : "gu", + "觚" : "gu", + "毂" : "gu", + "箍" : "gu", + "古" : "gu", + "谷" : "gu", + "汩" : "gu", + "诂" : "gu", + "股" : "gu", + "骨" : "gu", + "牯" : "gu", + "钴" : "gu", + "羖" : "gu", + "蛊" : "gu", + "鼓" : "gu", + "榾" : "gu", + "鹘" : "gu", + "臌" : "gu", + "瀔" : "gu", + "固" : "gu", + "故" : "gu", + "顾" : "gu", + "梏" : "gu", + "崮" : "gu", + "雇" : "gu", + "锢" : "gu", + "痼" : "gu", + "瓜" : "gua", + "刮" : "gua", + "胍" : "gua", + "鸹" : "gua", + "剐" : "gua", + "寡" : "gua", + "卦" : "gua", + "诖" : "gua", + "挂" : "gua", + "褂" : "gua", + "乖" : "guai", + "拐" : "guai", + "怪" : "guai", + "关" : "guan", + "观" : "guan", + "官" : "guan", + "倌" : "guan", + "蒄" : "guan", + "棺" : "guan", + "瘝" : "guan", + "鳏" : "guan", + "馆" : "guan", + "管" : "guan", + "贯" : "guan", + "冠" : "guan", + "掼" : "guan", + "惯" : "guan", + "祼" : "guan", + "盥" : "guan", + "灌" : "guan", + "瓘" : "guan", + "鹳" : "guan", + "罐" : "guan", + "琯" : "guan", + "光" : "guang", + "咣" : "guang", + "胱" : "guang", + "广" : "guang", + "犷" : "guang", + "桄" : "guang", + "逛" : "guang", + "归" : "gui", + "圭" : "gui", + "龟" : "gui", + "妫" : "gui", + "规" : "gui", + "皈" : "gui", + "闺" : "gui", + "硅" : "gui", + "瑰" : "gui", + "鲑" : "gui", + "宄" : "gui", + "轨" : "gui", + "庋" : "gui", + "匦" : "gui", + "诡" : "gui", + "鬼" : "gui", + "姽" : "gui", + "癸" : "gui", + "晷" : "gui", + "簋" : "gui", + "柜" : "gui", + "炅" : "gui", + "刿" : "gui", + "刽" : "gui", + "贵" : "gui", + "桂" : "gui", + "跪" : "gui", + "鳜" : "gui", + "衮" : "gun", + "绲" : "gun", + "辊" : "gun", + "滚" : "gun", + "磙" : "gun", + "鲧" : "gun", + "棍" : "gun", + "埚" : "guo", + "郭" : "guo", + "啯" : "guo", + "崞" : "guo", + "聒" : "guo", + "锅" : "guo", + "蝈" : "guo", + "国" : "guo", + "帼" : "guo", + "虢" : "guo", + "果" : "guo", + "椁" : "guo", + "蜾" : "guo", + "裹" : "guo", + "过" : "guo", + "哈" : "ha", + "铪" : "ha", + "孩" : "hai", + "骸" : "hai", + "胲" : "hai", + "海" : "hai", + "醢" : "hai", + "亥" : "hai", + "骇" : "hai", + "害" : "hai", + "嗐" : "hai", + "嗨" : "hai", + "顸" : "han", + "蚶" : "han", + "酣" : "han", + "憨" : "han", + "鼾" : "han", + "邗" : "han", + "邯" : "han", + "含" : "han", + "函" : "han", + "晗" : "han", + "焓" : "han", + "涵" : "han", + "韩" : "han", + "寒" : "han", + "罕" : "han", + "喊" : "han", + "蔊" : "han", + "汉" : "han", + "汗" : "han", + "旱" : "han", + "捍" : "han", + "悍" : "han", + "菡" : "han", + "焊" : "han", + "撖" : "han", + "撼" : "han", + "翰" : "han", + "憾" : "han", + "瀚" : "han", + "夯" : "hang", + "杭" : "hang", + "绗" : "hang", + "航" : "hang", + "沆" : "hang", + "蒿" : "hao", + "薅" : "hao", + "嚆" : "hao", + "蚝" : "hao", + "毫" : "hao", + "嗥" : "hao", + "豪" : "hao", + "壕" : "hao", + "嚎" : "hao", + "濠" : "hao", + "好" : "hao", + "郝" : "hao", + "号" : "hao", + "昊" : "hao", + "耗" : "hao", + "浩" : "hao", + "皓" : "hao", + "滈" : "hao", + "颢" : "hao", + "灏" : "hao", + "诃" : "he", + "呵" : "he", + "喝" : "he", + "嗬" : "he", + "禾" : "he", + "合" : "he", + "何" : "he", + "劾" : "he", + "河" : "he", + "曷" : "he", + "阂" : "he", + "盍" : "he", + "荷" : "he", + "菏" : "he", + "盒" : "he", + "涸" : "he", + "颌" : "he", + "阖" : "he", + "贺" : "he", + "赫" : "he", + "褐" : "he", + "鹤" : "he", + "壑" : "he", + "黑" : "hei", + "嘿" : "hei", + "痕" : "hen", + "很" : "hen", + "狠" : "hen", + "恨" : "hen", + "亨" : "heng", + "恒" : "heng", + "珩" : "heng", + "横" : "heng", + "衡" : "heng", + "蘅" : "heng", + "啈" : "heng", + "轰" : "hong", + "訇" : "hong", + "烘" : "hong", + "薨" : "hong", + "弘" : "hong", + "红" : "hong", + "闳" : "hong", + "宏" : "hong", + "荭" : "hong", + "虹" : "hong", + "竑" : "hong", + "洪" : "hong", + "鸿" : "hong", + "哄" : "hong", + "讧" : "hong", + "吽" : "hong", + "齁" : "hou", + "侯" : "hou", + "喉" : "hou", + "猴" : "hou", + "瘊" : "hou", + "骺" : "hou", + "篌" : "hou", + "糇" : "hou", + "吼" : "hou", + "后" : "hou", + "郈" : "hou", + "厚" : "hou", + "垕" : "hou", + "逅" : "hou", + "候" : "hou", + "堠" : "hou", + "鲎" : "hou", + "乎" : "hu", + "呼" : "hu", + "忽" : "hu", + "轷" : "hu", + "烀" : "hu", + "惚" : "hu", + "滹" : "hu", + "囫" : "hu", + "狐" : "hu", + "弧" : "hu", + "胡" : "hu", + "壶" : "hu", + "斛" : "hu", + "葫" : "hu", + "猢" : "hu", + "湖" : "hu", + "瑚" : "hu", + "鹕" : "hu", + "槲" : "hu", + "蝴" : "hu", + "糊" : "hu", + "醐" : "hu", + "觳" : "hu", + "虎" : "hu", + "唬" : "hu", + "琥" : "hu", + "互" : "hu", + "户" : "hu", + "冱" : "hu", + "护" : "hu", + "沪" : "hu", + "枑" : "hu", + "怙" : "hu", + "戽" : "hu", + "笏" : "hu", + "瓠" : "hu", + "扈" : "hu", + "鹱" : "hu", + "花" : "hua", + "砉" : "hua", + "华" : "hua", + "哗" : "hua", + "骅" : "hua", + "铧" : "hua", + "猾" : "hua", + "滑" : "hua", + "化" : "hua", + "画" : "hua", + "话" : "hua", + "桦" : "hua", + "婳" : "hua", + "觟" : "hua", + "怀" : "huai", + "徊" : "huai", + "淮" : "huai", + "槐" : "huai", + "踝" : "huai", + "耲" : "huai", + "坏" : "huai", + "欢" : "huan", + "獾" : "huan", + "环" : "huan", + "洹" : "huan", + "桓" : "huan", + "萑" : "huan", + "寰" : "huan", + "缳" : "huan", + "缓" : "huan", + "幻" : "huan", + "奂" : "huan", + "宦" : "huan", + "换" : "huan", + "唤" : "huan", + "涣" : "huan", + "浣" : "huan", + "患" : "huan", + "焕" : "huan", + "痪" : "huan", + "豢" : "huan", + "漶" : "huan", + "鲩" : "huan", + "擐" : "huan", + "肓" : "huang", + "荒" : "huang", + "塃" : "huang", + "慌" : "huang", + "皇" : "huang", + "黄" : "huang", + "凰" : "huang", + "隍" : "huang", + "喤" : "huang", + "遑" : "huang", + "徨" : "huang", + "湟" : "huang", + "惶" : "huang", + "媓" : "huang", + "煌" : "huang", + "锽" : "huang", + "潢" : "huang", + "璜" : "huang", + "蝗" : "huang", + "篁" : "huang", + "艎" : "huang", + "磺" : "huang", + "癀" : "huang", + "蟥" : "huang", + "簧" : "huang", + "鳇" : "huang", + "恍" : "huang", + "晃" : "huang", + "谎" : "huang", + "幌" : "huang", + "滉" : "huang", + "皝" : "huang", + "灰" : "hui", + "诙" : "hui", + "挥" : "hui", + "恢" : "hui", + "晖" : "hui", + "辉" : "hui", + "麾" : "hui", + "徽" : "hui", + "隳" : "hui", + "回" : "hui", + "茴" : "hui", + "洄" : "hui", + "蛔" : "hui", + "悔" : "hui", + "毁" : "hui", + "卉" : "hui", + "汇" : "hui", + "讳" : "hui", + "荟" : "hui", + "浍" : "hui", + "诲" : "hui", + "绘" : "hui", + "恚" : "hui", + "贿" : "hui", + "烩" : "hui", + "彗" : "hui", + "晦" : "hui", + "秽" : "hui", + "惠" : "hui", + "喙" : "hui", + "慧" : "hui", + "蕙" : "hui", + "蟪" : "hui", + "珲" : "hun", + "昏" : "hun", + "荤" : "hun", + "阍" : "hun", + "惛" : "hun", + "婚" : "hun", + "浑" : "hun", + "馄" : "hun", + "混" : "hun", + "魂" : "hun", + "诨" : "hun", + "溷" : "hun", + "耠" : "huo", + "劐" : "huo", + "豁" : "huo", + "活" : "huo", + "火" : "huo", + "伙" : "huo", + "钬" : "huo", + "夥" : "huo", + "或" : "huo", + "货" : "huo", + "获" : "huo", + "祸" : "huo", + "惑" : "huo", + "霍" : "huo", + "镬" : "huo", + "攉" : "huo", + "藿" : "huo", + "嚯" : "huo", + "讥" : "ji", + "击" : "ji", + "叽" : "ji", + "饥" : "ji", + "玑" : "ji", + "圾" : "ji", + "芨" : "ji", + "机" : "ji", + "乩" : "ji", + "肌" : "ji", + "矶" : "ji", + "鸡" : "ji", + "剞" : "ji", + "唧" : "ji", + "积" : "ji", + "笄" : "ji", + "屐" : "ji", + "姬" : "ji", + "基" : "ji", + "犄" : "ji", + "嵇" : "ji", + "畸" : "ji", + "跻" : "ji", + "箕" : "ji", + "齑" : "ji", + "畿" : "ji", + "墼" : "ji", + "激" : "ji", + "羁" : "ji", + "及" : "ji", + "吉" : "ji", + "岌" : "ji", + "汲" : "ji", + "级" : "ji", + "极" : "ji", + "即" : "ji", + "佶" : "ji", + "笈" : "ji", + "急" : "ji", + "疾" : "ji", + "棘" : "ji", + "集" : "ji", + "蒺" : "ji", + "楫" : "ji", + "辑" : "ji", + "嫉" : "ji", + "瘠" : "ji", + "藉" : "ji", + "籍" : "ji", + "几" : "ji", + "己" : "ji", + "虮" : "ji", + "挤" : "ji", + "脊" : "ji", + "掎" : "ji", + "戟" : "ji", + "麂" : "ji", + "计" : "ji", + "记" : "ji", + "伎" : "ji", + "纪" : "ji", + "技" : "ji", + "忌" : "ji", + "际" : "ji", + "妓" : "ji", + "季" : "ji", + "剂" : "ji", + "迹" : "ji", + "济" : "ji", + "既" : "ji", + "觊" : "ji", + "继" : "ji", + "偈" : "ji", + "祭" : "ji", + "悸" : "ji", + "寄" : "ji", + "寂" : "ji", + "绩" : "ji", + "暨" : "ji", + "稷" : "ji", + "鲫" : "ji", + "髻" : "ji", + "冀" : "ji", + "骥" : "ji", + "加" : "jia", + "佳" : "jia", + "枷" : "jia", + "浃" : "jia", + "痂" : "jia", + "家" : "jia", + "袈" : "jia", + "嘉" : "jia", + "镓" : "jia", + "荚" : "jia", + "戛" : "jia", + "颊" : "jia", + "甲" : "jia", + "胛" : "jia", + "钾" : "jia", + "假" : "jia", + "价" : "jia", + "驾" : "jia", + "架" : "jia", + "嫁" : "jia", + "稼" : "jia", + "戋" : "jian", + "尖" : "jian", + "奸" : "jian", + "歼" : "jian", + "坚" : "jian", + "间" : "jian", + "肩" : "jian", + "艰" : "jian", + "监" : "jian", + "兼" : "jian", + "菅" : "jian", + "笺" : "jian", + "缄" : "jian", + "煎" : "jian", + "拣" : "jian", + "茧" : "jian", + "柬" : "jian", + "俭" : "jian", + "捡" : "jian", + "检" : "jian", + "减" : "jian", + "剪" : "jian", + "睑" : "jian", + "简" : "jian", + "碱" : "jian", + "见" : "jian", + "件" : "jian", + "饯" : "jian", + "建" : "jian", + "荐" : "jian", + "贱" : "jian", + "剑" : "jian", + "健" : "jian", + "舰" : "jian", + "涧" : "jian", + "渐" : "jian", + "谏" : "jian", + "践" : "jian", + "锏" : "jian", + "毽" : "jian", + "腱" : "jian", + "溅" : "jian", + "鉴" : "jian", + "键" : "jian", + "僭" : "jian", + "箭" : "jian", + "江" : "jiang", + "将" : "jiang", + "姜" : "jiang", + "豇" : "jiang", + "浆" : "jiang", + "僵" : "jiang", + "缰" : "jiang", + "疆" : "jiang", + "讲" : "jiang", + "奖" : "jiang", + "桨" : "jiang", + "蒋" : "jiang", + "匠" : "jiang", + "酱" : "jiang", + "犟" : "jiang", + "糨" : "jiang", + "交" : "jiao", + "郊" : "jiao", + "浇" : "jiao", + "娇" : "jiao", + "姣" : "jiao", + "骄" : "jiao", + "胶" : "jiao", + "椒" : "jiao", + "蛟" : "jiao", + "焦" : "jiao", + "跤" : "jiao", + "蕉" : "jiao", + "礁" : "jiao", + "佼" : "jiao", + "狡" : "jiao", + "饺" : "jiao", + "绞" : "jiao", + "铰" : "jiao", + "矫" : "jiao", + "皎" : "jiao", + "脚" : "jiao", + "搅" : "jiao", + "剿" : "jiao", + "缴" : "jiao", + "叫" : "jiao", + "轿" : "jiao", + "较" : "jiao", + "教" : "jiao", + "窖" : "jiao", + "酵" : "jiao", + "侥" : "jiao", + "阶" : "jie", + "皆" : "jie", + "接" : "jie", + "秸" : "jie", + "揭" : "jie", + "嗟" : "jie", + "街" : "jie", + "孑" : "jie", + "节" : "jie", + "讦" : "jie", + "劫" : "jie", + "杰" : "jie", + "诘" : "jie", + "洁" : "jie", + "结" : "jie", + "捷" : "jie", + "睫" : "jie", + "截" : "jie", + "碣" : "jie", + "竭" : "jie", + "姐" : "jie", + "解" : "jie", + "介" : "jie", + "戒" : "jie", + "届" : "jie", + "界" : "jie", + "疥" : "jie", + "诫" : "jie", + "借" : "jie", + "巾" : "jin", + "斤" : "jin", + "今" : "jin", + "金" : "jin", + "津" : "jin", + "矜" : "jin", + "筋" : "jin", + "襟" : "jin", + "仅" : "jin", + "紧" : "jin", + "锦" : "jin", + "谨" : "jin", + "尽" : "jin", + "进" : "jin", + "近" : "jin", + "晋" : "jin", + "烬" : "jin", + "浸" : "jin", + "禁" : "jin", + "觐" : "jin", + "噤" : "jin", + "茎" : "jing", + "京" : "jing", + "泾" : "jing", + "经" : "jing", + "菁" : "jing", + "惊" : "jing", + "晶" : "jing", + "睛" : "jing", + "粳" : "jing", + "兢" : "jing", + "精" : "jing", + "鲸" : "jing", + "井" : "jing", + "阱" : "jing", + "刭" : "jing", + "景" : "jing", + "儆" : "jing", + "警" : "jing", + "径" : "jing", + "净" : "jing", + "痉" : "jing", + "竞" : "jing", + "竟" : "jing", + "敬" : "jing", + "靖" : "jing", + "静" : "jing", + "境" : "jing", + "镜" : "jing", + "迥" : "jiong", + "炯" : "jiong", + "窘" : "jiong", + "纠" : "jiu", + "鸠" : "jiu", + "究" : "jiu", + "赳" : "jiu", + "阄" : "jiu", + "揪" : "jiu", + "啾" : "jiu", + "九" : "jiu", + "久" : "jiu", + "玖" : "jiu", + "灸" : "jiu", + "韭" : "jiu", + "酒" : "jiu", + "旧" : "jiu", + "臼" : "jiu", + "咎" : "jiu", + "柩" : "jiu", + "救" : "jiu", + "厩" : "jiu", + "就" : "jiu", + "舅" : "jiu", + "鹫" : "jiu", + "军" : "jun", + "均" : "jun", + "君" : "jun", + "钧" : "jun", + "菌" : "jun", + "皲" : "jun", + "俊" : "jun", + "郡" : "jun", + "峻" : "jun", + "骏" : "jun", + "竣" : "jun", + "拘" : "ju", + "狙" : "ju", + "居" : "ju", + "驹" : "ju", + "掬" : "ju", + "雎" : "ju", + "鞠" : "ju", + "局" : "ju", + "菊" : "ju", + "焗" : "ju", + "橘" : "ju", + "咀" : "ju", + "沮" : "ju", + "矩" : "ju", + "举" : "ju", + "龃" : "ju", + "巨" : "ju", + "拒" : "ju", + "具" : "ju", + "炬" : "ju", + "俱" : "ju", + "剧" : "ju", + "据" : "ju", + "距" : "ju", + "惧" : "ju", + "飓" : "ju", + "锯" : "ju", + "聚" : "ju", + "踞" : "ju", + "捐" : "juan", + "涓" : "juan", + "娟" : "juan", + "鹃" : "juan", + "卷" : "juan", + "倦" : "juan", + "绢" : "juan", + "眷" : "juan", + "隽" : "juan", + "撅" : "jue", + "噘" : "jue", + "决" : "jue", + "诀" : "jue", + "抉" : "jue", + "绝" : "jue", + "掘" : "jue", + "崛" : "jue", + "厥" : "jue", + "谲" : "jue", + "蕨" : "jue", + "爵" : "jue", + "蹶" : "jue", + "矍" : "jue", + "倔" : "jue", + "咔" : "ka", + "开" : "kai", + "揩" : "kai", + "凯" : "kai", + "铠" : "kai", + "慨" : "kai", + "楷" : "kai", + "忾" : "kai", + "刊" : "kan", + "勘" : "kan", + "龛" : "kan", + "堪" : "kan", + "坎" : "kan", + "侃" : "kan", + "砍" : "kan", + "槛" : "kan", + "看" : "kan", + "瞰" : "kan", + "康" : "kang", + "慷" : "kang", + "糠" : "kang", + "亢" : "kang", + "伉" : "kang", + "抗" : "kang", + "炕" : "kang", + "考" : "kao", + "拷" : "kao", + "烤" : "kao", + "铐" : "kao", + "犒" : "kao", + "靠" : "kao", + "苛" : "ke", + "轲" : "ke", + "科" : "ke", + "棵" : "ke", + "搕" : "ke", + "嗑" : "ke", + "稞" : "ke", + "窠" : "ke", + "颗" : "ke", + "磕" : "ke", + "瞌" : "ke", + "蝌" : "ke", + "可" : "ke", + "坷" : "ke", + "渴" : "ke", + "克" : "ke", + "刻" : "ke", + "恪" : "ke", + "客" : "ke", + "课" : "ke", + "肯" : "ken", + "垦" : "ken", + "恳" : "ken", + "啃" : "ken", + "坑" : "keng", + "铿" : "keng", + "空" : "kong", + "孔" : "kong", + "恐" : "kong", + "控" : "kong", + "抠" : "kou", + "口" : "kou", + "叩" : "kou", + "扣" : "kou", + "寇" : "kou", + "蔻" : "kou", + "枯" : "ku", + "哭" : "ku", + "窟" : "ku", + "骷" : "ku", + "苦" : "ku", + "库" : "ku", + "绔" : "ku", + "裤" : "ku", + "酷" : "ku", + "夸" : "kua", + "垮" : "kua", + "挎" : "kua", + "胯" : "kua", + "跨" : "kua", + "块" : "kuai", + "快" : "kuai", + "侩" : "kuai", + "脍" : "kuai", + "筷" : "kuai", + "宽" : "kuan", + "髋" : "kuan", + "款" : "kuan", + "诓" : "kuang", + "哐" : "kuang", + "筐" : "kuang", + "狂" : "kuang", + "诳" : "kuang", + "旷" : "kuang", + "况" : "kuang", + "矿" : "kuang", + "框" : "kuang", + "眶" : "kuang", + "亏" : "kui", + "盔" : "kui", + "窥" : "kui", + "葵" : "kui", + "魁" : "kui", + "傀" : "kui", + "匮" : "kui", + "馈" : "kui", + "愧" : "kui", + "坤" : "kun", + "昆" : "kun", + "鲲" : "kun", + "捆" : "kun", + "困" : "kun", + "扩" : "kuo", + "括" : "kuo", + "阔" : "kuo", + "廓" : "kuo", + "垃" : "la", + "拉" : "la", + "啦" : "la", + "邋" : "la", + "旯" : "la", + "喇" : "la", + "腊" : "la", + "蜡" : "la", + "辣" : "la", + "来" : "lai", + "莱" : "lai", + "徕" : "lai", + "睐" : "lai", + "赖" : "lai", + "癞" : "lai", + "籁" : "lai", + "兰" : "lan", + "岚" : "lan", + "拦" : "lan", + "栏" : "lan", + "婪" : "lan", + "阑" : "lan", + "蓝" : "lan", + "澜" : "lan", + "褴" : "lan", + "篮" : "lan", + "览" : "lan", + "揽" : "lan", + "缆" : "lan", + "榄" : "lan", + "懒" : "lan", + "烂" : "lan", + "滥" : "lan", + "啷" : "lang", + "郎" : "lang", + "狼" : "lang", + "琅" : "lang", + "廊" : "lang", + "榔" : "lang", + "锒" : "lang", + "螂" : "lang", + "朗" : "lang", + "浪" : "lang", + "捞" : "lao", + "劳" : "lao", + "牢" : "lao", + "崂" : "lao", + "老" : "lao", + "佬" : "lao", + "姥" : "lao", + "唠" : "lao", + "烙" : "lao", + "涝" : "lao", + "酪" : "lao", + "雷" : "lei", + "羸" : "lei", + "垒" : "lei", + "磊" : "lei", + "蕾" : "lei", + "儡" : "lei", + "肋" : "lei", + "泪" : "lei", + "类" : "lei", + "累" : "lei", + "擂" : "lei", + "嘞" : "lei", + "棱" : "leng", + "楞" : "leng", + "冷" : "leng", + "睖" : "leng", + "厘" : "li", + "狸" : "li", + "离" : "li", + "梨" : "li", + "犁" : "li", + "鹂" : "li", + "喱" : "li", + "蜊" : "li", + "漓" : "li", + "璃" : "li", + "黎" : "li", + "罹" : "li", + "篱" : "li", + "蠡" : "li", + "礼" : "li", + "李" : "li", + "里" : "li", + "俚" : "li", + "逦" : "li", + "哩" : "li", + "娌" : "li", + "理" : "li", + "鲤" : "li", + "力" : "li", + "历" : "li", + "厉" : "li", + "立" : "li", + "吏" : "li", + "丽" : "li", + "励" : "li", + "呖" : "li", + "利" : "li", + "沥" : "li", + "枥" : "li", + "例" : "li", + "戾" : "li", + "隶" : "li", + "荔" : "li", + "俐" : "li", + "莉" : "li", + "莅" : "li", + "栗" : "li", + "砾" : "li", + "蛎" : "li", + "唳" : "li", + "笠" : "li", + "粒" : "li", + "雳" : "li", + "痢" : "li", + "连" : "lian", + "怜" : "lian", + "帘" : "lian", + "莲" : "lian", + "涟" : "lian", + "联" : "lian", + "廉" : "lian", + "鲢" : "lian", + "镰" : "lian", + "敛" : "lian", + "脸" : "lian", + "练" : "lian", + "炼" : "lian", + "恋" : "lian", + "殓" : "lian", + "链" : "lian", + "良" : "liang", + "凉" : "liang", + "梁" : "liang", + "粮" : "liang", + "粱" : "liang", + "两" : "liang", + "魉" : "liang", + "亮" : "liang", + "谅" : "liang", + "辆" : "liang", + "靓" : "liang", + "量" : "liang", + "晾" : "liang", + "踉" : "liang", + "辽" : "liao", + "疗" : "liao", + "聊" : "liao", + "僚" : "liao", + "寥" : "liao", + "撩" : "liao", + "嘹" : "liao", + "獠" : "liao", + "潦" : "liao", + "缭" : "liao", + "燎" : "liao", + "料" : "liao", + "撂" : "liao", + "瞭" : "liao", + "镣" : "liao", + "咧" : "lie", + "列" : "lie", + "劣" : "lie", + "冽" : "lie", + "烈" : "lie", + "猎" : "lie", + "裂" : "lie", + "趔" : "lie", + "拎" : "lin", + "邻" : "lin", + "林" : "lin", + "临" : "lin", + "淋" : "lin", + "琳" : "lin", + "粼" : "lin", + "嶙" : "lin", + "潾" : "lin", + "霖" : "lin", + "磷" : "lin", + "鳞" : "lin", + "麟" : "lin", + "凛" : "lin", + "檩" : "lin", + "吝" : "lin", + "赁" : "lin", + "躏" : "lin", + "伶" : "ling", + "灵" : "ling", + "苓" : "ling", + "囹" : "ling", + "泠" : "ling", + "玲" : "ling", + "瓴" : "ling", + "铃" : "ling", + "凌" : "ling", + "陵" : "ling", + "聆" : "ling", + "菱" : "ling", + "棂" : "ling", + "蛉" : "ling", + "翎" : "ling", + "羚" : "ling", + "绫" : "ling", + "零" : "ling", + "龄" : "ling", + "岭" : "ling", + "领" : "ling", + "另" : "ling", + "令" : "ling", + "溜" : "liu", + "熘" : "liu", + "刘" : "liu", + "浏" : "liu", + "留" : "liu", + "流" : "liu", + "琉" : "liu", + "硫" : "liu", + "馏" : "liu", + "榴" : "liu", + "瘤" : "liu", + "柳" : "liu", + "绺" : "liu", + "六" : "liu", + "遛" : "liu", + "龙" : "long", + "咙" : "long", + "珑" : "long", + "胧" : "long", + "聋" : "long", + "笼" : "long", + "隆" : "long", + "窿" : "long", + "陇" : "long", + "拢" : "long", + "垄" : "long", + "娄" : "lou", + "楼" : "lou", + "髅" : "lou", + "搂" : "lou", + "篓" : "lou", + "陋" : "lou", + "镂" : "lou", + "漏" : "lou", + "喽" : "lou", + "撸" : "lu", + "卢" : "lu", + "芦" : "lu", + "庐" : "lu", + "炉" : "lu", + "泸" : "lu", + "鸬" : "lu", + "颅" : "lu", + "鲈" : "lu", + "卤" : "lu", + "虏" : "lu", + "掳" : "lu", + "鲁" : "lu", + "橹" : "lu", + "录" : "lu", + "赂" : "lu", + "鹿" : "lu", + "禄" : "lu", + "路" : "lu", + "箓" : "lu", + "漉" : "lu", + "戮" : "lu", + "鹭" : "lu", + "麓" : "lu", + "峦" : "luan", + "孪" : "luan", + "挛" : "luan", + "鸾" : "luan", + "卵" : "luan", + "乱" : "luan", + "抡" : "lun", + "仑" : "lun", + "伦" : "lun", + "囵" : "lun", + "沦" : "lun", + "轮" : "lun", + "论" : "lun", + "啰" : "luo", + "罗" : "luo", + "萝" : "luo", + "逻" : "luo", + "锣" : "luo", + "箩" : "luo", + "骡" : "luo", + "螺" : "luo", + "裸" : "luo", + "洛" : "luo", + "络" : "luo", + "骆" : "luo", + "摞" : "luo", + "漯" : "luo", + "驴" : "lv", + "榈" : "lv", + "吕" : "lv", + "侣" : "lv", + "旅" : "lv", + "铝" : "lv", + "屡" : "lv", + "缕" : "lv", + "膂" : "lv", + "褛" : "lv", + "履" : "lv", + "律" : "lv", + "虑" : "lv", + "氯" : "lv", + "滤" : "lv", + "掠" : "lve", + "略" : "lve", + "妈" : "ma", + "麻" : "ma", + "蟆" : "ma", + "马" : "ma", + "犸" : "ma", + "玛" : "ma", + "码" : "ma", + "蚂" : "ma", + "骂" : "ma", + "吗" : "ma", + "嘛" : "ma", + "霾" : "mai", + "买" : "mai", + "迈" : "mai", + "麦" : "mai", + "卖" : "mai", + "霡" : "mai", + "蛮" : "man", + "馒" : "man", + "瞒" : "man", + "满" : "man", + "曼" : "man", + "谩" : "man", + "幔" : "man", + "漫" : "man", + "慢" : "man", + "牤" : "mang", + "芒" : "mang", + "忙" : "mang", + "盲" : "mang", + "氓" : "mang", + "茫" : "mang", + "莽" : "mang", + "漭" : "mang", + "蟒" : "mang", + "猫" : "mao", + "毛" : "mao", + "矛" : "mao", + "茅" : "mao", + "牦" : "mao", + "锚" : "mao", + "髦" : "mao", + "蝥" : "mao", + "蟊" : "mao", + "冇" : "mao", + "卯" : "mao", + "铆" : "mao", + "茂" : "mao", + "冒" : "mao", + "贸" : "mao", + "袤" : "mao", + "帽" : "mao", + "貌" : "mao", + "玫" : "mei", + "枚" : "mei", + "眉" : "mei", + "莓" : "mei", + "梅" : "mei", + "媒" : "mei", + "楣" : "mei", + "煤" : "mei", + "酶" : "mei", + "霉" : "mei", + "每" : "mei", + "美" : "mei", + "镁" : "mei", + "妹" : "mei", + "昧" : "mei", + "袂" : "mei", + "寐" : "mei", + "媚" : "mei", + "魅" : "mei", + "门" : "men", + "扪" : "men", + "闷" : "men", + "焖" : "men", + "懑" : "men", + "们" : "men", + "虻" : "meng", + "萌" : "meng", + "蒙" : "meng", + "盟" : "meng", + "檬" : "meng", + "曚" : "meng", + "朦" : "meng", + "猛" : "meng", + "锰" : "meng", + "蜢" : "meng", + "懵" : "meng", + "孟" : "meng", + "梦" : "meng", + "咪" : "mi", + "眯" : "mi", + "弥" : "mi", + "迷" : "mi", + "猕" : "mi", + "谜" : "mi", + "醚" : "mi", + "糜" : "mi", + "麋" : "mi", + "靡" : "mi", + "米" : "mi", + "弭" : "mi", + "觅" : "mi", + "密" : "mi", + "幂" : "mi", + "谧" : "mi", + "蜜" : "mi", + "眠" : "mian", + "绵" : "mian", + "棉" : "mian", + "免" : "mian", + "勉" : "mian", + "娩" : "mian", + "冕" : "mian", + "渑" : "mian", + "湎" : "mian", + "缅" : "mian", + "腼" : "mian", + "面" : "mian", + "喵" : "miao", + "苗" : "miao", + "描" : "miao", + "瞄" : "miao", + "秒" : "miao", + "渺" : "miao", + "藐" : "miao", + "妙" : "miao", + "庙" : "miao", + "缥" : "miao", + "咩" : "mie", + "灭" : "mie", + "蔑" : "mie", + "篾" : "mie", + "乜" : "mie", + "民" : "min", + "皿" : "min", + "抿" : "min", + "泯" : "min", + "闽" : "min", + "悯" : "min", + "敏" : "min", + "名" : "ming", + "明" : "ming", + "鸣" : "ming", + "茗" : "ming", + "冥" : "ming", + "铭" : "ming", + "瞑" : "ming", + "螟" : "ming", + "酩" : "ming", + "命" : "ming", + "谬" : "miu", + "摸" : "mo", + "馍" : "mo", + "摹" : "mo", + "膜" : "mo", + "摩" : "mo", + "磨" : "mo", + "蘑" : "mo", + "魔" : "mo", + "末" : "mo", + "茉" : "mo", + "殁" : "mo", + "沫" : "mo", + "陌" : "mo", + "莫" : "mo", + "秣" : "mo", + "蓦" : "mo", + "漠" : "mo", + "寞" : "mo", + "墨" : "mo", + "默" : "mo", + "嬷" : "mo", + "缪" : "mou", + "哞" : "mou", + "眸" : "mou", + "谋" : "mou", + "某" : "mou", + "母" : "mu", + "牡" : "mu", + "亩" : "mu", + "拇" : "mu", + "姆" : "mu", + "木" : "mu", + "目" : "mu", + "沐" : "mu", + "苜" : "mu", + "牧" : "mu", + "钼" : "mu", + "募" : "mu", + "墓" : "mu", + "幕" : "mu", + "睦" : "mu", + "慕" : "mu", + "暮" : "mu", + "穆" : "mu", + "拿" : "na", + "呐" : "na", + "纳" : "na", + "钠" : "na", + "衲" : "na", + "捺" : "na", + "乃" : "nai", + "奶" : "nai", + "氖" : "nai", + "奈" : "nai", + "耐" : "nai", + "囡" : "nan", + "男" : "nan", + "南" : "nan", + "难" : "nan", + "喃" : "nan", + "楠" : "nan", + "赧" : "nan", + "腩" : "nan", + "囔" : "nang", + "囊" : "nang", + "孬" : "nao", + "呶" : "nao", + "挠" : "nao", + "恼" : "nao", + "脑" : "nao", + "瑙" : "nao", + "闹" : "nao", + "淖" : "nao", + "讷" : "ne", + "馁" : "nei", + "内" : "nei", + "嫩" : "nen", + "恁" : "nen", + "能" : "neng", + "嗯" : "ng", + "妮" : "ni", + "尼" : "ni", + "泥" : "ni", + "怩" : "ni", + "倪" : "ni", + "霓" : "ni", + "拟" : "ni", + "你" : "ni", + "旎" : "ni", + "昵" : "ni", + "逆" : "ni", + "匿" : "ni", + "腻" : "ni", + "溺" : "ni", + "拈" : "nian", + "蔫" : "nian", + "年" : "nian", + "黏" : "nian", + "捻" : "nian", + "辇" : "nian", + "撵" : "nian", + "碾" : "nian", + "廿" : "nian", + "念" : "nian", + "娘" : "niang", + "酿" : "niang", + "鸟" : "niao", + "袅" : "niao", + "尿" : "niao", + "捏" : "nie", + "聂" : "nie", + "涅" : "nie", + "嗫" : "nie", + "镊" : "nie", + "镍" : "nie", + "蹑" : "nie", + "孽" : "nie", + "您" : "nin", + "宁" : "ning", + "咛" : "ning", + "狞" : "ning", + "柠" : "ning", + "凝" : "ning", + "拧" : "ning", + "佞" : "ning", + "泞" : "ning", + "妞" : "niu", + "牛" : "niu", + "扭" : "niu", + "忸" : "niu", + "纽" : "niu", + "钮" : "niu", + "农" : "nong", + "哝" : "nong", + "浓" : "nong", + "脓" : "nong", + "弄" : "nong", + "奴" : "nu", + "驽" : "nu", + "努" : "nu", + "弩" : "nu", + "怒" : "nu", + "暖" : "nuan", + "疟" : "nue", + "虐" : "nue", + "挪" : "nuo", + "诺" : "nuo", + "喏" : "nuo", + "懦" : "nuo", + "糯" : "nuo", + "女" : "nv", + "噢" : "o", + "讴" : "ou", + "瓯" : "ou", + "欧" : "ou", + "殴" : "ou", + "鸥" : "ou", + "呕" : "ou", + "偶" : "ou", + "藕" : "ou", + "怄" : "ou", + "趴" : "pa", + "啪" : "pa", + "葩" : "pa", + "杷" : "pa", + "爬" : "pa", + "琶" : "pa", + "帕" : "pa", + "怕" : "pa", + "拍" : "pai", + "排" : "pai", + "徘" : "pai", + "牌" : "pai", + "哌" : "pai", + "派" : "pai", + "湃" : "pai", + "潘" : "pan", + "攀" : "pan", + "爿" : "pan", + "盘" : "pan", + "磐" : "pan", + "蹒" : "pan", + "蟠" : "pan", + "判" : "pan", + "盼" : "pan", + "叛" : "pan", + "畔" : "pan", + "乓" : "pang", + "滂" : "pang", + "庞" : "pang", + "旁" : "pang", + "螃" : "pang", + "耪" : "pang", + "抛" : "pao", + "咆" : "pao", + "庖" : "pao", + "袍" : "pao", + "跑" : "pao", + "泡" : "pao", + "呸" : "pei", + "胚" : "pei", + "陪" : "pei", + "培" : "pei", + "赔" : "pei", + "裴" : "pei", + "沛" : "pei", + "佩" : "pei", + "配" : "pei", + "喷" : "pen", + "盆" : "pen", + "抨" : "peng", + "怦" : "peng", + "砰" : "peng", + "烹" : "peng", + "嘭" : "peng", + "朋" : "peng", + "彭" : "peng", + "棚" : "peng", + "蓬" : "peng", + "硼" : "peng", + "鹏" : "peng", + "澎" : "peng", + "篷" : "peng", + "膨" : "peng", + "捧" : "peng", + "碰" : "peng", + "丕" : "pi", + "批" : "pi", + "纰" : "pi", + "坯" : "pi", + "披" : "pi", + "砒" : "pi", + "劈" : "pi", + "噼" : "pi", + "霹" : "pi", + "皮" : "pi", + "枇" : "pi", + "毗" : "pi", + "蚍" : "pi", + "疲" : "pi", + "啤" : "pi", + "琵" : "pi", + "脾" : "pi", + "貔" : "pi", + "匹" : "pi", + "痞" : "pi", + "癖" : "pi", + "屁" : "pi", + "睥" : "pi", + "媲" : "pi", + "僻" : "pi", + "譬" : "pi", + "偏" : "pian", + "篇" : "pian", + "翩" : "pian", + "骈" : "pian", + "蹁" : "pian", + "片" : "pian", + "骗" : "pian", + "剽" : "piao", + "漂" : "piao", + "飘" : "piao", + "瓢" : "piao", + "殍" : "piao", + "瞟" : "piao", + "票" : "piao", + "氕" : "pie", + "瞥" : "pie", + "撇" : "pie", + "拼" : "pin", + "姘" : "pin", + "贫" : "pin", + "频" : "pin", + "嫔" : "pin", + "颦" : "pin", + "品" : "pin", + "聘" : "pin", + "乒" : "ping", + "娉" : "ping", + "平" : "ping", + "评" : "ping", + "坪" : "ping", + "苹" : "ping", + "凭" : "ping", + "瓶" : "ping", + "萍" : "ping", + "钋" : "po", + "坡" : "po", + "泼" : "po", + "颇" : "po", + "婆" : "po", + "鄱" : "po", + "叵" : "po", + "珀" : "po", + "破" : "po", + "粕" : "po", + "魄" : "po", + "剖" : "pou", + "抔" : "pou", + "扑" : "pu", + "铺" : "pu", + "噗" : "pu", + "仆" : "pu", + "匍" : "pu", + "菩" : "pu", + "葡" : "pu", + "蒲" : "pu", + "璞" : "pu", + "圃" : "pu", + "浦" : "pu", + "普" : "pu", + "谱" : "pu", + "蹼" : "pu", + "七" : "qi", + "沏" : "qi", + "妻" : "qi", + "柒" : "qi", + "凄" : "qi", + "萋" : "qi", + "戚" : "qi", + "期" : "qi", + "欺" : "qi", + "嘁" : "qi", + "漆" : "qi", + "齐" : "qi", + "芪" : "qi", + "其" : "qi", + "歧" : "qi", + "祈" : "qi", + "祇" : "qi", + "脐" : "qi", + "畦" : "qi", + "跂" : "qi", + "崎" : "qi", + "骑" : "qi", + "琪" : "qi", + "棋" : "qi", + "旗" : "qi", + "鳍" : "qi", + "麒" : "qi", + "乞" : "qi", + "岂" : "qi", + "企" : "qi", + "杞" : "qi", + "启" : "qi", + "起" : "qi", + "绮" : "qi", + "气" : "qi", + "讫" : "qi", + "迄" : "qi", + "弃" : "qi", + "汽" : "qi", + "泣" : "qi", + "契" : "qi", + "砌" : "qi", + "葺" : "qi", + "器" : "qi", + "憩" : "qi", + "俟" : "qi", + "掐" : "qia", + "洽" : "qia", + "恰" : "qia", + "千" : "qian", + "仟" : "qian", + "阡" : "qian", + "芊" : "qian", + "迁" : "qian", + "钎" : "qian", + "牵" : "qian", + "悭" : "qian", + "谦" : "qian", + "签" : "qian", + "愆" : "qian", + "前" : "qian", + "虔" : "qian", + "钱" : "qian", + "钳" : "qian", + "乾" : "qian", + "潜" : "qian", + "黔" : "qian", + "遣" : "qian", + "谴" : "qian", + "欠" : "qian", + "芡" : "qian", + "倩" : "qian", + "堑" : "qian", + "嵌" : "qian", + "歉" : "qian", + "羌" : "qiang", + "枪" : "qiang", + "戕" : "qiang", + "腔" : "qiang", + "蜣" : "qiang", + "锵" : "qiang", + "墙" : "qiang", + "蔷" : "qiang", + "抢" : "qiang", + "羟" : "qiang", + "襁" : "qiang", + "呛" : "qiang", + "炝" : "qiang", + "跄" : "qiang", + "悄" : "qiao", + "跷" : "qiao", + "锹" : "qiao", + "敲" : "qiao", + "橇" : "qiao", + "乔" : "qiao", + "侨" : "qiao", + "荞" : "qiao", + "桥" : "qiao", + "憔" : "qiao", + "瞧" : "qiao", + "巧" : "qiao", + "俏" : "qiao", + "诮" : "qiao", + "峭" : "qiao", + "窍" : "qiao", + "翘" : "qiao", + "撬" : "qiao", + "切" : "qie", + "且" : "qie", + "妾" : "qie", + "怯" : "qie", + "窃" : "qie", + "挈" : "qie", + "惬" : "qie", + "趄" : "qie", + "锲" : "qie", + "钦" : "qin", + "侵" : "qin", + "衾" : "qin", + "芹" : "qin", + "芩" : "qin", + "秦" : "qin", + "琴" : "qin", + "禽" : "qin", + "勤" : "qin", + "擒" : "qin", + "噙" : "qin", + "寝" : "qin", + "沁" : "qin", + "青" : "qing", + "轻" : "qing", + "氢" : "qing", + "倾" : "qing", + "卿" : "qing", + "清" : "qing", + "蜻" : "qing", + "情" : "qing", + "晴" : "qing", + "氰" : "qing", + "擎" : "qing", + "顷" : "qing", + "请" : "qing", + "庆" : "qing", + "罄" : "qing", + "穷" : "qiong", + "穹" : "qiong", + "琼" : "qiong", + "丘" : "qiu", + "秋" : "qiu", + "蚯" : "qiu", + "鳅" : "qiu", + "囚" : "qiu", + "求" : "qiu", + "虬" : "qiu", + "泅" : "qiu", + "酋" : "qiu", + "球" : "qiu", + "遒" : "qiu", + "裘" : "qiu", + "岖" : "qu", + "驱" : "qu", + "屈" : "qu", + "蛆" : "qu", + "躯" : "qu", + "趋" : "qu", + "蛐" : "qu", + "黢" : "qu", + "渠" : "qu", + "瞿" : "qu", + "曲" : "qu", + "取" : "qu", + "娶" : "qu", + "龋" : "qu", + "去" : "qu", + "趣" : "qu", + "觑" : "qu", + "悛" : "quan", + "权" : "quan", + "全" : "quan", + "诠" : "quan", + "泉" : "quan", + "拳" : "quan", + "痊" : "quan", + "蜷" : "quan", + "醛" : "quan", + "犬" : "quan", + "劝" : "quan", + "券" : "quan", + "炔" : "que", + "缺" : "que", + "瘸" : "que", + "却" : "que", + "确" : "que", + "鹊" : "que", + "阙" : "que", + "榷" : "que", + "逡" : "qun", + "裙" : "qun", + "群" : "qun", + "蚺" : "ran", + "然" : "ran", + "燃" : "ran", + "冉" : "ran", + "苒" : "ran", + "染" : "ran", + "瓤" : "rang", + "壤" : "rang", + "攘" : "rang", + "嚷" : "rang", + "让" : "rang", + "荛" : "rao", + "饶" : "rao", + "娆" : "rao", + "桡" : "rao", + "扰" : "rao", + "绕" : "rao", + "惹" : "re", + "热" : "re", + "人" : "ren", + "壬" : "ren", + "仁" : "ren", + "忍" : "ren", + "荏" : "ren", + "稔" : "ren", + "刃" : "ren", + "认" : "ren", + "任" : "ren", + "纫" : "ren", + "韧" : "ren", + "饪" : "ren", + "扔" : "reng", + "仍" : "reng", + "日" : "ri", + "戎" : "rong", + "茸" : "rong", + "荣" : "rong", + "绒" : "rong", + "容" : "rong", + "嵘" : "rong", + "蓉" : "rong", + "溶" : "rong", + "榕" : "rong", + "熔" : "rong", + "融" : "rong", + "冗" : "rong", + "氄" : "rong", + "柔" : "rou", + "揉" : "rou", + "糅" : "rou", + "蹂" : "rou", + "鞣" : "rou", + "肉" : "rou", + "如" : "ru", + "茹" : "ru", + "铷" : "ru", + "儒" : "ru", + "孺" : "ru", + "蠕" : "ru", + "汝" : "ru", + "乳" : "ru", + "辱" : "ru", + "入" : "ru", + "缛" : "ru", + "褥" : "ru", + "阮" : "ruan", + "软" : "ruan", + "蕊" : "rui", + "蚋" : "rui", + "锐" : "rui", + "瑞" : "rui", + "睿" : "rui", + "闰" : "run", + "润" : "run", + "若" : "ruo", + "偌" : "ruo", + "弱" : "ruo", + "仨" : "sa", + "洒" : "sa", + "撒" : "sa", + "卅" : "sa", + "飒" : "sa", + "萨" : "sa", + "腮" : "sai", + "赛" : "sai", + "三" : "san", + "叁" : "san", + "伞" : "san", + "散" : "san", + "桑" : "sang", + "搡" : "sang", + "嗓" : "sang", + "丧" : "sang", + "搔" : "sao", + "骚" : "sao", + "扫" : "sao", + "嫂" : "sao", + "臊" : "sao", + "涩" : "se", + "啬" : "se", + "铯" : "se", + "瑟" : "se", + "穑" : "se", + "森" : "sen", + "僧" : "seng", + "杀" : "sha", + "沙" : "sha", + "纱" : "sha", + "砂" : "sha", + "啥" : "sha", + "傻" : "sha", + "厦" : "sha", + "歃" : "sha", + "煞" : "sha", + "霎" : "sha", + "筛" : "shai", + "晒" : "shai", + "山" : "shan", + "删" : "shan", + "苫" : "shan", + "衫" : "shan", + "姗" : "shan", + "珊" : "shan", + "煽" : "shan", + "潸" : "shan", + "膻" : "shan", + "闪" : "shan", + "陕" : "shan", + "讪" : "shan", + "汕" : "shan", + "扇" : "shan", + "善" : "shan", + "骟" : "shan", + "缮" : "shan", + "擅" : "shan", + "膳" : "shan", + "嬗" : "shan", + "赡" : "shan", + "鳝" : "shan", + "伤" : "shang", + "殇" : "shang", + "商" : "shang", + "觞" : "shang", + "熵" : "shang", + "晌" : "shang", + "赏" : "shang", + "上" : "shang", + "尚" : "shang", + "捎" : "shao", + "烧" : "shao", + "梢" : "shao", + "稍" : "shao", + "艄" : "shao", + "勺" : "shao", + "芍" : "shao", + "韶" : "shao", + "少" : "shao", + "邵" : "shao", + "绍" : "shao", + "哨" : "shao", + "潲" : "shao", + "奢" : "she", + "赊" : "she", + "舌" : "she", + "佘" : "she", + "蛇" : "she", + "舍" : "she", + "设" : "she", + "社" : "she", + "射" : "she", + "涉" : "she", + "赦" : "she", + "摄" : "she", + "慑" : "she", + "麝" : "she", + "申" : "shen", + "伸" : "shen", + "身" : "shen", + "呻" : "shen", + "绅" : "shen", + "砷" : "shen", + "深" : "shen", + "神" : "shen", + "沈" : "shen", + "审" : "shen", + "哂" : "shen", + "婶" : "shen", + "肾" : "shen", + "甚" : "shen", + "渗" : "shen", + "葚" : "shen", + "蜃" : "shen", + "慎" : "shen", + "升" : "sheng", + "生" : "sheng", + "声" : "sheng", + "昇" : "sheng", + "牲" : "sheng", + "笙" : "sheng", + "甥" : "sheng", + "绳" : "sheng", + "圣" : "sheng", + "胜" : "sheng", + "晟" : "sheng", + "剩" : "sheng", + "尸" : "shi", + "失" : "shi", + "师" : "shi", + "诗" : "shi", + "虱" : "shi", + "狮" : "shi", + "施" : "shi", + "湿" : "shi", + "十" : "shi", + "时" : "shi", + "实" : "shi", + "食" : "shi", + "蚀" : "shi", + "史" : "shi", + "矢" : "shi", + "使" : "shi", + "始" : "shi", + "驶" : "shi", + "屎" : "shi", + "士" : "shi", + "氏" : "shi", + "示" : "shi", + "世" : "shi", + "仕" : "shi", + "市" : "shi", + "式" : "shi", + "势" : "shi", + "事" : "shi", + "侍" : "shi", + "饰" : "shi", + "试" : "shi", + "视" : "shi", + "拭" : "shi", + "柿" : "shi", + "是" : "shi", + "适" : "shi", + "恃" : "shi", + "室" : "shi", + "逝" : "shi", + "轼" : "shi", + "舐" : "shi", + "弑" : "shi", + "释" : "shi", + "谥" : "shi", + "嗜" : "shi", + "誓" : "shi", + "收" : "shou", + "手" : "shou", + "守" : "shou", + "首" : "shou", + "寿" : "shou", + "受" : "shou", + "狩" : "shou", + "授" : "shou", + "售" : "shou", + "兽" : "shou", + "绶" : "shou", + "瘦" : "shou", + "殳" : "shu", + "书" : "shu", + "抒" : "shu", + "枢" : "shu", + "叔" : "shu", + "姝" : "shu", + "殊" : "shu", + "倏" : "shu", + "梳" : "shu", + "淑" : "shu", + "舒" : "shu", + "疏" : "shu", + "输" : "shu", + "蔬" : "shu", + "秫" : "shu", + "孰" : "shu", + "赎" : "shu", + "塾" : "shu", + "暑" : "shu", + "黍" : "shu", + "署" : "shu", + "蜀" : "shu", + "鼠" : "shu", + "薯" : "shu", + "曙" : "shu", + "戍" : "shu", + "束" : "shu", + "述" : "shu", + "树" : "shu", + "竖" : "shu", + "恕" : "shu", + "庶" : "shu", + "墅" : "shu", + "漱" : "shu", + "刷" : "shua", + "唰" : "shua", + "耍" : "shua", + "衰" : "shuai", + "摔" : "shuai", + "甩" : "shuai", + "帅" : "shuai", + "蟀" : "shuai", + "闩" : "shuan", + "拴" : "shuan", + "栓" : "shuan", + "涮" : "shuan", + "双" : "shuang", + "霜" : "shuang", + "孀" : "shuang", + "爽" : "shuang", + "谁" : "shui", + "水" : "shui", + "税" : "shui", + "睡" : "shui", + "吮" : "shun", + "顺" : "shun", + "舜" : "shun", + "瞬" : "shun", + "烁" : "shuo", + "铄" : "shuo", + "朔" : "shuo", + "硕" : "shuo", + "司" : "si", + "丝" : "si", + "私" : "si", + "咝" : "si", + "思" : "si", + "斯" : "si", + "厮" : "si", + "撕" : "si", + "嘶" : "si", + "死" : "si", + "巳" : "si", + "四" : "si", + "寺" : "si", + "祀" : "si", + "饲" : "si", + "肆" : "si", + "嗣" : "si", + "松" : "song", + "嵩" : "song", + "怂" : "song", + "耸" : "song", + "悚" : "song", + "讼" : "song", + "宋" : "song", + "送" : "song", + "诵" : "song", + "颂" : "song", + "搜" : "sou", + "嗖" : "sou", + "馊" : "sou", + "艘" : "sou", + "叟" : "sou", + "擞" : "sou", + "嗽" : "sou", + "苏" : "su", + "酥" : "su", + "俗" : "su", + "夙" : "su", + "诉" : "su", + "肃" : "su", + "素" : "su", + "速" : "su", + "粟" : "su", + "嗉" : "su", + "塑" : "su", + "溯" : "su", + "簌" : "su", + "酸" : "suan", + "蒜" : "suan", + "算" : "suan", + "虽" : "sui", + "睢" : "sui", + "绥" : "sui", + "隋" : "sui", + "随" : "sui", + "髓" : "sui", + "岁" : "sui", + "祟" : "sui", + "遂" : "sui", + "碎" : "sui", + "隧" : "sui", + "穗" : "sui", + "孙" : "sun", + "损" : "sun", + "笋" : "sun", + "隼" : "sun", + "唆" : "suo", + "梭" : "suo", + "蓑" : "suo", + "羧" : "suo", + "缩" : "suo", + "所" : "suo", + "索" : "suo", + "唢" : "suo", + "琐" : "suo", + "锁" : "suo", + "他" : "ta", + "它" : "ta", + "她" : "ta", + "铊" : "ta", + "塌" : "ta", + "塔" : "ta", + "獭" : "ta", + "挞" : "ta", + "榻" : "ta", + "踏" : "ta", + "蹋" : "ta", + "胎" : "tai", + "台" : "tai", + "邰" : "tai", + "抬" : "tai", + "苔" : "tai", + "跆" : "tai", + "太" : "tai", + "汰" : "tai", + "态" : "tai", + "钛" : "tai", + "泰" : "tai", + "酞" : "tai", + "贪" : "tan", + "摊" : "tan", + "滩" : "tan", + "瘫" : "tan", + "坛" : "tan", + "昙" : "tan", + "谈" : "tan", + "痰" : "tan", + "谭" : "tan", + "潭" : "tan", + "檀" : "tan", + "坦" : "tan", + "袒" : "tan", + "毯" : "tan", + "叹" : "tan", + "炭" : "tan", + "探" : "tan", + "碳" : "tan", + "汤" : "tang", + "嘡" : "tang", + "羰" : "tang", + "唐" : "tang", + "堂" : "tang", + "棠" : "tang", + "塘" : "tang", + "搪" : "tang", + "膛" : "tang", + "镗" : "tang", + "糖" : "tang", + "螳" : "tang", + "倘" : "tang", + "淌" : "tang", + "躺" : "tang", + "烫" : "tang", + "趟" : "tang", + "涛" : "tao", + "绦" : "tao", + "掏" : "tao", + "滔" : "tao", + "韬" : "tao", + "饕" : "tao", + "逃" : "tao", + "桃" : "tao", + "陶" : "tao", + "萄" : "tao", + "淘" : "tao", + "讨" : "tao", + "套" : "tao", + "特" : "te", + "疼" : "teng", + "腾" : "teng", + "誊" : "teng", + "滕" : "teng", + "藤" : "teng", + "剔" : "ti", + "梯" : "ti", + "踢" : "ti", + "啼" : "ti", + "题" : "ti", + "醍" : "ti", + "蹄" : "ti", + "体" : "ti", + "屉" : "ti", + "剃" : "ti", + "涕" : "ti", + "悌" : "ti", + "惕" : "ti", + "替" : "ti", + "天" : "tian", + "添" : "tian", + "田" : "tian", + "恬" : "tian", + "甜" : "tian", + "填" : "tian", + "忝" : "tian", + "殄" : "tian", + "舔" : "tian", + "掭" : "tian", + "佻" : "tiao", + "挑" : "tiao", + "条" : "tiao", + "迢" : "tiao", + "笤" : "tiao", + "髫" : "tiao", + "窕" : "tiao", + "眺" : "tiao", + "粜" : "tiao", + "跳" : "tiao", + "帖" : "tie", + "贴" : "tie", + "铁" : "tie", + "餮" : "tie", + "铤" : "ting", + "厅" : "ting", + "听" : "ting", + "烃" : "ting", + "廷" : "ting", + "亭" : "ting", + "庭" : "ting", + "停" : "ting", + "蜓" : "ting", + "婷" : "ting", + "霆" : "ting", + "挺" : "ting", + "艇" : "ting", + "通" : "tong", + "嗵" : "tong", + "同" : "tong", + "彤" : "tong", + "桐" : "tong", + "铜" : "tong", + "童" : "tong", + "潼" : "tong", + "瞳" : "tong", + "统" : "tong", + "捅" : "tong", + "桶" : "tong", + "筒" : "tong", + "恸" : "tong", + "痛" : "tong", + "偷" : "tou", + "头" : "tou", + "投" : "tou", + "骰" : "tou", + "透" : "tou", + "凸" : "tu", + "秃" : "tu", + "突" : "tu", + "图" : "tu", + "荼" : "tu", + "徒" : "tu", + "途" : "tu", + "涂" : "tu", + "屠" : "tu", + "土" : "tu", + "吐" : "tu", + "兔" : "tu", + "菟" : "tu", + "湍" : "tuan", + "团" : "tuan", + "疃" : "tuan", + "彖" : "tuan", + "推" : "tui", + "颓" : "tui", + "腿" : "tui", + "退" : "tui", + "蜕" : "tui", + "褪" : "tui", + "吞" : "tun", + "屯" : "tun", + "饨" : "tun", + "豚" : "tun", + "臀" : "tun", + "托" : "tuo", + "拖" : "tuo", + "脱" : "tuo", + "佗" : "tuo", + "陀" : "tuo", + "驼" : "tuo", + "鸵" : "tuo", + "妥" : "tuo", + "椭" : "tuo", + "唾" : "tuo", + "挖" : "wa", + "哇" : "wa", + "洼" : "wa", + "娲" : "wa", + "蛙" : "wa", + "娃" : "wa", + "瓦" : "wa", + "佤" : "wa", + "袜" : "wa", + "歪" : "wai", + "外" : "wai", + "弯" : "wan", + "剜" : "wan", + "湾" : "wan", + "蜿" : "wan", + "豌" : "wan", + "丸" : "wan", + "纨" : "wan", + "完" : "wan", + "玩" : "wan", + "顽" : "wan", + "烷" : "wan", + "宛" : "wan", + "挽" : "wan", + "晚" : "wan", + "惋" : "wan", + "婉" : "wan", + "绾" : "wan", + "皖" : "wan", + "碗" : "wan", + "万" : "wan", + "腕" : "wan", + "汪" : "wang", + "亡" : "wang", + "王" : "wang", + "网" : "wang", + "枉" : "wang", + "罔" : "wang", + "往" : "wang", + "惘" : "wang", + "妄" : "wang", + "忘" : "wang", + "旺" : "wang", + "望" : "wang", + "危" : "wei", + "威" : "wei", + "偎" : "wei", + "微" : "wei", + "煨" : "wei", + "薇" : "wei", + "巍" : "wei", + "韦" : "wei", + "为" : "wei", + "违" : "wei", + "围" : "wei", + "闱" : "wei", + "桅" : "wei", + "唯" : "wei", + "帷" : "wei", + "维" : "wei", + "伟" : "wei", + "伪" : "wei", + "苇" : "wei", + "纬" : "wei", + "委" : "wei", + "诿" : "wei", + "娓" : "wei", + "萎" : "wei", + "猥" : "wei", + "痿" : "wei", + "卫" : "wei", + "未" : "wei", + "位" : "wei", + "味" : "wei", + "畏" : "wei", + "胃" : "wei", + "谓" : "wei", + "喂" : "wei", + "猬" : "wei", + "渭" : "wei", + "蔚" : "wei", + "慰" : "wei", + "魏" : "wei", + "温" : "wen", + "瘟" : "wen", + "文" : "wen", + "纹" : "wen", + "闻" : "wen", + "蚊" : "wen", + "雯" : "wen", + "刎" : "wen", + "吻" : "wen", + "紊" : "wen", + "稳" : "wen", + "问" : "wen", + "汶" : "wen", + "翁" : "weng", + "嗡" : "weng", + "瓮" : "weng", + "挝" : "wo", + "莴" : "wo", + "倭" : "wo", + "喔" : "wo", + "窝" : "wo", + "蜗" : "wo", + "我" : "wo", + "肟" : "wo", + "沃" : "wo", + "卧" : "wo", + "握" : "wo", + "幄" : "wo", + "斡" : "wo", + "乌" : "wu", + "邬" : "wu", + "污" : "wu", + "巫" : "wu", + "呜" : "wu", + "钨" : "wu", + "诬" : "wu", + "屋" : "wu", + "无" : "wu", + "毋" : "wu", + "芜" : "wu", + "吴" : "wu", + "梧" : "wu", + "蜈" : "wu", + "五" : "wu", + "午" : "wu", + "伍" : "wu", + "仵" : "wu", + "怃" : "wu", + "忤" : "wu", + "妩" : "wu", + "武" : "wu", + "侮" : "wu", + "捂" : "wu", + "鹉" : "wu", + "舞" : "wu", + "兀" : "wu", + "勿" : "wu", + "戊" : "wu", + "务" : "wu", + "坞" : "wu", + "物" : "wu", + "误" : "wu", + "悟" : "wu", + "晤" : "wu", + "骛" : "wu", + "雾" : "wu", + "寤" : "wu", + "鹜" : "wu", + "夕" : "xi", + "兮" : "xi", + "西" : "xi", + "吸" : "xi", + "汐" : "xi", + "希" : "xi", + "昔" : "xi", + "析" : "xi", + "唏" : "xi", + "牺" : "xi", + "息" : "xi", + "奚" : "xi", + "悉" : "xi", + "烯" : "xi", + "惜" : "xi", + "晰" : "xi", + "稀" : "xi", + "翕" : "xi", + "犀" : "xi", + "皙" : "xi", + "锡" : "xi", + "溪" : "xi", + "熙" : "xi", + "蜥" : "xi", + "熄" : "xi", + "嘻" : "xi", + "膝" : "xi", + "嬉" : "xi", + "羲" : "xi", + "蟋" : "xi", + "曦" : "xi", + "习" : "xi", + "席" : "xi", + "袭" : "xi", + "媳" : "xi", + "洗" : "xi", + "玺" : "xi", + "徙" : "xi", + "喜" : "xi", + "禧" : "xi", + "戏" : "xi", + "细" : "xi", + "隙" : "xi", + "呷" : "xia", + "虾" : "xia", + "瞎" : "xia", + "匣" : "xia", + "侠" : "xia", + "峡" : "xia", + "狭" : "xia", + "遐" : "xia", + "瑕" : "xia", + "暇" : "xia", + "辖" : "xia", + "霞" : "xia", + "黠" : "xia", + "下" : "xia", + "夏" : "xia", + "罅" : "xia", + "仙" : "xian", + "先" : "xian", + "氙" : "xian", + "掀" : "xian", + "酰" : "xian", + "锨" : "xian", + "鲜" : "xian", + "闲" : "xian", + "贤" : "xian", + "弦" : "xian", + "咸" : "xian", + "涎" : "xian", + "娴" : "xian", + "衔" : "xian", + "舷" : "xian", + "嫌" : "xian", + "显" : "xian", + "险" : "xian", + "跣" : "xian", + "藓" : "xian", + "苋" : "xian", + "县" : "xian", + "现" : "xian", + "限" : "xian", + "线" : "xian", + "宪" : "xian", + "陷" : "xian", + "馅" : "xian", + "羡" : "xian", + "献" : "xian", + "腺" : "xian", + "乡" : "xiang", + "相" : "xiang", + "香" : "xiang", + "厢" : "xiang", + "湘" : "xiang", + "箱" : "xiang", + "襄" : "xiang", + "镶" : "xiang", + "详" : "xiang", + "祥" : "xiang", + "翔" : "xiang", + "享" : "xiang", + "响" : "xiang", + "饷" : "xiang", + "飨" : "xiang", + "想" : "xiang", + "向" : "xiang", + "项" : "xiang", + "象" : "xiang", + "像" : "xiang", + "橡" : "xiang", + "肖" : "xiao", + "枭" : "xiao", + "哓" : "xiao", + "骁" : "xiao", + "逍" : "xiao", + "消" : "xiao", + "宵" : "xiao", + "萧" : "xiao", + "硝" : "xiao", + "销" : "xiao", + "箫" : "xiao", + "潇" : "xiao", + "霄" : "xiao", + "魈" : "xiao", + "嚣" : "xiao", + "崤" : "xiao", + "淆" : "xiao", + "小" : "xiao", + "晓" : "xiao", + "孝" : "xiao", + "哮" : "xiao", + "笑" : "xiao", + "效" : "xiao", + "啸" : "xiao", + "挟" : "xie", + "些" : "xie", + "楔" : "xie", + "歇" : "xie", + "蝎" : "xie", + "协" : "xie", + "胁" : "xie", + "偕" : "xie", + "斜" : "xie", + "谐" : "xie", + "揳" : "xie", + "携" : "xie", + "撷" : "xie", + "鞋" : "xie", + "写" : "xie", + "泄" : "xie", + "泻" : "xie", + "卸" : "xie", + "屑" : "xie", + "械" : "xie", + "亵" : "xie", + "谢" : "xie", + "邂" : "xie", + "懈" : "xie", + "蟹" : "xie", + "心" : "xin", + "芯" : "xin", + "辛" : "xin", + "欣" : "xin", + "锌" : "xin", + "新" : "xin", + "歆" : "xin", + "薪" : "xin", + "馨" : "xin", + "鑫" : "xin", + "信" : "xin", + "衅" : "xin", + "星" : "xing", + "猩" : "xing", + "惺" : "xing", + "腥" : "xing", + "刑" : "xing", + "邢" : "xing", + "形" : "xing", + "型" : "xing", + "醒" : "xing", + "擤" : "xing", + "兴" : "xing", + "杏" : "xing", + "幸" : "xing", + "性" : "xing", + "姓" : "xing", + "悻" : "xing", + "凶" : "xiong", + "兄" : "xiong", + "匈" : "xiong", + "讻" : "xiong", + "汹" : "xiong", + "胸" : "xiong", + "雄" : "xiong", + "熊" : "xiong", + "休" : "xiu", + "咻" : "xiu", + "修" : "xiu", + "羞" : "xiu", + "朽" : "xiu", + "秀" : "xiu", + "袖" : "xiu", + "绣" : "xiu", + "锈" : "xiu", + "嗅" : "xiu", + "欻" : "xu", + "戌" : "xu", + "须" : "xu", + "胥" : "xu", + "虚" : "xu", + "墟" : "xu", + "需" : "xu", + "魆" : "xu", + "徐" : "xu", + "许" : "xu", + "诩" : "xu", + "栩" : "xu", + "旭" : "xu", + "序" : "xu", + "叙" : "xu", + "恤" : "xu", + "酗" : "xu", + "勖" : "xu", + "绪" : "xu", + "续" : "xu", + "絮" : "xu", + "婿" : "xu", + "蓄" : "xu", + "煦" : "xu", + "轩" : "xuan", + "宣" : "xuan", + "揎" : "xuan", + "喧" : "xuan", + "暄" : "xuan", + "玄" : "xuan", + "悬" : "xuan", + "旋" : "xuan", + "漩" : "xuan", + "璇" : "xuan", + "选" : "xuan", + "癣" : "xuan", + "炫" : "xuan", + "绚" : "xuan", + "眩" : "xuan", + "渲" : "xuan", + "靴" : "xue", + "薛" : "xue", + "穴" : "xue", + "学" : "xue", + "噱" : "xue", + "雪" : "xue", + "谑" : "xue", + "勋" : "xun", + "熏" : "xun", + "薰" : "xun", + "醺" : "xun", + "旬" : "xun", + "寻" : "xun", + "巡" : "xun", + "询" : "xun", + "荀" : "xun", + "循" : "xun", + "训" : "xun", + "讯" : "xun", + "汛" : "xun", + "迅" : "xun", + "驯" : "xun", + "徇" : "xun", + "逊" : "xun", + "殉" : "xun", + "巽" : "xun", + "丫" : "ya", + "压" : "ya", + "押" : "ya", + "鸦" : "ya", + "桠" : "ya", + "鸭" : "ya", + "牙" : "ya", + "伢" : "ya", + "芽" : "ya", + "蚜" : "ya", + "崖" : "ya", + "涯" : "ya", + "睚" : "ya", + "衙" : "ya", + "哑" : "ya", + "雅" : "ya", + "亚" : "ya", + "讶" : "ya", + "娅" : "ya", + "氩" : "ya", + "揠" : "ya", + "呀" : "ya", + "恹" : "yan", + "胭" : "yan", + "烟" : "yan", + "焉" : "yan", + "阉" : "yan", + "淹" : "yan", + "湮" : "yan", + "嫣" : "yan", + "延" : "yan", + "闫" : "yan", + "严" : "yan", + "言" : "yan", + "妍" : "yan", + "岩" : "yan", + "炎" : "yan", + "沿" : "yan", + "研" : "yan", + "盐" : "yan", + "阎" : "yan", + "蜒" : "yan", + "筵" : "yan", + "颜" : "yan", + "檐" : "yan", + "奄" : "yan", + "俨" : "yan", + "衍" : "yan", + "掩" : "yan", + "郾" : "yan", + "眼" : "yan", + "偃" : "yan", + "演" : "yan", + "魇" : "yan", + "鼹" : "yan", + "厌" : "yan", + "砚" : "yan", + "彦" : "yan", + "艳" : "yan", + "晏" : "yan", + "唁" : "yan", + "宴" : "yan", + "验" : "yan", + "谚" : "yan", + "堰" : "yan", + "雁" : "yan", + "焰" : "yan", + "滟" : "yan", + "餍" : "yan", + "燕" : "yan", + "赝" : "yan", + "央" : "yang", + "泱" : "yang", + "殃" : "yang", + "鸯" : "yang", + "秧" : "yang", + "扬" : "yang", + "羊" : "yang", + "阳" : "yang", + "杨" : "yang", + "佯" : "yang", + "疡" : "yang", + "徉" : "yang", + "洋" : "yang", + "仰" : "yang", + "养" : "yang", + "氧" : "yang", + "痒" : "yang", + "怏" : "yang", + "样" : "yang", + "恙" : "yang", + "烊" : "yang", + "漾" : "yang", + "幺" : "yao", + "夭" : "yao", + "吆" : "yao", + "妖" : "yao", + "腰" : "yao", + "邀" : "yao", + "爻" : "yao", + "尧" : "yao", + "肴" : "yao", + "姚" : "yao", + "窑" : "yao", + "谣" : "yao", + "摇" : "yao", + "徭" : "yao", + "遥" : "yao", + "瑶" : "yao", + "杳" : "yao", + "咬" : "yao", + "舀" : "yao", + "窈" : "yao", + "药" : "yao", + "要" : "yao", + "鹞" : "yao", + "耀" : "yao", + "耶" : "ye", + "掖" : "ye", + "椰" : "ye", + "噎" : "ye", + "爷" : "ye", + "揶" : "ye", + "也" : "ye", + "冶" : "ye", + "野" : "ye", + "业" : "ye", + "叶" : "ye", + "页" : "ye", + "曳" : "ye", + "夜" : "ye", + "液" : "ye", + "谒" : "ye", + "腋" : "ye", + "一" : "yi", + "伊" : "yi", + "衣" : "yi", + "医" : "yi", + "依" : "yi", + "咿" : "yi", + "揖" : "yi", + "壹" : "yi", + "漪" : "yi", + "噫" : "yi", + "仪" : "yi", + "夷" : "yi", + "饴" : "yi", + "宜" : "yi", + "咦" : "yi", + "贻" : "yi", + "姨" : "yi", + "胰" : "yi", + "移" : "yi", + "痍" : "yi", + "颐" : "yi", + "疑" : "yi", + "彝" : "yi", + "乙" : "yi", + "已" : "yi", + "以" : "yi", + "苡" : "yi", + "矣" : "yi", + "迤" : "yi", + "蚁" : "yi", + "倚" : "yi", + "椅" : "yi", + "旖" : "yi", + "乂" : "yi", + "亿" : "yi", + "义" : "yi", + "艺" : "yi", + "刈" : "yi", + "忆" : "yi", + "议" : "yi", + "屹" : "yi", + "亦" : "yi", + "异" : "yi", + "抑" : "yi", + "呓" : "yi", + "邑" : "yi", + "役" : "yi", + "译" : "yi", + "易" : "yi", + "诣" : "yi", + "绎" : "yi", + "驿" : "yi", + "轶" : "yi", + "弈" : "yi", + "奕" : "yi", + "疫" : "yi", + "羿" : "yi", + "益" : "yi", + "谊" : "yi", + "逸" : "yi", + "翌" : "yi", + "肄" : "yi", + "裔" : "yi", + "意" : "yi", + "溢" : "yi", + "缢" : "yi", + "毅" : "yi", + "薏" : "yi", + "翳" : "yi", + "臆" : "yi", + "翼" : "yi", + "因" : "yin", + "阴" : "yin", + "茵" : "yin", + "荫" : "yin", + "音" : "yin", + "姻" : "yin", + "铟" : "yin", + "喑" : "yin", + "愔" : "yin", + "吟" : "yin", + "垠" : "yin", + "银" : "yin", + "淫" : "yin", + "寅" : "yin", + "龈" : "yin", + "霪" : "yin", + "尹" : "yin", + "引" : "yin", + "蚓" : "yin", + "隐" : "yin", + "瘾" : "yin", + "印" : "yin", + "英" : "ying", + "莺" : "ying", + "婴" : "ying", + "嘤" : "ying", + "罂" : "ying", + "缨" : "ying", + "樱" : "ying", + "鹦" : "ying", + "膺" : "ying", + "鹰" : "ying", + "迎" : "ying", + "茔" : "ying", + "荧" : "ying", + "盈" : "ying", + "莹" : "ying", + "萤" : "ying", + "营" : "ying", + "萦" : "ying", + "楹" : "ying", + "蝇" : "ying", + "赢" : "ying", + "瀛" : "ying", + "颍" : "ying", + "颖" : "ying", + "影" : "ying", + "应" : "ying", + "映" : "ying", + "硬" : "ying", + "哟" : "yo", + "唷" : "yo", + "佣" : "yong", + "拥" : "yong", + "庸" : "yong", + "雍" : "yong", + "壅" : "yong", + "臃" : "yong", + "永" : "yong", + "甬" : "yong", + "咏" : "yong", + "泳" : "yong", + "勇" : "yong", + "涌" : "yong", + "恿" : "yong", + "蛹" : "yong", + "踊" : "yong", + "用" : "yong", + "优" : "you", + "攸" : "you", + "忧" : "you", + "呦" : "you", + "幽" : "you", + "悠" : "you", + "尤" : "you", + "由" : "you", + "邮" : "you", + "犹" : "you", + "油" : "you", + "铀" : "you", + "鱿" : "you", + "游" : "you", + "友" : "you", + "有" : "you", + "酉" : "you", + "莠" : "you", + "黝" : "you", + "又" : "you", + "右" : "you", + "幼" : "you", + "佑" : "you", + "柚" : "you", + "囿" : "you", + "诱" : "you", + "鼬" : "you", + "迂" : "yu", + "纡" : "yu", + "於" : "yu", + "淤" : "yu", + "瘀" : "yu", + "于" : "yu", + "余" : "yu", + "盂" : "yu", + "臾" : "yu", + "鱼" : "yu", + "竽" : "yu", + "俞" : "yu", + "狳" : "yu", + "谀" : "yu", + "娱" : "yu", + "渔" : "yu", + "隅" : "yu", + "揄" : "yu", + "逾" : "yu", + "腴" : "yu", + "渝" : "yu", + "愉" : "yu", + "瑜" : "yu", + "榆" : "yu", + "虞" : "yu", + "愚" : "yu", + "舆" : "yu", + "与" : "yu", + "予" : "yu", + "屿" : "yu", + "宇" : "yu", + "羽" : "yu", + "雨" : "yu", + "禹" : "yu", + "语" : "yu", + "圄" : "yu", + "玉" : "yu", + "驭" : "yu", + "芋" : "yu", + "妪" : "yu", + "郁" : "yu", + "育" : "yu", + "狱" : "yu", + "浴" : "yu", + "预" : "yu", + "域" : "yu", + "欲" : "yu", + "谕" : "yu", + "遇" : "yu", + "喻" : "yu", + "御" : "yu", + "寓" : "yu", + "裕" : "yu", + "愈" : "yu", + "誉" : "yu", + "豫" : "yu", + "鹬" : "yu", + "鸢" : "yuan", + "鸳" : "yuan", + "冤" : "yuan", + "渊" : "yuan", + "元" : "yuan", + "园" : "yuan", + "垣" : "yuan", + "袁" : "yuan", + "原" : "yuan", + "圆" : "yuan", + "援" : "yuan", + "媛" : "yuan", + "缘" : "yuan", + "猿" : "yuan", + "源" : "yuan", + "辕" : "yuan", + "远" : "yuan", + "苑" : "yuan", + "怨" : "yuan", + "院" : "yuan", + "愿" : "yuan", + "曰" : "yue", + "月" : "yue", + "岳" : "yue", + "钺" : "yue", + "阅" : "yue", + "悦" : "yue", + "跃" : "yue", + "越" : "yue", + "粤" : "yue", + "晕" : "yun", + "云" : "yun", + "匀" : "yun", + "芸" : "yun", + "纭" : "yun", + "耘" : "yun", + "允" : "yun", + "陨" : "yun", + "殒" : "yun", + "孕" : "yun", + "运" : "yun", + "酝" : "yun", + "愠" : "yun", + "韵" : "yun", + "蕴" : "yun", + "熨" : "yun", + "匝" : "za", + "咂" : "za", + "杂" : "za", + "砸" : "za", + "灾" : "zai", + "甾" : "zai", + "哉" : "zai", + "栽" : "zai", + "载" : "zai", + "宰" : "zai", + "崽" : "zai", + "再" : "zai", + "在" : "zai", + "糌" : "zan", + "簪" : "zan", + "咱" : "zan", + "趱" : "zan", + "暂" : "zan", + "錾" : "zan", + "赞" : "zan", + "赃" : "zang", + "脏" : "zang", + "臧" : "zang", + "驵" : "zang", + "葬" : "zang", + "遭" : "zao", + "糟" : "zao", + "凿" : "zao", + "早" : "zao", + "枣" : "zao", + "蚤" : "zao", + "澡" : "zao", + "藻" : "zao", + "皂" : "zao", + "灶" : "zao", + "造" : "zao", + "噪" : "zao", + "燥" : "zao", + "躁" : "zao", + "则" : "ze", + "责" : "ze", + "泽" : "ze", + "啧" : "ze", + "帻" : "ze", + "仄" : "ze", + "贼" : "zei", + "怎" : "zen", + "谮" : "zen", + "增" : "zeng", + "憎" : "zeng", + "锃" : "zeng", + "赠" : "zeng", + "甑" : "zeng", + "吒" : "zha", + "挓" : "zha", + "哳" : "zha", + "揸" : "zha", + "渣" : "zha", + "楂" : "zha", + "札" : "zha", + "闸" : "zha", + "铡" : "zha", + "眨" : "zha", + "砟" : "zha", + "乍" : "zha", + "诈" : "zha", + "咤" : "zha", + "炸" : "zha", + "蚱" : "zha", + "榨" : "zha", + "拃" : "zha", + "斋" : "zhai", + "摘" : "zhai", + "宅" : "zhai", + "窄" : "zhai", + "债" : "zhai", + "砦" : "zhai", + "寨" : "zhai", + "沾" : "zhan", + "毡" : "zhan", + "粘" : "zhan", + "詹" : "zhan", + "谵" : "zhan", + "瞻" : "zhan", + "斩" : "zhan", + "盏" : "zhan", + "展" : "zhan", + "崭" : "zhan", + "搌" : "zhan", + "辗" : "zhan", + "占" : "zhan", + "栈" : "zhan", + "战" : "zhan", + "站" : "zhan", + "绽" : "zhan", + "湛" : "zhan", + "蘸" : "zhan", + "张" : "zhang", + "章" : "zhang", + "獐" : "zhang", + "彰" : "zhang", + "樟" : "zhang", + "蟑" : "zhang", + "涨" : "zhang", + "掌" : "zhang", + "丈" : "zhang", + "仗" : "zhang", + "杖" : "zhang", + "帐" : "zhang", + "账" : "zhang", + "胀" : "zhang", + "障" : "zhang", + "嶂" : "zhang", + "瘴" : "zhang", + "钊" : "zhao", + "招" : "zhao", + "昭" : "zhao", + "找" : "zhao", + "沼" : "zhao", + "兆" : "zhao", + "诏" : "zhao", + "赵" : "zhao", + "照" : "zhao", + "罩" : "zhao", + "肇" : "zhao", + "蜇" : "zhe", + "遮" : "zhe", + "哲" : "zhe", + "辄" : "zhe", + "蛰" : "zhe", + "谪" : "zhe", + "辙" : "zhe", + "者" : "zhe", + "锗" : "zhe", + "赭" : "zhe", + "褶" : "zhe", + "浙" : "zhe", + "蔗" : "zhe", + "鹧" : "zhe", + "贞" : "zhen", + "针" : "zhen", + "侦" : "zhen", + "珍" : "zhen", + "帧" : "zhen", + "胗" : "zhen", + "真" : "zhen", + "砧" : "zhen", + "斟" : "zhen", + "甄" : "zhen", + "榛" : "zhen", + "箴" : "zhen", + "臻" : "zhen", + "诊" : "zhen", + "枕" : "zhen", + "疹" : "zhen", + "缜" : "zhen", + "阵" : "zhen", + "鸩" : "zhen", + "振" : "zhen", + "朕" : "zhen", + "赈" : "zhen", + "震" : "zhen", + "镇" : "zhen", + "争" : "zheng", + "征" : "zheng", + "怔" : "zheng", + "峥" : "zheng", + "狰" : "zheng", + "睁" : "zheng", + "铮" : "zheng", + "筝" : "zheng", + "蒸" : "zheng", + "拯" : "zheng", + "整" : "zheng", + "正" : "zheng", + "证" : "zheng", + "郑" : "zheng", + "诤" : "zheng", + "政" : "zheng", + "挣" : "zheng", + "症" : "zheng", + "之" : "zhi", + "支" : "zhi", + "只" : "zhi", + "汁" : "zhi", + "芝" : "zhi", + "吱" : "zhi", + "枝" : "zhi", + "知" : "zhi", + "肢" : "zhi", + "织" : "zhi", + "栀" : "zhi", + "脂" : "zhi", + "蜘" : "zhi", + "执" : "zhi", + "直" : "zhi", + "侄" : "zhi", + "值" : "zhi", + "职" : "zhi", + "植" : "zhi", + "跖" : "zhi", + "踯" : "zhi", + "止" : "zhi", + "旨" : "zhi", + "址" : "zhi", + "芷" : "zhi", + "纸" : "zhi", + "祉" : "zhi", + "指" : "zhi", + "枳" : "zhi", + "咫" : "zhi", + "趾" : "zhi", + "酯" : "zhi", + "至" : "zhi", + "志" : "zhi", + "豸" : "zhi", + "帜" : "zhi", + "制" : "zhi", + "质" : "zhi", + "炙" : "zhi", + "治" : "zhi", + "栉" : "zhi", + "峙" : "zhi", + "挚" : "zhi", + "桎" : "zhi", + "致" : "zhi", + "秩" : "zhi", + "掷" : "zhi", + "痔" : "zhi", + "窒" : "zhi", + "蛭" : "zhi", + "智" : "zhi", + "痣" : "zhi", + "滞" : "zhi", + "置" : "zhi", + "雉" : "zhi", + "稚" : "zhi", + "中" : "zhong", + "忠" : "zhong", + "终" : "zhong", + "盅" : "zhong", + "钟" : "zhong", + "衷" : "zhong", + "肿" : "zhong", + "冢" : "zhong", + "踵" : "zhong", + "仲" : "zhong", + "众" : "zhong", + "舟" : "zhou", + "州" : "zhou", + "诌" : "zhou", + "周" : "zhou", + "洲" : "zhou", + "粥" : "zhou", + "妯" : "zhou", + "轴" : "zhou", + "肘" : "zhou", + "纣" : "zhou", + "咒" : "zhou", + "宙" : "zhou", + "胄" : "zhou", + "昼" : "zhou", + "皱" : "zhou", + "骤" : "zhou", + "帚" : "zhou", + "朱" : "zhu", + "侏" : "zhu", + "诛" : "zhu", + "茱" : "zhu", + "珠" : "zhu", + "株" : "zhu", + "诸" : "zhu", + "铢" : "zhu", + "猪" : "zhu", + "蛛" : "zhu", + "竹" : "zhu", + "竺" : "zhu", + "逐" : "zhu", + "烛" : "zhu", + "躅" : "zhu", + "主" : "zhu", + "拄" : "zhu", + "煮" : "zhu", + "嘱" : "zhu", + "瞩" : "zhu", + "伫" : "zhu", + "苎" : "zhu", + "助" : "zhu", + "住" : "zhu", + "贮" : "zhu", + "注" : "zhu", + "驻" : "zhu", + "柱" : "zhu", + "祝" : "zhu", + "著" : "zhu", + "蛀" : "zhu", + "铸" : "zhu", + "筑" : "zhu", + "抓" : "zhua", + "跩" : "zhuai", + "拽" : "zhuai", + "专" : "zhuan", + "砖" : "zhuan", + "转" : "zhuan", + "啭" : "zhuan", + "撰" : "zhuan", + "篆" : "zhuan", + "妆" : "zhuang", + "庄" : "zhuang", + "桩" : "zhuang", + "装" : "zhuang", + "壮" : "zhuang", + "状" : "zhuang", + "撞" : "zhuang", + "幢" : "zhuang", + "追" : "zhui", + "骓" : "zhui", + "锥" : "zhui", + "坠" : "zhui", + "缀" : "zhui", + "惴" : "zhui", + "赘" : "zhui", + "谆" : "zhun", + "准" : "zhun", + "拙" : "zhuo", + "捉" : "zhuo", + "桌" : "zhuo", + "灼" : "zhuo", + "茁" : "zhuo", + "卓" : "zhuo", + "斫" : "zhuo", + "浊" : "zhuo", + "酌" : "zhuo", + "啄" : "zhuo", + "擢" : "zhuo", + "镯" : "zhuo", + "孜" : "zi", + "咨" : "zi", + "姿" : "zi", + "赀" : "zi", + "资" : "zi", + "辎" : "zi", + "嗞" : "zi", + "滋" : "zi", + "锱" : "zi", + "龇" : "zi", + "子" : "zi", + "姊" : "zi", + "秭" : "zi", + "籽" : "zi", + "梓" : "zi", + "紫" : "zi", + "訾" : "zi", + "滓" : "zi", + "自" : "zi", + "字" : "zi", + "恣" : "zi", + "眦" : "zi", + "渍" : "zi", + "宗" : "zong", + "综" : "zong", + "棕" : "zong", + "踪" : "zong", + "鬃" : "zong", + "总" : "zong", + "纵" : "zong", + "粽" : "zong", + "邹" : "zou", + "走" : "zou", + "奏" : "zou", + "揍" : "zou", + "租" : "zu", + "足" : "zu", + "卒" : "zu", + "族" : "zu", + "诅" : "zu", + "阻" : "zu", + "组" : "zu", + "俎" : "zu", + "祖" : "zu", + "纂" : "zuan", + "钻" : "zuan", + "攥" : "zuan", + "嘴" : "zui", + "最" : "zui", + "罪" : "zui", + "醉" : "zui", + "尊" : "zun", + "遵" : "zun", + "樽" : "zun", + "鳟" : "zun", + "昨" : "zuo", + "左" : "zuo", + "佐" : "zuo", + "作" : "zuo", + "坐" : "zuo", + "阼" : "zuo", + "怍" : "zuo", + "祚" : "zuo", + "唑" : "zuo", + "座" : "zuo", + "做" : "zuo", + "酢" : "zuo", + "斌" : "bin", + "曾" : "zeng", + "查" : "zha", + "査" : "zha", + "乘" : "cheng", + "传" : "chuan", + "丁" : "ding", + "行" : "xing", + "瑾" : "jin", + "婧" : "jing", + "恺" : "kai", + "阚" : "kan", + "奎" : "kui", + "乐" : "le", + "陆" : "lu", + "逯" : "lv", + "璐" : "lu", + "淼" : "miao", + "闵" : "min", + "娜" : "na", + "奇" : "qi", + "琦" : "qi", + "强" : "qiang", + "邱" : "qiu", + "芮" : "rui", + "莎" : "sha", + "盛" : "sheng", + "石" : "shi", + "祎" : "yi", + "殷" : "yin", + "瑛" : "ying", + "昱" : "yu", + "眃" : "yun", + "琢" : "zhuo", + "枰" : "ping", + "玟" : "min", + "珉" : "min", + "珣" : "xun", + "淇" : "qi", + "缈" : "miao", + "彧" : "yu", + "祺" : "qi", + "骞" : "qian", + "垚" : "yao", + "妸" : "e", + "烜" : "hui", + "祁" : "qi", + "傢" : "jia", + "珮" : "pei", + "濮" : "pu", + "屺" : "qi", + "珅" : "shen", + "缇" : "ti", + "霈" : "pei", + "晞" : "xi", + "璠" : "fan", + "骐" : "qi", + "姞" : "ji", + "偲" : "cai", + "齼" : "chu", + "宓" : "mi", + "朴" : "pu", + "萁" : "qi", + "颀" : "qi", + "阗" : "tian", + "湉" : "tian", + "翀" : "chong", + "岷" : "min", + "桤" : "qi", + "囯" : "guo", + "浛" : "han", + "勐" : "meng", + "苠" : "min", + "岍" : "qian", + "皞" : "hao", + "岐" : "qi", + "溥" : "pu", + "锘" : "muo", + "渼" : "mei", + "燊" : "shen", + "玚" : "chang", + "亓" : "qi", + "湋" : "wei", + "涴" : "wan", + "沤" : "ou", + "胖" : "pang", + "莆" : "pu", + "扦" : "qian", + "僳" : "su", + "坍" : "tan", + "锑" : "ti", + "嚏" : "ti", + "腆" : "tian", + "丿" : "pie", + "鼗" : "tao", + "芈" : "mi", + "匚" : "fang", + "刂" : "li", + "冂" : "tong", + "亻" : "dan", + "仳" : "pi", + "俜" : "ping", + "俳" : "pai", + "倜" : "ti", + "傥" : "tang", + "傩" : "nuo", + "佥" : "qian", + "勹" : "bao", + "亠" : "tou", + "廾" : "gong", + "匏" : "pao", + "扌" : "ti", + "拚" : "pin", + "掊" : "pou", + "搦" : "nuo", + "擗" : "pi", + "啕" : "tao", + "嗦" : "suo", + "嗍" : "suo", + "辔" : "pei", + "嘌" : "piao", + "嗾" : "sou", + "嘧" : "mi", + "帔" : "pei", + "帑" : "tang", + "彡" : "san", + "犭" : "fan", + "狍" : "pao", + "狲" : "sun", + "狻" : "jun", + "飧" : "sun", + "夂" : "zhi", + "饣" : "shi", + "庀" : "pi", + "忄" : "shu", + "愫" : "su", + "闼" : "ta", + "丬" : "jiang", + "氵" : "san", + "汔" : "qi", + "沔" : "mian", + "汨" : "mi", + "泮" : "pan", + "洮" : "tao", + "涑" : "su", + "淠" : "pi", + "湓" : "pen", + "溻" : "ta", + "溏" : "tang", + "濉" : "sui", + "宀" : "bao", + "搴" : "qian", + "辶" : "zou", + "逄" : "pang", + "逖" : "ti", + "遢" : "ta", + "邈" : "miao", + "邃" : "sui", + "彐" : "ji", + "屮" : "cao", + "娑" : "suo", + "嫖" : "piao", + "纟" : "jiao", + "缗" : "min", + "瑭" : "tang", + "杪" : "miao", + "桫" : "suo", + "榀" : "pin", + "榫" : "sun", + "槭" : "qi", + "甓" : "pi", + "攴" : "po", + "耆" : "qi", + "牝" : "pin", + "犏" : "pian", + "氆" : "pu", + "攵" : "fan", + "肽" : "tai", + "胼" : "pian", + "脒" : "mi", + "脬" : "pao", + "旆" : "pei", + "炱" : "tai", + "燧" : "sui", + "灬" : "biao", + "礻" : "shi", + "祧" : "tiao", + "忑" : "te", + "忐" : "tan", + "愍" : "min", + "肀" : "yu", + "碛" : "qi", + "眄" : "mian", + "眇" : "miao", + "眭" : "sui", + "睃" : "suo", + "瞍" : "sou", + "畋" : "tian", + "罴" : "pi", + "蠓" : "meng", + "蠛" : "mie", + "笸" : "po", + "筢" : "pa", + "衄" : "nv", + "艋" : "meng", + "敉" : "mi", + "糸" : "mi", + "綦" : "qi", + "醅" : "pei", + "醣" : "tang", + "趿" : "ta", + "觫" : "su", + "龆" : "tiao", + "鲆" : "ping", + "稣" : "su", + "鲐" : "tai", + "鲦" : "tiao", + "鳎" : "ta", + "髂" : "qia", + "縻" : "mi", + "裒" : "pou", + "冫" : "liang", + "冖" : "tu", + "讠" : "yan", + "谇" : "sui", + "谝" : "pian", + "谡" : "su", + "卩" : "dan", + "阝" : "zuo", + "陴" : "pi", + "邳" : "pi", + "郫" : "pi", + "郯" : "tan", + "廴" : "yin", + "凵" : "qian", + "圮" : "pi", + "堋" : "peng", + "鼙" : "pi", + "艹" : "cao", + "芑" : "qi", + "苤" : "pie", + "荪" : "sun", + "荽" : "sui", + "葜" : "qia", + "蒎" : "pai", + "蔌" : "su", + "蕲" : "qi", + "薮" : "sou", + "薹" : "tai", + "蘼" : "mi", + "钅" : "jin", + "钷" : "po", + "钽" : "tan", + "铍" : "pi", + "铴" : "tang", + "铽" : "te", + "锫" : "pei", + "锬" : "tan", + "锼" : "sou", + "镤" : "pu", + "镨" : "pu", + "皤" : "po", + "鹈" : "ti", + "鹋" : "miao", + "疒" : "bing", + "疱" : "pao", + "衤" : "yi", + "袢" : "pan", + "裼" : "ti", + "襻" : "pan", + "耥" : "tang", + "耦" : "ou", + "虍" : "hu", + "蛴" : "qi", + "蜞" : "qi", + "蜱" : "pi", + "螋" : "sou", + "螗" : "tang", + "螵" : "piao", + "蟛" : "peng" +} diff --git a/kirby/i18n/translations/bg.json b/kirby/i18n/translations/bg.json new file mode 100644 index 0000000..32a8d04 --- /dev/null +++ b/kirby/i18n/translations/bg.json @@ -0,0 +1,730 @@ +{ + "account.changeName": "Change your name", + "account.delete": "Delete your account", + "account.delete.confirm": "Do you really want to delete your account? You will be logged out immediately. Your account cannot be recovered.", + + "activate": "Activate", + "add": "\u0414\u043e\u0431\u0430\u0432\u0438", + "alpha": "Alpha", + "author": "Author", + "avatar": "Профилна снимка", + "back": "Назад", + "cancel": "\u041e\u0442\u043a\u0430\u0436\u0438", + "change": "\u041f\u0440\u043e\u043c\u0435\u043d\u0438", + "close": "\u0417\u0430\u0442\u0432\u043e\u0440\u0438", + "changes": "Changes", + "confirm": "Ок", + "collapse": "Collapse", + "collapse.all": "Collapse All", + "color": "Color", + "coordinates": "Coordinates", + "copy": "Копирай", + "copy.all": "Copy all", + "copy.success": "{count} copied!", + "create": "Създай", + "custom": "Custom", + + "date": "Дата", + "date.select": "Select a date", + + "day": "Day", + "days.fri": "\u041f\u0442", + "days.mon": "\u041f\u043d", + "days.sat": "\u0421\u0431", + "days.sun": "\u041d\u0434", + "days.thu": "\u0427\u0442", + "days.tue": "\u0412\u0442", + "days.wed": "\u0421\u0440", + + "debugging": "Debugging", + + "delete": "\u0418\u0437\u0442\u0440\u0438\u0439", + "delete.all": "Delete all", + + "dialog.fields.empty": "This dialog has no fields", + "dialog.files.empty": "No files to select", + "dialog.pages.empty": "No pages to select", + "dialog.text.empty": "This dialog does not define any text", + "dialog.users.empty": "No users to select", + + "dimensions": "Размери", + "disable": "Disable", + "disabled": "Disabled", + "discard": "\u041e\u0442\u043c\u0435\u043d\u0438", + + "drawer.fields.empty": "This drawer has no fields", + + "domain": "Domain", + "download": "Download", + "duplicate": "Duplicate", + + "edit": "\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0430\u0439", + + "email": "Email", + "email.placeholder": "mail@example.com", + + "enter": "Enter", + "entries": "Entries", + "entry": "Entry", + + "environment": "Environment", + + "error": "Error", + "error.access.code": "Invalid code", + "error.access.login": "Invalid login", + "error.access.panel": "Нямате права за достъп до панела", + "error.access.view": "You are not allowed to access this part of the panel", + + "error.avatar.create.fail": "Профилната снимка не може да се качи", + "error.avatar.delete.fail": "Профилната снимка не може да бъде изтрита", + "error.avatar.dimensions.invalid": "Моля запазете ширината и височината на профилната снимка под 3000 пиксела", + "error.avatar.mime.forbidden": "Профилната снимка трябва да бъде в JPEG или PNG формат", + + "error.blueprint.notFound": "Образецът \"{name}\" не може да бъде зареден", + + "error.blocks.max.plural": "You must not add more than {max} blocks", + "error.blocks.max.singular": "You must not add more than one block", + "error.blocks.min.plural": "You must add at least {min} blocks", + "error.blocks.min.singular": "You must add at least one block", + "error.blocks.validation": "There's an error on the \"{field}\" field in block {index} using the \"{fieldset}\" block type", + + "error.cache.type.invalid": "Invalid cache type \"{type}\"", + + "error.email.preset.notFound": "Email шаблонът \"{name}\" не може да бъде открит", + + "error.field.converter.invalid": "Невалиден конвертор \"{converter}\"", + "error.field.type.missing": "Field \"{ name }\": The field type \"{ type }\" does not exist", + + "error.file.changeName.empty": "The name must not be empty", + "error.file.changeName.permission": "Не можете да смените името на \"{filename}\"", + "error.file.changeTemplate.invalid": "The template for the file \"{id}\" cannot be changed to \"{template}\" (valid: \"{blueprints}\")", + "error.file.changeTemplate.permission": "You are not allowed to change the template for the file \"{id}\"", + + "error.file.duplicate": "Файл с име \"{filename}\" вече съществува", + "error.file.extension.forbidden": "Файловото разширение \"{extension}\" не е позволено", + "error.file.extension.invalid": "Invalid extension: {extension}", + "error.file.extension.missing": "Липсва файлово разширение за файла \"{filename}\"", + "error.file.maxheight": "The height of the image must not exceed {height} pixels", + "error.file.maxsize": "The file is too large", + "error.file.maxwidth": "The width of the image must not exceed {width} pixels", + "error.file.mime.differs": "Каченият файл трябва да бъде от същия mime тип \"{mime}\"", + "error.file.mime.forbidden": "The media type \"{mime}\" is not allowed", + "error.file.mime.invalid": "Invalid mime type: {mime}", + "error.file.mime.missing": "The media type for \"{filename}\" cannot be detected", + "error.file.minheight": "The height of the image must be at least {height} pixels", + "error.file.minsize": "The file is too small", + "error.file.minwidth": "The width of the image must be at least {width} pixels", + "error.file.name.unique": "The filename must be unique", + "error.file.name.missing": "Името на файла е задължително", + "error.file.notFound": "Файлът \"{filename}\" не може да бъде намерен", + "error.file.orientation": "The orientation of the image must be \"{orientation}\"", + "error.file.type.forbidden": "Не е позволен ъплоуда на файлове от тип {type}", + "error.file.type.invalid": "Invalid file type: {type}", + "error.file.undefined": "\u0424\u0430\u0439\u043b\u044a\u0442 \u043d\u0435 \u043c\u043e\u0436\u0435 \u0434\u0430 \u0431\u044a\u0434\u0435 \u043d\u0430\u043c\u0435\u0440\u0435\u043d", + + "error.form.incomplete": "Моля коригирайте всички грешки във формата...", + "error.form.notSaved": "Формата не може да бъде запазена", + + "error.language.code": "Please enter a valid code for the language", + "error.language.duplicate": "The language already exists", + "error.language.name": "Please enter a valid name for the language", + "error.language.notFound": "The language could not be found", + + "error.layout.validation.block": "There's an error on the \"{field}\" field in block {blockIndex} using the \"{fieldset}\" block type in layout {layoutIndex}", + "error.layout.validation.settings": "There's an error in layout {index} settings", + + "error.license.domain": "The domain for the license is missing", + "error.license.email": "Моля въведете валиден email адрес", + "error.license.format": "Please enter a valid license code", + "error.license.verification": "The license could not be verified", + + "error.login.totp.confirm.invalid": "Invalid code", + "error.login.totp.confirm.missing": "Please enter the current code", + + "error.object.validation": "There’s an error in the \"{label}\" field:\n{message}", + + "error.offline": "The Panel is currently offline", + + "error.page.changeSlug.permission": "Не можете да смените URL на \"{slug}\"", + "error.page.changeSlug.reserved": "The path of top-level pages must not start with \"{path}\"", + "error.page.changeStatus.incomplete": "Страницата съдържа грешки и не може да бъде публикувана", + "error.page.changeStatus.permission": "Статусът на страницата не може да бъде променен", + "error.page.changeStatus.toDraft.invalid": "Страницата \"{slug}\" не може да бъде променена в чернова", + "error.page.changeTemplate.invalid": "Темплейтът за страница \"{slug}\" не може да бъде променен", + "error.page.changeTemplate.permission": "Нямате права за да промените шаблона за \"{slug}\"", + "error.page.changeTitle.empty": "Заглавието е задължително", + "error.page.changeTitle.permission": "Не можете да промените заглавието на \"{slug}\"", + "error.page.create.permission": "Не можете да създадете \"{slug}\"", + "error.page.delete": "Страницата \"{slug}\" не може да бъде изтрита", + "error.page.delete.confirm": "Моля въведете името на страницата, за да потвърдите", + "error.page.delete.hasChildren": "Страницата има подстраници и не може да бъде изтрита", + "error.page.delete.permission": "Не можете да изтриете \"{slug}\"", + "error.page.draft.duplicate": "Вече съществува чернова с URL-добавка \"{slug}\"", + "error.page.duplicate": "Страница с URL-добавка \"{slug}\" вече съществува", + "error.page.duplicate.permission": "You are not allowed to duplicate \"{slug}\"", + "error.page.move.ancestor": "The page cannot be moved into itself", + "error.page.move.directory": "The page directory cannot be moved", + "error.page.move.duplicate": "A sub page with the URL appendix \"{slug}\" already exists", + "error.page.move.notFound": "The moved page could not be found", + "error.page.move.permission": "You are not allowed to move \"{slug}\"", + "error.page.move.template": "The \"{template}\" template is not accepted as a subpage of \"{parent}\"", + "error.page.notFound": "Страницата \"{slug}\" не може да бъде намерена", + "error.page.num.invalid": "Моля въведете валидно число за сортиране. Числата не трябва да са негативни.", + "error.page.slug.invalid": "Please enter a valid URL appendix", + "error.page.slug.maxlength": "Slug length must be less than \"{length}\" characters", + "error.page.sort.permission": "Страницата \"{slug}\" не може да бъде сортирана", + "error.page.status.invalid": "Моля изберете валиден статус на страницата", + "error.page.undefined": "\u0421\u0442\u0440\u0430\u043d\u0438\u0446\u0430\u0442\u0430 \u043d\u0435 \u043c\u043e\u0436\u0435 \u0434\u0430 \u0431\u044a\u0434\u0435 \u043d\u0430\u043c\u0435\u0440\u0435\u043d\u0430", + "error.page.update.permission": "Не можете да обновите \"{slug}\"", + + "error.section.files.max.plural": "Не можете да добавяте повече от {max} файлa в секция \"{section}\"", + "error.section.files.max.singular": "Не можете да добавяте повече от един файл в секция \"{section}\"", + "error.section.files.min.plural": "The \"{section}\" section requires at least {min} files", + "error.section.files.min.singular": "The \"{section}\" section requires at least one file", + + "error.section.pages.max.plural": "Не можете да добавяте повече от {max} страници в секция \"{section}\"", + "error.section.pages.max.singular": "Не можете да добавяте повече от една страница в секция \"{section}\"", + "error.section.pages.min.plural": "The \"{section}\" section requires at least {min} pages", + "error.section.pages.min.singular": "The \"{section}\" section requires at least one page", + + "error.section.notLoaded": "Секция \"{name}\" не може да бъде заредена", + "error.section.type.invalid": "Типът \"{type}\" на секция не е валиден", + + "error.site.changeTitle.empty": "Заглавието е задължително", + "error.site.changeTitle.permission": "Не може да променяте заглавието на сайта", + "error.site.update.permission": "Нямате права за да обновите сайта", + + "error.structure.validation": "There's an error on the \"{field}\" field in row {index}", + + "error.template.default.notFound": "Стандартният шаблон не съществува", + + "error.unexpected": "An unexpected error occurred! Enable debug mode for more info: https://getkirby.com/docs/reference/system/options/debug", + + "error.user.changeEmail.permission": "Нямате права да промените имейла на този потребител \"{name}\"", + "error.user.changeLanguage.permission": "Нямате права да промените езика за този потребител \"{name}\"", + "error.user.changeName.permission": "Нямате права да промените името на този потребител \"{name}\"", + "error.user.changePassword.permission": "Нямате права да промените паролата за този потребител \"{name}\"", + "error.user.changeRole.lastAdmin": "Ролята на последния администратор не може да бъде променена", + "error.user.changeRole.permission": "Нямате права да промените ролята на този потребител \"{name}\"", + "error.user.changeRole.toAdmin": "You are not allowed to promote someone to the admin role", + "error.user.create.permission": "Нямате права да създадете този потребител", + "error.user.delete": "\u041f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u044f\u0442 \u043d\u0435 \u043c\u043e\u0436\u0435 \u0434\u0430 \u0431\u044a\u0434\u0435 \u0438\u0437\u0442\u0440\u0438\u0442", + "error.user.delete.lastAdmin": "\u041d\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u0434\u0430 \u0438\u0437\u0442\u0440\u0438\u0435\u0442\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u044f \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440", + "error.user.delete.lastUser": "Последният потребител не може да бъде изтрит", + "error.user.delete.permission": "\u041d\u0435 \u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u0435\u043d\u043e \u0434\u0430 \u0438\u0437\u0442\u0440\u0438\u0432\u0430\u0442\u0435 \u0442\u043e\u0437\u0438 \u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b", + "error.user.duplicate": "Потребител с имейл \"{email}\" вече съществува", + "error.user.email.invalid": "Моля въведете валиден email адрес", + "error.user.language.invalid": "Моля въведете валиден език", + "error.user.notFound": "\u041f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u044f\u0442 \u043d\u0435 \u043c\u043e\u0436\u0435 \u0434\u0430 \u0431\u044a\u0434\u0435 \u043d\u0430\u043c\u0435\u0440\u0435\u043d.", + "error.user.password.excessive": "Please enter a valid password. Passwords must not be longer than 1000 characters.", + "error.user.password.invalid": "Моля въведете валидна парола. Тя трабва да съдържа поне 8 символа.", + "error.user.password.notSame": "\u041c\u043e\u043b\u044f, \u043f\u043e\u0442\u0432\u044a\u0440\u0434\u0435\u0442\u0435 \u043f\u0430\u0440\u043e\u043b\u0430\u0442\u0430", + "error.user.password.undefined": "Потребителят няма парола", + "error.user.password.wrong": "Wrong password", + "error.user.role.invalid": "Моля въведете валидна роля", + "error.user.undefined": "Потребителят не може да бъде намерен.", + "error.user.update.permission": "Нямате права да обновите този потребител \"{name}\"", + + "error.validation.accepted": "Моля потвърдете", + "error.validation.alpha": "Моля въвдете символи измежду a-z", + "error.validation.alphanum": "Моля въвдете символи измежду a-z или цифри 0-9", + "error.validation.anchor": "Please enter a correct link anchor", + "error.validation.between": "Моля въведете стойност между \"{min}\" и \"{max}\"", + "error.validation.boolean": "Моля потвърдете или откажете", + "error.validation.color": "Please enter a valid color in the {format} format", + "error.validation.contains": "Моля въведете стойност, която съдържа \"{needle}\"", + "error.validation.date": "Моля въведете валидна дата", + "error.validation.date.after": "Please enter a date after {date}", + "error.validation.date.before": "Please enter a date before {date}", + "error.validation.date.between": "Please enter a date between {min} and {max}", + "error.validation.denied": "Моля откажете", + "error.validation.different": "Стойността не трябва да е \"{other}\"", + "error.validation.email": "Моля въведете валиден email адрес", + "error.validation.endswith": "Стойността трябва да завършва с \"{end\"}", + "error.validation.filename": "Моля въведете валидно име на файла", + "error.validation.in": "Моля въведете едно от следните: ({in})", + "error.validation.integer": "Моля въведете валидно цяло число", + "error.validation.ip": "Моля въведете валиден IP адрес", + "error.validation.less": "Моля въведете стойност по-ниска от {max}", + "error.validation.linkType": "The link type is not allowed", + "error.validation.match": "Стойността не съвпада с очаквания модел", + "error.validation.max": "Please enter a value equal to or lower than {max}", + "error.validation.maxlength": "Моля въведете по-къса стойност. (макс. {max} символа)", + "error.validation.maxwords": "Моля въведете не повече от {max} дума(и)", + "error.validation.min": "Please enter a value equal to or greater than {min}", + "error.validation.minlength": "Моля въведете по-дълга стойност. (мин. {min} символа)", + "error.validation.minwords": "Моля въведете поне {min} дума(и).", + "error.validation.more": "Моля въведете стойност по-висока от {min}", + "error.validation.notcontains": "Моля въведете стойност, която не съдържа \"{needle}\"", + "error.validation.notin": "Моля не въвеждайте нито едно от следните: ({notIn})", + "error.validation.option": "Моля изберете валидна опция", + "error.validation.num": "Моля въведете валидно число", + "error.validation.required": "Моля въведете нещо", + "error.validation.same": "Моля въведете \"{other}\"", + "error.validation.size": "Размерът на стойността трябва да бъде \"{size}\"", + "error.validation.startswith": "Стойността трябва да започва с \"{start}\"", + "error.validation.tel": "Please enter an unformatted phone number", + "error.validation.time": "Моля въведете валидно време", + "error.validation.time.after": "Please enter a time after {time}", + "error.validation.time.before": "Please enter a time before {time}", + "error.validation.time.between": "Please enter a time between {min} and {max}", + "error.validation.uuid": "Please enter a valid UUID", + "error.validation.url": "Моля въведете валиден URL", + + "expand": "Expand", + "expand.all": "Expand All", + + "field.invalid": "The field is invalid", + "field.required": "The field is required", + "field.blocks.changeType": "Change type", + "field.blocks.code.name": "Код", + "field.blocks.code.language": "Език", + "field.blocks.code.placeholder": "Your code …", + "field.blocks.delete.confirm": "Do you really want to delete this block?", + "field.blocks.delete.confirm.all": "Do you really want to delete all blocks?", + "field.blocks.delete.confirm.selected": "Do you really want to delete the selected blocks?", + "field.blocks.empty": "No blocks yet", + "field.blocks.fieldsets.empty": "No fieldsets yet", + "field.blocks.fieldsets.label": "Please select a block type …", + "field.blocks.fieldsets.paste": "Press {{ shortcut }} to import layouts/blocks from your clipboard Only those allowed in the current field will get inserted.", + "field.blocks.gallery.name": "Gallery", + "field.blocks.gallery.images.empty": "No images yet", + "field.blocks.gallery.images.label": "Images", + "field.blocks.heading.level": "Level", + "field.blocks.heading.name": "Heading", + "field.blocks.heading.text": "Text", + "field.blocks.heading.placeholder": "Heading …", + "field.blocks.image.alt": "Alternative text", + "field.blocks.image.caption": "Caption", + "field.blocks.image.crop": "Crop", + "field.blocks.image.link": "Връзка", + "field.blocks.image.location": "Location", + "field.blocks.image.location.internal": "This website", + "field.blocks.image.location.external": "External source", + "field.blocks.image.name": "Изображение", + "field.blocks.image.placeholder": "Select an image", + "field.blocks.image.ratio": "Ratio", + "field.blocks.image.url": "Image URL", + "field.blocks.line.name": "Line", + "field.blocks.list.name": "List", + "field.blocks.markdown.name": "Markdown", + "field.blocks.markdown.label": "Text", + "field.blocks.markdown.placeholder": "Markdown …", + "field.blocks.quote.name": "Quote", + "field.blocks.quote.text.label": "Text", + "field.blocks.quote.text.placeholder": "Quote …", + "field.blocks.quote.citation.label": "Citation", + "field.blocks.quote.citation.placeholder": "by …", + "field.blocks.text.name": "Text", + "field.blocks.text.placeholder": "Text …", + "field.blocks.video.autoplay": "Autoplay", + "field.blocks.video.caption": "Caption", + "field.blocks.video.controls": "Controls", + "field.blocks.video.location": "Location", + "field.blocks.video.loop": "Loop", + "field.blocks.video.muted": "Muted", + "field.blocks.video.name": "Video", + "field.blocks.video.placeholder": "Enter a video URL", + "field.blocks.video.poster": "Poster", + "field.blocks.video.preload": "Preload", + "field.blocks.video.url.label": "Video-URL", + "field.blocks.video.url.placeholder": "https://youtube.com/?v=", + + "field.files.empty": "Все още не са избрани файлове", + + "field.layout.change": "Change layout", + "field.layout.delete": "Delete layout", + "field.layout.delete.confirm": "Do you really want to delete this layout?", + "field.layout.delete.confirm.all": "Do you really want to delete all layouts?", + "field.layout.empty": "No rows yet", + "field.layout.select": "Select a layout", + + "field.object.empty": "No information yet", + + "field.pages.empty": "Все още не са избрани страници", + + "field.structure.delete.confirm": "Сигурни ли сте, че искате да изтриете това вписване?", + "field.structure.delete.confirm.all": "Do you really want to delete all entries?", + "field.structure.empty": "Все още няма статии", + + "field.users.empty": "Все още не са избрани потребители", + + "fields.empty": "No fields yet", + + "file": "Файл", + "file.blueprint": "This file has no blueprint yet. You can define the setup in /site/blueprints/files/{blueprint}.yml", + "file.changeTemplate": "Промени шаблон", + "file.changeTemplate.notice": "Changing the file's template will remove content for fields that don't match in type. If the new template defines certain rules, e.g. image dimensions, those will also be applied irreversibly. Use with caution.", + "file.delete.confirm": "Сигурни ли сте, че искате да изтриете
{filename}?", + "file.focus.placeholder": "Set focal point", + "file.focus.reset": "Remove focal point", + "file.focus.title": "Focus", + "file.sort": "Change position", + + "files": "Файлове", + "files.empty": "Няма файлове", + + "filter": "Filter", + + "hide": "Hide", + "hour": "Hour", + "hue": "Hue", + "import": "Import", + "info": "Info", + "insert": "\u0412\u043c\u044a\u043a\u043d\u0438", + "insert.after": "Insert after", + "insert.before": "Insert before", + "install": "Инсталирай", + + "installation": "Инсталация", + "installation.completed": "The panel has been installed", + "installation.disabled": "The panel installer is disabled on public servers by default. Please run the installer on a local machine or enable it with the panel.install option.", + "installation.issues.accounts": "Папката /site/accounts не съществува или не позволява запис", + "installation.issues.content": "Папката /content и всички файлове в нея трябва да позволяват запис", + "installation.issues.curl": "Изисква се CURL разширението", + "installation.issues.headline": "Панелът не може да бъде инсталиран", + "installation.issues.mbstring": "Изисква се разширението MB String", + "installation.issues.media": "Папката /media не съществува или няма права за запис", + "installation.issues.php": "Бъдете сигурни, че използвате PHP 8+", + "installation.issues.sessions": "The /site/sessions folder does not exist or is not writable", + + "language": "\u0415\u0437\u0438\u043a", + "language.code": "Код", + "language.convert": "Направи по подразбиране", + "language.convert.confirm": "

Сигурни ли сте, че искате да зададете {name} за език по подразбиране? Действието не може да бъде отменено.

В случай, че в {name} има непреведено съдържание, то части от сайта ви могат да останат празни.

", + "language.create": "Добавете нов език", + "language.default": "Език по подразбиране", + "language.delete.confirm": "Сигурни ли сте, че искате да изтриете език {name}, включително всички негови преводи? Действието не може да бъде отменено!", + "language.deleted": "Езикът беше изтрит", + "language.direction": "Посока на четене", + "language.direction.ltr": "Отляво надясно", + "language.direction.rtl": "Отдясно наляво", + "language.locale": "PHP locale string", + "language.locale.warning": "You are using a custom locale set up. Please modify it in the language file in /site/languages", + "language.name": "Име", + "language.secondary": "Secondary language", + "language.settings": "Language settings", + "language.updated": "Езикът беше обновен", + "language.variables": "Language variables", + "language.variables.empty": "No translations yet", + + "language.variable.delete.confirm": "Do you really want to delete the variable for {key}?", + "language.variable.key": "Key", + "language.variable.notFound": "The variable could not be found", + "language.variable.value": "Value", + + "languages": "Езици", + "languages.default": "Език по подразбиране", + "languages.empty": "Все още няма добавени езици", + "languages.secondary": "Второстепенни езици", + "languages.secondary.empty": "Все още няма второстепенни езици", + + "license": "\u041b\u0438\u0446\u0435\u043d\u0437 \u0437\u0430 Kirby", + "license.activate": "Activate it now", + "license.activate.label": "Please activate your license", + "license.activate.domain": "Your license will be activated for {host}.", + "license.activate.local": "You are about to activate your Kirby license for your local domain {host}. If this site will be deployed to a public domain, please activate it there instead. If {host} is the domain you want to use your license for, please continue.", + "license.activated": "Activated", + "license.buy": "Купи лиценз", + "license.code": "Код", + "license.code.help": "You received your license code after the purchase via email. Please copy and paste it here.", + "license.code.label": "Please enter your license code", + "license.status.active.info": "Includes new major versions until {date}", + "license.status.active.label": "Valid license", + "license.status.demo.info": "This is a demo installation", + "license.status.demo.label": "Demo", + "license.status.inactive.info": "Renew license to update to new major versions", + "license.status.inactive.label": "No new major versions", + "license.status.legacy.bubble": "Ready to renew your license?", + "license.status.legacy.info": "Your license does not cover this version", + "license.status.legacy.label": "Please renew your license", + "license.status.missing.bubble": "Ready to launch your site?", + "license.status.missing.info": "No valid license", + "license.status.missing.label": "Please activate your license", + "license.manage": "Manage your licenses", + "license.purchased": "Purchased", + "license.success": "Thank you for supporting Kirby", + "license.unregistered.label": "Unregistered", + + "link": "\u0412\u0440\u044a\u0437\u043a\u0430", + "link.text": "Текстова връзка", + + "loading": "Зареждане", + + "lock.unsaved": "Unsaved changes", + "lock.unsaved.empty": "There are no more unsaved changes", + "lock.isLocked": "Unsaved changes by {email}", + "lock.unlock": "Unlock", + "lock.unlock.submit": "Unlock and overwrite unsaved changes by {email}", + "lock.isUnlocked": "Was unlocked by another user", + + "login": "Подписване", + "login.code.label.login": "Login code", + "login.code.label.password-reset": "Password reset code", + "login.code.placeholder.email": "000 000", + "login.code.placeholder.totp": "000000", + "login.code.text.email": "If your email address is registered, the requested code was sent via email.", + "login.code.text.totp": "Please enter the one‑time code from your authenticator app.", + "login.email.login.body": "Hi {user.nameOrEmail},\n\nYou recently requested a login code for the Panel of {site}.\nThe following login code will be valid for {timeout} minutes:\n\n{code}\n\nIf you did not request a login code, please ignore this email or contact your administrator if you have questions.\nFor security, please DO NOT forward this email.", + "login.email.login.subject": "Your login code", + "login.email.password-reset.body": "Hi {user.nameOrEmail},\n\nYou recently requested a password reset code for the Panel of {site}.\nThe following password reset code will be valid for {timeout} minutes:\n\n{code}\n\nIf you did not request a password reset code, please ignore this email or contact your administrator if you have questions.\nFor security, please DO NOT forward this email.", + "login.email.password-reset.subject": "Your password reset code", + "login.remember": "Keep me logged in", + "login.reset": "Reset password", + "login.toggleText.code.email": "Login via email", + "login.toggleText.code.email-password": "Login with password", + "login.toggleText.password-reset.email": "Forgot your password?", + "login.toggleText.password-reset.email-password": "← Back to login", + "login.totp.enable.option": "Set up one‑time codes", + "login.totp.enable.intro": "Authenticator apps can generate one‑time codes that are used as a second factor when signing into your account.", + "login.totp.enable.qr.label": "1. Scan this QR code", + "login.totp.enable.qr.help": "Unable to scan? Add the setup key {secret} manually to your authenticator app.", + "login.totp.enable.confirm.headline": "2. Confirm with generated code", + "login.totp.enable.confirm.text": "Your app generates a new one‑time code every 30 seconds. Enter the current code to complete the setup:", + "login.totp.enable.confirm.label": "Current code", + "login.totp.enable.confirm.help": "After this setup, we will ask you for a one‑time code every time you log in.", + "login.totp.enable.success": "One‑time codes enabled", + "login.totp.disable.option": "Disable one‑time codes", + "login.totp.disable.label": "Enter your password to disable one‑time codes", + "login.totp.disable.help": "In the future, a different second factor like a login code sent via email will be requested when you log in. You can always set up one‑time codes again later.", + "login.totp.disable.admin": "

This will disable one‑time codes for {user}.

In the future, a different second factor like a login code sent via email will be requested when they log in. {user} can set up one‑time codes again after their next login.

", + "login.totp.disable.success": "One‑time codes disabled", + + "logout": "Изход", + + "merge": "Merge", + "menu": "Меню", + "meridiem": "AM/PM", + "mime": "Media Type", + "minutes": "Minutes", + + "month": "Month", + "months.april": "\u0410\u043f\u0440\u0438\u043b", + "months.august": "\u0410\u0432\u0433\u0443\u0441\u0442", + "months.december": "\u0414\u0435\u043a\u0435\u043c\u0432\u0440\u0438", + "months.february": "Февруари", + "months.january": "\u042f\u043d\u0443\u0430\u0440\u0438", + "months.july": "\u042e\u043b\u0438", + "months.june": "\u042e\u043d\u0438", + "months.march": "\u041c\u0430\u0440\u0442", + "months.may": "\u041c\u0430\u0439", + "months.november": "\u041d\u043e\u0435\u043c\u0432\u0440\u0438", + "months.october": "\u041e\u043a\u0442\u043e\u043c\u0432\u0440\u0438", + "months.september": "\u0421\u0435\u043f\u0442\u0435\u043c\u0432\u0440\u0438", + + "more": "Още", + "move": "Move", + "name": "Име", + "next": "Next", + "night": "Night", + "no": "no", + "off": "off", + "on": "on", + "open": "Отвори", + "open.newWindow": "Open in new window", + "option": "Option", + "options": "Options", + "options.none": "No options", + "options.all": "Show all {count} options", + + "orientation": "Ориентация", + "orientation.landscape": "Пейзаж", + "orientation.portrait": "Портрет", + "orientation.square": "Квадрат", + + "page": "Страница", + "page.blueprint": "This page has no blueprint yet. You can define the setup in /site/blueprints/pages/{blueprint}.yml", + "page.changeSlug": "\u041f\u0440\u043e\u043c\u0435\u043d\u0438 URL", + "page.changeSlug.fromTitle": "\u0421\u044a\u0437\u0434\u0430\u0439\u0442\u0435 \u043e\u0442 \u0437\u0430\u0433\u043b\u0430\u0432\u0438\u0435\u0442\u043e", + "page.changeStatus": "Промени статус", + "page.changeStatus.position": "Моля изберете позиция", + "page.changeStatus.select": "Изберете нов статус", + "page.changeTemplate": "Промени шаблон", + "page.changeTemplate.notice": "Changing the page's template will remove content for fields that don't match in type. Use with caution.", + "page.create": "Create as {status}", + "page.delete.confirm": "Сигурни ли сте, че искате да изтриете {title}?", + "page.delete.confirm.subpages": "Тази страница има подстраници.
Всички подстраници също ще бъдат изтрити.", + "page.delete.confirm.title": "Въведи заглавие на страница за да потвърдиш", + "page.duplicate.appendix": "Копирай", + "page.duplicate.files": "Copy files", + "page.duplicate.pages": "Copy pages", + "page.move": "Move page", + "page.sort": "Change position", + "page.status": "Status", + "page.status.draft": "Чернова", + "page.status.draft.description": "The page is in draft mode and only visible for logged in editors or via secret link", + "page.status.listed": "Публично", + "page.status.listed.description": "Страницата е публична за всички", + "page.status.unlisted": "Скрит", + "page.status.unlisted.description": "Страницата е достъпна само чрез URL", + + "pages": "Страници", + "pages.empty": "Все още няма страници", + "pages.status.draft": "Drafts", + "pages.status.listed": "Published", + "pages.status.unlisted": "Скрит", + + "pagination.page": "Страница", + + "password": "\u041f\u0430\u0440\u043e\u043b\u0430", + "paste": "Paste", + "paste.after": "Paste after", + "paste.success": "{count} pasted!", + "pixel": "Пиксел", + "plugin": "Plugin", + "plugins": "Plugins", + "prev": "Previous", + "preview": "Preview", + "remove": "Премахни", + "rename": "Преименувай", + "renew": "Renew", + "replace": "\u0417\u0430\u043c\u0435\u0441\u0442\u0438", + "replace.with": "Replace with", + "retry": "\u041e\u043f\u0438\u0442\u0430\u0439 \u043f\u0430\u043a", + "revert": "\u041e\u0442\u043c\u0435\u043d\u0438", + "revert.confirm": "Do you really want to delete all unsaved changes?", + + "role": "\u0420\u043e\u043b\u044f", + "role.admin.description": "The admin has all rights", + "role.admin.title": "Admin", + "role.all": "Всички", + "role.empty": "Не съществуват потребители с тази роля", + "role.description.placeholder": "Липсва описание", + "role.nobody.description": "This is a fallback role without any permissions", + "role.nobody.title": "Nobody", + + "save": "\u0417\u0430\u043f\u0438\u0448\u0438", + "search": "Търси", + "search.min": "Enter {min} characters to search", + "search.all": "Show all {count} results", + "search.results.none": "No results", + + "section.invalid": "The section is invalid", + "section.required": "The section is required", + + "security": "Security", + "select": "Избери", + "server": "Server", + "settings": "Настройки", + "show": "Show", + "site.blueprint": "The site has no blueprint yet. You can define the setup in /site/blueprints/site.yml", + "size": "Размер", + "slug": "URL-\u0434\u043e\u0431\u0430\u0432\u043a\u0430", + "sort": "Сортирай", + "sort.drag": "Drag to sort …", + "split": "Split", + + "stats.empty": "No reports", + "status": "Status", + + "system.info.copy": "Copy info", + "system.info.copied": "System info copied", + "system.issues.content": "The content folder seems to be exposed", + "system.issues.eol.kirby": "Your installed Kirby version has reached end-of-life and will not receive further security updates", + "system.issues.eol.plugin": "Your installed version of the { plugin } plugin is has reached end-of-life and will not receive further security updates", + "system.issues.eol.php": "Your installed PHP release { release } has reached end-of-life and will not receive further security updates", + "system.issues.debug": "Debugging must be turned off in production", + "system.issues.git": "The .git folder seems to be exposed", + "system.issues.https": "We recommend HTTPS for all your sites", + "system.issues.kirby": "The kirby folder seems to be exposed", + "system.issues.site": "The site folder seems to be exposed", + "system.issues.vulnerability.kirby": "Your installation might be affected by the following vulnerability ({ severity } severity): { description }", + "system.issues.vulnerability.plugin": "Your installation might be affected by the following vulnerability in the { plugin } plugin ({ severity } severity): { description }", + "system.updateStatus": "Update status", + "system.updateStatus.error": "Could not check for updates", + "system.updateStatus.not-vulnerable": "No known vulnerabilities", + "system.updateStatus.security-update": "Free security update { version } available", + "system.updateStatus.security-upgrade": "Upgrade { version } with security fixes available", + "system.updateStatus.unreleased": "Unreleased version", + "system.updateStatus.up-to-date": "Up to date", + "system.updateStatus.update": "Free update { version } available", + "system.updateStatus.upgrade": "Upgrade { version } available", + + "tel": "Phone", + "tel.placeholder": "+49123456789", + "template": "Образец", + "title": "Заглавие", + "today": "Днес", + + "toolbar.button.clear": "Clear formatting", + "toolbar.button.code": "Код", + "toolbar.button.bold": "\u041f\u043e\u043b\u0443\u0447\u0435\u0440 \u0448\u0440\u0438\u0444\u0442", + "toolbar.button.email": "Email", + "toolbar.button.headings": "Заглавия", + "toolbar.button.heading.1": "Заглавие 1", + "toolbar.button.heading.2": "Заглавие 2", + "toolbar.button.heading.3": "Заглавие 3", + "toolbar.button.heading.4": "Heading 4", + "toolbar.button.heading.5": "Heading 5", + "toolbar.button.heading.6": "Heading 6", + "toolbar.button.italic": "\u041d\u0430\u043a\u043b\u043e\u043d\u0435\u043d \u0448\u0440\u0438\u0444\u0442", + "toolbar.button.file": "Файл", + "toolbar.button.file.select": "Select a file", + "toolbar.button.file.upload": "Upload a file", + "toolbar.button.link": "\u0412\u0440\u044a\u0437\u043a\u0430", + "toolbar.button.paragraph": "Paragraph", + "toolbar.button.strike": "Strike-through", + "toolbar.button.sub": "Subscript", + "toolbar.button.sup": "Superscript", + "toolbar.button.ol": "Подреден списък", + "toolbar.button.underline": "Underline", + "toolbar.button.ul": "Списък", + + "translation.author": "Kirby екип", + "translation.direction": "ltr", + "translation.name": "Български", + "translation.locale": "bg_BG", + + "type": "Type", + + "upload": "Прикачи", + "upload.error.cantMove": "The uploaded file could not be moved", + "upload.error.cantWrite": "Failed to write file to disk", + "upload.error.default": "The file could not be uploaded", + "upload.error.extension": "File upload stopped by extension", + "upload.error.formSize": "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the form", + "upload.error.iniPostSize": "The uploaded file exceeds the post_max_size directive in php.ini", + "upload.error.iniSize": "The uploaded file exceeds the upload_max_filesize directive in php.ini", + "upload.error.noFile": "No file was uploaded", + "upload.error.noFiles": "No files were uploaded", + "upload.error.partial": "The uploaded file was only partially uploaded", + "upload.error.tmpDir": "Missing a temporary folder", + "upload.errors": "Грешка", + "upload.progress": "Uploading…", + + "url": "Url", + "url.placeholder": "https://example.com", + + "user": "Потребител", + "user.blueprint": "You can define additional sections and form fields for this user role in /site/blueprints/users/{blueprint}.yml", + "user.changeEmail": "Промени email", + "user.changeLanguage": "Промени език", + "user.changeName": "Преименувай този потребител", + "user.changePassword": "Промени парола", + "user.changePassword.new": "Нова парола", + "user.changePassword.new.confirm": "Потвърдете новата парола...", + "user.changeRole": "Променете роля", + "user.changeRole.select": "Изберете нова роля", + "user.create": "Добавете нов потребител", + "user.delete": "Изтрийте потребителя", + "user.delete.confirm": "Сигурни ли сте, че искате да изтриете
{email}?", + + "users": "Потребители", + + "version": "\u0412\u0435\u0440\u0441\u0438\u044f \u043d\u0430 Kirby", + "version.current": "Current version", + "version.latest": "Latest version", + "versionInformation": "Version information", + + "view.account": "\u0412\u0430\u0448\u0438\u044f \u0430\u043a\u0430\u0443\u043d\u0442", + "view.installation": "\u0418\u043d\u0441\u0442\u0430\u043b\u0430\u0446\u0438\u044f", + "view.languages": "Езици", + "view.resetPassword": "Reset password", + "view.site": "Сайт", + "view.system": "System", + "view.users": "\u041f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u0438", + + "welcome": "Добре дошли", + "year": "Year", + "yes": "yes" +} diff --git a/kirby/i18n/translations/ca.json b/kirby/i18n/translations/ca.json new file mode 100644 index 0000000..7048d1b --- /dev/null +++ b/kirby/i18n/translations/ca.json @@ -0,0 +1,730 @@ +{ + "account.changeName": "Change your name", + "account.delete": "Delete your account", + "account.delete.confirm": "Do you really want to delete your account? You will be logged out immediately. Your account cannot be recovered.", + + "activate": "Activate", + "add": "Afegir", + "alpha": "Alpha", + "author": "Author", + "avatar": "Imatge del perfil", + "back": "Tornar", + "cancel": "Cancel\u00b7lar", + "change": "Canviar", + "close": "Tancar", + "changes": "Changes", + "confirm": "Ok", + "collapse": "Col·lapsar", + "collapse.all": "Col·lapsar tot", + "color": "Color", + "coordinates": "Coordinates", + "copy": "Copiar", + "copy.all": "Copy all", + "copy.success": "{count} copied!", + "create": "Crear", + "custom": "Custom", + + "date": "Data", + "date.select": "Selecciona una data", + + "day": "Dia", + "days.fri": "dv.", + "days.mon": "dl.", + "days.sat": "ds.", + "days.sun": "dg.", + "days.thu": "dj.", + "days.tue": "dt.", + "days.wed": "dc.", + + "debugging": "Debugging", + + "delete": "Eliminar", + "delete.all": "Eliminar tot", + + "dialog.fields.empty": "This dialog has no fields", + "dialog.files.empty": "No hi ha cap fitxer per seleccionar", + "dialog.pages.empty": "No hi ha cap pàgina per seleccionar", + "dialog.text.empty": "This dialog does not define any text", + "dialog.users.empty": "No hi ha cap usuari per seleccionar", + + "dimensions": "Dimensions", + "disable": "Disable", + "disabled": "Desactivat", + "discard": "Descartar", + + "drawer.fields.empty": "This drawer has no fields", + + "domain": "Domain", + "download": "Descarregar", + "duplicate": "Duplicar", + + "edit": "Editar", + + "email": "Email", + "email.placeholder": "mail@exemple.com", + + "enter": "Enter", + "entries": "Entries", + "entry": "Entry", + + "environment": "Environment", + + "error": "Error", + "error.access.code": "Codi invàlid", + "error.access.login": "Inici de sessió no vàlid", + "error.access.panel": "No tens permís per accedir al panell", + "error.access.view": "No tens accés a aquesta part del tauler", + + "error.avatar.create.fail": "No s'ha pogut carregar la imatge del perfil", + "error.avatar.delete.fail": "La imatge del perfil no s'ha pogut eliminar", + "error.avatar.dimensions.invalid": "Mantingueu l'amplada i l'alçada de la imatge de perfil de menys de 3000 píxels", + "error.avatar.mime.forbidden": "La imatge del perfil ha de ser fitxers JPEG o PNG", + + "error.blueprint.notFound": "No s'ha potgut carregar el blueprint \"{name}\"", + + "error.blocks.max.plural": "You must not add more than {max} blocks", + "error.blocks.max.singular": "You must not add more than one block", + "error.blocks.min.plural": "You must add at least {min} blocks", + "error.blocks.min.singular": "You must add at least one block", + "error.blocks.validation": "There's an error on the \"{field}\" field in block {index} using the \"{fieldset}\" block type", + + "error.cache.type.invalid": "Invalid cache type \"{type}\"", + + "error.email.preset.notFound": "No es pot trobar la configuració de correu electrònic \"{name}\"", + + "error.field.converter.invalid": "Convertidor no vàlid \"{converter}\"", + "error.field.type.missing": "Field \"{ name }\": The field type \"{ type }\" does not exist", + + "error.file.changeName.empty": "El nom no pot estar buit", + "error.file.changeName.permission": "No tens permís per canviar el nom de \"{filename}\"", + "error.file.changeTemplate.invalid": "The template for the file \"{id}\" cannot be changed to \"{template}\" (valid: \"{blueprints}\")", + "error.file.changeTemplate.permission": "You are not allowed to change the template for the file \"{id}\"", + + "error.file.duplicate": "Ja existeix un fitxer amb el nom \"{filename}\"", + "error.file.extension.forbidden": "L'extensió de l'arxiu \"{extension}\" no està permesa", + "error.file.extension.invalid": "Invalid extension: {extension}", + "error.file.extension.missing": "Falta l'extensió de l'arxiu \"{filename}\"", + "error.file.maxheight": "L'alçada de la imatge no ha de ser superior a {height} píxels", + "error.file.maxsize": "El fitxer és massa gran", + "error.file.maxwidth": "L'amplada de la imatge no ha de ser superior a {width} píxels", + "error.file.mime.differs": "L'arxiu carregat ha ha de ser del mateix tipus de mime \"{mime}\"", + "error.file.mime.forbidden": "El tipus de mitjà \"{mime}\" no està permès", + "error.file.mime.invalid": "Mime type no vàlid: {mime}", + "error.file.mime.missing": "El tipus de suport per a \"{filename}\" no es pot detectar", + "error.file.minheight": "L'alçada de la imatge ha de ser com a mínim de {height} píxels", + "error.file.minsize": "El fitxer és massa petit", + "error.file.minwidth": "L'amplada de la imatge ha de ser com a mínim de {width} píxels", + "error.file.name.unique": "The filename must be unique", + "error.file.name.missing": "El nom del fitxer no pot estar buit", + "error.file.notFound": "L'arxiu \"{filename}\" no s'ha trobat", + "error.file.orientation": "L’orientació de la imatge ha de ser \"{orientation}\"", + "error.file.type.forbidden": "No tens permís per penjar fitxers {type}", + "error.file.type.invalid": "Invalid file type: {type}", + "error.file.undefined": "L'arxiu no s'ha trobat", + + "error.form.incomplete": "Si us plau, corregeix els errors del formulari ...", + "error.form.notSaved": "No s'ha pogut desar el formulari", + + "error.language.code": "Introdueix un codi vàlid per a l’idioma", + "error.language.duplicate": "L'idioma ja existeix", + "error.language.name": "Introdueix un nom vàlid per a l'idioma", + "error.language.notFound": "The language could not be found", + + "error.layout.validation.block": "There's an error on the \"{field}\" field in block {blockIndex} using the \"{fieldset}\" block type in layout {layoutIndex}", + "error.layout.validation.settings": "There's an error in layout {index} settings", + + "error.license.domain": "The domain for the license is missing", + "error.license.email": "Si us plau, introdueix una adreça de correu electrònic vàlida", + "error.license.format": "Please enter a valid license code", + "error.license.verification": "No s’ha pogut verificar la llicència", + + "error.login.totp.confirm.invalid": "Codi invàlid", + "error.login.totp.confirm.missing": "Please enter the current code", + + "error.object.validation": "There’s an error in the \"{label}\" field:\n{message}", + + "error.offline": "The Panel is currently offline", + + "error.page.changeSlug.permission": "No teniu permís per canviar l'apèndix d'URL per a \"{slug}\"", + "error.page.changeSlug.reserved": "The path of top-level pages must not start with \"{path}\"", + "error.page.changeStatus.incomplete": "La pàgina té errors i no es pot publicar", + "error.page.changeStatus.permission": "No es pot canviar l'estat d'aquesta pàgina", + "error.page.changeStatus.toDraft.invalid": "La pàgina \"{slug}\" no es pot convertir en un esborrany", + "error.page.changeTemplate.invalid": "La plantilla per a la pàgina \"{slug}\" no es pot canviar", + "error.page.changeTemplate.permission": "No tens permís per canviar la plantilla per \"{slug}\"", + "error.page.changeTitle.empty": "El títol no pot estar buit", + "error.page.changeTitle.permission": "No tens permís per canviar el títol de \"{slug}\"", + "error.page.create.permission": "No tens permís per crear \"{slug}\"", + "error.page.delete": "La pàgina \"{slug}\" no es pot esborrar", + "error.page.delete.confirm": "Si us plau, introdueix el títol de la pàgina per confirmar", + "error.page.delete.hasChildren": "La pàgina té subpàgines i no es pot esborrar", + "error.page.delete.permission": "No tens permís per esborrar \"{slug}\"", + "error.page.draft.duplicate": "Ja existeix un esborrany de pàgina amb l'apèndix d'URL \"{slug}\"", + "error.page.duplicate": "Ja existeix una pàgina amb l'apèndix d'URL \"{slug}\"", + "error.page.duplicate.permission": "No tens permís per duplicar \"{slug}\"", + "error.page.move.ancestor": "The page cannot be moved into itself", + "error.page.move.directory": "The page directory cannot be moved", + "error.page.move.duplicate": "A sub page with the URL appendix \"{slug}\" already exists", + "error.page.move.notFound": "The moved page could not be found", + "error.page.move.permission": "You are not allowed to move \"{slug}\"", + "error.page.move.template": "The \"{template}\" template is not accepted as a subpage of \"{parent}\"", + "error.page.notFound": "La pàgina \"{slug}\" no s'ha trobat", + "error.page.num.invalid": "Si us plau, introdueix un número d 'ordenació vàlid. Els números no poden ser negatius.", + "error.page.slug.invalid": "Please enter a valid URL appendix", + "error.page.slug.maxlength": "La longitud del nom ha de tenir menys de caràcters \"{length}\"", + "error.page.sort.permission": "La pàgina \"{slug}\" no es pot ordenar", + "error.page.status.invalid": "Si us plau, estableix un estat de pàgina vàlid", + "error.page.undefined": "La p\u00e0gina no s'ha trobat", + "error.page.update.permission": "No tens permís per actualitzar \"{slug}\"", + + "error.section.files.max.plural": "No has d'afegir més de {max} fitxers a la secció \"{section}\"", + "error.section.files.max.singular": "No podeu afegir més d'un fitxer a la secció \"{section}\"", + "error.section.files.min.plural": "La secció \"{section}\" requereix almenys {min} fitxer", + "error.section.files.min.singular": "La secció \"{section}\" requereix almenys un fitxer", + + "error.section.pages.max.plural": "No heu d'afegir més de {max} pàgines a la secció \"{section}\"", + "error.section.pages.max.singular": "No podeu afegir més d'una pàgina a la secció \"{section}\"", + "error.section.pages.min.plural": "La secció \"{section}\" requereix almenys {min} pàgines", + "error.section.pages.min.singular": "La secció \"{section}\" requereix almenys una pàgina", + + "error.section.notLoaded": "No s'ha pogut carregar la secció \"{name}\"", + "error.section.type.invalid": "La secció tipus \"{type}\" no és vàlida", + + "error.site.changeTitle.empty": "El títol no pot estar buit", + "error.site.changeTitle.permission": "No tens permís per canviar el títol del lloc web", + "error.site.update.permission": "No tens permís per actualitzar el lloc web", + + "error.structure.validation": "There's an error on the \"{field}\" field in row {index}", + + "error.template.default.notFound": "La plantilla predeterminada no existeix", + + "error.unexpected": "An unexpected error occurred! Enable debug mode for more info: https://getkirby.com/docs/reference/system/options/debug", + + "error.user.changeEmail.permission": "No tens permís per canviar el correu electrònic per a l'usuari \"{name}\"", + "error.user.changeLanguage.permission": "No tens permís per canviar l'idioma de l'usuari \"{name}\"", + "error.user.changeName.permission": "No tens permís per canviar el nom de l'usuari \"{name}\"", + "error.user.changePassword.permission": "No tens permís per canviar la contrasenya de l'usuari \"{name}\"", + "error.user.changeRole.lastAdmin": "El rol del darrer administrador no es pot canviar", + "error.user.changeRole.permission": "No tens permís per canviar el rol de l'usuari \"{name}\"", + "error.user.changeRole.toAdmin": "No tens permís per promocionar algú al rol d’administrador", + "error.user.create.permission": "No tens permís per crear aquest usuari", + "error.user.delete": "L'usuari \"{name}\" no es pot eliminar", + "error.user.delete.lastAdmin": "No es pot eliminar l'\u00faltim administrador", + "error.user.delete.lastUser": "El darrer usuari no es pot eliminar", + "error.user.delete.permission": "No pots eliminar l'usuari \"{name}\"", + "error.user.duplicate": "Ja existeix un usuari amb l'adreça electrònica \"{email}\"", + "error.user.email.invalid": "Si us plau, introdueix una adreça de correu electrònic vàlida", + "error.user.language.invalid": "Introduïu un idioma vàlid", + "error.user.notFound": "L'usuari \"{name}\" no s'ha trobat", + "error.user.password.excessive": "Please enter a valid password. Passwords must not be longer than 1000 characters.", + "error.user.password.invalid": "Introduïu una contrasenya vàlida. Les contrasenyes han de tenir com a mínim 8 caràcters.", + "error.user.password.notSame": "Les contrasenyes no coincideixen", + "error.user.password.undefined": "L'usuari no té una contrasenya", + "error.user.password.wrong": "Wrong password", + "error.user.role.invalid": "Si us plau, introdueix un rol vàlid", + "error.user.undefined": "L'usuari no s'ha trobat", + "error.user.update.permission": "No tens permís per actualitzar l'usuari \"{name}\"", + + "error.validation.accepted": "Si us plau confirma", + "error.validation.alpha": "Si us plau, introdueix únicament caràcters entre a-z", + "error.validation.alphanum": "Si us plau, introdueix únicament caràcters entre a-z o números de 0-9", + "error.validation.anchor": "Please enter a correct link anchor", + "error.validation.between": "Introdueix un valor entre \"{min}\" i \"{max}\"", + "error.validation.boolean": "Si us plau confirma o denega", + "error.validation.color": "Please enter a valid color in the {format} format", + "error.validation.contains": "Si us plau, introduïu un valor que contingui \"{needle}\"", + "error.validation.date": "Si us plau, introdueix una data vàlida", + "error.validation.date.after": "Introdueix una data posterior {date}", + "error.validation.date.before": "Introdueix una data anterior {date}", + "error.validation.date.between": "Introdueix una data entre {min} i {max}", + "error.validation.denied": "Si us plau, denegui", + "error.validation.different": "El valor no ha de ser \"{other}\"", + "error.validation.email": "Si us plau, introdueix una adreça de correu electrònic vàlida", + "error.validation.endswith": "El valor ha de finalitzar amb \"{end}\"", + "error.validation.filename": "Si us plau, introdueix un nom de fitxer vàlid", + "error.validation.in": "Si us plau, introduïu una de les opcions següents: ({in})", + "error.validation.integer": "Si us plau, introduïu un nombre enter vàlid", + "error.validation.ip": "Si us plau, introduïu una adreça IP vàlida", + "error.validation.less": "Si us plau, introduïu un valor inferior a {max}", + "error.validation.linkType": "The link type is not allowed", + "error.validation.match": "El valor no coincideix amb el patró esperat", + "error.validation.max": "Si us plau, introduïu un valor igual o inferior a {max}", + "error.validation.maxlength": "Si us plau, introduïu un valor més curt. (màxim {max} caràcters)", + "error.validation.maxwords": "Si us plau, introduïu no més de {max} paraula(es)", + "error.validation.min": "Si us plau, introduïu un valor igual o superior a {min}", + "error.validation.minlength": "Si us plau, introduïu un valor més llarg. (min. {min} caràcters)", + "error.validation.minwords": "Si us plau, introduïu almenys {min} paraula(es)", + "error.validation.more": "Si us plau, introduïu un valor més gran que {min}", + "error.validation.notcontains": "Introduïu un valor que no contingui \"{needle}\"", + "error.validation.notin": "Si us plau, no introduïu cap d'aquests elements: ({notIn})", + "error.validation.option": "Si us plau, seleccioneu una opció vàlida", + "error.validation.num": "Si us plau, introduïu un número vàlid", + "error.validation.required": "Si us plau, introduïu alguna cosa", + "error.validation.same": "Si us plau, introduïu \"{other}\"", + "error.validation.size": "La mida del valor ha de ser \"{size}\"", + "error.validation.startswith": "El valor ha de començar amb \"{start}\"", + "error.validation.tel": "Please enter an unformatted phone number", + "error.validation.time": "Si us plau, introduïu una hora vàlida", + "error.validation.time.after": "Please enter a time after {time}", + "error.validation.time.before": "Please enter a time before {time}", + "error.validation.time.between": "Please enter a time between {min} and {max}", + "error.validation.uuid": "Please enter a valid UUID", + "error.validation.url": "Si us plau, introduïu una URL vàlida", + + "expand": "Expandir", + "expand.all": "Expandir tot", + + "field.invalid": "The field is invalid", + "field.required": "El camp és obligatori", + "field.blocks.changeType": "Change type", + "field.blocks.code.name": "Codi", + "field.blocks.code.language": "Idioma", + "field.blocks.code.placeholder": "Your code …", + "field.blocks.delete.confirm": "Do you really want to delete this block?", + "field.blocks.delete.confirm.all": "Do you really want to delete all blocks?", + "field.blocks.delete.confirm.selected": "Do you really want to delete the selected blocks?", + "field.blocks.empty": "No blocks yet", + "field.blocks.fieldsets.empty": "No fieldsets yet", + "field.blocks.fieldsets.label": "Please select a block type …", + "field.blocks.fieldsets.paste": "Press {{ shortcut }} to import layouts/blocks from your clipboard Only those allowed in the current field will get inserted.", + "field.blocks.gallery.name": "Gallery", + "field.blocks.gallery.images.empty": "No images yet", + "field.blocks.gallery.images.label": "Images", + "field.blocks.heading.level": "Level", + "field.blocks.heading.name": "Heading", + "field.blocks.heading.text": "Text", + "field.blocks.heading.placeholder": "Heading …", + "field.blocks.image.alt": "Alternative text", + "field.blocks.image.caption": "Caption", + "field.blocks.image.crop": "Crop", + "field.blocks.image.link": "Enllaç", + "field.blocks.image.location": "Location", + "field.blocks.image.location.internal": "This website", + "field.blocks.image.location.external": "External source", + "field.blocks.image.name": "Imatge", + "field.blocks.image.placeholder": "Select an image", + "field.blocks.image.ratio": "Ratio", + "field.blocks.image.url": "Image URL", + "field.blocks.line.name": "Line", + "field.blocks.list.name": "List", + "field.blocks.markdown.name": "Markdown", + "field.blocks.markdown.label": "Text", + "field.blocks.markdown.placeholder": "Markdown …", + "field.blocks.quote.name": "Quote", + "field.blocks.quote.text.label": "Text", + "field.blocks.quote.text.placeholder": "Quote …", + "field.blocks.quote.citation.label": "Citation", + "field.blocks.quote.citation.placeholder": "by …", + "field.blocks.text.name": "Text", + "field.blocks.text.placeholder": "Text …", + "field.blocks.video.autoplay": "Autoplay", + "field.blocks.video.caption": "Caption", + "field.blocks.video.controls": "Controls", + "field.blocks.video.location": "Location", + "field.blocks.video.loop": "Loop", + "field.blocks.video.muted": "Muted", + "field.blocks.video.name": "Video", + "field.blocks.video.placeholder": "Enter a video URL", + "field.blocks.video.poster": "Poster", + "field.blocks.video.preload": "Preload", + "field.blocks.video.url.label": "Video-URL", + "field.blocks.video.url.placeholder": "https://youtube.com/?v=", + + "field.files.empty": "Encara no hi ha cap fitxer seleccionat", + + "field.layout.change": "Change layout", + "field.layout.delete": "Delete layout", + "field.layout.delete.confirm": "Do you really want to delete this layout?", + "field.layout.delete.confirm.all": "Do you really want to delete all layouts?", + "field.layout.empty": "No rows yet", + "field.layout.select": "Select a layout", + + "field.object.empty": "No information yet", + + "field.pages.empty": "Encara no s'ha seleccionat cap pàgina", + + "field.structure.delete.confirm": "Segur que voleu eliminar aquesta fila?", + "field.structure.delete.confirm.all": "Do you really want to delete all entries?", + "field.structure.empty": "Encara no hi ha entrades.", + + "field.users.empty": "Encara no s'ha seleccionat cap usuari", + + "fields.empty": "No fields yet", + + "file": "Arxiu", + "file.blueprint": "This file has no blueprint yet. You can define the setup in /site/blueprints/files/{blueprint}.yml", + "file.changeTemplate": "Canviar la plantilla", + "file.changeTemplate.notice": "Changing the file's template will remove content for fields that don't match in type. If the new template defines certain rules, e.g. image dimensions, those will also be applied irreversibly. Use with caution.", + "file.delete.confirm": "Esteu segurs d'eliminar
{filename}?", + "file.focus.placeholder": "Set focal point", + "file.focus.reset": "Remove focal point", + "file.focus.title": "Focus", + "file.sort": "Change position", + + "files": "Arxius", + "files.empty": "Encara no hi ha fitxers", + + "filter": "Filter", + + "hide": "Hide", + "hour": "Hora", + "hue": "Hue", + "import": "Import", + "info": "Info", + "insert": "Insertar", + "insert.after": "Insert after", + "insert.before": "Insert before", + "install": "Instal·lar", + + "installation": "Instal·lació", + "installation.completed": "S'ha instal·lat el panell", + "installation.disabled": "L'instal·lador del panell està desactivat per defecte als servidors públics. Si us plau, executeu l'instal·lador en una màquina local o habiliteu-lo amb l'opció panel.install", + "installation.issues.accounts": "La carpeta /site/accounts no existeix o no es pot escriure", + "installation.issues.content": "La carpeta /content no existeix o no es pot escriure", + "installation.issues.curl": "Es requereix l'extensió CURL", + "installation.issues.headline": "El panell no es pot instal·lar", + "installation.issues.mbstring": "Es requereix l'extensió de MB String", + "installation.issues.media": "La carpeta /media no existeix o no es pot escriure", + "installation.issues.php": "Assegureu-vos d'utilitzar PHP 8+", + "installation.issues.sessions": "La carpeta /site/sessions no existeix o no es pot escriure", + + "language": "Idioma", + "language.code": "Codi", + "language.convert": "Fer per defecte", + "language.convert.confirm": "

Segur que voleu convertir {name} a l'idioma predeterminat? Això no es pot desfer.

Si {name} té contingut no traduït, ja no podreu tornar enrere i algunes parts del vostre lloc poden quedar buides.

", + "language.create": "Afegir un nou idioma", + "language.default": "Idioma per defecte", + "language.delete.confirm": "Segur que voleu eliminar l'idioma {name} incloent totes les traduccions? Això no es pot desfer!", + "language.deleted": "S'ha suprimit l'idioma", + "language.direction": "Direcció de lectura", + "language.direction.ltr": "Esquerra a dreta", + "language.direction.rtl": "De dreta a esquerra", + "language.locale": "Cadena local de PHP", + "language.locale.warning": "S'està fent servir una configuració regional personalitzada. Modifica el fitxer d'idioma a /site/languages", + "language.name": "Nom", + "language.secondary": "Secondary language", + "language.settings": "Language settings", + "language.updated": "S'ha actualitzat l'idioma", + "language.variables": "Language variables", + "language.variables.empty": "No translations yet", + + "language.variable.delete.confirm": "Do you really want to delete the variable for {key}?", + "language.variable.key": "Key", + "language.variable.notFound": "The variable could not be found", + "language.variable.value": "Value", + + "languages": "Idiomes", + "languages.default": "Idioma per defecte", + "languages.empty": "Encara no hi ha cap idioma", + "languages.secondary": "Idiomes secundaris", + "languages.secondary.empty": "Encara no hi ha idiomes secundaris", + + "license": "Llic\u00e8ncia Kirby", + "license.activate": "Activate it now", + "license.activate.label": "Please activate your license", + "license.activate.domain": "Your license will be activated for {host}.", + "license.activate.local": "You are about to activate your Kirby license for your local domain {host}. If this site will be deployed to a public domain, please activate it there instead. If {host} is the domain you want to use your license for, please continue.", + "license.activated": "Activated", + "license.buy": "Comprar una llicència", + "license.code": "Codi", + "license.code.help": "You received your license code after the purchase via email. Please copy and paste it here.", + "license.code.label": "Si us plau, introdueixi el seu codi de llicència", + "license.status.active.info": "Includes new major versions until {date}", + "license.status.active.label": "Valid license", + "license.status.demo.info": "This is a demo installation", + "license.status.demo.label": "Demo", + "license.status.inactive.info": "Renew license to update to new major versions", + "license.status.inactive.label": "No new major versions", + "license.status.legacy.bubble": "Ready to renew your license?", + "license.status.legacy.info": "Your license does not cover this version", + "license.status.legacy.label": "Please renew your license", + "license.status.missing.bubble": "Ready to launch your site?", + "license.status.missing.info": "No valid license", + "license.status.missing.label": "Please activate your license", + "license.manage": "Manage your licenses", + "license.purchased": "Purchased", + "license.success": "Gràcies per donar suport a Kirby", + "license.unregistered.label": "Unregistered", + + "link": "Enlla\u00e7", + "link.text": "Enllaç de text", + + "loading": "Carregant", + + "lock.unsaved": "Canvis no guardats", + "lock.unsaved.empty": "Ja no hi ha canvis no guardats", + "lock.isLocked": "Unsaved changes by {email}", + "lock.unlock": "Desbloquejar", + "lock.unlock.submit": "Unlock and overwrite unsaved changes by {email}", + "lock.isUnlocked": "Was unlocked by another user", + + "login": "Entrar", + "login.code.label.login": "Login code", + "login.code.label.password-reset": "Password reset code", + "login.code.placeholder.email": "000 000", + "login.code.placeholder.totp": "000000", + "login.code.text.email": "If your email address is registered, the requested code was sent via email.", + "login.code.text.totp": "Please enter the one‑time code from your authenticator app.", + "login.email.login.body": "Hi {user.nameOrEmail},\n\nYou recently requested a login code for the Panel of {site}.\nThe following login code will be valid for {timeout} minutes:\n\n{code}\n\nIf you did not request a login code, please ignore this email or contact your administrator if you have questions.\nFor security, please DO NOT forward this email.", + "login.email.login.subject": "Your login code", + "login.email.password-reset.body": "Hi {user.nameOrEmail},\n\nYou recently requested a password reset code for the Panel of {site}.\nThe following password reset code will be valid for {timeout} minutes:\n\n{code}\n\nIf you did not request a password reset code, please ignore this email or contact your administrator if you have questions.\nFor security, please DO NOT forward this email.", + "login.email.password-reset.subject": "Your password reset code", + "login.remember": "Manten-me connectat", + "login.reset": "Reset password", + "login.toggleText.code.email": "Login via email", + "login.toggleText.code.email-password": "Login with password", + "login.toggleText.password-reset.email": "Forgot your password?", + "login.toggleText.password-reset.email-password": "← Back to login", + "login.totp.enable.option": "Set up one‑time codes", + "login.totp.enable.intro": "Authenticator apps can generate one‑time codes that are used as a second factor when signing into your account.", + "login.totp.enable.qr.label": "1. Scan this QR code", + "login.totp.enable.qr.help": "Unable to scan? Add the setup key {secret} manually to your authenticator app.", + "login.totp.enable.confirm.headline": "2. Confirm with generated code", + "login.totp.enable.confirm.text": "Your app generates a new one‑time code every 30 seconds. Enter the current code to complete the setup:", + "login.totp.enable.confirm.label": "Current code", + "login.totp.enable.confirm.help": "After this setup, we will ask you for a one‑time code every time you log in.", + "login.totp.enable.success": "One‑time codes enabled", + "login.totp.disable.option": "Disable one‑time codes", + "login.totp.disable.label": "Enter your password to disable one‑time codes", + "login.totp.disable.help": "In the future, a different second factor like a login code sent via email will be requested when you log in. You can always set up one‑time codes again later.", + "login.totp.disable.admin": "

This will disable one‑time codes for {user}.

In the future, a different second factor like a login code sent via email will be requested when they log in. {user} can set up one‑time codes again after their next login.

", + "login.totp.disable.success": "One‑time codes disabled", + + "logout": "Tancar sessió", + + "merge": "Merge", + "menu": "Menú", + "meridiem": "AM/PM", + "mime": "Tipus de mitjà", + "minutes": "Minuts", + + "month": "Mes", + "months.april": "Abril", + "months.august": "Agost", + "months.december": "Desembre", + "months.february": "Febrer", + "months.january": "Gener", + "months.july": "Juliol", + "months.june": "Juny", + "months.march": "Mar\u00e7", + "months.may": "Maig", + "months.november": "Novembre", + "months.october": "Octubre", + "months.september": "Setembre", + + "more": "Més", + "move": "Move", + "name": "Nom", + "next": "Següent", + "night": "Night", + "no": "no", + "off": "apagat", + "on": "encès", + "open": "Obrir", + "open.newWindow": "Open in new window", + "option": "Option", + "options": "Opcions", + "options.none": "Sense opcions", + "options.all": "Show all {count} options", + + "orientation": "Orientació", + "orientation.landscape": "Horitzontal", + "orientation.portrait": "Vertical", + "orientation.square": "Quadrat", + + "page": "Page", + "page.blueprint": "This page has no blueprint yet. You can define the setup in /site/blueprints/pages/{blueprint}.yml", + "page.changeSlug": "Canviar URL", + "page.changeSlug.fromTitle": "Crear a partir del t\u00edtol", + "page.changeStatus": "Canviar l'estat", + "page.changeStatus.position": "Si us plau, seleccioneu una posició", + "page.changeStatus.select": "Seleccioneu un nou estat", + "page.changeTemplate": "Canviar la plantilla", + "page.changeTemplate.notice": "Changing the page's template will remove content for fields that don't match in type. Use with caution.", + "page.create": "Create as {status}", + "page.delete.confirm": "Segur que voleu eliminar {title}?", + "page.delete.confirm.subpages": "Aquesta pàgina té subpàgines.
Totes les subpàgines també s'eliminaran.", + "page.delete.confirm.title": "Introduïu el títol de la pàgina per confirmar", + "page.duplicate.appendix": "Copiar", + "page.duplicate.files": "Copiar fitxers", + "page.duplicate.pages": "Copiar pàgines", + "page.move": "Move page", + "page.sort": "Change position", + "page.status": "Estat", + "page.status.draft": "Esborrany", + "page.status.draft.description": "La pàgina està en mode d'esborrany i només és visible per als editors registrats o a través d'un enllaç secret", + "page.status.listed": "Públic", + "page.status.listed.description": "La pàgina és pública per a tothom", + "page.status.unlisted": "Sense classificar", + "page.status.unlisted.description": "La pàgina només es pot accedir a través de l'URL", + + "pages": "Pàgines", + "pages.empty": "Encara no hi ha pàgines", + "pages.status.draft": "Esborranys", + "pages.status.listed": "Publicat", + "pages.status.unlisted": "Sense classificar", + + "pagination.page": "Pàgina", + + "password": "Contrasenya", + "paste": "Paste", + "paste.after": "Paste after", + "paste.success": "{count} pasted!", + "pixel": "Pixel", + "plugin": "Plugin", + "plugins": "Plugins", + "prev": "Anterior", + "preview": "Preview", + "remove": "Eliminar", + "rename": "Canviar el nom", + "renew": "Renew", + "replace": "Reempla\u00e7ar", + "replace.with": "Replace with", + "retry": "Reintentar", + "revert": "Revertir", + "revert.confirm": "Segur que voleu eliminar tots els canvis pendents desar?", + + "role": "Rol", + "role.admin.description": "L’administrador té tots els permisos", + "role.admin.title": "Administrador", + "role.all": "Tots", + "role.empty": "No hi ha usuaris amb aquest rol", + "role.description.placeholder": "Sense descripció", + "role.nobody.description": "Aquest és un rol per defecte sense permisos", + "role.nobody.title": "Ningú", + + "save": "Desar", + "search": "Cercar", + "search.min": "Introduïu {min} caràcters per cercar", + "search.all": "Show all {count} results", + "search.results.none": "Sense resultats", + + "section.invalid": "The section is invalid", + "section.required": "La secció és obligatòria", + + "security": "Security", + "select": "Seleccionar", + "server": "Server", + "settings": "Configuració", + "show": "Show", + "site.blueprint": "The site has no blueprint yet. You can define the setup in /site/blueprints/site.yml", + "size": "Tamany", + "slug": "URL-ap\u00e8ndix", + "sort": "Ordenar", + "sort.drag": "Drag to sort …", + "split": "Split", + + "stats.empty": "No reports", + "status": "Estat", + + "system.info.copy": "Copy info", + "system.info.copied": "System info copied", + "system.issues.content": "The content folder seems to be exposed", + "system.issues.eol.kirby": "Your installed Kirby version has reached end-of-life and will not receive further security updates", + "system.issues.eol.plugin": "Your installed version of the { plugin } plugin is has reached end-of-life and will not receive further security updates", + "system.issues.eol.php": "Your installed PHP release { release } has reached end-of-life and will not receive further security updates", + "system.issues.debug": "Debugging must be turned off in production", + "system.issues.git": "The .git folder seems to be exposed", + "system.issues.https": "We recommend HTTPS for all your sites", + "system.issues.kirby": "The kirby folder seems to be exposed", + "system.issues.site": "The site folder seems to be exposed", + "system.issues.vulnerability.kirby": "Your installation might be affected by the following vulnerability ({ severity } severity): { description }", + "system.issues.vulnerability.plugin": "Your installation might be affected by the following vulnerability in the { plugin } plugin ({ severity } severity): { description }", + "system.updateStatus": "Update status", + "system.updateStatus.error": "Could not check for updates", + "system.updateStatus.not-vulnerable": "No known vulnerabilities", + "system.updateStatus.security-update": "Free security update { version } available", + "system.updateStatus.security-upgrade": "Upgrade { version } with security fixes available", + "system.updateStatus.unreleased": "Unreleased version", + "system.updateStatus.up-to-date": "Up to date", + "system.updateStatus.update": "Free update { version } available", + "system.updateStatus.upgrade": "Upgrade { version } available", + + "tel": "Phone", + "tel.placeholder": "+49123456789", + "template": "Plantilla", + "title": "Títol", + "today": "Avui", + + "toolbar.button.clear": "Clear formatting", + "toolbar.button.code": "Codi", + "toolbar.button.bold": "Negreta", + "toolbar.button.email": "Email", + "toolbar.button.headings": "Encapçalaments", + "toolbar.button.heading.1": "Encapçalament 1", + "toolbar.button.heading.2": "Encapçalament 2", + "toolbar.button.heading.3": "Encapçalament 3", + "toolbar.button.heading.4": "Heading 4", + "toolbar.button.heading.5": "Heading 5", + "toolbar.button.heading.6": "Heading 6", + "toolbar.button.italic": "Cursiva", + "toolbar.button.file": "Arxiu", + "toolbar.button.file.select": "Selecciona un fitxer", + "toolbar.button.file.upload": "Carrega un fitxer", + "toolbar.button.link": "Enlla\u00e7", + "toolbar.button.paragraph": "Paragraph", + "toolbar.button.strike": "Strike-through", + "toolbar.button.sub": "Subscript", + "toolbar.button.sup": "Superscript", + "toolbar.button.ol": "Llista ordenada", + "toolbar.button.underline": "Underline", + "toolbar.button.ul": "Llista de vinyetes", + + "translation.author": "Equip Kirby", + "translation.direction": "ltr", + "translation.name": "Catalan", + "translation.locale": "ca_ES", + + "type": "Type", + + "upload": "Carregar", + "upload.error.cantMove": "El fitxer carregat no s'ha pogut moure", + "upload.error.cantWrite": "No s'ha pogut escriure el fitxer al disc", + "upload.error.default": "No s'ha pogut carregar el fitxer", + "upload.error.extension": "La càrrega del fitxer s'ha aturat per l'extensió", + "upload.error.formSize": "El fitxer carregat supera la directiva MAX_FILE_SIZE especificada en el formulari", + "upload.error.iniPostSize": "El fitxer carregat supera la directiva post_max_size especifiada al php.ini", + "upload.error.iniSize": "El fitxer carregat supera la directiva upload_max_filesize especifiada al php.ini", + "upload.error.noFile": "No s'ha carregat cap fitxer", + "upload.error.noFiles": "No s'ha penjat cap fitxer", + "upload.error.partial": "El fitxer carregat només s'ha carregat parcialment", + "upload.error.tmpDir": "Falta una carpeta temporal", + "upload.errors": "Error", + "upload.progress": "Carregant...", + + "url": "Url", + "url.placeholder": "https://example.com", + + "user": "Usuari", + "user.blueprint": "You can define additional sections and form fields for this user role in /site/blueprints/users/{blueprint}.yml", + "user.changeEmail": "Canviar e-mail", + "user.changeLanguage": "Canviar idioma", + "user.changeName": "Canviar el nom d'aquest usuari", + "user.changePassword": "Canviar contrasenya", + "user.changePassword.new": "Nova contrasenya", + "user.changePassword.new.confirm": "Confirma la nova contrasenya ...", + "user.changeRole": "Canviar el rol", + "user.changeRole.select": "Seleccionar un nou rol", + "user.create": "Afegir un nou usuari", + "user.delete": "Eliminar aquest usuari", + "user.delete.confirm": "Segur que voleu eliminar
{email}?", + + "users": "Usuaris", + + "version": "Versi\u00f3 de Kirby", + "version.current": "Current version", + "version.latest": "Latest version", + "versionInformation": "Version information", + + "view.account": "La teva compta", + "view.installation": "Instal·lació", + "view.languages": "Idiomes", + "view.resetPassword": "Reset password", + "view.site": "Lloc web", + "view.system": "System", + "view.users": "Usuaris", + + "welcome": "Benvinguda", + "year": "Any", + "yes": "yes" +} diff --git a/kirby/i18n/translations/cs.json b/kirby/i18n/translations/cs.json new file mode 100644 index 0000000..4576dee --- /dev/null +++ b/kirby/i18n/translations/cs.json @@ -0,0 +1,730 @@ +{ + "account.changeName": "Přejmenovat uživatele", + "account.delete": "Smazat účet", + "account.delete.confirm": "Opravdu chcete smazat svůj účet? Budete okamžitě odhlášeni. Účet nemůže být zpětně obnoven.", + + "activate": "Aktivovat", + "add": "P\u0159idat", + "alpha": "Alfa", + "author": "Autor", + "avatar": "Profilov\u00fd obr\u00e1zek", + "back": "Zpět", + "cancel": "Zru\u0161it", + "change": "Zm\u011bnit", + "close": "Zavřít", + "changes": "Změny", + "confirm": "Ok", + "collapse": "Sbalit", + "collapse.all": "Sbalit vše", + "color": "Barva", + "coordinates": "Souřadnice", + "copy": "Kopírovat", + "copy.all": "Kopírovat vše", + "copy.success": "{count} zkopírováno!", + "create": "Vytvořit", + "custom": "Vlastní", + + "date": "Datum", + "date.select": "Vyberte datum", + + "day": "Den", + "days.fri": "p\u00e1", + "days.mon": "po", + "days.sat": "so", + "days.sun": "ne", + "days.thu": "\u010dt", + "days.tue": "\u00fat", + "days.wed": "st", + + "debugging": "Ladění", + + "delete": "Smazat", + "delete.all": "Smazat vše", + + "dialog.fields.empty": "Tento dialog neobsahuje žádná pole", + "dialog.files.empty": "Žádné soubory k výběru", + "dialog.pages.empty": "Žádné stránky k výběru", + "dialog.text.empty": "Tento dialog nemá definovaný žádný text", + "dialog.users.empty": "Žádní uživatelé k výběru", + + "dimensions": "Rozměry", + "disable": "Deaktivovat", + "disabled": "Zakázáno", + "discard": "Zahodit", + + "drawer.fields.empty": "Tento vysouvací panel nemá žádná pole", + + "domain": "Doména", + "download": "Stáhnout", + "duplicate": "Duplikovat", + + "edit": "Upravit", + + "email": "Email", + "email.placeholder": "mail@example.com", + + "enter": "Zapsat", + "entries": "Záznamy", + "entry": "Záznam", + + "environment": "Prostředí", + + "error": "Chyba", + "error.access.code": "Neplatný kód", + "error.access.login": "Neplatné přihlášení", + "error.access.panel": "Nemáte oprávnění k přihlášení do panelu", + "error.access.view": "Nemáte oprávnění ke vstupu do této části panelu.", + + "error.avatar.create.fail": "Nebylo možné nahrát profilový obrázek", + "error.avatar.delete.fail": "Nebylo mo\u017en\u00e9 smazat profilov\u00fd obr\u00e1zek", + "error.avatar.dimensions.invalid": "Šířka a výška obrázku musí být pod 3000 pixelů", + "error.avatar.mime.forbidden": "Profilový obrázek musí být ve formátu JPEG nebo PNG", + + "error.blueprint.notFound": "Nelze načíst blueprint \"{name}\" ", + + "error.blocks.max.plural": "Nelze přidat více něž {max} bloků", + "error.blocks.max.singular": "Nelze přidat více než jeden blok", + "error.blocks.min.plural": "Musíte přidat alespoň {min} bloků", + "error.blocks.min.singular": "Musíte přidat alespoň jeden blok", + "error.blocks.validation": "V poli \"{field}\" v bloku {index} je při použití \"{fieldset}\" typu chyba", + + "error.cache.type.invalid": "Neplatný typ cache \"{type}\"", + + "error.email.preset.notFound": "Nelze nalézt emailové přednastavení \"{name}\"", + + "error.field.converter.invalid": "Neplatný konvertor \"{converter}\"", + "error.field.type.missing": "Pole \"{ name }\": Typ pole \"{ type }\" neexistuje", + + "error.file.changeName.empty": "Toto jméno nesmí být prázdné", + "error.file.changeName.permission": "Nemáte povoleno změnit jméno souboru \"{filename}\"", + "error.file.changeTemplate.invalid": "Šablonu souboru \"{id}\" nelze změnit na \"{template}\" (platné: \"{blueprints}\")", + "error.file.changeTemplate.permission": "Nemáte dovoleno změnit šablonu souboru \"{id}\"", + + "error.file.duplicate": "Soubor s názvem \"{filename}\" již existuje", + "error.file.extension.forbidden": "Přípona souboru \"{extension}\" není povolena", + "error.file.extension.invalid": "Neplatná přípona souboru: {extension}", + "error.file.extension.missing": "Nem\u016f\u017eete nahr\u00e1t soubor bez p\u0159\u00edpony", + "error.file.maxheight": "Výška obrázku nesmí přesáhnout {height} pixelů", + "error.file.maxsize": "Soubor je příliš velký", + "error.file.maxwidth": "Šířka obrázku nesmí přesáhnout {width} pixelů", + "error.file.mime.differs": "Nahraný soubor musí být stejného typu \"{mime}\"", + "error.file.mime.forbidden": "Soubor typu \"{mime}\" není povolený", + "error.file.mime.invalid": "Neplatný MIME typ: {mime}", + "error.file.mime.missing": "Nelze rozeznat mime typ souboru \"{filename}\"", + "error.file.minheight": "Výška obrázku musí být alespoň {height} pixelů", + "error.file.minsize": "Soubor je příliš malý", + "error.file.minwidth": "Šířka obrázku musí být alespoň {width} pixelů", + "error.file.name.unique": "Název souboru musí být unikátní", + "error.file.name.missing": "Název souboru nesmí být prázdný", + "error.file.notFound": "Soubor se nepoda\u0159ilo nal\u00e9zt", + "error.file.orientation": "Orientace obrázku másí být \"{orientation}\"", + "error.file.type.forbidden": "Nemáte povoleno nahrávat soubory typu {type} ", + "error.file.type.invalid": "Neplatný typ souboru: {type}", + "error.file.undefined": "Soubor se nepoda\u0159ilo nal\u00e9zt", + + "error.form.incomplete": "Prosím opravte všechny chyby ve formuláři", + "error.form.notSaved": "Formulář nemohl být uložen", + + "error.language.code": "Zadejte prosím platný kód jazyka", + "error.language.duplicate": "Jazyk již existuje", + "error.language.name": "Zadejte prosím platné jméno jazyka", + "error.language.notFound": "Jazyk nebyl nalezen", + + "error.layout.validation.block": "V rozvržení {layoutIndex} je v poli \"{field}\" v bloku {blockIndex} při použití \"{fieldset}\" typu chyba", + "error.layout.validation.settings": "Chyba v nastavení rozvržení {index}", + + "error.license.domain": "Licenčnímu klíči chybí doména", + "error.license.email": "Zadejte prosím platnou emailovou adresu", + "error.license.format": "Zadejte prosím platné licenční číslo", + "error.license.verification": "Licenci nelze ověřit", + + "error.login.totp.confirm.invalid": "Neplatný kód", + "error.login.totp.confirm.missing": "Zadejte prosím licenční kód", + + "error.object.validation": "V poli \"{label}\" je chyba:\n{message}", + + "error.offline": "Panel je v současnosti off-line", + + "error.page.changeSlug.permission": "Nem\u016f\u017eete zm\u011bnit URL t\u00e9to str\u00e1nky", + "error.page.changeSlug.reserved": "Cesta k stránkám na nevyšší úrovni nesmí začínat jako \"{path}\"", + "error.page.changeStatus.incomplete": "Stránka obsahuje chyby a nemohla být zveřejněna", + "error.page.changeStatus.permission": "Status této stránky nelze změnit", + "error.page.changeStatus.toDraft.invalid": "Stránka \"{slug}\" nemůže být převedena na koncept", + "error.page.changeTemplate.invalid": "Šablonu stránky \"{slug}\" nelze změnit", + "error.page.changeTemplate.permission": "Nemáte dovoleno změnit šablonu stránky \"{slug}\"", + "error.page.changeTitle.empty": "Titulek nesmí být prázdný", + "error.page.changeTitle.permission": "Nemáte dovoleno změnit titulek stránky \"{slug}\"", + "error.page.create.permission": "Nemáte dovoleno vytvořit \"{slug}\"", + "error.page.delete": "Stránku \"{slug}\" nelze vymazat", + "error.page.delete.confirm": "Pro potvrzení prosím zadejte titulek stránky", + "error.page.delete.hasChildren": "Stránka má podstránky, nemůže být vymazána", + "error.page.delete.permission": "Nemáte dovoleno odstranit \"{slug}\"", + "error.page.draft.duplicate": "Koncept stránky, který obsahuje v adrese URL \"{slug}\" již existuje ", + "error.page.duplicate": "Stránka, která v adrese URL obsahuje \"{slug}\" již existuje", + "error.page.duplicate.permission": "Nemáte dovoleno duplikovat \"{slug}\"", + "error.page.move.ancestor": "Stránka nemůže být přesunuta sama do sebe", + "error.page.move.directory": "Adresář stránky nelze přesunout", + "error.page.move.duplicate": "Podstránka s URL \"{slug}\" již existuje", + "error.page.move.notFound": "Přesunutá stránka nebyla nalezena", + "error.page.move.permission": "Nemáte dovoleno přesunout stránku \"{slug}\"", + "error.page.move.template": "Šablonu \"{template}\" nelze použít pro podstránku \"{parent}\"", + "error.page.notFound": "Str\u00e1nku se nepoda\u0159ilo nal\u00e9zt.", + "error.page.num.invalid": "Zadejte prosím platné pořadové číslo. Čísla nesmí být záporná.", + "error.page.slug.invalid": "Podtržení", + "error.page.slug.maxlength": "URL musí mít méně než \"{length}\" znaků", + "error.page.sort.permission": "Stránce \"{slug}\" nelze změnit pořadí", + "error.page.status.invalid": "Nastavte prosím platný status stránky", + "error.page.undefined": "Str\u00e1nku se nepoda\u0159ilo nal\u00e9zt.", + "error.page.update.permission": "Nemáte dovoleno upravit \"{slug}\"", + + "error.section.files.max.plural": "Sekce \"{section}\" nesmí obsahovat více jak {max} souborů", + "error.section.files.max.singular": "Sekce \"{section}\" může obsahovat nejvýše jeden soubor", + "error.section.files.min.plural": "Sekce \"{section}\" vyžaduje nejméně {min} souborů", + "error.section.files.min.singular": "Sekce \"{section}\" vyžaduje alespoň jeden soubor", + + "error.section.pages.max.plural": "Sekce \"{section}\" nesmí obsahovat více jak {max} stránek", + "error.section.pages.max.singular": "Sekce \"{section}\" může obsahovat nejvýše jednu stránku", + "error.section.pages.min.plural": "Sekce \"{section}\" vyžaduje alespoň {min} stránek", + "error.section.pages.min.singular": "Sekce \"{section}\" vyžaduje alespoň jednu stránku", + + "error.section.notLoaded": "Nelze načíst sekci \"{name}\"", + "error.section.type.invalid": "Typ sekce \"{type}\" není platný", + + "error.site.changeTitle.empty": "Titulek nesmí být prázdný", + "error.site.changeTitle.permission": "Nemáte dovoleno změnit titulek stránky", + "error.site.update.permission": "Nemáte dovoleno upravit stránku", + + "error.structure.validation": "Chyba v poli \"{field}\" na řádku {index}", + + "error.template.default.notFound": "Výchozí šablona neexistuje", + + "error.unexpected": "Vyskytla se neočekávaná chyba! Pro více informací povolte debug mód, viz: https://getkirby.com/docs/reference/system/options/debug", + + "error.user.changeEmail.permission": "Nemáte dovoleno měnit email uživatele \"{name}\"", + "error.user.changeLanguage.permission": "Nemáte dovoleno změnit jazyk uživatele \"{name}\"", + "error.user.changeName.permission": "Nemáte dovoleno změnit jméno uživatele \"{name}\"", + "error.user.changePassword.permission": "Nemáte dovoleno změnit heslo uživatele \"{name}\"", + "error.user.changeRole.lastAdmin": "Role posledního administrátora nemůže být změněna", + "error.user.changeRole.permission": "Nemáte dovoleno změnit roli uživatele \"{name}\"", + "error.user.changeRole.toAdmin": "Nemáte dovoleno povýšit uživatele do role administrátora.", + "error.user.create.permission": "Nemáte dovoleno vytvořit tohoto uživatele", + "error.user.delete": "U\u017eivatel nemohl b\u00fdt smaz\u00e1n", + "error.user.delete.lastAdmin": "Nem\u016f\u017eete smazat posledn\u00edho administr\u00e1tora", + "error.user.delete.lastUser": "Poslední uživatel nemůže být smazán", + "error.user.delete.permission": "Nem\u00e1te dovoleno smazat tohoto u\u017eivatele", + "error.user.duplicate": "Uživatel s emailovou adresou \"{email}\" již existuje", + "error.user.email.invalid": "Zadejte prosím platnou emailovou adresu", + "error.user.language.invalid": "Zadejte prosím platný jazyk", + "error.user.notFound": "U\u017eivatele se nepoda\u0159ilo nal\u00e9zt", + "error.user.password.excessive": "Zadejte prosím platné heslo. Heslo nesmí být delší než 1000 znaků.", + "error.user.password.invalid": "Zadejte prosím platné heslo. Heslo musí být dlouhé alespoň 8 znaků.", + "error.user.password.notSame": "Pros\u00edm potvr\u010fte heslo", + "error.user.password.undefined": "Uživatel nemá nastavené heslo.", + "error.user.password.wrong": "Špatné heslo", + "error.user.role.invalid": "Zadejte prosím platnou roli", + "error.user.undefined": "Uživatele se nepodařilo nalézt", + "error.user.update.permission": "Nemáte dovoleno upravit uživatele \"{name}\"", + + "error.validation.accepted": "Potvrďte prosím", + "error.validation.alpha": "Zadávejte prosím pouze znaky v rozmezí a-z", + "error.validation.alphanum": "Zadávejte prosím pouze znaky v rozmezí a-z nebo čísla v rozmezí 0-9", + "error.validation.anchor": "Zadejte správný název kotvy", + "error.validation.between": "Zadejte prosím hodnotu mez \"{min}\" a \"{max}\"", + "error.validation.boolean": "Potvrďte prosím, nebo odmítněte", + "error.validation.color": "Zadejte platnou barvu ve formátu {format}", + "error.validation.contains": "Zadejte prosím hodnotu, která obsahuje \"{needle}\"", + "error.validation.date": "Zadejte prosím platné datum", + "error.validation.date.after": "Zadejte prosím datum po {date}", + "error.validation.date.before": "Zadejte prosím datum před {date}", + "error.validation.date.between": "Zadejte prosím datum mezi {min} a {max}", + "error.validation.denied": "Prosím, odmítněte", + "error.validation.different": "Hodnota nesmí být \"{other}\"", + "error.validation.email": "Zadejte prosím platnou emailovou adresu", + "error.validation.endswith": "Hodnota nesmí končit \"{end}\"", + "error.validation.filename": "Zadejte prosím platný název souboru", + "error.validation.in": "Zadejte prosím některou z následujíích hodnot: ({in})", + "error.validation.integer": "Zadejte prosím platné celé číslo", + "error.validation.ip": "Zadejte prosím platnou IP adresu", + "error.validation.less": "Zadejte prosím hodnotu menší než {max}", + "error.validation.linkType": "Typ odkazu není povolen", + "error.validation.match": "Hodnota neodpovídá očekávanému vzoru", + "error.validation.max": "Zadejte prosím hodnotu rovnou, nebo menší než {max}", + "error.validation.maxlength": "Zadaná hodnota je příliš dlouhá. (Povoleno nejvýše {max} znaků)", + "error.validation.maxwords": "Nezadávejte prosím více jak {max} slov", + "error.validation.min": "Zadejte prosím hodnotu rovnou, nebo větší než {min}", + "error.validation.minlength": "Zadaná hodnota je příliš krátká. (Požadováno nejméně {min} znaků)", + "error.validation.minwords": "Zadejte prosím alespoň {min} slov", + "error.validation.more": "Zadejte prosím hodnotu větší než {min}", + "error.validation.notcontains": "Zadejte prosím hodnotu, která neobsahuje \"{needle}\"", + "error.validation.notin": "Nezadávejte prosím žádnou z následujíích hodnot: ({notIn})", + "error.validation.option": "Vyberte prosím platnou možnost", + "error.validation.num": "Zadejte prosím platné číslo", + "error.validation.required": "Zadejte prosím jakoukoli hodnotu", + "error.validation.same": "Zadejte prosím \"{other}\"", + "error.validation.size": "Velikost hodnoty musí být \"{size}\"", + "error.validation.startswith": "Hodnota musí začínat \"{start}\"", + "error.validation.tel": "Zadejte neformátované telefonní číslo ", + "error.validation.time": "Zadejte prosím platný čas", + "error.validation.time.after": "Zadejte prosím čas po {time}", + "error.validation.time.before": "Zadejte prosím čas před {time}", + "error.validation.time.between": "Zadejte prosím čas v rozmezí od {min} do {max}", + "error.validation.uuid": "Zadejte platné UUID", + "error.validation.url": "Zadejte prosím platnou adresu URL", + + "expand": "Rozbalit", + "expand.all": "Rozbalit vše", + + "field.invalid": "Pole není platné", + "field.required": "Pole musí být vyplněno.", + "field.blocks.changeType": "Změnit typ", + "field.blocks.code.name": "Kód", + "field.blocks.code.language": "Jazyk", + "field.blocks.code.placeholder": "Váš kód …", + "field.blocks.delete.confirm": "Opravdu chcete smazat tento blok?", + "field.blocks.delete.confirm.all": "Opravdu chcete smazat všechny bloky?", + "field.blocks.delete.confirm.selected": "Opravdu chcete smazat vybrané bloky?", + "field.blocks.empty": "Zatím žádné bloky", + "field.blocks.fieldsets.empty": "Zatím žádné fieldsets", + "field.blocks.fieldsets.label": "Vyberte prosím typ bloku …", + "field.blocks.fieldsets.paste": "Stiskněte{{ shortcut }} pro vložení rozvržení/bloků ze schránky Vloženy budou jen ty, které jsou v aktuálním poli povolené.", + "field.blocks.gallery.name": "Galerie", + "field.blocks.gallery.images.empty": "Zatím žádné obrázky", + "field.blocks.gallery.images.label": "Obrázky", + "field.blocks.heading.level": "Úroveň", + "field.blocks.heading.name": "Nadpis", + "field.blocks.heading.text": "Text", + "field.blocks.heading.placeholder": "Nadpis …", + "field.blocks.image.alt": "Alternativní text", + "field.blocks.image.caption": "Titulek", + "field.blocks.image.crop": "Oříznout", + "field.blocks.image.link": "Odkaz", + "field.blocks.image.location": "Umístění", + "field.blocks.image.location.internal": "Tato webová stránka", + "field.blocks.image.location.external": "Externí zdroj", + "field.blocks.image.name": "Obrázek", + "field.blocks.image.placeholder": "Vyberte obrázek", + "field.blocks.image.ratio": "Poměr stran", + "field.blocks.image.url": "URL obrázku", + "field.blocks.line.name": "Čára", + "field.blocks.list.name": "Seznam", + "field.blocks.markdown.name": "Markdown", + "field.blocks.markdown.label": "Text", + "field.blocks.markdown.placeholder": "Markdown …", + "field.blocks.quote.name": "Citát", + "field.blocks.quote.text.label": "Text", + "field.blocks.quote.text.placeholder": "Citát …", + "field.blocks.quote.citation.label": "Citace", + "field.blocks.quote.citation.placeholder": "od …", + "field.blocks.text.name": "Text", + "field.blocks.text.placeholder": "Text …", + "field.blocks.video.autoplay": "Autoplay", + "field.blocks.video.caption": "Titulek", + "field.blocks.video.controls": "Ovládání", + "field.blocks.video.location": "Umístění", + "field.blocks.video.loop": "Smyčka", + "field.blocks.video.muted": "Ztlumené", + "field.blocks.video.name": "Video", + "field.blocks.video.placeholder": "Zadejte URL adresu videa", + "field.blocks.video.poster": "Náhledový obrázek", + "field.blocks.video.preload": "Předběžně načíst", + "field.blocks.video.url.label": "URL adresa videa", + "field.blocks.video.url.placeholder": "https://youtube.com/?v=", + + "field.files.empty": "Nebyly zatím vybrány žádné soubory", + + "field.layout.change": "Změnit rozvržení", + "field.layout.delete": "Smazat rozvržení", + "field.layout.delete.confirm": "Opravdu chcete smazat toto rozvržení?", + "field.layout.delete.confirm.all": "Opravdu chcete smazat všechna rozvržení?", + "field.layout.empty": "Zatím žádné řádky", + "field.layout.select": "Vyberte rozvržení", + + "field.object.empty": "Zatím žádná informace", + + "field.pages.empty": "Nebyly zatím vybrány žádné stránky", + + "field.structure.delete.confirm": "Opravdu chcete smazat tento z\u00e1znam?", + "field.structure.delete.confirm.all": "Opravdu chcete smazat všechny záznamy?", + "field.structure.empty": "Zat\u00edm nejsou \u017e\u00e1dn\u00e9 z\u00e1znamy.", + + "field.users.empty": "Nebyli zatím vybráni žádní uživatelé", + + "fields.empty": "Zatím žádné pole", + + "file": "Soubor", + "file.blueprint": "Tento typ souboru nemá blueprint. Blueprint můžete definovat v /site/blueprints/files/{blueprint}.yml", + "file.changeTemplate": "Změnit šablonu", + "file.changeTemplate.notice": "Změna šablony souboru změní obsah pro pole, která mají odlišný typ. Pokud má nová šablona nastavena určitá pravidla, např. rozměry obrázku, tato pravidla budou také aplikována. Používejte obezřetně.", + "file.delete.confirm": "Opravdu chcete smazat tento soubor?", + "file.focus.placeholder": "Nastavit ohnisko", + "file.focus.reset": "Odstranit ohnisko", + "file.focus.title": "Zaměřit na", + "file.sort": "Změnit pozici", + + "files": "Soubory", + "files.empty": "Zatím žádné soubory", + + "filter": "Filtr", + + "hide": "Skrýt", + "hour": "Hodina", + "hue": "Odstín", + "import": "Import", + "info": "Informace", + "insert": "Vlo\u017eit", + "insert.after": "Vložit za", + "insert.before": "Vložit před", + "install": "Instalovat", + + "installation": "Instalace", + "installation.completed": "Panel byl nainstalován", + "installation.disabled": "Instalátor panelu je ve výchozím nastavení na veřejných serverech zakázán. Spusťte prosím instalátor na lokálním počítači nebo jej povolte prostřednictvím panel.install.", + "installation.issues.accounts": "\/site\/accounts nen\u00ed zapisovateln\u00e9", + "installation.issues.content": "Slo\u017eka content a v\u0161echny soubory a slo\u017eky v n\u00ed mus\u00ed b\u00fdt zapisovateln\u00e9.", + "installation.issues.curl": "Je vyžadováno rozšířeníCURL", + "installation.issues.headline": "Panel nelze nainstalovat", + "installation.issues.mbstring": "Je vyžadováno rozšířeníMB String", + "installation.issues.media": "Složka/media neexistuje, nebo nemá povolený zápis", + "installation.issues.php": "Ujistěte se, že používátePHP 8+", + "installation.issues.sessions": "Složka/site/sessions neexistuje, nebo nemá povolený zápis", + + "language": "Jazyk", + "language.code": "Kód", + "language.convert": "Nastavte výchozí možnost", + "language.convert.confirm": "

Opravdu chcete převést{name} na výchozí jazyk? Tuto volbu nelze vzít zpátky.

Pokud {name} obsahuje nepřeložený text, nebude již k dispozici záložní varianta a části stránky mohou zůstat prázdné.

", + "language.create": "Přidat nový jazyk", + "language.default": "Výchozí jazyk", + "language.delete.confirm": "Opravdu chcete smazat jazyk {name} včetně všech překladů? Tuto volbu nelze vzít zpátky!", + "language.deleted": "Jazyk byl smazán", + "language.direction": "Směr čtení", + "language.direction.ltr": "Zleva doprava", + "language.direction.rtl": "Zprava doleva", + "language.locale": "Řetězec lokalizace PHP", + "language.locale.warning": "Používáte vlastní jazykové nastavení. Upravte prosím soubor s nastavením v /site/languages", + "language.name": "Jméno", + "language.secondary": "Sekundární jazyk", + "language.settings": "Nastavení jazyka", + "language.updated": "Jazyk byl aktualizován", + "language.variables": "Jazykové proměnné", + "language.variables.empty": "Zatím žádné překlady", + + "language.variable.delete.confirm": "Doopravdy chcete smazat proměnou {key}?", + "language.variable.key": "Klíč", + "language.variable.notFound": "Proměnná nebyla nalezena", + "language.variable.value": "Hodnota", + + "languages": "Jazyky", + "languages.default": "Výchozí jazyk", + "languages.empty": "Zatím neexistují žádné jazyky", + "languages.secondary": "Další jazyky", + "languages.secondary.empty": "Neexistují zatím žádné další jazyky", + + "license": "Kirby licence", + "license.activate": "Aktivovat nyní", + "license.activate.label": "Prosím aktivute svoji licenci", + "license.activate.domain": "Vaše licence bude zaregistrována na {host}.", + "license.activate.local": "Chystáte se registrovat licenci na Vaší lokální doméně {host}. Pokud bude tato stránka nasazena na veřejnou doménu, registrujte prosím licenci až tam. Pokud je {host} opravdu doménou, na které si přejete licenci registrovat, pokračujte prosím dále.", + "license.activated": "Aktivováno", + "license.buy": "Zakoupit licenci", + "license.code": "Kód", + "license.code.help": "Licenční kód jste po zakoupení obdrželi na email. Vložte prosím kód a zaregistrujte Vaší kopii.", + "license.code.label": "Zadejte prosím licenční kód", + "license.status.active.info": "Platí pro nové verze až do {date}", + "license.status.active.label": "Platná licence", + "license.status.demo.info": "Tato instalace je pouze demoverze", + "license.status.demo.label": "Demoverze", + "license.status.inactive.info": "Pro update na novou hlavní verzi musíte obnovit licenci", + "license.status.inactive.label": "Žádné nové hlavní verze", + "license.status.legacy.bubble": "Vše připraveno na obnovení licence?", + "license.status.legacy.info": "Vaše licence se nevztahuje na tuto verzi", + "license.status.legacy.label": "Prosím obnovte svoji licenci", + "license.status.missing.bubble": "Vše připraveno na spuštění vaši stránky?", + "license.status.missing.info": "Žádlná platná licence", + "license.status.missing.label": "Prosím aktivute svoji licenci", + "license.manage": "Spravovat licence", + "license.purchased": "Zakoupeno", + "license.success": "Děkujeme Vám za podporu Kirby", + "license.unregistered.label": "Neregistrovaný", + + "link": "Odkaz", + "link.text": "Text odkazu", + + "loading": "Načítám", + + "lock.unsaved": "Neuložené změny", + "lock.unsaved.empty": "Nezbývají již žádné neuložené změny.", + "lock.isLocked": "Neuložené změny od {email}", + "lock.unlock": "Odemknout", + "lock.unlock.submit": "Odemknout a přepsat neuložené změny od {email}", + "lock.isUnlocked": "Bylo odemknuto jiným uživatelem", + + "login": "Přihlásit se", + "login.code.label.login": "Kód pro přihlášení", + "login.code.label.password-reset": "Kód pro resetování hesla", + "login.code.placeholder.email": "000 000", + "login.code.placeholder.totp": "000000", + "login.code.text.email": "Vaše e-mailová adresa byla zaregistrována, kód byl odeslán do Vaší e-mailové schránky.", + "login.code.text.totp": "Prosím vložte jednorázový kód z vaší autentifikační aplikace.", + "login.email.login.body": "Ahoj {user.nameOrEmail},\n\nV nedávné době jsi zažádal(a) o kód pro přihlášení do Kirby Panelu na stránce {site}.\nNásledující kód pro přihlášení je platný {timeout} minut:\n\n{code}\n\nPokud jsi o kód pro přihlášení nežádal(a), tuto zprávu prosím ignoruj a v případě dotazů prosím kontaktuj svého administrátora.\nZ bezpečnostních důvodů prosím tuto zprávu nepřeposílej nikomu dalšímu.", + "login.email.login.subject": "Váš kód pro přihlášení", + "login.email.password-reset.body": "Ahoj {user.nameOrEmail},\n\nV nedávné době jsi zažádal(a) o kód pro resetování hesla do Kirby Panelu na stránce {site}.\nNásledující kód pro resetování hesla je platný {timeout} minut:\n\n{code}\n\nPokud jsi o kód pro resetování hesla nežádal(a), tuto zprávu prosím ignoruj a v případě dotazů prosím kontaktuj svého administrátora.\nZ bezpečnostních důvodů prosím tuto zprávu nepřeposílej nikomu dalšímu.", + "login.email.password-reset.subject": "Váš kód pro resetování hesla", + "login.remember": "Zůstat přihlášen", + "login.reset": "Resetovat heslo", + "login.toggleText.code.email": "Přihlásit se pomocí e-mailu", + "login.toggleText.code.email-password": "Přihlásit se pomocí hesla", + "login.toggleText.password-reset.email": "Zapomenuté heslo?", + "login.toggleText.password-reset.email-password": "← Zpět na přihlášení", + "login.totp.enable.option": "Nastavit jednorázové kódy", + "login.totp.enable.intro": "Autentifikační aplikace umí generovat jednorázové kódy, které jsou použitý jako druhý faktor při přihlášení do vašeho účtu.", + "login.totp.enable.qr.label": "1. Naskenujte tento QR kód", + "login.totp.enable.qr.help": "Nepodařilo se scanovat? Přidejte klíč pro nastavení  {secret} ručně do své autentifikační aplikace.", + "login.totp.enable.confirm.headline": "2. Potvrďte vygenerovaným kódem", + "login.totp.enable.confirm.text": "Vaše aplikace generuje každých 30 sekund nový jednorázový kód. Zadejte aktuální kód a dokončete nastavení:", + "login.totp.enable.confirm.label": "Současný kód", + "login.totp.enable.confirm.help": "Po tomto nastavení vás při každém přihlášení požádáme o jednorázový kód.", + "login.totp.enable.success": "Jednorázové kódy zapnuty", + "login.totp.disable.option": "Vypnutí jednorázových kódu", + "login.totp.disable.label": "Pro vypnutí jednorázových kódů zadejte svoje heslo", + "login.totp.disable.help": "V budoucnu bude při přihlašování vyžadován jiný druhý faktor, například přihlašovací kód zaslaný e-mailem. Jednorázové kódy můžete vždy později nastavit znovu.", + "login.totp.disable.admin": "

Tím se jednorázové kódy pro{user} zakážou.

V budoucnu bude při přihlášení vyžadován jiný druhý faktor, například přihlašovací kód zaslaný e-mailem. Jednorázové kódy si může {user} nastavit znovu po svém dalším přihlášení.", + "login.totp.disable.success": "Jednorázové kódy vypnuty", + + "logout": "Odhlásit se", + + "merge": "Spojit", + "menu": "Menu", + "meridiem": "AM/PM", + "mime": "Typ média", + "minutes": "Minuty", + + "month": "Měsíc", + "months.april": "Duben", + "months.august": "Srpen", + "months.december": "Prosinec", + "months.february": "Únor", + "months.january": "Leden", + "months.july": "\u010cervenec", + "months.june": "\u010cerven", + "months.march": "B\u0159ezen", + "months.may": "Kv\u011bten", + "months.november": "Listopad", + "months.october": "\u0158\u00edjen", + "months.september": "Z\u00e1\u0159\u00ed", + + "more": "Více", + "move": "Přesunout", + "name": "Jméno", + "next": "Další", + "night": "Noc", + "no": "ne", + "off": "vypnuto", + "on": "zapnuto", + "open": "Otevřít", + "open.newWindow": "Otevřít v novém okně", + "option": "Možnost", + "options": "Možnosti", + "options.none": "Žádné možnosti", + "options.all": "Zobrazit všech {count} možností", + + "orientation": "Orientace", + "orientation.landscape": "Na šířku", + "orientation.portrait": "Na výšku", + "orientation.square": "Čtverec", + + "page": "Stránka", + "page.blueprint": "Tento typ stránky nemá blueprint. Blueprint můžete definovat v /site/blueprints/pages/{blueprint}.yml", + "page.changeSlug": "Zm\u011bnit URL", + "page.changeSlug.fromTitle": "Vytvo\u0159it z n\u00e1zvu", + "page.changeStatus": "Změnit status", + "page.changeStatus.position": "Vyberte prosím pozici", + "page.changeStatus.select": "Vybrat nový status", + "page.changeTemplate": "Změnit šablonu", + "page.changeTemplate.notice": "Změna šablony stránky odstraní obsah pro pole, jejichž typy se neshodují. Používejte obezřetně.", + "page.create": "Vytvořit jako {status}", + "page.delete.confirm": "Opravdu chcete smazat tuto str\u00e1nku?", + "page.delete.confirm.subpages": "Tato stránka má podstránky.
Všechny podstránky budou vymazány.", + "page.delete.confirm.title": "Pro potvrzení zadejte titulek stránky", + "page.duplicate.appendix": "Kopírovat", + "page.duplicate.files": "Kopírovat soubory", + "page.duplicate.pages": "Kopírovat stránky", + "page.move": "Přesunout stránku", + "page.sort": "Změnit pozici", + "page.status": "Stav", + "page.status.draft": "Koncept", + "page.status.draft.description": "Stránka je ve stavu konceptu a je viditelná pouze pro přihlášené editory, nebo přes tajný odkaz", + "page.status.listed": "Veřejná", + "page.status.listed.description": "Stránka je zveřejněná pro všechny", + "page.status.unlisted": "Neveřejná", + "page.status.unlisted.description": "Tato stránka je dostupná pouze přes URL.", + + "pages": "Stránky", + "pages.empty": "Zatím žádné stránky", + "pages.status.draft": "Koncepty", + "pages.status.listed": "Zveřejněno", + "pages.status.unlisted": "Neveřejná", + + "pagination.page": "Stránka", + + "password": "Heslo", + "paste": "Vložit", + "paste.after": "Vložit za", + "paste.success": "{count} vloženo!", + "pixel": "Pixel", + "plugin": "Doplňek", + "plugins": "Doplňky", + "prev": "Předchozí", + "preview": "Náhled", + "remove": "Odstranit", + "rename": "Přejmenovat", + "renew": "Obnovit", + "replace": "Nahradit", + "replace.with": "Nahradit pomocí", + "retry": "Zkusit znovu", + "revert": "Zahodit", + "revert.confirm": "Opravdu chcete smazat všechny provedené změny?", + + "role": "Role", + "role.admin.description": "Administrátor má všechna práva", + "role.admin.title": "Administrátor", + "role.all": "Vše", + "role.empty": "Neexistují uživatelé s touto rolí", + "role.description.placeholder": "Žádný popis", + "role.nobody.description": "Toto je výchozí role bez jakýchkoli oprávnění", + "role.nobody.title": "Nikdo", + + "save": "Ulo\u017eit", + "search": "Hledat", + "search.min": "Pro vyhledání zadejte alespoň {min} znaky", + "search.all": "Zobrazit všech {count} výsledků", + "search.results.none": "Žádné výsledky", + + "section.invalid": "Sekce je neplatná", + "section.required": "Sekce musí být vyplněna", + + "security": "Zabezpečení", + "select": "Vybrat", + "server": "Server", + "settings": "Nastavení", + "show": "Zobrazit", + "site.blueprint": "Hlavní panel nemá blueprint. Blueprint můžete definovat v /site/blueprints/site.yml", + "size": "Velikost", + "slug": "P\u0159\u00edpona URL", + "sort": "Řadit", + "sort.drag": "Táhnout pro změnu řazení ...", + "split": "Rozdělit", + + "stats.empty": "Žádná hlášení", + "status": "Stav", + + "system.info.copy": "Copy info", + "system.info.copied": "System info copied", + "system.issues.content": "Složka content je zřejmě přístupná zvenčí", + "system.issues.eol.kirby": "Instalovaná verze Kirby dosáhla konce životnosti a nebude již dále dostávat bezpečnostní aktualizace", + "system.issues.eol.plugin": "Instalovaná verze doplňku { plugin } dosáhla konce životnosti a nebude již dále dostávat bezpečnostní aktualizace", + "system.issues.eol.php": "Instalovaná verze PHP { release } dosálhla konce životnosti a nebude již dále dostávat bezpečností aktualizace", + "system.issues.debug": "Debug mode musí být v produkci vypnutý", + "system.issues.git": "Složka .git je zřejmě přístupná zvenčí", + "system.issues.https": "Pro všechny stránky doporučujeme používat protokol HTTPS", + "system.issues.kirby": "Složka kirby je zřejmě přístupná zvenčí", + "system.issues.site": "Složka site je zřejmě přístupná zvenčí", + "system.issues.vulnerability.kirby": "Vaše instalace může být ovlivněna následující zranitelností (stupeň vážnosti - { severity }): { description }", + "system.issues.vulnerability.plugin": "Vaše instalace může být ovlivněna následující zranitelností v doplňku { plugin } (stupeň vážnosti - { severity }): { description }", + "system.updateStatus": "Status aktualizací", + "system.updateStatus.error": "Nepodařilo se zkontrolovat aktualizace", + "system.updateStatus.not-vulnerable": "Žádné známé zranitelnosti", + "system.updateStatus.security-update": "Je dostupná bezplatná bezpečnostní aktualizace { version }", + "system.updateStatus.security-upgrade": "Je dostupný upgrade { version } s bezpečnostními opravami", + "system.updateStatus.unreleased": "Nevydaná verze", + "system.updateStatus.up-to-date": "Aktuální", + "system.updateStatus.update": "Je dostupná bezplatná nová verze { version }", + "system.updateStatus.upgrade": "Je dostupný upgrade na verzi { version }", + + "tel": "Telefon", + "tel.placeholder": "+49123456789", + "template": "\u0160ablona", + "title": "Název", + "today": "Dnes", + + "toolbar.button.clear": "Odstranit formátování", + "toolbar.button.code": "Kód", + "toolbar.button.bold": "Tu\u010dn\u00fd text", + "toolbar.button.email": "Email", + "toolbar.button.headings": "Nadpisy", + "toolbar.button.heading.1": "Nadpis 1", + "toolbar.button.heading.2": "Nadpis 2", + "toolbar.button.heading.3": "Nadpis 3", + "toolbar.button.heading.4": "Nadpis 4", + "toolbar.button.heading.5": "Nadpis 5", + "toolbar.button.heading.6": "Nadpis 6", + "toolbar.button.italic": "Kurz\u00edva", + "toolbar.button.file": "Soubor", + "toolbar.button.file.select": "Vyberte soubor", + "toolbar.button.file.upload": "Nahrajte soubor", + "toolbar.button.link": "Odkaz", + "toolbar.button.paragraph": "Odstavec", + "toolbar.button.strike": "Přeškrtnutí", + "toolbar.button.sub": "Dolní index", + "toolbar.button.sup": "Horní index", + "toolbar.button.ol": "Číslovaný seznam", + "toolbar.button.underline": "Podtržení", + "toolbar.button.ul": "Odrážkový seznam", + + "translation.author": "Kirby tým", + "translation.direction": "ltr", + "translation.name": "\u010cesky", + "translation.locale": "cs_CZ", + + "type": "Typ", + + "upload": "Nahrát", + "upload.error.cantMove": "Nahraný soubor nemohl být přesunut", + "upload.error.cantWrite": "Zápis souboru na disk se nezdařil", + "upload.error.default": "Soubor se nepodařilo nahrát", + "upload.error.extension": "Nahrávání souboru přerušeno rozšířením.", + "upload.error.formSize": "Velikost nahrávaného souboru převyšuje omezení stanovené direktivou MAX_FILE_SIZE", + "upload.error.iniPostSize": "Velikost nahrávaného souboru převyšuje omezení stanovené direktivou post_max_size, která je nastavena v php.ini", + "upload.error.iniSize": "Velikost nahrávaného souboru převyšuje omezení stanovené direktivou upload_max_filesize, která je nastavena v php.ini ", + "upload.error.noFile": "Nebyl nahrán žádný soubor", + "upload.error.noFiles": "Nebyly nahrány žádné soubory", + "upload.error.partial": "Soubor byl nahrán pouze z části", + "upload.error.tmpDir": "Chybí dočasná složka", + "upload.errors": "Chyba", + "upload.progress": "Nahrávání...", + + "url": "Url", + "url.placeholder": "https://example.com", + + "user": "Uživatel", + "user.blueprint": "Pro tuto uživatelskou roli můžete definovat další sekce a pole v /site/blueprints/users/{blueprint}.yml", + "user.changeEmail": "Změnit email", + "user.changeLanguage": "Změnit jazyk", + "user.changeName": "Přejmenovat tohoto uživatele", + "user.changePassword": "Změnit heslo", + "user.changePassword.new": "Nové heslo", + "user.changePassword.new.confirm": "Potvrdit nové heslo...", + "user.changeRole": "Změnit roli", + "user.changeRole.select": "Vybrat novou roli", + "user.create": "Přidat nového uživatele", + "user.delete": "Smazat tohoto uživatele", + "user.delete.confirm": "Opravdu chcete smazat tohoto u\u017eivatele?", + + "users": "Uživatelé", + + "version": "Verze Kirby", + "version.current": "Současná verze", + "version.latest": "Poslední verze", + "versionInformation": "Informace o verzi", + + "view.account": "V\u00e1\u0161 \u00fa\u010det", + "view.installation": "Instalace", + "view.languages": "Jazyky", + "view.resetPassword": "Resetovat heslo", + "view.site": "Stránka", + "view.system": "Systém", + "view.users": "U\u017eivatel\u00e9", + + "welcome": "Vítejte", + "year": "Rok", + "yes": "ano" +} diff --git a/kirby/i18n/translations/da.json b/kirby/i18n/translations/da.json new file mode 100644 index 0000000..dfd45e8 --- /dev/null +++ b/kirby/i18n/translations/da.json @@ -0,0 +1,730 @@ +{ + "account.changeName": "Ændre dit navn", + "account.delete": "Slet din konto", + "account.delete.confirm": "Ønsker du virkelig at slette din konto? Du vil blive logget ud med det samme. Din konto kan ikke gendannes.", + + "activate": "Activate", + "add": "Ny", + "alpha": "Alpha", + "author": "Forfatter", + "avatar": "Profilbillede", + "back": "Tilbage", + "cancel": "Annuller", + "change": "\u00c6ndre", + "close": "Luk", + "changes": "Changes", + "confirm": "Gem", + "collapse": "Fold sammen", + "collapse.all": "Fold alle sammen", + "color": "Color", + "coordinates": "Coordinates", + "copy": "Kopier", + "copy.all": "Kopier alle", + "copy.success": "{count} copied!", + "create": "Opret", + "custom": "Custom", + + "date": "Dato", + "date.select": "Vælg en dato", + + "day": "Dag", + "days.fri": "Fre", + "days.mon": "Man", + "days.sat": "L\u00f8r", + "days.sun": "S\u00f8n", + "days.thu": "Tor", + "days.tue": "Tir", + "days.wed": "Ons", + + "debugging": "Fejlfinding", + + "delete": "Slet", + "delete.all": "Slet alle", + + "dialog.fields.empty": "This dialog has no fields", + "dialog.files.empty": "Ingen filer kan vælges", + "dialog.pages.empty": "Ingen sider kan vælges", + "dialog.text.empty": "This dialog does not define any text", + "dialog.users.empty": "Ingen brugere kan vælges", + + "dimensions": "Dimensioner", + "disable": "Disable", + "disabled": "Deaktiveret", + "discard": "Kass\u00e9r", + + "drawer.fields.empty": "This drawer has no fields", + + "domain": "Domain", + "download": "Download", + "duplicate": "Dupliker", + + "edit": "Rediger", + + "email": "Email", + "email.placeholder": "mail@eksempel.dk", + + "enter": "Enter", + "entries": "Entries", + "entry": "Entry", + + "environment": "Miljø", + + "error": "Fejl", + "error.access.code": "Ugyldig kode", + "error.access.login": "Ugyldigt log ind", + "error.access.panel": "Du har ikke adgang til panelet", + "error.access.view": "Du har ikke adgang til denne del af panelet", + + "error.avatar.create.fail": "Profilbilledet kunne blev ikke uploadet ", + "error.avatar.delete.fail": "Profilbilledet kunne ikke slettes", + "error.avatar.dimensions.invalid": "Hold venligst bredte og højde på billedet under 3000 pixels", + "error.avatar.mime.forbidden": "Uacceptabel fil-type", + + "error.blueprint.notFound": "Blueprint \"{name}\" kunne ikke indlæses", + + "error.blocks.max.plural": "Du må ikke tilføje flere end {max} blokke", + "error.blocks.max.singular": "Du må ikke tilføje mere end een blok", + "error.blocks.min.plural": "Du skal tilføje minimum {min} blokke", + "error.blocks.min.singular": "Du skal tilføje minimum een blok", + "error.blocks.validation": "There's an error on the \"{field}\" field in block {index} using the \"{fieldset}\" block type", + + "error.cache.type.invalid": "Invalid cache type \"{type}\"", + + "error.email.preset.notFound": "Email preset \"{name}\" findes ikke", + + "error.field.converter.invalid": "Ugyldig converter \"{converter}\"", + "error.field.type.missing": "Field \"{ name }\": The field type \"{ type }\" does not exist", + + "error.file.changeName.empty": "Navn kan ikke efterlades tomt", + "error.file.changeName.permission": "Du har ikke tilladelse til at ændre navnet på filen \"{filename}\"", + "error.file.changeTemplate.invalid": "The template for the file \"{id}\" cannot be changed to \"{template}\" (valid: \"{blueprints}\")", + "error.file.changeTemplate.permission": "You are not allowed to change the template for the file \"{id}\"", + + "error.file.duplicate": "En fil med navnet \"{filename}\" eksisterer allerede", + "error.file.extension.forbidden": "Uacceptabel fil-endelse", + "error.file.extension.invalid": "Ugyldig endelse: {extension}", + "error.file.extension.missing": "Du kan ikke uploade filer uden fil-endelse", + "error.file.maxheight": "Højden på billedet af billedet må ikke være større end {height} pixels", + "error.file.maxsize": "Filen er for stor", + "error.file.maxwidth": "Bredden af billedet må ikke være større end {width} pixels", + "error.file.mime.differs": "Den uploadede fil skal være af samme mime type \"{mime}\"", + "error.file.mime.forbidden": "Media typen \"{mime}\" er ikke tilladt", + "error.file.mime.invalid": "Ugyldig mime type: {mime}", + "error.file.mime.missing": "Media typen for \"{filename}\" kan ikke bestemmes", + "error.file.minheight": "Højden af billedet skal mindst være {height} pixels", + "error.file.minsize": "Filen er for lille", + "error.file.minwidth": "Bredden af billedet skal mindst være {width} pixels", + "error.file.name.unique": "The filename must be unique", + "error.file.name.missing": "Filnavn må ikke være tomt", + "error.file.notFound": "Filen kunne ikke findes", + "error.file.orientation": "Formatet på billedet skal være \"{orientation}\"", + "error.file.type.forbidden": "Du har ikke tilladelse til at uploade {type} filer", + "error.file.type.invalid": "Ugyldig filtype: {type}", + "error.file.undefined": "Filen kunne ikke findes", + + "error.form.incomplete": "Ret venligst alle fejl i formularen...", + "error.form.notSaved": "Formularen kunne ikke gemmes", + + "error.language.code": "Indtast venligst en gyldig kode for sproget", + "error.language.duplicate": "Sproget eksisterer allerede", + "error.language.name": "Indtast venligst et gyldigt navn for sproget", + "error.language.notFound": "Sproget fandtes ikke", + + "error.layout.validation.block": "There's an error on the \"{field}\" field in block {blockIndex} using the \"{fieldset}\" block type in layout {layoutIndex}", + "error.layout.validation.settings": "Der er fejl i layout {index} indstillinger", + + "error.license.domain": "The domain for the license is missing", + "error.license.email": "Indtast venligst en gyldig email adresse", + "error.license.format": "Please enter a valid license code", + "error.license.verification": "Licensen kunne ikke verificeres", + + "error.login.totp.confirm.invalid": "Ugyldig kode", + "error.login.totp.confirm.missing": "Please enter the current code", + + "error.object.validation": "There’s an error in the \"{label}\" field:\n{message}", + + "error.offline": "Panelet er i øjeblikket offline", + + "error.page.changeSlug.permission": "Du kan ikke ændre URL-endelse for \"{slug}\"", + "error.page.changeSlug.reserved": "The path of top-level pages must not start with \"{path}\"", + "error.page.changeStatus.incomplete": "Siden indeholder fejl og kan derfor ikke udgives", + "error.page.changeStatus.permission": "Status for denne side kan ikke ændres", + "error.page.changeStatus.toDraft.invalid": "Siden \"{slug}\" kan ikke konverteres om til en kladde", + "error.page.changeTemplate.invalid": "Skabelonen for siden \"{slug}\" kan ikke ændres", + "error.page.changeTemplate.permission": "Du har ikke tilladelse til at ændre skabelonen for \"{slug}\"", + "error.page.changeTitle.empty": "Titlen kan ikke være tom", + "error.page.changeTitle.permission": "Du har ikke tilladelse til at ændre titlen for \"{slug}\"", + "error.page.create.permission": "Du har ikke tilladelse til at oprette \"{slug}\"", + "error.page.delete": "Siden \"{slug}\" kan ikke slettes", + "error.page.delete.confirm": "Indtast venligst sidens titel for at bekræfte", + "error.page.delete.hasChildren": "Siden har unsersider og kan derfor ikke slettes", + "error.page.delete.permission": "Du har ikke tilladelse til at slette \"{slug}\"", + "error.page.draft.duplicate": "En sidekladde med URL-endelsen \"{slug}\" eksisterer allerede", + "error.page.duplicate": "En side med URL-endelsen \"{slug}\" eksisterer allerede", + "error.page.duplicate.permission": "Du har ikke mulighed for at duplikere \"{slug}\"", + "error.page.move.ancestor": "The page cannot be moved into itself", + "error.page.move.directory": "The page directory cannot be moved", + "error.page.move.duplicate": "A sub page with the URL appendix \"{slug}\" already exists", + "error.page.move.notFound": "The moved page could not be found", + "error.page.move.permission": "You are not allowed to move \"{slug}\"", + "error.page.move.template": "The \"{template}\" template is not accepted as a subpage of \"{parent}\"", + "error.page.notFound": "Siden kunne ikke findes", + "error.page.num.invalid": "Indtast venligst et gyldigt sorteringsnummer. Nummeret kan ikke være negativt.", + "error.page.slug.invalid": "Indtast venligst et gyldigt URL appendix", + "error.page.slug.maxlength": "Navnet skal være kortere end \"{length}\" tegn", + "error.page.sort.permission": "Siden \"{slug}\" kan ikke sorteres", + "error.page.status.invalid": "Sæt venligst en gyldig status for siden", + "error.page.undefined": "Siden kunne ikke findes", + "error.page.update.permission": "Du har ikke tilladelse til at opdatere \"{slug}\"", + + "error.section.files.max.plural": "Du kan ikk tilføje mere end {max} filer til \"{section}\" sektionen", + "error.section.files.max.singular": "Du kan ikke tilføje mere end een fil til \"{section}\" sektionen", + "error.section.files.min.plural": "Sektionen \"{section}\" kræver mindst {min} filer", + "error.section.files.min.singular": "Sektionen \"{section}\" kræver mindst een fil", + + "error.section.pages.max.plural": "Du kan ikke tilføje flere end {max} sider til \"{section}\" sektionen", + "error.section.pages.max.singular": "Du kan ikke tilføje mere end een side til \"{section}\" sektionen", + "error.section.pages.min.plural": "Sektionen \"{section}\" kræver mindst {min} sider", + "error.section.pages.min.singular": "Sektionen \"{section}\" kræver mindst een side", + + "error.section.notLoaded": "Sektionen \"{section}\" kunne ikke indlæses", + "error.section.type.invalid": "Sektionstypen \"{type}\" er ikke gyldig", + + "error.site.changeTitle.empty": "Titlen kan ikke være tom", + "error.site.changeTitle.permission": "Du har ikke tilladelse til at ændre titlen på sitet", + "error.site.update.permission": "Du har ikke tilladelse til at opdatere sitet", + + "error.structure.validation": "There's an error on the \"{field}\" field in row {index}", + + "error.template.default.notFound": "Standardskabelonen eksisterer ikke", + + "error.unexpected": "En uventet fejl opstod! Aktiver debug mode for mere info: https://getkirby.com/docs/reference/system/options/debug", + + "error.user.changeEmail.permission": "Du har ikke tilladelse til at ændre emailen for brugeren \"{name}\"", + "error.user.changeLanguage.permission": "Du har ikke tilladelse til at ændre sproget for brugeren \"{name}\"", + "error.user.changeName.permission": "Du har ikke tilladelse til at ændre navn på brugeren \"{name}\"", + "error.user.changePassword.permission": "Du har ikke tilladelse til at ændre adgangskoden for brugeren \"{name}\"", + "error.user.changeRole.lastAdmin": "Rollen for den sidste admin kan ikke ændres", + "error.user.changeRole.permission": "Du har ikke tilladelse til at ændre rollen for brugeren \"{name}\"", + "error.user.changeRole.toAdmin": "Du har ikke tilladelse til at tildele nogen admin rollen", + "error.user.create.permission": "Du har ikke tilladelse til at oprette denne bruger", + "error.user.delete": "Brugeren kunne ikke slettes", + "error.user.delete.lastAdmin": "Du kan ikke slette den sidste admin", + "error.user.delete.lastUser": "Den sidste bruger kan ikke slettes", + "error.user.delete.permission": "Du har ikke tilladelse til at slette denne bruger", + "error.user.duplicate": "En bruger med email adresse \"{email}\" eksisterer allerede", + "error.user.email.invalid": "Indtast venligst en gyldig email adresse", + "error.user.language.invalid": "Indtast venligst et gyldigt sprog", + "error.user.notFound": "Brugeren kunne ikke findes", + "error.user.password.excessive": "Please enter a valid password. Passwords must not be longer than 1000 characters.", + "error.user.password.invalid": "Indtast venligst en gyldig adgangskode. Adgangskoder skal minimum være 8 tegn lange.", + "error.user.password.notSame": "Bekr\u00e6ft venligst adgangskoden", + "error.user.password.undefined": "Brugeren har ikke en adgangskode", + "error.user.password.wrong": "Forkert adgangskode", + "error.user.role.invalid": "Indtast venligst en gyldig rolle", + "error.user.undefined": "Brugeren kunne ikke findes", + "error.user.update.permission": "Du har ikke tilladelse til at opdatere brugeren \"{name}\"", + + "error.validation.accepted": "Bekræft venligst", + "error.validation.alpha": "Indtast venligst kun bogstaver imellem a-z", + "error.validation.alphanum": "Indtast venligst kun bogstaver og tal imellem a-z eller 0-9", + "error.validation.anchor": "Please enter a correct link anchor", + "error.validation.between": "Indtast venligst en værdi imellem \"{min}\" og \"{max}\"", + "error.validation.boolean": "Venligst bekræft eller afvis", + "error.validation.color": "Please enter a valid color in the {format} format", + "error.validation.contains": "Indtast venligst en værdi der indeholder \"{needle}\"", + "error.validation.date": "Indtast venligst en gyldig dato", + "error.validation.date.after": "Indtast venligst en dato efter {date}", + "error.validation.date.before": "Indtast venligst en dato før {date}", + "error.validation.date.between": "Indtast venligst en dato imellem {min} og {max}", + "error.validation.denied": "Venligst afvis", + "error.validation.different": "Værdien må ikke være \"{other}\"", + "error.validation.email": "Indtast venligst en gyldig email adresse", + "error.validation.endswith": "Værdi skal ende med \"{end}\"", + "error.validation.filename": "Indtast venligst et gyldigt filnavn", + "error.validation.in": "Indtast venligst en af følgende: ({in})", + "error.validation.integer": "Indtast et gyldigt tal", + "error.validation.ip": "Indtast en gyldig IP adresse", + "error.validation.less": "Indtast venligst en værdi mindre end {max}", + "error.validation.linkType": "The link type is not allowed", + "error.validation.match": "Værdien matcher ikke det forventede mønster", + "error.validation.max": "Indtast venligst en værdi lig med eller lavere end {max}", + "error.validation.maxlength": "Indtast venligst en kortere værdi. (maks. {max} karakterer)", + "error.validation.maxwords": "Indtast ikke flere end {max} ord", + "error.validation.min": "Indtast en værdi lig med eller højere end {min}", + "error.validation.minlength": "Indtast venligst en længere værdi. (min. {min} karakterer)", + "error.validation.minwords": "Indtast venligst mindst {min} ord", + "error.validation.more": "Indtast venligst en værdi større end {min}", + "error.validation.notcontains": "Indtast venligst en værdi der ikke indeholder \"{needle}\"", + "error.validation.notin": "Indtast venligst ikke nogen af følgende: ({notIn})", + "error.validation.option": "Vælg venligst en gyldig mulighed", + "error.validation.num": "Indtast venligst et gyldigt nummer", + "error.validation.required": "Indtast venligst noget", + "error.validation.same": "Indtast venligst \"{other}\"", + "error.validation.size": "Størrelsen på værdien skal være \"{size}\"", + "error.validation.startswith": "Værdien skal starte med \"{start}\"", + "error.validation.tel": "Please enter an unformatted phone number", + "error.validation.time": "Indtast venligst et gyldigt tidspunkt", + "error.validation.time.after": "Indtast venligst et tidspunkt efter {time}", + "error.validation.time.before": "Indtast venligst et tidspunkt inden {time}", + "error.validation.time.between": "Indtast venligst et tidspunkt imellem {min} og {max}", + "error.validation.uuid": "Please enter a valid UUID", + "error.validation.url": "Indtast venligst en gyldig URL", + + "expand": "Fold ud", + "expand.all": "Fold alle ud", + + "field.invalid": "The field is invalid", + "field.required": "Feltet er påkrævet", + "field.blocks.changeType": "Skift type", + "field.blocks.code.name": "Kode", + "field.blocks.code.language": "Sprog", + "field.blocks.code.placeholder": "Din kode …", + "field.blocks.delete.confirm": "Ønsker du virkelig at slette denne blok?", + "field.blocks.delete.confirm.all": "Ønsker du virkelig at slette alle blokke?", + "field.blocks.delete.confirm.selected": "Ønsker du virkelig at slette de valgte blokke?", + "field.blocks.empty": "Ingen blokke endnu", + "field.blocks.fieldsets.empty": "No fieldsets yet", + "field.blocks.fieldsets.label": "Vælg venligst en blok type", + "field.blocks.fieldsets.paste": "Press {{ shortcut }} to import layouts/blocks from your clipboard Only those allowed in the current field will get inserted.", + "field.blocks.gallery.name": "Galleri", + "field.blocks.gallery.images.empty": "Ingen billeder endnu", + "field.blocks.gallery.images.label": "Billeder", + "field.blocks.heading.level": "Niveau", + "field.blocks.heading.name": "Overskrift", + "field.blocks.heading.text": "Tekst", + "field.blocks.heading.placeholder": "Overskrift …", + "field.blocks.image.alt": "Alternativ tekst", + "field.blocks.image.caption": "Billedtekst", + "field.blocks.image.crop": "Beskær", + "field.blocks.image.link": "Link", + "field.blocks.image.location": "Placering", + "field.blocks.image.location.internal": "This website", + "field.blocks.image.location.external": "External source", + "field.blocks.image.name": "Billede", + "field.blocks.image.placeholder": "Vælg et billede", + "field.blocks.image.ratio": "Størrelsesforhold", + "field.blocks.image.url": "Billede URL", + "field.blocks.line.name": "Linje", + "field.blocks.list.name": "Liste", + "field.blocks.markdown.name": "Markdown", + "field.blocks.markdown.label": "Tekst", + "field.blocks.markdown.placeholder": "Markdown …", + "field.blocks.quote.name": "Citat", + "field.blocks.quote.text.label": "Tekst", + "field.blocks.quote.text.placeholder": "Citat …", + "field.blocks.quote.citation.label": "Citeret af", + "field.blocks.quote.citation.placeholder": "af …", + "field.blocks.text.name": "Tekst", + "field.blocks.text.placeholder": "Tekst …", + "field.blocks.video.autoplay": "Autoplay", + "field.blocks.video.caption": "Billedtekst", + "field.blocks.video.controls": "Controls", + "field.blocks.video.location": "Placering", + "field.blocks.video.loop": "Loop", + "field.blocks.video.muted": "Muted", + "field.blocks.video.name": "Video", + "field.blocks.video.placeholder": "Indtast URL til en video", + "field.blocks.video.poster": "Poster", + "field.blocks.video.preload": "Preload", + "field.blocks.video.url.label": "Video-URL", + "field.blocks.video.url.placeholder": "https://youtube.com/?v=", + + "field.files.empty": "Ingen filer valgt endnu", + + "field.layout.change": "Change layout", + "field.layout.delete": "Slet layout", + "field.layout.delete.confirm": "Ønsker du virkelig at slette dette layout", + "field.layout.delete.confirm.all": "Do you really want to delete all layouts?", + "field.layout.empty": "Ingen rækker endnu", + "field.layout.select": "Vælg et layout", + + "field.object.empty": "No information yet", + + "field.pages.empty": "Ingen sider valgt endnu", + + "field.structure.delete.confirm": "\u00d8nsker du virkelig at slette denne indtastning?", + "field.structure.delete.confirm.all": "Do you really want to delete all entries?", + "field.structure.empty": "Ingen indtastninger endnu.", + + "field.users.empty": "Ingen brugere er valgt", + + "fields.empty": "No fields yet", + + "file": "File", + "file.blueprint": "Denne fil har intet blueprint endnu. Du kan definere opsætningen i /site/blueprints/files/{blueprint}.yml", + "file.changeTemplate": "Skift skabelon", + "file.changeTemplate.notice": "Changing the file's template will remove content for fields that don't match in type. If the new template defines certain rules, e.g. image dimensions, those will also be applied irreversibly. Use with caution.", + "file.delete.confirm": "\u00d8nsker du virkelig at slette denne fil?", + "file.focus.placeholder": "Set focal point", + "file.focus.reset": "Remove focal point", + "file.focus.title": "Focus", + "file.sort": "Skift position", + + "files": "Filer", + "files.empty": "Ingen filer endnu", + + "filter": "Filter", + + "hide": "Skjul", + "hour": "Time", + "hue": "Hue", + "import": "Importer", + "info": "Info", + "insert": "Inds\u00e6t", + "insert.after": "Indsæt efter", + "insert.before": "Indsæt før", + "install": "Installer", + + "installation": "Installation", + "installation.completed": "Panelet er blevet installeret", + "installation.disabled": "Panel installationen er deaktiveret på offentlige servere som standard. Kør venligst installationen på en lokal maskine eller aktiver det med panel.install panel.install muligheden.", + "installation.issues.accounts": "\/site\/accounts er ikke skrivbar", + "installation.issues.content": "Content mappen samt alle underliggende filer og mapper skal v\u00e6re skrivbare.", + "installation.issues.curl": "CURL extension er påkrævet", + "installation.issues.headline": "Panelet kan ikke installeres", + "installation.issues.mbstring": "MB String extension er påkrævet", + "installation.issues.media": "/media mappen eksisterer ikke eller er ikke skrivbar", + "installation.issues.php": "Sikre dig at der benyttes PHP 8+", + "installation.issues.sessions": "/site/sessions mappen eksisterer ikke eller er ikke skrivbar", + + "language": "Sprog", + "language.code": "Kode", + "language.convert": "Gør standard", + "language.convert.confirm": "

Ønsker du virkelig at konvertere {name} til standardsproget? Dette kan ikke fortrydes.

Hvis {name} har uoversat indhold, vil der ikke længere være et gyldigt tilbagefald og dele af dit website vil måske fremstå tomt.

", + "language.create": "Tilføj nyt sprog", + "language.default": "Standardsprog", + "language.delete.confirm": "Ønsker du virkelig at slette sproget {name} inklusiv alle oversættelser? Kan ikke fortrydes!", + "language.deleted": "Sproget er blevet slettet", + "language.direction": "Læseretning", + "language.direction.ltr": "Venstre mod højre", + "language.direction.rtl": "Højre mod venstre", + "language.locale": "PHP locale string", + "language.locale.warning": "Du benytter en brugerdefineret sprogopsætning. Rediger venligst dette i sprogfilen i /site/languages", + "language.name": "Navn", + "language.secondary": "Secondary language", + "language.settings": "Language settings", + "language.updated": "Sproget er blevet opdateret", + "language.variables": "Language variables", + "language.variables.empty": "No translations yet", + + "language.variable.delete.confirm": "Do you really want to delete the variable for {key}?", + "language.variable.key": "Key", + "language.variable.notFound": "The variable could not be found", + "language.variable.value": "Value", + + "languages": "Sprog", + "languages.default": "Standardsprog", + "languages.empty": "Der er ingen sprog endnu", + "languages.secondary": "Sekundære sprog", + "languages.secondary.empty": "Der er ingen sekundære sprog endnu", + + "license": "Kirby licens", + "license.activate": "Activate it now", + "license.activate.label": "Please activate your license", + "license.activate.domain": "Your license will be activated for {host}.", + "license.activate.local": "You are about to activate your Kirby license for your local domain {host}. If this site will be deployed to a public domain, please activate it there instead. If {host} is the domain you want to use your license for, please continue.", + "license.activated": "Activated", + "license.buy": "Køb en licens", + "license.code": "Kode", + "license.code.help": "You received your license code after the purchase via email. Please copy and paste it here.", + "license.code.label": "Indtast venligst din licenskode", + "license.status.active.info": "Includes new major versions until {date}", + "license.status.active.label": "Valid license", + "license.status.demo.info": "This is a demo installation", + "license.status.demo.label": "Demo", + "license.status.inactive.info": "Renew license to update to new major versions", + "license.status.inactive.label": "No new major versions", + "license.status.legacy.bubble": "Ready to renew your license?", + "license.status.legacy.info": "Your license does not cover this version", + "license.status.legacy.label": "Please renew your license", + "license.status.missing.bubble": "Ready to launch your site?", + "license.status.missing.info": "No valid license", + "license.status.missing.label": "Please activate your license", + "license.manage": "Manage your licenses", + "license.purchased": "Purchased", + "license.success": "Tak for din støtte af Kirby", + "license.unregistered.label": "Unregistered", + + "link": "Link", + "link.text": "Link tekst", + + "loading": "Indlæser", + + "lock.unsaved": "Ugemte ændringer", + "lock.unsaved.empty": "Der er ikke flere ændringer der ikke er gamt", + "lock.isLocked": "Unsaved changes by {email}", + "lock.unlock": "Lås op", + "lock.unlock.submit": "Unlock and overwrite unsaved changes by {email}", + "lock.isUnlocked": "Was unlocked by another user", + + "login": "Log ind", + "login.code.label.login": "Log ind kode", + "login.code.label.password-reset": "Sikkerhedskode", + "login.code.placeholder.email": "000 000", + "login.code.placeholder.totp": "000000", + "login.code.text.email": "Hvis din email adresse er registreret er en sikkerhedskode blevet sendt via email.", + "login.code.text.totp": "Please enter the one‑time code from your authenticator app.", + "login.email.login.body": "Hej {user.nameOrEmail},\n\nDu har for nyligt anmodet om en log ind kode til panelet af {site}.\nFølgende log ind kode vil være gyldig i {timeout} minutter:\n\n{code}\n\nHvis du ikke har anmodet om en log ind kode, kan du blot ignorere denne email eller kontakte din administrator hvis du har spørgsmål.\nAf sikkerhedsmæssige årsager, bør du IKKE videresende denne email.", + "login.email.login.subject": "Din log ind kode", + "login.email.password-reset.body": "Hej {user.nameOrEmail},\n\nDu har for nyligt anmodet om kode til nulstilling af adgangskode til panelet af {site}.\nFølgende kode til nulstilling af adgangskode vil være gyldig i {timeout} minutter:\n\n{code}\n\nHvis du ikke har anmodet om kode til nulstilling af adgangskode, kan du blot ignorere denne email eller kontakte din administrator hvis du har spørgsmål.\nAf sikkerhedsmæssige årsager, bør du IKKE videresende denne email.", + "login.email.password-reset.subject": "Din kode til nulstilling af adgangskode", + "login.remember": "Forbliv logget ind", + "login.reset": "Nulstil adgangskode", + "login.toggleText.code.email": "Log ind via email", + "login.toggleText.code.email-password": "Log ind med adgangskode", + "login.toggleText.password-reset.email": "Glemt din adgangskode?", + "login.toggleText.password-reset.email-password": "← Tilbage til log ind", + "login.totp.enable.option": "Set up one‑time codes", + "login.totp.enable.intro": "Authenticator apps can generate one‑time codes that are used as a second factor when signing into your account.", + "login.totp.enable.qr.label": "1. Scan this QR code", + "login.totp.enable.qr.help": "Unable to scan? Add the setup key {secret} manually to your authenticator app.", + "login.totp.enable.confirm.headline": "2. Confirm with generated code", + "login.totp.enable.confirm.text": "Your app generates a new one‑time code every 30 seconds. Enter the current code to complete the setup:", + "login.totp.enable.confirm.label": "Current code", + "login.totp.enable.confirm.help": "After this setup, we will ask you for a one‑time code every time you log in.", + "login.totp.enable.success": "One‑time codes enabled", + "login.totp.disable.option": "Disable one‑time codes", + "login.totp.disable.label": "Enter your password to disable one‑time codes", + "login.totp.disable.help": "In the future, a different second factor like a login code sent via email will be requested when you log in. You can always set up one‑time codes again later.", + "login.totp.disable.admin": "

This will disable one‑time codes for {user}.

In the future, a different second factor like a login code sent via email will be requested when they log in. {user} can set up one‑time codes again after their next login.

", + "login.totp.disable.success": "One‑time codes disabled", + + "logout": "Log ud", + + "merge": "Merge", + "menu": "Menu", + "meridiem": "AM/PM", + "mime": "Medie Type", + "minutes": "Minutter", + + "month": "Måned", + "months.april": "April", + "months.august": "August", + "months.december": "December", + "months.february": "Februar", + "months.january": "Januar", + "months.july": "Juli", + "months.june": "Juni", + "months.march": "Marts", + "months.may": "Maj", + "months.november": "November", + "months.october": "Oktober", + "months.september": "September", + + "more": "Mere", + "move": "Move", + "name": "Navn", + "next": "Næste", + "night": "Night", + "no": "nej", + "off": "Sluk", + "on": "Aktiveret", + "open": "Åben", + "open.newWindow": "Åben i et nyt vindue", + "option": "Option", + "options": "Indstillinger", + "options.none": "Ingen muligheder", + "options.all": "Show all {count} options", + + "orientation": "Orientering", + "orientation.landscape": "Landskab", + "orientation.portrait": "Portræt", + "orientation.square": "Kvadrat", + + "page": "Page", + "page.blueprint": "Denne side har intet blueprint endnu. Du kan definere opsætningen i /site/blueprints/pages/{blueprint}.yml", + "page.changeSlug": "\u00c6ndre URL", + "page.changeSlug.fromTitle": "Generer udfra titel", + "page.changeStatus": "Skift status", + "page.changeStatus.position": "Vælg venligst position", + "page.changeStatus.select": "Vælg en ny status", + "page.changeTemplate": "Skift skabelon", + "page.changeTemplate.notice": "Changing the page's template will remove content for fields that don't match in type. Use with caution.", + "page.create": "Create as {status}", + "page.delete.confirm": "\u00d8nsker du virkelig at slette denne side?", + "page.delete.confirm.subpages": "Denne side har undersider.
Alle undersider vil også blive slettet.", + "page.delete.confirm.title": "Indtast sidens titel for at bekræfte", + "page.duplicate.appendix": "Kopier", + "page.duplicate.files": "Kopier filer", + "page.duplicate.pages": "Kopier sider", + "page.move": "Move page", + "page.sort": "Skift position", + "page.status": "Status", + "page.status.draft": "Kladde", + "page.status.draft.description": "Siden er i kladde udgave og er kun synlig for redaktører der er logget ind eller via hemmeligt link", + "page.status.listed": "Offentlig", + "page.status.listed.description": "Siden er offentlig for enhver", + "page.status.unlisted": "Ulistede", + "page.status.unlisted.description": "Siden er kun tilgængelig via URL", + + "pages": "Sider", + "pages.empty": "Ingen sider endnu", + "pages.status.draft": "Kladder", + "pages.status.listed": "Udgivede", + "pages.status.unlisted": "Ulistede", + + "pagination.page": "Side", + + "password": "Adgangskode", + "paste": "Indsæt", + "paste.after": "Indsæt efter", + "paste.success": "{count} pasted!", + "pixel": "Pixel", + "plugin": "Plugin", + "plugins": "Plugins", + "prev": "Forrige", + "preview": "Forhåndsvisning", + "remove": "Fjern", + "rename": "Omdøb", + "renew": "Renew", + "replace": "Erstat", + "replace.with": "Replace with", + "retry": "Pr\u00f8v igen", + "revert": "Kass\u00e9r", + "revert.confirm": "Ønsker du virkelig at slette all ændringer der ikke er gemt?", + + "role": "Rolle", + "role.admin.description": "Admin har alle rettigheder", + "role.admin.title": "Admin", + "role.all": "All", + "role.empty": "Der er ingen bruger med denne rolle", + "role.description.placeholder": "Ingen beskrivelse", + "role.nobody.description": "Dette er en tilbagefaldsrolle uden rettigheder", + "role.nobody.title": "Ingen", + + "save": "Gem", + "search": "Søg", + "search.min": "Indtast {min} tegn for at søge", + "search.all": "Show all {count} results", + "search.results.none": "Ingen resultater", + + "section.invalid": "The section is invalid", + "section.required": "Sektionen er påkrævet", + + "security": "Security", + "select": "Vælg", + "server": "Server", + "settings": "Indstillinger", + "show": "Vis", + "site.blueprint": "Sitet har intet blueprint endnu. Du kan definere opsætningen i /site/blueprints/site.yml", + "size": "Størrelse", + "slug": "URL-appendiks", + "sort": "Sorter", + "sort.drag": "Drag to sort …", + "split": "Split", + + "stats.empty": "No reports", + "status": "Status", + + "system.info.copy": "Copy info", + "system.info.copied": "System info copied", + "system.issues.content": "The content folder seems to be exposed", + "system.issues.eol.kirby": "Your installed Kirby version has reached end-of-life and will not receive further security updates", + "system.issues.eol.plugin": "Your installed version of the { plugin } plugin is has reached end-of-life and will not receive further security updates", + "system.issues.eol.php": "Your installed PHP release { release } has reached end-of-life and will not receive further security updates", + "system.issues.debug": "Debugging must be turned off in production", + "system.issues.git": "The .git folder seems to be exposed", + "system.issues.https": "We recommend HTTPS for all your sites", + "system.issues.kirby": "The kirby folder seems to be exposed", + "system.issues.site": "The site folder seems to be exposed", + "system.issues.vulnerability.kirby": "Your installation might be affected by the following vulnerability ({ severity } severity): { description }", + "system.issues.vulnerability.plugin": "Your installation might be affected by the following vulnerability in the { plugin } plugin ({ severity } severity): { description }", + "system.updateStatus": "Update status", + "system.updateStatus.error": "Could not check for updates", + "system.updateStatus.not-vulnerable": "No known vulnerabilities", + "system.updateStatus.security-update": "Free security update { version } available", + "system.updateStatus.security-upgrade": "Upgrade { version } with security fixes available", + "system.updateStatus.unreleased": "Unreleased version", + "system.updateStatus.up-to-date": "Up to date", + "system.updateStatus.update": "Free update { version } available", + "system.updateStatus.upgrade": "Upgrade { version } available", + + "tel": "Phone", + "tel.placeholder": "+49123456789", + "template": "Skabelon", + "title": "Titel", + "today": "Idag", + + "toolbar.button.clear": "Clear formatting", + "toolbar.button.code": "Kode", + "toolbar.button.bold": "Fed tekst", + "toolbar.button.email": "Email", + "toolbar.button.headings": "Overskrifter", + "toolbar.button.heading.1": "Overskrift 1", + "toolbar.button.heading.2": "Overskrift 2", + "toolbar.button.heading.3": "Overskrift 3", + "toolbar.button.heading.4": "Overskrift 4", + "toolbar.button.heading.5": "Overskrift 5", + "toolbar.button.heading.6": "Overskrift 6", + "toolbar.button.italic": "Kursiv tekst", + "toolbar.button.file": "Fil", + "toolbar.button.file.select": "Vælg en fil", + "toolbar.button.file.upload": "Upload en fil", + "toolbar.button.link": "Link", + "toolbar.button.paragraph": "Afsnit", + "toolbar.button.strike": "Gennemstreg", + "toolbar.button.sub": "Subscript", + "toolbar.button.sup": "Superscript", + "toolbar.button.ol": "Ordnet liste", + "toolbar.button.underline": "Understreg", + "toolbar.button.ul": "Punktliste", + + "translation.author": "Kirby Team", + "translation.direction": "ltr", + "translation.name": "Dansk", + "translation.locale": "da_DK", + + "type": "Type", + + "upload": "Upload", + "upload.error.cantMove": "Den uploadede fil kunne ikke flyttes", + "upload.error.cantWrite": "Kunne ikke skrive fil til disk", + "upload.error.default": "Filen kunne ikke uploades", + "upload.error.extension": "Upload af filen blev stoppet af dens type", + "upload.error.formSize": "Filen overskrider MAX_FILE_SIZE direktivet der er specificeret for formularen", + "upload.error.iniPostSize": "FIlen overskrider post_max_size direktivet i php.ini", + "upload.error.iniSize": "FIlen overskrider upload_max_filesize direktivet i php.ini", + "upload.error.noFile": "Ingen fil blev uploadet", + "upload.error.noFiles": "Ingen filer blev uploadet", + "upload.error.partial": "Den uploadede fil blev kun delvist uploadet", + "upload.error.tmpDir": "Der mangler en midlertidig mappe", + "upload.errors": "Fejl", + "upload.progress": "Uploader...", + + "url": "Url", + "url.placeholder": "https://example.com", + + "user": "Bruger", + "user.blueprint": "Du kan definere yderligere sektioner og formular felter for denne brugerrolle i /site/blueprints/users/{blueprint}.yml", + "user.changeEmail": "Skift email", + "user.changeLanguage": "Skift sprog", + "user.changeName": "Omdøb denne bruger", + "user.changePassword": "Skift adgangskode", + "user.changePassword.new": "Ny adgangskode", + "user.changePassword.new.confirm": "Bekræft den nye adgangskode...", + "user.changeRole": "Skift rolle", + "user.changeRole.select": "Vælg en ny rolle", + "user.create": "Tilføj en ny bruger", + "user.delete": "Slet denne bruger", + "user.delete.confirm": "\u00d8nsker du virkelig at slette denne bruger?", + + "users": "Brugere", + + "version": "Kirby version", + "version.current": "Current version", + "version.latest": "Latest version", + "versionInformation": "Version information", + + "view.account": "Din konto", + "view.installation": "Installation", + "view.languages": "Sprog", + "view.resetPassword": "Nulstil adgangskode", + "view.site": "Website", + "view.system": "System", + "view.users": "Brugere", + + "welcome": "Velkommen", + "year": "År", + "yes": "ja" +} diff --git a/kirby/i18n/translations/de.json b/kirby/i18n/translations/de.json new file mode 100644 index 0000000..040645c --- /dev/null +++ b/kirby/i18n/translations/de.json @@ -0,0 +1,730 @@ +{ + "account.changeName": "Deinen Namen ändern", + "account.delete": "Deinen Account löschen", + "account.delete.confirm": "Willst du deinen Account wirklich löschen? Du wirst sofort danach abgemeldet. Dein Account kann nicht wieder hergestellt werden.", + + "activate": "Aktivieren", + "add": "Hinzuf\u00fcgen", + "alpha": "Alpha", + "author": "Autor", + "avatar": "Profilbild", + "back": "Zurück", + "cancel": "Abbrechen", + "change": "\u00c4ndern", + "close": "Schlie\u00dfen", + "changes": "Änderungen", + "confirm": "OK", + "collapse": "Zusammenklappen", + "collapse.all": "Alle zusammenklappen", + "color": "Farbe", + "coordinates": "Koordinaten", + "copy": "Kopieren", + "copy.all": "Alle kopieren", + "copy.success": "{count} kopiert!", + "create": "Erstellen", + "custom": "Benutzerdefiniert", + + "date": "Datum", + "date.select": "Datum auswählen", + + "day": "Tag", + "days.fri": "Fr", + "days.mon": "Mo", + "days.sat": "Sa", + "days.sun": "So", + "days.thu": "Do", + "days.tue": "Di", + "days.wed": "Mi", + + "debugging": "Debugging", + + "delete": "L\u00f6schen", + "delete.all": "Alle löschen", + + "dialog.fields.empty": "Der Dialog hat keine Felder", + "dialog.files.empty": "Keine verfügbaren Dateien", + "dialog.pages.empty": "Keine verfügbaren Seiten", + "dialog.text.empty": "Dieser Dialog definiert keinen Text", + "dialog.users.empty": "Keine verfügbaren Accounts", + + "dimensions": "Maße", + "disable": "Deaktivieren", + "disabled": "Gesperrt", + "discard": "Verwerfen", + + "drawer.fields.empty": "Die Schublade hat keine Felder", + + "domain": "Domain", + "download": "Download", + "duplicate": "Duplizieren", + + "edit": "Bearbeiten", + + "email": "E-Mail", + "email.placeholder": "mail@beispiel.de", + + "enter": "Enter", + "entries": "Einträge", + "entry": "Eintrag", + + "environment": "Umgebung", + + "error": "Fehler", + "error.access.code": "Ungültiger Code", + "error.access.login": "Ungültige Zugangsdaten", + "error.access.panel": "Du hast keinen Zugang zum Panel", + "error.access.view": "Du hast keinen Zugriff auf diesen Teil des Panels", + + "error.avatar.create.fail": "Das Profilbild konnte nicht hochgeladen werden", + "error.avatar.delete.fail": "Das Profilbild konnte nicht gel\u00f6scht werden", + "error.avatar.dimensions.invalid": "Bitte lade ein Profilbild hoch, das nicht breiter oder höher als 3000 Pixel ist.", + "error.avatar.mime.forbidden": "Das Profilbild muss vom Format JPEG oder PNG sein", + + "error.blueprint.notFound": "Das Blueprint \"{name}\" konnte nicht geladen werden.", + + "error.blocks.max.plural": "Bitte füge nicht mehr als {max} Blöcke hinzu", + "error.blocks.max.singular": "Bitte füge nicht mehr als einen Block hinzu", + "error.blocks.min.plural": "Bitte füge mindestens {min} Blöcke hinzu", + "error.blocks.min.singular": "Bitte füge mindestens einen Block hinzu", + "error.blocks.validation": "Fehler im \"{field}\" Feld in Block {index} mit dem Block Typ \"{fieldset}\"", + + "error.cache.type.invalid": "Ungültiger Cachetyp: \"{type}\"", + + "error.email.preset.notFound": "Die E-Mailvorlage \"{name}\" wurde nicht gefunden", + + "error.field.converter.invalid": "Ungültiger Konverter: \"{converter}\"", + "error.field.type.missing": "Feld \"{ name }\": Der Feldtyp \"{ type }\" existiert nicht", + + "error.file.changeName.empty": "Bitte gib einen Namen an", + "error.file.changeName.permission": "Du darfst den Dateinamen von \"{filename}\" nicht ändern", + "error.file.changeTemplate.invalid": "Die Vorlage für die Datei \"{id}\" kann nicht zu \"{template}\" geändert werden (gültig: \"{blueprints}\")", + "error.file.changeTemplate.permission": "Du kannst die Vorlage für die Datei \"{id}\" nicht ändern", + + "error.file.duplicate": "Eine Datei mit dem Dateinamen \"{filename}\" besteht bereits", + "error.file.extension.forbidden": "Verbotene Dateiendung \"{extension}\"", + "error.file.extension.invalid": "Verbotene Dateiendung \"{extension}\"", + "error.file.extension.missing": "Du kannst keine Dateien ohne Dateiendung hochladen", + "error.file.maxheight": "Die Bildhöhe darf {height} Pixel nicht überschreiten", + "error.file.maxsize": "Die Datei ist zu groß", + "error.file.maxwidth": "Die Bildbreite darf {width} Pixel nicht überschreiten", + "error.file.mime.differs": "Die Datei muss den Medientyp \"{mime}\" haben.", + "error.file.mime.forbidden": "Der Medientyp \"{mime}\" ist nicht erlaubt", + "error.file.mime.invalid": "Ungültiger Dateityp: {mime}", + "error.file.mime.missing": "Der Medientyp für \"{filename}\" konnte nicht erkannt werden", + "error.file.minheight": "Die Bildhöhe muss mindestens {height} Pixel betragen", + "error.file.minsize": "Die Datei ist zu klein", + "error.file.minwidth": "Die Bildbreite muss mindestens {width} Pixel betragen", + "error.file.name.unique": "Der Dateiname besteht bereits", + "error.file.name.missing": "Bitte gib einen Dateinamen an", + "error.file.notFound": "Die Datei \"{filename}\" konnte nicht gefunden werden", + "error.file.orientation": "Das Bildformat ist ungültig. Erwartetes Format: \"{orientation}\"", + "error.file.type.forbidden": "Du kannst keinen {type}-Dateien hochladen", + "error.file.type.invalid": "Ungültiger Dateityp: {mime}", + "error.file.undefined": "Die Datei konnte nicht gefunden werden", + + "error.form.incomplete": "Bitte behebe alle Fehler …", + "error.form.notSaved": "Das Formular konnte nicht gespeichert werden", + + "error.language.code": "Bitte gib einen gültigen Code für die Sprache an", + "error.language.duplicate": "Die Sprache besteht bereits", + "error.language.name": "Bitte gib einen gültigen Namen für die Sprache an", + "error.language.notFound": "Die Sprache konnte nicht gefunden werden", + + "error.layout.validation.block": "Fehler im \"{field}\" Feld in Block {blockIndex} mit dem Blocktyp \"{fieldset}\" in Layout {layoutIndex}", + "error.layout.validation.settings": "Fehler in den Einstellungen von Layout {index}", + + "error.license.domain": "Die Domain für die Lizenz fehlt", + "error.license.email": "Bitte gib eine gültige E-Mailadresse an", + "error.license.format": "Bitte gib einen gültigen Lizenzschlüssel ein", + "error.license.verification": "Die Lizenz konnte nicht verifiziert werden", + + "error.login.totp.confirm.invalid": "Ungültiger Code", + "error.login.totp.confirm.missing": "Bitte gib den aktuellen Code ein", + + "error.object.validation": "Fehler im \"{label}\" Feld:\n{message}", + + "error.offline": "Das Panel ist zur Zeit offline", + + "error.page.changeSlug.permission": "Du darfst die URL der Seite \"{slug}\" nicht ändern", + "error.page.changeSlug.reserved": "Der Pfad für Top-Level Seiten darf nicht mit \"{path}\" beginnen.", + "error.page.changeStatus.incomplete": "Die Seite ist nicht vollständig und kann daher nicht veröffentlicht werden", + "error.page.changeStatus.permission": "Der Status der Seite kann nicht geändert werden", + "error.page.changeStatus.toDraft.invalid": "Die Seite \"{slug}\" kann nicht in einen Entwurf umgewandelt werden", + "error.page.changeTemplate.invalid": "Die Vorlage für die Seite \"{slug}\" kann nicht geändert werden", + "error.page.changeTemplate.permission": "Du kannst die Vorlage für die Seite \"{slug}\" nicht ändern", + "error.page.changeTitle.empty": "Bitte gib einen Titel an", + "error.page.changeTitle.permission": "Du kannst den Titel für die Seite \"{slug}\" nicht ändern", + "error.page.create.permission": "Du kannst die Seite \"{slug}\" nicht anlegen", + "error.page.delete": "Die Seite \"{slug}\" kann nicht gelöscht werden", + "error.page.delete.confirm": "Bitte gib zur Bestätigung den Seitentitel ein", + "error.page.delete.hasChildren": "Die Seite hat Unterseiten und kann nicht gelöscht werden", + "error.page.delete.permission": "Du kannst die Seite \"{slug}\" nicht löschen", + "error.page.draft.duplicate": "Ein Entwurf mit dem URL-Kürzel \"{slug}\" besteht bereits", + "error.page.duplicate": "Eine Seite mit dem URL-Kürzel \"{slug}\" besteht bereits", + "error.page.duplicate.permission": "Du kannst die Seite \"{slug}\" nicht duplizieren", + "error.page.move.ancestor": "Die Seite kann nicht in sich selbst verschoben werden", + "error.page.move.directory": "Der Ordner der Seite kann nicht verschoben werden", + "error.page.move.duplicate": "Eine Seite mit dem URL-Kürzel \"{slug}\" besteht bereits", + "error.page.move.notFound": "Die verschobene Seite kann nicht gefunden werden", + "error.page.move.permission": "Du kannst die Seite \"{slug}\" nicht verschieben", + "error.page.move.template": "Die Vorlage \"{template}\" wird nicht als Unterseite von \"{parent}\" akzeptiert", + "error.page.notFound": "Die Seite \"{slug}\" konnte nicht gefunden werden", + "error.page.num.invalid": "Bitte gib eine gültige Sortierungszahl an. Negative Zahlen sind nicht erlaubt.", + "error.page.slug.invalid": "Bitte gib ein gültiges URL-Kürzel an", + "error.page.slug.maxlength": "Die Pfadlänge darf {length} Zeichen nicht überschreiten", + "error.page.sort.permission": "Die Seite \"{slug}\" kann nicht umsortiert werden", + "error.page.status.invalid": "Bitte gib einen gültigen Seitenstatus an", + "error.page.undefined": "Die Seite konnte nicht gefunden werden", + "error.page.update.permission": "Du kannst die Seite \"{slug}\" nicht editieren", + + "error.section.files.max.plural": "Bitte füge nicht mehr als {max} Dateien zum Bereich \"{section}\" hinzu", + "error.section.files.max.singular": "Bitte füge nicht mehr als eine Datei zum Bereich \"{section}\" hinzu", + "error.section.files.min.plural": "Der Bereich \"{section}\" benötigt mindestens {min} Dateien", + "error.section.files.min.singular": "Der Bereich \"{section}\" benötigt mindestens eine Datei", + + "error.section.pages.max.plural": "Bitte füge nicht mehr als {max} Seiten zum Bereich \"{section}\" hinzu", + "error.section.pages.max.singular": "Bitte füge nicht mehr als eine Seite zum Bereich \"{section}\" hinzu", + "error.section.pages.min.plural": "Der Bereich \"{section}\" benötigt mindestens {min} Seiten", + "error.section.pages.min.singular": "Der Bereich \"{section}\" benötigt mindestens eine Seite", + + "error.section.notLoaded": "Der Bereich \"{name}\" konnte nicht geladen werden", + "error.section.type.invalid": "Der Bereichstyp \"{type}\" ist nicht gültig", + + "error.site.changeTitle.empty": "Bitte gib einen Titel an", + "error.site.changeTitle.permission": "Du kannst den Titel der Seite nicht ändern", + "error.site.update.permission": "Du darfst die Seite nicht bearbeiten", + + "error.structure.validation": "Fehler im Feld \"{field}\" in Zeile {index}", + + "error.template.default.notFound": "Die \"Default\"-Vorlage existiert nicht", + + "error.unexpected": "Ein unerwarteter Fehler ist aufgetreten. Aktiviere den Debug-Modus für weitere Informationen: https://getkirby.com/docs/reference/system/options/debug", + + "error.user.changeEmail.permission": "Du kannst die E-Mailadresse für den Account \"{name}\" nicht ändern", + "error.user.changeLanguage.permission": "Du kannst die Sprache für den Account \"{name}\" nicht ändern", + "error.user.changeName.permission": "Du kannst den Namen für den Account \"{name}\" nicht ändern", + "error.user.changePassword.permission": "Du kannst das Passwort für den Account \"{name}\" nicht ändern", + "error.user.changeRole.lastAdmin": "Die Rolle des letzten Accounts mit Administrationsrechten kann nicht geändert werden", + "error.user.changeRole.permission": "Du kannst die Rolle für den Benutzer \"{name}\" nicht ändern", + "error.user.changeRole.toAdmin": "Du darfst die Admin-Rolle nicht an andere Accounts vergeben", + "error.user.create.permission": "Du darfst diesen Account nicht anlegen", + "error.user.delete": "Der Account \"{name}\" konnte nicht gelöscht werden", + "error.user.delete.lastAdmin": "Du kannst den letzten Account mit Administrationsrechten nicht löschen", + "error.user.delete.lastUser": "Der letzte Account kann nicht gelöscht werden", + "error.user.delete.permission": "Du darfst den Account \"{name}\" nicht löschen", + "error.user.duplicate": "Ein Account mit der E-Mailadresse \"{email}\" besteht bereits", + "error.user.email.invalid": "Bitte gib eine gültige E-Mailadresse an", + "error.user.language.invalid": "Bitte gib eine gültige Sprache an", + "error.user.notFound": "Der Account \"{name}\" wurde nicht gefunden", + "error.user.password.excessive": "Bitte gib ein gültiges Passwort ein. Passwörter dürfen nicht länger als 1000 Zeichen sein.", + "error.user.password.invalid": "Bitte gib ein gültiges Passwort ein. Passwörter müssen mindestens 8 Zeichen lang sein.", + "error.user.password.notSame": "Die Passwörter stimmen nicht überein", + "error.user.password.undefined": "Der Account hat kein Passwort", + "error.user.password.wrong": "Falsches Passwort", + "error.user.role.invalid": "Bitte gib eine gültige Rolle an", + "error.user.undefined": "Der Benutzer wurde nicht gefunden", + "error.user.update.permission": "Du darfst den den Account \"{name}\" nicht bearbeiten", + + "error.validation.accepted": "Bitte bestätige", + "error.validation.alpha": "Bitte gib nur Zeichen zwischen A und Z ein", + "error.validation.alphanum": "Bitte gib nur Zeichen zwischen A und Z und Zahlen zwischen 0 und 9 ein", + "error.validation.anchor": "Bitte gib einen korrekten Anker an", + "error.validation.between": "Bitte gib einen Wert zwischen \"{min}\" und \"{max}\" ein", + "error.validation.boolean": "Bitte bestätige oder lehne ab", + "error.validation.color": "Bitte gib eine gültige Farbe im Format {format} ein", + "error.validation.contains": "Bitte gib einen Wert ein, der \"{needle}\" enthält", + "error.validation.date": "Bitte gib ein gültiges Datum ein", + "error.validation.date.after": "Bitte gib ein Datum nach dem {date} ein", + "error.validation.date.before": "Bitte gib ein Datum vor dem {date} ein", + "error.validation.date.between": "Bitte gib ein Datum zwischen dem {min} und dem {max} ein", + "error.validation.denied": "Bitte lehne die Eingabe ab", + "error.validation.different": "Der Wert darf nicht \"{other}\" sein", + "error.validation.email": "Bitte gib eine gültige E-Mailadresse an", + "error.validation.endswith": "Der Wert muss auf \"{end}\" enden", + "error.validation.filename": "Bitte gib einen gültigen Dateinamen ein", + "error.validation.in": "Bitte gib einen der folgenden Werte ein: ({in})", + "error.validation.integer": "Bitte gib eine ganze Zahl ein", + "error.validation.ip": "Bitte gib eine gültige IP Adresse ein", + "error.validation.less": "Bitte gib einen Wert kleiner als {max} ein", + "error.validation.linkType": "Der Linktyp ist nicht erlaubt", + "error.validation.match": "Der Wert entspricht nicht dem erwarteten Muster", + "error.validation.max": "Bitte gib einen Wert ein, der nicht größer als {max} ist", + "error.validation.maxlength": "Bitte gib einen kürzeren Text ein (max. {max} Zeichen)", + "error.validation.maxwords": "Bitte nutze nicht mehr als {max} Wort(e)", + "error.validation.min": "Bitte gib einen Wert ein, der nicht kleiner als {min} ist", + "error.validation.minlength": "Bitte gib einen längeren Text ein. (min. {min} Zeichen)", + "error.validation.minwords": "Bitte nutze mindestens {min} Wort(e)", + "error.validation.more": "Bitte gib einen größeren Wert als {min} ein", + "error.validation.notcontains": "Bitte gib einen Wert ein, der nicht \"{needle}\" enthält", + "error.validation.notin": "Bitte gib keinen der folgenden Werte ein: ({notIn})", + "error.validation.option": "Bitte wähle eine gültige Option aus", + "error.validation.num": "Bitte gib eine gültige Zahl an", + "error.validation.required": "Bitte gib etwas ein", + "error.validation.same": "Bitte gib \"{other}\" ein", + "error.validation.size": "Die Größe des Wertes muss \"{size}\" sein", + "error.validation.startswith": "Der Wert muss mit \"{start}\" beginnen", + "error.validation.tel": "Bitte gib eine unformatierte Telefonnummer an", + "error.validation.time": "Bitte gib eine gültige Uhrzeit ein", + "error.validation.time.after": "Bitte gib eine Zeit nach {time} ein", + "error.validation.time.before": "Bitte gib eine Zeit vor {time} ein", + "error.validation.time.between": "Bitte gib eine Zeit zwischen {min} und {max} ein", + "error.validation.uuid": "Bitte gib eine gültige UUID an", + "error.validation.url": "Bitte gib eine gültige URL ein", + + "expand": "Aufklappen", + "expand.all": "Alle aufklappen", + + "field.invalid": "Das Feld ist ungültig", + "field.required": "Das Feld ist Pflicht", + "field.blocks.changeType": "Blocktyp ändern", + "field.blocks.code.name": "Code", + "field.blocks.code.language": "Sprache", + "field.blocks.code.placeholder": "Code …", + "field.blocks.delete.confirm": "Willst du diesen Block wirklich löschen?", + "field.blocks.delete.confirm.all": "Willst du wirklich alle Blöcke löschen?", + "field.blocks.delete.confirm.selected": "Willst du wirklich die ausgewählten Blöcke löschen?", + "field.blocks.empty": "Keine Blöcke", + "field.blocks.fieldsets.empty": "Keine Block Definition", + "field.blocks.fieldsets.label": "Bitte wähle einen Blocktyp aus …", + "field.blocks.fieldsets.paste": "Drücke {{ shortcut }} um Layouts/Blocks von deinem Clipboard zu importieren. Nur die, die im aktuellen Feld erlaubt sind werden eingefügt.", + "field.blocks.gallery.name": "Galerie", + "field.blocks.gallery.images.empty": "Keine Bilder", + "field.blocks.gallery.images.label": "Bilder", + "field.blocks.heading.level": "Ebene", + "field.blocks.heading.name": "Überschrift", + "field.blocks.heading.text": "Text", + "field.blocks.heading.placeholder": "Überschrift …", + "field.blocks.image.alt": "Alternativer Text", + "field.blocks.image.caption": "Bildunterschrift", + "field.blocks.image.crop": "Beschneiden", + "field.blocks.image.link": "Link", + "field.blocks.image.location": "Ort", + "field.blocks.image.location.internal": "Diese Webseite", + "field.blocks.image.location.external": "Externe Quelle", + "field.blocks.image.name": "Bild", + "field.blocks.image.placeholder": "Bild auswählen", + "field.blocks.image.ratio": "Seitenverhältnis", + "field.blocks.image.url": "Bild URL", + "field.blocks.line.name": "Linie", + "field.blocks.list.name": "Liste", + "field.blocks.markdown.name": "Markdown", + "field.blocks.markdown.label": "Text", + "field.blocks.markdown.placeholder": "Markdown …", + "field.blocks.quote.name": "Zitat", + "field.blocks.quote.text.label": "Text", + "field.blocks.quote.text.placeholder": "Zitat …", + "field.blocks.quote.citation.label": "Quelle", + "field.blocks.quote.citation.placeholder": "Quelle …", + "field.blocks.text.name": "Text", + "field.blocks.text.placeholder": "Text …", + "field.blocks.video.autoplay": "Autoplay", + "field.blocks.video.caption": "Bildunterschrift", + "field.blocks.video.controls": "Steuerung", + "field.blocks.video.location": "Ort", + "field.blocks.video.loop": "Schleife", + "field.blocks.video.muted": "Stumm", + "field.blocks.video.name": "Video", + "field.blocks.video.placeholder": "Video-URL eingeben", + "field.blocks.video.poster": "Poster", + "field.blocks.video.preload": "Vorladen", + "field.blocks.video.url.label": "Video-URL", + "field.blocks.video.url.placeholder": "https://youtube.com/?v=", + + "field.files.empty": "Keine Dateien ausgewählt", + + "field.layout.change": "Layout ändern", + "field.layout.delete": "Layout löschen", + "field.layout.delete.confirm": "Willst du dieses Layout wirklich löschen?", + "field.layout.delete.confirm.all": "Willst du wirklich alle Layouts löschen?", + "field.layout.empty": "Keine Layouts", + "field.layout.select": "Layout auswählen", + + "field.object.empty": "Noch keine Information", + + "field.pages.empty": "Keine Seiten ausgewählt", + + "field.structure.delete.confirm": "Willst du diesen Eintrag wirklich l\u00f6schen?", + "field.structure.delete.confirm.all": "Möchtest du wirklich alle Einträge löschen?", + "field.structure.empty": "Es bestehen keine Eintr\u00e4ge.", + + "field.users.empty": "Keine Accounts ausgewählt", + + "fields.empty": "Keine Felder", + + "file": "Datei", + "file.blueprint": "Du kannst zusätzliche Felder und Bereiche für diese Datei in /site/blueprints/files/{blueprint}.yml anlegen", + "file.changeTemplate": "Vorlage ändern", + "file.changeTemplate.notice": "Das Ändern der Dateivorlage wird alle Inhalte von Feldern entfernen, deren Feldtypen nicht übereinstimmen. Wenn die neue Vorlage bestimmte Regeln definiert, z.B. Bildabmessungen, werden diese unwiderruflich angewandt. Benutze diese Funktion mit Vorsicht.", + "file.delete.confirm": "Willst du die Datei {filename}
wirklich löschen?", + "file.focus.placeholder": "Fokuspunkt setzen", + "file.focus.reset": "Fokuspunkt entfernen", + "file.focus.title": "Fokus", + "file.sort": "Position ändern", + + "files": "Dateien", + "files.empty": "Keine Dateien", + + "filter": "Filter", + + "hide": "Verbergen", + "hour": "Stunde", + "hue": "Farbton", + "import": "Importieren", + "info": "Info", + "insert": "Einf\u00fcgen", + "insert.after": "Danach einfügen", + "insert.before": "Davor einfügen", + "install": "Installieren", + + "installation": "Installation", + "installation.completed": "Das Panel wurde installiert", + "installation.disabled": "Die Panel-Installation ist auf öffentlichen Servern automatisch deaktiviert. Bitte installiere das Panel auf einem lokalen Server oder aktiviere die Installation gezielt mit der panel.install Option. ", + "installation.issues.accounts": "/site/accounts ist nicht beschreibbar", + "installation.issues.content": "/content existiert nicht oder ist nicht beschreibbar", + "installation.issues.curl": "Die CURL Erweiterung wird benötigt", + "installation.issues.headline": "Das Panel kann nicht installiert werden", + "installation.issues.mbstring": "Die MB String Erweiterung wird benötigt", + "installation.issues.media": "Der /media Ordner ist nicht beschreibbar", + "installation.issues.php": "Bitte verwende PHP 8+", + "installation.issues.sessions": "/site/sessions ist nicht beschreibbar", + + "language": "Sprache", + "language.code": "Code", + "language.convert": "Als Standard auswählen", + "language.convert.confirm": "

Willst du {name} wirklich in die Standardsprache umwandeln? Dieser Schritt kann nicht rückgängig gemacht werden.

Wenn {name} unübersetzte Felder hat, gibt es keine gültigen Standardwerte für diese Felder und Inhalte könnten verloren gehen.

", + "language.create": "Neue Sprache anlegen", + "language.default": "Standardsprache", + "language.delete.confirm": "Willst du {name} inklusive aller Übersetzungen wirklich löschen? Dieser Schritt kann nicht rückgängig gemacht werden!", + "language.deleted": "Die Sprache wurde gelöscht", + "language.direction": "Leserichtung", + "language.direction.ltr": "Von links nach rechts", + "language.direction.rtl": "Von rechts nach links", + "language.locale": "PHP locale string", + "language.locale.warning": "Du nutzt ein angepasstes Setup for PHP Locales. Bitte bearbeite dieses direkt in der entsprechenden Sprachdatei in /site/languages", + "language.name": "Name", + "language.secondary": "Sekundäre Sprachen", + "language.settings": "Spracheinstellungen", + "language.updated": "Die Sprache wurde gespeichert", + "language.variables": "Sprachvariablen", + "language.variables.empty": "Keine Übersetzung", + + "language.variable.delete.confirm": "Willst du wirklich die Variable \"{key}\" entfernen?", + "language.variable.key": "Schlüssel", + "language.variable.notFound": "Die Variable konnte nicht gefunden werden", + "language.variable.value": "Wert", + + "languages": "Sprachen", + "languages.default": "Standardsprache", + "languages.empty": "Noch keine Sprachen", + "languages.secondary": "Sekundäre Sprachen", + "languages.secondary.empty": "Noch keine sekundären Sprachen", + + "license": "Lizenz", + "license.activate": "Aktiviere Kirby jetzt", + "license.activate.label": "Bitte aktiviere deine Lizenz", + "license.activate.domain": "Deine Lizenz wird für die Domain {host} aktiviert.", + "license.activate.local": "Du bist dabei, deine Kirby Lizenz für die lokale Domain {host} zu aktivieren. Falls diese Seite später unter einer anderen Domain veröffentlicht wird, solltest du sie erst dort aktivieren. Falls {host} die Domain ist, die du für deine Lizenz nutzen möchtest, fahre bitte fort. ", + "license.activated": "Aktiviert", + "license.buy": "Kaufe eine Lizenz", + "license.code": "Code", + "license.code.help": "Du hast deinen Lizenz Code nach dem Kauf per Email bekommen. Bitte kopiere sie aus der Email und füge sie hier ein. ", + "license.code.label": "Bitte gib deinen Lizenzcode ein", + "license.status.active.info": "Beinhaltet neue Major Versionen bis {date}", + "license.status.active.label": "Gültige Lizenz", + "license.status.demo.info": "Dies ist eine Demo Installation", + "license.status.demo.label": "Demo", + "license.status.inactive.info": "Lizenz erneuern, um auf neue Major Versionen upzudaten", + "license.status.inactive.label": "Keine neuen Major Versionen", + "license.status.legacy.bubble": "Bereit, die Lizenz zu erneuern? ", + "license.status.legacy.info": "Deine Lizenz deckt diese Version nicht ab", + "license.status.legacy.label": "Bitte erneuere deine Lizenz", + "license.status.missing.bubble": "Bereit, deine Seite zu veröffentlichen?", + "license.status.missing.info": "Keine gültige Lizenz", + "license.status.missing.label": "Bitte aktiviere deine Lizenz", + "license.manage": "Verwalte deine Lizenzen", + "license.purchased": "Gekauft", + "license.success": "Vielen Dank für deine Unterstützung", + "license.unregistered.label": "Unregistriert", + + "link": "Link", + "link.text": "Linktext", + + "loading": "Laden", + + "lock.unsaved": "Ungespeicherte Änderungen", + "lock.unsaved.empty": "Keine ungespeicherten Änderungen", + "lock.isLocked": "Ungespeicherte Änderungen von {email}", + "lock.unlock": "Entsperren", + "lock.unlock.submit": "Entsperre und überschreibe ungespeicherte Änderungen von {email}", + "lock.isUnlocked": "Wurde von einem*r anderen Benutzer*in überschrieben", + + "login": "Anmelden", + "login.code.label.login": "Anmeldecode", + "login.code.label.password-reset": "Anmeldecode", + "login.code.placeholder.email": "000 000", + "login.code.placeholder.totp": "000000", + "login.code.text.email": "Wenn deine E-Mail-Adresse registriert ist, wurde der angeforderte Code per E-Mail versendet.", + "login.code.text.totp": "Bitte gib den Einmal-Code von deiner Authentifizierungs-App ein. ", + "login.email.login.body": "Hallo {user.nameOrEmail},\n\ndu hast gerade einen Anmeldecode für das Kirby Panel von {site} angefordert.\n\nDer folgende Anmeldecode ist für die nächsten {timeout} Minuten gültig:\n\n{code}\n\nWenn du keinen Anmeldecode angefordert hast, ignoriere bitte diese E-Mail oder kontaktiere bei Fragen deinen Administrator.\nBitte leite diese E-Mail aus Sicherheitsgründen NICHT weiter.", + "login.email.login.subject": "Dein Anmeldecode", + "login.email.password-reset.body": "Hallo {user.nameOrEmail},\n\ndu hast gerade einen Anmeldecode für das Kirby Panel von {site} angefordert.\n\nDer folgende Anmeldecode ist für die nächsten {timeout} Minuten gültig:\n\n{code}\n\nWenn du keinen Anmeldecode angefordert hast, ignoriere bitte diese E-Mail oder kontaktiere bei Fragen deinen Administrator.\nBitte leite diese E-Mail aus Sicherheitsgründen NICHT weiter.", + "login.email.password-reset.subject": "Dein Anmeldecode", + "login.remember": "Angemeldet bleiben", + "login.reset": "Passwort zurücksetzen", + "login.toggleText.code.email": "Anmelden über E-Mail", + "login.toggleText.code.email-password": "Anmelden mit Passwort", + "login.toggleText.password-reset.email": "Passwort vergessen?", + "login.toggleText.password-reset.email-password": "← Zurück zur Anmeldung", + "login.totp.enable.option": "Einmal-Codes einrichten", + "login.totp.enable.intro": "Authentifizierungs-Apps können Einmal-Codes erstellen, die als zweiter Faktor für die Anmeldung dienen. ", + "login.totp.enable.qr.label": "1. Scanne diesen QR Code", + "login.totp.enable.qr.help": "Scannen funktioniert nicht? Gib den Setup-Schlüssel {secret} manuell in deiner Authentifizierungs-App ein. ", + "login.totp.enable.confirm.headline": "2. Bestätige den erstellten Code.", + "login.totp.enable.confirm.text": "Deine App erstellt alle 30 Sekunden einen neuen Einmal-Code. Gib den aktuellen Code ein, um das Setup abzuschliessen. ", + "login.totp.enable.confirm.label": "Aktueller Code", + "login.totp.enable.confirm.help": "Nach dem Setup werden wir dich bei jeder Anmeldung nach einem Einmal-Code fragen. ", + "login.totp.enable.success": "Einmal-Codes aktiviert", + "login.totp.disable.option": "Einmal-Codes deaktivieren", + "login.totp.disable.label": "Gib dein Passwort ein, um die Einmal-Codes zu deaktivieren. ", + "login.totp.disable.help": "In Zukunft wird bei der Anmeldung ein anderer zweiter Faktor abgefragt. Z.B. ein Login-Code der per Email zugeschickt wird. Du kannst die Einmal-Codes jeder Zeit später wieder neu einrichten. ", + "login.totp.disable.admin": "

Einmal-Codes für {user} werden hiermit deaktiviert.

In Zukunft wird für die Anmeldung ein anderer zweiter Faktor abgefragt. Z.B. ein Login-Code, der per Email zugeschickt wird. {user} kann nach der nächsten Anmeldung jeder Zeit wieder Einmal-Codes für den Account aktivieren.

", + "login.totp.disable.success": "Einmal-Codes deaktiviert", + + "logout": "Abmelden", + + "merge": "Zusammenfügen", + "menu": "Menü", + "meridiem": "AM/PM", + "mime": "Medientyp", + "minutes": "Minuten", + + "month": "Monat", + "months.april": "April", + "months.august": "August", + "months.december": "Dezember", + "months.february": "Februar", + "months.january": "Januar", + "months.july": "Juli", + "months.june": "Juni", + "months.march": "M\u00e4rz", + "months.may": "Mai", + "months.november": "November", + "months.october": "Oktober", + "months.september": "September", + + "more": "Mehr", + "move": "Bewegen", + "name": "Name", + "next": "Nächster Eintrag", + "night": "Nacht", + "no": "nein", + "off": "aus", + "on": "an", + "open": "Öffnen", + "open.newWindow": "In neuem Fenster öffnen", + "option": "Option", + "options": "Optionen", + "options.none": "Keine Optionen", + "options.all": "Zeige alle {count} Optionen", + + "orientation": "Ausrichtung", + "orientation.landscape": "Querformat", + "orientation.portrait": "Hochformat", + "orientation.square": "Quadratisch", + + "page": "Seite", + "page.blueprint": "Du kannst zusätzliche Felder und Bereiche für diese Seite in /site/blueprints/pages/{blueprint}.yml anlegen", + "page.changeSlug": "URL \u00e4ndern", + "page.changeSlug.fromTitle": "Aus Titel erzeugen", + "page.changeStatus": "Status ändern", + "page.changeStatus.position": "Bitte wähle eine Position aus", + "page.changeStatus.select": "Wähle einen neuen Status aus", + "page.changeTemplate": "Vorlage ändern", + "page.changeTemplate.notice": "Das Ändern der Vorlage wird Inhalte entfernen, deren Feldtypen nicht übereinstimmen. Verwende diese Funktion mit Vorsicht.", + "page.create": "Anlegen als \"{status}\"", + "page.delete.confirm": "Willst du die Seite {title} wirklich löschen?", + "page.delete.confirm.subpages": "Diese Seite hat Unterseiten.
Alle Unterseiten werden ebenfalls gelöscht.", + "page.delete.confirm.title": "Gib zur Bestätigung den Seitentitel ein", + "page.duplicate.appendix": "Kopie", + "page.duplicate.files": "Dateien kopieren", + "page.duplicate.pages": "Seiten kopieren", + "page.move": "Seite bewegen", + "page.sort": "Position ändern", + "page.status": "Status", + "page.status.draft": "Entwurf", + "page.status.draft.description": "Die Seite ist im Entwurfsmodus und ist nur nach Anmeldung oder über den geheimen Link sichtbar", + "page.status.listed": "Öffentlich", + "page.status.listed.description": "Die Seite ist öffentlich für alle", + "page.status.unlisted": "Ungelistet", + "page.status.unlisted.description": "Die Seite kann nur über die URL aufgerufen werden", + + "pages": "Seiten", + "pages.empty": "Keine Seiten", + "pages.status.draft": "Entwürfe", + "pages.status.listed": "Veröffentlicht", + "pages.status.unlisted": "Ungelistet", + + "pagination.page": "Seite", + + "password": "Passwort", + "paste": "Einfügen", + "paste.after": "Danach einfügen", + "paste.success": "{count} eingefügt!", + "pixel": "Pixel", + "plugin": "Plugin", + "plugins": "Plugins", + "prev": "Vorheriger Eintrag", + "preview": "Vorschau", + "remove": "Entfernen", + "rename": "Umbenennen", + "renew": "Erneuern", + "replace": "Ersetzen", + "replace.with": "Ersetzen mit", + "retry": "Wiederholen", + "revert": "Verwerfen", + "revert.confirm": "Willst du wirklich alle ungespeicherten Änderungen verwerfen? ", + + "role": "Rolle", + "role.admin.description": "Admins haben alle Rechte", + "role.admin.title": "Admin", + "role.all": "Alle", + "role.empty": "Keine Accounts mit dieser Rolle", + "role.description.placeholder": "Keine Beschreibung", + "role.nobody.description": "Dies ist die Platzhalterrolle ohne Rechte", + "role.nobody.title": "Niemand", + + "save": "Speichern", + "search": "Suchen", + "search.min": "Gib mindestens {min}  Zeichen ein, um zu suchen", + "search.all": "Zeige alle {count} Ergebnisse", + "search.results.none": "Keine Ergebnisse", + + "section.invalid": "Der Bereich ist ungültig", + "section.required": "Der Bereich ist Pflicht", + + "security": "Sicherheit", + "select": "Auswählen", + "server": "Server", + "settings": "Einstellungen", + "show": "Anzeigen", + "site.blueprint": "Du kannst zusätzliche Felder und Bereiche für die Seite in /site/blueprints/site.yml anlegen", + "size": "Größe", + "slug": "URL-Anhang", + "sort": "Sortieren", + "sort.drag": "Bewegen um zu sortieren …", + "split": "Teilen", + + "stats.empty": "Keine Daten", + "status": "Status", + + "system.info.copy": "Info kopieren", + "system.info.copied": "System Info wurde kopiert", + "system.issues.content": "Der content Ordner scheint öffentlich zugänglich zu sein", + "system.issues.eol.kirby": "Deine Kirby Installation ist veraltet und erhält keine weiteren Sicherheitsupdates", + "system.issues.eol.plugin": "Deine Version des { plugin } Plugins ist veraltet und erhält keine weiteren Sicherheitsupdates", + "system.issues.eol.php": "Deine installierte PHP-Version { release } ist veraltet und erhält keinen Sicherheits-Updates mehr", + "system.issues.debug": "Debugging muss im öffentlichen Betrieb ausgeschaltet sein", + "system.issues.git": "Der .git Ordner scheint öffentlich zugänglich zu sein", + "system.issues.https": "Wir empfehlen HTTPS für alle deine Seiten", + "system.issues.kirby": "Der kirby Ordner scheint öffentlich zugänglich zu sein", + "system.issues.site": "Der site Ordner scheint öffentlich zugänglich zu sein", + "system.issues.vulnerability.kirby": "Deine Installation könnte von folgender Sicherheitslücke betroffen sein ({ severity } severity): { description }", + "system.issues.vulnerability.plugin": "Deine Installation könnte von folgender Sicherheitslücke im { plugin } Plugin betroffen sein ({ severity } severity): { description }", + "system.updateStatus": "Update Status", + "system.updateStatus.error": "Update Check nicht möglich", + "system.updateStatus.not-vulnerable": "Keine bekannten Sicherheitslücken", + "system.updateStatus.security-update": "Kostenloses Sicherheitsupdate { version } verfügbar", + "system.updateStatus.security-upgrade": "Upgrade { version } mit Sicherheitsverbesserungen verfügbar ", + "system.updateStatus.unreleased": "Unveröffentlichte Version", + "system.updateStatus.up-to-date": "Aktuell", + "system.updateStatus.update": "Kostenloses Update { version } verfügbar", + "system.updateStatus.upgrade": "Upgrade { version } verfügbar", + + "tel": "Telefon", + "tel.placeholder": "+49123456789", + "template": "Vorlage", + "title": "Titel", + "today": "Heute", + + "toolbar.button.clear": "Formatierung entfernen", + "toolbar.button.code": "Code", + "toolbar.button.bold": "Fetter Text", + "toolbar.button.email": "E-Mail", + "toolbar.button.headings": "Überschriften", + "toolbar.button.heading.1": "Überschrift 1", + "toolbar.button.heading.2": "Überschrift 2", + "toolbar.button.heading.3": "Überschrift 3", + "toolbar.button.heading.4": "Überschrift 4", + "toolbar.button.heading.5": "Überschrift 5", + "toolbar.button.heading.6": "Überschrift 6", + "toolbar.button.italic": "Kursiver Text", + "toolbar.button.file": "Datei", + "toolbar.button.file.select": "Datei auswählen", + "toolbar.button.file.upload": "Datei hochladen", + "toolbar.button.link": "Link", + "toolbar.button.paragraph": "Absatz", + "toolbar.button.strike": "Durchgestrichen", + "toolbar.button.sub": "Tiefgestellt", + "toolbar.button.sup": "Hochgestellt", + "toolbar.button.ol": "Geordnete Liste", + "toolbar.button.underline": "Unterstrichen", + "toolbar.button.ul": "Ungeordnete Liste", + + "translation.author": "Kirby Team", + "translation.direction": "ltr", + "translation.name": "Deutsch", + "translation.locale": "de_DE", + + "type": "Typ", + + "upload": "Hochladen", + "upload.error.cantMove": "Die Datei konnte nicht an ihren Zielort bewegt werden", + "upload.error.cantWrite": "Die Datei konnte nicht auf der Festplatte gespeichert werden", + "upload.error.default": "Die Datei konnte nicht hochgeladen werden", + "upload.error.extension": "Der Dateiupload wurde durch eine Erweiterung verhindert", + "upload.error.formSize": "Die Datei ist größer als die MAX_FILE_SIZE Einstellung im Formular", + "upload.error.iniPostSize": "Die Datei ist größer als die post_max_size Einstellung in der php.ini", + "upload.error.iniSize": "Die Datei ist größer als die upload_max_filesize Einstellung in der php.ini", + "upload.error.noFile": "Es wurde keine Datei hochgeladen", + "upload.error.noFiles": "Es wurden keine Dateien hochgeladen", + "upload.error.partial": "Die Datei wurde nur teilweise hochgeladen", + "upload.error.tmpDir": "Der temporäre Ordner für den Dateiupload existiert leider nicht", + "upload.errors": "Fehler", + "upload.progress": "Hochladen …", + + "url": "Url", + "url.placeholder": "https://beispiel.de", + + "user": "Account", + "user.blueprint": "Du kannst zusätzliche Felder und Bereiche für diese Rolle in /site/blueprints/users/{blueprint}.yml anlegen", + "user.changeEmail": "E-Mail ändern", + "user.changeLanguage": "Sprache ändern", + "user.changeName": "Account umbenennen", + "user.changePassword": "Passwort ändern", + "user.changePassword.new": "Neues Passwort", + "user.changePassword.new.confirm": "Wiederhole das Passwort …", + "user.changeRole": "Rolle ändern", + "user.changeRole.select": "Neue Rolle auswählen", + "user.create": "Neuen Account anlegen", + "user.delete": "Account löschen", + "user.delete.confirm": "Willst du den Account
{email} wirklich löschen?", + + "users": "Accounts", + + "version": "Version", + "version.current": "Aktuelle Version", + "version.latest": "Neueste Version", + "versionInformation": "Informationen zur Version", + + "view.account": "Dein Account", + "view.installation": "Installation", + "view.languages": "Sprachen", + "view.resetPassword": "Passwort zurücksetzen", + "view.site": "Seite", + "view.system": "System", + "view.users": "Accounts", + + "welcome": "Willkommen", + "year": "Jahr", + "yes": "ja" +} diff --git a/kirby/i18n/translations/el.json b/kirby/i18n/translations/el.json new file mode 100644 index 0000000..56709da --- /dev/null +++ b/kirby/i18n/translations/el.json @@ -0,0 +1,730 @@ +{ + "account.changeName": "Change your name", + "account.delete": "Delete your account", + "account.delete.confirm": "Do you really want to delete your account? You will be logged out immediately. Your account cannot be recovered.", + + "activate": "Activate", + "add": "\u03a0\u03c1\u03bf\u03c3\u03b8\u03ae\u03ba\u03b7", + "alpha": "Alpha", + "author": "Author", + "avatar": "\u0395\u03b9\u03ba\u03cc\u03bd\u03b1 \u03c0\u03c1\u03bf\u03c6\u03af\u03bb", + "back": "Πίσω", + "cancel": "\u0391\u03ba\u03cd\u03c1\u03c9\u03c3\u03b7", + "change": "\u0391\u03bb\u03bb\u03b1\u03b3\u03ae", + "close": "\u039a\u03bb\u03b5\u03af\u03c3\u03b9\u03bc\u03bf", + "changes": "Changes", + "confirm": "Εντάξει", + "collapse": "Collapse", + "collapse.all": "Collapse All", + "color": "Color", + "coordinates": "Coordinates", + "copy": "Αντιγραφή", + "copy.all": "Copy all", + "copy.success": "{count} copied!", + "create": "Δημιουργία", + "custom": "Custom", + + "date": "Ημερομηνία", + "date.select": "Επιλογή ημερομηνίας", + + "day": "Ημέρα", + "days.fri": "\u03a0\u03b1\u03c1", + "days.mon": "\u0394\u03b5\u03c5", + "days.sat": "\u03a3\u03ac\u03b2", + "days.sun": "\u039a\u03c5\u03c1", + "days.thu": "\u03a0\u03ad\u03bc", + "days.tue": "\u03a4\u03c1\u03af", + "days.wed": "\u03a4\u03b5\u03c4", + + "debugging": "Debugging", + + "delete": "\u0394\u03b9\u03b1\u03b3\u03c1\u03b1\u03c6\u03ae", + "delete.all": "Delete all", + + "dialog.fields.empty": "This dialog has no fields", + "dialog.files.empty": "No files to select", + "dialog.pages.empty": "No pages to select", + "dialog.text.empty": "This dialog does not define any text", + "dialog.users.empty": "No users to select", + + "dimensions": "Διαστάσεις", + "disable": "Disable", + "disabled": "Disabled", + "discard": "Απόρριψη", + + "drawer.fields.empty": "This drawer has no fields", + + "domain": "Domain", + "download": "Λήψη", + "duplicate": "Αντίγραφο", + + "edit": "\u0395\u03c0\u03b5\u03be\u03b5\u03c1\u03b3\u03b1\u03c3\u03af\u03b1", + + "email": "Διεύθυνση ηλεκτρονικού ταχυδρομείου", + "email.placeholder": "mail@example.com", + + "enter": "Enter", + "entries": "Entries", + "entry": "Entry", + + "environment": "Environment", + + "error": "Error", + "error.access.code": "Mη έγκυρος κωδικός", + "error.access.login": "Mη έγκυρη σύνδεση", + "error.access.panel": "Δεν επιτρέπεται η πρόσβαση στον πίνακα ελέγχου", + "error.access.view": "Δεν επιτρέπεται η πρόσβαση σε αυτό το τμήμα του πίνακα ελέγχου", + + "error.avatar.create.fail": "Δεν ήταν δυνατή η μεταφόρτωση της εικόνας προφίλ", + "error.avatar.delete.fail": "Δεν ήταν δυνατή η διαγραφή της εικόνας προφίλ", + "error.avatar.dimensions.invalid": "Διατηρήστε το πλάτος και το ύψος της εικόνας προφίλ κάτω από 3000 εικονοστοιχεία", + "error.avatar.mime.forbidden": "\u039c\u03b7 \u03b1\u03c0\u03bf\u03b4\u03b5\u03ba\u03c4\u03cc\u03c2 \u03c4\u03cd\u03c0\u03bf\u03c2 \u03b1\u03c1\u03c7\u03b5\u03af\u03bf\u03c5", + + "error.blueprint.notFound": "Δεν ήταν δυνατή η φόρτωση του προσχεδίου \"{name}\"", + + "error.blocks.max.plural": "You must not add more than {max} blocks", + "error.blocks.max.singular": "You must not add more than one block", + "error.blocks.min.plural": "You must add at least {min} blocks", + "error.blocks.min.singular": "You must add at least one block", + "error.blocks.validation": "There's an error on the \"{field}\" field in block {index} using the \"{fieldset}\" block type", + + "error.cache.type.invalid": "Invalid cache type \"{type}\"", + + "error.email.preset.notFound": "Δεν είναι δυνατή η εύρεση της προεπιλογής διεύθινσης ηλεκτρονικού ταχυδρομείου \"{name}\"", + + "error.field.converter.invalid": "Μη έγκυρος μετατροπέας \"{converter}\"", + "error.field.type.missing": "Field \"{ name }\": The field type \"{ type }\" does not exist", + + "error.file.changeName.empty": "The name must not be empty", + "error.file.changeName.permission": "Δεν επιτρέπεται να αλλάξετε το όνομα του \"{filename}\"", + "error.file.changeTemplate.invalid": "The template for the file \"{id}\" cannot be changed to \"{template}\" (valid: \"{blueprints}\")", + "error.file.changeTemplate.permission": "You are not allowed to change the template for the file \"{id}\"", + + "error.file.duplicate": "Ένα αρχείο με το όνομα \"{filename}\" υπάρχει ήδη", + "error.file.extension.forbidden": "\u039c\u03b7 \u03b1\u03c0\u03bf\u03b4\u03b5\u03ba\u03c4\u03ae \u03b5\u03c0\u03ad\u03ba\u03c4\u03b1\u03c3\u03b7 \u03b1\u03c1\u03c7\u03b5\u03af\u03bf\u03c5", + "error.file.extension.invalid": "Invalid extension: {extension}", + "error.file.extension.missing": "Λείπει η επέκταση για το \"{filename}\"", + "error.file.maxheight": "The height of the image must not exceed {height} pixels", + "error.file.maxsize": "The file is too large", + "error.file.maxwidth": "The width of the image must not exceed {width} pixels", + "error.file.mime.differs": "Το αρχείο πρέπει να είναι του ίδιου τύπου mime \"{mime}\"", + "error.file.mime.forbidden": "Ο τύπος μέσου \"{mime}\" δεν επιτρέπεται", + "error.file.mime.invalid": "Invalid mime type: {mime}", + "error.file.mime.missing": "Δεν είναι δυνατό να εντοπιστεί ο τύπος μέσου για το \"{filename}\"", + "error.file.minheight": "The height of the image must be at least {height} pixels", + "error.file.minsize": "The file is too small", + "error.file.minwidth": "The width of the image must be at least {width} pixels", + "error.file.name.unique": "The filename must be unique", + "error.file.name.missing": "Το όνομα αρχείου δεν μπορεί να είναι άδειο", + "error.file.notFound": "Δεν είναι δυνατό να βρεθεί το αρχείο \"{filename}\"", + "error.file.orientation": "The orientation of the image must be \"{orientation}\"", + "error.file.type.forbidden": "Δεν επιτρέπεται η μεταφόρτωση αρχείων {type}", + "error.file.type.invalid": "Invalid file type: {type}", + "error.file.undefined": "Δεν ήταν δυνατή η εύρεση του αρχείου", + + "error.form.incomplete": "Παρακαλώ διορθώστε τα σφάλματα στη φόρμα...", + "error.form.notSaved": "Δεν ήταν δυνατή η αποθήκευση της φόρμας", + + "error.language.code": "Please enter a valid code for the language", + "error.language.duplicate": "The language already exists", + "error.language.name": "Please enter a valid name for the language", + "error.language.notFound": "The language could not be found", + + "error.layout.validation.block": "There's an error on the \"{field}\" field in block {blockIndex} using the \"{fieldset}\" block type in layout {layoutIndex}", + "error.layout.validation.settings": "There's an error in layout {index} settings", + + "error.license.domain": "The domain for the license is missing", + "error.license.email": "Παρακαλώ εισάγετε μια έγκυρη διεύθυνση ηλεκτρονικού ταχυδρομείου", + "error.license.format": "Please enter a valid license code", + "error.license.verification": "The license could not be verified", + + "error.login.totp.confirm.invalid": "Mη έγκυρος κωδικός", + "error.login.totp.confirm.missing": "Please enter the current code", + + "error.object.validation": "There’s an error in the \"{label}\" field:\n{message}", + + "error.offline": "The Panel is currently offline", + + "error.page.changeSlug.permission": "Δεν επιτρέπεται να αλλάξετε το URL της σελίδας \"{slug}\"", + "error.page.changeSlug.reserved": "The path of top-level pages must not start with \"{path}\"", + "error.page.changeStatus.incomplete": "Δεν ήταν δυνατή η δημοσίευση της σελίδας καθώς περιέχει σφάλματα", + "error.page.changeStatus.permission": "Δεν είναι δυνατή η αλλαγή κατάστασης για αυτή τη σελίδα", + "error.page.changeStatus.toDraft.invalid": "Δεν είναι δυνατή η μετατροπή της σελίδας \"{slug}\" σε προσχέδιο", + "error.page.changeTemplate.invalid": "Δεν είναι δυνατή η αλλαγή προτύπου για τη σελίδα \"{slug}\"", + "error.page.changeTemplate.permission": "Δεν επιτρέπεται να αλλάξετε το πρότυπο για τη σελίδα \"{slug}\"", + "error.page.changeTitle.empty": "Ο τίτλος δεν μπορεί να είναι κενός", + "error.page.changeTitle.permission": "Δεν επιτρέπεται να αλλάξετε τον τίτλο για τη σελίδα \"{slug}\"", + "error.page.create.permission": "Δεν επιτρέπεται να δημιουργήσετε τη σελίδα \"{slug}\"", + "error.page.delete": "Δεν είναι δυνατή η διαγραφή της σελίδας \"{slug}\"", + "error.page.delete.confirm": "Παρακαλώ εισάγετε τον τίτλο της σελίδας για επιβεβαίωση", + "error.page.delete.hasChildren": "Δεν είναι δυνατή η διαγραφή της σελίδας καθώς περιέχει υποσελίδες", + "error.page.delete.permission": "Δεν επιτρέπεται η διαγραφή της σελίδας \"{slug}\"", + "error.page.draft.duplicate": "Υπάρχει ήδη ένα προσχέδιο σελίδας με την διεύθυνση URL \"{slug}\"", + "error.page.duplicate": "Υπάρχει ήδη μια σελίδα με την διεύθυνση URL \"{slug}\"", + "error.page.duplicate.permission": "You are not allowed to duplicate \"{slug}\"", + "error.page.move.ancestor": "The page cannot be moved into itself", + "error.page.move.directory": "The page directory cannot be moved", + "error.page.move.duplicate": "A sub page with the URL appendix \"{slug}\" already exists", + "error.page.move.notFound": "The moved page could not be found", + "error.page.move.permission": "You are not allowed to move \"{slug}\"", + "error.page.move.template": "The \"{template}\" template is not accepted as a subpage of \"{parent}\"", + "error.page.notFound": "Δεν ήταν δυνατή η εύρεση της σελίδας \"{slug}\"", + "error.page.num.invalid": "Παρακαλώ εισάγετε έναν έγκυρο αριθμό ταξινόμησης. Οι αριθμοί δεν μπορεί να είναι αρνητικοί.", + "error.page.slug.invalid": "Please enter a valid URL appendix", + "error.page.slug.maxlength": "Slug length must be less than \"{length}\" characters", + "error.page.sort.permission": "Δεν είναι δυνατή η ταξινόμηση της σελίδας \"{slug}\"", + "error.page.status.invalid": "Ορίστε μια έγκυρη κατάσταση σελίδας", + "error.page.undefined": "Δεν ήταν δυνατή η εύρεση της σελίδας", + "error.page.update.permission": "Δεν επιτρέπεται η ενημέρωση της σελίδας \"{slug}\"", + + "error.section.files.max.plural": "Δεν πρέπει να προσθέσετε περισσότερα από {max} αρχεία στην ενότητα \"{section}\"", + "error.section.files.max.singular": "Δεν πρέπει να προσθέσετε περισσότερα από ένα αρχεία στην ενότητα \"{section}\"", + "error.section.files.min.plural": "The \"{section}\" section requires at least {min} files", + "error.section.files.min.singular": "The \"{section}\" section requires at least one file", + + "error.section.pages.max.plural": "Δεν μπορείτε να προσθέσετε περισσότερες από {max} σελίδες στην ενότητα \"{section}\"", + "error.section.pages.max.singular": "Δεν μπορείτε να προσθέσετε περισσότερες από μία σελίδες στην ενότητα \"{section}\"", + "error.section.pages.min.plural": "The \"{section}\" section requires at least {min} pages", + "error.section.pages.min.singular": "The \"{section}\" section requires at least one page", + + "error.section.notLoaded": "Δεν ήταν δυνατή η φόρτωση της ενότητας \"{name}\"", + "error.section.type.invalid": "Ο τύπος ενότητας \"{type}\" δεν είναι έγκυρος", + + "error.site.changeTitle.empty": "Ο τίτλος δεν μπορεί να είναι κενός", + "error.site.changeTitle.permission": "Δεν επιτρέπεται να αλλάξετε τον τίτλο του ιστότοπου", + "error.site.update.permission": "Δεν επιτρέπεται η ενημέρωση του ιστότοπου", + + "error.structure.validation": "There's an error on the \"{field}\" field in row {index}", + + "error.template.default.notFound": "Το προεπιλεγμένο πρότυπο δεν υπάρχει", + + "error.unexpected": "An unexpected error occurred! Enable debug mode for more info: https://getkirby.com/docs/reference/system/options/debug", + + "error.user.changeEmail.permission": "Δεν επιτρέπεται να αλλάξετε τη διεύθινση ηλεκτρονικού ταχυδρομείου για τον χρήστη \"{name}\"", + "error.user.changeLanguage.permission": "Δεν επιτρέπεται να αλλάξετε τη γλώσσα για τον χρήστη \"{name}\"", + "error.user.changeName.permission": "Δεν επιτρέπεται να αλλάξετε το όνομα του χρήστη \"{name}", + "error.user.changePassword.permission": "Δεν επιτρέπεται να αλλάξετε τον κωδικό πρόσβασης για τον χρήστη \"{name}\"", + "error.user.changeRole.lastAdmin": "Ο ρόλος του τελευταίου διαχειριστή δεν μπορεί να αλλάξει", + "error.user.changeRole.permission": "Δεν επιτρέπεται να αλλάξετε το ρόλο του χρήστη \"{name}\"", + "error.user.changeRole.toAdmin": "You are not allowed to promote someone to the admin role", + "error.user.create.permission": "Δεν επιτρέπεται η δημιουργία αυτού του χρήστη", + "error.user.delete": "\u039f \u03c7\u03c1\u03ae\u03c3\u03c4\u03b7\u03c2 \u03b4\u03b5\u03bd \u03bc\u03c0\u03bf\u03c1\u03bf\u03cd\u03c3\u03b5 \u03bd\u03b1 \u03b4\u03b9\u03b1\u03b3\u03c1\u03b1\u03c6\u03b5\u03af", + "error.user.delete.lastAdmin": "Δεν είναι δυνατή η διαγραφή του τελευταίου διαχειριστή", + "error.user.delete.lastUser": "Δεν είναι δυνατή η διαγραφή του τελευταίου χρήστη", + "error.user.delete.permission": "Δεν επιτρέπεται να διαγράψετ τον χρήστη \"{name}\"", + "error.user.duplicate": "Ένας χρήστης με τη διεύθυνση ηλεκτρονικού ταχυδρομείου \"{email}\" υπάρχει ήδη", + "error.user.email.invalid": "Παρακαλώ εισάγετε μια έγκυρη διεύθυνση ηλεκτρονικού ταχυδρομείου", + "error.user.language.invalid": "Παρακαλώ εισαγάγετε μια έγκυρη γλώσσα", + "error.user.notFound": "Δεν είναι δυνατή η εύρεση του χρήστη \"{name}\"", + "error.user.password.excessive": "Please enter a valid password. Passwords must not be longer than 1000 characters.", + "error.user.password.invalid": "Παρακαλώ εισάγετε έναν έγκυρο κωδικό πρόσβασης. Οι κωδικοί πρόσβασης πρέπει να έχουν μήκος τουλάχιστον 8 χαρακτήρων.", + "error.user.password.notSame": "\u03a0\u03b1\u03c1\u03b1\u03ba\u03b1\u03bb\u03bf\u03cd\u03bc\u03b5 \u03b5\u03c0\u03b9\u03b2\u03b5\u03b2\u03b1\u03b9\u03ce\u03c3\u03c4\u03b5 \u03c4\u03bf\u03bd \u039a\u03c9\u03b4\u03b9\u03ba\u03cc \u03a0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7\u03c2", + "error.user.password.undefined": "Ο χρήστης δεν έχει κωδικό πρόσβασης", + "error.user.password.wrong": "Wrong password", + "error.user.role.invalid": "Παρακαλώ εισαγάγετε έναν έγκυρο ρόλο", + "error.user.undefined": "Δεν είναι δυνατή η εύρεση του χρήστη", + "error.user.update.permission": "Δεν επιτρέπεται η ενημέρωση του χρήστη \"{name}\"", + + "error.validation.accepted": "Παρακαλώ επιβεβαιώστε", + "error.validation.alpha": "Παρακαλώ εισάγετε μόνο χαρακτήρες μεταξύ των a-z", + "error.validation.alphanum": "Παρακαλώ εισάγετε μόνο χαρακτήρες μεταξύ των a-z ή αριθμούς απο το 0 έως το 9", + "error.validation.anchor": "Please enter a correct link anchor", + "error.validation.between": "Παρακαλώ εισάγετε μια τιμή μεταξύ \"{min}\" και \"{max}\"", + "error.validation.boolean": "Παρακαλώ επιβεβαιώστε ή αρνηθείτε", + "error.validation.color": "Please enter a valid color in the {format} format", + "error.validation.contains": "Παρακαλώ καταχωρίστε μια τιμή που περιέχει \"{needle}\"", + "error.validation.date": "Παρακαλώ εισάγετε μία έγκυρη ημερομηνία", + "error.validation.date.after": "Please enter a date after {date}", + "error.validation.date.before": "Please enter a date before {date}", + "error.validation.date.between": "Please enter a date between {min} and {max}", + "error.validation.denied": "Παρακαλώ αρνηθείτε", + "error.validation.different": "Η τιμή δεν μπορεί να είναι \"{other}\"", + "error.validation.email": "Παρακαλώ εισάγετε μια έγκυρη διεύθυνση ηλεκτρονικού ταχυδρομείου", + "error.validation.endswith": "Η τιμή πρέπει να τελειώνει με \"{end}\"", + "error.validation.filename": "Παρακαλώ εισάγετε ένα έγκυρο όνομα αρχείου", + "error.validation.in": "Παρακαλώ εισάγετε ένα από τα παρακάτω: ({in})", + "error.validation.integer": "Παρακαλώ εισάγετε έναν έγκυρο ακέραιο αριθμό", + "error.validation.ip": "Παρακαλώ εισάγετε μια έγκυρη διεύθυνση IP", + "error.validation.less": "Παρακαλώ εισάγετε μια τιμή μικρότερη από {max}", + "error.validation.linkType": "The link type is not allowed", + "error.validation.match": "Η τιμή δεν ταιριάζει με το αναμενόμενο πρότυπο", + "error.validation.max": "Παρακαλώ εισάγετε μια τιμή ίση ή μικρότερη από {max}", + "error.validation.maxlength": "Παρακαλώ εισάγετε μια μικρότερη τιμή. (max. {max} χαρακτήρες)", + "error.validation.maxwords": "Παρακαλώ εισάγετε το πολύ {max} λέξεις", + "error.validation.min": "Παρακαλώ εισάγετε μια τιμή ίση ή μεγαλύτερη από {min}", + "error.validation.minlength": "Παρακαλώ εισάγετε μεγαλύτερη τιμή. (τουλάχιστον {min} χαρακτήρες)", + "error.validation.minwords": "Παρακαλώ εισάγετε τουλάχιστον {min} λέξεις", + "error.validation.more": "Παρακαλώ εισάγετε τουλάχιστον {min} λέξεις", + "error.validation.notcontains": "Παρακαλώ εισάγετε μια τιμή που δεν περιέχει \"{needle}\"", + "error.validation.notin": "Παρακαλώ μην εισάγετε κανένα από τα παρακάτω: ({notIn})", + "error.validation.option": "Παρακαλώ κάντε μια έγκυρη επιλογή", + "error.validation.num": "Παρακαλώ εισάγετε έναν έγκυρο αριθμό", + "error.validation.required": "Παρακαλώ εισάγετε κάτι", + "error.validation.same": "Παρακαλώ εισάγετε \"{other}\"", + "error.validation.size": "Το μέγεθος της τιμής πρέπει να είναι \"{size}\"", + "error.validation.startswith": "Η τιμή πρέπει να αρχίζει με \"{start}\"", + "error.validation.tel": "Please enter an unformatted phone number", + "error.validation.time": "Παρακαλώ εισάγετε μια έγκυρη ώρα", + "error.validation.time.after": "Please enter a time after {time}", + "error.validation.time.before": "Please enter a time before {time}", + "error.validation.time.between": "Please enter a time between {min} and {max}", + "error.validation.uuid": "Please enter a valid UUID", + "error.validation.url": "Παρακαλώ εισάγετε μια έγκυρη διεύθυνση URL", + + "expand": "Expand", + "expand.all": "Expand All", + + "field.invalid": "The field is invalid", + "field.required": "The field is required", + "field.blocks.changeType": "Change type", + "field.blocks.code.name": "Κώδικας", + "field.blocks.code.language": "Γλώσσα", + "field.blocks.code.placeholder": "Your code …", + "field.blocks.delete.confirm": "Do you really want to delete this block?", + "field.blocks.delete.confirm.all": "Do you really want to delete all blocks?", + "field.blocks.delete.confirm.selected": "Do you really want to delete the selected blocks?", + "field.blocks.empty": "No blocks yet", + "field.blocks.fieldsets.empty": "No fieldsets yet", + "field.blocks.fieldsets.label": "Please select a block type …", + "field.blocks.fieldsets.paste": "Press {{ shortcut }} to import layouts/blocks from your clipboard Only those allowed in the current field will get inserted.", + "field.blocks.gallery.name": "Gallery", + "field.blocks.gallery.images.empty": "No images yet", + "field.blocks.gallery.images.label": "Images", + "field.blocks.heading.level": "Level", + "field.blocks.heading.name": "Heading", + "field.blocks.heading.text": "Text", + "field.blocks.heading.placeholder": "Heading …", + "field.blocks.image.alt": "Alternative text", + "field.blocks.image.caption": "Caption", + "field.blocks.image.crop": "Crop", + "field.blocks.image.link": "Σύνδεσμος", + "field.blocks.image.location": "Location", + "field.blocks.image.location.internal": "This website", + "field.blocks.image.location.external": "External source", + "field.blocks.image.name": "Εικόνα", + "field.blocks.image.placeholder": "Select an image", + "field.blocks.image.ratio": "Ratio", + "field.blocks.image.url": "Image URL", + "field.blocks.line.name": "Line", + "field.blocks.list.name": "List", + "field.blocks.markdown.name": "Markdown", + "field.blocks.markdown.label": "Text", + "field.blocks.markdown.placeholder": "Markdown …", + "field.blocks.quote.name": "Quote", + "field.blocks.quote.text.label": "Text", + "field.blocks.quote.text.placeholder": "Quote …", + "field.blocks.quote.citation.label": "Citation", + "field.blocks.quote.citation.placeholder": "by …", + "field.blocks.text.name": "Text", + "field.blocks.text.placeholder": "Text …", + "field.blocks.video.autoplay": "Autoplay", + "field.blocks.video.caption": "Caption", + "field.blocks.video.controls": "Controls", + "field.blocks.video.location": "Location", + "field.blocks.video.loop": "Loop", + "field.blocks.video.muted": "Muted", + "field.blocks.video.name": "Video", + "field.blocks.video.placeholder": "Enter a video URL", + "field.blocks.video.poster": "Poster", + "field.blocks.video.preload": "Preload", + "field.blocks.video.url.label": "Video-URL", + "field.blocks.video.url.placeholder": "https://youtube.com/?v=", + + "field.files.empty": "Δεν έχουν επιλεγεί αρχεία ακόμα", + + "field.layout.change": "Change layout", + "field.layout.delete": "Delete layout", + "field.layout.delete.confirm": "Do you really want to delete this layout?", + "field.layout.delete.confirm.all": "Do you really want to delete all layouts?", + "field.layout.empty": "No rows yet", + "field.layout.select": "Select a layout", + + "field.object.empty": "No information yet", + + "field.pages.empty": "Δεν έχουν επιλεγεί ακόμη σελίδες", + + "field.structure.delete.confirm": "\u0395\u03af\u03c3\u03c4\u03b5 \u03c3\u03af\u03b3\u03bf\u03c5\u03c1\u03bf\u03c2 \u03cc\u03c4\u03b9 \u03b8\u03ad\u03bb\u03b5\u03c4\u03b5 \u03bd\u03b1 \u03b4\u03b9\u03b1\u03b3\u03c1\u03ac\u03c8\u03b5\u03c4\u03b5 \u03b1\u03c5\u03c4\u03ae\u03bd \u03c4\u03b7\u03bd \u03ba\u03b1\u03c4\u03b1\u03c7\u03ce\u03c1\u03b9\u03c3\u03b7;", + "field.structure.delete.confirm.all": "Do you really want to delete all entries?", + "field.structure.empty": "\u0394\u03b5\u03bd \u03c5\u03c0\u03ac\u03c1\u03c7\u03bf\u03c5\u03bd \u03b1\u03ba\u03cc\u03bc\u03b7 \u03ba\u03b1\u03c4\u03b1\u03c7\u03c9\u03c1\u03af\u03c3\u03b5\u03b9\u03c2.", + + "field.users.empty": "Δεν έχουν επιλεγεί ακόμη χρήστες", + + "fields.empty": "No fields yet", + + "file": "Αρχείο", + "file.blueprint": "This file has no blueprint yet. You can define the setup in /site/blueprints/files/{blueprint}.yml", + "file.changeTemplate": "Αλλαγή προτύπου", + "file.changeTemplate.notice": "Changing the file's template will remove content for fields that don't match in type. If the new template defines certain rules, e.g. image dimensions, those will also be applied irreversibly. Use with caution.", + "file.delete.confirm": "\u0398\u03ad\u03bb\u03b5\u03c4\u03b5 \u03c3\u03af\u03b3\u03bf\u03c5\u03c1\u03b1 \u03bd\u03b1 \u03b4\u03b9\u03b1\u03b3\u03c1\u03ac\u03c8\u03b5\u03c4\u03b5 \u03b1\u03c5\u03c4\u03cc \u03c4\u03bf \u03b1\u03c1\u03c7\u03b5\u03af\u03bf;", + "file.focus.placeholder": "Set focal point", + "file.focus.reset": "Remove focal point", + "file.focus.title": "Focus", + "file.sort": "Change position", + + "files": "Αρχεία", + "files.empty": "Δεν υπάρχουν ακόμα αρχεία", + + "filter": "Filter", + + "hide": "Hide", + "hour": "Ώρα", + "hue": "Hue", + "import": "Import", + "info": "Info", + "insert": "\u0395\u03b9\u03c3\u03b1\u03b3\u03c9\u03b3\u03ae", + "insert.after": "Insert after", + "insert.before": "Insert before", + "install": "Εγκατάσταση", + + "installation": "Εγκατάσταση", + "installation.completed": "Ο πίνακας ελέγχου έχει εγκατασταθεί", + "installation.disabled": "Η εγκατάσταση του πίνακα ελέγχου είναι απενεργοποιημένη για δημόσιους διακομιστές από προεπιλογή. Εκτελέστε την εγκατάσταση σε ένα τοπικό μηχάνημα ή ενεργοποιήστε την με την επιλογή panel.install.", + "installation.issues.accounts": "\u039f \u03c6\u03ac\u03ba\u03b5\u03bb\u03bf\u03c2 \/site\/accounts \u03b4\u03b5\u03bd \u03b5\u03af\u03bd\u03b1\u03b9 \u03b5\u03b3\u03b3\u03c1\u03ac\u03c8\u03b9\u03bc\u03bf\u03c2", + "installation.issues.content": "\u039f \u03c6\u03ac\u03ba\u03b5\u03bb\u03bf\u03c2 content \u03ba\u03b1\u03b9 \u03cc\u03bb\u03bf\u03b9 \u03bf\u03b9 \u03c5\u03c0\u03bf\u03c6\u03ac\u03ba\u03b5\u03bb\u03bf\u03b9 \u03c0\u03c1\u03ad\u03c0\u03b5\u03b9 \u03bd\u03b1 \u03b5\u03af\u03bd\u03b1\u03b9 \u03b5\u03b3\u03b3\u03c1\u03ac\u03c8\u03b9\u03bc\u03bf\u03b9.", + "installation.issues.curl": "Απαιτείται η επέκταση CURL", + "installation.issues.headline": "Ο πίνακας ελέγχου δεν μπορεί να εγκατασταθεί", + "installation.issues.mbstring": "Απαιτείται η επέκταση MB String ", + "installation.issues.media": "Ο φάκελος /media δεν υπάρχει ή δεν είναι εγγράψιμος", + "installation.issues.php": "Βεβαιωθείτε ότι χρησιμοποιήτε PHP 8+", + "installation.issues.sessions": "Ο φάκελος /site/sessions δεν υπάρχει ή δεν είναι εγγράψιμος", + + "language": "\u0393\u03bb\u03ce\u03c3\u03c3\u03b1", + "language.code": "Κώδικας", + "language.convert": "Χρήση ως προεπιλογή", + "language.convert.confirm": "

Θέλετε πραγματικά να μετατρέψετε τη {name} στην προεπιλεγμένη γλώσσα; Αυτό δεν μπορεί να ανακληθεί.

Αν το {name} χει μη μεταφρασμένο περιεχόμενο, δεν θα υπάρχει πλέον έγκυρη εναλλακτική λύση και τμήματα του ιστότοπού σας ενδέχεται να είναι κενά.

", + "language.create": "Προσθέστε μια νέα γλώσσα", + "language.default": "Προεπιλεγμένη γλώσσα", + "language.delete.confirm": "Θέλετε πραγματικά να διαγράψετε τη γλώσσα {name} συμπεριλαμβανομένων όλων των μεταφράσεων; Αυτό δεν μπορεί να αναιρεθεί!", + "language.deleted": "Η γλώσσα έχει διαγραφεί", + "language.direction": "Κατεύθυνση ανάγνωσης", + "language.direction.ltr": "Αριστερά προς τα δεξιά", + "language.direction.rtl": "Δεξιά προς τα αριστερά", + "language.locale": "Συμβολοσειρά τοπικής γλώσσας PHP", + "language.locale.warning": "You are using a custom locale set up. Please modify it in the language file in /site/languages", + "language.name": "Ονομασία", + "language.secondary": "Secondary language", + "language.settings": "Language settings", + "language.updated": "Η γλώσσα έχει ενημερωθεί", + "language.variables": "Language variables", + "language.variables.empty": "No translations yet", + + "language.variable.delete.confirm": "Do you really want to delete the variable for {key}?", + "language.variable.key": "Key", + "language.variable.notFound": "The variable could not be found", + "language.variable.value": "Value", + + "languages": "Γλώσσες", + "languages.default": "Προεπιλεγμένη γλώσσα", + "languages.empty": "Δεν υπάρχουν ακόμη γλώσσες", + "languages.secondary": "Δευτερεύουσες γλώσσες", + "languages.secondary.empty": "Δεν υπάρχουν ακόμα δευτερεύουσες γλώσσες", + + "license": "\u0386\u03b4\u03b5\u03b9\u03b1 \u03a7\u03c1\u03ae\u03c3\u03b7\u03c2 \u03c4\u03bf\u03c5 Kirby", + "license.activate": "Activate it now", + "license.activate.label": "Please activate your license", + "license.activate.domain": "Your license will be activated for {host}.", + "license.activate.local": "You are about to activate your Kirby license for your local domain {host}. If this site will be deployed to a public domain, please activate it there instead. If {host} is the domain you want to use your license for, please continue.", + "license.activated": "Activated", + "license.buy": "Αγοράστε μια άδεια", + "license.code": "Κώδικας", + "license.code.help": "You received your license code after the purchase via email. Please copy and paste it here.", + "license.code.label": "Παρακαλώ εισαγάγετε τον κωδικό άδειας χρήσης", + "license.status.active.info": "Includes new major versions until {date}", + "license.status.active.label": "Valid license", + "license.status.demo.info": "This is a demo installation", + "license.status.demo.label": "Demo", + "license.status.inactive.info": "Renew license to update to new major versions", + "license.status.inactive.label": "No new major versions", + "license.status.legacy.bubble": "Ready to renew your license?", + "license.status.legacy.info": "Your license does not cover this version", + "license.status.legacy.label": "Please renew your license", + "license.status.missing.bubble": "Ready to launch your site?", + "license.status.missing.info": "No valid license", + "license.status.missing.label": "Please activate your license", + "license.manage": "Manage your licenses", + "license.purchased": "Purchased", + "license.success": "Σας ευχαριστούμε για την υποστήριξη του Kirby", + "license.unregistered.label": "Unregistered", + + "link": "\u03a3\u03cd\u03bd\u03b4\u03b5\u03c3\u03bc\u03bf\u03c2", + "link.text": "\u039a\u03b5\u03af\u03bc\u03b5\u03bd\u03bf \u03c3\u03c5\u03bd\u03b4\u03ad\u03c3\u03bc\u03bf\u03c5", + + "loading": "Φόρτωση", + + "lock.unsaved": "Unsaved changes", + "lock.unsaved.empty": "There are no more unsaved changes", + "lock.isLocked": "Unsaved changes by {email}", + "lock.unlock": "Unlock", + "lock.unlock.submit": "Unlock and overwrite unsaved changes by {email}", + "lock.isUnlocked": "Was unlocked by another user", + + "login": "Σύνδεση", + "login.code.label.login": "Login code", + "login.code.label.password-reset": "Password reset code", + "login.code.placeholder.email": "000 000", + "login.code.placeholder.totp": "000000", + "login.code.text.email": "If your email address is registered, the requested code was sent via email.", + "login.code.text.totp": "Please enter the one‑time code from your authenticator app.", + "login.email.login.body": "Hi {user.nameOrEmail},\n\nYou recently requested a login code for the Panel of {site}.\nThe following login code will be valid for {timeout} minutes:\n\n{code}\n\nIf you did not request a login code, please ignore this email or contact your administrator if you have questions.\nFor security, please DO NOT forward this email.", + "login.email.login.subject": "Your login code", + "login.email.password-reset.body": "Hi {user.nameOrEmail},\n\nYou recently requested a password reset code for the Panel of {site}.\nThe following password reset code will be valid for {timeout} minutes:\n\n{code}\n\nIf you did not request a password reset code, please ignore this email or contact your administrator if you have questions.\nFor security, please DO NOT forward this email.", + "login.email.password-reset.subject": "Your password reset code", + "login.remember": "Κρατήστε με συνδεδεμένο", + "login.reset": "Reset password", + "login.toggleText.code.email": "Login via email", + "login.toggleText.code.email-password": "Login with password", + "login.toggleText.password-reset.email": "Forgot your password?", + "login.toggleText.password-reset.email-password": "← Back to login", + "login.totp.enable.option": "Set up one‑time codes", + "login.totp.enable.intro": "Authenticator apps can generate one‑time codes that are used as a second factor when signing into your account.", + "login.totp.enable.qr.label": "1. Scan this QR code", + "login.totp.enable.qr.help": "Unable to scan? Add the setup key {secret} manually to your authenticator app.", + "login.totp.enable.confirm.headline": "2. Confirm with generated code", + "login.totp.enable.confirm.text": "Your app generates a new one‑time code every 30 seconds. Enter the current code to complete the setup:", + "login.totp.enable.confirm.label": "Current code", + "login.totp.enable.confirm.help": "After this setup, we will ask you for a one‑time code every time you log in.", + "login.totp.enable.success": "One‑time codes enabled", + "login.totp.disable.option": "Disable one‑time codes", + "login.totp.disable.label": "Enter your password to disable one‑time codes", + "login.totp.disable.help": "In the future, a different second factor like a login code sent via email will be requested when you log in. You can always set up one‑time codes again later.", + "login.totp.disable.admin": "

This will disable one‑time codes for {user}.

In the future, a different second factor like a login code sent via email will be requested when they log in. {user} can set up one‑time codes again after their next login.

", + "login.totp.disable.success": "One‑time codes disabled", + + "logout": "Αποσύνδεση", + + "merge": "Merge", + "menu": "Μενού", + "meridiem": "Π.Μ./Μ.Μ", + "mime": "Τύπος πολυμέσων", + "minutes": "Λεπτά", + + "month": "Μήνας", + "months.april": "\u0391\u03c0\u03c1\u03af\u03bb\u03b9\u03bf\u03c2", + "months.august": "\u0391\u03cd\u03b3\u03bf\u03c5\u03c3\u03c4\u03bf\u03c2", + "months.december": "\u0394\u03b5\u03ba\u03ad\u03bc\u03b2\u03c1\u03b9\u03bf\u03c2", + "months.february": "Φεβρουάριος", + "months.january": "\u0399\u03b1\u03bd\u03bf\u03c5\u03ac\u03c1\u03b9\u03bf\u03c2", + "months.july": "\u0399\u03bf\u03cd\u03bb\u03b9\u03bf\u03c2", + "months.june": "\u0399\u03bf\u03cd\u03bd\u03b9\u03bf\u03c2", + "months.march": "\u039c\u03ac\u03c1\u03c4\u03b9\u03bf\u03c2", + "months.may": "\u039c\u03ac\u03b9\u03bf\u03c2", + "months.november": "\u039d\u03bf\u03ad\u03bc\u03b2\u03c1\u03b9\u03bf\u03c2", + "months.october": "\u039f\u03ba\u03c4\u03ce\u03b2\u03c1\u03b9\u03bf\u03c2", + "months.september": "\u03a3\u03b5\u03c0\u03c4\u03ad\u03bc\u03b2\u03c1\u03b9\u03bf\u03c2", + + "more": "Περισσότερα", + "move": "Move", + "name": "Ονομασία", + "next": "Επόμενο", + "night": "Night", + "no": "no", + "off": "off", + "on": "on", + "open": "Άνοιγμα", + "open.newWindow": "Open in new window", + "option": "Option", + "options": "Eπιλογές", + "options.none": "No options", + "options.all": "Show all {count} options", + + "orientation": "Προσανατολισμός", + "orientation.landscape": "Οριζόντιος", + "orientation.portrait": "Κάθετος", + "orientation.square": "Τετράγωνος", + + "page": "Page", + "page.blueprint": "This page has no blueprint yet. You can define the setup in /site/blueprints/pages/{blueprint}.yml", + "page.changeSlug": "\u0391\u03bb\u03bb\u03b1\u03b3\u03ae URL", + "page.changeSlug.fromTitle": "\u0394\u03b7\u03bc\u03b9\u03bf\u03c5\u03c1\u03b3\u03af\u03b1 \u03b1\u03c0\u03cc \u03c4\u03bf\u03bd \u03c4\u03af\u03c4\u03bb\u03bf", + "page.changeStatus": "Αλλαγή κατάστασης", + "page.changeStatus.position": "Επιλέξτε μια θέση", + "page.changeStatus.select": "Επιλέξτε μια νέα κατάσταση", + "page.changeTemplate": "Αλλαγή προτύπου", + "page.changeTemplate.notice": "Changing the page's template will remove content for fields that don't match in type. Use with caution.", + "page.create": "Create as {status}", + "page.delete.confirm": "\u0398\u03ad\u03bb\u03b5\u03c4\u03b5 \u03c3\u03af\u03b3\u03bf\u03c5\u03c1\u03b1 \u03bd\u03b1 \u03b4\u03b9\u03b1\u03b3\u03c1\u03ac\u03c8\u03b5\u03c4\u03b5 \u03b1\u03c5\u03c4\u03ae\u03bd \u03c4\u03b7 \u03c3\u03b5\u03bb\u03af\u03b4\u03b1;", + "page.delete.confirm.subpages": "Αυτή η σελίδα έχει υποσελίδες.
Όλες οι υποσελίδες θα διαγραφούν επίσης.", + "page.delete.confirm.title": "Εισάγετε τον τίτλο της σελίδας για επιβεβαίωση", + "page.duplicate.appendix": "Αντιγραφή", + "page.duplicate.files": "Copy files", + "page.duplicate.pages": "Copy pages", + "page.move": "Move page", + "page.sort": "Change position", + "page.status": "Kατάσταση", + "page.status.draft": "Προσχέδιο", + "page.status.draft.description": "The page is in draft mode and only visible for logged in editors or via secret link", + "page.status.listed": "Δημοσιευμένο", + "page.status.listed.description": "Αυτή η σελίδα είναι δημοσιευμένη για οποιονδήποτε", + "page.status.unlisted": "Μη καταχωρημένο", + "page.status.unlisted.description": "Η σελίδα είναι προσβάσιμη μόνο μέσω της διεύθυνσης URL", + + "pages": "Σελίδες", + "pages.empty": "Δεν υπάρχουν ακόμα σελίδες", + "pages.status.draft": "Προσχέδια", + "pages.status.listed": "Δημοσιευμένο", + "pages.status.unlisted": "Μη καταχωρημένο", + + "pagination.page": "Σελίδα", + + "password": "\u039a\u03c9\u03b4\u03b9\u03ba\u03cc\u03c2 \u03a0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7\u03c2", + "paste": "Paste", + "paste.after": "Paste after", + "paste.success": "{count} pasted!", + "pixel": "Εικονοστοιχέιο", + "plugin": "Plugin", + "plugins": "Plugins", + "prev": "Προηγούμενο", + "preview": "Preview", + "remove": "Αφαίρεση", + "rename": "Μετονομασία", + "renew": "Renew", + "replace": "\u0391\u03bd\u03c4\u03b9\u03ba\u03b1\u03c4\u03ac\u03c3\u03c4\u03b1\u03c3\u03b7", + "replace.with": "Replace with", + "retry": "\u0395\u03c0\u03b1\u03bd\u03ac\u03bb\u03b7\u03c8\u03b7", + "revert": "\u0391\u03b3\u03bd\u03cc\u03b7\u03c3\u03b7", + "revert.confirm": "Do you really want to delete all unsaved changes?", + + "role": "\u03a1\u03cc\u03bb\u03bf\u03c2", + "role.admin.description": "The admin has all rights", + "role.admin.title": "Admin", + "role.all": "Όλα", + "role.empty": "Δεν υπάρχουν χρήστες με αυτόν τον ρόλο", + "role.description.placeholder": "Χωρίς περιγραφή", + "role.nobody.description": "This is a fallback role without any permissions", + "role.nobody.title": "Nobody", + + "save": "\u0391\u03c0\u03bf\u03b8\u03ae\u03ba\u03b5\u03c5\u03c3\u03b7", + "search": "Αναζήτηση", + "search.min": "Enter {min} characters to search", + "search.all": "Show all {count} results", + "search.results.none": "No results", + + "section.invalid": "The section is invalid", + "section.required": "The section is required", + + "security": "Security", + "select": "Επιλογή", + "server": "Server", + "settings": "Ρυθμίσεις", + "show": "Show", + "site.blueprint": "The site has no blueprint yet. You can define the setup in /site/blueprints/site.yml", + "size": "Μέγεθος", + "slug": "\u0395\u03c0\u03af\u03b8\u03b5\u03bc\u03b1 URL", + "sort": "Ταξινόμηση", + "sort.drag": "Drag to sort …", + "split": "Split", + + "stats.empty": "No reports", + "status": "Kατάσταση", + + "system.info.copy": "Copy info", + "system.info.copied": "System info copied", + "system.issues.content": "The content folder seems to be exposed", + "system.issues.eol.kirby": "Your installed Kirby version has reached end-of-life and will not receive further security updates", + "system.issues.eol.plugin": "Your installed version of the { plugin } plugin is has reached end-of-life and will not receive further security updates", + "system.issues.eol.php": "Your installed PHP release { release } has reached end-of-life and will not receive further security updates", + "system.issues.debug": "Debugging must be turned off in production", + "system.issues.git": "The .git folder seems to be exposed", + "system.issues.https": "We recommend HTTPS for all your sites", + "system.issues.kirby": "The kirby folder seems to be exposed", + "system.issues.site": "The site folder seems to be exposed", + "system.issues.vulnerability.kirby": "Your installation might be affected by the following vulnerability ({ severity } severity): { description }", + "system.issues.vulnerability.plugin": "Your installation might be affected by the following vulnerability in the { plugin } plugin ({ severity } severity): { description }", + "system.updateStatus": "Update status", + "system.updateStatus.error": "Could not check for updates", + "system.updateStatus.not-vulnerable": "No known vulnerabilities", + "system.updateStatus.security-update": "Free security update { version } available", + "system.updateStatus.security-upgrade": "Upgrade { version } with security fixes available", + "system.updateStatus.unreleased": "Unreleased version", + "system.updateStatus.up-to-date": "Up to date", + "system.updateStatus.update": "Free update { version } available", + "system.updateStatus.upgrade": "Upgrade { version } available", + + "tel": "Phone", + "tel.placeholder": "+49123456789", + "template": "\u03a0\u03c1\u03cc\u03c4\u03c5\u03c0\u03bf", + "title": "Τίτλος", + "today": "Σήμερα", + + "toolbar.button.clear": "Clear formatting", + "toolbar.button.code": "Κώδικας", + "toolbar.button.bold": "\u0388\u03bd\u03c4\u03bf\u03bd\u03b7 \u03b3\u03c1\u03b1\u03c6\u03ae", + "toolbar.button.email": "Email", + "toolbar.button.headings": "Επικεφαλίδες", + "toolbar.button.heading.1": "Επικεφαλίδα 1", + "toolbar.button.heading.2": "Επικεφαλίδα 2", + "toolbar.button.heading.3": "Επικεφαλίδα 3", + "toolbar.button.heading.4": "Heading 4", + "toolbar.button.heading.5": "Heading 5", + "toolbar.button.heading.6": "Heading 6", + "toolbar.button.italic": "\u03a0\u03bb\u03ac\u03b3\u03b9\u03b1 \u03b3\u03c1\u03b1\u03c6\u03ae", + "toolbar.button.file": "Αρχείο", + "toolbar.button.file.select": "Select a file", + "toolbar.button.file.upload": "Upload a file", + "toolbar.button.link": "\u03a3\u03cd\u03bd\u03b4\u03b5\u03c3\u03bc\u03bf\u03c2", + "toolbar.button.paragraph": "Paragraph", + "toolbar.button.strike": "Strike-through", + "toolbar.button.sub": "Subscript", + "toolbar.button.sup": "Superscript", + "toolbar.button.ol": "Ταξινομημένη λίστα", + "toolbar.button.underline": "Underline", + "toolbar.button.ul": "Λίστα κουκκίδων", + + "translation.author": "Ομάδα Kirby", + "translation.direction": "ltr", + "translation.name": "\u0395\u03bb\u03bb\u03b7\u03bd\u03b9\u03ba\u03ac", + "translation.locale": "el_GR", + + "type": "Type", + + "upload": "Μεταφόρτωση", + "upload.error.cantMove": "The uploaded file could not be moved", + "upload.error.cantWrite": "Failed to write file to disk", + "upload.error.default": "The file could not be uploaded", + "upload.error.extension": "File upload stopped by extension", + "upload.error.formSize": "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the form", + "upload.error.iniPostSize": "The uploaded file exceeds the post_max_size directive in php.ini", + "upload.error.iniSize": "The uploaded file exceeds the upload_max_filesize directive in php.ini", + "upload.error.noFile": "No file was uploaded", + "upload.error.noFiles": "No files were uploaded", + "upload.error.partial": "The uploaded file was only partially uploaded", + "upload.error.tmpDir": "Missing a temporary folder", + "upload.errors": "Σφάλμα", + "upload.progress": "Μεταφόρτωση...", + + "url": "Διεύθινση url", + "url.placeholder": "https://example.com", + + "user": "Χρήστης", + "user.blueprint": "You can define additional sections and form fields for this user role in /site/blueprints/users/{blueprint}.yml", + "user.changeEmail": "Αλλαγή διεύθινσης ηλεκτρονικού ταχυδρομείου", + "user.changeLanguage": "Αλλαγή γλώσσας", + "user.changeName": "Μετονομασία χρήστη", + "user.changePassword": "Αλλαγή κωδικού πρόσβασης", + "user.changePassword.new": "Νέος Κωδικός Πρόσβασης", + "user.changePassword.new.confirm": "Επαληθεύση κωδικού πρόσβασης", + "user.changeRole": "Αλλαγή ρόλου", + "user.changeRole.select": "Επιλογή νέου ρόλου", + "user.create": "Προσθήκη νέου χρήστη", + "user.delete": "Διαγραφή χρήστη", + "user.delete.confirm": "\u0398\u03ad\u03bb\u03b5\u03c4\u03b5 \u03c3\u03af\u03b3\u03bf\u03c5\u03c1\u03b1 \u03bd\u03b1 \u03b4\u03b9\u03b1\u03b3\u03c1\u03ac\u03c8\u03b5\u03c4\u03b5 \u03b1\u03c5\u03c4\u03cc\u03bd \u03c4\u03bf\u03bd \u03c7\u03c1\u03ae\u03c3\u03c4\u03b7;", + + "users": "Χρήστες", + + "version": "\u0388\u03ba\u03b4\u03bf\u03c3\u03b7 Kirby", + "version.current": "Current version", + "version.latest": "Latest version", + "versionInformation": "Version information", + + "view.account": "\u039f \u03bb\u03bf\u03b3\u03b1\u03c1\u03b9\u03b1\u03c3\u03bc\u03cc\u03c2 \u03c3\u03b1\u03c2", + "view.installation": "\u0395\u03b3\u03ba\u03b1\u03c4\u03ac\u03c3\u03c4\u03b1\u03c3\u03b7", + "view.languages": "Γλώσσες", + "view.resetPassword": "Reset password", + "view.site": "Iστοσελίδα", + "view.system": "System", + "view.users": "\u03a7\u03c1\u03ae\u03c3\u03c4\u03b5\u03c2", + + "welcome": "Καλώς ήρθατε", + "year": "Έτος", + "yes": "yes" +} diff --git a/kirby/i18n/translations/en.json b/kirby/i18n/translations/en.json new file mode 100644 index 0000000..d43474d --- /dev/null +++ b/kirby/i18n/translations/en.json @@ -0,0 +1,733 @@ +{ + "account.changeName": "Change your name", + "account.delete": "Delete your account", + "account.delete.confirm": "Do you really want to delete your account? You will be logged out immediately. Your account cannot be recovered.", + + "activate": "Activate", + "add": "Add", + "alpha": "Alpha", + "author": "Author", + "avatar": "Profile picture", + "back": "Back", + "cancel": "Cancel", + "change": "Change", + "close": "Close", + "changes": "Changes", + "confirm": "Ok", + "collapse": "Collapse", + "collapse.all": "Collapse All", + "color": "Color", + "coordinates": "Coordinates", + "copy": "Copy", + "copy.all": "Copy all", + "copy.success": "{count} copied!", + "create": "Create", + "custom": "Custom", + + "date": "Date", + "date.select": "Select a date", + + "day": "Day", + "days.fri": "Fri", + "days.mon": "Mon", + "days.sat": "Sat", + "days.sun": "Sun", + "days.thu": "Thu", + "days.tue": "Tue", + "days.wed": "Wed", + + "debugging": "Debugging", + + "delete": "Delete", + "delete.all": "Delete all", + + "dialog.fields.empty": "This dialog has no fields", + "dialog.files.empty": "No files to select", + "dialog.pages.empty": "No pages to select", + "dialog.text.empty": "This dialog does not define any text", + "dialog.users.empty": "No users to select", + + "dimensions": "Dimensions", + "disable": "Disable", + "disabled": "Disabled", + "discard": "Discard", + + "drawer.fields.empty": "This drawer has no fields", + + "domain": "Domain", + "download": "Download", + "duplicate": "Duplicate", + + "edit": "Edit", + + "email": "Email", + "email.placeholder": "mail@example.com", + + "enter": "Enter", + "entries": "Entries", + "entry": "Entry", + + "environment": "Environment", + + "error": "Error", + "error.access.code": "Invalid code", + "error.access.login": "Invalid login", + "error.access.panel": "You are not allowed to access the panel", + "error.access.view": "You are not allowed to access this part of the panel", + + "error.avatar.create.fail": "The profile picture could not be uploaded", + "error.avatar.delete.fail": "The profile picture could not be deleted", + "error.avatar.dimensions.invalid": "Please keep the width and height of the profile picture under 3000 pixels", + "error.avatar.mime.forbidden": "The profile picture must be JPEG or PNG files", + + "error.blueprint.notFound": "The blueprint \"{name}\" could not be loaded", + + "error.blocks.max.plural": "You must not add more than {max} blocks", + "error.blocks.max.singular": "You must not add more than one block", + "error.blocks.min.plural": "You must add at least {min} blocks", + "error.blocks.min.singular": "You must add at least one block", + "error.blocks.validation": "There's an error on the \"{field}\" field in block {index} using the \"{fieldset}\" block type", + + "error.cache.type.invalid": "Invalid cache type \"{type}\"", + + "error.email.preset.notFound": "The email preset \"{name}\" cannot be found", + + "error.field.converter.invalid": "Invalid converter \"{converter}\"", + "error.field.type.missing": "Field \"{ name }\": The field type \"{ type }\" does not exist", + + "error.file.changeName.empty": "The name must not be empty", + "error.file.changeName.permission": "You are not allowed to change the name of \"{filename}\"", + "error.file.changeTemplate.invalid": "The template for the file \"{id}\" cannot be changed to \"{template}\" (valid: \"{blueprints}\")", + "error.file.changeTemplate.permission": "You are not allowed to change the template for the file \"{id}\"", + + "error.file.duplicate": "A file with the name \"{filename}\" already exists", + "error.file.extension.forbidden": "The extension \"{extension}\" is not allowed", + "error.file.extension.invalid": "Invalid extension: {extension}", + "error.file.extension.missing": "The extensions for \"{filename}\" is missing", + "error.file.maxheight": "The height of the image must not exceed {height} pixels", + "error.file.maxsize": "The file is too large", + "error.file.maxwidth": "The width of the image must not exceed {width} pixels", + "error.file.mime.differs": "The uploaded file must be of the same mime type \"{mime}\"", + "error.file.mime.forbidden": "The media type \"{mime}\" is not allowed", + "error.file.mime.invalid": "Invalid mime type: {mime}", + "error.file.mime.missing": "The media type for \"{filename}\" cannot be detected", + "error.file.minheight": "The height of the image must be at least {height} pixels", + "error.file.minsize": "The file is too small", + "error.file.minwidth": "The width of the image must be at least {width} pixels", + "error.file.name.unique": "The filename must be unique", + "error.file.name.missing": "The filename must not be empty", + "error.file.notFound": "The file \"{filename}\" cannot be found", + "error.file.orientation": "The orientation of the image must be \"{orientation}\"", + "error.file.type.forbidden": "You are not allowed to upload {type} files", + "error.file.type.invalid": "Invalid file type: {type}", + "error.file.undefined": "The file cannot be found", + + "error.form.incomplete": "Please fix all form errors…", + "error.form.notSaved": "The form could not be saved", + + "error.language.code": "Please enter a valid code for the language", + "error.language.create.permission": "You are not allowed to create a language", + "error.language.delete.permission": "You are not allowed to delete the language", + "error.language.duplicate": "The language already exists", + "error.language.name": "Please enter a valid name for the language", + "error.language.notFound": "The language could not be found", + "error.language.update.permission": "You are not allowed to update the language", + + "error.layout.validation.block": "There's an error on the \"{field}\" field in block {blockIndex} using the \"{fieldset}\" block type in layout {layoutIndex}", + "error.layout.validation.settings": "There's an error in layout {index} settings", + + "error.license.domain": "The domain for the license is missing", + "error.license.email": "Please enter a valid email address", + "error.license.format": "Please enter a valid license code", + "error.license.verification": "The license could not be verified", + + "error.login.totp.confirm.invalid": "Invalid code", + "error.login.totp.confirm.missing": "Please enter the current code", + + "error.object.validation": "There’s an error in the \"{label}\" field:\n{message}", + + "error.offline": "The Panel is currently offline", + + "error.page.changeSlug.permission": "You are not allowed to change the URL appendix for \"{slug}\"", + "error.page.changeSlug.reserved": "The path of top-level pages must not start with \"{path}\"", + "error.page.changeStatus.incomplete": "The page has errors and cannot be published", + "error.page.changeStatus.permission": "The status for this page cannot be changed", + "error.page.changeStatus.toDraft.invalid": "The page \"{slug}\" cannot be converted to a draft", + "error.page.changeTemplate.invalid": "The template for the page \"{slug}\" cannot be changed", + "error.page.changeTemplate.permission": "You are not allowed to change the template for \"{slug}\"", + "error.page.changeTitle.empty": "The title must not be empty", + "error.page.changeTitle.permission": "You are not allowed to change the title for \"{slug}\"", + "error.page.create.permission": "You are not allowed to create \"{slug}\"", + "error.page.delete": "The page \"{slug}\" cannot be deleted", + "error.page.delete.confirm": "Please enter the page title to confirm", + "error.page.delete.hasChildren": "The page has subpages and cannot be deleted", + "error.page.delete.permission": "You are not allowed to delete \"{slug}\"", + "error.page.draft.duplicate": "A page draft with the URL appendix \"{slug}\" already exists", + "error.page.duplicate": "A page with the URL appendix \"{slug}\" already exists", + "error.page.duplicate.permission": "You are not allowed to duplicate \"{slug}\"", + "error.page.move.ancestor": "The page cannot be moved into itself", + "error.page.move.directory": "The page directory cannot be moved", + "error.page.move.duplicate": "A sub page with the URL appendix \"{slug}\" already exists", + "error.page.move.notFound": "The moved page could not be found", + "error.page.move.permission": "You are not allowed to move \"{slug}\"", + "error.page.move.template": "The \"{template}\" template is not accepted as a subpage of \"{parent}\"", + "error.page.notFound": "The page \"{slug}\" cannot be found", + "error.page.num.invalid": "Please enter a valid sorting number. Numbers must not be negative.", + "error.page.slug.invalid": "Please enter a valid URL appendix", + "error.page.slug.maxlength": "Slug length must be less than \"{length}\" characters", + "error.page.sort.permission": "The page \"{slug}\" cannot be sorted", + "error.page.status.invalid": "Please set a valid page status", + "error.page.undefined": "The page cannot be found", + "error.page.update.permission": "You are not allowed to update \"{slug}\"", + + "error.section.files.max.plural": "You must not add more than {max} files to the \"{section}\" section", + "error.section.files.max.singular": "You must not add more than one file to the \"{section}\" section", + "error.section.files.min.plural": "The \"{section}\" section requires at least {min} files", + "error.section.files.min.singular": "The \"{section}\" section requires at least one file", + + "error.section.pages.max.plural": "You must not add more than {max} pages to the \"{section}\" section", + "error.section.pages.max.singular": "You must not add more than one page to the \"{section}\" section", + "error.section.pages.min.plural": "The \"{section}\" section requires at least {min} pages", + "error.section.pages.min.singular": "The \"{section}\" section requires at least one page", + + "error.section.notLoaded": "The section \"{name}\" could not be loaded", + "error.section.type.invalid": "The section type \"{type}\" is not valid", + + "error.site.changeTitle.empty": "The title must not be empty", + "error.site.changeTitle.permission": "You are not allowed to change the title of the site", + "error.site.update.permission": "You are not allowed to update the site", + + "error.structure.validation": "There's an error on the \"{field}\" field in row {index}", + + "error.template.default.notFound": "The default template does not exist", + + "error.unexpected": "An unexpected error occurred! Enable debug mode for more info: https://getkirby.com/docs/reference/system/options/debug", + + "error.user.changeEmail.permission": "You are not allowed to change the email for the user \"{name}\"", + "error.user.changeLanguage.permission": "You are not allowed to change the language for the user \"{name}\"", + "error.user.changeName.permission": "You are not allowed to change the name for the user \"{name}\"", + "error.user.changePassword.permission": "You are not allowed to change the password for the user \"{name}\"", + "error.user.changeRole.lastAdmin": "The role for the last admin cannot be changed", + "error.user.changeRole.permission": "You are not allowed to change the role for the user \"{name}\"", + "error.user.changeRole.toAdmin": "You are not allowed to promote someone to the admin role", + "error.user.create.permission": "You are not allowed to create this user", + "error.user.delete": "The user \"{name}\" cannot be deleted", + "error.user.delete.lastAdmin": "The last admin cannot be deleted", + "error.user.delete.lastUser": "The last user cannot be deleted", + "error.user.delete.permission": "You are not allowed to delete the user \"{name}\"", + "error.user.duplicate": "A user with the email address \"{email}\" already exists", + "error.user.email.invalid": "Please enter a valid email address", + "error.user.language.invalid": "Please enter a valid language", + "error.user.notFound": "The user \"{name}\" cannot be found", + "error.user.password.excessive": "Please enter a valid password. Passwords must not be longer than 1000 characters.", + "error.user.password.invalid": "Please enter a valid password. Passwords must be at least 8 characters long.", + "error.user.password.notSame": "The passwords do not match", + "error.user.password.undefined": "The user does not have a password", + "error.user.password.wrong": "Wrong password", + "error.user.role.invalid": "Please enter a valid role", + "error.user.undefined": "The user cannot be found", + "error.user.update.permission": "You are not allowed to update the user \"{name}\"", + + "error.validation.accepted": "Please confirm", + "error.validation.alpha": "Please only enter characters between a-z", + "error.validation.alphanum": "Please only enter characters between a-z or numerals 0-9", + "error.validation.anchor": "Please enter a correct link anchor", + "error.validation.between": "Please enter a value between \"{min}\" and \"{max}\"", + "error.validation.boolean": "Please confirm or deny", + "error.validation.color": "Please enter a valid color in the {format} format", + "error.validation.contains": "Please enter a value that contains \"{needle}\"", + "error.validation.date": "Please enter a valid date", + "error.validation.date.after": "Please enter a date after {date}", + "error.validation.date.before": "Please enter a date before {date}", + "error.validation.date.between": "Please enter a date between {min} and {max}", + "error.validation.denied": "Please deny", + "error.validation.different": "The value must not be \"{other}\"", + "error.validation.email": "Please enter a valid email address", + "error.validation.endswith": "The value must end with \"{end}\"", + "error.validation.filename": "Please enter a valid filename", + "error.validation.in": "Please enter one of the following: ({in})", + "error.validation.integer": "Please enter a valid integer", + "error.validation.ip": "Please enter a valid IP address", + "error.validation.less": "Please enter a value lower than {max}", + "error.validation.linkType": "The link type is not allowed", + "error.validation.match": "The value does not match the expected pattern", + "error.validation.max": "Please enter a value equal to or lower than {max}", + "error.validation.maxlength": "Please enter a shorter value. (max. {max} characters)", + "error.validation.maxwords": "Please enter no more than {max} word(s)", + "error.validation.min": "Please enter a value equal to or greater than {min}", + "error.validation.minlength": "Please enter a longer value. (min. {min} characters)", + "error.validation.minwords": "Please enter at least {min} word(s)", + "error.validation.more": "Please enter a greater value than {min}", + "error.validation.notcontains": "Please enter a value that does not contain \"{needle}\"", + "error.validation.notin": "Please don't enter any of the following: ({notIn})", + "error.validation.option": "Please select a valid option", + "error.validation.num": "Please enter a valid number", + "error.validation.required": "Please enter something", + "error.validation.same": "Please enter \"{other}\"", + "error.validation.size": "The size of the value must be \"{size}\"", + "error.validation.startswith": "The value must start with \"{start}\"", + "error.validation.tel": "Please enter an unformatted phone number", + "error.validation.time": "Please enter a valid time", + "error.validation.time.after": "Please enter a time after {time}", + "error.validation.time.before": "Please enter a time before {time}", + "error.validation.time.between": "Please enter a time between {min} and {max}", + "error.validation.uuid": "Please enter a valid UUID", + "error.validation.url": "Please enter a valid URL", + + "expand": "Expand", + "expand.all": "Expand All", + + "field.invalid": "The field is invalid", + "field.required": "The field is required", + "field.blocks.changeType": "Change type", + "field.blocks.code.name": "Code", + "field.blocks.code.language": "Language", + "field.blocks.code.placeholder": "Your code …", + "field.blocks.delete.confirm": "Do you really want to delete this block?", + "field.blocks.delete.confirm.all": "Do you really want to delete all blocks?", + "field.blocks.delete.confirm.selected": "Do you really want to delete the selected blocks?", + "field.blocks.empty": "No blocks yet", + "field.blocks.fieldsets.empty": "No fieldsets yet", + "field.blocks.fieldsets.label": "Please select a block type …", + "field.blocks.fieldsets.paste": "Press {{ shortcut }} to import layouts/blocks from your clipboard Only those allowed in the current field will get inserted.", + "field.blocks.gallery.name": "Gallery", + "field.blocks.gallery.images.empty": "No images yet", + "field.blocks.gallery.images.label": "Images", + "field.blocks.heading.level": "Level", + "field.blocks.heading.name": "Heading", + "field.blocks.heading.text": "Text", + "field.blocks.heading.placeholder": "Heading …", + "field.blocks.image.alt": "Alternative text", + "field.blocks.image.caption": "Caption", + "field.blocks.image.crop": "Crop", + "field.blocks.image.link": "Link", + "field.blocks.image.location": "Location", + "field.blocks.image.location.internal": "This website", + "field.blocks.image.location.external": "External source", + "field.blocks.image.name": "Image", + "field.blocks.image.placeholder": "Select an image", + "field.blocks.image.ratio": "Ratio", + "field.blocks.image.url": "Image URL", + "field.blocks.line.name": "Line", + "field.blocks.list.name": "List", + "field.blocks.markdown.name": "Markdown", + "field.blocks.markdown.label": "Text", + "field.blocks.markdown.placeholder": "Markdown …", + "field.blocks.quote.name": "Quote", + "field.blocks.quote.text.label": "Text", + "field.blocks.quote.text.placeholder": "Quote …", + "field.blocks.quote.citation.label": "Citation", + "field.blocks.quote.citation.placeholder": "by …", + "field.blocks.text.name": "Text", + "field.blocks.text.placeholder": "Text …", + "field.blocks.video.autoplay": "Autoplay", + "field.blocks.video.caption": "Caption", + "field.blocks.video.controls": "Controls", + "field.blocks.video.location": "Location", + "field.blocks.video.loop": "Loop", + "field.blocks.video.muted": "Muted", + "field.blocks.video.name": "Video", + "field.blocks.video.placeholder": "Enter a video URL", + "field.blocks.video.poster": "Poster", + "field.blocks.video.preload": "Preload", + "field.blocks.video.url.label": "Video-URL", + "field.blocks.video.url.placeholder": "https://youtube.com/?v=", + + "field.files.empty": "No files selected yet", + + "field.layout.change": "Change layout", + "field.layout.delete": "Delete layout", + "field.layout.delete.confirm": "Do you really want to delete this layout?", + "field.layout.delete.confirm.all": "Do you really want to delete all layouts?", + "field.layout.empty": "No rows yet", + "field.layout.select": "Select a layout", + + "field.object.empty": "No information yet", + + "field.pages.empty": "No pages selected yet", + + "field.structure.delete.confirm": "Do you really want to delete this row?", + "field.structure.delete.confirm.all": "Do you really want to delete all entries?", + "field.structure.empty": "No entries yet", + + "field.users.empty": "No users selected yet", + + "fields.empty": "No fields yet", + + "file": "File", + "file.blueprint": "This file has no blueprint yet. You can define the setup in /site/blueprints/files/{blueprint}.yml", + "file.changeTemplate": "Change template", + "file.changeTemplate.notice": "Changing the file's template will remove content for fields that don't match in type. If the new template defines certain rules, e.g. image dimensions, those will also be applied irreversibly. Use with caution.", + "file.delete.confirm": "Do you really want to delete
{filename}?", + "file.focus.placeholder": "Set focal point", + "file.focus.reset": "Remove focal point", + "file.focus.title": "Focus", + "file.sort": "Change position", + + "files": "Files", + "files.empty": "No files yet", + + "filter": "Filter", + + "hide": "Hide", + "hour": "Hour", + "hue": "Hue", + "import": "Import", + "info": "Info", + "insert": "Insert", + "insert.after": "Insert after", + "insert.before": "Insert before", + "install": "Install", + + "installation": "Installation", + "installation.completed": "The panel has been installed", + "installation.disabled": "The panel installer is disabled on public servers by default. Please run the installer on a local machine or enable it with the panel.install option.", + "installation.issues.accounts": "The /site/accounts folder does not exist or is not writable", + "installation.issues.content": "The /content folder does not exist or is not writable", + "installation.issues.curl": "The CURL extension is required", + "installation.issues.headline": "The panel cannot be installed", + "installation.issues.mbstring": "The MB String extension is required", + "installation.issues.media": "The /media folder does not exist or is not writable", + "installation.issues.php": "Make sure to use PHP 8+", + "installation.issues.sessions": "The /site/sessions folder does not exist or is not writable", + + "language": "Language", + "language.code": "Code", + "language.convert": "Make default", + "language.convert.confirm": "

Do you really want to convert {name} to the default language? This cannot be undone.

If {name} has untranslated content, there will no longer be a valid fallback and parts of your site might be empty.

", + "language.create": "Add a new language", + "language.default": "Default language", + "language.delete.confirm": "Do you really want to delete the language {name} including all translations? This cannot be undone!", + "language.deleted": "The language has been deleted", + "language.direction": "Reading direction", + "language.direction.ltr": "Left to right", + "language.direction.rtl": "Right to left", + "language.locale": "PHP locale string", + "language.locale.warning": "You are using a custom locale set up. Please modify it in the language file in /site/languages", + "language.name": "Name", + "language.secondary": "Secondary language", + "language.settings": "Language settings", + "language.updated": "The language has been updated", + "language.variables": "Language variables", + "language.variables.empty": "No translations yet", + + "language.variable.delete.confirm": "Do you really want to delete the variable for {key}?", + "language.variable.key": "Key", + "language.variable.notFound": "The variable could not be found", + "language.variable.value": "Value", + + "languages": "Languages", + "languages.default": "Default language", + "languages.empty": "There are no languages yet", + "languages.secondary": "Secondary languages", + "languages.secondary.empty": "There are no secondary languages yet", + + "license": "License", + "license.activate": "Activate it now", + "license.activate.label": "Please activate your license", + "license.activate.domain": "Your license will be activated for {host}.", + "license.activate.local": "You are about to activate your Kirby license for your local domain {host}. If this site will be deployed to a public domain, please activate it there instead. If {host} is the domain you want to use your license for, please continue.", + "license.activated": "Activated", + "license.buy": "Buy a license", + "license.code": "Code", + "license.code.help": "You received your license code after the purchase via email. Please copy and paste it here.", + "license.code.label": "Please enter your license code", + "license.status.active.info": "Includes new major versions until {date}", + "license.status.active.label": "Valid license", + "license.status.demo.info": "This is a demo installation", + "license.status.demo.label": "Demo", + "license.status.inactive.info": "Renew license to update to new major versions", + "license.status.inactive.label": "No new major versions", + "license.status.legacy.bubble": "Ready to renew your license?", + "license.status.legacy.info": "Your license does not cover this version", + "license.status.legacy.label": "Please renew your license", + "license.status.missing.bubble": "Ready to launch your site?", + "license.status.missing.info": "No valid license", + "license.status.missing.label": "Please activate your license", + "license.manage": "Manage your licenses", + "license.purchased": "Purchased", + "license.success": "Thank you for supporting Kirby", + "license.unregistered.label": "Unregistered", + + "link": "Link", + "link.text": "Link text", + + "loading": "Loading", + + "lock.unsaved": "Unsaved changes", + "lock.unsaved.empty": "There are no more unsaved changes", + "lock.isLocked": "Unsaved changes by {email}", + "lock.unlock": "Unlock", + "lock.unlock.submit": "Unlock and overwrite unsaved changes by {email}", + "lock.isUnlocked": "Was unlocked by another user", + + "login": "Log in", + "login.code.label.login": "Login code", + "login.code.label.password-reset": "Password reset code", + "login.code.placeholder.email": "000 000", + "login.code.placeholder.totp": "000000", + "login.code.text.email": "If your email address is registered, the requested code was sent via email.", + "login.code.text.totp": "Please enter the one‑time code from your authenticator app.", + "login.email.login.body": "Hi {user.nameOrEmail},\n\nYou recently requested a login code for the Panel of {site}.\nThe following login code will be valid for {timeout} minutes:\n\n{code}\n\nIf you did not request a login code, please ignore this email or contact your administrator if you have questions.\nFor security, please DO NOT forward this email.", + "login.email.login.subject": "Your login code", + "login.email.password-reset.body": "Hi {user.nameOrEmail},\n\nYou recently requested a password reset code for the Panel of {site}.\nThe following password reset code will be valid for {timeout} minutes:\n\n{code}\n\nIf you did not request a password reset code, please ignore this email or contact your administrator if you have questions.\nFor security, please DO NOT forward this email.", + "login.email.password-reset.subject": "Your password reset code", + "login.remember": "Keep me logged in", + "login.reset": "Reset password", + "login.toggleText.code.email": "Login via email", + "login.toggleText.code.email-password": "Login with password", + "login.toggleText.password-reset.email": "Forgot your password?", + "login.toggleText.password-reset.email-password": "← Back to login", + "login.totp.enable.option": "Set up one‑time codes", + "login.totp.enable.intro": "Authenticator apps can generate one‑time codes that are used as a second factor when signing into your account.", + "login.totp.enable.qr.label": "1. Scan this QR code", + "login.totp.enable.qr.help": "Unable to scan? Add the setup key {secret} manually to your authenticator app.", + "login.totp.enable.confirm.headline": "2. Confirm with generated code", + "login.totp.enable.confirm.text": "Your app generates a new one‑time code every 30 seconds. Enter the current code to complete the setup:", + "login.totp.enable.confirm.label": "Current code", + "login.totp.enable.confirm.help": "After this setup, we will ask you for a one‑time code every time you log in.", + "login.totp.enable.success": "One‑time codes enabled", + "login.totp.disable.option": "Disable one‑time codes", + "login.totp.disable.label": "Enter your password to disable one‑time codes", + "login.totp.disable.help": "In the future, a different second factor like a login code sent via email will be requested when you log in. You can always set up one‑time codes again later.", + "login.totp.disable.admin": "

This will disable one‑time codes for {user}.

In the future, a different second factor like a login code sent via email will be requested when they log in. {user} can set up one‑time codes again after their next login.

", + "login.totp.disable.success": "One‑time codes disabled", + + "logout": "Log out", + + "merge": "Merge", + "menu": "Menu", + "meridiem": "AM/PM", + "mime": "Media Type", + "minutes": "Minutes", + + "month": "Month", + "months.april": "April", + "months.august": "August", + "months.december": "December", + "months.february": "February", + "months.january": "January", + "months.july": "July", + "months.june": "June", + "months.march": "March", + "months.may": "May", + "months.november": "November", + "months.october": "October", + "months.september": "September", + + "more": "More", + "move": "Move", + "name": "Name", + "next": "Next", + "night": "Night", + "no": "no", + "off": "off", + "on": "on", + "open": "Open", + "open.newWindow": "Open in new window", + "option": "Option", + "options": "Options", + "options.none": "No options", + "options.all": "Show all {count} options", + + "orientation": "Orientation", + "orientation.landscape": "Landscape", + "orientation.portrait": "Portrait", + "orientation.square": "Square", + + "page": "Page", + "page.blueprint": "This page has no blueprint yet. You can define the setup in /site/blueprints/pages/{blueprint}.yml", + "page.changeSlug": "Change URL", + "page.changeSlug.fromTitle": "Create from title", + "page.changeStatus": "Change status", + "page.changeStatus.position": "Please select a position", + "page.changeStatus.select": "Select a new status", + "page.changeTemplate": "Change template", + "page.changeTemplate.notice": "Changing the page's template will remove content for fields that don't match in type. Use with caution.", + "page.create": "Create as {status}", + "page.delete.confirm": "Do you really want to delete {title}?", + "page.delete.confirm.subpages": "This page has subpages.
All subpages will be deleted as well.", + "page.delete.confirm.title": "Enter the page title to confirm", + "page.duplicate.appendix": "Copy", + "page.duplicate.files": "Copy files", + "page.duplicate.pages": "Copy pages", + "page.move": "Move page", + "page.sort": "Change position", + "page.status": "Status", + "page.status.draft": "Draft", + "page.status.draft.description": "The page is in draft mode and only visible for logged in editors or via secret link", + "page.status.listed": "Public", + "page.status.listed.description": "The page is public for anyone", + "page.status.unlisted": "Unlisted", + "page.status.unlisted.description": "The page is only accessible via URL", + + "pages": "Pages", + "pages.empty": "No pages yet", + "pages.status.draft": "Drafts", + "pages.status.listed": "Published", + "pages.status.unlisted": "Unlisted", + + "pagination.page": "Page", + + "password": "Password", + "paste": "Paste", + "paste.after": "Paste after", + "paste.success": "{count} pasted!", + "pixel": "Pixel", + "plugin": "Plugin", + "plugins": "Plugins", + "prev": "Previous", + "preview": "Preview", + "remove": "Remove", + "rename": "Rename", + "renew": "Renew", + "replace": "Replace", + "replace.with": "Replace with", + "retry": "Try again", + "revert": "Revert", + "revert.confirm": "Do you really want to delete all unsaved changes?", + + "role": "Role", + "role.admin.description": "The admin has all rights", + "role.admin.title": "Admin", + "role.all": "All", + "role.empty": "There are no users with this role", + "role.description.placeholder": "No description", + "role.nobody.description": "This is a fallback role without any permissions", + "role.nobody.title": "Nobody", + + "save": "Save", + "search": "Search", + "search.min": "Enter {min} characters to search", + "search.all": "Show all {count} results", + "search.results.none": "No results", + + "section.invalid": "The section is invalid", + "section.required": "The section is required", + + "security": "Security", + "select": "Select", + "server": "Server", + "settings": "Settings", + "show": "Show", + "site.blueprint": "The site has no blueprint yet. You can define the setup in /site/blueprints/site.yml", + "size": "Size", + "slug": "URL appendix", + "sort": "Sort", + "sort.drag": "Drag to sort …", + "split": "Split", + + "stats.empty": "No reports", + "status": "Status", + + "system.info.copy": "Copy info", + "system.info.copied": "System info copied", + "system.issues.content": "The content folder seems to be exposed", + "system.issues.eol.kirby": "Your installed Kirby version has reached end-of-life and will not receive further security updates", + "system.issues.eol.plugin": "Your installed version of the { plugin } plugin is has reached end-of-life and will not receive further security updates", + "system.issues.eol.php": "Your installed PHP release { release } has reached end-of-life and will not receive further security updates", + "system.issues.debug": "Debugging must be turned off in production", + "system.issues.git": "The .git folder seems to be exposed", + "system.issues.https": "We recommend HTTPS for all your sites", + "system.issues.kirby": "The kirby folder seems to be exposed", + "system.issues.site": "The site folder seems to be exposed", + "system.issues.vulnerability.kirby": "Your installation might be affected by the following vulnerability ({ severity } severity): { description }", + "system.issues.vulnerability.plugin": "Your installation might be affected by the following vulnerability in the { plugin } plugin ({ severity } severity): { description }", + "system.updateStatus": "Update status", + "system.updateStatus.error": "Could not check for updates", + "system.updateStatus.not-vulnerable": "No known vulnerabilities", + "system.updateStatus.security-update": "Free security update { version } available", + "system.updateStatus.security-upgrade": "Upgrade { version } with security fixes available", + "system.updateStatus.unreleased": "Unreleased version", + "system.updateStatus.up-to-date": "Up to date", + "system.updateStatus.update": "Free update { version } available", + "system.updateStatus.upgrade": "Upgrade { version } available", + + "tel": "Phone", + "tel.placeholder": "+49123456789", + "template": "Template", + "title": "Title", + "today": "Today", + + "toolbar.button.clear": "Clear formatting", + "toolbar.button.code": "Code", + "toolbar.button.bold": "Bold", + "toolbar.button.email": "Email", + "toolbar.button.headings": "Headings", + "toolbar.button.heading.1": "Heading 1", + "toolbar.button.heading.2": "Heading 2", + "toolbar.button.heading.3": "Heading 3", + "toolbar.button.heading.4": "Heading 4", + "toolbar.button.heading.5": "Heading 5", + "toolbar.button.heading.6": "Heading 6", + "toolbar.button.italic": "Italic", + "toolbar.button.file": "File", + "toolbar.button.file.select": "Select a file", + "toolbar.button.file.upload": "Upload a file", + "toolbar.button.link": "Link", + "toolbar.button.paragraph": "Paragraph", + "toolbar.button.strike": "Strike-through", + "toolbar.button.sub": "Subscript", + "toolbar.button.sup": "Superscript", + "toolbar.button.ol": "Ordered list", + "toolbar.button.underline": "Underline", + "toolbar.button.ul": "Bullet list", + + "translation.author": "Kirby Team", + "translation.direction": "ltr", + "translation.name": "English", + "translation.locale": "en_US", + + "type": "Type", + + "upload": "Upload", + "upload.error.cantMove": "The uploaded file could not be moved", + "upload.error.cantWrite": "Failed to write file to disk", + "upload.error.default": "The file could not be uploaded", + "upload.error.extension": "File upload stopped by extension", + "upload.error.formSize": "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the form", + "upload.error.iniPostSize": "The uploaded file exceeds the post_max_size directive in php.ini", + "upload.error.iniSize": "The uploaded file exceeds the upload_max_filesize directive in php.ini", + "upload.error.noFile": "No file was uploaded", + "upload.error.noFiles": "No files were uploaded", + "upload.error.partial": "The uploaded file was only partially uploaded", + "upload.error.tmpDir": "Missing a temporary folder", + "upload.errors": "Error", + "upload.progress": "Uploading…", + + "url": "Url", + "url.placeholder": "https://example.com", + + "user": "User", + "user.blueprint": "You can define additional sections and form fields for this user role in /site/blueprints/users/{blueprint}.yml", + "user.changeEmail": "Change email", + "user.changeLanguage": "Change language", + "user.changeName": "Rename this user", + "user.changePassword": "Change password", + "user.changePassword.new": "New password", + "user.changePassword.new.confirm": "Confirm the new password…", + "user.changeRole": "Change role", + "user.changeRole.select": "Select a new role", + "user.create": "Add a new user", + "user.delete": "Delete this user", + "user.delete.confirm": "Do you really want to delete
{email}?", + + "users": "Users", + + "version": "Version", + "version.current": "Current version", + "version.latest": "Latest version", + "versionInformation": "Version information", + + "view.account": "Your account", + "view.installation": "Installation", + "view.languages": "Languages", + "view.resetPassword": "Reset password", + "view.site": "Site", + "view.system": "System", + "view.users": "Users", + + "welcome": "Welcome", + "year": "Year", + "yes": "yes" +} diff --git a/kirby/i18n/translations/eo.json b/kirby/i18n/translations/eo.json new file mode 100644 index 0000000..c1bf5b9 --- /dev/null +++ b/kirby/i18n/translations/eo.json @@ -0,0 +1,730 @@ +{ + "account.changeName": "Ŝanĝi vian nomon", + "account.delete": "Forigi vian konton", + "account.delete.confirm": "Ĉu vi certe deziras forigi vian konton? Vi estos tuj elsalutita. Ne eblos malforigi vian konton.", + + "activate": "Activate", + "add": "Aldoni", + "alpha": "Alpha", + "author": "Aŭtoro", + "avatar": "Profilbildo", + "back": "Reen", + "cancel": "Nuligi", + "change": "Ŝanĝi", + "close": "Fermi", + "changes": "Changes", + "confirm": "Bone", + "collapse": "Fermi", + "collapse.all": "Fermi ĉiujn", + "color": "Color", + "coordinates": "Coordinates", + "copy": "Kopii", + "copy.all": "Kopii ĉiujn", + "copy.success": "{count} copied!", + "create": "Krei", + "custom": "Custom", + + "date": "Dato", + "date.select": "Elekti daton", + + "day": "Tago", + "days.fri": "Ven", + "days.mon": "Lun", + "days.sat": "Sab", + "days.sun": "Dim", + "days.thu": "Ĵaŭ", + "days.tue": "Mar", + "days.wed": "Mer", + + "debugging": "Sencimigado", + + "delete": "Forigi", + "delete.all": "Forigi ĉiujn", + + "dialog.fields.empty": "This dialog has no fields", + "dialog.files.empty": "Neniu dosiero por elekti", + "dialog.pages.empty": "Neniu paĝo por elekti", + "dialog.text.empty": "This dialog does not define any text", + "dialog.users.empty": "Neniu uzanto por elekti", + + "dimensions": "Dimensioj", + "disable": "Disable", + "disabled": "Malebligita", + "discard": "Forĵeti", + + "drawer.fields.empty": "This drawer has no fields", + + "domain": "Domain", + "download": "Elŝuti", + "duplicate": "Duobligi", + + "edit": "Modifi", + + "email": "Retpoŝto", + "email.placeholder": "retpoŝto@ekzemplo.com", + + "enter": "Enter", + "entries": "Entries", + "entry": "Entry", + + "environment": "Medio", + + "error": "Eraro", + "error.access.code": "Nevalida kodo", + "error.access.login": "Nevalida ensaluto", + "error.access.panel": "Vi ne rajtas eniri la administran panelon", + "error.access.view": "Vi ne rajtas eniri ĉi tiun areon de la panelo", + + "error.avatar.create.fail": "La profilbildo ne povis esti alŝutita", + "error.avatar.delete.fail": "La profilbildo ne povis esti forigita", + "error.avatar.dimensions.invalid": "Bonvolu certigi ke la profilbildo ne estas pli ol 3000 bilderojn larĝa kaj alta", + "error.avatar.mime.forbidden": "La profilbildo devas esti dosiero en dosierformo aŭ JPEG aŭ PNG", + + "error.blueprint.notFound": "La plano \"{name}\" ne povis esti ŝargita", + + "error.blocks.max.plural": "Oni devas ne aldoni pli ol {max} blokoj", + "error.blocks.max.singular": "Vi devas ne aldoni pli ol unu bloko", + "error.blocks.min.plural": "Oni devas aldoni almenaŭ {min} blokojn", + "error.blocks.min.singular": "Oni devas aldoni almenaŭ unu blokon", + "error.blocks.validation": "There's an error on the \"{field}\" field in block {index} using the \"{fieldset}\" block type", + + "error.cache.type.invalid": "Invalid cache type \"{type}\"", + + "error.email.preset.notFound": "La retpoŝta antaŭagordo \"{name}\" ne estas trovebla", + + "error.field.converter.invalid": "Nevalida konvertilo \"{converter}\"", + "error.field.type.missing": "Field \"{ name }\": The field type \"{ type }\" does not exist", + + "error.file.changeName.empty": "La nomo ne rajtas esti malplena", + "error.file.changeName.permission": "Vi ne rajtas ŝanĝi la nomon de \"{filename}\"", + "error.file.changeTemplate.invalid": "The template for the file \"{id}\" cannot be changed to \"{template}\" (valid: \"{blueprints}\")", + "error.file.changeTemplate.permission": "You are not allowed to change the template for the file \"{id}\"", + + "error.file.duplicate": "Jam ekzistas dosiero nomita \"{filename}\"", + "error.file.extension.forbidden": "La dosiersufikso \"{extension}\" ne estas permesita", + "error.file.extension.invalid": "Nevalida dosiersufikso: {extension}", + "error.file.extension.missing": "Mankas la dosiersufiksoj por \"{filename}\"", + "error.file.maxheight": "La bildo ne povas esti pli ol {height} bilderojn alta ", + "error.file.maxsize": "La dosiero estas tro granda", + "error.file.maxwidth": "La bildo ne povas esti pli oll {width} bilderojn larĝa", + "error.file.mime.differs": "La alŝutata dosiero devas havi la saman MIME-tipon \"{mime}\"", + "error.file.mime.forbidden": "La MIME-tipo \"{mime}\" ne povas esti uzata ĉi tie", + "error.file.mime.invalid": "Nevalida MIME-tipo: {mime}", + "error.file.mime.missing": "La MIME-tipo for \"{filename}\" ne estas detektebla", + "error.file.minheight": "La bildo devas esti almenaŭ {height} bilderojn alta", + "error.file.minsize": "La dosiero estas tro malgranda", + "error.file.minwidth": "La bildo devas esti almenaŭ {width} bilderojn larĝa", + "error.file.name.unique": "The filename must be unique", + "error.file.name.missing": "La dosiernomo ne rajtas esti malplena", + "error.file.notFound": "La dosiero \"{filename}\" ne troveblas", + "error.file.orientation": "La orientiĝo de la bildo devas esti \"{orientation}\"", + "error.file.type.forbidden": "Vi ne rajtas alŝuti dosiertipon {type}", + "error.file.type.invalid": "Nevalida dosiertipo: {type}", + "error.file.undefined": "La dosiero ne troveblas", + + "error.form.incomplete": "Bonvolu korekti ĉiujn erarojn en formularo...", + "error.form.notSaved": "Ne eblis konservi la formularon", + + "error.language.code": "Bonvolu entajpi validan kodon por la lingvo", + "error.language.duplicate": "La lingvo jam ekzistas", + "error.language.name": "Bonvolu entajpi validan nomon por la lingvo", + "error.language.notFound": "La lingvo ne troveblas", + + "error.layout.validation.block": "There's an error on the \"{field}\" field in block {blockIndex} using the \"{fieldset}\" block type in layout {layoutIndex}", + "error.layout.validation.settings": "Estas eraro en la agordoj de blokaranĝo {index}", + + "error.license.domain": "The domain for the license is missing", + "error.license.email": "Bonvolu entajpi validan retpoŝtadreson", + "error.license.format": "Please enter a valid license code", + "error.license.verification": "Ne eblis kontroli la permisilon", + + "error.login.totp.confirm.invalid": "Nevalida kodo", + "error.login.totp.confirm.missing": "Please enter the current code", + + "error.object.validation": "There’s an error in the \"{label}\" field:\n{message}", + + "error.offline": "La panelo estas ĉi-momente nekonektita", + + "error.page.changeSlug.permission": "Vi ne rajtas ŝanĝi la URL-nomon de \"{slug}\"", + "error.page.changeSlug.reserved": "The path of top-level pages must not start with \"{path}\"", + "error.page.changeStatus.incomplete": "La paĝo havas erarojn, kaj tiel ne povas esti publikigita", + "error.page.changeStatus.permission": "La paĝstato ne estas ŝanĝebla", + "error.page.changeStatus.toDraft.invalid": "Ne eblas konverti la paĝon \"{slug}\" al malneto", + "error.page.changeTemplate.invalid": "Ne eblas ŝanĝi la ŝablonon de la paĝo \"{slug}\"", + "error.page.changeTemplate.permission": "Vi ne rajtas ŝanĝi la ŝablonon de \"{slug}\"", + "error.page.changeTitle.empty": "La titolo ne rajtas esti malplena", + "error.page.changeTitle.permission": "Vi ne rajtas ŝanĝi la titolon de \"{slug}\"", + "error.page.create.permission": "Vi ne rajtas krei \"{slug}\"", + "error.page.delete": "Ne eblas forigi la paĝon \"{slug}\"", + "error.page.delete.confirm": "Bonvolu entajpi la titolon de la paĝo for konfirmi", + "error.page.delete.hasChildren": "Ne eblas forigi la paĝon ĉar ĝi havas subpaĝojn", + "error.page.delete.permission": "Vi ne rajtas forigi \"{slug}\"", + "error.page.draft.duplicate": "Malneto uzanta la URL-nomon \"{slug}\" jam ekzistas", + "error.page.duplicate": "Paĝo uzanta la URL-nomon \"{slug}\" jam ekzistas", + "error.page.duplicate.permission": "Vi ne rajtas duobligi \"{slug}\"", + "error.page.move.ancestor": "The page cannot be moved into itself", + "error.page.move.directory": "The page directory cannot be moved", + "error.page.move.duplicate": "A sub page with the URL appendix \"{slug}\" already exists", + "error.page.move.notFound": "The moved page could not be found", + "error.page.move.permission": "You are not allowed to move \"{slug}\"", + "error.page.move.template": "The \"{template}\" template is not accepted as a subpage of \"{parent}\"", + "error.page.notFound": "La paĝo \"{slug}\" ne troveblas", + "error.page.num.invalid": "Bonvolu entajpi validan ord-numeron. Numeroj devas esti pozitivaj.", + "error.page.slug.invalid": "Bonvolu entajpi validan URL-nomon", + "error.page.slug.maxlength": "URL-nomo devas esti malpli ol \"{length}\" literojn longa", + "error.page.sort.permission": "Ne eblas ordigi la paĝon \"{slug}\" ", + "error.page.status.invalid": "Bonvolu elekti validan paĝstaton", + "error.page.undefined": "La paĝo ne estas trovebla", + "error.page.update.permission": "Vi ne rajtas ĝisdatigi \"{slug}\"", + + "error.section.files.max.plural": "Vi devas aldoni maksimume {max} dosierojn al sekcio \"{section}\"", + "error.section.files.max.singular": "Vi devas aldoni maksimume unu dosieron al sekcio \"{section}\"", + "error.section.files.min.plural": "La sekcio \"{section}\" bezonas almenaŭ {min} dosierojn", + "error.section.files.min.singular": "La sekcio \"{section}\" bezonas almenaŭ unu dosieron", + + "error.section.pages.max.plural": "Vi devas aldoni maksimume {max} paĝojn al sekcio \"{section}\"", + "error.section.pages.max.singular": "Vi devas aldoni maksimume unu paĝon al sekcio \"{section}\"", + "error.section.pages.min.plural": "La sekcio \"{section}\" bezonas almenaŭ {min} paĝojn", + "error.section.pages.min.singular": "La sekcio \"{section}\" bezonas almenaŭ unu paĝon", + + "error.section.notLoaded": "Ne eblis ŝarĝi la sekcion \"{section}\"", + "error.section.type.invalid": "La sekcia tipo \"{type}\" ne estas valida", + + "error.site.changeTitle.empty": "La titolo ne rajtas esti malplena", + "error.site.changeTitle.permission": "Vi ne rajtas ŝanĝi la titolon de la retejo", + "error.site.update.permission": "Vi ne rajtas ĝisdatigi la retejon", + + "error.structure.validation": "There's an error on the \"{field}\" field in row {index}", + + "error.template.default.notFound": "La defaŭlta ŝablono ne ekzistas", + + "error.unexpected": "An unexpected error occurred! Enable debug mode for more info: https://getkirby.com/docs/reference/system/options/debug", + + "error.user.changeEmail.permission": "Vi ne rajtas ŝanĝi la retpoŝtadreson de la uzanto \"{name}\"", + "error.user.changeLanguage.permission": "Vi ne rajtas ŝanĝi la lingvon de la uzanto \"{name}\"", + "error.user.changeName.permission": "Vi ne rajtas ŝanĝi la nomon de la uzanto \"{name}\"", + "error.user.changePassword.permission": "Vi ne rajtas ŝanĝi la pasvorton de la uzanto \"{name}\"", + "error.user.changeRole.lastAdmin": "Ne eblas ŝanĝi la rolon de la lasta administranto", + "error.user.changeRole.permission": "Vi ne rajtas ŝanĝi la rolon de la uzanto \"{name}\"", + "error.user.changeRole.toAdmin": "Vi ne rajtas promocii uzanton al rolo 'administranto'", + "error.user.create.permission": "Vi ne rajtas krei ĉi-tiun uzanton", + "error.user.delete": "Ne eblas forigi uzanton \"{name}\"", + "error.user.delete.lastAdmin": "Ne eblas forigi la lastan administranton", + "error.user.delete.lastUser": "Ne eblas forigi la lastan uzanton", + "error.user.delete.permission": "Vi ne rajtas forigi la uzanton \"{name}\"", + "error.user.duplicate": "Jam ekzistas uzanto kies retpoŝtadreso estas \"{email}\"", + "error.user.email.invalid": "Bonvolu entajpi validan retpoŝtadreson", + "error.user.language.invalid": "Bonvolu entajpi validan lingvon", + "error.user.notFound": "La uzanto \"{name}\" ne troveblas", + "error.user.password.excessive": "Please enter a valid password. Passwords must not be longer than 1000 characters.", + "error.user.password.invalid": "Bonvolu entajpi validan pasvorton. Pasvortoj devas esti almenaŭ 8 literojn longaj.", + "error.user.password.notSame": "La pasvortoj ne estas kongruantaj", + "error.user.password.undefined": "La uzanto ne havas pasvorton", + "error.user.password.wrong": "Malĝusta pasvorto", + "error.user.role.invalid": "Bonvolu entajpi validan rolon", + "error.user.undefined": "La uzanto ne troveblas", + "error.user.update.permission": "Vi ne rajtas ĝisdatigi la uzanton \"{name}\"", + + "error.validation.accepted": "Bonvolu konfirmi", + "error.validation.alpha": "Bonvolu entajpi nur literojn inter a-z", + "error.validation.alphanum": "Bonvolu entajpi nur aŭ literojn inter a-z aũ numerojn inter 0-9", + "error.validation.anchor": "Please enter a correct link anchor", + "error.validation.between": "Bonvolu entajpi valoron inter \"{min}\" kaj \"{max}\"", + "error.validation.boolean": "Bonvolu konfirmi aŭ malkonfirmi", + "error.validation.color": "Please enter a valid color in the {format} format", + "error.validation.contains": "Bonvolu entajpi valoron kiu enhavas \"{needle}\"", + "error.validation.date": "Bonvolu entajpi validan daton", + "error.validation.date.after": "Bonvolu entajpi daton post {date}", + "error.validation.date.before": "Bonvolu entajpi daton antaũ {date}", + "error.validation.date.between": "Bonvolu entajpi daton inter {min} kaj {max}", + "error.validation.denied": "Bonvolu malkonfirmi", + "error.validation.different": "La valoro ne rajtas esti \"{other}\"", + "error.validation.email": "Bonvolu entajpi validan retpoŝtadreson", + "error.validation.endswith": "La valoro devas finiĝi per \"{end}\"", + "error.validation.filename": "Bonvolu entajpi validan dosiernomon", + "error.validation.in": "Bonvolu entajpi unu el la sekvaj: ({in})", + "error.validation.integer": "Bonvolu entajpi validan entjeron", + "error.validation.ip": "Bonvolu entajpi validan IP-adreson", + "error.validation.less": "Bonvolu entajpi valoron malpli ol {max}", + "error.validation.linkType": "The link type is not allowed", + "error.validation.match": "La valoro ne kongruas al la atendata ŝablono", + "error.validation.max": "Bonvolu entajpi valoron egalan al aũ malpli ol {max}", + "error.validation.maxlength": "Bonvolu entajpi pli mallongan valoron (maksimume {max} literojn)", + "error.validation.maxwords": "Bonvolu entajpi maksimume {max} vorto(j)n", + "error.validation.min": "Bonvolu entajpi valoron egalan al aŭ pli granda ol {min}", + "error.validation.minlength": "Bonvolu entajpi pli longan valoron (minimume {min} literojn)", + "error.validation.minwords": "Bonvolu entajpi almenaŭ {min} vorto(j)n", + "error.validation.more": "Bonvolu entajpi valoron pli grandan ol {min}", + "error.validation.notcontains": "Bonvolu entajpi valoron kiu ne enhavas \"{needle}\"", + "error.validation.notin": "Bonvolu entajpi neniu ajn el la sekvaj: ({notin})", + "error.validation.option": "Bonvolu fari validan elekton", + "error.validation.num": "Bonvolu entajpi validan numeron", + "error.validation.required": "Bonvolu entajpi ion", + "error.validation.same": "Bonvolu entajpi \"{other}\"", + "error.validation.size": "La grando de la valoro devas esti \"{size}\"", + "error.validation.startswith": "La valoro devas komenciĝi per \"{start}\"", + "error.validation.tel": "Please enter an unformatted phone number", + "error.validation.time": "Bonvolu entajpi validan horaron", + "error.validation.time.after": "Bonvolu entajpi horaron post {time}", + "error.validation.time.before": "Bonvolu entajpi horaron antaŭ {time}", + "error.validation.time.between": "Bonvolu entajpi horaron inter {min} kaj {max}", + "error.validation.uuid": "Please enter a valid UUID", + "error.validation.url": "Bonvolu entajpi validan URL", + + "expand": "Etendi", + "expand.all": "Etendi ĉiujn", + + "field.invalid": "The field is invalid", + "field.required": "La kampo ne rajtas esti malplena", + "field.blocks.changeType": "Ŝanĝi tipon", + "field.blocks.code.name": "Kodo", + "field.blocks.code.language": "Lingvo", + "field.blocks.code.placeholder": "Via kodo ...", + "field.blocks.delete.confirm": "Ĉu vi certe volas forigi ĉi tiun blokon?", + "field.blocks.delete.confirm.all": "Ĉu vi certe volas forigi ĉiujn blokojn?", + "field.blocks.delete.confirm.selected": "Ĉu vi certe volas forigi la elektitajn blokojn?", + "field.blocks.empty": "Ankoraŭ neniu bloko", + "field.blocks.fieldsets.empty": "No fieldsets yet", + "field.blocks.fieldsets.label": "Bonvolu elekti tipon de bloko ...", + "field.blocks.fieldsets.paste": "Press {{ shortcut }} to import layouts/blocks from your clipboard Only those allowed in the current field will get inserted.", + "field.blocks.gallery.name": "Galerio", + "field.blocks.gallery.images.empty": "Ankoraŭ neniu bildo", + "field.blocks.gallery.images.label": "Bildoj", + "field.blocks.heading.level": "Nivelo", + "field.blocks.heading.name": "Titolo", + "field.blocks.heading.text": "Teksto", + "field.blocks.heading.placeholder": "Titolo ...", + "field.blocks.image.alt": "Alternativa titolo", + "field.blocks.image.caption": "Apudskribo", + "field.blocks.image.crop": "Stuci", + "field.blocks.image.link": "Ligilo", + "field.blocks.image.location": "Loko", + "field.blocks.image.location.internal": "This website", + "field.blocks.image.location.external": "External source", + "field.blocks.image.name": "Bildo", + "field.blocks.image.placeholder": "Elekti bildon", + "field.blocks.image.ratio": "Proporcio", + "field.blocks.image.url": "URL de la bildo", + "field.blocks.line.name": "Linio", + "field.blocks.list.name": "Listo", + "field.blocks.markdown.name": "Markdown", + "field.blocks.markdown.label": "Teksto", + "field.blocks.markdown.placeholder": "Markdown ...", + "field.blocks.quote.name": "Citaĵo", + "field.blocks.quote.text.label": "Teksto", + "field.blocks.quote.text.placeholder": "Citaĵo ...", + "field.blocks.quote.citation.label": "Citaĵo", + "field.blocks.quote.citation.placeholder": "de ...", + "field.blocks.text.name": "Teksto", + "field.blocks.text.placeholder": "Teksto ...", + "field.blocks.video.autoplay": "Autoplay", + "field.blocks.video.caption": "Apudskribo", + "field.blocks.video.controls": "Controls", + "field.blocks.video.location": "Loko", + "field.blocks.video.loop": "Loop", + "field.blocks.video.muted": "Muted", + "field.blocks.video.name": "Videâjo", + "field.blocks.video.placeholder": "Entajpi URL de videaĵo", + "field.blocks.video.poster": "Poster", + "field.blocks.video.preload": "Preload", + "field.blocks.video.url.label": "Video-URL", + "field.blocks.video.url.placeholder": "https://youtube.com/?v=", + + "field.files.empty": "Ankoraŭ neniu dosiero elektita", + + "field.layout.change": "Change layout", + "field.layout.delete": "Forigi blokaranĝo", + "field.layout.delete.confirm": "Ĉu vi certe volas forigi ĉi tiun blokaranĝon?", + "field.layout.delete.confirm.all": "Do you really want to delete all layouts?", + "field.layout.empty": "Ankoraŭ neniu vico", + "field.layout.select": "Elekti blokaranĝon", + + "field.object.empty": "No information yet", + + "field.pages.empty": "Ankoraŭ neniu paĝo elektita", + + "field.structure.delete.confirm": "Ĉu vi certe volas forigi ĉi tiun vicon?", + "field.structure.delete.confirm.all": "Do you really want to delete all entries?", + "field.structure.empty": "Ankoraŭ neniu enigo", + + "field.users.empty": "Ankoraŭ neniu uzanto elektita", + + "fields.empty": "No fields yet", + + "file": "Dosiero", + "file.blueprint": "Ĉi tiu dosiero ankoraŭ havas neniun planon. Vi povas difini planon ĉe /site/blueprints/files/{blueprint}.yml", + "file.changeTemplate": "Ŝanĝi ŝablonon", + "file.changeTemplate.notice": "Changing the file's template will remove content for fields that don't match in type. If the new template defines certain rules, e.g. image dimensions, those will also be applied irreversibly. Use with caution.", + "file.delete.confirm": "Ĉu vi certe vollas forigi
{filename}?", + "file.focus.placeholder": "Set focal point", + "file.focus.reset": "Remove focal point", + "file.focus.title": "Focus", + "file.sort": "Ŝanĝi ordon", + + "files": "Dosieroj", + "files.empty": "Ankoraŭ neniu dosiero", + + "filter": "Filter", + + "hide": "Kaŝi", + "hour": "Horo", + "hue": "Hue", + "import": "Importi", + "info": "Info", + "insert": "Enmeti", + "insert.after": "Enmeti post", + "insert.before": "Enmeti antaŭ", + "install": "Instali", + + "installation": "Instalado", + "installation.completed": "La panelo estas instalita", + "installation.disabled": "La instalilo de la panelo estas norme malebligita en publikaj serviloj. Bonvolu uzi la instalilon en via loka komputilo, aŭ ebligu ĝin per la opcio panel.install", + "installation.issues.accounts": "La dosierujo /site/accounts ne ekzistas, aŭ ne estas skribebla", + "installation.issues.content": "La dosierujo /content ne ekzistas, aŭ ne estas skribebla", + "installation.issues.curl": "La kromprogramo CURL estas deviga", + "installation.issues.headline": "Ne eblas instali la panelon", + "installation.issues.mbstring": "La kromprogramo MB String estas deviga", + "installation.issues.media": "La dosierujo /media ne ekzistas, aũ ne estas skribebla", + "installation.issues.php": "Nepre uzu PHP 8+", + "installation.issues.sessions": "La dosierujo /site/sessions ne ekzistas, aŭ ne estas skribebla", + + "language": "Lingvo", + "language.code": "Kodo", + "language.convert": "Farigi defaŭlton", + "language.convert.confirm": "

Ĉu vi certe volas konverti {name} al la defaŭlta lingvo? Ĉi tion vi ne povos malfari.

Se {name} havas netradukitan enhavon, tiuj tekstoj nun ne havos defaŭlton, kaj simple ne aperos en via retejo.

", + "language.create": "Aldoni novan lingvon", + "language.default": "Defaŭlta lingvo", + "language.delete.confirm": "Ĉu vi certe volas forigi la lingvon {name}, inkluzive de ĉiuj tradukoj? Vi ne povos malfari tion!", + "language.deleted": "La lingvo estas forigita", + "language.direction": "Direkto de leĝado", + "language.direction.ltr": "Dekstren", + "language.direction.rtl": "Maldesktren", + "language.locale": "Lokaĵaro de PHP", + "language.locale.warning": "Vi uzas tajloritan agordon de lokaĵaro. Bonvolu ŝanĝi viajn agordojn laŭmende en la lingva dosiero ĉe /site/languages", + "language.name": "Nomo", + "language.secondary": "Secondary language", + "language.settings": "Language settings", + "language.updated": "La lingvo estas ĝisdatigita", + "language.variables": "Language variables", + "language.variables.empty": "No translations yet", + + "language.variable.delete.confirm": "Do you really want to delete the variable for {key}?", + "language.variable.key": "Key", + "language.variable.notFound": "The variable could not be found", + "language.variable.value": "Value", + + "languages": "Lingvoj", + "languages.default": "Defaŭlta lingvo", + "languages.empty": "Ankoraũ estas neniu lingvo", + "languages.secondary": "Kromlingvoj", + "languages.secondary.empty": "Ankoraŭ estas neniu kromlingvoj", + + "license": "Permisilo", + "license.activate": "Activate it now", + "license.activate.label": "Please activate your license", + "license.activate.domain": "Your license will be activated for {host}.", + "license.activate.local": "You are about to activate your Kirby license for your local domain {host}. If this site will be deployed to a public domain, please activate it there instead. If {host} is the domain you want to use your license for, please continue.", + "license.activated": "Activated", + "license.buy": "Aĉeti permisilon", + "license.code": "Kodo", + "license.code.help": "You received your license code after the purchase via email. Please copy and paste it here.", + "license.code.label": "Bonvolu entajpi vian kodon de permisilo", + "license.status.active.info": "Includes new major versions until {date}", + "license.status.active.label": "Valid license", + "license.status.demo.info": "This is a demo installation", + "license.status.demo.label": "Demo", + "license.status.inactive.info": "Renew license to update to new major versions", + "license.status.inactive.label": "No new major versions", + "license.status.legacy.bubble": "Ready to renew your license?", + "license.status.legacy.info": "Your license does not cover this version", + "license.status.legacy.label": "Please renew your license", + "license.status.missing.bubble": "Ready to launch your site?", + "license.status.missing.info": "No valid license", + "license.status.missing.label": "Please activate your license", + "license.manage": "Manage your licenses", + "license.purchased": "Purchased", + "license.success": "Dankon pro subteni Kirby", + "license.unregistered.label": "Unregistered", + + "link": "Ligilo", + "link.text": "Ligila teksto", + + "loading": "Ŝargante", + + "lock.unsaved": "Nekonservitaj ŝanĝoj", + "lock.unsaved.empty": "Ĉiuj ŝanĝoj estas nun konservitaj", + "lock.isLocked": "Unsaved changes by {email}", + "lock.unlock": "Malŝlosi", + "lock.unlock.submit": "Unlock and overwrite unsaved changes by {email}", + "lock.isUnlocked": "Was unlocked by another user", + + "login": "Log in", + "login.code.label.login": "Ensaluta kodo", + "login.code.label.password-reset": "Kodo por restarigi pasvorton", + "login.code.placeholder.email": "000 000", + "login.code.placeholder.totp": "000000", + "login.code.text.email": "Se via retpoŝtadreso estas enregistrita, via kodo estis sendita retpoŝte", + "login.code.text.totp": "Please enter the one‑time code from your authenticator app.", + "login.email.login.body": "Saluton {user.nameOrEmail},\n\nVi petis ensalutan kodon por la panelo de la retejo {site}.\nLa sekvanta kodo validos dum {timeout} minutoj:\n\n{code}\n\nSe vi ne petis ensalutan kodon, bonvolu ignori ĉi tiun mesaĝon, aŭ kontaktu vian sistem-administranton se vi havas demandojn.\nPro sekureco, bonvolu NE plusendi ĉi tiun mesaĝon.", + "login.email.login.subject": "Via ensaluta kodo", + "login.email.password-reset.body": "Saluton {user.nameOrEmail},\n\nVi petis kodon por restarigi vian pasvorton por la panelo de la retejo {site}.\nLa sekvanta kodo validos dum {timeout} minutoj:\n\n{code}\n\nSe vi ne petis kodon por restarigi vian pasvorton, bonvolu ignori ĉi tiun mesaĝon, aŭ kontaktu vian sistem-administranton se vi havas demandojn.\nPro sekureco, bonvolu NE plusendi ĉi tiun mesaĝon.", + "login.email.password-reset.subject": "Kodo por restarigi pasvorton", + "login.remember": "Daŭre tenu min ensalutita", + "login.reset": "Restarigi pasvorton", + "login.toggleText.code.email": "Ensaluti retpoŝte", + "login.toggleText.code.email-password": "Ensaluti per pasvorto", + "login.toggleText.password-reset.email": "Ĉu vi forgesis vian pasvorton?", + "login.toggleText.password-reset.email-password": "← Reen al ensaluto", + "login.totp.enable.option": "Set up one‑time codes", + "login.totp.enable.intro": "Authenticator apps can generate one‑time codes that are used as a second factor when signing into your account.", + "login.totp.enable.qr.label": "1. Scan this QR code", + "login.totp.enable.qr.help": "Unable to scan? Add the setup key {secret} manually to your authenticator app.", + "login.totp.enable.confirm.headline": "2. Confirm with generated code", + "login.totp.enable.confirm.text": "Your app generates a new one‑time code every 30 seconds. Enter the current code to complete the setup:", + "login.totp.enable.confirm.label": "Current code", + "login.totp.enable.confirm.help": "After this setup, we will ask you for a one‑time code every time you log in.", + "login.totp.enable.success": "One‑time codes enabled", + "login.totp.disable.option": "Disable one‑time codes", + "login.totp.disable.label": "Enter your password to disable one‑time codes", + "login.totp.disable.help": "In the future, a different second factor like a login code sent via email will be requested when you log in. You can always set up one‑time codes again later.", + "login.totp.disable.admin": "

This will disable one‑time codes for {user}.

In the future, a different second factor like a login code sent via email will be requested when they log in. {user} can set up one‑time codes again after their next login.

", + "login.totp.disable.success": "One‑time codes disabled", + + "logout": "Elsaluti", + + "merge": "Merge", + "menu": "Menuo", + "meridiem": "atm/ptm", + "mime": "Tipo de aŭdvidaĵo", + "minutes": "Minutoj", + + "month": "Monato", + "months.april": "aprilo", + "months.august": "aŭgusto", + "months.december": "decembro", + "months.february": "februaro", + "months.january": "januaro", + "months.july": "julio", + "months.june": "junio", + "months.march": "marto", + "months.may": "majo", + "months.november": "novembro", + "months.october": "oktobro", + "months.september": "septembro", + + "more": "Pli", + "move": "Move", + "name": "Nomo", + "next": "Sekve", + "night": "Night", + "no": "ne", + "off": "ne", + "on": "jes", + "open": "Malfermi", + "open.newWindow": "Malfermi novan fenestron", + "option": "Option", + "options": "Opcioj", + "options.none": "Neniu opcio", + "options.all": "Show all {count} options", + + "orientation": "Orientiĝo", + "orientation.landscape": "Horizontala", + "orientation.portrait": "Vertikala", + "orientation.square": "Kvadrata", + + "page": "Paĝo", + "page.blueprint": "Ĉi tiu paĝo ankoraŭ ne havas planon. Vi povas difini planon ĉe /site/blueprints/pages/{blueprint}.yml", + "page.changeSlug": "Ŝanĝi URL", + "page.changeSlug.fromTitle": "Krei el titolo", + "page.changeStatus": "Ŝanĝi staton", + "page.changeStatus.position": "Bonvolu elekti ordon", + "page.changeStatus.select": "Elekti novan staton", + "page.changeTemplate": "Ŝanĝi ŝablonon", + "page.changeTemplate.notice": "Changing the page's template will remove content for fields that don't match in type. Use with caution.", + "page.create": "Create as {status}", + "page.delete.confirm": "Ĉu vi certe volas forigi {title}?", + "page.delete.confirm.subpages": "Ĉi tiu paĝo havas subpaĝojn.
Ĉiuj subpaĝoj estos ankaŭ forigitaj.", + "page.delete.confirm.title": "Entajpu la titolon de la paĝo por konfirmi", + "page.duplicate.appendix": "Kopii", + "page.duplicate.files": "Kopii dosierojn", + "page.duplicate.pages": "Kopii paĝojn", + "page.move": "Move page", + "page.sort": "Ŝanĝi ordon", + "page.status": "Stato", + "page.status.draft": "Malneto", + "page.status.draft.description": "La paĝo estas malneto, kaj nur atingebla de ensalutitaj redaktantoj, aŭ per sekreta ligilo", + "page.status.listed": "Publika", + "page.status.listed.description": "La paĝo estas publika por ĉiuj ajn", + "page.status.unlisted": "Nelistata", + "page.status.unlisted.description": "La paĝo estas atingebla nur per URL", + + "pages": "Paĝoj", + "pages.empty": "Ankoraŭ neniu paĝo", + "pages.status.draft": "Malnetoj", + "pages.status.listed": "Publikigita", + "pages.status.unlisted": "Nelistata", + + "pagination.page": "Paĝo", + + "password": "Pasvorto", + "paste": "Alglui", + "paste.after": "Alglui post", + "paste.success": "{count} pasted!", + "pixel": "Pikselo", + "plugin": "Plugin", + "plugins": "Kromprogramoj", + "prev": "Antaŭe", + "preview": "Antaŭrigardi", + "remove": "Forigi", + "rename": "Ŝanĝi nomon", + "renew": "Renew", + "replace": "Anstataŭi", + "replace.with": "Replace with", + "retry": "Provi denove", + "revert": "Malfari", + "revert.confirm": "Ĉu vi certe volas forigi ĉiujn nekonservitajn ŝanĝojn?", + + "role": "Rolo", + "role.admin.description": "La administranto havas ĉiujn rajtojn", + "role.admin.title": "Administranto", + "role.all": "Ĉiuj", + "role.empty": "Neniu uzanto havas ĉi tiun rolon", + "role.description.placeholder": "Neniu priskribo", + "role.nobody.description": "Ĉi tiu estas retrodefaŭlta rolo sen permesoj", + "role.nobody.title": "Neniu", + + "save": "Konservi", + "search": "Serĉi", + "search.min": "Entajpu {min} literojn por serĉi", + "search.all": "Show all {count} results", + "search.results.none": "Neniu rezulto", + + "section.invalid": "The section is invalid", + "section.required": "La sekcio estas deviga", + + "security": "Security", + "select": "Elekti", + "server": "Servilo", + "settings": "Agordoj", + "show": "Montri", + "site.blueprint": "La retejo ankoraŭ ne havas planon. Vi povas difini planon ĉe /site/blueprints/site.yml", + "size": "Grando", + "slug": "URL-nomo", + "sort": "Ordigi", + "sort.drag": "Drag to sort …", + "split": "Split", + + "stats.empty": "No reports", + "status": "Stato", + + "system.info.copy": "Copy info", + "system.info.copied": "System info copied", + "system.issues.content": "The content folder seems to be exposed", + "system.issues.eol.kirby": "Your installed Kirby version has reached end-of-life and will not receive further security updates", + "system.issues.eol.plugin": "Your installed version of the { plugin } plugin is has reached end-of-life and will not receive further security updates", + "system.issues.eol.php": "Your installed PHP release { release } has reached end-of-life and will not receive further security updates", + "system.issues.debug": "Debugging must be turned off in production", + "system.issues.git": "The .git folder seems to be exposed", + "system.issues.https": "We recommend HTTPS for all your sites", + "system.issues.kirby": "The kirby folder seems to be exposed", + "system.issues.site": "The site folder seems to be exposed", + "system.issues.vulnerability.kirby": "Your installation might be affected by the following vulnerability ({ severity } severity): { description }", + "system.issues.vulnerability.plugin": "Your installation might be affected by the following vulnerability in the { plugin } plugin ({ severity } severity): { description }", + "system.updateStatus": "Update status", + "system.updateStatus.error": "Could not check for updates", + "system.updateStatus.not-vulnerable": "No known vulnerabilities", + "system.updateStatus.security-update": "Free security update { version } available", + "system.updateStatus.security-upgrade": "Upgrade { version } with security fixes available", + "system.updateStatus.unreleased": "Unreleased version", + "system.updateStatus.up-to-date": "Up to date", + "system.updateStatus.update": "Free update { version } available", + "system.updateStatus.upgrade": "Upgrade { version } available", + + "tel": "Phone", + "tel.placeholder": "+49123456789", + "template": "Ŝablono", + "title": "Titolo", + "today": "Hodiaŭ", + + "toolbar.button.clear": "Clear formatting", + "toolbar.button.code": "Kodo", + "toolbar.button.bold": "Grasa", + "toolbar.button.email": "Retpoŝto", + "toolbar.button.headings": "Titoloj", + "toolbar.button.heading.1": "Titolo 1", + "toolbar.button.heading.2": "Titolo 2", + "toolbar.button.heading.3": "Titolo 3", + "toolbar.button.heading.4": "Titolo 4", + "toolbar.button.heading.5": "Titolo 5", + "toolbar.button.heading.6": "Titolo 6", + "toolbar.button.italic": "Kursiva", + "toolbar.button.file": "Dosiero", + "toolbar.button.file.select": "Elekti dosieron", + "toolbar.button.file.upload": "Alŝuti dosieron", + "toolbar.button.link": "Ligilo", + "toolbar.button.paragraph": "Paragrafo", + "toolbar.button.strike": "Trastrekita", + "toolbar.button.sub": "Subscript", + "toolbar.button.sup": "Superscript", + "toolbar.button.ol": "Numerita listo", + "toolbar.button.underline": "Substrekita", + "toolbar.button.ul": "Bula listo", + + "translation.author": "Teamo Kirby", + "translation.direction": "ltr", + "translation.name": "Esperanto", + "translation.locale": "eo", + + "type": "Type", + + "upload": "Alŝuti", + "upload.error.cantMove": "Ne eblis movi la alŝutita dosiero", + "upload.error.cantWrite": "Ne eblis registri la dosieron en la diskon", + "upload.error.default": "Ne eblis alŝuti la dosieron", + "upload.error.extension": "Alŝutado haltita pro la dosiersufikso", + "upload.error.formSize": "La alŝutita dosiero estas pli granda ol la direktivo MAX_FILE_SIZE indikata en la formularo", + "upload.error.iniPostSize": "La alŝutita dosiero estas pli granda ol la direktivo post_max_size de php.ini", + "upload.error.iniSize": "La alŝutita dosiero estas pli granda ol la direktivo upload_max_filesize de php.ini", + "upload.error.noFile": "Neniu dosiero alŝutita", + "upload.error.noFiles": "Neniuj dosieroj alŝutitaj", + "upload.error.partial": "La dosiero estis nur parte alŝutita", + "upload.error.tmpDir": "Mankas provizora dosierujo", + "upload.errors": "Eraro", + "upload.progress": "Alŝutante...", + + "url": "URL", + "url.placeholder": "https://ekzemplo.com", + + "user": "Uzanto", + "user.blueprint": "Vi povas difini pluajn sekciojn kaj kampojn de formularo por ĉi tiu rolo de uzanto ĉe /site/blueprints/users/{blueprint}.yml", + "user.changeEmail": "Ŝanĝi retpoŝtadreson", + "user.changeLanguage": "Ŝanĝi lingvon", + "user.changeName": "Ŝangi la nomon de la uzanto", + "user.changePassword": "Ŝanĝi pasvorton", + "user.changePassword.new": "Nova pasvorto", + "user.changePassword.new.confirm": "Konfirmi la novan pasvorton...", + "user.changeRole": "Ŝanĝi rolon", + "user.changeRole.select": "Elekti novan rolon", + "user.create": "Aldoni novan uzanton", + "user.delete": "Forigi ĉi tiun uzanton", + "user.delete.confirm": "Ĉu vi certe volas forigi
{email}?", + + "users": "Uzantoj", + + "version": "Versio", + "version.current": "Current version", + "version.latest": "Latest version", + "versionInformation": "Version information", + + "view.account": "Via konto", + "view.installation": "Instalado", + "view.languages": "Lingvoj", + "view.resetPassword": "Restarigi pasvorton", + "view.site": "Retejo", + "view.system": "Sistemo", + "view.users": "Uzantoj", + + "welcome": "Bonvenon", + "year": "Jaro", + "yes": "jes" +} diff --git a/kirby/i18n/translations/es_419.json b/kirby/i18n/translations/es_419.json new file mode 100644 index 0000000..8cc34c1 --- /dev/null +++ b/kirby/i18n/translations/es_419.json @@ -0,0 +1,730 @@ +{ + "account.changeName": "Cambiar nombre", + "account.delete": "Eliminar cuenta", + "account.delete.confirm": "¿Realmente quieres eliminar tu cuenta? Tu sesión se cerrará inmediatamente. Tu cuenta no podrá ser recuperada. ", + + "activate": "Activate", + "add": "Agregar", + "alpha": "Alpha", + "author": "Autor", + "avatar": "Foto de perfil", + "back": "Regresar", + "cancel": "Cancelar", + "change": "Cambiar", + "close": "Cerrar", + "changes": "Changes", + "confirm": "De acuerdo", + "collapse": "Colapsar", + "collapse.all": "Colapsar todos", + "color": "Color", + "coordinates": "Coordinates", + "copy": "Copiar", + "copy.all": "Copiar todo", + "copy.success": "{count} copied!", + "create": "Crear", + "custom": "Custom", + + "date": "Fecha", + "date.select": "Selecciona una fecha", + + "day": "Día", + "days.fri": "Vie", + "days.mon": "Lun", + "days.sat": "S\u00e1b", + "days.sun": "Dom", + "days.thu": "Jue", + "days.tue": "Mar", + "days.wed": "Mi\u00e9", + + "debugging": "Depuración", + + "delete": "Eliminar", + "delete.all": "Eliminar todos", + + "dialog.fields.empty": "This dialog has no fields", + "dialog.files.empty": "No has seleccionado ningún archivo", + "dialog.pages.empty": "No has seleccionado ninguna página", + "dialog.text.empty": "This dialog does not define any text", + "dialog.users.empty": "No has seleccionado ningún usuario", + + "dimensions": "Dimensiones", + "disable": "Disable", + "disabled": "Deshabilitado", + "discard": "Descartar", + + "drawer.fields.empty": "This drawer has no fields", + + "domain": "Domain", + "download": "Descargar", + "duplicate": "Duplicar", + + "edit": "Editar", + + "email": "Correo Electrónico", + "email.placeholder": "correo@ejemplo.com", + + "enter": "Enter", + "entries": "Entradas", + "entry": "Entrada", + + "environment": "Ambiente", + + "error": "Error", + "error.access.code": "Código inválido", + "error.access.login": "Ingreso inválido", + "error.access.panel": "No tienes permitido acceder al panel", + "error.access.view": "No tienes permiso para acceder a esta parte del panel", + + "error.avatar.create.fail": "No se pudo subir la foto de perfil", + "error.avatar.delete.fail": "No se pudo eliminar la foto de perfil", + "error.avatar.dimensions.invalid": "Por favor, mantén el ancho y la altura de la imagen de perfil por debajo de 3000 pixeles", + "error.avatar.mime.forbidden": "La foto de perfil debe de ser un archivo JPG o PNG", + + "error.blueprint.notFound": "El blueprint \"{name}\" no se pudo cargar.", + + "error.blocks.max.plural": "No debes añadir más de {max} bloques", + "error.blocks.max.singular": "No debes añadir más de un bloque", + "error.blocks.min.plural": "Debes añadir al menos {min} bloques ", + "error.blocks.min.singular": "Debes añadir al menos un bloque", + "error.blocks.validation": "Hay un error en el campo \"{field}\" del bloque {index} que utiliza el tipo de bloque \"{fieldset}\"", + + "error.cache.type.invalid": "Tipo de caché \"{tipo}\" no válido", + + "error.email.preset.notFound": "El preajuste de email \"{name}\" no se pudo encontrar.", + + "error.field.converter.invalid": "Convertidor inválido \"{converter}\"", + "error.field.type.missing": "Campo \"{ name }\": El tipo de campo \"{ type }\" no existe", + + "error.file.changeName.empty": "El nombre no debe estar vacío", + "error.file.changeName.permission": "No tienes permitido cambiar el nombre de \"{filename}\"", + "error.file.changeTemplate.invalid": "The template for the file \"{id}\" cannot be changed to \"{template}\" (valid: \"{blueprints}\")", + "error.file.changeTemplate.permission": "You are not allowed to change the template for the file \"{id}\"", + + "error.file.duplicate": "Ya existe un archivo con el nombre \"{filename}\".", + "error.file.extension.forbidden": "La extensión \"{extension}\" no está permitida.", + "error.file.extension.invalid": "Extensión inválida: {extension}", + "error.file.extension.missing": "Falta la extensión para \"{filename}\".", + "error.file.maxheight": "La altura de la imagen no debe exceder {height} pixeles", + "error.file.maxsize": "El archivo es muy grande", + "error.file.maxwidth": "El ancho de la imagen no debe exceder {width} pixeles", + "error.file.mime.differs": "El archivo cargado debe ser del mismo tipo mime \"{mime}\".", + "error.file.mime.forbidden": "El tipo de medios \"{mime}\" no está permitido.", + "error.file.mime.invalid": "Tipo invalido de mime: {mime}", + "error.file.mime.missing": "No se puede detectar el tipo de medio para \"{filename}\".", + "error.file.minheight": "La altura de la imagen debe ser de al menos {height} pixeles", + "error.file.minsize": "El archivo es muy pequeño", + "error.file.minwidth": "El ancho de la imagen debe ser de al menos {width} pixeles", + "error.file.name.unique": "The filename must be unique", + "error.file.name.missing": "El nombre del archivo no debe estar vacío.", + "error.file.notFound": "El archivo \"{filename}\" no pudo ser encontrado.", + "error.file.orientation": "La orientación de la imagen debe ser \"{orientation}\"", + "error.file.type.forbidden": "No está permitido subir archivos {type}.", + "error.file.type.invalid": "Tipo de archivo inválido: {type}", + "error.file.undefined": "El archivo no se puede encontrar", + + "error.form.incomplete": "Por favor, corrige todos los errores del formulario...", + "error.form.notSaved": "No se pudo guardar el formulario", + + "error.language.code": "Por favor introduce un código válido para el idioma", + "error.language.duplicate": "El idioma ya existe", + "error.language.name": "Por favor introduce un nombre válido para el idioma", + "error.language.notFound": "No se pudo encontrar el idioma", + + "error.layout.validation.block": "Hay un error en el campo \"{field}\" del bloque {blockIndex} que utiliza el tipo de bloque \"{fieldset}\" en el layout {layoutIndex}", + "error.layout.validation.settings": "Hay un error en los ajustes del layout {index}", + + "error.license.domain": "The domain for the license is missing", + "error.license.email": "Por favor ingresa un correo electrónico valido", + "error.license.format": "Please enter a valid license code", + "error.license.verification": "La licencia no pude ser verificada", + + "error.login.totp.confirm.invalid": "Código inválido", + "error.login.totp.confirm.missing": "Please enter the current code", + + "error.object.validation": "Hay un error en el campo \"{label}\":\n{message}", + + "error.offline": "El Panel se encuentra fuera de linea ", + + "error.page.changeSlug.permission": "No está permitido cambiar el apéndice de URL para \"{slug}\".", + "error.page.changeSlug.reserved": "The path of top-level pages must not start with \"{path}\"", + "error.page.changeStatus.incomplete": "La página tiene errores y no puede ser publicada.", + "error.page.changeStatus.permission": "El estado de esta página no se puede cambiar.", + "error.page.changeStatus.toDraft.invalid": "La página \"{slug}\" no se puede convertir en un borrador", + "error.page.changeTemplate.invalid": "La plantilla para la página \"{slug}\" no se puede cambiar", + "error.page.changeTemplate.permission": "No está permitido cambiar la plantilla para \"{slug}\"", + "error.page.changeTitle.empty": "El título no debe estar vacío.", + "error.page.changeTitle.permission": "No tienes permiso para cambiar el título de \"{slug}\"", + "error.page.create.permission": "No tienes permiso para crear \"{slug}\"", + "error.page.delete": "La página \"{slug}\" no se puede eliminar", + "error.page.delete.confirm": "Por favor, introduce el título de la página para confirmar", + "error.page.delete.hasChildren": "La página tiene subpáginas y no se puede eliminar", + "error.page.delete.permission": "No tienes permiso para borrar \"{slug}\"", + "error.page.draft.duplicate": "Ya existe un borrador de página con el apéndice de URL \"{slug}\"", + "error.page.duplicate": "Ya existe una página con el apéndice de URL \"{slug}\"", + "error.page.duplicate.permission": "No tienes permitido duplicar \"{slug}\"", + "error.page.move.ancestor": "The page cannot be moved into itself", + "error.page.move.directory": "The page directory cannot be moved", + "error.page.move.duplicate": "A sub page with the URL appendix \"{slug}\" already exists", + "error.page.move.notFound": "The moved page could not be found", + "error.page.move.permission": "You are not allowed to move \"{slug}\"", + "error.page.move.template": "The \"{template}\" template is not accepted as a subpage of \"{parent}\"", + "error.page.notFound": "La página \"{slug}\" no se encuentra", + "error.page.num.invalid": "Por favor, introduce un número de posición válido. Los números no deben ser negativos.", + "error.page.slug.invalid": "Por favor, introduce un apéndice de URL válido", + "error.page.slug.maxlength": "La longitud del slug debe ser inferior a \"{length}\" caracteres", + "error.page.sort.permission": "La página \"{slug}\" no se puede ordenar", + "error.page.status.invalid": "Por favor, establece una estado de página válido", + "error.page.undefined": "La p\u00e1gina no fue encontrada", + "error.page.update.permission": "No tienes permiso para actualizar \"{slug}\"", + + "error.section.files.max.plural": "No debes agregar más de {max} archivos a la sección \"{section}\"", + "error.section.files.max.singular": "No debes agregar más de un archivo a la sección \"{section}\"", + "error.section.files.min.plural": "La sección \"{section}\" requiere al menos {min} archivos", + "error.section.files.min.singular": "La sección \"{section}\" requiere al menos un archivo", + + "error.section.pages.max.plural": "No debes agregar más de {max} páginas a la sección \"{section}\"", + "error.section.pages.max.singular": "No debes agregar más de una página a la sección \"{section}\"", + "error.section.pages.min.plural": "La sección \"{section}\" requiere al menos {min} páginas", + "error.section.pages.min.singular": "La sección \"{section}\" requiere al menos una página", + + "error.section.notLoaded": "La sección \"{name}\" no se pudo cargar", + "error.section.type.invalid": "La sección \"{type}\" no es valida", + + "error.site.changeTitle.empty": "El título no debe estar vacío.", + "error.site.changeTitle.permission": "No tienes permiso para cambiar el título del sitio", + "error.site.update.permission": "No tienes permiso de actualizar el sitio", + + "error.structure.validation": "There's an error on the \"{field}\" field in row {index}", + + "error.template.default.notFound": "La plantilla predeterminada no existe", + + "error.unexpected": "¡Se ha producido un error inesperado! Activa el modo de depuración para obtener más información: https://getkirby.com/docs/reference/system/options/debug", + + "error.user.changeEmail.permission": "No tienes permiso para cambiar el email del usuario \"{name}\"", + "error.user.changeLanguage.permission": "No tienes permiso para cambiar el idioma del usuario \"{name}\"", + "error.user.changeName.permission": "No tienes permiso para cambiar el nombre del usuario \"{name}\"", + "error.user.changePassword.permission": "No tienes permiso para cambiar la contraseña del usuario \"{name}\"", + "error.user.changeRole.lastAdmin": "El rol del último administrador no puede ser cambiado", + "error.user.changeRole.permission": "No tienes permiso para cambiar el rol del usuario \"{name}\"", + "error.user.changeRole.toAdmin": "No tienes permitido promover a alguien al rol de admin", + "error.user.create.permission": "No tienes permiso de crear este usuario", + "error.user.delete": "El ususario no pudo ser eliminado", + "error.user.delete.lastAdmin": "Usted no puede borrar el \u00faltimo administrador", + "error.user.delete.lastUser": "El último usuario no puede ser borrado", + "error.user.delete.permission": "Usted no tiene permitido borrar este usuario", + "error.user.duplicate": "Ya existe un usuario con el email \"{email}\"", + "error.user.email.invalid": "Por favor ingresa un correo electrónico valido", + "error.user.language.invalid": "Por favor ingresa un idioma valido", + "error.user.notFound": "El usuario no pudo ser encontrado", + "error.user.password.excessive": "Please enter a valid password. Passwords must not be longer than 1000 characters.", + "error.user.password.invalid": "Por favor ingresa una contraseña valida. Las contraseñas deben tener al menos 8 caracteres de largo.", + "error.user.password.notSame": "Por favor confirma la contrase\u00f1a", + "error.user.password.undefined": "El usuario no tiene contraseña", + "error.user.password.wrong": "Contraseña incorrecta", + "error.user.role.invalid": "Por favor ingresa un rol valido", + "error.user.undefined": "El usuario no pudo ser encontrado", + "error.user.update.permission": "No tienes permiso para actualizar al usuario \"{name}\"", + + "error.validation.accepted": "Por favor, confirma", + "error.validation.alpha": "Por favor ingrese solo caracteres entre a-z", + "error.validation.alphanum": "Por favor ingrese solo caracteres entre a-z o números entre 0-9", + "error.validation.anchor": "Please enter a correct link anchor", + "error.validation.between": "Por favor ingrese valores entre \"{min}\" y \"{max}\"", + "error.validation.boolean": "Por favor confirme o niegue", + "error.validation.color": "Please enter a valid color in the {format} format", + "error.validation.contains": "Por favor ingrese valores que contengan \"{needle}\"", + "error.validation.date": "Por favor ingresa una fecha válida", + "error.validation.date.after": "Por favor introduce una fecha posterior a {date}", + "error.validation.date.before": "Por favor introduce una fecha anterior a {date}", + "error.validation.date.between": "Por favor introduce un número entre {min} y {max}", + "error.validation.denied": "Por favor niegue", + "error.validation.different": "EL valor no debe ser \"{other}\"", + "error.validation.email": "Por favor ingresa un correo electrónico valido", + "error.validation.endswith": "El valor no debe terminar con \"{end}\"", + "error.validation.filename": "Por favor ingresa un nombre de archivo válido", + "error.validation.in": "Por favor ingresa uno de los siguientes: ({in})", + "error.validation.integer": "Por favor ingresa un entero válido", + "error.validation.ip": "Por favor ingresa una dirección IP válida", + "error.validation.less": "Por favor ingresa un valor menor a {max}", + "error.validation.linkType": "The link type is not allowed", + "error.validation.match": "El valor no coincide con el patrón esperado", + "error.validation.max": "Por favor ingresa un valor menor o igual a {max}", + "error.validation.maxlength": "Por favor ingresa un valor mas corto. (max. {max} caracteres)", + "error.validation.maxwords": "Por favor ingresa no mas de {max} palabra(s)", + "error.validation.min": "Por favor ingresa un valor mayor o igual a {min}", + "error.validation.minlength": "Por favor ingresa un valor mas largo. (min. {min} caracteres)", + "error.validation.minwords": "Por favor ingresa al menos {min} palabra(s)", + "error.validation.more": "Por favor ingresa un valor mayor a {min}", + "error.validation.notcontains": "Por favor ingresa un valor que no contenga \"{needle}\"", + "error.validation.notin": "Por favor no ingreses ninguno de las siguientes: ({notIn})", + "error.validation.option": "Por favor selecciona una de las opciones válidas", + "error.validation.num": "Por favor ingresa un numero válido", + "error.validation.required": "Por favor ingresa algo", + "error.validation.same": "Por favor ingresa \"{other}\"", + "error.validation.size": "El tamaño del valor debe ser \"{size}\"", + "error.validation.startswith": "El valor debe comenzar con \"{start}\"", + "error.validation.tel": "Please enter an unformatted phone number", + "error.validation.time": "Por favor ingresa una hora válida", + "error.validation.time.after": "Por favor ingresa una fecha después de {time}", + "error.validation.time.before": "Por favor ingresa una fecha antes de {time}", + "error.validation.time.between": "Por favor ingresa un fecha entre {min} y {max}", + "error.validation.uuid": "Please enter a valid UUID", + "error.validation.url": "Por favor ingresa un URL válido", + + "expand": "Expandir", + "expand.all": "Expandir todo", + + "field.invalid": "The field is invalid", + "field.required": "Este campo es requerido", + "field.blocks.changeType": "Cambiar tipo", + "field.blocks.code.name": "Código", + "field.blocks.code.language": "Idioma", + "field.blocks.code.placeholder": "Tu código...", + "field.blocks.delete.confirm": "¿Seguro que quieres eliminar este bloque?", + "field.blocks.delete.confirm.all": "¿Seguro que quieres eliminar todos los bloques?", + "field.blocks.delete.confirm.selected": "¿Seguro que quieres eliminar los bloques seleccionados?", + "field.blocks.empty": "No hay bloques aún", + "field.blocks.fieldsets.empty": "No fieldsets yet", + "field.blocks.fieldsets.label": "Por favor selecciona un tipo de bloque...", + "field.blocks.fieldsets.paste": "Press {{ shortcut }} to import layouts/blocks from your clipboard Only those allowed in the current field will get inserted.", + "field.blocks.gallery.name": "Galería", + "field.blocks.gallery.images.empty": "No hay imágenes aún", + "field.blocks.gallery.images.label": "Imágenes", + "field.blocks.heading.level": "Nivel", + "field.blocks.heading.name": "Encabezado", + "field.blocks.heading.text": "Texto", + "field.blocks.heading.placeholder": "Encabezado...", + "field.blocks.image.alt": "Texto alternativo", + "field.blocks.image.caption": "Leyenda", + "field.blocks.image.crop": "Cortar", + "field.blocks.image.link": "Enlace", + "field.blocks.image.location": "Ubicación", + "field.blocks.image.location.internal": "This website", + "field.blocks.image.location.external": "External source", + "field.blocks.image.name": "Imágen", + "field.blocks.image.placeholder": "Selecciona una imagen", + "field.blocks.image.ratio": "Proporción", + "field.blocks.image.url": "URL de imágen", + "field.blocks.line.name": "Linea", + "field.blocks.list.name": "Lista", + "field.blocks.markdown.name": "Markdown", + "field.blocks.markdown.label": "Texto", + "field.blocks.markdown.placeholder": "Markdown...", + "field.blocks.quote.name": "Cita", + "field.blocks.quote.text.label": "Texto", + "field.blocks.quote.text.placeholder": "Cita...", + "field.blocks.quote.citation.label": "Cita", + "field.blocks.quote.citation.placeholder": "Por ...", + "field.blocks.text.name": "Texto", + "field.blocks.text.placeholder": "Texto ...", + "field.blocks.video.autoplay": "Autoplay", + "field.blocks.video.caption": "Leyenda", + "field.blocks.video.controls": "Controls", + "field.blocks.video.location": "Ubicación", + "field.blocks.video.loop": "Loop", + "field.blocks.video.muted": "Muted", + "field.blocks.video.name": "Video", + "field.blocks.video.placeholder": "Introduce la URL de un vídeo", + "field.blocks.video.poster": "Poster", + "field.blocks.video.preload": "Preload", + "field.blocks.video.url.label": "Vídeo-URL", + "field.blocks.video.url.placeholder": "https://youtube.com/?v=", + + "field.files.empty": "Aún no ha seleccionado ningún archivo", + + "field.layout.change": "Change layout", + "field.layout.delete": "Eliminar layout", + "field.layout.delete.confirm": "¿Realmente quieres eliminar este layout?", + "field.layout.delete.confirm.all": "Do you really want to delete all layouts?", + "field.layout.empty": "Aún no hay filas", + "field.layout.select": "Seleccionar layout", + + "field.object.empty": "Aún no hay información", + + "field.pages.empty": "Aún no ha seleccionado ningúna pagina", + + "field.structure.delete.confirm": "\u00bfEn realidad desea borrar esta entrada?", + "field.structure.delete.confirm.all": "¿Realmente quieres eliminar todas las entradas?", + "field.structure.empty": "A\u00fan no existen entradas.", + + "field.users.empty": "Aún no ha seleccionado ningún usuario", + + "fields.empty": "No fields yet", + + "file": "Archivo", + "file.blueprint": "Este archivo aún no tiene blueprint. Puedes definir la configuración en /site/blueprints/files/{blueprint}.yml", + "file.changeTemplate": "Cambiar plantilla", + "file.changeTemplate.notice": "Changing the file's template will remove content for fields that don't match in type. If the new template defines certain rules, e.g. image dimensions, those will also be applied irreversibly. Use with caution.", + "file.delete.confirm": "\u00bfEst\u00e1s seguro que deseas eliminar este archivo?", + "file.focus.placeholder": "Set focal point", + "file.focus.reset": "Remove focal point", + "file.focus.title": "Focus", + "file.sort": "Cambiar posición", + + "files": "Archivos", + "files.empty": "Aún no existen archivos", + + "filter": "Filter", + + "hide": "Ocultar", + "hour": "Hora", + "hue": "Hue", + "import": "Importar", + "info": "Info", + "insert": "Insertar", + "insert.after": "Insertar después", + "insert.before": "Insertar antes", + "install": "Instalar", + + "installation": "Instalación", + "installation.completed": "El panel ha sido instalado.", + "installation.disabled": "El instalador del panel está deshabilitado en servidores públicos por defecto. Ejecute el instalador en una máquina local o habilítelo con la opción panel.install.", + "installation.issues.accounts": "La carpeta /site/accounts no existe o no posee permisos de escritura.", + "installation.issues.content": "La carpeta /content no existe o no posee permisos de escritura.", + "installation.issues.curl": "Se requiere la extensión CURL.", + "installation.issues.headline": "El panel no puede ser instalado.", + "installation.issues.mbstring": "Se requiere la extensión MB String.", + "installation.issues.media": "La carpeta /media no existe o no posee permisos de escritura.", + "installation.issues.php": "Asegurese de estar usando PHP 8+", + "installation.issues.sessions": "La carpeta /site/sessions no existe o no posee permisos de escritura.", + + "language": "Idioma", + "language.code": "Código", + "language.convert": "Hacer por defecto", + "language.convert.confirm": "

Realmente deseas convertir {name} al idioma por defecto? Esta acción no se puede deshacer.

Si {name} tiene contenido sin traducir, no habrá vuelta atras y tu sitio puede quedar con partes sin contenido.

", + "language.create": "Añadir nuevo idioma", + "language.default": "Idioma por defecto", + "language.delete.confirm": "

", + "language.deleted": "El idioma ha sido borrado", + "language.direction": "Dirección de lectura", + "language.direction.ltr": "De Izquierda a derecha", + "language.direction.rtl": "De derecha a izquierda", + "language.locale": "Cadena de localización PHP", + "language.locale.warning": "Estas utilizando un configuración local. Por favor modifícalo en el archivo del lenguaje en /site/languages", + "language.name": "Nombre", + "language.secondary": "Secondary language", + "language.settings": "Language settings", + "language.updated": "El idioma a sido actualizado", + "language.variables": "Language variables", + "language.variables.empty": "No translations yet", + + "language.variable.delete.confirm": "Do you really want to delete the variable for {key}?", + "language.variable.key": "Key", + "language.variable.notFound": "The variable could not be found", + "language.variable.value": "Value", + + "languages": "Idiomas", + "languages.default": "Idioma por defecto", + "languages.empty": "Todavía no hay idiomas", + "languages.secondary": "Idiomas secundarios", + "languages.secondary.empty": "Todavía no hay idiomas secundarios", + + "license": "Licencia", + "license.activate": "Activate it now", + "license.activate.label": "Please activate your license", + "license.activate.domain": "Your license will be activated for {host}.", + "license.activate.local": "You are about to activate your Kirby license for your local domain {host}. If this site will be deployed to a public domain, please activate it there instead. If {host} is the domain you want to use your license for, please continue.", + "license.activated": "Activated", + "license.buy": "Comprar una licencia", + "license.code": "Código", + "license.code.help": "You received your license code after the purchase via email. Please copy and paste it here.", + "license.code.label": "Por favor, ingresa tu código de licencia", + "license.status.active.info": "Includes new major versions until {date}", + "license.status.active.label": "Valid license", + "license.status.demo.info": "This is a demo installation", + "license.status.demo.label": "Demo", + "license.status.inactive.info": "Renew license to update to new major versions", + "license.status.inactive.label": "No new major versions", + "license.status.legacy.bubble": "Ready to renew your license?", + "license.status.legacy.info": "Your license does not cover this version", + "license.status.legacy.label": "Please renew your license", + "license.status.missing.bubble": "Ready to launch your site?", + "license.status.missing.info": "No valid license", + "license.status.missing.label": "Please activate your license", + "license.manage": "Gestiona tus licencias", + "license.purchased": "Purchased", + "license.success": "Gracias por apoyar a Kirby", + "license.unregistered.label": "No registrado", + + "link": "Enlace", + "link.text": "Texto de Enlace", + + "loading": "Cargando", + + "lock.unsaved": "Cambios sin guardar", + "lock.unsaved.empty": "No hay más cambios sin guardar", + "lock.isLocked": "Unsaved changes by {email}", + "lock.unlock": "Desbloquear", + "lock.unlock.submit": "Unlock and overwrite unsaved changes by {email}", + "lock.isUnlocked": "Was unlocked by another user", + + "login": "Iniciar sesión", + "login.code.label.login": "Código de inicio de sesión", + "login.code.label.password-reset": "Código de restablecimiento de contraseña", + "login.code.placeholder.email": "000 000", + "login.code.placeholder.totp": "000000", + "login.code.text.email": "Si tu dirección de correo electrónico está registrada, el código solicitado fue enviado por correo electrónico.", + "login.code.text.totp": "Please enter the one‑time code from your authenticator app.", + "login.email.login.body": "Hola {user.nameOrEmail},\n\nHas pedido, recientemente, un código de restablecimiento de contraseña para el Panel del sitio {site}.\nEl siguiente código de restablecimiento de contraseña será válido por {timeout} minutos:\n\n{code}\n\nSi no pediste un código de restablecimiento de contraseña, por favor ignora este correo o contacta a tu administrador si tienes dudas.\nPor seguridad, por favor NO reenvíes este correo.", + "login.email.login.subject": "Tu código de inicio de sesión", + "login.email.password-reset.body": "Hola {user.nameOrEmail},\n\nHas pedido, recientemente, un código de restablecimiento de contraseña para el Panel del sitio {site}.\nEl siguiente código de restablecimiento de contraseña será válido por {timeout} minutos:\n\n{code}\n\nSi no pediste un código de restablecimiento de contraseña, por favor ignora este correo o contacta a tu administrador si tienes dudas.\nPor seguridad, por favor NO reenvíes este correo.", + "login.email.password-reset.subject": "Tu código de restablecimiento de contraseña", + "login.remember": "Mantener mi sesión iniciada", + "login.reset": "Restablecer contraseña", + "login.toggleText.code.email": "Iniciar sesión por correo electrónico", + "login.toggleText.code.email-password": "Iniciar sesión con contraseña", + "login.toggleText.password-reset.email": "¿Olvidaste tu contraseña?", + "login.toggleText.password-reset.email-password": "← Volver al inicio de sesión", + "login.totp.enable.option": "Set up one‑time codes", + "login.totp.enable.intro": "Authenticator apps can generate one‑time codes that are used as a second factor when signing into your account.", + "login.totp.enable.qr.label": "1. Scan this QR code", + "login.totp.enable.qr.help": "Unable to scan? Add the setup key {secret} manually to your authenticator app.", + "login.totp.enable.confirm.headline": "2. Confirm with generated code", + "login.totp.enable.confirm.text": "Your app generates a new one‑time code every 30 seconds. Enter the current code to complete the setup:", + "login.totp.enable.confirm.label": "Current code", + "login.totp.enable.confirm.help": "After this setup, we will ask you for a one‑time code every time you log in.", + "login.totp.enable.success": "One‑time codes enabled", + "login.totp.disable.option": "Disable one‑time codes", + "login.totp.disable.label": "Enter your password to disable one‑time codes", + "login.totp.disable.help": "In the future, a different second factor like a login code sent via email will be requested when you log in. You can always set up one‑time codes again later.", + "login.totp.disable.admin": "

This will disable one‑time codes for {user}.

In the future, a different second factor like a login code sent via email will be requested when they log in. {user} can set up one‑time codes again after their next login.

", + "login.totp.disable.success": "One‑time codes disabled", + + "logout": "Cerrar sesión", + + "merge": "Merge", + "menu": "Menù", + "meridiem": "AM/PM", + "mime": "Tipos de medios", + "minutes": "Minutos", + + "month": "Mes", + "months.april": "Abril", + "months.august": "Agosto", + "months.december": "Diciembre", + "months.february": "Febrero", + "months.january": "Enero", + "months.july": "Julio", + "months.june": "Junio", + "months.march": "Marzo", + "months.may": "Mayo", + "months.november": "Noviembre", + "months.october": "Octubre", + "months.september": "Septiembre", + + "more": "Màs", + "move": "Move", + "name": "Nombre", + "next": "Siguiente", + "night": "Night", + "no": "no", + "off": "Apagado", + "on": "Encendido", + "open": "Abrir", + "open.newWindow": "Abrir en una ventana nueva", + "option": "Option", + "options": "Opciones", + "options.none": "Sin opciones", + "options.all": "Show all {count} options", + + "orientation": "Orientación", + "orientation.landscape": "Paisaje", + "orientation.portrait": "Retrato", + "orientation.square": "Diapositiva", + + "page": "Página", + "page.blueprint": "Este archivo aún no tiene blueprint. Puedes definir la configuración en /site/blueprints/pages/{blueprint}.yml", + "page.changeSlug": "Cambiar URL", + "page.changeSlug.fromTitle": "Crear a partir del t\u00edtulo", + "page.changeStatus": "Cambiar estado", + "page.changeStatus.position": "Por favor selecciona una posición", + "page.changeStatus.select": "Selecciona un nuevo estado", + "page.changeTemplate": "Cambiar plantilla", + "page.changeTemplate.notice": "Changing the page's template will remove content for fields that don't match in type. Use with caution.", + "page.create": "Create as {status}", + "page.delete.confirm": "¿Estás seguro que deseas eliminar {title}?", + "page.delete.confirm.subpages": "Esta página tiene subpáginas.
Todas las súbpaginas serán eliminadas también.", + "page.delete.confirm.title": "Introduce el título de la página para confirmar", + "page.duplicate.appendix": "Copiar", + "page.duplicate.files": "Copiar archivos", + "page.duplicate.pages": "Copiar páginas", + "page.move": "Move page", + "page.sort": "Cambiar posición", + "page.status": "Estado", + "page.status.draft": "Borrador", + "page.status.draft.description": "La página está en modo borrador y solo es visible para editores conectados o mediante enlace secreto.", + "page.status.listed": "Pública", + "page.status.listed.description": "La página es pública para cualquiera", + "page.status.unlisted": "No publicada", + "page.status.unlisted.description": "La página sólo es accesible vía URL", + + "pages": "Páginas", + "pages.empty": "No hay páginas aún", + "pages.status.draft": "Borradores", + "pages.status.listed": "Publicado", + "pages.status.unlisted": "No publicado", + + "pagination.page": "Página", + + "password": "Contrase\u00f1a", + "paste": "Pegar", + "paste.after": "Pegar después", + "paste.success": "{count} pasted!", + "pixel": "Pixel", + "plugin": "Plugin", + "plugins": "Plugins", + "prev": "Anterior", + "preview": "Previsualizar", + "remove": "Eliminar", + "rename": "Renombrar", + "renew": "Renew", + "replace": "Reemplazar", + "replace.with": "Replace with", + "retry": "Reintentar", + "revert": "Revertir", + "revert.confirm": "¿Realmente quieres eliminar todos los cambios sin guardar?", + + "role": "Rol", + "role.admin.description": "El administrador tiene todos los derechos", + "role.admin.title": "Administrador", + "role.all": "Todos", + "role.empty": "No hay usuarios con este rol", + "role.description.placeholder": "Sin descripción", + "role.nobody.description": "Este es un rol alternativo sin permisos", + "role.nobody.title": "Nadie", + + "save": "Guardar", + "search": "Buscar", + "search.min": "Introduce {min} caracteres para buscar", + "search.all": "Show all {count} results", + "search.results.none": "Sin resultados", + + "section.invalid": "The section is invalid", + "section.required": "Esta sección es requerida", + + "security": "Seguridad", + "select": "Seleccionar", + "server": "Servidor", + "settings": "Ajustes", + "show": "Mostrar", + "site.blueprint": "Este archivo aún no tiene blueprint. Puedes definir la configuración en /site/blueprints/site.yml", + "size": "Tamaño", + "slug": "Apéndice URL", + "sort": "Ordenar", + "sort.drag": "Drag to sort …", + "split": "Split", + + "stats.empty": "Sin informes", + "status": "Estado", + + "system.info.copy": "Copy info", + "system.info.copied": "System info copied", + "system.issues.content": "La carpeta content parece estar expuesta", + "system.issues.eol.kirby": "La versión de Kirby que tienes instalada ha llegado al final de su vida útil y no recibirá más actualizaciones de seguridad.", + "system.issues.eol.plugin": "Tu versión instalada del plugin { plugin } ha llegado al final de su vida útil y no recibirá más actualizaciones de seguridad.", + "system.issues.eol.php": "Your installed PHP release { release } has reached end-of-life and will not receive further security updates", + "system.issues.debug": "La depuración debe estar desactivada en producción", + "system.issues.git": "La carpeta .git parece estar expuesta", + "system.issues.https": "Recomendamos HTTPS para todos tus sitios web", + "system.issues.kirby": "La carpeta kirby parece estar expuesta", + "system.issues.site": "La carpeta site parece estar expuesta", + "system.issues.vulnerability.kirby": "Tu instalación podría estar afectada por la siguiente vulnerabilidad ({ severity } gravedad): { description }", + "system.issues.vulnerability.plugin": "Tu instalación podría estar afectada por la siguiente vulnerabilidad en el plugin { plugin } ({ severity } gravedad): { description }", + "system.updateStatus": "Estado de actualización", + "system.updateStatus.error": "No se ha podido comprobar si hay actualizaciones", + "system.updateStatus.not-vulnerable": "No hay vulnerabilidades conocidas", + "system.updateStatus.security-update": "Actualización gratuita de seguridad { version } disponible", + "system.updateStatus.security-upgrade": "Actualización { versión } con correcciones de seguridad disponibles", + "system.updateStatus.unreleased": "Versión no publicada", + "system.updateStatus.up-to-date": "Actualizado", + "system.updateStatus.update": "Actualización gratuita {version} disponible", + "system.updateStatus.upgrade": "Actualización {versión} disponible", + + "tel": "Phone", + "tel.placeholder": "+49123456789", + "template": "Plantilla", + "title": "Título", + "today": "Hoy", + + "toolbar.button.clear": "Clear formatting", + "toolbar.button.code": "Código", + "toolbar.button.bold": "Negrita", + "toolbar.button.email": "Email", + "toolbar.button.headings": "Encabezados", + "toolbar.button.heading.1": "Encabezado 1", + "toolbar.button.heading.2": "Encabezado 2", + "toolbar.button.heading.3": "Encabezado 3", + "toolbar.button.heading.4": "Encabezado 4", + "toolbar.button.heading.5": "Encabezado 5", + "toolbar.button.heading.6": "Encabezado 6", + "toolbar.button.italic": "Texto en It\u00e1licas", + "toolbar.button.file": "Archivo", + "toolbar.button.file.select": "Selecciona un archivo", + "toolbar.button.file.upload": "Sube un archivo", + "toolbar.button.link": "Enlace", + "toolbar.button.paragraph": "Parágrafo", + "toolbar.button.strike": "Tachado", + "toolbar.button.sub": "Subscript", + "toolbar.button.sup": "Superscript", + "toolbar.button.ol": "Lista en orden", + "toolbar.button.underline": "Subrayado", + "toolbar.button.ul": "Lista de viñetas", + + "translation.author": "Equipo Kirby", + "translation.direction": "ltr", + "translation.name": "Español (América Latina)", + "translation.locale": "es_419", + + "type": "Type", + + "upload": "Subir", + "upload.error.cantMove": "El archivo subido no puede ser movido", + "upload.error.cantWrite": "Error al escribir el archivo en el disco", + "upload.error.default": "El archivo no pudo ser subido", + "upload.error.extension": "Subida de archivo detenida por la extensión", + "upload.error.formSize": "El archivo subido excede la directiva MAX_FILE_SIZE que fue especificada en el formulario", + "upload.error.iniPostSize": "El archivo subido excede la directiva post_max_size directive en php.ini", + "upload.error.iniSize": "El archivo subido excede la directiva upload_max_filesize en php.ini", + "upload.error.noFile": "Ningún archivo ha sido subido", + "upload.error.noFiles": "Ningún archivo ha sido subido", + "upload.error.partial": "El archivo ha sido subido solo parcialmente", + "upload.error.tmpDir": "No se encuentra la carpeta temporal", + "upload.errors": "Error", + "upload.progress": "Subiendo...", + + "url": "Url", + "url.placeholder": "https://ejemplo.com", + + "user": "Usuario", + "user.blueprint": "Puedes definir secciones y campos de formulario adicionales para este rol de usuario en /site/blueprints/users/{blueprint}.yml", + "user.changeEmail": "Cambiar correo electrónico", + "user.changeLanguage": "Cambiar idioma", + "user.changeName": "Renombrar este usuario", + "user.changePassword": "Cambiar la contraseña", + "user.changePassword.new": "Nueva contraseña", + "user.changePassword.new.confirm": "Confirma la nueva contraseña...", + "user.changeRole": "Cambiar rol", + "user.changeRole.select": "Selecciona un nuevo rol", + "user.create": "Agregar un nuevo usuario", + "user.delete": "Eliminar este usuario", + "user.delete.confirm": "¿Estás seguro que deseas eliminar
{email}?", + + "users": "Usuarios", + + "version": "Versión", + "version.current": "Versión actual", + "version.latest": "Última versión", + "versionInformation": "información sobre la versión", + + "view.account": "Tu cuenta", + "view.installation": "Instalaci\u00f3n", + "view.languages": "Idiomas", + "view.resetPassword": "Restablecer contraseña", + "view.site": "Sitio", + "view.system": "Sistema", + "view.users": "Usuarios", + + "welcome": "Bienvenido", + "year": "Año", + "yes": "Sí" +} diff --git a/kirby/i18n/translations/es_ES.json b/kirby/i18n/translations/es_ES.json new file mode 100644 index 0000000..0385355 --- /dev/null +++ b/kirby/i18n/translations/es_ES.json @@ -0,0 +1,730 @@ +{ + "account.changeName": "Cambiar nombre", + "account.delete": "Borrar cuenta", + "account.delete.confirm": "¿Realmente quieres eliminar tu cuenta? Tu sesión se cerrará inmediatamente. La cuenta no podrá ser recuperada.", + + "activate": "Activate", + "add": "Añadir", + "alpha": "Alpha", + "author": "Autor", + "avatar": "Foto de perfil", + "back": "Atrás", + "cancel": "Cancelar", + "change": "Cambiar", + "close": "Cerrar", + "changes": "Changes", + "confirm": "Confirmar", + "collapse": "Colapsar", + "collapse.all": "Colapsar todo", + "color": "Color", + "coordinates": "Coordinates", + "copy": "Copiar", + "copy.all": "Copiar todo", + "copy.success": "{count} copied!", + "create": "Crear", + "custom": "Custom", + + "date": "Fecha", + "date.select": "Selecciona una fecha", + + "day": "Día", + "days.fri": "Vi", + "days.mon": "Lu", + "days.sat": "Sá", + "days.sun": "Do", + "days.thu": "Ju", + "days.tue": "Ma", + "days.wed": "Mi", + + "debugging": "Depuración", + + "delete": "Eliminar", + "delete.all": "Eliminar todo", + + "dialog.fields.empty": "This dialog has no fields", + "dialog.files.empty": "No hay archivos para seleccionar", + "dialog.pages.empty": "No hay páginas para seleccionar", + "dialog.text.empty": "This dialog does not define any text", + "dialog.users.empty": "No hay usuarios para seleccionar", + + "dimensions": "Dimensiones", + "disable": "Disable", + "disabled": "Desabilitado", + "discard": "Descartar", + + "drawer.fields.empty": "This drawer has no fields", + + "domain": "Domain", + "download": "Descargar", + "duplicate": "Duplicar", + + "edit": "Editar", + + "email": "Correo electrónico", + "email.placeholder": "correo@ejemplo.com", + + "enter": "Enter", + "entries": "Entradas", + "entry": "Entrada", + + "environment": "Entorno", + + "error": "Error", + "error.access.code": "Código inválido", + "error.access.login": "Inicio de sesión inválido", + "error.access.panel": "No tienes permiso para acceder al panel", + "error.access.view": "No tienes permiso para acceder a esta parte del panel", + + "error.avatar.create.fail": "No se pudo subir la foto de perfil.", + "error.avatar.delete.fail": "No se pudo borrar la foto de perfil", + "error.avatar.dimensions.invalid": "Por favor, mantén el ancho y la altura de la imagen de perfil por debajo de 3000 píxeles", + "error.avatar.mime.forbidden": "La imagen del perfil debe ser JPEG o PNG.", + + "error.blueprint.notFound": "El blueprint \"{name}\" no pudo ser cargado", + + "error.blocks.max.plural": "No debes añadir más de {max} bloques", + "error.blocks.max.singular": "No debes añadir más de un bloque", + "error.blocks.min.plural": "Debes añadir al menos {min} bloques ", + "error.blocks.min.singular": "Debes añadir al menos un bloque", + "error.blocks.validation": "Hay un error en el campo \"{field}\" del bloque {index} que utiliza el tipo de bloque \"{fieldset}\"", + + "error.cache.type.invalid": "Tipo de caché inválido \"{tipo}\"", + + "error.email.preset.notFound": "El preset del correo \"{name}\" no puede ser encontrado", + + "error.field.converter.invalid": "Convertidor \"{converter}\" inválido", + "error.field.type.missing": "Campo \"{ name }\": El tipo de campo \"{ type }\" no existe", + + "error.file.changeName.empty": "El nombre no debe estar vacío", + "error.file.changeName.permission": "No tienes permiso para cambiar el nombre de \"{filename}\"", + "error.file.changeTemplate.invalid": "The template for the file \"{id}\" cannot be changed to \"{template}\" (valid: \"{blueprints}\")", + "error.file.changeTemplate.permission": "You are not allowed to change the template for the file \"{id}\"", + + "error.file.duplicate": "Ya existe un archivo con el nombre \"{filename}\"", + "error.file.extension.forbidden": "La extensión \"{extension}\" no está permitida", + "error.file.extension.invalid": "Extensión inválida: {extension}", + "error.file.extension.missing": "Falta la extensión para \"{filename}\"", + "error.file.maxheight": "La altura de la imagen no debe exceder {height} pixeles", + "error.file.maxsize": "El archivo es demasiado grande", + "error.file.maxwidth": "El ancho de la imagen no debe exceder {width} pixeles", + "error.file.mime.differs": "El archivo cargado debe ser del mismo tipo mime \"{mime}\"", + "error.file.mime.forbidden": "Los medios tipo \"{mime}\" no están permitidos", + "error.file.mime.invalid": "Tipo de mime inválido: {mime}", + "error.file.mime.missing": "El tipo de medio para \"{filename}\" no puede ser detectado", + "error.file.minheight": "La altura de la imagen debe ser de al menos {height} pixeles", + "error.file.minsize": "El archivo es demasiado pequeño", + "error.file.minwidth": "El ancho de la imagen debe ser de al menos {width} pixeles", + "error.file.name.unique": "The filename must be unique", + "error.file.name.missing": "El nombre de archivo no debe estar vacío", + "error.file.notFound": "El archivo \"{filename}\" no puede ser encontrado", + "error.file.orientation": "La orientación de la imagen debe ser \"{orientation}", + "error.file.type.forbidden": "No tienes permiso para subir archivos {type}", + "error.file.type.invalid": "Tipo de archivo inválido: {type}", + "error.file.undefined": "El archivo no puede ser encontrado", + + "error.form.incomplete": "Por favor, corrige todos los errores del formulario…", + "error.form.notSaved": "El formulario no pudo ser guardado", + + "error.language.code": "Por favor, introduce un código válido para el idioma", + "error.language.duplicate": "El idioma ya existe", + "error.language.name": "Por favor, introduce un nombre válido para el idioma", + "error.language.notFound": "No se pudo encontrar el idioma", + + "error.layout.validation.block": "Hay un error en el campo \"{field}\" del bloque {blockIndex} que utiliza el tipo de bloque \"{fieldset}\" en el layout {layoutIndex}", + "error.layout.validation.settings": "Hay un error en los ajustes del layout {index}", + + "error.license.domain": "The domain for the license is missing", + "error.license.email": "Por favor, introduce un correo electrónico válido", + "error.license.format": "Please enter a valid license code", + "error.license.verification": "La licencia no pudo ser verificada", + + "error.login.totp.confirm.invalid": "Código inválido", + "error.login.totp.confirm.missing": "Please enter the current code", + + "error.object.validation": "Hay un error en el campo \"{label}\":\n{message}", + + "error.offline": "El Panel se encuentra actualmente fuera de línea ", + + "error.page.changeSlug.permission": "No tienes permiso para cambiar el apéndice de URL para \"{slug}\"", + "error.page.changeSlug.reserved": "The path of top-level pages must not start with \"{path}\"", + "error.page.changeStatus.incomplete": "La página tiene errores y no puede ser publicada.", + "error.page.changeStatus.permission": "El estado de esta página no se puede cambiar", + "error.page.changeStatus.toDraft.invalid": "La página \"{slug}\" no se puede convertir a borrador", + "error.page.changeTemplate.invalid": "La plantilla para la página \"{slug}\" no se puede cambiar", + "error.page.changeTemplate.permission": "No tienes permiso para cambiar la plantilla para \"{slug}\"", + "error.page.changeTitle.empty": "El título no debe estar vacío.", + "error.page.changeTitle.permission": "No tienes permiso para cambiar el título por \"{slug}\"", + "error.page.create.permission": "No tienes permiso para crear \"{slug}\"", + "error.page.delete": "La página \"{slug}\" no se puede eliminar", + "error.page.delete.confirm": "Por favor, introduce el título de la página para confirmar", + "error.page.delete.hasChildren": "La página tiene subpáginas y no se puede eliminar", + "error.page.delete.permission": "No tienes permiso para eliminar \"{slug}\"", + "error.page.draft.duplicate": "Un borrador de página con el apéndice de URL \"{slug}\" ya existe", + "error.page.duplicate": "Una página con el apéndice de URL \"{slug}\" ya existe", + "error.page.duplicate.permission": "No tienes permiso para duplicar \"{slug}\"", + "error.page.move.ancestor": "The page cannot be moved into itself", + "error.page.move.directory": "The page directory cannot be moved", + "error.page.move.duplicate": "A sub page with the URL appendix \"{slug}\" already exists", + "error.page.move.notFound": "The moved page could not be found", + "error.page.move.permission": "You are not allowed to move \"{slug}\"", + "error.page.move.template": "The \"{template}\" template is not accepted as a subpage of \"{parent}\"", + "error.page.notFound": "No se puede encontrar la página \"{slug}\"", + "error.page.num.invalid": "Por favor, introduce un número de ordenación válido. Los números no deben ser negativos.", + "error.page.slug.invalid": "Por favor, introduce un apéndice de URL válido", + "error.page.slug.maxlength": "La longitud del slug debe ser inferior a \"{length}\" caracteres", + "error.page.sort.permission": "No se puede encontrar la página \"{slug}\"", + "error.page.status.invalid": "Por favor, establece un estado de página válido", + "error.page.undefined": "No se puede encontrar la página", + "error.page.update.permission": "No tienes permiso para actualizar \"{slug}\"", + + "error.section.files.max.plural": "No debes agregar más de {max} archivos a la sección \"{section}\"", + "error.section.files.max.singular": "No debes agregar más de 1 archivo a la sección \"{section}\"", + "error.section.files.min.plural": "La sección \"{section}\" requiere al menos {min} archivos", + "error.section.files.min.singular": "La sección \"{section}\" requiere al menos un archivo", + + "error.section.pages.max.plural": "No debes agregar más de {max} páginas a la sección \"{section}\"", + "error.section.pages.max.singular": "No debes agregar más de una página a la sección \"{section}\"", + "error.section.pages.min.plural": "La sección \"{section}\" requiere al menos {min} páginas", + "error.section.pages.min.singular": "La sección \"{section}\" requiere al menos una página", + + "error.section.notLoaded": "La sección \"{name}\" no pudo ser cargada", + "error.section.type.invalid": "El sección tipo \"{tipo}\" no es válido", + + "error.site.changeTitle.empty": "El título no debe estar vacío.", + "error.site.changeTitle.permission": "No tienes permiso para cambiar el título del sitio", + "error.site.update.permission": "No tienes permiso para actualizar el sitio", + + "error.structure.validation": "There's an error on the \"{field}\" field in row {index}", + + "error.template.default.notFound": "La plantilla por defecto no existe", + + "error.unexpected": "¡Se ha producido un error inesperado! Activa el modo de depuración para obtener más información: https://getkirby.com/docs/reference/system/options/debug", + + "error.user.changeEmail.permission": "No tienes permiso para cambiar el correo electrónico para el usuario \"{name}\"", + "error.user.changeLanguage.permission": "No tienes permiso para cambiar el idioma para el usuario \"{name}\"", + "error.user.changeName.permission": "No tienes permiso para cambiar el nombre del usuario \"{name}\"", + "error.user.changePassword.permission": "No tienes permiso para cambiar la contraseña del usuario \"{name}\"", + "error.user.changeRole.lastAdmin": "No se puede cambiar el rol del último administrador", + "error.user.changeRole.permission": "No tienes permiso para cambiar el rol del usuario \"{name}\"", + "error.user.changeRole.toAdmin": "No tienes permiso para promover a alguien al rol de admin", + "error.user.create.permission": "No tienes permiso para crear este usuario", + "error.user.delete": "No se puede eliminar el usuario \"{name}\"", + "error.user.delete.lastAdmin": "No se puede eliminar el último admin", + "error.user.delete.lastUser": "No se puede eliminar el último usuario ", + "error.user.delete.permission": "No tienes permiso para eliminar el usuario \"{name}\"", + "error.user.duplicate": "Un usuario con la dirección de correo electrónico \"{email}\" ya existe", + "error.user.email.invalid": "Por favor, introduce una dirección de correo electrónico válida", + "error.user.language.invalid": "Por favor, introduce un idioma válido", + "error.user.notFound": "No se puede encontrar el usuario \"{name}\"", + "error.user.password.excessive": "Please enter a valid password. Passwords must not be longer than 1000 characters.", + "error.user.password.invalid": "Por favor, introduce una contraseña válida. Las contraseñas deben tener al menos 8 caracteres de largo.", + "error.user.password.notSame": "Las contraseñas no coinciden", + "error.user.password.undefined": "El usuario no tiene contraseña", + "error.user.password.wrong": "Contraseña incorrecta", + "error.user.role.invalid": "Por favor, introduce un rol válido", + "error.user.undefined": "No se puede encontrar el usuario", + "error.user.update.permission": "No tienes permiso para actualizar el usuario \"{name}\"", + + "error.validation.accepted": "Por favor, confirma", + "error.validation.alpha": "Por favor, introduce solo caracteres entre a-z", + "error.validation.alphanum": "Por favor, introduce solo caracteres entre a-z o numerales 0-9", + "error.validation.anchor": "Please enter a correct link anchor", + "error.validation.between": "Por favor, introduce un valor entre \"{min}\" y \"{max}\"", + "error.validation.boolean": "Por favor, confirma o rechaza", + "error.validation.color": "Please enter a valid color in the {format} format", + "error.validation.contains": "Por favor, introduce un valor que contenga \"{needle}\"", + "error.validation.date": "Por favor, introduce una fecha válida", + "error.validation.date.after": "Por favor, introduce una fecha posterior a {date}", + "error.validation.date.before": "Por favor, introduce una fecha anterior a {date}", + "error.validation.date.between": "Por favor, introduce un número entre {min} y {max}", + "error.validation.denied": "Por favor, rechaza", + "error.validation.different": "El valor no debe ser \"{other}\"", + "error.validation.email": "Por favor, introduce un correo electrónico válido", + "error.validation.endswith": "El valor debe terminar con \"{end}\"", + "error.validation.filename": "Por favor, introduce un nombre de archivo válido", + "error.validation.in": "Por favor, introduce uno de los siguientes: ({in})", + "error.validation.integer": "Por favor, introduce un numero integro válido", + "error.validation.ip": "Por favor, introduce una dirección IP válida", + "error.validation.less": "Por favor, introduce un valor inferior a {max}", + "error.validation.linkType": "The link type is not allowed", + "error.validation.match": "El valor no coincide con el patrón esperado", + "error.validation.max": "Por favor, introduce un valor igual o inferior a {max}", + "error.validation.maxlength": "Por favor, introduce un valor más corto. (max. {max} caracteres)", + "error.validation.maxwords": "Por favor, introduce no más de {max} palabra(s)", + "error.validation.min": "Por favor, introduce un valor igual o mayor a {min}", + "error.validation.minlength": "Por favor, introduce un valor más largo. (min. {min} caracteres)", + "error.validation.minwords": "Por favor, introduce al menos {min} palabra(s)", + "error.validation.more": "Por favor, introduce un valor mayor a {min}", + "error.validation.notcontains": "Por favor, introduce un valor que no contenga \"{needle}\"", + "error.validation.notin": "Por favor, no introduzcas ninguno de los siguientes: ({notIn})", + "error.validation.option": "Por favor, selecciona una opción válida", + "error.validation.num": "Por favor, introduce un número valido", + "error.validation.required": "Por favor, introduce algo", + "error.validation.same": "Por favor, introduce \"{other}\"", + "error.validation.size": "El tamaño del valor debe ser \"{size}\"", + "error.validation.startswith": "El valor debe comenzar con \"{start}\"", + "error.validation.tel": "Please enter an unformatted phone number", + "error.validation.time": "Por favor, introduce una hora válida", + "error.validation.time.after": "Por favor, introduce una fecha después de {time}", + "error.validation.time.before": "Por favor, introduce una fecha antes de {time}", + "error.validation.time.between": "Por favor, introduce un fecha entre {min} y {max}", + "error.validation.uuid": "Please enter a valid UUID", + "error.validation.url": "Por favor, introduce un URL válido", + + "expand": "Expandir", + "expand.all": "Expandir todo", + + "field.invalid": "The field is invalid", + "field.required": "Este campo es obligatorio", + "field.blocks.changeType": "Cambiar tipo", + "field.blocks.code.name": "Código", + "field.blocks.code.language": "Idioma", + "field.blocks.code.placeholder": "Tu código...", + "field.blocks.delete.confirm": "¿Realmente quieres eliminar este bloque?", + "field.blocks.delete.confirm.all": "¿Realmente quieres eliminar todos los bloques?", + "field.blocks.delete.confirm.selected": "¿Realmente quieres eliminar los bloques seleccionados?", + "field.blocks.empty": "Aún no hay bloques", + "field.blocks.fieldsets.empty": "No fieldsets yet", + "field.blocks.fieldsets.label": "Por favor, selecciona un tipo de bloque...", + "field.blocks.fieldsets.paste": "Press {{ shortcut }} to import layouts/blocks from your clipboard Only those allowed in the current field will get inserted.", + "field.blocks.gallery.name": "Galería", + "field.blocks.gallery.images.empty": "Aún no hay imágenes", + "field.blocks.gallery.images.label": "Imágenes", + "field.blocks.heading.level": "Nivel", + "field.blocks.heading.name": "Encabezado", + "field.blocks.heading.text": "Texto", + "field.blocks.heading.placeholder": "Encabezado...", + "field.blocks.image.alt": "Texto alternativo", + "field.blocks.image.caption": "Leyenda", + "field.blocks.image.crop": "Cortar", + "field.blocks.image.link": "Enlace", + "field.blocks.image.location": "Ubicación", + "field.blocks.image.location.internal": "This website", + "field.blocks.image.location.external": "External source", + "field.blocks.image.name": "Imágen", + "field.blocks.image.placeholder": "Selecciona una imagen", + "field.blocks.image.ratio": "Proporción", + "field.blocks.image.url": "URL de imágen", + "field.blocks.line.name": "Linea", + "field.blocks.list.name": "Lista", + "field.blocks.markdown.name": "Markdown", + "field.blocks.markdown.label": "Texto", + "field.blocks.markdown.placeholder": "Markdown...", + "field.blocks.quote.name": "Cita", + "field.blocks.quote.text.label": "Texto", + "field.blocks.quote.text.placeholder": "Cita...", + "field.blocks.quote.citation.label": "Cita", + "field.blocks.quote.citation.placeholder": "Por ...", + "field.blocks.text.name": "Texto", + "field.blocks.text.placeholder": "Texto ...", + "field.blocks.video.autoplay": "Autoplay", + "field.blocks.video.caption": "Leyenda", + "field.blocks.video.controls": "Controls", + "field.blocks.video.location": "Ubicación", + "field.blocks.video.loop": "Loop", + "field.blocks.video.muted": "Muted", + "field.blocks.video.name": "Video", + "field.blocks.video.placeholder": "Introduce la URL de un vídeo", + "field.blocks.video.poster": "Poster", + "field.blocks.video.preload": "Preload", + "field.blocks.video.url.label": "Vídeo-URL", + "field.blocks.video.url.placeholder": "https://youtube.com/?v=", + + "field.files.empty": "Aún no hay archivos seleccionados", + + "field.layout.change": "Change layout", + "field.layout.delete": "Eliminar layout", + "field.layout.delete.confirm": "¿Realmente quieres eliminar este layout?", + "field.layout.delete.confirm.all": "Do you really want to delete all layouts?", + "field.layout.empty": "Aún no hay filas", + "field.layout.select": "Seleccionar layout", + + "field.object.empty": "Aún no hay información", + + "field.pages.empty": "Aún no hay páginas seleccionadas", + + "field.structure.delete.confirm": "¿Realmente quieres eliminar esta fila?", + "field.structure.delete.confirm.all": "¿Realmente quieres eliminar todas las entradas?", + "field.structure.empty": "Aún no hay entradas", + + "field.users.empty": "Aún no hay usuarios seleccionados", + + "fields.empty": "No fields yet", + + "file": "Archivo", + "file.blueprint": "Este archivo aún no tiene blueprint. Puedes definir la configuración en /site/blueprints/files/{blueprint}.yml", + "file.changeTemplate": "Cambiar plantilla", + "file.changeTemplate.notice": "Changing the file's template will remove content for fields that don't match in type. If the new template defines certain rules, e.g. image dimensions, those will also be applied irreversibly. Use with caution.", + "file.delete.confirm": "¿Realmente quieres eliminar
{filename}?", + "file.focus.placeholder": "Set focal point", + "file.focus.reset": "Remove focal point", + "file.focus.title": "Focus", + "file.sort": "Cambiar posición", + + "files": "Archivos", + "files.empty": "Aún no hay archivos", + + "filter": "Filter", + + "hide": "Ocultar", + "hour": "Hora", + "hue": "Hue", + "import": "Importar", + "info": "Info", + "insert": "Insertar", + "insert.after": "Insertar después", + "insert.before": "Insertar antes", + "install": "Instalar", + + "installation": "Instalación", + "installation.completed": "El panel ha sido instalado", + "installation.disabled": "El instalador del panel está deshabilitado en servidores públicos por defecto. Por favor, ejecuta el instalador en una máquina local o habilítalo con la opción panel.install.", + "installation.issues.accounts": "La carpeta /site/accounts no existe o no se puede escribir", + "installation.issues.content": "La carpeta /content no existe o no se puede escribir", + "installation.issues.curl": "La extensión CURL es requerida", + "installation.issues.headline": "No se puede instalar el panel", + "installation.issues.mbstring": "La extension MB String es requerida", + "installation.issues.media": "La carpeta /media no existe o no se puede escribir", + "installation.issues.php": "Asegurese de estar usando PHP 8+", + "installation.issues.sessions": "La carpeta /site/sessions no existe o no se puede escribir", + + "language": "Idioma", + "language.code": "Código", + "language.convert": "Hacer por defecto", + "language.convert.confirm": "

¿Realmente quieres convertir {name} al idioma por defecto? Esto no se puede deshacer.

Si {name} tiene contenido sin traducir, ya no habrá un respaldo válido y algunas partes de tu sitio podrían estar vacías.

", + "language.create": "Añadir un nuevo idioma", + "language.default": "Idioma predeterminado", + "language.delete.confirm": "¿Realmente quieres eliminar el idioma {name} incluyendo todas las traducciones? ¡Esto no se puede deshacer!", + "language.deleted": "El idioma ha sido eliminado", + "language.direction": "Leyendo dirección", + "language.direction.ltr": "De izquierda a derecha", + "language.direction.rtl": "De derecha a izquierda", + "language.locale": "PHP locale string", + "language.locale.warning": "Estás utilizando una configuración local. Por favor, modifícalo en el archivo del lenguaje en /site/languages", + "language.name": "Nombre", + "language.secondary": "Secondary language", + "language.settings": "Language settings", + "language.updated": "El idioma ha sido actualizado", + "language.variables": "Language variables", + "language.variables.empty": "No translations yet", + + "language.variable.delete.confirm": "Do you really want to delete the variable for {key}?", + "language.variable.key": "Key", + "language.variable.notFound": "The variable could not be found", + "language.variable.value": "Value", + + "languages": "Idiomas", + "languages.default": "Idioma predeterminado", + "languages.empty": "Aún no hay idiomas", + "languages.secondary": "Idiomas secundarios", + "languages.secondary.empty": "Aún no hay idiomas secundarios", + + "license": "Licencia", + "license.activate": "Activate it now", + "license.activate.label": "Please activate your license", + "license.activate.domain": "Your license will be activated for {host}.", + "license.activate.local": "You are about to activate your Kirby license for your local domain {host}. If this site will be deployed to a public domain, please activate it there instead. If {host} is the domain you want to use your license for, please continue.", + "license.activated": "Activated", + "license.buy": "Comprar una licencia", + "license.code": "Código", + "license.code.help": "You received your license code after the purchase via email. Please copy and paste it here.", + "license.code.label": "Por favor, introduce tu código de licencia", + "license.status.active.info": "Includes new major versions until {date}", + "license.status.active.label": "Valid license", + "license.status.demo.info": "This is a demo installation", + "license.status.demo.label": "Demo", + "license.status.inactive.info": "Renew license to update to new major versions", + "license.status.inactive.label": "No new major versions", + "license.status.legacy.bubble": "Ready to renew your license?", + "license.status.legacy.info": "Your license does not cover this version", + "license.status.legacy.label": "Please renew your license", + "license.status.missing.bubble": "Ready to launch your site?", + "license.status.missing.info": "No valid license", + "license.status.missing.label": "Please activate your license", + "license.manage": "Gestiona licencias", + "license.purchased": "Purchased", + "license.success": "Gracias por apoyar a Kirby", + "license.unregistered.label": "No registrado", + + "link": "Enlace", + "link.text": "Texto del enlace", + + "loading": "Cargando", + + "lock.unsaved": "Cambios sin guardar", + "lock.unsaved.empty": "No hay más cambios sin guardar", + "lock.isLocked": "Unsaved changes by {email}", + "lock.unlock": "Desbloquear", + "lock.unlock.submit": "Unlock and overwrite unsaved changes by {email}", + "lock.isUnlocked": "Was unlocked by another user", + + "login": "Iniciar sesión", + "login.code.label.login": "Código de inicio de sesión", + "login.code.label.password-reset": "Código de restablecimiento de contraseña", + "login.code.placeholder.email": "000 000", + "login.code.placeholder.totp": "000000", + "login.code.text.email": "Si tu dirección de correo electrónico está registrada, el código solicitado fue enviado por correo electrónico.", + "login.code.text.totp": "Please enter the one‑time code from your authenticator app.", + "login.email.login.body": "Hola {user.nameOrEmail},\n\nHas pedido, recientemente, un código de restablecimiento de contraseña para el Panel del sitio {site}.\nEl siguiente código de restablecimiento de contraseña será válido por {timeout} minutos:\n\n{code}\n\nSi no pediste un código de restablecimiento de contraseña, por favor ignora este correo o contacta a tu administrador si tienes dudas.\nPor seguridad, por favor NO reenvíes este correo.", + "login.email.login.subject": "Tu código de inicio de sesión", + "login.email.password-reset.body": "Hola {user.nameOrEmail},\n\nHas pedido, recientemente, un código de restablecimiento de contraseña para el Panel del sitio {site}.\nEl siguiente código de restablecimiento de contraseña será válido por {timeout} minutos:\n\n{code}\n\nSi no pediste un código de restablecimiento de contraseña, por favor ignora este correo o contacta a tu administrador si tienes dudas.\nPor seguridad, por favor NO reenvíes este correo.", + "login.email.password-reset.subject": "Tu código de restablecimiento de contraseña", + "login.remember": "Mantener sesión iniciada", + "login.reset": "Restablecer contraseña", + "login.toggleText.code.email": "Iniciar sesión por correo electrónico", + "login.toggleText.code.email-password": "Iniciar sesión con contraseña", + "login.toggleText.password-reset.email": "¿Olvidaste tu contraseña?", + "login.toggleText.password-reset.email-password": "← Volver al inicio de sesión", + "login.totp.enable.option": "Set up one‑time codes", + "login.totp.enable.intro": "Authenticator apps can generate one‑time codes that are used as a second factor when signing into your account.", + "login.totp.enable.qr.label": "1. Scan this QR code", + "login.totp.enable.qr.help": "Unable to scan? Add the setup key {secret} manually to your authenticator app.", + "login.totp.enable.confirm.headline": "2. Confirm with generated code", + "login.totp.enable.confirm.text": "Your app generates a new one‑time code every 30 seconds. Enter the current code to complete the setup:", + "login.totp.enable.confirm.label": "Current code", + "login.totp.enable.confirm.help": "After this setup, we will ask you for a one‑time code every time you log in.", + "login.totp.enable.success": "One‑time codes enabled", + "login.totp.disable.option": "Disable one‑time codes", + "login.totp.disable.label": "Enter your password to disable one‑time codes", + "login.totp.disable.help": "In the future, a different second factor like a login code sent via email will be requested when you log in. You can always set up one‑time codes again later.", + "login.totp.disable.admin": "

This will disable one‑time codes for {user}.

In the future, a different second factor like a login code sent via email will be requested when they log in. {user} can set up one‑time codes again after their next login.

", + "login.totp.disable.success": "One‑time codes disabled", + + "logout": "Cerrar sesión", + + "merge": "Merge", + "menu": "Menu", + "meridiem": "AM/PM", + "mime": "Tipos de medios", + "minutes": "Minutos", + + "month": "Mes", + "months.april": "Abril", + "months.august": "Agosto", + "months.december": "Diciembre", + "months.february": "Febrero", + "months.january": "Enero", + "months.july": "Julio", + "months.june": "Junio", + "months.march": "Marzo", + "months.may": "Mayo", + "months.november": "Noviembre", + "months.october": "Octubre", + "months.september": "Septiembre", + + "more": "Más", + "move": "Move", + "name": "Nombre", + "next": "Siguiente", + "night": "Night", + "no": "no", + "off": "Apagado", + "on": "Encendido", + "open": "Abrir", + "open.newWindow": "Abrir en una ventana nueva", + "option": "Option", + "options": "Opciones", + "options.none": "Sin opciones", + "options.all": "Show all {count} options", + + "orientation": "Orientación", + "orientation.landscape": "Paisaje", + "orientation.portrait": "Retrato", + "orientation.square": "Cuadrado", + + "page": "Página", + "page.blueprint": "Este archivo aún no tiene blueprint. Puedes definir la configuración en /site/blueprints/pages/{blueprint}.yml", + "page.changeSlug": "Cambiar URL", + "page.changeSlug.fromTitle": "Crear en base al título", + "page.changeStatus": "Cambiar estado", + "page.changeStatus.position": "Por favor, selecciona una posición", + "page.changeStatus.select": "Selecciona un nuevo estado", + "page.changeTemplate": "Cambiar plantilla", + "page.changeTemplate.notice": "Changing the page's template will remove content for fields that don't match in type. Use with caution.", + "page.create": "Create as {status}", + "page.delete.confirm": "¿Realmente quieres eliminar {title}?", + "page.delete.confirm.subpages": "Esta página tiene subpáginas.
Todas las subpáginas también serán eliminadas.", + "page.delete.confirm.title": "Introduce el título de la página para confirmar", + "page.duplicate.appendix": "Copiar", + "page.duplicate.files": "Copiar archivos", + "page.duplicate.pages": "Copiar páginas", + "page.move": "Move page", + "page.sort": "Cambiar posición", + "page.status": "Estado", + "page.status.draft": "Borrador", + "page.status.draft.description": "La página está en modo borrador y solo es visible para editores conectados o mediante enlace secreto.", + "page.status.listed": "Pública", + "page.status.listed.description": "La página es pública para cualquiera", + "page.status.unlisted": "Sin publicar", + "page.status.unlisted.description": "La página solo es accesible vía URL", + + "pages": "Paginas", + "pages.empty": "Aún no hay páginas", + "pages.status.draft": "Borradores", + "pages.status.listed": "Publicadas", + "pages.status.unlisted": "Sin publicar", + + "pagination.page": "Página", + + "password": "Contraseña", + "paste": "Pegar", + "paste.after": "Pegar después", + "paste.success": "{count} pasted!", + "pixel": "Pixel", + "plugin": "Plugin", + "plugins": "Plugins", + "prev": "Anterior", + "preview": "Previsualizar", + "remove": "Eliminar", + "rename": "Renombrar", + "renew": "Renew", + "replace": "Remplazar", + "replace.with": "Replace with", + "retry": "Inténtalo de nuevo", + "revert": "Revertir", + "revert.confirm": "¿Realmente quieres eliminar todos los cambios sin guardar?", + + "role": "Rol", + "role.admin.description": "El administrador tiene todos los derechos", + "role.admin.title": "Administrador", + "role.all": "Todo", + "role.empty": "No hay usuarios con este rol", + "role.description.placeholder": "Sin descripción", + "role.nobody.description": "Este es un rol alternativo sin permisos", + "role.nobody.title": "Nadie", + + "save": "Guardar", + "search": "Buscar", + "search.min": "Introduce {min} caracteres para buscar", + "search.all": "Show all {count} results", + "search.results.none": "Sin resultados", + + "section.invalid": "The section is invalid", + "section.required": "Esta sección es obligatoria", + + "security": "Seguridad", + "select": "Seleccionar", + "server": "Servidor", + "settings": "Ajustes", + "show": "Mostrar", + "site.blueprint": "Este archivo aún no tiene blueprint. Puedes definir la configuración en /site/blueprints/site.yml", + "size": "Tamaño", + "slug": "Apéndice de URL", + "sort": "Ordenar", + "sort.drag": "Drag to sort …", + "split": "Split", + + "stats.empty": "Sin informes", + "status": "Estado", + + "system.info.copy": "Copy info", + "system.info.copied": "System info copied", + "system.issues.content": "La carpeta content parece estar expuesta", + "system.issues.eol.kirby": "La versión de Kirby que tienes instalada ha llegado al final de su vida útil y no recibirá más actualizaciones de seguridad.", + "system.issues.eol.plugin": "La versión del plugin { plugin } que tienes instalada ha llegado al final de su vida útil y no recibirá más actualizaciones de seguridad.", + "system.issues.eol.php": "Your installed PHP release { release } has reached end-of-life and will not receive further security updates", + "system.issues.debug": "La depuración debe estar desactivada en producción", + "system.issues.git": "La carpeta .git parece estar expuesta", + "system.issues.https": "Recomendamos HTTPS para todos tus sitios web", + "system.issues.kirby": "La carpeta kirby parece estar expuesta", + "system.issues.site": "La carpeta site parece estar expuesta", + "system.issues.vulnerability.kirby": "Tu instalación podría estar afectada por la siguiente vulnerabilidad ({ severity } gravedad): { description }", + "system.issues.vulnerability.plugin": "Tu instalación podría estar afectada por la siguiente vulnerabilidad en el plugin { plugin } ({ severity } gravedad): { description }", + "system.updateStatus": "Estado de actualización", + "system.updateStatus.error": "No se pudo comprobar si hay actualizaciones", + "system.updateStatus.not-vulnerable": "Sin vulnerabilidades conocidas", + "system.updateStatus.security-update": "Actualización gratuita de seguridad { version } disponible", + "system.updateStatus.security-upgrade": "Actualización { versión } con correcciones de seguridad disponibles", + "system.updateStatus.unreleased": "Versión no publicada", + "system.updateStatus.up-to-date": "Actualizado", + "system.updateStatus.update": "Actualización gratuita {version} disponible", + "system.updateStatus.upgrade": "Actualización {versión} disponible", + + "tel": "Phone", + "tel.placeholder": "+49123456789", + "template": "Plantilla", + "title": "Título", + "today": "Hoy", + + "toolbar.button.clear": "Clear formatting", + "toolbar.button.code": "Código", + "toolbar.button.bold": "Negrita", + "toolbar.button.email": "Correo electrónico", + "toolbar.button.headings": "Encabezados", + "toolbar.button.heading.1": "Encabezado 1", + "toolbar.button.heading.2": "Encabezado 2", + "toolbar.button.heading.3": "Encabezado 3", + "toolbar.button.heading.4": "Encabezado 4", + "toolbar.button.heading.5": "Encabezado 5", + "toolbar.button.heading.6": "Encabezado 6", + "toolbar.button.italic": "Italica", + "toolbar.button.file": "Archivo", + "toolbar.button.file.select": "Seleccionar un archivo", + "toolbar.button.file.upload": "Subir un archivo", + "toolbar.button.link": "Enlace", + "toolbar.button.paragraph": "Parágrafo", + "toolbar.button.strike": "Tachado", + "toolbar.button.sub": "Subscript", + "toolbar.button.sup": "Superscript", + "toolbar.button.ol": "Lista ordenada", + "toolbar.button.underline": "Subrayado", + "toolbar.button.ul": "Lista de viñetas", + + "translation.author": "Turqueso", + "translation.direction": "ltr", + "translation.name": "Español", + "translation.locale": "es_ES", + + "type": "Type", + + "upload": "Subir", + "upload.error.cantMove": "El archivo subido no pudo ser movido", + "upload.error.cantWrite": "Error al escribir el archivo en el disco", + "upload.error.default": "El archivo no pudo ser subido", + "upload.error.extension": "Subida de archivo detenida por la extensión", + "upload.error.formSize": "El archivo subido excede la directiva MAX_FILE_SIZE que fue especificada en el formulario", + "upload.error.iniPostSize": "El archivo subido excede la directiva post_max_size directive en php.ini", + "upload.error.iniSize": "El archivo subido excede la directiva upload_max_filesize en php.ini", + "upload.error.noFile": "No se ha subido ningún archivo", + "upload.error.noFiles": "No se ha subido ningún archivo", + "upload.error.partial": "El archivo ha sido subido solo parcialmente", + "upload.error.tmpDir": "No se encuentra la carpeta temporal", + "upload.errors": "Error", + "upload.progress": "Cargando…", + + "url": "Url", + "url.placeholder": "https://ejemplo.com", + + "user": "Usuario", + "user.blueprint": "Puedes definir secciones y campos de formulario adicionales para este rol de usuario en /site/blueprints/users/{blueprint}.yml", + "user.changeEmail": "Cambiar correo electrónico", + "user.changeLanguage": "Cambiar idioma", + "user.changeName": "Renombrar a este usuario", + "user.changePassword": "Cambiar contraseña", + "user.changePassword.new": "Nueva contraseña", + "user.changePassword.new.confirm": "Confirmar nueva contraseña…", + "user.changeRole": "Cambiar rol", + "user.changeRole.select": "Seleccionar un nuevo rol", + "user.create": "Añadir un nuevo usuario", + "user.delete": "Eliminar este usuario", + "user.delete.confirm": "¿Realmente quieres eliminar
{email}?", + + "users": "Usuarios", + + "version": "Versión", + "version.current": "Versión actual", + "version.latest": "Última versión", + "versionInformation": "Información sobre la versión", + + "view.account": "Tu cuenta", + "view.installation": "Instalación", + "view.languages": "Idiomas", + "view.resetPassword": "Restablecer contraseña", + "view.site": "Sitio", + "view.system": "Sistema", + "view.users": "Usuarios", + + "welcome": "Bienvenido(a)", + "year": "Año", + "yes": "Sí" +} diff --git a/kirby/i18n/translations/fa.json b/kirby/i18n/translations/fa.json new file mode 100644 index 0000000..6b648b8 --- /dev/null +++ b/kirby/i18n/translations/fa.json @@ -0,0 +1,730 @@ +{ + "account.changeName": "Change your name", + "account.delete": "Delete your account", + "account.delete.confirm": "Do you really want to delete your account? You will be logged out immediately. Your account cannot be recovered.", + + "activate": "Activate", + "add": "\u0627\u0641\u0632\u0648\u062f\u0646", + "alpha": "Alpha", + "author": "Author", + "avatar": "\u062a\u0635\u0648\u06cc\u0631 \u067e\u0631\u0648\u0641\u0627\u06cc\u0644", + "back": "بازگشت", + "cancel": "\u0627\u0646\u0635\u0631\u0627\u0641", + "change": "\u0627\u0635\u0644\u0627\u062d", + "close": "\u0628\u0633\u062a\u0646", + "changes": "Changes", + "confirm": "تایید", + "collapse": "Collapse", + "collapse.all": "Collapse All", + "color": "Color", + "coordinates": "Coordinates", + "copy": "کپی", + "copy.all": "Copy all", + "copy.success": "{count} copied!", + "create": "ایجاد", + "custom": "Custom", + + "date": "تاریخ", + "date.select": "یک تاریخ را انتخاب کنید", + + "day": "روز", + "days.fri": "\u062c\u0645\u0639\u0647", + "days.mon": "\u062f\u0648\u0634\u0646\u0628\u0647", + "days.sat": "\u0634\u0646\u0628\u0647", + "days.sun": "\u06cc\u06a9\u0634\u0646\u0628\u0647", + "days.thu": "\u067e\u0646\u062c\u0634\u0646\u0628\u0647", + "days.tue": "\u0633\u0647 \u0634\u0646\u0628\u0647", + "days.wed": "\u0686\u0647\u0627\u0631\u0634\u0646\u0628\u0647", + + "debugging": "Debugging", + + "delete": "\u062d\u0630\u0641", + "delete.all": "Delete all", + + "dialog.fields.empty": "This dialog has no fields", + "dialog.files.empty": "No files to select", + "dialog.pages.empty": "No pages to select", + "dialog.text.empty": "This dialog does not define any text", + "dialog.users.empty": "No users to select", + + "dimensions": "ابعاد", + "disable": "Disable", + "disabled": "Disabled", + "discard": "\u0627\u0646\u0635\u0631\u0627\u0641", + + "drawer.fields.empty": "This drawer has no fields", + + "domain": "Domain", + "download": "Download", + "duplicate": "Duplicate", + + "edit": "\u0648\u06cc\u0631\u0627\u06cc\u0634", + + "email": "\u067e\u0633\u062a \u0627\u0644\u06a9\u062a\u0631\u0648\u0646\u06cc\u06a9", + "email.placeholder": "mail@example.com", + + "enter": "Enter", + "entries": "Entries", + "entry": "Entry", + + "environment": "Environment", + + "error": "Error", + "error.access.code": "Invalid code", + "error.access.login": "اطلاعات ورودی نامعتبر است", + "error.access.panel": "شما اجازه دسترسی به پانل را ندارید", + "error.access.view": "You are not allowed to access this part of the panel", + + "error.avatar.create.fail": "بارگزاری تصویر پروفایل موفق نبود", + "error.avatar.delete.fail": "\u062a\u0635\u0648\u06cc\u0631 \u067e\u0631\u0648\u0641\u0627\u06cc\u0644 \u0631\u0627 \u0646\u0645\u06cc\u062a\u0648\u0627\u0646 \u062d\u0630\u0641 \u06a9\u0631\u062f", + "error.avatar.dimensions.invalid": "لطفا طول و عرض تصویر پروفایل را زیر 3000 پیکسل انتخاب کنید", + "error.avatar.mime.forbidden": "تصویر پروفایل باید از نوع JPEG یا PNG باشد", + + "error.blueprint.notFound": "بلوپرینت با نام «{name}» قابل بارگذاری نیست", + + "error.blocks.max.plural": "You must not add more than {max} blocks", + "error.blocks.max.singular": "You must not add more than one block", + "error.blocks.min.plural": "You must add at least {min} blocks", + "error.blocks.min.singular": "You must add at least one block", + "error.blocks.validation": "There's an error on the \"{field}\" field in block {index} using the \"{fieldset}\" block type", + + "error.cache.type.invalid": "Invalid cache type \"{type}\"", + + "error.email.preset.notFound": "قالب ایمیل «{name}» پیدا نشد", + + "error.field.converter.invalid": "مبدل «{converter}» نامعتبر است", + "error.field.type.missing": "Field \"{ name }\": The field type \"{ type }\" does not exist", + + "error.file.changeName.empty": "The name must not be empty", + "error.file.changeName.permission": "شما اجازه تنغییر نام فایل «{filename}» را ندارید", + "error.file.changeTemplate.invalid": "The template for the file \"{id}\" cannot be changed to \"{template}\" (valid: \"{blueprints}\")", + "error.file.changeTemplate.permission": "You are not allowed to change the template for the file \"{id}\"", + + "error.file.duplicate": "فایلی هم نام با «{filename}» هم اکنون موجود است", + "error.file.extension.forbidden": "پسوند فایل «{extension}» غیرمجاز است", + "error.file.extension.invalid": "Invalid extension: {extension}", + "error.file.extension.missing": "\u0634\u0645\u0627 \u0646\u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u062f \u0641\u0627\u06cc\u0644\u200c\u0647\u0627\u06cc \u0628\u062f\u0648\u0646 \u067e\u0633\u0648\u0646\u062f \u0631\u0627 \u0622\u067e\u0644\u0648\u062f \u06a9\u0646\u06cc\u062f", + "error.file.maxheight": "The height of the image must not exceed {height} pixels", + "error.file.maxsize": "The file is too large", + "error.file.maxwidth": "The width of the image must not exceed {width} pixels", + "error.file.mime.differs": "فایل آپلود شده باید از همان نوع باشد «{mime}»", + "error.file.mime.forbidden": "فرمت فایل «{mime}» غیرمجاز است", + "error.file.mime.invalid": "Invalid mime type: {mime}", + "error.file.mime.missing": "فرمت فایل «{filename}» قابل شناسایی نیست", + "error.file.minheight": "The height of the image must be at least {height} pixels", + "error.file.minsize": "The file is too small", + "error.file.minwidth": "The width of the image must be at least {width} pixels", + "error.file.name.unique": "The filename must be unique", + "error.file.name.missing": "نام فایل اجباری است", + "error.file.notFound": "فایل «{filename}» پیدا نشد.", + "error.file.orientation": "The orientation of the image must be \"{orientation}\"", + "error.file.type.forbidden": "شما اجازه بارگذاری فایلهای «{type}» را ندارید", + "error.file.type.invalid": "Invalid file type: {type}", + "error.file.undefined": "\u0641\u0627\u06cc\u0644 \u0645\u0648\u0631\u062f \u0646\u0638\u0631 \u067e\u06cc\u062f\u0627 \u0646\u0634\u062f.", + + "error.form.incomplete": "لطفا کلیه خطاهای فرم را برطرف کنید", + "error.form.notSaved": "امکان دخیره فرم وجود ندارد", + + "error.language.code": "Please enter a valid code for the language", + "error.language.duplicate": "The language already exists", + "error.language.name": "Please enter a valid name for the language", + "error.language.notFound": "The language could not be found", + + "error.layout.validation.block": "There's an error on the \"{field}\" field in block {blockIndex} using the \"{fieldset}\" block type in layout {layoutIndex}", + "error.layout.validation.settings": "There's an error in layout {index} settings", + + "error.license.domain": "The domain for the license is missing", + "error.license.email": "لطفا ایمیل صحیحی وارد کنید", + "error.license.format": "Please enter a valid license code", + "error.license.verification": "The license could not be verified", + + "error.login.totp.confirm.invalid": "Invalid code", + "error.login.totp.confirm.missing": "Please enter the current code", + + "error.object.validation": "There’s an error in the \"{label}\" field:\n{message}", + + "error.offline": "The Panel is currently offline", + + "error.page.changeSlug.permission": "شما امکان تغییر پسوند Url صفحه «{slug}» را ندارید", + "error.page.changeSlug.reserved": "The path of top-level pages must not start with \"{path}\"", + "error.page.changeStatus.incomplete": "صفحه حاوی خطا است و قابل انتشار نیست", + "error.page.changeStatus.permission": "وضعیت صفحه جاری قابل تغییر نیست", + "error.page.changeStatus.toDraft.invalid": "صفحه «{slug}» قابل تبدیل به پیش نویس نیست", + "error.page.changeTemplate.invalid": "قالب صفحه «{slug}» قابل تغییر نیست", + "error.page.changeTemplate.permission": "شما اجازه تغییر قالب «{slug}» را ندارید", + "error.page.changeTitle.empty": "عنوان اجباری است", + "error.page.changeTitle.permission": "شما اجازه تغییر عنوان «{slug}» را ندارید", + "error.page.create.permission": "شما اجازه ایجاد «{slug}» را ندارید", + "error.page.delete": "حذف صفحه «{slug}» ممکن نیست", + "error.page.delete.confirm": "جهت ادامه عنوان صفحه را وارد کنید", + "error.page.delete.hasChildren": "این صفحه جاوی زیرصفحه است و نمی تواند حذف شود", + "error.page.delete.permission": "شما اجازه حذف «{slug}» را ندارید", + "error.page.draft.duplicate": "صفحه پیش‌نویسی با پسوند Url مشابه «{slug}» هم اکنون موجود است", + "error.page.duplicate": "صفحه‌ای با آدرس Url مشابه «{slug}» هم اکنون موجود است", + "error.page.duplicate.permission": "You are not allowed to duplicate \"{slug}\"", + "error.page.move.ancestor": "The page cannot be moved into itself", + "error.page.move.directory": "The page directory cannot be moved", + "error.page.move.duplicate": "A sub page with the URL appendix \"{slug}\" already exists", + "error.page.move.notFound": "The moved page could not be found", + "error.page.move.permission": "You are not allowed to move \"{slug}\"", + "error.page.move.template": "The \"{template}\" template is not accepted as a subpage of \"{parent}\"", + "error.page.notFound": "صفحه مورد نظر با آدرس «{slug}» پیدا نشد.", + "error.page.num.invalid": "لطفا شماره ترتیب را بدرستی وارد نمایید. اعداد نباید منفی باشند.", + "error.page.slug.invalid": "Please enter a valid URL appendix", + "error.page.slug.maxlength": "Slug length must be less than \"{length}\" characters", + "error.page.sort.permission": "امکان مرتب‌سازی «{slug}» نیست", + "error.page.status.invalid": "لطفا وضعیت صحیحی برای صفحه انتخاب کنید", + "error.page.undefined": "صفحه مورد نظر پیدا نشد", + "error.page.update.permission": "شما اجازه بروزرسانی «{slug}» را ندارید", + + "error.section.files.max.plural": "نباید بیش از {max} فایل به بخش «{section}» اضافه کنید", + "error.section.files.max.singular": "نباید بیش از یک فایل به بخش «{section}» اضافه کنید", + "error.section.files.min.plural": "The \"{section}\" section requires at least {min} files", + "error.section.files.min.singular": "The \"{section}\" section requires at least one file", + + "error.section.pages.max.plural": "نباید بیش از {max} صفحه به بخش «{section}» اضافه کنید", + "error.section.pages.max.singular": "نباید بیش از یک صفحه به بخش «{section}» اضافه کنید", + "error.section.pages.min.plural": "The \"{section}\" section requires at least {min} pages", + "error.section.pages.min.singular": "The \"{section}\" section requires at least one page", + + "error.section.notLoaded": "بخش «{name}» قابل بارکذاری نیست", + "error.section.type.invalid": "نوع بخش «{type}» غیرمجاز است", + + "error.site.changeTitle.empty": "عنوان اجباری است", + "error.site.changeTitle.permission": "شما اجازه تغییر عنوان سایت را ندارید", + "error.site.update.permission": "شما اجازه بروزرسانی سایت را ندارید", + + "error.structure.validation": "There's an error on the \"{field}\" field in row {index}", + + "error.template.default.notFound": "قالب پیش فرض موجود نیست", + + "error.unexpected": "An unexpected error occurred! Enable debug mode for more info: https://getkirby.com/docs/reference/system/options/debug", + + "error.user.changeEmail.permission": "شما اجازه تغییر ایمیل کاربر «{name}» را ندارید", + "error.user.changeLanguage.permission": "شما اجازه تغییر زبان برای کاربر «{name}» را ندارید", + "error.user.changeName.permission": "شما اجازه تنغییر نام کاربر «{name}» را ندارید", + "error.user.changePassword.permission": "شما اجازه تغییر رمز عبور کاربر «{name}» را ندارید", + "error.user.changeRole.lastAdmin": "نقش آخرین مدیر سیستم قابل تغییر نیست", + "error.user.changeRole.permission": "شما اجازه تغییر نقش کاربر «{name}» را ندارید", + "error.user.changeRole.toAdmin": "You are not allowed to promote someone to the admin role", + "error.user.create.permission": "شما اجازه ایجاد این کاربر را ندارید", + "error.user.delete": "کاربر «{name}» نمی تواند حذف شود", + "error.user.delete.lastAdmin": "\u062d\u0630\u0641 \u0622\u062e\u0631\u06cc\u0646 \u0645\u062f\u06cc\u0631 \u0633\u06cc\u0633\u062a\u0645 \u0645\u0645\u06a9\u0646 \u0646\u06cc\u0633\u062a", + "error.user.delete.lastUser": "حذف آخرین کاربر ممکن نیست", + "error.user.delete.permission": "شما اجازه حذف کاربر «{name}» را ندارید", + "error.user.duplicate": "کاربری با ایمیل «{email}» هم اکنون موجود است", + "error.user.email.invalid": "لطفا یک ایمیل معتبر وارد کنید", + "error.user.language.invalid": "لطفا زبان معتبری انتخاب کنید", + "error.user.notFound": "کاربر «{name}» پیدا نشد", + "error.user.password.excessive": "Please enter a valid password. Passwords must not be longer than 1000 characters.", + "error.user.password.invalid": "لطفا گذرواژه صحیحی با حداقل طول 8 حرف وارد کنید. ", + "error.user.password.notSame": "\u0644\u0637\u0641\u0627 \u062a\u06a9\u0631\u0627\u0631 \u06af\u0630\u0631\u0648\u0627\u0698\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u0646\u0645\u0627\u06cc\u06cc\u062f", + "error.user.password.undefined": "کاربر فاقد گذرواژه است", + "error.user.password.wrong": "Wrong password", + "error.user.role.invalid": "لطفا نقش صحیحی وارد نمایید", + "error.user.undefined": "کاربر مورد نظر پیدا نشد", + "error.user.update.permission": "شما اجازه بروزرسانی کاربر «{name}» را ندارید", + + "error.validation.accepted": "لطفا تایید کنید", + "error.validation.alpha": "لطفا تنها از بین حروف a-z انتخاب کنید", + "error.validation.alphanum": "لطفا تنها از بین حروف a-z و اعداد 0-9 انتخاب کنید", + "error.validation.anchor": "Please enter a correct link anchor", + "error.validation.between": "لطفا مقداری مابین «{min}» و «{max}» وارد کنید", + "error.validation.boolean": "لطفا تایید یا رد کنید", + "error.validation.color": "Please enter a valid color in the {format} format", + "error.validation.contains": "لطفا مقداری شامل «{needle}» وارد کنید", + "error.validation.date": "لطفا تاریخ معتبری وارد کنید", + "error.validation.date.after": "Please enter a date after {date}", + "error.validation.date.before": "Please enter a date before {date}", + "error.validation.date.between": "Please enter a date between {min} and {max}", + "error.validation.denied": "لطفا رد کنید", + "error.validation.different": "مقدار نباید مساوی «{other}» باشد", + "error.validation.email": "لطفا ایمیل صحیحی وارد کنید", + "error.validation.endswith": "مقدار باید با «{end}» ختم شود", + "error.validation.filename": "لطفا نام فایل صحیحی وارد کنید", + "error.validation.in": "لطفا یکی از مقادیر روبرو را وارد کنید: ({in})", + "error.validation.integer": "لطفا عدد صحیحی وارد کنید", + "error.validation.ip": "لطفا IP آدرس صحیحی وارد کنید", + "error.validation.less": "لطفا مقداری کمتر از {max} وارد کنید", + "error.validation.linkType": "The link type is not allowed", + "error.validation.match": "مقدار وارد شده با الگوی مورد نظر همخوانی ندارد", + "error.validation.max": "لطفا مقداری کوچکتر یا مساوی {min} وارد کنید", + "error.validation.maxlength": "لطفا عبارت کوتاه‌تری وارد کنید. (حداکثر {max} حرف)", + "error.validation.maxwords": "لطفا بیش از {max} کلمه وارد نکنید", + "error.validation.min": "لطفا مقداری بزرگتر یا مساوی با {min} وارد کنید", + "error.validation.minlength": "لطفا عبارتی طولانی‌تری وارد کنید. (حداقل {min} حرف)", + "error.validation.minwords": "لطفا حداقل {min} کلمه وارد کنید", + "error.validation.more": "لطفا مقداری بیش از {min} وارد کنید", + "error.validation.notcontains": "لطفا مقداری فاقد «{needle}» وارد کنید", + "error.validation.notin": "لطفا از مقادیر روبرو استفاده نکنید: ({notin})", + "error.validation.option": "لطفا گزینه معتبری انتخاب کنید", + "error.validation.num": "لطفا عدد صحیحی وارد کنید", + "error.validation.required": "لطفا مقداری وارد کنید", + "error.validation.same": "لطفا مقدار «{other}» را وارد کنید", + "error.validation.size": "اندازه ورودی باید معادل «{size}» باشد", + "error.validation.startswith": "مقدار باید با «{start}» شروع شود", + "error.validation.tel": "Please enter an unformatted phone number", + "error.validation.time": "لطفا زمان معتبری وارد کنید", + "error.validation.time.after": "Please enter a time after {time}", + "error.validation.time.before": "Please enter a time before {time}", + "error.validation.time.between": "Please enter a time between {min} and {max}", + "error.validation.uuid": "Please enter a valid UUID", + "error.validation.url": "لطفا آدرس URL صحیح وارد کنید", + + "expand": "Expand", + "expand.all": "Expand All", + + "field.invalid": "The field is invalid", + "field.required": "The field is required", + "field.blocks.changeType": "Change type", + "field.blocks.code.name": "کد", + "field.blocks.code.language": "زبان", + "field.blocks.code.placeholder": "Your code …", + "field.blocks.delete.confirm": "Do you really want to delete this block?", + "field.blocks.delete.confirm.all": "Do you really want to delete all blocks?", + "field.blocks.delete.confirm.selected": "Do you really want to delete the selected blocks?", + "field.blocks.empty": "No blocks yet", + "field.blocks.fieldsets.empty": "No fieldsets yet", + "field.blocks.fieldsets.label": "Please select a block type …", + "field.blocks.fieldsets.paste": "Press {{ shortcut }} to import layouts/blocks from your clipboard Only those allowed in the current field will get inserted.", + "field.blocks.gallery.name": "Gallery", + "field.blocks.gallery.images.empty": "No images yet", + "field.blocks.gallery.images.label": "Images", + "field.blocks.heading.level": "Level", + "field.blocks.heading.name": "Heading", + "field.blocks.heading.text": "Text", + "field.blocks.heading.placeholder": "Heading …", + "field.blocks.image.alt": "Alternative text", + "field.blocks.image.caption": "Caption", + "field.blocks.image.crop": "Crop", + "field.blocks.image.link": "پیوند", + "field.blocks.image.location": "Location", + "field.blocks.image.location.internal": "This website", + "field.blocks.image.location.external": "External source", + "field.blocks.image.name": "تصویر", + "field.blocks.image.placeholder": "Select an image", + "field.blocks.image.ratio": "Ratio", + "field.blocks.image.url": "Image URL", + "field.blocks.line.name": "Line", + "field.blocks.list.name": "List", + "field.blocks.markdown.name": "Markdown", + "field.blocks.markdown.label": "Text", + "field.blocks.markdown.placeholder": "Markdown …", + "field.blocks.quote.name": "Quote", + "field.blocks.quote.text.label": "Text", + "field.blocks.quote.text.placeholder": "Quote …", + "field.blocks.quote.citation.label": "Citation", + "field.blocks.quote.citation.placeholder": "by …", + "field.blocks.text.name": "Text", + "field.blocks.text.placeholder": "Text …", + "field.blocks.video.autoplay": "Autoplay", + "field.blocks.video.caption": "Caption", + "field.blocks.video.controls": "Controls", + "field.blocks.video.location": "Location", + "field.blocks.video.loop": "Loop", + "field.blocks.video.muted": "Muted", + "field.blocks.video.name": "Video", + "field.blocks.video.placeholder": "Enter a video URL", + "field.blocks.video.poster": "Poster", + "field.blocks.video.preload": "Preload", + "field.blocks.video.url.label": "Video-URL", + "field.blocks.video.url.placeholder": "https://youtube.com/?v=", + + "field.files.empty": "فایلی انتخاب نشده است", + + "field.layout.change": "Change layout", + "field.layout.delete": "Delete layout", + "field.layout.delete.confirm": "Do you really want to delete this layout?", + "field.layout.delete.confirm.all": "Do you really want to delete all layouts?", + "field.layout.empty": "No rows yet", + "field.layout.select": "Select a layout", + + "field.object.empty": "No information yet", + + "field.pages.empty": "صفحه‌ای انتخاب نشده است", + + "field.structure.delete.confirm": "\u0645\u062f\u062e\u0644 \u062c\u0627\u0631\u06cc \u062d\u0630\u0641 \u0634\u0648\u062f\u061f", + "field.structure.delete.confirm.all": "Do you really want to delete all entries?", + "field.structure.empty": "\u0645\u0648\u0631\u062f\u06cc \u0648\u062c\u0648\u062f \u0646\u062f\u0627\u0631\u062f.", + + "field.users.empty": "کاربری انتخاب نشده است", + + "fields.empty": "No fields yet", + + "file": "File", + "file.blueprint": "This file has no blueprint yet. You can define the setup in /site/blueprints/files/{blueprint}.yml", + "file.changeTemplate": "تغییر قالب", + "file.changeTemplate.notice": "Changing the file's template will remove content for fields that don't match in type. If the new template defines certain rules, e.g. image dimensions, those will also be applied irreversibly. Use with caution.", + "file.delete.confirm": "آیا واقعا می خواهید این فایل را حذف کنید؟
{filename}", + "file.focus.placeholder": "Set focal point", + "file.focus.reset": "Remove focal point", + "file.focus.title": "Focus", + "file.sort": "Change position", + + "files": "فایل‌ها", + "files.empty": "فایلی موجود نیست", + + "filter": "Filter", + + "hide": "Hide", + "hour": "ساعت", + "hue": "Hue", + "import": "Import", + "info": "Info", + "insert": "\u062f\u0631\u062c", + "insert.after": "Insert after", + "insert.before": "Insert before", + "install": "نصب", + + "installation": "نصب و راه اندازی", + "installation.completed": "پنل کاربری نصب شد", + "installation.disabled": "نصب کننده پانل کاربری بصورت پیش‌فرض در سرورهای عمومی غیرفعال است. لطفا نصب را روی یک ماشین محلی اجرا کنید یا آن را با استفاده از panel.install فعال کنید.", + "installation.issues.accounts": "پوشه /site/accounts موجود نیست یا قابل نوشتن نیست.", + "installation.issues.content": "پوشه /content موجود نیست یا قابل نوشتن نیست", + "installation.issues.curl": "افزونه CURL مورد نیاز است", + "installation.issues.headline": "نصب پانل کاربری ممکن نیست", + "installation.issues.mbstring": "افزونه MB String مورد نیاز است", + "installation.issues.media": "پوشه /media موجود نیست یا قابل نوشتن نیست", + "installation.issues.php": "لطفا از پی‌اچ‌پی 8 یا بالاتر استفاده کنید", + "installation.issues.sessions": "پوشه /site/sessions وجود ندارد یا قابل نوشتن نیست", + + "language": "\u0632\u0628\u0627\u0646", + "language.code": "کد", + "language.convert": "پیش‌فرض شود", + "language.convert.confirm": "

آیا واقعا میخواهید {name} را به زبان پیشفرض تبدیل کنید؟ این عمل برگشت ناپذیر است.

اگر {name} دارای محتوای غیر ترجمه شده باشد، جایگزین معتبر دیگری نخواهد بود و ممکن است بخش‌هایی از سایت شما خالی باشد.

", + "language.create": "افزودن زبان جدید", + "language.default": "زبان پیش‌فرض", + "language.delete.confirm": "آیا واقعا میخواهید زبان {name} را به همراه تمام ترجمه‌ها حذف کنید؟ این عمل قابل بازگشت نخواهد بود!", + "language.deleted": "زبان مورد نظر حذف شد", + "language.direction": "rtl", + "language.direction.ltr": "چپ به راست", + "language.direction.rtl": "راست به چپ", + "language.locale": "PHP locale string", + "language.locale.warning": "You are using a custom locale set up. Please modify it in the language file in /site/languages", + "language.name": "پارسی", + "language.secondary": "Secondary language", + "language.settings": "Language settings", + "language.updated": "زبان به روز شد", + "language.variables": "Language variables", + "language.variables.empty": "No translations yet", + + "language.variable.delete.confirm": "Do you really want to delete the variable for {key}?", + "language.variable.key": "Key", + "language.variable.notFound": "The variable could not be found", + "language.variable.value": "Value", + + "languages": "زبان‌ها", + "languages.default": "زبان پیش‌فرض", + "languages.empty": "هنوز هیچ زبانی موجود نیست", + "languages.secondary": "زبان‌های ثانویه", + "languages.secondary.empty": "هنوز هیچ زبان ثانویه‌ای موجود نیست", + + "license": "\u0645\u062c\u0648\u0632", + "license.activate": "Activate it now", + "license.activate.label": "Please activate your license", + "license.activate.domain": "Your license will be activated for {host}.", + "license.activate.local": "You are about to activate your Kirby license for your local domain {host}. If this site will be deployed to a public domain, please activate it there instead. If {host} is the domain you want to use your license for, please continue.", + "license.activated": "Activated", + "license.buy": "خرید مجوز", + "license.code": "کد", + "license.code.help": "You received your license code after the purchase via email. Please copy and paste it here.", + "license.code.label": "لطفا کد مجوز خود را وارد کنید", + "license.status.active.info": "Includes new major versions until {date}", + "license.status.active.label": "Valid license", + "license.status.demo.info": "This is a demo installation", + "license.status.demo.label": "Demo", + "license.status.inactive.info": "Renew license to update to new major versions", + "license.status.inactive.label": "No new major versions", + "license.status.legacy.bubble": "Ready to renew your license?", + "license.status.legacy.info": "Your license does not cover this version", + "license.status.legacy.label": "Please renew your license", + "license.status.missing.bubble": "Ready to launch your site?", + "license.status.missing.info": "No valid license", + "license.status.missing.label": "Please activate your license", + "license.manage": "Manage your licenses", + "license.purchased": "Purchased", + "license.success": "با تشکر از شما برای حمایت از کربی", + "license.unregistered.label": "Unregistered", + + "link": "\u067e\u06cc\u0648\u0646\u062f", + "link.text": "\u0645\u062a\u0646 \u067e\u06cc\u0648\u0646\u062f", + + "loading": "بارگزاری", + + "lock.unsaved": "Unsaved changes", + "lock.unsaved.empty": "There are no more unsaved changes", + "lock.isLocked": "Unsaved changes by {email}", + "lock.unlock": "Unlock", + "lock.unlock.submit": "Unlock and overwrite unsaved changes by {email}", + "lock.isUnlocked": "Was unlocked by another user", + + "login": "ورود", + "login.code.label.login": "Login code", + "login.code.label.password-reset": "Password reset code", + "login.code.placeholder.email": "000 000", + "login.code.placeholder.totp": "000000", + "login.code.text.email": "If your email address is registered, the requested code was sent via email.", + "login.code.text.totp": "Please enter the one‑time code from your authenticator app.", + "login.email.login.body": "Hi {user.nameOrEmail},\n\nYou recently requested a login code for the Panel of {site}.\nThe following login code will be valid for {timeout} minutes:\n\n{code}\n\nIf you did not request a login code, please ignore this email or contact your administrator if you have questions.\nFor security, please DO NOT forward this email.", + "login.email.login.subject": "Your login code", + "login.email.password-reset.body": "Hi {user.nameOrEmail},\n\nYou recently requested a password reset code for the Panel of {site}.\nThe following password reset code will be valid for {timeout} minutes:\n\n{code}\n\nIf you did not request a password reset code, please ignore this email or contact your administrator if you have questions.\nFor security, please DO NOT forward this email.", + "login.email.password-reset.subject": "Your password reset code", + "login.remember": "مرا به خاطر بسپار", + "login.reset": "Reset password", + "login.toggleText.code.email": "Login via email", + "login.toggleText.code.email-password": "Login with password", + "login.toggleText.password-reset.email": "Forgot your password?", + "login.toggleText.password-reset.email-password": "← Back to login", + "login.totp.enable.option": "Set up one‑time codes", + "login.totp.enable.intro": "Authenticator apps can generate one‑time codes that are used as a second factor when signing into your account.", + "login.totp.enable.qr.label": "1. Scan this QR code", + "login.totp.enable.qr.help": "Unable to scan? Add the setup key {secret} manually to your authenticator app.", + "login.totp.enable.confirm.headline": "2. Confirm with generated code", + "login.totp.enable.confirm.text": "Your app generates a new one‑time code every 30 seconds. Enter the current code to complete the setup:", + "login.totp.enable.confirm.label": "Current code", + "login.totp.enable.confirm.help": "After this setup, we will ask you for a one‑time code every time you log in.", + "login.totp.enable.success": "One‑time codes enabled", + "login.totp.disable.option": "Disable one‑time codes", + "login.totp.disable.label": "Enter your password to disable one‑time codes", + "login.totp.disable.help": "In the future, a different second factor like a login code sent via email will be requested when you log in. You can always set up one‑time codes again later.", + "login.totp.disable.admin": "

This will disable one‑time codes for {user}.

In the future, a different second factor like a login code sent via email will be requested when they log in. {user} can set up one‑time codes again after their next login.

", + "login.totp.disable.success": "One‑time codes disabled", + + "logout": "خروج", + + "merge": "Merge", + "menu": "منو", + "meridiem": "ق.ظ/ب.ظ", + "mime": "نوع رسانه", + "minutes": "دقیقه", + + "month": "ماه", + "months.april": "\u0622\u0648\u0631\u06cc\u0644", + "months.august": "\u0627\u0648\u062a", + "months.december": "\u062f\u0633\u0627\u0645\u0628\u0631", + "months.february": "فوریه", + "months.january": "\u0698\u0627\u0646\u0648\u06cc\u0647", + "months.july": "\u0698\u0648\u0626\u06cc\u0647", + "months.june": "\u0698\u0648\u0626\u0646", + "months.march": "\u0645\u0627\u0631\u0633", + "months.may": "\u0645\u06cc", + "months.november": "\u0646\u0648\u0627\u0645\u0628\u0631", + "months.october": "\u0627\u06a9\u062a\u0628\u0631", + "months.september": "\u0633\u067e\u062a\u0627\u0645\u0628\u0631", + + "more": "بیشتر", + "move": "Move", + "name": "نام", + "next": "بعدی", + "night": "Night", + "no": "no", + "off": "off", + "on": "on", + "open": "بازکردن", + "open.newWindow": "Open in new window", + "option": "Option", + "options": "گزینه‌ها", + "options.none": "No options", + "options.all": "Show all {count} options", + + "orientation": "جهت", + "orientation.landscape": "افقی", + "orientation.portrait": "عمودی", + "orientation.square": "مربع", + + "page": "صفحه", + "page.blueprint": "This page has no blueprint yet. You can define the setup in /site/blueprints/pages/{blueprint}.yml", + "page.changeSlug": "تغییر Url صفحه", + "page.changeSlug.fromTitle": "\u0627\u06cc\u062c\u0627\u062f \u0627\u0632 \u0631\u0648\u06cc \u0639\u0646\u0648\u0627\u0646", + "page.changeStatus": "تغییر وضعیت", + "page.changeStatus.position": "لطفا یک موقعیت را انتخاب کنید", + "page.changeStatus.select": "یک وضعیت جدید را انتخاب کنید", + "page.changeTemplate": "تغییر قالب", + "page.changeTemplate.notice": "Changing the page's template will remove content for fields that don't match in type. Use with caution.", + "page.create": "Create as {status}", + "page.delete.confirm": "صفحه {title} حذف شود؟", + "page.delete.confirm.subpages": "این صفحه دارای زیرصفحه است.
تمام زیر صفحات نیز حذف خواهد شد.", + "page.delete.confirm.title": "جهت ادامه عنوان صفحه را وارد کنید", + "page.duplicate.appendix": "کپی", + "page.duplicate.files": "Copy files", + "page.duplicate.pages": "Copy pages", + "page.move": "Move page", + "page.sort": "Change position", + "page.status": "وضعیت", + "page.status.draft": "پیش‌نویس", + "page.status.draft.description": "The page is in draft mode and only visible for logged in editors or via secret link", + "page.status.listed": "عمومی", + "page.status.listed.description": "این صفحه برای عموم قابل مشاهده است", + "page.status.unlisted": "فهرست نشده", + "page.status.unlisted.description": "این صفحه فقط از طریق URL قابل دسترسی است", + + "pages": "صفحات", + "pages.empty": "هنوز هیچ صفحه‌ای موجود نیست", + "pages.status.draft": "پیش‌نویس‌ها", + "pages.status.listed": "منتشر شده", + "pages.status.unlisted": "فهرست نشده", + + "pagination.page": "صفحه", + + "password": "\u06af\u0630\u0631\u0648\u0627\u0698\u0647", + "paste": "Paste", + "paste.after": "Paste after", + "paste.success": "{count} pasted!", + "pixel": "پیکسل", + "plugin": "Plugin", + "plugins": "Plugins", + "prev": "قبلی", + "preview": "Preview", + "remove": "حذف", + "rename": "تغییر نام", + "renew": "Renew", + "replace": "\u062c\u0627\u06cc\u06af\u0632\u06cc\u0646\u06cc", + "replace.with": "Replace with", + "retry": "\u062a\u0644\u0627\u0634 \u0645\u062c\u062f\u062f", + "revert": "بازگرداندن تغییرات", + "revert.confirm": "Do you really want to delete all unsaved changes?", + + "role": "\u0646\u0642\u0634", + "role.admin.description": "The admin has all rights", + "role.admin.title": "Admin", + "role.all": "همه", + "role.empty": "هیچ کاربری با این نقش وجود ندارد", + "role.description.placeholder": "فاقد شرح", + "role.nobody.description": "This is a fallback role without any permissions", + "role.nobody.title": "Nobody", + + "save": "\u0630\u062e\u06cc\u0631\u0647", + "search": "جستجو", + "search.min": "Enter {min} characters to search", + "search.all": "Show all {count} results", + "search.results.none": "No results", + + "section.invalid": "The section is invalid", + "section.required": "The section is required", + + "security": "Security", + "select": "انتخاب", + "server": "Server", + "settings": "تنظیمات", + "show": "Show", + "site.blueprint": "The site has no blueprint yet. You can define the setup in /site/blueprints/site.yml", + "size": "اندازه", + "slug": "پسوند Url", + "sort": "ترتیب", + "sort.drag": "Drag to sort …", + "split": "Split", + + "stats.empty": "No reports", + "status": "وضعیت", + + "system.info.copy": "Copy info", + "system.info.copied": "System info copied", + "system.issues.content": "The content folder seems to be exposed", + "system.issues.eol.kirby": "Your installed Kirby version has reached end-of-life and will not receive further security updates", + "system.issues.eol.plugin": "Your installed version of the { plugin } plugin is has reached end-of-life and will not receive further security updates", + "system.issues.eol.php": "Your installed PHP release { release } has reached end-of-life and will not receive further security updates", + "system.issues.debug": "Debugging must be turned off in production", + "system.issues.git": "The .git folder seems to be exposed", + "system.issues.https": "We recommend HTTPS for all your sites", + "system.issues.kirby": "The kirby folder seems to be exposed", + "system.issues.site": "The site folder seems to be exposed", + "system.issues.vulnerability.kirby": "Your installation might be affected by the following vulnerability ({ severity } severity): { description }", + "system.issues.vulnerability.plugin": "Your installation might be affected by the following vulnerability in the { plugin } plugin ({ severity } severity): { description }", + "system.updateStatus": "Update status", + "system.updateStatus.error": "Could not check for updates", + "system.updateStatus.not-vulnerable": "No known vulnerabilities", + "system.updateStatus.security-update": "Free security update { version } available", + "system.updateStatus.security-upgrade": "Upgrade { version } with security fixes available", + "system.updateStatus.unreleased": "Unreleased version", + "system.updateStatus.up-to-date": "Up to date", + "system.updateStatus.update": "Free update { version } available", + "system.updateStatus.upgrade": "Upgrade { version } available", + + "tel": "Phone", + "tel.placeholder": "+49123456789", + "template": "\u0642\u0627\u0644\u0628 \u0635\u0641\u062d\u0647", + "title": "عنوان", + "today": "امروز", + + "toolbar.button.clear": "Clear formatting", + "toolbar.button.code": "کد", + "toolbar.button.bold": "\u0645\u062a\u0646 \u0628\u0627 \u062d\u0631\u0648\u0641 \u062f\u0631\u0634\u062a", + "toolbar.button.email": "\u067e\u0633\u062a \u0627\u0644\u06a9\u062a\u0631\u0648\u0646\u06cc\u06a9", + "toolbar.button.headings": "عنوان‌ها", + "toolbar.button.heading.1": "عنوان 1", + "toolbar.button.heading.2": "عنوان 2", + "toolbar.button.heading.3": "عنوان 3", + "toolbar.button.heading.4": "Heading 4", + "toolbar.button.heading.5": "Heading 5", + "toolbar.button.heading.6": "Heading 6", + "toolbar.button.italic": "\u0645\u062a\u0646 \u0627\u0631\u06cc\u0628", + "toolbar.button.file": "فایل", + "toolbar.button.file.select": "Select a file", + "toolbar.button.file.upload": "Upload a file", + "toolbar.button.link": "\u067e\u06cc\u0648\u0646\u062f", + "toolbar.button.paragraph": "Paragraph", + "toolbar.button.strike": "Strike-through", + "toolbar.button.sub": "Subscript", + "toolbar.button.sup": "Superscript", + "toolbar.button.ol": "لیست مرتب", + "toolbar.button.underline": "Underline", + "toolbar.button.ul": "لیست معمولی", + + "translation.author": "تیم کربی", + "translation.direction": "rtl", + "translation.name": "انگلیسی", + "translation.locale": "fa_IR", + + "type": "Type", + + "upload": "بارگذاری", + "upload.error.cantMove": "The uploaded file could not be moved", + "upload.error.cantWrite": "Failed to write file to disk", + "upload.error.default": "The file could not be uploaded", + "upload.error.extension": "File upload stopped by extension", + "upload.error.formSize": "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the form", + "upload.error.iniPostSize": "The uploaded file exceeds the post_max_size directive in php.ini", + "upload.error.iniSize": "The uploaded file exceeds the upload_max_filesize directive in php.ini", + "upload.error.noFile": "No file was uploaded", + "upload.error.noFiles": "No files were uploaded", + "upload.error.partial": "The uploaded file was only partially uploaded", + "upload.error.tmpDir": "Missing a temporary folder", + "upload.errors": "خطا", + "upload.progress": "در حال بارگذاری...", + + "url": "Url", + "url.placeholder": "https://example.com", + + "user": "کاربر", + "user.blueprint": "You can define additional sections and form fields for this user role in /site/blueprints/users/{blueprint}.yml", + "user.changeEmail": "تغییر ایمیل", + "user.changeLanguage": "تغییر زبان", + "user.changeName": "تغییر نام این کاربر", + "user.changePassword": "تغییر گذرواژه", + "user.changePassword.new": "گذرواژه جدید", + "user.changePassword.new.confirm": "تایید گذرواژه جدید...", + "user.changeRole": "تغییر نقش", + "user.changeRole.select": "یک نقش جدید را انتخاب کنید", + "user.create": "افزودن کاربر جدید", + "user.delete": "حذف کاربر جاری", + "user.delete.confirm": "آیا واقعا میخواهید {email} را حذف کنید؟", + + "users": "کاربران", + + "version": "\u0646\u0633\u062e\u0647 \u0646\u0631\u0645 \u0627\u0641\u0632\u0627\u0631", + "version.current": "Current version", + "version.latest": "Latest version", + "versionInformation": "Version information", + + "view.account": "حساب کاربری شما", + "view.installation": "\u0646\u0635\u0628 \u0648 \u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc", + "view.languages": "زبان‌ها", + "view.resetPassword": "Reset password", + "view.site": "سایت", + "view.system": "System", + "view.users": "\u06a9\u0627\u0631\u0628\u0631\u0627\u0646", + + "welcome": "خوش آمدید", + "year": "سال", + "yes": "yes" +} diff --git a/kirby/i18n/translations/fi.json b/kirby/i18n/translations/fi.json new file mode 100644 index 0000000..13c1c39 --- /dev/null +++ b/kirby/i18n/translations/fi.json @@ -0,0 +1,730 @@ +{ + "account.changeName": "Muuta nimesi", + "account.delete": "Poista tilisi", + "account.delete.confirm": "Haluatko varmasti poistaa tilisi? Sinut kirjataan ulos välittömästi, eikä tiliäsi voi palauttaa.", + + "activate": "Activate", + "add": "Lis\u00e4\u00e4", + "alpha": "Alpha", + "author": "Tekijä", + "avatar": "Profiilikuva", + "back": "Takaisin", + "cancel": "Peruuta", + "change": "Muuta", + "close": "Sulje", + "changes": "Changes", + "confirm": "Ok", + "collapse": "Pienennä", + "collapse.all": "Pienennä kaikki", + "color": "Color", + "coordinates": "Coordinates", + "copy": "Kopioi", + "copy.all": "Kopioi kaikki", + "copy.success": "{count} copied!", + "create": "Luo", + "custom": "Custom", + + "date": "Päivämäärä", + "date.select": "Valitse päivämäärä", + + "day": "Päivä", + "days.fri": "Pe", + "days.mon": "Ma", + "days.sat": "La", + "days.sun": "Su", + "days.thu": "To", + "days.tue": "Ti", + "days.wed": "Ke", + + "debugging": "Virheenkäsittelytila", + + "delete": "Poista", + "delete.all": "Poista kaikki", + + "dialog.fields.empty": "This dialog has no fields", + "dialog.files.empty": "Ei valittavissa olevia tiedostoja", + "dialog.pages.empty": "Ei valittavissa olevia sivuja", + "dialog.text.empty": "This dialog does not define any text", + "dialog.users.empty": "Ei valittavissa olevia käyttäjiä", + + "dimensions": "Mitat", + "disable": "Disable", + "disabled": "Pois käytöstä", + "discard": "Hylkää", + + "drawer.fields.empty": "This drawer has no fields", + + "domain": "Domain", + "download": "Lataa", + "duplicate": "Kahdenna", + + "edit": "Muokkaa", + + "email": "S\u00e4hk\u00f6posti", + "email.placeholder": "nimi@osoite.fi", + + "enter": "Enter", + "entries": "Entries", + "entry": "Entry", + + "environment": "Ympäristö", + + "error": "Error", + "error.access.code": "Väärä koodi", + "error.access.login": "Kirjautumistiedot eivät kelpaa", + "error.access.panel": "Sinulla ei ole oikeutta käyttää paneelia", + "error.access.view": "Sinulla ei ole oikeutta käyttää tätä osaa paneelista", + + "error.avatar.create.fail": "Profiilikuvaa ei voitu lähettää", + "error.avatar.delete.fail": "Profiilikuvaa ei voitu poistaa", + "error.avatar.dimensions.invalid": "Profiilikuvan leveys ja korkeus voivat olla enintään 3000 pikseliä", + "error.avatar.mime.forbidden": "Profiilikuvan täytyy olla joko JPEG- tai PNG-formaatissa", + + "error.blueprint.notFound": "Suunnitelmaa \"{name}\" ei voitu ladata", + + "error.blocks.max.plural": "Voit lisätä enintään {max} lohkoa", + "error.blocks.max.singular": "Voit lisätä enintään yhden lohkon", + "error.blocks.min.plural": "Lisää vähintään {min} lohkoa", + "error.blocks.min.singular": "Lisää vähintään yksi lohko", + "error.blocks.validation": "There's an error on the \"{field}\" field in block {index} using the \"{fieldset}\" block type", + + "error.cache.type.invalid": "Invalid cache type \"{type}\"", + + "error.email.preset.notFound": "Nimellä \"{name}\" ja kyseisellä verkkotunnuksella ei löydy sähköpostiosoitetta", + + "error.field.converter.invalid": "Muunnin \"{converter}\" ei kelpaa", + "error.field.type.missing": "Field \"{ name }\": The field type \"{ type }\" does not exist", + + "error.file.changeName.empty": "Nimi ei voi olla tyhjä", + "error.file.changeName.permission": "Sinulla ei ole oikeutta muuttaa tiedoston \"{filename}\" nimeä", + "error.file.changeTemplate.invalid": "The template for the file \"{id}\" cannot be changed to \"{template}\" (valid: \"{blueprints}\")", + "error.file.changeTemplate.permission": "You are not allowed to change the template for the file \"{id}\"", + + "error.file.duplicate": "Tiedosto nimeltä \"{filename}\" on jo olemassa", + "error.file.extension.forbidden": "Tiedostopääte \"{extension}\" ei ole sallittu", + "error.file.extension.invalid": "Pääte {extension} ei kelpaa", + "error.file.extension.missing": "Tiedoston \"{filename}\" tiedostopääte puuttuu", + "error.file.maxheight": "Kuvan korkeus ei voi ylittää {height} pikseliä", + "error.file.maxsize": "Tiedosto on liian suuri", + "error.file.maxwidth": "Kuvan leveys ei voi ylittää {width} pikseliä", + "error.file.mime.differs": "Lähetetyllä tiedostolla täytyy olla sama mime-tyyppi \"{mime}\"", + "error.file.mime.forbidden": "Median tyyppi \"{mime}\" ei ole sallittu", + "error.file.mime.invalid": "Mime-tyyppi {mime} ei kelpaa", + "error.file.mime.missing": "Tiedoston \"{filename}\" mediatyyppiä ei voida tunnistaa", + "error.file.minheight": "Kuvan korkeus täytyy olla vähintään {height} pikseliä", + "error.file.minsize": "Tiedosto on liian pieni", + "error.file.minwidth": "Kuvan leveys täytyy olla vähintään {width} pikseliä", + "error.file.name.unique": "The filename must be unique", + "error.file.name.missing": "Tiedostonimi ei voi olla tyhjä", + "error.file.notFound": "Tiedostoa \"{filename}\" ei löytynyt", + "error.file.orientation": "Kuvan suuntaus täytyy olla \"{orientation}\"", + "error.file.type.forbidden": "Sinulla ei ole oikeutta lähettää tiedostoja joiden tyyppi on {type}", + "error.file.type.invalid": "Tiedostotyyppi {type} ei kelpaa", + "error.file.undefined": "Tiedostoa ei l\u00f6ytynyt", + + "error.form.incomplete": "Korjaa kaikki lomakkeen virheet…", + "error.form.notSaved": "Lomaketta ei voitu tallentaa", + + "error.language.code": "Anna kielen lyhenne", + "error.language.duplicate": "Kieli on jo olemassa", + "error.language.name": "Anna kielen nimi", + "error.language.notFound": "Kieltä ei löytynyt", + + "error.layout.validation.block": "There's an error on the \"{field}\" field in block {blockIndex} using the \"{fieldset}\" block type in layout {layoutIndex}", + "error.layout.validation.settings": "Virhe asetelman {index} asetuksissa", + + "error.license.domain": "The domain for the license is missing", + "error.license.email": "Anna sähköpostiosoite", + "error.license.format": "Please enter a valid license code", + "error.license.verification": "Lisenssiä ei voitu vahvistaa", + + "error.login.totp.confirm.invalid": "Väärä koodi", + "error.login.totp.confirm.missing": "Please enter the current code", + + "error.object.validation": "There’s an error in the \"{label}\" field:\n{message}", + + "error.offline": "Paneeli on offline-tilassa", + + "error.page.changeSlug.permission": "Sinulla ei ole oikeutta muuttaa URL-liitettä sivulle \"{slug}\"", + "error.page.changeSlug.reserved": "The path of top-level pages must not start with \"{path}\"", + "error.page.changeStatus.incomplete": "Sivulla on virheitä eikä sitä voitu julkaista", + "error.page.changeStatus.permission": "Tämän sivun tilaa ei voi muuttaa", + "error.page.changeStatus.toDraft.invalid": "Sivua \"{slug}\" ei voi muuttaa luonnokseksi", + "error.page.changeTemplate.invalid": "Sivun \"{slug}\" pohjaa ei voi muuttaa", + "error.page.changeTemplate.permission": "Sinulla ei ole oikeutta muuttaa sivun \"{slug}\" sivupohjaa", + "error.page.changeTitle.empty": "Nimi ei voi olla tyhjä", + "error.page.changeTitle.permission": "Sinulla ei ole oikeutta muuttaa sivun \"{slug}\" nimeä", + "error.page.create.permission": "Sinulla ei ole oikeutta luoda sivua \"{slug}\"", + "error.page.delete": "Sivua \"{slug}\" ei voi poistaa", + "error.page.delete.confirm": "Anna vahvistuksena sivun nimi", + "error.page.delete.hasChildren": "Sivu sisältää alasivuja eikä sitä voida poistaa", + "error.page.delete.permission": "Sinulla ei ole oikeutta poistaa sivua \"{slug}\"", + "error.page.draft.duplicate": "Sivuluonnos URL-liitteellä \"{slug}\" on jo olemassa", + "error.page.duplicate": "Sivu URL-liitteellä \"{slug}\" on jo olemassa", + "error.page.duplicate.permission": "Sinulla ei ole oikeutta kahdentaa sivua \"{slug}\"", + "error.page.move.ancestor": "The page cannot be moved into itself", + "error.page.move.directory": "The page directory cannot be moved", + "error.page.move.duplicate": "A sub page with the URL appendix \"{slug}\" already exists", + "error.page.move.notFound": "The moved page could not be found", + "error.page.move.permission": "You are not allowed to move \"{slug}\"", + "error.page.move.template": "The \"{template}\" template is not accepted as a subpage of \"{parent}\"", + "error.page.notFound": "Sivua \"{slug}\" ei löytynyt", + "error.page.num.invalid": "Anna kelpaava järjestysnumero. Numero ei voi olla negatiivinen.", + "error.page.slug.invalid": "Anna kelpaava URL-liite", + "error.page.slug.maxlength": "URL-liite täytyy olla vähemmän kuin \"{length}\" merkkiä pitkä", + "error.page.sort.permission": "Sivua \"{slug}\" ei voi järjestellä", + "error.page.status.invalid": "Aseta kelvollinen sivun tila", + "error.page.undefined": "Sivua ei l\u00f6ytynyt", + "error.page.update.permission": "Sinulla ei ole oikeutta päivittää sivua \"{slug}\"", + + "error.section.files.max.plural": "Et voi lisätä enemmän kuin {max} tiedostoa osioon \"{section}\"", + "error.section.files.max.singular": "Et voi lisätä enempää kuin yhden tiedoston osioon \"{section}\"", + "error.section.files.min.plural": "Osio \"{section}\" vaatii ainakin {min} tiedostoa", + "error.section.files.min.singular": "Osio \"{section}\" vaatii ainakin yhden sivun", + + "error.section.pages.max.plural": "Et voi lisätä enemmän kuin {max} sivua osioon \"{section}\"", + "error.section.pages.max.singular": "Et voi lisätä enempää kuin yhden sivun osioon \"{section}\"", + "error.section.pages.min.plural": "Osio \"{section}\" vaatii ainakin {min} sivua", + "error.section.pages.min.singular": "Osio \"{section}\" vaatii ainakin yhden sivun", + + "error.section.notLoaded": "Osiota \"{name}\" ei voitu ladata", + "error.section.type.invalid": "Osion tyyppi \"{type}\" ei ole kelvollinen", + + "error.site.changeTitle.empty": "Nimi ei voi olla tyhjä", + "error.site.changeTitle.permission": "Sinulla ei ole oikeutta päivittää sivuston nimeä", + "error.site.update.permission": "Sinulla ei ole oikeutta päivittää sivuston tietoja", + + "error.structure.validation": "There's an error on the \"{field}\" field in row {index}", + + "error.template.default.notFound": "Oletussivupohjaa ei ole määritetty", + + "error.unexpected": "Pahus, määrittelemätön virhe! Laita virheenkäsittelytila päälle saadaksesi lisätietoja: https://getkirby.com/docs/reference/system/options/debug", + + "error.user.changeEmail.permission": "Sinulla ei ole oikeutta vaihtaa käyttäjän \"{name}\" sähköpostiosoitetta", + "error.user.changeLanguage.permission": "Sinulla ei ole oikeutta vaihtaa käyttäjän \"{name}\" kieltä", + "error.user.changeName.permission": "Sinulla ei ole oikeutta vaihtaa käyttäjän \"{name}\" nimeä", + "error.user.changePassword.permission": "Sinulla ei ole oikeutta vaihtaa käyttäjän \"{name}\" salasanaa", + "error.user.changeRole.lastAdmin": "Ainoan pääkäyttäjän roolia ei voi muuttaa", + "error.user.changeRole.permission": "Sinulla ei ole oikeutta vaihtaa käyttäjän \"{name}\" käyttäjätasoa", + "error.user.changeRole.toAdmin": "Sinulla ei ole oikeutta vaihtaa käyttäjätasoa pääkäyttäjäksi", + "error.user.create.permission": "Sinulla ei ole oikeutta luoda tätä käyttäjää", + "error.user.delete": "Käyttäjää \"{name}\" ei voi poistaa", + "error.user.delete.lastAdmin": "Ainoaa pääkäyttäjää ei voi poistaa", + "error.user.delete.lastUser": "Ainoaa käyttäjää ei voi poistaa", + "error.user.delete.permission": "Sinulla ei ole oikeutta poistaa käyttäjää \"{name}\"", + "error.user.duplicate": "Käyttäjä, jonka sähköpostiosoite on \"{name}\", on jo olemassa", + "error.user.email.invalid": "Anna kelpaava sähköpostiosoite", + "error.user.language.invalid": "Anna kelpaava kieli", + "error.user.notFound": "K\u00e4ytt\u00e4j\u00e4\u00e4 ei l\u00f6ytynyt", + "error.user.password.excessive": "Please enter a valid password. Passwords must not be longer than 1000 characters.", + "error.user.password.invalid": "Anna kelpaava salasana. Salasanan täytyy olla ainakin 8 merkkiä pitkä.", + "error.user.password.notSame": "Salasanat eivät täsmää", + "error.user.password.undefined": "Käyttäjällä ei ole salasanaa", + "error.user.password.wrong": "Väärä salasana", + "error.user.role.invalid": "Anna kelpaava käyttäjätaso", + "error.user.undefined": "Käyttäjää ei löytynyt", + "error.user.update.permission": "Sinulla ei ole oikeutta päivittää käyttäjää \"{name}\"", + + "error.validation.accepted": "Ole hyvä ja vahvista", + "error.validation.alpha": "Anna vain merkkejä väliltä a-z", + "error.validation.alphanum": "Anna vain merkkejä väliltä a-z tai/ja numeroita väliltä 0-9", + "error.validation.anchor": "Please enter a correct link anchor", + "error.validation.between": "Anna arvo väliltä \"{min}\" ja \"{max}\"", + "error.validation.boolean": "Vahvista tai peruuta", + "error.validation.color": "Please enter a valid color in the {format} format", + "error.validation.contains": "Anna arvo joka sisältää \"{needle}\"", + "error.validation.date": "Anna kelpaava päivämäärä", + "error.validation.date.after": "Anna päivämäärä {date} jälkeen", + "error.validation.date.before": "Anna päivämäärä ennen {date}", + "error.validation.date.between": "Anna päivämäärä väliltä {min} ja {max}", + "error.validation.denied": "Ole hyvä ja peruuta", + "error.validation.different": "Arvo ei voi olla \"{other}\"", + "error.validation.email": "Anna kelpaava sähköpostiosoite", + "error.validation.endswith": "Arvon loppuosa täytyy olla \"{end}\"", + "error.validation.filename": "Anna kelpaava tiedostonimi", + "error.validation.in": "Anna joku seuraavista: ({in})", + "error.validation.integer": "Anna kelpaava kokonaisluku", + "error.validation.ip": "Anna kelpaava IP-osoite", + "error.validation.less": "Anna arvo joka on pienempi kuin {max}", + "error.validation.linkType": "The link type is not allowed", + "error.validation.match": "Arvo ei vastaa vaadittua kaavaa", + "error.validation.max": "Anna arvo joka on enintään {max}", + "error.validation.maxlength": "Anna lyhyempi arvo. (enintään {max} merkkiä)", + "error.validation.maxwords": "Anna korkeintaan {max} sana(a)", + "error.validation.min": "Anna arvo joka on vähintään {min}", + "error.validation.minlength": "Anna pidempi arvo. (vähintään {min} merkkiä)", + "error.validation.minwords": "Anna vähintään {min} sana(a)", + "error.validation.more": "Anna suurempi arvo kuin {min}", + "error.validation.notcontains": "Anna arvo joka ei sisällä \"{needle}\"", + "error.validation.notin": "Arvo ei voi sisältää mitään seuraavista: ({notIn})", + "error.validation.option": "Valitse kelpaava vaihtoehto", + "error.validation.num": "Anna kelpaava numero", + "error.validation.required": "Arvo ei voi olla tyhjä", + "error.validation.same": "Anna \"{other}\"", + "error.validation.size": "Arvon koko täytyy olla \"{size}\"", + "error.validation.startswith": "Arvon alkuosa täytyy olla \"{start}\"", + "error.validation.tel": "Please enter an unformatted phone number", + "error.validation.time": "Anna kelpaava aika", + "error.validation.time.after": "Anna myöhempi aika kuin {time}", + "error.validation.time.before": "Anna aiempi aika kuin {time}", + "error.validation.time.between": "Anna aika väliltä {min} ja {max}", + "error.validation.uuid": "Please enter a valid UUID", + "error.validation.url": "Anna kelpaava URL", + + "expand": "Laajenna", + "expand.all": "Laajenna kaikki", + + "field.invalid": "The field is invalid", + "field.required": "Kenttä on pakollinen", + "field.blocks.changeType": "Vaihda tyyppiä", + "field.blocks.code.name": "Koodi", + "field.blocks.code.language": "Kieli", + "field.blocks.code.placeholder": "Koodisi …", + "field.blocks.delete.confirm": "Haluatko varmasti poistaa tämän lohkon?", + "field.blocks.delete.confirm.all": "Haluatko varmasti poistaa kaikki lohkot?", + "field.blocks.delete.confirm.selected": "Haluatko varmasti poistaa valitut lohkot?", + "field.blocks.empty": "Ei lohkoja", + "field.blocks.fieldsets.empty": "No fieldsets yet", + "field.blocks.fieldsets.label": "Valitse lohkon tyyppi …", + "field.blocks.fieldsets.paste": "Press {{ shortcut }} to import layouts/blocks from your clipboard Only those allowed in the current field will get inserted.", + "field.blocks.gallery.name": "Galleria", + "field.blocks.gallery.images.empty": "Ei kuvia", + "field.blocks.gallery.images.label": "Kuvat", + "field.blocks.heading.level": "Taso", + "field.blocks.heading.name": "Otsikko", + "field.blocks.heading.text": "Teksti", + "field.blocks.heading.placeholder": "Otsikko …", + "field.blocks.image.alt": "Vaihtoehtoinen teksti", + "field.blocks.image.caption": "Kuvateksti", + "field.blocks.image.crop": "Rajaa", + "field.blocks.image.link": "Linkki", + "field.blocks.image.location": "Sijainti", + "field.blocks.image.location.internal": "This website", + "field.blocks.image.location.external": "External source", + "field.blocks.image.name": "Kuva", + "field.blocks.image.placeholder": "Valitse kuva", + "field.blocks.image.ratio": "Kuvasuhde", + "field.blocks.image.url": "Kuvan URL", + "field.blocks.line.name": "Rivi", + "field.blocks.list.name": "Lista", + "field.blocks.markdown.name": "Markdown", + "field.blocks.markdown.label": "Teksti", + "field.blocks.markdown.placeholder": "Markdown …", + "field.blocks.quote.name": "Lainaus", + "field.blocks.quote.text.label": "Teksti", + "field.blocks.quote.text.placeholder": "Lainaus …", + "field.blocks.quote.citation.label": "Sitaatti", + "field.blocks.quote.citation.placeholder": "Lähde …", + "field.blocks.text.name": "Teksti", + "field.blocks.text.placeholder": "Teksti …", + "field.blocks.video.autoplay": "Autoplay", + "field.blocks.video.caption": "Videon teksti", + "field.blocks.video.controls": "Controls", + "field.blocks.video.location": "Sijainti", + "field.blocks.video.loop": "Loop", + "field.blocks.video.muted": "Muted", + "field.blocks.video.name": "Video", + "field.blocks.video.placeholder": "Anna videon URL", + "field.blocks.video.poster": "Poster", + "field.blocks.video.preload": "Preload", + "field.blocks.video.url.label": "Videon URL", + "field.blocks.video.url.placeholder": "https://youtube.com/?v=", + + "field.files.empty": "Tiedostoja ei ole vielä valittu", + + "field.layout.change": "Change layout", + "field.layout.delete": "Poista asettelu", + "field.layout.delete.confirm": "Halutako varmasti poistaa tämän asettelun?", + "field.layout.delete.confirm.all": "Do you really want to delete all layouts?", + "field.layout.empty": "Ei rivejä", + "field.layout.select": "Valitse asettelu", + + "field.object.empty": "Ei vielä tietoja", + + "field.pages.empty": " Sivuja ei ole vielä valittu", + + "field.structure.delete.confirm": "Haluatko varmasti poistaa tämän rivin?", + "field.structure.delete.confirm.all": "Do you really want to delete all entries?", + "field.structure.empty": "Rivejä ei ole vielä lisätty", + + "field.users.empty": "Käyttäjiä ei ole vielä valittu", + + "fields.empty": "No fields yet", + + "file": "File", + "file.blueprint": "Tällä tiedostolla ei ole vielä suunnitelmaa. Voit määrittää suunnitelman tiedostoon /site/blueprints/files/{blueprint}.yml", + "file.changeTemplate": "Vaihda sivupohja", + "file.changeTemplate.notice": "Changing the file's template will remove content for fields that don't match in type. If the new template defines certain rules, e.g. image dimensions, those will also be applied irreversibly. Use with caution.", + "file.delete.confirm": "Haluatko varmasti poistaa tiedoston
{filename}?", + "file.focus.placeholder": "Set focal point", + "file.focus.reset": "Remove focal point", + "file.focus.title": "Focus", + "file.sort": "Muuta järjestyspaikkaa", + + "files": "Tiedostot", + "files.empty": "Tiedostoja ei ole vielä lisätty", + + "filter": "Filter", + + "hide": "Piilota", + "hour": "Tunti", + "hue": "Hue", + "import": "Tuo", + "info": "Tietoja", + "insert": "Lis\u00e4\u00e4", + "insert.after": "Lisää eteen", + "insert.before": "Lisää jälkeen", + "install": "Asenna", + + "installation": "Asennus", + "installation.completed": "Paneeli on asennettu", + "installation.disabled": "Paneelin asennus on oletuksena poissa käytöstä julkisilla palvelimilla. Aja asennus paikallisella koneella, tai ota paneeli käyttöön panel.install-optiolla.", + "installation.issues.accounts": "/site/accounts -kansio ei ole olemassa tai siihen ei voi kirjoittaa", + "installation.issues.content": "/content -kansio ei ole olemassa tai siihen ei voi kirjoittaa", + "installation.issues.curl": "CURL-laajennos on pakollinen", + "installation.issues.headline": "Paneelia ei voida asentaa", + "installation.issues.mbstring": "MB String-laajennos on pakollinen", + "installation.issues.media": "/media -kansio ei ole olemassa tai siihen ei voi kirjoittaa", + "installation.issues.php": "Varmista että PHP 8+ on käytössä", + "installation.issues.sessions": "/site/sessions -kansio ei ole olemassa tai siihen ei voi kirjoittaa", + + "language": "Kieli", + "language.code": "Tunniste", + "language.convert": "Muuta oletukseksi", + "language.convert.confirm": "

Haluatko varmasti muuttaa kielen {name} oletuskieleksi? Tätä muutosta ei voi peruuttaa.

Jos{name} sisältää kääntämättömiä kohtia, varakäännöstä ei enää ole näille kohdille ja sivustosi saattaa olla osittain tyhjä.

", + "language.create": "Lisää uusi kieli", + "language.default": "Oletuskieli", + "language.delete.confirm": "Haluatko varmasti poistaa kielen {name}, mukaanlukien kaikki käännökset? Tätä toimintoa ei voi peruuttaa!", + "language.deleted": "Kieli on poistettu", + "language.direction": "Lukusuunta", + "language.direction.ltr": "Vasemmalta oikealle", + "language.direction.rtl": "Oikealta vasemmalle", + "language.locale": "PHP-aluemäärityksen tunniste", + "language.locale.warning": "Käytät mukautettua aluemääritystä. Muokkaa sitä kielitiedostossa /site/languages", + "language.name": "Nimi", + "language.secondary": "Secondary language", + "language.settings": "Language settings", + "language.updated": "Kieli on päivitetty", + "language.variables": "Language variables", + "language.variables.empty": "No translations yet", + + "language.variable.delete.confirm": "Do you really want to delete the variable for {key}?", + "language.variable.key": "Key", + "language.variable.notFound": "The variable could not be found", + "language.variable.value": "Value", + + "languages": "Kielet", + "languages.default": "Oletuskieli", + "languages.empty": "Kieliä ei ole vielä määritetty", + "languages.secondary": "Toissijaiset kielet", + "languages.secondary.empty": "Toissijaisia kieliä ei ole vielä määritetty", + + "license": "Lisenssi", + "license.activate": "Activate it now", + "license.activate.label": "Please activate your license", + "license.activate.domain": "Your license will be activated for {host}.", + "license.activate.local": "You are about to activate your Kirby license for your local domain {host}. If this site will be deployed to a public domain, please activate it there instead. If {host} is the domain you want to use your license for, please continue.", + "license.activated": "Activated", + "license.buy": "Osta lisenssi", + "license.code": "Tunniste", + "license.code.help": "You received your license code after the purchase via email. Please copy and paste it here.", + "license.code.label": "Anna lisenssiavain", + "license.status.active.info": "Includes new major versions until {date}", + "license.status.active.label": "Valid license", + "license.status.demo.info": "This is a demo installation", + "license.status.demo.label": "Demo", + "license.status.inactive.info": "Renew license to update to new major versions", + "license.status.inactive.label": "No new major versions", + "license.status.legacy.bubble": "Ready to renew your license?", + "license.status.legacy.info": "Your license does not cover this version", + "license.status.legacy.label": "Please renew your license", + "license.status.missing.bubble": "Ready to launch your site?", + "license.status.missing.info": "No valid license", + "license.status.missing.label": "Please activate your license", + "license.manage": "Hallinnoi lisenssejäsi", + "license.purchased": "Purchased", + "license.success": "Kiitos kun tuet Kirbyä", + "license.unregistered.label": "Rekisteröimätön", + + "link": "Linkki", + "link.text": "Linkin teksti", + + "loading": "Ladataan", + + "lock.unsaved": "Tallentamattomia muutoksia", + "lock.unsaved.empty": "Ei enempää tallentamattomia muutoksia ", + "lock.isLocked": "Unsaved changes by {email}", + "lock.unlock": "Vapauta", + "lock.unlock.submit": "Unlock and overwrite unsaved changes by {email}", + "lock.isUnlocked": "Was unlocked by another user", + + "login": "Kirjaudu", + "login.code.label.login": "Kirjautumiskoodi", + "login.code.label.password-reset": "Salasanan asetuskoodi", + "login.code.placeholder.email": "000 000", + "login.code.placeholder.totp": "000000", + "login.code.text.email": "Jos sähköpostiosoitteesi on rekisteröity, tilaamasi koodi lähetetään tähän osoitteeseen.", + "login.code.text.totp": "Please enter the one‑time code from your authenticator app.", + "login.email.login.body": "Hi {user.nameOrEmail},\n\nYou recently requested a login code for the Panel of {site}.\nThe following login code will be valid for {timeout} minutes:\n\n{code}\n\nIf you did not request a login code, please ignore this email or contact your administrator if you have questions.\nFor security, please DO NOT forward this email.", + "login.email.login.subject": "Kirjautumiskoodisi", + "login.email.password-reset.body": "Hi {user.nameOrEmail},\n\nYou recently requested a password reset code for the Panel of {site}.\nThe following password reset code will be valid for {timeout} minutes:\n\n{code}\n\nIf you did not request a password reset code, please ignore this email or contact your administrator if you have questions.\nFor security, please DO NOT forward this email.", + "login.email.password-reset.subject": "Salasanan asetuskoodisi", + "login.remember": "Pidä minut kirjautuneena", + "login.reset": "Aseta salasana", + "login.toggleText.code.email": "Kirjaudu sähköpostiosoitteella", + "login.toggleText.code.email-password": "Kirjaudu salasanalla", + "login.toggleText.password-reset.email": "Unohditko salasanasi?", + "login.toggleText.password-reset.email-password": "← Takaisin kirjautumiseen", + "login.totp.enable.option": "Set up one‑time codes", + "login.totp.enable.intro": "Authenticator apps can generate one‑time codes that are used as a second factor when signing into your account.", + "login.totp.enable.qr.label": "1. Scan this QR code", + "login.totp.enable.qr.help": "Unable to scan? Add the setup key {secret} manually to your authenticator app.", + "login.totp.enable.confirm.headline": "2. Confirm with generated code", + "login.totp.enable.confirm.text": "Your app generates a new one‑time code every 30 seconds. Enter the current code to complete the setup:", + "login.totp.enable.confirm.label": "Current code", + "login.totp.enable.confirm.help": "After this setup, we will ask you for a one‑time code every time you log in.", + "login.totp.enable.success": "One‑time codes enabled", + "login.totp.disable.option": "Disable one‑time codes", + "login.totp.disable.label": "Enter your password to disable one‑time codes", + "login.totp.disable.help": "In the future, a different second factor like a login code sent via email will be requested when you log in. You can always set up one‑time codes again later.", + "login.totp.disable.admin": "

This will disable one‑time codes for {user}.

In the future, a different second factor like a login code sent via email will be requested when they log in. {user} can set up one‑time codes again after their next login.

", + "login.totp.disable.success": "One‑time codes disabled", + + "logout": "Kirjaudu ulos", + + "merge": "Merge", + "menu": "Valikko", + "meridiem": "am/pm", + "mime": "Median tyyppi", + "minutes": "Minuutit", + + "month": "Kuukausi", + "months.april": "Huhtikuu", + "months.august": "Elokuu", + "months.december": "Joulukuu", + "months.february": "Helmikuu", + "months.january": "Tammikuu", + "months.july": "Hein\u00e4kuu", + "months.june": "Kes\u00e4kuu", + "months.march": "Maaliskuu", + "months.may": "Toukokuu", + "months.november": "Marraskuu", + "months.october": "Lokakuu", + "months.september": "Syyskuu", + + "more": "Lisää", + "move": "Move", + "name": "Nimi", + "next": "Seuraava", + "night": "Night", + "no": "ei", + "off": "Pois käytöstä", + "on": "Käytössä", + "open": "Avaa", + "open.newWindow": "Avaa uudessa ikkunassa", + "option": "Option", + "options": "Asetukset", + "options.none": "Ei valintoja", + "options.all": "Show all {count} options", + + "orientation": "Suunta", + "orientation.landscape": "Vaakasuuntainen", + "orientation.portrait": "Pystysuuntainen", + "orientation.square": "Neliskulmainen", + + "page": "Page", + "page.blueprint": "Tällä sivulla ei ole vielä suunnitelmaa. Voit määrittää suunnitelman tiedostoon /site/blueprints/pages/{blueprint}.yml", + "page.changeSlug": "Vaihda URL-osoite", + "page.changeSlug.fromTitle": "Luo nimen perusteella", + "page.changeStatus": "Muuta tilaa", + "page.changeStatus.position": "Valitse järjestyspaikka", + "page.changeStatus.select": "Valitse uusi tila", + "page.changeTemplate": "Vaihda sivupohja", + "page.changeTemplate.notice": "Changing the page's template will remove content for fields that don't match in type. Use with caution.", + "page.create": "Create as {status}", + "page.delete.confirm": "Haluatko varmasti poistaa sivun {title}?", + "page.delete.confirm.subpages": "Tällä sivulla on alasivuja.
Myös kaikki alasivut poistetaan.", + "page.delete.confirm.title": "Anna vahvistuksena sivun nimi", + "page.duplicate.appendix": "Kopioi", + "page.duplicate.files": "Kopioi tiedostot", + "page.duplicate.pages": "Kopioi sivut", + "page.move": "Move page", + "page.sort": "Muuta järjestyspaikkaa", + "page.status": "Tila", + "page.status.draft": "Luonnos", + "page.status.draft.description": "Sivu on luonnostilassa ja näkyvissä vain kirjautuneille editoijille tai yksityisen linkin kautta", + "page.status.listed": "Julkinen", + "page.status.listed.description": "Sivu on julkinen kaikille", + "page.status.unlisted": "Listaamaton", + "page.status.unlisted.description": "Sivulle pääsee vain URL:n kautta", + + "pages": "Sivut", + "pages.empty": "Sivuja ei ole vielä lisätty", + "pages.status.draft": "Luonnokset", + "pages.status.listed": "Julkaistut", + "pages.status.unlisted": "Listaamaton", + + "pagination.page": "Sivu", + + "password": "Salasana", + "paste": "Liitä", + "paste.after": "Liitä jälkeen", + "paste.success": "{count} pasted!", + "pixel": "Pikseli", + "plugin": "Liitännäinen", + "plugins": "Liitännäiset", + "prev": "Edellinen", + "preview": "Esikatselu", + "remove": "Poista", + "rename": "Nimeä uudelleen", + "renew": "Renew", + "replace": "Korvaa", + "replace.with": "Replace with", + "retry": "Yrit\u00e4 uudelleen", + "revert": "Palauta", + "revert.confirm": "Haluatko varmasti poistaa kaikki tallentamattomat muutokset?", + + "role": "K\u00e4ytt\u00e4j\u00e4taso", + "role.admin.description": "Pääkäyttäjällä on kaikki oikeudet", + "role.admin.title": "Pääkäyttäjä", + "role.all": "Kaikki", + "role.empty": "Tällä käyttäjätasolla ei ole yhtään käyttäjää", + "role.description.placeholder": "Ei kuvausta", + "role.nobody.description": "Tämä on vararooli, jolla ei ole mitään oikeuksia", + "role.nobody.title": "Tuntematon", + + "save": "Tallenna", + "search": "Haku", + "search.min": "Anna vähintään {min} merkkiä hakua varten", + "search.all": "Show all {count} results", + "search.results.none": "Ei tuloksia", + + "section.invalid": "The section is invalid", + "section.required": "Osio on pakollinen", + + "security": "Tietoturva", + "select": "Valitse", + "server": "Palvelin", + "settings": "Asetukset", + "show": "Näytä", + "site.blueprint": "Tällä sivustolla ei ole vielä suunnitelmaa. Voit määrittää suunnitelman tiedostoon /site/blueprints/site.yml", + "size": "Koko", + "slug": "URL-tunniste", + "sort": "Järjestele", + "sort.drag": "Drag to sort …", + "split": "Split", + + "stats.empty": "Ei raportteja", + "status": "Tila", + + "system.info.copy": "Copy info", + "system.info.copied": "System info copied", + "system.issues.content": "Content-kansio näyttäisi olevan julkinen", + "system.issues.eol.kirby": "Your installed Kirby version has reached end-of-life and will not receive further security updates", + "system.issues.eol.plugin": "Your installed version of the { plugin } plugin is has reached end-of-life and will not receive further security updates", + "system.issues.eol.php": "Your installed PHP release { release } has reached end-of-life and will not receive further security updates", + "system.issues.debug": "Virheenkäsittelytila pitää poistaa käytöstä tuotantoympäristössä", + "system.issues.git": ".git-kansio näyttäisi olevan julkinen", + "system.issues.https": "Suosittelemme HTTPS:n käyttöä kaikilla sivustoillasi", + "system.issues.kirby": "Kirby-kansio näyttäisi olevan julkinen", + "system.issues.site": "Site-kansio näyttäisi olevan julkinen", + "system.issues.vulnerability.kirby": "Asennuksesi voi olla altis seuraaville haavoittuvuuksille ({ severity } vakavuus): { description }", + "system.issues.vulnerability.plugin": "Asennuksesi käyttämä liitännäinen { plugin } voi olla altis haavoittuvuudelle ({ severity } vakavuus): { description }", + "system.updateStatus": "Päivitysten tilanne", + "system.updateStatus.error": "Päivityksiä ei voitu tarkistaa", + "system.updateStatus.not-vulnerable": "Ei tunnettuja haavoittuvuuksia", + "system.updateStatus.security-update": "Ilmainen tietoturvapäivitys { version } saatavilla", + "system.updateStatus.security-upgrade": "Tietoturvakorjauksia sisältävä päivitys { version } saatavilla", + "system.updateStatus.unreleased": "Julkaisematon versio", + "system.updateStatus.up-to-date": "Ajan tasalla", + "system.updateStatus.update": "Ilmainen päivitys { version } saatavilla", + "system.updateStatus.upgrade": "Päivitys { version } saatavilla", + + "tel": "Phone", + "tel.placeholder": "+49123456789", + "template": "Sivupohja", + "title": "Nimi", + "today": "Tänään", + + "toolbar.button.clear": "Clear formatting", + "toolbar.button.code": "Koodi", + "toolbar.button.bold": "Lihavointi", + "toolbar.button.email": "S\u00e4hk\u00f6posti", + "toolbar.button.headings": "Otsikot", + "toolbar.button.heading.1": "Otsikko 1", + "toolbar.button.heading.2": "Otsikko 2", + "toolbar.button.heading.3": "Otsikko 3", + "toolbar.button.heading.4": "Otsikko 4", + "toolbar.button.heading.5": "Otsikko 5", + "toolbar.button.heading.6": "Otsikko 6", + "toolbar.button.italic": "Kursivointi", + "toolbar.button.file": "Tiedosto", + "toolbar.button.file.select": "Valitse tiedosto", + "toolbar.button.file.upload": "Lähetä tiedosto", + "toolbar.button.link": "Linkki", + "toolbar.button.paragraph": "Kappale", + "toolbar.button.strike": "Yliviivaus", + "toolbar.button.sub": "Subscript", + "toolbar.button.sup": "Superscript", + "toolbar.button.ol": "Järjestetty lista", + "toolbar.button.underline": "Alaviiva", + "toolbar.button.ul": "Järjestämätön lista", + + "translation.author": "Kirby-tiimi", + "translation.direction": "ltr", + "translation.name": "Suomi", + "translation.locale": "fi_FI", + + "type": "Type", + + "upload": "Lähetä", + "upload.error.cantMove": "Lähetettyä tiedostoa ei voitu siirtää", + "upload.error.cantWrite": "Tiedoston kirjoitus levylle epäonnistui", + "upload.error.default": "Tiedostoa ei voitu lähettää", + "upload.error.extension": "Tiedostoa ei lähetetty tiedostopäätteen takia", + "upload.error.formSize": "Lähetetyn tiedoston koko ylittää lomakkeen sallitun ylärajan MAX_FILE_SIZE", + "upload.error.iniPostSize": "Lähetetyn tiedoston koko ylittää sallitun ylärajan post_max_size asetustiedostossa php.ini", + "upload.error.iniSize": "Lähetetyn tiedoston koko ylittää sallitun ylärajan upload_max_filesize asetustiedostossa php.ini", + "upload.error.noFile": "Tiedostoa ei lähetetty", + "upload.error.noFiles": "Tiedostoja ei lähetetty", + "upload.error.partial": "Tiedoston lähetys onnistui vain osittain", + "upload.error.tmpDir": "Väliaikainen hakemisto puuttuu", + "upload.errors": "Virhe", + "upload.progress": "Lähetetään...", + + "url": "Url", + "url.placeholder": "https://esimerkki.fi", + + "user": "Käyttäjä", + "user.blueprint": "Voit määrittää lisää osioita ja lomakekenttiä tälle käyttäjälle suunnitelmassa /site/blueprints/users/{blueprint}.yml", + "user.changeEmail": "Muuta sähköpostiosoite", + "user.changeLanguage": "Vaihda kieli", + "user.changeName": "Nimeä uudelleen", + "user.changePassword": "Vaihda salasana", + "user.changePassword.new": "Uusi salasana", + "user.changePassword.new.confirm": "Vahvista uusi salasana...", + "user.changeRole": "Muuta käyttäjätasoa", + "user.changeRole.select": "Valitse uusi käyttäjätaso", + "user.create": "Lisää uusi käyttäjä", + "user.delete": "Poista tämä käyttäjä", + "user.delete.confirm": "Haluatko varmsti poistaa käyttäjän
{email}?", + + "users": "Käyttäjät", + + "version": "Versio", + "version.current": "Nykyinen versio ", + "version.latest": "Uusin versio ", + "versionInformation": "Version tiedot", + + "view.account": "Oma käyttäjätili", + "view.installation": "Asennus", + "view.languages": "Kielet", + "view.resetPassword": "Aseta salasana", + "view.site": "Sivusto", + "view.system": "Järjestelmä", + "view.users": "K\u00e4ytt\u00e4j\u00e4t", + + "welcome": "Tervetuloa", + "year": "Vuosi", + "yes": "kyllä" +} diff --git a/kirby/i18n/translations/fr.json b/kirby/i18n/translations/fr.json new file mode 100644 index 0000000..358ff06 --- /dev/null +++ b/kirby/i18n/translations/fr.json @@ -0,0 +1,730 @@ +{ + "account.changeName": "Modifier votre nom", + "account.delete": "Supprimer votre compte", + "account.delete.confirm": "Voulez-vous vraiment supprimer votre compte ? Vous serez déconnecté immédiatement. Votre compte ne pourra pas être récupéré.", + + "activate": "Activer", + "add": "Ajouter", + "alpha": "Alpha", + "author": "Auteur", + "avatar": "Image de profil", + "back": "Retour", + "cancel": "Annuler", + "change": "Changer", + "close": "Fermer", + "changes": "Modifications", + "confirm": "Ok", + "collapse": "Replier", + "collapse.all": "Tout replier", + "color": "Couleur", + "coordinates": "Coordonnées", + "copy": "Copier", + "copy.all": "Tout copier", + "copy.success": "Copié : {count}", + "create": "Créer", + "custom": "Personnalisé", + + "date": "Date", + "date.select": "Choisir une date", + + "day": "Jour", + "days.fri": "Ven", + "days.mon": "Lun", + "days.sat": "Sam", + "days.sun": "Dim", + "days.thu": "Jeu", + "days.tue": "Mar", + "days.wed": "Mer", + + "debugging": "Débogage", + + "delete": "Supprimer", + "delete.all": "Tout supprimer", + + "dialog.fields.empty": "Ce dialogue ne comporte aucun champ", + "dialog.files.empty": "Aucun fichier à sélectionner", + "dialog.pages.empty": "Aucune page à sélectionner", + "dialog.text.empty": "Ce dialogue ne définit aucun texte", + "dialog.users.empty": "Aucun utilisateur à sélectionner", + + "dimensions": "Dimensions", + "disable": "Désactiver", + "disabled": "Désactivé", + "discard": "Supprimer", + + "drawer.fields.empty": "Ce tiroir ne comporte aucun champ", + + "domain": "Domaine", + "download": "Télécharger", + "duplicate": "Dupliquer", + + "edit": "Éditer", + + "email": "Courriel", + "email.placeholder": "mail@example.com", + + "enter": "Entrer", + "entries": "Entrées", + "entry": "Entrée", + + "environment": "Environnement", + + "error": "Erreur", + "error.access.code": "Code incorrect", + "error.access.login": "Identifiant incorrect", + "error.access.panel": "Vous n’êtes pas autorisé à accéder au Panel", + "error.access.view": "Vous n’êtes pas autorisé à accéder à cette section du Panel", + + "error.avatar.create.fail": "L’image du profil n’a pu être transférée", + "error.avatar.delete.fail": "L’image du profil n’a pu être supprimée", + "error.avatar.dimensions.invalid": "Veuillez choisir une image de profil de largeur et hauteur inférieures à 3000 pixels", + "error.avatar.mime.forbidden": "L'image du profil utilisateur doit être un fichier JPEG ou PNG", + + "error.blueprint.notFound": "Le blueprint « {name} » n’a pu être chargé", + + "error.blocks.max.plural": "Vous ne devez pas ajouter plus de {max} blocs", + "error.blocks.max.singular": "Vous ne devez pas ajouter plus d'un bloc", + "error.blocks.min.plural": "Vous devez ajouter au moins {min} blocs", + "error.blocks.min.singular": "Vous devez ajouter au moins un bloc", + "error.blocks.validation": "Il y a une erreur sur le champ « {field} » du bloc {index} utilisant le type de bloc « {fieldset} »", + + "error.cache.type.invalid": "Type de cache invalide « {type} »", + + "error.email.preset.notFound": "La configuration de courriel « {name} » n’a pu être trouvé ", + + "error.field.converter.invalid": "Convertisseur « {converter} » invalide", + "error.field.type.missing": "Champ « { name } » : Le type de champ « { type } » n’existe pas", + + "error.file.changeName.empty": "Le nom ne peut être vide", + "error.file.changeName.permission": "Vous n’êtes pas autorisé à modifier le nom de « {filename} »", + "error.file.changeTemplate.invalid": "Le modèle du fichier « {id} » ne peut être modifié en « {template} » (valide : « {blueprints} »)", + "error.file.changeTemplate.permission": "Vous n’êtes pas autorisé à changer le modèle du fichier « {id} »", + + "error.file.duplicate": "Un fichier nommé « {filename} » existe déjà", + "error.file.extension.forbidden": "L’extension « {extension} » n’est pas autorisée", + "error.file.extension.invalid": "Extension incorrecte : {extension}", + "error.file.extension.missing": "L’extension pour « {filename} » est manquante", + "error.file.maxheight": "La hauteur de l'image ne doit pas excéder {height} pixels", + "error.file.maxsize": "Le fichier est trop volumineux", + "error.file.maxwidth": "La largeur de l’image ne doit pas excéder {width} pixels", + "error.file.mime.differs": "Le fichier transféré doit être du même type de média « {mime} »", + "error.file.mime.forbidden": "Le type de média « {mime} » n’est pas autorisé", + "error.file.mime.invalid": "Type de média invalide : {mime}", + "error.file.mime.missing": "Le type de média de « {filename} » n’a pu être détecté", + "error.file.minheight": "La hauteur de l’image doit être au moins {height} pixels", + "error.file.minsize": "Le fichier n’est pas assez volumineux", + "error.file.minwidth": "La largeur de l’image doit être au moins {width} pixels", + "error.file.name.unique": "Le nom de fichier doit être unique", + "error.file.name.missing": "Veuillez entrer un titre", + "error.file.notFound": "Le fichier « {filename} » n’a pu être trouvé", + "error.file.orientation": "L’orientation de l'image doit être « {orientation} »", + "error.file.type.forbidden": "Vous n’êtes pas autorisé à transférer des fichiers {type}", + "error.file.type.invalid": "Type de fichier invalide : {type}", + "error.file.undefined": "Le fichier n’a pu être trouvé", + + "error.form.incomplete": "Veuillez corriger toutes les erreurs du formulaire…", + "error.form.notSaved": "Le formulaire n’a pu être enregistré", + + "error.language.code": "Veuillez saisir un code correct pour cette langue", + "error.language.duplicate": "Cette langue existe déjà", + "error.language.name": "Veuillez saisir un nom correct pour cette langue", + "error.language.notFound": "La langue n’a pu être trouvée", + + "error.layout.validation.block": "Il y a une erreur sur le champ « {field} » du bloc {blockIndex} utilisant le type de bloc « {fieldset} » dans le layout {layoutIndex}.", + "error.layout.validation.settings": "Il y a une erreur dans les paramètres de la disposition {index}", + + "error.license.domain": "Le domaine de la licence est manquant", + "error.license.email": "Veuillez saisir un courriel correct", + "error.license.format": "Veuillez saisir un numéro de licence valide", + "error.license.verification": "La licence n’a pu être vérifiée", + + "error.login.totp.confirm.invalid": "Code invalide", + "error.login.totp.confirm.missing": "Veuillez saisir le code actuel", + + "error.object.validation": "Il y a une erreur dans le champ « {label} » :\n{message}", + + "error.offline": "Le Panel est actuellement hors ligne", + + "error.page.changeSlug.permission": "Vous n’êtes pas autorisé à modifier l’identifiant d’URL pour « {slug} »", + "error.page.changeSlug.reserved": "Le chemin des pages de premier niveau ne doit pas commencer par « {path} »", + "error.page.changeStatus.incomplete": "La page comporte des erreurs et ne peut pas être publiée", + "error.page.changeStatus.permission": "Le statut de cette page ne peut être modifié", + "error.page.changeStatus.toDraft.invalid": "La page « {slug} » ne peut être convertie en brouillon", + "error.page.changeTemplate.invalid": "Le modèle de la page « {slug} » ne peut être changé", + "error.page.changeTemplate.permission": "Vous n’êtes pas autorisé à changer le modèle de « {slug} »", + "error.page.changeTitle.empty": "Le titre ne peut être vide", + "error.page.changeTitle.permission": "Vous n’êtes pas autorisé à modifier le titre de « {slug} »", + "error.page.create.permission": "Vous n’êtes pas autorisé à créer « {slug} »", + "error.page.delete": "La page « {slug} » ne peut être supprimée", + "error.page.delete.confirm": "Veuillez saisir le titre de la page pour confirmer", + "error.page.delete.hasChildren": "La page comporte des sous-pages et ne peut pas être supprimée", + "error.page.delete.permission": "Vous n’êtes pas autorisé à supprimer « {slug} »", + "error.page.draft.duplicate": "Un brouillon avec l’identifiant d’URL « {slug} » existe déjà", + "error.page.duplicate": "Une page avec l’identifiant d’URL « {slug} » existe déjà", + "error.page.duplicate.permission": "Vous n’êtes pas autorisé à dupliquer « {slug} »", + "error.page.move.ancestor": "La page ne peut être déplacée à l’intérieur d’elle-même", + "error.page.move.directory": "Le répertoire de la page ne peut être déplacé", + "error.page.move.duplicate": "Une sous-page possédant l’identifiant d’URL « {slug} » existe déjà", + "error.page.move.notFound": "La page déplacée n’a pu être trouvée", + "error.page.move.permission": "Vous n’êtes pas autorisé à déplacer « {slug} » ", + "error.page.move.template": "Le modèle « {template} » n’est pas accepté en tant que sous-page de « {parent} »", + "error.page.notFound": "La page « {slug} » n’a pu être trouvée", + "error.page.num.invalid": "Veuillez saisir un numéro de position correct. Les numéros ne doivent pas être négatifs.", + "error.page.slug.invalid": "Veuillez entrer un identifiant d’URL correct", + "error.page.slug.maxlength": "L’identifiant d’URL doit faire moins de « {length} » caractères", + "error.page.sort.permission": "La page « {slug} » ne peut être réordonnée", + "error.page.status.invalid": "Veuillez choisir un statut de page correct", + "error.page.undefined": "La page n’a pu être trouvée", + "error.page.update.permission": "Vous n’êtes pas autorisé à modifier « {slug} »", + + "error.section.files.max.plural": "Vous ne pouvez ajouter plus de {max} fichier(s) à la section « {section} »", + "error.section.files.max.singular": "Vous ne pouvez ajouter plus d’un fichier à la section « {section} »", + "error.section.files.min.plural": "La section « {section} » requiert au moins {min} fichiers", + "error.section.files.min.singular": "La section « {section} » requiert au moins un fichier", + + "error.section.pages.max.plural": "Vous ne pouvez ajouter plus de {max} pages à la section « {section} »", + "error.section.pages.max.singular": "Vous ne pouvez ajouter plus d’une page à la section « {section} »", + "error.section.pages.min.plural": "La section « {section} » requiert au moins {min} pages", + "error.section.pages.min.singular": "La section « {section} » requiert au moins une page", + + "error.section.notLoaded": "La section « {name} » n’a pu être chargée", + "error.section.type.invalid": "Le type de section « {type} » est incorrect", + + "error.site.changeTitle.empty": "Le titre ne peut être vide", + "error.site.changeTitle.permission": "Vous n’êtes pas autorisé à modifier le titre du site", + "error.site.update.permission": "Vous n’êtes pas autorisé à modifier le contenu global du site", + + "error.structure.validation": "Il y a une erreur dans le champ « {field} » de la rangée {index}", + + "error.template.default.notFound": "Le modèle par défaut n’existe pas", + + "error.unexpected": "Une erreur inattendue est survenue ! Activez le mode de débogage pour plus d’informations : https://getkirby.com/docs/reference/system/options/debug", + + "error.user.changeEmail.permission": "Vous n’êtes pas autorisé à modifier le courriel de l’utilisateur « {name} »", + "error.user.changeLanguage.permission": "Vous n’êtes pas autorisé à changer la langue de l’utilisateur « {name} »", + "error.user.changeName.permission": "Vous n’êtes pas autorisé à modifier le nom de l’utilisateur « {name} »", + "error.user.changePassword.permission": "Vous n’êtes pas autorisé à changer le mot de passe de l’utilisateur « {name} »", + "error.user.changeRole.lastAdmin": "Le rôle du dernier administrateur ne peut être modifié", + "error.user.changeRole.permission": "Vous n’êtes pas autorisé à changer le rôle de l’utilisateur « {name} »", + "error.user.changeRole.toAdmin": "Vous n’êtes pas autorisé à attribuer le rôle d’administrateur aux utilisateurs", + "error.user.create.permission": "Vous n’êtes pas autorisé à créer cet utilisateur", + "error.user.delete": "L’utilisateur « {name} » ne peut être supprimé", + "error.user.delete.lastAdmin": "Le dernier administrateur ne peut être supprimé", + "error.user.delete.lastUser": "Le dernier utilisateur ne peut être supprimé", + "error.user.delete.permission": "Vous n’êtes pas autorisé à supprimer l’utilisateur « {name} »", + "error.user.duplicate": "Un utilisateur avec le courriel « {email} » existe déjà", + "error.user.email.invalid": "Veuillez saisir un courriel correct", + "error.user.language.invalid": "Veuillez saisir une langue correcte", + "error.user.notFound": "L’utilisateur « {name} » n’a pu être trouvé", + "error.user.password.excessive": "Veuillez entrer un mot de passe valide. Les mots de passe ne doivent pas dépasser 1000 caractères de long.", + "error.user.password.invalid": "Veuillez saisir un mot de passe valide. Les mots de passe doivent comporter au moins 8 caractères.", + "error.user.password.notSame": "Les mots de passe ne sont pas identiques", + "error.user.password.undefined": "Cet utilisateur n’a pas de mot de passe", + "error.user.password.wrong": "Mot de passe incorrect", + "error.user.role.invalid": "Veuillez saisir un rôle correct", + "error.user.undefined": "L’utilisateur n’a pu être trouvé", + "error.user.update.permission": "Vous n’êtes pas autorisé à modifier l’utilisateur « {name} »", + + "error.validation.accepted": "Veuillez confirmer", + "error.validation.alpha": "Veuillez saisir uniquement des caractères alphabétiques minuscules", + "error.validation.alphanum": "Veuillez ne saisir que des minuscules de a à z et des chiffres de 0 à 9", + "error.validation.anchor": "Veuillez entrer un lien ancré correct", + "error.validation.between": "Veuillez saisir une valeur entre « {min} » et « {max} »", + "error.validation.boolean": "Veuillez confirmer ou refuser", + "error.validation.color": "Veuillez entrer une couleur valide dans le format {format}", + "error.validation.contains": "Veuillez saisir une valeur contenant « {needle} »", + "error.validation.date": "Veuillez saisir une date correcte", + "error.validation.date.after": "Veuillez saisir une date après {date}", + "error.validation.date.before": "Veuillez saisir une date avant {date}", + "error.validation.date.between": "Veuillez saisir une date entre {min} et {max}", + "error.validation.denied": "Veuillez refuser", + "error.validation.different": "La valeur ne doit pas être « {other} »", + "error.validation.email": "Veuillez saisir un courriel correct", + "error.validation.endswith": "La valeur doit se terminer par « {end} »", + "error.validation.filename": "Veuillez saisir un nom de fichier correct", + "error.validation.in": "Veuillez saisir l’un des éléments suivants: ({in})", + "error.validation.integer": "Veuillez saisir un entier correct", + "error.validation.ip": "Veuillez saisir une adresse IP correcte", + "error.validation.less": "Veuillez saisir une valeur inférieure à {max}", + "error.validation.linkType": "Le type de lien n’est pas autorisé", + "error.validation.match": "La valeur ne correspond pas au modèle attendu", + "error.validation.max": "Veuillez saisir une valeur inférieure ou égale à {max}", + "error.validation.maxlength": "Veuillez saisir une valeur plus courte (max. {max} caractères)", + "error.validation.maxwords": "Veuillez ne pas saisir plus de {max} mot(s)", + "error.validation.min": "Veuillez saisir une valeur supérieure ou égale à {min}", + "error.validation.minlength": "Veuillez saisir une valeur plus longue (min. {min} caractères)", + "error.validation.minwords": "Veuillez saisir au moins {min} mot(s)", + "error.validation.more": "Veuillez saisir une valeur supérieure à {min}", + "error.validation.notcontains": "Veuillez saisir une valeur ne contenant pas « {needle} »", + "error.validation.notin": "Veuillez ne saisir aucun des éléments suivants: ({notIn})", + "error.validation.option": "Veuillez sélectionner une option correcte", + "error.validation.num": "Veuillez saisir un nombre correct", + "error.validation.required": "Veuillez saisir quelque chose", + "error.validation.same": "Veuillez saisir « {other} »", + "error.validation.size": "La grandeur de la valeur doit être « {size} »", + "error.validation.startswith": "La valeur doit commencer par « {start} »", + "error.validation.tel": "Veuillez saisir un numéro de téléphone non formaté", + "error.validation.time": "Veuillez saisir une heure correcte", + "error.validation.time.after": "Veuillez saisir une heure après {time}", + "error.validation.time.before": "Veuillez saisir une heure avant {time}", + "error.validation.time.between": "Veuillez saisir une heure entre {min} et {max}", + "error.validation.uuid": "Veuillez saisir un UUID valide", + "error.validation.url": "Veuillez saisir une URL correcte", + + "expand": "Déplier", + "expand.all": "Tout déplier", + + "field.invalid": "Le champ est invalide", + "field.required": "Le champ est obligatoire", + "field.blocks.changeType": "Changer le type", + "field.blocks.code.name": "Code", + "field.blocks.code.language": "Langue", + "field.blocks.code.placeholder": "Votre code…", + "field.blocks.delete.confirm": "Voulez-vous vraiment supprimer ce bloc ?", + "field.blocks.delete.confirm.all": "Voulez-vous vraiment supprimer tous les blocs ?", + "field.blocks.delete.confirm.selected": "Voulez-vous vraiment supprimer les blocs sélectionnés ?", + "field.blocks.empty": "Pas encore de blocs", + "field.blocks.fieldsets.empty": "Pas encore d‘ensembles de champs", + "field.blocks.fieldsets.label": "Veuillez sélectionner un type de bloc…", + "field.blocks.fieldsets.paste": "Pressez {{ shortcut }} pour importer des dispositions ou blocs depuis votre presse-papier Seuls ceux autorisés dans le champ actuel seront insérés.", + "field.blocks.gallery.name": "Galerie", + "field.blocks.gallery.images.empty": "Pas encore d’images", + "field.blocks.gallery.images.label": "Images", + "field.blocks.heading.level": "Niveau", + "field.blocks.heading.name": "Titre", + "field.blocks.heading.text": "Texte", + "field.blocks.heading.placeholder": "Titre…", + "field.blocks.image.alt": "Texte alternatif", + "field.blocks.image.caption": "Légende", + "field.blocks.image.crop": "Recadrer", + "field.blocks.image.link": "Lien", + "field.blocks.image.location": "Emplacement", + "field.blocks.image.location.internal": "Ce site web", + "field.blocks.image.location.external": "Source externe", + "field.blocks.image.name": "Image", + "field.blocks.image.placeholder": "Sélectionnez une image", + "field.blocks.image.ratio": "Proportions", + "field.blocks.image.url": "URL de l’image", + "field.blocks.line.name": "Ligne", + "field.blocks.list.name": "Liste", + "field.blocks.markdown.name": "Markdown", + "field.blocks.markdown.label": "Texte", + "field.blocks.markdown.placeholder": "Markdown…", + "field.blocks.quote.name": "Citation", + "field.blocks.quote.text.label": "Texte", + "field.blocks.quote.text.placeholder": "Citation…", + "field.blocks.quote.citation.label": "Citation", + "field.blocks.quote.citation.placeholder": "par…", + "field.blocks.text.name": "Texte", + "field.blocks.text.placeholder": "Texte…", + "field.blocks.video.autoplay": "Lecture automatique", + "field.blocks.video.caption": "Légende", + "field.blocks.video.controls": "Contrôles", + "field.blocks.video.location": "Emplacement", + "field.blocks.video.loop": "Boucle", + "field.blocks.video.muted": "Muet", + "field.blocks.video.name": "Vidéo", + "field.blocks.video.placeholder": "Saisissez l’URL d’une vidéo", + "field.blocks.video.poster": "Vignette", + "field.blocks.video.preload": "Préchargement", + "field.blocks.video.url.label": "URL de la vidéo", + "field.blocks.video.url.placeholder": "https://youtube.com/?v=", + + "field.files.empty": "Pas encore de fichier sélectionné", + + "field.layout.change": "Changer de disposition", + "field.layout.delete": "Supprimer cette disposition", + "field.layout.delete.confirm": "Voulez-vous vraiment supprimer cette disposition ?", + "field.layout.delete.confirm.all": "Voulez-vous vraiment supprimer toutes les dispositions ?", + "field.layout.empty": "Pas encore de rangées", + "field.layout.select": "Choisir une disposition", + + "field.object.empty": "Pas encore d‘information", + + "field.pages.empty": "Pas encore de page sélectionnée", + + "field.structure.delete.confirm": "Voulez-vous vraiment supprimer cette ligne ?", + "field.structure.delete.confirm.all": "Voulez-vous vraiment supprimer toutes les entrées ?", + "field.structure.empty": "Pas encore d’entrée", + + "field.users.empty": "Pas encore d’utilisateur sélectionné", + + "fields.empty": "Pas encore de champs", + + "file": "Fichier", + "file.blueprint": "Ce fichier n’a pas encore de blueprint. Vous pouvez en définir les paramètres dans /site/blueprints/files/{blueprint}.yml", + "file.changeTemplate": "Changer de modèle", + "file.changeTemplate.notice": "Modifier le modèle du fichier supprimera le contenu des champs dont le type ne correspond pas. Si le nouveau modèle définit certaines règles, par exemple les dimensions des images, celles-ci seront également appliquées de manière irréversible. Utilisez avec précaution.", + "file.delete.confirm": "Voulez-vous vraiment supprimer
{filename} ?", + "file.focus.placeholder": "Définir le point focal", + "file.focus.reset": "Supprimer le point focal", + "file.focus.title": "Point focal", + "file.sort": "Modifier la position", + + "files": "Fichiers", + "files.empty": "Pas encore de fichier", + + "filter": "Filtrer", + + "hide": "Masquer", + "hour": "Heure", + "hue": "Teinte", + "import": "Importer", + "info": "Info", + "insert": "Insérer", + "insert.after": "Insérer après", + "insert.before": "Insérer avant", + "install": "Installer", + + "installation": "Installation", + "installation.completed": "Le Panel a été installé", + "installation.disabled": "L’installation du Panel est désactivée par défaut sur les serveurs publics. Veuillez lancer l’installation sur un serveur local, ou activez-la avec l’option panel.install.", + "installation.issues.accounts": "Le dossier /site/accounts n’existe pas ou n’est pas accessible en écriture", + "installation.issues.content": "Le dossier /content n’existe pas ou n’est pas accessible en écriture", + "installation.issues.curl": "L’extension CURL est requise", + "installation.issues.headline": "Le Panel ne peut être installé", + "installation.issues.mbstring": "L’extension MB String est requise", + "installation.issues.media": "Le dossier /media n’existe pas ou n’est pas accessible en écriture", + "installation.issues.php": "Veuillez utiliser PHP 8+", + "installation.issues.sessions": "Le dossier /site/sessions n’existe pas ou n’est pas accessible en écriture", + + "language": "Langue", + "language.code": "Code", + "language.convert": "Choisir comme langue par défaut", + "language.convert.confirm": "

Souhaitez-vous vraiment convertir {name} vers la langue par défaut ? Cette action ne peut pas être annulée.

Si {name} a un contenu non traduit, il n’y aura plus de solution de secours possible et certaines parties de votre site pourraient être vides.

", + "language.create": "Ajouter une nouvelle langue", + "language.default": "Langue par défaut", + "language.delete.confirm": "Voulez-vous vraiment supprimer la langue {name}, ainsi que toutes ses traductions ? Cette action ne peut être annulée !", + "language.deleted": "La langue a été supprimée", + "language.direction": "Sens de lecture", + "language.direction.ltr": "De gauche à droite", + "language.direction.rtl": "De droite à gauche", + "language.locale": "Locales PHP", + "language.locale.warning": "Vous utilisez une Locale PHP personnalisée. Veuillez la modifier dans le fichier de langue situé dans /site/languages", + "language.name": "Nom", + "language.secondary": "Langue secondaire", + "language.settings": "Préférences de langue", + "language.updated": "La langue a été mise à jour", + "language.variables": "Variables de langue", + "language.variables.empty": "Pas encore de traductions", + + "language.variable.delete.confirm": "Voulez-vous vraiment supprimer la variable pour {key} ?", + "language.variable.key": "Clé", + "language.variable.notFound": "La variable n’a pu être trouvée", + "language.variable.value": "Valeur", + + "languages": "Langages", + "languages.default": "Langue par défaut", + "languages.empty": "Il n’y a pas encore de langues", + "languages.secondary": "Langues secondaires", + "languages.secondary.empty": "Il n’y a pas encore de langues secondaires", + + "license": "Licence", + "license.activate": "Activer maintenant", + "license.activate.label": "Veuillez activer votre licence", + "license.activate.domain": "Votre licence sera activée pour {host}.", + "license.activate.local": "Vous êtes sur le point d‘activer votre licence de Kirby pour votre domaine local {host}. Si ce site doit être activé sur un domaine publique, veuillez plutôt l‘activer là-bas. Si {host} est bien le domaine pour lequel vous voulez activer votre licence, veuillez continuer.", + "license.activated": "Activée", + "license.buy": "Acheter une licence", + "license.code": "Code", + "license.code.help": "Vous avez reçu votre code de licence par courriel après l‘achat. Veuillez le copier et le coller ici.", + "license.code.label": "Veuillez saisir votre numéro de licence", + "license.status.active.info": "Inclut les nouvelles versions majeures jusqu’au {date}", + "license.status.active.label": "Licence valide", + "license.status.demo.info": "Ceci est une installation de démonstration", + "license.status.demo.label": "Démonstration", + "license.status.inactive.info": "Renouveler la licence pour mettre à jour vers les nouvelles versions majeures", + "license.status.inactive.label": "Pas de nouvelles versions majeures", + "license.status.legacy.bubble": "Prêt à renouveler votre licence ?", + "license.status.legacy.info": "Votre licence ne couvre pas cette version", + "license.status.legacy.label": "Veuillez renouveler votre licence", + "license.status.missing.bubble": "Prêt à lancer votre site ?", + "license.status.missing.info": "Pas de licence valide", + "license.status.missing.label": "Veuillez activer votre licence", + "license.manage": "Gérer vos licences", + "license.purchased": "Achetée", + "license.success": "Merci pour votre soutien à Kirby", + "license.unregistered.label": "Non enregistré", + + "link": "Lien", + "link.text": "Texte du lien", + + "loading": "Chargement", + + "lock.unsaved": "Modifications non enregistrées", + "lock.unsaved.empty": "Il n’y a plus de modifications non enregistrées", + "lock.isLocked": "Modifications non enregistrées par {email}", + "lock.unlock": "Déverrouiller", + "lock.unlock.submit": "Déverrouiller et écraser les modifications non enregistrées par {email}", + "lock.isUnlocked": "A été déverrouillé par un autre utilisateur", + + "login": "Connexion", + "login.code.label.login": "Code de connexion", + "login.code.label.password-reset": "Code de réinitialisation du mot de passe", + "login.code.placeholder.email": "000 000", + "login.code.placeholder.totp": "000000", + "login.code.text.email": "Si votre adresse de courriel est enregistrée, le code demandé vous sera envoyé par courriel.", + "login.code.text.totp": "Veuillez saisir le code à usage unique de votre application d‘authentification", + "login.email.login.body": "Bonjour {user.nameOrEmail},\n\nVous avez récemment demandé un code de connexion pour le Panel de {site}.\nLe code de connexion suivant sera valable pendant {timeout} minutes :\n\n{code}\n\nSi vous n’avez pas demandé de code de connexion, veuillez ignorer cet email ou contacter votre administrateur si vous avez des questions.\nPar sécurité, merci de ne PAS faire suivre cet email.", + "login.email.login.subject": "Votre code de connexion", + "login.email.password-reset.body": "Bonjour {user.nameOrEmail},\n\nVous avez récemment demandé un code de réinitialisation de mot de passe pour le Panel de {site}.\nLe code de réinitialisation de mot de passe suivant sera valable pendant {timeout} minutes :\n\n{code}\n\nSi vous n’avez pas demandé de code de réinitialisation de mot de passe, veuillez ignorer cet email ou contacter votre administrateur si vous avez des questions.\nPar sécurité, merci de ne PAS faire suivre ce courriel.", + "login.email.password-reset.subject": "Votre code de réinitialisation du mot de passe", + "login.remember": "Rester connecté", + "login.reset": "Réinitialiser le mot de passe", + "login.toggleText.code.email": "Se connecter par courriel", + "login.toggleText.code.email-password": "Se connecter avec un mot de passe", + "login.toggleText.password-reset.email": "Mot de passe oublié ?", + "login.toggleText.password-reset.email-password": "← Retour à la connexion", + "login.totp.enable.option": "Configurer les codes à usage unique", + "login.totp.enable.intro": "Les applications d’authentification peuvent générer des codes à usage unique qui sont utilisés comme second facteur lors de la connexion à votre compte.", + "login.totp.enable.qr.label": "1. Scannez ce QR code", + "login.totp.enable.qr.help": "Impossible de scanner ? Ajoutez la clé de configuration {secret} manuellement à votre application d’authentification..", + "login.totp.enable.confirm.headline": "2. Confirmez avec le code généré", + "login.totp.enable.confirm.text": "Votre application génère un nouveau code à usage unique toutes les 30 secondes. Saisissez le code actuel pour terminer la configuration :", + "login.totp.enable.confirm.label": "Code actuel", + "login.totp.enable.confirm.help": "Après cette configuration, nous vous demanderons un code à usage unique à chaque connexion.", + "login.totp.enable.success": "Codes à usage unique activés", + "login.totp.disable.option": "Désactiver les codes à usage unique", + "login.totp.disable.label": "Saisissez votre mot de passe pour désactiver les codes à usage unique.", + "login.totp.disable.help": "Un second facteur différent, par exemple un code de connexion envoyé par courriel, vous sera demandé à la connexion. Vous pourrez à nouveau configurer les codes à usage unique ultérieurement.", + "login.totp.disable.admin": "

Cela désactivera les codes à usage unique pour {user}.

Un second facteur différent, par exemple un code de connexion envoyé par courriel lui sera demandé à la connexion. {user} pourra à nouveau configurer les codes à usage unique ultérieurement.

", + "login.totp.disable.success": "Codes à usage unique désactivés", + + "logout": "Déconnexion", + + "merge": "Fusionner", + "menu": "Menu", + "meridiem": "AM/PM", + "mime": "Type de médias", + "minutes": "Minutes", + + "month": "Mois", + "months.april": "Avril", + "months.august": "Août", + "months.december": "Décembre", + "months.february": "Février", + "months.january": "Janvier", + "months.july": "Juillet", + "months.june": "Juin", + "months.march": "Mars", + "months.may": "Mai", + "months.november": "Novembre", + "months.october": "Octobre", + "months.september": "Septembre", + + "more": "Plus", + "move": "Déplacer", + "name": "Nom", + "next": "Suivant", + "night": "Nuit", + "no": "non", + "off": "off", + "on": "on", + "open": "Ouvrir", + "open.newWindow": "Ouvrir dans une nouvelle fenêtre", + "option": "Option", + "options": "Options", + "options.none": "Pas d’options", + "options.all": "Afficher toutes les options de {count}", + + "orientation": "Orientation", + "orientation.landscape": "Paysage", + "orientation.portrait": "Portrait", + "orientation.square": "Carré", + + "page": "Page", + "page.blueprint": "Cette page n’a pas encore de blueprint. Vous pouvez en définir les paramètres dans /site/blueprints/pages/{blueprint}.yml", + "page.changeSlug": "Modifier l’URL", + "page.changeSlug.fromTitle": "Créer à partir du titre", + "page.changeStatus": "Changer le statut", + "page.changeStatus.position": "Veuillez sélectionner une position", + "page.changeStatus.select": "Sélectionner un nouveau statut", + "page.changeTemplate": "Changer de modèle", + "page.changeTemplate.notice": "Modifier le modèle de la page supprimera le contenu des champs dont le type ne correspond pas. Utilisez avec précaution.", + "page.create": "Créer en tant que {status}", + "page.delete.confirm": "Voulez-vous vraiment supprimer {title} ?", + "page.delete.confirm.subpages": "Cette page contient des sous-pages.
Toutes les sous-pages seront également supprimées.", + "page.delete.confirm.title": "Veuillez saisir le titre de la page pour confirmer", + "page.duplicate.appendix": "Copier", + "page.duplicate.files": "Copier les fichiers", + "page.duplicate.pages": "Copier les pages", + "page.move": "Déplacer la page", + "page.sort": "Modifier la position", + "page.status": "Statut", + "page.status.draft": "Brouillon", + "page.status.draft.description": "La page est accessible uniquement pour les éditeurs connectés ou via un lien secret", + "page.status.listed": "Public", + "page.status.listed.description": "La page est accessible par tout le monde", + "page.status.unlisted": "Non listé", + "page.status.unlisted.description": "La page est accessible uniquement par son URL", + + "pages": "Pages", + "pages.empty": "Pas encore de pages", + "pages.status.draft": "Brouillons", + "pages.status.listed": "Publié", + "pages.status.unlisted": "Non listé", + + "pagination.page": "Page", + + "password": "Mot de passe", + "paste": "Coller", + "paste.after": "Coller après", + "paste.success": "Copié : {count}", + "pixel": "Pixel", + "plugin": "Plugin", + "plugins": "Plugins", + "prev": "Précédent", + "preview": "Prévisualiser", + "remove": "Supprimer", + "rename": "Renommer", + "renew": "Renouveler", + "replace": "Remplacer", + "replace.with": "Remplacer par", + "retry": "Essayer à nouveau", + "revert": "Revenir", + "revert.confirm": "Voulez-vous vraiment supprimer toutes les modifications non enregistrées ?", + + "role": "Rôle", + "role.admin.description": "L’administrateur dispose de tous les droits", + "role.admin.title": "Administrateur", + "role.all": "Tous", + "role.empty": "Il n’y a aucun utilisateur avec ce rôle", + "role.description.placeholder": "Pas de description", + "role.nobody.description": "Ceci est un rôle de secours sans aucune permission.", + "role.nobody.title": "Personne", + + "save": "Enregistrer", + "search": "Rechercher", + "search.min": "Saisissez {min} caractères pour rechercher", + "search.all": "Afficher tous les résultats de {count}", + "search.results.none": "Pas de résultats", + + "section.invalid": "La section est invalide", + "section.required": "Cette section est obligatoire", + + "security": "Sécurité", + "select": "Sélectionner", + "server": "Serveur", + "settings": "Paramètres", + "show": "Afficher", + "site.blueprint": "Ce site n’a pas encore de blueprint. Vous pouvez en définir les paramètres dans /site/blueprints/site.yml", + "size": "Poids", + "slug": "Identifiant de l’URL", + "sort": "Trier", + "sort.drag": "Déplacer pour réordonner…", + "split": "Diviser", + + "stats.empty": "Aucun rapport", + "status": "Statut", + + "system.info.copy": "Copy info", + "system.info.copied": "System info copied", + "system.issues.content": "Le dossier content semble exposé", + "system.issues.eol.kirby": "La version de Kirby installée a atteint la fin de son cycle de vie et ne recevra plus de mises à jour de sécurité", + "system.issues.eol.plugin": "La version du plugin { plugin } installée a atteint la fin de son cycle de vie et ne recevra plus de mises à jour de sécurité", + "system.issues.eol.php": "Votre version de PHP installée { release } a atteint la fin de son cycle de vie et ne recevra plus de mises à jour de sécurité", + "system.issues.debug": "Le débogage doit être désactivé en production", + "system.issues.git": "Le dossier .git semble exposé", + "system.issues.https": "Nous recommandons HTTPS pour tous vos sites", + "system.issues.kirby": "Le dossier kirby semble exposé", + "system.issues.site": "Le dossier site semble exposé", + "system.issues.vulnerability.kirby": "Votre installation pourrait être affectée par la vulnérabilité suivante ({ severity } gravité) : { description }", + "system.issues.vulnerability.plugin": "Votre installation pourrait être affectée par la vulnérabilité suivante du plugin { plugin } ({ severity } gravité) : { description }", + "system.updateStatus": "Statut des mises à jour", + "system.updateStatus.error": "Les mises à jour n’ont pu être vérifiées", + "system.updateStatus.not-vulnerable": "Aucune vulnérabilité connue", + "system.updateStatus.security-update": "Mise à jour gratuite { version } disponible", + "system.updateStatus.security-upgrade": "Mise à jour { version } avec correctifs de sécurité disponible", + "system.updateStatus.unreleased": "Version non diffusée", + "system.updateStatus.up-to-date": "À jour", + "system.updateStatus.update": "Mise à jour gratuite { version } disponible", + "system.updateStatus.upgrade": "Mise à jour { version } disponible", + + "tel": "Téléphone", + "tel.placeholder": "+33123456789", + "template": "Modèle", + "title": "Titre", + "today": "Aujourd’hui", + + "toolbar.button.clear": "Supprimer la mise en forme", + "toolbar.button.code": "Code", + "toolbar.button.bold": "Gras", + "toolbar.button.email": "Courriel", + "toolbar.button.headings": "Titres", + "toolbar.button.heading.1": "Titre 1", + "toolbar.button.heading.2": "Titre 2", + "toolbar.button.heading.3": "Titre 3", + "toolbar.button.heading.4": "Titre 4", + "toolbar.button.heading.5": "Titre 5", + "toolbar.button.heading.6": "Titre 6", + "toolbar.button.italic": "Italique", + "toolbar.button.file": "Fichier", + "toolbar.button.file.select": "Sélectionner un fichier", + "toolbar.button.file.upload": "Transférer un fichier", + "toolbar.button.link": "Lien", + "toolbar.button.paragraph": "Paragraphe", + "toolbar.button.strike": "Barré", + "toolbar.button.sub": "Indice", + "toolbar.button.sup": "Exposant", + "toolbar.button.ol": "Liste ordonnée", + "toolbar.button.underline": "Souligné", + "toolbar.button.ul": "Liste non-ordonnée", + + "translation.author": "Kirby Team", + "translation.direction": "ltr", + "translation.name": "Français", + "translation.locale": "fr_FR", + + "type": "Type", + + "upload": "Transférer", + "upload.error.cantMove": "Le fichier transféré n’a pu être déplacé", + "upload.error.cantWrite": "Le fichier n’a pu être écrit sur le disque", + "upload.error.default": "Le fichier n’a pu être transféré", + "upload.error.extension": "Le transfert de fichier a été stoppé par une extension", + "upload.error.formSize": "Le fichier transféré excède la directive MAX_FILE_SIZE spécifiée dans le formulaire", + "upload.error.iniPostSize": "Le fichier transféré excède la directive post_max_size spécifiée dans php.ini", + "upload.error.iniSize": "Le fichier transféré excède la directive upload_max_filesize spécifiée dans php.ini", + "upload.error.noFile": "Aucun fichier n’a été transféré", + "upload.error.noFiles": "Aucun fichier n’a été transféré", + "upload.error.partial": "Le fichier n’a été que partiellement transféré", + "upload.error.tmpDir": "Un dossier temporaire est manquant", + "upload.errors": "Erreur", + "upload.progress": "Transfert en cours…", + + "url": "Url", + "url.placeholder": "https://example.com", + + "user": "Utilisateur", + "user.blueprint": "Vous pouvez définir de nouvelles sections et champs de formulaires pour ce rôle d’utilisateur dans /site/blueprints/users/{blueprint}.yml", + "user.changeEmail": "Modifier le courriel", + "user.changeLanguage": "Modifier la langue", + "user.changeName": "Renommer cet utilisateur", + "user.changePassword": "Modifier le mot de passe", + "user.changePassword.new": "Nouveau mot de passe", + "user.changePassword.new.confirm": "Confirmer le nouveau mot de passe…", + "user.changeRole": "Modifier le rôle", + "user.changeRole.select": "Sélectionner un nouveau rôle", + "user.create": "Ajouter un nouvel utilisateur", + "user.delete": "Supprimer cet utilisateur", + "user.delete.confirm": "Voulez-vous vraiment supprimer
{email} ?", + + "users": "Utilisateurs", + + "version": "Version", + "version.current": "Version actuelle", + "version.latest": "Dernière version", + "versionInformation": "Informations de version", + + "view.account": "Votre compte", + "view.installation": "Installation", + "view.languages": "Langues", + "view.resetPassword": "Réinitialiser le mot de passe", + "view.site": "Site", + "view.system": "Système", + "view.users": "Utilisateurs", + + "welcome": "Bienvenue", + "year": "Année", + "yes": "oui" +} diff --git a/kirby/i18n/translations/hu.json b/kirby/i18n/translations/hu.json new file mode 100644 index 0000000..27cb8d7 --- /dev/null +++ b/kirby/i18n/translations/hu.json @@ -0,0 +1,730 @@ +{ + "account.changeName": "Név megváltoztatása", + "account.delete": "Fiók törlése", + "account.delete.confirm": "Tényleg törölni szeretnéd a fiókodat? Azonnal kijelentkeztetünk és ez a folyamat visszavonhatatlan.", + + "activate": "Activate", + "add": "Hozz\u00e1ad", + "alpha": "Alpha", + "author": "Szerző", + "avatar": "Profilkép", + "back": "Vissza", + "cancel": "M\u00e9gsem", + "change": "M\u00f3dos\u00edt\u00e1s", + "close": "Bez\u00e1r", + "changes": "Changes", + "confirm": "Mentés", + "collapse": "Bezárás", + "collapse.all": "Összes bezárása", + "color": "Color", + "coordinates": "Coordinates", + "copy": "Másol", + "copy.all": "Összes másolása", + "copy.success": "{count} copied!", + "create": "Létrehoz", + "custom": "Custom", + + "date": "Dátum", + "date.select": "Dátum kiválasztása", + + "day": "Nap", + "days.fri": "p\u00e9", + "days.mon": "h\u00e9", + "days.sat": "szo", + "days.sun": "va", + "days.thu": "cs\u00fc", + "days.tue": "ke", + "days.wed": "sze", + + "debugging": "Hibakeresés", + + "delete": "T\u00f6rl\u00e9s", + "delete.all": "Összes törlése", + + "dialog.fields.empty": "This dialog has no fields", + "dialog.files.empty": "Nincsenek fájlok kiválasztva", + "dialog.pages.empty": "Nincsenek oldalak kiválasztva", + "dialog.text.empty": "This dialog does not define any text", + "dialog.users.empty": "Nincsenek felhasználók kiválasztva", + + "dimensions": "Méretek", + "disable": "Disable", + "disabled": "Inaktív", + "discard": "Visszavon\u00e1s", + + "drawer.fields.empty": "This drawer has no fields", + + "domain": "Domain", + "download": "Letöltés", + "duplicate": "Másolat", + + "edit": "Aloldal szerkeszt\u00e9se", + + "email": "Email", + "email.placeholder": "mail@pelda.hu", + + "enter": "Enter", + "entries": "Entries", + "entry": "Entry", + + "environment": "Környezet", + + "error": "Error", + "error.access.code": "Érvénytelen kód", + "error.access.login": "Érvénytelen bejelentkezés", + "error.access.panel": "Nincs jogosultságod megnyitni a panelt", + "error.access.view": "Nincs hozzáférésed a panel ezen részéhez", + + "error.avatar.create.fail": "A profilkép feltöltése nem sikerült", + "error.avatar.delete.fail": "A profilkép nem törölhető", + "error.avatar.dimensions.invalid": "A profilkép maximális szélessége és magassága 3000 pixel lehet", + "error.avatar.mime.forbidden": "A profilkép formátuma csak JPEG vagy PNG lehet", + + "error.blueprint.notFound": "A \"{name}\" oldalsablon nem tölthető be", + + "error.blocks.max.plural": "Legfeljebb {max} blokk adható hozzá", + "error.blocks.max.singular": "Csak egyetlen blokk adható hozzá", + "error.blocks.min.plural": "Legalább {min} blokkot hozzá kell adnod", + "error.blocks.min.singular": "Legalább egy blokkot hozzá kell adnod", + "error.blocks.validation": "There's an error on the \"{field}\" field in block {index} using the \"{fieldset}\" block type", + + "error.cache.type.invalid": "Invalid cache type \"{type}\"", + + "error.email.preset.notFound": "A \"{name}\" email-beállítás nem található", + + "error.field.converter.invalid": "Érvénytelen konverter: \"{converter}\"", + "error.field.type.missing": "Field \"{ name }\": The field type \"{ type }\" does not exist", + + "error.file.changeName.empty": "A név nem lehet üres", + "error.file.changeName.permission": "Nincs jogosultságod megváltoztatni a \"{filename}\" fájl nevét", + "error.file.changeTemplate.invalid": "The template for the file \"{id}\" cannot be changed to \"{template}\" (valid: \"{blueprints}\")", + "error.file.changeTemplate.permission": "You are not allowed to change the template for the file \"{id}\"", + + "error.file.duplicate": "Már létezik \"{filename}\" nevű fájl", + "error.file.extension.forbidden": "Tiltott kiterjeszt\u00e9s\u0171 f\u00e1jl", + "error.file.extension.invalid": "Érvénytelen kiterjesztés: {extension}", + "error.file.extension.missing": "Kiterjeszt\u00e9s n\u00e9lk\u00fcli f\u00e1jl nem t\u00f6lthet\u0151 fel", + "error.file.maxheight": "A kép nem lehet magasabb {height} pixelnél", + "error.file.maxsize": "A fájl túl nagy", + "error.file.maxwidth": "A kép nem lehet szélesebb {width} pixelnél", + "error.file.mime.differs": "A feltöltött fájlnak azonos \"{mime}\" típusúnak kell lennie", + "error.file.mime.forbidden": "A \"{mime}\" típusú médiafájlok nem engedélyezettek", + "error.file.mime.invalid": "Érvénytelen mime-típus: {mime}", + "error.file.mime.missing": "A \"{filename}\" fájl típusa nem állapítható meg", + "error.file.minheight": "A képnek legalább {height} pixel magasnak kell lennie", + "error.file.minsize": "A fájl túl kicsi", + "error.file.minwidth": "A képnek legalább {width} pixel szélesnek kell lennie", + "error.file.name.unique": "The filename must be unique", + "error.file.name.missing": "A fálj neve nem lehet üres", + "error.file.notFound": "A \"{filename}\" fájl nem található", + "error.file.orientation": "A képnek \"{orientation}\" tájolásúnak kell lennie", + "error.file.type.forbidden": "Nem tölthetsz fel \"{type}\" típusú fájlokat", + "error.file.type.invalid": "Érvénytelen fájltípus: {type}", + "error.file.undefined": "A f\u00e1jl nem tal\u00e1lhat\u00f3", + + "error.form.incomplete": "Kérlek javítsd ki az összes hibát az űrlapon", + "error.form.notSaved": "Az űrlap nem menthető", + + "error.language.code": "Kérlek, add meg a nyelv érvényes kódját", + "error.language.duplicate": "A nyelv már létezik", + "error.language.name": "Kérlek, add meg a nyelv érvényes nevét", + "error.language.notFound": "A nyelv nem található", + + "error.layout.validation.block": "There's an error on the \"{field}\" field in block {blockIndex} using the \"{fieldset}\" block type in layout {layoutIndex}", + "error.layout.validation.settings": "Hibát találtunk a(z) {index} elrendezés beállításaiban", + + "error.license.domain": "The domain for the license is missing", + "error.license.email": "Kérlek adj meg egy valós email-címet", + "error.license.format": "Please enter a valid license code", + "error.license.verification": "A licensz nem ellenőrizhető", + + "error.login.totp.confirm.invalid": "Érvénytelen kód", + "error.login.totp.confirm.missing": "Please enter the current code", + + "error.object.validation": "There’s an error in the \"{label}\" field:\n{message}", + + "error.offline": "A Panel jelenleg nem elérhető", + + "error.page.changeSlug.permission": "Nem változtathatod meg az URL-előtagot: \"{slug}\"", + "error.page.changeSlug.reserved": "The path of top-level pages must not start with \"{path}\"", + "error.page.changeStatus.incomplete": "Az oldal hibákat tartalmaz és nem publikálható", + "error.page.changeStatus.permission": "Az oldal státusza nem változtatható meg", + "error.page.changeStatus.toDraft.invalid": "A(z) \"{slug}\" oldalt nem lehet piszkozattá alakítani", + "error.page.changeTemplate.invalid": "A \"{slug}\" oldal sablonját nem lehet megváltoztatni", + "error.page.changeTemplate.permission": "Nincs jogosultságod megváltoztatni a sablont ehhez: \"{slug}\"", + "error.page.changeTitle.empty": "A cím nem lehet üres", + "error.page.changeTitle.permission": "Nincs jogosultságod megváltoztatni a címet: \"{slug}\"", + "error.page.create.permission": "Nincs jogosultságod az oldal létrehozásához: \"{slug}\"", + "error.page.delete": "A(z) \"{slug}\" oldal nem törölhető", + "error.page.delete.confirm": "Megerősítéshez add meg az oldal címét", + "error.page.delete.hasChildren": "Az oldalnak vannak aloldalai és nem törölhető", + "error.page.delete.permission": "Nincs jogosultságod a(z) \"{slug}\" oldal törléséhez", + "error.page.draft.duplicate": "Van már egy másik oldal ezzel az URL-lel: \"{slug}\"", + "error.page.duplicate": "Van már egy másik oldal ezzel az URL-lel: \"{slug}\"", + "error.page.duplicate.permission": "Nincs engedélyed a(z) \"{slug}\" másolat keszítéséhez", + "error.page.move.ancestor": "The page cannot be moved into itself", + "error.page.move.directory": "The page directory cannot be moved", + "error.page.move.duplicate": "A sub page with the URL appendix \"{slug}\" already exists", + "error.page.move.notFound": "The moved page could not be found", + "error.page.move.permission": "You are not allowed to move \"{slug}\"", + "error.page.move.template": "The \"{template}\" template is not accepted as a subpage of \"{parent}\"", + "error.page.notFound": "Az oldal nem tal\u00e1lhat\u00f3", + "error.page.num.invalid": "Kérlek megfelelő oldalszámozást adj meg. Negatív szám itt nem használható.", + "error.page.slug.invalid": "Kérlek érvényes URL-kiterjesztést adj meg", + "error.page.slug.maxlength": "Az URL maximum \"{length}\" karakter hosszúságú lehet", + "error.page.sort.permission": "A(z) \"{slug}\" oldal nem illeszthető a sorrendbe", + "error.page.status.invalid": "Kérlek add meg a megfelelő oldalstátuszt", + "error.page.undefined": "Az oldal nem tal\u00e1lhat\u00f3", + "error.page.update.permission": "Nincs jogosultságod a(z) \"{slug}\" oldal frissítéséhez", + + "error.section.files.max.plural": "Maximum {max} fájlt adhatsz hozzá a(z) \"{section}\" szekcióhoz", + "error.section.files.max.singular": "Nem adhatsz hozzá egynél több fájlt a(z) \"{section}\" szekcióhoz", + "error.section.files.min.plural": "A \"{section}\" szakasz legalább {min} fájlt igényel", + "error.section.files.min.singular": "A \"{section}\" szakasz legalább egy fájlt igényel", + + "error.section.pages.max.plural": "Maximum {max} oldalt adhatsz hozzá a(z) \"{section}\" szekcióhoz", + "error.section.pages.max.singular": "Nem adhatsz hozzá egynél több oldalt a(z) \"{section}\" szekcióhoz", + "error.section.pages.min.plural": "A \"{section}\" szakasz legalább {min} oldalt igényel", + "error.section.pages.min.singular": "A \"{section}\" szakasz legalább egy oldalt igényel", + + "error.section.notLoaded": "A(z) \"{name}\" szekció nem tölthető be", + "error.section.type.invalid": "A szekció típusa (\"{type}\") nem megfelelő", + + "error.site.changeTitle.empty": "A cím nem lehet üres", + "error.site.changeTitle.permission": "Nincs jogosultságod megváltoztatni az honlap címét", + "error.site.update.permission": "Nincs jogosultságod frissíteni a honlapot", + + "error.structure.validation": "There's an error on the \"{field}\" field in row {index}", + + "error.template.default.notFound": "Az alapértelmezett sablon nem létezik", + + "error.unexpected": "Váratlan hiba történt! További információért engedélyezd a hibakeresés módot: https://getkirby.com/docs/reference/system/options/debug", + + "error.user.changeEmail.permission": "Nincs jogosultságod megváltoztatni \"{name}\" felhasználó email-címét", + "error.user.changeLanguage.permission": "Nincs jogosultságod megváltoztatni \"{name}\" felhasználó nyelvi beállításait", + "error.user.changeName.permission": "Nincs jogosultságod megváltoztatni \"{name}\" felhasználó nevét", + "error.user.changePassword.permission": "Nincs jogosultságod megváltoztatni \"{name}\" felhasználó jelszavát", + "error.user.changeRole.lastAdmin": "Az egyedüli adminisztrátor szerepkörét nem lehet megváltoztatni", + "error.user.changeRole.permission": "Nincs jogosultságod megváltoztatni \"{name}\" felhasználó szerepkörét", + "error.user.changeRole.toAdmin": "Nincs jogosultságod előléptetni a felhasználót adminisztrátorrá", + "error.user.create.permission": "Nincs jogosultságod létrehozni ezt a felhasználót", + "error.user.delete": "A felhaszn\u00e1l\u00f3 nem t\u00f6r\u00f6lhet\u0151", + "error.user.delete.lastAdmin": "Nem t\u00f6r\u00f6lheted az egyetlen adminisztr\u00e1tort", + "error.user.delete.lastUser": "Nem törölheted az egyetlen felhasználót", + "error.user.delete.permission": "Nincs jogosults\u00e1god t\u00f6r\u00f6lni ezt a felhaszn\u00e1l\u00f3t", + "error.user.duplicate": "Már létezik felhasználó \"{email}\" email-címmel", + "error.user.email.invalid": "Kérlek adj meg egy valós email-címet", + "error.user.language.invalid": "Kérlek add meg a megfelelő nyelvi beállítást", + "error.user.notFound": "A felhaszn\u00e1l\u00f3 nem tal\u00e1lhat\u00f3", + "error.user.password.excessive": "Please enter a valid password. Passwords must not be longer than 1000 characters.", + "error.user.password.invalid": "Kérlek adj meg egy megfelelő jelszót. A jelszónak legalább 8 karakter hosszúságúnak kell lennie.", + "error.user.password.notSame": "K\u00e9rlek er\u0151s\u00edtsd meg a jelsz\u00f3t", + "error.user.password.undefined": "A felhasználónak nincs jelszó megadva", + "error.user.password.wrong": "Hibás jelszó", + "error.user.role.invalid": "Kérlek adj meg egy megfelelő szerepkört", + "error.user.undefined": "A felhasználó nem található", + "error.user.update.permission": "Nincs jogosultságod frissíteni \"{name}\" felhasználó adatait", + + "error.validation.accepted": "Kérlek erősítsd meg", + "error.validation.alpha": "Kérlek csak kis betűket használj (a-z)", + "error.validation.alphanum": "Kérlek csak kis betűket és számjegyeket használj (a-z, 0-9)", + "error.validation.anchor": "Please enter a correct link anchor", + "error.validation.between": "Kérlek egy \"{min}\" és \"{max}\" közötti értéket adj meg", + "error.validation.boolean": "Kérlek erősítsd meg vagy vesd el", + "error.validation.color": "Please enter a valid color in the {format} format", + "error.validation.contains": "Kérlek olyan értéket adj meg, amely tartalmazza ezt: \"{needle}\"", + "error.validation.date": "Kérlek megfelelő dátumot adj meg", + "error.validation.date.after": "Kérlek olyan dátumot adj meg, amely későbbi ennél: {date}", + "error.validation.date.before": "Kérlek olyan dátumot adj meg, amely korábbi ennél: {date}", + "error.validation.date.between": "Kérlek {min} és {max} közötti dátumot adj meg", + "error.validation.denied": "Kérlek vesd el", + "error.validation.different": "Az érték nem lehet \"{other}\"", + "error.validation.email": "Kérlek adj meg egy valós email-címet", + "error.validation.endswith": "Az értéknek erre kell végződnie: \"{end}\"", + "error.validation.filename": "Kérlek megfelelő fájlnevet adj meg", + "error.validation.in": "Kérlek adj meg egyet az alábbiak közül: ({in})", + "error.validation.integer": "Kérlek valós számot adj meg", + "error.validation.ip": "Kérlek megfelelő IP-címet adj meg", + "error.validation.less": "A megadott érték kevesebb legyen, mint {max}", + "error.validation.linkType": "The link type is not allowed", + "error.validation.match": "A megadott érték nem felel meg az elvárt struktúrának", + "error.validation.max": "A megadott érték egyenlő vagy kevesebb legyen, mint {max}", + "error.validation.maxlength": "Kérlek rövidebb értéket adj meg (legfeljebb {max} karakter)", + "error.validation.maxwords": "Kérlek ide legfeljebb {max} szót írj", + "error.validation.min": "A megadott érték egyenlő vagy nagyobb legyen, mint {min}", + "error.validation.minlength": "Kérlek hosszabb értéket adj meg (legalább {min} karakter)", + "error.validation.minwords": "Kérlek ide legalább {min} szót írj", + "error.validation.more": "A megadott érték legyen nagyobb, mint {min} ", + "error.validation.notcontains": "Kérlek olyan értéket adj meg, amely nem tartalmazza ezt: \"{needle}\" ", + "error.validation.notin": "Kérlek egyiket se használd az alábbiak közül: ({notIn})", + "error.validation.option": "Kérlek válassz egy megfelelő opciót", + "error.validation.num": "Kérlek adj meg egy megfelelő számot", + "error.validation.required": "Kérlek írj be valamit", + "error.validation.same": "Kérlek írd be: \"{other}\"", + "error.validation.size": "Az értéknek az alábbi méretűnek kell lennie: \"{size}\"", + "error.validation.startswith": "Az értéknek ezzel kell kezdődnie: \"{start}\"", + "error.validation.tel": "Please enter an unformatted phone number", + "error.validation.time": "Kérlek megfelelő időt adj meg", + "error.validation.time.after": "Kérlek olyan időpontot adj meg, amely későbbi ennél: {time}", + "error.validation.time.before": "Kérlek olyan időpontot adj meg, amely korábbi ennél: {time}", + "error.validation.time.between": "Kérlek {min} és {max} közötti időpontot adj meg", + "error.validation.uuid": "Please enter a valid UUID", + "error.validation.url": "Kérlek megfelelő URL-t adj meg", + + "expand": "Kinyitás", + "expand.all": "Összes kinyitása", + + "field.invalid": "The field is invalid", + "field.required": "Kötelező mező", + "field.blocks.changeType": "Típus megváltoztatása", + "field.blocks.code.name": "Kód", + "field.blocks.code.language": "Nyelv", + "field.blocks.code.placeholder": "A megjelenítendő kód …", + "field.blocks.delete.confirm": "Tényleg törölni szeretnéd ezt a blokkot?", + "field.blocks.delete.confirm.all": "Tényleg minden blokkot törölni szeretnél?", + "field.blocks.delete.confirm.selected": "Tényleg törölni szeretnéd a kijelölt blokkokat?", + "field.blocks.empty": "Még nincsenek blokkok", + "field.blocks.fieldsets.empty": "No fieldsets yet", + "field.blocks.fieldsets.label": "Kérlek válassz blokktípust …", + "field.blocks.fieldsets.paste": "Press {{ shortcut }} to import layouts/blocks from your clipboard Only those allowed in the current field will get inserted.", + "field.blocks.gallery.name": "Galéria", + "field.blocks.gallery.images.empty": "Még nincsenek képek", + "field.blocks.gallery.images.label": "Képek", + "field.blocks.heading.level": "Szint", + "field.blocks.heading.name": "Címsor", + "field.blocks.heading.text": "Szöveg", + "field.blocks.heading.placeholder": "Címsor …", + "field.blocks.image.alt": "Alternatív szöveg", + "field.blocks.image.caption": "Képaláírás", + "field.blocks.image.crop": "Körülvágás", + "field.blocks.image.link": "Link", + "field.blocks.image.location": "A kép helye", + "field.blocks.image.location.internal": "This website", + "field.blocks.image.location.external": "External source", + "field.blocks.image.name": "Kép", + "field.blocks.image.placeholder": "Kép kiválasztása", + "field.blocks.image.ratio": "Képarány", + "field.blocks.image.url": "Kép URL-je", + "field.blocks.line.name": "Vonal", + "field.blocks.list.name": "Lista", + "field.blocks.markdown.name": "Markdown", + "field.blocks.markdown.label": "Szöveg", + "field.blocks.markdown.placeholder": "Markdown …", + "field.blocks.quote.name": "Idézet", + "field.blocks.quote.text.label": "Szöveg", + "field.blocks.quote.text.placeholder": "Idézet szövege …", + "field.blocks.quote.citation.label": "Idézet szerzője", + "field.blocks.quote.citation.placeholder": "Szerző …", + "field.blocks.text.name": "Szöveg", + "field.blocks.text.placeholder": "Szöveg …", + "field.blocks.video.autoplay": "Autoplay", + "field.blocks.video.caption": "Képaláírás", + "field.blocks.video.controls": "Controls", + "field.blocks.video.location": "A kép helye", + "field.blocks.video.loop": "Loop", + "field.blocks.video.muted": "Muted", + "field.blocks.video.name": "Videó", + "field.blocks.video.placeholder": "Videó URL-jének megadása", + "field.blocks.video.poster": "Poster", + "field.blocks.video.preload": "Preload", + "field.blocks.video.url.label": "Videó URL", + "field.blocks.video.url.placeholder": "https://youtube.com/?v=", + + "field.files.empty": "Nincs fálj kiválasztva", + + "field.layout.change": "Change layout", + "field.layout.delete": "Elrendezés törlése", + "field.layout.delete.confirm": "Tényleg törölni szeretnéd ezt az elrendezést?", + "field.layout.delete.confirm.all": "Do you really want to delete all layouts?", + "field.layout.empty": "Még nincsenek sorok", + "field.layout.select": "Válassz elrendezést", + + "field.object.empty": "No information yet", + + "field.pages.empty": "Nincs oldal kiválasztva", + + "field.structure.delete.confirm": "Biztos t\u00f6r\u00f6lni szeretn\u00e9d ezt a bejegyz\u00e9st?", + "field.structure.delete.confirm.all": "Do you really want to delete all entries?", + "field.structure.empty": "Nincs m\u00e9g bejegyz\u00e9s", + + "field.users.empty": "Nincs felhasználó kiválasztva", + + "fields.empty": "No fields yet", + + "file": "Fájl", + "file.blueprint": "Ehhez a fájlhoz még nem tartozik oldalsablon. Itt hozhatod létre: /site/blueprints/files/{blueprint}.yml", + "file.changeTemplate": "Sablon módosítása", + "file.changeTemplate.notice": "Changing the file's template will remove content for fields that don't match in type. If the new template defines certain rules, e.g. image dimensions, those will also be applied irreversibly. Use with caution.", + "file.delete.confirm": "Biztos törölni akarod ezt a fájlt:
{filename}?", + "file.focus.placeholder": "Set focal point", + "file.focus.reset": "Remove focal point", + "file.focus.title": "Focus", + "file.sort": "Sorrend megváltoztatása", + + "files": "Fájlok", + "files.empty": "Még nincsenek fájlok", + + "filter": "Filter", + + "hide": "Elrejtés", + "hour": "Óra", + "hue": "Hue", + "import": "Importálás", + "info": "Info", + "insert": "Beilleszt", + "insert.after": "Beszúrás mögé", + "insert.before": "Beszúrás elé", + "install": "Telepítés", + + "installation": "Telepítés", + "installation.completed": "A panel sikeresen telepítve", + "installation.disabled": "A panel telepítője alapértelmezés szerint le van tiltva a nyilvános szervereken. Kérlek, futtassd a telepítőt egy helyi gépen vagy engedélyezze a panel.install opcióval.", + "installation.issues.accounts": "A /site/accounts mappa nem létezik, vagy nem írható", + "installation.issues.content": "A /content mappa nem létezik vagy nem írható", + "installation.issues.curl": "A CURL bővítmény engedélyezése szükséges", + "installation.issues.headline": "A panel telepítése sikertelen", + "installation.issues.mbstring": "Az MB String bővítmény engedélyezése szükséges", + "installation.issues.media": "A /media mappa nem létezik vagy nem írható", + "installation.issues.php": "Bizonyosodj meg róla, hogy az általad használt PHP-verzió PHP 8+", + "installation.issues.sessions": "A /site/sessions könyvtár nem létezik vagy nem írható", + + "language": "Nyelv", + "language.code": "Kód", + "language.convert": "Alapértelmezettnek jelölés", + "language.convert.confirm": "

Tényleg az alaőértelmezett nyelvre szeretnéd konvertálni ezt: {name}? Ez a művelet nem vonható vissza.

Ha{name} olyat is tartalmaz, amelynek nincs megfelelő fordítása, a honlapod egyes részei az új alapértelmezett nyelv hiányosságai miatt üresek maradhatnak.

", + "language.create": "Új nyelv hozzáadása", + "language.default": "Alapértelmezett nyelv", + "language.delete.confirm": "Tényleg törölni szeretnéd a(z) {name} nyelvet, annak minden fordításával együtt? Ez a művelet nem vonható vissza!", + "language.deleted": "A nyelv törölve lett", + "language.direction": "Olvasási irány", + "language.direction.ltr": "Balról jobbra", + "language.direction.rtl": "Jobbról balra", + "language.locale": "PHP locale sztring", + "language.locale.warning": "Egyedi nyelvi készletet használsz. Kérlek módosítsd a nyelvhez tartozó fájlt az alábbi mappában: /site/languages", + "language.name": "Név", + "language.secondary": "Secondary language", + "language.settings": "Language settings", + "language.updated": "A nyelv frissítve lett", + "language.variables": "Language variables", + "language.variables.empty": "No translations yet", + + "language.variable.delete.confirm": "Do you really want to delete the variable for {key}?", + "language.variable.key": "Key", + "language.variable.notFound": "The variable could not be found", + "language.variable.value": "Value", + + "languages": "Nyelvek", + "languages.default": "Alapértelmezett nyelv", + "languages.empty": "Nincsnek még nyelvek", + "languages.secondary": "Másodlagos nyelvek", + "languages.secondary.empty": "Nincsnek még másodlagos nyelvek", + + "license": "Kirby licenc", + "license.activate": "Activate it now", + "license.activate.label": "Please activate your license", + "license.activate.domain": "Your license will be activated for {host}.", + "license.activate.local": "You are about to activate your Kirby license for your local domain {host}. If this site will be deployed to a public domain, please activate it there instead. If {host} is the domain you want to use your license for, please continue.", + "license.activated": "Activated", + "license.buy": "Licenc vásárlása", + "license.code": "Kód", + "license.code.help": "You received your license code after the purchase via email. Please copy and paste it here.", + "license.code.label": "Kérlek írd be a licenc-kódot", + "license.status.active.info": "Includes new major versions until {date}", + "license.status.active.label": "Valid license", + "license.status.demo.info": "This is a demo installation", + "license.status.demo.label": "Demo", + "license.status.inactive.info": "Renew license to update to new major versions", + "license.status.inactive.label": "No new major versions", + "license.status.legacy.bubble": "Ready to renew your license?", + "license.status.legacy.info": "Your license does not cover this version", + "license.status.legacy.label": "Please renew your license", + "license.status.missing.bubble": "Ready to launch your site?", + "license.status.missing.info": "No valid license", + "license.status.missing.label": "Please activate your license", + "license.manage": "Manage your licenses", + "license.purchased": "Purchased", + "license.success": "Köszönjük, hogy támogatod a Kirby-t", + "license.unregistered.label": "Unregistered", + + "link": "Link", + "link.text": "Link szövege", + + "loading": "Betöltés", + + "lock.unsaved": "Nem mentett változások", + "lock.unsaved.empty": "Nincsenek nem mentett változások", + "lock.isLocked": "Unsaved changes by {email}", + "lock.unlock": "Kinyit", + "lock.unlock.submit": "Unlock and overwrite unsaved changes by {email}", + "lock.isUnlocked": "Was unlocked by another user", + + "login": "Bejelentkezés", + "login.code.label.login": "Bejelentkezéshez szükséges kód", + "login.code.label.password-reset": "Jelszóvisszaállításhoz szükséges kód", + "login.code.placeholder.email": "000 000", + "login.code.placeholder.totp": "000000", + "login.code.text.email": "Amennyiben az email-címed létezik a rendszerben, a kódot oda küldjük el.", + "login.code.text.totp": "Please enter the one‑time code from your authenticator app.", + "login.email.login.body": "Helló {user.nameOrEmail},\n\nNemrégiben bejelentkezési kódot igényeltél a(z) {site} Paneljéhez.\nAz alábbi kód {timeout} percig lesz érvényes:\n\n{code}\n\nHa nem te igényelted a kódot, kérlek hagyd figyelmen kívül ezt az emailt, kérdések esetén pedig vedd fel a kapcsolatot az oldal Adminisztrátorával.\nBiztonsági okokból kérjük NE továbbítsd ezt az emailt.", + "login.email.login.subject": "Bejelentkezési kódod", + "login.email.password-reset.body": "Helló {user.nameOrEmail},\n\nNemrégiben jelszóvisszaállítási kódot igényeltél a(z) {site} Paneljéhez.\nAz alábbi jelszóvisszaállítási kód {timeout} percig lesz érvényes:\n\n{code}\n\nHa nem te igényelted a jelszóvisszaállítási kódot, kérlek hagyd figyelmen kívül ezt az emailt, kérdések esetén pedig vedd fel a kapcsolatot az oldal Adminisztrátorával.\nBiztonsági okokból kérjük NE továbbítsd ezt az emailt.", + "login.email.password-reset.subject": "Jelszóvisszaállítási kódod", + "login.remember": "Maradjak bejelentkezve", + "login.reset": "Jelszó visszaállítása", + "login.toggleText.code.email": "Bejelentkezés emaillel", + "login.toggleText.code.email-password": "Bejelentkezés jelszóval", + "login.toggleText.password-reset.email": "Elfelejtetted a jelszavad?", + "login.toggleText.password-reset.email-password": "← Vissza a bejelentkezéshez", + "login.totp.enable.option": "Set up one‑time codes", + "login.totp.enable.intro": "Authenticator apps can generate one‑time codes that are used as a second factor when signing into your account.", + "login.totp.enable.qr.label": "1. Scan this QR code", + "login.totp.enable.qr.help": "Unable to scan? Add the setup key {secret} manually to your authenticator app.", + "login.totp.enable.confirm.headline": "2. Confirm with generated code", + "login.totp.enable.confirm.text": "Your app generates a new one‑time code every 30 seconds. Enter the current code to complete the setup:", + "login.totp.enable.confirm.label": "Current code", + "login.totp.enable.confirm.help": "After this setup, we will ask you for a one‑time code every time you log in.", + "login.totp.enable.success": "One‑time codes enabled", + "login.totp.disable.option": "Disable one‑time codes", + "login.totp.disable.label": "Enter your password to disable one‑time codes", + "login.totp.disable.help": "In the future, a different second factor like a login code sent via email will be requested when you log in. You can always set up one‑time codes again later.", + "login.totp.disable.admin": "

This will disable one‑time codes for {user}.

In the future, a different second factor like a login code sent via email will be requested when they log in. {user} can set up one‑time codes again after their next login.

", + "login.totp.disable.success": "One‑time codes disabled", + + "logout": "Kijelentkezés", + + "merge": "Merge", + "menu": "Menü", + "meridiem": "DE/DU", + "mime": "Média-típus", + "minutes": "Perc", + + "month": "Hónap", + "months.april": "\u00e1prilis", + "months.august": "augusztus", + "months.december": "december", + "months.february": "február", + "months.january": "janu\u00e1r", + "months.july": "j\u00falius", + "months.june": "j\u00fanius", + "months.march": "m\u00e1rcius", + "months.may": "m\u00e1jus", + "months.november": "november", + "months.october": "okt\u00f3ber", + "months.september": "szeptember", + + "more": "Több", + "move": "Move", + "name": "Név", + "next": "Következő", + "night": "Night", + "no": "nem", + "off": "ki", + "on": "be", + "open": "Megnyitás", + "open.newWindow": "Megnyitás új ablakban", + "option": "Option", + "options": "Beállítások", + "options.none": "Nincsnek beállítások", + "options.all": "Show all {count} options", + + "orientation": "Tájolás", + "orientation.landscape": "Fekvő", + "orientation.portrait": "Álló", + "orientation.square": "Négyzetes", + + "page": "Oldal", + "page.blueprint": "Ehhez az oldalhoz még nem tartozik oldalsablon. Itt hozhatod létre: /site/blueprints/pages/{blueprint}.yml", + "page.changeSlug": "URL v\u00e1ltoztat\u00e1sa", + "page.changeSlug.fromTitle": "L\u00e9trehoz\u00e1s c\u00edmb\u0151l", + "page.changeStatus": "Állapot módosítása", + "page.changeStatus.position": "Kérlek válaszd ki a pozíciót", + "page.changeStatus.select": "Új állapot kiválasztása", + "page.changeTemplate": "Sablon módosítása", + "page.changeTemplate.notice": "Changing the page's template will remove content for fields that don't match in type. Use with caution.", + "page.create": "Create as {status}", + "page.delete.confirm": "Biztos vagy benne, hogy törlöd az alábbi oldalt: {title}?", + "page.delete.confirm.subpages": "Ehhez az oldalhoz aloldalak tartoznak.
Az oldal törlésekor a hozzá tartozó aloldalak is törlődnek.", + "page.delete.confirm.title": "Megerősítéshez add meg az oldal címét", + "page.duplicate.appendix": "Másol", + "page.duplicate.files": "Fájlok másolása", + "page.duplicate.pages": "Oldalak másolása", + "page.move": "Move page", + "page.sort": "Sorrend megváltoztatása", + "page.status": "Állapot", + "page.status.draft": "Piszkozat", + "page.status.draft.description": "Ez az oldal jelenleg piszkozat és csak bejelentkezett szerkesztők számára, vagy egy titkos linken keresztül érhető el", + "page.status.listed": "Publikus", + "page.status.listed.description": "Az oldal mindenki számára elérhető", + "page.status.unlisted": "Nem listázott", + "page.status.unlisted.description": "Az oldal csak URL-en keresztül érhető el", + + "pages": "Oldalak", + "pages.empty": "Nincs még bejegyzés", + "pages.status.draft": "Piszkozatok", + "pages.status.listed": "Publikálva", + "pages.status.unlisted": "Nem listázott", + + "pagination.page": "Oldal", + + "password": "Jelsz\u00f3", + "paste": "Beillesztés", + "paste.after": "Beillesztés utána", + "paste.success": "{count} pasted!", + "pixel": "Pixel", + "plugin": "Plugin", + "plugins": "Pluginek", + "prev": "Előző", + "preview": "Előnézet", + "remove": "Eltávolítás", + "rename": "Átnevezés", + "renew": "Renew", + "replace": "Cser\u00e9l", + "replace.with": "Replace with", + "retry": "Próbáld újra", + "revert": "Visszavon\u00e1s", + "revert.confirm": "Tényleg törölni szeretnél minden nem mentett változtatást?", + + "role": "Szerepkör", + "role.admin.description": "Az adminisztrátornak minden joga van", + "role.admin.title": "Admin", + "role.all": "Összes", + "role.empty": "Nincsenek felhasználók ilyen szerepkörrel", + "role.description.placeholder": "Nincs leírás", + "role.nobody.description": "Ez a visszatérő szabály a nem rendelkező jogosultsághoz", + "role.nobody.title": "Senki", + + "save": "Ment\u00e9s", + "search": "Keresés", + "search.min": "A kereséshez írj be minimum {min} karaktert", + "search.all": "Show all {count} results", + "search.results.none": "Nincs találat", + + "section.invalid": "The section is invalid", + "section.required": "Ez a szakasz kötelező", + + "security": "Security", + "select": "Kiválasztás", + "server": "Szerver", + "settings": "Beállítások", + "show": "Mutat", + "site.blueprint": "Ehhez a weblaphoz még nem tartozik oldalsablon. Itt hozhatod létre: /site/blueprints/site.yml", + "size": "Méret", + "slug": "URL n\u00e9v", + "sort": "Rendezés", + "sort.drag": "Drag to sort …", + "split": "Split", + + "stats.empty": "No reports", + "status": "Állapot", + + "system.info.copy": "Copy info", + "system.info.copied": "System info copied", + "system.issues.content": "The content folder seems to be exposed", + "system.issues.eol.kirby": "Your installed Kirby version has reached end-of-life and will not receive further security updates", + "system.issues.eol.plugin": "Your installed version of the { plugin } plugin is has reached end-of-life and will not receive further security updates", + "system.issues.eol.php": "Your installed PHP release { release } has reached end-of-life and will not receive further security updates", + "system.issues.debug": "Debugging must be turned off in production", + "system.issues.git": "The .git folder seems to be exposed", + "system.issues.https": "We recommend HTTPS for all your sites", + "system.issues.kirby": "The kirby folder seems to be exposed", + "system.issues.site": "The site folder seems to be exposed", + "system.issues.vulnerability.kirby": "Your installation might be affected by the following vulnerability ({ severity } severity): { description }", + "system.issues.vulnerability.plugin": "Your installation might be affected by the following vulnerability in the { plugin } plugin ({ severity } severity): { description }", + "system.updateStatus": "Update status", + "system.updateStatus.error": "Could not check for updates", + "system.updateStatus.not-vulnerable": "No known vulnerabilities", + "system.updateStatus.security-update": "Free security update { version } available", + "system.updateStatus.security-upgrade": "Upgrade { version } with security fixes available", + "system.updateStatus.unreleased": "Unreleased version", + "system.updateStatus.up-to-date": "Up to date", + "system.updateStatus.update": "Free update { version } available", + "system.updateStatus.upgrade": "Upgrade { version } available", + + "tel": "Phone", + "tel.placeholder": "+49123456789", + "template": "Sablon", + "title": "Cím", + "today": "Ma", + + "toolbar.button.clear": "Clear formatting", + "toolbar.button.code": "Kód", + "toolbar.button.bold": "F\u00e9lk\u00f6v\u00e9r sz\u00f6veg", + "toolbar.button.email": "Email", + "toolbar.button.headings": "Címsor", + "toolbar.button.heading.1": "Címsor 1", + "toolbar.button.heading.2": "Címsor 2", + "toolbar.button.heading.3": "Címsor 3", + "toolbar.button.heading.4": "Címsor 4", + "toolbar.button.heading.5": "Címsor 5", + "toolbar.button.heading.6": "Címsor 6", + "toolbar.button.italic": "Dőlt szöveg", + "toolbar.button.file": "Fájl", + "toolbar.button.file.select": "Válassz egy fájlt", + "toolbar.button.file.upload": "Fájl feltöltése", + "toolbar.button.link": "Link", + "toolbar.button.paragraph": "Bekezdés", + "toolbar.button.strike": "Áthúzott szöveg", + "toolbar.button.sub": "Subscript", + "toolbar.button.sup": "Superscript", + "toolbar.button.ol": "Rendezett lista", + "toolbar.button.underline": "Aláhúzott szöveg", + "toolbar.button.ul": "Rendezetlen lista", + + "translation.author": "A Kirby csapata", + "translation.direction": "ltr", + "translation.name": "Magyar", + "translation.locale": "hu_HU", + + "type": "Type", + + "upload": "Feltöltés", + "upload.error.cantMove": "A feltöltött fájlt nem sikerült áthelyezni", + "upload.error.cantWrite": "Hiba a fájl lemezre írása közben", + "upload.error.default": "A fájlt nem sikerült feltölteni", + "upload.error.extension": "A fájlfeltöltés egy kiterjesztés miatt megszakadt", + "upload.error.formSize": "A feltöltendő fájl mérete nagyobb, mint az űrlap MAX_FILE_SIZE szabályában beállított érték", + "upload.error.iniPostSize": "A feltöltendő fájl mérete nagyobb, mint a php.ini post_max_size szabályában beállított érték", + "upload.error.iniSize": "A feltöltendő fájl mérete nagyobb, mint a php.ini upload_max_filesize szabályában beállított érték", + "upload.error.noFile": "Nem lett fájl feltöltve", + "upload.error.noFiles": "Nem lettek fájlok feltöltve", + "upload.error.partial": "A fájl feltöltése csak részben sikerült", + "upload.error.tmpDir": "Hiányzik egy átmeneti mappa", + "upload.errors": "Hiba", + "upload.progress": "Feltöltés...", + + "url": "Url", + "url.placeholder": "https://pelda.hu", + + "user": "Felhasználó", + "user.blueprint": "További szakaszokat és mezőket adhatsz meg ehhez a felhasználói szerepkörhöz itt: /site/blueprints/users/{blueprint}.yml", + "user.changeEmail": "Email módosítása", + "user.changeLanguage": "Nyelv módosítása", + "user.changeName": "Felhasználó átnevezése", + "user.changePassword": "Jelszó módosítása", + "user.changePassword.new": "Új jelszó", + "user.changePassword.new.confirm": "Az új jelszó megerősítése", + "user.changeRole": "Szerepkör módosítása", + "user.changeRole.select": "Új szerepkör kiválasztása", + "user.create": "Új felhasználó hozzáadása", + "user.delete": "Felhasználó törlése", + "user.delete.confirm": "Biztos törlöd ezt a felhasználót:
{email}?", + + "users": "Felhasználók", + + "version": "Kirby verzi\u00f3", + "version.current": "Current version", + "version.latest": "Latest version", + "versionInformation": "Version information", + + "view.account": "Fi\u00f3kod", + "view.installation": "Telep\u00edt\u00e9s", + "view.languages": "Nyelvek", + "view.resetPassword": "Jelszó visszaállítása", + "view.site": "Weboldal", + "view.system": "Rendszer", + "view.users": "Felhaszn\u00e1l\u00f3k", + + "welcome": "Üdvözlünk", + "year": "Év", + "yes": "igen" +} diff --git a/kirby/i18n/translations/id.json b/kirby/i18n/translations/id.json new file mode 100644 index 0000000..e4af95b --- /dev/null +++ b/kirby/i18n/translations/id.json @@ -0,0 +1,730 @@ +{ + "account.changeName": "Ubah nama Anda", + "account.delete": "Hapus akun Anda", + "account.delete.confirm": "Anda yakin menghapus akun? Anda akan dikeluarkan segera. Akun Anda tidak dapat dipulihkan.", + + "activate": "Activate", + "add": "Tambah", + "alpha": "Alpha", + "author": "Penulis", + "avatar": "Gambar profil", + "back": "Kembali", + "cancel": "Batal", + "change": "Ubah", + "close": "Tutup", + "changes": "Perubahan", + "confirm": "Oke", + "collapse": "Lipat", + "collapse.all": "Lipat Semua", + "color": "Warna", + "coordinates": "Koordinat", + "copy": "Salin", + "copy.all": "Salin semua", + "copy.success": "{count} disalin!", + "create": "Buat", + "custom": "Kustom", + + "date": "Tanggal", + "date.select": "Pilih tanggal", + + "day": "Hari", + "days.fri": "Jum", + "days.mon": "Sen", + "days.sat": "Sab", + "days.sun": "Min", + "days.thu": "Kam", + "days.tue": "Sel", + "days.wed": "Rab", + + "debugging": "Debugging", + + "delete": "Hapus", + "delete.all": "Hapus semua", + + "dialog.fields.empty": "Dialog ini tidak memiliki bidang", + "dialog.files.empty": "Tidak ada berkas untuk dipilih", + "dialog.pages.empty": "Tidak ada halaman untuk dipilih", + "dialog.text.empty": "Dialog ini tidak mendefinisikan teks apa pun", + "dialog.users.empty": "Tidak ada pengguna untuk dipilih", + + "dimensions": "Dimensi", + "disable": "Disable", + "disabled": "Dimatikan", + "discard": "Buang", + + "drawer.fields.empty": "Drawer ini tidak memiliki bidang", + + "domain": "Domain", + "download": "Unduh", + "duplicate": "Duplikasi", + + "edit": "Sunting", + + "email": "Surel", + "email.placeholder": "surel@contoh.com", + + "enter": "Masuk", + "entries": "Entri", + "entry": "Entri", + + "environment": "Lingkungan", + + "error": "Kesalahan", + "error.access.code": "Kode tidak valid", + "error.access.login": "Upaya masuk tidak valid", + "error.access.panel": "Anda tidak diizinkan mengakses panel", + "error.access.view": "Anda tidak diizinkan mengakses bagian panel ini", + + "error.avatar.create.fail": "Gambar profil tidak dapat diunggah", + "error.avatar.delete.fail": "Gambar profil tidak dapat dihapus", + "error.avatar.dimensions.invalid": "Pastikan lebar dan tinggi gambar profil di bawah 3000 piksel", + "error.avatar.mime.forbidden": "Gambar profil harus berupa berkas JPEG atau PNG", + + "error.blueprint.notFound": "Cetak biru \"{name}\" tidak dapat dimuat", + + "error.blocks.max.plural": "Anda tidak boleh menambahkan lebih dari {max} blok", + "error.blocks.max.singular": "Anda tidak boleh menambahkan lebih dari satu blok", + "error.blocks.min.plural": "Anda setidaknya menambahkan {min} blok", + "error.blocks.min.singular": "Anda setidaknya menambahkan satu blok", + "error.blocks.validation": "Ada kesalahan di bidang \"{field}\" di blok {index} menggunakan \"{fieldset}\" tipe blok", + + "error.cache.type.invalid": "Tipe tembolok tidak valid \"{type}\"", + + "error.email.preset.notFound": "Surel \"{name}\" tidak dapat ditemukan", + + "error.field.converter.invalid": "Konverter \"{converter}\" tidak valid", + "error.field.type.missing": "Bidang \"{ name }\": Tipe bidang \"{ type }\" tidak ada", + + "error.file.changeName.empty": "Nama harus diisi", + "error.file.changeName.permission": "Anda tidak diizinkan mengubah nama berkas \"{filename}\"", + "error.file.changeTemplate.invalid": "Templat untuk berkas \"{id}\" tidak dapat diubah menjadi \"{template}\" (valid: \"{blueprints}\")", + "error.file.changeTemplate.permission": "Anda tidak diizinkan mengubah templat untuk berkas \"{id}\"", + + "error.file.duplicate": "Berkas dengan nama \"{filename}\" sudah ada", + "error.file.extension.forbidden": "Ekstensi \"{extension}\" tidak diizinkan", + "error.file.extension.invalid": "Ekstensi tidak valid: {extension}", + "error.file.extension.missing": "Berkas \"{filename}\" harus memiliki ekstensi", + "error.file.maxheight": "Tinggi gambar tidak boleh melebihi {height} piksel", + "error.file.maxsize": "Berkas terlalu besar", + "error.file.maxwidth": "Lebar gambar tidak boleh melebihi {width} piksel", + "error.file.mime.differs": "Berkas yang diunggah harus memiliki tipe mime sama \"{mime}\"", + "error.file.mime.forbidden": "Media dengan tipe mime \"{mime}\" tidak diizinkan", + "error.file.mime.invalid": "Tipe mime tidak valid: {mime}", + "error.file.mime.missing": "Tipe media untuk \"{filename}\" tidak dapat dideteksi", + "error.file.minheight": "Tinggi gambar setidaknya {height} piksel", + "error.file.minsize": "Berkas terlalu kecil", + "error.file.minwidth": "Lebar gambar setidaknya {width} piksel", + "error.file.name.unique": "Nama berkas harus unik", + "error.file.name.missing": "Nama berkas harus diisi", + "error.file.notFound": "Berkas \"{filename}\" tidak dapat ditemukan", + "error.file.orientation": "Orientasi gambar harus \"{orientation}\"", + "error.file.type.forbidden": "Anda tidak diizinkan mengunggah berkas dengan tipe {type}", + "error.file.type.invalid": "Tipe berkas tidak valid: {type}", + "error.file.undefined": "Berkas tidak dapat ditemukan", + + "error.form.incomplete": "Pastikan semua bidang telah diisi dengan benar…", + "error.form.notSaved": "Formulir tidak dapat disimpan", + + "error.language.code": "Masukkan kode bahasa yang valid", + "error.language.duplicate": "Bahasa sudah ada", + "error.language.name": "Masukkan nama bahasa yang valid", + "error.language.notFound": "Bahasa tidak ditemukan", + + "error.layout.validation.block": "Ada kesalahan pada bidang \"{field}\" di blok {blockIndex} menggunakan tipe blok \"{fieldset}\" di tata letak {layoutIndex}", + "error.layout.validation.settings": "Ada kesalahan di pengaturan tata letak {index}", + + "error.license.domain": "The domain for the license is missing", + "error.license.email": "Masukkan surel yang valid", + "error.license.format": "Please enter a valid license code", + "error.license.verification": "Lisensi tidak dapat diverifikasi", + + "error.login.totp.confirm.invalid": "Kode tidak valid", + "error.login.totp.confirm.missing": "Please enter the current code", + + "error.object.validation": "Ada kesalahan di bidang \"{label}\":\n{message}", + + "error.offline": "Panel saat ini luring", + + "error.page.changeSlug.permission": "Anda tidak diizinkan mengubah akhiran URL untuk \"{slug}\"", + "error.page.changeSlug.reserved": "Alur halaman-halaman level atas tidak boleh diawali dengan \"{path}\"", + "error.page.changeStatus.incomplete": "Halaman memiliki kesalahan dan tidak dapat diterbitkan", + "error.page.changeStatus.permission": "Status halaman ini tidak dapat diubah", + "error.page.changeStatus.toDraft.invalid": "Halaman \"{slug}\" tidak dapat dikonversi menjadi draf", + "error.page.changeTemplate.invalid": "Templat untuk halaman \"{slug}\" tidak dapat diubah", + "error.page.changeTemplate.permission": "Anda tidak diizinkan mengubah templat dari \"{slug}\"", + "error.page.changeTitle.empty": "Judul harus diisi", + "error.page.changeTitle.permission": "Anda tidak diizinkan mengubah judul dari \"{slug}\"", + "error.page.create.permission": "Anda tidak diizinkan membuat \"{slug}\"", + "error.page.delete": "Halaman \"{slug}\" tidak dapat dihapus", + "error.page.delete.confirm": "Masukkan judul halaman untuk mengonfirmasi", + "error.page.delete.hasChildren": "Halaman ini memiliki sub-halaman dan tidak dapat dihapus", + "error.page.delete.permission": "Anda tidak diizinkan menghapus \"{slug}\"", + "error.page.draft.duplicate": "Draf halaman dengan akhiran URL \"{slug}\" sudah ada", + "error.page.duplicate": "Halaman dengan akhiran URL \"{slug}\" sudah ada", + "error.page.duplicate.permission": "Anda tidak diizinkan menduplikasi \"{slug}\"", + "error.page.move.ancestor": "Halaman tidak dapat dipindahkan ke dirinya sendiri", + "error.page.move.directory": "Direktori halaman tidak dapat dipindahkan", + "error.page.move.duplicate": "Suatu sub halaman dengan akhiran URL \"{slug}\" sudah ada", + "error.page.move.notFound": "Halaman yang dipindahkan tidak dapat ditemukan", + "error.page.move.permission": "Anda tidak diizinkan memindahkan \"{slug}\"", + "error.page.move.template": "Templat \"{template}\" tidak dapat diterima sebagai sub halaman dari \"{parent}\"", + "error.page.notFound": "Halaman \"{slug}\" tidak dapat ditemukan", + "error.page.num.invalid": "Masukkan nomor urut yang valid. Nomor tidak boleh negatif.", + "error.page.slug.invalid": "Masukkan akhiran URL yang valid", + "error.page.slug.maxlength": "Panjang slug harus kurang dari \"{length}\" karakter", + "error.page.sort.permission": "Halaman \"{slug}\" tidak dapat diurutkan", + "error.page.status.invalid": "Atur status halaman yang valid", + "error.page.undefined": "Halaman tidak dapat ditemukan", + "error.page.update.permission": "Anda tidak diizinkan memperbaharui \"{slug}\"", + + "error.section.files.max.plural": "Anda hanya boleh menambahkan maksimal {max} berkas ke bagian \"{section}\"", + "error.section.files.max.singular": "Anda hanya boleh menambahkan satu berkas ke bagian \"{section}\"", + "error.section.files.min.plural": "Bagian \"{section}\" setidaknya memiliki {min} berkas", + "error.section.files.min.singular": "Bagian \"{section}\" setidaknya memiliki satu berkas", + + "error.section.pages.max.plural": "Anda hanya boleh menambahkan maksimal {max} halaman ke bagian \"{section}\"", + "error.section.pages.max.singular": "Anda hanya boleh menambahkan satu halaman ke bagian \"{section}\"", + "error.section.pages.min.plural": "Bagian \"{section}\" setidaknya memiliki {min} halaman", + "error.section.pages.min.singular": "Bagian \"{section}\" setidaknya memiliki satu halaman", + + "error.section.notLoaded": "Bagian \"{name}\" tidak dapat dimuat", + "error.section.type.invalid": "Tipe bagian \"{type}\" tidak valid", + + "error.site.changeTitle.empty": "Judul harus diisi", + "error.site.changeTitle.permission": "Anda tidak diizinkan mengubah judul situs", + "error.site.update.permission": "Anda tidak diizinkan memperbaharui situs", + + "error.structure.validation": "Ada kesalahan pada bidang \"{field}\" di baris {index}", + + "error.template.default.notFound": "Templat bawaan tidak ada", + + "error.unexpected": "Kesalahan tidak terduga terjadi! Hidupkan mode debug untuk informasi lebih lanjut: https://getkirby.com/docs/reference/system/options/debug", + + "error.user.changeEmail.permission": "Anda tidak diizinkan mengubah surel dari pengguna \"{name}\"", + "error.user.changeLanguage.permission": "Anda tidak diizinkan mengubah bahasa dari pengguna \"{name}\"", + "error.user.changeName.permission": "Anda tidak diizinkan mengubah nama dari pengguna \"{name}\"", + "error.user.changePassword.permission": "Anda tidak diizinkan mengubah sandi dari pengguna \"{name}\"", + "error.user.changeRole.lastAdmin": "Peran dari admin satu-satunya tidak dapat diubah", + "error.user.changeRole.permission": "Anda tidak diizinkan mengubah peran dari pengguna \"{name}\"", + "error.user.changeRole.toAdmin": "Anda tidak diizinkan mempromosikan seseorang menjadi admin", + "error.user.create.permission": "Anda tidak diizinkan membuat pengguna ini", + "error.user.delete": "Pengguna \"{nama}\" tidak dapat dihapus", + "error.user.delete.lastAdmin": "Admin satu-satunya tidak dapat dihapus", + "error.user.delete.lastUser": "Pengguna satu-satunya tidak dapat dihapus", + "error.user.delete.permission": "Anda tidak diizinkan menghapus pengguna \"{name}\"", + "error.user.duplicate": "Pengguna dengan surel \"{email}\" sudah ada", + "error.user.email.invalid": "Masukkan surel yang valid", + "error.user.language.invalid": "Masukkan bahasa yang valid", + "error.user.notFound": "Pengguna \"{name}\" tidak dapat ditemukan", + "error.user.password.excessive": "Masukkan sandi yang valid. Sandi tidak boleh lebih dari 1000 karakter.", + "error.user.password.invalid": "Masukkan sandi yang valid. Sandi setidaknya mengandung 8 karakter.", + "error.user.password.notSame": "Sandi tidak cocok", + "error.user.password.undefined": "Pengguna tidak memiliki sandi", + "error.user.password.wrong": "Kata sandi salah", + "error.user.role.invalid": "Masukkan peran yang valid", + "error.user.undefined": "Pengguna tidak dapat ditemukan", + "error.user.update.permission": "Anda tidak diizinkan memperbaharui pengguna \"{name}\"", + + "error.validation.accepted": "Mohon konfirmasi", + "error.validation.alpha": "Masukkan hanya karakter a-z", + "error.validation.alphanum": "Masukkan hanya karakter a-z atau 0-9", + "error.validation.anchor": "Masukkan tautan yang valid", + "error.validation.between": "Masukkan nilai antara \"{min}\" dan \"{max}\"", + "error.validation.boolean": "Mohon konfirmasi atau tolak", + "error.validation.color": "Masukkan warna yang valid dalam format {format}", + "error.validation.contains": "Masukkan nilai yang mengandung \"{needle}\"", + "error.validation.date": "Masukkan tanggal yang valid", + "error.validation.date.after": "Masukkan tanggal setelah {date}", + "error.validation.date.before": "Masukkan tanggal sebelum {date}", + "error.validation.date.between": "Masukkan tanggal antara {min} dan {max}", + "error.validation.denied": "Mohon tolak", + "error.validation.different": "Nilai harus selain \"{other}\"", + "error.validation.email": "Masukkan surel yang valid", + "error.validation.endswith": "Nilai harus diakhiri dengan \"{end}\"", + "error.validation.filename": "Masukkan nama berkas yang valid", + "error.validation.in": "Masukkan satu dari berikut: ({in})", + "error.validation.integer": "Masukkan bilangan bulat yang valid", + "error.validation.ip": "Masukkan IP yang valid", + "error.validation.less": "Masukkan nilai kurang dari {max}", + "error.validation.linkType": "Tipe tautan tidak diizinkan", + "error.validation.match": "Nilai tidak cocok dengan pola yang semestinya", + "error.validation.max": "Masukkan nilai yang sama dengan atau kurang dari {max}", + "error.validation.maxlength": "Masukkan nilai yang lebih pendek. (maksimal {max} karakter)", + "error.validation.maxwords": "Masukkan tidak lebih dari {max} kata", + "error.validation.min": "Masukkan nilai yang sama dengan atau lebih dari {min}", + "error.validation.minlength": "Masukkan nilai yang lebih panjang. (minimal {min} karakter)", + "error.validation.minwords": "Masukkan setidaknya {min} kata", + "error.validation.more": "Masukkan nilai yang lebih besar dari {min}", + "error.validation.notcontains": "Masukkan nilai yang tidak mengandung \"{needle}\"", + "error.validation.notin": "Jangan masukkan satupun: ({notIn})", + "error.validation.option": "Pilih opsi yang valid", + "error.validation.num": "Masukkan nomor yang valid", + "error.validation.required": "Masukkan sesuatu", + "error.validation.same": "Masukkan \"{other}\"", + "error.validation.size": "Ukuran dari nilai harus \"{size}\"", + "error.validation.startswith": "Nilai harus diawali dengan \"{start}\"", + "error.validation.tel": "Masukkan nomor telepon tanpa format", + "error.validation.time": "Masukkan waktu yang valid", + "error.validation.time.after": "Masukkan waktu setelah {time}", + "error.validation.time.before": "Masukkan waktu sebelum {time}", + "error.validation.time.between": "Masukkan waktu antara {min} dan {max}", + "error.validation.uuid": "Masukkan UUID yang valid", + "error.validation.url": "Masukkan URL yang valid", + + "expand": "Luaskan", + "expand.all": "Luaskan Semua", + + "field.invalid": "Bidang tidak valid", + "field.required": "Bidang ini wajib", + "field.blocks.changeType": "Ubah tipe", + "field.blocks.code.name": "Kode", + "field.blocks.code.language": "Bahasa", + "field.blocks.code.placeholder": "Kode Anda …", + "field.blocks.delete.confirm": "Anda yakin menghapus blok ini?", + "field.blocks.delete.confirm.all": "Anda yakin menghapus semua blok?", + "field.blocks.delete.confirm.selected": "Anda yakin menghapus blok yang dipilih?", + "field.blocks.empty": "Belum ada blok", + "field.blocks.fieldsets.empty": "Belum ada set bidang", + "field.blocks.fieldsets.label": "Pilih tipe blok …", + "field.blocks.fieldsets.paste": "Press {{ shortcut }} to import layouts/blocks from your clipboard Only those allowed in the current field will get inserted.", + "field.blocks.gallery.name": "Galeri", + "field.blocks.gallery.images.empty": "Belum ada gambar", + "field.blocks.gallery.images.label": "Gambar", + "field.blocks.heading.level": "Level", + "field.blocks.heading.name": "Penajukan", + "field.blocks.heading.text": "Teks", + "field.blocks.heading.placeholder": "Penajukan …", + "field.blocks.image.alt": "Teks alternatif", + "field.blocks.image.caption": "Keterangan", + "field.blocks.image.crop": "Pangkas", + "field.blocks.image.link": "Tautan", + "field.blocks.image.location": "Lokasi", + "field.blocks.image.location.internal": "This website", + "field.blocks.image.location.external": "External source", + "field.blocks.image.name": "Gambar", + "field.blocks.image.placeholder": "Pilih gambar", + "field.blocks.image.ratio": "Rasio", + "field.blocks.image.url": "URL Gambar", + "field.blocks.line.name": "Line", + "field.blocks.list.name": "Daftar", + "field.blocks.markdown.name": "Markdown", + "field.blocks.markdown.label": "Teks", + "field.blocks.markdown.placeholder": "Markdown …", + "field.blocks.quote.name": "Kutipan", + "field.blocks.quote.text.label": "Teks", + "field.blocks.quote.text.placeholder": "Kutipan …", + "field.blocks.quote.citation.label": "Sitasi", + "field.blocks.quote.citation.placeholder": "oleh …", + "field.blocks.text.name": "Teks", + "field.blocks.text.placeholder": "Teks …", + "field.blocks.video.autoplay": "Autoplay", + "field.blocks.video.caption": "Deskripsi", + "field.blocks.video.controls": "Controls", + "field.blocks.video.location": "Lokasi", + "field.blocks.video.loop": "Loop", + "field.blocks.video.muted": "Muted", + "field.blocks.video.name": "Video", + "field.blocks.video.placeholder": "Masukkan URL video", + "field.blocks.video.poster": "Poster", + "field.blocks.video.preload": "Preload", + "field.blocks.video.url.label": "URL Video", + "field.blocks.video.url.placeholder": "https://youtube.com/?v=", + + "field.files.empty": "Belum ada berkas yang dipilih", + + "field.layout.change": "Change layout", + "field.layout.delete": "Hapus tata letak", + "field.layout.delete.confirm": "Anda yakin menghapus tata letak ini?", + "field.layout.delete.confirm.all": "Do you really want to delete all layouts?", + "field.layout.empty": "Belum ada baris", + "field.layout.select": "Pilih tata letak", + + "field.object.empty": "No information yet", + + "field.pages.empty": "Belum ada halaman yang dipilih", + + "field.structure.delete.confirm": "Anda yakin menghapus baris ini?", + "field.structure.delete.confirm.all": "Do you really want to delete all entries?", + "field.structure.empty": "Belum ada entri", + + "field.users.empty": "Belum ada pengguna yang dipilih", + + "fields.empty": "No fields yet", + + "file": "Berkas", + "file.blueprint": "This file has no blueprint yet. You can define the setup in /site/blueprints/files/{blueprint}.yml", + "file.changeTemplate": "Ubah templat", + "file.changeTemplate.notice": "Changing the file's template will remove content for fields that don't match in type. If the new template defines certain rules, e.g. image dimensions, those will also be applied irreversibly. Use with caution.", + "file.delete.confirm": "Anda yakin menghapus
{filename}?", + "file.focus.placeholder": "Set focal point", + "file.focus.reset": "Remove focal point", + "file.focus.title": "Focus", + "file.sort": "Ubah posisi", + + "files": "Berkas", + "files.empty": "Belum ada berkas", + + "filter": "Filter", + + "hide": "Sembunyikan", + "hour": "Jam", + "hue": "Hue", + "import": "Import", + "info": "Info", + "insert": "Sisipkan", + "insert.after": "Sisipkan setelah", + "insert.before": "Sisipkan sebelum", + "install": "Pasang", + + "installation": "Pemasangan", + "installation.completed": "Panel sudah dipasang", + "installation.disabled": "Pemasang panel dimatikan di server publik secara bawaan. Mohon jalankan di server lokal atau ubah opsi panel.install untuk menjalankan di server saat ini.", + "installation.issues.accounts": "Folder /site/accounts tidak ada atau tidak dapat ditulis", + "installation.issues.content": "Folder /content tidak ada atau tidak dapat ditulis", + "installation.issues.curl": "Ekstensi CURL diperlukan", + "installation.issues.headline": "Panel tidak dapat dipasang", + "installation.issues.mbstring": "Ekstensi MB String diperlukan", + "installation.issues.media": "Folder /media tidak ada atau tidak dapat ditulis", + "installation.issues.php": "Pastikan Anda menggunakan PHP 8+", + "installation.issues.sessions": "Folder /site/sessions tidak ada atau tidak dapat ditulis", + + "language": "Bahasa", + "language.code": "Kode", + "language.convert": "Atur sebagai bawaan", + "language.convert.confirm": "

Anda yakin mengubah {name} menjadi bahasa bawaan? Ini tidak dapat dibatalkan.

Jika {name} memiliki konten yang tidak diterjemahkan, tidak akan ada pengganti yang valid dan dapat menyebabkan beberapa bagian dari situs Anda menjadi kosong.

", + "language.create": "Tambah bahasa baru", + "language.default": "Bahasa bawaan", + "language.delete.confirm": "Anda yakin menghapus bahasa {name} termasuk semua terjemahannya? Ini tidak dapat dibatalkan!", + "language.deleted": "Bahasa sudah dihapus", + "language.direction": "Arah baca", + "language.direction.ltr": "Kiri ke kanan", + "language.direction.rtl": "Kanan ke kiri", + "language.locale": "String \"PHP locale\"", + "language.locale.warning": "Anda menggunakan pengaturan lokal ubah suaian. Ubah di berkas bahasa di /site/languages", + "language.name": "Nama", + "language.secondary": "Secondary language", + "language.settings": "Language settings", + "language.updated": "Bahasa sudah diperbaharui", + "language.variables": "Language variables", + "language.variables.empty": "No translations yet", + + "language.variable.delete.confirm": "Do you really want to delete the variable for {key}?", + "language.variable.key": "Key", + "language.variable.notFound": "The variable could not be found", + "language.variable.value": "Value", + + "languages": "Bahasa", + "languages.default": "Bahasa bawaan", + "languages.empty": "Belum ada bahasa", + "languages.secondary": "Bahasa sekunder", + "languages.secondary.empty": "Belum ada bahasa sekunder", + + "license": "Lisensi Kirby", + "license.activate": "Activate it now", + "license.activate.label": "Please activate your license", + "license.activate.domain": "Your license will be activated for {host}.", + "license.activate.local": "You are about to activate your Kirby license for your local domain {host}. If this site will be deployed to a public domain, please activate it there instead. If {host} is the domain you want to use your license for, please continue.", + "license.activated": "Activated", + "license.buy": "Beli lisensi", + "license.code": "Kode", + "license.code.help": "You received your license code after the purchase via email. Please copy and paste it here.", + "license.code.label": "Masukkan kode lisensi Anda", + "license.status.active.info": "Includes new major versions until {date}", + "license.status.active.label": "Valid license", + "license.status.demo.info": "This is a demo installation", + "license.status.demo.label": "Demo", + "license.status.inactive.info": "Renew license to update to new major versions", + "license.status.inactive.label": "No new major versions", + "license.status.legacy.bubble": "Ready to renew your license?", + "license.status.legacy.info": "Your license does not cover this version", + "license.status.legacy.label": "Please renew your license", + "license.status.missing.bubble": "Ready to launch your site?", + "license.status.missing.info": "No valid license", + "license.status.missing.label": "Please activate your license", + "license.manage": "Manage your licenses", + "license.purchased": "Purchased", + "license.success": "Terima kasih atas dukungan untuk Kirby", + "license.unregistered.label": "Unregistered", + + "link": "Tautan", + "link.text": "Teks tautan", + + "loading": "Memuat", + + "lock.unsaved": "Perubahan belum tersimpan", + "lock.unsaved.empty": "Tidak ada lagi perubahan belum tersimpan", + "lock.isLocked": "Unsaved changes by {email}", + "lock.unlock": "Buka kunci", + "lock.unlock.submit": "Unlock and overwrite unsaved changes by {email}", + "lock.isUnlocked": "Was unlocked by another user", + + "login": "Masuk", + "login.code.label.login": "Kode masuk", + "login.code.label.password-reset": "Kode atur ulang sandi", + "login.code.placeholder.email": "000 000", + "login.code.placeholder.totp": "000000", + "login.code.text.email": "Jika alamat surel terdaftar, kode yang diminta dikirim via surel", + "login.code.text.totp": "Please enter the one‑time code from your authenticator app.", + "login.email.login.body": "Hi {user.nameOrEmail},\n\nYou recently requested a login code for the Panel of {site}.\nThe following login code will be valid for {timeout} minutes:\n\n{code}\n\nIf you did not request a login code, please ignore this email or contact your administrator if you have questions.\nFor security, please DO NOT forward this email.", + "login.email.login.subject": "Kode masuk Anda", + "login.email.password-reset.body": "Hi {user.nameOrEmail},\n\nYou recently requested a password reset code for the Panel of {site}.\nThe following password reset code will be valid for {timeout} minutes:\n\n{code}\n\nIf you did not request a password reset code, please ignore this email or contact your administrator if you have questions.\nFor security, please DO NOT forward this email.", + "login.email.password-reset.subject": "Kode atur ulang sandi Anda", + "login.remember": "Biarkan tetap masuk", + "login.reset": "Atur ulang sandi", + "login.toggleText.code.email": "Masuk via surel", + "login.toggleText.code.email-password": "Masuk dengan sandi", + "login.toggleText.password-reset.email": "Lupa sandi Anda?", + "login.toggleText.password-reset.email-password": "← Kembali ke masuk", + "login.totp.enable.option": "Set up one‑time codes", + "login.totp.enable.intro": "Authenticator apps can generate one‑time codes that are used as a second factor when signing into your account.", + "login.totp.enable.qr.label": "1. Scan this QR code", + "login.totp.enable.qr.help": "Unable to scan? Add the setup key {secret} manually to your authenticator app.", + "login.totp.enable.confirm.headline": "2. Confirm with generated code", + "login.totp.enable.confirm.text": "Your app generates a new one‑time code every 30 seconds. Enter the current code to complete the setup:", + "login.totp.enable.confirm.label": "Current code", + "login.totp.enable.confirm.help": "After this setup, we will ask you for a one‑time code every time you log in.", + "login.totp.enable.success": "One‑time codes enabled", + "login.totp.disable.option": "Disable one‑time codes", + "login.totp.disable.label": "Enter your password to disable one‑time codes", + "login.totp.disable.help": "In the future, a different second factor like a login code sent via email will be requested when you log in. You can always set up one‑time codes again later.", + "login.totp.disable.admin": "

This will disable one‑time codes for {user}.

In the future, a different second factor like a login code sent via email will be requested when they log in. {user} can set up one‑time codes again after their next login.

", + "login.totp.disable.success": "One‑time codes disabled", + + "logout": "Keluar", + + "merge": "Merge", + "menu": "Menu", + "meridiem": "AM/PM", + "mime": "Tipe Media", + "minutes": "Menit", + + "month": "Bulan", + "months.april": "April", + "months.august": "Agustus", + "months.december": "Desember", + "months.february": "Februari", + "months.january": "Januari", + "months.july": "Juli", + "months.june": "Juni", + "months.march": "Maret", + "months.may": "Mei", + "months.november": "November", + "months.october": "Oktober", + "months.september": "September", + + "more": "Lebih lanjut", + "move": "Move", + "name": "Nama", + "next": "Selanjutnya", + "night": "Night", + "no": "tidak", + "off": "mati", + "on": "hidup", + "open": "Buka", + "open.newWindow": "Buka di jendela baru", + "option": "Option", + "options": "Opsi", + "options.none": "Tidak ada opsi", + "options.all": "Show all {count} options", + + "orientation": "Orientasi", + "orientation.landscape": "Rebah", + "orientation.portrait": "Tegak", + "orientation.square": "Persegi", + + "page": "Halaman", + "page.blueprint": "This page has no blueprint yet. You can define the setup in /site/blueprints/pages/{blueprint}.yml", + "page.changeSlug": "Ubah URL", + "page.changeSlug.fromTitle": "Buat dari judul", + "page.changeStatus": "Ubah status", + "page.changeStatus.position": "Pilih posisi", + "page.changeStatus.select": "Pilih status baru", + "page.changeTemplate": "Ubah templat", + "page.changeTemplate.notice": "Changing the page's template will remove content for fields that don't match in type. Use with caution.", + "page.create": "Create as {status}", + "page.delete.confirm": "Anda yakin menghapus {title}?", + "page.delete.confirm.subpages": "Halaman ini memiliki sub-halaman.
Semua sub-halaman akan ikut dihapus.", + "page.delete.confirm.title": "Masukkan judul halaman untuk mengonfirmasi", + "page.duplicate.appendix": "Salin", + "page.duplicate.files": "Salin berkas", + "page.duplicate.pages": "Salin halaman", + "page.move": "Move page", + "page.sort": "Ubah posisi", + "page.status": "Status", + "page.status.draft": "Draf", + "page.status.draft.description": "Halaman ini ada pada mode draf dan hanya dapat dilihat oleh penyunting atau via tautan rahasia", + "page.status.listed": "Publik", + "page.status.listed.description": "Halaman publik untuk siapapun", + "page.status.unlisted": "Tidak tercantum", + "page.status.unlisted.description": "Halaman hanya dapat diakses via URL", + + "pages": "Halaman", + "pages.empty": "Belum ada halaman", + "pages.status.draft": "Draf", + "pages.status.listed": "Dipublikasikan", + "pages.status.unlisted": "Tidak tercantum", + + "pagination.page": "Halaman", + + "password": "Sandi", + "paste": "Paste", + "paste.after": "Paste after", + "paste.success": "{count} pasted!", + "pixel": "Piksel", + "plugin": "Plugin", + "plugins": "Plugins", + "prev": "Sebelumnya", + "preview": "Pratinjau", + "remove": "Hapus", + "rename": "Ubah nama", + "renew": "Renew", + "replace": "Ganti", + "replace.with": "Replace with", + "retry": "Coba lagi", + "revert": "Kembalikan", + "revert.confirm": "Anda yakin menghapus semua perubahan yang belum tersimpan?", + + "role": "Peran", + "role.admin.description": "Admin memiliki semua izin", + "role.admin.title": "Admin", + "role.all": "Semua", + "role.empty": "Tidak ada pengguna dengan peran ini", + "role.description.placeholder": "Tidak ada deskripsi", + "role.nobody.description": "Ini adalah peran cadangan tanpa permisi apapun", + "role.nobody.title": "Tidak siapapun", + + "save": "Simpan", + "search": "Cari", + "search.min": "Masukkan {min} karakter untuk mencari", + "search.all": "Show all {count} results", + "search.results.none": "Tidak ada hasil", + + "section.invalid": "Bagian ini tidak valid", + "section.required": "Bagian ini wajib", + + "security": "Keamanan", + "select": "Pilih", + "server": "Peladen", + "settings": "Pengaturan", + "show": "Tampilkan", + "site.blueprint": "Situs ini belum memiliki cetak biru. Anda dapat mendefinisikannya di /site/blueprints/site.yml", + "size": "Ukuran", + "slug": "Akhiran URL", + "sort": "Urutkan", + "sort.drag": "Geser untuk mengurutkan …", + "split": "Pisahkan", + + "stats.empty": "Tidak ada laporan", + "status": "Status", + + "system.info.copy": "Copy info", + "system.info.copied": "System info copied", + "system.issues.content": "Folder konten nampaknya terekspos", + "system.issues.eol.kirby": "Versi instalasi Kirby Anda sudah mencapai akhir dan tidak akan lagi mendapat pembaruan keamanan", + "system.issues.eol.plugin": "Versi instalasi plugin { plugin } Anda sudah mencapai akhir dan tidak akan lagi mendapatkan pembaruan keamanan", + "system.issues.eol.php": "Your installed PHP release { release } has reached end-of-life and will not receive further security updates", + "system.issues.debug": "Debugging must be turned off in production", + "system.issues.git": "The .git folder seems to be exposed", + "system.issues.https": "We recommend HTTPS for all your sites", + "system.issues.kirby": "The kirby folder seems to be exposed", + "system.issues.site": "The site folder seems to be exposed", + "system.issues.vulnerability.kirby": "Instalasi Anda mungkin terpengaruh oleh celah keamanan berikut ({ severity } severity): { description }", + "system.issues.vulnerability.plugin": "Instalasi Anda mungkin terpengaruh oleh celah keamanan di dalam plugin { plugin } ({ severity } severity): { description }", + "system.updateStatus": "Update status", + "system.updateStatus.error": "Could not check for updates", + "system.updateStatus.not-vulnerable": "No known vulnerabilities", + "system.updateStatus.security-update": "Free security update { version } available", + "system.updateStatus.security-upgrade": "Upgrade { version } with security fixes available", + "system.updateStatus.unreleased": "Unreleased version", + "system.updateStatus.up-to-date": "Up to date", + "system.updateStatus.update": "Free update { version } available", + "system.updateStatus.upgrade": "Upgrade { version } available", + + "tel": "Phone", + "tel.placeholder": "+49123456789", + "template": "Templat", + "title": "Judul", + "today": "Hari ini", + + "toolbar.button.clear": "Clear formatting", + "toolbar.button.code": "Kode", + "toolbar.button.bold": "Tebal", + "toolbar.button.email": "Surel", + "toolbar.button.headings": "Penajukan", + "toolbar.button.heading.1": "Penajukan 1", + "toolbar.button.heading.2": "Penajukan 2", + "toolbar.button.heading.3": "Penajukan 3", + "toolbar.button.heading.4": "Heading 4", + "toolbar.button.heading.5": "Heading 5", + "toolbar.button.heading.6": "Heading 6", + "toolbar.button.italic": "Miring", + "toolbar.button.file": "Berkas", + "toolbar.button.file.select": "Pilih berkas", + "toolbar.button.file.upload": "Unggah berkas", + "toolbar.button.link": "Tautan", + "toolbar.button.paragraph": "Paragraph", + "toolbar.button.strike": "Coret", + "toolbar.button.sub": "Subscript", + "toolbar.button.sup": "Superscript", + "toolbar.button.ol": "Daftar berurut", + "toolbar.button.underline": "Garis bawah", + "toolbar.button.ul": "Daftar tidak berurut", + + "translation.author": "Tim Kirby", + "translation.direction": "ltr", + "translation.name": "Bahasa Indonesia", + "translation.locale": "id_ID", + + "type": "Type", + + "upload": "Unggah", + "upload.error.cantMove": "Berkas unggahan tidak dapat dipindahkan", + "upload.error.cantWrite": "Gagal menyimpan berkas", + "upload.error.default": "Berkas tidak dapat diunggah", + "upload.error.extension": "Unggahan berkas diblokir dengan ekstensi", + "upload.error.formSize": "Berkas unggahan mencapai acuan MAX_FILE_SIZE yang diatur di formulir", + "upload.error.iniPostSize": "Berkas unggahan mencapai acuan post_max_size di php.ini", + "upload.error.iniSize": "Berkas unggahan mencapai acuan upload_max_filesize di php.ini", + "upload.error.noFile": "Tidak ada berkas diunggah", + "upload.error.noFiles": "Tidak ada berkas diunggah", + "upload.error.partial": "Berkas unggahan hanya berhasil diunggah sebagian", + "upload.error.tmpDir": "Folder sementara tidak ada", + "upload.errors": "Kesalahan", + "upload.progress": "Mengunggah…", + + "url": "Url", + "url.placeholder": "https://contoh.com", + + "user": "Pengguna", + "user.blueprint": "You can define additional sections and form fields for this user role in /site/blueprints/users/{blueprint}.yml", + "user.changeEmail": "Ubah surel", + "user.changeLanguage": "Ubah bahasa", + "user.changeName": "Ubah nama pengguna ini", + "user.changePassword": "Ubah sandi", + "user.changePassword.new": "Sandi baru", + "user.changePassword.new.confirm": "Konfirmasi sandi baru…", + "user.changeRole": "Ubah peran", + "user.changeRole.select": "Pilih peran baru", + "user.create": "Tambah pengguna baru", + "user.delete": "Hapus pengguna ini", + "user.delete.confirm": "Anda yakin menghapus
{email}?", + + "users": "Pengguna", + + "version": "Versi", + "version.current": "Current version", + "version.latest": "Latest version", + "versionInformation": "Version information", + + "view.account": "Akun Anda", + "view.installation": "Pemasangan", + "view.languages": "Bahasa", + "view.resetPassword": "Atur ulang sandi", + "view.site": "Situs", + "view.system": "System", + "view.users": "Pengguna", + + "welcome": "Selamat datang", + "year": "Tahun", + "yes": "ya" +} diff --git a/kirby/i18n/translations/is_IS.json b/kirby/i18n/translations/is_IS.json new file mode 100644 index 0000000..0608b5c --- /dev/null +++ b/kirby/i18n/translations/is_IS.json @@ -0,0 +1,730 @@ +{ + "account.changeName": "Breyta nafninu þínu", + "account.delete": "Eyða notandareikning þínum", + "account.delete.confirm": "Ertu alveg viss um að þú viljir endanlega eyða reikningnum þínum? Þú munt verða útskráð/ur án tafar. Ómögulegt verður að endurheimta reikninginn þinn.", + + "activate": "Virkja", + "add": "Bæta við", + "alpha": "Gagnsæi", + "author": "Höfundur", + "avatar": "Prófíl mynd", + "back": "Til baka", + "cancel": "Hætta við", + "change": "Breyta", + "close": "Loka", + "changes": "Breytingar", + "confirm": "OK", + "collapse": "Fella", + "collapse.all": "Fella allt", + "color": "Litur", + "coordinates": "Hnit", + "copy": "Afrita", + "copy.all": "Afrita allt", + "copy.success": "Afritaði {count}!", + "create": "Stofna", + "custom": "Sérstillt", + + "date": "Dagsetning", + "date.select": "Veldu dagsetningu", + + "day": "Dagur", + "days.fri": "Fös", + "days.mon": "Mán", + "days.sat": "Lau", + "days.sun": "Sun", + "days.thu": "Fim", + "days.tue": "Þri", + "days.wed": "Mið", + + "debugging": "Aflúsun", + + "delete": "Eyða", + "delete.all": "Eyða hreint öllu", + + "dialog.fields.empty": "Þessi valmynd hefur engin svið", + "dialog.files.empty": "Engar skrár til að velja úr", + "dialog.pages.empty": "Engar síður til að velja úr", + "dialog.text.empty": "þessi valmynd skilgreinir engan texta", + "dialog.users.empty": "Engir notendur til að velja úr", + + "dimensions": "Rýmd", + "disable": "Afvirkja", + "disabled": "Óvirkt", + "discard": "Hunsa", + + "drawer.fields.empty": "Þessi skúffa hefur engin svið", + + "domain": "Lén", + "download": "Hlaða niður", + "duplicate": "Klóna", + + "edit": "Breyta", + + "email": "Netfang", + "email.placeholder": "nafn@netfang.is", + + "enter": "Venda", + "entries": "Færslur", + "entry": "Færsla", + + "environment": "Umhverfi", + + "error": "Villa", + "error.access.code": "Ógildur kóði", + "error.access.login": "Ógild innskráning", + "error.access.panel": "Þú hefur ekkert leyfi til að nota panelinn", + "error.access.view": "Þú hefur ekkert leyfi til að nota þennan hluta panelsins", + + "error.avatar.create.fail": "Það gekk ekki að hlaða inn prófílmyndinni", + "error.avatar.delete.fail": "Ekki tókst að eyða prófílmyndinni", + "error.avatar.dimensions.invalid": "Vinsamlegast hafðu myndina ekki breiðari né hærri en 3000 punkta", + "error.avatar.mime.forbidden": "Snið myndarinnar þarf að vera af gerðinni JPEG eða PNG", + + "error.blueprint.notFound": "Ekki tókst að hlaða bláprentið: \"{name}\". Reyndu aftur?", + + "error.blocks.max.plural": "Ekki fleiri en {max} bálka", + "error.blocks.max.singular": "Ekki meira en einn bálkur", + "error.blocks.min.plural": "Minnst {min}. bálka", + "error.blocks.min.singular": "Allavegana einn bálkur takk", + "error.blocks.validation": "Það er villa í {field} sviðinu í bálkinum {index} sem notar {fieldset} bálkgerðina", + + "error.cache.type.invalid": "Ógyld skyndiminnisgerð \"{type}\"", + + "error.email.preset.notFound": "Netfangstillingarnar: \"{name}\" fundust ekki", + + "error.field.converter.invalid": "Ógildur umbreytari \"{converter}\"", + "error.field.type.missing": "Sviðið \"{ name }\": Sviðgerðin er \"{type}\" er alls ekki til.", + + "error.file.changeName.empty": "Nafn skal fylla út", + "error.file.changeName.permission": "Þú mátt ekkert breyta nafninu á skránni \"{filename}\"", + "error.file.changeTemplate.invalid": "Sniðmátinu fyrir skránna \"{id}\" er ekki hægt að breyta í \"{template}\" (gild: \"{blueprints}\")", + "error.file.changeTemplate.permission": "Þú mátt ekkert breyta sniðmátinu fyrir skránna \"{id}\"", + + "error.file.duplicate": "Skrá með nafninu \"{filename}\" er nú þegar til", + "error.file.extension.forbidden": "Skrárendingin \"{extension}\" er ekki leyfð", + "error.file.extension.invalid": "Óleyfilegt skrársnið hér: {extension}", + "error.file.extension.missing": "Skrárendinguna fyrir \"{filename}\" vantar", + "error.file.maxheight": "Hæð myndarinnar má ekki vera meiri en {height} punktar", + "error.file.maxsize": "Skráinn er alltof stór", + "error.file.maxwidth": "Breydd myndarinnar má alls ekki vera meiri en {width} punktar", + "error.file.mime.differs": "Upphlaðna skráin þarf að vera sömu tegundar: \"{mime}\"", + "error.file.mime.forbidden": "Gagnasniðið \"{mime}\" er ekki leyft hér", + "error.file.mime.invalid": "Ógyllt gagnasnið: {mime}", + "error.file.mime.missing": "Gagnasnið skránnar \"{filename}\" er óþekkt", + "error.file.minheight": "Hæð myndarinnar þarf að vera minnst {height} punktar", + "error.file.minsize": "Skráin er of smá", + "error.file.minwidth": "Breidd myndarinnar þarf að vera minnst {width} punktar", + "error.file.name.unique": "Skrárnafnið þarf að vera einstakt", + "error.file.name.missing": "Skrárnafnið má ekki skilja eftir tómt", + "error.file.notFound": "Skráin \"{filename}\" fannst ekki", + "error.file.orientation": "Snið myndarinnar þarf að vera \"{orientation}\"", + "error.file.type.forbidden": "Þú mátt ekkert hlaða inn {type} skrám", + "error.file.type.invalid": "Ógild skrártegund: {type}", + "error.file.undefined": "Skráin fannst ekki", + + "error.form.incomplete": "Vinsamlegast lagfærðu villurnar í forminu…", + "error.form.notSaved": "Ekki tókst að vista upplýsingar úr forminu", + + "error.language.code": "Gófúslega settu inn gildan kóða fyrir tungumál", + "error.language.duplicate": "Þetta tungumál er nú þegar skráð", + "error.language.name": "Gott og gyllt nafn fyrir tungumálið", + "error.language.notFound": "Tungumálið fannst ekkert", + + "error.layout.validation.block": "Það er villa í {field} sviðinu í bálkinum {blockIndex} sem notar {fieldset} bálkgerðina í rammanum {layoutIndex}", + "error.layout.validation.settings": "Hér er villa í sitllingum fyrir ramman {index}", + + "error.license.domain": "Lénið fyrir skráningarleyfið vantar", + "error.license.email": "Almennilegt netfang hér", + "error.license.format": "Vinsamlegast og fyrir alla muni settu inn gildan leyfiskóða", + "error.license.verification": "Ekki heppnaðist að staðfesta leyfið", + + "error.login.totp.confirm.invalid": "Ógildur kóði", + "error.login.totp.confirm.missing": "Settu inn núverandi lykilkóða", + + "error.object.validation": "Það er villa í \"{label}\" sviðinu:\n{message}", + + "error.offline": "Stjórnborðið er óvirkt eins og stendur.", + + "error.page.changeSlug.permission": "Þú hefur ekkert leyfi til þess að breyta slóðarviðskeytinu fyrir \"{slug}\"", + "error.page.changeSlug.reserved": "Slóð síðna í rótinni verður að byrja með \"{path}\"", + "error.page.changeStatus.incomplete": "Það eru villur á síðunni og við getum ekki gefið hana út", + "error.page.changeStatus.permission": "Stöðu síðunnar var ekki hægt að breyta", + "error.page.changeStatus.toDraft.invalid": "Síðunni \"{slug}\" er ekki hægt að breyta í uppkast", + "error.page.changeTemplate.invalid": "Sniðmáti fyrir síðuna \"{slug}\" er ekki hægt að breyta", + "error.page.changeTemplate.permission": "Þú hefur engan veginn leyfi til að breyta sniðmáti fyrir síðuna \"{slug}\"", + "error.page.changeTitle.empty": "Titillinn getur ekki verið óskilgreindur", + "error.page.changeTitle.permission": "Þú mátt ekki breyta titlinum fyrir \"{slug}\"", + "error.page.create.permission": "Þú hefur ekki leyfi til að stofna \"{slug}\"", + "error.page.delete": "Síðunni \"{slug}\" er ekki hægt að eyða", + "error.page.delete.confirm": "Ritaðu titil síðunnar til að staðfesta", + "error.page.delete.hasChildren": "Síðan hefur undirsíður og er því ekki hægt að eyða", + "error.page.delete.permission": "Þú mátt ekkert eyða \"{slug}\"", + "error.page.draft.duplicate": "Uppkast með slóðinni \"{slug}\" er þegar til", + "error.page.duplicate": "Síða með slóðinni \"{slug}\" er þegar til", + "error.page.duplicate.permission": "Þú mátt ekki klóna \"{slug}\"", + "error.page.move.ancestor": "Það er ekki hægt að færa síðuna á sjálfa sig.", + "error.page.move.directory": "Ekki er reyndist unnt að færa möppu síðunnar.", + "error.page.move.duplicate": "Undirsíða með slóðinni og forskeytinu \"{slug}\" er núþegar til", + "error.page.move.notFound": "Síðan sem færð var finnst því miður ekki", + "error.page.move.permission": "Þú mátt ekkert færa \"{slug}\"", + "error.page.move.template": "Sniðmátið \"{template}\" er ekki gillt sem undirsíða af \"{parent}\"", + "error.page.notFound": "Síðan \"{slug}\" fannst ekkert", + "error.page.num.invalid": "Veldu ákjósanlega raðtölu. Neikvæðar tölur bannaðar.", + "error.page.slug.invalid": "Veldu ákjósanlega vefslóð", + "error.page.slug.maxlength": "Vefslóð þarf að vera a.m.k. \"{length}\" stafir", + "error.page.sort.permission": "Ekki reyndist unnt að raða síðunni \"{slug}\"", + "error.page.status.invalid": "Ákjósanlega síðustöðu takk", + "error.page.undefined": "Síðan fannst ekkert", + "error.page.update.permission": "Þú mátt ekkert uppfæra síðuna \"{slug}\"", + + "error.section.files.max.plural": "Ekki fleiri en {max} skrár í \"{section}\" svæðið", + "error.section.files.max.singular": "Aðeins ein skrá í \"{section}\" svæðið", + "error.section.files.min.plural": "\"{section}\" svæðið krefst a.m.k. {min} skrá sem innihalds", + "error.section.files.min.singular": "\"{section}\" þarf minnst eina skrá til að það virki", + + "error.section.pages.max.plural": "Alls ekki fleiri en {max} síður í \"{section}\" svæðið", + "error.section.pages.max.singular": "Ekki fleiri en ein síða í \"{section}\" svæðið", + "error.section.pages.min.plural": "\"{section}\" svæðið krefst a.m.k {min}. síðna", + "error.section.pages.min.singular": "\"{section}\" krefst a.m.k. einnar síðu", + + "error.section.notLoaded": "Svæðið \"{name}\" var því miður ekki hægt að sækja", + "error.section.type.invalid": "Svæðiðsgerðin \"{type}\" er því miður ekki gild", + + "error.site.changeTitle.empty": "Ekki skilja titilinn eftir tóman", + "error.site.changeTitle.permission": "Þú mátt ekkert breyta titil vefsvæðisins", + "error.site.update.permission": "Þú mátt ekkert uppfæra vefsvæðið", + + "error.structure.validation": "Það er villa í \"{field}\" sviðinu í röð {index}", + + "error.template.default.notFound": "Ekkert sjálfgefið sniðmát fannst", + + "error.unexpected": "Það átti sér stað óvænt villa. Notaðu lúsarleitarhaminn (e. debug mode) til að skilja þetta betur. \nFyrir nánari upplýsingar: https://getkirby.com/docs/reference/system/options/debug", + + "error.user.changeEmail.permission": "Þú mátt ekkert breyta netfangi notandans \"{name}\"", + "error.user.changeLanguage.permission": "Þú hefur ekki leyfi til að breyta tungumáli notandans \"{name}\"", + "error.user.changeName.permission": "Þú mátt alls ekki breyta nafni notandans \"{name}\"", + "error.user.changePassword.permission": "Þér er harðbannað að breyta lykilorði notandans \"{name}\"", + "error.user.changeRole.lastAdmin": "Þetta er síðasti stjórinn og því má ekki breyta hlutverki", + "error.user.changeRole.permission": "Þú hefur ekki leyfi til að breyta hlutverki fyrir notandan \"{name}\"", + "error.user.changeRole.toAdmin": "Þú hefur ekkert leyfi til að gera notendur að stjórum", + "error.user.create.permission": "Þú mátt ekki stofna þennan notanda", + "error.user.delete": "Ekki reyndist unnt að eyða notandanum \"{name}\"", + "error.user.delete.lastAdmin": "Síðasta stjóranum er ekki hægt að eyða", + "error.user.delete.lastUser": "Síðasta notandanum er ekki hægt að eyða", + "error.user.delete.permission": "Þú mátt ekkert eyða notandanum \"{name}\"", + "error.user.duplicate": "Nú þegar finnst notandi með þetta netfang: \"{email}\"", + "error.user.email.invalid": "Vinsamlegast ákjósanlegt netfang", + "error.user.language.invalid": "Vinsamlegast ákjósanlegt tungumál", + "error.user.notFound": "Þessi notandi; \"{name}\" fannst ekki", + "error.user.password.excessive": "Vinsamlegast settu inn gilt lykilorð. Lykilorð hér meiga ekki vera lengri en 1000 stafabil.", + "error.user.password.invalid": "Veldu ákjósanlegt lykilorð. Minnst 8 stafa langt.", + "error.user.password.notSame": "Lykilorðin stemma ekki", + "error.user.password.undefined": "Þessi notandi hefur ekki lykilorð", + "error.user.password.wrong": "Rangt lykilorð", + "error.user.role.invalid": "Veldu ákjósanlegt hlutverk", + "error.user.undefined": "Notandinn fannst ekkert", + "error.user.update.permission": "Þú mátt ekkert breyta notandanum \"{name}\"", + + "error.validation.accepted": "Staðfestu", + "error.validation.alpha": "Aðeins stafir úr Enska stafrófinu, a-z", + "error.validation.alphanum": "Aðeins stafir úr Enska stafrófinu, a-z eða tölustafir 0-9", + "error.validation.anchor": "Vinsamlegast rétt og gillt merki", + "error.validation.between": "Gildi milli \"{min}\" og \"{max}\"", + "error.validation.boolean": "Staðfestu eða hafnaðu þessu", + "error.validation.color": "Endilega settu inn gildan lit í sniðinu {format}", + "error.validation.contains": "Settu inni gildi er inniheldur \"{needle}\"", + "error.validation.date": "Ákjósanlega dagsetningu", + "error.validation.date.after": "Dagsetningu eftir {date}", + "error.validation.date.before": "Dagsetningu fyrir {date}", + "error.validation.date.between": "Dagsetningu milli {min} og {max}", + "error.validation.denied": "Hafnaðu", + "error.validation.different": "Gildið má ekki vera \"{other}\"", + "error.validation.email": "Ákjósanlegt netfang", + "error.validation.endswith": "Gildið verður að enda á \"{end}\"", + "error.validation.filename": "Ákjósanlegt skrárnafn", + "error.validation.in": "Vinsamlegast skráðu eitt af eftirfarandi: ({in})", + "error.validation.integer": "Skráðu heiltölu", + "error.validation.ip": "Skráðu ákjósanlega IP tölu", + "error.validation.less": "Skráðu gildi lægra en {max}", + "error.validation.linkType": "Þessi tengilsgerð er ekki leyfð hér um slóðir.", + "error.validation.match": "Gildið er ekki eftir væntingum", + "error.validation.max": "Skráðu gildi sem er ekki hærra en {max}", + "error.validation.maxlength": "Veldu eitthvað styttra. (hámark {max} stafir)", + "error.validation.maxwords": "Ekki skrá fleiri en {max}. orð", + "error.validation.min": "Skráðu gildi ekki lægra en {min}", + "error.validation.minlength": "Hafðu þetta lengra en {min}. stafi", + "error.validation.minwords": "Lágmark {min}. orð", + "error.validation.more": "Eitthvað hærra en {min}", + "error.validation.notcontains": "Skráðu eitthvað sem inniheldur ekki \"{needle}\"", + "error.validation.notin": "Ekki skrá neitt af þessu: ({notIn})", + "error.validation.option": "Veldu ákjósanlegan kost", + "error.validation.num": "Notaðu tölugildi", + "error.validation.required": "Skráðu eitthvað", + "error.validation.same": "Skráðu \"{other}\"", + "error.validation.size": "Gildið þarf að vera \"{size}\"", + "error.validation.startswith": "Þetta þarf að byrja á \"{start}\"", + "error.validation.tel": "Vinsamlegast ósniðið símanúmer hér.", + "error.validation.time": "Ákjósanlegur tími", + "error.validation.time.after": "Veldu tíma eftir {time}", + "error.validation.time.before": "Veldu tíma fyrir{time}", + "error.validation.time.between": "Veldu tíma milli {min} og {max}", + "error.validation.uuid": "Vinsamlegast gillt UUID (Notandakenni)", + "error.validation.url": "Ákjósanleg vefslóð", + + "expand": "Þenja út", + "expand.all": "Þenja allt út", + + "field.invalid": "Þetta svið er bara ógillt sem stendur.", + "field.required": "Þetta svið er nauðsynlegt", + "field.blocks.changeType": "Breyta um bálkagerð", + "field.blocks.code.name": "Kóði", + "field.blocks.code.language": "Tungumal", + "field.blocks.code.placeholder": "Kóðinn þinn …", + "field.blocks.delete.confirm": "Ætlarðu virkilega að eyða þessum bálk?", + "field.blocks.delete.confirm.all": "Ertu nú alveg viss um að þú viljir eyða öllum þessum bálkum?", + "field.blocks.delete.confirm.selected": "Viltu virkilega eyða völdum bálkum?", + "field.blocks.empty": "Öngvir bálkar enn", + "field.blocks.fieldsets.empty": "Engin sviðasett enn", + "field.blocks.fieldsets.label": "Veldu bálkagerð …", + "field.blocks.fieldsets.paste": "Ýttu á {{ shortcut }} til þess að flytja raðir/bálka hingað Aðeins þeir sem eru gildir hér mun verða færðir hingað.", + "field.blocks.gallery.name": "Myndasafn", + "field.blocks.gallery.images.empty": "Engar myndir enn", + "field.blocks.gallery.images.label": "Myndir", + "field.blocks.heading.level": "Stig", + "field.blocks.heading.name": "Fyrirsögn", + "field.blocks.heading.text": "Texti/Prósi", + "field.blocks.heading.placeholder": "Fyrirsögn …", + "field.blocks.image.alt": "ALT texti", + "field.blocks.image.caption": "Myndartexti", + "field.blocks.image.crop": "Kroppa", + "field.blocks.image.link": "Tengill", + "field.blocks.image.location": "Staðsetning", + "field.blocks.image.location.internal": "Þetta vefsvæði", + "field.blocks.image.location.external": "Ytri kelda", + "field.blocks.image.name": "Mynd", + "field.blocks.image.placeholder": "Veldu mynd", + "field.blocks.image.ratio": "Hlutfall", + "field.blocks.image.url": "Slóð myndar", + "field.blocks.line.name": "Lína", + "field.blocks.list.name": "Listi", + "field.blocks.markdown.name": "Markdown", + "field.blocks.markdown.label": "Texti", + "field.blocks.markdown.placeholder": "Markdown …", + "field.blocks.quote.name": "Tilvitnun", + "field.blocks.quote.text.label": "Innihald tilvitnunar", + "field.blocks.quote.text.placeholder": "Þessi tilvitnun …", + "field.blocks.quote.citation.label": "Heimild", + "field.blocks.quote.citation.placeholder": "eftir …", + "field.blocks.text.name": "Prósi", + "field.blocks.text.placeholder": "Þessi prósi …", + "field.blocks.video.autoplay": "Sjálfspila", + "field.blocks.video.caption": "Myndskeiðstexti", + "field.blocks.video.controls": "Stjórnhnappar", + "field.blocks.video.location": "Staðsetning", + "field.blocks.video.loop": "Lykkja", + "field.blocks.video.muted": "Þaggað", + "field.blocks.video.name": "Myndskeið", + "field.blocks.video.placeholder": "Vefslóð myndskeiðs (URL)", + "field.blocks.video.poster": "Plakkat", + "field.blocks.video.preload": "Forhlaða", + "field.blocks.video.url.label": "Vefslóð", + "field.blocks.video.url.placeholder": "https://youtube.com/?v=", + + "field.files.empty": "Engar skrár valdar ennþá", + + "field.layout.change": "Breyta uppsetningu ramma", + "field.layout.delete": "Eyða ramma", + "field.layout.delete.confirm": "Ætlarðu virkilega að eyða þessum ramma?", + "field.layout.delete.confirm.all": "Ætlarðu virkilega að eyða öllum römmum?", + "field.layout.empty": "Nei. Engir rammar enn.", + "field.layout.select": "Veldu rammategund", + + "field.object.empty": "Engar upplýsingar enn", + + "field.pages.empty": "Engar síður valdar ennþá", + + "field.structure.delete.confirm": "Viltu virkilega eyða þessari röð?", + "field.structure.delete.confirm.all": "Ætlar þú virkilega að eyða öllum færslum?", + "field.structure.empty": "Engar færslur enn", + + "field.users.empty": "Engir notendur valdir enn", + + "fields.empty": "Hér eru engin svið enn", + + "file": "Skrár", + "file.blueprint": "Þessi skrá hefur ekki skipan (e. blueprint) ennþá. Þú mátt skilgreina skipanina í /site/blueprints/{template}.yml", + "file.changeTemplate": "Breyta sniðmáti", + "file.changeTemplate.notice": "Að breyta sniðmáti skránnar mun fjarlæjga efnið er tilheyrir þeim sviðum er ekki passar við viðkomandi gerð. Ef nýja sniðmátið er skilgreint með ákveðnum reglum s.s. stærð mynda þá verða þær breytingar óafturkræfar. Notist með gát.", + "file.delete.confirm": "Ætlarðu virkilega að eyða
{filename}?", + "file.focus.placeholder": "Settu brennipunkt", + "file.focus.reset": "Fjarlægðu brennipunkt", + "file.focus.title": "Fókus", + "file.sort": "Breyta röðun", + + "files": "Skrár", + "files.empty": "Engar skrár enn", + + "filter": "Sigta", + + "hide": "Fela", + "hour": "Klukkustund", + "hue": "Blær", + "import": "Hlaða inn", + "info": "Upplýsingar", + "insert": "Setja inn", + "insert.after": "Setja eftir", + "insert.before": "Setja fyrir", + "install": "Setja upp", + + "installation": "Uppsettning", + "installation.completed": "Panellinn er uppsettur", + "installation.disabled": "Paneluppsetning er sjálfgefið óvirk á vefþjónum á Veraldarvefnum. Reyndu frekar að setja Panelinn upp í lokuðu umhverfi eða virkjaðu panel.install möguleikan.", + "installation.issues.accounts": "/site/accounts mappan er annaðhvort ekki til eða er ekki skrifanleg.", + "installation.issues.content": "/content mappan er annaðhvort ekki til eða er ekki skrifanleg", + "installation.issues.curl": "CURL viðbótin er hér bráðnauðsynleg", + "installation.issues.headline": "Uppsetning Panelsins mistókst hrapalega", + "installation.issues.mbstring": "MB String er hér bráðnauðsynleg", + "installation.issues.media": "/media mappan er annaðhvort ekki til eða er ekki skrifanleg", + "installation.issues.php": "Notaðu PHP 8+", + "installation.issues.sessions": "/site/sessions mappan er annaðhvort ekki til eða er ekki skrifanleg", + + "language": "Tungumál", + "language.code": "Kóði", + "language.convert": "Gera sjálfgefið", + "language.convert.confirm": "

Ertu viss um að þú viljir breyta {name} í sjálfgefið (lesist aðal) tungumál? Þessu verður ekki viðsnúið.

Ef {name} hefur innihald sem ekki hefur verið þýtt, þá verða engir möguleikar til þrautarvara og hluti vefsins gæti birtst tómur.

", + "language.create": "Bættu við nýju tungumáli", + "language.default": "Aðal tungumál", + "language.delete.confirm": "Ertu nú viss um að þú viljir eyða {name} og öllum tilheyrandi þýðingum? Þetta verður ekki tekið til baka!", + "language.deleted": "Tungumálinu hefur verið eytt", + "language.direction": "Lesátt", + "language.direction.ltr": "Vinstra til hægri", + "language.direction.rtl": "Hægra til vinstri", + "language.locale": "PHP locale strengur", + "language.locale.warning": "Þú ert að nota sérsniðna locale uppsetningu. Vinsamlegast breyttu tungumálaskránni á slóðinni /site/languages", + "language.name": "Nafn tungumáls", + "language.secondary": "Auka tungumál", + "language.settings": "Tungumálastillingar", + "language.updated": "Tungumálið hefur verið uppfært", + "language.variables": "Tungumálabreytur", + "language.variables.empty": "Engar þýðingar enn", + + "language.variable.delete.confirm": "Ertu viss um að þú viljir nú fjarlægja breytuna fyrir {key}?", + "language.variable.key": "Lykill", + "language.variable.notFound": "Breytan fannst hreint ekki", + "language.variable.value": "Gildi", + + "languages": "Tungumál", + "languages.default": "Aðal tungumál", + "languages.empty": "Það eru engin frekari tungumál skilgreind enn", + "languages.secondary": "Auka tungumál", + "languages.secondary.empty": "Það eru engin auka tungumál skilgreind enn", + + "license": "Leyfi", + "license.activate": "Virkja þetta nú", + "license.activate.label": "Vinsamlegast virkjaðu leyfið þitt", + "license.activate.domain": "Leyfið þitt verður virkjað fyrir og tengt við {host}.", + "license.activate.local": "Þú ert að fara virkja leyfið þitt fyrir staðbundinn (e. local) vef: {host}. Ef það er meiningin að færa vefinn síðar út á netið þá vinsamlegast virkjaðu leyfið þar. Ef {host} er lénið sem þú vilt tengja leyfið við þá vinsamlegast haltu áfram.", + "license.activated": "Virkjað", + "license.buy": "Kaupa leyfi", + "license.code": "Kóðasnið", + "license.code.help": "Þú fékkst leyfiskóðan sendan í tölvupósti eftir að þú borgaðir fyrir leyfið. Vinsamlegast afritaðu hann hingað.", + "license.code.label": "Vinsamlegast settu inn leyfiskóðan", + "license.status.active.info": "Felur í sér allar útgáfur þar til {date}", + "license.status.active.label": "Gilt skráningarleyfi", + "license.status.demo.info": "Þessi uppsetning er til prófunar.", + "license.status.demo.label": "Prófunarútgáfa", + "license.status.inactive.info": "Endurnýja skráningarleyfi fyrir uppfærslur á nýjum útgáfum", + "license.status.inactive.label": "Engar nýjar útgáfur", + "license.status.legacy.bubble": "Klár í að endurnýja skráningarleyfið?", + "license.status.legacy.info": "Skráningarleyfið þitt og sá kóði sem fylgir gildir ekkert fyrir þessa útgáfu", + "license.status.legacy.label": "Vinsamlegast endurnýjaðu skráningarleyfið þitt", + "license.status.missing.bubble": "Er allt tilbúið til að gefa vefinn út?", + "license.status.missing.info": "Ekkert gilt skráningarleyfi", + "license.status.missing.label": "Vinsamlegast virkjaðu leyfið þitt", + "license.manage": "Sýslaðu með leyfin þín", + "license.purchased": "Verslað", + "license.success": "Þakka þér fyrir að velja Kirby", + "license.unregistered.label": "Óskráð", + + "link": "Tengill", + "link.text": "Tengilstexti", + + "loading": "Hleð", + + "lock.unsaved": "Óvistað breytingar", + "lock.unsaved.empty": "Það eru öngvar óvistaðar breytingar", + "lock.isLocked": "Óvistaðar breytingar framkvæmdar af {email}", + "lock.unlock": "Aflæsa", + "lock.unlock.submit": "Aflæsa og yfirskrifa óvistaðar breytingar framkvæmdar af {email}", + "lock.isUnlocked": "Læsing fjalægð af öðrum notanda", + + "login": "Innskrá", + "login.code.label.login": "Innskráningarkóði", + "login.code.label.password-reset": "Kóði fyrir endurstillingu lykilorðs", + "login.code.placeholder.email": "000 000", + "login.code.placeholder.totp": "000000", + "login.code.text.email": "Ef netfangið þitt er skráð þá bíður þín nýr tölvupóstur.", + "login.code.text.totp": "Settu inn kóðan frá auðkenningar appinu.", + "login.email.login.body": "Já halló {user.nameOrEmail},\n\nNýlega baðstu um innskráningarkóða fyrir bakendan á {site}.\nEftirfarandi kóði er virkur í {timeout} mínútur:\n\n{code}\n\nEf þú óskaðir ekki eftir þessu þá hunsaðu þennan tölvupóst eða talaðu við vefstjóran ef þú vilt fræðast nánar.\nAf öryggisástæðum vinsamlegast áframsendu þennan tölvupóst ALLS EKKI.", + "login.email.login.subject": "Innskráningarkóðinn þinn", + "login.email.password-reset.body": "Nei halló {user.nameOrEmail},\n\nNýverið baðstu um að lykilorði þínu væri endurstillt fyrir bakendan á {site}. \nEftirfarandi kóði er virkur í {timeout} mínútur:\n\n{code}\n\nEf þú óskaðir ekki eftir þessu þá hunsaðu þennan tölvupóst eða talaðu við vefstjóran ef þú vilt fræðast nánar.\nAf öryggisástæðum vinsamlegast áframsendu þennan tölvupóst ALLS EKKI.", + "login.email.password-reset.subject": "Kóðinn þinn fyrir endurstillingu lykilorðs", + "login.remember": "Vista innskráningu", + "login.reset": "Endurheimta lykilorð takk", + "login.toggleText.code.email": "Innskrá með netfangi", + "login.toggleText.code.email-password": "Innskrá með lykilorði", + "login.toggleText.password-reset.email": "Mannstu ekki lykilorðið?", + "login.toggleText.password-reset.email-password": "← Aftur í innskráningu", + "login.totp.enable.option": "Setja upp einnota kóða.", + "login.totp.enable.intro": "Auðkenningaröpp framleiða einnota sex stafa kóða sem notaður er seinni þáttur þegar þú skráir þig inn.", + "login.totp.enable.qr.label": "Skannaðu QR kóðan.", + "login.totp.enable.qr.help": "Virkar ekki að skanna? Bættu við uppsetningarkóðanum {secret} fyrir auðkenningarappið.", + "login.totp.enable.confirm.headline": "2. Staðfestu með auðkenningar kóða", + "login.totp.enable.confirm.text": "Appið þitt framleiðir nýjan einnota kóða á 30 sekúndna fresti. Setti inn núverandi kóða til að ljúka uppsetningu.", + "login.totp.enable.confirm.label": "Núverandi kóði", + "login.totp.enable.confirm.help": "Eftir uppsetninguna þá munum við biðja um einnota kóða í hvert skipti sem þú skráir þig inn.", + "login.totp.enable.success": "Einnota skráningarkóði virkjaður", + "login.totp.disable.option": "Afvirkjaðir einnota kóðar.", + "login.totp.disable.label": "Sláðu inn lykilorðið þitt til að afvirkja einnota kóða.", + "login.totp.disable.help": "Framveigis þá mun nýr seinniþáttar kóði verða sendur í tölvupósti til þín þegar þú skráir þig inn. Þú munt alltaf geta sett upp einnota kóðana aftur síðar.", + "login.totp.disable.admin": "

Þetta mun afvirkja einnota kóða fyrir {user}.

Framvegis mun nýr seinniþáttarkóði verða sendur í tölvupósti þegar notendur skrá sig inn. {user} getur sett upp einnota kóðana eftir næstu innskráningu.

", + "login.totp.disable.success": "Einnota skráningarkóði afvirkjaður", + + "logout": "Útskrá", + + "merge": "Splæsa", + "menu": "Valmynd", + "meridiem": "AM/PM", + "mime": "Miðilsgerð", + "minutes": "Mínútur", + + "month": "Mánuður", + "months.april": "Apríl", + "months.august": "Ágúst", + "months.december": "Desember", + "months.february": "Febrúar", + "months.january": "Janúar", + "months.july": "Júlí", + "months.june": "Júní", + "months.march": "Mars", + "months.may": "Maí", + "months.november": "Nóvember", + "months.october": "Október", + "months.september": "September", + + "more": "Meira", + "move": "Færa", + "name": "Nafn", + "next": "Næst", + "night": "Nótt", + "no": "nei", + "off": "Af", + "on": "Á", + "open": "Opna", + "open.newWindow": "Opna í nýjum glugga", + "option": "Kostur", + "options": "Valmöguleikar", + "options.none": "Engir valmöguleikar", + "options.all": "Sýna alla {count} möguleika", + + "orientation": "Snúningur", + "orientation.landscape": "Langsnið", + "orientation.portrait": "Skammsnið", + "orientation.square": "Ferningur", + + "page": "Síða", + "page.blueprint": "Þessi síða hefur ekki skipan (e. blueprint) ennþá. Þú mátt skilgreina skipanina í /site/blueprints/{template}.yml", + "page.changeSlug": "Breyta vefslóð", + "page.changeSlug.fromTitle": "Slóð af titli", + "page.changeStatus": "Breyta stöðu", + "page.changeStatus.position": "Veldu ákjósanlega röðun", + "page.changeStatus.select": "Veldu nýja stöðu", + "page.changeTemplate": "Breyta sniðmáti", + "page.changeTemplate.notice": "Að breyta sniðmáti síðunnar mun fjarlægja efni fyrir svið er ekki passa við gerð nýja sniðmátsins. Notist með gát.", + "page.create": "Stofna", + "page.delete.confirm": "Viltu virkilega farga {title}?", + "page.delete.confirm.subpages": "Þessi síða hefur undirsíður.
Þeim mun verða fargað líka.", + "page.delete.confirm.title": "Skráðu síðutitilinn til staðfestingar", + "page.duplicate.appendix": "Afrita", + "page.duplicate.files": "Afrita skrár", + "page.duplicate.pages": "Afrita síður", + "page.move": "Færa síðu", + "page.sort": "Breyta röðun", + "page.status": "Staða", + "page.status.draft": "Uppkast", + "page.status.draft.description": "Þessi síða er uppkast og er aðeins sýnileg vefstjórum eða gegnum laumu tengil.", + "page.status.listed": "Útgefin og listuð", + "page.status.listed.description": "Síðan er útgefin og listuð.", + "page.status.unlisted": "Útgefin en ólistuð", + "page.status.unlisted.description": "Síðan er útgefin en þó ólistuð.", + + "pages": "Síður", + "pages.empty": "Engar síður enn", + "pages.status.draft": "Uppköst", + "pages.status.listed": "Útgefnar og listaðar", + "pages.status.unlisted": "Útgefnar en ólistaðar", + + "pagination.page": "Síða", + + "password": "Lykilorð", + "paste": "Líma", + "paste.after": "Líma eftir", + "paste.success": "{count} límt!", + "pixel": "Punkta", + "plugin": "Viðbót", + "plugins": "Viðbætur", + "prev": "Fyrri", + "preview": "Forskoða", + "remove": "Fjarlægja", + "rename": "Endurnefna", + "renew": "Endurnýja", + "replace": "Setja í stað", + "replace.with": "Endursetja með", + "retry": "Reyndu aftur", + "revert": "Taka upp fyrri siði", + "revert.confirm": "Viltu virkilega eyða öllum óvistuðum breytingum?", + + "role": "Hlutverk", + "role.admin.description": "Stjórinn hefur öll réttindi", + "role.admin.title": "Stjóri", + "role.all": "Öll", + "role.empty": "Það eru engir notendur með þetta hlutverk", + "role.description.placeholder": "Engin lýsing", + "role.nobody.description": "Þetta hlutverk er til þrautarvara en hefur engin réttindi", + "role.nobody.title": "Enginn", + + "save": "Vista", + "search": "Leita", + "search.min": "Lágmark {min} stafir til að leita", + "search.all": "Sýna allar {count} niðurstöður.", + "search.results.none": "Engar niðurstöður", + + "section.invalid": "Þetta svæði er bara ógillt sem stendur.", + "section.required": "Þetta svæði er nauðsynlegt", + + "security": "Öryggi", + "select": "Velja", + "server": "Vefþjónn", + "settings": "Stillingar", + "show": "Sýna", + "site.blueprint": "Þessi vefur hefur ekki skipan (e. blueprint) ennþá. Þú mátt skilgreina skipanina í /site/blueprints/site.yml", + "size": "Stærð", + "slug": "Slóðar viðskeyti", + "sort": "Raða", + "sort.drag": "Dragðu til að raða", + "split": "Skipta", + + "stats.empty": "Engar skýrslur", + "status": "Staða", + + "system.info.copy": "Copy info", + "system.info.copied": "System info copied", + "system.issues.content": "Efnismappan virðist vera berskjölduð", + "system.issues.eol.kirby": "Uppsett Kirby eintak þitt hefur runnið sitt skeið á enda og mun ekki verða uppfært framar", + "system.issues.eol.plugin": "Uppsett eintak þitt af viðbótinni { plugin } hefur runnið sitt skeið á enda og mun ekki verða uppfærð framar", + "system.issues.eol.php": "Núverandi PHP útgáfa {release} hefur runnið sitt skeið og mun ekki verða uppfærð með öryggisuppfærslum.", + "system.issues.debug": "Aflúsun ætti alltaf að vera óvirk í útgefnum vef", + "system.issues.git": ".git mappan virðist vera berskjölduð", + "system.issues.https": "Við mælum harðlega með því að þú notir HTTPS fyrir öll þín vefsvæði", + "system.issues.kirby": "Kirby mappan virðist vera berskjölduð", + "system.issues.site": "Mappa vefsvæðisins virðist vera berskjölduð", + "system.issues.vulnerability.kirby": "Uppsetningin þín gæti verið berskjölduð gagnvart eftirfarandi veikleika: ({ severity } veikleikinn): { description }", + "system.issues.vulnerability.plugin": "Uppsetningin þín gæti verið berskjölduð gagnvart eftirfarandi veikleika í viðbótinni { plugin }: ({ severity } veikleikinn): { description }", + "system.updateStatus": "Uppfærslustaða", + "system.updateStatus.error": "Gat því miður ekki athugað með uppfærslur", + "system.updateStatus.not-vulnerable": "Engir þekktir veikleikar", + "system.updateStatus.security-update": "Ókeypis öryggisuppfærsla { version } fáanleg", + "system.updateStatus.security-upgrade": "Uppfærsla { version } með öryggisuppfærslum fáanleg", + "system.updateStatus.unreleased": "Þróunarútgáfa", + "system.updateStatus.up-to-date": "Allt spikk og span", + "system.updateStatus.update": "Ókeypis uppfærsla { version } fáanleg", + "system.updateStatus.upgrade": "Uppfærsla fyrir { version } fáanleg", + + "tel": "Sími", + "tel.placeholder": "+3548561234", + "template": "Sniðmát", + "title": "Titill", + "today": "Núna", + + "toolbar.button.clear": "Hreinsa snið", + "toolbar.button.code": "Kóðasnið", + "toolbar.button.bold": "Feitletrun", + "toolbar.button.email": "Netfang", + "toolbar.button.headings": "Fyrirsagnir", + "toolbar.button.heading.1": "Fyrirsögn 1", + "toolbar.button.heading.2": "Fyrirsögn 2", + "toolbar.button.heading.3": "Fyrirsögn 3", + "toolbar.button.heading.4": "Fyrirsögn 4", + "toolbar.button.heading.5": "Fyrirsögn 5", + "toolbar.button.heading.6": "Fyrirsögn 6", + "toolbar.button.italic": "Skáletrun", + "toolbar.button.file": "Skrár", + "toolbar.button.file.select": "Veldu skrá", + "toolbar.button.file.upload": "Hlaða inn skrá", + "toolbar.button.link": "Tengill", + "toolbar.button.paragraph": "Efnisgrein", + "toolbar.button.strike": "Gegnumstrika", + "toolbar.button.sub": "Hnéletur", + "toolbar.button.sup": "Höfuðletur", + "toolbar.button.ol": "Raðaður listi", + "toolbar.button.underline": "Undirstrika", + "toolbar.button.ul": "Áherslumerktur listi", + + "translation.author": "Kirby Teymið", + "translation.direction": "ltr", + "translation.name": "Íslenska", + "translation.locale": "is_IS", + + "type": "Gerð", + + "upload": "Hlaða inn", + "upload.error.cantMove": "Innhlöðnu skránni var ekki haggað", + "upload.error.cantWrite": "Það mistókst að skrifa skránna í geymslu", + "upload.error.default": "Ekki heppnaðist að hlaða inn skránni", + "upload.error.extension": "Innhleðsla stöðvuð vegna skrárendingar", + "upload.error.formSize": "Innhlaðna skráin er stærri en MAX_FILE_SIZE leyfilegt er.", + "upload.error.iniPostSize": "Innhlaðna skráin er stærri en því sem nemur í post_max_size stillingunni í php.ini", + "upload.error.iniSize": "Innhlaðna skráin er stærri en því sem nemur í upload_max_filesize stillingunni í php.ini", + "upload.error.noFile": "Engri skrá far hlaðið inn", + "upload.error.noFiles": "Engum skrám var hlaðið inn", + "upload.error.partial": "Innhlöðnu skránni var aðeins sótt að hluta", + "upload.error.tmpDir": "Vantar skruggumöppu", + "upload.errors": "Villa", + "upload.progress": "Hleð inn…", + + "url": "Slóð", + "url.placeholder": "https://tildaem.is/", + + "user": "Notandi", + "user.blueprint": "Þér er óhætt að skilgreina fleiri svæði fyrir þetta notenda hlutverk í /site/blueprints/users/{role}.yml", + "user.changeEmail": "Breyta netfangi", + "user.changeLanguage": "Breyta tungumáli", + "user.changeName": "Endurnefna þennan notanda", + "user.changePassword": "Breyta lykilorð", + "user.changePassword.new": "Nýtt lykilorð", + "user.changePassword.new.confirm": "Staðfestu nýtt lykilorð…", + "user.changeRole": "Breyta hlutverki", + "user.changeRole.select": "Veldu nýtt hlutverk", + "user.create": "Bæta við nýjum notenda", + "user.delete": "Farga þessum notenda", + "user.delete.confirm": "Viltu virkilega eyða
{email}?", + + "users": "Notendur", + + "version": "Útgáfa", + "version.current": "Núverandi útgáfa", + "version.latest": "Nýjasta útgáfa", + "versionInformation": "Útgáfuupplýsingar", + + "view.account": "Þínar stillingar", + "view.installation": "Uppsetning", + "view.languages": "Tungumál", + "view.resetPassword": "Endurstilla lykilorð", + "view.site": "Vefsvæðið", + "view.system": "Kerfi", + "view.users": "Notendur", + + "welcome": "Komið þér fagnandi", + "year": "Ár", + "yes": "já" +} diff --git a/kirby/i18n/translations/it.json b/kirby/i18n/translations/it.json new file mode 100644 index 0000000..a4d9a48 --- /dev/null +++ b/kirby/i18n/translations/it.json @@ -0,0 +1,730 @@ +{ + "account.changeName": "Cambia il tuo nome", + "account.delete": "Elimina l'account", + "account.delete.confirm": "Vuoi davvero eliminare il tuo account? Verrai disconnesso immediatamente. Il tuo account non potrà essere recuperato.", + + "activate": "Attiva", + "add": "Aggiungi", + "alpha": "Alpha", + "author": "Autore", + "avatar": "Immagine del profilo", + "back": "Indietro", + "cancel": "Annulla", + "change": "Cambia", + "close": "Chiudi", + "changes": "Changes", + "confirm": "OK", + "collapse": "Comprimi", + "collapse.all": "Comprimi tutto", + "color": "Color", + "coordinates": "Coordinates", + "copy": "Copia", + "copy.all": "Copia tutto", + "copy.success": "{count} copied!", + "create": "Crea", + "custom": "Custom", + + "date": "Data", + "date.select": "Scegli una data", + + "day": "Giorno", + "days.fri": "Ve", + "days.mon": "Lu", + "days.sat": "Sa", + "days.sun": "Do", + "days.thu": "Gi", + "days.tue": "Ma", + "days.wed": "Me", + + "debugging": "Debugging", + + "delete": "Elimina", + "delete.all": "Elimina tutti", + + "dialog.fields.empty": "This dialog has no fields", + "dialog.files.empty": "Nessun file selezionabile", + "dialog.pages.empty": "Nessuna pagina selezionabile", + "dialog.text.empty": "This dialog does not define any text", + "dialog.users.empty": "Nessuno user selezionabile", + + "dimensions": "Dimensioni", + "disable": "Disattiva", + "disabled": "Disabilitato", + "discard": "Abbandona", + + "drawer.fields.empty": "This drawer has no fields", + + "domain": "Dominio", + "download": "Scarica", + "duplicate": "Duplica", + + "edit": "Modifica", + + "email": "Email", + "email.placeholder": "mail@esempio.com", + + "enter": "Enter", + "entries": "Voci", + "entry": "Voce", + + "environment": "Ambiente", + + "error": "Error", + "error.access.code": "Codice non valido", + "error.access.login": "Login invalido", + "error.access.panel": "Non ti è permesso accedere al pannello", + "error.access.view": "Non ti è permesso accedere a questa parte del pannello", + + "error.avatar.create.fail": "Non è stato possibile caricare l'immagine del profilo", + "error.avatar.delete.fail": "Non è stato possibile eliminare l'immagine del profilo", + "error.avatar.dimensions.invalid": "Per favore mantieni l'altezza e la larghezza dell'immagine del profilo inferiore ai 3000 pixel", + "error.avatar.mime.forbidden": "L'immagine del profilo dev'essere un file JPEG o PNG", + + "error.blueprint.notFound": "Non è stato possibile caricare il blueprint \"{name}\"", + + "error.blocks.max.plural": "Non puoi aggiungere più di {max} blocchi", + "error.blocks.max.singular": "Non puoi aggiungere più di un blocco", + "error.blocks.min.plural": "Devi aggiungere almeno {min} blocchi", + "error.blocks.min.singular": "Devi aggiungere almeno un blocco", + "error.blocks.validation": "C'è un errore sul campo \"{field}\" nel blocco {index} che utilizza il tipo di blocco \"{fieldset}\"", + + "error.cache.type.invalid": "Tipo di cache \"{type}\" non valido", + + "error.email.preset.notFound": "Non è stato possibile trovare il preset email \"{name}\"", + + "error.field.converter.invalid": "Convertitore \"{converter}\" non valido", + "error.field.type.missing": "Campo \"{ name }\": il tipo di campo \"{ type }\" non esiste", + + "error.file.changeName.empty": "Il nome non dev'essere vuoto", + "error.file.changeName.permission": "Non ti è permesso modificare il nome di \"{filename}\"", + "error.file.changeTemplate.invalid": "The template for the file \"{id}\" cannot be changed to \"{template}\" (valid: \"{blueprints}\")", + "error.file.changeTemplate.permission": "You are not allowed to change the template for the file \"{id}\"", + + "error.file.duplicate": "Un file con il nome \"{filename}\" esiste già", + "error.file.extension.forbidden": "L'estensione \"{extension}\" non è consentita", + "error.file.extension.invalid": "Estensione non valida: {extension}", + "error.file.extension.missing": "Il file \"{filename}\" non ha estensione", + "error.file.maxheight": "L'immagine non dev'essere più alta di {height} pixel", + "error.file.maxsize": "Il file è troppo pesante", + "error.file.maxwidth": "L'immagine non dev'essere più larga di {width} pixel", + "error.file.mime.differs": "Il file caricato dev'essere dello stesso MIME type \"{mime}\"", + "error.file.mime.forbidden": "Il MIME type \"{mime}\" non è consentito", + "error.file.mime.invalid": "Tipo mime non valido: {mime}", + "error.file.mime.missing": "Il MIME type per \"{filename}\" non può essere rilevato", + "error.file.minheight": "L'immagine dev'essere alta almeno {height} pixel", + "error.file.minsize": "Il file è troppo leggero", + "error.file.minwidth": "L'immagine dev'essere larga almeno {width} pixel", + "error.file.name.unique": "The filename must be unique", + "error.file.name.missing": "Il nome del file non può essere vuoto", + "error.file.notFound": "Il file non \u00e8 stato trovato", + "error.file.orientation": "L'imaggine dev'essere orientata in \"{orientation}\"", + "error.file.type.forbidden": "Non ti è permesso caricare file {type}", + "error.file.type.invalid": "Tipo di file non valido: {type}", + "error.file.undefined": "Il file non \u00e8 stato trovato", + + "error.form.incomplete": "Correggi tutti gli errori nel form...", + "error.form.notSaved": "Non è stato possibile salvare il form", + + "error.language.code": "Inserisci un codice valido per la lingua", + "error.language.duplicate": "La lingua esiste già", + "error.language.name": "Inserisci un nome valido per la lingua", + "error.language.notFound": "La lingua non è stata trovata", + + "error.layout.validation.block": "C'è un errore sul campo \"{field}\" nel blocco {blockIndex} che utilizza il tipo di blocco \"{fieldset}\" nel layout {layoutIndex}", + "error.layout.validation.settings": "C'è un errore nelle impostazioni del layout {index}", + + "error.license.domain": "Il dominio per la licenza è assente", + "error.license.email": "Inserisci un indirizzo email valido", + "error.license.format": "Per favore inserisci un codice di licenza valido", + "error.license.verification": "Non è stato possibile verificare la licenza", + + "error.login.totp.confirm.invalid": "Codice non valido", + "error.login.totp.confirm.missing": "Inserisci il codice attuale", + + "error.object.validation": "C'è un errore nel campo \"{label}\":\n{message}", + + "error.offline": "Il pannello di controllo è attualmente offline", + + "error.page.changeSlug.permission": "Non ti è permesso cambiare l'URL di \"{slug}\"", + "error.page.changeSlug.reserved": "The path of top-level pages must not start with \"{path}\"", + "error.page.changeStatus.incomplete": "La pagina contiene errori e non può essere pubblicata", + "error.page.changeStatus.permission": "Lo stato di questa pagina non può essere cambiato", + "error.page.changeStatus.toDraft.invalid": "La pagina \"{slug}\" non può essere convertita in bozza", + "error.page.changeTemplate.invalid": "Il template della pagina \"{slug}\" non può essere cambiato", + "error.page.changeTemplate.permission": "Non ti è permesso modificare il template di \"{slug}\"", + "error.page.changeTitle.empty": "Il titolo non può essere vuoto", + "error.page.changeTitle.permission": "Non ti è permesso modificare il titolo di \"{slug}\"", + "error.page.create.permission": "Non ti è permesso creare \"{slug}\"", + "error.page.delete": "La pagina \"{slug}\" non può essere eliminata", + "error.page.delete.confirm": "Inserisci il titolo della pagina per confermare", + "error.page.delete.hasChildren": "La pagina ha sottopagine e non può essere eliminata", + "error.page.delete.permission": "Non ti è permesso eliminare \"{slug}\"", + "error.page.draft.duplicate": "Una bozza di pagina con l'URL \"{slug}\" esiste già", + "error.page.duplicate": "Una pagina con l'URL \"{slug}\" esiste già", + "error.page.duplicate.permission": "Non ti è permesso duplicare \"{slug}\"", + "error.page.move.ancestor": "The page cannot be moved into itself", + "error.page.move.directory": "The page directory cannot be moved", + "error.page.move.duplicate": "A sub page with the URL appendix \"{slug}\" already exists", + "error.page.move.notFound": "The moved page could not be found", + "error.page.move.permission": "You are not allowed to move \"{slug}\"", + "error.page.move.template": "The \"{template}\" template is not accepted as a subpage of \"{parent}\"", + "error.page.notFound": "La pagina \"{slug}\" non è stata trovata", + "error.page.num.invalid": "Inserisci un numero di ordinamento valido. I numeri non devono essere negativi", + "error.page.slug.invalid": "Per favore inserisci un suffisso valido per l'URL", + "error.page.slug.maxlength": "Lo \"slug\" dev'essere più corto di \"{length}\" caratteri", + "error.page.sort.permission": "La pagina \"{slug}\" non può essere ordinata", + "error.page.status.invalid": "Imposta uno stato valido per la pagina", + "error.page.undefined": "La pagina non \u00e8 stata trovata", + "error.page.update.permission": "Non ti è permesso modificare \"{slug}\"", + + "error.section.files.max.plural": "Non puoi aggiungere più di {max} file alla sezione \"{section}\"", + "error.section.files.max.singular": "Non puoi aggiungere più di un file alla sezione \"{section}\"", + "error.section.files.min.plural": "La sezione \"{section}\" richiede almeno {min} file", + "error.section.files.min.singular": "La sezione \"{section}\" richiede almeno un file", + + "error.section.pages.max.plural": "Non puoi aggiungere più di {max} pagine alla sezione \"{section}\"", + "error.section.pages.max.singular": "Non puoi aggiungere più di una pagina alla sezione \"{section}\"", + "error.section.pages.min.plural": "La sezione \"{section}\" richiede almeno {min} pagine", + "error.section.pages.min.singular": "La sezione \"{section}\" richiede almeno una pagina", + + "error.section.notLoaded": "Non è stato possibile caricare la sezione \"{name}\"", + "error.section.type.invalid": "Il tipo di sezione \"{type}\" non è valido", + + "error.site.changeTitle.empty": "Il titolo non può essere vuoto", + "error.site.changeTitle.permission": "Non ti è permesso modificare il titolo del sito", + "error.site.update.permission": "Non ti è permesso modificare i contenuti globali del sito", + + "error.structure.validation": "C'è un errore nel campo \"{field}\" nella riga {index}", + + "error.template.default.notFound": "Il template \"default\" non esiste", + + "error.unexpected": "Si è verificato un errore inaspettato! Abilita la modalità \"debug\" per ulteriori informazioni: https://getkirby.com/docs/reference/system/options/debug", + + "error.user.changeEmail.permission": "Non ti è permesso modificare l'indirizzo email di \"{name}\"", + "error.user.changeLanguage.permission": "Non ti è permesso modificare la lingua per l'utente \"{name}\"", + "error.user.changeName.permission": "Non ti è permesso modificare il nome dell'utente \"{name}\"", + "error.user.changePassword.permission": "Non ti è permesso modificare la password dell'utente \"{name}\"", + "error.user.changeRole.lastAdmin": "Il ruolo dell'ultimo amministratore non può esser cambiato", + "error.user.changeRole.permission": "Non ti è permesso modificare il ruolo dell'utente \"{name}\"", + "error.user.changeRole.toAdmin": "Non ti è permesso assegnare il ruolo di amministratore ad altri utenti", + "error.user.create.permission": "Non ti è permesso creare questo utente", + "error.user.delete": "L'utente non pu\u00f2 essere eliminato", + "error.user.delete.lastAdmin": "L'ultimo amministratore non può essere eliminato", + "error.user.delete.lastUser": "L'ultimo utente non può essere eliminato", + "error.user.delete.permission": "Non ti \u00e8 permesso eliminare questo utente ", + "error.user.duplicate": "Esiste già un utente con l'indirizzo email \"{email}\"", + "error.user.email.invalid": "Inserisci un indirizzo email valido", + "error.user.language.invalid": "Inserisci una lingua valida", + "error.user.notFound": "L'utente non \u00e8 stato trovato", + "error.user.password.excessive": "Please enter a valid password. Passwords must not be longer than 1000 characters.", + "error.user.password.invalid": "Per favore inserisci una password valida. Le password devono essere lunghe almeno 8 caratteri", + "error.user.password.notSame": "Le password non corrispondono", + "error.user.password.undefined": "L'utente non ha una password", + "error.user.password.wrong": "Password sbagliata", + "error.user.role.invalid": "Inserisci un ruolo valido", + "error.user.undefined": "L'utente non è stato trovato", + "error.user.update.permission": "Non ti è permesso aggiornare l'utente \"{name}\"", + + "error.validation.accepted": "Per favore conferma", + "error.validation.alpha": "Puoi inserire solo caratteri tra a-z", + "error.validation.alphanum": "Puoi inserire solo caratteri tra a-z e numeri 0-9", + "error.validation.anchor": "Please enter a correct link anchor", + "error.validation.between": "Inserisci un valore tra \"{min}\" e \"{max}\"", + "error.validation.boolean": "Per favore conferma o nega", + "error.validation.color": "Please enter a valid color in the {format} format", + "error.validation.contains": "Inserisci un valore che contiene \"{needle}\"", + "error.validation.date": "Inserisci una data valida", + "error.validation.date.after": "Inserisci una data dopo il {date}", + "error.validation.date.before": "Inserisci una data prima del {date}", + "error.validation.date.between": "Inserisci una data tra {min} e {max}", + "error.validation.denied": "Per favore nega", + "error.validation.different": "Il valore non dev'essere \"{other}\"", + "error.validation.email": "Inserisci un indirizzo email valido", + "error.validation.endswith": "Il valore non deve finire con \"{end}\"", + "error.validation.filename": "Inserisci un nome del file valido", + "error.validation.in": "Inserisci uno dei seguenti valori: ({in})", + "error.validation.integer": "Inserisci un numero intero", + "error.validation.ip": "Inserisci un indirizzo IP valido", + "error.validation.less": "Inserisci un valore inferiore a {max}", + "error.validation.linkType": "The link type is not allowed", + "error.validation.match": "Il valore non corrisponde al pattern previsto", + "error.validation.max": "Inserisci un valore inferiore o uguale a {max}", + "error.validation.maxlength": "Inserisci un testo più corto. (max. {max} caratteri)", + "error.validation.maxwords": "Non inserire più di {max} parola/e", + "error.validation.min": "Inserisci un valore superiore o uguale a {min}", + "error.validation.minlength": "Inserisci un testo più lungo. (min. {min} caratteri)", + "error.validation.minwords": "Inserisci almeno {min} parola/e", + "error.validation.more": "Inserisci un valore superiore a {min}", + "error.validation.notcontains": "Inserisci un valore che non contenga \"{needle}\"", + "error.validation.notin": "Non inserire nessuno dei valori seguenti: ({notIn})", + "error.validation.option": "Seleziona un'opzione valida", + "error.validation.num": "Inserisci un numero valido", + "error.validation.required": "Inserisci qualcosa", + "error.validation.same": "Inserisci \"{other}\"", + "error.validation.size": "La dimensione del valore dev'essere \"{size}\"", + "error.validation.startswith": "Il valore deve iniziare con \"{start}\"", + "error.validation.tel": "Please enter an unformatted phone number", + "error.validation.time": "Inserisci un orario valido", + "error.validation.time.after": "Inserisci un orario dopo le {time}", + "error.validation.time.before": "Inserisci un orario prima delle {time}", + "error.validation.time.between": "Inserisci un orario tra le {min} e le {max}", + "error.validation.uuid": "Please enter a valid UUID", + "error.validation.url": "Inserisci un URL valido", + + "expand": "Espandi", + "expand.all": "Espandi tutto", + + "field.invalid": "The field is invalid", + "field.required": "Il campo è obbligatorio", + "field.blocks.changeType": "Cambia tipo", + "field.blocks.code.name": "Codice", + "field.blocks.code.language": "Lingua", + "field.blocks.code.placeholder": "Il tuo codice …", + "field.blocks.delete.confirm": "Vuoi veramente eliminare questo blocco?", + "field.blocks.delete.confirm.all": "Vuoi veramente eliminare tutti i blocchi? ", + "field.blocks.delete.confirm.selected": "Vuoi veramente eliminare i blocchi selezionati?", + "field.blocks.empty": "Nessun blocco inserito", + "field.blocks.fieldsets.empty": "No fieldsets yet", + "field.blocks.fieldsets.label": "Seleziona il tipo di blocco …", + "field.blocks.fieldsets.paste": "Press {{ shortcut }} to import layouts/blocks from your clipboard Only those allowed in the current field will get inserted.", + "field.blocks.gallery.name": "Galleria", + "field.blocks.gallery.images.empty": "Nessuna immagine inserita", + "field.blocks.gallery.images.label": "Immagini", + "field.blocks.heading.level": "Livello", + "field.blocks.heading.name": "Titolo", + "field.blocks.heading.text": "Testo", + "field.blocks.heading.placeholder": "Titolo …", + "field.blocks.image.alt": "Testo alternativo", + "field.blocks.image.caption": "Didascalia", + "field.blocks.image.crop": "Ritaglio", + "field.blocks.image.link": "Link", + "field.blocks.image.location": "Posizione", + "field.blocks.image.location.internal": "This website", + "field.blocks.image.location.external": "External source", + "field.blocks.image.name": "Immagine", + "field.blocks.image.placeholder": "Seleziona un'immagine", + "field.blocks.image.ratio": "Rapporto", + "field.blocks.image.url": "URL immagine", + "field.blocks.line.name": "Linea", + "field.blocks.list.name": "Lista", + "field.blocks.markdown.name": "Markdown", + "field.blocks.markdown.label": "Testo", + "field.blocks.markdown.placeholder": "Markdown …", + "field.blocks.quote.name": "Citazione", + "field.blocks.quote.text.label": "Testo", + "field.blocks.quote.text.placeholder": "Citazione …", + "field.blocks.quote.citation.label": "Fonte", + "field.blocks.quote.citation.placeholder": "di …", + "field.blocks.text.name": "Testo", + "field.blocks.text.placeholder": "Testo …", + "field.blocks.video.autoplay": "Autoplay", + "field.blocks.video.caption": "Didascalia", + "field.blocks.video.controls": "Controls", + "field.blocks.video.location": "Posizione", + "field.blocks.video.loop": "Loop", + "field.blocks.video.muted": "Muted", + "field.blocks.video.name": "Video", + "field.blocks.video.placeholder": "Inserisci un URL di un video", + "field.blocks.video.poster": "Poster", + "field.blocks.video.preload": "Preload", + "field.blocks.video.url.label": "URL Video", + "field.blocks.video.url.placeholder": "https://youtube.com/?v=", + + "field.files.empty": "Nessun file selezionato", + + "field.layout.change": "Change layout", + "field.layout.delete": "Elimina layout", + "field.layout.delete.confirm": "Vuoi veramente eliminare questo layout?", + "field.layout.delete.confirm.all": "Do you really want to delete all layouts?", + "field.layout.empty": "Nessuna riga inserita", + "field.layout.select": "Scegli un layout", + + "field.object.empty": "Ancora nessuna informazione", + + "field.pages.empty": "Nessuna pagina selezionata", + + "field.structure.delete.confirm": "Vuoi veramente eliminare questo elemento?", + "field.structure.delete.confirm.all": "Vuoi davvero cancellare tutte le voci?", + "field.structure.empty": "Non ci sono ancora elementi.", + + "field.users.empty": "Nessun utente selezionato", + + "fields.empty": "No fields yet", + + "file": "File", + "file.blueprint": "Questo file non ha ancora un blueprint. Puoi definire la sua configurazione in /site/blueprints/files/{blueprint}.yml", + "file.changeTemplate": "Cambia template", + "file.changeTemplate.notice": "Changing the file's template will remove content for fields that don't match in type. If the new template defines certain rules, e.g. image dimensions, those will also be applied irreversibly. Use with caution.", + "file.delete.confirm": "Sei sicuro di voler eliminare questo file?", + "file.focus.placeholder": "Set focal point", + "file.focus.reset": "Remove focal point", + "file.focus.title": "Focus", + "file.sort": "Cambia posizione", + + "files": "Files", + "files.empty": "Nessun file caricato", + + "filter": "Filter", + + "hide": "Nascondi", + "hour": "Ora", + "hue": "Hue", + "import": "Importa", + "info": "Info", + "insert": "Inserisci", + "insert.after": "Inserisci dopo", + "insert.before": "Inserisci prima", + "install": "Installa", + + "installation": "Installazione", + "installation.completed": "Il pannello è stato installato", + "installation.disabled": "L'installazione del pannello è disabilitata di default sui server pubblici. Esegui l'installazione in locale oppure abilitala usando l'opzione panel.install.", + "installation.issues.accounts": "/site/accounts non esiste o non dispone dei permessi di scrittura", + "installation.issues.content": "La cartella /content non esiste o non dispone dei permessi di scrittura", + "installation.issues.curl": "È necessaria l'estensione CURL", + "installation.issues.headline": "Il pannello non può esser installato", + "installation.issues.mbstring": "È necessaria l'estensione MB String", + "installation.issues.media": "La cartella /media non esiste o non dispone dei permessi di scrittura", + "installation.issues.php": "Assicurati di utilizzare PHP 8+", + "installation.issues.sessions": "La cartella /site/sessionsnon esiste o non dispone dei permessi di scrittura", + + "language": "Lingua", + "language.code": "Codice", + "language.convert": "Imposta come predefinito", + "language.convert.confirm": "

Sei sicuro di voler convertire {name} nella lingua predefinita? Questa operazione non può essere annullata.

Se {name} non contiene tutte le traduzioni, non ci sarà più una versione alternativa valida e parti del sito potrebbero rimanere vuote.

", + "language.create": "Aggiungi una nuova lingua", + "language.default": "Lingua di default", + "language.delete.confirm": "Sei sicuro di voler eliminare la lingua {name} con tutte le traduzioni? Non sarà possibile annullare!", + "language.deleted": "La lingua è stata eliminata", + "language.direction": "Direzione di lettura", + "language.direction.ltr": "Sinistra a destra", + "language.direction.rtl": "Destra a sinistra", + "language.locale": "Stringa \"PHP locale\"", + "language.locale.warning": "Stai usando una impostazione personalizzata per il locale. Modificalo nel file della lingua situato in /site/languages", + "language.name": "Nome", + "language.secondary": "Secondary language", + "language.settings": "Language settings", + "language.updated": "La lingua è stata aggiornata", + "language.variables": "Language variables", + "language.variables.empty": "No translations yet", + + "language.variable.delete.confirm": "Do you really want to delete the variable for {key}?", + "language.variable.key": "Key", + "language.variable.notFound": "The variable could not be found", + "language.variable.value": "Value", + + "languages": "Lingue", + "languages.default": "Lingua di default", + "languages.empty": "Non ci sono lingue impostate", + "languages.secondary": "Lingue secondarie", + "languages.secondary.empty": "Non ci sono lingue secondarie impostate", + + "license": "Licenza di Kirby", + "license.activate": "Attiva ora", + "license.activate.label": "Attiva la tua licenza ora", + "license.activate.domain": "La tua licenza sarà attivata per {host}.", + "license.activate.local": "Stai per attivare la licenza per il dominio locale {host}. Se questo sito verrà rilasciato su un dominio pubblico, ti preghiamo di attivarla lì. Se {host} è il dominio per il quale desideri ottenere la licenza di Kirby, procedi pure.", + "license.activated": "Attivata", + "license.buy": "Acquista una licenza", + "license.code": "Codice", + "license.code.help": "Hai ricevuto il codice di licenza tramite email dopo l'acquisto. Per favore inseriscilo per registrare Kirby.", + "license.code.label": "Inserisci il codice di licenza", + "license.status.active.info": "Comprende nuove versioni major entro il {date}", + "license.status.active.label": "Licenza valida", + "license.status.demo.info": "Questa è un'installazione demo", + "license.status.demo.label": "Demo", + "license.status.inactive.info": "Rinnova la licenza per aggiornare a nuove versioni major", + "license.status.inactive.label": "Nessuna nuova versione major", + "license.status.legacy.bubble": "Pronto per rinnovare la licenza?", + "license.status.legacy.info": "La tua licenza non include questa versione", + "license.status.legacy.label": "Per favore rinnova la tua licenza", + "license.status.missing.bubble": "Pronto a lanciare il tuo sito?", + "license.status.missing.info": "Nessuna licenza valida", + "license.status.missing.label": "Attiva la tua licenza ora", + "license.manage": "Gestisci le tue licenze", + "license.purchased": "Acquistata", + "license.success": "Ti ringraziamo per aver supportato Kirby", + "license.unregistered.label": "Non registrato", + + "link": "Link", + "link.text": "Testo del link", + + "loading": "Caricamento", + + "lock.unsaved": "Modifiche non salvate", + "lock.unsaved.empty": "Non ci sono altre modifiche non salvate", + "lock.isLocked": "Unsaved changes by {email}", + "lock.unlock": "Sblocca", + "lock.unlock.submit": "Unlock and overwrite unsaved changes by {email}", + "lock.isUnlocked": "Was unlocked by another user", + + "login": "Accedi", + "login.code.label.login": "Codice di accesso", + "login.code.label.password-reset": "Codice per reimpostare la password", + "login.code.placeholder.email": "000 000", + "login.code.placeholder.totp": "000000", + "login.code.text.email": "Qualora il tuo indirizzo email fosse registrato, il codice richiesto è stato inviato tramite email.", + "login.code.text.totp": "Inserisci il codice monouso dalla tua app di autenticazione.", + "login.email.login.body": "Ciao {user.nameOrEmail},\n\nHai recentemente richiesto un codice di login per il pannello di controllo di {site}.\nIl seguente codice di login sarà valido per {timeout} minuti:\n\n{code}\n\nSe non hai richiesto un codice di login, per favore ignora questa mail o contatta il tuo amministratore in caso di domande.\nPer sicurezza, per favore NON inoltrare questa email.", + "login.email.login.subject": "Il tuo codice di accesso", + "login.email.password-reset.body": "Ciao {user.nameOrEmail},\n\nHai recentemente richiesto di resettare la password per il pannello di controllo di {site}.\nIl seguente codice di reset della password sarà valido per {timeout} minuti:\n\n{code}\n\nSe non hai richiesto di resettare la password per favore ignora questa email o contatta il tuo amministratore in caso di domande.\nPer sicurezza, per favore NON inoltrare questa email.", + "login.email.password-reset.subject": "Il tuo codice di reimpostazione della password", + "login.remember": "Resta collegato", + "login.reset": "Reimposta la password", + "login.toggleText.code.email": "Accedi tramite email", + "login.toggleText.code.email-password": "Accedi con la password", + "login.toggleText.password-reset.email": "Hai dimenticato la password?", + "login.toggleText.password-reset.email-password": "← Torna al login", + "login.totp.enable.option": "Configura i codici monouso", + "login.totp.enable.intro": "Le app di autenticazione generano codici monouso che puoi usare come secondo fattore quando accedi al tuo account.", + "login.totp.enable.qr.label": "1. Scansiona il codice QR", + "login.totp.enable.qr.help": "Impossibile eseguire la scansione? Aggiungi manualmente la chiave di configurazione {secret} alla tua app di autenticazione.", + "login.totp.enable.confirm.headline": "2. Conferma con il codice generato", + "login.totp.enable.confirm.text": "La tua app genera un nuovo codice monouso ogni 30 secondi. Inserisci il codice attuale per completare la configurazione:", + "login.totp.enable.confirm.label": "Codice attuale", + "login.totp.enable.confirm.help": "Dopo la configurazione, ti chiederemo un codice monouso ogni volta che effettuerai l'accesso. ", + "login.totp.enable.success": "Codici monouso attivati", + "login.totp.disable.option": "Disattiva i codici monouso", + "login.totp.disable.label": "Inserisci la tua password per disattivare i codici monouso", + "login.totp.disable.help": "In futuro, un secondo fattore diverso, come un codice login inviato tramite email, sarà richiesto per l'accesso. Potrai sempre reimpostare i codici monouso più tardi.", + "login.totp.disable.admin": "

Questo disattiverà i codici monouso per {user}.

In futuro verrà richiesto un secondo fattore diverso per l'accesso, per esempio un codice inviato per email. {user} potrà impostare nuovamente i codici monouso dopo il suo prossimo accesso.

", + "login.totp.disable.success": "Codici monouso disattivati", + + "logout": "Esci", + + "merge": "Merge", + "menu": "Menu", + "meridiem": "AM/PM", + "mime": "MIME Type", + "minutes": "Minuti", + + "month": "Mese", + "months.april": "Aprile", + "months.august": "Agosto", + "months.december": "Dicembre", + "months.february": "Febbraio", + "months.january": "Gennaio", + "months.july": "Luglio", + "months.june": "Giugno", + "months.march": "Marzo", + "months.may": "Maggio", + "months.november": "Novembre", + "months.october": "Ottobre", + "months.september": "Settembre", + + "more": "Di più", + "move": "Move", + "name": "Nome", + "next": "Prossimo", + "night": "Night", + "no": "no", + "off": "off", + "on": "on", + "open": "Apri", + "open.newWindow": "Apri in una finestra nuova", + "option": "Option", + "options": "Opzioni", + "options.none": "Nessuna opzione", + "options.all": "Mostra tutte le {count} opzioni", + + "orientation": "Orientamento", + "orientation.landscape": "Orizzontale", + "orientation.portrait": "Verticale", + "orientation.square": "Quadrato", + + "page": "Page", + "page.blueprint": "Questa pagina non ha ancora un blueprint. Puoi definire la sua configurazione in /site/blueprints/pages/{blueprint}.yml", + "page.changeSlug": "Modifica URL", + "page.changeSlug.fromTitle": "Crea in base al titolo", + "page.changeStatus": "Cambia stato", + "page.changeStatus.position": "Scegli una posizione", + "page.changeStatus.select": "Seleziona un nuovo stato", + "page.changeTemplate": "Cambia template", + "page.changeTemplate.notice": "Changing the page's template will remove content for fields that don't match in type. Use with caution.", + "page.create": "Crea come \"{status}\"", + "page.delete.confirm": "Sei sicuro di voler eliminare questa pagina?", + "page.delete.confirm.subpages": "Questa pagina ha sottopagine.
Anche tutte le sottopagine verranno eliminate.", + "page.delete.confirm.title": "Inserisci il titolo della pagina per confermare", + "page.duplicate.appendix": "Copia", + "page.duplicate.files": "Copia file", + "page.duplicate.pages": "Copia pagine", + "page.move": "Move page", + "page.sort": "Cambia posizione", + "page.status": "Stato", + "page.status.draft": "Bozza", + "page.status.draft.description": "Questa pagina è una bozza ed è visibile soltanto agli utenti registrati o tramite link segreto", + "page.status.listed": "Pubblico", + "page.status.listed.description": "La pagina è pubblicata per tutti", + "page.status.unlisted": "Non in elenco", + "page.status.unlisted.description": "La pagina è accessibile soltanto tramite URL", + + "pages": "Pagine", + "pages.empty": "Nessuna pagina", + "pages.status.draft": "Bozza", + "pages.status.listed": "Pubblicato", + "pages.status.unlisted": "Non in elenco", + + "pagination.page": "Pagina", + + "password": "Password", + "paste": "Incolla", + "paste.after": "Incolla dopo", + "paste.success": "{count} pasted!", + "pixel": "Pixel", + "plugin": "Plugin", + "plugins": "Plugins", + "prev": "Precedente", + "preview": "Anteprima", + "remove": "Rimuovi", + "rename": "Rinomina", + "renew": "Rinnova", + "replace": "Sostituisci", + "replace.with": "Replace with", + "retry": "Riprova", + "revert": "Abbandona", + "revert.confirm": "Sei sicuro di voler cancellare tutte le modifiche non salvate?", + + "role": "Ruolo", + "role.admin.description": "L'amministratore ha tutti i permessi", + "role.admin.title": "Amministratore", + "role.all": "Tutti", + "role.empty": "Non ci sono utenti con questo ruolo", + "role.description.placeholder": "Nessuna descrizione", + "role.nobody.description": "Questo è un ruolo \"fallback\" senza permessi", + "role.nobody.title": "Nessuno", + + "save": "Salva", + "search": "Cerca", + "search.min": "Inserisci almeno {min} caratteri per la ricerca", + "search.all": "Mostra tutti i {count} risultati", + "search.results.none": "Nessun risultato", + + "section.invalid": "The section is invalid", + "section.required": "La sezione è obbligatoria", + + "security": "Sicurezza", + "select": "Seleziona", + "server": "Server", + "settings": "Impostazioni", + "show": "Mostra", + "site.blueprint": "Il sito non ha ancora un \"blueprint\". Puoi impostarne uno in /site/blueprints/site.yml", + "size": "Dimensioni", + "slug": "URL", + "sort": "Ordina", + "sort.drag": "Drag to sort …", + "split": "Split", + + "stats.empty": "Nessuna segnalazione", + "status": "Stato", + + "system.info.copy": "Copy info", + "system.info.copied": "System info copied", + "system.issues.content": "La cartella content sembra essere esposta", + "system.issues.eol.kirby": "La versione di Kirby installata è giunta alla fine del suo ciclo di vita e non riceverà ulteriori aggiornamenti di sicurezza ", + "system.issues.eol.plugin": "La versione installata del plugin { plugin } è giunta alla fine del suo ciclo di vita e non riceverà ulteriori aggiornamenti di sicurezza", + "system.issues.eol.php": "La versione {release} di PHP installata è giunta alla fine del suo ciclo di vita e non riceverà ulteriori aggiornamenti di sicurezza", + "system.issues.debug": "Il debug deve essere disattivato in produzione", + "system.issues.git": "La cartella .git sembra essere esposta", + "system.issues.https": "Raccomandiamo l'utilizzo di HTTPS per tutti i siti", + "system.issues.kirby": "La cartella kirby sembra essere esposta", + "system.issues.site": "La cartella site sembra essere esposta", + "system.issues.vulnerability.kirby": "La tua installazione potrebbe essere colpita dalla seguente vulnerabilità ({ severity } gravità): { description }", + "system.issues.vulnerability.plugin": "La tua installazione potrebbe essere colpita dalla seguente vulnerabilità nel plugin { plugin } ({ severity } gravità): { description }", + "system.updateStatus": "Aggiorna lo stato", + "system.updateStatus.error": "Impossibile verificare gli aggiornamenti", + "system.updateStatus.not-vulnerable": "Nessuna vulnerabilità conosciuta", + "system.updateStatus.security-update": "Aggiornamento di sicurezza gratuito { version } disponibile", + "system.updateStatus.security-upgrade": "Aggiornamento { version } con le correzioni di sicurezza disponibili", + "system.updateStatus.unreleased": "Versione non rilasciata", + "system.updateStatus.up-to-date": "Aggiornato", + "system.updateStatus.update": "Aggiornamento gratuito { version } disponibile", + "system.updateStatus.upgrade": "Aggiornamento { version } disponibile", + + "tel": "Phone", + "tel.placeholder": "+49123456789", + "template": "Template", + "title": "Titolo", + "today": "Oggi", + + "toolbar.button.clear": "Clear formatting", + "toolbar.button.code": "Codice", + "toolbar.button.bold": "Grassetto", + "toolbar.button.email": "Email", + "toolbar.button.headings": "Titoli", + "toolbar.button.heading.1": "Titolo 1", + "toolbar.button.heading.2": "Titolo 2", + "toolbar.button.heading.3": "Titolo 3", + "toolbar.button.heading.4": "Titolo 4", + "toolbar.button.heading.5": "Titolo 5", + "toolbar.button.heading.6": "Titolo 6", + "toolbar.button.italic": "Corsivo", + "toolbar.button.file": "File", + "toolbar.button.file.select": "Seleziona un file", + "toolbar.button.file.upload": "Carica un file", + "toolbar.button.link": "Link", + "toolbar.button.paragraph": "Paragrafo", + "toolbar.button.strike": "Barrato", + "toolbar.button.sub": "Subscript", + "toolbar.button.sup": "Superscript", + "toolbar.button.ol": "Elenco numerato", + "toolbar.button.underline": "Sottolinea", + "toolbar.button.ul": "Elenco puntato", + + "translation.author": "Kirby Team, Roman Steiner, Manu Moreale", + "translation.direction": "ltr", + "translation.name": "Italiano", + "translation.locale": "it_IT", + + "type": "Tipo", + + "upload": "Carica", + "upload.error.cantMove": "Non è stato possibile spostare il file caricato", + "upload.error.cantWrite": "Impossibile scrivere il file su disco", + "upload.error.default": "Impossibile caricare il file", + "upload.error.extension": "Caricamento del file interrotto per via dell'estensione", + "upload.error.formSize": "La dimensione del file caricato supera la direttiva MAX_FILE_SIZE specificata nel form", + "upload.error.iniPostSize": "La dimensione del file caricato supera la direttiva post_max_size specificata in php.ini", + "upload.error.iniSize": "La dimensione del file caricato supera la direttiva upload_max_filesize specificata in php.ini", + "upload.error.noFile": "Il file non è stato caricato", + "upload.error.noFiles": "Nessun file è stato caricato", + "upload.error.partial": "Il file è stato caricato solo parzialmente", + "upload.error.tmpDir": "Manca la cartella temporanea", + "upload.errors": "Errore", + "upload.progress": "Caricamento...", + + "url": "URL", + "url.placeholder": "https://esempio.com", + + "user": "Utente", + "user.blueprint": "Puoi definire ulteriori sezioni e campi del form aggiuntivi per questo ruolo in /site/blueprints/users/{blueprint}.yml", + "user.changeEmail": "Modifica email", + "user.changeLanguage": "Cambia lingua", + "user.changeName": "Rinomina questo utente", + "user.changePassword": "Cambia password", + "user.changePassword.new": "Nuova password", + "user.changePassword.new.confirm": "Conferma la nuova password...", + "user.changeRole": "Cambia ruolo", + "user.changeRole.select": "Seleziona un nuovo ruolo", + "user.create": "Aggiungi nuovo utente", + "user.delete": "Elimina questo utente", + "user.delete.confirm": "Sei sicuro di voler eliminare l'utente
{email}?", + + "users": "Utenti", + + "version": "Versione di Kirby", + "version.current": "Versione corrente", + "version.latest": "Ultima versione", + "versionInformation": "Informazioni sulla versione", + + "view.account": "Il tuo account", + "view.installation": "Installazione", + "view.languages": "Lingue", + "view.resetPassword": "Reimposta la password", + "view.site": "Sito", + "view.system": "Sistema", + "view.users": "Utenti", + + "welcome": "Benvenuto", + "year": "Anno", + "yes": "sì" +} diff --git a/kirby/i18n/translations/ko.json b/kirby/i18n/translations/ko.json new file mode 100644 index 0000000..cfb180e --- /dev/null +++ b/kirby/i18n/translations/ko.json @@ -0,0 +1,730 @@ +{ + "account.changeName": "이름 변경", + "account.delete": "계정 삭제", + "account.delete.confirm": "계정을 삭제할까요? 계정을 삭제한 뒤에는 즉시 로그아웃되며, 삭제된 계정은 복구할 수 없습니다.", + + "activate": "활성화", + "add": "\ucd94\uac00", + "alpha": "알파", + "author": "저자", + "avatar": "프로필 이미지", + "back": "뒤로", + "cancel": "\ucde8\uc18c", + "change": "\ubcc0\uacbd", + "close": "\ub2eb\uae30", + "changes": "변경", + "confirm": "확인", + "collapse": "접기", + "collapse.all": "모두 접기", + "color": "색", + "coordinates": "좌표", + "copy": "복사", + "copy.all": "모두 복사", + "copy.success": "복사되었습니다. ({count})", + "create": "등록", + "custom": "개인화", + + "date": "날짜", + "date.select": "날짜 지정", + + "day": "일", + "days.fri": "\uae08", + "days.mon": "\uc6d4", + "days.sat": "\ud1a0", + "days.sun": "\uc77c", + "days.thu": "\ubaa9", + "days.tue": "\ud654", + "days.wed": "\uc218", + + "debugging": "디버그", + + "delete": "\uc0ad\uc81c", + "delete.all": "모두 삭제", + + "dialog.fields.empty": "필드가 없습니다.", + "dialog.files.empty": "선택할 파일이 없습니다.", + "dialog.pages.empty": "선택할 페이지가 없습니다.", + "dialog.text.empty": "정의된 텍스트가 없습니다.", + "dialog.users.empty": "선택할 사용자가 없습니다.", + + "dimensions": "크기", + "disable": "비활성화", + "disabled": "비활성화", + "discard": "무시", + + "drawer.fields.empty": "필드가 없습니다.", + + "domain": "도메인", + "download": "다운로드", + "duplicate": "복제", + + "edit": "\ud3b8\uc9d1", + + "email": "\uc774\uba54\uc77c \uc8fc\uc18c", + "email.placeholder": "mail@example.com", + + "enter": "Enter", + "entries": "항목", + "entry": "항목", + + "environment": "구동 환경", + + "error": "오류", + "error.access.code": "코드가 올바르지 않습니다.", + "error.access.login": "로그인할 수 없습니다.", + "error.access.panel": "패널에 접근할 권한이 없습니다.", + "error.access.view": "패널에 접근할 권한이 없습니다.", + + "error.avatar.create.fail": "프로필 이미지를 업로드할 수 없습니다.", + "error.avatar.delete.fail": "\ud504\ub85c\ud544 \uc774\ubbf8\uc9c0\ub97c \uc0ad\uc81c\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.", + "error.avatar.dimensions.invalid": "프로필 이미지의 너비와 높이를 3,000픽셀 이하로 설정하세요.", + "error.avatar.mime.forbidden": "프로필 이미지의 확장자(JPG, JPEG, PNG)를 확인하세요.", + + "error.blueprint.notFound": "블루프린트({name})를 불러올 수 없습니다.", + + "error.blocks.max.plural": "블록을 {max}개 이상 추가할 수 없습니다.", + "error.blocks.max.singular": "블록을 하나 이상 추가할 수 없습니다.", + "error.blocks.min.plural": "블록을 {min}개 이상 추가하세요.", + "error.blocks.min.singular": "블록을 하나 이상 추가하세요.", + "error.blocks.validation": "블록 유형({fieldset})을 사용하는 블록({index})의 필드({field})에 오류가 있습니다.", + + "error.cache.type.invalid": "캐시 형식(({type})이 올바르지 않습니다.", + + "error.email.preset.notFound": "기본 이메일 주소({name})가 없습니다.", + + "error.field.converter.invalid": "컨버터({converter})가 올바르지 않습니다.", + "error.field.type.missing": "필드({name}): 필드 타입({type})이 없습니다.", + + "error.file.changeName.empty": "이름을 입력하세요.", + "error.file.changeName.permission": "파일명({filename})을 변경할 권한이 없습니다.", + "error.file.changeTemplate.invalid": "파일({id}) 템플릿을 다음 템플릿({template})으로 변경할 수 없습니다. (valid: \"{blueprints}\")", + "error.file.changeTemplate.permission": "파일({id}) 템플릿을 변경할 수 없습니다.", + + "error.file.duplicate": "파일명이 같은 파일({filename})이 있습니다.", + "error.file.extension.forbidden": "이 확장자({extension})는 업로드할 수 없습니다.", + "error.file.extension.invalid": "확장자({extension})가 올바르지 않습니다.", + "error.file.extension.missing": "파일({filename})에 확장자가 없습니다.", + "error.file.maxheight": "이미지의 높이는 {height}픽셀을 초과할 수 없습니다.", + "error.file.maxsize": "파일이 너무 큽니다.", + "error.file.maxwidth": "이미지의 너비는 {width}픽셀을 초과할 수 없습니다.", + "error.file.mime.differs": "기존 파일과 MIME 형식({mime})이 다릅니다.", + "error.file.mime.forbidden": "이 MIME 형식({mime})은 업로드할 수 없습니다.", + "error.file.mime.invalid": "MIME 형식({mime})이 올바르지 않습니다.", + "error.file.mime.missing": "파일({filename})의 MIME 형식을 확인할 수 없습니다.", + "error.file.minheight": "이미지의 높이를 {height}픽셀 이상으로 설정하세요.", + "error.file.minsize": "파일이 너무 작습니다.", + "error.file.minwidth": "이미지의 너비를 {width}픽셀 이상으로 설정하세요.", + "error.file.name.unique": "고유한 파일명을 지정하세요.", + "error.file.name.missing": "파일명을 입력하세요.", + "error.file.notFound": "파일({filename})이 없습니다.", + "error.file.orientation": "이미지의 비율({orientation})을 확인하세요.", + "error.file.type.forbidden": "이 형식({type})의 파일을 업로드할 권한이 없습니다.", + "error.file.type.invalid": "파일 형식({type})이 올바르지 않습니다.", + "error.file.undefined": "\ud30c\uc77c\uc774 \uc5c6\uc2b5\ub2c8\ub2e4.", + + "error.form.incomplete": "항목에 오류가 있습니다.", + "error.form.notSaved": "항목을 저장할 수 없습니다.", + + "error.language.code": "올바른 언어 코드를 입력하세요.", + "error.language.duplicate": "이미 등록한 언어입니다.", + "error.language.name": "올바른 언어명을 입력하세요.", + "error.language.notFound": "언어를 찾을 수 없습니다.", + + "error.layout.validation.block": "레이아웃({layoutIndex})의 특정 블록 유형({fieldset})을 사용하는 블록({blockIndex})의 특정 필드({field})에 오류가 있습니다.", + "error.layout.validation.settings": "레이아웃({index}) 옵션을 확인하세요.", + + "error.license.domain": "라이선스에 대한 도메인이 누락되었습니다.", + "error.license.email": "올바른 이메일 주소를 입력하세요.", + "error.license.format": "올바른 라이선스 코드를 입력하세요.", + "error.license.verification": "라이선스 키가 올바르지 않습니다.", + + "error.login.totp.confirm.invalid": "코드가 올바르지 않습니다.", + "error.login.totp.confirm.missing": "현재 코드를 입력하세요.", + + "error.object.validation": "필드({label})에 오류가 있습니다.\n{message}", + + "error.offline": "패널이 오프라인 상태입니다.", + + "error.page.changeSlug.permission": "고유 주소({slug})를 변경할 권한이 없습니다.", + "error.page.changeSlug.reserved": "상위 페이지는 이 경로({path})로 시작할 수 없습니다.", + "error.page.changeStatus.incomplete": "페이지를 공개할 수 없습니다.", + "error.page.changeStatus.permission": "페이지 상태를 변경할 수 없습니다.", + "error.page.changeStatus.toDraft.invalid": "페이지({slug}) 상태를 초안으로 변경할 수 없습니다.", + "error.page.changeTemplate.invalid": "페이지({slug}) 템플릿을 변경할 수 없습니다.", + "error.page.changeTemplate.permission": "페이지({slug}) 템플릿을 변경할 권한이 없습니다.", + "error.page.changeTitle.empty": "제목을 입력하세요.", + "error.page.changeTitle.permission": "페이지({slug}) 제목을 변경할 권한이 없습니다.", + "error.page.create.permission": "페이지({slug})를 등록할 권한이 없습니다.", + "error.page.delete": "페이지({slug})를 삭제할 수 없습니다.", + "error.page.delete.confirm": "페이지를 삭제하려면 페이지의 제목을 입력하세요.", + "error.page.delete.hasChildren": "하위 페이지가 있는 페이지는 삭제할 수 없습니다.", + "error.page.delete.permission": "페이지({slug})를 삭제할 권한이 없습니다.", + "error.page.draft.duplicate": "고유 주소({slug})가 같은 초안 페이지가 있습니다.", + "error.page.duplicate": "고유 주소({slug})가 같은 페이지가 있습니다.", + "error.page.duplicate.permission": "페이지({slug})를 복제할 권한이 없습니다.", + "error.page.move.ancestor": "해당 페이지로 이동할 수 없습니다.", + "error.page.move.directory": "페이지 디렉토리는 이동할 수 없습니다.", + "error.page.move.duplicate": "고유 주소({slug})가 같은 서브 페이지가 있습니다.", + "error.page.move.notFound": "이동된 페이지를 찾을 수 없습니다.", + "error.page.move.permission": "페이지({slug})를 이동할 권한이 없습니다.", + "error.page.move.template": "이 템플릿({template})은 이 페이지({parent})의 서브 페이지로 이동할 수 없습니다.", + "error.page.notFound": "페이지({slug})가 없습니다.", + "error.page.num.invalid": "올바른 정수를 입력하세요.", + "error.page.slug.invalid": "올바른 URL을 입력하세요.", + "error.page.slug.maxlength": "고유 주소를 {length}자 이하로 입력하세요.", + "error.page.sort.permission": "페이지({slug})를 정렬할 수 없습니다.", + "error.page.status.invalid": "올바른 상태를 설정하세요.", + "error.page.undefined": "\ud398\uc774\uc9c0\uac00 \uc5c6\uc2b5\ub2c8\ub2e4.", + "error.page.update.permission": "페이지({slug})를 변경할 권한이 없습니다.", + + "error.section.files.max.plural": "이 섹션({section})에는 파일을 {max}개 이상 추가할 수 없습니다.", + "error.section.files.max.singular": "이 섹션({section})에는 파일을 하나 이상 추가할 수 없습니다.", + "error.section.files.min.plural": "이 섹션({section})에는 파일이 {min}개 이상 필요합니다.", + "error.section.files.min.singular": "이 섹션({section})에는 파일이 하나 이상 필요합니다.", + + "error.section.pages.max.plural": "이 섹션({section})에는 페이지를 {max}개 이상 추가할 수 없습니다.", + "error.section.pages.max.singular": "이 섹션({section})에는 페이지를 하나 이상 추가할 수 없습니다.", + "error.section.pages.min.plural": "이 섹션({section})에는 페이지가 {min}개 이상 필요합니다.", + "error.section.pages.min.singular": "이 섹션({section})에는 페이지가 하나 이상 필요합니다.", + + "error.section.notLoaded": "섹션({name})을 확인할 수 없습니다.", + "error.section.type.invalid": "섹션 형식({type})이 올바르지 않습니다.", + + "error.site.changeTitle.empty": "제목을 입력하세요.", + "error.site.changeTitle.permission": "사이트명을 변경할 권한이 없습니다.", + "error.site.update.permission": "사이트 정보를 변경할 권한이 없습니다.", + + "error.structure.validation": "{index}번째 필드({field})에 오류가 있습니다.", + + "error.template.default.notFound": "기본 템플릿이 없습니다.", + + "error.unexpected": "오류가 발생했습니다. 디버그 모드를 활성화해 오류를 확인하세요. https://getkirby.com/docs/reference/system/options/debug", + + "error.user.changeEmail.permission": "사용자({name})의 이메일 주소를 변경할 권한이 없습니다.", + "error.user.changeLanguage.permission": "사용자({name})의 언어를 변경할 권한이 없습니다.", + "error.user.changeName.permission": "사용자명({name})을 변경할 권한이 없습니다.", + "error.user.changePassword.permission": "사용자({name})의 암호를 변경할 권한이 없습니다.", + "error.user.changeRole.lastAdmin": "최종 관리자의 역할은 변경할 수 없습니다.", + "error.user.changeRole.permission": "사용자({name})의 역할을 변경할 권한이 없습니다.", + "error.user.changeRole.toAdmin": "다른 사용자를 관리자로 지정할 권한이 없습니다.", + "error.user.create.permission": "사용자를 등록할 권한이 없습니다.", + "error.user.delete": "사용자({name})를 삭제할 수 없습니다.", + "error.user.delete.lastAdmin": "\ucd5c\uc885 \uad00\ub9ac\uc790\ub294 \uc0ad\uc81c\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.", + "error.user.delete.lastUser": "최종 사용자는 삭제할 수 없습니다.", + "error.user.delete.permission": "사용자({name})를 삭제할 권한이 없습니다.", + "error.user.duplicate": "이메일 주소({email})가 같은 사용자가 있습니다.", + "error.user.email.invalid": "올바른 이메일 주소를 입력하세요.", + "error.user.language.invalid": "올바른 언어를 입력하세요.", + "error.user.notFound": "사용자({name})가 없습니다.", + "error.user.password.excessive": "올바른 암호를 입력하세요. 암호는 1,000자를 넘을 수 없습니다.", + "error.user.password.invalid": "암호를 8자 이상으로 설정하세요.", + "error.user.password.notSame": "\uc554\ud638\ub97c \ud655\uc778\ud558\uc138\uc694.", + "error.user.password.undefined": "암호가 설정되지 않았습니다.", + "error.user.password.wrong": "암호가 올바르지 않습니다.", + "error.user.role.invalid": "올바른 역할을 지정하세요.", + "error.user.undefined": "사용자가 없습니다.", + "error.user.update.permission": "사용자({name})의 정보를 변경할 권한이 없습니다.", + + "error.validation.accepted": "확인하세요.", + "error.validation.alpha": "로마자(a~z)만 입력할 수 있습니다.", + "error.validation.alphanum": "로마자(a~z) 또는 숫자(0~9)만 입력할 수 있습니다.", + "error.validation.anchor": "올바른 링크를 입력하세요.", + "error.validation.between": "{min}, {max} 사이의 값을 입력하세요.", + "error.validation.boolean": "확인하거나 취소하세요.", + "error.validation.color": "색상 값은 {format} 형식으로 입력하세요.", + "error.validation.contains": "{needle}에 포함된 값을 입력하세요.", + "error.validation.date": "올바른 날짜를 입력하세요.", + "error.validation.date.after": "{date} 이후 날짜를 입력하세요.", + "error.validation.date.before": "{date} 이전 날짜를 입력하세요.", + "error.validation.date.between": "{min}, {max} 사이의 날짜를 입력하세요.", + "error.validation.denied": "취소하세요.", + "error.validation.different": "{other}에 포함된 값은 입력할 수 없습니다.", + "error.validation.email": "올바른 이메일 주소를 입력하세요.", + "error.validation.endswith": "값은 다음({end})으로 끝나야 합니다.", + "error.validation.filename": "올바른 파일명을 입력하세요.", + "error.validation.in": "{in} 중 하나를 입력하세요.", + "error.validation.integer": "올바른 정수를 입력하세요.", + "error.validation.ip": "올바른 IP 주소를 입력하세요.", + "error.validation.less": "{max} 미만의 값을 입력하세요.", + "error.validation.linkType": "이 형식의 링크는 입력할 수 없습니다.", + "error.validation.match": "입력한 값이 예상 패턴과 일치하지 않습니다.", + "error.validation.max": "{max} 이하의 값을 입력하세요.", + "error.validation.maxlength": "{max}자 이하의 값을 입력하세요.", + "error.validation.maxwords": "{max}자 이하를 입력하세요.", + "error.validation.min": "{min} 이상의 값을 입력하세요.", + "error.validation.minlength": "{min}자 이상의 값을 입력하세요.", + "error.validation.minwords": "{min}자 이상을 입력하세요.", + "error.validation.more": "{min} 이상의 값을 입력하세요.", + "error.validation.notcontains": "{needle}에 포함된 값은 입력할 수 없습니다.", + "error.validation.notin": "{notIn}에 포함된 값은 입력할 수 없습니다.", + "error.validation.option": "올바른 옵션을 선택하세요.", + "error.validation.num": "올바른 숫자를 입력하세요.", + "error.validation.required": "해당 항목을 확인하세요.", + "error.validation.same": "이 값({other})을 입력하세요.", + "error.validation.size": "값의 크기({size})를 확인하세요. ", + "error.validation.startswith": "값은 다음({start})으로 시작해야 합니다.", + "error.validation.tel": "숫자만 입력하세요.", + "error.validation.time": "올바른 시각을 입력하세요.", + "error.validation.time.after": "{time} 이후 시각을 입력하세요.", + "error.validation.time.before": "{time} 이전 시각을 입력하세요.", + "error.validation.time.between": "{min}, {max} 사이의 시각을 입력하세요.", + "error.validation.uuid": "올바른 UUID를 입력하세요.", + "error.validation.url": "올바른 URL을 입력하세요.", + + "expand": "열기", + "expand.all": "모두 열기", + + "field.invalid": "필드가 올바르지 않습니다.", + "field.required": "필드를 채우세요.", + "field.blocks.changeType": "유형 변경", + "field.blocks.code.name": "코드", + "field.blocks.code.language": "언어", + "field.blocks.code.placeholder": "코드", + "field.blocks.delete.confirm": "블록을 삭제할까요?", + "field.blocks.delete.confirm.all": "모든 블록을 삭제할까요?", + "field.blocks.delete.confirm.selected": "선택한 블록을 삭제할까요?", + "field.blocks.empty": "블록이 없습니다.", + "field.blocks.fieldsets.empty": "필드셋이 없습니다.", + "field.blocks.fieldsets.label": "블록 유형을 선택하세요.", + "field.blocks.fieldsets.paste": "{{ shortcut }}를 눌러 클립보드에서 레이아웃 또는 블록을 가져옵니다. 현재 필드에서 허용된 것만 삽입됩니다.", + "field.blocks.gallery.name": "갤러리", + "field.blocks.gallery.images.empty": "이미지가 없습니다.", + "field.blocks.gallery.images.label": "이미지", + "field.blocks.heading.level": "단계", + "field.blocks.heading.name": "제목", + "field.blocks.heading.text": "제목", + "field.blocks.heading.placeholder": "제목", + "field.blocks.image.alt": "대체 텍스트", + "field.blocks.image.caption": "캡션", + "field.blocks.image.crop": "자르기", + "field.blocks.image.link": "링크", + "field.blocks.image.location": "위치", + "field.blocks.image.location.internal": "이 웹사이트", + "field.blocks.image.location.external": "외부 소스", + "field.blocks.image.name": "이미지", + "field.blocks.image.placeholder": "이미지 선택", + "field.blocks.image.ratio": "비율", + "field.blocks.image.url": "이미지 URL", + "field.blocks.line.name": "가로줄", + "field.blocks.list.name": "목록", + "field.blocks.markdown.name": "마크다운", + "field.blocks.markdown.label": "마크다운", + "field.blocks.markdown.placeholder": "마크다운", + "field.blocks.quote.name": "인용문", + "field.blocks.quote.text.label": "인용문", + "field.blocks.quote.text.placeholder": "인용문", + "field.blocks.quote.citation.label": "출처", + "field.blocks.quote.citation.placeholder": "출처", + "field.blocks.text.name": "텍스트", + "field.blocks.text.placeholder": "텍스트", + "field.blocks.video.autoplay": "자동 재생", + "field.blocks.video.caption": "캡션", + "field.blocks.video.controls": "제어 도구", + "field.blocks.video.location": "위치", + "field.blocks.video.loop": "반복", + "field.blocks.video.muted": "음소거", + "field.blocks.video.name": "영상", + "field.blocks.video.placeholder": "영상 URL 입력", + "field.blocks.video.poster": "대표 이미지", + "field.blocks.video.preload": "미리 로드", + "field.blocks.video.url.label": "영상 URL", + "field.blocks.video.url.placeholder": "https://youtube.com/?v=", + + "field.files.empty": "선택한 파일이 없습니다.", + + "field.layout.change": "레이아웃 변경", + "field.layout.delete": "레이아웃 삭제", + "field.layout.delete.confirm": "레이아웃을 삭제할까요?", + "field.layout.delete.confirm.all": "모든 레이아웃을 삭제할까요?", + "field.layout.empty": "행이 없습니다.", + "field.layout.select": "레이아웃 선택", + + "field.object.empty": "정보가 없습니다.", + + "field.pages.empty": "선택한 페이지가 없습니다.", + + "field.structure.delete.confirm": "이 항목을 삭제할까요?", + "field.structure.delete.confirm.all": "모든 항목을 삭제할까요?", + "field.structure.empty": "항목이 없습니다.", + + "field.users.empty": "선택한 사용자가 없습니다.", + + "fields.empty": "필드가 없습니다.", + + "file": "파일", + "file.blueprint": "블루프린트(/site/blueprints/files/{blueprint}.yml)를 설정하세요.", + "file.changeTemplate": "템플릿 변경", + "file.changeTemplate.notice": "템플릿을 변경하면 유형이 일치하지 않은 필드에 입력한 콘텐츠가 삭제됩니다. 템플릿에서 이미지 크기 등 특정 규칙이 지정된 경우 해당 규칙을 되돌릴 수 없습니다.", + "file.delete.confirm": "파일({filename})을 삭제할까요?", + "file.focus.placeholder": "초점 설정", + "file.focus.reset": "초점 삭제", + "file.focus.title": "초점", + "file.sort": "순서 변경", + + "files": "파일", + "files.empty": "파일이 없습니다.", + + "filter": "필터", + + "hide": "숨기기", + "hour": "시", + "hue": "색상", + "import": "가져오기", + "info": "정보", + "insert": "\uc0bd\uc785", + "insert.after": "뒤에 삽입", + "insert.before": "앞에 삽입", + "install": "설치", + + "installation": "설치", + "installation.completed": "패널을 설치했습니다.", + "installation.disabled": "패널 설치 관리자는 로컬 서버에서 실행하거나 panel.install 옵션을 설정하세요.", + "installation.issues.accounts": "/site/accounts 폴더의 쓰기 권한을 확인하세요.", + "installation.issues.content": "/content 폴더의 쓰기 권한을 확인하세요.", + "installation.issues.curl": "cURL 확장 모듈이 필요합니다.", + "installation.issues.headline": "패널을 설치할 수 없습니다.", + "installation.issues.mbstring": "MB String 확장 모듈이 필요합니다.", + "installation.issues.media": "/media 폴더의 쓰기 권한을 확인하세요.", + "installation.issues.php": "PHP 버전이 8 이상인지 확인하세요.", + "installation.issues.sessions": "/site/sessions 폴더의 쓰기 권한을 확인하세요.", + + "language": "\uc5b8\uc5b4", + "language.code": "언어 코드", + "language.convert": "기본 언어로 지정", + "language.convert.confirm": "이 언어({name})를 기본 언어로 지정할까요? 지정한 뒤에는 복원할 수 없으며, 이 언어로 번역되지 않은 항목은 올바르게 표시되지 않을 수 있습니다.", + "language.create": "새 언어 추가", + "language.default": "기본 언어", + "language.delete.confirm": "언어({name})를 삭제할까요? 삭제한 뒤에는 복원할 수 없습니다.", + "language.deleted": "언어를 삭제했습니다.", + "language.direction": "읽기 방향", + "language.direction.ltr": "왼쪽에서 오른쪽", + "language.direction.rtl": "오른쪽에서 왼쪽", + "language.locale": "PHP 로캘 문자열", + "language.locale.warning": "사용자 지정 로캘을 사용 중입니다. /site/languages 폴더의 언어 파일을 수정하세요.", + "language.name": "언어명", + "language.secondary": "보조 언어", + "language.settings": "언어 설정", + "language.updated": "언어를 변경했습니다.", + "language.variables": "언어 변수", + "language.variables.empty": "번역이 없습니다.", + + "language.variable.delete.confirm": "변수({key})를 삭제할까요?", + "language.variable.key": "키", + "language.variable.notFound": "변수를 찾을 수 없습니다.", + "language.variable.value": "값", + + "languages": "언어", + "languages.default": "기본 언어", + "languages.empty": "언어가 없습니다.", + "languages.secondary": "보조 언어", + "languages.secondary.empty": "보조 언어가 없습니다.", + + "license": "라이선스", + "license.activate": "지금 활성화하세요.", + "license.activate.label": "라이선스를 활성화하세요.", + "license.activate.domain": "{host}에 대한 라이선스를 활성화합니다.", + "license.activate.local": "로컬 도메인({host})에 대한 라이선스를 활성화합니다. 현재 도메인({host})이 라이선스를 사용하려는 도메인인과 같다면 계속 진행하세요.", + "license.activated": "활성화됨", + "license.buy": "라이선스 구매", + "license.code": "언어 코드", + "license.code.help": "이메일로 전송된 라이선스 코드를 복사해 붙여넣으세요.", + "license.code.label": "라이선스 코드를 입력하세요.", + "license.status.active.info": "새로운 메이저 버전은 {date}까지 포함됩니다.", + "license.status.active.label": "유효한 라이선스", + "license.status.demo.info": "데모를 설치합니다.", + "license.status.demo.label": "데모", + "license.status.inactive.info": "새로운 메이저 버전으로 업데이트하려면 라이선스를 갱신하세요.", + "license.status.inactive.label": "새로운 메이저 버전이 없습니다.", + "license.status.legacy.bubble": "라이선스를 갱신합니다.", + "license.status.legacy.info": "라이선스가 이 버전을 지원하지 않습니다.", + "license.status.legacy.label": "라이선스를 갱신하세요.", + "license.status.missing.bubble": "사이트를 공개합니다.", + "license.status.missing.info": "유효한 라이선스가 없습니다.", + "license.status.missing.label": "라이선스를 활성화하세요.", + "license.manage": "라이선스 관리", + "license.purchased": "구입했습니다.", + "license.success": "Kirby와 함께해주셔서 감사합니다.", + "license.unregistered.label": "Kirby가 등록되지 않았습니다.", + + "link": "\uc77c\ubc18 \ub9c1\ud06c", + "link.text": "\ubb38\uc790", + + "loading": "로딩 중…", + + "lock.unsaved": "저장되지 않은 항목이 있습니다.", + "lock.unsaved.empty": "모든 페이지를 저장했습니다.", + "lock.isLocked": "사용자({email})의 변경 사항이 저장되지 않았습니다.", + "lock.unlock": "잠금 해제", + "lock.unlock.submit": "사용자({email})의 저장되지 않은 변경 사항을 해제하고 덮어쓰기", + "lock.isUnlocked": "다른 사용자가 잠금을 해제했습니다.", + + "login": "로그인", + "login.code.label.login": "로그인 코드", + "login.code.label.password-reset": "암호 초기화 코드", + "login.code.placeholder.email": "000 000", + "login.code.placeholder.totp": "000000", + "login.code.text.email": "입력한 이메일 주소로 코드를 전송했습니다.", + "login.code.text.totp": "인증 앱에서 생성된 일회용 코드를 입력하세요.", + "login.email.login.body": "{user.nameOrEmail} 님,\n\n{site} 패널에서 요청한 로그인 코드는 다음과 같습니다. 로그인 코드는 {timeout}분 동안 유효합니다.\n\n{code}\n\n로그인 코드를 요청한 적이 없다면, 이 이메일을 무시하거나 관리자에게 문의하세요. 보안을 위해 이 이메일은 다른 사람과 공유하지 마세요.", + "login.email.login.subject": "로그인 코드", + "login.email.password-reset.body": "{user.nameOrEmail} 님,\n\n{site} 패널에서 요청한 암호 초기화 코드는 다음과 같습니다. 암호 초기화 코드는 {timeout}분 동안 유효합니다.\n\n{code}\n\n암호 초기화 코드를 요청한 적이 없다면, 이 이메일을 무시하거나 관리자에게 문의하세요. 보안을 위해 이 이메일은 다른 사람과 공유하지 마세요.", + "login.email.password-reset.subject": "암호 초기화 코드", + "login.remember": "로그인 유지", + "login.reset": "암호 초기화", + "login.toggleText.code.email": "이메일 주소로 로그인", + "login.toggleText.code.email-password": "암호로 로그인", + "login.toggleText.password-reset.email": "암호 찾기", + "login.toggleText.password-reset.email-password": "로그인 화면으로", + "login.totp.enable.option": "일회용 코드 설정", + "login.totp.enable.intro": "인증 앱은 계정에 로그인하기 위한 일회용 코드를 생성할 수 있습니다.", + "login.totp.enable.qr.label": "1. 이 QR 코드를 스캔하세요.", + "login.totp.enable.qr.help": "스캔할 수 없다면 인증 앱에 {secret} 설정 키를 수동으로 추가하세요.", + "login.totp.enable.confirm.headline": "2. 생성된 코드로 확인하세요.", + "login.totp.enable.confirm.text": "앱은 매 30초마다 새로운 일회용 코드를 생성합니다. 설정을 완료하기 위해 현재 코드를 입력하세요.", + "login.totp.enable.confirm.label": "현재 코드", + "login.totp.enable.confirm.help": "로그인할 때마다 일회용 코드를 요청합니다.", + "login.totp.enable.success": "일회용 코드가 활성화되었습니다.", + "login.totp.disable.option": "일회용 코드 비활성화", + "login.totp.disable.label": "비밀번호를 입력해 일회용 코드를 비활성화하세요.", + "login.totp.disable.help": "이후 로그인할 때 이메일로 발송된 로그인 코드와 같은 다른 두 번째 인증 요소를 요청합니다. 언제든 일회용 코드를 나중에 다시 설정할 수 있습니다.", + "login.totp.disable.admin": "사용자({user})의 일회용 코드를 비활성화합니다. 사용자({user})가 로그인할 때 이메일로 전송된 로그인 코드와 같은 다른 두 번째 인증 요소가 요청됩니다. 사용자({user})는 다음 로그인 후에 다시 일회용 코드를 설정할 수 있습니다.", + "login.totp.disable.success": "일회용 코드가 비활성화되었습니다.", + + "logout": "로그아웃", + + "merge": "합치기", + "menu": "메뉴", + "meridiem": "오전/오후", + "mime": "MIME 형식", + "minutes": "분", + + "month": "월", + "months.april": "4\uc6d4", + "months.august": "8\uc6d4", + "months.december": "12\uc6d4", + "months.february": "2월", + "months.january": "1\uc6d4", + "months.july": "7\uc6d4", + "months.june": "6\uc6d4", + "months.march": "3\uc6d4", + "months.may": "5\uc6d4", + "months.november": "11\uc6d4", + "months.october": "10\uc6d4", + "months.september": "9\uc6d4", + + "more": "더 보기", + "move": "이동", + "name": "이름", + "next": "다음", + "night": "밤", + "no": "아니요", + "off": "끔", + "on": "켬", + "open": "열기", + "open.newWindow": "새 창에서 열기", + "option": "옵션", + "options": "옵션", + "options.none": "옵션이 없습니다.", + "options.all": "모든 옵션({count}) 표시", + + "orientation": "비율", + "orientation.landscape": "가로로 긴 사각형", + "orientation.portrait": "세로로 긴 사각형", + "orientation.square": "정사각형", + + "page": "페이지", + "page.blueprint": "블루프린트(/site/blueprints/pages/{blueprint}.yml)를 설정하세요.", + "page.changeSlug": "고유 주소 변경", + "page.changeSlug.fromTitle": "제목에서 가져오기", + "page.changeStatus": "상태 변경", + "page.changeStatus.position": "순서를 지정하세요.", + "page.changeStatus.select": "새 상태 선택", + "page.changeTemplate": "템플릿 변경", + "page.changeTemplate.notice": "템플릿을 변경하면 유형이 일치하지 않은 필드에 입력한 콘텐츠가 삭제됩니다.", + "page.create": "해당 상태({status})로 생성", + "page.delete.confirm": "페이지({title})를 삭제할까요?", + "page.delete.confirm.subpages": "페이지에 하위 페이지가 있습니다. 모든 하위 페이지가 삭제됩니다.", + "page.delete.confirm.title": "페이지 제목을 입력하세요.", + "page.duplicate.appendix": "복사", + "page.duplicate.files": "파일 복사", + "page.duplicate.pages": "페이지 복사", + "page.move": "페이지 이동", + "page.sort": "순서 변경", + "page.status": "상태", + "page.status.draft": "초안", + "page.status.draft.description": "로그인한 사용자나 URL을 통해 접근할 수 있습니다.", + "page.status.listed": "공개", + "page.status.listed.description": "누구나 읽을 수 있습니다.", + "page.status.unlisted": "비공개", + "page.status.unlisted.description": "오직 URL을 통해 접근할 수 있습니다.", + + "pages": "페이지", + "pages.empty": "페이지가 없습니다.", + "pages.status.draft": "초안", + "pages.status.listed": "발행", + "pages.status.unlisted": "비공개", + + "pagination.page": "페이지", + + "password": "\uc554\ud638", + "paste": "붙여넣기", + "paste.after": "뒤로 붙여넣기", + "paste.success": "붙여넣었습니다. ({count})", + "pixel": "픽셀", + "plugin": "플러그인", + "plugins": "플러그인", + "prev": "이전", + "preview": "미리 보기", + "remove": "삭제", + "rename": "이름 변경", + "renew": "갱신", + "replace": "\uad50\uccb4", + "replace.with": "다음으로 교체", + "retry": "\ub2e4\uc2dc \uc2dc\ub3c4", + "revert": "복원", + "revert.confirm": "저장되지 않은 내용을 삭제할까요?", + + "role": "역할", + "role.admin.description": "관리자는 모든 권한이 있습니다.", + "role.admin.title": "관리자", + "role.all": "전체", + "role.empty": "이 역할에 해당하는 사용자가 없습니다.", + "role.description.placeholder": "설명이 없습니다.", + "role.nobody.description": "대체 사용자는 아무 권한이 없습니다.", + "role.nobody.title": "사용자가 없습니다.", + + "save": "\uc800\uc7a5", + "search": "검색", + "search.min": "{min}자 이상 입력하세요.", + "search.all": "모든 결과({count}) 보기", + "search.results.none": "해당하는 결과가 없습니다.", + + "section.invalid": "섹션이 올바르지 않습니다.", + "section.required": "섹션이 필요합니다.", + + "security": "보안", + "select": "선택", + "server": "서버", + "settings": "설정", + "show": "보기", + "site.blueprint": "블루프린트(/site/blueprints/site.yml)를 설정하세요.", + "size": "크기", + "slug": "고유 주소", + "sort": "정렬", + "sort.drag": "Drag to sort …", + "split": "나누기", + + "stats.empty": "관련 기록이 없습니다.", + "status": "상태", + + "system.info.copy": "Copy info", + "system.info.copied": "System info copied", + "system.issues.content": "/content 폴더의 권한을 확인하세요.", + "system.issues.eol.kirby": "설치된 Kirby 버전이 만료되었습니다. 더 이상 보안 업데이트를 받을 수 없습니다.", + "system.issues.eol.plugin": "설치된 플러그인({plugin}의 지원이 종료되었습니다. 더 이상 보안 업데이트를 받을 수 없습니다.", + "system.issues.eol.php": "설치된 PHP 버전({release})이 만료되었습니다. 더 이상 보안 업데이트를 받을 수 없습니다.", + "system.issues.debug": "공개 서버상에서는 디버그 모드를 해제하세요.", + "system.issues.git": "/.git 폴더의 권한을 확인하세요.", + "system.issues.https": "HTTPS를 권장합니다.", + "system.issues.kirby": "/kirby 폴더의 권한을 확인하세요.", + "system.issues.site": "/site 폴더의 권한을 확인하세요.", + "system.issues.vulnerability.kirby": "설치한 시스템에 취약점이 있습니다.\n심각도: {severity}\n{description}", + "system.issues.vulnerability.plugin": "설치한 플러그인({plugin})에 취약점이 있습니다.\n심각도: {severity}\n{ description }", + "system.updateStatus": "업데이트 상태", + "system.updateStatus.error": "업데이트를 확인할 수 없습니다.", + "system.updateStatus.not-vulnerable": "알려진 취약성이 없습니다.", + "system.updateStatus.security-update": "{ version } 버전으로 무료 보안 업데이트", + "system.updateStatus.security-upgrade": "{ version } 버전으로 보안 업그레이드", + "system.updateStatus.unreleased": "출시 전 버전", + "system.updateStatus.up-to-date": "최신 버전입니다.", + "system.updateStatus.update": "{ version } 버전으로 무료 업데이트", + "system.updateStatus.upgrade": "{ version } 버전으로 업그레이드", + + "tel": "Phone", + "tel.placeholder": "+49123456789", + "template": "\ud15c\ud50c\ub9bf", + "title": "제목", + "today": "오늘", + + "toolbar.button.clear": "서식 제거", + "toolbar.button.code": "코드", + "toolbar.button.bold": "강조", + "toolbar.button.email": "이메일 주소", + "toolbar.button.headings": "제목", + "toolbar.button.heading.1": "제목 1", + "toolbar.button.heading.2": "제목 2", + "toolbar.button.heading.3": "제목 3", + "toolbar.button.heading.4": "제목 4", + "toolbar.button.heading.5": "제목 5", + "toolbar.button.heading.6": "제목 6", + "toolbar.button.italic": "강조 2", + "toolbar.button.file": "파일", + "toolbar.button.file.select": "파일 선택", + "toolbar.button.file.upload": "파일 업로드", + "toolbar.button.link": "링크", + "toolbar.button.paragraph": "문단", + "toolbar.button.strike": "취소선", + "toolbar.button.sub": "아래 첨자", + "toolbar.button.sup": "위 첨자", + "toolbar.button.ol": "숫자 목록", + "toolbar.button.underline": "밑줄", + "toolbar.button.ul": "기호 목록", + + "translation.author": "Kirby 팀", + "translation.direction": "ltr", + "translation.name": "한국어", + "translation.locale": "ko_KR", + + "type": "유형", + + "upload": "업로드", + "upload.error.cantMove": "파일을 이동할 수 없습니다.", + "upload.error.cantWrite": "디스크를 읽을 수 없습니다.", + "upload.error.default": "파일을 업로드할 수 없습니다.", + "upload.error.extension": "파일 확장자를 확인하세요.", + "upload.error.formSize": "업로드한 파일이 허용된 크기(MAX_FILE_SIZE)를 초과했습니다.", + "upload.error.iniPostSize": "업로드한 파일이 PHP 환경 설정 파일(php.ini)에서 허용된 크기(post_max_size)를 초과했습니다.", + "upload.error.iniSize": "업로드한 파일이 PHP 환경 설정 파일(php.ini)에서 허용된 크기(upload_max_filesize)를 초과했습니다.", + "upload.error.noFile": "업로드한 파일이 없습니다.", + "upload.error.noFiles": "업로드한 파일이 없습니다.", + "upload.error.partial": "일부 파일을 업로드했습니다.", + "upload.error.tmpDir": "임시 폴더가 없습니다.", + "upload.errors": "오류", + "upload.progress": "업로드 중…", + + "url": "URL", + "url.placeholder": "https://example.com", + + "user": "사용자", + "user.blueprint": "블루프린트(/site/blueprints/users/{blueprint}.yml)에 섹션과 필드를 추가할 수 있습니다.", + "user.changeEmail": "이메일 주소 변경", + "user.changeLanguage": "언어 변경", + "user.changeName": "사용자명 변경", + "user.changePassword": "암호 변경", + "user.changePassword.new": "새 암호", + "user.changePassword.new.confirm": "새 암호 확인", + "user.changeRole": "역할 변경", + "user.changeRole.select": "새 역할 선택", + "user.create": "사용자 추가", + "user.delete": "사용자 삭제", + "user.delete.confirm": "사용자({email})를 삭제할까요?", + + "users": "사용자", + + "version": "버전", + "version.current": "현재 버전", + "version.latest": "최신 버전", + "versionInformation": "버전 정보", + + "view.account": "계정", + "view.installation": "\uc124\uce58", + "view.languages": "언어", + "view.resetPassword": "암호 초기화", + "view.site": "사이트", + "view.system": "시스템", + "view.users": "\uc0ac\uc6a9\uc790", + + "welcome": "반갑습니다.", + "year": "년", + "yes": "네" +} diff --git a/kirby/i18n/translations/lt.json b/kirby/i18n/translations/lt.json new file mode 100644 index 0000000..248c6ff --- /dev/null +++ b/kirby/i18n/translations/lt.json @@ -0,0 +1,730 @@ +{ + "account.changeName": "Pakeisti savo vardą", + "account.delete": "Panaikinti savo paskyrą", + "account.delete.confirm": "Ar tikrai norite panaikinti savo paskyrą? Jūs iš karto atsijungsite. Paskyros bus neįmanoma atstatyti.", + + "activate": "Aktyvuoti", + "add": "Pridėti", + "alpha": "Alpha", + "author": "Autorius", + "avatar": "Profilio nuotrauka", + "back": "Atgal", + "cancel": "Atšaukti", + "change": "Keisti", + "close": "Uždaryti", + "changes": "Changes", + "confirm": "Ok", + "collapse": "Sutraukti", + "collapse.all": "Sutraukti viską", + "color": "Color", + "coordinates": "Coordinates", + "copy": "Kopijuoti", + "copy.all": "Kopijuoti visus", + "copy.success": "{count} nukopijuota!", + "create": "Sukurti", + "custom": "Custom", + + "date": "Data", + "date.select": "Pasirinkite datą", + + "day": "Diena", + "days.fri": "Pen", + "days.mon": "Pir", + "days.sat": "Šeš", + "days.sun": "Sek", + "days.thu": "Ket", + "days.tue": "Ant", + "days.wed": "Tre", + + "debugging": "Debugging", + + "delete": "Pašalinti", + "delete.all": "Pašalinti viską", + + "dialog.fields.empty": "This dialog has no fields", + "dialog.files.empty": "Nėra failų pasirinkimui", + "dialog.pages.empty": "Nėra puslapių pasirinkimui", + "dialog.text.empty": "This dialog does not define any text", + "dialog.users.empty": "Nėra vartotojų pasirinkimui", + + "dimensions": "Išmatavimai", + "disable": "Išjungti", + "disabled": "Išjungta", + "discard": "Atšaukti", + + "drawer.fields.empty": "This drawer has no fields", + + "domain": "Domenas", + "download": "Parsisiųsti", + "duplicate": "Dublikuoti", + + "edit": "Redaguoti", + + "email": "El. paštas", + "email.placeholder": "info@pavyzdys.lt", + + "enter": "Enter", + "entries": "Įrašai", + "entry": "Įrašas", + + "environment": "Aplinka", + + "error": "Error", + "error.access.code": "Neteisinas kodas", + "error.access.login": "Neteisingas prisijungimo vardas", + "error.access.panel": "Neturite teisės prisijungti prie valdymo pulto", + "error.access.view": "Neturite teisės peržiūrėti šios valdymo pulto dalies", + + "error.avatar.create.fail": "Nepavyko įkelti profilio nuotraukos", + "error.avatar.delete.fail": "Nepavyko pašalinti profilio nuotraukos", + "error.avatar.dimensions.invalid": "Profilio nuotraukos plotis ar aukštis turėtų būti iki 3000 pikselių", + "error.avatar.mime.forbidden": "Profilio nuotrauka turi būti JPEG arba PNG", + + "error.blueprint.notFound": "Blueprint \"{name}\" negali būti užkrautas", + + "error.blocks.max.plural": "Didžiausias įmanomas blokų kiekis: {max}", + "error.blocks.max.singular": "Jūs galite pridėti daugiausiai vieną bloką", + "error.blocks.min.plural": "Minimalus blokų kiekis: {min}", + "error.blocks.min.singular": "Jūs turite pridėti bent vieną bloką", + "error.blocks.validation": "Yra klaida laukelyje \"{field}\" bloke {index} naudojant bloko tipą \"{fieldset}\"", + + "error.cache.type.invalid": "Invalid cache type \"{type}\"", + + "error.email.preset.notFound": "El. pašto paruoštukas \"{name}\" nerastas", + + "error.field.converter.invalid": "Neteisingas konverteris \"{converter}\"", + "error.field.type.missing": "Laukelis \"{ name }\": Šio tipo (\"{ type }\") laukelis neegzistuoja", + + "error.file.changeName.empty": "Pavadinimas negali būti tuščias", + "error.file.changeName.permission": "Neturite teisės pakeisti failo pavadinimo \"{filename}\"", + "error.file.changeTemplate.invalid": "The template for the file \"{id}\" cannot be changed to \"{template}\" (valid: \"{blueprints}\")", + "error.file.changeTemplate.permission": "You are not allowed to change the template for the file \"{id}\"", + + "error.file.duplicate": "Failas su pavadinimu \"{filename}\" jau yra", + "error.file.extension.forbidden": "Failo tipas (plėtinys) \"{extension}\" neleidžiamas", + "error.file.extension.invalid": "Neteisingas plėtinys: {extension}", + "error.file.extension.missing": "Failui \"{filename}\" trūksta tipo (plėtinio)", + "error.file.maxheight": "Failo aukštis neturi viršyti {height} px", + "error.file.maxsize": "Failas per didelis", + "error.file.maxwidth": "Failo plotis neturi viršyti {width} px", + "error.file.mime.differs": "Įkėliamas failas turi būti tokio pat mime tipo \"{mime}\"", + "error.file.mime.forbidden": "Media tipas \"{mime}\" neleidžiamas", + "error.file.mime.invalid": "Neteisingas mime tipas: {mime}", + "error.file.mime.missing": "Failui \"{filename}\" nepavyko atpažinti media (mime) tipo", + "error.file.minheight": "Failo aukštis turi būti bent {height} px", + "error.file.minsize": "Failas per mažas", + "error.file.minwidth": "Failo plotis turi būti bent {width} px", + "error.file.name.unique": "The filename must be unique", + "error.file.name.missing": "Failo pavadinimas negali būti tuščias", + "error.file.notFound": "Failas \"{filename}\" nerastas", + "error.file.orientation": "Failo orientacija turi būti \"{orientation}\"", + "error.file.type.forbidden": "Jūs neturite teisės įkelti {type} tipo failų", + "error.file.type.invalid": "Neteisingas failo tipas: {type}", + "error.file.undefined": "Failas nerastas", + + "error.form.incomplete": "🙏 Prašome ištaisyti visas formos klaidas…", + "error.form.notSaved": "Formos nepavyko išsaugoti", + + "error.language.code": "Prašome įrašyti teisingą kalbos kodą", + "error.language.duplicate": "Tokia kalba jau yra", + "error.language.name": "Prašome įrašyti teisingą kalbos pavadinimą", + "error.language.notFound": "Nepavyko rasti šios kalbos", + + "error.layout.validation.block": "There's an error on the \"{field}\" field in block {blockIndex} using the \"{fieldset}\" block type in layout {layoutIndex}", + "error.layout.validation.settings": "Yra klaida išdėstymo {index} nustatymuose", + + "error.license.domain": "Licencijai trūksta domeno", + "error.license.email": "Prašome įrašyti teisingą el. pašto adresą", + "error.license.format": "Prašome įrašyti teisingą licencijos kodą", + "error.license.verification": "Nepavyko patikrinti licenzijos", + + "error.login.totp.confirm.invalid": "Neteisinas kodas", + "error.login.totp.confirm.missing": "Prašome įrašyti kodą", + + "error.object.validation": "There’s an error in the \"{label}\" field:\n{message}", + + "error.offline": "Valdymo pultas dabar yra offline", + + "error.page.changeSlug.permission": "Neturite teisės pakeisti \"{slug}\" URL", + "error.page.changeSlug.reserved": "The path of top-level pages must not start with \"{path}\"", + "error.page.changeStatus.incomplete": "Puslapis turi klaidų ir negali būti paskelbtas", + "error.page.changeStatus.permission": "Šiam puslapiui negalima pakeisti statuso", + "error.page.changeStatus.toDraft.invalid": "Puslapio \"{slug}\" negalima paversti juodraščiu", + "error.page.changeTemplate.invalid": "Šablono puslapiui \"{slug}\" negalima keisti", + "error.page.changeTemplate.permission": "Neturite leidimo keisti šabloną puslapiui \"{slug}\"", + "error.page.changeTitle.empty": "Pavadinimas negali būti tuščias", + "error.page.changeTitle.permission": "Neturite leidimo keisti pavadinimo puslapiui \"{slug}\"", + "error.page.create.permission": "Neturite leidimo sukurti \"{slug}\"", + "error.page.delete": "Puslapio \"{slug}\" negalima pašalinti", + "error.page.delete.confirm": "Įrašykite puslapio pavadinimą, tam kad patvirtintumėte", + "error.page.delete.hasChildren": "Puslapis turi vidinių puslapių, dėl to negalima jo pašalinti", + "error.page.delete.permission": "Neturite leidimo šalinti \"{slug}\"", + "error.page.draft.duplicate": "Puslapio juodraštis su URL pabaiga \"{slug}\" jau yra", + "error.page.duplicate": "Puslapis su URL pabaiga \"{slug}\" jau yra", + "error.page.duplicate.permission": "Neturite leidimo dubliuoti \"{slug}\"", + "error.page.move.ancestor": "Puslapio negalima perkelti į save patį", + "error.page.move.directory": "The page directory cannot be moved", + "error.page.move.duplicate": "A sub page with the URL appendix \"{slug}\" already exists", + "error.page.move.notFound": "The moved page could not be found", + "error.page.move.permission": "You are not allowed to move \"{slug}\"", + "error.page.move.template": "The \"{template}\" template is not accepted as a subpage of \"{parent}\"", + "error.page.notFound": "Puslapis \"{slug}\" nerastas", + "error.page.num.invalid": "Įrašykite teisingą eiliškumo numerį. Numeris negali būti neigiamas.", + "error.page.slug.invalid": "Įrašykite teisingą URL priedą", + "error.page.slug.maxlength": "url adreso maksimalus simbolių kiekis: \"{length}\"", + "error.page.sort.permission": "Puslapiui \"{slug}\" negalima pakeisti eiliškumo", + "error.page.status.invalid": "Nustatykite teisingą puslapio statusą", + "error.page.undefined": "Puslapis nerastas", + "error.page.update.permission": "Neturite leidimo atnaujinti \"{slug}\"", + + "error.section.files.max.plural": "Į sekciją \"{section}\" negalima pridėti daugiau nei {max} failų", + "error.section.files.max.singular": "Į sekciją \"{section}\" negalima pridėti daugiau nei vieną failą", + "error.section.files.min.plural": "Sekcija \"{section}\" reikalauja bent {min} failų", + "error.section.files.min.singular": "Sekcija \"{section}\" reikalauja bent vieno failo", + + "error.section.pages.max.plural": "Į sekciją \"{section}\" negalima pridėti daugiau nei {max} puslapių", + "error.section.pages.max.singular": "Į sekciją \"{section}\" negalima pridėti daugiau nei vieną puslapį", + "error.section.pages.min.plural": "Sekcija \"{section}\" reikalauja bent {min} puslapių", + "error.section.pages.min.singular": "Sekcija \"{section}\" reikalauja bent vieno puslapio", + + "error.section.notLoaded": "Sekcija \"{name}\" negali būti užkrauta", + "error.section.type.invalid": "Sekcijos tipas \"{type}\" yra neteisingas", + + "error.site.changeTitle.empty": "Pavadinimas negali būti tuščias", + "error.site.changeTitle.permission": "Neturite leidimo keisti svetainės pavadinimo", + "error.site.update.permission": "Neturite leidimo atnaujinti svetainės", + + "error.structure.validation": "There's an error on the \"{field}\" field in row {index}", + + "error.template.default.notFound": "Nėra šablono pagal nutylėjimą", + + "error.unexpected": "An unexpected error occurred! Enable debug mode for more info: https://getkirby.com/docs/reference/system/options/debug", + + "error.user.changeEmail.permission": "Neturite leidimo keisti vartotojo \"{name}\" el. paštą", + "error.user.changeLanguage.permission": "Neturite leidimo keisti vartotojo \"{name}\" kalbą", + "error.user.changeName.permission": "Neturite leidimo keisti vartotojo \"{name}\" vardą", + "error.user.changePassword.permission": "Neturite leidimo keisti vartotojo \"{name}\" slaptažodį", + "error.user.changeRole.lastAdmin": "Vienintelio administratoriaus rolės negalima pakeisti", + "error.user.changeRole.permission": "Neturite leidimo pakeisti vartotojo \"{name}\" rolės", + "error.user.changeRole.toAdmin": "Jūs neturite teisių suteikti administratoriaus rolę", + "error.user.create.permission": "Neturite leidimo sukurti šį vartotoją", + "error.user.delete": "Vartotojo \"{name}\" negalima pašalinti", + "error.user.delete.lastAdmin": "Vienintelio administratoriaus negalima pašalinti", + "error.user.delete.lastUser": "Vienintelio vartotojo negalima pašalinti", + "error.user.delete.permission": "Neturite leidimo pašalinti vartotoją \"{name}\"", + "error.user.duplicate": "Vartotojas su el. paštu \"{email}\" jau yra", + "error.user.email.invalid": "Įrašykite teisingą el. pašto adresą", + "error.user.language.invalid": "Įrašykite teisingą kalbą", + "error.user.notFound": "Vartotojas \"{name}\" nerastas", + "error.user.password.excessive": "Please enter a valid password. Passwords must not be longer than 1000 characters.", + "error.user.password.invalid": "Prašome įrašyti galiojantį slaptažodį. Slaptažodį turi sudaryti bent 8 simboliai.", + "error.user.password.notSame": "Slaptažodžiai nesutampa", + "error.user.password.undefined": "Vartotojas neturi slaptažodžio", + "error.user.password.wrong": "Neteisingas slaptažodis", + "error.user.role.invalid": "Įrašykite teisingą rolę", + "error.user.undefined": "Vartotojas nerastas", + "error.user.update.permission": "Neturite teisės keisti vartotojo \"{name}\"", + + "error.validation.accepted": "Prašome patvirtinti", + "error.validation.alpha": "Prašome įrašyti tik raides a-z", + "error.validation.alphanum": "Prašome įrašyti tik raides a-z arba skaičius 0-9", + "error.validation.anchor": "Please enter a correct link anchor", + "error.validation.between": "Prašome įrašyti reikšmę tarp \"{min}\" ir \"{max}\"", + "error.validation.boolean": "Patvirtinkite arba atšaukite", + "error.validation.color": "Please enter a valid color in the {format} format", + "error.validation.contains": "Prašome įrašyti reikšmę, kuri turėtų \"{needle}\"", + "error.validation.date": "Prašome įrašyti korektišką datą", + "error.validation.date.after": "Įrašykite datą nuo {date}", + "error.validation.date.before": "Įrašykite datą iki {date}", + "error.validation.date.between": "Įrašykite datą tarp {min} ir {max}", + "error.validation.denied": "Prašome neleisti", + "error.validation.different": "Reikšmė neturi būti \"{other}\"", + "error.validation.email": "Prašome įrašyti korektišką el. paštą", + "error.validation.endswith": "Reikšmė turi baigtis su \"{end}\"", + "error.validation.filename": "Prašome įrašyti teisingą failo pavadinimą", + "error.validation.in": "Prašome įrašyti vieną iš šių: ({in})", + "error.validation.integer": "Prašome įrašyti teisingą sveiką skaičių", + "error.validation.ip": "Prašome įrašyti teisingą IP adresą", + "error.validation.less": "Prašome įrašyti mažiau nei {max}", + "error.validation.linkType": "The link type is not allowed", + "error.validation.match": "Reikšmė nesutampa su laukiamu šablonu", + "error.validation.max": "Prašome įrašyti reikšmę lygią arba didesnę, nei {max}", + "error.validation.maxlength": "Prašome įrašyti trumpesnę reikšmę. (max. {max} characters)", + "error.validation.maxwords": "Please enter no more than {max} word(s)", + "error.validation.min": "Please enter a value equal to or greater than {min}", + "error.validation.minlength": "Prašome įrašyti ilgesnę reikšmę. (min. {min} characters)", + "error.validation.minwords": "Prašome įrašyti bent {min} žodžius", + "error.validation.more": "Prašome įrašyti daugiau nei {min}", + "error.validation.notcontains": "Prašome įrašyti reikšmę, kuri neturi \"{needle}\"", + "error.validation.notin": "Prašome neįrašyti vieną iš šių: ({notIn})", + "error.validation.option": "Prašome pasirinkti korektišką opciją", + "error.validation.num": "Prašome įrašyti teisingą numerį", + "error.validation.required": "Prašome įrašyti ką nors", + "error.validation.same": "Prašome įrašyti \"{other}\"", + "error.validation.size": "Reikšmės dydis turi būti \"{size}\"", + "error.validation.startswith": "Reikšmė turi prasidėti su \"{start}\"", + "error.validation.tel": "Please enter an unformatted phone number", + "error.validation.time": "Prašome įrašyti korektišką laiką", + "error.validation.time.after": "Įrašykite laiką po {time}", + "error.validation.time.before": "Įrašykite laiką prieš {time}", + "error.validation.time.between": "Įrašykite laiką tarp {min} ir {max}", + "error.validation.uuid": "Please enter a valid UUID", + "error.validation.url": "Prašome įrašyti teisingą URL", + + "expand": "Išskleisti", + "expand.all": "Išskleisti viską", + + "field.invalid": "The field is invalid", + "field.required": "Laukas privalomas", + "field.blocks.changeType": "Pakeisti tipą", + "field.blocks.code.name": "Kodas", + "field.blocks.code.language": "Kalba", + "field.blocks.code.placeholder": "Jūsų kodas ...", + "field.blocks.delete.confirm": "Ar tikrai norite pašalinti šį bloką?", + "field.blocks.delete.confirm.all": "Ar tikrai norite pašalinti visus blokus?", + "field.blocks.delete.confirm.selected": "Ar tikrai norite pašalinti pasirinktus blokus?", + "field.blocks.empty": "Dar nėra blokų", + "field.blocks.fieldsets.empty": "No fieldsets yet", + "field.blocks.fieldsets.label": "Pasirinkite bloko tipą ...", + "field.blocks.fieldsets.paste": "Press {{ shortcut }} to import layouts/blocks from your clipboard Only those allowed in the current field will get inserted.", + "field.blocks.gallery.name": "Galerija", + "field.blocks.gallery.images.empty": "Dar nėra nuotraukų", + "field.blocks.gallery.images.label": "Nuotraukos", + "field.blocks.heading.level": "Lygis", + "field.blocks.heading.name": "Antraštė", + "field.blocks.heading.text": "Tekstas", + "field.blocks.heading.placeholder": "Antraštė ...", + "field.blocks.image.alt": "Alternatyvus tekstas", + "field.blocks.image.caption": "Aprašymas", + "field.blocks.image.crop": "Kirpti", + "field.blocks.image.link": "Nuoroda", + "field.blocks.image.location": "Šaltinis", + "field.blocks.image.location.internal": "This website", + "field.blocks.image.location.external": "External source", + "field.blocks.image.name": "Nuotrauka", + "field.blocks.image.placeholder": "Pasirinkite nuotrauką", + "field.blocks.image.ratio": "Proporcijos", + "field.blocks.image.url": "Nuotraukos URL", + "field.blocks.line.name": "Linija", + "field.blocks.list.name": "Sąrašas", + "field.blocks.markdown.name": "Markdown", + "field.blocks.markdown.label": "Tekstas", + "field.blocks.markdown.placeholder": "Markdown ...", + "field.blocks.quote.name": "Citata", + "field.blocks.quote.text.label": "Tekstas", + "field.blocks.quote.text.placeholder": "Citata ...", + "field.blocks.quote.citation.label": "Citatos turinys", + "field.blocks.quote.citation.placeholder": "autorius", + "field.blocks.text.name": "Tekstas", + "field.blocks.text.placeholder": "Tekstas ...", + "field.blocks.video.autoplay": "Autoplay", + "field.blocks.video.caption": "Aprašymas", + "field.blocks.video.controls": "Controls", + "field.blocks.video.location": "Šaltinis", + "field.blocks.video.loop": "Loop", + "field.blocks.video.muted": "Muted", + "field.blocks.video.name": "Video", + "field.blocks.video.placeholder": "Įrašykite video URL", + "field.blocks.video.poster": "Poster", + "field.blocks.video.preload": "Preload", + "field.blocks.video.url.label": "Video-URL", + "field.blocks.video.url.placeholder": "https://youtube.com/?v=", + + "field.files.empty": "Pasirinkti", + + "field.layout.change": "Change layout", + "field.layout.delete": "Pašalinti eilutę", + "field.layout.delete.confirm": "Ar tikrai norite pašalinti šią eilutę", + "field.layout.delete.confirm.all": "Do you really want to delete all layouts?", + "field.layout.empty": "Dar nėra eilučių", + "field.layout.select": "Pasirinkite išdėstymą", + + "field.object.empty": "Dar nėra informacijos", + + "field.pages.empty": "Dar nėra puslapių", + + "field.structure.delete.confirm": "Ar tikrai norite pašalinti šią eilutę?", + "field.structure.delete.confirm.all": "Ar tikrai norite išrtinti visus įrašus?", + "field.structure.empty": "Dar nėra įrašų", + + "field.users.empty": "Dar nėra vartotojų", + + "fields.empty": "No fields yet", + + "file": "Failas", + "file.blueprint": "Šis failas dar neturi blueprint. Galite nustatyti jį per /site/blueprints/files/{blueprint}.yml", + "file.changeTemplate": "Pakeisti šabloną", + "file.changeTemplate.notice": "Changing the file's template will remove content for fields that don't match in type. If the new template defines certain rules, e.g. image dimensions, those will also be applied irreversibly. Use with caution.", + "file.delete.confirm": "Ar tikrai norite pašalinti
{filename}?", + "file.focus.placeholder": "Set focal point", + "file.focus.reset": "Remove focal point", + "file.focus.title": "Focus", + "file.sort": "Pakeisti poziciją", + + "files": "Failai", + "files.empty": "Įkelti", + + "filter": "Filter", + + "hide": "Paslėpti", + "hour": "Valanda", + "hue": "Hue", + "import": "Importuoti", + "info": "Info", + "insert": "Įterpti", + "insert.after": "Įterpti po", + "insert.before": "Įterpti prieš", + "install": "Įdiegti", + + "installation": "Įdiegimas", + "installation.completed": "Valdymo pultas įdiegtas", + "installation.disabled": "Pagal nutylėjimą valdymo pulto įdiegimas viešuose serveriuose yra negalimas. Prašome įdiegti lokalioje aplinkoje arba įgalinkite jį su panel.install opcija.", + "installation.issues.accounts": "Katalogas /site/accounts neegzistuoja arba neturi įrašymo teisių", + "installation.issues.content": "Katalogas /content neegzistuoja arba neturi įrašymo teisių", + "installation.issues.curl": "Plėtinys CURL yra privalomas", + "installation.issues.headline": "Nepavyko įdiegti valdymo pulto", + "installation.issues.mbstring": "Plėtinys MB String yra privalomas", + "installation.issues.media": "Katalogas /media neegzistuoja arba neturi įrašymo teisių", + "installation.issues.php": "Įsitikinkite, kad naudojama PHP 8+", + "installation.issues.sessions": "Katalogas /site/sessions neegzistuoja arba neturi įrašymo teisių", + + "language": "Kalba", + "language.code": "Kodas", + "language.convert": "Padaryti pagrindinį", + "language.convert.confirm": "

Do you really want to convert {name} to the default language? This cannot be undone.

If {name} has untranslated content, there will no longer be a valid fallback and parts of your site might be empty.

", + "language.create": "Pridėti naują kalbą", + "language.default": "Pagrindinė kalba", + "language.delete.confirm": "Ar tikrai norite pašalinti {name} kalbą, kartu su visais vertimais? Grąžinti nebus įmanoma! 🙀", + "language.deleted": "Kalba pašalinta", + "language.direction": "Skaitymo kryptis", + "language.direction.ltr": "Iš kairės į dešinę", + "language.direction.rtl": "Iš dešinės į kairę", + "language.locale": "PHP locale string", + "language.locale.warning": "Jūs naudojate pasirinktinį lokalės nustatymą. Prašome pakeisti jį faile /site/languages", + "language.name": "Pavadinimas", + "language.secondary": "Secondary language", + "language.settings": "Language settings", + "language.updated": "Kalba atnaujinta", + "language.variables": "Language variables", + "language.variables.empty": "No translations yet", + + "language.variable.delete.confirm": "Do you really want to delete the variable for {key}?", + "language.variable.key": "Key", + "language.variable.notFound": "The variable could not be found", + "language.variable.value": "Value", + + "languages": "Kalbos", + "languages.default": "Pagrindinė kalba", + "languages.empty": "Dar nėra kalbų", + "languages.secondary": "Papildomos kalbos", + "languages.secondary.empty": "Dar nėra papildomų kalbų", + + "license": "Licenzija", + "license.activate": "Aktyvuoti dabar", + "license.activate.label": "Prašome aktyvuoti jūsų licenciją", + "license.activate.domain": "Jūsų licencija bus akvytuota šiam domenui: {host}", + "license.activate.local": "Jūs ruošiatės aktyvuoti jūsų Kirby licenciją vietiniam domenui {host}. Jei ši svetainė veiks su viešu domenu, aktyvuokite jį. Arba jei {host} yra tikrai tas domenas, kurį norite naudoti, galite tęsti.", + "license.activated": "Aktyvuota", + "license.buy": "Pirkti licenziją", + "license.code": "Kodas", + "license.code.help": "Jūs gavote licencijos kodą po pirkimo el. paštu. Nukopijuokite jį ir įterpkite čia.", + "license.code.label": "Prašome įrašyti jūsų licenzijos kodą", + "license.status.active.info": "Įeina naujos pagrindinės versijos iki {date}", + "license.status.active.label": "Galiojanti licencija", + "license.status.demo.info": "Tai demo versija", + "license.status.demo.label": "Demo", + "license.status.inactive.info": "Atnaujinkite licenciją, kad būtų galimybė atnaujinti iki naujų pagrindinių versijų", + "license.status.inactive.label": "Nėra naujų pagrindinių versijų", + "license.status.legacy.bubble": "Pasiruošę atnaujinti jūsų licenciją?", + "license.status.legacy.info": "Jūsų licencija negalioja šiai versijai", + "license.status.legacy.label": "Prašome atnaujinti jūsų licenciją", + "license.status.missing.bubble": "Pasiruošę paleisti naują svetainę?", + "license.status.missing.info": "Nėra galiojančios licencijos", + "license.status.missing.label": "Prašome aktyvuoti jūsų licenciją", + "license.manage": "Valdyti savo licencijas", + "license.purchased": "Nupirkta", + "license.success": "Ačiū, kad palaikote Kirby", + "license.unregistered.label": "Neregistruota", + + "link": "Nuoroda", + "link.text": "Nuorodos tekstas", + + "loading": "Kraunasi", + + "lock.unsaved": "Neišsaugoti pakeitimai", + "lock.unsaved.empty": "Nebeliko neišsaugotų pakeitimų", + "lock.isLocked": "Unsaved changes by {email}", + "lock.unlock": "Atrakinti", + "lock.unlock.submit": "Unlock and overwrite unsaved changes by {email}", + "lock.isUnlocked": "Was unlocked by another user", + + "login": "Prisijungti", + "login.code.label.login": "Prisijungimo kodas", + "login.code.label.password-reset": "Slaptažodžio atstatymo kodas", + "login.code.placeholder.email": "000 000", + "login.code.placeholder.totp": "000000", + "login.code.text.email": "Jei jūsų el. paštas yra užregistruotas, užklaistas kodas buvo išsiųstas el. paštu.", + "login.code.text.totp": "Prašome įrašyti vienkartinį kodą iš jūsų autentifikavimo programėlės.", + "login.email.login.body": "Sveiki, {user.nameOrEmail},\n\nNeseniai užklausėte prisijungimo kodo svetainėje {site}.\nŠis kodas galios {timeout} min.:\n\n{code}\n\nJei neprašėte šio kodo, tiesiog ignoruokite, arba susisiekite su administratoriumi.\nDėl saugumo, prašome NEPERSIŲSTI šio laiško.", + "login.email.login.subject": "Jūsų prisijungimo kodas", + "login.email.password-reset.body": "Sveiki, {user.nameOrEmail},\n\nNeseniai užklausėte naujo slaptažodžio kūrimo kodo svetainėje {site}.\nŠis kodas galios {timeout} min.:\n\n{code}\n\nJei neprašėte šio kodo, tiesiog ignoruokite, arba susisiekite su administratoriumi.\nDėl saugumo, prašome NEPERSIŲSTI šio laiško", + "login.email.password-reset.subject": "Jūsų slaptažodžio atstatymo kodas ", + "login.remember": "Likti prisijungus", + "login.reset": "Sukurti naują slaptažodį", + "login.toggleText.code.email": "Prisijungti su el. paštu", + "login.toggleText.code.email-password": "Prisijungti su slaptažodžiu", + "login.toggleText.password-reset.email": "Pamiršote slaptažodį?", + "login.toggleText.password-reset.email-password": "← Atgal į prisijungimą", + "login.totp.enable.option": "Nustatyti vienkartinius kodus", + "login.totp.enable.intro": "Autentifikavimo programėlės gali generuoti vienkartinius kodus, kurie bus naudojami kaip 2-factor prisijungiant prie svetainės.", + "login.totp.enable.qr.label": "1. Nuskenuokite šį QR kodą", + "login.totp.enable.qr.help": "Negalite nuskenuoti? Pridėkite raktą {secret} rankiniu būdu į savo autentifikavimo programėlę.", + "login.totp.enable.confirm.headline": "2. Patvirtinti su sugeneruotu kodu", + "login.totp.enable.confirm.text": "Jūsų programėlė generuoja naują vienkartinį kodą kas 30 sekundžių. Įrašykite dabartinį kodą, norėdami užbaigti:", + "login.totp.enable.confirm.label": "Dabartinis kodas", + "login.totp.enable.confirm.help": "Po šio nustatymo, iš jūsų bus prašomas vienkartinis kodas jungiantis kiekvieną kartą.", + "login.totp.enable.success": "Vienkartiniai kodai įjungti", + "login.totp.disable.option": "Išjungti vienkartinius kodus", + "login.totp.disable.label": "Įrašykite savo slaptažodį norėdami išjungti vienkartinius kodus", + "login.totp.disable.help": "Ateityje kitoks 2-factor bus prašomas prisijungiant, pvz. login kodas, siunčiamas el. paštu. Jūs galite visada nustatyti vienkartinius kodus vėl vėliau.", + "login.totp.disable.admin": "

Tai išjungs vienkartinius kodus vartotojui {user}. Ateityje kitoks 2-factor bus prašomas prisijungiant, pvz. login kodas, siunčiamas el. paštu. Jūs galite visada nustatyti vienkartinius kodus vėl vėliau. {user} galės nustatyti vienkartinius kodus, kai jungsis kitą kartą.", + "login.totp.disable.success": "Vienkartiniai kodai išjungti", + + "logout": "Atsijungti", + + "merge": "Merge", + "menu": "Meniu", + "meridiem": "AM/PM", + "mime": "Media Tipas", + "minutes": "Minutės", + + "month": "Mėnuo", + "months.april": "Balandis", + "months.august": "August", + "months.december": "Gruodis", + "months.february": "Vasaris", + "months.january": "Sausis", + "months.july": "Liepa", + "months.june": "Birželis", + "months.march": "Kovas", + "months.may": "Gegužė", + "months.november": "Lapkritis", + "months.october": "Spalis", + "months.september": "Rugsėjis", + + "more": "Daugiau", + "move": "Move", + "name": "Pavadinimas", + "next": "Toliau", + "night": "Night", + "no": "ne", + "off": "ne", + "on": "taip", + "open": "Atidaryti", + "open.newWindow": "Atidaryti naujame lange", + "option": "Option", + "options": "Pasirinkimai", + "options.none": "Nėra pasirinkimų", + "options.all": "Rodyti visas {count} opcijas", + + "orientation": "Orientacija", + "orientation.landscape": "Horizontali", + "orientation.portrait": "Portretas", + "orientation.square": "Kvadratas", + + "page": "Puslapis", + "page.blueprint": "Šis puslapis dar neturi blueprint. Galite jį nustatyti per /site/blueprints/pages/{blueprint}.yml", + "page.changeSlug": "Pakeisti URL", + "page.changeSlug.fromTitle": "Sukurti URL pagal pavadinimą", + "page.changeStatus": "Pakeisti statusą", + "page.changeStatus.position": "Pasirinkite poziciją", + "page.changeStatus.select": "Pasirinkite statusą", + "page.changeTemplate": "Pakeisti šabloną", + "page.changeTemplate.notice": "Changing the page's template will remove content for fields that don't match in type. Use with caution.", + "page.create": "Sukurti kaip {status}", + "page.delete.confirm": "🙀 Ar tikrai norite pašalinti puslapį {title}?", + "page.delete.confirm.subpages": "Šis puslapis turi sub-puslapių.
Visi sub-puslapiai taip pat bus pašalinti.", + "page.delete.confirm.title": "Įrašykite puslapio pavadinimą tam, kad patvirtinti", + "page.duplicate.appendix": "Kopijuoti", + "page.duplicate.files": "Kopijuoti failus", + "page.duplicate.pages": "Kopijuoti puslapius", + "page.move": "Perkelti puslapį", + "page.sort": "Pakeisti poziciją", + "page.status": "Statusas", + "page.status.draft": "Juodraštis", + "page.status.draft.description": "Šis puslapis yra juodraščio režime ir prieinamas tik redaktoriams arba per slaptą nuorodą", + "page.status.listed": "Paskelbtas", + "page.status.listed.description": "Matomas viešai visiems", + "page.status.unlisted": "Nerodomas", + "page.status.unlisted.description": "Rodomas viešai visiems, bet tik per URL", + + "pages": "Puslapiai", + "pages.empty": "Dar nėra puslapių", + "pages.status.draft": "Juodraščiai", + "pages.status.listed": "Paskelbti", + "pages.status.unlisted": "Nerodomi", + + "pagination.page": "Puslapis", + + "password": "Slaptažodis", + "paste": "Įterpti", + "paste.after": "Įterpti po", + "paste.success": "{count} pasted!", + "pixel": "Pikselis", + "plugin": "Įskiepas", + "plugins": "Įskiepai", + "prev": "Ankstesnis", + "preview": "Peržiūra", + "remove": "Pašalinti", + "rename": "Pervadinti", + "renew": "Atnaujinti", + "replace": "Apkeisti", + "replace.with": "Replace with", + "retry": "Bandyti dar", + "revert": "Grąžinti", + "revert.confirm": "Ar tikrai norite atšaukti visus neišsaugotus pakeitimus?", + + "role": "Rolė", + "role.admin.description": "Admin turi visas teises", + "role.admin.title": "Admin", + "role.all": "Visos", + "role.empty": "Nėra vartotojų su tokia role", + "role.description.placeholder": "Be aprašymo", + "role.nobody.description": "Ši rolė bus naudojama jei nenustatytos jokios teisės", + "role.nobody.title": "Niekas", + + "save": "Išsaugoti", + "search": "Ieškoti", + "search.min": "Minimalus simbolių kiekis paieškai: {min}", + "search.all": "Parodyti visus {count} rezultatus", + "search.results.none": "Nėra rezultatų", + + "section.invalid": "The section is invalid", + "section.required": "Sekcija privaloma", + + "security": "Saugumas", + "select": "Pasirinkti", + "server": "Serveris", + "settings": "Nustatymai", + "show": "Rodyti", + "site.blueprint": "Svetainė neturi blueprint. Jūs galite nustatyti jį /site/blueprints/site.yml", + "size": "Dydis", + "slug": "URL pabaiga", + "sort": "Rikiuoti", + "sort.drag": "Drag to sort …", + "split": "Split", + + "stats.empty": "Nėra pranešimų", + "status": "Statusas", + + "system.info.copy": "Copy info", + "system.info.copied": "System info copied", + "system.issues.content": "The content folder seems to be exposed", + "system.issues.eol.kirby": "Your installed Kirby version has reached end-of-life and will not receive further security updates", + "system.issues.eol.plugin": "Your installed version of the { plugin } plugin is has reached end-of-life and will not receive further security updates", + "system.issues.eol.php": "Jūsų PHP versija { release } pasiekė gyvenimo galą ir daugiau negaus saugumo atnaujinimų", + "system.issues.debug": "Debugging must be turned off in production", + "system.issues.git": "The .git folder seems to be exposed", + "system.issues.https": "Rekomenduojame HTTPS visoms svetainėms", + "system.issues.kirby": "The kirby folder seems to be exposed", + "system.issues.site": "The site folder seems to be exposed", + "system.issues.vulnerability.kirby": "Your installation might be affected by the following vulnerability ({ severity } severity): { description }", + "system.issues.vulnerability.plugin": "Your installation might be affected by the following vulnerability in the { plugin } plugin ({ severity } severity): { description }", + "system.updateStatus": "Atnaujinimų statusas", + "system.updateStatus.error": "Nepavyko patikrinti atnaujinimų", + "system.updateStatus.not-vulnerable": "Nėra žinomų saugumo spragų", + "system.updateStatus.security-update": "Prieinamas nemokamas saugumo atnaujinimas { version }", + "system.updateStatus.security-upgrade": "Prieinama nauja { version } versija su saugumo atnaujinimais", + "system.updateStatus.unreleased": "Neišleista versija", + "system.updateStatus.up-to-date": "Naujausia versija", + "system.updateStatus.update": "Prieinamas nemokamas atnaujinimas { version }", + "system.updateStatus.upgrade": "Prieinamas atnaujinimas { version }", + + "tel": "Phone", + "tel.placeholder": "+49123456789", + "template": "Puslapio šablonas", + "title": "Pavadinimas", + "today": "Šiandien", + + "toolbar.button.clear": "Clear formatting", + "toolbar.button.code": "Kodas", + "toolbar.button.bold": "Bold", + "toolbar.button.email": "El. paštas", + "toolbar.button.headings": "Antraštės", + "toolbar.button.heading.1": "Heading 1", + "toolbar.button.heading.2": "Heading 2", + "toolbar.button.heading.3": "Heading 3", + "toolbar.button.heading.4": "Antrašte 4", + "toolbar.button.heading.5": "Antrašte 5", + "toolbar.button.heading.6": "Antrašte 6", + "toolbar.button.italic": "Italic", + "toolbar.button.file": "Failas", + "toolbar.button.file.select": "Pasirinkite failą", + "toolbar.button.file.upload": "Įkelti failą", + "toolbar.button.link": "Nuoroda", + "toolbar.button.paragraph": "Paragrafas", + "toolbar.button.strike": "Perbraukimas", + "toolbar.button.sub": "Subscript", + "toolbar.button.sup": "Superscript", + "toolbar.button.ol": "Sąrašas su skaičiais", + "toolbar.button.underline": "Pabraukimas", + "toolbar.button.ul": "Sąrašas su taškais", + + "translation.author": "Roman U", + "translation.direction": "ltr", + "translation.name": "Lietuvių", + "translation.locale": "lt_LT", + + "type": "Type", + + "upload": "Įkelti", + "upload.error.cantMove": "Įkeltas failas negali būti perkeltas", + "upload.error.cantWrite": "Nepavyko įrašyti failo į diską", + "upload.error.default": "Nepavyko įkelti failo", + "upload.error.extension": "Neįmanoma įkelti tokio tipo failo", + "upload.error.formSize": "Įkeltas failas viršija MAX_FILE_SIZE nustatymą, kuris buvo nurodytas formoje", + "upload.error.iniPostSize": "Įkeliamas failas viršija post_max_size nustatymą iš php.ini", + "upload.error.iniSize": "Įkeltas failas viršija upload_max_filesize nustatymą faile php.ini", + "upload.error.noFile": "Failas nebuvo įkeltas", + "upload.error.noFiles": "Failai nebuvo įkelti", + "upload.error.partial": "Failas įkeltas tik iš dalies", + "upload.error.tmpDir": "Trūksta laikinojo katalogo", + "upload.errors": "Klaida", + "upload.progress": "Įkėlimas…", + + "url": "Url", + "url.placeholder": "https://example.com", + + "user": "Vartotojas", + "user.blueprint": "Galite nustatyti papildomas sekcijas ir formos laukelius šiam vartotojui per /site/blueprints/users/{blueprint}.yml", + "user.changeEmail": "Keisti el. paštą", + "user.changeLanguage": "Keisti kalbą", + "user.changeName": "Pervadinti vartotoją", + "user.changePassword": "Keisti slaptažodį", + "user.changePassword.new": "Naujas slaptažodis", + "user.changePassword.new.confirm": "Patvirtinti naują slaptažodį…", + "user.changeRole": "Keisti rolę", + "user.changeRole.select": "Pasirinkti naują rolę", + "user.create": "Pridėti naują vartotoją", + "user.delete": "Pašalinti šį vartotoją", + "user.delete.confirm": "Ar tikrai norite pašalinti vartotoją
{email}?", + + "users": "Vartotojai", + + "version": "Versija", + "version.current": "Dabartinė versija", + "version.latest": "Naujausia versija", + "versionInformation": "Versijos informacija", + + "view.account": "Jūsų paskyra", + "view.installation": "Installation", + "view.languages": "Kalbos", + "view.resetPassword": "Sukurti naują slaptažodį", + "view.site": "Svetainė", + "view.system": "Sistema", + "view.users": "Vartotojai", + + "welcome": "Sveiki", + "year": "Metai", + "yes": "taip" +} diff --git a/kirby/i18n/translations/nb.json b/kirby/i18n/translations/nb.json new file mode 100644 index 0000000..7f50aa6 --- /dev/null +++ b/kirby/i18n/translations/nb.json @@ -0,0 +1,730 @@ +{ + "account.changeName": "Endre navnet ditt", + "account.delete": "Slett kontoen din", + "account.delete.confirm": "Er du sikker på at du vil slette kontoen din? Du vil bli logget ut umiddelbart. Kontoen din kan ikke gjenopprettes.", + + "activate": "Aktiver", + "add": "Legg til", + "alpha": "Alfa", + "author": "Forfatter", + "avatar": "Profilbilde", + "back": "Tilbake", + "cancel": "Avbryt", + "change": "Endre", + "close": "Lukk", + "changes": "Endringer", + "confirm": "Lagre", + "collapse": "Skjul", + "collapse.all": "Skjule alle", + "color": "Farge", + "coordinates": "Koordinater", + "copy": "Kopier", + "copy.all": "Kopier alle", + "copy.success": "{count} kopiert!", + "create": "Opprett", + "custom": "Egendefinert", + + "date": "Dato", + "date.select": "Velg dato", + + "day": "Dag", + "days.fri": "Fre", + "days.mon": "Man", + "days.sat": "L\u00f8r", + "days.sun": "S\u00f8n", + "days.thu": "Tor", + "days.tue": "Tir", + "days.wed": "Ons", + + "debugging": "Feilsøker", + + "delete": "Slett", + "delete.all": "Slett alle", + + "dialog.fields.empty": "Denne dialogen har ingen felter", + "dialog.files.empty": "Ingen filer å velge", + "dialog.pages.empty": "Ingen sider å velge", + "dialog.text.empty": "Denne dialogen definerer ingen tekst", + "dialog.users.empty": "Ingen brukere å velge", + + "dimensions": "Dimensjoner", + "disable": "Deaktivere", + "disabled": "Deaktivert", + "discard": "Forkast", + + "drawer.fields.empty": "Denne skuffen har ingen felt", + + "domain": "Domene", + "download": "Last ned", + "duplicate": "Dupliser", + + "edit": "Rediger", + + "email": "Epost", + "email.placeholder": "epost@eksempel.no", + + "enter": "Enter", + "entries": "Artikler", + "entry": "Artikkel", + + "environment": "Miljø", + + "error": "Feil", + "error.access.code": "Ugyldig kode", + "error.access.login": "Ugyldig innlogging", + "error.access.panel": "Du har ikke tilgang til panelet", + "error.access.view": "Du har ikke tilgang til denne delen av panelet", + + "error.avatar.create.fail": "Profilbildet kunne ikke lastes opp", + "error.avatar.delete.fail": "Profilbildet kunne ikke slettes", + "error.avatar.dimensions.invalid": "Vennligst hold profilbildets bredde og høyde under 3000 piksler", + "error.avatar.mime.forbidden": "Ugyldig MIME-type", + + "error.blueprint.notFound": "Blueprint \"{name}\" kunne ikke lastes inn", + + "error.blocks.max.plural": "Du kan ikke legge til flere enn {max} blokker", + "error.blocks.max.singular": "Du kan ikke legge til mer enn en blokk", + "error.blocks.min.plural": "Du må legge til minst {min} blokker", + "error.blocks.min.singular": "Du må legge til minst en blokk", + "error.blocks.validation": "Det er en feil med feltet \"{field}\" i blokk {index} hvor blokktypen \"{fieldset}\" brukes", + + "error.cache.type.invalid": "Ugyldig type cache \"{type}\"", + + "error.email.preset.notFound": "E-postinnstillingen \"{name}\" ble ikke funnet", + + "error.field.converter.invalid": "Ugyldig omformer \"{converter}\"", + "error.field.type.missing": "Felt \"{ name }\": Felttypen \"{ type }\" finnes ikke", + + "error.file.changeName.empty": "Navnet kan ikke være tomt", + "error.file.changeName.permission": "Du har ikke rettighet til å endre navnet til \"{filename}\"", + "error.file.changeTemplate.invalid": "Malen for filen \"{id}\" Kan ikke endres til \"{template}\" (gyldig: \"{blueprints}\")", + "error.file.changeTemplate.permission": "Du har ikke rettigheter til å endre malen for filen \"{id}\"", + + "error.file.duplicate": "En fil med navnet \"{filename}\" eksisterer allerede", + "error.file.extension.forbidden": "Ugyldig filtype", + "error.file.extension.invalid": "Ugyldig utvidelse: {extension}", + "error.file.extension.missing": "Du kan ikke laste opp filer uten filtype", + "error.file.maxheight": "Høyden til bildet kan ikke overgå {height} piksler", + "error.file.maxsize": "Filen er for stor", + "error.file.maxwidth": "Bredden til bildet kan ikke overgå {width} piksler", + "error.file.mime.differs": "Den opplastede filen må være av samme MIME-type \"{mime}\"", + "error.file.mime.forbidden": "Mediatypen \"{mime}\" er ikke tillatt", + "error.file.mime.invalid": "Ugyldig mediatype: {mime}", + "error.file.mime.missing": "Mediatypen for \"{filename}\" kan ikke gjenkjennes", + "error.file.minheight": "Høyden til bildet må være minst {height} piksler", + "error.file.minsize": "Filen er for liten", + "error.file.minwidth": "Bredden til bildet må være minst {width} piksler", + "error.file.name.unique": "The filename must be unique", + "error.file.name.missing": "Filnavnet kan ikke være tomt", + "error.file.notFound": "Filen \"{filename}\" kan ikke bli funnet", + "error.file.orientation": "Bilderetningen må være \"{orientation}\"", + "error.file.type.forbidden": "Du har ikke lov til å laste opp filer av typen {type}", + "error.file.type.invalid": "Ugyldig filtype: {type}", + "error.file.undefined": "Finner ikke filen", + + "error.form.incomplete": "Vennligst fiks alle feil…", + "error.form.notSaved": "Skjemaet kunne ikke lagres", + + "error.language.code": "Vennligst skriv inn gyldig språkkode", + "error.language.duplicate": "Språket eksisterer allerede", + "error.language.name": "Vennligst skriv inn et gyldig navn for språket", + "error.language.notFound": "Finner ikke språket", + + "error.layout.validation.block": "Det er en feilmelding på \"{field}\" feltet i blokk {blockIndex} med bruk av \"{fieldset}\" blokktypen i layout {layoutIndex}", + "error.layout.validation.settings": "Det er en feil i layout {index} innstillinger", + + "error.license.domain": "Domenen for lisensen mangler", + "error.license.email": "Vennligst skriv inn en gyldig e-postadresse", + "error.license.format": "Please enter a valid license code", + "error.license.verification": "Lisensen kunne ikke verifiseres", + + "error.login.totp.confirm.invalid": "Ugyldig kode", + "error.login.totp.confirm.missing": "Vennligst skriv inn nåværende koden", + + "error.object.validation": "Det er en feilmelding i \"{label}\" feltet:\n{message}", + + "error.offline": "Panelet er i øyeblikket offline", + + "error.page.changeSlug.permission": "Du kan ikke endre URLen for denne siden", + "error.page.changeSlug.reserved": "Stien til toppnivåsider kan ikke starte med \"{path}\"", + "error.page.changeStatus.incomplete": "Siden har feil og kan ikke publiseres", + "error.page.changeStatus.permission": "Sidens status kan ikke endres", + "error.page.changeStatus.toDraft.invalid": "Siden \"{slug}\" kan ikke konverteres til et utkast", + "error.page.changeTemplate.invalid": "Malen for siden \"{slug}\" kan ikke endres", + "error.page.changeTemplate.permission": "Du har ikke tillatelse til å endre malen for \"{slug}\"", + "error.page.changeTitle.empty": "Tittelen kan ikke være tom", + "error.page.changeTitle.permission": "Du har ikke tillatelse til å endre tittelen for \"{slug}\"", + "error.page.create.permission": "Du har ikke tillatelse til å opprette \"{slug}\"", + "error.page.delete": "Siden \"{slug}\" kan ikke slettes", + "error.page.delete.confirm": "Vennligst skriv inn sidens tittel for å bekrefte", + "error.page.delete.hasChildren": "Siden har undersider og kan derfor ikke slettes", + "error.page.delete.permission": "Du har ikke til å slette \"{slug}\"", + "error.page.draft.duplicate": "Et sideutkast med URL-tillegget \"{slug}\" eksisterer allerede", + "error.page.duplicate": "En side med URL-tillegget \"{slug}\" eksisterer allerede", + "error.page.duplicate.permission": "Du har ikke tillatelse til å duplisere \"{slug}\"", + "error.page.move.ancestor": "Siden kan ikke flyttes inn i seg selv", + "error.page.move.directory": "Sidestrukturen kan ikke flyttes", + "error.page.move.duplicate": "En underside med url banen \"{slug}\" finnes allerede", + "error.page.move.notFound": "Den flyttede siden kan ikke bli funnet", + "error.page.move.permission": "You are not allowed to move \"{slug}\"", + "error.page.move.template": "\"{template}\" malen er ikke akseptert som underside av \"{parent}\"", + "error.page.notFound": "Siden \"{slug}\" ble ikke funnet", + "error.page.num.invalid": "Vennligst skriv inn et gyldig sorteringsnummer. Tallet må ikke være negativt.", + "error.page.slug.invalid": "Vennligst skriv inn en gyldig URL endelse", + "error.page.slug.maxlength": "Slug lengden må være mindre enn \"{length}\" karakterer", + "error.page.sort.permission": "Siden \"{slug}\" kan ikke sorteres", + "error.page.status.invalid": "Vennligst angi en gyldig sidestatus", + "error.page.undefined": "Siden kunne ikke bli funnet", + "error.page.update.permission": "Du har ikke tillatelse til å oppdatere \"{slug}\"", + + "error.section.files.max.plural": "Det er ikke mulig å legge til mer enn {max} filer i seksjonen \"{section}\"", + "error.section.files.max.singular": "Det er ikke mulig å legge til mer enn én fil i seksjonen \"{section}\"", + "error.section.files.min.plural": "Seksjonen \"{section}\" krever minst {min} filer", + "error.section.files.min.singular": "Seksjonen \"{section}\" krever minst en fil", + + "error.section.pages.max.plural": "Det er ikke mulig å legge til mer enn {max} sider i \"{section}\" seksjonen", + "error.section.pages.max.singular": "Det er ikke mulig å legge til mer enn én side i \"{section}\" seksjonen", + "error.section.pages.min.plural": "Seksjonen \"{section}\" krever minst {min} sider", + "error.section.pages.min.singular": "Seksjonen \"{section}\" krever minst en side", + + "error.section.notLoaded": "Seksjonen \"{name}\" kunne ikke lastes inn", + "error.section.type.invalid": "Seksjonstypen \"{type}\" er ikke gyldig", + + "error.site.changeTitle.empty": "Tittelen kan ikke være tom", + "error.site.changeTitle.permission": "Du har ikke tillatelse til å endre tittel på siden", + "error.site.update.permission": "Du har ikke tillatelse til å oppdatere denne siden", + + "error.structure.validation": "Det er en feilmelding på felt \"{field}\" i rad {index}", + + "error.template.default.notFound": "Standardmalen eksisterer ikke", + + "error.unexpected": "En uventet feil oppstod! Aktiver feilsøkmodus for mer info: https://getkirby.com/docs/reference/system/options/debug", + + "error.user.changeEmail.permission": "Du har ikke tillatelse til å endre e-post for brukeren \"{name}\"", + "error.user.changeLanguage.permission": "Du har ikke tillatelse til å endre språk for brukeren \"{name}\"", + "error.user.changeName.permission": "Du har ikke tillatelse til å endre navn for brukeren \"{name}\"", + "error.user.changePassword.permission": "Du har ikke tillatelse til å endre passord for brukeren \"{name}\"", + "error.user.changeRole.lastAdmin": "Rollen for den siste administratoren kan ikke endres", + "error.user.changeRole.permission": "Du har ikke tillatelse til å endre rollen for brukeren \"{name}\"", + "error.user.changeRole.toAdmin": "Du har ikke tillatelse til å endre noen til adminrolle", + "error.user.create.permission": "Du har ikke tillatelse til å opprette denne brukeren", + "error.user.delete": "Denne brukeren kunne ikke bli slettet", + "error.user.delete.lastAdmin": "Siste administrator kan ikke slettes", + "error.user.delete.lastUser": "Den siste brukeren kan ikke slettes", + "error.user.delete.permission": "Du er ikke tillat \u00e5 slette denne brukeren", + "error.user.duplicate": "En bruker med e-postadresse \"{email}\" eksisterer allerede", + "error.user.email.invalid": "Vennligst skriv inn en gyldig e-postadresse", + "error.user.language.invalid": "Vennligst skriv inn et gyldig språk", + "error.user.notFound": "Brukeren kunne ikke bli funnet", + "error.user.password.excessive": "Please enter a valid password. Passwords must not be longer than 1000 characters.", + "error.user.password.invalid": "Vennligst skriv inn et gyldig passord. Passordet må minst være 8 tegn langt.", + "error.user.password.notSame": "Vennligst bekreft passordet", + "error.user.password.undefined": "Brukeren har ikke et passord", + "error.user.password.wrong": "Feil passord", + "error.user.role.invalid": "Vennligst skriv inn en gyldig rolle", + "error.user.undefined": "Brukeren kunne ikke bli funnet", + "error.user.update.permission": "Du har ikke tillatelse til å oppdatere brukeren \"{name}\"", + + "error.validation.accepted": "Vennligst bekreft", + "error.validation.alpha": "Vennligst skriv kun tegn mellom a-z", + "error.validation.alphanum": "Vennligst skriv kun tegn mellom a-z eller tall mellom 0-9", + "error.validation.anchor": "Vennligst skriv inn en riktig link-ankertekst", + "error.validation.between": "Vennligst angi en verdi mellom \"{min}\" og \"{max}\"", + "error.validation.boolean": "Vennligst bekreft eller avslå", + "error.validation.color": "Please enter a valid color in the {format} format", + "error.validation.contains": "Vennligst skriv inn en verdi som inneholder \"{needle}\"", + "error.validation.date": "Vennligst skriv inn en gyldig dato", + "error.validation.date.after": "Vennligst angi en dato etter {date}", + "error.validation.date.before": "Vennligst angi en dato før {date}", + "error.validation.date.between": "Vennligst angi en dato mellom {min} og {max}", + "error.validation.denied": "Vennligst avslå", + "error.validation.different": "Verdien kan ikke være \"{other}\"", + "error.validation.email": "Vennligst skriv inn en gyldig e-postadresse", + "error.validation.endswith": "Verdien må ende med \"{end}\"", + "error.validation.filename": "Vennligst skriv inn et gyldig filnavn", + "error.validation.in": "Vennligst skriv inn en av følgende: ({in})", + "error.validation.integer": "Vennligst skriv inn et gyldig tall", + "error.validation.ip": "Vennligst skriv inn en gyldig IP-adresse", + "error.validation.less": "Vennligst angi en verdi lavere enn {max}", + "error.validation.linkType": "The link type is not allowed", + "error.validation.match": "Verdien samsvarer ikke med det forventede mønsteret", + "error.validation.max": "Vennligst angi en verdi lik eller lavere enn {max}", + "error.validation.maxlength": "Vennligst angi en kortere verdi. (maks. {max} tegn)", + "error.validation.maxwords": "Vennligst ikke skriv inn mer enn {max} ord", + "error.validation.min": "Vennligst angi en verdi lik eller større enn {min}", + "error.validation.minlength": "Vennligst angi en lengre verdi. (minimum. {min} tegn)", + "error.validation.minwords": "Vennligst skriv inn minst {min} ord", + "error.validation.more": "Vennligst angi en verdi større enn {min}", + "error.validation.notcontains": "Vennligst angi en verdi som ikke inneholder \"{needle}\"", + "error.validation.notin": "Vennligst ikke angi noen av følgende:({notIn})", + "error.validation.option": "Vennligst velg et gyldig alternativ", + "error.validation.num": "Vennligst angi et gyldig nummer", + "error.validation.required": "Vennligst skriv inn noe", + "error.validation.same": "Vennligst angi \"{other}\"", + "error.validation.size": "Størrelsen på verdien må være \"{size}\"", + "error.validation.startswith": "Verdien må starte med \"{start}\"", + "error.validation.tel": "Please enter an unformatted phone number", + "error.validation.time": "Vennligst angi et gyldig tidspunkt", + "error.validation.time.after": "Vennligst angi et tidspunkt etter {time}", + "error.validation.time.before": "Vennligst angi et tidspunkt før {time}", + "error.validation.time.between": "Vennligst angi et tidspunkt mellom {min} og {max}", + "error.validation.uuid": "Please enter a valid UUID", + "error.validation.url": "Vennligst skriv inn en gyldig URL", + + "expand": "Utvid", + "expand.all": "Utvid alle", + + "field.invalid": "The field is invalid", + "field.required": "Feltet er påkrevd", + "field.blocks.changeType": "Endre type", + "field.blocks.code.name": "Kode", + "field.blocks.code.language": "Språk", + "field.blocks.code.placeholder": "Din kode…", + "field.blocks.delete.confirm": "Er du sikker på at du vil slette denne blokken?", + "field.blocks.delete.confirm.all": "Er du sikker på at du vil slette alle blokkene?", + "field.blocks.delete.confirm.selected": "Er du sikker på at du vil slette de valgte blokkene?", + "field.blocks.empty": "Ingen blokker enda", + "field.blocks.fieldsets.empty": "Ingen feltsett enda", + "field.blocks.fieldsets.label": "Vennligst velg en blokktype…", + "field.blocks.fieldsets.paste": "Trykk {{ shortcut }} for å importere layout/blokker fra utklippsverktøyet Bare de som er tillat i nåværende felt vil bli limt inn.", + "field.blocks.gallery.name": "Galleri", + "field.blocks.gallery.images.empty": "Ingen bilder enda", + "field.blocks.gallery.images.label": "Bilder", + "field.blocks.heading.level": "Nivå", + "field.blocks.heading.name": "Overskrift", + "field.blocks.heading.text": "Tekst", + "field.blocks.heading.placeholder": "Overskrift…", + "field.blocks.image.alt": "Alternativ tekst", + "field.blocks.image.caption": "Caption", + "field.blocks.image.crop": "Beskjær", + "field.blocks.image.link": "Adresse", + "field.blocks.image.location": "Plassering", + "field.blocks.image.location.internal": "Denne nettsiden", + "field.blocks.image.location.external": "Ekstern kilde", + "field.blocks.image.name": "Bilde", + "field.blocks.image.placeholder": "Velg et bilde", + "field.blocks.image.ratio": "Ratio", + "field.blocks.image.url": "Bilde URL", + "field.blocks.line.name": "Linje", + "field.blocks.list.name": "Liste", + "field.blocks.markdown.name": "Markdown", + "field.blocks.markdown.label": "Tekst", + "field.blocks.markdown.placeholder": "Markdown…", + "field.blocks.quote.name": "Sitat", + "field.blocks.quote.text.label": "Tekst", + "field.blocks.quote.text.placeholder": "Sitat…", + "field.blocks.quote.citation.label": "Kildehenvisning", + "field.blocks.quote.citation.placeholder": "av…", + "field.blocks.text.name": "Tekst", + "field.blocks.text.placeholder": "Tekst…", + "field.blocks.video.autoplay": "Autoplay", + "field.blocks.video.caption": "Caption", + "field.blocks.video.controls": "Controls", + "field.blocks.video.location": "Plassering", + "field.blocks.video.loop": "Loop", + "field.blocks.video.muted": "Muted", + "field.blocks.video.name": "Video", + "field.blocks.video.placeholder": "Legg til en video URL", + "field.blocks.video.poster": "Poster", + "field.blocks.video.preload": "Preload", + "field.blocks.video.url.label": "Video-URL", + "field.blocks.video.url.placeholder": "https://youtube.com/?v=", + + "field.files.empty": "Ingen filer har blitt valgt", + + "field.layout.change": "Endre layout", + "field.layout.delete": "Slett layout", + "field.layout.delete.confirm": "Er du sikker på at du vil slette denne layouten?", + "field.layout.delete.confirm.all": "Vil du virkelig slette alle layout?", + "field.layout.empty": "Ingen rader enda", + "field.layout.select": "Velg en layout", + + "field.object.empty": "Ingen informasjon enda", + + "field.pages.empty": "Ingen side har blitt valgt", + + "field.structure.delete.confirm": "\u00d8nsker du virkelig \u00e5 slette denne oppf\u00f8ringen?", + "field.structure.delete.confirm.all": "Vil du virkelig slette alle oppføringer?", + "field.structure.empty": "Ingen oppf\u00f8ringer enda", + + "field.users.empty": "Ingen bruker har blitt valgt", + + "fields.empty": "Ingen felt enda", + + "file": "Fil", + "file.blueprint": "Denne filen har ikke en blueprint enda. Du kan definere oppsettet i /site/blueprints/files/{blueprint}.yml", + "file.changeTemplate": "Endre mal", + "file.changeTemplate.notice": "Endring av denne filens mal kommer til å fjerne innhold for felter som ikke korresponderer med typen. Dersom den nye malen inneholder gitte regler, f.eks bildedimensjoner, vil også disse bli påført irreversibelt. Bruk varsomt.", + "file.delete.confirm": "Vil du virkelig slette denne filen?", + "file.focus.placeholder": "Sett fokuspunkt", + "file.focus.reset": "Fjern fokuspunkt", + "file.focus.title": "Focus", + "file.sort": "Endre plassering", + + "files": "Filer", + "files.empty": "Ingen filer ennå", + + "filter": "Filter", + + "hide": "Skjul", + "hour": "Tid", + "hue": "Hue", + "import": "Importer", + "info": "Info", + "insert": "Sett Inn", + "insert.after": "Sett inn etter", + "insert.before": "Sett inn før", + "install": "Installer", + + "installation": "Installasjon", + "installation.completed": "Panelet har blitt installert", + "installation.disabled": "Installasjonsprogrammet for Panelet er deaktivert på offentlige servere som standard. Vennligst kjør installasjonsprogrammet på en lokal maskin eller aktiver den med panel.install innstillingen.", + "installation.issues.accounts": "\/site\/accounts er ikke skrivbar", + "installation.issues.content": "Mappen content og alt av innhold m\u00e5 v\u00e6re skrivbar.", + "installation.issues.curl": "Utvidelsen CURL er nødvendig", + "installation.issues.headline": "Panelet kan ikke installeres", + "installation.issues.mbstring": "Utvidelsen MB String er nødvendig", + "installation.issues.media": "Mappen /media eksisterer ikke eller er ikke skrivbar", + "installation.issues.php": "Pass på at du bruker PHP 8+", + "installation.issues.sessions": "Mappen /site/sessions eksisterer ikke eller er ikke skrivbar", + + "language": "Spr\u00e5k", + "language.code": "Kode", + "language.convert": "Gjør til standard", + "language.convert.confirm": "

Vil du virkelig konvertere {name} til standardspråk? Dette kan ikke angres.

Dersom {name} har innhold som ikke er oversatt, vil nettstedet mangle innhold å falle tilbake på. Dette kan resultere i at deler av nettstedet fremstår som tomt.

", + "language.create": "Legg til språk", + "language.default": "Standardspråk", + "language.delete.confirm": "Vil du virkelig slette språket {name} inkludert alle oversettelser? Dette kan ikke angres!", + "language.deleted": "Språket har blitt slettet", + "language.direction": "Leseretning", + "language.direction.ltr": "Venstre til høyre", + "language.direction.rtl": "Høyre til venstre", + "language.locale": "PHP locale streng", + "language.locale.warning": "Du bruker et egendefinert lokalt oppsett. Vennligst endre det i språkfilen i /site/languages", + "language.name": "Navn", + "language.secondary": "Sekundærspråk", + "language.settings": "Språkinstillinger", + "language.updated": "Språk har blitt oppdatert", + "language.variables": "Språkvariabler", + "language.variables.empty": "Ingen oversettelse enda", + + "language.variable.delete.confirm": "Ønsker du virkelig å slette variablen for {key}?", + "language.variable.key": "Key", + "language.variable.notFound": "Variablen kan ikke bli funnet", + "language.variable.value": "Verdi", + + "languages": "Språk", + "languages.default": "Standardspråk", + "languages.empty": "Det er ingen språk ennå", + "languages.secondary": "Sekundære språk", + "languages.secondary.empty": "Det er ingen andre språk ennå", + + "license": "Kirby lisens", + "license.activate": "Aktiver den nå", + "license.activate.label": "Vennligst skriv inn din lisenskode", + "license.activate.domain": "Lisenses skal bli aktivert for {host}.", + "license.activate.local": "Du er i ferd med å aktivere Kirby lisensen din til lokale domenen din {host}. Hvis nettsiden skal plasseres til en offentlig domene, vennligst aktivere den der isteden. Hvis {host} er domenen du vil bruke med din lisens, vennligst fortsett.", + "license.activated": "Aktivert", + "license.buy": "Kjøp lisens", + "license.code": "Kode", + "license.code.help": "Du har mottatt din lisenskoden via e-post etter kjøpet. Vennligst kopier og lim den inn her.", + "license.code.label": "Vennligst skriv inn din lisenskode", + "license.status.active.info": "Inkluderer nye hovedversjoner til {date}", + "license.status.active.label": "Gyldig lisens", + "license.status.demo.info": "This is a demo installation", + "license.status.demo.label": "Demo", + "license.status.inactive.info": "Forny lisens for å oppdatere til nye hovedversjoner", + "license.status.inactive.label": "Ingen nye hovedversjoner", + "license.status.legacy.bubble": "Klar til å fornye lisensen?", + "license.status.legacy.info": "Lisensen din omfatter ikke denne versjonen", + "license.status.legacy.label": "Vennligst fornye lisensen din", + "license.status.missing.bubble": "Klar til å lansere din nettside?", + "license.status.missing.info": "Ingen gyldig lisens", + "license.status.missing.label": "Vennligst skriv inn din lisenskode", + "license.manage": "Håndter dine lisenser", + "license.purchased": "Kjøpt", + "license.success": "Takk for at du støtter Kirby", + "license.unregistered.label": "Ikke registrert", + + "link": "Adresse", + "link.text": "Koblingstekst", + + "loading": "Laster inn", + + "lock.unsaved": "Ulagrede endringer", + "lock.unsaved.empty": "Det er ingen flere ulagrede endringer", + "lock.isLocked": "Ulagrede endringer av {email}", + "lock.unlock": "Lås opp", + "lock.unlock.submit": "Lås opp og overskriv ulagrede endringer fra {email}", + "lock.isUnlocked": "Ble låst opp av en annen bruker", + + "login": "Logg Inn", + "login.code.label.login": "Login-kode", + "login.code.label.password-reset": "Passord tilbakestillingskode", + "login.code.placeholder.email": "000 000", + "login.code.placeholder.totp": "000000", + "login.code.text.email": "Dersom din e-post er registrert vil den forespurte koden bli sendt via e-post.", + "login.code.text.totp": "Vennligst skriv inn engangskoden fra authenticator appen din.", + "login.email.login.body": "Hei {user.nameOrEmail},\n\nDu ba nylig om en innloggingskode til panelet til {site}.\nFølgende innloggingskode vil være gyldig i {timeout} minutter:\n\n{code}\n\nDersom du ikke ba om en innloggingskode, vennligst ignorer denne e-posten eller kontakt din administrator hvis du har spørsmål.\nFor sikkerhets skyld, vennligst IKKE videresend denne e-posten.", + "login.email.login.subject": "Din innloggingskode", + "login.email.password-reset.body": "Hei {user.nameOrEmail},\n\nDu ba nylig om en tilbakestilling av passord til panelet til {site}.\nFølgende tilbakestillingskode vil være gyldig i {timeout} minutter:\n\n{code}\n\nDersom du ikke ba om en tilbakestillingskode, vennligst ignorer denne e-posten eller kontakt din administrator hvis du har spørsmål.\nFor sikkerhets skyld, vennligst IKKE videresend denne e-posten.", + "login.email.password-reset.subject": "Din kode for tilbakestilling av passord", + "login.remember": "Hold meg innlogget", + "login.reset": "Tilbakestill passord", + "login.toggleText.code.email": "Logg inn via e-post", + "login.toggleText.code.email-password": "Logg inn med passord", + "login.toggleText.password-reset.email": "Glemt passord?", + "login.toggleText.password-reset.email-password": "← Tilbake til innlogging", + "login.totp.enable.option": "Sett opp engangskoder", + "login.totp.enable.intro": "Autentiseringsapper kan generere engangskoder til bruk for totrinnspålogging når du logger inn på din konto.", + "login.totp.enable.qr.label": "1. Scan denne QR-koden", + "login.totp.enable.qr.help": "Kan du ikke scanne? Legg til installasjonsnøkkelen {secret} manuelt i din autentiseringsapp.", + "login.totp.enable.confirm.headline": "2. Bekreft med den genererte koden", + "login.totp.enable.confirm.text": "Din app genererer en engangskode hvert 30ende sekund. Skriv inn koden som vises nå for å ferdigstille oppsettet:", + "login.totp.enable.confirm.label": "Nærværende kode", + "login.totp.enable.confirm.help": "Etter dette er satt opp, vil vi spørre etter en engangskode hver gang du logger inn.", + "login.totp.enable.success": "Engangskoder er aktivert", + "login.totp.disable.option": "Deaktiver engangskoder", + "login.totp.disable.label": "Skriv inn ditt passord for å deaktivere bruk av engangskoder", + "login.totp.disable.help": "I fremtiden vil en annen tofaktorløsning – som en loginkode sendt via epost – bli etterspurt når du logger inn. Du kan alltid sette opp tofaktorkoder igjen på senere tidspunkt.", + "login.totp.disable.admin": "

Dette kommer til å deaktivere engangskoder for {user}.

I fremtiden vil en annen tofaktorløsning – som en loginkode sendt via epost – bli etterspurt når de logger inn. {user} kan alltid sette opp tofaktorkoder igjen på senere tidspunkt.", + "login.totp.disable.success": "Engangskoder deaktivert", + + "logout": "Logg ut", + + "merge": "Slå sammen", + "menu": "Meny", + "meridiem": "AM/PM", + "mime": "Mediatype", + "minutes": "Minutter", + + "month": "Måned", + "months.april": "April", + "months.august": "August", + "months.december": "Desember", + "months.february": "Februar", + "months.january": "Januar", + "months.july": "July", + "months.june": "Juni", + "months.march": "Mars", + "months.may": "Mai", + "months.november": "November", + "months.october": "Oktober", + "months.september": "September", + + "more": "Mer", + "move": "Flytt", + "name": "Navn", + "next": "Neste", + "night": "Natt", + "no": "nei", + "off": "av", + "on": "på", + "open": "Åpne", + "open.newWindow": "Åpne i nytt vindu", + "option": "Alternativ", + "options": "Alternativer", + "options.none": "Ingen alternativer", + "options.all": "Vis alle {count} alternativ", + + "orientation": "Orientering", + "orientation.landscape": "Landskap", + "orientation.portrait": "Portrett", + "orientation.square": "Kvadrat", + + "page": "Side", + "page.blueprint": "Denne siden har ikke en blueprint enda. Du kan definere oppsettet i /site/blueprints/pages/{blueprint}.yml", + "page.changeSlug": "Endre URL", + "page.changeSlug.fromTitle": "Opprett fra tittel", + "page.changeStatus": "Endre status", + "page.changeStatus.position": "Vennligst velg en posisjon", + "page.changeStatus.select": "Velg ny status", + "page.changeTemplate": "Endre mal", + "page.changeTemplate.notice": "Changing the page's template will remove content for fields that don't match in type. Use with caution.", + "page.create": "Lag som {status}", + "page.delete.confirm": "Vil du virkelig slette denne siden?", + "page.delete.confirm.subpages": "Denne siden har undersider.
Alle undersider vil også bli slettet.", + "page.delete.confirm.title": "Skriv inn sidetittel for å bekrefte", + "page.duplicate.appendix": "Kopier", + "page.duplicate.files": "Kopier filer", + "page.duplicate.pages": "Kopier sider", + "page.move": "Flytt side", + "page.sort": "Endre plassering", + "page.status": "Status", + "page.status.draft": "Utkast", + "page.status.draft.description": "Denne siden er i kladdmodus og er kun synlig for innloggede brukere eller via en hemmelig lenke.", + "page.status.listed": "Offentlig", + "page.status.listed.description": "Siden er offentlig og synlig for alle", + "page.status.unlisted": "Unotert", + "page.status.unlisted.description": "Siden er ikke er oppført og er kun tilgjengelig via URL", + + "pages": "Sider", + "pages.empty": "Ingen sider ennå", + "pages.status.draft": "Utkast", + "pages.status.listed": "Publisert", + "pages.status.unlisted": "Unotert", + + "pagination.page": "Side", + + "password": "Passord", + "paste": "Lim inn", + "paste.after": "Lim inn etter", + "paste.success": "{count} limt inn!", + "pixel": "Piksel", + "plugin": "Utvidelse", + "plugins": "Plugins", + "prev": "Forrige", + "preview": "Forhåndsvisning", + "remove": "Fjern", + "rename": "Endre navn", + "renew": "Fornye", + "replace": "Erstatt", + "replace.with": "Erstatt med", + "retry": "Pr\u00f8v p\u00e5 nytt", + "revert": "Forkast", + "revert.confirm": "Er du sikker på at vil slette alle ulagrede endringer?", + + "role": "Rolle", + "role.admin.description": "Administrator har alle rettigheter", + "role.admin.title": "Admin", + "role.all": "Alle", + "role.empty": "Det er ingen brukere med denne rollen", + "role.description.placeholder": "Ingen beskrivelse", + "role.nobody.description": "Dette er en fallback rolle uten noen rettigheter.", + "role.nobody.title": "Ingen", + + "save": "Lagre", + "search": "Søk", + "search.min": "Skriv inn {min} tegn for å søke", + "search.all": "Vis alle {count} resultat", + "search.results.none": "Ingen resultater", + + "section.invalid": "The section is invalid", + "section.required": "Denne seksjonen er påkrevd", + + "security": "Sikkerhet", + "select": "Velg", + "server": "Server", + "settings": "Innstillinger", + "show": "Vis", + "site.blueprint": "Denne siden har ikke en blueprint enda. Du kan definere oppsettet i /site/blueprints/site.yml", + "size": "Størrelse", + "slug": "URL-appendiks", + "sort": "Sortere", + "sort.drag": "Drag to sort …", + "split": "Del", + + "stats.empty": "Ingen rapporter", + "status": "Status", + + "system.info.copy": "Copy info", + "system.info.copied": "System info copied", + "system.issues.content": "content-mappen ser ut til å være eksponert", + "system.issues.eol.kirby": "Din installerte Kirby versjon har nådd sitt end-of-life, og vil ikke lenger motta sikkerhetsoppdateringer", + "system.issues.eol.plugin": "Din installerte plugin { plugin } har nådd sitt end-of-life og vil ikke lenger motta sikkerhetsoppdateringer", + "system.issues.eol.php": "Din installerte PHP versjon { release } har nådd sitt end-of-life og vil ikke lenger motta sikkerhetsoppdateringer", + "system.issues.debug": "Debugging må bli skrudd av i production", + "system.issues.git": ".git mappen ser ut til å være eksponert", + "system.issues.https": "Vi anbefaler HTTPS for alle dine sider", + "system.issues.kirby": "kirby-mappen ser ut til å være eksponert", + "system.issues.site": "site-mappen ser ut til å være eksponert", + "system.issues.vulnerability.kirby": "Din installasjon er muligens påvirket av følgende sikkerhetshull ({ severity } severity): { description }", + "system.issues.vulnerability.plugin": "Din installasjon er muligens påvirket av følgende sikkerhetshull i pluginen { plugin } ({ severity } severity): { description }", + "system.updateStatus": "Oppdater status", + "system.updateStatus.error": "Klarte ikke å lete etter oppdateringer", + "system.updateStatus.not-vulnerable": "Ingen kjente sikkerhetshull", + "system.updateStatus.security-update": "Gratis sikkerhetsoppdatering { version } tilgjengelig", + "system.updateStatus.security-upgrade": "Oppdatering { version } med sikkerhetsoppdateringer tilgjengelig", + "system.updateStatus.unreleased": "Ulansert versjon", + "system.updateStatus.up-to-date": "Oppdatert", + "system.updateStatus.update": "Gratis oppdatering { version } tilgjengelig", + "system.updateStatus.upgrade": "Oppdatering { version } tilgjengelig", + + "tel": "Telefon", + "tel.placeholder": "+49123456789", + "template": "Mal", + "title": "Tittel", + "today": "I dag", + + "toolbar.button.clear": "Fjern formattering", + "toolbar.button.code": "Kode", + "toolbar.button.bold": "Fet tekst", + "toolbar.button.email": "Epost", + "toolbar.button.headings": "Overskrifter", + "toolbar.button.heading.1": "Overskrift 1", + "toolbar.button.heading.2": "Overskrift 2", + "toolbar.button.heading.3": "Overskrift 3", + "toolbar.button.heading.4": "Overskrift 4", + "toolbar.button.heading.5": "Overskrift 5", + "toolbar.button.heading.6": "Overskrift 6", + "toolbar.button.italic": "Kursiv tekst", + "toolbar.button.file": "Fil", + "toolbar.button.file.select": "Velg en fil", + "toolbar.button.file.upload": "Last opp en fil", + "toolbar.button.link": "Adresse", + "toolbar.button.paragraph": "Avsnitt", + "toolbar.button.strike": "Gjennomstreking", + "toolbar.button.sub": "Subscript", + "toolbar.button.sup": "Superscript", + "toolbar.button.ol": "Ordnet liste", + "toolbar.button.underline": "Understrek", + "toolbar.button.ul": "Punktliste", + + "translation.author": "Kirby Team", + "translation.direction": "ltr", + "translation.name": "Norsk Bokm\u00e5l", + "translation.locale": "nb_NO", + + "type": "Type", + + "upload": "Last opp", + "upload.error.cantMove": "Den opplastede filen kunne ikke flyttes", + "upload.error.cantWrite": "Kunne ikke skrive fil til disk", + "upload.error.default": "Kunne ikke laste opp fil", + "upload.error.extension": "Filopplasting stoppet av en utvidelse", + "upload.error.formSize": "Den opplastede filen overskrider MAX_FILE_SIZE direktivet som er spesifisert i skjemaet", + "upload.error.iniPostSize": "Den opplastede filen overskrider post_max_size direktivet i php.ini", + "upload.error.iniSize": "Den opplastede filen overskrider upload_max_filesize direktivet i php.ini", + "upload.error.noFile": "Ingen fil ble lastet opp", + "upload.error.noFiles": "Ingen filer ble lastet opp", + "upload.error.partial": "Den opplastede filen ble bare delvis lastet opp", + "upload.error.tmpDir": "Mangler en midlertidig mappe", + "upload.errors": "Feil", + "upload.progress": "Laster opp…", + + "url": "Nettadresse", + "url.placeholder": "https://eksempel.no", + + "user": "Bruker", + "user.blueprint": "Du kan definere flere seksjoner og skjemafelter for denne brukerrollen i /site/blueprints/users/{blueprint}.yml", + "user.changeEmail": "Endre e-post", + "user.changeLanguage": "Endre språk", + "user.changeName": "Angi nytt navn for denne brukeren", + "user.changePassword": "Bytt passord", + "user.changePassword.new": "Nytt passord", + "user.changePassword.new.confirm": "Bekreft nytt passord…", + "user.changeRole": "Bytt rolle", + "user.changeRole.select": "Velg en ny rolle", + "user.create": "Legg til ny bruker", + "user.delete": "Slett denne brukeren", + "user.delete.confirm": "Vil du virkelig slette denne konten?", + + "users": "Brukere", + + "version": "Kirby versjon", + "version.current": "Nåværende versjon", + "version.latest": "Siste versjon", + "versionInformation": "Versjonsinformasjon", + + "view.account": "Din konto", + "view.installation": "Installasjon", + "view.languages": "Språk", + "view.resetPassword": "Tilbakestill passord", + "view.site": "Side", + "view.system": "System", + "view.users": "Brukere", + + "welcome": "Velkommen", + "year": "År", + "yes": "ja" +} diff --git a/kirby/i18n/translations/nl.json b/kirby/i18n/translations/nl.json new file mode 100644 index 0000000..1677160 --- /dev/null +++ b/kirby/i18n/translations/nl.json @@ -0,0 +1,730 @@ +{ + "account.changeName": "Wijzig je naam", + "account.delete": "Verwijder je account", + "account.delete.confirm": "Wil je echt je account verwijderen? Je wordt direct uitgelogd. Je account kan niet worden hersteld.", + + "activate": "Activeren", + "add": "Voeg toe", + "alpha": "Alpha", + "author": "Auteur", + "avatar": "Avatar", + "back": "Terug", + "cancel": "Annuleren", + "change": "Wijzigen", + "close": "Sluiten", + "changes": "Wijzigingen", + "confirm": "Oke", + "collapse": "Sluit", + "collapse.all": "Sluit alles", + "color": "Kleur", + "coordinates": "Coördinaten ", + "copy": "Kopiëren", + "copy.all": "Kopieer alles", + "copy.success": "{count} gekopieerd!", + "create": "Aanmaken", + "custom": "Custom", + + "date": "Datum", + "date.select": "Selecteer een datum", + + "day": "Dag", + "days.fri": "Vr", + "days.mon": "Ma", + "days.sat": "Za", + "days.sun": "Zo", + "days.thu": "Do", + "days.tue": "Di", + "days.wed": "Wo", + + "debugging": "Foutopsporing", + + "delete": "Verwijderen", + "delete.all": "Verwijder alles", + + "dialog.fields.empty": "Dit venster heeft geen velden", + "dialog.files.empty": "Geen bestanden om te selecteren", + "dialog.pages.empty": "Geen pagina's om te selecteren", + "dialog.text.empty": "Dit venster bevat geen tekst", + "dialog.users.empty": "Geen gebruikers om te selecteren", + + "dimensions": "Dimensies", + "disable": "Uitschakelen", + "disabled": "Uitgeschakeld", + "discard": "Annuleren", + + "drawer.fields.empty": "Deze drawer heeft geen velden", + + "domain": "Domein", + "download": "Download", + "duplicate": "Dupliceren", + + "edit": "Wijzig", + + "email": "E-mailadres", + "email.placeholder": "mail@voorbeeld.nl", + + "enter": "Enter", + "entries": "Items", + "entry": "Item", + + "environment": "Omgeving", + + "error": "Foutmelding", + "error.access.code": "Ongeldige code", + "error.access.login": "Ongeldige login", + "error.access.panel": "Je hebt geen toegang tot het Panel", + "error.access.view": "Je hebt geen toegangsrechten voor dit gedeelte van het Panel", + + "error.avatar.create.fail": "De avatar kon niet worden geupload", + "error.avatar.delete.fail": "De avatar kan niet worden verwijderd", + "error.avatar.dimensions.invalid": "Houd de breedte en hoogte van de avatar onder 3000 pixels", + "error.avatar.mime.forbidden": "De avatar moet een JPEG of PNG bestand zijn", + + "error.blueprint.notFound": "De blueprint \"{name}\" kon niet geladen worden", + + "error.blocks.max.plural": "Je kunt niet meer dan {max} blokken toevoegen", + "error.blocks.max.singular": "Je kunt niet meer dan één blok toevoegen", + "error.blocks.min.plural": "Je moet ten minste {min} blok toevoegen", + "error.blocks.min.singular": "Je moet ten minste één blok toevoegen", + "error.blocks.validation": "Er is een fout opgetreden bij het \"{field}\" veld in blok {index} in het \"{fieldset}\" bloktype", + + "error.cache.type.invalid": "Ongeldig cache type \"{type}\"", + + "error.email.preset.notFound": "De e-mailvoorinstelling \"{name}\" kan niet worden gevonden", + + "error.field.converter.invalid": "Ongeldige converter \"{converter}\"", + "error.field.type.missing": "Veld \"{ name }\": Het veldtype \"{ type }\" bestaat niet", + + "error.file.changeName.empty": "De naam mag niet leeg zijn", + "error.file.changeName.permission": "Je hebt geen rechten om de naam te wijzigen van \"{filename}\"", + "error.file.changeTemplate.invalid": "Het template voor het bestand \"{id}\" kan niet worden gewijzigd in \"{template}\" (geldig: \"{blueprints}\")", + "error.file.changeTemplate.permission": "Je hebt geen rechten om het template te wijzigen voor bestand \"{id}\"", + + "error.file.duplicate": "Er bestaat al een bestand met de naam \"{filename}\"", + "error.file.extension.forbidden": "Bestandsextensie \"{extension}\" is niet toegestaan", + "error.file.extension.invalid": "Ongeldige extensie: {extension}", + "error.file.extension.missing": "Je kunt geen bestanden uploaden zonder bestandsextensie", + "error.file.maxheight": "De hoogte van de afbeelding mag niet groter zijn dan {height} pixels", + "error.file.maxsize": "Het bestand is te groot", + "error.file.maxwidth": "De breedte van de afbeelding mag niet groter zijn dan {width} pixels", + "error.file.mime.differs": "Het geüploade bestand moet van hetzelfde mime-type zijn: \"{mime}\"", + "error.file.mime.forbidden": "Het type \"{mime}\" is niet toegestaan", + "error.file.mime.invalid": "Ongeldig media type: {mine}", + "error.file.mime.missing": "Het mediatype voor \"{filename}\" kan niet worden gedecteerd", + "error.file.minheight": "De hoogte van de afbeelding moet minimaal {height} pixels zijn", + "error.file.minsize": "Het bestand is te klein", + "error.file.minwidth": "De breedte van de afbeelding moet minimaal {width} pixels zijn", + "error.file.name.unique": "De bestandsnaam moet uniek zijn", + "error.file.name.missing": "De bestandsnaam mag niet leeg zijn", + "error.file.notFound": "Het bestand kan niet worden gevonden", + "error.file.orientation": "De oriëntatie van de afbeelding moet \"{orientation}\" zijn", + "error.file.type.forbidden": "Je hebt geen rechten om {type} bestanden up te loaden", + "error.file.type.invalid": "Ongeldig bestands type: {type}", + "error.file.undefined": "Het bestand kan niet worden gevonden", + + "error.form.incomplete": "Verbeter alle fouten in het formulier", + "error.form.notSaved": "Het formulier kon niet worden opgeslagen", + + "error.language.code": "Vul een geldige code voor deze taal in", + "error.language.duplicate": "De taal bestaat al", + "error.language.name": "Vul een geldige naam voor deze taal in", + "error.language.notFound": "De taal kan niet worden gevonden", + + "error.layout.validation.block": "Er is een fout opgetreden bij het \"{field}\" veld in blok {blockIndex} in het \"{fieldset}\" bloktype in layout {layoutIndex}", + "error.layout.validation.settings": "Er is een fout gevonden in de instellingen van ontwerp {index} ", + + "error.license.domain": "Het domein voor de licentie ontbreekt", + "error.license.email": "Gelieve een geldig emailadres in te voeren", + "error.license.format": "Vul een geldige licentie in", + "error.license.verification": "De licentie kon niet worden geverifieerd. ", + + "error.login.totp.confirm.invalid": "Ongeldige code", + "error.login.totp.confirm.missing": "Vul de code in", + + "error.object.validation": "Er is een fout opgetreden in het veld \"{label}\":\n{message}", + + "error.offline": "Het Panel is momenteel offline", + + "error.page.changeSlug.permission": "Je kunt de URL van deze pagina niet wijzigen", + "error.page.changeSlug.reserved": "Het pad van hoofdpagina's mogen niet beginnen met \"{path}\".", + "error.page.changeStatus.incomplete": "Deze pagina bevat fouten en kan niet worden gepubliceerd", + "error.page.changeStatus.permission": "De status van deze pagina kan niet worden gewijzigd", + "error.page.changeStatus.toDraft.invalid": "De pagina \"{slug}\" kan niet worden aangepast naar 'concept'", + "error.page.changeTemplate.invalid": "De template van deze pagina \"{slug}\" kan niet worden gewijzigd", + "error.page.changeTemplate.permission": "Je hebt geen rechten om het template te wijzigen van \"{slug}\"", + "error.page.changeTitle.empty": "De titel mag niet leeg zijn", + "error.page.changeTitle.permission": "Je hebt geen rechten om de titel te wijzigen van \"{slug}\"", + "error.page.create.permission": "Je hebt geen rechten om \"{slug}\" aan te maken", + "error.page.delete": "De pagina \"{slug}\" kan niet worden verwijderd", + "error.page.delete.confirm": "Voer de paginatitel in om te bevestigen", + "error.page.delete.hasChildren": "Deze pagina heeft subpagina's en kan niet worden verwijderd", + "error.page.delete.permission": "Je hebt geen rechten om \"{slug}\" te verwijderen", + "error.page.draft.duplicate": "Er bestaat al een conceptpagina met de URL-appendix \"{slug}\"", + "error.page.duplicate": "Er bestaat al een pagina met de URL-appendix \"{slug}\"", + "error.page.duplicate.permission": "Je bent niet gemachtigd om \"{slug}\" te dupliceren", + "error.page.move.ancestor": "De pagina kan niet in zichzelf worden verplaatst", + "error.page.move.directory": "De page map kan niet worden verplaatst", + "error.page.move.duplicate": "Er bestaat al een subpagina met de URL-appendix \"{slug}\"", + "error.page.move.notFound": "De verplaatste pagina kan niet gevonden worden", + "error.page.move.permission": "Je hebt geen rechten om \"{slug}\" te verplaatsen", + "error.page.move.template": "De \"{template}\" template is niet toegestaan als een subpagina van \"{parent}\"", + "error.page.notFound": "De pagina \"{slug}\" kan niet worden gevonden", + "error.page.num.invalid": "Vul een geldig sorteer-cijfer in. Het cijfer mag niet negatief zijn", + "error.page.slug.invalid": "Vul een geldig URL-achtervoegsel in", + "error.page.slug.maxlength": "Slug lengte moet minder dan \"{length}\" tekens bevatten", + "error.page.sort.permission": "De pagina \"{slug}\" kan niet worden gesorteerd", + "error.page.status.invalid": "Zorg voor een geldige paginastatus", + "error.page.undefined": "De pagina kan niet worden gevonden", + "error.page.update.permission": "Je hebt geen rechten om \"{slug}\" te updaten", + + "error.section.files.max.plural": "Voeg niet meer dan {max} bestanden toe aan de zone \"{section}\"", + "error.section.files.max.singular": "Je kunt niet meer dan 1 bestand toevoegen aan de zone \"{section}\"", + "error.section.files.min.plural": "De \"{section}\" sectie moet minimaal {min} bestanden bevatten.", + "error.section.files.min.singular": "De \"{section}\" sectie moet minimaal 1 bestand bevatten.", + + "error.section.pages.max.plural": "Je kunt niet meer dan {max} pagina's toevoegen aan de zone \"{section}\"", + "error.section.pages.max.singular": "Je kunt niet meer dan 1 pagina toevoegen aan de zone \"{section}\"", + "error.section.pages.min.plural": "De \"{section}\" sectie moet minimaal {min} pagina's bevatten.", + "error.section.pages.min.singular": "De \"{section}\" sectie moet minimaal 1 pagina bevatten.", + + "error.section.notLoaded": "De zone \"{name}\" kan niet worden geladen", + "error.section.type.invalid": "Zone-type \"{type}\" is niet geldig", + + "error.site.changeTitle.empty": "De titel mag niet leeg zijn", + "error.site.changeTitle.permission": "Je hebt geen rechten om de titel van de site te wijzigen", + "error.site.update.permission": "Je hebt geen rechten om de site te updaten", + + "error.structure.validation": "Er is een fout opgetreden in veld \"{field}\" in rij {index}", + + "error.template.default.notFound": "Het standaard template bestaat niet", + + "error.unexpected": "Een onverwacht fout heeft plaats gevonden! Schakel debug-modus in voor meer informatie: https://getkirby.com/docs/reference/system/options/debug", + + "error.user.changeEmail.permission": "Je hebt geen rechten om het e-mailadres van gebruiker \"{name}\" te wijzigen", + "error.user.changeLanguage.permission": "Je hebt geen rechten om de taal voor gebruiker \"{name}\" te wijzigen", + "error.user.changeName.permission": "Je hebt geen rechten om de naam van gebruiker \"{name}\" te wijzigen", + "error.user.changePassword.permission": "Je hebt geen rechten om het wachtwoord van gebruiker \"{name}\" te wijzigen", + "error.user.changeRole.lastAdmin": "De rol van de laatste beheerder kan niet worden gewijzigd", + "error.user.changeRole.permission": "Je hebt geen rechten om de rol van gebruiker \"{name}\" te wijzigen", + "error.user.changeRole.toAdmin": "Je hebt geen rechten om de rol van iemand te wijzigen naar admin", + "error.user.create.permission": "Je hebt geen rechten om deze gebruiker aan te maken", + "error.user.delete": "De gebruiker \"{name}\" kan niet worden verwijderd", + "error.user.delete.lastAdmin": "Je kan de laatste admin niet verwijderen", + "error.user.delete.lastUser": "De laatste gebruiker kan niet worden verwijderd", + "error.user.delete.permission": "Je hebt geen rechten om gebruiker \"{name}\" te verwijderen", + "error.user.duplicate": "Er bestaat al een gebruiker met e-mailadres \"{email}\"", + "error.user.email.invalid": "Vul een geldig e-mailadres in", + "error.user.language.invalid": "Vul een geldige taal in", + "error.user.notFound": "De gebruiker \"{name}\" kan niet worden gevonden", + "error.user.password.excessive": "Voer een geldig wachtwoord in. Wachtwoorden mogen niet langer zijn dan 1000 tekens.", + "error.user.password.invalid": "Voer een geldig wachtwoord in. Wachtwoorden moeten minstens 8 tekens lang zijn.", + "error.user.password.notSame": "De wachtwoorden komen niet overeen", + "error.user.password.undefined": "De gebruiker heeft geen wachtwoord", + "error.user.password.wrong": "Fout wachtwoord", + "error.user.role.invalid": "Vul een geldige rol in", + "error.user.undefined": "De gebruiker kan niet worden gevonden", + "error.user.update.permission": "Je hebt geen rechten om gebruiker \"{name}\" te updaten", + + "error.validation.accepted": "Ga akkoord", + "error.validation.alpha": "Vul alleen a-z karakters in", + "error.validation.alphanum": "Vul alleen tekens in tussen a-z of cijfers 0-9", + "error.validation.anchor": "Vul een juiste link in", + "error.validation.between": "Vul een waarde tussen \"{min}\" en \"{max}\"", + "error.validation.boolean": "Ga akkoord of weiger", + "error.validation.color": "Vul een geldige kleur in {format} in", + "error.validation.contains": "Vul een waarde in die \"{needle}\" bevat", + "error.validation.date": "Vul een geldige datum in", + "error.validation.date.after": "Vul een datum in na {date}", + "error.validation.date.before": "Vul een datum in voor {date}", + "error.validation.date.between": "Vul een datum in tussen {min} en {max}", + "error.validation.denied": "Weiger", + "error.validation.different": "De invoer mag niet \"{other}\" zijn", + "error.validation.email": "Vul een geldig e-mailadres in", + "error.validation.endswith": "De invoer moet eindigen met \"{end}\"", + "error.validation.filename": "Vul een geldige bestandsnaam in", + "error.validation.in": "Vul één van de volgende dingen in: ({in})", + "error.validation.integer": "Vul een geldig geheel getal in", + "error.validation.ip": "Vul een geldig IP-adres in", + "error.validation.less": "Vul een waarde in lager dan {max}", + "error.validation.linkType": "Het type link is niet toegestaan", + "error.validation.match": "De invoer klopt niet met het verwachte patroon", + "error.validation.max": "Vul een waarde in die gelijk is aan of lager dan {max}", + "error.validation.maxlength": "Gebruik minder karakters (maximaal {max} karakters)", + "error.validation.maxwords": "Vul minder dan {max} woord(en) in", + "error.validation.min": "Vul een waarde in die gelijk is aan of groter dan {min}", + "error.validation.minlength": "Gebruik meer karakters (minimaal {min} karakters)", + "error.validation.minwords": "Vul minimaal {min} woord(en) in", + "error.validation.more": "Vul een grotere waarde in dan {min}", + "error.validation.notcontains": "Zorg dat de invoer niet \"{needle}\" bevat", + "error.validation.notin": "Vul de volgende dingen niet in: ({notIn})", + "error.validation.option": "Selecteer een geldige optie", + "error.validation.num": "Vul een geldig cijfer in", + "error.validation.required": "Vul iets in", + "error.validation.same": "Vul \"{other}\" in", + "error.validation.size": "De lengte van de invoer moet \"{size}\" zijn", + "error.validation.startswith": "De invoer moet beginnen met \"{start}\"", + "error.validation.tel": "Vul een niet-geformatteerd telefoonnummer in", + "error.validation.time": "Vul een geldige tijd in", + "error.validation.time.after": "Vul een tijd in na {time}", + "error.validation.time.before": "Vul een tijd in voor {time}", + "error.validation.time.between": "Vul een tijd in tussen {min} en {max}", + "error.validation.uuid": "Vul een geldige UUID in", + "error.validation.url": "Vul een geldige URL in", + + "expand": "Open", + "expand.all": "Open alles", + + "field.invalid": "Dit veld is niet geldig", + "field.required": "Dit veld is verplicht", + "field.blocks.changeType": "Wijzig type", + "field.blocks.code.name": "Code", + "field.blocks.code.language": "Taal", + "field.blocks.code.placeholder": "Jouw code ...", + "field.blocks.delete.confirm": "Wil je echt dit blok wilt verwijderen?", + "field.blocks.delete.confirm.all": "Wil je echt alle blokken verwijderen?", + "field.blocks.delete.confirm.selected": "Wil je de geselecteerde blokken echt verwijderen?", + "field.blocks.empty": "Nog geen blokken", + "field.blocks.fieldsets.empty": "Nog geen veldsets", + "field.blocks.fieldsets.label": "Selecteer een bloktype ...", + "field.blocks.fieldsets.paste": "Druk op {{ shortcut }} om layouts/blokken van je klembord te importeren Alleen de toegestane layouts/blokken in het huidige veld worden ingevoegd.", + "field.blocks.gallery.name": "Galerij", + "field.blocks.gallery.images.empty": "Nog geen afbeeldingen", + "field.blocks.gallery.images.label": "Afbeeldingen", + "field.blocks.heading.level": "Niveau", + "field.blocks.heading.name": "Koptekst", + "field.blocks.heading.text": "Tekst", + "field.blocks.heading.placeholder": "Koptekst ...", + "field.blocks.image.alt": "Alternatieve tekst", + "field.blocks.image.caption": "Beschrijving", + "field.blocks.image.crop": "Uitsnede", + "field.blocks.image.link": "Link", + "field.blocks.image.location": "Locatie", + "field.blocks.image.location.internal": "Deze website", + "field.blocks.image.location.external": "Externe bron", + "field.blocks.image.name": "Afbeelding", + "field.blocks.image.placeholder": "Selecteer een afbeelding", + "field.blocks.image.ratio": "Verhouding", + "field.blocks.image.url": "Afbeeldings-URL", + "field.blocks.line.name": "Lijn", + "field.blocks.list.name": "Lijst", + "field.blocks.markdown.name": "Markdown", + "field.blocks.markdown.label": "Tekst", + "field.blocks.markdown.placeholder": "Markdown ...", + "field.blocks.quote.name": "Citaat", + "field.blocks.quote.text.label": "Tekst", + "field.blocks.quote.text.placeholder": "Citaat ...", + "field.blocks.quote.citation.label": "Bron", + "field.blocks.quote.citation.placeholder": "door ...", + "field.blocks.text.name": "Tekst", + "field.blocks.text.placeholder": "Tekst ...", + "field.blocks.video.autoplay": "Automatisch afspelen", + "field.blocks.video.caption": "Beschrijving", + "field.blocks.video.controls": "Besturingselementen", + "field.blocks.video.location": "Locatie", + "field.blocks.video.loop": "Herhalen", + "field.blocks.video.muted": "Gedempt", + "field.blocks.video.name": "Video", + "field.blocks.video.placeholder": "Voer een video link in", + "field.blocks.video.poster": "Afbeelding", + "field.blocks.video.preload": "Vooral laden", + "field.blocks.video.url.label": "Video link", + "field.blocks.video.url.placeholder": "https://youtube.com/?v=", + + "field.files.empty": "Nog geen bestanden geselecteerd", + + "field.layout.change": "Verander layout", + "field.layout.delete": "Verwijder indeling", + "field.layout.delete.confirm": "Weet je zeker dat je deze layout wilt verwijderen?", + "field.layout.delete.confirm.all": "Weet je zeker dat je alle layouts wilt verwijderen?", + "field.layout.empty": "Er zijn nog geen rijen", + "field.layout.select": "Selecteer een indeling", + + "field.object.empty": "Nog geen informatie", + + "field.pages.empty": "Nog geen pagina's geselecteerd", + + "field.structure.delete.confirm": "Wil je deze rij verwijderen?", + "field.structure.delete.confirm.all": "Weet je zeker dat je alle items wil verwijderen?", + "field.structure.empty": "Nog geen items", + + "field.users.empty": "Nog geen gebruikers geselecteerd", + + "fields.empty": "Nog geen velden", + + "file": "Bestand", + "file.blueprint": "Dit bestand heeft nog geen blauwdruk. U kunt de instellingen definiëren in /site/blueprints/files/{blueprint}.yml", + "file.changeTemplate": "Verander template", + "file.changeTemplate.notice": "Door het template van het bestand te wijzigen, wordt inhoud verwijderd voor velden waarvan het type niet overeenkomt. Als het nieuwe template bepaalde regels definieert, bv. afmetingen van afbeeldingen, dan worden die ook onomkeerbaar toegepast. Wees hier voorzichtig mee.", + "file.delete.confirm": "Wil je dit bestand
{filename} verwijderen?", + "file.focus.placeholder": "Set focal point", + "file.focus.reset": "Remove focal point", + "file.focus.title": "Focus", + "file.sort": "Verander positie", + + "files": "Bestanden", + "files.empty": "Nog geen bestanden", + + "filter": "Filter", + + "hide": "Verberg", + "hour": "Uur", + "hue": "Hue", + "import": "Importeer", + "info": "Info", + "insert": "Toevoegen", + "insert.after": "Voeg toe na", + "insert.before": "Voeg toe voor", + "install": "Installeren", + + "installation": "Installatie", + "installation.completed": "Het Panel is geïnstalleerd", + "installation.disabled": "Je kan geen Panel installatie uitvoeren op een openbare server. Voer het installatieprogramma uit op een lokale computer of schakel het in met de panel.install optie.", + "installation.issues.accounts": "De map /site/accounts heeft geen schrijfrechten", + "installation.issues.content": "De map /content bestaat niet of heeft geen schrijfrechten", + "installation.issues.curl": "De CURL-extensie is vereist", + "installation.issues.headline": "Het Panel kan niet worden geïnstalleerd", + "installation.issues.mbstring": "De MB String extensie is verplicht", + "installation.issues.media": "De map /mediabestaat niet of heeft geen schrijfrechten", + "installation.issues.php": "Gebruik PHP8+", + "installation.issues.sessions": "De map /site/sessions bestaat niet of heeft geen schrijfrechten", + + "language": "Taal", + "language.code": "Code", + "language.convert": "Maak standaard", + "language.convert.confirm": "

Weet je zeker dat je {name} wilt aanpassen naar de standaard taal? Dit kan niet ongedaan worden gemaakt

Als {name} nog niet vertaalde content heeft, is er geen content meer om op terug te vallen en zouden delen van je site leeg kunnen zijn.

", + "language.create": "Nieuwe taal toevoegen", + "language.default": "Standaard taal", + "language.delete.confirm": "Weet je zeker dat je de taal {name} inclusief alle vertalingen wilt verwijderen? Je kunt dit niet ongedaan maken!", + "language.deleted": "De taal is verwijderd", + "language.direction": "Leesrichting", + "language.direction.ltr": "Links naar rechts", + "language.direction.rtl": "Rechts naar links", + "language.locale": "PHP-locale regel", + "language.locale.warning": "Je gebruikt een aangepaste landinstelling. Wijzig het het taalbestand in /site/languages", + "language.name": "Naam", + "language.secondary": "Tweede taal", + "language.settings": "Taal instellingen", + "language.updated": "De taal is geüpdatet", + "language.variables": "Taal variabelen", + "language.variables.empty": "Nog geen vertalingen", + + "language.variable.delete.confirm": "Weet je zeker dat je de variabele voor {key} wil verwijderen?", + "language.variable.key": "Key", + "language.variable.notFound": "De variabele kan niet gevonden worden", + "language.variable.value": "Waarde", + + "languages": "Talen", + "languages.default": "Standaard taal", + "languages.empty": "Er zijn nog geen talen", + "languages.secondary": "Andere talen", + "languages.secondary.empty": "Er zijn nog geen andere talen beschikbaar", + + "license": "Licentie", + "license.activate": "Activeer nu", + "license.activate.label": "Activeer je licentie", + "license.activate.domain": "Je licentie wordt geactiveerd voor {host}.", + "license.activate.local": "Je staat op het punt om je Kirby licentie voor je lokale domein {host} te activeren. Als deze site op een publiek domein geplaatst wordt, activeer deze licentie dan daar. Als het domein {host} wel degene is die je voor deze licentie wil gebruiken, ga dan door.", + "license.activated": "Geactiveerd", + "license.buy": "Koop een licentie", + "license.code": "Code", + "license.code.help": "Je hebt de licentiecode via e-mail gekregen nadat je de aankoop hebt gedaan. Kopieer en plak de licentiecode hier.", + "license.code.label": "Vul je licentie in", + "license.status.active.info": "Inclusief nieuwe major versies tot {date}", + "license.status.active.label": "Geldige licentie", + "license.status.demo.info": "Dit is een demo installatie", + "license.status.demo.label": "Demo", + "license.status.inactive.info": "Verleng licentie om bij te werken naar nieuwe versies", + "license.status.inactive.label": "Geen nieuwe major versies", + "license.status.legacy.bubble": "Klaar om je licentie te vernieuwen?", + "license.status.legacy.info": "Je licentie dekt deze versie niet", + "license.status.legacy.label": "Verleng je licentie", + "license.status.missing.bubble": "Klaar om je website te lanceren?", + "license.status.missing.info": "Geen geldige licentie", + "license.status.missing.label": "Activeer je licentie", + "license.manage": "Beheer je licenties", + "license.purchased": "Gekocht", + "license.success": "Bedankt dat je Kirby ondersteunt", + "license.unregistered.label": "Niet geregistreerd", + + "link": "Link", + "link.text": "Linktekst", + + "loading": "Laden", + + "lock.unsaved": "Niet opgeslagen wijzigingen", + "lock.unsaved.empty": "Er zijn geen niet opgeslagen wijzigingen meer", + "lock.isLocked": "Niet opgeslagen wijzigingen door {email}", + "lock.unlock": "Ontgrendelen", + "lock.unlock.submit": "Niet-opgeslagen wijzigingen ontgrendelen en overschrijven met {email}", + "lock.isUnlocked": "Is ontgrendeld door een andere gebruiker", + + "login": "Inloggen", + "login.code.label.login": "Log in code", + "login.code.label.password-reset": "Wachtwoord herstel code", + "login.code.placeholder.email": "000 000", + "login.code.placeholder.totp": "000000", + "login.code.text.email": "Als je e-mailadres is geregistreerd, is de aangevraagde code per e-mail verzonden.", + "login.code.text.totp": "Vul de eenmalige code in vanuit je Authenticator-app. ", + "login.email.login.body": "Hallo {user.nameOrEmail},\n\nJe hebt onlangs een inlogcode aangevraagd voor het panel van {site}.\nDe volgende inlogcode is geldig voor {timeout} minuten:\n\n{code}\n\nAls je geen inlogcode hebt aangevraagd, negeer deze e-mail dan of neem contact op met de beheerder als je vragen hebt.\nStuur deze e-mail voor de zekerheid NIET door.", + "login.email.login.subject": "Jouw log in code", + "login.email.password-reset.body": "Hallo {user.nameOrEmail},\n\nJe hebt onlangs een wachtwoord reset code aangevraagd voor het panel van {site}.\nDe volgende wachtwoord reset code is geldig voor {timeout} minuten:\n\n{code}\n\nAls je geen wachtwoord reset code hebt aangevraagd, negeer dan deze e-mail of neem contact op met de beheerder als je vragen hebt.\nStuur deze e-mail voor de zekerheid NIET door.", + "login.email.password-reset.subject": "Jouw wachtwoord herstel code", + "login.remember": "Houd mij ingelogd", + "login.reset": "Wachtwoord herstellen", + "login.toggleText.code.email": "Log in via email", + "login.toggleText.code.email-password": "Log in met je wachtwoord", + "login.toggleText.password-reset.email": "Wachtwoord vergeten?", + "login.toggleText.password-reset.email-password": "← Terug naar log in", + "login.totp.enable.option": "Stel eenmalige codes in.", + "login.totp.enable.intro": "Authenticator-apps kunnen eenmalige codes genereren die dienen als een tweede factor als jij inlogt in je account.", + "login.totp.enable.qr.label": "1. Scan deze QR code", + "login.totp.enable.qr.help": "Problemen met scannen? Voeg de setup key {secret} handmatig toe aan je Authenticator-app.", + "login.totp.enable.confirm.headline": "2. Bevestig met een gegenereerde code", + "login.totp.enable.confirm.text": "De app genereert elke 30 seconden een nieuwe eenmalige code. Voer de huidige code in om de setup af te ronden:", + "login.totp.enable.confirm.label": "Huidige code", + "login.totp.enable.confirm.help": "Na het instellen zullen we elke keer om een eenmalige code vragen bij het inloggen.", + "login.totp.enable.success": "Eenmalige codes geactiveerd", + "login.totp.disable.option": "Schakel eenmalige codes uit", + "login.totp.disable.label": "Voer je wachtwoord in om eenmalige codes uit te schakelen", + "login.totp.disable.help": "In de toekomst zal een andere tweede factor, zoals een inlogcode die via e-mail wordt verzonden, worden gevraagd wanneer je inlogt. Je kunt later altijd weer eenmalige codes instellen.", + "login.totp.disable.admin": "

Dit schakelt eenmalige codes uit voor {user}.

In de toekomst zal bij het inloggen om een andere tweede factor worden gevraagd, zoals een inlogcode die via e-mail wordt verzonden. {user} kan na zijn volgende aanmelding opnieuw eenmalige codes instellen.

", + "login.totp.disable.success": "Eenmalige codes uitgeschakeld", + + "logout": "Uitloggen", + + "merge": "Merge", + "menu": "Menu", + "meridiem": "AM/PM", + "mime": "Mime-type", + "minutes": "Minuten", + + "month": "Maand", + "months.april": "april", + "months.august": "augustus", + "months.december": "december", + "months.february": "februari", + "months.january": "januari", + "months.july": "juli", + "months.june": "juni", + "months.march": "maart", + "months.may": "mei", + "months.november": "november", + "months.october": "oktober", + "months.september": "september", + + "more": "Meer", + "move": "Verplaatsen", + "name": "Naam", + "next": "Volgende", + "night": "Nacht", + "no": "nee", + "off": "uit", + "on": "aan", + "open": "Open", + "open.newWindow": "Openen in een nieuw scherm", + "option": "Option", + "options": "Opties", + "options.none": "Geen opties beschikbaar", + "options.all": "Laat alle {count} opties zien", + + "orientation": "Oriëntatie", + "orientation.landscape": "Liggend", + "orientation.portrait": "Staand", + "orientation.square": "Vierkant", + + "page": "Pagina", + "page.blueprint": "Deze pagina heeft nog geen blauwdruk. Je kan de instellingen definiëren in /site/blueprints/pages/{blueprint}.yml", + "page.changeSlug": "Verander URL", + "page.changeSlug.fromTitle": "Aanmaken op basis van titel", + "page.changeStatus": "Wijzig status", + "page.changeStatus.position": "Selecteer een positie", + "page.changeStatus.select": "Selecteer een nieuwe status", + "page.changeTemplate": "Verander template", + "page.changeTemplate.notice": "Door de template te wijzigen, wordt inhoud verwijderd voor velden waarvan het type niet overeenkomt. Gebruik dit voorzichtig.", + "page.create": "Maak aan als {status}", + "page.delete.confirm": "Weet je zeker dat je pagina {title} wilt verwijderen?", + "page.delete.confirm.subpages": "Deze pagina heeft subpagina's.
Alle subpagina's zullen ook worden verwijderd.", + "page.delete.confirm.title": "Voeg een paginatitel in om te bevestigen", + "page.duplicate.appendix": "Kopiëren", + "page.duplicate.files": "Kopieer bestanden", + "page.duplicate.pages": "Kopieer pagina's", + "page.move": "Move page", + "page.sort": "Verander positie", + "page.status": "Status", + "page.status.draft": "Concept", + "page.status.draft.description": "De pagina is in concept-modus en alleen zichtbaar voor ingelogde redacteuren of via een geheime link", + "page.status.listed": "Openbaar", + "page.status.listed.description": "Deze pagina is toegankelijk voor iedereen", + "page.status.unlisted": "Niet gepubliceerd", + "page.status.unlisted.description": "Deze pagina is alleen bereikbaar via URL", + + "pages": "Pagina’s", + "pages.empty": "Nog geen pagina's", + "pages.status.draft": "Concepten", + "pages.status.listed": "Gepubliceerd", + "pages.status.unlisted": "Niet gepubliceerd", + + "pagination.page": "Pagina", + + "password": "Wachtwoord", + "paste": "Plak", + "paste.after": "Plak achter", + "paste.success": "{count} geplakt!", + "pixel": "Pixel", + "plugin": "Plugin", + "plugins": "Plugins", + "prev": "Vorige", + "preview": "Voorbeeld", + "remove": "Verwijder", + "rename": "Hernoem", + "renew": "Verlengen", + "replace": "Vervang", + "replace.with": "Vervangen met", + "retry": "Probeer opnieuw", + "revert": "Annuleren", + "revert.confirm": "Weet je zeker dat je alle niet-opgeslagen veranderingen wilt verwijderen?", + + "role": "Rol", + "role.admin.description": "De admin heeft alle rechten", + "role.admin.title": "Admin", + "role.all": "Alle", + "role.empty": "Er zijn geen gebruikers met deze rol", + "role.description.placeholder": "Geen beschrijving", + "role.nobody.description": "Dit is een fallback-rol zonder rechten", + "role.nobody.title": "Niemand", + + "save": "Opslaan", + "search": "Zoeken", + "search.min": "Voer {min} tekens in om te zoeken", + "search.all": "Laat alle {count} resultaten zien", + "search.results.none": "Geen resultaten", + + "section.invalid": "De sectie is ongeldig", + "section.required": "De sectie is verplicht", + + "security": "Beveiliging", + "select": "Selecteren", + "server": "Server", + "settings": "Opties", + "show": "Toon", + "site.blueprint": "Deze website heeft nog geen ontwerp. Je kan het ontwerp hier plaatsen/site/blueprints/site.yml", + "size": "Grootte", + "slug": "URL-toevoeging", + "sort": "Sorteren", + "sort.drag": "Sleep om te sorteren ...", + "split": "Splitsen", + + "stats.empty": "Geen rapporten", + "status": "Status", + + "system.info.copy": "Copy info", + "system.info.copied": "System info copied", + "system.issues.content": "De content map lijkt zichtbaar te zijn", + "system.issues.eol.kirby": "De geïnstalleerde Kirby versie is niet meer actueel en zal geen verdere beveiligingsupdates meer ontvangen.", + "system.issues.eol.plugin": "De geïnstalleerde versie van plugin { plugin } is niet meer actueel en zal geen verdere beveiligingsupdates meer ontvangen.", + "system.issues.eol.php": "De geïnstalleerde PHP versie { release } is niet meer actueel en zal geen verdere beveiligingsupdates meer ontvangen.", + "system.issues.debug": "De debug modus moet uitgeschakeld zijn in productie", + "system.issues.git": "De .git map lijkt zichtbaar te zijn", + "system.issues.https": "We raden HTTPS aan voor al je sites", + "system.issues.kirby": "De kirby map lijkt zichtbaar te zijn", + "system.issues.site": "De site map lijkt zichtbaar te zijn", + "system.issues.vulnerability.kirby": "De installatie is mogelijk getroffen door de volgende kwetsbaarheid ({ severity } ernst): { description }", + "system.issues.vulnerability.plugin": "De installatie is mogelijk getroffen door de volgende kwetsbaarheid in plugin { plugin } ({ severity } ernst): { description }", + "system.updateStatus": "Update status", + "system.updateStatus.error": "Kan niet checken voor updates", + "system.updateStatus.not-vulnerable": "Geen bekende kwetsbaarheden", + "system.updateStatus.security-update": "Gratis veiligheids update { version } beschikbaar", + "system.updateStatus.security-upgrade": "Upgrade { version } met veiligheid aanpassingen beschikbaar", + "system.updateStatus.unreleased": "Niet vrijgegeven versie", + "system.updateStatus.up-to-date": "Up to date", + "system.updateStatus.update": "Gratis update { version } beschikbaar", + "system.updateStatus.upgrade": "Upgrade { version } beschikbaar", + + "tel": "Telefoon", + "tel.placeholder": "+49123456789", + "template": "Template", + "title": "Titel", + "today": "Vandaag", + + "toolbar.button.clear": "Verwijder formattering", + "toolbar.button.code": "Code", + "toolbar.button.bold": "Dikgedrukte tekst", + "toolbar.button.email": "E-mailadres", + "toolbar.button.headings": "Kopteksten", + "toolbar.button.heading.1": "Koptekst 1", + "toolbar.button.heading.2": "Koptekst 2", + "toolbar.button.heading.3": "Koptekst 3", + "toolbar.button.heading.4": "Hoofding 4", + "toolbar.button.heading.5": "Hoofding 5", + "toolbar.button.heading.6": "Hoofding 6", + "toolbar.button.italic": "Cursieve tekst", + "toolbar.button.file": "Bestand", + "toolbar.button.file.select": "Selecteer een bestand", + "toolbar.button.file.upload": "Upload bestand", + "toolbar.button.link": "Link", + "toolbar.button.paragraph": "Paragraaf", + "toolbar.button.strike": "Doorstreept", + "toolbar.button.sub": "Subscript", + "toolbar.button.sup": "Superscript", + "toolbar.button.ol": "Genummerde lijst", + "toolbar.button.underline": "Onderlijn", + "toolbar.button.ul": "Opsomming", + + "translation.author": "Het team van Kirby", + "translation.direction": "ltr", + "translation.name": "Nederlands", + "translation.locale": "nl_NL", + + "type": "Type", + + "upload": "Upload", + "upload.error.cantMove": "Het geüploadde bestand kon niet worden verplaatst", + "upload.error.cantWrite": "Fout bij het schrijven van het bestand naar de schijf", + "upload.error.default": "Het bestand kan niet worden geüpload", + "upload.error.extension": "Kan bestand niet uploaden vanwege de extensie", + "upload.error.formSize": "Het geüploadde bestand is groter dan de MAX_FILE_SIZE die is aangegeven in het formulier", + "upload.error.iniPostSize": "Het geüploadde bestand is groter dan de post_max_size in php.ini", + "upload.error.iniSize": "Het geüploadde bestand is groter dan de upload_max_filesize in php.ini", + "upload.error.noFile": "Er is geen bestand geüpload", + "upload.error.noFiles": "Er zijn geen bestanden geüpload", + "upload.error.partial": "Het geüploadde bestand is slechts gedeeltelijk geüpload", + "upload.error.tmpDir": "Er mist een tijdelijke map", + "upload.errors": "Foutmelding", + "upload.progress": "Uploaden...", + + "url": "Url", + "url.placeholder": "https://voorbeeld.nl", + + "user": "Gebruiker", + "user.blueprint": "Je kan aanvullende secties en formuliervelden voor deze gebruikersrol definiëren in /site/blueprints/users/{blueprint}.yml", + "user.changeEmail": "Email veranderen", + "user.changeLanguage": "Taal veranderen", + "user.changeName": "Gebruiker hernoemen", + "user.changePassword": "Wachtwoord wijzigen", + "user.changePassword.new": "Nieuw wachtwoord", + "user.changePassword.new.confirm": "Bevestig het nieuwe wachtwoord...", + "user.changeRole": "Verander rol", + "user.changeRole.select": "Kies een nieuwe rol", + "user.create": "Voeg een nieuwe gebruiker toe", + "user.delete": "Verwijder deze gebruiker", + "user.delete.confirm": "Weet je zeker dat je
{email} wil verwijderen?", + + "users": "Gebruikers", + + "version": "Kirby-versie", + "version.current": "Huidige versie", + "version.latest": "Laatste versie", + "versionInformation": "Versie informatie", + + "view.account": "Jouw account", + "view.installation": "Installatie", + "view.languages": "Talen", + "view.resetPassword": "Wachtwoord herstellen", + "view.site": "Site", + "view.system": "Systeem", + "view.users": "Gebruikers", + + "welcome": "Welkom", + "year": "Jaar", + "yes": "ja" +} diff --git a/kirby/i18n/translations/pl.json b/kirby/i18n/translations/pl.json new file mode 100644 index 0000000..45857ee --- /dev/null +++ b/kirby/i18n/translations/pl.json @@ -0,0 +1,730 @@ +{ + "account.changeName": "Zmień swoje imię", + "account.delete": "Usuń swoje konto", + "account.delete.confirm": "Czy na pewno chcesz usunąć swoje konto? Zostaniesz natychmiast wylogowany. Twojego konta nie da się odzyskać.", + + "activate": "Aktywuj", + "add": "Dodaj", + "alpha": "Alfa", + "author": "Autor", + "avatar": "Zdj\u0119cie profilowe", + "back": "Wróć", + "cancel": "Anuluj", + "change": "Zmie\u0144", + "close": "Zamknij", + "changes": "Zmiany", + "confirm": "Ok", + "collapse": "Zwiń", + "collapse.all": "Zwiń wszystkie", + "color": "Kolor", + "coordinates": "Współrzędne", + "copy": "Kopiuj", + "copy.all": "Skopiuj wszystko", + "copy.success": "{count} skopiowanych!", + "create": "Utwórz", + "custom": "Niestandardowe", + + "date": "Data", + "date.select": "Wybierz datę", + + "day": "Dzień", + "days.fri": "Pt", + "days.mon": "Pn", + "days.sat": "Sb", + "days.sun": "Nd", + "days.thu": "Czw", + "days.tue": "Wt", + "days.wed": "\u015ar", + + "debugging": "Debugowanie", + + "delete": "Usu\u0144", + "delete.all": "Usuń wszystkie", + + "dialog.fields.empty": "To okno dialogowe nie zawiera żadnych pól", + "dialog.files.empty": "Brak plików do wyboru", + "dialog.pages.empty": "Brak stron do wyboru", + "dialog.text.empty": "To okno dialogowe nie definiuje żadnego tekstu", + "dialog.users.empty": "Brak użytkowników do wyboru", + + "dimensions": "Wymiary", + "disable": "Wyłącz", + "disabled": "Wyłączone", + "discard": "Odrzu\u0107", + + "drawer.fields.empty": "Ten panel nie zawiera żadnych pól", + + "domain": "Domena", + "download": "Pobierz", + "duplicate": "Zduplikuj", + + "edit": "Edytuj", + + "email": "Email", + "email.placeholder": "mail@example.com", + + "enter": "Wprowadź", + "entries": "Wpisy", + "entry": "Wpis", + + "environment": "Środowisko", + + "error": "Błąd", + "error.access.code": "Nieprawidłowy kod", + "error.access.login": "Nieprawidłowy login", + "error.access.panel": "Nie masz uprawnień by dostać się do panelu", + "error.access.view": "Nie masz uprawnień, by dostać się do tej części panelu", + + "error.avatar.create.fail": "Nie udało się załadować zdjęcia profilowego", + "error.avatar.delete.fail": "Nie udało się usunąć zdjęcia profilowego", + "error.avatar.dimensions.invalid": "Proszę zachować szerokość i wysokość zdjęcia profilowego poniżej 3000 pikseli", + "error.avatar.mime.forbidden": "Zdjęcie profilowe musi być plikiem JPEG lub PNG", + + "error.blueprint.notFound": "Nie udało się załadować wzorca \"{name}\"", + + "error.blocks.max.plural": "Możesz dodać nie więcej niż {max} bloki/-ów", + "error.blocks.max.singular": "Możesz dodać tylko jeden blok", + "error.blocks.min.plural": "Musisz dodać co najmniej {min} bloki/-ów", + "error.blocks.min.singular": "Musisz dodać co najmniej jeden blok", + "error.blocks.validation": "Wystąpił błąd w polu „{field}” w bloku {index} o typie bloku „{fieldset}”", + + "error.cache.type.invalid": "Nieprawidłowy typ pamięci podręcznej „{type}”", + + "error.email.preset.notFound": "Nie udało się załadować wzorca wiadomości e-mail \"{name}\"", + + "error.field.converter.invalid": "Nieprawidłowy konwerter \"{converter}\"", + "error.field.type.missing": "Pole „{ name }”: Typ pola „{ type }” nie istnieje", + + "error.file.changeName.empty": "Imię nie może być puste", + "error.file.changeName.permission": "Nie masz uprawnień, by zmienić nazwę \"{filename}\"", + "error.file.changeTemplate.invalid": "Szablonu pliku \"{id}\" nie można zmienić na \"{template}\" (poprawne: \"{blueprints}\")", + "error.file.changeTemplate.permission": "Nie masz uprawnień, by zmieniać szablon pliku \"{id}\"", + + "error.file.duplicate": "Istnieje już plik o nazwie \"{filename}\"", + "error.file.extension.forbidden": "Rozszerzenie \"{extension}\" jest niedozwolone", + "error.file.extension.invalid": "Nieprawidłowe rozszerzenie: {extension}", + "error.file.extension.missing": "Brak rozszerzenia pliku \"{filename}\"", + "error.file.maxheight": "Wysokość obrazka nie może być większa niż {height} pikseli", + "error.file.maxsize": "Plik jest za duży", + "error.file.maxwidth": "Szerokość obrazka nie może być większa niż {width} pikseli", + "error.file.mime.differs": "Przesłany plik musi być tego samego typu mime \"{mime}\"", + "error.file.mime.forbidden": "Typ multimediów \"{mime}\" jest niedozwolony", + "error.file.mime.invalid": "Nieprawidłowy typ MIME: {mime}", + "error.file.mime.missing": "Nie można wykryć typu multimediów dla \"{filename}\"", + "error.file.minheight": "Wysokość obrazka musi wynosić co najmniej {height} pikseli", + "error.file.minsize": "Plik jest za mały", + "error.file.minwidth": "Szerokość obrazka musi wynosić co najmniej {width} pikseli", + "error.file.name.unique": "Nazwa pliku musi być unikalna", + "error.file.name.missing": "Nazwa pliku nie może być pusta", + "error.file.notFound": "Nie można znaleźć pliku \"{filename}\"", + "error.file.orientation": "Orientacja obrazka musi być \"{orientation}\"", + "error.file.type.forbidden": "Nie możesz przesyłać plików {type}", + "error.file.type.invalid": "Nieprawidłowy typ pliku: {type}", + "error.file.undefined": "Nie można znaleźć pliku", + + "error.form.incomplete": "Popraw wszystkie błędy w formularzu…", + "error.form.notSaved": "Nie udało się zapisać formularza", + + "error.language.code": "Wprowadź poprawny kod języka.", + "error.language.duplicate": "Język już istnieje.", + "error.language.name": "Wprowadź poprawną nazwę języka.", + "error.language.notFound": "Język nie został odnaleziony", + + "error.layout.validation.block": "Wystąpił błąd w polu „{field}” w bloku {blockIndex} o typie bloku „{fieldset}” w układzie {layoutIndex}", + "error.layout.validation.settings": "W ustawieniach układu {index} jest błąd", + + "error.license.domain": "Brakuje domeny dla licencji", + "error.license.email": "Wprowadź poprawny adres email", + "error.license.format": "Please enter a valid license code", + "error.license.verification": "Nie udało się zweryfikować licencji", + + "error.login.totp.confirm.invalid": "Nieprawidłowy kod", + "error.login.totp.confirm.missing": "Wpisz aktualny kod", + + "error.object.validation": "Wystąpił błąd w polu „{label}”:\n{message}", + + "error.offline": "Panel jest obecnie offline", + + "error.page.changeSlug.permission": "Nie możesz zmienić końcówki adresu URL w \"{slug}\"", + "error.page.changeSlug.reserved": "Ścieżka stron najwyższego poziomu nie może zaczynać się od \"{path}\"", + "error.page.changeStatus.incomplete": "Strona zawiera błędy i nie można jej opublikować", + "error.page.changeStatus.permission": "Status tej strony nie może zostać zmieniony", + "error.page.changeStatus.toDraft.invalid": "Strony \"{slug}\" nie można przekonwertować na szkic", + "error.page.changeTemplate.invalid": "Nie można zmienić szablonu strony \"{slug}\"", + "error.page.changeTemplate.permission": "Nie masz uprawnień, by zmienić szablon dla \"{slug}\"", + "error.page.changeTitle.empty": "Tytuł nie może być pusty", + "error.page.changeTitle.permission": "Nie masz uprawnień, by zmienić tytuł dla \"{slug}\"", + "error.page.create.permission": "Nie masz uprawnień, by utworzyć \"{slug}\"", + "error.page.delete": "Strony \"{slug}\" nie można usunąć", + "error.page.delete.confirm": "Wprowadź tytuł strony, aby potwierdzić", + "error.page.delete.hasChildren": "Strona zawiera podstrony i nie można jej usunąć", + "error.page.delete.permission": "Nie masz uprawnień, by usunąć \"{slug}\"", + "error.page.draft.duplicate": "Istnieje już szkic z końcówką URL \"{slug}\"", + "error.page.duplicate": "Istnieje już strona z końcówką URL \"{slug}\"", + "error.page.duplicate.permission": "Nie masz uprawnień, by zduplikować \"{slug}\"", + "error.page.move.ancestor": "Strony nie można przenieść do siebie samej", + "error.page.move.directory": "Nie można przenieść katalogu strony", + "error.page.move.duplicate": "Istnieje już podstrona z końcówką URL \"{slug}\"", + "error.page.move.notFound": "Przeniesiona strona nie została odnaleziona", + "error.page.move.permission": "Nie masz uprawnień, by przenieść \"{slug}\"", + "error.page.move.template": "Szablon \"{template}\" nie jest akceptowany jako podstrona \"{parent}\"", + "error.page.notFound": "Nie można znaleźć strony \"{slug}\"", + "error.page.num.invalid": "Wprowadź poprawny numer sortujący. Liczby nie mogą być ujemne.", + "error.page.slug.invalid": "Wprowadź poprawną końcówkę adresu URL", + "error.page.slug.maxlength": "Końcówka adresu musi być krótsza niż \"{length}\" znaków", + "error.page.sort.permission": "Nie można sortować strony \"{slug}\"", + "error.page.status.invalid": "Ustaw prawidłowy status strony", + "error.page.undefined": "Nie udało się znaleźć strony", + "error.page.update.permission": "Nie masz uprawnień, by zaktualizować \"{slug}\"", + + "error.section.files.max.plural": "Do sekcji \"{section}\" można dodać nie więcej niż {max} plików", + "error.section.files.max.singular": "Do sekcji \"{section}\" można dodać tylko jeden plik", + "error.section.files.min.plural": "W sekcji \"{section}\" musi być co najmniej {min} pliki/-ów", + "error.section.files.min.singular": "W sekcji \"{section}\" musi być co najmniej jeden plik", + + "error.section.pages.max.plural": "Do sekcji \"{section}\" można dodać nie więcej niż {max} stron", + "error.section.pages.max.singular": "Do sekcji \"{section}\" można dodać tylko jedną stronę", + "error.section.pages.min.plural": "W sekcji \"{section}\" musi być co najmniej {min} stron/-y", + "error.section.pages.min.singular": "W sekcji \"{section}\" musi być co najmniej jedna strona", + + "error.section.notLoaded": "Nie udało się załadować sekcji \"{name}\"", + "error.section.type.invalid": "Typ sekcji \"{type}\" jest nieprawidłowy", + + "error.site.changeTitle.empty": "Tytuł nie może być pusty", + "error.site.changeTitle.permission": "Nie masz uprawnień, by zmienić tytuł strony", + "error.site.update.permission": "Nie masz uprawnień, by zaktualizować stronę", + + "error.structure.validation": "Wystąpił błąd w polu \"{field}\" w wierszu {index}", + + "error.template.default.notFound": "Domyślny szablon nie istnieje", + + "error.unexpected": "Wystąpił nieoczekiwany błąd! Włącz tryb debugowania, aby uzyskać więcej informacji: https://getkirby.com/docs/reference/system/options/debug", + + "error.user.changeEmail.permission": "Nie masz uprawnień, by zmienić adres e-mail użytkownika \"{name}\"", + "error.user.changeLanguage.permission": "Nie masz uprawnień, by zmienić język użytkownika \"{name}\"", + "error.user.changeName.permission": "Nie masz uprawnień, by zmienić nazwę użytkownika \"{name}\"", + "error.user.changePassword.permission": "Nie masz uprawnień, by zmienić hasło użytkownika \"{name}\"", + "error.user.changeRole.lastAdmin": "Nie można zmienić roli ostatniego administratora", + "error.user.changeRole.permission": "Nie masz uprawnień, by zmienić rolę użytkownika \"{name}\"", + "error.user.changeRole.toAdmin": "Nie masz uprawnień, by awansować kogoś do roli daministratora", + "error.user.create.permission": "Nie masz uprawnień, by utworzyć tego użytkownika", + "error.user.delete": "Nie można usunąć użytkownika \"{name}\"", + "error.user.delete.lastAdmin": "Nie można usunąć ostatniego administratora", + "error.user.delete.lastUser": "Nie można usunąć ostatniego użytkownika", + "error.user.delete.permission": "Nie masz uprawnień, by usunąć użytkownika \"{name}\"", + "error.user.duplicate": "Istnieje już użytkownik z adresem email \"{email}\"", + "error.user.email.invalid": "Wprowadź poprawny adres email", + "error.user.language.invalid": "Proszę podać poprawny język", + "error.user.notFound": "Nie można znaleźć użytkownika \"{name}\"", + "error.user.password.excessive": "Wpisz prawidłowe hasło. Hasła nie mogą być dłuższe niż 1000 znaków.", + "error.user.password.invalid": "Wprowadź prawidłowe hasło. Hasła muszą mieć co najmniej 8 znaków.", + "error.user.password.notSame": "Hasła nie są takie same", + "error.user.password.undefined": "Użytkownik nie ma hasła", + "error.user.password.wrong": "Nieprawidłowe hasło", + "error.user.role.invalid": "Wprowadź poprawną rolę", + "error.user.undefined": "Nie można znaleźć użytkownika", + "error.user.update.permission": "Nie masz uprawnień, by zaktualizować użytkownika \"{name}\"", + + "error.validation.accepted": "Proszę potwierdzić", + "error.validation.alpha": "Wprowadź tylko znaki między a-z", + "error.validation.alphanum": "Wprowadź tylko znaki między a-z lub cyfry 0-9", + "error.validation.anchor": "Wprowadź poprawny odnośnik", + "error.validation.between": "Wprowadź wartość między \"{min}\" i \"{max}\"", + "error.validation.boolean": "Potwierdź lub odmów", + "error.validation.color": "Wprowadź poprawny kolor w formacie {format}", + "error.validation.contains": "Wprowadź wartość, która zawiera \"{needle}\"", + "error.validation.date": "Wprowadź poprawną datę", + "error.validation.date.after": "Wprowadź datę późniejszą niż {date}", + "error.validation.date.before": "Wprowadź datę wcześniejszą niż {date}", + "error.validation.date.between": "Wprowadź datę między {min} a {max}", + "error.validation.denied": "Proszę odmówić", + "error.validation.different": "Wartością nie może być \"{other}\"", + "error.validation.email": "Wprowadź poprawny adres email", + "error.validation.endswith": "Wartość musi kończyć się na \"{end}\"", + "error.validation.filename": "Wprowadź poprawną nazwę pliku", + "error.validation.in": "Wprowadź jedno z następujących: ({in})", + "error.validation.integer": "Wprowadź poprawną liczbę całkowitą", + "error.validation.ip": "Wprowadź poprawny adres IP", + "error.validation.less": "Wprowadź wartość mniejszą niż {max}", + "error.validation.linkType": "Typ łącza jest niedozwolony", + "error.validation.match": "Wartość nie jest zgodna z oczekiwanym wzorcem", + "error.validation.max": "Wprowadź wartość równą lub mniejszą niż {max}", + "error.validation.maxlength": "Wprowadź krótszą wartość. (maks. {max} znaków)", + "error.validation.maxwords": "Wprowadź nie więcej niż {max} słowa/słów", + "error.validation.min": "Wprowadź wartość równą lub większą niż {min}", + "error.validation.minlength": "Wprowadź dłuższą wartość. (min. {min} znaków)", + "error.validation.minwords": "Wprowadź co najmniej {min} słowa/słów", + "error.validation.more": "Wprowadź wartość większą niż {min}", + "error.validation.notcontains": "Wprowadź wartość, która nie zawiera \"{needle}\"", + "error.validation.notin": "Nie wprowadzaj żadnego z następujących ({notIn})", + "error.validation.option": "Wybierz poprawną opcję", + "error.validation.num": "Wprowadź poprawny numer", + "error.validation.required": "Wpisz coś", + "error.validation.same": "Wprowadź \"{other}\"", + "error.validation.size": "Rozmiar wartości musi wynosić \"{size}\"", + "error.validation.startswith": "Wartość musi zaczynać się od \"{start}\"", + "error.validation.tel": "Wprowadź niesformatowany numer telefonu", + "error.validation.time": "Wprowadź poprawny czas", + "error.validation.time.after": "Wprowadź czas późniejszy niż {time}", + "error.validation.time.before": "Wprowadź czas wcześniejszy niż {time}", + "error.validation.time.between": "Wprowadź czas między {min} a {max}", + "error.validation.uuid": "Wprowadź prawidłowy identyfikator UUID", + "error.validation.url": "Wprowadź poprawny adres URL", + + "expand": "Rozwiń", + "expand.all": "Rozwiń wszystkie", + + "field.invalid": "Pole jest nieprawidłowe", + "field.required": "Pole jest wymagane", + "field.blocks.changeType": "Zmień typ", + "field.blocks.code.name": "Kod", + "field.blocks.code.language": "Język", + "field.blocks.code.placeholder": "Twój kod …", + "field.blocks.delete.confirm": "Czy na pewno chcesz usunąć ten blok?", + "field.blocks.delete.confirm.all": "Czy na pewno chcesz usunąć wszystkie bloki?", + "field.blocks.delete.confirm.selected": "Czy na pewno chcesz usunąć wszystkie wybrane bloki?", + "field.blocks.empty": "Nie ma jeszcze żadnych bloków", + "field.blocks.fieldsets.empty": "Nie ma jeszcze zestawów pól", + "field.blocks.fieldsets.label": "Wybierz typ bloku …", + "field.blocks.fieldsets.paste": "Naciśnij {{ shortcut }}, aby zaimportować układy/bloki ze schowka. Zostaną wstawione tylko te, które są dozwolone w bieżącym polu.", + "field.blocks.gallery.name": "Galeria", + "field.blocks.gallery.images.empty": "Nie ma jeszcze żadnych obrazków", + "field.blocks.gallery.images.label": "Obrazki", + "field.blocks.heading.level": "Poziom", + "field.blocks.heading.name": "Nagłówek", + "field.blocks.heading.text": "Tekst", + "field.blocks.heading.placeholder": "Nagłówek …", + "field.blocks.image.alt": "Tekst alternatywny", + "field.blocks.image.caption": "Podpis", + "field.blocks.image.crop": "Przytnij", + "field.blocks.image.link": "Link", + "field.blocks.image.location": "Lokalizacja", + "field.blocks.image.location.internal": "Ta witryna", + "field.blocks.image.location.external": "Zewnętrzne źródło", + "field.blocks.image.name": "Obrazek", + "field.blocks.image.placeholder": "Wybierz obrazek", + "field.blocks.image.ratio": "Proporcje", + "field.blocks.image.url": "URL obrazka", + "field.blocks.line.name": "Linia", + "field.blocks.list.name": "Lista", + "field.blocks.markdown.name": "Markdown", + "field.blocks.markdown.label": "Tekst", + "field.blocks.markdown.placeholder": "Markdown …", + "field.blocks.quote.name": "Cytat", + "field.blocks.quote.text.label": "Tekst", + "field.blocks.quote.text.placeholder": "Cytat …", + "field.blocks.quote.citation.label": "Źródło", + "field.blocks.quote.citation.placeholder": "autorstwa …", + "field.blocks.text.name": "Tekst", + "field.blocks.text.placeholder": "Tekst …", + "field.blocks.video.autoplay": "Autoplay", + "field.blocks.video.caption": "Podpis", + "field.blocks.video.controls": "Controls", + "field.blocks.video.location": "Lokalizacja", + "field.blocks.video.loop": "Loop", + "field.blocks.video.muted": "Muted", + "field.blocks.video.name": "Video", + "field.blocks.video.placeholder": "Wprowadź URL video", + "field.blocks.video.poster": "Poster", + "field.blocks.video.preload": "Preload", + "field.blocks.video.url.label": "URL video", + "field.blocks.video.url.placeholder": "https://youtube.com/?v=", + + "field.files.empty": "Nie wybrano jeszcze żadnych plików", + + "field.layout.change": "Zmień układ", + "field.layout.delete": "Usuń układ", + "field.layout.delete.confirm": "Czy na pewno chcesz usunąć ten układ?", + "field.layout.delete.confirm.all": "Czy na pewno chcesz usunąć wszystkie układy?", + "field.layout.empty": "Nie ma jeszcze żadnych rzędów", + "field.layout.select": "Wybierz układ", + + "field.object.empty": "Brak informacji", + + "field.pages.empty": "Nie wybrano jeszcze żadnych stron", + + "field.structure.delete.confirm": "Czy na pewno chcesz usunąć ten wiersz?", + "field.structure.delete.confirm.all": "Czy na pewno chcesz usunąć wszystkie wpisy?", + "field.structure.empty": "Nie ma jeszcze \u017cadnych wpis\u00f3w.", + + "field.users.empty": "Nie wybrano jeszcze żadnych użytkowników", + + "fields.empty": "Nie ma jeszcze żadnych pól", + + "file": "Plik", + "file.blueprint": "Ten plik nie ma jeszcze wzorca. Możesz go zdefiniować w /site/blueprints/files/{blueprint}.yml", + "file.changeTemplate": "Zmień szablon", + "file.changeTemplate.notice": "Zmiana szablonu pliku spowoduje usunięcie zawartości pól, które nie pasują pod względem typu. Jeżeli nowy szablon określa pewne zasady, np. wymiarów obrazu, one również zostaną zastosowane nieodwracalnie. Używaj ostrożnie.", + "file.delete.confirm": "Czy na pewno chcesz usunąć
{filename}?", + "file.focus.placeholder": "Ustaw punkt centralny", + "file.focus.reset": "Usuń punkt centralny", + "file.focus.title": "Punkt centralny", + "file.sort": "Zmień pozycję", + + "files": "Pliki", + "files.empty": "Nie ma jeszcze żadnych plików", + + "filter": "Filtr", + + "hide": "Ukryj", + "hour": "Godzina", + "hue": "Odcień", + "import": "Importuj", + "info": "Informacje", + "insert": "Wstaw", + "insert.after": "Wstaw po", + "insert.before": "Wstaw przed", + "install": "Zainstaluj", + + "installation": "Instalacja", + "installation.completed": "Panel został zainstalowany", + "installation.disabled": "Instalator panelu jest domyślnie wyłączony na serwerach publicznych. Uruchom instalator na komputerze lokalnym lub włącz go za pomocą opcji panel.install.", + "installation.issues.accounts": "Folder /site/accounts nie istnieje lub nie ma uprawnień do zapisu", + "installation.issues.content": "Folder /content nie istnieje lub nie ma uprawnień do zapisu", + "installation.issues.curl": "Wymagane jest rozszerzenie CURL", + "installation.issues.headline": "Nie można zainstalować panelu", + "installation.issues.mbstring": "Wymagane jest rozszerzenie MB String", + "installation.issues.media": "Folder /media nie istnieje lub nie ma uprawnień do zapisu", + "installation.issues.php": "Upewnij się, że używasz PHP 8+", + "installation.issues.sessions": "Folder /site/sessions nie istnieje lub nie ma uprawnień do zapisu", + + "language": "J\u0119zyk", + "language.code": "Kod", + "language.convert": "Ustaw jako domyślny", + "language.convert.confirm": "

Czy na pewno chcesz zmienić domyślny język na {name}? Nie można tego cofnąć.

Jeżeli brakuje tłumaczenia jakichś treści na {name}, nie będzie ich czym zastąpić i części witryny mogą być puste.

", + "language.create": "Dodaj nowy język", + "language.default": "Domyślny język", + "language.delete.confirm": "Czy na pewno chcesz usunąć język {name} i wszystkie tłumaczenia? Tego nie da się cofnąć!", + "language.deleted": "Język został usunięty", + "language.direction": "Kierunek czytania", + "language.direction.ltr": "Od lewej do prawej", + "language.direction.rtl": "Od prawej do lewej", + "language.locale": "PHP locale string", + "language.locale.warning": "Używasz niestandardowej konfiguracji ustawień regionalnych. Zmodyfikuj to w pliku języka w /site/langugaes", + "language.name": "Nazwa", + "language.secondary": "Drugorzędny język", + "language.settings": "Ustawienia języków", + "language.updated": "Język został zaktualizowany", + "language.variables": "Zmienne językowe", + "language.variables.empty": "Nie ma jeszcze żadnych tłumaczeń", + + "language.variable.delete.confirm": "Czy na pewno chcesz usunąć zmienną przypisaną do klucza {key}?", + "language.variable.key": "Klucz", + "language.variable.notFound": "Nie udało się odnaleźć zmiennej", + "language.variable.value": "Wartość", + + "languages": "Języki", + "languages.default": "Domyślny język", + "languages.empty": "Nie ma jeszcze żadnych języków", + "languages.secondary": "Dodatkowe języki", + "languages.secondary.empty": "Nie ma jeszcze dodatkowych języków", + + "license": "Licencja", + "license.activate": "Aktywuj teraz", + "license.activate.label": "Aktywuj swoją licencję", + "license.activate.domain": "Twoja licencja zostanie aktywowana na {host}.", + "license.activate.local": "Zamierzasz aktywować licencję Kirby dla domeny lokalnej {host}. Jeżeli ta strona będzie uruchamiana w publicznie dostępnej domenie, należy ją aktywować tam. Jeśli {host} jest domeną, dla której chcesz używać licencji, kontynuuj.", + "license.activated": "Aktywowana", + "license.buy": "Kup licencję", + "license.code": "Kod", + "license.code.help": "Po zakupie otrzymałeś emailem kod licencyjny. Skopiuj go i wklej tutaj.", + "license.code.label": "Wprowadź swój kod licencji", + "license.status.active.info": "Zawiera nowe główne wersje do {date}", + "license.status.active.label": "Ważna licencja", + "license.status.demo.info": "This is a demo installation", + "license.status.demo.label": "Demo", + "license.status.inactive.info": "Odnów licencję, by zaktualizować do nowych wersji głównych", + "license.status.inactive.label": "Brak nowych wersji głównych", + "license.status.legacy.bubble": "Gotowy/-a do odnowienia swojej licencji?", + "license.status.legacy.info": "Twoja licencja nie obejmuje tej wersji", + "license.status.legacy.label": "Odnów swoją licencję", + "license.status.missing.bubble": "Gotowy/-a do uruchomienia strony?", + "license.status.missing.info": "Brak ważnej licencji", + "license.status.missing.label": "Aktywuj swoją licencję", + "license.manage": "Zarządzaj swoimi licencjami", + "license.purchased": "Zakupiona", + "license.success": "Dziękujemy za wspieranie Kirby", + "license.unregistered.label": "Niezarejestrowane", + + "link": "Link", + "link.text": "Tekst linku", + + "loading": "Ładuję", + + "lock.unsaved": "Niezapisane zmiany", + "lock.unsaved.empty": "Nie ma już żadnych niezapisanych zmian", + "lock.isLocked": "Niezapisane zmiany autorstwa {email}", + "lock.unlock": "Odblokuj", + "lock.unlock.submit": "Odblokuj i nadpisz niezapisane zmiany autorstwa {email}", + "lock.isUnlocked": "Zostało odblokowane przez innego użytkownika", + + "login": "Zaloguj się", + "login.code.label.login": "Kod logowania się", + "login.code.label.password-reset": "Kod resetowania hasła", + "login.code.placeholder.email": "000 000", + "login.code.placeholder.totp": "000000", + "login.code.text.email": "Jeśli Twój adres email jest zarejestrowany, żądany kod został wysłany na Twoją skrzynkę.", + "login.code.text.totp": "Wprowadź jednorazowy kod z aplikacji uwierzytelniającej.", + "login.email.login.body": "Cześć {user.nameOrEmail},\n\nNiedawno poprosiłaś/-eś o kod do zalogowania się do panelu strony {site}.\nPoniższy kod do zalogowania się będzie ważny przez {timeout} minut:\n\n{code}\n\nJeżeli nie zażądałaś/-eś kodu do logowania się, zignoruj tę wiadomość e-mail lub skontaktuj się z administratorem, jeśli masz pytania.\nZe względów bezpieczeństwa NIE przesyłaj dalej tego e-maila.", + "login.email.login.subject": "Twój kod logowania się", + "login.email.password-reset.body": "Cześć {user.nameOrEmail},\n\nNiedawno poprosiłaś/-eś o kod resetowania hasła do panelu strony {site}.\nPoniższy kod resetowania hasła będzie ważny przez {timeout} minut:\n\n{code}\n\nJeżeli nie zażądałaś/-eś kodu resetowania hasła, zignoruj tę wiadomość e-mail lub skontaktuj się z administratorem, jeśli masz pytania. \nZe względów bezpieczeństwa NIE przesyłaj dalej tego e-maila. ", + "login.email.password-reset.subject": "Twój kod resetujący hasło", + "login.remember": "Nie wylogowuj mnie", + "login.reset": "Zresetuj hasło", + "login.toggleText.code.email": "Zaloguj się za pomocą adresu email", + "login.toggleText.code.email-password": "Zaloguj się za pomocą hasła", + "login.toggleText.password-reset.email": "Zapomniałeś/-aś hasła?", + "login.toggleText.password-reset.email-password": "← Powrót do logowania", + "login.totp.enable.option": "Ustaw kody jednorazowe", + "login.totp.enable.intro": "Aplikacje uwierzytelniające mogą generować jednorazowe kody, które są używane jako drugi czynnik podczas logowania się na konto.", + "login.totp.enable.qr.label": "1. Zeskanuj ten kod QR", + "login.totp.enable.qr.help": "Nie możesz zeskanować? Dodaj ręcznie klucz instalacyjny {secret} do aplikacji uwierzytelniającej.", + "login.totp.enable.confirm.headline": "2. Potwierdź wygenerowanym kodem", + "login.totp.enable.confirm.text": "Aplikacja generuje nowy kod jednorazowy co 30 sekund. Wprowadź aktualny kod, aby dokończyć konfigurację:", + "login.totp.enable.confirm.label": "Aktualny kod", + "login.totp.enable.confirm.help": "Po tej konfiguracji będziemy prosić o jednorazowy kod przy każdym logowaniu.", + "login.totp.enable.success": "Kody jednorazowe włączone", + "login.totp.disable.option": "Wyłącz kody jednorazowe", + "login.totp.disable.label": "Wprowadź swoje hasło, aby wyłączyć kody jednorazowe", + "login.totp.disable.help": "W przyszłości podczas logowania wymagany będzie inny drugi czynnik, taki jak kod logowania wysłany emailem. Kody jednorazowe możesz zawsze skonfigurować później.", + "login.totp.disable.admin": "

Spowoduje to wyłączenie kodów jednorazowych dla użytkownika {user}.

W przyszłości podczas logowania wymagany będzie inny drugi czynnik, taki jak kod logowania wysłany emailem. {user} może ponownie skonfigurować kody jednorazowe po następnym zalogowaniu.

", + "login.totp.disable.success": "Kody jednorazowe wyłączone", + + "logout": "Wyloguj się", + + "merge": "Połącz", + "menu": "Menu", + "meridiem": "AM/PM", + "mime": "Typ multimediów", + "minutes": "Minuty", + + "month": "Miesiąc", + "months.april": "Kwiecie\u0144", + "months.august": "Sierpie\u0144", + "months.december": "Grudzie\u0144", + "months.february": "Luty", + "months.january": "Stycze\u0144", + "months.july": "Lipiec", + "months.june": "Czerwiec", + "months.march": "Marzec", + "months.may": "Maj", + "months.november": "Listopad", + "months.october": "Pa\u017adziernik", + "months.september": "Wrzesie\u0144", + + "more": "Więcej", + "move": "Przenieś", + "name": "Nazwa", + "next": "Następne", + "night": "Noc", + "no": "nie", + "off": "wyłączone", + "on": "włączone", + "open": "Otwórz", + "open.newWindow": "Otwórz w nowym oknie", + "option": "Opcja", + "options": "Opcje", + "options.none": "Brak opcji", + "options.all": "Pokaż wszystkie {count} opcje/-i", + + "orientation": "Orientacja", + "orientation.landscape": "Pozioma", + "orientation.portrait": "Pionowa", + "orientation.square": "Kwadrat", + + "page": "Strona", + "page.blueprint": "Ta strona nie ma jeszcze wzorca. Możesz go zdefiniować w /site/blueprints/pages/{blueprint}.yml", + "page.changeSlug": "Zmie\u0144 URL", + "page.changeSlug.fromTitle": "Utw\u00f3rz na podstawie tytu\u0142u", + "page.changeStatus": "Zmień status", + "page.changeStatus.position": "Wybierz pozycję", + "page.changeStatus.select": "Wybierz nowy status", + "page.changeTemplate": "Zmień szablon", + "page.changeTemplate.notice": "Zmiana szablonu strony spowoduje usunięcie treści z pól, które nie pasują pod względem typu. Używaj ostrożnie.", + "page.create": "Utwórz jako {status}", + "page.delete.confirm": "Czy na pewno chcesz usunąć {title}?", + "page.delete.confirm.subpages": "Ta strona zawiera podstrony.
Wszystkie podstrony również zostaną usunięte.", + "page.delete.confirm.title": "Wprowadź tytuł strony, aby potwierdzić", + "page.duplicate.appendix": "Kopiuj", + "page.duplicate.files": "Kopiuj pliki", + "page.duplicate.pages": "Kopiuj strony", + "page.move": "Przenieś stronę", + "page.sort": "Zmień pozycję", + "page.status": "Status", + "page.status.draft": "Szkic", + "page.status.draft.description": "Strona jest w trybie roboczym i widoczna tylko dla zalogowanych redaktorów lub pod sekretnym linkiem", + "page.status.listed": "Opublikowana", + "page.status.listed.description": "Strona jest opublikowana i widoczna dla każdego", + "page.status.unlisted": "Nie katalogowana", + "page.status.unlisted.description": "Strona jest dostępna tylko za pośrednictwem adresu URL", + + "pages": "Strony", + "pages.empty": "Nie ma jeszcze żadnych stron", + "pages.status.draft": "Szkice", + "pages.status.listed": "Opublikowane", + "pages.status.unlisted": "Nie katalogowana", + + "pagination.page": "Strona", + + "password": "Has\u0142o", + "paste": "Wklej", + "paste.after": "Wklej po", + "paste.success": "{count} wklejonych!", + "pixel": "Piksel", + "plugin": "Wtyczka", + "plugins": "Wtyczki", + "prev": "Poprzednie", + "preview": "Podgląd", + "remove": "Usuń", + "rename": "Zmień nazwę", + "renew": "Odnów", + "replace": "Zamie\u0144", + "replace.with": "Zamień z", + "retry": "Pon\u00f3w pr\u00f3b\u0119", + "revert": "Odrzu\u0107", + "revert.confirm": "Czy na pewno chcesz usunąć wszystkie niezapisane zmiany?", + + "role": "Rola", + "role.admin.description": "Administrator posiada wszystkie uprawnienia", + "role.admin.title": "Administrator", + "role.all": "Wszystkie", + "role.empty": "Nie ma użytkowników z tą rolą", + "role.description.placeholder": "Brak opisu", + "role.nobody.description": "To jest rola zastępcza bez żadnych uprawnień", + "role.nobody.title": "Nikt", + + "save": "Zapisz", + "search": "Szukaj", + "search.min": "Aby wyszukać, wprowadź co najmniej {min} znaków", + "search.all": "Pokaż wszystkie {count} wyniki/-ów", + "search.results.none": "Brak wyników", + + "section.invalid": "Sekcja jest nieprawidłowa", + "section.required": "Sekcja jest wymagana", + + "security": "Bezpieczeństwo", + "select": "Wybierz", + "server": "Serwer", + "settings": "Ustawienia", + "show": "Pokaż", + "site.blueprint": "Ta strona nie ma jeszcze wzorca. Możesz go zdefiniować w /site/blueprints/site.yml", + "size": "Rozmiar", + "slug": "Końcówka URL", + "sort": "Sortuj", + "sort.drag": "Przeciągnij, aby posortować…", + "split": "Podziel", + + "stats.empty": "Brak raportów", + "status": "Status", + + "system.info.copy": "Copy info", + "system.info.copied": "System info copied", + "system.issues.content": "Zdaje się, że folder „content” jest wystawiony na publiczny dostęp", + "system.issues.eol.kirby": "Twoja zainstalowana wersja Kirby osiągnęła koniec okresu wsparcia i nie będzie otrzymywać dalszych aktualizacji zabezpieczeń", + "system.issues.eol.plugin": "Twoja zainstalowana wersja wtyczki { plugin } osiągnęła koniec okresu wsparcia i nie będzie otrzymywać dalszych aktualizacji zabezpieczeń", + "system.issues.eol.php": "Zainstalowana wersja PHP { release } osiągnęła koniec okresu eksploatacji i nie będzie otrzymywać dalszych aktualizacji zabezpieczeń.", + "system.issues.debug": "Debugowanie musi być wyłączone w środowisku produkcyjnym", + "system.issues.git": "Zdaje się, że folder „.git” jest wystawiony na publiczny dostęp", + "system.issues.https": "Zalecamy HTTPS dla wszystkich Twoich witryn", + "system.issues.kirby": "Zdaje się, że folder „kirby” jest wystawiony na publiczny dostęp", + "system.issues.site": "Zdaje się, że folder „site” jest wystawiony na publiczny dostęp", + "system.issues.vulnerability.kirby": "Twojej instalacji może zagrażać następująca luka w zabezpieczeniach ({ severity } stopień): { description }", + "system.issues.vulnerability.plugin": "Twojej instalacji może zagrażać następująca luka w zabezpieczeniach we wtyczce { plugin } ({ severity } poziom): { description }", + "system.updateStatus": "Stan aktualizacji", + "system.updateStatus.error": "Nie udało się sprawdzić dostępności aktualizacji", + "system.updateStatus.not-vulnerable": "Brak znanych luk bezpieczeństwa", + "system.updateStatus.security-update": "Dostępna darmowa aktualizacja { version } z poprawkami bezpieczeństwa", + "system.updateStatus.security-upgrade": "Dostępna aktualizacja { version } z poprawkami bezpieczeństwa", + "system.updateStatus.unreleased": "Niepublikowana wersja", + "system.updateStatus.up-to-date": "Aktualna", + "system.updateStatus.update": "Dostępna darmowa aktualizacja { version }", + "system.updateStatus.upgrade": "Dostępna aktualizacja { version }", + + "tel": "Telefon", + "tel.placeholder": "+48123456789", + "template": "Szablon", + "title": "Tytuł", + "today": "Dzisiaj", + + "toolbar.button.clear": "Wyczyść formatowanie", + "toolbar.button.code": "Kod", + "toolbar.button.bold": "Pogrubienie", + "toolbar.button.email": "Email", + "toolbar.button.headings": "Nagłówki", + "toolbar.button.heading.1": "Nagłówek 1", + "toolbar.button.heading.2": "Nagłówek 2", + "toolbar.button.heading.3": "Nagłówek 3", + "toolbar.button.heading.4": "Nagłówek 4", + "toolbar.button.heading.5": "Nagłówek 5", + "toolbar.button.heading.6": "Nagłówek 6", + "toolbar.button.italic": "Kursywa", + "toolbar.button.file": "Plik", + "toolbar.button.file.select": "Wybierz plik", + "toolbar.button.file.upload": "Prześlij plik", + "toolbar.button.link": "Link", + "toolbar.button.paragraph": "Akapit", + "toolbar.button.strike": "Przekreślenie", + "toolbar.button.sub": "Indeks dolny", + "toolbar.button.sup": "Indeks górny", + "toolbar.button.ol": "Lista numerowana", + "toolbar.button.underline": "Podkreślenie", + "toolbar.button.ul": "Lista wypunktowana", + + "translation.author": "Zespół Kirby", + "translation.direction": "ltr", + "translation.name": "Polski", + "translation.locale": "pl_PL", + + "type": "Typ", + + "upload": "Prześlij", + "upload.error.cantMove": "Przesłany plik nie mógł być przeniesiony", + "upload.error.cantWrite": "Nie udało się zapisać pliku na dysku", + "upload.error.default": "Nie udało się przesłać pliku", + "upload.error.extension": "Przesyłanie pliku zostało zastopowane przez rozszerzenie", + "upload.error.formSize": "Przesłany plik przekracza dyrektywę MAX_FILE_SIZE określoną w formularzu", + "upload.error.iniPostSize": "Przesłany plik przekracza dyrektywę post_max_size określoną w php.ini", + "upload.error.iniSize": "Przesłany plik przekracza dyrektywę upload_max_filesize określoną w php.ini", + "upload.error.noFile": "Nie został przesłany żaden plik", + "upload.error.noFiles": "Nie zostały przesłane żadne pliki", + "upload.error.partial": "Została przesłana tylko część przesyłanego pliku", + "upload.error.tmpDir": "Brak tymczasowego folderu", + "upload.errors": "Błąd", + "upload.progress": "Przesyłanie…", + + "url": "Url", + "url.placeholder": "https://example.com", + + "user": "Użytkownik", + "user.blueprint": "Możesz zdefiniować dodatkowe sekcje i pola dla użytkownika o takiej roli w /site/blueprints/users/{blueprint}.yml", + "user.changeEmail": "Zmień email", + "user.changeLanguage": "Zmień język", + "user.changeName": "Zmień nazwę tego użytkownika", + "user.changePassword": "Zmień hasło", + "user.changePassword.new": "Nowe hasło", + "user.changePassword.new.confirm": "Potwierdź nowe hasło…", + "user.changeRole": "Zmień rolę", + "user.changeRole.select": "Wybierz nową rolę", + "user.create": "Dodaj nowego użytkownika", + "user.delete": "Usuń tego użytkownika", + "user.delete.confirm": "Czy na pewno chcesz usunąć
{email}?", + + "users": "Użytkownicy", + + "version": "Wersja", + "version.current": "Obecna wersja", + "version.latest": "Ostatnia wersja", + "versionInformation": "Informacje o wersji", + + "view.account": "Twoje konto", + "view.installation": "Instalacja", + "view.languages": "Języki", + "view.resetPassword": "Zresetuj hasło", + "view.site": "Strona", + "view.system": "System", + "view.users": "U\u017cytkownicy", + + "welcome": "Witaj", + "year": "Rok", + "yes": "tak" +} diff --git a/kirby/i18n/translations/pt_BR.json b/kirby/i18n/translations/pt_BR.json new file mode 100644 index 0000000..b851dab --- /dev/null +++ b/kirby/i18n/translations/pt_BR.json @@ -0,0 +1,730 @@ +{ + "account.changeName": "Mudar seu nome", + "account.delete": "Deletar sua conta", + "account.delete.confirm": "Deseja realmente deletar sua conta? Você sairá do site imediatamente. Sua conta não poderá ser recuperada. ", + + "activate": "Ativar", + "add": "Adicionar", + "alpha": "Alpha", + "author": "Autor", + "avatar": "Foto do perfil", + "back": "Voltar", + "cancel": "Cancelar", + "change": "Alterar", + "close": "Fechar", + "changes": "Alterações", + "confirm": "Salvar", + "collapse": "Colapsar", + "collapse.all": "Colapsar todos", + "color": "Cor", + "coordinates": "Coordenadas", + "copy": "Copiar", + "copy.all": "Copiar todos", + "copy.success": "{count} copiados!", + "create": "Criar", + "custom": "Personalizado", + + "date": "Data", + "date.select": "Selecione uma data", + + "day": "Dia", + "days.fri": "Sex", + "days.mon": "Seg", + "days.sat": "S\u00e1b", + "days.sun": "Dom", + "days.thu": "Qui", + "days.tue": "Ter", + "days.wed": "Qua", + + "debugging": "Depuração ", + + "delete": "Deletar", + "delete.all": "Deletar todos", + + "dialog.fields.empty": "Esta caixa de diálogo não tem campos", + "dialog.files.empty": "Nenhum arquivo para selecionar", + "dialog.pages.empty": "Nenhuma página para selecionar", + "dialog.text.empty": "Esta caixa de diálogo não define nenhum texto", + "dialog.users.empty": "Nenhum usuário para selecionar", + + "dimensions": "Dimensões", + "disable": "Desativar", + "disabled": "Desativado", + "discard": "Descartar", + + "drawer.fields.empty": "Esta janela não tem campos", + + "domain": "Domínio", + "download": "Baixar", + "duplicate": "Duplicar", + + "edit": "Editar", + + "email": "Email", + "email.placeholder": "mail@exemplo.com", + + "enter": "Insira", + "entries": "Registos", + "entry": "Registo", + + "environment": "Ambiente", + + "error": "Erro", + "error.access.code": "Código inválido", + "error.access.login": "Código de acesso inválido", + "error.access.panel": "Você não tem permissão para acessar o painel", + "error.access.view": "Você não tem permissão para acessar esta parte do painel", + + "error.avatar.create.fail": "A foto de perfil não pôde ser enviada", + "error.avatar.delete.fail": "A foto de perfil não pôde ser deletada", + "error.avatar.dimensions.invalid": "Por favor, use uma foto de perfil com largura e altura menores que 3000 pixels", + "error.avatar.mime.forbidden": "A foto de perfil deve ser um arquivo JPEG ou PNG", + + "error.blueprint.notFound": "A planta \"{name}\" não pôde ser carregada", + + "error.blocks.max.plural": "Você não deve adicionar mais do que {max} blocos", + "error.blocks.max.singular": "Você não deve adicionar mais do que um bloco", + "error.blocks.min.plural": "Você deve adicionar pelo menos {min} blocos", + "error.blocks.min.singular": "Você deve adicionar pelo menos um bloco", + "error.blocks.validation": "Há um erro no campo \"{field}\" no bloco {index} a usar o tipo de bloco \"{fieldset}\"", + + "error.cache.type.invalid": "Tipo de cache \"{type}\" inválido", + + "error.email.preset.notFound": "Pré-configuração de email \"{name}\" não foi encontrada", + + "error.field.converter.invalid": "Conversor \"{converter}\" inválido", + "error.field.type.missing": "Campo \"{name}\": O tipo de campo \"{type}\" não existe", + + "error.file.changeName.empty": "O nome não deve ficar em branco", + "error.file.changeName.permission": "Você não tem permissão para alterar o nome de \"{filename}\"", + "error.file.changeTemplate.invalid": "O template para o ficheiro \"{id}\" não pode ser alterado para \"{template}\" (válido: \"{blueprints}\")", + "error.file.changeTemplate.permission": "Não tem permissão para alterar o template do ficheiro \"{id}\"", + + "error.file.duplicate": "Um arquivo com o nome \"{filename}\" já existe", + "error.file.extension.forbidden": "Extensão \"{extension}\" não permitida", + "error.file.extension.invalid": "Extensão inválida: {extension}", + "error.file.extension.missing": "Extensão de \"{filename}\" em falta", + "error.file.maxheight": "A altura da imagem não pode exceder {height} pixels", + "error.file.maxsize": "O arquivo é grande demais", + "error.file.maxwidth": "A largura da imagem não pode exceder {width} pixels", + "error.file.mime.differs": "O arquivo enviado precisa ser do tipo \"{mime}\"", + "error.file.mime.forbidden": "Tipo de mídia \"{mime}\" não permitido", + "error.file.mime.invalid": "Tipo mime inválido: {mime}", + "error.file.mime.missing": "Tipo de mídia de \"{filename}\" não detectado", + "error.file.minheight": "A altura da imagem deve ser pelo menos {height} pixels", + "error.file.minsize": "O arquivo é pequeno demais", + "error.file.minwidth": "A largura da imagem deve ser pelo menos {width} pixels", + "error.file.name.unique": "O nome do ficheiro deve ser único", + "error.file.name.missing": "O nome do arquivo não pode ficar em branco", + "error.file.notFound": "Arquivo \"{filename}\" não encontrado", + "error.file.orientation": "A orientação da imagem deve ser “{orientation}”", + "error.file.type.forbidden": "Você não tem permissão para enviar arquivos {type}", + "error.file.type.invalid": "Tipo inválido de arquivo: {type}", + "error.file.undefined": "Arquivo n\u00e3o encontrado", + + "error.form.incomplete": "Por favor, corrija os erros do formulário…", + "error.form.notSaved": "O formulário não pôde ser salvo", + + "error.language.code": "Por favor entre um código válido para o idioma", + "error.language.duplicate": "O idioma já existe", + "error.language.name": "Por favor entre um nome válido para o idioma", + "error.language.notFound": "O idioma não foi encontrado", + + "error.layout.validation.block": "Há um erro no campo \"{field}\" no bloco {blockIndex} a usar o tipo de bloco \"{fieldset}\" no layout {layoutIndex}", + "error.layout.validation.settings": "Há um erro na configuração do layout {index}", + + "error.license.domain": "O domínio da licença está em falta", + "error.license.email": "Digite um endereço de email válido", + "error.license.format": "Por favor insira um código de licença válido", + "error.license.verification": "A licensa não pôde ser verificada", + + "error.login.totp.confirm.invalid": "Código inválido", + "error.login.totp.confirm.missing": "Por favor insira o código atual", + + "error.object.validation": "Há um erro no campo \"{label}\":\n{message}", + + "error.offline": "O painel está offline no momento", + + "error.page.changeSlug.permission": "Você não tem permissão para alterar o anexo de URL de \"{slug}\"", + "error.page.changeSlug.reserved": "O caminho das páginas de nível superior não deve começar com \"{path}\"", + "error.page.changeStatus.incomplete": "A página possui erros e não pode ser salva", + "error.page.changeStatus.permission": "O estado desta página não pode ser alterado", + "error.page.changeStatus.toDraft.invalid": "A página \"{slug}\" não pode ser convertida para rascunho", + "error.page.changeTemplate.invalid": "O tema da página \"{slug}\" não pode ser alterado", + "error.page.changeTemplate.permission": "Você não tem permissão para alterar o tema de \"{slug}\"", + "error.page.changeTitle.empty": "O título não pode ficar em branco", + "error.page.changeTitle.permission": "Você não tem permissão para alterar o título de \"{slug}\"", + "error.page.create.permission": "Você não tem permissão para criar \"{slug}\"", + "error.page.delete": "A página \"{slug}\" não pode ser deletada", + "error.page.delete.confirm": "Por favor, digite o título da página para confirmar", + "error.page.delete.hasChildren": "A página possui subpáginas e não pode ser deletada", + "error.page.delete.permission": "Você não tem permissão para deletar \"{slug}\"", + "error.page.draft.duplicate": "Uma página rascunho com um anexo de URL \"{slug}\" já existe", + "error.page.duplicate": "Uma página com o anexo de URL \"{slug}\" já existe", + "error.page.duplicate.permission": "Você não tem permissão para duplicar “{slug}”", + "error.page.move.ancestor": "A página não pode ser movida para dentro dela mesma", + "error.page.move.directory": "A pasta da página não pode ser movida", + "error.page.move.duplicate": "Uma subpágina com o segmento de URL \"{slug}\" já existe", + "error.page.move.notFound": "A página movida não foi encontrada", + "error.page.move.permission": "Não tem permissão para mover \"{slug}\"", + "error.page.move.template": "O template \"{template}\" não é aceite como subpágina de \"{parent}\"", + "error.page.notFound": "Página \"{slug}\" não encontrada", + "error.page.num.invalid": "Digite um número de ordenação válido. Este número não pode ser negativo.", + "error.page.slug.invalid": "Por favor entre um anexo de URL válido ", + "error.page.slug.maxlength": "O slug deve ter menos de “{length}” caracteres", + "error.page.sort.permission": "A página \"{slug}\" não pode ser ordenada", + "error.page.status.invalid": "Por favor, defina um estado de página válido", + "error.page.undefined": "P\u00e1gina n\u00e3o encontrada", + "error.page.update.permission": "Você não tem permissão para atualizar \"{slug}\"", + + "error.section.files.max.plural": "Você não pode adicionar mais do que {max} arquivos à seção \"{section}\"", + "error.section.files.max.singular": "Você não pode adicionar mais do que um arquivo à seção \"{section}\"", + "error.section.files.min.plural": "A seção “{section}” precisa ter pelo menos {min} arquivos", + "error.section.files.min.singular": "A seção “{section}” precisa ter pelo menos um arquivo", + + "error.section.pages.max.plural": "Você não pode adicionar mais do que {max} páginas à seção \"{section}\"", + "error.section.pages.max.singular": "Você não pode adicionar mais do que uma página à seção \"{section}\"", + "error.section.pages.min.plural": "A seção “{section}” precisa ter pelo menos {min} páginas ", + "error.section.pages.min.singular": "A seção “{section}” precisa ter pelo menos uma página ", + + "error.section.notLoaded": "A seção \"{name}\" não pôde ser carregada", + "error.section.type.invalid": "O tipo da seção \"{type}\" não é válido", + + "error.site.changeTitle.empty": "O título não pode ficar em branco", + "error.site.changeTitle.permission": "Você não tem permissão para alterar o título do site", + "error.site.update.permission": "Você não tem permissão para atualizar o site", + + "error.structure.validation": "Existe um erro no campo \"{field}\" na linha {index}", + + "error.template.default.notFound": "O tema padrão não existe", + + "error.unexpected": "Ocorreu um erro inesperado! Ative o modo de debug para obter mais informações: https://getkirby.com/docs/reference/system/options/debug", + + "error.user.changeEmail.permission": "Você não tem permissão para alterar o email do usuário \"{name}\"", + "error.user.changeLanguage.permission": "Você não tem permissão para alterar o idioma do usuário \"{name}\"", + "error.user.changeName.permission": "Você não tem permissão para alterar o nome do usuário \"{name}\"", + "error.user.changePassword.permission": "Você não tem permissão para alterar a senha do usuário \"{name}\"", + "error.user.changeRole.lastAdmin": "O papel do último administrador não pode ser alterado", + "error.user.changeRole.permission": "Você não tem permissão para alterar o papel do usuário \"{name}\"", + "error.user.changeRole.toAdmin": "Você não tem permissão para promover usuários ao papel de administrador ", + "error.user.create.permission": "Você não tem permissão para criar este usuário", + "error.user.delete": "O usuário \"{name}\" não pode ser deletado", + "error.user.delete.lastAdmin": "O último administrador não pode ser deletado", + "error.user.delete.lastUser": "O último usuário não pode ser deletado", + "error.user.delete.permission": "Você não tem permissão para deletar o usuário \"{name}\"", + "error.user.duplicate": "Um usuário com o email \"{email}\" já existe", + "error.user.email.invalid": "Digite um endereço de email válido", + "error.user.language.invalid": "Digite um idioma válido", + "error.user.notFound": "Usuário \"{name}\" não encontrado", + "error.user.password.excessive": "Por favor insira uma palavra-passe válida. As palavras-passe não devem ter mais do que 1000 caracteres.", + "error.user.password.invalid": "Digite uma senha válida. Sua senha deve ter pelo menos 8 caracteres.", + "error.user.password.notSame": "As senhas não combinam", + "error.user.password.undefined": "O usuário não possui uma senha", + "error.user.password.wrong": "Senha errada", + "error.user.role.invalid": "Digite um papel válido", + "error.user.undefined": "Usuário não encontrado", + "error.user.update.permission": "Você não tem permissão para atualizar o usuário \"{name}\"", + + "error.validation.accepted": "Por favor, confirme", + "error.validation.alpha": "Por favor, use apenas caracteres entre a-z", + "error.validation.alphanum": "Por favor, use apenas caracteres entre a-z ou 0-9", + "error.validation.anchor": "Por favor insira uma âncora de link correta", + "error.validation.between": "Digite um valor entre \"{min}\" e \"{max}\"", + "error.validation.boolean": "Por favor, confirme ou rejeite", + "error.validation.color": "Por favor, insira uma cor válida no formato {format}", + "error.validation.contains": "Digite um valor que contenha \"{needle}\"", + "error.validation.date": "Escolha uma data válida", + "error.validation.date.after": "Por favor entre uma data depois de {date}", + "error.validation.date.before": "Por favor entre uma data antes de {date}", + "error.validation.date.between": "Por favor entre uma data entre {min} e {max}", + "error.validation.denied": "Por favor, cancele", + "error.validation.different": "O valor deve ser diferente de \"{other}\"", + "error.validation.email": "Digite um endereço de email válido", + "error.validation.endswith": "O valor deve terminar com \"{end}\"", + "error.validation.filename": "Digite um nome de arquivo válido", + "error.validation.in": "Digite um destes valores: ({in})", + "error.validation.integer": "Digite um número inteiro válido", + "error.validation.ip": "Digite um endereço de IP válido", + "error.validation.less": "Digite um valor menor que {max}", + "error.validation.linkType": "O tipo de link não é permitido", + "error.validation.match": "O valor não combina com o padrão esperado", + "error.validation.max": "Digite um valor igual ou menor que {max}", + "error.validation.maxlength": "Digite um valor curto. (no máximo {max} caracteres)", + "error.validation.maxwords": "Digite menos que {max} palavra(s)", + "error.validation.min": "Digite um valor igual ou maior que {min}", + "error.validation.minlength": "Digite um valor maior. (no mínimo {min} caracteres)", + "error.validation.minwords": "Digite ao menos {min} palavra(s)", + "error.validation.more": "Digite um valor maior que {min}", + "error.validation.notcontains": "Digite um valor que não contenha \"{needle}\"", + "error.validation.notin": "Não digite nenhum destes valores: ({notIn})", + "error.validation.option": "Escolha uma opção válida", + "error.validation.num": "Digite um número válido", + "error.validation.required": "Digite algo", + "error.validation.same": "Por favor, digite \"{other}\"", + "error.validation.size": "O tamanho do valor deve ser \"{size}\"", + "error.validation.startswith": "O valor deve começar com \"{start}\"", + "error.validation.tel": "Por favor, insira um número de telefone não formatado", + "error.validation.time": "Digite um horário válido", + "error.validation.time.after": "Por favor entre um horário depois de {time}", + "error.validation.time.before": "Por favor entre um horário antes de {time}", + "error.validation.time.between": "Por favor entre um horário entre {min} e {max}", + "error.validation.uuid": "Por favor, insira um UUID válido", + "error.validation.url": "Digite uma URL válida", + + "expand": "Expandir", + "expand.all": "Expandir todos", + + "field.invalid": "O campo é inválido", + "field.required": "Este campo é obrigatório ", + "field.blocks.changeType": "Mudar tipo", + "field.blocks.code.name": "Código", + "field.blocks.code.language": "Idioma", + "field.blocks.code.placeholder": "Seu código …", + "field.blocks.delete.confirm": "Deseja realmente deletar este bloco?", + "field.blocks.delete.confirm.all": "Deseja realmente deletar todos os blocos?", + "field.blocks.delete.confirm.selected": "Deseja realmente deletar os blocos selecionados?", + "field.blocks.empty": "Nenhum bloco", + "field.blocks.fieldsets.empty": "Ainda não há tipos de blocos", + "field.blocks.fieldsets.label": "Por favor selecione um tipo de bloco …", + "field.blocks.fieldsets.paste": "Pressione {{ shortcut }} para importar layouts/blocks da sua área de transferência Só serão inseridos aqueles permitidos no campo atual.", + "field.blocks.gallery.name": "Galeria", + "field.blocks.gallery.images.empty": "Nenhuma imagem", + "field.blocks.gallery.images.label": "Imagens", + "field.blocks.heading.level": "Nível ", + "field.blocks.heading.name": "Título ", + "field.blocks.heading.text": "Texto", + "field.blocks.heading.placeholder": "Título …", + "field.blocks.image.alt": "Texto alternativo", + "field.blocks.image.caption": "Legenda", + "field.blocks.image.crop": "Cortar", + "field.blocks.image.link": "Link", + "field.blocks.image.location": "Localização ", + "field.blocks.image.location.internal": "Este website", + "field.blocks.image.location.external": "Fonte externa", + "field.blocks.image.name": "Imagem", + "field.blocks.image.placeholder": "Selecionar uma imagem", + "field.blocks.image.ratio": "Proporção ", + "field.blocks.image.url": "URL da imagem", + "field.blocks.line.name": "Linha", + "field.blocks.list.name": "Lista", + "field.blocks.markdown.name": "Markdown", + "field.blocks.markdown.label": "Texto", + "field.blocks.markdown.placeholder": "Markdown …", + "field.blocks.quote.name": "Citação ", + "field.blocks.quote.text.label": "Texto", + "field.blocks.quote.text.placeholder": "Citação …", + "field.blocks.quote.citation.label": "Citação ", + "field.blocks.quote.citation.placeholder": "de …", + "field.blocks.text.name": "Texto", + "field.blocks.text.placeholder": "Texto …", + "field.blocks.video.autoplay": "Reprodução automática", + "field.blocks.video.caption": "Legenda", + "field.blocks.video.controls": "Controlos", + "field.blocks.video.location": "Localização ", + "field.blocks.video.loop": "Repetir", + "field.blocks.video.muted": "Sem som", + "field.blocks.video.name": "Vídeo ", + "field.blocks.video.placeholder": "Entre uma URL de vídeo ", + "field.blocks.video.poster": "Poster", + "field.blocks.video.preload": "Pré-carregamento", + "field.blocks.video.url.label": "URL-Vídeo", + "field.blocks.video.url.placeholder": "https://youtube.com/?v=", + + "field.files.empty": "Nenhum arquivo selecionado", + + "field.layout.change": "Alterar layout", + "field.layout.delete": "Deletar layout", + "field.layout.delete.confirm": "Deseja realmente deletar este layout?", + "field.layout.delete.confirm.all": "Tem a certeza que pretende remover todos os layouts?", + "field.layout.empty": "Nenhuma linha", + "field.layout.select": "Selecionar um layout", + + "field.object.empty": "Nenhuma informação ainda", + + "field.pages.empty": "Nenhuma página selecionada", + + "field.structure.delete.confirm": "Deseja realmente deletar esta linha?", + "field.structure.delete.confirm.all": "Tem a certeza que pretende eliminar todos os registos?", + "field.structure.empty": "Nenhum registro", + + "field.users.empty": "Nenhum usuário selecionado", + + "fields.empty": "Nenhum campo ainda", + + "file": "Ficheiro", + "file.blueprint": "Este arquivo não tem planta. Você pode definir sua planta em /site/blueprints/files/{blueprint}.yml", + "file.changeTemplate": "Alterar tema", + "file.changeTemplate.notice": "Alterar o template do ficheiro irá remover o conteúdo dos campos que não correspondem ao mesmo tipo. Se o novo template definir certas regras, por exemplo dimensões de imagem, estas também serão aplicadas irreversivelmente. Use com cuidado.", + "file.delete.confirm": "Deseja realmente deletar
{filename}?", + "file.focus.placeholder": "Definir ponto de foco", + "file.focus.reset": "Remover ponto de foco", + "file.focus.title": "Foco", + "file.sort": "Mudar posição", + + "files": "Arquivos", + "files.empty": "Nenhum arquivo", + + "filter": "Filtro", + + "hide": "Ocultar", + "hour": "Hora", + "hue": "Tonalidade", + "import": "Importar", + "info": "Info", + "insert": "Inserir", + "insert.after": "Inserir após", + "insert.before": "Inserir antes", + "install": "Instalar", + + "installation": "Instalação", + "installation.completed": "Painel instalado com sucesso", + "installation.disabled": "O instalador do painel está desabilitado em servidores públicos por padrão. Por favor, execute o instalador em uma máquina local ou habilite a opção panel.install.", + "installation.issues.accounts": "A pasta /site/accounts não existe ou não possui permissão de escrita", + "installation.issues.content": "A pasta /content não existe ou não possui permissão de escrita", + "installation.issues.curl": "A extensão CURL é necessária", + "installation.issues.headline": "O painel não pôde ser instalado", + "installation.issues.mbstring": "A extensão MB String é necessária", + "installation.issues.media": "A pasta /media não existe ou não possui permissão de escrita", + "installation.issues.php": "Certifique-se que você está usando o PHP 8+", + "installation.issues.sessions": "A pasta /site/sessions não existe ou não possui permissão de escrita", + + "language": "Idioma", + "language.code": "Código", + "language.convert": "Tornar padrão", + "language.convert.confirm": "

Deseja realmente converter {name} para o idioma padrão? Esta ação não poderá ser revertida.

Se {name} tiver conteúdo não traduzido, partes do seu site poderão ficar sem conteúdo.

", + "language.create": "Adicionar novo idioma", + "language.default": "Idioma padrão", + "language.delete.confirm": "Deseja realmente deletar o idioma {name} incluíndo todas as traduções. Esta ação não poderá ser revertida!", + "language.deleted": "Idioma deletado", + "language.direction": "Direção de leitura", + "language.direction.ltr": "Esquerda para direita", + "language.direction.rtl": "Direita para esquerda", + "language.locale": "String de localização do PHP", + "language.locale.warning": "Você está usando uma configuração de local customizada. Por favor modifique a configuração no arquivo do idioma em /site/languages", + "language.name": "Nome", + "language.secondary": "Idioma secundário", + "language.settings": "Configurações de idioma", + "language.updated": "Idioma atualizado", + "language.variables": "Variáveis de idioma", + "language.variables.empty": "Nenhuma tradução ainda", + + "language.variable.delete.confirm": "Tem a certeza que pretende eliminar a variável {key}?", + "language.variable.key": "Chave", + "language.variable.notFound": "A variável não foi encontrada", + "language.variable.value": "Valor", + + "languages": "Idiomas", + "languages.default": "Idioma padrão", + "languages.empty": "Nenhum idioma", + "languages.secondary": "Idiomas secundários", + "languages.secondary.empty": "Nenhum idioma secundário", + + "license": "Licen\u00e7a do Kirby ", + "license.activate": "Ativar agora", + "license.activate.label": "Por favor, ative a sua licença", + "license.activate.domain": "A sua licença será irá ser ativada para {host}.", + "license.activate.local": "Está prestes a ativar a sua licença Kirby no domínio local {host}. Se este site vai ser alojado num domínio público, por favor ative-o lá. Se o domínio {host} é o o que deseja para usar a sua licença, por favor continue.", + "license.activated": "Ativado", + "license.buy": "Comprar licença", + "license.code": "Código", + "license.code.help": "Recebeu o seu código de licença por e-mail após a compra. Por favor, copie e cole aqui.", + "license.code.label": "Por favor, digite o código da sua licença", + "license.status.active.info": "Inclui novas versões principais até {date}", + "license.status.active.label": "Licença válida", + "license.status.demo.info": "Esta é uma instalação de demonstração", + "license.status.demo.label": "Demonstração", + "license.status.inactive.info": "Renove a licença para atualizar para novas versões principais", + "license.status.inactive.label": "Nenhuma versão principal nova", + "license.status.legacy.bubble": "Pronto para renovar a sua licença?", + "license.status.legacy.info": "A sua licença não abrange esta versão", + "license.status.legacy.label": "Por favor, renove a sua licença", + "license.status.missing.bubble": "Pronto para lançar o seu site?", + "license.status.missing.info": "Nenhuma licença válida", + "license.status.missing.label": "Por favor, ative a sua licença", + "license.manage": "Gerir as suas licenças", + "license.purchased": "Compradas", + "license.success": "Obrigado por apoiar o Kirby", + "license.unregistered.label": "Não registadas", + + "link": "Link", + "link.text": "Texto do link", + + "loading": "Carregando", + + "lock.unsaved": "Mudanças não salvas", + "lock.unsaved.empty": "Não há mais mudanças não salvas", + "lock.isLocked": "Alterações não guardadas de {email}", + "lock.unlock": "Destrancar", + "lock.unlock.submit": "Desbloqueie e substitua alterações não guardadas de {email}", + "lock.isUnlocked": "Foi desbloqueado por outro utilizador", + + "login": "Entrar", + "login.code.label.login": "Código de acesso", + "login.code.label.password-reset": "Código de redefinição de senha", + "login.code.placeholder.email": "000 0000", + "login.code.placeholder.totp": "000000", + "login.code.text.email": "Se seu endereço de email está registrado, o código requisitado será mandado por email.", + "login.code.text.totp": "Por favor, insira o código único da sua aplicação de autenticação.", + "login.email.login.body": "Oi, {user.nameOrEmail},\n\nVocê recentemente pediu um código de acesso ao painel administrativo do site {site}.\nO seguinte código será válido por {timeout} minutos:\n\n{code}\n\nSe você não pediu este código de acesso, por favor ignore esta mensagem, ou contate seu Administrador de Sistemas se você tiver dúvidas.\nPor questões de segurança, por favor NÃO compartilhe esta mensagem.", + "login.email.login.subject": "Seu código de acesso", + "login.email.password-reset.body": "Oi, {user.nameOrEmail},\n\nVocê recentemente pediu um código de redefinição de senha, para o painel administrativo do site {site}.\nO seguinte código de redefinição de senha será válido por {timeout} minutos:\n\n{code}\n\nSe você não pediu este código, por favor ignore esta mensagem, ou contate seu Administrador de Sistemas se você tiver dúvidas.\nPor questões de segurança, por favor NÃO compartilhe esta mensagem.", + "login.email.password-reset.subject": "Seu código de redefinição de senha", + "login.remember": "Manter-me conectado", + "login.reset": "Redefinir senha", + "login.toggleText.code.email": "Entrar com email", + "login.toggleText.code.email-password": "Entrar com senha", + "login.toggleText.password-reset.email": "Esqueceu sua senha?", + "login.toggleText.password-reset.email-password": "← Voltar à entrada", + "login.totp.enable.option": "Configurar códigos únicos", + "login.totp.enable.intro": "As aplicações de autenticação podem gerar códigos únicos que são utilizados como um segundo fator ao iniciar a sessão na sua conta.", + "login.totp.enable.qr.label": "1. Leia este código QR", + "login.totp.enable.qr.help": "Não consegue ler o código? Adicione a chave de configuração {secret} manualmente à sua aplicação de autenticação.", + "login.totp.enable.confirm.headline": "2. Confirme com o código gerado", + "login.totp.enable.confirm.text": "A sua aplicação gera um novo código único a cada 30 segundos. Insira o código atual para concluir a configuração:", + "login.totp.enable.confirm.label": "Código atual", + "login.totp.enable.confirm.help": "Após esta configuração, iremos solicitar um código único sempre que iniciar a sessão.", + "login.totp.enable.success": "Códigos únicos ativados", + "login.totp.disable.option": "Desativar códigos únicos", + "login.totp.disable.label": "Insira a sua palavra-passe para desativar códigos únicos", + "login.totp.disable.help": "No futuro, um segundo fator diferente, como um código de início de sessão enviado por e-mail, será solicitado quando iniciar a sessão. Poderá configurar códigos únicos novamente mais tarde.", + "login.totp.disable.admin": "Isto irá desactivar os códigos únicos para {user}. No futuro, um segundo fator diferente, como um código de início de sessão enviado por e-mail, será solicitado quando eles iniciarem a sessão. {user} poderá configurar códigos únicos novamente após o próximo início de sessão.", + "login.totp.disable.success": "Códigos únicos desativados", + + "logout": "Sair", + + "merge": "Unir", + "menu": "Menu", + "meridiem": "AM/PM", + "mime": "Tipo de mídia", + "minutes": "Minutos", + + "month": "Mês", + "months.april": "Abril", + "months.august": "Agosto", + "months.december": "Dezembro", + "months.february": "Fevereiro", + "months.january": "Janeiro", + "months.july": "Julho", + "months.june": "Junho", + "months.march": "Mar\u00e7o", + "months.may": "Maio", + "months.november": "Novembro", + "months.october": "Outubro", + "months.september": "Setembro", + + "more": "Mais", + "move": "Mover", + "name": "Nome", + "next": "Próximo", + "night": "Noite", + "no": "não", + "off": "não", + "on": "sim", + "open": "Abrir", + "open.newWindow": "Abrir em nova janela", + "option": "Opção", + "options": "Opções", + "options.none": "Nenhuma opção", + "options.all": "Mostrar todas as {count} opções", + + "orientation": "Orientação", + "orientation.landscape": "Paisagem", + "orientation.portrait": "Retrato", + "orientation.square": "Quadrado", + + "page": "Página", + "page.blueprint": "Esta página não tem planta. Você pode definir sua planta em /site/blueprints/pages/{blueprint}.yml", + "page.changeSlug": "Alterar URL", + "page.changeSlug.fromTitle": "Criar a partir do t\u00edtulo", + "page.changeStatus": "Alterar estado", + "page.changeStatus.position": "Selecione uma posição", + "page.changeStatus.select": "Selecione um novo estado", + "page.changeTemplate": "Alterar tema", + "page.changeTemplate.notice": "Alterar o template da página irá remover o conteúdo dos campos que não correspondem ao mesmo tipo. Use com cuidado.", + "page.create": "Criar como {status}", + "page.delete.confirm": "Deseja realmente deletar {title}?", + "page.delete.confirm.subpages": "Esta página possui subpáginas.
Todas as subpáginas serão excluídas também.", + "page.delete.confirm.title": "Digite o título da página para confirmar", + "page.duplicate.appendix": "Copiar", + "page.duplicate.files": "Copiar arquivos", + "page.duplicate.pages": "Copiar páginas", + "page.move": "Mover página", + "page.sort": "Mudar posição", + "page.status": "Estado", + "page.status.draft": "Rascunho", + "page.status.draft.description": "A página é um rascunho, e visível somente por editores logados, ou através de um link secreto.", + "page.status.listed": "Pública", + "page.status.listed.description": "A página pública é visível para todos", + "page.status.unlisted": "Não listadas", + "page.status.unlisted.description": "Esta página é acessível somente através da URL", + + "pages": "Páginas", + "pages.empty": "Nenhuma página", + "pages.status.draft": "Rascunhos", + "pages.status.listed": "Publicadas", + "pages.status.unlisted": "Não listadas", + + "pagination.page": "Página", + + "password": "Senha", + "paste": "Colar", + "paste.after": "Colar após", + "paste.success": "{count} colados!", + "pixel": "Pixel", + "plugin": "Plugin", + "plugins": "Plugins", + "prev": "Anterior", + "preview": "Visualizar", + "remove": "Remover", + "rename": "Renomear", + "renew": "Renovar", + "replace": "Substituir", + "replace.with": "Substituir por", + "retry": "Tentar novamente", + "revert": "Descartar", + "revert.confirm": "Deseja realmente deletar todas as mudanças não salvas?", + + "role": "Papel", + "role.admin.description": "O administrador tem todos os direitos", + "role.admin.title": "Administrador", + "role.all": "Todos", + "role.empty": "Não há usuários com este papel", + "role.description.placeholder": "Sem descrição", + "role.nobody.description": "Este é um papel atribuído por padrão, sem nenhuma permissão", + "role.nobody.title": "Ninguém", + + "save": "Salvar", + "search": "Buscar", + "search.min": "Digite {min} caracteres para fazer uma busca", + "search.all": "Mostrar todos os {count} resultados", + "search.results.none": "Nenhum resultado", + + "section.invalid": "A secção é inválida", + "section.required": "Esta seção é obrigatória", + + "security": "Segurança", + "select": "Selecionar", + "server": "Servidor", + "settings": "Configurações", + "show": "Mostrar", + "site.blueprint": "Este site não tem planta. Você pode definir sua planta em /site/blueprints/site.yml", + "size": "Tamanho", + "slug": "Anexo de URL", + "sort": "Ordenar", + "sort.drag": "Arraste para ordenar ...", + "split": "Dividir", + + "stats.empty": "Nenhum relatório", + "status": "Estado", + + "system.info.copy": "Copy info", + "system.info.copied": "System info copied", + "system.issues.content": "A pasta \"content\" parece não estar protegida", + "system.issues.eol.kirby": "A versão instalada do Kirby chegou ao fim da sua vida útil e não irá receber mais atualizações de segurança", + "system.issues.eol.plugin": "A versão instalada do plugin {plugin} chegou ao fim da sua vida útil e não irá receber mais atualizações de segurança", + "system.issues.eol.php": "A versão instalada {release} de PHP chegou ao fim da sua vida útil e não irá receber mais atualizações de segurança", + "system.issues.debug": "O modo debug deve ser desativado em produção", + "system.issues.git": "A pasta \".git\" parece não estar protegida", + "system.issues.https": "Nós recomendamos HTTPS para todos os seus sites", + "system.issues.kirby": "A pasta \"kirby\" parece não estar protegida", + "system.issues.site": "A pasta \"site\" parece não estar protegida", + "system.issues.vulnerability.kirby": "A sua instalação poderá ser afetada pela seguinte vulnerabilidade ({ severity } gravidade): { description }", + "system.issues.vulnerability.plugin": "A sua instalação poderá ser afetada pela seguinte vulnerabilidade no plugin { plugin } ({ severity } gravidade): { description }", + "system.updateStatus": "Atualizar estado", + "system.updateStatus.error": "Não foi possível verificar se havia atualizações", + "system.updateStatus.not-vulnerable": "Nenhuma vulnerabilidade conhecida", + "system.updateStatus.security-update": "Atualização de segurança gratuita { version } disponível", + "system.updateStatus.security-upgrade": "Atualização { version } com correções de segurança disponível", + "system.updateStatus.unreleased": "Versão não lançada", + "system.updateStatus.up-to-date": "Atualizado", + "system.updateStatus.update": "Atualização gratuita { version } disponível", + "system.updateStatus.upgrade": "Atualização { version } disponível", + + "tel": "Telefone", + "tel.placeholder": "+351 123456789", + "template": "Tema", + "title": "Título", + "today": "Hoje", + + "toolbar.button.clear": "Limpar formatação", + "toolbar.button.code": "Código", + "toolbar.button.bold": "Negrito", + "toolbar.button.email": "Email", + "toolbar.button.headings": "Títulos", + "toolbar.button.heading.1": "Título 1", + "toolbar.button.heading.2": "Título 2", + "toolbar.button.heading.3": "Título 3", + "toolbar.button.heading.4": "Título 4", + "toolbar.button.heading.5": "Título 5", + "toolbar.button.heading.6": "Título 6", + "toolbar.button.italic": "Itálico", + "toolbar.button.file": "Arquivo", + "toolbar.button.file.select": "Selecionar arquivo", + "toolbar.button.file.upload": "Carregar arquivo", + "toolbar.button.link": "Link", + "toolbar.button.paragraph": "Parágrafo", + "toolbar.button.strike": "Riscado", + "toolbar.button.sub": "Subscrito", + "toolbar.button.sup": "Sobrescrito", + "toolbar.button.ol": "Lista ordenada", + "toolbar.button.underline": "Sublinhado", + "toolbar.button.ul": "Lista não-ordenada", + + "translation.author": "Time Kirby", + "translation.direction": "ltr", + "translation.name": "Português do Brasil", + "translation.locale": "pt_BR", + + "type": "Tipo", + + "upload": "Enviar", + "upload.error.cantMove": "O arquivo carregado não pôde ser movido", + "upload.error.cantWrite": "Falha ao escrever o arquivo no disco", + "upload.error.default": "O arquivo não pode ser carregado", + "upload.error.extension": "O carregamento do arquivo foi interrompido por causa da extensão", + "upload.error.formSize": "O arquivo carregado excede a diretiva de MAX_FILE_SIZE especificada no formulário", + "upload.error.iniPostSize": "O arquivo carregado excede a diretiva post_max_size do php.ini", + "upload.error.iniSize": "O arquivo carregado excede a diretiva upload_max_size do php.ini", + "upload.error.noFile": "Nenhum arquivo foi carregado", + "upload.error.noFiles": "Nenhum arquivo foi carregado", + "upload.error.partial": "O arquivo foi só parcialmente carregado", + "upload.error.tmpDir": "Falta uma pasta temporária", + "upload.errors": "Erro", + "upload.progress": "Enviando…", + + "url": "Url", + "url.placeholder": "https://example.com", + + "user": "Usuário", + "user.blueprint": "Você pode definir seções e campos de formulário adicionais para este papel de usuário em /site/blueprints/users/{blueprint}.yml", + "user.changeEmail": "Alterar email", + "user.changeLanguage": "Alterar idioma", + "user.changeName": "Renomear usuário", + "user.changePassword": "Alterar senha", + "user.changePassword.new": "Nova senha", + "user.changePassword.new.confirm": "Confirme a nova senha…", + "user.changeRole": "Alterar papel", + "user.changeRole.select": "Selecione um novo papel", + "user.create": "Adicionar novo usuário", + "user.delete": "Deletar este usuário", + "user.delete.confirm": "Deseja realmente deletar
{email}?", + + "users": "Usuários", + + "version": "Vers\u00e3o do Kirby", + "version.current": "Versão atual", + "version.latest": "Versão mais recente", + "versionInformation": "Informação da versão", + + "view.account": "Sua conta", + "view.installation": "Instala\u00e7\u00e3o", + "view.languages": "Idiomas", + "view.resetPassword": "Redefinir senha", + "view.site": "Site", + "view.system": "Sistema", + "view.users": "Usu\u00e1rios", + + "welcome": "Bem-vindo", + "year": "Ano", + "yes": "sim" +} diff --git a/kirby/i18n/translations/pt_PT.json b/kirby/i18n/translations/pt_PT.json new file mode 100644 index 0000000..437e127 --- /dev/null +++ b/kirby/i18n/translations/pt_PT.json @@ -0,0 +1,730 @@ +{ + "account.changeName": "Altere o seu nome", + "account.delete": "Elimine a sua conta", + "account.delete.confirm": "Tem a certeza que pretende eliminar a sua conta? A sessão será terminada imediatamente. A sua conta não poderá ser recuperada. ", + + "activate": "Ativar", + "add": "Adicionar", + "alpha": "Alpha", + "author": "Autor", + "avatar": "Foto de perfil", + "back": "Voltar", + "cancel": "Cancelar", + "change": "Alterar", + "close": "Fechar", + "changes": "Alterações", + "confirm": "Ok", + "collapse": "Colapsar", + "collapse.all": "Colapsar todos", + "color": "Cor", + "coordinates": "Coordenadas", + "copy": "Copiar", + "copy.all": "Copiar todos", + "copy.success": "{count} copiados!", + "create": "Criar", + "custom": "Personalizado", + + "date": "Data", + "date.select": "Selecione uma data", + + "day": "Dia", + "days.fri": "Sex", + "days.mon": "Seg", + "days.sat": "S\u00e1b", + "days.sun": "Dom", + "days.thu": "Qui", + "days.tue": "Ter", + "days.wed": "Qua", + + "debugging": "Depuração ", + + "delete": "Eliminar", + "delete.all": "Eliminar todos", + + "dialog.fields.empty": "Esta caixa de diálogo não tem campos", + "dialog.files.empty": "Sem ficheiros para selecionar", + "dialog.pages.empty": "Sem páginas para selecionar", + "dialog.text.empty": "Esta caixa de diálogo não define nenhum texto", + "dialog.users.empty": "Sem utilizadores para selecionar", + + "dimensions": "Dimensões", + "disable": "Desativar", + "disabled": "Desativado", + "discard": "Descartar", + + "drawer.fields.empty": "Esta janela não tem campos", + + "domain": "Domínio", + "download": "Descarregar", + "duplicate": "Duplicar", + + "edit": "Editar", + + "email": "Email", + "email.placeholder": "mail@exemplo.pt", + + "enter": "Insira", + "entries": "Registos", + "entry": "Registo", + + "environment": "Ambiente", + + "error": "Erro", + "error.access.code": "Código inválido", + "error.access.login": "Dados de acesso inválidos", + "error.access.panel": "Não tem permissões para aceder ao painel", + "error.access.view": "Não tem permissões para aceder a esta área do painel", + + "error.avatar.create.fail": "Não foi possível enviar a foto de perfil", + "error.avatar.delete.fail": "Não foi possível eliminar a foto de perfil", + "error.avatar.dimensions.invalid": "Por favor, use uma foto de perfil com largura e altura menores que 3000 pixels", + "error.avatar.mime.forbidden": "A foto de perfil deve ser um ficheiro JPEG ou PNG", + + "error.blueprint.notFound": "Não foi possível carregar o blueprint \"{name}\"", + + "error.blocks.max.plural": "Não pode adicionar mais do que {max} blocos", + "error.blocks.max.singular": "Não pode adicionar mais do que um bloco", + "error.blocks.min.plural": "Tem de adicionar pelo menos {min} blocos", + "error.blocks.min.singular": "Tem de adicionar pelo menos um bloco", + "error.blocks.validation": "Há um erro no campo \"{field}\" no bloco {index} a usar o tipo de bloco \"{fieldset}\"", + + "error.cache.type.invalid": "Tipo de cache \"{type}\" inválido", + + "error.email.preset.notFound": "A predefinição de email \"{name}\" não foi encontrada", + + "error.field.converter.invalid": "Conversor \"{converter}\" inválido", + "error.field.type.missing": "Campo \"{name}\": O tipo de campo \"{type}\" não existe", + + "error.file.changeName.empty": "O nome não pode ficar em branco", + "error.file.changeName.permission": "Não tem permissões para alterar o nome de \"{filename}\"", + "error.file.changeTemplate.invalid": "O template para o ficheiro \"{id}\" não pode ser alterado para \"{template}\" (válido: \"{blueprints}\")", + "error.file.changeTemplate.permission": "Não tem permissão para alterar o template do ficheiro \"{id}\"", + + "error.file.duplicate": "Um ficheiro com o nome \"{filename}\" já existe", + "error.file.extension.forbidden": "A extensão \"{extension}\" não é permitida", + "error.file.extension.invalid": "Extensão inválida: {extension}", + "error.file.extension.missing": "As extensões de \"{filename}\" estão em falta", + "error.file.maxheight": "A altura da imagem não deve exceder {height} pixels", + "error.file.maxsize": "O ficheiro é demasiado grande", + "error.file.maxwidth": "A largura da imagem não deve exceder {width} pixels", + "error.file.mime.differs": "O ficheiro enviado precisa de ser do tipo \"{mime}\"", + "error.file.mime.forbidden": "O tipo de mídia \"{mime}\" não é permitido", + "error.file.mime.invalid": "Tipo de mídia inválido: {mime}", + "error.file.mime.missing": "Não foi possível detectar o tipo de mídia de \"{filename}\"", + "error.file.minheight": "A altura da imagem deve ter pelo menos {height} pixels", + "error.file.minsize": "O ficheiro é demasiado pequeno", + "error.file.minwidth": "A largura da imagem deve ter pelo menos {width} pixels", + "error.file.name.unique": "O nome do ficheiro deve ser único", + "error.file.name.missing": "O nome do ficheiro não pode ficar em branco", + "error.file.notFound": "Não foi possível encontrar o ficheiro \"{filename}\"", + "error.file.orientation": "A orientação da imagem deve ser \"{orientation}\"", + "error.file.type.forbidden": "Não tem permissões para enviar ficheiros {type}", + "error.file.type.invalid": "Tipo de ficheiro inválido: {type}", + "error.file.undefined": "Não foi possível encontrar o ficheiro", + + "error.form.incomplete": "Por favor, corrija todos os erros do formulário…", + "error.form.notSaved": "Não foi possível guardar o formulário", + + "error.language.code": "Por favor, insira um código válido para o idioma", + "error.language.duplicate": "O idioma já existe", + "error.language.name": "Por favor, insira um nome válido para o idioma", + "error.language.notFound": "Não foi possível encontrar o idioma", + + "error.layout.validation.block": "Há um erro no campo \"{field}\" no bloco {blockIndex} a usar o tipo de bloco \"{fieldset}\" no layout {layoutIndex}", + "error.layout.validation.settings": "Há um erro na configuração do layout {index}", + + "error.license.domain": "O domínio da licença está em falta", + "error.license.email": "Por favor, insira um endereço de email válido", + "error.license.format": "Por favor, insira um código de licença válido", + "error.license.verification": "Não foi possível verificar a licença", + + "error.login.totp.confirm.invalid": "Código inválido", + "error.login.totp.confirm.missing": "Por favor, insira o código atual", + + "error.object.validation": "Há um erro no campo \"{label}\":\n{message}", + + "error.offline": "O painel encontra-se offline de momento", + + "error.page.changeSlug.permission": "Não tem permissões para alterar o URL de \"{slug}\"", + "error.page.changeSlug.reserved": "O caminho das páginas de nível superior não deve começar com \"{path}\"", + "error.page.changeStatus.incomplete": "A página tem erros e não pode ser publicada", + "error.page.changeStatus.permission": "O estado desta página não pode ser alterado", + "error.page.changeStatus.toDraft.invalid": "A página \"{slug}\" não pode ser convertida para rascunho", + "error.page.changeTemplate.invalid": "O template da página \"{slug}\" não pode ser alterado", + "error.page.changeTemplate.permission": "Não tem permissões para alterar o template de \"{slug}\"", + "error.page.changeTitle.empty": "O título não pode ficar em branco", + "error.page.changeTitle.permission": "Não tem permissões para alterar o título de \"{slug}\"", + "error.page.create.permission": "Não tem permissões para criar \"{slug}\"", + "error.page.delete": "A página \"{slug}\" não pode ser eliminada", + "error.page.delete.confirm": "Por favor, insira o título da página para confirmar", + "error.page.delete.hasChildren": "A página tem subpáginas e não pode ser eliminada", + "error.page.delete.permission": "Não tem permissões para eliminar \"{slug}\"", + "error.page.draft.duplicate": "Uma página de rascunho com o URL \"{slug}\" já existe", + "error.page.duplicate": "Uma página com o URL \"{slug}\" já existe", + "error.page.duplicate.permission": "Não tem permissões para duplicar \"{slug}\"", + "error.page.move.ancestor": "A página não pode ser movida para dentro dela mesma", + "error.page.move.directory": "A pasta da página não pode ser movida", + "error.page.move.duplicate": "Já existe uma subpágina com o URL \"{slug}\"", + "error.page.move.notFound": "A página movida não foi encontrada", + "error.page.move.permission": "Não tem permissões para mover \"{slug}\"", + "error.page.move.template": "O template \"{template}\" não é aceite como subpágina de \"{parent}\"", + "error.page.notFound": "Não foi possível encontrar a página \"{slug}\"", + "error.page.num.invalid": "Por favor, insira um número de ordenação válido. Este número não pode ser negativo.", + "error.page.slug.invalid": "Por favor, insira um caminho de URL válido ", + "error.page.slug.maxlength": "O URL não pode conter mais do que \"{length}\" caracteres", + "error.page.sort.permission": "Não é possível ordenar a página \"{slug}\"", + "error.page.status.invalid": "Por favor, defina um estado de página válido", + "error.page.undefined": "Não foi possível encontrar a página", + "error.page.update.permission": "Não tem permissões para atualizar \"{slug}\"", + + "error.section.files.max.plural": "Não pode adicionar mais do que {max} ficheiros à secção \"{section}\"", + "error.section.files.max.singular": "Não pode adicionar mais do que um ficheiro à secção \"{section}\"", + "error.section.files.min.plural": "A secção \"{section}\" requer no mínimo {min} ficheiros", + "error.section.files.min.singular": "A secção \"{section}\" requer no mínimo um ficheiro", + + "error.section.pages.max.plural": "Não pode adicionar mais do que {max} páginas à secção \"{section}\"", + "error.section.pages.max.singular": "Não pode adicionar mais do que uma página à secção \"{section}\"", + "error.section.pages.min.plural": "A secção \"{section}\" requer no mínimo {min} páginas", + "error.section.pages.min.singular": "A secção \"{section}\" requer no mínimo uma página", + + "error.section.notLoaded": "Não foi possível carregar a secção \"{name}\"", + "error.section.type.invalid": "O tipo de secção \"{type}\" não é válido", + + "error.site.changeTitle.empty": "O título não pode ficar em branco", + "error.site.changeTitle.permission": "Não tem permissões para alterar o título do site", + "error.site.update.permission": "Não tem permissões para atualizar o site", + + "error.structure.validation": "Existe um erro no campo \"{field}\" na linha {index}", + + "error.template.default.notFound": "O template \"default\" não existe", + + "error.unexpected": "Ocorreu um erro inesperado! Ative o modo de debug para obter mais informações: https://getkirby.com/docs/reference/system/options/debug", + + "error.user.changeEmail.permission": "Não tem permissões para alterar o email do utilizador \"{name}\"", + "error.user.changeLanguage.permission": "Não tem permissões para alterar o idioma do utilizador \"{name}\"", + "error.user.changeName.permission": "Não tem permissões para alterar o nome do utilizador \"{name}\"", + "error.user.changePassword.permission": "Não tem permissões para alterar a palavra-passe do utilizador \"{name}\"", + "error.user.changeRole.lastAdmin": "A função do último administrador não pode ser alterada", + "error.user.changeRole.permission": "Não tem permissões para alterar a função do utilizador \"{name}\"", + "error.user.changeRole.toAdmin": "Não tem permissões para promover utilizadores à função de administrador", + "error.user.create.permission": "Não tem permissões para criar este utilizador", + "error.user.delete": "Não é possível eliminar o utilizador \"{name}\"", + "error.user.delete.lastAdmin": "Não é possível eliminar o último administrador", + "error.user.delete.lastUser": "Não é possível eliminar o último utilizador", + "error.user.delete.permission": "Não tem permissões para eliminar o utilizador \"{name}\"", + "error.user.duplicate": "Já existe um utilizador com o email \"{email}\"", + "error.user.email.invalid": "Por favor, insira um endereço de email válido", + "error.user.language.invalid": "Por favor, insira um idioma válido", + "error.user.notFound": "Não foi possível encontrar o utilizador \"{name}\"", + "error.user.password.excessive": "Por favor, insira uma palavra-passe válida. As palavras-passe não devem ter mais do que 1000 caracteres.", + "error.user.password.invalid": "Por favor, insira uma palavra-passe válida. As palavras-passe devem ter pelo menos 8 caracteres.", + "error.user.password.notSame": "As palavras-passe não coincidem", + "error.user.password.undefined": "O utilizador não tem uma palavra-passe", + "error.user.password.wrong": "Palavra-passe errada", + "error.user.role.invalid": "Por favor, insira uma função válida", + "error.user.undefined": "Não foi possível encontrar o utilizador", + "error.user.update.permission": "Não tem permissões para atualizar o utilizador \"{name}\"", + + "error.validation.accepted": "Por favor, confirme", + "error.validation.alpha": "Por favor, insira apenas caracteres entre a-z", + "error.validation.alphanum": "Por favor, insira apenas caracteres entre a-z ou 0-9", + "error.validation.anchor": "Por favor, insira uma âncora de link correta", + "error.validation.between": "Por favor, insira um valor entre \"{min}\" e \"{max}\"", + "error.validation.boolean": "Por favor, confirme ou rejeite", + "error.validation.color": "Por favor, insira uma cor válida no formato {format}", + "error.validation.contains": "Por favor, insira um valor que contenha \"{needle}\"", + "error.validation.date": "Por favor, insira uma data válida", + "error.validation.date.after": "Por favor, insira uma data posterior a {date}", + "error.validation.date.before": "Por favor, insira uma data anterior a {date}", + "error.validation.date.between": "Por favor, insira uma data entre {min} e {max}", + "error.validation.denied": "Por favor, rejeite", + "error.validation.different": "O valor tem de ser diferente de \"{other}\"", + "error.validation.email": "Por favor, insira um endereço de email válido", + "error.validation.endswith": "O valor tem de terminar com \"{end}\"", + "error.validation.filename": "Por favor, insira um nome de ficheiro válido", + "error.validation.in": "Por favor, insira um dos seguintes valores: ({in})", + "error.validation.integer": "Por favor, insira um número inteiro válido", + "error.validation.ip": "Por favor, insira um endereço de IP válido", + "error.validation.less": "Por favor, insira um valor menor que {max}", + "error.validation.linkType": "O tipo de link não é permitido", + "error.validation.match": "O valor não corresponde ao padrão esperado", + "error.validation.max": "Por favor, insira um valor igual ou menor que {max}", + "error.validation.maxlength": "Por favor, insira um valor mais curto. (máximo {max} caracteres)", + "error.validation.maxwords": "Por favor, não insira mais que {max} palavra(s)", + "error.validation.min": "Por favor, insira um valor igual ou maior que {min}", + "error.validation.minlength": "Por favor, insira um valor mais longo. (mínimo {min} caracteres)", + "error.validation.minwords": "Por favor, insira pelo menos {min} palavra(s)", + "error.validation.more": "Por favor, insira um valor maior que {min}", + "error.validation.notcontains": "Por favor, insira um valor que não contenha \"{needle}\"", + "error.validation.notin": "Por favor, não insira nenhum destes valores: ({notIn})", + "error.validation.option": "Por favor, selecione uma opção válida", + "error.validation.num": "Por favor, insira um número válido", + "error.validation.required": "Por favor, insira algo", + "error.validation.same": "Por favor, insira \"{other}\"", + "error.validation.size": "O tamanho do valor tem de ser \"{size}\"", + "error.validation.startswith": "O valor tem de começar com \"{start}\"", + "error.validation.tel": "Por favor, insira um número de telefone não formatado", + "error.validation.time": "Por favor, insira uma hora válida", + "error.validation.time.after": "Por favor, insira uma hora posterior a {time}", + "error.validation.time.before": "Por favor, insira uma hora anterior a {time}", + "error.validation.time.between": "Por favor, insira uma hora entre {min} e {max}", + "error.validation.uuid": "Por favor, insira um UUID válido", + "error.validation.url": "Por favor, insira um URL válido", + + "expand": "Expandir", + "expand.all": "Expandir todos", + + "field.invalid": "O campo é inválido", + "field.required": "O campo é obrigatório", + "field.blocks.changeType": "Alterar tipo", + "field.blocks.code.name": "Código", + "field.blocks.code.language": "Idioma", + "field.blocks.code.placeholder": "O seu código …", + "field.blocks.delete.confirm": "Tem a certeza que pretende eliminar este bloco?", + "field.blocks.delete.confirm.all": "Tem a certeza que pretende eliminar todos os blocos?", + "field.blocks.delete.confirm.selected": "Tem a certeza que pretende eliminar os blocos selecionados?", + "field.blocks.empty": "Nenhum bloco ainda", + "field.blocks.fieldsets.empty": "Nenhum tipo de bloco ainda", + "field.blocks.fieldsets.label": "Por favor, selecione um tipo de bloco …", + "field.blocks.fieldsets.paste": "Pressione {{ shortcut }} para importar layouts/blocks da sua área de transferência Só serão inseridos aqueles permitidos no campo atual.", + "field.blocks.gallery.name": "Galeria", + "field.blocks.gallery.images.empty": "Nenhuma imagem ainda", + "field.blocks.gallery.images.label": "Imagens", + "field.blocks.heading.level": "Nível ", + "field.blocks.heading.name": "Título ", + "field.blocks.heading.text": "Texto", + "field.blocks.heading.placeholder": "Título …", + "field.blocks.image.alt": "Texto alternativo", + "field.blocks.image.caption": "Legenda", + "field.blocks.image.crop": "Cortar", + "field.blocks.image.link": "Link", + "field.blocks.image.location": "Localização ", + "field.blocks.image.location.internal": "Este website", + "field.blocks.image.location.external": "Fonte externa", + "field.blocks.image.name": "Imagem", + "field.blocks.image.placeholder": "Selecionar uma imagem", + "field.blocks.image.ratio": "Proporção ", + "field.blocks.image.url": "URL da imagem", + "field.blocks.line.name": "Linha", + "field.blocks.list.name": "Lista", + "field.blocks.markdown.name": "Markdown", + "field.blocks.markdown.label": "Texto", + "field.blocks.markdown.placeholder": "Markdown …", + "field.blocks.quote.name": "Citação ", + "field.blocks.quote.text.label": "Texto", + "field.blocks.quote.text.placeholder": "Citação …", + "field.blocks.quote.citation.label": "Citação ", + "field.blocks.quote.citation.placeholder": "de …", + "field.blocks.text.name": "Texto", + "field.blocks.text.placeholder": "Texto …", + "field.blocks.video.autoplay": "Reprodução automática", + "field.blocks.video.caption": "Legenda", + "field.blocks.video.controls": "Controlos", + "field.blocks.video.location": "Localização ", + "field.blocks.video.loop": "Repetir", + "field.blocks.video.muted": "Sem som", + "field.blocks.video.name": "Vídeo ", + "field.blocks.video.placeholder": "Insira um URL de vídeo ", + "field.blocks.video.poster": "Poster", + "field.blocks.video.preload": "Pré-carregamento", + "field.blocks.video.url.label": "URL-Vídeo", + "field.blocks.video.url.placeholder": "https://youtube.com/?v=", + + "field.files.empty": "Nenhum ficheiro selecionado ainda", + + "field.layout.change": "Alterar layout", + "field.layout.delete": "Eliminar layout", + "field.layout.delete.confirm": "Tem a certeza que pretende eliminar este layout?", + "field.layout.delete.confirm.all": "Tem a certeza que pretende eliminar todos os layouts?", + "field.layout.empty": "Nenhuma linha ainda", + "field.layout.select": "Selecionar um layout", + + "field.object.empty": "Nenhuma informação ainda", + + "field.pages.empty": "Nenhuma página selecionada ainda", + + "field.structure.delete.confirm": "Tem a certeza que pretende eliminar esta linha?", + "field.structure.delete.confirm.all": "Tem a certeza que pretende eliminar todos os registos?", + "field.structure.empty": "Nenhum registo ainda", + + "field.users.empty": "Nenhum utilizador selecionado ainda", + + "fields.empty": "Nenhum campo ainda", + + "file": "Ficheiro", + "file.blueprint": "Este ficheiro ainda não tem blueprint. Pode configurar o blueprint em /site/blueprints/files/{blueprint}.yml", + "file.changeTemplate": "Alterar template", + "file.changeTemplate.notice": "Alterar o template do ficheiro irá remover o conteúdo dos campos que não correspondem ao mesmo tipo. Se o novo template definir certas regras, por exemplo dimensões de imagem, estas também serão aplicadas irreversivelmente. Use com cuidado.", + "file.delete.confirm": "Tem a certeza que pretende eliminar
{filename}?", + "file.focus.placeholder": "Definir ponto de foco", + "file.focus.reset": "Remover ponto de foco", + "file.focus.title": "Foco", + "file.sort": "Alterar posição", + + "files": "Ficheiros", + "files.empty": "Nenhum ficheiro ainda", + + "filter": "Filtro", + + "hide": "Ocultar", + "hour": "Hora", + "hue": "Tonalidade", + "import": "Importar", + "info": "Info", + "insert": "Inserir", + "insert.after": "Inserir após", + "insert.before": "Inserir antes", + "install": "Instalar", + + "installation": "Instalação", + "installation.completed": "O painel foi instalado com sucesso", + "installation.disabled": "A instalação do painel está desativada em servidores públicos por defeito. Execute a instalação numa máquina local ou ative-a com a opção panel.install.", + "installation.issues.accounts": "A pasta /site/accounts não existe ou não tem permissão de escrita", + "installation.issues.content": "A pasta /content não existe ou não tem permissão de escrita", + "installation.issues.curl": "A extensão CURL é necessária", + "installation.issues.headline": "Não foi possível instalar o painel", + "installation.issues.mbstring": "A extensão MB String é necessária", + "installation.issues.media": "A pasta /media não existe ou não tem permissão de escrita", + "installation.issues.php": "Certifique-se que está a usar o PHP 8+", + "installation.issues.sessions": "A pasta /site/sessions não existe ou não tem permissão de escrita", + + "language": "Idioma", + "language.code": "Código", + "language.convert": "Definir como por defeito", + "language.convert.confirm": "

Tem a certeza que pretende converter {name} para o idioma por defeito? Esta ação não pode ser revertida.

Se {name} tiver conteúdo não traduzido, partes do site podem ficar sem conteúdo.

", + "language.create": "Adicionar um novo idioma", + "language.default": "Idioma por defeito", + "language.delete.confirm": "Tem a certeza que pretende eliminar o idioma {name} incluindo todas as traduções? Esta ação não pode ser revertida!", + "language.deleted": "O idioma foi eliminado", + "language.direction": "Direção de leitura", + "language.direction.ltr": "Esquerda para direita", + "language.direction.rtl": "Direita para esquerda", + "language.locale": "String de localização do PHP", + "language.locale.warning": "Está a usar configurações de localização personalizadas. Corrija as mesmas no ficheiro /site/languages", + "language.name": "Nome", + "language.secondary": "Idioma secundário", + "language.settings": "Configurações de idioma", + "language.updated": "O idioma foi atualizado", + "language.variables": "Variáveis de idioma", + "language.variables.empty": "Nenhuma tradução ainda", + + "language.variable.delete.confirm": "Tem a certeza que pretende eliminar a variável {key}?", + "language.variable.key": "Chave", + "language.variable.notFound": "Não foi possível encontrar a variável", + "language.variable.value": "Valor", + + "languages": "Idiomas", + "languages.default": "Idioma por defeito", + "languages.empty": "Nenhum idioma ainda", + "languages.secondary": "Idiomas secundários", + "languages.secondary.empty": "Nenhum idioma secundário ainda", + + "license": "Licença ", + "license.activate": "Ative-a agora", + "license.activate.label": "Por favor, ative a sua licença", + "license.activate.domain": "A sua licença será ativada para {host}.", + "license.activate.local": "Está prestes a ativar a sua licença Kirby no domínio local {host}. Se este site vai ser alojado num domínio público, por favor ative-o lá. Se o domínio {host} é o que deseja para usar a sua licença, por favor continue.", + "license.activated": "Ativada", + "license.buy": "Compre uma licença", + "license.code": "Código", + "license.code.help": "Recebeu o seu código de licença por email após a compra. Por favor, copie e cole aqui.", + "license.code.label": "Por favor, insira o código da sua licença", + "license.status.active.info": "Inclui novas versões principais até {date}", + "license.status.active.label": "Licença válida", + "license.status.demo.info": "Esta é uma instalação de demonstração", + "license.status.demo.label": "Demonstração", + "license.status.inactive.info": "Renove a licença para atualizar para novas versões principais", + "license.status.inactive.label": "Nenhuma versão principal nova", + "license.status.legacy.bubble": "Pronto para renovar a sua licença?", + "license.status.legacy.info": "A sua licença não abrange esta versão", + "license.status.legacy.label": "Por favor, renove a sua licença", + "license.status.missing.bubble": "Pronto para lançar o seu site?", + "license.status.missing.info": "Sem licença válida", + "license.status.missing.label": "Por favor, ative a sua licença", + "license.manage": "Gerir as suas licenças", + "license.purchased": "Comprada", + "license.success": "Obrigado por apoiar o Kirby", + "license.unregistered.label": "Não registada", + + "link": "Link", + "link.text": "Texto do link", + + "loading": "A carregar", + + "lock.unsaved": "Alterações não guardadas", + "lock.unsaved.empty": "Não existem mais alterações não guardadas", + "lock.isLocked": "Alterações não guardadas de {email}", + "lock.unlock": "Desbloquear", + "lock.unlock.submit": "Desbloqueie e substitua alterações não guardadas de {email}", + "lock.isUnlocked": "Foi desbloqueado por outro utilizador", + + "login": "Entrar", + "login.code.label.login": "Código de início de sessão", + "login.code.label.password-reset": "Código de redefinição de palavra-passe", + "login.code.placeholder.email": "000 0000", + "login.code.placeholder.totp": "000000", + "login.code.text.email": "Se o seu endereço de email está registado, o código solicitado foi enviado por email.", + "login.code.text.totp": "Por favor, insira o código de segurança da sua aplicação de autenticação.", + "login.email.login.body": "Olá {user.nameOrEmail},\n\nRecentemente solicitou um código de início de sessão para o painel de {site}.\nO seguinte código de início de sessão será válido por {timeout} minutos:\n\n{code}\n\nSe não solicitou um código de início de sessão, por favor ignore este e-mail ou entre em contacto com o administrador se tiver dúvidas.\nPor motivos de segurança, por favor NÃO reencaminhe este e-mail.", + "login.email.login.subject": "O seu código de início de sessão", + "login.email.password-reset.body": "Olá {user.nameOrEmail},\n\nRecentemente solicitou um código de redefinição de palavra-passe para o painel de {site}.\nO seguinte código de redefinição de palavra-passe será válido por {timeout} minutos:\n\n{code}\n\nSe não solicitou um código de redefinição de palavra-passe, por favor ignore este e-mail ou entre em contacto com o administrador se tiver dúvidas.\nPor motivos de segurança, por favor NÃO reencaminhe este e-mail.", + "login.email.password-reset.subject": "O seu código de redefinição de palavra-passe", + "login.remember": "Manter sessão iniciada", + "login.reset": "Redefinir palavra-passe", + "login.toggleText.code.email": "Iniciar sessão com email", + "login.toggleText.code.email-password": "Iniciar sessão com palavra-passe", + "login.toggleText.password-reset.email": "Esqueceu a sua palavra-passe?", + "login.toggleText.password-reset.email-password": "← Voltar ao início de sessão", + "login.totp.enable.option": "Configurar códigos de segurança", + "login.totp.enable.intro": "As aplicações de autenticação podem gerar códigos de segurança que são usados como um segundo fator ao iniciar a sessão na sua conta.", + "login.totp.enable.qr.label": "1. Leia este código QR", + "login.totp.enable.qr.help": "Não consegue ler o código? Adicione a chave de configuração {secret} manualmente à sua aplicação de autenticação.", + "login.totp.enable.confirm.headline": "2. Confirme com o código gerado", + "login.totp.enable.confirm.text": "A sua aplicação gera um novo código de segurança a cada 30 segundos. Insira o código atual para concluir a configuração:", + "login.totp.enable.confirm.label": "Código atual", + "login.totp.enable.confirm.help": "Após esta configuração, iremos solicitar um código de segurança sempre que iniciar a sessão.", + "login.totp.enable.success": "Códigos de segurança ativados", + "login.totp.disable.option": "Desativar códigos de segurança", + "login.totp.disable.label": "Insira a sua palavra-passe para desativar códigos de segurança", + "login.totp.disable.help": "No futuro, um segundo fator diferente, como um código de início de sessão enviado por e-mail, será solicitado quando iniciar a sessão. Poderá configurar códigos de segurança novamente mais tarde.", + "login.totp.disable.admin": "

Isto irá desactivar os códigos de segurança para {user}.

No futuro, um segundo fator diferente, como um código de início de sessão enviado por e-mail, será solicitado quando eles iniciarem a sessão. {user} poderá configurar códigos de segurança novamente após o próximo início de sessão.

", + "login.totp.disable.success": "Códigos de segurança desativados", + + "logout": "Sair", + + "merge": "Unir", + "menu": "Menu", + "meridiem": "AM/PM", + "mime": "Tipo de Mídia", + "minutes": "Minutos", + + "month": "Mês", + "months.april": "Abril", + "months.august": "Agosto", + "months.december": "Dezembro", + "months.february": "Fevereiro", + "months.january": "Janeiro", + "months.july": "Julho", + "months.june": "Junho", + "months.march": "Mar\u00e7o", + "months.may": "Maio", + "months.november": "Novembro", + "months.october": "Outubro", + "months.september": "Setembro", + + "more": "Mais", + "move": "Mover", + "name": "Nome", + "next": "Próximo", + "night": "Noite", + "no": "não", + "off": "off", + "on": "on", + "open": "Abrir", + "open.newWindow": "Abrir numa nova janela", + "option": "Opção", + "options": "Opções", + "options.none": "Sem opções", + "options.all": "Mostrar todas as {count} opções", + + "orientation": "Orientação", + "orientation.landscape": "Paisagem", + "orientation.portrait": "Retrato", + "orientation.square": "Quadrado", + + "page": "Página", + "page.blueprint": "Esta página não tem blueprint ainda. Pode configurar o blueprint em /site/blueprints/pages/{blueprint}.yml", + "page.changeSlug": "Alterar URL", + "page.changeSlug.fromTitle": "Criar a partir do t\u00edtulo", + "page.changeStatus": "Alterar estado", + "page.changeStatus.position": "Selecione uma posição", + "page.changeStatus.select": "Selecione um novo estado", + "page.changeTemplate": "Alterar template", + "page.changeTemplate.notice": "Alterar o template da página irá remover o conteúdo dos campos que não correspondem ao mesmo tipo. Use com cuidado.", + "page.create": "Criar como {status}", + "page.delete.confirm": "Tem a certeza que pretende eliminar {title}?", + "page.delete.confirm.subpages": "Esta página tem subpáginas.
Todas as subpáginas serão eliminadas também.", + "page.delete.confirm.title": "Por favor, insira o título da página para confirmar", + "page.duplicate.appendix": "Copiar", + "page.duplicate.files": "Copiar ficheiros", + "page.duplicate.pages": "Copiar páginas", + "page.move": "Mover página", + "page.sort": "Alterar posição", + "page.status": "Estado", + "page.status.draft": "Rascunho", + "page.status.draft.description": "A página está em modo de rascunho e é visível apenas para editores com sessão iniciada ou através de um link secreto", + "page.status.listed": "Pública", + "page.status.listed.description": "A página é pública para todos", + "page.status.unlisted": "Não listada", + "page.status.unlisted.description": "Esta página é acessível apenas através de URL", + + "pages": "Páginas", + "pages.empty": "Nenhuma página ainda", + "pages.status.draft": "Rascunhos", + "pages.status.listed": "Publicadas", + "pages.status.unlisted": "Não listadas", + + "pagination.page": "Página", + + "password": "Palavra-passe", + "paste": "Colar", + "paste.after": "Colar após", + "paste.success": "{count} colados!", + "pixel": "Pixel", + "plugin": "Plugin", + "plugins": "Plugins", + "prev": "Anterior", + "preview": "Pré-visualizar", + "remove": "Remover", + "rename": "Alterar nome", + "renew": "Renovar", + "replace": "Substituir", + "replace.with": "Substituir por", + "retry": "Tentar novamente", + "revert": "Reverter", + "revert.confirm": "Tem a certeza que pretende eliminar todas as alterações não guardadas?", + + "role": "Função", + "role.admin.description": "O administrador tem todas as permissões", + "role.admin.title": "Administrador", + "role.all": "Todos", + "role.empty": "Não há utilizadores com esta função", + "role.description.placeholder": "Sem descrição", + "role.nobody.description": "Esta é uma função de recurso sem permissões", + "role.nobody.title": "Ninguém", + + "save": "Guardar", + "search": "Pesquisar", + "search.min": "Insira {min} caracteres para pesquisar", + "search.all": "Mostrar todos os {count} resultados", + "search.results.none": "Sem resultados", + + "section.invalid": "A secção é inválida", + "section.required": "A secção é obrigatória", + + "security": "Segurança", + "select": "Selecionar", + "server": "Servidor", + "settings": "Configurações", + "show": "Mostrar", + "site.blueprint": "O site não tem blueprint ainda. Pode configurar o blueprint em /site/blueprints/site.yml", + "size": "Tamanho", + "slug": "URL", + "sort": "Ordenar", + "sort.drag": "Arraste para ordenar ...", + "split": "Dividir", + + "stats.empty": "Sem relatórios", + "status": "Estado", + + "system.info.copy": "Copy info", + "system.info.copied": "System info copied", + "system.issues.content": "A pasta content parece não estar protegida", + "system.issues.eol.kirby": "A versão instalada do Kirby chegou ao fim da sua vida útil e não irá receber mais atualizações de segurança", + "system.issues.eol.plugin": "A versão instalada do plugin { plugin } chegou ao fim da sua vida útil e não irá receber mais atualizações de segurança", + "system.issues.eol.php": "A versão instalada { release } de PHP chegou ao fim da sua vida útil e não irá receber mais atualizações de segurança", + "system.issues.debug": "O modo debug deve ser desativado em produção", + "system.issues.git": "A pasta .git parece não estar protegida", + "system.issues.https": "Nós recomendamos HTTPS para todos os seus sites", + "system.issues.kirby": "A pasta kirby parece não estar protegida", + "system.issues.site": "A pasta site parece não estar protegida", + "system.issues.vulnerability.kirby": "A sua instalação poderá ser afetada pela seguinte vulnerabilidade ({ severity } gravidade): { description }", + "system.issues.vulnerability.plugin": "A sua instalação poderá ser afetada pela seguinte vulnerabilidade no plugin { plugin } ({ severity } gravidade): { description }", + "system.updateStatus": "Atualizar estado", + "system.updateStatus.error": "Não foi possível verificar se havia atualizações", + "system.updateStatus.not-vulnerable": "Nenhuma vulnerabilidade conhecida", + "system.updateStatus.security-update": "Atualização de segurança gratuita { version } disponível", + "system.updateStatus.security-upgrade": "Atualização { version } com correções de segurança disponível", + "system.updateStatus.unreleased": "Versão não lançada", + "system.updateStatus.up-to-date": "Atualizado", + "system.updateStatus.update": "Atualização gratuita { version } disponível", + "system.updateStatus.upgrade": "Atualização { version } disponível", + + "tel": "Telefone", + "tel.placeholder": "+351912345678", + "template": "Template", + "title": "Título", + "today": "Hoje", + + "toolbar.button.clear": "Limpar formatação", + "toolbar.button.code": "Código", + "toolbar.button.bold": "Negrito", + "toolbar.button.email": "Email", + "toolbar.button.headings": "Títulos", + "toolbar.button.heading.1": "Título 1", + "toolbar.button.heading.2": "Título 2", + "toolbar.button.heading.3": "Título 3", + "toolbar.button.heading.4": "Título 4", + "toolbar.button.heading.5": "Título 5", + "toolbar.button.heading.6": "Título 6", + "toolbar.button.italic": "Itálico", + "toolbar.button.file": "Ficheiro", + "toolbar.button.file.select": "Selecione um ficheiro", + "toolbar.button.file.upload": "Envie um ficheiro", + "toolbar.button.link": "Link", + "toolbar.button.paragraph": "Parágrafo", + "toolbar.button.strike": "Rasurado", + "toolbar.button.sub": "Subscrito", + "toolbar.button.sup": "Sobrescrito", + "toolbar.button.ol": "Lista ordenada", + "toolbar.button.underline": "Sublinhado", + "toolbar.button.ul": "Lista não-ordenada", + + "translation.author": "Equipa Kirby", + "translation.direction": "ltr", + "translation.name": "Português (Portugal)", + "translation.locale": "pt_PT", + + "type": "Tipo", + + "upload": "Enviar", + "upload.error.cantMove": "Não foi possível mover o ficheiro enviado", + "upload.error.cantWrite": "Não foi possível guardar o ficheiro em disco", + "upload.error.default": "Não foi possível enviar o ficheiro", + "upload.error.extension": "O envio do ficheiro foi interrompido devido à extensão", + "upload.error.formSize": "O ficheiro enviado excede a diretiva MAX_FILE_SIZE especificada no formulário", + "upload.error.iniPostSize": "O ficheiro enviado excede a diretiva post_max_size do php.ini", + "upload.error.iniSize": "O ficheiro enviado excede a diretiva upload_max_filesize do php.ini", + "upload.error.noFile": "Nenhum ficheiro foi enviado", + "upload.error.noFiles": "Nenhum ficheiro foi enviado", + "upload.error.partial": "O ficheiro foi enviado apenas parcialmente", + "upload.error.tmpDir": "Pasta temporária em falta", + "upload.errors": "Erro", + "upload.progress": "A enviar…", + + "url": "URL", + "url.placeholder": "https://exemplo.pt", + + "user": "Utilizador", + "user.blueprint": "Pode definir secções adicionais e campos de formulário para esta função de utilizador em /site/blueprints/users/{blueprint}.yml", + "user.changeEmail": "Alterar email", + "user.changeLanguage": "Alterar idioma", + "user.changeName": "Alterar o nome deste utilizador", + "user.changePassword": "Alterar palavra-passe", + "user.changePassword.new": "Nova palavra-passe", + "user.changePassword.new.confirm": "Confirme a nova palavra-passe…", + "user.changeRole": "Alterar função", + "user.changeRole.select": "Selecione uma nova função", + "user.create": "Adicionar um novo utilizador", + "user.delete": "Eliminar este utilizador", + "user.delete.confirm": "Tem a certeza que pretende eliminar
{email}?", + + "users": "Utilizadores", + + "version": "Versão", + "version.current": "Versão atual", + "version.latest": "Versão mais recente", + "versionInformation": "Informação da versão", + + "view.account": "A sua conta", + "view.installation": "Instala\u00e7\u00e3o", + "view.languages": "Idiomas", + "view.resetPassword": "Redefinir palavra-passe", + "view.site": "Site", + "view.system": "Sistema", + "view.users": "Utilizadores", + + "welcome": "Bem-vindo", + "year": "Ano", + "yes": "sim" +} diff --git a/kirby/i18n/translations/ro.json b/kirby/i18n/translations/ro.json new file mode 100644 index 0000000..51cd677 --- /dev/null +++ b/kirby/i18n/translations/ro.json @@ -0,0 +1,730 @@ +{ + "account.changeName": "Schimbă-ți numele", + "account.delete": "Șterge-ți contul", + "account.delete.confirm": "Chiar vrei să îți ștergi contul? Vei fi deconectat imediat. Contul nu poate fi recuperat.", + + "activate": "Activează", + "add": "Adaug\u0103", + "alpha": "Alfa", + "author": "Autor", + "avatar": "Imagine de profil", + "back": "Înapoi", + "cancel": "Anulează", + "change": "Modific\u0103", + "close": "\u00cenchide", + "changes": "Schimbări", + "confirm": "Ok", + "collapse": "Pliază", + "collapse.all": "Pliază toate", + "color": "Culoare", + "coordinates": "Coordonate", + "copy": "Copiază", + "copy.all": "Copiază toate", + "copy.success": "Copiat {count}!", + "create": "Creează", + "custom": "Personalizat", + + "date": "Data", + "date.select": "Alege o dată", + + "day": "Ziua", + "days.fri": "Vin", + "days.mon": "Lun", + "days.sat": "S\u00e2m", + "days.sun": "Dum", + "days.thu": "Joi", + "days.tue": "Mar", + "days.wed": "Mie", + + "debugging": "Depanare", + + "delete": "\u0218terge", + "delete.all": "Șterge toate", + + "dialog.fields.empty": "Acest dialog nu are niciun câmp", + "dialog.files.empty": "Nu există fișiere de selectat", + "dialog.pages.empty": "Nu există pagini de selectat", + "dialog.text.empty": "Acest dialog nu definește niciun text", + "dialog.users.empty": "Nu există utilizatori de selectat", + + "dimensions": "Dimensiuni", + "disable": "Dezactivați", + "disabled": "Dezactivat", + "discard": "Renun\u021b\u0103", + + "drawer.fields.empty": "Acest sertar nu are niciun câmp", + + "domain": "Domeniu", + "download": "Descarcă", + "duplicate": "Duplică", + + "edit": "Editeaz\u0103", + + "email": "E-mail", + "email.placeholder": "email@exemplu.com", + + "enter": "Introdu", + "entries": "Întregistrări", + "entry": "Înregistrare", + + "environment": "Mediu", + + "error": "Eroare", + "error.access.code": "Cod nevalid", + "error.access.login": "Conectare nevalidă", + "error.access.panel": "Nu ai voie să accesezi panoul", + "error.access.view": "Nu ai voie să accesezi această parte a panoului", + + "error.avatar.create.fail": "Imaginea de profil nu a putut fi încărcată", + "error.avatar.delete.fail": "Imaginea de profil nu a putut fi ștearsă", + "error.avatar.dimensions.invalid": "Păstrează te rog lățimea și înălțimea imaginii de profil sub 3000 de pixeli", + "error.avatar.mime.forbidden": "Imaginea de profil trebuie să fie un fișier JPEG sau PNG", + + "error.blueprint.notFound": "Blueprint-ul \"{name}\" nu a putut fi încărcat", + + "error.blocks.max.plural": "Nu poți adăuga mai mult de {max} blocuri", + "error.blocks.max.singular": "Nu poți adăuga mai mult de un bloc", + "error.blocks.min.plural": "Trebuie să adaugi cel puțin {min} blocuri", + "error.blocks.min.singular": "Trebuie să adaugi cel puțin un bloc", + "error.blocks.validation": "Există o eroare la câmpul \"{field}\" în blocul {index} care folosește tipul de bloc \"{fieldset}\"", + + "error.cache.type.invalid": "Tipul de cache \"{type}\" este nevalid", + + "error.email.preset.notFound": "Preset-ul de e-mail \"{name}\" nu a fost găsit", + + "error.field.converter.invalid": "Convertorul \"{converter}\" nu este valid", + "error.field.type.missing": "Câmpul \"{ name }\": Tipul de câmp \"{ type }\" nu există", + + "error.file.changeName.empty": "Numele nu trebuie să fie gol", + "error.file.changeName.permission": "Nu ai voie să schimbi numele fișierului \"{filename}\"", + "error.file.changeTemplate.invalid": "Șablonul pentru fișierul \"{id}\" nu poate fi schimbat la \"{template}\" (valide: \"{blueprints}\")", + "error.file.changeTemplate.permission": "Nu ai voie să schimbi șablonul pentru fișierul \"{id}\"", + + "error.file.duplicate": "Există deja un fișier cu numele \"{filename}\"", + "error.file.extension.forbidden": "Extensia de fișier \"{extension}\" nu este permisă", + "error.file.extension.invalid": "Extensie de fișier nevalidă: {extension}", + "error.file.extension.missing": "Extensia de fișier pentru \"{filename}\" lipsește", + "error.file.maxheight": "Înălțimea imaginii nu poate depăși {height} pixeli", + "error.file.maxsize": "Fișierul este prea mare", + "error.file.maxwidth": "Lățimea imaginii nu poate depăși {width} pixeli", + "error.file.mime.differs": "Fișierul încărcat trebuie să aibă același tip mime \"{mime}\"", + "error.file.mime.forbidden": "Tipul media \"{mime}\" nu este permis", + "error.file.mime.invalid": "Tip mime nevalid: {mime}", + "error.file.mime.missing": "Tipul media pentru \"{filename}\" nu poate fi detectat", + "error.file.minheight": "Imaginea trebuie să aibă înălțimea de minim {height} pixeli", + "error.file.minsize": "Fișierul este prea mic", + "error.file.minwidth": "Imaginea trebuie să aibă lățimea de minim {width} pixeli", + "error.file.name.unique": "Numele fișierului trebuie să fie unic", + "error.file.name.missing": "Numele fișierului nu poate fi gol", + "error.file.notFound": "Fișierul \"{filename}\" nu a fost găsit", + "error.file.orientation": "Orientarea imaginii trebuie să fie \"{orientation}\"", + "error.file.type.forbidden": "Nu ai voie să încarci fișiere {type}", + "error.file.type.invalid": "Tip nevalid de fișier: {type}", + "error.file.undefined": "Fișierul nu a fost găsit", + + "error.form.incomplete": "Te rog repară toate erorile din formular…", + "error.form.notSaved": "Formularul nu a putut fi salvat", + + "error.language.code": "Te rog introdu un cod valid pentru limbă", + "error.language.duplicate": "Limba există deja", + "error.language.name": "Te rog introdu un nume valid pentru limbă", + "error.language.notFound": "Limba nu a fost găsită", + + "error.layout.validation.block": "Există o eroare la câmpul \"{field}\" în blocul {blockIndex} care utilizează tipul de bloc \"{fieldset}\" în aranjamentul {layoutIndex}", + "error.layout.validation.settings": "Există o eroare la setările aranjamentului {index}", + + "error.license.domain": "Domeniul pentru licență lipsește", + "error.license.email": "Te rog introdu o adresă de e-mail validă", + "error.license.format": "Te rog introdu un cod de licență valid", + "error.license.verification": "Licența nu a putut fi verificată", + + "error.login.totp.confirm.invalid": "Cod nevalid", + "error.login.totp.confirm.missing": "Vă rugăm să introduceți codul curent", + + "error.object.validation": "Există o eroare la câmpul \"{label}\":\n{message}", + + "error.offline": "Panoul este momentan offline", + + "error.page.changeSlug.permission": "Nu ai voie să schimbi apendicele URL pentru \"{slug}\"", + "error.page.changeSlug.reserved": "Calea paginilor de la primul nivel nu poate să înceapă cu \"{path}\"", + "error.page.changeStatus.incomplete": "Pagina are erori și nu poate fi publicată", + "error.page.changeStatus.permission": "Starea acestei pagini nu poate fi schimbată", + "error.page.changeStatus.toDraft.invalid": "Pagina \"{slug}\" nu poate fi schimbată în ciornă", + "error.page.changeTemplate.invalid": "Șablonul paginii \"{slug}\" nu poate fi schimbat", + "error.page.changeTemplate.permission": "Nu ai voie să schimbi șablonul pentru \"{slug}\"", + "error.page.changeTitle.empty": "Titlul nu poate rămâne gol", + "error.page.changeTitle.permission": "Nu ai voie să schimbi titlul pentru \"{slug}\"", + "error.page.create.permission": "Nu ai voie să creezi \"{slug}\"", + "error.page.delete": "Pagina \"{slug}\" nu poate fi ștearsă", + "error.page.delete.confirm": "Te rog introdu titlul paginii pentru a confirma", + "error.page.delete.hasChildren": "Pagina are subpagini și nu poate fi ștearsă", + "error.page.delete.permission": "Nu ai voie să ștergi \"{slug}\"", + "error.page.draft.duplicate": "Există deja o ciornă cu apendicele URL \"{slug}\"", + "error.page.duplicate": "Există deja o pagină cu apendicele URL \"{slug}\"", + "error.page.duplicate.permission": "Nu ai voie să duplici \"{slug}\"", + "error.page.move.ancestor": "Pagina nu poate fi mutată în ea însăși", + "error.page.move.directory": "Directorul de pagini nu poate fi mutat", + "error.page.move.duplicate": "Există deja o sub-pagină cu apendicele URL \"{slug}\"", + "error.page.move.notFound": "Pagina mutată nu a fost găsită", + "error.page.move.permission": "Nu ai voie să muți \"{slug}\"", + "error.page.move.template": "Șablonul \"{template}\" nu este acceptat ca sub-pagină a \"{parent}\"", + "error.page.notFound": "Pagina \"{slug}\" nu a fost găsită", + "error.page.num.invalid": "Te rog introdu un număr de sortare valid. Numerele nu pot fi negative.", + "error.page.slug.invalid": "Te rog introdu un apendice URL valid", + "error.page.slug.maxlength": "Lungimea slug-ului nu poate depăși \"{length}\"", + "error.page.sort.permission": "Pagina \"{slug}\" nu poate fi sortată", + "error.page.status.invalid": "Te rog stabilește o stare validă pentru pagină", + "error.page.undefined": "Pagina nu a fost găsită", + "error.page.update.permission": "Nu ai voie să actualizezi \"{slug}\"", + + "error.section.files.max.plural": "Nu poți avea mai mult de {max} fișiere în secțiunea \"{section}\"", + "error.section.files.max.singular": "Nu poți avea mai mult de un fișier în secțiunea \"{section}\"", + "error.section.files.min.plural": "Secțiunea \"{section}\" are nevoie de cel puțin {min} fișiere", + "error.section.files.min.singular": "Secțiunea \"{section}\" are nevoie de cel puțin un fișier", + + "error.section.pages.max.plural": "Nu poți avea mai mult de {max} pagini în secțiunea \"{section}\"", + "error.section.pages.max.singular": "Nu poți avea mai mult de o pagină în secțiunea \"{section}\"", + "error.section.pages.min.plural": "Secțiunea \"{section}\" are nevoie de cel puțin {min} pagini", + "error.section.pages.min.singular": "Secțiunea \"{section}\" are nevoie de cel puțin o pagină", + + "error.section.notLoaded": "Secțiunea \"{name}\" nu a putut fi încărcată", + "error.section.type.invalid": "Tipul de secțiune \"{type}\" nu este valid", + + "error.site.changeTitle.empty": "Titlul nu poate să rămână gol", + "error.site.changeTitle.permission": "Nu ai voie să schimbi titlul site-ului", + "error.site.update.permission": "Nu ai voie să actualizezi site-ul", + + "error.structure.validation": "Există o eroare la câmpul \"{field}\" pe rândul {index}", + + "error.template.default.notFound": "Șablonul implicit nu există", + + "error.unexpected": "S-a produs o eroare neașteptată! Activează modul depanare pentru mai multe informații: https://getkirby.com/docs/reference/system/options/debug", + + "error.user.changeEmail.permission": "Nu ai voie să schimbi adresa de e-mail a utilizatorului \"{name}\"", + "error.user.changeLanguage.permission": "Nu ai voie să schimbi limba utilizatorului \"{name}\"", + "error.user.changeName.permission": "Nu ai voie să schimbi numele utilizatorului \"{name}\"", + "error.user.changePassword.permission": "Nu ai voie să schimbi parola utilizatorului \"{name}\"", + "error.user.changeRole.lastAdmin": "Rolul ultimului administrator nu poate fi schimbat", + "error.user.changeRole.permission": "Nu ai voie să schimbi rolul utilizatorului \"{name}\"", + "error.user.changeRole.toAdmin": "Nu ai voie să promovezi un utilizator la rolul de administrator", + "error.user.create.permission": "Nu ai voie să creezi acest utilizator", + "error.user.delete": "Utilizatorul \"{name}\" nu poate fi șters", + "error.user.delete.lastAdmin": "Ultimul administrator nu poate fi șters", + "error.user.delete.lastUser": "Ultimul utilizator nu poate fi șters", + "error.user.delete.permission": "Nu ai voie să ștergi utilizatorul \"{name}\"", + "error.user.duplicate": "Există deja un utilizator cu adresa e-mail \"{email}\"", + "error.user.email.invalid": "Te rog introdu o adresă de e-mail validă", + "error.user.language.invalid": "Te rog introdu o limbă validă", + "error.user.notFound": "Utilizatorul \"{name}\" nu a fost găsit", + "error.user.password.excessive": "Te rog introdu o parolă validă. Parolele nu pot fi mai lungi de 1000 de caractere.", + "error.user.password.invalid": "Te rog introdu o parolă validă. Parola trebuie să aibă cel puțin 8 caractere.", + "error.user.password.notSame": "Parolele nu se potrivesc", + "error.user.password.undefined": "Utilizatorul nu are parolă", + "error.user.password.wrong": "Parolă greșită", + "error.user.role.invalid": "Te rog introdu un rol valid", + "error.user.undefined": "Utilizatorul nu a fost găsit", + "error.user.update.permission": "Nu ai voie să actualizezi utilizatorul \"{name}\"", + + "error.validation.accepted": "Te rog confirmă", + "error.validation.alpha": "Te rog introdu doar caractere din intervalul a-z", + "error.validation.alphanum": "Te rog introdu doar caractere din intervalul a-z sau cifre 0-9", + "error.validation.anchor": "Te rog introdu o ancoră corectă pentru legătură", + "error.validation.between": "Te rog introdu o valoare între \"{min}\" și \"{max}\"", + "error.validation.boolean": "Te rog confirmă sau refuză", + "error.validation.color": "Te rog introdu o culoare validă în formatul {format}", + "error.validation.contains": "Te rog introdu o valoare care conține \"{needle}\"", + "error.validation.date": "Te rog introdu o dată validă", + "error.validation.date.after": "Te rog introdu o dată după {date}", + "error.validation.date.before": "Te rog introdu o dată dinainte de {date}", + "error.validation.date.between": "Te rog introdu o dată între {min} și {max}", + "error.validation.denied": "Te rog refuză", + "error.validation.different": "Valoarea nu poate fi \"{other}\"", + "error.validation.email": "Te rog introdu o adresă de e-mail validă", + "error.validation.endswith": "Valoarea nu se poate termina cu \"{end}\"", + "error.validation.filename": "Te rog introdu un nume valid de fișier", + "error.validation.in": "Te rog introdu una dintre următoarele: ({in})", + "error.validation.integer": "Te rog introdu un număr întreg valid", + "error.validation.ip": "Te rog introdu o adresă IP validă", + "error.validation.less": "Te rog introdu o valoare mai mică decât {max}", + "error.validation.linkType": "Tipul de legătură nu este permis", + "error.validation.match": "Valoarea nu se potrivește cu forma așteptată", + "error.validation.max": "Te rog introdu o valoare mai mică sau egală cu {max}", + "error.validation.maxlength": "Te rog introdu o valoare mai scurtă. (max. {max} caractere)", + "error.validation.maxwords": "Te rog nu introduce mai mult de {max} cuvinte.", + "error.validation.min": "Te rog introdu o valoare mai mare sau egală cu {min}", + "error.validation.minlength": "Te rog introdu o valoare mai lungă. (min. {min} caractere)", + "error.validation.minwords": "Te rog introdu cel puțin {min} cuvinte", + "error.validation.more": "Te rog introdu o valoare mai mare decât {min}", + "error.validation.notcontains": "Te rog introdu o valoare care să nu conțină \"{needle}\"", + "error.validation.notin": "Te rog nu introduce niciuna dintre următoarele: ({notIn})", + "error.validation.option": "Te rog alege o opțiune validă", + "error.validation.num": "Te rog introdu un număr valid", + "error.validation.required": "Te rog introdu ceva", + "error.validation.same": "Te rog introdu \"{other}\"", + "error.validation.size": "Dimensiunea valorii trebuie să fie \"{size}\"", + "error.validation.startswith": "Valoarea trebuie să înceapă cu \"{start}\"", + "error.validation.tel": "Te rog introdu un număr de telefon neformatat", + "error.validation.time": "Te rog introdu un timp valid", + "error.validation.time.after": "Te rog introdu un timp după {time}", + "error.validation.time.before": "Te rog introdu un timp înainte de {time}", + "error.validation.time.between": "Te rog introdu un timp între {min} și {max}", + "error.validation.uuid": "Te rog introdu un UUID valid", + "error.validation.url": "Te rog introdu un URL valid", + + "expand": "Extinde", + "expand.all": "Extinde toate", + + "field.invalid": "Câmpul este nevalid", + "field.required": "Acest câmp este necesar", + "field.blocks.changeType": "Schimbă tipul", + "field.blocks.code.name": "Cod", + "field.blocks.code.language": "Limba", + "field.blocks.code.placeholder": "Codul tău …", + "field.blocks.delete.confirm": "Chiar vrei să ștergi acest bloc?", + "field.blocks.delete.confirm.all": "Chiar vrei să ștergi toate blocurile?", + "field.blocks.delete.confirm.selected": "Chiar vrei să ștergi blocurile selectate?", + "field.blocks.empty": "Niciun bloc deocamdată", + "field.blocks.fieldsets.empty": "Niciun set de câmpuri încă", + "field.blocks.fieldsets.label": "Te rog alege un tip de bloc …", + "field.blocks.fieldsets.paste": "Apasă {{ shortcut }} pentru a importa aranjamente/blocuri din clipboard Doar cele permise pentru câmpul curent vor fi inserate.", + "field.blocks.gallery.name": "Galerie", + "field.blocks.gallery.images.empty": "Nicio imagine deocamdată", + "field.blocks.gallery.images.label": "Imagini", + "field.blocks.heading.level": "Nivel", + "field.blocks.heading.name": "Subtitlu", + "field.blocks.heading.text": "Text", + "field.blocks.heading.placeholder": "Subtitlu …", + "field.blocks.image.alt": "Text alternativ", + "field.blocks.image.caption": "Etichetă", + "field.blocks.image.crop": "Decupaj", + "field.blocks.image.link": "Legătură", + "field.blocks.image.location": "Localizare", + "field.blocks.image.location.internal": "Acest website", + "field.blocks.image.location.external": "Sursă externă", + "field.blocks.image.name": "Imagine", + "field.blocks.image.placeholder": "Alege o imagine", + "field.blocks.image.ratio": "Raport", + "field.blocks.image.url": "URL-ul imaginii", + "field.blocks.line.name": "Linie", + "field.blocks.list.name": "Listă", + "field.blocks.markdown.name": "Markdown", + "field.blocks.markdown.label": "Text", + "field.blocks.markdown.placeholder": "Markdown …", + "field.blocks.quote.name": "Citat", + "field.blocks.quote.text.label": "Text", + "field.blocks.quote.text.placeholder": "Citat …", + "field.blocks.quote.citation.label": "Citare", + "field.blocks.quote.citation.placeholder": "de …", + "field.blocks.text.name": "Text", + "field.blocks.text.placeholder": "Text …", + "field.blocks.video.autoplay": "Autoredare", + "field.blocks.video.caption": "Etichetă", + "field.blocks.video.controls": "Controale", + "field.blocks.video.location": "Localizare", + "field.blocks.video.loop": "În buclă", + "field.blocks.video.muted": "Fără sonor", + "field.blocks.video.name": "Video", + "field.blocks.video.placeholder": "Introdu URL-ul video-ului", + "field.blocks.video.poster": "Poster", + "field.blocks.video.preload": "Preîncarcă", + "field.blocks.video.url.label": "URL-ul video-ului", + "field.blocks.video.url.placeholder": "https://youtube.com/?v=", + + "field.files.empty": "Niciun fișier selectat deocamdată", + + "field.layout.change": "Schimbă aranjament", + "field.layout.delete": "Șterge aranjamentul", + "field.layout.delete.confirm": "Chiar vrei să ștergi acest aranjament?", + "field.layout.delete.confirm.all": "Chiar vrei să ștergi toate aranjamentele?", + "field.layout.empty": "Niciun rând deocamdată", + "field.layout.select": "Alege un aranjament", + + "field.object.empty": "Nicio informație deocamdată", + + "field.pages.empty": "Nicio pagină aleasă deocamdată", + + "field.structure.delete.confirm": "Chiar vrei să ștergi acest rând?", + "field.structure.delete.confirm.all": "Chiar vrei să ștergi toate înregistrările?", + "field.structure.empty": "Nicio înregistrare deocamdată", + + "field.users.empty": "Niciun utilizator ales deocamdată", + + "fields.empty": "Niciun câmp deocamdată", + + "file": "Fișier", + "file.blueprint": "Acest fișier nu are încă un Blueprint. Poți să-l definești în /site/blueprints/files/{blueprint}.yml", + "file.changeTemplate": "Schimbă șablonul", + "file.changeTemplate.notice": "Schimbarea șablonului fișierului va înlătura conținutul câmpurilor care nu se potrivesc ca tip. Dacă noul șablon definește anumite reguli, de ex. dimensiuni de imagini, acestea vor fi de asemenea aplicate în mod ireversibil. Folosiți cu prudență.", + "file.delete.confirm": "Chiar vrei să ștergi
{filename}?", + "file.focus.placeholder": "Stabilește punct focal", + "file.focus.reset": "Înlătură punct focal", + "file.focus.title": "Focalizare", + "file.sort": "Schimbă poziția", + + "files": "Fișiere", + "files.empty": "Niciun fișier deocamdată", + + "filter": "Filtru", + + "hide": "Ascunde", + "hour": "Ora", + "hue": "Nuanță", + "import": "Importă", + "info": "Informații", + "insert": "Inserează", + "insert.after": "Inserează după", + "insert.before": "Inserează înainte", + "install": "Instalează", + + "installation": "Instalare", + "installation.completed": "Panoul a fost instalat", + "installation.disabled": "Instalarea panoului este dezactivată în mod implicit pe servere publice. Te rog rulează instalarea pe o mașină locală sau activează-l cu opțiunea panel.install.", + "installation.issues.accounts": "Directorul /site/accounts nu există sau nu are permisiuni de scriere.", + "installation.issues.content": "Directorul /content nu există sau nu are permisiuni de scriere.", + "installation.issues.curl": "Extensia CURL este necesară", + "installation.issues.headline": "Panoul nu poate fi instalat", + "installation.issues.mbstring": "Extensia MB String este necesară", + "installation.issues.media": "Directorul /media nu există sau nu are permisiuni de scriere", + "installation.issues.php": "Asigură-te că folosești PHP 8+", + "installation.issues.sessions": "Directorul /site/sessions folder nu există sau nu are permisiuni de scriere", + + "language": "Limba", + "language.code": "Cod", + "language.convert": "Stabilește ca implicit", + "language.convert.confirm": "

Chiar vrei să transformi {name} în limba implicită? Această modificare este ireversibilă.

Dacă {name} are conținut netradus, unele părți din site s-ar putea să nu mai aibă conținut de rezervă, și vor apărea goale.

", + "language.create": "Adaugă o limbă nouă", + "language.default": "Limba implicită", + "language.delete.confirm": "Chiar vrei să ștergi limba {name}, inclusiv toate traducerile? Această operațiune este ireversibilă.", + "language.deleted": "Limba a fost ștearsă", + "language.direction": "Direcția de citire", + "language.direction.ltr": "De la stânga la dreapta", + "language.direction.rtl": "De la dreapta la stânga", + "language.locale": "String-ul PHP locale", + "language.locale.warning": "Folosești pentru localizare o formulă manuală. Modificările le poți face în fișierul de limbă în /site/languages", + "language.name": "Nume", + "language.secondary": "Limbă secundară", + "language.settings": "Reglaje limbă", + "language.updated": "Limba a fost actualizată", + "language.variables": "Variabile limbă", + "language.variables.empty": "Nicio traducere deocamdată", + + "language.variable.delete.confirm": "Chiar vrei să ștergi variabila pentru {key}?", + "language.variable.key": "Cheie", + "language.variable.notFound": "Variabila nu a fost găsită", + "language.variable.value": "Valoare", + + "languages": "Limbi", + "languages.default": "Limba implicită", + "languages.empty": "Nu există limbi deocamdată", + "languages.secondary": "Limbi secundare", + "languages.secondary.empty": "Nu există limbi secundare deocamdată.", + + "license": "Licența", + "license.activate": "Activați acum", + "license.activate.label": "Vă rugăm să activați licența", + "license.activate.domain": "Licența va fi activată pentru {host}.", + "license.activate.local": "Sunteți pe cale să activați licența Kirby pentru domeniul local {host}. Dacă acest site va fi implementat pe un domeniu public, vă rugăm să o activați acolo în schimb. Dacă {host} este domeniul pentru care doriți să utilizați licența, vă rugăm să continuați.", + "license.activated": "Activată", + "license.buy": "Cumpără o licență", + "license.code": "Cod", + "license.code.help": "Ați primit codul de licență după achiziție prin e-mail. Vă rugăm să-l copiați și să-l inserezi aici.", + "license.code.label": "Te rog introdu codul tău de licență", + "license.status.active.info": "Include noi versiuni majore până la data de {date}", + "license.status.active.label": "Licență validă", + "license.status.demo.info": "Aceasta este o instalare demo", + "license.status.demo.label": "Demo", + "license.status.inactive.info": "Reînnoiți licența pentru a actualiza la noile versiuni majore", + "license.status.inactive.label": "Fără noi versiuni majore", + "license.status.legacy.bubble": "Sunteți pregătit să reînnoiți licența?", + "license.status.legacy.info": "Licența dvs. nu acoperă această versiune", + "license.status.legacy.label": "Vă rugăm să reînnoiți licența", + "license.status.missing.bubble": "Sunteți pregătit să lansați site-ul?", + "license.status.missing.info": "Licență nevalidă", + "license.status.missing.label": "Vă rugăm să activați licența", + "license.manage": "Gestionează-ți licențele", + "license.purchased": "Achiziționat", + "license.success": "Mulțumim că susții Kirby", + "license.unregistered.label": "Neînregistrat", + + "link": "Legătură", + "link.text": "Textul legăturii", + + "loading": "Se încarcă", + + "lock.unsaved": "Schimbări nesalvate", + "lock.unsaved.empty": "Nu mai există nicio schimbare nesalvată", + "lock.isLocked": "Schimbări nesalvate de {email}", + "lock.unlock": "Deblochează", + "lock.unlock.submit": "Deblochează și suprascrie schimbările nesalvate de {email}", + "lock.isUnlocked": "A fost deblocată de alt utilizator", + + "login": "Conectează-te", + "login.code.label.login": "Cod de conectare", + "login.code.label.password-reset": "Cod de restabilire parolă", + "login.code.placeholder.email": "000 000", + "login.code.placeholder.totp": "000000", + "login.code.text.email": "Dacă adresa de e-mail este înregistrată, codul cerut a fost trimis pe adresă.", + "login.code.text.totp": "Vă rugăm să introduceți codul unic de pe aplicația dvs. de autentificare.", + "login.email.login.body": "Salut {user.nameOrEmail},\n\nAi cerut recent un cod de conectare pentru Panoul site-ului {site}.\nCodul de conectare de mai jos va fi valid pentru următoarele {timeout} minute:\n\n{code}\n\nDacă nu tu ai cerut un cod de conectare, te rog ignoră acest e-mail sau ia legătura cu administratorul site-ului dacă ai întrebări.\nDin motive de siguranță, te rog să NU trimiți acest email mai departe.", + "login.email.login.subject": "Codul tău de conectare", + "login.email.password-reset.body": "Salut {user.nameOrEmail},\n\nAi cerut recent un cod de restabilire a parolei pentru Panoul site-ului {site}.\nCodul de restabilire a parolei de mai jos este valabil pentru următoarele {timeout} minute:\n\n{code}\n\nDacă nu tu ai cerut codul de restabilire a parolei, te rog ignoră acest e-mail sau ia legătura cu administratorul site-ului dacă ai întrebări.\nDin motive de securitate, te rog să NU trimiți acest e-mail mai departe.", + "login.email.password-reset.subject": "Codul tău de restabilire a parolei", + "login.remember": "Ține-mă conectat", + "login.reset": "Restabilește parola", + "login.toggleText.code.email": "Conectare prin e-mail", + "login.toggleText.code.email-password": "Conectare cu parola", + "login.toggleText.password-reset.email": "Ți-ai uitat parola?", + "login.toggleText.password-reset.email-password": "← Înapoi la conectare", + "login.totp.enable.option": "Configurați codurile de unică folosință", + "login.totp.enable.intro": "Aplicațiile de autentificare pot genera coduri de unică folosință utilizate ca al doilea factor la autentificarea în contul dvs.", + "login.totp.enable.qr.label": "1. Scanați acest cod QR", + "login.totp.enable.qr.help": "Nu puteți scana? Adăugați manual cheia de configurare {secret} în aplicația dvs. de autentificare.", + "login.totp.enable.confirm.headline": "2. Confirmați cu codul generat", + "login.totp.enable.confirm.text": "Aplicația dvs. generează un nou cod de unică folosință la fiecare 30 de secunde. Introduceți codul curent pentru a finaliza configurarea:", + "login.totp.enable.confirm.label": "Cod curent", + "login.totp.enable.confirm.help": "După această configurare, vă vom solicita un cod de unică folosință de fiecare dată când vă autentificați.", + "login.totp.enable.success": "Codurile de unică folosință activate", + "login.totp.disable.option": "Dezactivați codurile de unică folosință", + "login.totp.disable.label": "Introduceți parola pentru a dezactiva codurile de unică folosință", + "login.totp.disable.help": "În viitor, va fi solicitat un al doilea factor diferit, cum ar fi un cod de autentificare trimis prin e-mail, atunci când vă autentificați. Puteți configura din nou codurile de unică folosință oricând mai târziu.", + "login.totp.disable.admin": "

Această acțiune va dezactiva codurile de unică folosință pentru {user}.

În viitor, se va solicita un al doilea factor diferit, cum ar fi un cod de autentificare trimis prin e-mail, atunci când se autentifică. {user} poate configura din nou codurile de unică folosință după următoarea autentificare.", + "login.totp.disable.success": "Codurile de unică folosință dezactivate", + + "logout": "Deconectare", + + "merge": "Îmbină", + "menu": "Meniu", + "meridiem": "AM/PM", + "mime": "Tipul media", + "minutes": "Minute", + + "month": "Luna", + "months.april": "Aprilie", + "months.august": "August", + "months.december": "Decembrie", + "months.february": "Februarie", + "months.january": "Ianuarie", + "months.july": "Iulie", + "months.june": "Iunie", + "months.march": "Martie", + "months.may": "Mai", + "months.november": "Noiembrie", + "months.october": "Octombrie", + "months.september": "Septembrie", + + "more": "Mai multe", + "move": "Mută", + "name": "Nume", + "next": "Următoarea", + "night": "Noapte", + "no": "nu", + "off": "oprit", + "on": "pornit", + "open": "Deschide", + "open.newWindow": "Deschide în fereastră nouă", + "option": "Opțiune", + "options": "Opțiuni", + "options.none": "Nicio opțiune", + "options.all": "Afișați toate {count} opțiunile", + + "orientation": "Orientare", + "orientation.landscape": "Landscape", + "orientation.portrait": "Portrait", + "orientation.square": "Pătrată", + + "page": "Pagină", + "page.blueprint": "Această pagină nu are încă un Blueprint. Poți să-l definești în /site/blueprints/pages/{blueprint}.yml", + "page.changeSlug": "Schimbă URL-ul", + "page.changeSlug.fromTitle": "Creează din titlu", + "page.changeStatus": "Schimbă starea", + "page.changeStatus.position": "Te rog alege o poziție", + "page.changeStatus.select": "Alege o stare nouă", + "page.changeTemplate": "Schimbă șablonul", + "page.changeTemplate.notice": "Schimbarea șablonului paginii va înlătura conținutul câmpurilor care nu se potrivesc ca tip. Folosește cu prudență.", + "page.create": "Creează ca {status}", + "page.delete.confirm": "Chiar vrei să ștergi {title}?", + "page.delete.confirm.subpages": "Această pagină are subpagini.
Subpaginile vor fi de asemenea toate șterse.", + "page.delete.confirm.title": "Introdu titlul paginii pentru a confirma", + "page.duplicate.appendix": "Copiază", + "page.duplicate.files": "Copiază fișierele", + "page.duplicate.pages": "Copiază paginile", + "page.move": "Mută pagina", + "page.sort": "Schimbă poziția", + "page.status": "Stare", + "page.status.draft": "Ciornă", + "page.status.draft.description": "Pagina este în modul ciornă și va fi vizibilă doar editorilor conectați sau printr-un link secret", + "page.status.listed": "Publică", + "page.status.listed.description": "Pagina este publică, accesibilă oricui", + "page.status.unlisted": "Nelistată", + "page.status.unlisted.description": "Pagina este accesibilă doar prin URL", + + "pages": "Pagini", + "pages.empty": "Nicio pagină deocamdată", + "pages.status.draft": "Ciorne", + "pages.status.listed": "Publicate", + "pages.status.unlisted": "Nelistate", + + "pagination.page": "Pagină", + + "password": "Parola", + "paste": "Inserează", + "paste.after": "Inserează după", + "paste.success": "inserate {count}!", + "pixel": "Pixel", + "plugin": "Plugin", + "plugins": "Plugin-uri", + "prev": "Precedenta", + "preview": "Previzualizează", + "remove": "Înlătură", + "rename": "Redenumește", + "renew": "Reînnoiți", + "replace": "\u00cenlocuie\u0219te", + "replace.with": "Înlocuiește cu", + "retry": "Încearcă din nou", + "revert": "Renunță", + "revert.confirm": "Chiar vrei să ștergi toate schimbările nesalvate?", + + "role": "Rol", + "role.admin.description": "Administratorul are toate drepturile", + "role.admin.title": "Administrator", + "role.all": "Toate", + "role.empty": "Nu există niciun utilizator cu acest rol", + "role.description.placeholder": "Nicio descriere", + "role.nobody.description": "Acesta este un rol de rezervă fără nicio permisiune.", + "role.nobody.title": "Nimeni", + + "save": "Salveaz\u0103", + "search": "Caută", + "search.min": "Introdu {min} caractere pentru a căuta", + "search.all": "Afișați toate {count} rezultatele", + "search.results.none": "Niciun rezultat", + + "section.invalid": "Secțiunea este nevalidă", + "section.required": "Această secțiune este necesară", + + "security": "Securitate", + "select": "Alege", + "server": "Server", + "settings": "Reglaje", + "show": "Arată", + "site.blueprint": "Site-ul nu are încă un Blueprint. Poți să-l definești în /site/blueprints/site.yml", + "size": "Dimensiune", + "slug": "Apendicele URL", + "sort": "Sortare", + "sort.drag": "Trage pt. a sorta …", + "split": "Împarte", + + "stats.empty": "Niciun raport", + "status": "Stare", + + "system.info.copy": "Copy info", + "system.info.copied": "System info copied", + "system.issues.content": "Directorul de conținut pare să fie expus", + "system.issues.eol.kirby": "Versiunea instalată de Kirby a ajuns la sfârșitul vieții utile și nu va mai primi actualizări de securitate.", + "system.issues.eol.plugin": "Versiunea instalată a plugin-ului { plugin } a ajuns la sfârșitul vieții utile și nu va mai primi actualizări de securitate.", + "system.issues.eol.php": "Versiunea PHP instalată { release } a ajuns la sfârșitul vieții și nu va mai primi actualizări de securitate", + "system.issues.debug": "Modul depanare trebuie să fie oprit în producție", + "system.issues.git": "Directorul .git pare să fie expus", + "system.issues.https": "Recomandăm HTTPS pentru toate site-urile.", + "system.issues.kirby": "Directorul Kirby pare să fie expus", + "system.issues.site": "Directorul site pare să fie expus", + "system.issues.vulnerability.kirby": "Instalarea ta ar putea fi afectată de următoarea vulnerabilitate ({ severity } severity): { description }", + "system.issues.vulnerability.plugin": "Instalarea ta ar putea fi afectată de următoarea vulnerabilitate în plugin-ul { plugin } ({ severity } severity): { description }", + "system.updateStatus": "Starea actualizării", + "system.updateStatus.error": "Nu am putut căuta actualizări", + "system.updateStatus.not-vulnerable": "Nicio vulnerabilitate cunoscută", + "system.updateStatus.security-update": "Actualizare gratuită de securitate { version } disponibilă", + "system.updateStatus.security-upgrade": "Actualizarea { version } cu reparații de securitate disponibilă", + "system.updateStatus.unreleased": "Versiune nelansată", + "system.updateStatus.up-to-date": "La zi", + "system.updateStatus.update": "Actualizare gratuită { version } disponibilă", + "system.updateStatus.upgrade": "Actualizare { version } disponibilă", + + "tel": "Telefon", + "tel.placeholder": "+40123456789", + "template": "Șablon", + "title": "Titlu", + "today": "Astăzi", + + "toolbar.button.clear": "Elimină formatarea", + "toolbar.button.code": "Cod", + "toolbar.button.bold": "Bold", + "toolbar.button.email": "Adresă e-mail", + "toolbar.button.headings": "Subtitluri", + "toolbar.button.heading.1": "Subtitlu 1", + "toolbar.button.heading.2": "Subtitlu 2", + "toolbar.button.heading.3": "Subtitlu 3", + "toolbar.button.heading.4": "Subtitlu 4", + "toolbar.button.heading.5": "Subtitlu 5", + "toolbar.button.heading.6": "Subtitlu 6", + "toolbar.button.italic": "Italic", + "toolbar.button.file": "Fișier", + "toolbar.button.file.select": "Alege un fișier", + "toolbar.button.file.upload": "Încarcă un fișier", + "toolbar.button.link": "Link", + "toolbar.button.paragraph": "Paragraf", + "toolbar.button.strike": "Tăiat", + "toolbar.button.sub": "Indice", + "toolbar.button.sup": "Exponent", + "toolbar.button.ol": "Listă ordonată", + "toolbar.button.underline": "Subliniat", + "toolbar.button.ul": "Listă cu puncte", + + "translation.author": "Echipa Kirby", + "translation.direction": "ltr", + "translation.name": "Rom\u00e2n\u0103", + "translation.locale": "ro_RO", + + "type": "Tip", + + "upload": "Încarcă", + "upload.error.cantMove": "Fișierul încărcat nu a putut fi mutat", + "upload.error.cantWrite": "Nu s-a putut scrie fișierul pe disc", + "upload.error.default": "Fișierul nu a putut fi încărcat", + "upload.error.extension": "Încărcarea fișierelor oprită de extensie", + "upload.error.formSize": "Fișierul încărcat depășește directiva MAX_FILE_SIZE specificată în formular", + "upload.error.iniPostSize": "Fișierul încărcat depășește directiva post_max_size din php.ini", + "upload.error.iniSize": "Fișierul încărcat depășește directiva upload_max_filesize din php.ini", + "upload.error.noFile": "Nu a fost încărcat niciun fișier", + "upload.error.noFiles": "Nu au fost încărcate fișiere", + "upload.error.partial": "Fișierul a fost încărcat doar parțial", + "upload.error.tmpDir": "Lipsește un director temporar", + "upload.errors": "Eroare", + "upload.progress": "Se încarcă...", + + "url": "Url", + "url.placeholder": "https://example.com", + + "user": "Utilizator", + "user.blueprint": "Poți defini secțiuni și câmpuri de formular suplimentare pentru acest rol de utilizator în /site/blueprints/users/{blueprint}.yml", + "user.changeEmail": "Schimbă adresa de e-mail", + "user.changeLanguage": "Schimbă limba", + "user.changeName": "Redenumește acest utilizator", + "user.changePassword": "Schimbă parola", + "user.changePassword.new": "Parola nouă", + "user.changePassword.new.confirm": "Confirmă parola nouă...", + "user.changeRole": "Schimbă rolul", + "user.changeRole.select": "Alege un rol nou", + "user.create": "Adaugă un nou utilizator", + "user.delete": "Șterge acest utilizator", + "user.delete.confirm": "Chiar vrei să ștergi
{email}?", + + "users": "Utilizatori", + + "version": "Versiune", + "version.current": "Versiunea curentă", + "version.latest": "Ultima versiune", + "versionInformation": "Informații despre versiune", + + "view.account": "Contul t\u0103u", + "view.installation": "Instalare", + "view.languages": "Limbi", + "view.resetPassword": "Restabilește parola", + "view.site": "Site", + "view.system": "Sistem", + "view.users": "Utilizatori", + + "welcome": "Bun venit", + "year": "Anul", + "yes": "da" +} diff --git a/kirby/i18n/translations/ru.json b/kirby/i18n/translations/ru.json new file mode 100644 index 0000000..4d4e859 --- /dev/null +++ b/kirby/i18n/translations/ru.json @@ -0,0 +1,730 @@ +{ + "account.changeName": "Изменить имя", + "account.delete": "Удалить пользователя", + "account.delete.confirm": "Вы действительно хотите удалить свой аккаунт? Вы сразу покинете панель управления, а аккаунт нельзя будет восстановить.", + + "activate": "Активировать", + "add": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c", + "alpha": "Альфа", + "author": "Автор", + "avatar": "\u0410\u0432\u0430\u0442\u0430\u0440 (\u0444\u043e\u0442\u043e)", + "back": "Назад", + "cancel": "\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c", + "change": "\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c", + "close": "\u0417\u0430\u043a\u0440\u044b\u0442\u044c", + "changes": "Изменения", + "confirm": "Ок", + "collapse": "Свернуть", + "collapse.all": "Свернуть все", + "color": "Цвет", + "coordinates": "Координаты", + "copy": "Скопировать", + "copy.all": "Копировать все", + "copy.success": "{count} скопировано", + "create": "Создать", + "custom": "Другое", + + "date": "Дата", + "date.select": "Выберите дату", + + "day": "День", + "days.fri": "\u041f\u0442", + "days.mon": "\u041f\u043d", + "days.sat": "\u0421\u0431", + "days.sun": "\u0412\u0441", + "days.thu": "\u0427\u0442", + "days.tue": "\u0412\u0442", + "days.wed": "\u0421\u0440", + + "debugging": "Отладка", + + "delete": "\u0423\u0434\u0430\u043b\u0438\u0442\u044c", + "delete.all": "Удалить все", + + "dialog.fields.empty": "Для этого окна нет полей", + "dialog.files.empty": "Нет файлов для выбора", + "dialog.pages.empty": "Нет страниц для выбора", + "dialog.text.empty": "Окно не содержит никакого текста", + "dialog.users.empty": "Нет пользователей для выбора", + + "dimensions": "Размеры", + "disable": "Отключить", + "disabled": "Отключено", + "discard": "\u0421\u0431\u0440\u043e\u0441", + + "drawer.fields.empty": "Нет полей", + + "domain": "Домен", + "download": "Скачать", + "duplicate": "Дублировать", + + "edit": "\u041d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c", + + "email": "Email", + "email.placeholder": "mail@example.com", + + "enter": "Введите", + "entries": "Записи", + "entry": "Запись", + + "environment": "Среда", + + "error": "Ошибка", + "error.access.code": "Неверный код", + "error.access.login": "Неверный логин или пароль", + "error.access.panel": "У вас нет права доступа к панели", + "error.access.view": "У вас нет прав доступа к этой части панели", + + "error.avatar.create.fail": "Не удалось загрузить фотографию профиля", + "error.avatar.delete.fail": "\u0410\u0432\u0430\u0442\u0430\u0440 (\u0444\u043e\u0442\u043e) \u043a \u0430\u043a\u043a\u0430\u0443\u043d\u0442\u0443 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0443\u0434\u0430\u043b\u0435\u043d", + "error.avatar.dimensions.invalid": "Пожалуйста, сделайте чтобы ширина или высота фотографии была меньше 3000 пикселей", + "error.avatar.mime.forbidden": "Фотография профиля должна быть JPEG или PNG", + + "error.blueprint.notFound": "Не удалось загрузить разметку \"{name}\"", + + "error.blocks.max.plural": "Вы не можете добавить больше {max} блоков", + "error.blocks.max.singular": "Вы не можете добавить больше одного блока", + "error.blocks.min.plural": "Вы должны добавить хотя бы {min} блоков", + "error.blocks.min.singular": "Вы должны добавить хотя бы один блок", + "error.blocks.validation": "Ошибка в поле \"{field}\" в блоке {index} типа \"{fieldset}\"", + + "error.cache.type.invalid": "Неверный тип кэша: \"{type}\"", + + "error.email.preset.notFound": "Email-шаблон \"{name}\" не найден", + + "error.field.converter.invalid": "Неверный конвертер \"{converter}\"", + "error.field.type.missing": "Поле \"{ name }\": тип поля \"{ type }\" не существует", + + "error.file.changeName.empty": "Название не может быть пустым", + "error.file.changeName.permission": "У вас нет права изменить название \"{filename}\"", + "error.file.changeTemplate.invalid": "Шаблон для файла \"{id}\" не может быть изменен на \"{template}\" (допускается: \"{blueprints}\")", + "error.file.changeTemplate.permission": "У вас нет права изменять шаблон для файла \"{id}\"", + + "error.file.duplicate": "Файл с названием \"{filename}\" уже есть", + "error.file.extension.forbidden": "Расширение файла \"{extension}\" неразрешено", + "error.file.extension.invalid": "Неверное разрешение: {extension}", + "error.file.extension.missing": "Файлу \"{filename}\" не хватает расширения", + "error.file.maxheight": "Высота изображения не должна превышать {height} px", + "error.file.maxsize": "Файл слишком большой", + "error.file.maxwidth": "Ширина изображения не должна превышать {width} px", + "error.file.mime.differs": "Загружаемый файл должен иметь такое же расширение (тип): \"{mime}\"", + "error.file.mime.forbidden": "Расширение (тип) \"{mime}\" не допускается", + "error.file.mime.invalid": "Неверное расширение (тип): {mime}", + "error.file.mime.missing": "Не удалось определить тип медиа для файла \"{filename}\"", + "error.file.minheight": "Высота файла должна быть хотя бы {height} px", + "error.file.minsize": "Файл слишком маленький", + "error.file.minwidth": "Ширина файла должна быть хотя бы {width} px", + "error.file.name.unique": "Название файла должно быть уникальным", + "error.file.name.missing": "Название файла не может быть пустым", + "error.file.notFound": "\u0424\u0430\u0439\u043b \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d", + "error.file.orientation": "Ориентация изображения должна быть \"{orientation}\"", + "error.file.type.forbidden": "У вас нет права загружать файлы {type}", + "error.file.type.invalid": "Неверный тип файла: {type}", + "error.file.undefined": "\u0424\u0430\u0439\u043b \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d", + + "error.form.incomplete": "Пожалуйста, исправьте все ошибки в форме", + "error.form.notSaved": "Форма не может быть сохранена", + + "error.language.code": "Пожалуйста, впишите правильный код языка", + "error.language.duplicate": "Язык уже есть", + "error.language.name": "Пожалуйста, впишите правильное название языка", + "error.language.notFound": "Не получилось найти этот язык", + + "error.layout.validation.block": "Ошибка в поле \"{field}\" в блоке {blockIndex} типа \"{fieldset}\" внутри разметки {layoutIndex}", + "error.layout.validation.settings": "Ошибка в настройках макета {index}", + + "error.license.domain": "Лицензия на этот домен отсутствует", + "error.license.email": "Пожалуйста, введите правильный Email", + "error.license.format": "Пожалуйста, введите правильный лицензионный код", + "error.license.verification": "Лицензия не подтверждена", + + "error.login.totp.confirm.invalid": "Неверный код", + "error.login.totp.confirm.missing": "Пожалуйста, введите текущий код", + + "error.object.validation": "Ошибка в поле \"{label}\":\n{message}", + + "error.offline": "Панель управления не в сети", + + "error.page.changeSlug.permission": "\u0412\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c URL \u044d\u0442\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b", + "error.page.changeSlug.reserved": "Путь к страницам верхнего уровня не должен начинаться с \"{path}\"", + "error.page.changeStatus.incomplete": "На странице есть ошибки и поэтому ее нельзя опубликовать", + "error.page.changeStatus.permission": "Невозможно изменить статус для этой страницы", + "error.page.changeStatus.toDraft.invalid": "Невозможно конвертировать в черновик страницу \"{slug}\"", + "error.page.changeTemplate.invalid": "Невозможно изменить шаблон страницы \"{slug}\"", + "error.page.changeTemplate.permission": "У вас нет права изменять шаблон для \"{slug}\"", + "error.page.changeTitle.empty": "Название не может быть пустым", + "error.page.changeTitle.permission": "у вас нет права изменять название \"{slug}\"", + "error.page.create.permission": "У вас нет права создать \"{slug}\"", + "error.page.delete": "Невозможно удалить страницу \"{slug}\"", + "error.page.delete.confirm": "Впишите название страницы чтобы подтвердить", + "error.page.delete.hasChildren": "У страницы есть внутренние страницы, поэтому ее невозможно удалить", + "error.page.delete.permission": "У вас нет права удалить \"{slug}\"", + "error.page.draft.duplicate": "Черновик страницы с URL \"{slug}\" уже есть", + "error.page.duplicate": "Страница с URL \"{slug}\" уже есть", + "error.page.duplicate.permission": "У вас нет права дублировать \"{slug}\"", + "error.page.move.ancestor": "Невозможно переместить страницу саму в себя", + "error.page.move.directory": "Невозможно перенести каталог страницы", + "error.page.move.duplicate": "Подстраница с URL \"{slug}\" уже существует", + "error.page.move.notFound": "Перемещенная страница не найдена", + "error.page.move.permission": "У вас нет права переместить \"{slug}\"", + "error.page.move.template": "Шаблон \"{template}\" не разрешен для подстраниц \"{parent}\"", + "error.page.notFound": "\u0421\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430", + "error.page.num.invalid": "Пожалуйста, впишите правильное число сортировки. Число не может быть отрицательным.", + "error.page.slug.invalid": "Пожалуйста, введите правильный URL", + "error.page.slug.maxlength": "Длина ссылки должна быть короче \"{length}\" символов", + "error.page.sort.permission": "Невозможно сортировать страницу \"{slug}\"", + "error.page.status.invalid": "Пожалуйста, установите верный статус страницы", + "error.page.undefined": "\u0421\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430", + "error.page.update.permission": "У вас нет права обновить \"{slug}\"", + + "error.section.files.max.plural": "Нельзя добавить больше чем {max} файлов в секции \"{section}\"", + "error.section.files.max.singular": "Можно добавить не больше 1 файла в секции \"{section}\"", + "error.section.files.min.plural": "Секция \"{section}\" требует хотя бы {min} файлов", + "error.section.files.min.singular": "Секция \"{section}\" требует хотя бы 1 файл", + + "error.section.pages.max.plural": "Можно добавить не больше {max} страниц в секции \"{section}\"", + "error.section.pages.max.singular": "Нельзя добавить больше чем 1 страницу в секции \"{section}\"", + "error.section.pages.min.plural": "Секция \"{section}\" требует хотя бы {min} страниц", + "error.section.pages.min.singular": "Секция \"{section}\" требует хотя бы одну страницу", + + "error.section.notLoaded": "Секция \"{name}\" не может быть загружена", + "error.section.type.invalid": "Тип секции {type} неверный", + + "error.site.changeTitle.empty": "Название не может быть пустым", + "error.site.changeTitle.permission": "У вас нет права изменять название сайта", + "error.site.update.permission": "У вас нет права обновить сайт", + + "error.structure.validation": "Ошибка в поле \"{field}\" в строке {index}", + + "error.template.default.notFound": "Нет шаблона по умолчанию", + + "error.unexpected": "Произошла непредвиденная ошибка! Включите режим отладки для получения дополнительной информации: https://getkirby.com/docs/reference/system/options/debug", + + "error.user.changeEmail.permission": "У вас нет права изменять Email пользователя \"{name}\"", + "error.user.changeLanguage.permission": "У вас нет права изменять язык для пользователя \"{name}\"", + "error.user.changeName.permission": "У вас нет права изменять имя пользователя \"{name}\"", + "error.user.changePassword.permission": "У вас нет права изменять пароль для пользователя \"{name}\"", + "error.user.changeRole.lastAdmin": "Роль единственного администратора нельзя изменить", + "error.user.changeRole.permission": "У вас нет права изменять роль пользователя \"{name}\"", + "error.user.changeRole.toAdmin": "У вас нет прав предоставить роль администратора", + "error.user.create.permission": "У вас нет права создать этого пользователя", + "error.user.delete": "\u0410\u043a\u043a\u0430\u0443\u043d\u0442 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0443\u0434\u0430\u043b\u0435\u043d", + "error.user.delete.lastAdmin": "\u0412\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u0430", + "error.user.delete.lastUser": "Нельзя удалить единственного пользователя", + "error.user.delete.permission": "У вас нет права удалить пользователя \"{name}\"", + "error.user.duplicate": "Пользователь с Email \"{email}\" уже есть", + "error.user.email.invalid": "Пожалуйста, введите правильный Email", + "error.user.language.invalid": "Введите правильный язык", + "error.user.notFound": "Пользователь \"{name}\" не найден", + "error.user.password.excessive": "Пожалуйста, введите верный пароль. Длина паролей не должна превышать 1000 символов.", + "error.user.password.invalid": "Пожалуйста, введите правильный пароль. Он должен состоять минимум из 8 символов.", + "error.user.password.notSame": "\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435 \u043f\u0430\u0440\u043e\u043b\u044c", + "error.user.password.undefined": "У пользователя нет пароля", + "error.user.password.wrong": "Неверный пароль", + "error.user.role.invalid": "Введите правильную роль", + "error.user.undefined": "Аккаунт не найден", + "error.user.update.permission": "У вас нет права обновить пользователя \"{name}\"", + + "error.validation.accepted": "Пожалуйста, подтвердите", + "error.validation.alpha": "Пожалуйста, введите только буквы a-z", + "error.validation.alphanum": "Пожалуйста, введите только буквы a-z или числа 0-9", + "error.validation.anchor": "Пожалуйста, введите правильную ссылку на якорь", + "error.validation.between": "Пожалуйста, введите значение от \"{min}\" до \"{max}\"", + "error.validation.boolean": "Пожалуйста, подтвердите или отмените", + "error.validation.color": "Пожалуйста, введите верное значение цвета в формате {format}", + "error.validation.contains": "Пожалуйста, впишите значение, которое содержит \"{needle}\"", + "error.validation.date": "Пожалуйста, укажите правильную дату", + "error.validation.date.after": "Пожалуйста, укажите дату после {date}", + "error.validation.date.before": "Пожалуйста, укажите дату до {date}", + "error.validation.date.between": "Пожалуйста, укажите дату между {min} и {max}", + "error.validation.denied": "Пожалуйста отмените", + "error.validation.different": "Значение не может быть \"{other}\"", + "error.validation.email": "Пожалуйста, введите правильный Email", + "error.validation.endswith": "Значение должно заканчиваться с \"{end}\"", + "error.validation.filename": "Пожалуйста, введите правильное название файла", + "error.validation.in": "Пожалуйста, введите одно из следующих: ({in})", + "error.validation.integer": "Пожалуйста, введите правильное целое число", + "error.validation.ip": "Пожалуйста, введите правильный IP адрес", + "error.validation.less": "Пожалуйста, введите значение меньше чем {max}", + "error.validation.linkType": "Тип ссылки не допускается", + "error.validation.match": "Значение не соответствует ожидаемому шаблону", + "error.validation.max": "Пожалуйста, введите значение равное или больше чем {max}", + "error.validation.maxlength": "Пожалуйста, введите значение короче (макс. {max} символов)", + "error.validation.maxwords": "Пожалуйста, введите не более {max} слов ", + "error.validation.min": "Пожалуйста, введите значение равное или больше чем {min}", + "error.validation.minlength": "Пожалуйста, введите значение длиннее (мин. {min} символов)", + "error.validation.minwords": "Пожалуйста, введите хотя бы {min} слов", + "error.validation.more": "Пожалуйста, введите значение больше, чем {min}", + "error.validation.notcontains": "Пожалуйста, введите значение, которое не содержит \"{needle}\"", + "error.validation.notin": "Пожалуйста, не вписывайте одно из: ({notIn})", + "error.validation.option": "Пожалуйста, выберите правильную опцию ", + "error.validation.num": "Пожалуйста, введите правильный номер", + "error.validation.required": "Пожалуйста, введите что-нибудь", + "error.validation.same": "Пожалуйста, введите \"{other}\"", + "error.validation.size": "Значение размера должно быть \"{size}\"", + "error.validation.startswith": "Значение должно начинаться с \"{start}\"", + "error.validation.tel": "Пожалуйста, введите неформатированный номер телефона", + "error.validation.time": "Пожалуйста, введите правильную дату", + "error.validation.time.after": "Пожалуйста, укажите время после {time}", + "error.validation.time.before": "Пожалуйста, укажите время до {time}", + "error.validation.time.between": "Пожалуйста, укажите время между {min} и {max}", + "error.validation.uuid": "Пожалуйста, введите правильный UUID", + "error.validation.url": "Пожалуйста, введите правильный URL", + + "expand": "Развернуть", + "expand.all": "Развернуть все", + + "field.invalid": "Неверное поле", + "field.required": "Поле обязательно", + "field.blocks.changeType": "Изменить тип", + "field.blocks.code.name": "Код", + "field.blocks.code.language": "Язык", + "field.blocks.code.placeholder": "Ваш код …", + "field.blocks.delete.confirm": "Вы действительно хотите удалить этот блок?", + "field.blocks.delete.confirm.all": "Вы действительно хотите удалить все блоки?", + "field.blocks.delete.confirm.selected": "Вы действительно хотите удалить эти блоки?", + "field.blocks.empty": "Блоков нет", + "field.blocks.fieldsets.empty": "Пока нет наборов полей", + "field.blocks.fieldsets.label": "Пожалуйста, выберите тип блока…", + "field.blocks.fieldsets.paste": "Нажмите {{ shortcut }} чтобы импортировать макеты/блоки из буфера обмена Будут вставлены только те, которые разрешены в текущем поле.", + "field.blocks.gallery.name": "Галерея", + "field.blocks.gallery.images.empty": "Изображений нет", + "field.blocks.gallery.images.label": "Изображения", + "field.blocks.heading.level": "Уровень", + "field.blocks.heading.name": "Заголовок", + "field.blocks.heading.text": "Текст", + "field.blocks.heading.placeholder": "Заголовок …", + "field.blocks.image.alt": "Альтернативный текст", + "field.blocks.image.caption": "Подпись", + "field.blocks.image.crop": "Обрезать", + "field.blocks.image.link": "Ссылка", + "field.blocks.image.location": "Расположение", + "field.blocks.image.location.internal": "Этот сайт", + "field.blocks.image.location.external": "Внешний источник", + "field.blocks.image.name": "Картинка", + "field.blocks.image.placeholder": "Выберите изображение", + "field.blocks.image.ratio": "Соотношение", + "field.blocks.image.url": "URL изображения", + "field.blocks.line.name": "Линия", + "field.blocks.list.name": "Список", + "field.blocks.markdown.name": "Markdown", + "field.blocks.markdown.label": "Текст", + "field.blocks.markdown.placeholder": "Markdown …", + "field.blocks.quote.name": "Цитата", + "field.blocks.quote.text.label": "Текст", + "field.blocks.quote.text.placeholder": "Цитата …", + "field.blocks.quote.citation.label": "Цитирование", + "field.blocks.quote.citation.placeholder": "Автор …", + "field.blocks.text.name": "Текст", + "field.blocks.text.placeholder": "Текст …", + "field.blocks.video.autoplay": "Автовоспроизведение", + "field.blocks.video.caption": "Подпись", + "field.blocks.video.controls": "Элементы управления", + "field.blocks.video.location": "Расположение", + "field.blocks.video.loop": "Зациклить", + "field.blocks.video.muted": "Без звука", + "field.blocks.video.name": "Видео", + "field.blocks.video.placeholder": "Введите ссылку на видео", + "field.blocks.video.poster": "Обложка", + "field.blocks.video.preload": "Предзагрузка", + "field.blocks.video.url.label": "Ссылка на видео", + "field.blocks.video.url.placeholder": "https://youtube.com/?v=", + + "field.files.empty": "Файлы не выбраны", + + "field.layout.change": "Изменить разметку", + "field.layout.delete": "Удалить разметку", + "field.layout.delete.confirm": "Вы действительно хотите удалить эту разметку?", + "field.layout.delete.confirm.all": "Вы действительно хотите удалить всю разметку?", + "field.layout.empty": "Строк нет", + "field.layout.select": "Выберите разметку", + + "field.object.empty": "Пока нет информации", + + "field.pages.empty": "Страницы не выбраны", + + "field.structure.delete.confirm": "Вы точно хотите удалить эту запись?", + "field.structure.delete.confirm.all": "Вы действительно хотите удалить все значения?", + "field.structure.empty": "Записей нет", + + "field.users.empty": "Пользователей нет", + + "fields.empty": "Ещё нет полей", + + "file": "Файл", + "file.blueprint": "У файла пока нет разметки. Вы можете определить новые секции и поля разметки в /site/blueprints/files/{blueprint}.yml", + "file.changeTemplate": "Изменить шаблон", + "file.changeTemplate.notice": "Изменение шаблона файла приведет к удалению содержимого полей, которые не совпадут по типу. Если у нового шаблона есть определенные условия, например размер изображения, они также будут применены. Используйте с осторожностью.", + "file.delete.confirm": "Вы точно хотите удалить файл
{filename}?", + "file.focus.placeholder": "Установить фокусную точку", + "file.focus.reset": "Удалить фокусную точку", + "file.focus.title": "Фокусная точка", + "file.sort": "Изменить позицию", + + "files": "Файлы", + "files.empty": "Еще нет файлов", + + "filter": "Фильтр", + + "hide": "Скрыть", + "hour": "Час", + "hue": "Оттенок", + "import": "Импортировать", + "info": "Информация", + "insert": "\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c", + "insert.after": "Вставить ниже", + "insert.before": "Вставить выше", + "install": "Установить", + + "installation": "Установка", + "installation.completed": "Панель установлена", + "installation.disabled": "Установка панели по умолчанию отключена на общедоступных серверах. Пожалуйста запустите установку на локальном сервере или включите такую возможность с помощью опции panel.install", + "installation.issues.accounts": "Каталог /site/accounts не существует или не имеет прав записи", + "installation.issues.content": "Каталог /content не существует или не имеет прав записи", + "installation.issues.curl": "Расширение CURL необходимо", + "installation.issues.headline": "Не удалось установить панель", + "installation.issues.mbstring": "Расширение MB String необходимо", + "installation.issues.media": "Каталог /media не существует или нет прав записи", + "installation.issues.php": "Убедитесь, что используется PHP 8+", + "installation.issues.sessions": "Каталог /site/sessions не существует или нет прав записи", + + "language": "\u042f\u0437\u044b\u043a", + "language.code": "Код", + "language.convert": "Установить по умолчанию", + "language.convert.confirm": "

Вы точно хотите конвертировать {name} в главный язык? Это нельзя будет отменить.

Если {name} имеет непереведенный контент, то больше не будет верного каскада и части вашего сайта могут быть пустыми.

", + "language.create": "Добавить новый язык", + "language.default": "Главный язык", + "language.delete.confirm": "Вы точно хотите удалить {name} язык, включая все переводы? Это нельзя будет вернуть.", + "language.deleted": "Язык удален", + "language.direction": "Направление чтения", + "language.direction.ltr": "Слева направо", + "language.direction.rtl": "Справа налево", + "language.locale": "PHP locale string", + "language.locale.warning": "Вы используете кастомную локаль. Пожалуйста измените ее в файле языка в /site/languages", + "language.name": "Название", + "language.secondary": "Второстепенный язык", + "language.settings": "Настройки языка", + "language.updated": "Язык обновлен", + "language.variables": "Языковые переменные", + "language.variables.empty": "Пока нет переводов", + + "language.variable.delete.confirm": "Вы действительно хотите удалить переменную для {key}?", + "language.variable.key": "Ключ", + "language.variable.notFound": "Переменная не найдена", + "language.variable.value": "Значение", + + "languages": "Языки", + "languages.default": "Главный язык", + "languages.empty": "Языков нет", + "languages.secondary": "Дополнительные языки", + "languages.secondary.empty": "Дополнительных языков нет", + + "license": "Лицензия", + "license.activate": "Активировать сейчас", + "license.activate.label": "Пожалуйста, активируйте Вашу лицензию", + "license.activate.domain": "Ваша лицензия будет активирована на {host}.", + "license.activate.local": "Вы собираетесь активировать лицензию на локальный домен {host}. Если этот сайт будет размещен на общедоступном домене, то, пожалуйста, укажите его вместо {host}.", + "license.activated": "Активировано", + "license.buy": "Купить лицензию", + "license.code": "Код", + "license.code.help": "Вставьте код лицензии, который вы получили Email после покупки.", + "license.code.label": "Пожалуйста вставьте код лицензии", + "license.status.active.info": "Включает обновления до {date}", + "license.status.active.label": "Действительная лицензия", + "license.status.demo.info": "Это демонстрационная установка", + "license.status.demo.label": "Демо", + "license.status.inactive.info": "Обновите лицензию для перехода на новые версии", + "license.status.inactive.label": "Нет новых обновлений", + "license.status.legacy.bubble": "Вы готовы обновить вашу лицензию?", + "license.status.legacy.info": "Ваша лицензия не покрывает эту версию", + "license.status.legacy.label": "Пожалуйста, обновите вашу лицензию", + "license.status.missing.bubble": "Готовы запустить Ваш сайт?", + "license.status.missing.info": "Нет действительной лицензии", + "license.status.missing.label": "Пожалуйста, активируйте Вашу лицензию", + "license.manage": "Управление лицензиями", + "license.purchased": "Приобретено", + "license.success": "Спасибо за поддержку Kirby", + "license.unregistered.label": "Не зарегистрировано", + + "link": "\u0421\u0441\u044b\u043b\u043a\u0430", + "link.text": "\u0422\u0435\u043a\u0441\u0442 \u0441\u0441\u044b\u043b\u043a\u0438", + + "loading": "Загрузка", + + "lock.unsaved": "Несохраненные изменения", + "lock.unsaved.empty": "Несохраненных изменений нет", + "lock.isLocked": "Несохраненные изменения {email}", + "lock.unlock": "Разблокировать", + "lock.unlock.submit": "Разблокируйте и перезапишите несохраненные изменения {email}", + "lock.isUnlocked": "Были перезаписаны другим пользователем", + + "login": "Войти", + "login.code.label.login": "Код для входа", + "login.code.label.password-reset": "Код для сброса пароля", + "login.code.placeholder.email": "000 000", + "login.code.placeholder.totp": "000000", + "login.code.text.email": "Если ваш Email уже зарегистрирован, запрашиваемый код был отправлен на него.", + "login.code.text.totp": "Пожалуйста, введите одноразовый пароль из вашего приложения-аутентификатора.", + "login.email.login.body": "{code} — код для входа на сайт {site}. Код действителен {timeout} минут.\n\nЗдравствуйте, {user.nameOrEmail}!\n\nЕсли вы не запрашивали код для входа, проигнорируйте это письмо или обратитесь к администратору, если у вас есть вопросы.\nВ целях безопасности НЕ ПЕРЕСЫЛАЙТЕ это письмо.", + "login.email.login.subject": "Ваш код для входа", + "login.email.password-reset.body": "{code} — код для сброса пароля на сайт «{site}». Код действителен {timeout} минут.\n\nЗдравствуйте, {user.nameOrEmail}!\n\nЕсли вы не запрашивали сброс пароля, проигнорируйте это письмо или обратитесь к администратору, если у вас есть вопросы.\nВ целях безопасности НЕ ПЕРЕСЫЛАЙТЕ это письмо.", + "login.email.password-reset.subject": "Ваш код для сброса пароля", + "login.remember": "Запомнить пароль", + "login.reset": "Сбросить пароль", + "login.toggleText.code.email": "Вход с помощью Email", + "login.toggleText.code.email-password": "Вход с паролем", + "login.toggleText.password-reset.email": "Забыли ваш пароль?", + "login.toggleText.password-reset.email-password": "← Вернуться к форме входа", + "login.totp.enable.option": "Настроить одноразовые пароли", + "login.totp.enable.intro": "Приложения‑аутентификаторы могут генерировать одноразовые коды, которые используются в качестве второго фактора при входе в вашу учетную запись.", + "login.totp.enable.qr.label": "1. Отсканируйте этот QR-код", + "login.totp.enable.qr.help": "Не удается выполнить сканирование? Добавьте ключ настройки {secret} вручную в ваше приложение для проверки подлинности.", + "login.totp.enable.confirm.headline": "2. Подтвердите с помощью генерированного кода", + "login.totp.enable.confirm.text": "Ваше приложение генерирует новый одноразовый код каждые 30 секунд. Введите текущий код для завершения настройки:", + "login.totp.enable.confirm.label": "Текущий код", + "login.totp.enable.confirm.help": "После этой настройки мы будем запрашивать у вас одноразовый код при каждом входе.", + "login.totp.enable.success": "Одноразовые коды включены", + "login.totp.disable.option": "Отключить одноразовые коды", + "login.totp.disable.label": "Введите ваш пароль для отключения одноразовых паролей", + "login.totp.disable.help": "Теперь при входе в систему будет запрашиваться второй фактор, например, код для входа, отправленный по Email. Вы всегда можете повторно настроить одноразовые коды позже.", + "login.totp.disable.admin": "

Вы отключаете одноразовые коды для{user}.

Теперь при входе в систему будет запрашиваться другой второй фактор, например код для входа, отправленный по Email. {user} может повторно настроить одноразовые коды после следующего входа в систему.

", + "login.totp.disable.success": "Одноразовые коды выключены", + + "logout": "Выйти", + + "merge": "Объединить", + "menu": "Меню", + "meridiem": "До полудня / После полудня", + "mime": "Тип медиа", + "minutes": "Минуты", + + "month": "Месяц", + "months.april": "\u0410\u043f\u0440\u0435\u043b\u044c", + "months.august": "\u0410\u0432\u0433\u0443\u0441\u0442", + "months.december": "\u0414\u0435\u043a\u0430\u0431\u0440\u044c", + "months.february": "Февраль", + "months.january": "\u042f\u043d\u0432\u0430\u0440\u044c", + "months.july": "\u0418\u044e\u043b\u044c", + "months.june": "\u0418\u044e\u043d\u044c", + "months.march": "\u041c\u0430\u0440\u0442", + "months.may": "\u041c\u0430\u0439", + "months.november": "\u041d\u043e\u044f\u0431\u0440\u044c", + "months.october": "\u041e\u043a\u0442\u044f\u0431\u0440\u044c", + "months.september": "\u0421\u0435\u043d\u0442\u044f\u0431\u0440\u044c", + + "more": "Еще", + "move": "Переместить", + "name": "Название", + "next": "Дальше", + "night": "Ночь", + "no": "нет", + "off": "выключено", + "on": "включено", + "open": "Открыть", + "open.newWindow": "Открывать в новом окне", + "option": "Опция", + "options": "Параметры", + "options.none": "Параметров нет", + "options.all": "Показать все параметры ({count})", + + "orientation": "Ориентация", + "orientation.landscape": "Горизонтальная", + "orientation.portrait": "Портретная", + "orientation.square": "Квадрат", + + "page": "Страница", + "page.blueprint": "У страницы пока нет разметки. Вы можете определить новые секции и поля разметки в /site/blueprints/pages/{blueprint}.yml", + "page.changeSlug": "Изменить ссылку", + "page.changeSlug.fromTitle": "Создать из названия", + "page.changeStatus": "Изменить статус", + "page.changeStatus.position": "Пожалуйста, выберите позицию", + "page.changeStatus.select": "Выбрать новый статус", + "page.changeTemplate": "Изменить шаблон", + "page.changeTemplate.notice": "Изменение шаблона страницы приведет к удалению содержимого полей, которые не совпадут по типу. Используйте с осторожностью.", + "page.create": "Создать как {status}", + "page.delete.confirm": "Вы точно хотите удалить страницу {title}?", + "page.delete.confirm.subpages": "У этой страницы есть внутренние страницы.
Все внутренние страницы так же будут удалены.", + "page.delete.confirm.title": "Напишите название страницы, чтобы подтвердить", + "page.duplicate.appendix": "(копия)", + "page.duplicate.files": "Копировать файлы", + "page.duplicate.pages": "Копировать страницы", + "page.move": "Переместить", + "page.sort": "Изменить позицию", + "page.status": "Статус", + "page.status.draft": "Черновик", + "page.status.draft.description": "Страница находится в черновом режиме и видна только зарегистрированным пользователям или по секретной ссылке", + "page.status.listed": "Опубликована", + "page.status.listed.description": "Страница доступна для всех посетителей", + "page.status.unlisted": "Скрыта", + "page.status.unlisted.description": "Страница доступна только по URL", + + "pages": "Страницы", + "pages.empty": "Страниц нет", + "pages.status.draft": "Черновики", + "pages.status.listed": "Опубликовано", + "pages.status.unlisted": "Скрытая", + + "pagination.page": "Страница", + + "password": "\u041f\u0430\u0440\u043e\u043b\u044c", + "paste": "Вставить", + "paste.after": "Вставить после", + "paste.success": "{count} вставлено", + "pixel": "Пиксель", + "plugin": "Расширение", + "plugins": "Плагины", + "prev": "Предыдущий", + "preview": "Предпросмотр", + "remove": "Удалить", + "rename": "Переименовать", + "renew": "Обновить", + "replace": "\u0417\u0430\u043c\u0435\u043d\u0438\u0442\u044c", + "replace.with": "Заменить на", + "retry": "\u041f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u044c", + "revert": "\u0421\u0431\u0440\u043e\u0441", + "revert.confirm": "Вы действительно хотите удалить все несохраненные изменения?", + + "role": "\u0420\u043e\u043b\u044c", + "role.admin.description": "Администратор имеет все права", + "role.admin.title": "Администратор", + "role.all": "Все", + "role.empty": "Пользователей с такой ролью нет", + "role.description.placeholder": "Без описания", + "role.nobody.description": "Эта роль применяется если у пользователя нет никаких прав", + "role.nobody.title": "Никто", + + "save": "\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c", + "search": "Поиск", + "search.min": "Введите хотя бы {min} символов для поиска", + "search.all": "Показать все результаты ({count})", + "search.results.none": "Нет результатов", + + "section.invalid": "Неверная секция", + "section.required": "Секция обязательна", + + "security": "Безопасность", + "select": "Выбрать", + "server": "Сервер", + "settings": "Настройка", + "show": "Показать", + "site.blueprint": "У сайта пока нет разметки. Вы можете определить новые секции и поля разметки в /site/blueprints/site.yml", + "size": "Размер", + "slug": "URL", + "sort": "Сортировать", + "sort.drag": "Потяните для сортировки…", + "split": "Разделить", + + "stats.empty": "Статистики нет", + "status": "Статус", + + "system.info.copy": "Copy info", + "system.info.copied": "System info copied", + "system.issues.content": "Похоже, к папке content есть несанкционированный доступ", + "system.issues.eol.kirby": "Срок службы установленной вами версии Kirby истек, и она больше не будет получать обновления для системы безопасности", + "system.issues.eol.plugin": "Срок службы установленной вами версии плагина { plugin } истек, и он не будет получать дальнейших обновлений для системы безопасности", + "system.issues.eol.php": "Ваша версия PHP { release } устарела и не будет получать дальнейших обновлений для системы безопасности", + "system.issues.debug": "Включен режим отладки (debugging). Используйте его только при разработке.", + "system.issues.git": "Похоже, к папке .git есть несанкционированный доступ", + "system.issues.https": "Рекомендуется использовать HTTPS на всех сайтах", + "system.issues.kirby": "Похоже, к папке kirby есть несанкционированный доступ", + "system.issues.site": "Похоже, к папке site есть несанкционированный доступ", + "system.issues.vulnerability.kirby": "Обнаружена уязвимость уровня \"{ severity }\": { description }", + "system.issues.vulnerability.plugin": "В плагине { plugin } обнаружена уязвимость уровня \"{ severity }\": { description }", + "system.updateStatus": "Обновить статус", + "system.updateStatus.error": "Не удалось проверить обновления", + "system.updateStatus.not-vulnerable": "Известных уязвимостей не выявлено", + "system.updateStatus.security-update": "Доступно бесплатное обновление для системы безопасности { version }", + "system.updateStatus.security-upgrade": "Доступно обновление { version } с испарвлениями безопасности", + "system.updateStatus.unreleased": "Неизданная версия", + "system.updateStatus.up-to-date": "Последняя версия", + "system.updateStatus.update": "Доступно бесплатное обновление { version }", + "system.updateStatus.upgrade": "Доступно обновление { version }", + + "tel": "Телефон", + "tel.placeholder": "+79123456789", + "template": "\u0428\u0430\u0431\u043b\u043e\u043d", + "title": "Название", + "today": "Сегодня", + + "toolbar.button.clear": "Очистить форматирование", + "toolbar.button.code": "Код", + "toolbar.button.bold": "\u0416\u0438\u0440\u043d\u044b\u0439 \u0448\u0440\u0438\u0444\u0442", + "toolbar.button.email": "Email", + "toolbar.button.headings": "Заголовки", + "toolbar.button.heading.1": "Заголовок 1", + "toolbar.button.heading.2": "Заголовок 2", + "toolbar.button.heading.3": "Заголовок 3", + "toolbar.button.heading.4": "Заголовок 4", + "toolbar.button.heading.5": "Заголовок 5", + "toolbar.button.heading.6": "Заголовок 6", + "toolbar.button.italic": "Курсив", + "toolbar.button.file": "Файл", + "toolbar.button.file.select": "Выбрать файл", + "toolbar.button.file.upload": "Загрузить файл", + "toolbar.button.link": "\u0421\u0441\u044b\u043b\u043a\u0430", + "toolbar.button.paragraph": "Параграф", + "toolbar.button.strike": "Зачёркнутый", + "toolbar.button.sub": "Нижний индекс", + "toolbar.button.sup": "Верхний индекс", + "toolbar.button.ol": "Нумерованный список", + "toolbar.button.underline": "Подчёркнутый", + "toolbar.button.ul": "Маркированный список", + + "translation.author": "Команда Kirby", + "translation.direction": "ltr", + "translation.name": "Русский (Russian)", + "translation.locale": "ru_RU", + + "type": "Введите", + + "upload": "Загрузить", + "upload.error.cantMove": "Не удалось переместить загруженный файл", + "upload.error.cantWrite": "Не получилось записать файл на диск", + "upload.error.default": "Не удалось загрузить файл", + "upload.error.extension": "Загрузка файла остановлена из-за расширения", + "upload.error.formSize": "Загружаемый файл больше указанного в параметре MAX_FILE_SIZE в форме", + "upload.error.iniPostSize": "Загружаемый файл больше указанного в параметре \"post_max_size\" в php.ini", + "upload.error.iniSize": "Загружаемый файл больше указанного в параметре \"upload_max_filesize\" в php.ini", + "upload.error.noFile": "Файл не был загружен", + "upload.error.noFiles": "Файлы не были загружены", + "upload.error.partial": "Файл загружен только частично", + "upload.error.tmpDir": "Не хватает временной папки", + "upload.errors": "Ошибка", + "upload.progress": "Загрузка...", + + "url": "URL", + "url.placeholder": "https://example.com", + + "user": "Пользователь", + "user.blueprint": "Вы можете определить новые секции и поля разметки для пользователя в /site/blueprints/users/{blueprint}.yml", + "user.changeEmail": "Изменить Email", + "user.changeLanguage": "Изменить язык", + "user.changeName": "Переименовать пользователя", + "user.changePassword": "Изменить пароль", + "user.changePassword.new": "Новый пароль", + "user.changePassword.new.confirm": "Подтвердить новый пароль…", + "user.changeRole": "Изменить роль", + "user.changeRole.select": "Выбрать новую роль", + "user.create": "Добавить нового пользователя", + "user.delete": "Удалить этого пользователя", + "user.delete.confirm": "Вы действительно хотите аккаунт
{email}?", + + "users": "Пользователи", + + "version": "Версия", + "version.current": "Текущая версия", + "version.latest": "Последняя версия", + "versionInformation": "Информация о версии", + + "view.account": "Ваш аккаунт", + "view.installation": "\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430", + "view.languages": "Языки", + "view.resetPassword": "Сбросить пароль", + "view.site": "Сайт", + "view.system": "Система", + "view.users": "\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438", + + "welcome": "Добро пожаловать", + "year": "Год", + "yes": "да" +} diff --git a/kirby/i18n/translations/sk.json b/kirby/i18n/translations/sk.json new file mode 100644 index 0000000..f893850 --- /dev/null +++ b/kirby/i18n/translations/sk.json @@ -0,0 +1,730 @@ +{ + "account.changeName": "Zmeniť vaše meno", + "account.delete": "Zmazať váš účet", + "account.delete.confirm": "Do you really want to delete your account? You will be logged out immediately. Your account cannot be recovered.", + + "activate": "Activate", + "add": "Pridať", + "alpha": "Alpha", + "author": "Autor", + "avatar": "Profilový obrázok", + "back": "Späť", + "cancel": "Zrušiť", + "change": "Zmeniť", + "close": "Zavrieť", + "changes": "Zmeny", + "confirm": "Ok", + "collapse": "Zabaliť", + "collapse.all": "Zabaliť všetky", + "color": "Farba", + "coordinates": "Koordináty", + "copy": "Kopírovať", + "copy.all": "Copy all", + "copy.success": "{count} copied!", + "create": "Vytvoriť", + "custom": "Custom", + + "date": "Dátum", + "date.select": "Zvoliť dátum", + + "day": "Deň", + "days.fri": "Pia", + "days.mon": "Pon", + "days.sat": "Sob", + "days.sun": "Ned", + "days.thu": "Štv", + "days.tue": "Uto", + "days.wed": "Str", + + "debugging": "Debugging", + + "delete": "Zmazať", + "delete.all": "Zmazať všetky", + + "dialog.fields.empty": "This dialog has no fields", + "dialog.files.empty": "No files to select", + "dialog.pages.empty": "No pages to select", + "dialog.text.empty": "This dialog does not define any text", + "dialog.users.empty": "Zvolení neboli žiadni uživátelia", + + "dimensions": "Rozmery", + "disable": "Disable", + "disabled": "Disabled", + "discard": "Zahodiť", + + "drawer.fields.empty": "This drawer has no fields", + + "domain": "Domain", + "download": "Stiahnuť", + "duplicate": "Duplikovať", + + "edit": "Upraviť", + + "email": "E-mail", + "email.placeholder": "mail@example.com", + + "enter": "Enter", + "entries": "Entries", + "entry": "Entry", + + "environment": "Environment", + + "error": "Chyba", + "error.access.code": "Neplatný kód", + "error.access.login": "Neplatné prihlásenie", + "error.access.panel": "Nemáte povolenie na prístup do Panel-u", + "error.access.view": "You are not allowed to access this part of the panel", + + "error.avatar.create.fail": "Profilový obrázok sa nepodarilo nahrať", + "error.avatar.delete.fail": "Profilový obrázok sa nepodarilo zmazať", + "error.avatar.dimensions.invalid": "Prosím, dodržte, aby šírka a výška profilového obrázka bola menšia ako 3000 pixelov", + "error.avatar.mime.forbidden": "Profilový obrázok musí byť súbor JPEG alebo PNG.", + + "error.blueprint.notFound": "Blueprint \"{name}\" sa nepodarilo načítať", + + "error.blocks.max.plural": "You must not add more than {max} blocks", + "error.blocks.max.singular": "You must not add more than one block", + "error.blocks.min.plural": "You must add at least {min} blocks", + "error.blocks.min.singular": "You must add at least one block", + "error.blocks.validation": "There's an error on the \"{field}\" field in block {index} using the \"{fieldset}\" block type", + + "error.cache.type.invalid": "Invalid cache type \"{type}\"", + + "error.email.preset.notFound": "E-mailovú predvoľbu \"{name}\" nie je možné nájsť", + + "error.field.converter.invalid": "Neplatný converter \"{converter}\"", + "error.field.type.missing": "Field \"{ name }\": The field type \"{ type }\" does not exist", + + "error.file.changeName.empty": "Meno nesmie byť prázdne", + "error.file.changeName.permission": "Nemáte povolenie na zmenu názvu pre \"{filename}\"", + "error.file.changeTemplate.invalid": "The template for the file \"{id}\" cannot be changed to \"{template}\" (valid: \"{blueprints}\")", + "error.file.changeTemplate.permission": "You are not allowed to change the template for the file \"{id}\"", + + "error.file.duplicate": "Súbor s názvom \"{filename}\" už existuje", + "error.file.extension.forbidden": "Prípona \"{extension}\" nie je povolená", + "error.file.extension.invalid": "Neplatná prípona: \"{extension}\"", + "error.file.extension.missing": "Prípona pre \"{filename}\" chýba", + "error.file.maxheight": "Výška obrázku nesmie prekročiť \"{height}\" pixelov", + "error.file.maxsize": "Súbor je príliš velký", + "error.file.maxwidth": "Šírka obrázku nesmie prekročiť \"{width}\" pixelov", + "error.file.mime.differs": "Mime typ nahratého súboru msa musí zhodovať s \"{mime}\"", + "error.file.mime.forbidden": "Typ média \"{mime}\" nie je povolený", + "error.file.mime.invalid": "Neplatný mime typ: \"{mime}\"", + "error.file.mime.missing": "Typ média pre \"{filename}\" sa nepodarilo zistiť", + "error.file.minheight": "Výška obrázku musí byť aspoň \"{height}\" pixelov", + "error.file.minsize": "Súbor je príliš malý", + "error.file.minwidth": "Šírka obrázku musí byť aspoň \"{width}\" pixelov", + "error.file.name.unique": "The filename must be unique", + "error.file.name.missing": "Názov súboru nemôže byť prázdny", + "error.file.notFound": "Súbor \"{filename}\" sa nepodarilo nájsť", + "error.file.orientation": "The orientation of the image must be \"{orientation}\"", + "error.file.type.forbidden": "Nemáte povolenie na nahrávanie súborov s typom {type}", + "error.file.type.invalid": "Neplatný typ súboru: \"{type}\"", + "error.file.undefined": "Súbor nie je možné nájsť", + + "error.form.incomplete": "Prosím, opravte všetky chyby v rámci formuláru...", + "error.form.notSaved": "Formulár sa nepodarilo uložiť", + + "error.language.code": "Please enter a valid code for the language", + "error.language.duplicate": "The language already exists", + "error.language.name": "Please enter a valid name for the language", + "error.language.notFound": "The language could not be found", + + "error.layout.validation.block": "There's an error on the \"{field}\" field in block {blockIndex} using the \"{fieldset}\" block type in layout {layoutIndex}", + "error.layout.validation.settings": "There's an error in layout {index} settings", + + "error.license.domain": "The domain for the license is missing", + "error.license.email": "Prosím, zadajte platnú e-mailovú adresu", + "error.license.format": "Please enter a valid license code", + "error.license.verification": "The license could not be verified", + + "error.login.totp.confirm.invalid": "Neplatný kód", + "error.login.totp.confirm.missing": "Please enter the current code", + + "error.object.validation": "There’s an error in the \"{label}\" field:\n{message}", + + "error.offline": "The Panel is currently offline", + + "error.page.changeSlug.permission": "Nemáte povolenie na zmenu URL príponu pre \"{slug}\"", + "error.page.changeSlug.reserved": "The path of top-level pages must not start with \"{path}\"", + "error.page.changeStatus.incomplete": "Stránka obsahuje chyby a nemôže byť zverejnená", + "error.page.changeStatus.permission": "Status tejto stránky nemôže byť zmenený", + "error.page.changeStatus.toDraft.invalid": "Stránka \"{slug}\" nemôže byť zmenená na koncept.", + "error.page.changeTemplate.invalid": "Šablónu pre stránku \"{slug}\" nie je možné zmeniť", + "error.page.changeTemplate.permission": "Nemáte povolenie na zmenu šablóny pre \"{slug}\"", + "error.page.changeTitle.empty": "Titulok nemôže byť prázdny", + "error.page.changeTitle.permission": "Nemáte povolenie na zmenu titulku pre \"{slug}\"", + "error.page.create.permission": "Nemáte povolenie na vytvorenie \"{slug}\"", + "error.page.delete": "Stránku \"{slug}\" nie je možné vymazať", + "error.page.delete.confirm": "Prosím, zadajte titulok stránky pre potvrdenie", + "error.page.delete.hasChildren": "Táto stránka obsahuje podstránky a nemôže byť zmazaná", + "error.page.delete.permission": "Nemáte povolenie na zmazanie stránky \"{slug}\"", + "error.page.draft.duplicate": "Koncept stránky s URL appendix-om \"{slug}\" už existuje", + "error.page.duplicate": "Stránka s URL appendix-om \"{slug}\" už existuje", + "error.page.duplicate.permission": "You are not allowed to duplicate \"{slug}\"", + "error.page.move.ancestor": "The page cannot be moved into itself", + "error.page.move.directory": "The page directory cannot be moved", + "error.page.move.duplicate": "A sub page with the URL appendix \"{slug}\" already exists", + "error.page.move.notFound": "The moved page could not be found", + "error.page.move.permission": "You are not allowed to move \"{slug}\"", + "error.page.move.template": "The \"{template}\" template is not accepted as a subpage of \"{parent}\"", + "error.page.notFound": "Stránku \"{slug}\" nie je možné nájsť", + "error.page.num.invalid": "Prosím, zadajte platné číslo pre radenie. Čísla nemôžu byť záporné.", + "error.page.slug.invalid": "Please enter a valid URL appendix", + "error.page.slug.maxlength": "Slug length must be less than \"{length}\" characters", + "error.page.sort.permission": "Stránku \"{slug}\" nie je možné preradiť.", + "error.page.status.invalid": "Prosím, nastavte platnú status pre stránku", + "error.page.undefined": "Stránku nie je možné nájsť", + "error.page.update.permission": "Nemáte povolenie na aktualizáciu \"{slug}\"", + + "error.section.files.max.plural": "Nemôžete pridať viac ako {max} súbory/ov do sekcie \"{section}\"", + "error.section.files.max.singular": "Nemôžete pridať viac ako 1 súbor do sekcie \"{section}\"", + "error.section.files.min.plural": "The \"{section}\" section requires at least {min} files", + "error.section.files.min.singular": "The \"{section}\" section requires at least one file", + + "error.section.pages.max.plural": "Nemôžete pridať viac ako {max} stránky/ok do sekcie \"{section}\"", + "error.section.pages.max.singular": "Nemôžete pridať viac ako 1 stránku do sekcie \"{section}\"", + "error.section.pages.min.plural": "The \"{section}\" section requires at least {min} pages", + "error.section.pages.min.singular": "The \"{section}\" section requires at least one page", + + "error.section.notLoaded": "Sekciu \"{name}\" sa nepodarilo nahrať", + "error.section.type.invalid": "Typ sekcie \"{type}\" nie je platný", + + "error.site.changeTitle.empty": "Titulok nemôže byť prázdny", + "error.site.changeTitle.permission": "Nemáte povolenie na zmenu titulku pre portál", + "error.site.update.permission": "Nemáte povolenie na aktualizovanie portálu", + + "error.structure.validation": "There's an error on the \"{field}\" field in row {index}", + + "error.template.default.notFound": "Predvolená šablóna neexistuje", + + "error.unexpected": "An unexpected error occurred! Enable debug mode for more info: https://getkirby.com/docs/reference/system/options/debug", + + "error.user.changeEmail.permission": "Nemáte povolenie na zmenu e-mailu pre užívateľa \"{name}\"", + "error.user.changeLanguage.permission": "Nemáte povolenie na zmenu jazyka pre užívateľa \"{name}\"", + "error.user.changeName.permission": "Nemáte povolenie na zmenu mena pre užívateľa \"{name}\"", + "error.user.changePassword.permission": "Nemáte povolenie na zmenu hesla pre užívateľa \"{name}\"", + "error.user.changeRole.lastAdmin": "Rolu pre posledného administrátora nie je možné zmeniť", + "error.user.changeRole.permission": "Nemáte povolenie na zmenu role pre užívateľa \"{name}\"", + "error.user.changeRole.toAdmin": "You are not allowed to promote someone to the admin role", + "error.user.create.permission": "Nemáte povolenie na vytvorenie tohto užívateľa", + "error.user.delete": "Užívateľa \"{name}\" nie je možné zmazať", + "error.user.delete.lastAdmin": "Posledného administrátora nie je možné zmazať", + "error.user.delete.lastUser": "Posledného užívateľa nie je možné zmazať", + "error.user.delete.permission": "Nemáte povolenie na zmazanie užívateľa \"{name}\"", + "error.user.duplicate": "Užívateľ s e-mailovou adresou \"{email}\" už existuje", + "error.user.email.invalid": "Prosím, zadajte platnú e-mailovú adresu", + "error.user.language.invalid": "Prosím, zadajte platný jazyk", + "error.user.notFound": "Užívateľa \"{name}\" nie je možné nájsť", + "error.user.password.excessive": "Please enter a valid password. Passwords must not be longer than 1000 characters.", + "error.user.password.invalid": "Prosím, zadajte platné heslo. Dĺžka hesla musí byť aspoň 8 znakov.", + "error.user.password.notSame": "Heslá nie sú rovnaké", + "error.user.password.undefined": "Užívateľ nemá heslo", + "error.user.password.wrong": "Wrong password", + "error.user.role.invalid": "Prosím, zadajte platnú rolu", + "error.user.undefined": "Užívateľa sa nepodarilo nájsť", + "error.user.update.permission": "Nemáte povolenie na aktualizáciu užívateľa \"{name}\"", + + "error.validation.accepted": "Prosím, potvrďte", + "error.validation.alpha": "Prosím, zadajte len znaky z hlások a-z", + "error.validation.alphanum": "Prosím, zadajte len znaky z hlások a-z a čísloviek 0-9", + "error.validation.anchor": "Please enter a correct link anchor", + "error.validation.between": "Prosím, zadajte hodnotu od \"{min}\" do \"{max}\"", + "error.validation.boolean": "Prosím, potvrďte alebo odmietnite", + "error.validation.color": "Please enter a valid color in the {format} format", + "error.validation.contains": "Prosím, zadajte hodnotu, ktorá obsahuje \"{needle}\"", + "error.validation.date": "Prosím, zadajte platný dátum", + "error.validation.date.after": "Please enter a date after {date}", + "error.validation.date.before": "Please enter a date before {date}", + "error.validation.date.between": "Please enter a date between {min} and {max}", + "error.validation.denied": "Prosím, odmietnite", + "error.validation.different": "Hodnota nemôže byť \"{other}\"", + "error.validation.email": "Prosím, zadajte platnú e-mailovú adresu", + "error.validation.endswith": "Hodnota musí končiť na \"{end}\"", + "error.validation.filename": "Prosím, zadajte platný názov súboru", + "error.validation.in": "Prosím, zadajte jedno z nasledujúcich: ({in})", + "error.validation.integer": "Prosím, zadajte platné celé číslo", + "error.validation.ip": "Prosím, zadajte platnú e-mailovú adresu", + "error.validation.less": "Prosím, zadajte hodnotu menšiu ako {max}", + "error.validation.linkType": "The link type is not allowed", + "error.validation.match": "Hodnota nezodpovedá očakávanému vzoru", + "error.validation.max": "Prosím, zadajte hodnotu rovnú alebo menšiu ako {max}", + "error.validation.maxlength": "Prosím, zadajte kratšiu hodnotu. (max. {max} charaktery/ov)", + "error.validation.maxwords": "Prosím, nezadávajte viac ako {max} slovo/á/ov", + "error.validation.min": "Prosím, zadajte hodnotu rovnú alebo väčšiu ako {min}", + "error.validation.minlength": "Prosím, zadajte dlhšiu hodnotu. (min. {min} charaktery/ov)", + "error.validation.minwords": "Prosím, zadajte aspoň {min} slovo/á/ov", + "error.validation.more": "Prosím zadajte hodnotu väčšiu ako {min}", + "error.validation.notcontains": "Prosím, zadajte hodnotu, ktorá neobsahuje \"{needle}\"", + "error.validation.notin": "Prosím, nezadávajte ani jedno z nasledujúcich: ({notIn})", + "error.validation.option": "Prosím, zadajte platnú voľbu", + "error.validation.num": "Prosím, zadajte platné číslo", + "error.validation.required": "Prosím, zadajte niečo", + "error.validation.same": "Prosím, zadajte \"{other}\"", + "error.validation.size": "Veľkosť hodnoty musí byť \"{size}\"", + "error.validation.startswith": "Hodnota musí začínať s \"{start}\"", + "error.validation.tel": "Please enter an unformatted phone number", + "error.validation.time": "Prosím, zadajte platný čas", + "error.validation.time.after": "Please enter a time after {time}", + "error.validation.time.before": "Please enter a time before {time}", + "error.validation.time.between": "Please enter a time between {min} and {max}", + "error.validation.uuid": "Please enter a valid UUID", + "error.validation.url": "Prosím, zadajte platnú URL", + + "expand": "Rozbaliť", + "expand.all": "Rozbaliť všetky", + + "field.invalid": "The field is invalid", + "field.required": "The field is required", + "field.blocks.changeType": "Change type", + "field.blocks.code.name": "Kód", + "field.blocks.code.language": "Jazyk", + "field.blocks.code.placeholder": "Váš kód ...", + "field.blocks.delete.confirm": "Naozaj chcete zmazať tento blok?", + "field.blocks.delete.confirm.all": "Naozaj chcete zmazať všetky bloky?", + "field.blocks.delete.confirm.selected": "Naozaj chcete zmazať vybrané bloky?", + "field.blocks.empty": "No blocks yet", + "field.blocks.fieldsets.empty": "No fieldsets yet", + "field.blocks.fieldsets.label": "Please select a block type …", + "field.blocks.fieldsets.paste": "Press {{ shortcut }} to import layouts/blocks from your clipboard Only those allowed in the current field will get inserted.", + "field.blocks.gallery.name": "Galéria", + "field.blocks.gallery.images.empty": "No images yet", + "field.blocks.gallery.images.label": "Obrázky", + "field.blocks.heading.level": "Level", + "field.blocks.heading.name": "Nadpis", + "field.blocks.heading.text": "Text", + "field.blocks.heading.placeholder": "Nadpis ...", + "field.blocks.image.alt": "Alternative text", + "field.blocks.image.caption": "Popis", + "field.blocks.image.crop": "Orezanie", + "field.blocks.image.link": "Odkaz", + "field.blocks.image.location": "Poloha", + "field.blocks.image.location.internal": "This website", + "field.blocks.image.location.external": "External source", + "field.blocks.image.name": "Obrázok", + "field.blocks.image.placeholder": "Select an image", + "field.blocks.image.ratio": "Ratio", + "field.blocks.image.url": "Image URL", + "field.blocks.line.name": "Line", + "field.blocks.list.name": "List", + "field.blocks.markdown.name": "Markdown", + "field.blocks.markdown.label": "Text", + "field.blocks.markdown.placeholder": "Markdown …", + "field.blocks.quote.name": "Quote", + "field.blocks.quote.text.label": "Text", + "field.blocks.quote.text.placeholder": "Quote …", + "field.blocks.quote.citation.label": "Citation", + "field.blocks.quote.citation.placeholder": "by …", + "field.blocks.text.name": "Text", + "field.blocks.text.placeholder": "Text …", + "field.blocks.video.autoplay": "Autoplay", + "field.blocks.video.caption": "Popis", + "field.blocks.video.controls": "Controls", + "field.blocks.video.location": "Poloha", + "field.blocks.video.loop": "Loop", + "field.blocks.video.muted": "Muted", + "field.blocks.video.name": "Video", + "field.blocks.video.placeholder": "Enter a video URL", + "field.blocks.video.poster": "Poster", + "field.blocks.video.preload": "Preload", + "field.blocks.video.url.label": "Video-URL", + "field.blocks.video.url.placeholder": "https://youtube.com/?v=", + + "field.files.empty": "Žiadne súbory zatiaľ neboli zvolené", + + "field.layout.change": "Change layout", + "field.layout.delete": "Delete layout", + "field.layout.delete.confirm": "Do you really want to delete this layout?", + "field.layout.delete.confirm.all": "Do you really want to delete all layouts?", + "field.layout.empty": "No rows yet", + "field.layout.select": "Select a layout", + + "field.object.empty": "No information yet", + + "field.pages.empty": "Žiadne stránky zatiaľ neboli zvolené", + + "field.structure.delete.confirm": "Ste si istý, že chcete zmazať tento riadok?", + "field.structure.delete.confirm.all": "Do you really want to delete all entries?", + "field.structure.empty": "Zatiaľ žiadne údaje", + + "field.users.empty": "Žiadni užívatelia zatiaľ neboli zvolení", + + "fields.empty": "No fields yet", + + "file": "Súbor", + "file.blueprint": "This file has no blueprint yet. You can define the setup in /site/blueprints/files/{blueprint}.yml", + "file.changeTemplate": "Zmeniť šablónu", + "file.changeTemplate.notice": "Changing the file's template will remove content for fields that don't match in type. If the new template defines certain rules, e.g. image dimensions, those will also be applied irreversibly. Use with caution.", + "file.delete.confirm": "Ste si istý, že chcete zmazať
{filename}?", + "file.focus.placeholder": "Set focal point", + "file.focus.reset": "Remove focal point", + "file.focus.title": "Focus", + "file.sort": "Change position", + + "files": "Súbory", + "files.empty": "Zatiaľ žiadne súbory", + + "filter": "Filter", + + "hide": "Hide", + "hour": "Hodina", + "hue": "Hue", + "import": "Import", + "info": "Info", + "insert": "Vložiť", + "insert.after": "Insert after", + "insert.before": "Insert before", + "install": "Inštalovať", + + "installation": "Inštalácia", + "installation.completed": "Panel bol nainštalovaný", + "installation.disabled": "Inštalácia Panelu na verejných serveroch je štandardne zablokovaná. Prosím, spustite inštaláciu na lokálnom serveri alebo aktivujte voľbu panel.install.", + "installation.issues.accounts": "Priečinok /site/accounts neexistuje alebo nie je nastavený ako zapisovateľný", + "installation.issues.content": "Priečinok /content neexistuje alebo nie je nastavený ako zapisovateľný", + "installation.issues.curl": "CURL rozšírenie je povinné", + "installation.issues.headline": "Panel nie je možné naištalovať", + "installation.issues.mbstring": "MB String rozšírenie je povinné", + "installation.issues.media": "Priečinok /media neexistuje alebo nie je nastavený ako zapisovateľný", + "installation.issues.php": "Uistite sa, že používate PHP 8+", + "installation.issues.sessions": "Priečinok /site/sessions neexistuje alebo nie je nastavený ako zapisovateľný", + + "language": "Jazyk", + "language.code": "Kód", + "language.convert": "Nastaviť ako predvolené", + "language.convert.confirm": "

Ste si istý, že chcete nastaviť {name} ako predvolený jazyk? Túto akciu nie je možné zvrátiť.

Ak {name} obsahuje nepreložený obsah, tak pre tento obsah nebude fungovať platné volanie a niektoré časti vašich stránok zostanú prázdne.

", + "language.create": "Pridať nový jazyk", + "language.default": "Predvolený jazyk", + "language.delete.confirm": "Ste si istý, že chcete zmazať jazyk {name} vrátane všetkých prekladov? Túto akciu nie je možné zvrátiť.", + "language.deleted": "Jazyk bol zmazaný", + "language.direction": "Smer čítania", + "language.direction.ltr": "Zľava doprava", + "language.direction.rtl": "Zprava doľava", + "language.locale": "PHP locale string", + "language.locale.warning": "You are using a custom locale set up. Please modify it in the language file in /site/languages", + "language.name": "Názov", + "language.secondary": "Secondary language", + "language.settings": "Language settings", + "language.updated": "Jazyk bol aktualizovaný", + "language.variables": "Language variables", + "language.variables.empty": "No translations yet", + + "language.variable.delete.confirm": "Do you really want to delete the variable for {key}?", + "language.variable.key": "Key", + "language.variable.notFound": "The variable could not be found", + "language.variable.value": "Value", + + "languages": "Jazyky", + "languages.default": "Predvolený jazyk", + "languages.empty": "Zatiaľ žiadne jazyky", + "languages.secondary": "Sekundárne jazyky", + "languages.secondary.empty": "Zatiaľ žiadne sekundárne jazyky", + + "license": "Licencia", + "license.activate": "Activate it now", + "license.activate.label": "Please activate your license", + "license.activate.domain": "Your license will be activated for {host}.", + "license.activate.local": "You are about to activate your Kirby license for your local domain {host}. If this site will be deployed to a public domain, please activate it there instead. If {host} is the domain you want to use your license for, please continue.", + "license.activated": "Activated", + "license.buy": "Zakúpiť licenciu", + "license.code": "Kód", + "license.code.help": "You received your license code after the purchase via email. Please copy and paste it here.", + "license.code.label": "Prosím, zadajte váš licenčný kód", + "license.status.active.info": "Includes new major versions until {date}", + "license.status.active.label": "Valid license", + "license.status.demo.info": "This is a demo installation", + "license.status.demo.label": "Demo", + "license.status.inactive.info": "Renew license to update to new major versions", + "license.status.inactive.label": "No new major versions", + "license.status.legacy.bubble": "Ready to renew your license?", + "license.status.legacy.info": "Your license does not cover this version", + "license.status.legacy.label": "Please renew your license", + "license.status.missing.bubble": "Ready to launch your site?", + "license.status.missing.info": "No valid license", + "license.status.missing.label": "Please activate your license", + "license.manage": "Manage your licenses", + "license.purchased": "Purchased", + "license.success": "Ďakujeme za vašu podporu Kirby", + "license.unregistered.label": "Unregistered", + + "link": "Odkaz", + "link.text": "Text odkazu", + + "loading": "Načítavanie", + + "lock.unsaved": "Unsaved changes", + "lock.unsaved.empty": "There are no more unsaved changes", + "lock.isLocked": "Unsaved changes by {email}", + "lock.unlock": "Unlock", + "lock.unlock.submit": "Unlock and overwrite unsaved changes by {email}", + "lock.isUnlocked": "Was unlocked by another user", + + "login": "Prihlásenie", + "login.code.label.login": "Login code", + "login.code.label.password-reset": "Password reset code", + "login.code.placeholder.email": "000 000", + "login.code.placeholder.totp": "000000", + "login.code.text.email": "If your email address is registered, the requested code was sent via email.", + "login.code.text.totp": "Please enter the one‑time code from your authenticator app.", + "login.email.login.body": "Hi {user.nameOrEmail},\n\nYou recently requested a login code for the Panel of {site}.\nThe following login code will be valid for {timeout} minutes:\n\n{code}\n\nIf you did not request a login code, please ignore this email or contact your administrator if you have questions.\nFor security, please DO NOT forward this email.", + "login.email.login.subject": "Your login code", + "login.email.password-reset.body": "Hi {user.nameOrEmail},\n\nYou recently requested a password reset code for the Panel of {site}.\nThe following password reset code will be valid for {timeout} minutes:\n\n{code}\n\nIf you did not request a password reset code, please ignore this email or contact your administrator if you have questions.\nFor security, please DO NOT forward this email.", + "login.email.password-reset.subject": "Your password reset code", + "login.remember": "Ponechať ma prihláseného", + "login.reset": "Reset password", + "login.toggleText.code.email": "Login via email", + "login.toggleText.code.email-password": "Login with password", + "login.toggleText.password-reset.email": "Forgot your password?", + "login.toggleText.password-reset.email-password": "← Back to login", + "login.totp.enable.option": "Set up one‑time codes", + "login.totp.enable.intro": "Authenticator apps can generate one‑time codes that are used as a second factor when signing into your account.", + "login.totp.enable.qr.label": "1. Scan this QR code", + "login.totp.enable.qr.help": "Unable to scan? Add the setup key {secret} manually to your authenticator app.", + "login.totp.enable.confirm.headline": "2. Confirm with generated code", + "login.totp.enable.confirm.text": "Your app generates a new one‑time code every 30 seconds. Enter the current code to complete the setup:", + "login.totp.enable.confirm.label": "Current code", + "login.totp.enable.confirm.help": "After this setup, we will ask you for a one‑time code every time you log in.", + "login.totp.enable.success": "One‑time codes enabled", + "login.totp.disable.option": "Disable one‑time codes", + "login.totp.disable.label": "Enter your password to disable one‑time codes", + "login.totp.disable.help": "In the future, a different second factor like a login code sent via email will be requested when you log in. You can always set up one‑time codes again later.", + "login.totp.disable.admin": "

This will disable one‑time codes for {user}.

In the future, a different second factor like a login code sent via email will be requested when they log in. {user} can set up one‑time codes again after their next login.

", + "login.totp.disable.success": "One‑time codes disabled", + + "logout": "Odhlásenie", + + "merge": "Merge", + "menu": "Menu", + "meridiem": "AM/PM", + "mime": "Typ média", + "minutes": "Minúty", + + "month": "Mesiac", + "months.april": "Apríl", + "months.august": "August", + "months.december": "December", + "months.february": "Február", + "months.january": "Január", + "months.july": "Júl", + "months.june": "Jún", + "months.march": "Marec", + "months.may": "Máj", + "months.november": "November", + "months.october": "Október", + "months.september": "September", + + "more": "Viac", + "move": "Move", + "name": "Meno", + "next": "Ďalej", + "night": "Night", + "no": "no", + "off": "off", + "on": "on", + "open": "Otvoriť", + "open.newWindow": "Open in new window", + "option": "Option", + "options": "Nastavenia", + "options.none": "No options", + "options.all": "Show all {count} options", + + "orientation": "Orientácia", + "orientation.landscape": "Širokouhlá", + "orientation.portrait": "Portrét", + "orientation.square": "Štvorec", + + "page": "Stránka", + "page.blueprint": "This page has no blueprint yet. You can define the setup in /site/blueprints/pages/{blueprint}.yml", + "page.changeSlug": "Zmeniť URL", + "page.changeSlug.fromTitle": "Vytvoriť z titulku", + "page.changeStatus": "Zmeniť status", + "page.changeStatus.position": "Prosím, zmeňte pozíciu", + "page.changeStatus.select": "Zvoľte nový status", + "page.changeTemplate": "Zmeniť šablónu", + "page.changeTemplate.notice": "Changing the page's template will remove content for fields that don't match in type. Use with caution.", + "page.create": "Create as {status}", + "page.delete.confirm": "Ste si istý, že chcete zmazať {title}?", + "page.delete.confirm.subpages": "Táto stránka obsahuje podstránky.
Všetky podstránky budú taktiež zmazané.", + "page.delete.confirm.title": "Pre potvrdenie zadajte titulok stránky", + "page.duplicate.appendix": "Kopírovať", + "page.duplicate.files": "Copy files", + "page.duplicate.pages": "Copy pages", + "page.move": "Move page", + "page.sort": "Change position", + "page.status": "Status", + "page.status.draft": "Koncept", + "page.status.draft.description": "The page is in draft mode and only visible for logged in editors or via secret link", + "page.status.listed": "Verejné", + "page.status.listed.description": "Stránka je prístupná pre všetkých", + "page.status.unlisted": "Skryté", + "page.status.unlisted.description": "Stránka je prístupná len prostredníctvom priamej URL", + + "pages": "Stránky", + "pages.empty": "Zatiaľ žiadne stránky", + "pages.status.draft": "Koncepty", + "pages.status.listed": "Zverejnené", + "pages.status.unlisted": "Skryté", + + "pagination.page": "Stránka", + + "password": "Heslo", + "paste": "Paste", + "paste.after": "Paste after", + "paste.success": "{count} pasted!", + "pixel": "Pixel", + "plugin": "Plugin", + "plugins": "Plugins", + "prev": "Predchádzajúci", + "preview": "Preview", + "remove": "Odstrániť", + "rename": "Premenovať", + "renew": "Renew", + "replace": "Nahradiť", + "replace.with": "Replace with", + "retry": "Skúsiť ešte raz", + "revert": "Vrátiť späť", + "revert.confirm": "Do you really want to delete all unsaved changes?", + + "role": "Rola", + "role.admin.description": "The admin has all rights", + "role.admin.title": "Admin", + "role.all": "Všetko", + "role.empty": "S touto rolou neexistujú žiadni užívatelia", + "role.description.placeholder": "Žiadny popis", + "role.nobody.description": "This is a fallback role without any permissions", + "role.nobody.title": "Nobody", + + "save": "Uložiť", + "search": "Hľadať", + "search.min": "Enter {min} characters to search", + "search.all": "Show all {count} results", + "search.results.none": "No results", + + "section.invalid": "The section is invalid", + "section.required": "The section is required", + + "security": "Security", + "select": "Zvoliť", + "server": "Server", + "settings": "Nastavenia", + "show": "Show", + "site.blueprint": "The site has no blueprint yet. You can define the setup in /site/blueprints/site.yml", + "size": "Veľkosť", + "slug": "URL appendix", + "sort": "Zoradiť", + "sort.drag": "Drag to sort …", + "split": "Split", + + "stats.empty": "No reports", + "status": "Status", + + "system.info.copy": "Copy info", + "system.info.copied": "System info copied", + "system.issues.content": "The content folder seems to be exposed", + "system.issues.eol.kirby": "Your installed Kirby version has reached end-of-life and will not receive further security updates", + "system.issues.eol.plugin": "Your installed version of the { plugin } plugin is has reached end-of-life and will not receive further security updates", + "system.issues.eol.php": "Your installed PHP release { release } has reached end-of-life and will not receive further security updates", + "system.issues.debug": "Debugging must be turned off in production", + "system.issues.git": "The .git folder seems to be exposed", + "system.issues.https": "We recommend HTTPS for all your sites", + "system.issues.kirby": "The kirby folder seems to be exposed", + "system.issues.site": "The site folder seems to be exposed", + "system.issues.vulnerability.kirby": "Your installation might be affected by the following vulnerability ({ severity } severity): { description }", + "system.issues.vulnerability.plugin": "Your installation might be affected by the following vulnerability in the { plugin } plugin ({ severity } severity): { description }", + "system.updateStatus": "Update status", + "system.updateStatus.error": "Could not check for updates", + "system.updateStatus.not-vulnerable": "No known vulnerabilities", + "system.updateStatus.security-update": "Free security update { version } available", + "system.updateStatus.security-upgrade": "Upgrade { version } with security fixes available", + "system.updateStatus.unreleased": "Unreleased version", + "system.updateStatus.up-to-date": "Up to date", + "system.updateStatus.update": "Free update { version } available", + "system.updateStatus.upgrade": "Upgrade { version } available", + + "tel": "Phone", + "tel.placeholder": "+49123456789", + "template": "Šablóna", + "title": "Titulok", + "today": "Dnes", + + "toolbar.button.clear": "Clear formatting", + "toolbar.button.code": "Kód", + "toolbar.button.bold": "Tučný", + "toolbar.button.email": "E-mail", + "toolbar.button.headings": "Nadpisy", + "toolbar.button.heading.1": "Nadpis 1", + "toolbar.button.heading.2": "Nadpis 2", + "toolbar.button.heading.3": "Nadpis 3", + "toolbar.button.heading.4": "Heading 4", + "toolbar.button.heading.5": "Heading 5", + "toolbar.button.heading.6": "Heading 6", + "toolbar.button.italic": "Kurzíva", + "toolbar.button.file": "Súbor", + "toolbar.button.file.select": "Select a file", + "toolbar.button.file.upload": "Upload a file", + "toolbar.button.link": "Odkaz", + "toolbar.button.paragraph": "Paragraph", + "toolbar.button.strike": "Strike-through", + "toolbar.button.sub": "Subscript", + "toolbar.button.sup": "Superscript", + "toolbar.button.ol": "Číslovaný zoznam", + "toolbar.button.underline": "Underline", + "toolbar.button.ul": "Odrážkový zoznam", + + "translation.author": "Tím Kirby", + "translation.direction": "ltr", + "translation.name": "Slovensky", + "translation.locale": "sk_SK", + + "type": "Type", + + "upload": "Nahrať", + "upload.error.cantMove": "The uploaded file could not be moved", + "upload.error.cantWrite": "Failed to write file to disk", + "upload.error.default": "The file could not be uploaded", + "upload.error.extension": "File upload stopped by extension", + "upload.error.formSize": "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the form", + "upload.error.iniPostSize": "The uploaded file exceeds the post_max_size directive in php.ini", + "upload.error.iniSize": "The uploaded file exceeds the upload_max_filesize directive in php.ini", + "upload.error.noFile": "No file was uploaded", + "upload.error.noFiles": "No files were uploaded", + "upload.error.partial": "The uploaded file was only partially uploaded", + "upload.error.tmpDir": "Missing a temporary folder", + "upload.errors": "Chyba", + "upload.progress": "Nahrávanie...", + + "url": "URL", + "url.placeholder": "https://example.com", + + "user": "Užívateľ", + "user.blueprint": "You can define additional sections and form fields for this user role in /site/blueprints/users/{blueprint}.yml", + "user.changeEmail": "Zmeniť e-mail", + "user.changeLanguage": "Zmeniť jazyk", + "user.changeName": "Premenovať tohto užívateľa", + "user.changePassword": "Zmeniť heslo", + "user.changePassword.new": "Nové heslo", + "user.changePassword.new.confirm": "Potvrdiť nové heslo...", + "user.changeRole": "Zmeniť rolu", + "user.changeRole.select": "Zvoliť novú rolu", + "user.create": "Pridať nového užívateľa", + "user.delete": "Zmazať tohto užívateľa", + "user.delete.confirm": "Ste si istý, že chcete zmazať
{email}?", + + "users": "Užívatelia", + + "version": "Verzia", + "version.current": "Current version", + "version.latest": "Latest version", + "versionInformation": "Version information", + + "view.account": "Váš účet", + "view.installation": "Inštalácia", + "view.languages": "Jazyky", + "view.resetPassword": "Reset password", + "view.site": "Portál", + "view.system": "System", + "view.users": "Užívatelia", + + "welcome": "Vitajte", + "year": "Rok", + "yes": "yes" +} diff --git a/kirby/i18n/translations/sv_SE.json b/kirby/i18n/translations/sv_SE.json new file mode 100644 index 0000000..b390a61 --- /dev/null +++ b/kirby/i18n/translations/sv_SE.json @@ -0,0 +1,730 @@ +{ + "account.changeName": "Ändra ditt namn", + "account.delete": "Radera ditt konto", + "account.delete.confirm": "Vill du verkligen radera ditt konto? Du kommer att loggas ut omedelbart. Ditt konto kan inte återställas.", + + "activate": "Aktivera", + "add": "L\u00e4gg till", + "alpha": "Alpha", + "author": "Författare", + "avatar": "Profilbild", + "back": "Tillbaka", + "cancel": "Avbryt", + "change": "\u00c4ndra", + "close": "St\u00e4ng", + "changes": "Ändringar", + "confirm": "Spara", + "collapse": "Kollapsa", + "collapse.all": "Kollapsa alla", + "color": "Färg", + "coordinates": "Koordinater", + "copy": "Kopiera", + "copy.all": "Kopiera alla", + "copy.success": "{count} kopierad!", + "create": "Skapa", + "custom": "Anpassad", + + "date": "Datum", + "date.select": "Välj ett datum", + + "day": "Dag", + "days.fri": "Fre", + "days.mon": "M\u00e5n", + "days.sat": "L\u00f6r", + "days.sun": "S\u00f6n", + "days.thu": "Tor", + "days.tue": "Tis", + "days.wed": "Ons", + + "debugging": "Felsökning", + + "delete": "Radera", + "delete.all": "Radera allt", + + "dialog.fields.empty": "Den här dialogrutan har inga fält", + "dialog.files.empty": "Inga filer att välja", + "dialog.pages.empty": "Inga sidor att välja", + "dialog.text.empty": "Den här dialogrutan definierar ingen text", + "dialog.users.empty": "Inga användare att välja", + + "dimensions": "Dimensioner", + "disable": "Inaktivera", + "disabled": "Inaktiverad", + "discard": "Kassera", + + "drawer.fields.empty": "Denna vy har inga fält", + + "domain": "Domän", + "download": "Ladda ner", + "duplicate": "Duplicera", + + "edit": "Redigera", + + "email": "E-postadress", + "email.placeholder": "namn@exempel.se", + + "enter": "Enter", + "entries": "Poster", + "entry": "Post", + + "environment": "Miljö", + + "error": "Fel", + "error.access.code": "Ogiltig kod", + "error.access.login": "Ogiltig inloggning", + "error.access.panel": "Du saknar behörighet att nå panelen", + "error.access.view": "Du saknar behörighet att nå denna del av panelen", + + "error.avatar.create.fail": "Profilbilden kunde inte laddas upp", + "error.avatar.delete.fail": "Profilbilden kunde inte raderas", + "error.avatar.dimensions.invalid": "Se till att profilbildens bredd och höjd är mindre än 3000 pixlar", + "error.avatar.mime.forbidden": "Profilbilden måste vara i formatet JPEG eller PNG", + + "error.blueprint.notFound": "Blueprint \"{name}\" kunde inte laddas", + + "error.blocks.max.plural": "Du får inte lägga till mer än {max} block", + "error.blocks.max.singular": "Du får inte lägga till mer än ett block", + "error.blocks.min.plural": "Du måste lägga till minst {min} block", + "error.blocks.min.singular": "Du måste lägga till minst ett block", + "error.blocks.validation": "Det finns ett fel i fältet \"{field}\" i block {index} med blocktypen \"{fieldset}\"", + + "error.cache.type.invalid": "Ogiltig cachetyp \"{type}\"", + + "error.email.preset.notFound": "E-postförinställningen \"{name}\" kan inte hittas", + + "error.field.converter.invalid": "Ogiltig omvandlare \"{converter}\"", + "error.field.type.missing": "Fältet \"{ name }\": Fälttypen \"{ type }\" finns inte", + + "error.file.changeName.empty": "Namnet får inte vara tomt", + "error.file.changeName.permission": "Du har inte behörighet att ändra namnet på \"{filename}\"", + "error.file.changeTemplate.invalid": "Mallen för filen \"{id}\" kan inte ändras till \"{template}\" (giltiga mallar: \"{blueprints}\")", + "error.file.changeTemplate.permission": "Du saknar behörighet för att ändra mallen för filen \"{id}\"", + + "error.file.duplicate": "En fil med namnet \"{filename}\" existerar redan", + "error.file.extension.forbidden": "Filändelsen \"{extension}\" är inte tillåten", + "error.file.extension.invalid": "Ogiltig filändelse: {extension}", + "error.file.extension.missing": "Filen \"{filename}\" saknar filändelse", + "error.file.maxheight": "Bildens höjd får inte överstiga {height} pixlar", + "error.file.maxsize": "Filen är för stor", + "error.file.maxwidth": "Bildens bredd får inte överstiga {width} pixlar", + "error.file.mime.differs": "Den uppladdade filen måste vara av samma mime-typ \"{mime}\"", + "error.file.mime.forbidden": "Mediatypen \"{mime}\" är inte tillåten", + "error.file.mime.invalid": "Ogiltig mime-typ: {mime}", + "error.file.mime.missing": "Mediatypen för \"{filename}\" kan inte detekteras", + "error.file.minheight": "Bildens höjd måste vara minst {height} pixlar", + "error.file.minsize": "Filen är för liten", + "error.file.minwidth": "Bildens bredd måste vara minst {width} pixlar", + "error.file.name.unique": "Filnamnet måste vara unikt", + "error.file.name.missing": "Filnamnet får inte vara tomt", + "error.file.notFound": "Filen \"{filename}\" kan ej hittas", + "error.file.orientation": "Bildens orientering måste vara \"{orientation}\"", + "error.file.type.forbidden": "Du har inte behörighet att ladda upp filer av typen {type}", + "error.file.type.invalid": "Ogiltig filtyp: {type}", + "error.file.undefined": "Filen kan inte hittas", + + "error.form.incomplete": "Vänligen åtgärda alla formulärfel...", + "error.form.notSaved": "Formuläret kunde inte sparas", + + "error.language.code": "Ange en giltig kod för språket", + "error.language.duplicate": "Språket finns redan", + "error.language.name": "Ange ett giltigt namn för språket", + "error.language.notFound": "Språket hittades inte", + + "error.layout.validation.block": "Det finns ett fel i fältet \"{field}\" i blocket {blockIndex} med blocktypen \"{fieldset}\" i layouten {layoutIndex}", + "error.layout.validation.settings": "Det finns ett fel i inställningarna för layout {index}", + + "error.license.domain": "Domänen för licensen saknas", + "error.license.email": "Ange en giltig e-postadress", + "error.license.format": "Ange en giltig licenskod", + "error.license.verification": "Licensen kunde inte verifieras", + + "error.login.totp.confirm.invalid": "Ogiltig kod", + "error.login.totp.confirm.missing": "Vänligen ange den aktuella koden", + + "error.object.validation": "Det finns ett fel i fältet \"{label}\":\n{message}", + + "error.offline": "Panelen är för närvarande offline", + + "error.page.changeSlug.permission": "Du har inte behörighet att ändra URL-appendixen för \"{slug}\"", + "error.page.changeSlug.reserved": "Sökvägen till sidor på toppnivå får inte börja med \"{path}\"", + "error.page.changeStatus.incomplete": "Sidan innehåller fel och kan inte publiceras", + "error.page.changeStatus.permission": "Statusen för denna sida kan inte ändras", + "error.page.changeStatus.toDraft.invalid": "Statusen för sidan \"{slug}\" kan inte ändras till utkast", + "error.page.changeTemplate.invalid": "Mallen för sidan \"{slug}\" kan inte ändras", + "error.page.changeTemplate.permission": "Du har inte behörighet att ändra mallen för \"{slug}\"", + "error.page.changeTitle.empty": "Titeln får inte vara tom", + "error.page.changeTitle.permission": "Du har inte behörighet att ändra titeln för \"{slug}\"", + "error.page.create.permission": "Du har inte behörighet att skapa \"{slug}\"", + "error.page.delete": "Sidan \"{slug}\" kan inte raderas", + "error.page.delete.confirm": "Fyll i sidans titel för att bekräfta", + "error.page.delete.hasChildren": "Sidan har undersidor och kan inte raderas", + "error.page.delete.permission": "Du har inte behörighet att radera \"{slug}\"", + "error.page.draft.duplicate": "Ett utkast med URL-appendixen \"{slug}\" existerar redan", + "error.page.duplicate": "En sida med URL-appendixen \"{slug}\" existerar redan", + "error.page.duplicate.permission": "Du har inte behörighet att duplicera \"{slug}\"", + "error.page.move.ancestor": "Sidan kan inte flyttas in i sig själv", + "error.page.move.directory": "Sidans mapp kan inte flyttas", + "error.page.move.duplicate": "En undersida med URL-appendixen \"{slug}\" existerar redan", + "error.page.move.notFound": "Den flyttade sidan kunde inte hittas", + "error.page.move.permission": "Du saknar behörighet för att flytta \"{slug}\"", + "error.page.move.template": "Mallen \"{template}\" accepteras inte som en undersida till \"{parent}\"", + "error.page.notFound": "Sidan \"{slug}\" kan inte hittas", + "error.page.num.invalid": "Ange ett giltigt nummer för sortering. Numret får inte vara negativt.", + "error.page.slug.invalid": "Ange en giltig URL-appendix", + "error.page.slug.maxlength": "Permalänkens längd måste vara kortare än \"{length}\" tecken", + "error.page.sort.permission": "Sidan \"{slug}\" kan inte sorteras", + "error.page.status.invalid": "Sätt en giltig status för sidan", + "error.page.undefined": "Sidan kan inte hittas", + "error.page.update.permission": "Du har inte behörighet att uppdatera \"{slug}\"", + + "error.section.files.max.plural": "Du får inte lägga till mer än {max} filer till sektionen \"{section}\"", + "error.section.files.max.singular": "Du får inte lägga till mer än en fil i sektionen \"{section}\"", + "error.section.files.min.plural": "Sektionen \"{section}\" kräver minst {min} filer", + "error.section.files.min.singular": "Sektionen \"{section}\" kräver minst en fil", + + "error.section.pages.max.plural": "Du får inte lägga till mer än {max} sidor till sektionen \"{section}\"", + "error.section.pages.max.singular": "Du får inte lägga till mer än en sida i sektionen \"{section}\"", + "error.section.pages.min.plural": "Sektionen \"{section}\" kräver minst {min} sidor", + "error.section.pages.min.singular": "Sektionen \"{section}\" kräver minst en sida", + + "error.section.notLoaded": "Sektionen \"{name}\" kunde inte laddas", + "error.section.type.invalid": "Sektionstypen \"{type}\" är inte giltig", + + "error.site.changeTitle.empty": "Titeln får inte vara tom", + "error.site.changeTitle.permission": "Du har inte behörighet att ändra titeln på webbplatsen", + "error.site.update.permission": "Du har inte behörighet att uppdatera webbplatsen", + + "error.structure.validation": "Det finns ett fel i fältet \"{field}\" i rad {index}", + + "error.template.default.notFound": "Standardmallen finns inte", + + "error.unexpected": "Ett oväntat fel uppstod! Aktivera felsökningsläge för mer information: https://getkirby.com/docs/reference/system/options/debug", + + "error.user.changeEmail.permission": "Du har inte behörighet att ändra e-postadressen för användaren \"{name}\"", + "error.user.changeLanguage.permission": "Du har inte behörighet att ändra språket för användaren \"{name}\"", + "error.user.changeName.permission": "Du har inte behörighet att ändra namnet för användaren \"{name}\"", + "error.user.changePassword.permission": "Du har inte behörighet att ändra lösenordet för användaren \"{name}\"", + "error.user.changeRole.lastAdmin": "Rollen för den återstående adminanvändaren kan inte ändras", + "error.user.changeRole.permission": "Du har inte behörighet att ändra rollen för användaren \"{name}\"", + "error.user.changeRole.toAdmin": "Du har inte behörighet att ge någon en administratörsroll", + "error.user.create.permission": "Du har inte behörighet att skapa denna användare", + "error.user.delete": "Användaren kan inte raderas", + "error.user.delete.lastAdmin": "Den återstående administratören kan inte raderas", + "error.user.delete.lastUser": "Den återstående användaren kan inte raderas", + "error.user.delete.permission": "Du har inte behörighet att radera användaren \"{name}\"", + "error.user.duplicate": "En användare med e-postadressen \"{email}\" finns redan", + "error.user.email.invalid": "Ange en giltig e-postadress", + "error.user.language.invalid": "Ange ett giltigt språk", + "error.user.notFound": "Användaren \"{name}\" kan ej hittas", + "error.user.password.excessive": "Var vänlig skriv in ett giltigt lösenord. Lösenord får inte vara längre än 1000 tecken.", + "error.user.password.invalid": "Ange ett giltigt lösenord. Lösenordet måste vara minst 8 tecken långt.", + "error.user.password.notSame": "Lösenorden matchar inte", + "error.user.password.undefined": "Användaren har inget lösenord", + "error.user.password.wrong": "Fel lösenord", + "error.user.role.invalid": "Ange en giltig roll", + "error.user.undefined": "Användaren kan inte hittas", + "error.user.update.permission": "Du har inte behörighet att uppdatera användaren \"{name}\"", + + "error.validation.accepted": "Vänligen bekräfta", + "error.validation.alpha": "Ange endast tecken mellan a-z", + "error.validation.alphanum": "Ange endast tecken mellan a-z eller siffror 0-9", + "error.validation.anchor": "Vänligen ange en korrekt länk", + "error.validation.between": "Ange ett värde mellan \"{min}\" och \"{max}\"", + "error.validation.boolean": "Bekräfta eller neka", + "error.validation.color": "Ange en giltig färg i formatet {format}", + "error.validation.contains": "Ange ett värde som innehåller \"{needle}\"", + "error.validation.date": "Ange ett giltigt datum", + "error.validation.date.after": "Ange ett datum efter {date}", + "error.validation.date.before": "Ange ett datum före {date}", + "error.validation.date.between": "Ange ett datum mellan {min} och {max}", + "error.validation.denied": "Vänligen neka", + "error.validation.different": "Värdet får inte vara \"{other}\"", + "error.validation.email": "Ange en giltig e-postadress", + "error.validation.endswith": "Värdet måste sluta med \"{end}\"", + "error.validation.filename": "Ange ett giltigt filnamn", + "error.validation.in": "Ange ett av följande: ({in})", + "error.validation.integer": "Ange en giltig heltalssiffra", + "error.validation.ip": "Ange en giltig IP-adress", + "error.validation.less": "Ange ett värde lägre än {max}", + "error.validation.linkType": "Länktypen är inte tillåten", + "error.validation.match": "Värdet matchar inte det förväntade mönstret", + "error.validation.max": "Ange ett värde som är lika med eller lägre än {max}", + "error.validation.maxlength": "Ange ett kortare värde. (max {max} tecken)", + "error.validation.maxwords": "Ange inte mer än {max} ord", + "error.validation.min": "Ange ett värde som är lika med eller större än {min}", + "error.validation.minlength": "Ange ett längre värde. (minst {min} tecken)", + "error.validation.minwords": "Ange minst {min} ord", + "error.validation.more": "Ange ett större värde än {min}", + "error.validation.notcontains": "Ange ett värde som inte innehåller \"{needle}\"", + "error.validation.notin": "Ange inte något av följande: ({notIn})", + "error.validation.option": "Välj ett giltigt alternativ", + "error.validation.num": "Ange ett giltigt nummer", + "error.validation.required": "Ange någonting", + "error.validation.same": "Ange \"{other}\"", + "error.validation.size": "Storleken av värdet måste vara \"{size}\"", + "error.validation.startswith": "Värdet måste börja med \"{start}\"", + "error.validation.tel": "Ange ett oformaterat telefonnummer", + "error.validation.time": "Ange en giltig tid", + "error.validation.time.after": "Ange en tid efter {time}", + "error.validation.time.before": "Ange en tid före {time}", + "error.validation.time.between": "Ange en tid mellan {min} och {max}", + "error.validation.uuid": "Ange ett giltigt UUID", + "error.validation.url": "Ange en giltig URL", + + "expand": "Expandera", + "expand.all": "Expandera alla", + + "field.invalid": "Fältet är ogiltigt", + "field.required": "Fältet krävs", + "field.blocks.changeType": "Ändra typ", + "field.blocks.code.name": "Kod", + "field.blocks.code.language": "Språk", + "field.blocks.code.placeholder": "Din kod …", + "field.blocks.delete.confirm": "Vill du verkligen radera detta block?", + "field.blocks.delete.confirm.all": "Vill du verkligen radera alla block?", + "field.blocks.delete.confirm.selected": "Vill du verkligen radera de valda blocken?", + "field.blocks.empty": "Inga block än", + "field.blocks.fieldsets.empty": "Inga fältuppsättningar ännu", + "field.blocks.fieldsets.label": "Välj en typ av block …", + "field.blocks.fieldsets.paste": "Tryck på {{ shortcut }} för att importera layouter/block från urklipp Endast de som är tillåtna i det aktuella fältet kommer att infogas.", + "field.blocks.gallery.name": "Galleri", + "field.blocks.gallery.images.empty": "Inga bilder än", + "field.blocks.gallery.images.label": "Bilder", + "field.blocks.heading.level": "Nivå", + "field.blocks.heading.name": "Rubrik", + "field.blocks.heading.text": "Text", + "field.blocks.heading.placeholder": "Rubrik …", + "field.blocks.image.alt": "Alternativ text", + "field.blocks.image.caption": "Rubrik", + "field.blocks.image.crop": "Beskär", + "field.blocks.image.link": "Länk", + "field.blocks.image.location": "Plats", + "field.blocks.image.location.internal": "Denna webbplats", + "field.blocks.image.location.external": "Extern källa", + "field.blocks.image.name": "Bild", + "field.blocks.image.placeholder": "Välj en bild", + "field.blocks.image.ratio": "Bildförhållande", + "field.blocks.image.url": "Bild-URL", + "field.blocks.line.name": "Linje", + "field.blocks.list.name": "Punktlista", + "field.blocks.markdown.name": "Markdown", + "field.blocks.markdown.label": "Text", + "field.blocks.markdown.placeholder": "Markdown …", + "field.blocks.quote.name": "Citat", + "field.blocks.quote.text.label": "Text", + "field.blocks.quote.text.placeholder": "Citat …", + "field.blocks.quote.citation.label": "Citat", + "field.blocks.quote.citation.placeholder": "av …", + "field.blocks.text.name": "Text", + "field.blocks.text.placeholder": "Text …", + "field.blocks.video.autoplay": "Autospela", + "field.blocks.video.caption": "Rubrik", + "field.blocks.video.controls": "Kontroller", + "field.blocks.video.location": "Plats", + "field.blocks.video.loop": "Loopa", + "field.blocks.video.muted": "Ljud av", + "field.blocks.video.name": "Video", + "field.blocks.video.placeholder": "Ange en URL till en video", + "field.blocks.video.poster": "Stillbild", + "field.blocks.video.preload": "Förladda", + "field.blocks.video.url.label": "Video-URL", + "field.blocks.video.url.placeholder": "https://youtube.com/?v=", + + "field.files.empty": "Inga filer valda än", + + "field.layout.change": "Ändra layout", + "field.layout.delete": "Radera layout", + "field.layout.delete.confirm": "Vill du verkligen radera denna layout?", + "field.layout.delete.confirm.all": "Vill du verkligen ta bort alla layouter?", + "field.layout.empty": "Inga rader än", + "field.layout.select": "Välj en layout", + + "field.object.empty": "Ingen information ännu", + + "field.pages.empty": "Inga sidor valda än", + + "field.structure.delete.confirm": "Vill du verkligen radera denna rad?", + "field.structure.delete.confirm.all": "Vill du verkligen radera alla poster?", + "field.structure.empty": "Inga poster än", + + "field.users.empty": "Inga användare valda än", + + "fields.empty": "Inga fält ännu", + + "file": "Fil", + "file.blueprint": "Denna fil har ingen blueprint än. Du kan skapa en i /site/blueprints/files/{blueprint}.yml", + "file.changeTemplate": "Ändra mall", + "file.changeTemplate.notice": "Att ändra filens mall kommer att ta bort innehåll för fält som inte matchar fältets typ. Om den nya mallen definierar vissa regler, t.ex. bilddimensioner, kommer de också att tillämpas oåterkalleligt. Använd med försiktighet.", + "file.delete.confirm": "Vill du verkligen radera
{filename}?", + "file.focus.placeholder": "Ange fokuspunkt", + "file.focus.reset": "Ta bort fokuspunkt", + "file.focus.title": "Fokus", + "file.sort": "Ändra position", + + "files": "Filer", + "files.empty": "Inga filer än", + + "filter": "Filter", + + "hide": "Göm", + "hour": "Timme", + "hue": "Nyans", + "import": "Importera", + "info": "Info", + "insert": "Infoga", + "insert.after": "Infoga efter", + "insert.before": "Infoga före", + "install": "Installera", + + "installation": "Installation", + "installation.completed": "Panelen har installerats", + "installation.disabled": "Installeraren för panelen är som standard inaktiverad på offentliga servrar. Kör installeraren på en lokal maskin eller aktivera den med alternativet panel.install.", + "installation.issues.accounts": "Mappen /site/accounts finns inte eller är inte skrivbar", + "installation.issues.content": "Mappen /content finns inte eller är inte skrivbar", + "installation.issues.curl": "Tillägget CURL krävs", + "installation.issues.headline": "Panelen kan inte installeras", + "installation.issues.mbstring": "Tillägget MB String krävs", + "installation.issues.media": "Mappen /media finns inte eller är inte skrivbar", + "installation.issues.php": "Se till att du använder PHP 8+", + "installation.issues.sessions": "Mappen /site/sessions finns inte eller är inte skrivbar", + + "language": "Spr\u00e5k", + "language.code": "Kod", + "language.convert": "Ange som standard", + "language.convert.confirm": "

Vill du verkligen göra {name} till standardspråket? Detta kan inte ångras.

Om {name} har oöversatt innehåll, kommer det inte längre finnas en alternativ översättning och delar av sajten kommer kanske att vara tom.

", + "language.create": "Lägg till ett nytt språk", + "language.default": "Standardspråk", + "language.delete.confirm": "Vill du verkligen radera språket {name} inklusive alla översättningar? Detta kan inte ångras!", + "language.deleted": "Språket har raderats", + "language.direction": "Läsriktning", + "language.direction.ltr": "Vänster till höger", + "language.direction.rtl": "Höger till vänster", + "language.locale": "PHP locale string", + "language.locale.warning": "Du använder en anpassad språkinställning. Ändra den i språkfilen i mappen /site/languages", + "language.name": "Namn", + "language.secondary": "Sekundärt språk", + "language.settings": "Språkinställningar", + "language.updated": "Språket har uppdaterats", + "language.variables": "Språkvariabler", + "language.variables.empty": "Inga översättningar ännu", + + "language.variable.delete.confirm": "Vill du verkligen ta bort variabeln för {key}?", + "language.variable.key": "Nyckel", + "language.variable.notFound": "Variabeln kunde inte hittas", + "language.variable.value": "Värde", + + "languages": "Språk", + "languages.default": "Standardspråk", + "languages.empty": "Det finns inga språk ännu", + "languages.secondary": "Sekundära språk", + "languages.secondary.empty": "Det finns inga sekundära språk ännu", + + "license": "Licens", + "license.activate": "Aktivera nu", + "license.activate.label": "Vänligen aktivera din licens", + "license.activate.domain": "Din licens kommer att vara aktiverad för {host}.", + "license.activate.local": "Du är på väg att aktivera din Kirby-licens för din lokala domän {host}. Om den här webbplatsen kommer att publiceras på en offentlig domän, aktivera den där istället. Om {host} är domänen du vill använda din licens för, fortsätt.", + "license.activated": "Aktiverad", + "license.buy": "Köp en licens", + "license.code": "Kod", + "license.code.help": "Du fick din licenskod efter köpet via e-post. Kopiera och klistra in det här.", + "license.code.label": "Ange din licenskod", + "license.status.active.info": "Inkluderar nya större versioner fram till {date}", + "license.status.active.label": "Giltig licens", + "license.status.demo.info": "Detta är en demoinstallation", + "license.status.demo.label": "Demo", + "license.status.inactive.info": "Förnya licensen för att uppdatera till nyare större versioner", + "license.status.inactive.label": "Inga nya större versioner", + "license.status.legacy.bubble": "Är du redo att förnya din licens?", + "license.status.legacy.info": "Din licens täcker inte denna version", + "license.status.legacy.label": "Vänligen förnya din licens", + "license.status.missing.bubble": "Är du redo att lansera din webbplats?", + "license.status.missing.info": "Ingen giltig licens", + "license.status.missing.label": "Vänligen aktivera din licens", + "license.manage": "Hantera dina licenser", + "license.purchased": "Köpt", + "license.success": "Tack för att du stödjer Kirby", + "license.unregistered.label": "Oregistrerad", + + "link": "L\u00e4nk", + "link.text": "L\u00e4nktext", + + "loading": "Laddar", + + "lock.unsaved": "Osparade ändringar", + "lock.unsaved.empty": "Det finns inga fler osparade ändringar", + "lock.isLocked": "Osparade ändringar av {email}", + "lock.unlock": "Lås upp", + "lock.unlock.submit": "Lås upp och skriv över osparade ändringar av {email}", + "lock.isUnlocked": "Låstes upp av en annan användare", + + "login": "Logga in", + "login.code.label.login": "Inloggningskod", + "login.code.label.password-reset": "Kod för återställning av lösenord", + "login.code.placeholder.email": "000 000", + "login.code.placeholder.totp": "000000", + "login.code.text.email": "Om din e-postadress är registrerad skickades den begärda koden via e-post.", + "login.code.text.totp": "Ange engångskoden från din autentiseringsapp.", + "login.email.login.body": "Hej {user.nameOrEmail}.\n\nDu begärde nyligen en inloggningskod till panelen för {site}.\nFöljande kod är giltig i {timeout} minuter:\n\n{code}\n\nOm du inte har begärt någon inloggningskod, ignorera detta e-postmeddelande eller kontakta din administratör om du har frågor.\nAv säkerhetsskäl, vidarebefordra INTE detta e-postmeddelande.", + "login.email.login.subject": "Din inloggningskod", + "login.email.password-reset.body": "Hej {user.nameOrEmail}.\n\nDu begärde nyligen en kod för återställning av ditt lösenord till panelen för {site}.\nFöljande kod är giltig i {timeout} minuter:\n\n{code}\n\nOm du inte har begärt en återställning av ditt lösenord, ignorera detta e-postmeddelande eller kontakta din administratör om du har frågor.\nAv säkerhetsskäl, vidarebefordra INTE detta e-postmeddelande.", + "login.email.password-reset.subject": "Din kod för återställning av lösenord", + "login.remember": "Håll mig inloggad", + "login.reset": "Återställ lösenord", + "login.toggleText.code.email": "Logga in via e-post", + "login.toggleText.code.email-password": "Logga in med lösenord", + "login.toggleText.password-reset.email": "Glömt ditt lösenord?", + "login.toggleText.password-reset.email-password": "← Tillbaka till inloggning", + "login.totp.enable.option": "Ställ in engångskoder", + "login.totp.enable.intro": "Autentiseringsappar kan generera engångskoder som används som en andra faktor när du loggar in på ditt konto.", + "login.totp.enable.qr.label": "1. Skanna den här QR-koden", + "login.totp.enable.qr.help": "Kan du inte skanna? Lägg till inställningsnyckeln {secret} manuellt i din autentiseringsapp.", + "login.totp.enable.confirm.headline": "2. Bekräfta med genererad kod", + "login.totp.enable.confirm.text": "Din app genererar en ny engångskod var 30:e sekund. Ange den aktuella koden för att slutföra installationen:", + "login.totp.enable.confirm.label": "Nuvarande kod", + "login.totp.enable.confirm.help": "Efter denna installation kommer vi att be dig om en engångskod varje gång du loggar in.", + "login.totp.enable.success": "Engångskoder aktiverade", + "login.totp.disable.option": "Inaktivera engångskoder", + "login.totp.disable.label": "Ange ditt lösenord för att inaktivera engångskoder", + "login.totp.disable.help": "I fortsättningen kommer en annan andra faktor som en inloggningskod som skickas via e-post att begäras när du loggar in. Du kan alltid ställa in engångskoder igen senare.", + "login.totp.disable.admin": "

Detta kommer att inaktivera engångskoder för {user}.

I fortsättningen kommer en annan andra faktor som en inloggningskod som skickas via e-post att begäras när de loggar in. {user} kan ställa in engångskoder igen efter nästa inloggning.

", + "login.totp.disable.success": "Engångskoder inaktiverade", + + "logout": "Logga ut", + + "merge": "Slå ihop", + "menu": "Meny", + "meridiem": "a.m./p.m.", + "mime": "Mediatyp", + "minutes": "Minuter", + + "month": "Månad", + "months.april": "April", + "months.august": "Augusti", + "months.december": "December", + "months.february": "Februari", + "months.january": "Januari", + "months.july": "Juli", + "months.june": "Juni", + "months.march": "Mars", + "months.may": "Maj", + "months.november": "November", + "months.october": "Oktober", + "months.september": "September", + + "more": "Mer", + "move": "Flytta", + "name": "Namn", + "next": "Nästa", + "night": "Natt", + "no": "nej", + "off": "av", + "on": "på", + "open": "Öppna", + "open.newWindow": "Öppna i nytt fönster", + "option": "Alternativ", + "options": "Alternativ", + "options.none": "Inga alternativ", + "options.all": "Visa alla {count} alternativ", + + "orientation": "Orientering", + "orientation.landscape": "Liggande", + "orientation.portrait": "Stående", + "orientation.square": "Kvadrat", + + "page": "Sida", + "page.blueprint": "Denna sida har ingen blueprint än. Du kan skapa en i /site/blueprints/pages/{blueprint}.yml", + "page.changeSlug": "Ändra URL", + "page.changeSlug.fromTitle": "Skapa utifr\u00e5n titel", + "page.changeStatus": "Ändra status", + "page.changeStatus.position": "Välj en ny position", + "page.changeStatus.select": "Välj en ny status", + "page.changeTemplate": "Ändra mall", + "page.changeTemplate.notice": "Att ändra filens mall kommer att ta bort innehåll för fält som inte matchar fältets typ. Använd med försiktighet.", + "page.create": "Skapa som {status}", + "page.delete.confirm": "Vill du verkligen radera {title}?", + "page.delete.confirm.subpages": "Denna sida har undersidor.
Alla undersidor kommer också att raderas.", + "page.delete.confirm.title": "Fyll i sidans titel för att bekräfta", + "page.duplicate.appendix": "Kopiera", + "page.duplicate.files": "Kopiera filer", + "page.duplicate.pages": "Kopiera sidor", + "page.move": "Flytta sidan", + "page.sort": "Ändra position", + "page.status": "Status", + "page.status.draft": "Utkast", + "page.status.draft.description": "Sidan är ett utkast och endast synlig för inloggade redaktörer eller via en hemlig länk", + "page.status.listed": "Publik", + "page.status.listed.description": "Sidan är publik för vem som helst", + "page.status.unlisted": "Olistad", + "page.status.unlisted.description": "Sidan är endast åtkomlig via URL", + + "pages": "Sidor", + "pages.empty": "Inga sidor än", + "pages.status.draft": "Utkast", + "pages.status.listed": "Publicerade", + "pages.status.unlisted": "Olistade", + + "pagination.page": "Sida", + + "password": "L\u00f6senord", + "paste": "Klistra in", + "paste.after": "Klistra in efter", + "paste.success": "{count} har klistrats in!", + "pixel": "Pixel", + "plugin": "Tillägg", + "plugins": "Tillägg", + "prev": "Föregående", + "preview": "Förhandsgranska", + "remove": "Ta bort", + "rename": "Byt namn", + "renew": "Förnya", + "replace": "Ersätt", + "replace.with": "Ersätt med", + "retry": "F\u00f6rs\u00f6k igen", + "revert": "Återgå", + "revert.confirm": "Vill du verkligen radera alla osparade ändringar?", + + "role": "Roll", + "role.admin.description": "Administratören har alla behörigheter", + "role.admin.title": "Administratör", + "role.all": "Alla", + "role.empty": "Det finns inga användare med denna roll", + "role.description.placeholder": "Ingen beskrivning", + "role.nobody.description": "Detta är en roll utan några behörigheter", + "role.nobody.title": "Ingen", + + "save": "Spara", + "search": "Sök", + "search.min": "Ange {min} tecken för att söka", + "search.all": "Visa alla {count} resultat", + "search.results.none": "Inga träffar", + + "section.invalid": "Sektionen är ogiltig", + "section.required": "Sektionen krävs", + + "security": "Säkerhet", + "select": "Välj", + "server": "Server", + "settings": "Inställningar", + "show": "Visa", + "site.blueprint": "Webbplatsen har ingen blueprint än. Du kan skapa en i /site/blueprints/site.yml", + "size": "Storlek", + "slug": "URL-appendix", + "sort": "Sortera", + "sort.drag": "Dra för att sortera …", + "split": "Dela", + + "stats.empty": "Inga rapporter", + "status": "Status", + + "system.info.copy": "Copy info", + "system.info.copied": "System info copied", + "system.issues.content": "Mappen content verkar vara exponerad", + "system.issues.eol.kirby": "Din installerade Kirby-version har nått slutet av sin livscykel och kommer inte att få fler säkerhetsuppdateringar", + "system.issues.eol.plugin": "Den installerade versionen av tillägget { plugin } har nått slutet på sin livscykel och kommer inte att få fler säkerhetsuppdateringar.", + "system.issues.eol.php": "Din installerade PHP-version { release } har nått slutet av sin livslängd och kommer inte att få fler säkerhetsuppdateringar", + "system.issues.debug": "Felsökningsläget måste vara avstängt i produktion", + "system.issues.git": "Mappen .git verkar vara exponerad", + "system.issues.https": "Vi rekommenderar HTTPS för alla dina webbplatser", + "system.issues.kirby": "Mappen kirby verkar vara exponerad", + "system.issues.site": "Mappen site verkar vara exponerad", + "system.issues.vulnerability.kirby": "Din installation kan vara påverkad av följande sårbarhet ({ severity } allvarlighetsgrad): { description }", + "system.issues.vulnerability.plugin": "Din installation kan vara påverkad av följande sårbarhet i tillägget { plugin } ({ severity } allvarlighetsgrad): { description }", + "system.updateStatus": "Uppdateringsstatus", + "system.updateStatus.error": "Det gick inte att söka efter uppdateringar", + "system.updateStatus.not-vulnerable": "Inga kända sårbarheter", + "system.updateStatus.security-update": "Gratis säkerhetsuppdatering { version } tillgänglig", + "system.updateStatus.security-upgrade": "Uppgradering { version } med säkerhetskorrigeringar är tillgänglig", + "system.updateStatus.unreleased": "Osläppt version", + "system.updateStatus.up-to-date": "Uppdaterad", + "system.updateStatus.update": "Gratis uppdatering { version } tillgänglig", + "system.updateStatus.upgrade": "Uppgradering { version } tillgänglig", + + "tel": "Telefon", + "tel.placeholder": "+46701234567", + "template": "Mall", + "title": "Titel", + "today": "Idag", + + "toolbar.button.clear": "Rensa formatering", + "toolbar.button.code": "Kod", + "toolbar.button.bold": "Fet", + "toolbar.button.email": "E-post", + "toolbar.button.headings": "Rubriker", + "toolbar.button.heading.1": "Rubrik 1", + "toolbar.button.heading.2": "Rubrik 2", + "toolbar.button.heading.3": "Rubrik 3", + "toolbar.button.heading.4": "Rubrik 4", + "toolbar.button.heading.5": "Rubrik 5", + "toolbar.button.heading.6": "Rubrik 6", + "toolbar.button.italic": "Kursiv", + "toolbar.button.file": "Fil", + "toolbar.button.file.select": "Välj en fil", + "toolbar.button.file.upload": "Ladda upp en fil", + "toolbar.button.link": "L\u00e4nk", + "toolbar.button.paragraph": "Stycke", + "toolbar.button.strike": "Genomstruken", + "toolbar.button.sub": "Nedsänkt", + "toolbar.button.sup": "Upphöjd", + "toolbar.button.ol": "Sorterad lista", + "toolbar.button.underline": "Understruken", + "toolbar.button.ul": "Punktlista", + + "translation.author": "Kirby-teamet, Ola Christensson", + "translation.direction": "ltr", + "translation.name": "Svenska", + "translation.locale": "sv_SE", + + "type": "Typ", + + "upload": "Ladda upp", + "upload.error.cantMove": "Den överförda filen kunde inte flyttas", + "upload.error.cantWrite": "Det gick inte att skriva filen till hårddisken", + "upload.error.default": "Filen kunde inte laddas upp", + "upload.error.extension": "Filuppladdningen förhindrades på grund av filändelsen", + "upload.error.formSize": "Den överförda filen överskrider den maximala filstorlek som anges i formuläret (MAX_FILE_SIZE)", + "upload.error.iniPostSize": "Den överförda filen överskrider post_max_size-direktivet i php.ini", + "upload.error.iniSize": "Den överförda filen överskrider direktivet upload_max_filesize i php.ini", + "upload.error.noFile": "Ingen fil laddades upp", + "upload.error.noFiles": "Inga filer laddades upp", + "upload.error.partial": "Den överförda filen laddades bara delvis upp", + "upload.error.tmpDir": "Saknar en temporär mapp", + "upload.errors": "Fel", + "upload.progress": "Laddar upp...", + + "url": "URL", + "url.placeholder": "https://exempel.se", + + "user": "Användare", + "user.blueprint": "Du kan skapa ytterligare sektioner och fält för den här användarrollen i /site/blueprints/users/{blueprint}.yml", + "user.changeEmail": "Ändra e-postadress", + "user.changeLanguage": "Ändra språk", + "user.changeName": "Byt namn på denna användare", + "user.changePassword": "Ändra lösenord", + "user.changePassword.new": "Nytt lösenord", + "user.changePassword.new.confirm": "Bekräfta det nya lösenordet...", + "user.changeRole": "Ändra roll", + "user.changeRole.select": "Välj en ny roll", + "user.create": "Lägg till en ny användare", + "user.delete": "Radera denna användare", + "user.delete.confirm": "Vill du verkligen radera
{email}?", + + "users": "Användare", + + "version": "Version", + "version.current": "Aktuell version", + "version.latest": "Senaste version", + "versionInformation": "Versionsinformation", + + "view.account": "Ditt konto", + "view.installation": "Installation", + "view.languages": "Språk", + "view.resetPassword": "Återställ lösenord", + "view.site": "Webbplats", + "view.system": "System", + "view.users": "Anv\u00e4ndare", + + "welcome": "Välkommen", + "year": "År", + "yes": "ja" +} diff --git a/kirby/i18n/translations/tr.json b/kirby/i18n/translations/tr.json new file mode 100644 index 0000000..16de5e3 --- /dev/null +++ b/kirby/i18n/translations/tr.json @@ -0,0 +1,730 @@ +{ + "account.changeName": "İsminizi değiştirin", + "account.delete": "Hesabınızı silin", + "account.delete.confirm": "Hesabınızı gerçekten silmek istiyor musunuz? Oturumunuz hemen sonlandırılacaktır. Hesabınız daha sonra geri alınamaz.", + + "activate": "Etkinleştir", + "add": "Ekle", + "alpha": "Alfa", + "author": "Yazar", + "avatar": "Profil resmi", + "back": "Geri", + "cancel": "\u0130ptal", + "change": "De\u011fi\u015ftir", + "close": "Kapat", + "changes": "Değişiklikler", + "confirm": "Tamam", + "collapse": "Daralt", + "collapse.all": "Tümünü daralt", + "color": "Renk", + "coordinates": "Koordinatlar", + "copy": "Kopyala", + "copy.all": "Tümünü kopyala", + "copy.success": "{count} kopyalandı!", + "create": "Oluştur", + "custom": "Özel", + + "date": "Tarih", + "date.select": "Bir tarih seçiniz", + + "day": "Gün", + "days.fri": "Cum", + "days.mon": "Pzt", + "days.sat": "Cmt", + "days.sun": "Paz", + "days.thu": "Per", + "days.tue": "Sal", + "days.wed": "\u00c7ar", + + "debugging": "Hata ayıklama", + + "delete": "Sil", + "delete.all": "Tümünü sil", + + "dialog.fields.empty": "Bu iletişim kutusunda alan yok", + "dialog.files.empty": "Seçilecek dosya yok", + "dialog.pages.empty": "Seçilecek sayfa yok", + "dialog.text.empty": "Bu iletişim kutusu herhangi bir metin tanımlamaz", + "dialog.users.empty": "Seçilecek kullanıcı yok", + + "dimensions": "Boyutlar", + "disable": "Devre dışı bırak", + "disabled": "Devredışı", + "discard": "Vazge\u00e7", + + "drawer.fields.empty": "Bu çekmecede alan yok", + + "domain": "Alan adı", + "download": "İndir", + "duplicate": "Kopyala", + + "edit": "D\u00fczenle", + + "email": "E-Posta", + "email.placeholder": "eposta@ornek.com", + + "enter": "Giriş", + "entries": "Girdiler", + "entry": "Girdi", + + "environment": "Ortam", + + "error": "Hata", + "error.access.code": "Geçersiz kod", + "error.access.login": "Geçersiz giriş", + "error.access.panel": "Panel'e erişim izniniz yok", + "error.access.view": "Panel'in bu bölümüne erişim izniniz yok", + + "error.avatar.create.fail": "Profil resmi yüklenemedi", + "error.avatar.delete.fail": "Profil resmi silinemedi", + "error.avatar.dimensions.invalid": "Lütfen profil resminin genişliğini ve yüksekliğini 3000 pikselin altında tutun", + "error.avatar.mime.forbidden": "Profil resmi JPEG veya PNG dosyaları olmalıdır", + + "error.blueprint.notFound": "\"{name}\" adlı plan yüklenemedi", + + "error.blocks.max.plural": "{max} bloktan fazlasını eklememelisiniz", + "error.blocks.max.singular": "Birden fazla blok eklememelisiniz", + "error.blocks.min.plural": "En az {min} blok eklemelisiniz", + "error.blocks.min.singular": "En az bir blok eklemelisiniz", + "error.blocks.validation": "\"{fieldset}\" blok türünü kullanan {index}. bloktaki \"{field}\" alanında bir hata var", + + "error.cache.type.invalid": "Geçersiz önbellek türü \"{type}\"", + + "error.email.preset.notFound": "\"{name}\" e-posta adresi bulunamadı", + + "error.field.converter.invalid": "Geçersiz dönüştürücü \"{converter}\"", + "error.field.type.missing": "\"{ name }\" alanı: \"{ type }\" alan türü mevcut değil", + + "error.file.changeName.empty": "İsim boş olmamalıdır", + "error.file.changeName.permission": "\"{filename}\" adını değiştiremezsiniz", + "error.file.changeTemplate.invalid": "\"{id}\" dosyası için şablon \"{template}\" olarak değiştirilemez (geçerli: \"{blueprints}\")", + "error.file.changeTemplate.permission": "\"{id}\" dosyası için şablonu değiştirmenize izin verilmiyor", + + "error.file.duplicate": "\"{filename}\" isimli bir dosya zaten var", + "error.file.extension.forbidden": "\"{extension}\" dosya uzantısına izin verilmiyor", + "error.file.extension.invalid": "Geçersiz uzantı: {extension}", + "error.file.extension.missing": "\"{filename}\" dosyasının uzantısı yok", + "error.file.maxheight": "Resmin yüksekliği {height} pikselden büyük olmamalıdır", + "error.file.maxsize": "Dosya çok büyük", + "error.file.maxwidth": "Resmin genişliği {width} pikselden büyük olmamalıdır", + "error.file.mime.differs": "Yüklenen dosya aynı dosya türü \"{mime}\" olmalıdır", + "error.file.mime.forbidden": "\"{mime}\" medya türüne izin verilmiyor", + "error.file.mime.invalid": "Geçersiz medya türü: {mime}", + "error.file.mime.missing": "\"{filename}\" için medya türü tespit edilemiyor", + "error.file.minheight": "Resmin yüksekliği en az {height} piksel olmalıdır", + "error.file.minsize": "Dosya çok küçük", + "error.file.minwidth": "Resmin genişliği en az {width} piksel olmalıdır", + "error.file.name.unique": "Dosya adı benzersiz olmalıdır", + "error.file.name.missing": "Dosya adı boş bırakılamaz", + "error.file.notFound": "\"{filename}\" dosyası bulunamadı", + "error.file.orientation": "Resmin oryantasyonu \"{orientation}\" olmalıdır", + "error.file.type.forbidden": "{type} dosya yükleme izni yok", + "error.file.type.invalid": "Geçersiz dosya türü: {type}", + "error.file.undefined": "Dosya bulunamad\u0131", + + "error.form.incomplete": "Lütfen tüm form hatalarını düzeltin...", + "error.form.notSaved": "Form kaydedilemedi", + + "error.language.code": "Lütfen dil için geçerli bir kod girin", + "error.language.duplicate": "Bu dil zaten var", + "error.language.name": "Lütfen dil için geçerli bir isim girin", + "error.language.notFound": "Dil bulunamadı", + + "error.layout.validation.block": "{layoutIndex}. sıradaki düzende \"{fieldset}\" blok türünü kullanan {blockIndex}. bloktaki \"{field}\" alanında bir hata var", + "error.layout.validation.settings": "{index}. düzen ayarlarında bir hata var", + + "error.license.domain": "Lisans için alan adı eksik", + "error.license.email": "Lütfen geçerli bir e-posta adresi girin", + "error.license.format": "Lütfen geçerli bir lisans anahtarı girin", + "error.license.verification": "Lisans doğrulanamadı", + + "error.login.totp.confirm.invalid": "Geçersiz kod", + "error.login.totp.confirm.missing": "Lütfen geçerli kodu girin", + + "error.object.validation": "\"{label}\" alanında bir hata var:\n{message}", + + "error.offline": "Panel şu anda çevrimdışı", + + "error.page.changeSlug.permission": "\"{slug}\" uzantısına sahip bu sayfanın adresini değiştirilemez", + "error.page.changeSlug.reserved": "Üst düzey sayfaların yolu \"{path}\" ile başlamamalıdır", + "error.page.changeStatus.incomplete": "Sayfada hatalar var ve yayınlanamadı", + "error.page.changeStatus.permission": "Bu sayfanın durumu değiştirilemez", + "error.page.changeStatus.toDraft.invalid": "\"{slug}\" sayfası bir taslak haline dönüştürülemiyor", + "error.page.changeTemplate.invalid": "\"{slug}\" sayfası için şablon değiştirilemiyor", + "error.page.changeTemplate.permission": "\"{slug}\" için şablonu değiştiremezsiniz", + "error.page.changeTitle.empty": "Başlık boş bırakılamaz", + "error.page.changeTitle.permission": "\"{slug}\" için başlığı değiştiremezsiniz", + "error.page.create.permission": "\"{slug}\" oluşturmanıza izin verilmiyor", + "error.page.delete": "\"{slug}\" sayfası silinemedi", + "error.page.delete.confirm": "Onaylamak için sayfa başlığını girin", + "error.page.delete.hasChildren": "Sayfada alt sayfalar var ve silinemiyor", + "error.page.delete.permission": "\"{slug}\" öğesini silmenize izin verilmiyor", + "error.page.draft.duplicate": "\"{slug}\" adres eki olan bir sayfa taslağı zaten mevcut", + "error.page.duplicate": "\"{slug}\" adres eki içeren bir sayfa zaten mevcut", + "error.page.duplicate.permission": "\"{slug}\" öğesini çoğaltmanıza izin verilmiyor", + "error.page.move.ancestor": "Sayfa kendi içine taşınamaz", + "error.page.move.directory": "Sayfa dizini taşınamaz", + "error.page.move.duplicate": "\"{slug}\" URL ekine sahip bir alt sayfa zaten mevcut", + "error.page.move.notFound": "Taşınan sayfa bulunamadı", + "error.page.move.permission": "\"{slug}\" öğesini taşımanıza izin verilmiyor", + "error.page.move.template": "\"{template}\" şablonu \"{parent}\" alt sayfası olarak kabul edilmiyor", + "error.page.notFound": "\"{slug}\" uzantısındaki sayfa bulunamadı", + "error.page.num.invalid": "Lütfen geçerli bir sıralama numarası girin. Sayılar negatif olmamalıdır.", + "error.page.slug.invalid": "Lütfen geçerli bir URL eki girin", + "error.page.slug.maxlength": "Adres uzantısı \"{length}\" karakterden az olmalıdır", + "error.page.sort.permission": "\"{slug}\" sayfası sıralanamıyor", + "error.page.status.invalid": "Lütfen geçerli bir sayfa durumu ayarlayın", + "error.page.undefined": "Sayfa bulunamad\u0131", + "error.page.update.permission": "\"{slug}\" güncellemesine izin verilmiyor", + + "error.section.files.max.plural": "\"{section}\" bölümüne {max} dosyadan daha fazlasını eklememelisiniz", + "error.section.files.max.singular": "\"{section}\" bölümüne birden fazla dosya eklememelisiniz", + "error.section.files.min.plural": "\"{section}\" bölümü en az {min} dosya gerektiriyor", + "error.section.files.min.singular": "\"{section}\" bölümü en az bir dosya gerektiriyor", + + "error.section.pages.max.plural": "\"{section}\" bölümüne maksimum {max} sayfadan fazla ekleyemezsiniz", + "error.section.pages.max.singular": "\"{section}\" bölümüne birden fazla sayfa ekleyemezsiniz", + "error.section.pages.min.plural": "\"{section}\" bölümü en az {min} sayfa gerektiriyor", + "error.section.pages.min.singular": "\"{section}\" bölümü en az bir sayfa gerektiriyor", + + "error.section.notLoaded": "\"{name}\" bölümü yüklenemedi", + "error.section.type.invalid": "\"{type}\" tipi geçerli değil", + + "error.site.changeTitle.empty": "Başlık boş bırakılamaz", + "error.site.changeTitle.permission": "Sitenin başlığını değiştiremezsin", + "error.site.update.permission": "Siteyi güncellemenize izin verilmiyor", + + "error.structure.validation": "{index} satırındaki \"{field}\" alanında bir hata var", + + "error.template.default.notFound": "Varsayılan şablon yok", + + "error.unexpected": "Beklenmeyen bir hata oluştu! Daha fazla bilgi için hata ayıklama modunu etkinleştirin: https://getkirby.com/docs/reference/system/options/debug", + + "error.user.changeEmail.permission": "\"{name}\" kullanıcısı için e-postayı değiştiremezsiniz", + "error.user.changeLanguage.permission": "\"{name}\" kullanıcısının dilini değiştiremezsin", + "error.user.changeName.permission": "\"{name}\" kullanıcısının adını değiştiremezsiniz", + "error.user.changePassword.permission": "\"{name}\" kullanıcısının şifresini değiştiremezsiniz", + "error.user.changeRole.lastAdmin": "Son yöneticinin rolü değiştirilemez", + "error.user.changeRole.permission": "\"{name}\" kullanıcısının rolünü değiştiremezsin", + "error.user.changeRole.toAdmin": "Birini yönetici rolüne tanıtmanıza izin verilmiyor", + "error.user.create.permission": "Bu kullanıcıyı oluşturmanıza izin verilmiyor", + "error.user.delete": "\"{name}\" kullanıcısı silinemedi", + "error.user.delete.lastAdmin": "Son y\u00f6netici kullan\u0131c\u0131y\u0131 silemezsiniz", + "error.user.delete.lastUser": "Son kullanıcı silinemez", + "error.user.delete.permission": "\"{name}\" kullanıcısını silme yetkiniz yok", + "error.user.duplicate": "\"{email}\" e-posta adresine sahip bir kullanıcı zaten var", + "error.user.email.invalid": "Lütfen geçerli bir e-posta adresi girin", + "error.user.language.invalid": "Lütfen geçerli bir dil girin", + "error.user.notFound": "\"{name}\" kullanıcısı bulunamadı", + "error.user.password.excessive": "Lütfen geçerli bir şifre girin. Şifreler 1000 karakterden uzun olmamalıdır.", + "error.user.password.invalid": "Lütfen geçerli bir şifre giriniz. Şifreler en az 8 karakter uzunluğunda olmalıdır.", + "error.user.password.notSame": "L\u00fctfen \u015fifreyi do\u011frulay\u0131n", + "error.user.password.undefined": "Bu kullanıcının şifresi yok", + "error.user.password.wrong": "Yanlış şifre", + "error.user.role.invalid": "Lütfen geçerli bir rol girin", + "error.user.undefined": "Kullanıcı bulunamadı", + "error.user.update.permission": "\"{name}\" kullanıcısını güncellemenize izin verilmiyor", + + "error.validation.accepted": "Lütfen onaylayın", + "error.validation.alpha": "Lütfen sadece a-z arasındaki karakterleri girin", + "error.validation.alphanum": "Lütfen sadece a-z veya 0-9 arasındaki rakamları girin", + "error.validation.anchor": "Lütfen doğru bir bağlantı çapası girin", + "error.validation.between": "Lütfen \"{min}\" ile \"{max}\" arasında bir değer girin", + "error.validation.boolean": "Lütfen onaylayın veya reddedin", + "error.validation.color": "Lütfen {format} biçiminde geçerli bir renk girin", + "error.validation.contains": "Lütfen \"{needle}\" içeren bir değer girin", + "error.validation.date": "Lütfen geçerli bir tarih girin", + "error.validation.date.after": "Lütfen {date} tarihinden sonra bir tarih girin", + "error.validation.date.before": "Lütfen {date} tarihinden önce bir tarih girin", + "error.validation.date.between": "Lütfen {min} ve {max} arasında bir tarih girin", + "error.validation.denied": "Lütfen reddedin", + "error.validation.different": "Değer \"{other}\" olmamalıdır", + "error.validation.email": "Lütfen geçerli bir e-posta adresi girin", + "error.validation.endswith": "Değer \"{end}\" ile bitmelidir", + "error.validation.filename": "Lütfen geçerli bir dosya adı girin", + "error.validation.in": "Lütfen bunlardan birini girin: ({in})", + "error.validation.integer": "Lütfen geçerli bir tamsayı girin", + "error.validation.ip": "Lütfen geçerli bir ip adresi girin", + "error.validation.less": "Lütfen {max} 'dan daha düşük bir değer girin", + "error.validation.linkType": "Bağlantı türüne izin verilmiyor", + "error.validation.match": "Değer beklenen modelle eşleşmiyor", + "error.validation.max": "Lütfen {max} 'a eşit veya daha küçük bir değer girin", + "error.validation.maxlength": "Lütfen daha kısa bir değer girin. (maks. {max} karakter)", + "error.validation.maxwords": "Lütfen en fazla {max} kelime(ler) girin", + "error.validation.min": "Lütfen {min} ile eşit veya daha büyük bir değer girin", + "error.validation.minlength": "Lütfen daha uzun bir değer girin. (min. {min} karakter)", + "error.validation.minwords": "Lütfen en az {min} kelime(ler) girin", + "error.validation.more": "Lütfen {min} değerinden daha büyük bir değer girin", + "error.validation.notcontains": "Lütfen \"{needle}\" içermeyen bir değer girin", + "error.validation.notin": "Lütfen bunlardan herhangi birini girmeyin: ({notIn})", + "error.validation.option": "Lütfen geçerli bir seçenek girin", + "error.validation.num": "Lütfen geçerli bir sayı girin", + "error.validation.required": "Lütfen birşeyler girin", + "error.validation.same": "Lütfen \"{other}\" yazınız", + "error.validation.size": "Değerin boyutu \"{size}\" olmalıdır", + "error.validation.startswith": "Değer \"{start}\" ile başlamalıdır", + "error.validation.tel": "Lütfen biçimlendirilmemiş bir telefon numarası girin", + "error.validation.time": "Lütfen geçerli bir zaman girin", + "error.validation.time.after": "Lütfen {time} sonrası bir tarih girin", + "error.validation.time.before": "Lütfen {time} öncesi bir tarih girin", + "error.validation.time.between": "Lütfen {min} ile {max} arasında bir tarih girin", + "error.validation.uuid": "Lütfen geçerli bir UUID girin", + "error.validation.url": "Lütfen geçerli bir adres girin", + + "expand": "Genişlet", + "expand.all": "Tümünü genişlet", + + "field.invalid": "Bu alan geçersizdir", + "field.required": "Alan gereklidir", + "field.blocks.changeType": "Türü değiştir", + "field.blocks.code.name": "Kod", + "field.blocks.code.language": "Dil", + "field.blocks.code.placeholder": "Kodunuz …", + "field.blocks.delete.confirm": "Bu bloğu gerçekten silmek istiyor musunuz?", + "field.blocks.delete.confirm.all": "Tüm blokları gerçekten silmek istiyor musunuz?", + "field.blocks.delete.confirm.selected": "Seçilen blokları gerçekten silmek istiyor musunuz?", + "field.blocks.empty": "Henüz blok yok", + "field.blocks.fieldsets.empty": "Henüz alan kümesi yok", + "field.blocks.fieldsets.label": "Lütfen bir blok türü seçiniz …", + "field.blocks.fieldsets.paste": "Panonuzdan düzenleri/blokları içe aktarmak için {{ shortcut }} tuşuna basın Yalnızca geçerli alanda izin verilenler eklenecektir.", + "field.blocks.gallery.name": "Galeri", + "field.blocks.gallery.images.empty": "Henüz görsel yok", + "field.blocks.gallery.images.label": "Görseller", + "field.blocks.heading.level": "Seviye", + "field.blocks.heading.name": "Başlık", + "field.blocks.heading.text": "Metin", + "field.blocks.heading.placeholder": "Başlık …", + "field.blocks.image.alt": "Alternatif metin", + "field.blocks.image.caption": "Altyazı", + "field.blocks.image.crop": "Kırp", + "field.blocks.image.link": "Bağlantı", + "field.blocks.image.location": "Lokasyon", + "field.blocks.image.location.internal": "Bu website", + "field.blocks.image.location.external": "Dış kaynak", + "field.blocks.image.name": "Görsel", + "field.blocks.image.placeholder": "Bir görsel seçin", + "field.blocks.image.ratio": "Oran", + "field.blocks.image.url": "Görsel URL", + "field.blocks.line.name": "Çizgi", + "field.blocks.list.name": "Liste", + "field.blocks.markdown.name": "Markdown", + "field.blocks.markdown.label": "Metin", + "field.blocks.markdown.placeholder": "Markdown …", + "field.blocks.quote.name": "Alıntı", + "field.blocks.quote.text.label": "Metin", + "field.blocks.quote.text.placeholder": "Alıntı …", + "field.blocks.quote.citation.label": "Alıntı", + "field.blocks.quote.citation.placeholder": "yazar …", + "field.blocks.text.name": "Metin", + "field.blocks.text.placeholder": "Metin …", + "field.blocks.video.autoplay": "Otomatik oynatma", + "field.blocks.video.caption": "Altyazı", + "field.blocks.video.controls": "Kontroller", + "field.blocks.video.location": "Lokasyon", + "field.blocks.video.loop": "Döngü", + "field.blocks.video.muted": "Sessiz", + "field.blocks.video.name": "Video", + "field.blocks.video.placeholder": "Bir video URL'si girin", + "field.blocks.video.poster": "Kapak", + "field.blocks.video.preload": "Önyükleme", + "field.blocks.video.url.label": "Video-URL", + "field.blocks.video.url.placeholder": "https://youtube.com/?v=", + + "field.files.empty": "Henüz dosya seçilmedi", + + "field.layout.change": "Düzeni değiştir", + "field.layout.delete": "Düzeni sil", + "field.layout.delete.confirm": "Bu düzeni gerçekten silmek istiyor musunuz?", + "field.layout.delete.confirm.all": "Gerçekten tüm düzenleri silmek istiyor musunuz?", + "field.layout.empty": "Henüz satır yok", + "field.layout.select": "Bir düzen seçin", + + "field.object.empty": "Henüz bilgi yok", + + "field.pages.empty": "Henüz sayfa seçilmedi", + + "field.structure.delete.confirm": "Bu girdiyi silmek istedi\u011finizden emin misiniz?", + "field.structure.delete.confirm.all": "Tüm girdileri gerçekten silmek istiyor musunuz?", + "field.structure.empty": "Hen\u00fcz bir girdi yok", + + "field.users.empty": "Henüz kullanıcı seçilmedi", + + "fields.empty": "Henüz alan yok", + + "file": "Dosya", + "file.blueprint": "Bu dosyanın henüz bir planı yok. Kurulumu /site/blueprints/files/{blueprint}.yml dosyasında tanımlayabilirsiniz.", + "file.changeTemplate": "Şablonu değiştir", + "file.changeTemplate.notice": "Dosyanın şablonunun değiştirilmesi, tür olarak eşleşmeyen alanların içeriğini kaldıracaktır. Yeni şablon, görüntü boyutları gibi belirli kuralları tanımlıyorsa, bunlar da geri döndürülemez şekilde uygulanacaktır. Dikkatli kullanın.", + "file.delete.confirm": "{filename} dosyasını silmek istediğinizden emin misiniz?", + "file.focus.placeholder": "Odak noktasını belirleyin", + "file.focus.reset": "Odak noktasını kaldırın", + "file.focus.title": "Odak", + "file.sort": "Pozisyon değiştir", + + "files": "Dosyalar", + "files.empty": "Henüz dosya yok", + + "filter": "Filtre", + + "hide": "Gizle", + "hour": "Saat", + "hue": "Renk tonu", + "import": "İçe aktar", + "info": "Bilgi", + "insert": "Ekle", + "insert.after": "Sonrasına ekle", + "insert.before": "Öncesine ekle", + "install": "Kurulum", + + "installation": "Kurulum", + "installation.completed": "Panel kuruldu", + "installation.disabled": "Panel yükleyici, herkese açık sunucularda varsayılan olarak devre dışıdır. Lütfen yükleyiciyi yerel bir makinede çalıştırın veya panel.install seçeneğiyle etkinleştirin.", + "installation.issues.accounts": "/site/accounts klasörü yok yada yazılabilir değil", + "installation.issues.content": "/content klasörü yok yada yazılabilir değil", + "installation.issues.curl": "CURL eklentisi gerekli", + "installation.issues.headline": "Panel kurulamadı", + "installation.issues.mbstring": "MB String eklentisi gerekli", + "installation.issues.media": "/media klasörü yok yada yazılamaz", + "installation.issues.php": "PHP 8+ kullandığınızdan emin olun. ", + "installation.issues.sessions": "/site/sessions klasörü mevcut değil veya yazılabilir değil", + + "language": "Dil", + "language.code": "Kod", + "language.convert": "Varsayılan yap", + "language.convert.confirm": "

{name}'i varsayılan dile dönüştürmek istiyor musunuz? Bu geri alınamaz.

{name} çevrilmemiş içeriğe sahipse, artık geçerli bir geri dönüş olmaz ve sitenizin bazı bölümleri boş olabilir.

", + "language.create": "Yeni bir dil ekle", + "language.default": "Varsayılan dil", + "language.delete.confirm": "Tüm çevirileri içeren {name} dilini gerçekten silmek istiyor musunuz? Bu geri alınamaz!", + "language.deleted": "Dil silindi", + "language.direction": "Okuma yönü", + "language.direction.ltr": "Soldan sağa", + "language.direction.rtl": "Sağdan sola", + "language.locale": "PHP yerel dizesi", + "language.locale.warning": "Özel bir yerel ayar kullanıyorsunuz. Lütfen /site/languages konumundaki dil dosyasından değiştirin.", + "language.name": "İsim", + "language.secondary": "İkincil dil", + "language.settings": "Dil ayarları", + "language.updated": "Dil güncellendi", + "language.variables": "Dil değişkenleri", + "language.variables.empty": "Henüz çeviri yok", + + "language.variable.delete.confirm": "Gerçekten {key} değişkenini silmek istiyor musunuz?", + "language.variable.key": "Anahtar", + "language.variable.notFound": "Değişken bulunamadı", + "language.variable.value": "Değer", + + "languages": "Diller", + "languages.default": "Varsayılan dil", + "languages.empty": "Henüz hiç dil yok", + "languages.secondary": "İkincil diller", + "languages.secondary.empty": "Henüz ikincil bir dil yok", + + "license": "Lisans", + "license.activate": "Şimdi etkinleştirin", + "license.activate.label": "Lütfen lisansınızı etkinleştirin", + "license.activate.domain": "Lisansınız {host} için etkinleştirilecektir.", + "license.activate.local": "Yerel etki alanınız {host} için Kirby lisansınızı etkinleştirmek üzeresiniz. Bu site genel bir etki alanına kurulacaksa, lütfen bunun yerine orada etkinleştirin. Eğer lisansınızı kullanmak istediğiniz alan adı {host} ise lütfen devam edin.", + "license.activated": "Etkinleştirildi", + "license.buy": "Bir lisans satın al", + "license.code": "Kod", + "license.code.help": "Lisans kodunuzu satın alma işleminden sonra e-posta yoluyla aldınız. Lütfen kopyalayıp buraya yapıştırın.", + "license.code.label": "Lütfen lisans kodunu giriniz", + "license.status.active.info": "{date} tarihine kadar yeni ana sürümleri içerir", + "license.status.active.label": "Geçerli lisans", + "license.status.demo.info": "Bu bir demo kurulumudur", + "license.status.demo.label": "Demo", + "license.status.inactive.info": "Yeni ana sürümlere güncellemek için lisansı yenileyin", + "license.status.inactive.label": "Yeni ana sürüm yok", + "license.status.legacy.bubble": "Lisansınızı yenilemeye hazır mısınız?", + "license.status.legacy.info": "Lisansınız bu sürümü kapsamıyor", + "license.status.legacy.label": "Lütfen lisansınızı yenileyin", + "license.status.missing.bubble": "Sitenizi yayına almaya hazır mısınız?", + "license.status.missing.info": "Geçerli lisans yok", + "license.status.missing.label": "Lütfen lisansınızı etkinleştirin", + "license.manage": "Lisanslarınızı yönetin", + "license.purchased": "Satın alındı", + "license.success": "Kirby'yi desteklediğiniz için teşekkürler", + "license.unregistered.label": "Kayıtsız", + + "link": "Ba\u011flant\u0131", + "link.text": "Ba\u011flant\u0131 yaz\u0131s\u0131", + + "loading": "Yükleniyor", + + "lock.unsaved": "Kaydedilmemiş değişiklikler", + "lock.unsaved.empty": "Daha fazla kaydedilmemiş değişiklik yok", + "lock.isLocked": "{email} tarafından yapılan kaydedilmemiş değişiklikler", + "lock.unlock": "Kilidi Aç", + "lock.unlock.submit": "Kaydedilmemiş değişikliklerin kilidini {email} ile açın ve üzerine yazın", + "lock.isUnlocked": "Başka bir kullanıcı tarafından kilidi açıldı", + + "login": "Giriş", + "login.code.label.login": "Giriş kodu", + "login.code.label.password-reset": "Şifre sıfırlama kodu", + "login.code.placeholder.email": "000 000", + "login.code.placeholder.totp": "000000", + "login.code.text.email": "E-posta adresiniz kayıtlıysa, istenen kod e-posta yoluyla gönderilmiştir.", + "login.code.text.totp": "Lütfen kimlik doğrulayıcı uygulamanızdaki tek seferlik kodu girin.", + "login.email.login.body": "Merhaba {user.nameOrEmail},\n\nKısa süre önce {site} Panel'i için bir giriş kodu istediniz.\nAşağıdaki giriş kodu {timeout} dakika boyunca geçerli olacaktır:\n\n{code}\n\nBir giriş kodu istemediyseniz, lütfen bu e-postayı dikkate almayın veya sorularınız varsa yöneticinize başvurun.\nGüvenliğiniz için lütfen bu e-postayı İLETMEYİN.", + "login.email.login.subject": "Giriş kodunuz", + "login.email.password-reset.body": "Merhaba {user.nameOrEmail},\n\nKısa süre önce {site} Panel'i için bir şifre sıfırlama kodu istediniz.\nAşağıdaki şifre sıfırlama kodu {timeout} dakika boyunca geçerli olacaktır:\n\n{code}\n\nŞifre sıfırlama kodu istemediyseniz, lütfen bu e-postayı dikkate almayın veya sorularınız varsa yöneticinizle iletişime geçin.\nGüvenliğiniz için lütfen bu e-postayı İLETMEYİN.", + "login.email.password-reset.subject": "Şifre sıfırlama kodunuz", + "login.remember": "Oturumumu açık tut", + "login.reset": "Şifreyi sıfırla", + "login.toggleText.code.email": "E-posta ile giriş yapın", + "login.toggleText.code.email-password": "Şifre ile giriş yapın", + "login.toggleText.password-reset.email": "Şifrenizi mi unuttunuz?", + "login.toggleText.password-reset.email-password": "← Girişe geri dön", + "login.totp.enable.option": "Tek seferlik kodlar ayarlama", + "login.totp.enable.intro": "Kimlik doğrulayıcı uygulamalar, hesabınızda oturum açarken ikinci bir faktör olarak kullanılan tek seferlik kodlar oluşturabilir.", + "login.totp.enable.qr.label": "1. Bu QR kodunu tarayın", + "login.totp.enable.qr.help": "Tarama yapılamıyor mu? Kurulum anahtarını {secret} kimlik doğrulayıcı uygulamanıza elle ekleyin.", + "login.totp.enable.confirm.headline": "2. Oluşturulan kod ile onaylayın", + "login.totp.enable.confirm.text": "Uygulamanız her 30 saniyede bir yeni bir kerelik kod oluşturur. Kurulumu tamamlamak için geçerli kodu girin:", + "login.totp.enable.confirm.label": "Geçerli kod", + "login.totp.enable.confirm.help": "Bu kurulumdan sonra, her oturum açtığınızda sizden tek seferlik bir kod isteyeceğiz.", + "login.totp.enable.success": "Tek seferlik kodlar etkinleştirildi", + "login.totp.disable.option": "Tek seferlik kodları devre dışı bırakma", + "login.totp.disable.label": "Tek seferlik kodları devre dışı bırakmak için şifrenizi girin", + "login.totp.disable.help": "Gelecekte, oturum açtığınızda e-posta yoluyla gönderilen bir oturum açma kodu gibi farklı bir ikinci faktör istenecektir. Tek seferlik kodları daha sonra her zaman yeniden ayarlayabilirsiniz.", + "login.totp.disable.admin": "

Bu {user} için tek seferlik kodları devre dışı bırakacaktır.

Gelecekte, oturum açtıklarında e-posta yoluyla gönderilen bir oturum açma kodu gibi farklı bir ikinci faktör istenecektir. {user} bir sonraki girişinden sonra tek seferlik kodları tekrar ayarlayabilir.

", + "login.totp.disable.success": "Tek seferlik kodlar devre dışı", + + "logout": "Oturumu kapat", + + "merge": "Birleştir", + "menu": "Menü", + "meridiem": "AM/PM", + "mime": "Medya Türü", + "minutes": "Dakika", + + "month": "Ay", + "months.april": "Nisan", + "months.august": "A\u011fustos", + "months.december": "Aral\u0131k", + "months.february": "Şubat", + "months.january": "Ocak", + "months.july": "Temmuz", + "months.june": "Haziran", + "months.march": "Mart", + "months.may": "May\u0131s", + "months.november": "Kas\u0131m", + "months.october": "Ekim", + "months.september": "Eyl\u00fcl", + + "more": "Daha Fazla", + "move": "Taşı", + "name": "İsim", + "next": "Sonraki", + "night": "Gece", + "no": "hayır", + "off": "kapalı", + "on": "açık", + "open": "Önizleme", + "open.newWindow": "Yeni pencerede aç", + "option": "Seçenek", + "options": "Seçenekler", + "options.none": "Seçenek yok", + "options.all": "Tüm {count} seçeneklerini göster", + + "orientation": "Oryantasyon", + "orientation.landscape": "Yatay", + "orientation.portrait": "Dikey", + "orientation.square": "Kare", + + "page": "Sayfa", + "page.blueprint": "Bu dosyanın henüz bir planı yok. Kurulumu /site/blueprints/pages/{blueprint}.yml dosyasında tanımlayabilirsiniz.", + "page.changeSlug": "Web Adresini Değiştir", + "page.changeSlug.fromTitle": "Ba\u015fl\u0131ktan olu\u015ftur", + "page.changeStatus": "Durumu değiştir", + "page.changeStatus.position": "Lütfen bir pozisyon seçin", + "page.changeStatus.select": "Yeni bir durum seçin", + "page.changeTemplate": "Şablonu değiştir", + "page.changeTemplate.notice": "Sayfanın şablonunu değiştirmek, tür olarak eşleşmeyen alanların içeriğini kaldıracaktır. Dikkatli kullanın.", + "page.create": "{status} olarak oluştur", + "page.delete.confirm": "{title} sayfasını silmek istediğinizden emin misiniz?", + "page.delete.confirm.subpages": "Bu sayfada alt sayfalar var.
Tüm alt sayfalar da silinecek.", + "page.delete.confirm.title": "Onaylamak için sayfa başlığını girin", + "page.duplicate.appendix": "Kopya", + "page.duplicate.files": "Dosyaları kopyala", + "page.duplicate.pages": "Sayfaları kopyala", + "page.move": "Sayfayı taşı", + "page.sort": "Pozisyon değiştir", + "page.status": "Durum", + "page.status.draft": "Taslak", + "page.status.draft.description": "Sayfa taslak halinde ve yalnızca oturum açmış editörler için veya gizli bağlantı üzerinden görülebilir", + "page.status.listed": "Herkese Açık", + "page.status.listed.description": "Bu sayfa herkese açık", + "page.status.unlisted": "Liste Dışı", + "page.status.unlisted.description": "Bu sayfa sadece bağlantı adresi ile erişilebilir", + + "pages": "Sayfalar", + "pages.empty": "Henüz sayfa yok", + "pages.status.draft": "Taslaklar", + "pages.status.listed": "Yayınlandı", + "pages.status.unlisted": "Liste Dışı", + + "pagination.page": "Sayfa", + + "password": "\u015eifre", + "paste": "Yapıştır", + "paste.after": "Sonrasına yapıştır", + "paste.success": "{count} yapıştırıldı!", + "pixel": "Piksel", + "plugin": "Eklenti", + "plugins": "Eklentiler", + "prev": "Önceki", + "preview": "Önizle", + "remove": "Kaldır", + "rename": "Yeniden Adlandır", + "renew": "Yenileme", + "replace": "De\u011fi\u015ftir", + "replace.with": "Değiştir", + "retry": "Tekrar Dene", + "revert": "Vazge\u00e7", + "revert.confirm": "Gerçekten kaydedilmemiş tüm değişiklikleri silmek istiyor musunuz?", + + "role": "Rol", + "role.admin.description": "Yönetici tüm haklara sahiptir", + "role.admin.title": "Yönetici", + "role.all": "Tümü", + "role.empty": "Bu role ait kullanıcı bulunamadı", + "role.description.placeholder": "Açıklama yok", + "role.nobody.description": "Bu hiçbir izni olmayan bir geri dönüş rolüdür.", + "role.nobody.title": "Hiçkimse", + + "save": "Kaydet", + "search": "Arama", + "search.min": "Aramak için {min} karakter girin", + "search.all": "Tüm {count} sonuçlarını göster", + "search.results.none": "Sonuç yok", + + "section.invalid": "Bu bölüm geçersizdir", + "section.required": "Bölüm gereklidir", + + "security": "Güvenlik", + "select": "Seç", + "server": "Sunucu", + "settings": "Ayarlar", + "show": "Göster", + "site.blueprint": "Sitenin henüz bir planı yok. Kurulumu /site/blueprints/site.yml'de tanımlayabilirsiniz.", + "size": "Boyut", + "slug": "Web Adres Uzantısı", + "sort": "Sırala", + "sort.drag": "Sıralamak için sürükleyin …", + "split": "Ayır", + + "stats.empty": "Rapor yok", + "status": "Durum", + + "system.info.copy": "Copy info", + "system.info.copied": "System info copied", + "system.issues.content": "İçerik klasörü açığa çıkmış görünüyor", + "system.issues.eol.kirby": "Yüklü Kirby sürümünüz kullanım ömrünün sonuna ulaştı ve daha fazla güvenlik güncellemesi almayacak", + "system.issues.eol.plugin": "{ plugin } eklentisinin yüklü sürümü kullanım ömrünün sonuna ulaştı ve daha fazla güvenlik güncellemesi almayacak", + "system.issues.eol.php": "Yüklü PHP sürümünüz { release } kullanım ömrünün sonuna ulaşmıştır ve başka güvenlik güncellemeleri almayacaktır", + "system.issues.debug": "Canlı modda hata ayıklama kapatılmalıdır", + "system.issues.git": ".git klasörü açığa çıkmış görünüyor", + "system.issues.https": "Tüm siteleriniz için HTTPS'yi öneriyoruz", + "system.issues.kirby": "Kirby klasörü açığa çıkmış görünüyor", + "system.issues.site": "Site klasörü açığa çıkmış görünüyor", + "system.issues.vulnerability.kirby": "Kurulumunuz aşağıdaki güvenlik açığından ({ severity } önem derecesi) etkilenebilir: { description }", + "system.issues.vulnerability.plugin": "Kurulumunuz, { plugin } eklentisindeki ({ severity } önem derecesi) aşağıdaki güvenlik açığından etkilenebilir: { description }", + "system.updateStatus": "Güncelleme durumu", + "system.updateStatus.error": "Güncellemeler kontrol edilemedi", + "system.updateStatus.not-vulnerable": "Bilinen güvenlik açığı yok", + "system.updateStatus.security-update": "Ücretsiz güvenlik güncellemesi { version } mevcut", + "system.updateStatus.security-upgrade": "Mevcut güvenlik düzeltmeleriyle { version } sürümüne yükseltin", + "system.updateStatus.unreleased": "Yayınlanmamış sürüm", + "system.updateStatus.up-to-date": "Güncel", + "system.updateStatus.update": "Ücretsiz güncelleme { version } mevcut", + "system.updateStatus.upgrade": "{ version } yükseltme mevcut", + + "tel": "Telefon", + "tel.placeholder": "+49123456789", + "template": "\u015eablon", + "title": "Başlık", + "today": "Bugün", + + "toolbar.button.clear": "Biçimlendirmeyi temizle", + "toolbar.button.code": "Kod", + "toolbar.button.bold": "Kalın Yazı", + "toolbar.button.email": "E-Posta", + "toolbar.button.headings": "Başlıklar", + "toolbar.button.heading.1": "Başlık 1", + "toolbar.button.heading.2": "Başlık 2", + "toolbar.button.heading.3": "Başlık 3", + "toolbar.button.heading.4": "Başlık 4", + "toolbar.button.heading.5": "Başlık 5", + "toolbar.button.heading.6": "Başlık 6", + "toolbar.button.italic": "Eğik Yazı", + "toolbar.button.file": "Dosya", + "toolbar.button.file.select": "Bir dosya seçin", + "toolbar.button.file.upload": "Bir dosya yükleyin", + "toolbar.button.link": "Ba\u011flant\u0131", + "toolbar.button.paragraph": "Paragraf", + "toolbar.button.strike": "Üstü çizili", + "toolbar.button.sub": "Alt simge", + "toolbar.button.sup": "Üst simge", + "toolbar.button.ol": "Sıralı liste", + "toolbar.button.underline": "Altı çizili", + "toolbar.button.ul": "Madde listesi", + + "translation.author": "Kirby Takımı", + "translation.direction": "ltr", + "translation.name": "T\u00fcrk\u00e7e", + "translation.locale": "tr_TR", + + "type": "Tür", + + "upload": "Yükle", + "upload.error.cantMove": "Yüklenen dosya taşınamadı", + "upload.error.cantWrite": "Dosya diske yazılamadı", + "upload.error.default": "Dosya yüklenemedi", + "upload.error.extension": "Dosya yükleme uzantısı tarafından durduruldu", + "upload.error.formSize": "Yüklenen dosya, formda belirtilen MAX_FILE_SIZE yönergesini aşıyor", + "upload.error.iniPostSize": "Yüklenen dosya php.ini içindeki post_max_size yönergesini aşıyor", + "upload.error.iniSize": "Yüklenen dosya php.ini içindeki upload_max_filesize yönergesini aşıyor", + "upload.error.noFile": "Dosya yüklenmedi", + "upload.error.noFiles": "Dosyalar yüklenmedi", + "upload.error.partial": "Yüklenen dosya sadece kısmen yüklendi", + "upload.error.tmpDir": "Geçici klasör eksik", + "upload.errors": "Hata", + "upload.progress": "Yükleniyor...", + + "url": "Url", + "url.placeholder": "https://ornek.com", + + "user": "Kullanıcı", + "user.blueprint": "Bu kullanıcı rolü için /site/blueprints/users/{blueprint}.yml içinde ek bölümler ve form alanları tanımlayabilirsiniz", + "user.changeEmail": "E-postayı değiştir", + "user.changeLanguage": "Dili değiştir", + "user.changeName": "Kullanıcıyı yeniden adlandır", + "user.changePassword": "Şifre değiştir", + "user.changePassword.new": "Yeni Şifre", + "user.changePassword.new.confirm": "Şifreyi onaylayın...", + "user.changeRole": "Rolü değiştir", + "user.changeRole.select": "Yeni bir rol seçin", + "user.create": "Yeni bir kullanıcı ekle", + "user.delete": "Bu kullanıcıyı sil", + "user.delete.confirm": "{email} kullanıcısını silmek istediğinizden emin misiniz?", + + "users": "Kullanıcılar", + + "version": "Versiyon", + "version.current": "Mevcut sürüm", + "version.latest": "En son sürüm", + "versionInformation": "Sürüm bilgisi", + + "view.account": "Hesap Bilgilerin", + "view.installation": "Kurulum", + "view.languages": "Diller", + "view.resetPassword": "Şifreyi sıfırla", + "view.site": "Site", + "view.system": "Sistem", + "view.users": "Kullan\u0131c\u0131lar", + + "welcome": "Hoşgeldiniz", + "year": "Yıl", + "yes": "evet" +} diff --git a/kirby/kirby.pub b/kirby/kirby.pub new file mode 100644 index 0000000..ddf9130 --- /dev/null +++ b/kirby/kirby.pub @@ -0,0 +1,9 @@ +-----BEGIN PUBLIC KEY----- +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Ux4q7LmQ5hfTYTtz3/a +mohFJMWo/iCnxVcY84PZjLwWnT+G2DTKGaEWydB77TteJQnmsgtvO5734oj3Ga3r +QCfwr2gxo/0WDEBq7C5HP+YNJiuZ/iD/tYV+gloF+Aaa3Mo8AK5DYH3dnjuyfHc1 +veIlYX1D2MXji2IRqdweAzVi1dfI4I3Ys8awhzv653vFLj5LvAtlwlYlmYeRwci7 +GkAOWw709CuKQNdPBXGFQQ/pEB5mnp8mI31j8og845u6v/Sk4+85gFORSufIRfnQ +GFYrPOeavxfAWQGjh7JQjr/sbKSXaJ3nDlrYsOPIrC0Rwn/jsQPO7OLdVwkc9ofL +GQIDAQAB +-----END PUBLIC KEY----- diff --git a/kirby/package-lock.json b/kirby/package-lock.json new file mode 100644 index 0000000..7c78dd2 --- /dev/null +++ b/kirby/package-lock.json @@ -0,0 +1,6 @@ +{ + "name": "kirby", + "lockfileVersion": 3, + "requires": true, + "packages": {} +} diff --git a/kirby/panel/.prettierignore b/kirby/panel/.prettierignore new file mode 100644 index 0000000..511620b --- /dev/null +++ b/kirby/panel/.prettierignore @@ -0,0 +1,2 @@ + +src/components/Text/Highlight.vue \ No newline at end of file diff --git a/kirby/panel/dist/apple-touch-icon-dark.png b/kirby/panel/dist/apple-touch-icon-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..321598b9dd0244c8d5488bc932ba41a61f248207 GIT binary patch literal 1148 zcmV-?1cUpDP)+q+1c5@zrV1su#btZ*Om4U|?EWT1-q#J3BiuF)=78C>k0X!otGl z=H}AU(u0G8a&mG~Qc^1`E4R0|?Ck8hxw*8ow4R=xYinyzP*6fbLOwn|jEsybDk^bU zT}l7|17%4>K~#9!?AVD;;!qfd;qRkTp+IG;EP{%N;(`K#2;%PjU(+OH+MWy`Ft%`- z{LdA-3(DeR(ny!qn&Y)y764V@k}juaLL1|f*EM~g>oVV`bd|=? z!&${20SyBS7!7~yRL-z_&1*mCxsN6K&;Ey9H?dphQ_HI<-{S}OWx85VCU!?HIlNs_ zV%{FA-?uB17yqAUn^>ut^+(dn1iN5l)!DWAoXr~8HuYzhKCrfr(vkrcK6S@v)y&QI zp_aN2ZBPGIS-?`*P)b=OU;Ee&<0whjpojm^8_<e~(?m`*b2;P@+O^w?Kh#gn1 z!e0njj-FuOx~x-ratM|;Yua4|tlReHb~w?)4noiwh8Z2!953F47;PXVhD1xWL`$?p zOSDAqB-%2uHq+81I$q9WP5E+MmuNCwz#0l^Qln_HQpXDQ3aME%S)JeqlPalUG!rok zOIWc4^^7KyjT9D0HIk&Z(WEmn=7L5JsdY3tt=Ul6wJE86G&#(e{u}F%j6^h9%3~&9 zA|n$$+ihlhNu;95!GMfhG^us;*x}kv#+pR`Y3Gb_5QL&2Xw-;GLq$VkL@B9>iM98? zl2!yiDwtTjF*7Haj{m~$F3wdmPr0e`DDUY9`5f(Ck;gd#dhH42eWc4}{K6QsT^?ec zTRrKFSw$Iwv(O2da@*2;E)Twlx4GD9N6TgT`E3LHBN-O301E zZ4l`N@%M$&N-I5X)#zX51D{OW=)x?UTA)rnN){%0-)^+X3quMD1vskpe;FO z9}(L8Ogpxh%~XdtM8_7|W@h%rp$+|H3!!|qg;2)ZLV&JLF!w$BC6(kAw5mccsX#Yt zl69ai%R0h35OaqKx_AZM7K5(1G57MI%Y@JkND&bc5fKp)5fKrQPuu~GLsDh*#mvJ1 O0000!ZHZW-cTuuxgy>~g zZy^b>tmuoVxhFHfx%dA5yZ5ghN(fohur6m9)zrFgnylkjA_^adduQD`R3c8Xp4LNy`#kR`$q6N-jo>U z{Frbt!|*T%ZZVCd*Y)AycQB1nkhzG$wN8j`I_y!N8A{D$QVJz zO2Lj6f$D}r^c3In(?=FjnzQ8L%x_E3=wQ~hEvT;hT8#I1nz^YlbCA;sO!^|^*wKvt zXT$54*Wq4XRthdd`oT5B&x}GL;2)>c_93OZv7Du~PQ7J~jg2cb^UoPixf3pbdqs$w zWBE;Z7qSw;q?vS8=hZjZ-q#BUp@BT9f<`JLE~lU)Z9%ccZ^LqOVWC3l>729TVSlPb z`8A{T5?VHK>onJ^3gm)_OdcMivtzGnb_T!?PN=p7gZkXcUlfe40Mx1y7lA`RS?6?Z+`BjZa!6h!OMpQ3>{cPrPf)ZY- zK#hXE8R8jqw3U{n;CjD*7KanAtgJ+wkkJOu&X|7Ko)G$3Zb}W!3#kBMIQ(dpWRBWnsZt;qN&xM^ioT$KA=e-Pb zD!(34Ctg}Bgc7BBl|>dQ)8*EiAOP|sT1c*=(P-z{y2psE1uRH9x8urVa~i*=-7uNH z7;`jP_(}*iFaQ~&3(ASXi=d#A2Oxzs%$)CWv znnw|FLRyQ4Mc=!k23_BwR^hMkN+&fee5#@WJt0&GS<=P%>Epv+vzB}G+;ZBvAs2zF zfqURyQ#5HwdhKbsN z?8nMGNO7kcz-_rN!5laqKt)MFTCE&R+h+{Qv<#_WGIt($wcQIo zKbW3bRp4RkaY^Al?W7y}B$FNuS!?i^9$3Q{REm2~l$h7K45O`At5;OyU~!W$cnxJ2 zw}=}im;}{-9)1 zXa2dHU-?|clA1DGmg5^YKU@c8&ys@^LXnc`1=J>p_jtC~l)V<=;B9;c<&}8_EeHB3 zjIJEy53nV~a=h~Wm^h!R!3^2NiyRNdy6@^YXJ&Gzy71U_W)=W6vkG8%VF0Glh9ZWqi4C$0ZZPH&Q+oBpbY|YlHj8j}mykW$}pzYgJ z-!Bg5y^P-M9oC)9z7r!+e zhR%JSLpR%v50zIfCD1h=pBG?czV^@W0AJsdLZb|ES020P-!BzzgDi9<30AlG+^)FF z;FL}rEKEWnRwET=l&r+GGFIB9;M2`Av6ml9t|a3vr7u+IXjh*_K&BnWyfgEx0&X+1 zSytIT@yiU=p?&iObBWlj@}jg87w!=bnSM5~1KY|C+LCWiHd=DXuSitRROEMD&CbU$ z7M1+Am~VVKPp9F~qHIde$r|&#K=ViK!3l2XQD3v)M#{LC{wi>`jcWYs2i=swiom(8 zq-FQsuQkViXm^qd^dlv!K0+7-)jzIf!M&6e6>qEzt%+%4z&0fw)oqsN7pL2X)fttf zw@R^x&K@6XYt7q!|A;mCZk6c*~P9~j77#|L#3VZSGCVF|f+85kJa zGK^tCMYwC?)FR8NVB6WoXWt=y{ns+yTwlL<(za!Qz`C6*=~N$VwvTHE<>6k%bYb*7 zJUsTc1*V0MwwIR73jA9(HZ~@^n6xV9=I1AWe2I-vYp)iF9Jrqk_z?*$7Gr^|H7U$+ zHACK@8APXXjmM6a&wg-~L8z=P$|e(aMkUhQ)HsCkgZ-s8S`{*cGQ$M8(at@#&Ke-udb?~> zlGRy!jXclET?Kp-C-eE{W`)o8!P%$F6`zL0K!;9@a$GivLs#BXOc+rN;xIau-%Qar z4V1hVb1Z)@U!wX%9S4U}|E<^IEWFwWbmn_Q3Zv2Off#QPkw}Ct&FV7>s&fz6s*JKp zeWHRJgCgXuBLekV-r#Onx8V{N{O6zc7<9g0Z;2iNWFhW4l4DR#*kW;_p{$XMi92_= z(sLD-1S!s&uCNg;&`WGYzc(*{(GC!#np3@f6EDYV0&9TMx$YCz9~)cS;uomyCpaIl7O9cZX=B!aH<|>pXXs8 z`2X6e#7*(b1nUf0drwq?-@uz2w{o1MuL+GXIngVLEVnAmbR(-Y4Kd>}y~PfIB{iL} z8!x3;lHMNwC4wghLs}wMD{%|ALCdMyHPPqe6D5%*@e2(e8Ee;K;!_!KkiymLeAn-& z1|7ohYxpGgF{p}IrS{Dv)<)bC1X!b(4eLJn50AX#%QULxp7_**jp^ch3j5JHN!jsz z+>$*x#eHeG%$d8zCjEo59a6|)Ey){O%^NbaO$_ ze{{TTLDcU7x*Lt0TqdZ1Gaou8RuX^N+P1J0J_LQ zulpun(o5h^))Neb!rLwKtO7aO>MHm(ko6^zxli+@>th;kg8CsyC0iUfCEZJ^D;F z`_bD8Q?*G=%&Us;>${{XZ^)L1E1VSz`WHgyb5$xEMqMEsAR`dpK9TE`r@XmklO4PH z@0Rs1DCaHgk$kG76H(vT_`1DA7ZcnZ_7}I|c4@##xy%4)?w>.k-portal>.k-search-dialog{margin-top:0}.k-search-dialog-input{--button-height: var(--input-height);display:flex;align-items:center}.k-search-dialog-types{flex-shrink:0}.k-search-dialog-input input{flex-grow:1;padding-inline:.75rem;height:var(--input-height);border-left:1px solid var(--color-border);line-height:var(--input-height);border-radius:var(--rounded);font-size:var(--input-font-size)}.k-search-dialog-input input:focus{outline:0}.k-search-dialog-input .k-search-dialog-close{flex-shrink:0}.k-search-dialog-results{border-top:1px solid var(--color-border);padding:1rem}.k-search-dialog-results .k-item[data-selected=true]{outline:var(--outline)}.k-search-dialog-footer{text-align:center}.k-search-dialog-footer p{color:var(--color-text-dimmed)}.k-search-dialog-footer .k-button{margin-top:var(--spacing-4)}.k-totp-dialog-headline{margin-bottom:var(--spacing-1)}.k-totp-dialog-intro{margin-bottom:var(--spacing-6)}.k-totp-dialog-grid{display:grid;gap:var(--spacing-6)}@media screen and (min-width: 40rem){.k-totp-dialog-grid{grid-template-columns:1fr 1fr;gap:var(--spacing-8)}}.k-totp-qrcode .k-box[data-theme]{padding:var(--box-padding-inline)}.k-totp-dialog-fields .k-field-name-confirm{--input-height: var(--height-xl);--input-rounded: var(--rounded);--input-font-size: var(--text-3xl)}.k-upload-dialog.k-dialog{--dialog-width: 40rem}.k-upload-replace-dialog .k-upload-items{display:flex;gap:var(--spacing-3);align-items:center}.k-upload-original{width:6rem;border-radius:var(--rounded);box-shadow:var(--shadow);overflow:hidden}.k-upload-replace-dialog .k-upload-item{flex-grow:1}.k-drawer-body{padding:var(--drawer-body-padding);flex-grow:1;background:var(--color-background)}.k-drawer-body .k-writer-input:focus-within .k-toolbar:not([data-inline=true]),.k-drawer-body .k-textarea-input-wrapper:focus-within .k-toolbar,.k-drawer-body .k-table th{top:-1.5rem}.k-drawer-header{--button-height: calc(var(--drawer-header-height) - var(--spacing-1));flex-shrink:0;height:var(--drawer-header-height);padding-inline-start:var(--drawer-header-padding);display:flex;align-items:center;line-height:1;justify-content:space-between;background:var(--color-white);font-size:var(--text-sm)}.k-drawer-breadcrumb{flex-grow:1}.k-drawer-options{display:flex;align-items:center;padding-inline-end:.75rem}.k-drawer-option{--button-width: var(--button-height)}.k-drawer-option[aria-disabled]{opacity:var(--opacity-disabled)}.k-notification.k-drawer-notification{padding:.625rem 1.5rem}.k-drawer-tabs{display:flex;align-items:center;line-height:1}.k-drawer-tab.k-button{--button-height: calc(var(--drawer-header-height) - var(--spacing-1));--button-padding: var(--spacing-3);display:flex;align-items:center;font-size:var(--text-xs);overflow-x:visible}.k-drawer-tab.k-button[aria-current]:after{position:absolute;bottom:-2px;inset-inline:var(--button-padding);content:"";background:var(--color-black);height:2px;z-index:1}:root{--drawer-body-padding: 1.5rem;--drawer-color-back: var(--color-light);--drawer-header-height: 2.5rem;--drawer-header-padding: 1rem;--drawer-shadow: var(--shadow-xl);--drawer-width: 50rem}.k-drawer-overlay+.k-drawer-overlay{--overlay-color-back: none}.k-drawer{--header-sticky-offset: calc(var(--drawer-body-padding) * -1);z-index:var(--z-toolbar);flex-basis:var(--drawer-width);position:relative;display:flex;flex-direction:column;background:var(--drawer-color-back);box-shadow:var(--drawer-shadow);container-type:inline-size}.k-drawer[aria-disabled]{display:none;pointer-events:none}.k-dropdown{position:relative}:root{--dropdown-color-bg: var(--color-black);--dropdown-color-text: var(--color-white);--dropdown-color-hr: rgba(255, 255, 255, .25);--dropdown-padding: var(--spacing-2);--dropdown-rounded: var(--rounded);--dropdown-shadow: var(--shadow-xl)}.k-dropdown-content{--dropdown-x: 0;--dropdown-y: 0;position:absolute;inset-block-start:0;inset-inline-start:initial;left:0;width:max-content;padding:var(--dropdown-padding);background:var(--dropdown-color-bg);border-radius:var(--dropdown-rounded);color:var(--dropdown-color-text);box-shadow:var(--dropdown-shadow);text-align:start;transform:translate(var(--dropdown-x),var(--dropdown-y))}.k-dropdown-content::backdrop{background:none}.k-dropdown-content[data-align-x=end]{--dropdown-x: -100%}.k-dropdown-content[data-align-x=center]{--dropdown-x: -50%}.k-dropdown-content[data-align-y=top]{--dropdown-y: -100%}.k-dropdown-content hr{margin:.5rem 0;height:1px;background:var(--dropdown-color-hr)}.k-dropdown-content[data-theme=light]{--dropdown-color-bg: var(--color-white);--dropdown-color-text: var(--color-black);--dropdown-color-hr: rgba(0, 0, 0, .1)}.k-dropdown-item.k-button{--button-align: flex-start;--button-color-text: var(--dropdown-color-text);--button-height: var(--height-sm);--button-rounded: var(--rounded-sm);--button-width: 100%;display:flex;gap:.75rem}.k-dropdown-item.k-button:focus{outline:var(--outline)}.k-dropdown-item.k-button[aria-current]{--button-color-text: var(--color-blue-500)}.k-dropdown-item.k-button:not([aria-disabled]):hover{--button-color-back: var(--dropdown-color-hr)}.k-options-dropdown{display:flex;justify-content:center;align-items:center}:root{--picklist-rounded: var(--rounded-sm);--picklist-highlight: var(--color-yellow-500)}.k-picklist-input{--choice-color-text: currentColor;--button-rounded: var(--picklist-rounded)}.k-picklist-input-header{--input-rounded: var(--picklist-rounded)}.k-picklist-input-search{display:flex;align-items:center;border-radius:var(--picklist-rounded)}.k-picklist-input-search .k-search-input{height:var(--button-height)}.k-picklist-input-search:focus-within{outline:var(--outline)}.k-picklist-dropdown .k-picklist-input-create:focus{outline:0}.k-picklist-dropdown .k-picklist-input-create[aria-disabled=true]{visibility:hidden}.k-picklist-input-options.k-grid{--columns: 1}.k-picklist-input-options li+li{margin-top:var(--spacing-1)}.k-picklist-input-options .k-choice-input{padding-inline:var(--spacing-2)}.k-picklist-input-options .k-choice-input{--choice-color-checked: var(--color-focus)}.k-picklist-input-options .k-choice-input:has(:checked){--choice-color-text: var(--color-focus)}.k-picklist-input-options .k-choice-input[aria-disabled=true]{--choice-color-text: var(--color-text-dimmed)}.k-picklist-input-options .k-choice-input:has(:focus-within){outline:var(--outline)}.k-picklist-input-options .k-choice-input b{font-weight:var(--font-normal);color:var(--picklist-highlight)}.k-picklist-input-more.k-button{--button-width: 100%;--button-align: start;--button-color-text: var(--color-text-dimmed);padding-inline:var(--spacing-2)}.k-picklist-input-more.k-button .k-button-icon{position:relative;inset-inline-start:-1px}.k-picklist-input-empty{height:var(--button-height);line-height:1.25rem;padding:var(--spacing-1) var(--spacing-2);color:var(--color-text-dimmed)}.k-picklist-dropdown{--color-text-dimmed: var(--color-gray-400);padding:0;max-width:30rem;min-width:8rem}.k-picklist-dropdown :where(.k-picklist-input-header,.k-picklist-input-body,.k-picklist-input-footer){padding:var(--dropdown-padding)}.k-picklist-dropdown .k-picklist-input-header{border-bottom:1px solid var(--dropdown-color-hr)}.k-picklist-dropdown .k-picklist-input-search{background:var(--dropdown-color-hr);padding-inline-end:var(--input-padding)}.k-picklist-dropdown .k-picklist-input-create{--button-rounded: 1rem;--button-height: 1.125rem}.k-picklist-dropdown .k-picklist-input-create:focus{--button-color-back: var(--color-blue-500);--button-color-text: var(--color-black)}.k-picklist-dropdown .k-picklist-input-body{max-height:calc(var(--button-height) * 9.5 + 2px * 9 + var(--dropdown-padding));overflow-y:auto;outline-offset:-2px;overscroll-behavior:contain;scroll-padding-top:var(--dropdown-padding);scroll-padding-bottom:var(--dropdown-padding)}.k-picklist-dropdown .k-picklist-input-options .k-choice-input{--choice-color-border: var(--dropdown-color-hr);--choice-color-back: var(--dropdown-color-hr);--choice-color-info: var(--color-text-dimmed);min-height:var(--button-height);border-radius:var(--picklist-rounded);padding-block:.375rem}.k-picklist-dropdown .k-picklist-input-options li+li{margin-top:0}.k-picklist-dropdown .k-picklist-input-options .k-choice-input[aria-disabled=true] input{--choice-color-border: var(--dropdown-color-hr);--choice-color-back: var(--dropdown-color-hr);--choice-color-checked: var(--dropdown-color-hr);opacity:var(--opacity-disabled)}.k-picklist-dropdown .k-picklist-input-options .k-choice-input:not([aria-disabled=true]):hover{background-color:var(--dropdown-color-hr)}.k-picklist-dropdown .k-picklist-input-options .k-choice-input:not([aria-disabled=true]):focus-within{--choice-color-text: var(--color-blue-500)}.k-picklist-dropdown .k-picklist-input-more.k-button:hover{--button-color-back: var(--dropdown-color-hr)}.k-picklist-dropdown .k-picklist-input-body+.k-picklist-input-footer{border-top:1px solid var(--dropdown-color-hr)}.k-counter{font-size:var(--text-xs);color:var(--color-gray-900)}.k-counter[data-invalid=true]{color:var(--color-red-700)}.k-counter-rules{color:var(--color-gray-600);padding-inline-start:.5rem}.k-form-submitter{display:none}.k-field[data-disabled=true]{cursor:not-allowed}.k-field[data-disabled=true] *{pointer-events:none}.k-field[data-disabled=true] .k-text[data-theme=help] *{pointer-events:initial}.k-field-header{display:flex;justify-content:space-between;align-items:center;gap:var(--spacing-6);position:relative;margin-bottom:var(--spacing-2)}.k-field-options{flex-shrink:0}.k-field:focus-within>.k-field-header>.k-field-counter{display:block}.k-field-footer{margin-top:var(--spacing-2)}.k-fieldset{border:0}:root{--input-color-back: var(--color-white);--input-color-border: var(--color-border);--input-color-description: var(--color-text-dimmed);--input-color-icon: currentColor;--input-color-placeholder: var(--color-gray-600);--input-color-text: currentColor;--input-font-family: var(--font-sans);--input-font-size: var(--text-sm);--input-height: 2.25rem;--input-leading: 1;--input-outline-focus: var(--outline);--input-padding: var(--spacing-2);--input-padding-multiline: .475rem var(--input-padding);--input-rounded: var(--rounded);--input-shadow: none}@media (pointer: coarse){:root{--input-font-size: var(--text-md);--input-padding-multiline: .375rem var(--input-padding)}}.k-input{display:flex;align-items:center;line-height:var(--input-leading);border:0;background:var(--input-color-back);border-radius:var(--input-rounded);outline:1px solid var(--input-color-border);color:var(--input-color-text);min-height:var(--input-height);box-shadow:var(--input-shadow);font-family:var(--input-font-family);font-size:var(--input-font-size)}.k-input:focus-within{outline:var(--input-outline-focus)}.k-input-element{flex-grow:1}.k-input-icon{color:var(--input-color-icon);display:flex;justify-content:center;align-items:center;width:var(--input-height)}.k-input-icon-button{width:100%;height:100%;display:flex;align-items:center;justify-content:center;flex-shrink:0}.k-input-description{color:var(--input-color-description);padding-inline:var(--input-padding)}.k-input-before{padding-inline-end:0}.k-input-after{padding-inline-start:0}.k-input :where(.k-input-description,.k-input-icon){align-self:stretch;display:flex;align-items:center;flex-shrink:0}.k-input[data-disabled=true]{--input-color-back: var(--color-background);--input-color-icon: var(--color-gray-600);pointer-events:none}.k-block-title{display:flex;align-items:center;min-width:0;padding-inline-end:.75rem;line-height:1;gap:var(--spacing-2)}.k-block-icon{--icon-color: var(--color-gray-600);width:1rem}.k-block-label{color:var(--color-text-dimmed);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.k-block-type-default .k-block-title{line-height:1.5em}.k-block-options{--toolbar-size: 30px;box-shadow:var(--shadow-toolbar)}.k-block-options>.k-button:not(:last-of-type){border-inline-end:1px solid var(--color-background)}.k-block-options .k-dropdown-content{margin-top:.5rem}.k-block-container{position:relative;padding:.75rem;background:var(--color-white);border-radius:var(--rounded)}.k-block-container:not(:last-of-type){border-bottom:1px dashed rgba(0,0,0,.1)}.k-block-container:focus{outline:0}.k-block-container[data-selected=true]{z-index:2;outline:var(--outline);border-bottom-color:transparent}.k-block-container[data-batched=true]:after{position:absolute;top:0;right:0;bottom:0;left:0;content:"";background:#b1c2d82d;mix-blend-mode:multiply}.k-block-container .k-block-options{display:none;position:absolute;top:0;inset-inline-end:.75rem;margin-top:calc(-1.75rem + 2px)}.k-block-container[data-last-selected=true]>.k-block-options{display:flex}.k-block-container[data-hidden=true] .k-block{opacity:.25}.k-drawer-options .k-drawer-option[data-disabled=true]{vertical-align:middle;display:inline-grid}.k-block-container[data-disabled=true]{background:var(--color-background)}.k-block-container:is(.k-sortable-ghost,.k-sortable-fallback) .k-block{position:relative;max-height:4rem;overflow:hidden}.k-block-container:is(.k-sortable-ghost,.k-sortable-fallback) .k-block:after{position:absolute;bottom:0;content:"";height:2rem;width:100%;background:linear-gradient(to top,var(--color-white),transparent)}.k-blocks{border-radius:var(--rounded)}.k-blocks:not([data-empty=true],[data-disabled=true]){background:var(--color-white);box-shadow:var(--shadow)}.k-blocks[data-disabled=true]:not([data-empty=true]){border:1px solid var(--input-color-border)}.k-blocks-list[data-multi-select-key=true]>.k-block-container *{pointer-events:none}.k-blocks-list[data-multi-select-key=true]>.k-block-container .k-blocks *{pointer-events:all}.k-blocks .k-sortable-ghost{outline:2px solid var(--color-focus);box-shadow:#11111140 0 5px 10px;cursor:grabbing;cursor:-moz-grabbing;cursor:-webkit-grabbing}.k-blocks-list>.k-blocks-empty{display:flex;align-items:center}.k-block-importer .k-dialog-body{padding:0}.k-block-importer label{display:block;padding:var(--spacing-6) var(--spacing-6) 0;color:var(--color-text-dimmed);line-height:var(--leading-normal)}.k-block-importer label small{display:block;font-size:inherit}.k-block-importer textarea{width:100%;height:20rem;background:none;font:inherit;color:var(--color-white);border:0;padding:var(--spacing-6);resize:none}.k-block-importer textarea:focus{outline:0}.k-block-selector .k-headline{margin-bottom:1rem}.k-block-selector details+details{margin-top:var(--spacing-6)}.k-block-selector summary{font-size:var(--text-xs);cursor:pointer;color:var(--color-text-dimmed)}.k-block-selector details:only-of-type summary{pointer-events:none}.k-block-selector summary:focus{outline:0}.k-block-selector summary:focus-visible{color:var(--color-focus)}.k-block-types{display:grid;grid-gap:2px;margin-top:.75rem;grid-template-columns:repeat(1,1fr)}.k-block-types .k-button{--button-color-icon: var(--color-text);--button-color-back: var(--color-white);--button-padding: var(--spacing-3);width:100%;justify-content:start;gap:1rem;box-shadow:var(--shadow)}.k-block-types .k-button[aria-disabled]{opacity:var(--opacity-disabled);--button-color-back: var(--color-gray-200);box-shadow:none}.k-clipboard-hint{padding-top:1.5rem;line-height:var(--leading-normal);font-size:var(--text-xs);color:var(--color-text-dimmed)}.k-clipboard-hint small{display:block;font-size:inherit;color:var(--color-text-dimmed)}.k-block-figure-container:not([data-disabled=true]){cursor:pointer}.k-block-figure iframe{border:0;pointer-events:none;background:var(--color-black)}.k-block-figure figcaption{padding-top:.5rem;color:var(--color-text-dimmed);font-size:var(--text-sm);text-align:center}.k-block-figure-empty{--button-width: 100%;--button-height: 6rem;--button-color-text: var(--color-text-dimmed);--button-color-back: var(--color-gray-200)}.k-block-figure-empty,.k-block-figure-container>*{border-radius:var(--rounded-sm)}.k-block-type-code-editor{position:relative}.k-block-type-code-editor .k-input{--input-color-border: none;--input-color-back: var(--color-black);--input-color-text: var(--color-white);--input-font-family: var(--font-mono);--input-outline-focus: none;--input-padding: var(--spacing-3);--input-padding-multiline: var(--input-padding)}.k-block-type-code-editor .k-input[data-type=textarea]{white-space:pre-wrap}.k-block-type-code-editor-language{--input-font-size: var(--text-xs);position:absolute;inset-inline-end:0;bottom:0}.k-block-type-code-editor-language .k-input-element{padding-inline-start:1.5rem}.k-block-type-code-editor-language .k-input-icon{inset-inline-start:0}.k-block-container.k-block-container-type-fields{padding-block:0}.k-block-container:not([data-hidden=true]) .k-block-type-fields>:not([data-collapsed=true]){padding-bottom:var(--spacing-3)}.k-block-type-fields-header{display:flex;justify-content:space-between}.k-block-type-fields-header .k-block-title{padding-block:var(--spacing-3);cursor:pointer;white-space:nowrap}.k-block-type-fields-form{background-color:var(--color-gray-200);padding:var(--spacing-6) var(--spacing-6) var(--spacing-8);border-radius:var(--rounded-sm);container:column / inline-size}.k-block-container-type-fields[data-hidden=true] :where(.k-drawer-tabs,.k-block-type-fields-form){display:none}.k-block-type-gallery ul{display:grid;grid-gap:.75rem;grid-template-columns:repeat(auto-fit,minmax(6rem,1fr));line-height:0;align-items:center;justify-content:center}.k-block-type-gallery:not([data-disabled=true]) ul{cursor:pointer}.k-block-type-gallery[data-disabled=true] .k-block-type-gallery-placeholder{background:var(--color-gray-250)}.k-block-type-gallery-placeholder{background:var(--color-background)}.k-block-type-gallery figcaption{padding-top:.5rem;color:var(--color-gray-600);font-size:var(--text-sm);text-align:center}.k-block-type-heading-input{display:flex;align-items:center;line-height:1.25em;font-size:var(--text-size);font-weight:var(--font-bold)}.k-block-type-heading-input[data-level=h1]{--text-size: var(--text-3xl);line-height:1.125em}.k-block-type-heading-input[data-level=h2]{--text-size: var(--text-2xl)}.k-block-type-heading-input[data-level=h3]{--text-size: var(--text-xl)}.k-block-type-heading-input[data-level=h4]{--text-size: var(--text-lg)}.k-block-type-heading-input[data-level=h5]{--text-size: var(--text-md);line-height:1.5em}.k-block-type-heading-input[data-level=h6]{--text-size: var(--text-sm);line-height:1.5em}.k-block-type-heading-input .k-writer .ProseMirror strong{font-weight:700}.k-block-type-heading-level{--input-color-back: transparent;--input-color-border: none;--input-color-text: var(--color-gray-600);font-weight:var(--font-bold);text-transform:uppercase}.k-block-type-image .k-block-figure-container{text-align:center;line-height:0}.k-block-type-image-auto{max-width:100%;max-height:30rem;margin-inline:auto}.k-block-type-line hr{margin-block:.75rem;border:0;border-top:1px solid var(--color-border)}.k-block-type-list-input{--input-color-back: transparent;--input-color-border: none;--input-outline-focus: none}.k-block-type-markdown-input{--input-color-back: var(--color-light);--input-color-border: none;--input-outline-focus: none;--input-padding-multiline: var(--spacing-3)}.k-block-type-quote-editor{padding-inline-start:var(--spacing-3);border-inline-start:2px solid var(--color-black)}.k-block-type-quote-text{font-size:var(--text-xl);margin-bottom:var(--spacing-1);line-height:1.25em}.k-block-type-quote-citation{font-style:italic;color:var(--color-text-dimmed)}.k-block-type-table-preview{cursor:pointer;border:1px solid var(--color-gray-300);border-spacing:0;border-radius:var(--rounded-sm)}.k-block-type-table-preview :where(th,td){text-align:start;line-height:1.5em;font-size:var(--text-sm)}.k-block-type-table-preview th{padding:.5rem .75rem}.k-block-type-table-preview td:not(.k-table-index-column){padding:0 .75rem}.k-block-type-table-preview td>*,.k-block-type-table-preview td [class$=-field-preview]{padding:0}.k-block-type-text-input{line-height:1.5;height:100%}.k-block-container.k-block-container-type-text{padding:0}.k-block-type-text-input.k-writer[data-toolbar-inline=true]{padding:var(--spacing-3)}.k-block-type-text-input.k-writer:not([data-toolbar-inline=true])>.ProseMirror,.k-block-type-text-input.k-writer:not([data-toolbar-inline=true])[data-placeholder][data-empty=true]:before{padding:var(--spacing-3) var(--spacing-6)}.k-block-type-video-figure video{pointer-events:none}.k-blocks-field{position:relative}.k-blocks-field>footer{display:flex;justify-content:center;margin-top:var(--spacing-3)}.k-string-input{padding:var(--input-padding);border-radius:var(--input-rounded)}.k-string-input:focus{outline:0}.k-string-input[data-font=monospace]{font-family:var(--font-mono)}.k-color-field{--color-frame-size: calc(var(--input-height) - var(--spacing-2))}.k-color-field .k-input-before{align-items:center;padding-inline-start:var(--spacing-1)}.k-color-field-options{--color-frame-size: var(--input-height)}.k-color-field-picker{padding:var(--spacing-3)}.k-color-field-picker-toggle{--color-frame-rounded: var(--rounded-sm);border-radius:var(--color-frame-rounded)}.k-color-field .k-colorname-input{padding-inline:var(--input-padding)}.k-color-field .k-colorname-input:focus{outline:0}.k-date-input:disabled::placeholder{opacity:0}.k-date-field-body{display:grid;gap:var(--spacing-2)}@container (min-width: 20rem){.k-date-field-body[data-has-time=true]{grid-template-columns:1fr minmax(6rem,9rem)}}.k-text-input{padding:var(--input-padding);border-radius:var(--input-rounded)}.k-text-input:focus{outline:0}.k-text-input[data-font=monospace]{font-family:var(--font-mono)}.k-text-input:disabled::placeholder{opacity:0}.k-models-field[data-disabled=true] .k-item *{pointer-events:all!important}.k-headline-field{position:relative;padding-top:1.5rem}.k-fieldset>.k-grid .k-column:first-child .k-headline-field{padding-top:0}.k-headline-field h2.k-headline{font-weight:var(--font-normal)}.k-headline-field footer{margin-top:var(--spacing-2)}.k-info-field .k-headline{padding-bottom:.75rem;line-height:1.25rem}.k-layout-column{position:relative;height:100%;display:flex;flex-direction:column;background:var(--color-white);min-height:6rem}.k-layout-column:focus{outline:0}.k-layout-column>.k-blocks{background:none;box-shadow:none;padding:0;height:100%;background:var(--color-white);min-height:4rem}.k-layout-column>.k-blocks[data-empty=true]{min-height:6rem}.k-layout-column>.k-blocks>.k-blocks-list{display:flex;flex-direction:column;height:100%}.k-layout-column>.k-blocks>.k-blocks-list>.k-block-container:last-of-type{flex-grow:1}.k-layout-column>.k-blocks>.k-blocks-list>.k-blocks-empty.k-box{--box-color-back: transparent;position:absolute;top:0;right:0;bottom:0;left:0;justify-content:center;opacity:0;transition:opacity .3s;border:0}.k-layout-column>.k-blocks>.k-blocks-list>.k-blocks-empty:hover{opacity:1}.k-layout{--layout-border-color: var(--color-gray-300);--layout-toolbar-width: 2rem;position:relative;padding-inline-end:var(--layout-toolbar-width);background:#fff;box-shadow:var(--shadow)}[data-disabled=true] .k-layout{padding-inline-end:0}.k-layout:not(:last-of-type){margin-bottom:1px}.k-layout:focus{outline:0}.k-layout-toolbar{position:absolute;inset-block:0;inset-inline-end:0;width:var(--layout-toolbar-width);display:flex;flex-direction:column;align-items:center;justify-content:space-between;padding-bottom:var(--spacing-2);font-size:var(--text-sm);background:var(--color-gray-100);border-inline-start:1px solid var(--color-light);color:var(--color-gray-500)}.k-layout-toolbar:hover{color:var(--color-black)}.k-layout-toolbar-button{width:var(--layout-toolbar-width);height:var(--layout-toolbar-width)}.k-layout-columns.k-grid{grid-gap:1px;background:var(--layout-border-color);background:var(--color-gray-300)}.k-layout:not(:first-child) .k-layout-columns.k-grid{border-top:0}.k-layouts .k-sortable-ghost{position:relative;box-shadow:#11111140 0 5px 10px;outline:2px solid var(--color-focus);cursor:grabbing;z-index:1}.k-layout-field>footer{display:flex;justify-content:center;margin-top:var(--spacing-3)}.k-line-field{position:relative;border:0;height:3rem;width:auto}.k-line-field:after{position:absolute;content:"";top:50%;margin-top:-1px;inset-inline:0;height:1px;background:var(--color-border)}.k-link-input-header{display:grid;grid-template-columns:max-content minmax(0,1fr);align-items:center;gap:.25rem;height:var(--input-height);grid-area:header}.k-link-input-toggle.k-button{--button-height: var(--height-sm);--button-rounded: var(--rounded-sm);--button-color-back: var(--color-gray-200);margin-inline-start:.25rem}.k-link-input-model{display:flex;justify-content:space-between;margin-inline-end:var(--spacing-1)}.k-link-input-model-placeholder.k-button{--button-align: flex-start;--button-color-text: var(--color-gray-600);--button-height: var(--height-sm);--button-padding: var(--spacing-2);--button-rounded: var(--rounded-sm);flex-grow:1;overflow:hidden;white-space:nowrap;align-items:center}.k-link-field .k-link-field-preview{--tag-height: var(--height-sm);padding-inline:0}.k-link-field .k-link-field-preview .k-tag:focus{outline:0}.k-link-field .k-link-field-preview .k-tag:focus-visible{outline:var(--outline)}.k-link-field .k-link-field-preview .k-tag-text{font-size:var(--text-sm)}.k-link-input-model-toggle{align-self:center;--button-height: var(--height-sm);--button-width: var(--height-sm);--button-rounded: var(--rounded-sm)}.k-link-input-body{display:grid;overflow:hidden;border-top:1px solid var(--color-gray-300);background:var(--color-gray-100);--tree-color-back: var(--color-gray-100);--tree-color-hover-back: var(--color-gray-200)}.k-link-input-body[data-type=page] .k-page-browser{padding:var(--spacing-2);padding-bottom:calc(var(--spacing-2) - 1px);width:100%;container-type:inline-size;overflow:auto}.k-link-field .k-bubbles-field-preview{--bubble-rounded: var(--rounded-sm);--bubble-size: var(--height-sm);padding-inline:0}.k-link-field .k-bubbles-field-preview .k-bubble{font-size:var(--text-sm)}.k-link-field[data-disabled=true] .k-link-input-model-placeholder{display:none}.k-link-field[data-disabled=true] input::placeholder{opacity:0}.k-writer{position:relative;width:100%;display:grid;grid-template-areas:"content";gap:var(--spacing-1)}.k-writer .ProseMirror{overflow-wrap:break-word;word-wrap:break-word;word-break:break-word;white-space:pre-wrap;font-variant-ligatures:none;grid-area:content;padding:var(--input-padding-multiline)}.k-writer .ProseMirror:focus{outline:0}.k-writer .ProseMirror *{caret-color:currentColor}.k-writer .ProseMirror hr.ProseMirror-selectednode{outline:var(--outline)}.k-writer[data-placeholder][data-empty=true]:before{grid-area:content;content:attr(data-placeholder);color:var(--input-color-placeholder);pointer-events:none;white-space:pre-wrap;word-wrap:break-word;line-height:var(--text-line-height);padding:var(--input-padding-multiline)}.k-list-input.k-writer[data-placeholder][data-empty=true]:before{padding-inline-start:2.5em}.k-list-field .k-list-input .ProseMirror,.k-list-field .k-list-input:before{padding:.475rem .5rem .475rem .75rem}:root{--tags-gap: .375rem}.k-tags{display:inline-flex;gap:var(--tags-gap);align-items:center;flex-wrap:wrap}.k-tags .k-sortable-ghost{outline:var(--outline)}.k-tags[data-layout=list],.k-tags[data-layout=list] .k-tag{width:100%}.k-tags.k-draggable .k-tag-text{cursor:grab}.k-tags.k-draggable .k-tag-text:active{cursor:grabbing}.k-multiselect-input{padding:var(--tags-gap);cursor:pointer}.k-multiselect-input-toggle.k-button{opacity:0}.k-tags-input{padding:var(--tags-gap);cursor:pointer}.k-tags-input-toggle.k-button{--button-color-text: var(--input-color-placeholder);opacity:0}.k-tags-input-toggle.k-button:focus{--button-color-text: var(--input-color-text)}.k-tags-input:focus-within .k-tags-input-toggle{opacity:1}.k-tags-input .k-picklist-dropdown{margin-top:var(--spacing-1)}.k-tags-input .k-picklist-dropdown .k-choice-input{gap:0}.k-tags-input .k-picklist-dropdown .k-choice-input:focus-within{outline:var(--outline)}.k-tags-input .k-picklist-dropdown .k-choice-input input{opacity:0;width:0}.k-number-input{padding:var(--input-padding);border-radius:var(--input-rounded)}.k-number-input:focus{outline:0}.k-table.k-object-field-table{table-layout:auto}.k-table.k-object-field-table tbody td{max-width:0}@container (max-width: 40rem){.k-object-field{overflow:hidden}.k-object-field-table.k-table tbody :where(th):is([data-mobile=true]){width:1px!important;white-space:normal;word-break:normal}}.k-range-input{--range-track-height: 1px;--range-track-back: var(--color-gray-300);--range-tooltip-back: var(--color-black);display:flex;align-items:center;border-radius:var(--range-track-height)}.k-range-input input[type=range]:focus{outline:0}.k-range-input-tooltip{position:relative;display:flex;align-items:center;color:var(--color-white);font-size:var(--text-xs);font-variant-numeric:tabular-nums;line-height:1;text-align:center;border-radius:var(--rounded-sm);background:var(--range-tooltip-back);margin-inline-start:var(--spacing-3);padding:0 var(--spacing-1);white-space:nowrap}.k-range-input-tooltip:after{position:absolute;top:50%;inset-inline-start:-3px;width:0;height:0;transform:translateY(-50%);border-block:3px solid transparent;border-inline-end:3px solid var(--range-tooltip-back);content:""}.k-range-input-tooltip>*{padding:var(--spacing-1)}.k-range-input[data-disabled=true]{--range-tooltip-back: var(--color-gray-600)}.k-input[data-type=range] .k-range-input{padding-inline:var(--input-padding)}.k-select-input{position:relative;display:block;overflow:hidden;padding:var(--input-padding);border-radius:var(--input-rounded)}.k-select-input[data-empty=true]{color:var(--input-color-placeholder)}.k-select-input-native{position:absolute;top:0;right:0;bottom:0;left:0;opacity:0;z-index:1}.k-select-input-native[disabled]{cursor:default}.k-input[data-type=select]{position:relative}.k-input[data-type=select] .k-input-icon{position:absolute;inset-block:0;inset-inline-end:0}.k-structure-field:not([data-disabled=true]) td.k-table-column{cursor:pointer}.k-structure-field .k-table+footer{display:flex;justify-content:center;margin-top:var(--spacing-3)}.k-field-counter{display:none}.k-text-field:focus-within .k-field-counter{display:block}.k-toolbar.k-textarea-toolbar{border-end-start-radius:0;border-end-end-radius:0;border-bottom:1px solid var(--toolbar-border)}.k-toolbar.k-textarea-toolbar>.k-button:first-child{border-end-start-radius:0}.k-toolbar.k-textarea-toolbar>.k-button:last-child{border-end-end-radius:0}.k-textarea-input[data-size=small]{--textarea-size: 7.5rem}.k-textarea-input[data-size=medium]{--textarea-size: 15rem}.k-textarea-input[data-size=large]{--textarea-size: 30rem}.k-textarea-input[data-size=huge]{--textarea-size: 45rem}.k-textarea-input-wrapper{position:relative;display:block}.k-textarea-input-native{resize:none;min-height:var(--textarea-size)}.k-textarea-input-native:focus{outline:0}.k-textarea-input-native[data-font=monospace]{font-family:var(--font-mono)}.k-input[data-type=textarea] .k-input-element{min-width:0}.k-input[data-type=textarea] .k-textarea-input-native{padding:var(--input-padding-multiline)}.k-time-input:disabled::placeholder{opacity:0}.k-input[data-type=toggle]{--input-color-border: transparent;--input-shadow: var(--shadow)}.k-input[data-type=toggle] .k-input-before{padding-inline-end:calc(var(--input-padding) / 2)}.k-input[data-type=toggle] .k-toggle-input{padding-inline-start:var(--input-padding)}.k-input[data-type=toggle][data-disabled]{box-shadow:none;border:1px solid var(--color-border)}.k-input[data-type=toggles]{display:inline-flex}.k-input[data-type=toggles].grow{display:flex}.k-input[data-type=toggles]:has(.k-empty){outline:0;display:flex}.k-toggles-input{display:grid;grid-template-columns:repeat(var(--options),minmax(0,1fr));gap:1px;border-radius:var(--rounded);line-height:1;background:var(--color-border);overflow:hidden}.k-toggles-input li{height:var(--field-input-height);background:var(--color-white)}.k-toggles-input label{align-items:center;background:var(--color-white);cursor:pointer;display:flex;font-size:var(--text-sm);justify-content:center;line-height:1.25;padding:0 var(--spacing-3);height:100%}.k-toggles-input li[data-disabled=true] label{color:var(--color-text-dimmed);background:var(--color-light)}.k-toggles-input .k-icon+.k-toggles-text{margin-inline-start:var(--spacing-2)}.k-toggles-input input:focus:not(:checked)+label{background:var(--color-blue-200)}.k-toggles-input input:checked+label{background:var(--color-black);color:var(--color-white)}.k-alpha-input{--range-track-back: linear-gradient(to right, transparent, currentColor);--range-track-height: var(--range-thumb-size);color:#000;background:var(--color-white) var(--pattern-light)}.k-calendar-input{--button-height: var(--height-sm);--button-width: var(--button-height);--button-padding: 0;padding:var(--spacing-2);width:min-content}.k-calendar-table{table-layout:fixed;min-width:15rem}.k-calendar-input .k-button{justify-content:center}.k-calendar-input>nav{display:flex;direction:ltr;align-items:center;margin-bottom:var(--spacing-2)}.k-calendar-selects{flex-grow:1;display:flex;align-items:center;justify-content:center}[dir=ltr] .k-calendar-selects{direction:ltr}[dir=rtl] .k-calendar-selects{direction:rtl}.k-calendar-selects .k-select-input{display:flex;align-items:center;text-align:center;height:var(--button-height);padding:0 .5rem;border-radius:var(--input-rounded)}.k-calendar-selects .k-select-input:focus-within{outline:var(--outline)}.k-calendar-input th{padding-block:.5rem;color:var(--color-gray-500);font-size:var(--text-xs);text-align:center}.k-calendar-day{padding:2px}.k-calendar-day[aria-current=date] .k-button{text-decoration:underline}.k-calendar-day[aria-selected=date] .k-button,.k-calendar-day[aria-selected=date] .k-button:focus{--button-color-text: var(--color-text);--button-color-back: var(--color-blue-500)}.k-calendar-day[aria-selected=date] .k-button:focus-visible{outline-offset:2px}.k-calendar-today{padding-top:var(--spacing-2);text-align:center}.k-calendar-today .k-button{--button-width: auto;--button-padding: var(--spacing-3);font-size:var(--text-xs);text-decoration:underline}.k-choice-input{display:flex;gap:var(--spacing-3);min-width:0}.k-choice-input input{top:2px}.k-choice-input-label{display:flex;line-height:1.25rem;flex-direction:column;min-width:0;color:var(--choice-color-text)}.k-choice-input-label>*{display:block;overflow:hidden;text-overflow:ellipsis}.k-choice-input-label-info{color:var(--choice-color-info)}.k-choice-input[aria-disabled]{cursor:not-allowed}:where(.k-checkboxes-field,.k-radio-field) .k-choice-input{min-height:var(--input-height);padding-block:var(--spacing-2);padding-inline:var(--spacing-3);border-radius:var(--input-rounded)}:where(.k-checkboxes-field,.k-radio-field) .k-choice-input:not([aria-disabled=true]){background:var(--input-color-back);box-shadow:var(--shadow)}:where(.k-checkboxes-field,.k-radio-field) .k-choice-input[aria-disabled=true]{border:1px solid var(--input-color-border)}.k-coloroptions-input{--color-preview-size: var(--input-height)}.k-coloroptions-input ul{display:grid;grid-template-columns:repeat(auto-fill,var(--color-preview-size));gap:var(--spacing-2)}.k-coloroptions-input input:focus+.k-color-frame{outline:var(--outline)}.k-coloroptions-input[disabled] label{opacity:var(--opacity-disabled);cursor:not-allowed}.k-coloroptions-input input:checked+.k-color-frame{outline:1px solid var(--color-gray-600);outline-offset:2px}.k-colorpicker-input{--h: 0;--s: 0%;--l: 0%;--a: 1;--range-thumb-size: .75rem;--range-track-height: .75rem;display:flex;flex-direction:column;gap:var(--spacing-3);width:max-content}.k-colorpicker-input .k-coords-input{border-radius:var(--rounded-sm);aspect-ratio:1/1;background:linear-gradient(to bottom,transparent,#000),linear-gradient(to right,#fff,hsl(var(--h),100%,50%))}.k-colorpicker-input .k-alpha-input{color:hsl(var(--h),var(--s),var(--l))}.k-colorpicker-input .k-coloroptions-input ul{grid-template-columns:repeat(6,1fr)}.k-coords-input{position:relative;display:block!important}.k-coords-input img{width:100%}.k-coords-input-thumb{position:absolute;aspect-ratio:1/1;width:var(--range-thumb-size);background:var(--range-thumb-color);border-radius:var(--range-thumb-size);box-shadow:var(--range-thumb-shadow);transform:translate(-50%,-50%);cursor:move}.k-coords-input[data-empty] .k-coords-input-thumb{opacity:0}.k-coords-input-thumb:active{cursor:grabbing}.k-coords-input:focus-within{outline:var(--outline)}.k-coords-input[aria-disabled]{pointer-events:none;opacity:var(--opacity-disabled)}.k-coords-input .k-coords-input-thumb:focus{outline:var(--outline)}.k-hue-input{--range-track-back: linear-gradient( to right, hsl(0, 100%, 50%) 0%, hsl(60, 100%, 50%) 16.67%, hsl(120, 100%, 50%) 33.33%, hsl(180, 100%, 50%) 50%, hsl(240, 100%, 50%) 66.67%, hsl(320, 100%, 50%) 83.33%, hsl(360, 100%, 50%) 100% ) no-repeat;--range-track-height: var(--range-thumb-size)}.k-timeoptions-input{--button-height: var(--height-sm);display:grid;grid-template-columns:1fr 1fr;gap:var(--spacing-3)}.k-timeoptions-input h3{display:flex;align-items:center;padding-inline:var(--button-padding);height:var(--button-height);margin-bottom:var(--spacing-1)}.k-timeoptions-input hr{margin:var(--spacing-2) var(--spacing-3)}.k-timeoptions-input .k-button[aria-selected=time]{--button-color-text: var(--color-text);--button-color-back: var(--color-blue-500)}.k-layout-selector h3{margin-top:-.5rem;margin-bottom:var(--spacing-3)}.k-layout-selector-options{display:grid;grid-template-columns:repeat(3,1fr);gap:var(--spacing-6)}@media screen and (min-width: 65em){.k-layout-selector-options{grid-template-columns:repeat(var(--columns),1fr)}}.k-layout-selector-option{--color-border: hsla(var(--color-gray-hs), 0%, 6%);--color-back: var(--color-white);border-radius:var(--rounded)}.k-layout-selector-option:focus-visible{outline:var(--outline);outline-offset:-1px}.k-layout-selector-option .k-grid{border:1px solid var(--color-border);gap:1px;grid-template-columns:repeat(var(--columns),1fr);cursor:pointer;background:var(--color-border);border-radius:var(--rounded);overflow:hidden;box-shadow:var(--shadow);height:5rem}.k-layout-selector-option .k-column{grid-column:span var(--span);background:var(--color-back);height:100%}.k-layout-selector-option:hover{--color-border: var(--color-gray-500);--color-back: var(--color-gray-100)}.k-layout-selector-option[aria-current]{--color-border: var(--color-focus);--color-back: var(--color-blue-300)}.k-bubbles{display:flex;gap:.25rem}.k-bubbles-field-preview{--bubble-back: var(--color-light);--bubble-text: var(--color-black);padding:.375rem var(--table-cell-padding);overflow:hidden}.k-bubbles-field-preview .k-bubbles{gap:.375rem}.k-color-field-preview{--color-frame-rounded: var(--tag-rounded);--color-frame-size: var(--tag-height);padding:.375rem var(--table-cell-padding);display:flex;align-items:center;gap:var(--spacing-2)}.k-text-field-preview{padding:.325rem .75rem;overflow-x:hidden;text-overflow:ellipsis;white-space:nowrap}.k-url-field-preview{padding-inline:var(--table-cell-padding)}.k-url-field-preview[data-link]{color:var(--link-color)}.k-url-field-preview a{display:inline-flex;align-items:center;height:var(--height-xs);padding-inline:var(--spacing-1);margin-inline:calc(var(--spacing-1) * -1);border-radius:var(--rounded);max-width:100%;min-width:0}.k-url-field-preview a>*{overflow:hidden;white-space:nowrap;text-overflow:ellipsis;text-decoration:underline;text-underline-offset:var(--link-underline-offset)}.k-url-field-preview a:hover{color:var(--color-black)}.k-flag-field-preview{--button-height: var(--table-row-height);--button-width: 100%;outline-offset:-2px}.k-html-field-preview{padding:.375rem var(--table-cell-padding);overflow:hidden;text-overflow:ellipsis}.k-image-field-preview{height:100%}.k-link-field-preview{--tag-height: var(--height-xs);--tag-color-back: var(--color-gray-200);--tag-color-text: var(--color-black);--tag-color-toggle: var(--tag-color-text);--tag-color-toggle-border: var(--color-gray-300);--tag-color-focus-back: var(--tag-color-back);--tag-color-focus-text: var(--tag-color-text);padding-inline:var(--table-cell-padding);min-width:0}.k-link-field-preview .k-tag{min-width:0;max-width:100%}.k-link-field-preview .k-tag-text{font-size:var(--text-xs);min-width:0}.k-toggle-field-preview{padding-inline:var(--table-cell-padding)}:root{--toolbar-size: var(--height);--toolbar-text: var(--color-black);--toolbar-back: var(--color-white);--toolbar-hover: rgba(239, 239, 239, .5);--toolbar-border: rgba(0, 0, 0, .1);--toolbar-current: var(--color-focus)}.k-toolbar{display:flex;max-width:100%;height:var(--toolbar-size);align-items:center;overflow-x:auto;overflow-y:hidden;color:var(--toolbar-text);background:var(--toolbar-back);border-radius:var(--rounded)}.k-toolbar[data-theme=dark]{--toolbar-text: var(--color-white);--toolbar-back: var(--color-black);--toolbar-hover: rgba(255, 255, 255, .2);--toolbar-border: var(--color-gray-800)}.k-toolbar>hr{height:var(--toolbar-size);width:1px;border-left:1px solid var(--toolbar-border)}.k-toolbar-button.k-button{--button-width: var(--toolbar-size);--button-height: var(--toolbar-size);--button-rounded: 0;outline-offset:-2px}.k-toolbar-button:hover{--button-color-back: var(--toolbar-hover)}.k-toolbar .k-button[aria-current]{--button-color-text: var(--toolbar-current)}.k-toolbar>.k-button:first-child{border-start-start-radius:var(--rounded);border-end-start-radius:var(--rounded)}.k-toolbar>.k-button:last-child{border-start-end-radius:var(--rounded);border-end-end-radius:var(--rounded)}:where(.k-textarea-input,.k-writer-input):not(:focus-within){--toolbar-text: var(--color-gray-400);--toolbar-border: var(--color-background)}:where(.k-textarea-input,.k-writer-input):focus-within .k-toolbar:not([data-inline=true]){position:sticky;top:var(--header-sticky-offset);inset-inline:0;z-index:1;box-shadow:#0000000d 0 2px 5px}.k-writer:not([data-toolbar-inline=true]):not([data-disabled=true]){grid-template-areas:"topbar" "content";grid-template-rows:var(--toolbar-size) 1fr;gap:0}.k-writer:not(:focus-within){--toolbar-current: currentColor}.k-writer-toolbar[data-inline=true]{position:absolute;z-index:calc(var(--z-dropdown) + 1);max-width:none;box-shadow:var(--shadow-toolbar)}.k-writer-toolbar:not([data-inline=true]){border-end-start-radius:0;border-end-end-radius:0;border-bottom:1px solid var(--toolbar-border)}.k-writer-toolbar:not([data-inline=true])>.k-button:first-child{border-end-start-radius:0}.k-writer-toolbar:not([data-inline=true])>.k-button:last-child{border-end-end-radius:0}.k-aspect-ratio{position:relative;display:block;overflow:hidden;padding-bottom:100%}.k-aspect-ratio>*{position:absolute!important;top:0;right:0;bottom:0;left:0;height:100%;width:100%;object-fit:contain}.k-aspect-ratio[data-cover=true]>*{object-fit:cover}:root{--bar-height: var(--height-xs)}.k-bar{display:flex;align-items:center;gap:var(--spacing-3);height:var(--bar-height);justify-content:space-between}.k-bar:where([data-align=center]){justify-content:center}.k-bar:where([data-align=end]):has(:first-child:last-child){justify-content:end}.k-bar-slot{flex-grow:1}.k-bar-slot[data-position=center]{text-align:center}.k-bar-slot[data-position=right]{text-align:end}:root{--box-height: var( --field-input-height );--box-padding-inline: var(--spacing-2);--box-font-size: var(--text-sm);--box-color-back: none;--box-color-text: currentColor}.k-box{--icon-color: var(--box-color-icon);--text-font-size: var(--box-font-size);display:flex;width:100%;align-items:center;gap:var(--spacing-2);color:var(--box-color-text);background:var(--box-color-back);word-wrap:break-word}.k-box[data-theme]{--box-color-back: var(--theme-color-back);--box-color-text: var(--theme-color-text);--box-color-icon: var(--theme-color-700);min-height:var(--box-height);line-height:1.25;padding:.375rem var(--box-padding-inline);border-radius:var(--rounded)}.k-box[data-theme=text],.k-box[data-theme=white]{box-shadow:var(--shadow)}.k-box[data-theme=text]{padding:var(--spacing-6)}.k-box[data-theme=none]{padding:0}.k-box[data-align=center]{justify-content:center}:root{--bubble-size: 1.525rem;--bubble-back: var(--color-light);--bubble-rounded: var(--rounded-sm);--bubble-text: var(--color-black)}.k-bubble{width:min-content;height:var(--bubble-size);white-space:nowrap;line-height:1.5;background:var(--bubble-back);color:var(--bubble-text);border-radius:var(--bubble-rounded);overflow:hidden}.k-bubble .k-frame{width:var(--bubble-size);height:var(--bubble-size)}.k-bubble[data-has-text=true]{display:flex;gap:var(--spacing-2);align-items:center;padding-inline-end:.5rem;font-size:var(--text-xs)}.k-column{min-width:0}.k-column[data-sticky=true]{align-self:stretch}.k-column[data-sticky=true]>div{position:sticky;top:calc(var(--header-sticky-offset) + 2vh);z-index:2}.k-column[data-disabled=true]{cursor:not-allowed;opacity:.4}.k-column[data-disabled=true] *{pointer-events:none}.k-column[data-disabled=true] .k-text[data-theme=help] *{pointer-events:initial}.k-frame{--fit: contain;--ratio: 1/1;position:relative;display:flex;justify-content:center;align-items:center;aspect-ratio:var(--ratio);background:var(--back);overflow:hidden}.k-frame:where([data-theme]){--back: var(--theme-color-back);color:var(--theme-color-text)}.k-frame *:where(img,video,iframe,button){position:absolute;top:0;right:0;bottom:0;left:0;height:100%;width:100%;object-fit:var(--fit)}.k-frame>*{overflow:hidden;text-overflow:ellipsis;min-width:0;min-height:0}:root{--color-frame-rounded: var(--rounded);--color-frame-size: 100%;--color-frame-darkness: 0%}.k-color-frame.k-frame{background:var(--pattern-light);width:var(--color-frame-size);color:transparent;border-radius:var(--color-frame-rounded);overflow:hidden;background-clip:padding-box}.k-color-frame:after{border-radius:var(--color-frame-rounded);box-shadow:0 0 0 1px inset hsla(0,0%,var(--color-frame-darkness),.175);position:absolute;top:0;right:0;bottom:0;left:0;background-color:currentColor;content:""}.k-dropzone{position:relative}.k-dropzone:after{content:"";position:absolute;top:0;right:0;bottom:0;left:0;display:none;pointer-events:none;z-index:1;border-radius:var(--rounded)}.k-dropzone[data-over=true]:after{display:block;background:hsla(var(--color-blue-hs),var(--color-blue-l-300),.6);outline:var(--outline)}.k-grid{--columns: 12;--grid-inline-gap: 0;--grid-block-gap: 0;display:grid;align-items:start;grid-column-gap:var(--grid-inline-gap);grid-row-gap:var(--grid-block-gap)}.k-grid>*{--width: calc(1 / var(--columns));--span: calc(var(--columns) * var(--width))}@container (min-width: 30rem){.k-grid{grid-template-columns:repeat(var(--columns),1fr)}.k-grid>*{grid-column:span var(--span)}.k-grid[data-gutter=small]{--grid-inline-gap: 1rem;--grid-block-gap: 1rem}.k-grid:where([data-gutter=medium],[data-gutter=large],[data-gutter=huge]){--grid-inline-gap: 1.5rem;--grid-block-gap: 1.5rem}}@container (min-width: 65em){.k-grid[data-gutter=large]{--grid-inline-gap: 3rem}.k-grid[data-gutter=huge]{--grid-inline-gap: 4.5rem}}@container (min-width: 90em){.k-grid[data-gutter=large]{--grid-inline-gap: 4.5rem}.k-grid[data-gutter=huge]{--grid-inline-gap: 6rem}}@container (min-width: 120em){.k-grid[data-gutter=large]{--grid-inline-gap: 6rem}.k-grid[data-gutter=huge]{--grid-inline-gap: 7.5rem}}:root{--columns-inline-gap: clamp(.75rem, 6cqw, 6rem);--columns-block-gap: var(--spacing-8)}.k-grid[data-variant=columns]{--grid-inline-gap: var(--columns-inline-gap);--grid-block-gap: var(--columns-block-gap)}.k-grid:where([data-variant=columns],[data-variant=fields])>*{container:column / inline-size}.k-grid[data-variant=fields]{gap:var(--spacing-8)}.k-grid[data-variant=choices]{align-items:stretch;gap:2px}:root{--header-color-back: var(--color-light);--header-padding-block: var(--spacing-4);--header-sticky-offset: var(--scroll-top)}.k-header{position:relative;display:flex;flex-wrap:wrap;align-items:baseline;justify-content:space-between;border-bottom:1px solid var(--color-border);background:var(--header-color-back);padding-top:var(--header-padding-block);margin-bottom:var(--spacing-12);box-shadow:2px 0 0 0 var(--header-color-back),-2px 0 0 0 var(--header-color-back)}.k-header-title{font-size:var(--text-h1);font-weight:var(--font-h1);line-height:var(--leading-h1);margin-bottom:var(--header-padding-block);min-width:0}.k-header-title-button{display:inline-flex;text-align:start;gap:var(--spacing-2);align-items:baseline;max-width:100%;outline:0}.k-header-title-text{overflow-x:clip;text-overflow:ellipsis}.k-header-title-icon{--icon-color: var(--color-text-dimmed);border-radius:var(--rounded);transition:opacity .2s;display:grid;flex-shrink:0;place-items:center;height:var(--height-sm);width:var(--height-sm);opacity:0}.k-header-title-button:is(:hover,:focus) .k-header-title-icon{opacity:1}.k-header-title-button:is(:focus) .k-header-title-icon{outline:var(--outline)}.k-header-buttons{display:flex;flex-shrink:0;gap:var(--spacing-2);margin-bottom:var(--header-padding-block)}.k-header[data-has-buttons=true]{position:sticky;top:var(--scroll-top);z-index:var(--z-toolbar)}:root:has(.k-header[data-has-buttons=true]){--header-sticky-offset: calc(var(--scroll-top) + 4rem)}:root{--icon-size: 18px;--icon-color: currentColor}.k-icon{width:var(--icon-size);height:var(--icon-size);flex-shrink:0;color:var(--icon-color)}.k-icon[data-type=loader]{animation:Spin 1.5s linear infinite}@media only screen and (-webkit-min-device-pixel-ratio: 2),not all,not all,not all,only screen and (min-resolution: 192dpi),only screen and (min-resolution: 2dppx){.k-button-icon [data-type=emoji]{font-size:1.25em}}.k-icon-frame [data-type=emoji]{overflow:visible}.k-image[data-back=pattern]{--back: var(--color-black) var(--pattern)}.k-image[data-back=black]{--back: var(--color-black)}.k-image[data-back=white]{--back: var(--color-white);color:var(--color-gray-900)}:root{--overlay-color-back: var(--color-backdrop)}.k-overlay[open]{position:fixed;overscroll-behavior:contain;top:0;right:0;bottom:0;left:0;width:100%;height:100vh;height:100dvh;background:none;z-index:var(--z-dialog);transform:translateZ(0);overflow:hidden}.k-overlay[open]::backdrop{background:none}.k-overlay[open]>.k-portal{position:fixed;top:0;right:0;bottom:0;left:0;background:var(--overlay-color-back);overflow:auto}.k-overlay[open][data-type=dialog]>.k-portal{display:inline-flex}.k-overlay[open][data-type=dialog]>.k-portal>*{margin:auto}.k-overlay[open][data-type=drawer]>.k-portal{--overlay-color-back: rgba(0, 0, 0, .2);display:flex;align-items:stretch;justify-content:flex-end}html[data-overlay]{overflow:hidden}html[data-overlay] body{overflow:scroll}:root{--stat-value-text-size: var(--text-2xl);--stat-info-text-color: var(--color-text-dimmed)}.k-stat{display:flex;flex-direction:column;padding:var(--spacing-3) var(--spacing-6);background:var(--color-white);border-radius:var(--rounded);box-shadow:var(--shadow);line-height:var(--leading-normal)}.k-stat.k-link:hover{cursor:pointer;background:var(--color-gray-100)}.k-stat :where(dt,dd){display:block}.k-stat-value{order:1;font-size:var(--stat-value-text-size);margin-bottom:var(--spacing-1)}.k-stat-label{--icon-size: var(--text-sm);order:2;display:flex;justify-content:start;align-items:center;gap:var(--spacing-1);font-size:var(--text-xs)}.k-stat-info{order:3;font-size:var(--text-xs);color:var(--stat-info-text-color)}.k-stat:is([data-theme]) .k-stat-info{--stat-info-text-color: var(--theme-color-700)}.k-stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(14rem,1fr));grid-auto-rows:1fr;grid-gap:var(--spacing-2px)}.k-stats[data-size=small]{--stat-value-text-size: var(--text-md)}.k-stats[data-size=medium]{--stat-value-text-size: var(--text-xl)}.k-stats[data-size=large]{--stat-value-text-size: var(--text-2xl)}.k-stats[data-size=huge]{--stat-value-text-size: var(--text-3xl)}:root{--table-cell-padding: var(--spacing-3);--table-color-back: var(--color-white);--table-color-border: var(--color-background);--table-color-hover: var(--color-gray-100);--table-color-th-back: var(--color-gray-100);--table-color-th-text: var(--color-text-dimmed);--table-row-height: var(--input-height)}.k-table{position:relative;background:var(--table-color-back);box-shadow:var(--shadow);border-radius:var(--rounded)}.k-table table{table-layout:fixed}.k-table th,.k-table td{padding-inline:var(--table-cell-padding);height:var(--table-row-height);overflow:hidden;text-overflow:ellipsis;width:100%;border-inline-end:1px solid var(--table-color-border);line-height:1.25}.k-table tr>*:last-child{border-inline-end:0}.k-table th,.k-table tr:not(:last-child) td{border-block-end:1px solid var(--table-color-border)}.k-table :where(td,th)[data-align]{text-align:var(--align)}.k-table th{padding-inline:var(--table-cell-padding);font-family:var(--font-mono);font-size:var(--text-xs);color:var(--table-color-th-text);background:var(--table-color-th-back)}.k-table th[data-has-button]{padding:0}.k-table th button{padding-inline:var(--table-cell-padding);height:100%;width:100%;border-radius:var(--rounded);text-align:start}.k-table th button:focus-visible{outline-offset:-2px}.k-table thead th:first-child{border-start-start-radius:var(--rounded)}.k-table thead th:last-child{border-start-end-radius:var(--rounded)}.k-table thead th{position:sticky;top:var(--header-sticky-offset);inset-inline:0;z-index:1}.k-table tbody tr:hover td{background:var(--table-color-hover)}.k-table tbody th{width:auto;white-space:nowrap;overflow:visible;border-radius:0}.k-table tbody tr:first-child th{border-start-start-radius:var(--rounded)}.k-table tbody tr:last-child th{border-end-start-radius:var(--rounded);border-block-end:0}.k-table-row-ghost{background:var(--color-white);outline:var(--outline);border-radius:var(--rounded);margin-bottom:2px;cursor:grabbing}.k-table-row-fallback{opacity:0!important}.k-table .k-table-index-column{width:var(--table-row-height);text-align:center}.k-table .k-table-index{font-size:var(--text-xs);color:var(--color-text-dimmed);line-height:1.1em}.k-table .k-table-index-column .k-sort-handle{--button-width: 100%;display:none}.k-table tr:hover .k-table-index-column[data-sortable=true] .k-table-index{display:none}.k-table tr:hover .k-table-index-column[data-sortable=true] .k-sort-handle{display:flex}.k-table .k-table-options-column{padding:0;width:var(--table-row-height);text-align:center}.k-table .k-table-options-column .k-options-dropdown-toggle{--button-width: 100%;--button-height: 100%;outline-offset:-2px}.k-table-empty{color:var(--color-text-dimmed);font-size:var(--text-sm)}.k-table[aria-disabled=true]{--table-color-back: transparent;--table-color-border: var(--color-border);--table-color-hover: transparent;--table-color-th-back: transparent;border:1px solid var(--table-color-border);box-shadow:none}.k-table[aria-disabled=true] thead th{position:static}@container (max-width: 40rem){.k-table{overflow-x:auto}.k-table thead th{position:static}.k-table .k-options-dropdown-toggle{aspect-ratio:auto!important}.k-table :where(th,td):not(.k-table-index-column,.k-table-options-column,[data-column-id=image],[data-column-id=flag]){width:auto!important}.k-table :where(th,td):not([data-mobile=true]){display:none}}.k-table-pagination{border-top:1px solid var(--table-color-border);height:var(--table-row-height);background:var(--table-color-th-back);display:flex;justify-content:center;border-end-start-radius:var(--rounded);border-end-end-radius:var(--rounded)}.k-table-pagination>.k-button{--button-color-back: transparent;border-left:0!important}.k-table .k-table-cell{padding:0}.k-tabs{--button-height: var(--height-md);--button-padding: var(--spacing-2);display:flex;gap:var(--spacing-1);margin-bottom:var(--spacing-12);margin-inline:calc(var(--button-padding) * -1)}.k-tabs-tab{position:relative}.k-tab-button.k-button{margin-block:2px;overflow-x:visible}.k-tab-button[aria-current]:after{position:absolute;content:"";height:2px;inset-inline:var(--button-padding);bottom:-2px;background:currentColor}.k-tabs-badge{position:absolute;top:2px;font-variant-numeric:tabular-nums;inset-inline-end:var(--button-padding);transform:translate(75%);line-height:1.5;padding:0 var(--spacing-1);border-radius:1rem;text-align:center;font-size:10px;box-shadow:var(--shadow-md);background:var(--theme-color-back);border:1px solid var(--theme-color-500);color:var(--theme-color-text);z-index:1}.k-view{padding-inline:1.5rem}@container (min-width: 30rem){.k-view{padding-inline:3rem}}.k-view[data-align=center]{height:100vh;display:flex;align-items:center;justify-content:center;padding:0 3rem;overflow:auto}.k-view[data-align=center]>*{flex-basis:22.5rem}.k-fatal[open]{background:var(--overlay-color-back);padding:var(--spacing-6)}.k-fatal-box{position:relative;width:100%;box-shadow:var(--dialog-shadow);border-radius:var(--dialog-rounded);line-height:1;height:calc(100vh - 3rem);height:calc(100dvh - 3rem);display:flex;flex-direction:column;overflow:hidden}.k-fatal-iframe{border:0;width:100%;flex-grow:1;background:var(--color-white);padding:var(--spacing-3)}.k-icons{position:absolute;width:0;height:0}.k-loader{z-index:1}.k-loader-icon{animation:Spin .9s linear infinite}.k-notification{padding:.75rem 1.5rem;background:var(--color-gray-900);width:100%;line-height:1.25rem;color:var(--color-white);display:flex;flex-shrink:0;align-items:center}.k-notification[data-theme]{background:var(--theme-color-back);color:var(--color-black)}.k-notification p{flex-grow:1;word-wrap:break-word;overflow:hidden}.k-notification .k-button{display:flex;margin-inline-start:1rem}.k-offline-warning{position:fixed;top:0;right:0;bottom:0;left:0;z-index:var(--z-offline);background:var(--color-backdrop);display:flex;align-items:center;justify-content:center;line-height:1}.k-offline-warning p{display:flex;align-items:center;gap:.5rem;background:var(--color-white);box-shadow:var(--shadow);padding:.75rem;border-radius:var(--rounded)}.k-offline-warning p .k-icon{color:var(--color-red-400)}:root{--progress-height: var(--spacing-2);--progress-color-back: var(--color-gray-300);--progress-color-value: var(--color-focus)}progress{display:block;width:100%;height:var(--progress-height);border-radius:var(--progress-height);overflow:hidden;border:0}progress::-webkit-progress-bar{background:var(--progress-color-back)}progress::-webkit-progress-value{background:var(--progress-color-value);border-radius:var(--progress-height)}progress::-moz-progress-bar{background:var(--progress-color-value)}progress:not([value])::-webkit-progress-bar{background:var(--progress-color-value)}progress:not([value])::-moz-progress-bar{background:var(--progress-color-value)}.k-sort-handle{cursor:grab;z-index:1}.k-sort-handle:active{cursor:grabbing}.k-breadcrumb{--breadcrumb-divider: "/";overflow-x:clip;padding:2px}.k-breadcrumb ol{display:none;gap:.125rem;align-items:center}.k-breadcrumb ol li{display:flex;align-items:center;min-width:0}.k-breadcrumb ol li:not(:last-child):after{content:var(--breadcrumb-divider);opacity:.175;flex-shrink:0}.k-breadcrumb ol li{min-width:0;transition:flex-shrink .1s}.k-breadcrumb .k-icon[data-type=loader]{opacity:.5}.k-breadcrumb ol li:is(:hover,:focus-within){flex-shrink:0}.k-button.k-breadcrumb-link{flex-shrink:1;min-width:0;justify-content:flex-start}.k-breadcrumb-dropdown{display:grid}.k-breadcrumb-dropdown .k-dropdown-content{width:15rem}@container (min-width: 40em){.k-breadcrumb ol{display:flex}.k-breadcrumb-dropdown{display:none}}.k-browser{container-type:inline-size;font-size:var(--text-sm)}.k-browser-items{--browser-item-gap: 1px;--browser-item-size: 1fr;--browser-item-height: var(--height-sm);--browser-item-padding: .25rem;--browser-item-rounded: var(--rounded);display:grid;column-gap:var(--browser-item-gap);row-gap:var(--browser-item-gap);grid-template-columns:repeat(auto-fill,minmax(var(--browser-item-size),1fr))}.k-browser-item{display:flex;overflow:hidden;gap:.5rem;align-items:center;flex-shrink:0;height:var(--browser-item-height);padding-inline:calc(var(--browser-item-padding) + 1px);border-radius:var(--browser-item-rounded);white-space:nowrap;cursor:pointer}.k-browser-item-image{height:calc(var(--browser-item-height) - var(--browser-item-padding) * 2);aspect-ratio:1/1;border-radius:var(--rounded-sm);box-shadow:var(--shadow);flex-shrink:0}.k-browser-item-image.k-icon-frame{box-shadow:none;background:var(--color-white)}.k-browser-item-image svg{transform:scale(.8)}.k-browser-item input{position:absolute;box-shadow:var(--shadow);opacity:0;width:0}.k-browser-item[aria-selected]{background:var(--color-blue-300)}:root{--button-align: center;--button-height: var(--height-md);--button-width: auto;--button-color-back: none;--button-color-text: currentColor;--button-color-icon: currentColor;--button-padding: var(--spacing-2);--button-rounded: var(--spacing-1);--button-text-display: block;--button-icon-display: block}.k-button{position:relative;display:inline-flex;align-items:center;justify-content:var(--button-align);gap:.5rem;padding-inline:var(--button-padding);white-space:nowrap;line-height:1;border-radius:var(--button-rounded);background:var(--button-color-back);height:var(--button-height);width:var(--button-width);color:var(--button-color-text);font-variant-numeric:tabular-nums;overflow-x:clip;text-align:var(--button-align);flex-shrink:0}.k-button-icon{--icon-color: var(--button-color-icon);flex-shrink:0;display:var(--button-icon-display)}.k-button-text{text-overflow:ellipsis;overflow-x:clip;display:var(--button-text-display);min-width:0}.k-button:where([data-theme]){--button-color-icon: var(--theme-color-icon);--button-color-text: var(--theme-color-text)}.k-button:where([data-theme$=-icon]){--button-color-text: currentColor}.k-button:where([data-variant=dimmed]){--button-color-icon: var(--color-text);--button-color-text: var(--color-text-dimmed)}.k-button:where([data-variant=dimmed]):not([aria-disabled]):is(:hover,[aria-current]) .k-button-text{filter:brightness(75%)}.k-button:where([data-variant=dimmed][data-theme]){--button-color-icon: var(--theme-color-icon);--button-color-text: var(--theme-color-text-dimmed)}.k-button:where([data-variant=dimmed][data-theme$=-icon]){--button-color-text: var(--color-text-dimmed)}.k-button:where([data-variant=filled]){--button-color-back: var(--color-gray-300)}.k-button:where([data-variant=filled]):not([aria-disabled]):hover{filter:brightness(97%)}.k-button:where([data-variant=filled][data-theme]){--button-color-icon: var(--theme-color-700);--button-color-back: var(--theme-color-back)}.k-button:where([data-theme$=-icon][data-variant=filled]){--button-color-icon: hsl( var(--theme-color-hs), 57% );--button-color-back: var(--color-gray-300)}.k-button:not([data-has-text=true]){--button-padding: 0;aspect-ratio:1/1}@container (max-width: 30rem){.k-button[data-responsive=true][data-has-icon=true]{--button-padding: 0;aspect-ratio:1/1;--button-text-display: none}.k-button[data-responsive=text][data-has-text=true]{--button-icon-display: none}.k-button[data-responsive][data-has-icon=true] .k-button-arrow{display:none}}.k-button:not(button,a,summary,label,.k-link){pointer-events:none}.k-button:where([data-size=xs]){--button-height: var(--height-xs);--button-padding: .325rem}.k-button:where([data-size=sm]){--button-height: var(--height-sm);--button-padding: .5rem}.k-button:where([data-size=lg]){--button-height: var(--height-lg)}.k-button-arrow{--icon-size: 14px;width:max-content;margin-inline-start:-.125rem}.k-button:where([aria-disabled]){cursor:not-allowed}.k-button:where([aria-disabled])>*{opacity:var(--opacity-disabled)}.k-button-group{display:flex;flex-wrap:wrap;gap:.5rem;align-items:center}.k-button-group:where([data-layout=collapsed]){gap:0;flex-wrap:nowrap}.k-button-group[data-layout=collapsed]>.k-button[data-variant=filled]:not(:last-child){border-start-end-radius:0;border-end-end-radius:0}.k-button-group[data-layout=collapsed]>.k-button[data-variant=filled]:not(:first-child){border-start-start-radius:0;border-end-start-radius:0;border-left:1px solid var(--theme-color-500, var(--color-gray-400))}.k-button-group[data-layout=collapsed]>.k-button[data-variant=filled]:focus-visible{z-index:1;border-radius:var(--button-rounded)}.k-file-browser{container-type:inline-size;overflow:hidden}.k-file-browser-layout{display:grid;grid-template-columns:minmax(10rem,15rem) 1fr;grid-template-rows:1fr auto;grid-template-areas:"tree items" "tree pagination"}.k-file-browser-tree{grid-area:tree;padding:var(--spacing-2);border-right:1px solid var(--color-gray-300)}.k-file-browser-items{grid-area:items;padding:var(--spacing-2);background:var(--color-gray-100)}.k-file-browser-back-button{display:none}.k-file-browser-pagination{background:var(--color-gray-100);padding:var(--spacing-2);display:flex;justify-content:end}@container (max-width: 30rem){.k-file-browser-layout{grid-template-columns:minmax(0,1fr);min-height:10rem}.k-file-browser-back-button{width:100%;height:var(--height-sm);display:flex;align-items:center;justify-content:flex-start;padding-inline:.25rem;margin-bottom:.5rem;background:var(--color-gray-200);border-radius:var(--rounded)}.k-file-browser-tree{border-right:0}.k-file-browser-pagination{justify-content:start}.k-file-browser[data-view=files] .k-file-browser-layout{grid-template-rows:1fr auto;grid-template-areas:"items" "pagination"}.k-file-browser[data-view=files] .k-file-browser-tree,.k-file-browser[data-view=tree] .k-file-browser-items,.k-file-browser[data-view=tree] .k-file-browser-pagination{display:none}}:root{--tree-color-back: var(--color-gray-200);--tree-color-hover-back: var(--color-gray-300);--tree-color-selected-back: var(--color-blue-300);--tree-color-selected-text: var(--color-black);--tree-color-text: var(--color-gray-dimmed);--tree-level: 0;--tree-indentation: .6rem}.k-tree-branch{display:flex;align-items:center;padding-inline-start:calc(var(--tree-level) * var(--tree-indentation));margin-bottom:1px}.k-tree-branch[data-has-subtree=true]{inset-block-start:calc(var(--tree-level) * 1.5rem);z-index:calc(100 - var(--tree-level));background:var(--tree-color-back)}.k-tree-branch:hover,li[aria-current]>.k-tree-branch{--tree-color-text: var(--tree-color-selected-text);background:var(--tree-color-hover-back);border-radius:var(--rounded)}li[aria-current]>.k-tree-branch{background:var(--tree-color-selected-back)}.k-tree-toggle{--icon-size: 12px;width:1rem;aspect-ratio:1/1;display:grid;place-items:center;padding:0;border-radius:var(--rounded-sm);margin-inline-start:.25rem;flex-shrink:0}.k-tree-toggle:hover{background:#00000013}.k-tree-toggle[disabled]{visibility:hidden}.k-tree-folder{display:flex;height:var(--height-sm);border-radius:var(--rounded-sm);padding-inline:.25rem;width:100%;align-items:center;gap:.325rem;min-width:3rem;line-height:1.25;font-size:var(--text-sm)}@container (max-width: 15rem){.k-tree{--tree-indentation: .375rem}.k-tree-folder{padding-inline:.125rem}.k-tree-folder .k-icon{display:none}}.k-tree-folder>.k-frame{flex-shrink:0}.k-tree-folder-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:currentColor}.k-tree-folder[disabled]{opacity:var(--opacity-disabled)}.k-pagination{flex-shrink:0}.k-pagination-details{--button-padding: var(--spacing-3);font-size:var(--text-xs)}.k-pagination-selector{--button-height: var(--height);--dropdown-padding: 0;overflow:visible}.k-pagination-selector form{display:flex;align-items:center;justify-content:space-between}.k-pagination-selector label{display:flex;align-items:center;gap:var(--spacing-2);padding-inline-start:var(--spacing-3)}.k-pagination-selector select{--height: calc(var(--button-height) - .5rem);width:auto;min-width:var(--height);height:var(--height);text-align:center;background:var(--color-gray-800);color:var(--color-white);border-radius:var(--rounded-sm)}.k-prev-next{direction:ltr;flex-shrink:0}:root{--tag-color-back: var(--color-black);--tag-color-text: var(--color-white);--tag-color-toggle: currentColor;--tag-color-disabled-back: var(--color-gray-600);--tag-color-disabled-text: var(--tag-color-text);--tag-height: var(--height-xs);--tag-rounded: var(--rounded-sm)}.k-tag{position:relative;height:var(--tag-height);display:flex;align-items:center;justify-content:space-between;font-size:var(--text-sm);line-height:1;color:var(--tag-color-text);background-color:var(--tag-color-back);border-radius:var(--tag-rounded);cursor:pointer;-webkit-user-select:none;user-select:none}.k-tag:not([aria-disabled]):focus{outline:var(--outline)}.k-tag-image{height:100%;border-radius:var(--rounded-xs);overflow:hidden;flex-shrink:0;border-radius:0;border-start-start-radius:var(--tag-rounded);border-end-start-radius:var(--tag-rounded);background-clip:padding-box}.k-tag-text{padding-inline:var(--spacing-2);line-height:var(--leading-tight);overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.k-tag[data-has-toggle=true] .k-tag-text{padding-inline-end:0}.k-tag-toggle{--icon-size: 14px;width:var(--tag-height);height:var(--tag-height);filter:brightness(70%);flex-shrink:0}.k-tag-toggle:hover{filter:brightness(100%)}.k-tag:where([aria-disabled]){background-color:var(--tag-color-disabled-back);color:var(--tag-color-disabled-text);cursor:not-allowed}.k-button[data-disabled=true]{opacity:.5;pointer-events:none;cursor:default}.k-card-options>.k-button[data-disabled=true]{display:inline-flex}.k-section+.k-section{margin-top:var(--columns-block-gap)}.k-section-header{display:flex;justify-content:space-between;align-items:center;gap:var(--spacing-6);margin-bottom:var(--spacing-2)}.k-section-buttons{flex-shrink:0}.k-fields-section input[type=submit]{display:none}[data-locked=true] .k-fields-section{opacity:.2;pointer-events:none}.k-models-section[data-processing=true]{pointer-events:none}.k-models-section-search.k-input{--input-color-back: var(--color-gray-300);--input-color-border: transparent;margin-bottom:var(--spacing-3)}:root{--code-color-back: var(--color-black);--code-color-icon: var(--color-gray-500);--code-color-text: var(--color-gray-200, white);--code-font-family: var(--font-mono);--code-font-size: 1em;--code-inline-color-back: var(--color-blue-300);--code-inline-color-border: var(--color-blue-400);--code-inline-color-text: var(--color-blue-900);--code-inline-font-size: .9em;--code-padding: var(--spacing-3)}code{font-family:var(--code-font-family);font-size:var(--code-font-size);font-weight:var(--font-normal)}.k-code,.k-text pre{position:relative;display:block;max-width:100%;padding:var(--code-padding);border-radius:var(--rounded, .5rem);background:var(--code-color-back);color:var(--code-color-text);white-space:nowrap;overflow-y:hidden;overflow-x:auto;line-height:1.5;-moz-tab-size:2;tab-size:2}.k-code:not(code),.k-text pre{white-space:pre-wrap}.k-code:before{position:absolute;content:attr(data-language);inset-block-start:0;inset-inline-end:0;padding:.5rem .5rem .25rem .25rem;font-size:calc(.75 * var(--text-xs));background:var(--code-color-back);border-radius:var(--rounded, .5rem)}.k-text>code,.k-text *:not(pre)>code{display:inline-flex;padding-inline:var(--spacing-1);font-size:var(--code-inline-font-size);color:var(--code-inline-color-text);background:var(--code-inline-color-back);border-radius:var(--rounded);outline:1px solid var(--code-inline-color-border);outline-offset:-1px}:root{--text-h1: 2em;--text-h2: 1.75em;--text-h3: 1.5em;--text-h4: 1.25em;--text-h5: 1.125em;--text-h6: 1em;--font-h1: var(--font-semi);--font-h2: var(--font-semi);--font-h3: var(--font-semi);--font-h4: var(--font-semi);--font-h5: var(--font-semi);--font-h6: var(--font-semi);--leading-h1: 1.125;--leading-h2: 1.125;--leading-h3: 1.25;--leading-h4: 1.375;--leading-h5: 1.5;--leading-h6: 1.5}.k-headline{line-height:1.5em;font-weight:var(--font-bold)}.h1,.k-text h1,.k-headline[data-size=huge]{color:var(--color-h1, var(--color-h));font-family:var(--font-family-h1);font-size:var(--text-h1);font-weight:var(--font-h1);line-height:var(--leading-h1)}.h2,.k-text h2,.k-headline[data-size=large]{color:var(--color-h2, var(--color-h));font-family:var(--font-family-h2);font-size:var(--text-h2);font-weight:var(--font-h2);line-height:var(--leading-h2)}.h3,.k-text h3{color:var(--color-h3, var(--color-h));font-family:var(--font-family-h3);font-size:var(--text-h3);font-weight:var(--font-h3);line-height:var(--leading-h3)}.h4,.k-text h4,.k-headline[data-size=small]{color:var(--color-h4, var(--color-h));font-family:var(--font-family-h4);font-size:var(--text-h4);font-weight:var(--font-h4);line-height:var(--leading-h4)}.h5,.k-text h5{color:var(--color-h5, var(--color-h));font-family:var(--font-family-h5);font-size:var(--text-h5);font-weight:var(--font-h5);line-height:var(--leading-h5)}.h6,.k-text h6{color:var(--color-h6, var(--color-h));font-family:var(--font-family-h6);font-size:var(--text-h6);font-weight:var(--font-h6);line-height:var(--leading-h6)}.k-text>*+h6{margin-block-start:calc(var(--text-line-height) * 1.5em)}.k-headline[data-theme]{color:var(--theme)}.k-label{position:relative;display:flex;align-items:center;height:var(--height-xs);font-weight:var(--font-semi);min-width:0;flex:1}[aria-disabled] .k-label{opacity:var(--opacity-disabled);cursor:not-allowed}.k-label>a{display:inline-flex;height:var(--height-xs);align-items:center;padding-inline:var(--spacing-2);margin-inline-start:calc(-1 * var(--spacing-2));border-radius:var(--rounded);min-width:0}.k-label-text{text-overflow:ellipsis;white-space:nowrap;overflow-x:clip;min-width:0}.k-label abbr{font-size:var(--text-xs);color:var(--color-gray-500);margin-inline-start:var(--spacing-1)}.k-label abbr.k-label-invalid{display:none;color:var(--color-red-700)}:where(.k-field:has([data-invalid]),.k-section:has([data-invalid]))>header>.k-label abbr.k-label-invalid{display:inline-block}.k-field:has([data-invalid])>.k-field-header>.k-label abbr:has(+abbr.k-label-invalid){display:none}:root{--text-font-size: 1em;--text-line-height: 1.5;--link-color: var(--color-blue-800);--link-underline-offset: 2px}.k-text{font-size:var(--text-font-size);line-height:var(--text-line-height)}.k-text[data-size=tiny]{--text-font-size: var(--text-xs)}.k-text[data-size=small]{--text-font-size: var(--text-sm)}.k-text[data-size=medium]{--text-font-size: var(--text-md)}.k-text[data-size=large]{--text-font-size: var(--text-xl)}.k-text[data-align]{text-align:var(--align)}.k-text>:where(audio,blockquote,details,div,figure,h1,h2,h3,h4,h5,h6,hr,iframe,img,object,ol,p,picture,pre,table,ul)+*{margin-block-start:calc(var(--text-line-height) * 1em)}.k-text :where(.k-link,a){color:var(--link-color);text-decoration:underline;text-underline-offset:var(--link-underline-offset);border-radius:var(--rounded-xs);outline-offset:2px}.k-text ol,.k-text ul{padding-inline-start:1.75em}.k-text ol{list-style:numeric}.k-text ol>li{list-style:decimal}.k-text ul>li{list-style:disc}.k-text ul ul>li{list-style:circle}.k-text ul ul ul>li{list-style:square}.k-text blockquote{font-size:var(--text-lg);line-height:1.25;padding-inline-start:var(--spacing-4);border-inline-start:2px solid var(--color-black)}.k-text img{border-radius:var(--rounded)}.k-text iframe{width:100%;aspect-ratio:16/9;border-radius:var(--rounded)}.k-text hr{background:var(--color-border);height:1px}.k-help{color:var(--color-text-dimmed)}.k-upload-item-preview{--icon-size: 24px;grid-area:preview;display:flex;aspect-ratio:1/1;width:100%;height:100%;overflow:hidden;border-start-start-radius:var(--rounded);border-end-start-radius:var(--rounded)}.k-upload-item-preview:focus{border-radius:var(--rounded);outline:2px solid var(--color-focus);z-index:1}.k-upload-item{accent-color:var(--color-focus);display:grid;grid-template-areas:"preview input input" "preview body toggle";grid-template-columns:6rem 1fr auto;grid-template-rows:var(--input-height) 1fr;border-radius:var(--rounded);background:var(--color-white);box-shadow:var(--shadow);min-height:6rem}.k-upload-item-body{grid-area:body;display:flex;flex-direction:column;justify-content:space-between;padding:var(--spacing-2) var(--spacing-3);min-width:0}.k-upload-item-input.k-input{--input-color-border: transparent;--input-padding: var(--spacing-2) var(--spacing-3);--input-rounded: 0;grid-area:input;font-size:var(--text-sm);border-bottom:1px solid var(--color-light);border-start-end-radius:var(--rounded)}.k-upload-item-input.k-input:focus-within{outline:2px solid var(--color-focus);z-index:1;border-radius:var(--rounded)}.k-upload-item-input.k-input[data-disabled=true]{--input-color-back: var(--color-white)}.k-upload-item-input .k-input-after{color:var(--color-gray-600)}.k-upload-item-meta{font-size:var(--text-xs);color:var(--color-gray-600)}.k-upload-item-error{font-size:var(--text-xs);margin-top:.25rem;color:var(--color-red-700)}.k-upload-item-progress{--progress-height: .25rem;--progress-color-back: var(--color-light);margin-bottom:.3125rem}.k-upload-item-toggle{grid-area:toggle;align-self:end}.k-upload-item-toggle>*{padding:var(--spacing-3)}.k-upload-item[data-completed] .k-upload-item-progress{--progress-color-value: var(--color-green-400)}.k-upload-items{display:grid;gap:.25rem}.k-activation{position:relative;display:flex;color:var(--dropdown-color-text);background:var(--dropdown-color-bg);border-radius:var(--dropdown-rounded);box-shadow:var(--dropdown-shadow);justify-content:space-between}.k-activation p{padding-inline-start:var(--spacing-3);padding-inline-end:var(--spacing-2);padding-block:.425rem;line-height:1.25}.k-activation p strong{font-weight:var(--font-normal);margin-inline-end:var(--spacing-1)}.k-activation p :where(button,a){color:var(--color-pink-400);text-decoration:underline;text-decoration-color:currentColor;text-underline-offset:2px;border-radius:var(--rounded-sm)}.k-activation-toggle{--button-color-text: var(--color-gray-400);--button-rounded: 0;border-left:1px solid var(--dropdown-color-hr)}.k-activation-toggle:is(:hover,:focus){--button-color-text: var(--color-white)}.k-activation-toggle:focus{--button-rounded: var(--rounded)}:root{--main-padding-inline: clamp(var(--spacing-6), 5cqw, var(--spacing-24))}.k-panel-main{min-height:100vh;min-height:100dvh;padding:var(--spacing-3) var(--main-padding-inline) var(--spacing-24);container:main / inline-size;margin-inline-start:var(--main-start)}.k-panel-notification{--button-height: var(--height-md);--button-color-icon: var(--theme-color-900);--button-color-text: var(--theme-color-900);border:1px solid var(--theme-color-500);position:fixed;inset-block-end:var(--menu-padding);inset-inline-end:var(--menu-padding);box-shadow:var(--dropdown-shadow);z-index:var(--z-notification)}:root{--menu-button-height: var(--height);--menu-button-width: 100%;--menu-color-back: var(--color-gray-250);--menu-color-border: var(--color-gray-300);--menu-display: none;--menu-display-backdrop: block;--menu-padding: var(--spacing-3);--menu-shadow: var(--shadow-xl);--menu-toggle-height: var(--menu-button-height);--menu-toggle-width: 1rem;--menu-width-closed: calc( var(--menu-button-height) + 2 * var(--menu-padding) );--menu-width-open: 12rem;--menu-width: var(--menu-width-open)}.k-panel-menu{position:fixed;inset-inline-start:0;inset-block:0;z-index:var(--z-navigation);display:var(--menu-display);width:var(--menu-width);background-color:var(--menu-color-back);border-right:1px solid var(--menu-color-border);box-shadow:var(--menu-shadow)}.k-panel-menu-body{display:flex;flex-direction:column;gap:var(--spacing-4);padding:var(--menu-padding);overscroll-behavior:contain;overflow-x:hidden;overflow-y:auto;height:100%}.k-panel-menu-search{margin-bottom:var(--spacing-8)}.k-panel-menu-buttons{display:flex;flex-direction:column;width:100%}.k-panel-menu-buttons[data-second-last=true]{flex-grow:1}.k-panel-menu-buttons:last-child{justify-content:flex-end}.k-panel-menu-button{--button-align: flex-start;--button-height: var(--menu-button-height);--button-width: var(--menu-button-width);--button-padding: 7px;flex-shrink:0}.k-panel-menu-button[aria-current]{--button-color-back: var(--color-white);box-shadow:var(--shadow)}.k-panel-menu-button:focus{z-index:1}.k-panel[data-menu=true]{--menu-button-width: 100%;--menu-display: block;--menu-width: var(--menu-width-open)}.k-panel[data-menu=true]:after{content:"";position:fixed;top:0;right:0;bottom:0;left:0;background:var(--color-backdrop);display:var(--menu-display-backdrop);pointer-events:none}.k-panel-menu-toggle{--button-align: flex-start;--button-height: 100%;--button-width: var(--menu-toggle-width);position:absolute;inset-block:0;inset-inline-start:100%;align-items:flex-start;border-radius:0;overflow:visible;opacity:0;transition:opacity .2s}.k-panel-menu-toggle:focus{outline:0}.k-panel-menu-toggle .k-button-icon{display:grid;place-items:center;height:var(--menu-toggle-height);width:var(--menu-toggle-width);margin-top:var(--menu-padding);border-block:1px solid var(--menu-color-border);border-inline-end:1px solid var(--menu-color-border);background:var(--menu-color-back);border-start-end-radius:var(--button-rounded);border-end-end-radius:var(--button-rounded)}@media (max-width: 60rem){.k-panel-menu .k-activation-button{margin-bottom:var(--spacing-3)}.k-panel-menu .k-activation-toggle{display:none}}@media (min-width: 60rem){.k-panel{--menu-display: block;--menu-display-backdrop: none;--menu-shadow: none;--main-start: var(--menu-width)}.k-panel[data-menu=false]{--menu-button-width: var(--menu-button-height);--menu-width: var(--menu-width-closed)}.k-panel-menu-proxy{display:none}.k-panel-menu-toggle:focus-visible,.k-panel-menu[data-hover] .k-panel-menu-toggle{opacity:1}.k-panel-menu-toggle:focus-visible .k-button-icon{outline:var(--outline);border-radius:var(--button-rounded)}.k-panel-menu-search[aria-disabled=true]{opacity:0}.k-panel-menu .k-activation{position:absolute;bottom:var(--menu-padding);inset-inline-start:100%;height:var(--height-md);width:max-content;margin-left:var(--menu-padding)}.k-panel-menu .k-activation:before{position:absolute;content:"";top:50%;left:-4px;margin-top:-4px;border-top:4px solid transparent;border-right:4px solid var(--color-black);border-bottom:4px solid transparent}.k-panel-menu .k-activation p :where(button,a){padding-inline:var(--spacing-1)}.k-panel-menu .k-activation-toggle{border-left:1px solid var(--dropdown-color-hr)}}.k-panel.k-panel-outside{display:grid;grid-template-rows:1fr;place-items:center;min-height:100vh;min-height:100dvh;padding:var(--spacing-6)}:root{--scroll-top: 0rem}html{overflow-x:hidden;overflow-y:scroll;background:var(--color-light)}body{font-size:var(--text-sm)}.k-panel[data-loading=true]{animation:LoadingCursor .5s}.k-panel[data-loading=true]:after,.k-panel[data-dragging=true]{-webkit-user-select:none;user-select:none}.k-topbar{position:relative;margin-inline:calc(var(--button-padding) * -1);margin-bottom:var(--spacing-8);display:flex;align-items:center;gap:var(--spacing-1)}.k-topbar-breadcrumb{margin-inline-start:-2px}.k-topbar-spacer{flex-grow:1}.k-topbar-signals{display:flex;align-items:center}.k-search-view .k-header{margin-bottom:0}.k-header+.k-search-view-results{margin-top:var(--spacing-12)}.k-search-view-input{--input-color-border: transparent;--input-color-back: var(--color-gray-300);--input-height: var(--height-md);width:40cqw}.k-file-view-header,.k-file-view[data-has-tabs=true] .k-file-preview{margin-bottom:0}.k-file-preview{display:grid;align-items:stretch;background:var(--color-gray-900);border-radius:var(--rounded-lg);margin-bottom:var(--spacing-12);overflow:hidden}.k-file-preview-thumb-column{background:var(--pattern);aspect-ratio:1/1}.k-file-preview-thumb{display:flex;align-items:center;justify-content:center;height:100%;padding:var(--spacing-12);container-type:size}.k-file-preview-thumb img{width:auto;max-width:100cqw;max-height:100cqh}.k-file-preview-thumb>.k-icon{--icon-size: 3rem}.k-file-preview-thumb>.k-button{position:absolute;top:var(--spacing-2);inset-inline-start:var(--spacing-2)}.k-file-preview .k-coords-input{--opacity-disabled: 1;--range-thumb-color: hsl(216 60% 60% / .75);--range-thumb-size: 1.25rem;--range-thumb-shadow: none;cursor:crosshair}.k-file-preview .k-coords-input-thumb:after{--size: .4rem;--pos: calc(50% - (var(--size) / 2));position:absolute;top:var(--pos);inset-inline-start:var(--pos);width:var(--size);height:var(--size);content:"";background:var(--color-white);border-radius:50%}.k-file-preview:not([data-has-focus=true]) .k-coords-input-thumb{display:none}.k-file-preview-details{display:grid}.k-file-preview-details dl{display:grid;grid-template-columns:repeat(auto-fill,minmax(14rem,1fr));grid-gap:var(--spacing-6) var(--spacing-12);align-self:center;line-height:1.5em;padding:var(--spacing-6)}.k-file-preview-details dt{font-size:var(--text-sm);font-weight:500;font-weight:var(--font-semi);color:var(--color-gray-500);margin-bottom:var(--spacing-1)}.k-file-preview-details :where(dd,a){font-size:var(--text-xs);color:#ffffff80;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:#ffffffbf;font-size:var(--text-sm)}.k-file-preview-focus-info dd{display:flex;align-items:center}.k-file-preview-focus-info .k-button{--button-padding: var(--spacing-2);--button-color-back: var(--color-gray-800)}.k-file-preview[data-has-focus=true] .k-file-preview-focus-info .k-button{flex-direction:row-reverse}@container (min-width: 36rem){.k-file-preview{grid-template-columns:50% auto}.k-file-preview-thumb-column{aspect-ratio:auto}}@container (min-width: 65rem){.k-file-preview{grid-template-columns:33.333% auto}.k-file-preview-thumb-column{aspect-ratio:1/1}}@container (min-width: 90rem){.k-file-preview-layout{grid-template-columns:25% auto}}.k-installation-dialog{--dialog-color-back: var(--color-white);--dialog-shadow: var(--shadow);container-type:inline-size}.k-installation-view .k-button{margin-top:var(--spacing-3);width:100%}.k-installation-view form .k-button{margin-top:var(--spacing-10)}.k-installation-view .k-headline{font-weight:var(--font-semi);margin-top:-.5rem;margin-bottom:.75rem}.k-installation-issues{line-height:1.5em;font-size:var(--text-sm)}.k-installation-issues li{position:relative;padding:var(--spacing-6);background:var(--color-red-300);padding-inline-start:3.5rem;border-radius:var(--rounded)}.k-installation-issues .k-icon{position:absolute;top:calc(1.5rem + 2px);inset-inline-start:1.5rem}.k-installation-issues .k-icon{color:var(--color-red-700)}.k-installation-issues li:not(:last-child){margin-bottom:2px}.k-installation-issues li code{font:inherit;color:var(--color-red-700)}.k-login-code-form .k-user-info{margin-bottom:var(--spacing-6)}.k-login-form{position:relative}.k-login-form label abbr{visibility:hidden}.k-login-toggler{position:absolute;top:-2px;inset-inline-end:calc(var(--spacing-2) * -1);color:var(--link-color);text-decoration:underline;text-decoration-color:var(--link-color);text-underline-offset:1px;height:var(--height-xs);line-height:1;padding-inline:var(--spacing-2);border-radius:var(--rounded);z-index:1}.k-login{--dialog-color-back: var(--color-white);--dialog-shadow: var(--shadow);container-type:inline-size}.k-login-buttons{--button-padding: var(--spacing-3);display:flex;gap:1.5rem;align-items:center;justify-content:space-between;margin-top:var(--spacing-10)}.k-page-view[data-has-tabs=true] .k-page-view-header,.k-site-view[data-has-tabs=true] .k-site-view-header{margin-bottom:0}.k-user-name-placeholder{color:var(--color-gray-500);transition:color .3s}.k-user-view-header[data-editable=true] .k-user-name-placeholder:hover{color:var(--color-gray-900)}.k-user-view-header{margin-bottom:0;border-bottom:0}.k-user-view .k-user-profile{margin-bottom:var(--spacing-12)}.k-user-view[data-has-tabs=true] .k-user-profile{margin-bottom:0}.k-password-reset-view .k-user-info{margin-bottom:var(--spacing-8)}.k-user-view-image{padding:0}.k-user-view-image .k-frame{width:6rem;height:6rem;border-radius:var(--rounded);line-height:0}.k-user-view-image .k-icon-frame{--back: var(--color-black);--icon-color: var(--color-gray-200)}.k-user-info{display:flex;align-items:center;font-size:var(--text-sm);height:var(--height-lg);gap:.75rem;padding-inline:var(--spacing-2);background:var(--color-white);box-shadow:var(--shadow)}.k-user-info :where(.k-image-frame,.k-icon-frame){width:1.5rem;border-radius:var(--rounded-sm)}.k-user-profile{--button-height: auto;padding:var(--spacing-2);background:var(--color-white);border-radius:var(--rounded-lg);display:flex;align-items:center;gap:var(--spacing-3);box-shadow:var(--shadow)}.k-user-profile .k-button-group{display:flex;flex-direction:column;align-items:flex-start}.k-users-view-header{margin-bottom:0}.k-system-info .k-stat-label{color:var(--theme, var(--color-black))}.k-table-update-status-cell{padding:0 .75rem;display:flex;align-items:center;height:100%}.k-table-update-status-cell-version,.k-table-update-status-cell-button{font-variant-numeric:tabular-nums}.k-plugin-info{display:grid;column-gap:var(--spacing-3);row-gap:2px;padding:var(--button-padding)}.k-plugin-info dt{color:var(--color-gray-400)}.k-plugin-info dd[data-theme]{color:var(--theme-color-600)}@container (max-width: 30em){.k-plugin-info dd:not(:last-of-type){margin-bottom:var(--spacing-2)}}@container (min-width: 30em){.k-plugin-info{width:20rem;grid-template-columns:1fr auto}}:root{--color-l-100: 98%;--color-l-200: 94%;--color-l-300: 88%;--color-l-400: 80%;--color-l-500: 70%;--color-l-600: 60%;--color-l-700: 45%;--color-l-800: 30%;--color-l-900: 15%;--color-red-h: 0;--color-red-s: 80%;--color-red-hs: var(--color-red-h), var(--color-red-s);--color-red-boost: 3%;--color-red-l-100: calc(var(--color-l-100) + var(--color-red-boost));--color-red-l-200: calc(var(--color-l-200) + var(--color-red-boost));--color-red-l-300: calc(var(--color-l-300) + var(--color-red-boost));--color-red-l-400: calc(var(--color-l-400) + var(--color-red-boost));--color-red-l-500: calc(var(--color-l-500) + var(--color-red-boost));--color-red-l-600: calc(var(--color-l-600) + var(--color-red-boost));--color-red-l-700: calc(var(--color-l-700) + var(--color-red-boost));--color-red-l-800: calc(var(--color-l-800) + var(--color-red-boost));--color-red-l-900: calc(var(--color-l-900) + var(--color-red-boost));--color-red-100: hsl(var(--color-red-hs), var(--color-red-l-100));--color-red-200: hsl(var(--color-red-hs), var(--color-red-l-200));--color-red-300: hsl(var(--color-red-hs), var(--color-red-l-300));--color-red-400: hsl(var(--color-red-hs), var(--color-red-l-400));--color-red-500: hsl(var(--color-red-hs), var(--color-red-l-500));--color-red-600: hsl(var(--color-red-hs), var(--color-red-l-600));--color-red-700: hsl(var(--color-red-hs), var(--color-red-l-700));--color-red-800: hsl(var(--color-red-hs), var(--color-red-l-800));--color-red-900: hsl(var(--color-red-hs), var(--color-red-l-900));--color-orange-h: 28;--color-orange-s: 80%;--color-orange-hs: var(--color-orange-h), var(--color-orange-s);--color-orange-boost: 2.5%;--color-orange-l-100: calc(var(--color-l-100) + var(--color-orange-boost));--color-orange-l-200: calc(var(--color-l-200) + var(--color-orange-boost));--color-orange-l-300: calc(var(--color-l-300) + var(--color-orange-boost));--color-orange-l-400: calc(var(--color-l-400) + var(--color-orange-boost));--color-orange-l-500: calc(var(--color-l-500) + var(--color-orange-boost));--color-orange-l-600: calc(var(--color-l-600) + var(--color-orange-boost));--color-orange-l-700: calc(var(--color-l-700) + var(--color-orange-boost));--color-orange-l-800: calc(var(--color-l-800) + var(--color-orange-boost));--color-orange-l-900: calc(var(--color-l-900) + var(--color-orange-boost));--color-orange-100: hsl(var(--color-orange-hs), var(--color-orange-l-100));--color-orange-200: hsl(var(--color-orange-hs), var(--color-orange-l-200));--color-orange-300: hsl(var(--color-orange-hs), var(--color-orange-l-300));--color-orange-400: hsl(var(--color-orange-hs), var(--color-orange-l-400));--color-orange-500: hsl(var(--color-orange-hs), var(--color-orange-l-500));--color-orange-600: hsl(var(--color-orange-hs), var(--color-orange-l-600));--color-orange-700: hsl(var(--color-orange-hs), var(--color-orange-l-700));--color-orange-800: hsl(var(--color-orange-hs), var(--color-orange-l-800));--color-orange-900: hsl(var(--color-orange-hs), var(--color-orange-l-900));--color-yellow-h: 47;--color-yellow-s: 80%;--color-yellow-hs: var(--color-yellow-h), var(--color-yellow-s);--color-yellow-boost: 0%;--color-yellow-l-100: calc(var(--color-l-100) + var(--color-yellow-boost));--color-yellow-l-200: calc(var(--color-l-200) + var(--color-yellow-boost));--color-yellow-l-300: calc(var(--color-l-300) + var(--color-yellow-boost));--color-yellow-l-400: calc(var(--color-l-400) + var(--color-yellow-boost));--color-yellow-l-500: calc(var(--color-l-500) + var(--color-yellow-boost));--color-yellow-l-600: calc(var(--color-l-600) + var(--color-yellow-boost));--color-yellow-l-700: calc(var(--color-l-700) + var(--color-yellow-boost));--color-yellow-l-800: calc(var(--color-l-800) + var(--color-yellow-boost));--color-yellow-l-900: calc(var(--color-l-900) + var(--color-yellow-boost));--color-yellow-100: hsl(var(--color-yellow-hs), var(--color-yellow-l-100));--color-yellow-200: hsl(var(--color-yellow-hs), var(--color-yellow-l-200));--color-yellow-300: hsl(var(--color-yellow-hs), var(--color-yellow-l-300));--color-yellow-400: hsl(var(--color-yellow-hs), var(--color-yellow-l-400));--color-yellow-500: hsl(var(--color-yellow-hs), var(--color-yellow-l-500));--color-yellow-600: hsl(var(--color-yellow-hs), var(--color-yellow-l-600));--color-yellow-700: hsl(var(--color-yellow-hs), var(--color-yellow-l-700));--color-yellow-800: hsl(var(--color-yellow-hs), var(--color-yellow-l-800));--color-yellow-900: hsl(var(--color-yellow-hs), var(--color-yellow-l-900));--color-green-h: 80;--color-green-s: 60%;--color-green-hs: var(--color-green-h), var(--color-green-s);--color-green-boost: -2.5%;--color-green-l-100: calc(var(--color-l-100) + var(--color-green-boost));--color-green-l-200: calc(var(--color-l-200) + var(--color-green-boost));--color-green-l-300: calc(var(--color-l-300) + var(--color-green-boost));--color-green-l-400: calc(var(--color-l-400) + var(--color-green-boost));--color-green-l-500: calc(var(--color-l-500) + var(--color-green-boost));--color-green-l-600: calc(var(--color-l-600) + var(--color-green-boost));--color-green-l-700: calc(var(--color-l-700) + var(--color-green-boost));--color-green-l-800: calc(var(--color-l-800) + var(--color-green-boost));--color-green-l-900: calc(var(--color-l-900) + var(--color-green-boost));--color-green-100: hsl(var(--color-green-hs), var(--color-green-l-100));--color-green-200: hsl(var(--color-green-hs), var(--color-green-l-200));--color-green-300: hsl(var(--color-green-hs), var(--color-green-l-300));--color-green-400: hsl(var(--color-green-hs), var(--color-green-l-400));--color-green-500: hsl(var(--color-green-hs), var(--color-green-l-500));--color-green-600: hsl(var(--color-green-hs), var(--color-green-l-600));--color-green-700: hsl(var(--color-green-hs), var(--color-green-l-700));--color-green-800: hsl(var(--color-green-hs), var(--color-green-l-800));--color-green-900: hsl(var(--color-green-hs), var(--color-green-l-900));--color-aqua-h: 180;--color-aqua-s: 50%;--color-aqua-hs: var(--color-aqua-h), var(--color-aqua-s);--color-aqua-boost: 0%;--color-aqua-l-100: calc(var(--color-l-100) + var(--color-aqua-boost));--color-aqua-l-200: calc(var(--color-l-200) + var(--color-aqua-boost));--color-aqua-l-300: calc(var(--color-l-300) + var(--color-aqua-boost));--color-aqua-l-400: calc(var(--color-l-400) + var(--color-aqua-boost));--color-aqua-l-500: calc(var(--color-l-500) + var(--color-aqua-boost));--color-aqua-l-600: calc(var(--color-l-600) + var(--color-aqua-boost));--color-aqua-l-700: calc(var(--color-l-700) + var(--color-aqua-boost));--color-aqua-l-800: calc(var(--color-l-800) + var(--color-aqua-boost));--color-aqua-l-900: calc(var(--color-l-900) + var(--color-aqua-boost));--color-aqua-100: hsl(var(--color-aqua-hs), var(--color-aqua-l-100));--color-aqua-200: hsl(var(--color-aqua-hs), var(--color-aqua-l-200));--color-aqua-300: hsl(var(--color-aqua-hs), var(--color-aqua-l-300));--color-aqua-400: hsl(var(--color-aqua-hs), var(--color-aqua-l-400));--color-aqua-500: hsl(var(--color-aqua-hs), var(--color-aqua-l-500));--color-aqua-600: hsl(var(--color-aqua-hs), var(--color-aqua-l-600));--color-aqua-700: hsl(var(--color-aqua-hs), var(--color-aqua-l-700));--color-aqua-800: hsl(var(--color-aqua-hs), var(--color-aqua-l-800));--color-aqua-900: hsl(var(--color-aqua-hs), var(--color-aqua-l-900));--color-blue-h: 210;--color-blue-s: 65%;--color-blue-hs: var(--color-blue-h), var(--color-blue-s);--color-blue-boost: 3%;--color-blue-l-100: calc(var(--color-l-100) + var(--color-blue-boost));--color-blue-l-200: calc(var(--color-l-200) + var(--color-blue-boost));--color-blue-l-300: calc(var(--color-l-300) + var(--color-blue-boost));--color-blue-l-400: calc(var(--color-l-400) + var(--color-blue-boost));--color-blue-l-500: calc(var(--color-l-500) + var(--color-blue-boost));--color-blue-l-600: calc(var(--color-l-600) + var(--color-blue-boost));--color-blue-l-700: calc(var(--color-l-700) + var(--color-blue-boost));--color-blue-l-800: calc(var(--color-l-800) + var(--color-blue-boost));--color-blue-l-900: calc(var(--color-l-900) + var(--color-blue-boost));--color-blue-100: hsl(var(--color-blue-hs), var(--color-blue-l-100));--color-blue-200: hsl(var(--color-blue-hs), var(--color-blue-l-200));--color-blue-300: hsl(var(--color-blue-hs), var(--color-blue-l-300));--color-blue-400: hsl(var(--color-blue-hs), var(--color-blue-l-400));--color-blue-500: hsl(var(--color-blue-hs), var(--color-blue-l-500));--color-blue-600: hsl(var(--color-blue-hs), var(--color-blue-l-600));--color-blue-700: hsl(var(--color-blue-hs), var(--color-blue-l-700));--color-blue-800: hsl(var(--color-blue-hs), var(--color-blue-l-800));--color-blue-900: hsl(var(--color-blue-hs), var(--color-blue-l-900));--color-purple-h: 275;--color-purple-s: 60%;--color-purple-hs: var(--color-purple-h), var(--color-purple-s);--color-purple-boost: 0%;--color-purple-l-100: calc(var(--color-l-100) + var(--color-purple-boost));--color-purple-l-200: calc(var(--color-l-200) + var(--color-purple-boost));--color-purple-l-300: calc(var(--color-l-300) + var(--color-purple-boost));--color-purple-l-400: calc(var(--color-l-400) + var(--color-purple-boost));--color-purple-l-500: calc(var(--color-l-500) + var(--color-purple-boost));--color-purple-l-600: calc(var(--color-l-600) + var(--color-purple-boost));--color-purple-l-700: calc(var(--color-l-700) + var(--color-purple-boost));--color-purple-l-800: calc(var(--color-l-800) + var(--color-purple-boost));--color-purple-l-900: calc(var(--color-l-900) + var(--color-purple-boost));--color-purple-100: hsl(var(--color-purple-hs), var(--color-purple-l-100));--color-purple-200: hsl(var(--color-purple-hs), var(--color-purple-l-200));--color-purple-300: hsl(var(--color-purple-hs), var(--color-purple-l-300));--color-purple-400: hsl(var(--color-purple-hs), var(--color-purple-l-400));--color-purple-500: hsl(var(--color-purple-hs), var(--color-purple-l-500));--color-purple-600: hsl(var(--color-purple-hs), var(--color-purple-l-600));--color-purple-700: hsl(var(--color-purple-hs), var(--color-purple-l-700));--color-purple-800: hsl(var(--color-purple-hs), var(--color-purple-l-800));--color-purple-900: hsl(var(--color-purple-hs), var(--color-purple-l-900));--color-pink-h: 320;--color-pink-s: 70%;--color-pink-hs: var(--color-pink-h), var(--color-pink-s);--color-pink-boost: 0%;--color-pink-l-100: calc(var(--color-l-100) + var(--color-pink-boost));--color-pink-l-200: calc(var(--color-l-200) + var(--color-pink-boost));--color-pink-l-300: calc(var(--color-l-300) + var(--color-pink-boost));--color-pink-l-400: calc(var(--color-l-400) + var(--color-pink-boost));--color-pink-l-500: calc(var(--color-l-500) + var(--color-pink-boost));--color-pink-l-600: calc(var(--color-l-600) + var(--color-pink-boost));--color-pink-l-700: calc(var(--color-l-700) + var(--color-pink-boost));--color-pink-l-800: calc(var(--color-l-800) + var(--color-pink-boost));--color-pink-l-900: calc(var(--color-l-900) + var(--color-pink-boost));--color-pink-100: hsl(var(--color-pink-hs), var(--color-pink-l-100));--color-pink-200: hsl(var(--color-pink-hs), var(--color-pink-l-200));--color-pink-300: hsl(var(--color-pink-hs), var(--color-pink-l-300));--color-pink-400: hsl(var(--color-pink-hs), var(--color-pink-l-400));--color-pink-500: hsl(var(--color-pink-hs), var(--color-pink-l-500));--color-pink-600: hsl(var(--color-pink-hs), var(--color-pink-l-600));--color-pink-700: hsl(var(--color-pink-hs), var(--color-pink-l-700));--color-pink-800: hsl(var(--color-pink-hs), var(--color-pink-l-800));--color-pink-900: hsl(var(--color-pink-hs), var(--color-pink-l-900));--color-gray-h: 0;--color-gray-s: 0%;--color-gray-hs: var(--color-gray-h), var(--color-gray-s);--color-gray-boost: 0%;--color-gray-l-100: calc(var(--color-l-100) + var(--color-gray-boost));--color-gray-l-200: calc(var(--color-l-200) + var(--color-gray-boost));--color-gray-l-300: calc(var(--color-l-300) + var(--color-gray-boost));--color-gray-l-400: calc(var(--color-l-400) + var(--color-gray-boost));--color-gray-l-500: calc(var(--color-l-500) + var(--color-gray-boost));--color-gray-l-600: calc(var(--color-l-600) + var(--color-gray-boost));--color-gray-l-700: calc(var(--color-l-700) + var(--color-gray-boost));--color-gray-l-800: calc(var(--color-l-800) + var(--color-gray-boost));--color-gray-l-900: calc(var(--color-l-900) + var(--color-gray-boost));--color-gray-100: hsl(var(--color-gray-hs), var(--color-gray-l-100));--color-gray-200: hsl(var(--color-gray-hs), var(--color-gray-l-200));--color-gray-250: #e8e8e8;--color-gray-300: hsl(var(--color-gray-hs), var(--color-gray-l-300));--color-gray-400: hsl(var(--color-gray-hs), var(--color-gray-l-400));--color-gray-500: hsl(var(--color-gray-hs), var(--color-gray-l-500));--color-gray-600: hsl(var(--color-gray-hs), var(--color-gray-l-600));--color-gray-700: hsl(var(--color-gray-hs), var(--color-gray-l-700));--color-gray-800: hsl(var(--color-gray-hs), var(--color-gray-l-800));--color-gray-900: hsl(var(--color-gray-hs), var(--color-gray-l-900));--color-backdrop: rgba(0, 0, 0, .6);--color-black: black;--color-border: var(--color-gray-300);--color-dark: var(--color-gray-900);--color-focus: var(--color-blue-600);--color-light: var(--color-gray-200);--color-text: var(--color-black);--color-text-dimmed: var(--color-gray-700);--color-white: white;--color-background: var(--color-light);--color-gray: var(--color-gray-600);--color-red: var(--color-red-600);--color-orange: var(--color-orange-600);--color-yellow: var(--color-yellow-600);--color-green: var(--color-green-600);--color-aqua: var(--color-aqua-600);--color-blue: var(--color-blue-600);--color-purple: var(--color-purple-600);--color-focus-light: var(--color-focus);--color-focus-outline: var(--color-focus);--color-negative: var(--color-red-700);--color-negative-light: var(--color-red-500);--color-negative-outline: var(--color-red-900);--color-notice: var(--color-orange-700);--color-notice-light: var(--color-orange-500);--color-positive: var(--color-green-700);--color-positive-light: var(--color-green-500);--color-positive-outline: var(--color-green-900);--color-text-light: var(--color-text-dimmed)}:root{--font-sans: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";--font-mono: "SFMono-Regular", Consolas, Liberation Mono, Menlo, Courier, monospace}:root{--text-xs: .75rem;--text-sm: .875rem;--text-md: 1rem;--text-lg: 1.125rem;--text-xl: 1.25rem;--text-2xl: 1.5rem;--text-3xl: 1.75rem;--text-4xl: 2.5rem;--text-5xl: 3rem;--text-6xl: 4rem;--text-base: var(--text-md);--font-size-tiny: var(--text-xs);--font-size-small: var(--text-sm);--font-size-medium: var(--text-base);--font-size-large: var(--text-xl);--font-size-huge: var(--text-2xl);--font-size-monster: var(--text-3xl)}:root{--font-thin: 300;--font-normal: 400;--font-semi: 500;--font-bold: 600}:root{--height-xs: 1.5rem;--height-sm: 1.75rem;--height-md: 2rem;--height-lg: 2.25rem;--height-xl: 2.5rem;--height: var(--height-md)}:root{--opacity-disabled: .5}:root{--rounded-xs: 1px;--rounded-sm: .125rem;--rounded-md: .25rem;--rounded-lg: .375rem;--rounded-xl: .5rem;--rounded: var(--rounded-md)}:root{--shadow-sm: 0 1px 3px 0 rgba(0, 0, 0, .05), 0 1px 2px 0 rgba(0, 0, 0, .025);--shadow-md: 0 4px 6px -1px rgba(0, 0, 0, .1), 0 2px 4px -1px rgba(0, 0, 0, .05);--shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, .1), 0 4px 6px -2px rgba(0, 0, 0, .05);--shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, .1), 0 10px 10px -5px rgba(0, 0, 0, .05);--shadow: var(--shadow-sm);--shadow-toolbar: rgba(0, 0, 0, .1) -2px 0 5px, var(--shadow), var(--shadow-xl);--shadow-outline: var(--color-focus, currentColor) 0 0 0 2px;--shadow-inset: inset 0 2px 4px 0 rgba(0, 0, 0, .06);--shadow-sticky: rgba(0, 0, 0, .05) 0 2px 5px;--box-shadow-dropdown: var(--shadow-dropdown);--box-shadow-item: var(--shadow);--box-shadow-focus: var(--shadow-xl);--shadow-dropdown: var(--shadow-lg);--shadow-item: var(--shadow-sm)}:root{--spacing-0: 0;--spacing-1: .25rem;--spacing-2: .5rem;--spacing-3: .75rem;--spacing-4: 1rem;--spacing-6: 1.5rem;--spacing-8: 2rem;--spacing-12: 3rem;--spacing-16: 4rem;--spacing-24: 6rem;--spacing-36: 9rem;--spacing-48: 12rem;--spacing-px: 1px;--spacing-2px: 2px;--spacing-5: 1.25rem;--spacing-10: 2.5rem;--spacing-20: 5rem}:root{--z-offline: 1200;--z-fatal: 1100;--z-loader: 1000;--z-notification: 900;--z-dialog: 800;--z-navigation: 700;--z-dropdown: 600;--z-drawer: 500;--z-dropzone: 400;--z-toolbar: 300;--z-content: 200;--z-background: 100}:root{--pattern-size: 16px;--pattern-light: repeating-conic-gradient( hsl(0, 0%, 100%) 0% 25%, hsl(0, 0%, 90%) 0% 50% ) 50% / var(--pattern-size) var(--pattern-size);--pattern-dark: repeating-conic-gradient( hsla(0, 0%, 15%) 0% 25%, hsl(0, 0%, 22%) 0% 50% ) 50% / var(--pattern-size) var(--pattern-size);--pattern: var(--pattern-dark)}:root{--container: 80rem;--leading-none: 1;--leading-tight: 1.25;--leading-snug: 1.375;--leading-normal: 1.5;--leading-relaxed: 1.625;--leading-loose: 2;--field-input-padding: var(--input-padding);--field-input-height: var(--input-height);--field-input-line-height: var(--input-leading);--field-input-font-size: var(--input-font-size);--bg-pattern: var(--pattern)}:root{--choice-color-back: var(--color-white);--choice-color-border: var(--color-gray-500);--choice-color-checked: var(--color-black);--choice-color-disabled: var(--color-gray-400);--choice-color-icon: var(--color-light);--choice-color-info: var(--color-text-dimmed);--choice-color-text: var(--color-text);--choice-color-toggle: var(--choice-color-disabled);--choice-height: 1rem;--choice-rounded: var(--rounded-sm)}input:where([type=checkbox],[type=radio]){position:relative;cursor:pointer;overflow:hidden;flex-shrink:0;height:var(--choice-height);aspect-ratio:1/1;border:1px solid var(--choice-color-border);-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:var(--choice-rounded);background:var(--choice-color-back);box-shadow:var(--shadow-sm)}input:where([type=checkbox],[type=radio]):after{position:absolute;content:"";display:none;place-items:center;text-align:center}input:where([type=checkbox],[type=radio]):focus{outline:var(--outline);outline-offset:-1px;color:var(--color-focus)}input:where([type=checkbox]):checked{border-color:var(--choice-color-checked)}input:where([type=checkbox],[type=radio]):checked:after{background:var(--choice-color-checked);display:grid}input:where([type=checkbox],[type=radio]):checked:focus{--choice-color-checked: var(--color-focus)}input:where([type=checkbox],[type=radio])[disabled]{--choice-color-back: none;--choice-color-border: var(--color-gray-300);--choice-color-checked: var(--choice-color-disabled);box-shadow:none;cursor:not-allowed}input[type=checkbox]:checked:after{content:"✓";top:0;right:0;bottom:0;left:0;font-weight:700;color:var(--choice-color-icon);line-height:1}input[type=radio]{--choice-rounded: 50%}input[type=radio]:after{top:3px;right:3px;bottom:3px;left:3px;font-size:9px;border-radius:var(--choice-rounded)}input[type=checkbox][data-variant=toggle]{--choice-rounded: var(--choice-height);width:calc(var(--choice-height) * 2);aspect-ratio:2/1}input[type=checkbox][data-variant=toggle]:after{background:var(--choice-color-toggle);display:grid;top:1px;right:1px;bottom:1px;left:1px;width:.8rem;font-size:7px;border-radius:var(--choice-rounded);transition:margin-inline-start 75ms ease-in-out,background .1s ease-in-out}input[type=checkbox][data-variant=toggle]:checked{border-color:var(--choice-color-border)}input[type=checkbox][data-variant=toggle]:checked:after{background:var(--choice-color-checked);margin-inline-start:50%}:root{--range-thumb-color: var(--color-white);--range-thumb-focus-outline: var(--outline);--range-thumb-size: 1rem;--range-thumb-shadow: rgba(0, 0, 0, .1) 0 2px 4px 2px, rgba(0, 0, 0, .125) 0 0 0 1px;--range-track-back: var(--color-gray-250);--range-track-height: var(--range-thumb-size)}:where(input[type=range]){display:flex;align-items:center;-webkit-appearance:none;-moz-appearance:none;appearance:none;padding:0;height:var(--range-thumb-size);border-radius:var(--range-track-size);width:100%}:where(input[type=range])::-webkit-slider-thumb{-webkit-appearance:none;-moz-appearance:none;appearance:none;width:var(--range-thumb-size);height:var(--range-thumb-size);border:0;background:var(--range-thumb-color);box-shadow:var(--range-thumb-shadow);transform:translateZ(0);margin-top:calc(((var(--range-thumb-size) - var(--range-track-height)) / 2) * -1);border-radius:50%;z-index:1;cursor:grab}:where(input[type=range])::-moz-range-thumb{-webkit-appearance:none;-moz-appearance:none;appearance:none;width:var(--range-thumb-size);height:var(--range-thumb-size);border:0;background:var(--range-thumb-color);box-shadow:var(--range-thumb-shadow);border-radius:50%;transform:translateZ(0);z-index:1;cursor:grab}:where(input[type=range])::-webkit-slider-thumb:active{cursor:grabbing}:where(input[type=range])::-moz-range-thumb:active{cursor:grabbing}:where(input[type=range])::-webkit-slider-runnable-track{background:var(--range-track-back);height:var(--range-track-height);border-radius:var(--range-track-height)}:where(input[type=range])::-moz-range-track{background:var(--range-track-back);height:var(--range-track-height);border-radius:var(--range-track-height)}:where(input[type=range][disabled]){--range-thumb-color: rgba(255, 255, 255, .2)}:where(input[type=range][disabled])::-webkit-slider-thumb{cursor:not-allowed}:where(input[type=range][disabled])::-moz-range-thumb{cursor:not-allowed}:where(input[type=range]):focus{outline:var(--outline)}:where(input[type=range]):focus::-webkit-slider-thumb{outline:var(--range-thumb-focus-outline)}:where(input[type=range]):focus::-moz-range-thumb{outline:var(--range-thumb-focus-outline)}*,*:before,*:after{margin:0;padding:0;box-sizing:border-box}:where(b,strong){font-weight:var(--font-bold, 600)}:where([hidden]){display:none!important}:where(abbr){text-decoration:none}:where(input,button,textarea,select){border:0;font:inherit;line-height:inherit;color:inherit;background:none}:where(fieldset){border:0}:where(legend){width:100%;float:left}:where(legend+*){clear:both}:where(select){-webkit-appearance:none;-moz-appearance:none;appearance:none;background:var(--color-white);color:var(--color-black);cursor:pointer}:where(textarea,select,input:not([type=checkbox],[type=radio],[type=reset],[type=submit])){width:100%;font-variant-numeric:tabular-nums}:where(textarea){resize:vertical;line-height:1.5}:where(input)::-webkit-calendar-picker-indicator{display:none}:where(input[type=search]){-webkit-appearance:none;-moz-appearance:none;appearance:none}:where(input)::-webkit-search-cancel-button{display:none}:where(button,label,select,summary,[role=button],[role=option]){cursor:pointer}:where(select[multiple]) option{display:flex;align-items:center}:where(input:-webkit-autofill){-webkit-text-fill-color:var(--input-color-text)!important;-webkit-background-clip:text}:where(:disabled){cursor:not-allowed}*::placeholder{color:var(--input-color-placeholder);opacity:1}:where(a){color:currentColor;text-decoration:none;text-underline-offset:.2ex}:where(ul,ol){list-style:none}:where(img,svg,video,canvas,audio,iframe,embed,object){display:block}:where(iframe){border:0}:where(img,picture,svg){max-inline-size:100%;block-size:auto}:where(p,h1,h2,h3,h4,h5,h6){overflow-wrap:break-word}:where(h1,h2,h3,h4,h5,h6){font:inherit}:where(:focus,:focus-visible,:focus-within){outline-color:var(--color-focus, currentColor);outline-offset:0}:where(:focus-visible){outline:var(--outline, 2px solid var(--color-focus, currentColor))}:where(:invalid){box-shadow:none;outline:0}:where(dialog){border:0;max-width:none;max-height:none}:where(hr){border:0}:where(table){font:inherit;width:100%;border-spacing:0;font-variant-numeric:tabular-nums}:where(table th){font:inherit;text-align:start}:where(svg){fill:currentColor}body{font-family:var(--font-sans, sans-serif);font-size:var(--text-sm);line-height:1;position:relative;accent-color:var(--color-focus, currentColor)}:where(sup,sub){position:relative;line-height:0;vertical-align:baseline;font-size:75%}:where(sup){top:-.5em}:where(sub){bottom:-.25em}:where(mark){background:var(--color-yellow-300)}:where(kbd){display:inline-block;padding-inline:var(--spacing-2);border-radius:var(--rounded);background:var(--color-white);box-shadow:var(--shadow)}[data-align=left]{--align: start}[data-align=center]{--align: center}[data-align=right]{--align: end}@keyframes LoadingCursor{to{cursor:progress}}@keyframes Spin{to{transform:rotate(360deg)}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}[data-theme]{--theme-color-h: 0;--theme-color-s: 0%;--theme-color-hs: var(--theme-color-h), var(--theme-color-s);--theme-color-boost: 3%;--theme-color-l-100: calc(var(--color-l-100) + var(--theme-color-boost));--theme-color-l-200: calc(var(--color-l-200) + var(--theme-color-boost));--theme-color-l-300: calc(var(--color-l-300) + var(--theme-color-boost));--theme-color-l-400: calc(var(--color-l-400) + var(--theme-color-boost));--theme-color-l-500: calc(var(--color-l-500) + var(--theme-color-boost));--theme-color-l-600: calc(var(--color-l-600) + var(--theme-color-boost));--theme-color-l-700: calc(var(--color-l-700) + var(--theme-color-boost));--theme-color-l-800: calc(var(--color-l-800) + var(--theme-color-boost));--theme-color-l-900: calc(var(--color-l-900) + var(--theme-color-boost));--theme-color-100: hsl(var(--theme-color-hs), var(--theme-color-l-100));--theme-color-200: hsl(var(--theme-color-hs), var(--theme-color-l-200));--theme-color-300: hsl(var(--theme-color-hs), var(--theme-color-l-300));--theme-color-400: hsl(var(--theme-color-hs), var(--theme-color-l-400));--theme-color-500: hsl(var(--theme-color-hs), var(--theme-color-l-500));--theme-color-600: hsl(var(--theme-color-hs), var(--theme-color-l-600));--theme-color-700: hsl(var(--theme-color-hs), var(--theme-color-l-700));--theme-color-800: hsl(var(--theme-color-hs), var(--theme-color-l-800));--theme-color-900: hsl(var(--theme-color-hs), var(--theme-color-l-900));--theme-color-text: var(--theme-color-900);--theme-color-text-dimmed: hsl( var(--theme-color-h), calc(var(--theme-color-s) - 60%), 50% );--theme-color-back: var(--theme-color-400);--theme-color-hover: var(--theme-color-500);--theme-color-icon: var(--theme-color-600)}[data-theme^=red],[data-theme^=error],[data-theme^=negative]{--theme-color-h: var(--color-red-h);--theme-color-s: var(--color-red-s);--theme-color-boost: var(--color-red-boost)}[data-theme^=orange],[data-theme^=notice]{--theme-color-h: var(--color-orange-h);--theme-color-s: var(--color-orange-s);--theme-color-boost: var(--color-orange-boost)}[data-theme^=yellow],[data-theme^=warning]{--theme-color-h: var(--color-yellow-h);--theme-color-s: var(--color-yellow-s);--theme-color-boost: var(--color-yellow-boost)}[data-theme^=blue],[data-theme^=info]{--theme-color-h: var(--color-blue-h);--theme-color-s: var(--color-blue-s);--theme-color-boost: var(--color-blue-boost)}[data-theme^=pink],[data-theme^=love]{--theme-color-h: var(--color-pink-h);--theme-color-s: var(--color-pink-s);--theme-color-boost: var(--color-pink-boost)}[data-theme^=green],[data-theme^=positive]{--theme-color-h: var(--color-green-h);--theme-color-s: var(--color-green-s);--theme-color-boost: var(--color-green-boost)}[data-theme^=aqua]{--theme-color-h: var(--color-aqua-h);--theme-color-s: var(--color-aqua-s);--theme-color-boost: var(--color-aqua-boost)}[data-theme^=purple]{--theme-color-h: var(--color-purple-h);--theme-color-s: var(--color-purple-s);--theme-color-boost: var(--color-purple-boost)}[data-theme^=gray],[data-theme^=passive]{--theme-color-h: var(--color-gray-h);--theme-color-s: var(--color-gray-s);--theme-color-boost: 10%}[data-theme^=white],[data-theme^=text]{--theme-color-back: var(--color-white);--theme-color-icon: var(--color-gray-800);--theme-color-text: var(--color-text);--color-h: var(--color-black)}[data-theme^=dark]{--theme-color-h: var(--color-gray-h);--theme-color-s: var(--color-gray-s);--theme-color-boost: var(--color-gray-boost);--theme-color-back: var(--color-gray-800);--theme-color-icon: var(--color-gray-500);--theme-color-text: var(--color-gray-200)}[data-theme=code]{--theme-color-back: var(--code-color-back);--theme-color-hover: var(--color-black);--theme-color-icon: var(--code-color-icon);--theme-color-text: var(--code-color-text);font-family:var(--code-font-family);font-size:var(--code-font-size)}[data-theme=empty]{--theme-color-back: var(--color-light);--theme-color-border: var(--color-gray-400);--theme-color-icon: var(--color-gray-600);--theme-color-text: var(--color-text-dimmed);border:1px dashed var(--theme-color-border)}[data-theme=none]{--theme-color-back: transparent;--theme-color-border: transparent;--theme-color-icon: var(--color-text);--theme-color-text: var(--color-text)}[data-theme]{--theme: var(--theme-color-700);--theme-light: var(--theme-color-500);--theme-bg: var(--theme-color-500)}:root{--outline: 2px solid var(--color-focus, currentColor)}.scroll-x,.scroll-x-auto,.scroll-y,.scroll-y-auto{-webkit-overflow-scrolling:touch;transform:translateZ(0)}.scroll-x{overflow-x:scroll;overflow-y:hidden}.scroll-x-auto{overflow-x:auto;overflow-y:hidden}.scroll-y{overflow-x:hidden;overflow-y:scroll}.scroll-y-auto{overflow-x:hidden;overflow-y:auto}.input-hidden{position:absolute;-webkit-appearance:none;-moz-appearance:none;appearance:none;width:0;height:0;opacity:0}.k-lab-index-view .k-header{margin-bottom:0}.k-lab-index-view .k-panel-main>.k-box{margin-bottom:var(--spacing-8)}.k-lab-index-view .k-list-items{grid-template-columns:repeat(auto-fill,minmax(12rem,1fr))}.k-lab-docs-deprecated .k-box{box-shadow:var(--shadow)}.k-lab-docs-examples .k-code+.k-code{margin-top:var(--spacing-4)}.k-lab-docs-prop-values{font-size:var(--text-xs);border-left:2px solid var(--color-blue-300);padding-inline-start:var(--spacing-2)}.k-lab-docs-prop-values dl{font-weight:var(--font-bold)}.k-lab-docs-prop-values dl+dl{margin-top:var(--spacing-2)}.k-lab-docs-prop-values dd{display:inline-flex;flex-wrap:wrap;gap:var(--spacing-1)}.k-lab-docs-desc-header{display:flex;justify-content:space-between;align-items:center}.k-table .k-lab-docs-deprecated{--box-height: var(--height-xs);--text-font-size: var(--text-xs)}.k-labs-docs-params li{list-style:square;margin-inline-start:var(--spacing-3)}.k-labs-docs-params .k-lab-docs-types{margin-inline:1ch}.k-lab-docs-types{display:inline-flex;flex-wrap:wrap;gap:var(--spacing-1)}.k-lab-docs-types.k-text code{color:var(--color-gray-800);outline-color:var(--color-gray-400);background:var(--color-gray-300)}.k-lab-docs-types code:is([data-type=boolean],[data-type=Boolean]){color:var(--color-purple-800);outline-color:var(--color-purple-400);background:var(--color-purple-300)}.k-lab-docs-types code:is([data-type=string],[data-type=String]){color:var(--color-green-800);outline-color:var(--color-green-500);background:var(--color-green-300)}.k-lab-docs-types code:is([data-type=number],[data-type=Number]){color:var(--color-orange-800);outline-color:var(--color-orange-500);background:var(--color-orange-300)}.k-lab-docs-types code:is([data-type=array],[data-type=Array]){color:var(--color-aqua-800);outline-color:var(--color-aqua-500);background:var(--color-aqua-300)}.k-lab-docs-types code:is([data-type=object],[data-type=Object]){color:var(--color-yellow-800);outline-color:var(--color-yellow-500);background:var(--color-yellow-300)}.k-lab-docs-types code[data-type=func]{color:var(--color-pink-800);outline-color:var(--color-pink-400);background:var(--color-pink-300)}.k-lab-docs-section+.k-lab-docs-section{margin-top:var(--spacing-12)}.k-lab-docs-section .k-headline{margin-bottom:var(--spacing-3)}.k-lab-docs-section .k-table td{padding:.375rem var(--table-cell-padding);vertical-align:top;line-height:1.5;word-break:break-word}.k-lab-docs-description :where(.k-text,.k-box)+:where(.k-text,.k-box){margin-top:var(--spacing-3)}.k-lab-docs-required{margin-inline-start:var(--spacing-1);font-size:.7rem;vertical-align:super;color:var(--color-red-600)}.k-lab-docs-since{margin-top:var(--spacing-1);font-size:var(--text-xs);color:var(--color-gray-600)}.k-lab-example{position:relative;container-type:inline-size;max-width:100%;outline-offset:-2px;border-radius:var(--rounded);border:1px solid var(--color-gray-300)}.k-lab-example+.k-lab-example{margin-top:var(--spacing-12)}.k-lab-example-header{display:flex;justify-content:space-between;align-items:center;height:var(--height-md);padding-block:var(--spacing-3);padding-inline:var(--spacing-2);border-bottom:1px solid var(--color-gray-300)}.k-lab-example-label{font-size:12px;color:var(--color-text-dimmed)}.k-lab-example-canvas,.k-lab-example-code{padding:var(--spacing-16)}.k-lab-example[data-flex] .k-lab-example-canvas{display:flex;align-items:center;gap:var(--spacing-6)}.k-lab-example-inspector{--icon-size: 13px;--button-color-icon: var(--color-gray-500)}.k-lab-example-inspector .k-button:not([data-theme]):hover{--button-color-icon: var(--color-gray-600)}.k-lab-example-inspector .k-button:where([data-theme]){--button-color-icon: var(--color-gray-800)}.k-lab-examples>:where(.k-text,.k-box){margin-bottom:var(--spacing-6)}.k-lab-form>footer{border-top:1px dashed var(--color-border);padding-top:var(--spacing-6)}.k-lab-playground-view[data-has-tabs=true] .k-header{margin-bottom:0}.k-lab-examples h2{margin-bottom:var(--spacing-6)}.k-lab-examples *+h2{margin-top:var(--spacing-12)}.k-lab-input-examples .k-lab-example:has(:invalid){outline:2px solid var(--color-red-500);outline-offset:-2px}.k-lab-input-examples-focus .k-lab-example-canvas>.k-button{margin-top:var(--spacing-6)}.k-lab-helpers-examples .k-lab-example .k-text{margin-bottom:var(--spacing-6)}.k-lab-helpers-examples h2{margin-bottom:var(--spacing-3);font-weight:var(--font-bold)}.token.punctuation,.token.comment,.token.doctype{color:var(--color-gray-500)}.token.tag,.token.markup,.token.variable,.token.this,.token.selector,.token.key,.token.kirbytag-bracket,.token.prolog,.token.delimiter{color:var(--color-red-500)}.token.constant,.token.number,.token.boolean,.token.boolean.important,.token.attr-name,.token.kirbytag-attr,.token.kirbytag-name,.token.entity,.token.bold,.token.bold>.punctuation{color:var(--color-orange-500)}.token.keyword,.token.italic,.token.italic>.punctuation{color:var(--color-purple-500)}.token.function{color:var(--color-blue-500)}.token.operator,.token.title{color:var(--color-aqua-500)}.token.string,.token.attr-value,.token.attr-value .punctuation,.token.list.punctuation{color:var(--color-green-500)}.token.scope,.token.class-name,.token.property,.token.url{color:var(--color-yellow-500)}.token.title,.token.kirbytag-bracket,.token.list.punctuation,.token.bold{font-weight:var(--font-bold)}.token.title .punctuation{color:var(--color-gray-500)}.token.italic{font-style:italic} diff --git a/kirby/panel/dist/favicon-dark.png b/kirby/panel/dist/favicon-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..dcf5e582e9ad387f5d38ce5ab89e02df74468ec5 GIT binary patch literal 416 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyX#qYVu0Z-f?ZMRfnJa)cDV7BJ z1v4!8!0k{e@ZHL}1%TrB_SaTu*Uf=WI+3e|=x4xgAq}zI7h8_=dtx{Hln$fMo_FIKnB^$48 zbLMw+n!@tI>GxgzpdXhN)#Wn_W$!snDGB1*GSO;}`_mixpXYGZuHo4(v};1d^W`ib z+%FmY;wVeJd*Z;^U-<{@zTa4)_CRUwQ?(~^4qatq2ow-yGGJ@aVdi11%DFdDi#J;5 zW}beV?k5}Z2*K4C@)th%Cp4j)_2=95Y4c~>N<4dVWAW4T^Yr=RZTIcT`8)sT9nk~w T&+k|P{lwtu>gTe~DWM4f__*m5 literal 0 HcmV?d00001 diff --git a/kirby/panel/dist/favicon.png b/kirby/panel/dist/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..ecf0cf8d60e963463e558d3aefbbd532d676566e GIT binary patch literal 539 zcmV+$0_6RPP)Fp|=ykZ#eI$qt+0+(tJc@4BUyZNbtdTnW7Ue zj`Lb*_W2_5Tx=kw**3Vd^FhyE1y^2TprZL8M>ro&OrP(BlAjb@aMnLvJNdawU;7E)&0!b~~Qh?=C z%B_HJYw=s;T42I`DG!4Ey*|ozV5iKQoIu^rM7aXIzwBD)ww@HwrUfP`y7pc`_SYD^ z=0;%aY>G}`uQO|&U@o_ZYpQsDojZA+);n-5{2ljxA>p-{iQcYc6kzG?QtAS{a;4^K z-JFl;x)xo#h=rrGFdxku?oc*b2GF_fxKMnFDJr={xx$Jjuaiad!KXVCqSn-7i|X`t dTw&!t{{jk>)XmVGi~axr002ovPDHLkV1jM>_2d8m literal 0 HcmV?d00001 diff --git a/kirby/panel/dist/favicon.svg b/kirby/panel/dist/favicon.svg new file mode 100644 index 0000000..5b59d61 --- /dev/null +++ b/kirby/panel/dist/favicon.svg @@ -0,0 +1,9 @@ + + + + \ No newline at end of file diff --git a/kirby/panel/dist/img/icons.svg b/kirby/panel/dist/img/icons.svg new file mode 100644 index 0000000..0da75ac --- /dev/null +++ b/kirby/panel/dist/img/icons.svg @@ -0,0 +1,644 @@ + + diff --git a/kirby/panel/dist/js/Docs.min.js b/kirby/panel/dist/js/Docs.min.js new file mode 100644 index 0000000..c835a23 --- /dev/null +++ b/kirby/panel/dist/js/Docs.min.js @@ -0,0 +1 @@ +import{n as t}from"./index.min.js";const e={props:{deprecated:String}};const s=t({mixins:[e]},(function(){var t=this,e=t._self._c;return t.deprecated.length?e("section",{staticClass:"k-lab-docs-section k-lab-docs-deprecated"},[e("k-lab-docs-deprecated",{attrs:{deprecated:t.deprecated}})],1):t._e()}),[],!1,null,null,null,null).exports,l={props:{description:String,since:String}};const a=t({mixins:[l]},(function(){var t,e,s,l=this,a=l._self._c;return(null==(t=l.description)?void 0:t.length)||(null==(e=l.since)?void 0:e.length)?a("section",{staticClass:"k-lab-docs-section"},[a("header",{staticClass:"k-lab-docs-desc-header"},[a("k-headline",{staticClass:"h3"},[l._v("Description")]),(null==(s=l.since)?void 0:s.length)?a("k-text",[l._v(" Since "),a("code",[l._v(l._s(l.since))])]):l._e()],1),a("k-box",{attrs:{theme:"text"}},[a("k-text",{attrs:{html:l.description}})],1)],1):l._e()}),[],!1,null,null,null,null).exports,n={props:{examples:{default:()=>[],type:Array}}};const c=t({mixins:[n]},(function(){var t=this,e=t._self._c;return t.examples.length?e("section",{staticClass:"k-lab-docs-section k-lab-docs-examples"},[e("k-headline",{staticClass:"h3"},[t._v("Examples")]),t._l(t.examples,(function(s,l){return e("k-code",{key:l,attrs:{language:"html"}},[t._v(t._s(s.content))])}))],2):t._e()}),[],!1,null,null,null,null).exports,r={props:{props:{default:()=>[],type:Array}}};const i=t({mixins:[r]},(function(){var t=this,e=t._self._c;return t.props.length?e("section",{staticClass:"k-lab-docs-section"},[e("k-headline",{staticClass:"h3"},[t._v("Props")]),e("div",{staticClass:"k-table"},[e("table",[t._m(0),e("tbody",t._l(t.props,(function(s){var l,a,n,c,r,i,o,d,p;return e("tr",{key:s.name},[e("td",[e("k-text",[e("code",[t._v(t._s(s.name))]),s.required?e("abbr",{staticClass:"k-lab-docs-required"},[t._v("✶")]):t._e(),(null==(l=s.since)?void 0:l.length)?e("div",{staticClass:"k-lab-docs-since"},[t._v(" since "+t._s(s.since)+" ")]):t._e()])],1),e("td",[e("k-lab-docs-types",{attrs:{types:null==(a=s.type)?void 0:a.split("|")}})],1),e("td",[s.default?e("k-text",[e("code",[t._v(t._s(s.default))])]):t._e()],1),e("td",{staticClass:"k-lab-docs-description"},[e("k-lab-docs-deprecated",{attrs:{deprecated:s.deprecated}}),(null==(n=s.description)?void 0:n.length)?e("k-text",{attrs:{html:s.description}}):t._e(),(null==(c=s.value)?void 0:c.length)||(null==(r=s.values)?void 0:r.length)||(null==(i=s.example)?void 0:i.length)?e("k-text",{staticClass:"k-lab-docs-prop-values"},[(null==(o=s.value)?void 0:o.length)?e("dl",[e("dt",[t._v("Value")]),e("dd",[e("code",[t._v(t._s(s.value))])])]):t._e(),(null==(d=s.values)?void 0:d.length)?e("dl",[e("dt",[t._v("Values")]),e("dd",t._l(s.values,(function(s){return e("code",{key:s},[t._v(" "+t._s(s.replaceAll("`",""))+" ")])})),0)]):t._e(),(null==(p=s.example)?void 0:p.length)?e("dl",[e("dt",[t._v("Example")]),e("dd",[e("code",[t._v(t._s(s.example))])])]):t._e()]):t._e()],1)])})),0)])])],1):t._e()}),[function(){var t=this,e=t._self._c;return e("thead",[e("th",{staticStyle:{width:"10rem"}},[t._v("Name")]),e("th",{staticStyle:{width:"10rem"}},[t._v("Type")]),e("th",{staticStyle:{width:"10rem"}},[t._v("Default")]),e("th",[t._v("Description")])])}],!1,null,null,null,null).exports,o={props:{slots:{default:()=>[],type:Array}},computed:{hasBindings(){return this.slots.filter((t=>t.bindings.length)).length}}};const d=t({mixins:[o]},(function(){var t=this,e=t._self._c;return t.slots.length?e("section",{staticClass:"k-lab-docs-section"},[e("k-headline",{staticClass:"h3"},[t._v("Slots")]),e("div",{staticClass:"k-table"},[e("table",[e("thead",[e("th",{staticStyle:{width:"10rem"}},[t._v("Slot")]),e("th",[t._v("Description")]),t.hasBindings?e("th",[t._v("Bindings")]):t._e()]),e("tbody",t._l(t.slots,(function(s){var l;return e("tr",{key:s.name},[e("td",{staticStyle:{width:"12rem"}},[e("k-text",[e("code",[t._v(t._s(s.name))]),(null==(l=s.since)?void 0:l.length)?e("div",{staticClass:"k-lab-docs-since"},[t._v(" since "+t._s(s.since)+" ")]):t._e()])],1),e("td",[e("k-lab-docs-deprecated",{attrs:{deprecated:s.deprecated}}),e("k-text",{attrs:{html:s.description}})],1),t.hasBindings?e("td",[e("k-lab-docs-params",{attrs:{params:s.bindings}})],1):t._e()])})),0)])])],1):t._e()}),[],!1,null,null,null,null).exports,p={props:{events:{default:()=>[],type:Array}},computed:{hasProperties(){return this.events.filter((t=>t.properties.length)).length}}};const u=t({mixins:[p]},(function(){var t=this,e=t._self._c;return t.events.length?e("section",{staticClass:"k-lab-docs-section"},[e("k-headline",{staticClass:"h3"},[t._v("Events")]),e("div",{staticClass:"k-table"},[e("table",[e("thead",[e("th",{staticStyle:{width:"10rem"}},[t._v("Event")]),e("th",[t._v("Description")]),t.hasProperties?e("th",[t._v("Properties")]):t._e()]),e("tbody",t._l(t.events,(function(s){var l;return e("tr",{key:s.name},[e("td",[e("k-text",[e("code",[t._v(t._s(s.name))]),(null==(l=s.since)?void 0:l.length)?e("div",{staticClass:"k-lab-docs-since"},[t._v(" since "+t._s(s.since)+" ")]):t._e()])],1),e("td",[e("k-lab-docs-deprecated",{attrs:{deprecated:s.deprecated}}),e("k-text",{attrs:{html:s.description}})],1),t.hasProperties?e("td",[e("k-lab-docs-params",{attrs:{params:s.properties}})],1):t._e()])})),0)])])],1):t._e()}),[],!1,null,null,null,null).exports,_={props:{methods:{default:()=>[],type:Array}}};const h=t({mixins:[_]},(function(){var t=this,e=t._self._c;return t.methods.length?e("section",{staticClass:"k-lab-docs-section"},[e("k-headline",{staticClass:"h3"},[t._v("Methods")]),e("div",{staticClass:"k-table"},[e("table",[t._m(0),e("tbody",t._l(t.methods,(function(s){var l;return e("tr",{key:s.name},[e("td",[e("k-text",[e("code",[t._v(t._s(s.name))]),(null==(l=s.since)?void 0:l.length)?e("div",{staticClass:"k-lab-docs-since"},[t._v(" since "+t._s(s.since)+" ")]):t._e()])],1),e("td",[e("k-lab-docs-deprecated",{attrs:{deprecated:s.deprecated}}),e("k-text",{attrs:{html:s.description}})],1),e("td",[e("k-lab-docs-params",{attrs:{params:s.params}})],1),e("td",[e("k-lab-docs-types",{attrs:{types:[s.returns]}})],1)])})),0)])])],1):t._e()}),[function(){var t=this,e=t._self._c;return e("thead",[e("th",{staticStyle:{width:"10rem"}},[t._v("Method")]),e("th",[t._v("Description")]),e("th",{staticStyle:{width:"16rem"}},[t._v("Params")]),e("th",{staticStyle:{width:"10rem"}},[t._v("Returns")])])}],!1,null,null,null,null).exports,v={props:{docBlock:String}};const k=t({mixins:[v]},(function(){var t,e=this,s=e._self._c;return(null==(t=e.docBlock)?void 0:t.length)?s("section",{staticClass:"k-lab-docs-section"},[s("header",[s("k-headline",{staticClass:"h3"},[e._v("Further information")])],1),s("k-box",{attrs:{theme:"text"}},[s("k-text",{attrs:{html:e.docBlock}})],1)],1):e._e()}),[],!1,null,null,null,null).exports;const m=t({props:{deprecated:{type:String}}},(function(){var t,e=this,s=e._self._c;return(null==(t=e.deprecated)?void 0:t.length)?s("k-box",{staticClass:"k-lab-docs-deprecated",attrs:{icon:"protected",theme:"warning"}},[s("k-text",{attrs:{html:"Deprecated: "+e.deprecated}})],1):e._e()}),[],!1,null,null,null,null).exports;const b=t({props:{params:{type:Array,default:()=>[]}}},(function(){var t=this,e=t._self._c;return t.params.length?e("ul",{staticClass:"k-labs-docs-params"},t._l(t.params,(function(s){return e("li",{key:s.name},[e("k-text",[e("code",[t._v(t._s(s.name))]),e("k-lab-docs-types",{attrs:{types:[s.type]}}),s.description.length?e("span",{domProps:{innerHTML:t._s(s.description)}}):t._e()],1)],1)})),0):t._e()}),[],!1,null,null,null,null).exports;const x=t({props:{types:{type:Array,default:()=>[]}}},(function(){var t=this,e=t._self._c;return e("k-text",{staticClass:"k-lab-docs-types"},t._l(t.types,(function(s){return e("code",{key:s,attrs:{"data-type":s}},[t._v(" "+t._s(s)+" ")])})),0)}),[],!1,null,null,null,null).exports;Vue.component("k-lab-docs-deprecated",m),Vue.component("k-lab-docs-params",b),Vue.component("k-lab-docs-types",x);const f=t({components:{"k-lab-docs-deprecated":s,"k-lab-docs-description":a,"k-lab-docs-examples":c,"k-lab-docs-props":i,"k-lab-docs-slots":d,"k-lab-docs-events":u,"k-lab-docs-methods":h,"k-lab-docs-docblock":k},mixins:[e,l,n,r,o,p,_,v],props:{component:String}},(function(){var t=this,e=t._self._c;return e("div",{staticClass:"k-lab-docs"},[e("k-lab-docs-deprecated",{attrs:{deprecated:t.deprecated}}),e("k-lab-docs-description",{attrs:{description:t.description,since:t.since}}),e("k-lab-docs-examples",{attrs:{examples:t.examples}}),e("k-lab-docs-props",{attrs:{props:t.props}}),e("k-lab-docs-slots",{attrs:{slots:t.slots}}),e("k-lab-docs-events",{attrs:{events:t.events}}),e("k-lab-docs-methods",{attrs:{methods:t.methods}}),e("k-lab-docs-docblock",{attrs:{"doc-block":t.docBlock}})],1)}),[],!1,null,null,null,null).exports;export{f as D}; diff --git a/kirby/panel/dist/js/DocsView.min.js b/kirby/panel/dist/js/DocsView.min.js new file mode 100644 index 0000000..1ad9f61 --- /dev/null +++ b/kirby/panel/dist/js/DocsView.min.js @@ -0,0 +1 @@ +import{D as t}from"./Docs.min.js";import{n as s}from"./index.min.js";import"./vendor.min.js";const o=s({components:{"k-lab-docs":t},props:{component:String,docs:Object,lab:String},mounted(){},methods:{reloadDocs(){this.$panel.view.refresh()}}},(function(){var t=this,s=t._self._c;return s("k-panel-inside",{staticClass:"k-lab-docs-view"},[s("k-header",[t._v(" "+t._s(t.component)+" "),t.docs.github||t.lab?s("k-button-group",{attrs:{slot:"buttons"},slot:"buttons"},[t.lab?s("k-button",{attrs:{icon:"lab",text:"Lab examples",size:"sm",variant:"filled",link:"/lab/"+t.lab}}):t._e(),t.docs.github?s("k-button",{attrs:{icon:"github",size:"sm",variant:"filled",link:t.docs.github,target:"_blank"}}):t._e()],1):t._e()],1),s("k-lab-docs",t._b({},"k-lab-docs",t.docs,!1))],1)}),[],!1,null,null,null,null).exports;export{o as default}; diff --git a/kirby/panel/dist/js/Highlight.min.js b/kirby/panel/dist/js/Highlight.min.js new file mode 100644 index 0000000..f449f19 --- /dev/null +++ b/kirby/panel/dist/js/Highlight.min.js @@ -0,0 +1 @@ +import{n as e}from"./index.min.js";import"./vendor.min.js";var t=function(e){var t=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,n=0,a={},r={manual:e.Prism&&e.Prism.manual,disableWorkerMessageHandler:e.Prism&&e.Prism.disableWorkerMessageHandler,util:{encode:function e(t){return t instanceof i?new i(t.type,e(t.content),t.alias):Array.isArray(t)?t.map(e):t.replace(/&/g,"&").replace(/=c.reach);F+=w.value.length,w=w.next){var A=w.value;if(t.length>e.length)return;if(!(A instanceof i)){var $,_=1;if(y){if(!($=s(x,F,e,m))||$.index>=e.length)break;var z=$.index,S=$.index+$[0].length,j=F;for(j+=w.value.length;z>=j;)j+=(w=w.next).value.length;if(F=j-=w.value.length,w.value instanceof i)continue;for(var E=w;E!==t.tail&&(jc.reach&&(c.reach=L);var C=w.prev;if(O&&(C=u(t,C,O),F+=O.length),d(t,C,_),w=u(t,C,new i(g,h?r.tokenize(P,h):P,k,P)),q&&u(t,w,q),_>1){var T={cause:g+","+f,reach:L};l(e,t,n,w.prev,F,T),c&&T.reach>c.reach&&(c.reach=T.reach)}}}}}}function o(){var e={value:null,prev:null,next:null},t={value:null,prev:e,next:null};e.next=t,this.head=e,this.tail=t,this.length=0}function u(e,t,n){var a=t.next,r={value:n,prev:t,next:a};return t.next=r,a.prev=r,e.length++,r}function d(e,t,n){for(var a=t.next,r=0;r"+i.content+""},!e.document)return e.addEventListener?(r.disableWorkerMessageHandler||e.addEventListener("message",(function(t){var n=JSON.parse(t.data),a=n.language,i=n.code,s=n.immediateClose;e.postMessage(r.highlight(i,r.languages[a],a)),s&&e.close()}),!1),r):r;var c=r.util.currentScript();function g(){r.manual||r.highlightAll()}if(c&&(r.filename=c.src,c.hasAttribute("data-manual")&&(r.manual=!0)),!r.manual){var p=document.readyState;"loading"===p||"interactive"===p&&c&&c.defer?document.addEventListener("DOMContentLoaded",g):window.requestAnimationFrame?window.requestAnimationFrame(g):window.setTimeout(g,16)}return r}("undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{});"undefined"!=typeof module&&module.exports&&(module.exports=t),"undefined"!=typeof global&&(global.Prism=t),t.languages.markup={comment:{pattern://,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern://i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},{pattern:/^(\s*)["']|["']$/,lookbehind:!0}]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},t.languages.markup.tag.inside["attr-value"].inside.entity=t.languages.markup.entity,t.languages.markup.doctype.inside["internal-subset"].inside=t.languages.markup,t.hooks.add("wrap",(function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&/,"&"))})),Object.defineProperty(t.languages.markup.tag,"addInlined",{value:function(e,n){var a={};a["language-"+n]={pattern:/(^$)/i,lookbehind:!0,inside:t.languages[n]},a.cdata=/^$/i;var r={"included-cdata":{pattern://i,inside:a}};r["language-"+n]={pattern:/[\s\S]+/,inside:t.languages[n]};var i={};i[e]={pattern:RegExp("(<__[^>]*>)(?:))*\\]\\]>|(?!)".replace(/__/g,(function(){return e})),"i"),lookbehind:!0,greedy:!0,inside:r},t.languages.insertBefore("markup","cdata",i)}}),Object.defineProperty(t.languages.markup.tag,"addAttribute",{value:function(e,n){t.languages.markup.tag.inside["special-attr"].push({pattern:RegExp("(^|[\"'\\s])(?:"+e+")\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s'\">=]+(?=[\\s>]))","i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[n,"language-"+n],inside:t.languages[n]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),t.languages.html=t.languages.markup,t.languages.mathml=t.languages.markup,t.languages.svg=t.languages.markup,t.languages.xml=t.languages.extend("markup",{}),t.languages.ssml=t.languages.xml,t.languages.atom=t.languages.xml,t.languages.rss=t.languages.xml,function(e){var t=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;e.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:RegExp("@[\\w-](?:[^;{\\s\"']|\\s+(?!\\s)|"+t.source+")*?(?:;|(?=\\s*\\{))"),inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+t.source+"|(?:[^\\\\\r\n()\"']|\\\\[^])*)\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+t.source+"$"),alias:"url"}}},selector:{pattern:RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+t.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:t,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},e.languages.css.atrule.inside.rest=e.languages.css;var n=e.languages.markup;n&&(n.tag.addInlined("style","css"),n.tag.addAttribute("style","css"))}(t),t.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,boolean:/\b(?:false|true)\b/,function:/\b\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/},t.languages.javascript=t.languages.extend("clike",{"class-name":[t.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp("(^|[^\\w$])(?:NaN|Infinity|0[bB][01]+(?:_[01]+)*n?|0[oO][0-7]+(?:_[0-7]+)*n?|0[xX][\\dA-Fa-f]+(?:_[\\dA-Fa-f]+)*n?|\\d+(?:_\\d+)*n|(?:\\d+(?:_\\d+)*(?:\\.(?:\\d+(?:_\\d+)*)?)?|\\.\\d+(?:_\\d+)*)(?:[Ee][+-]?\\d+(?:_\\d+)*)?)(?![\\w$])"),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),t.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,t.languages.insertBefore("javascript","keyword",{regex:{pattern:RegExp("((?:^|[^$\\w\\xA0-\\uFFFF.\"'\\])\\s]|\\b(?:return|yield))\\s*)/(?:(?:\\[(?:[^\\]\\\\\r\n]|\\\\.)*\\]|\\\\.|[^/\\\\\\[\r\n])+/[dgimyus]{0,7}|(?:\\[(?:[^[\\]\\\\\r\n]|\\\\.|\\[(?:[^[\\]\\\\\r\n]|\\\\.|\\[(?:[^[\\]\\\\\r\n]|\\\\.)*\\])*\\])*\\]|\\\\.|[^/\\\\\\[\r\n])+/[dgimyus]{0,7}v[dgimyus]{0,7})(?=(?:\\s|/\\*(?:[^*]|\\*(?!/))*\\*/)*(?:$|[\r\n,.;:})\\]]|//))"),lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:t.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:t.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:t.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:t.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:t.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),t.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:t.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),t.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),t.languages.markup&&(t.languages.markup.tag.addInlined("script","javascript"),t.languages.markup.tag.addAttribute("on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)","javascript")),t.languages.js=t.languages.javascript,function(e){function t(e,t){return"___"+e.toUpperCase()+t+"___"}Object.defineProperties(e.languages["markup-templating"]={},{buildPlaceholders:{value:function(n,a,r,i){if(n.language===a){var s=n.tokenStack=[];n.code=n.code.replace(r,(function(e){if("function"==typeof i&&!i(e))return e;for(var r,l=s.length;-1!==n.code.indexOf(r=t(a,l));)++l;return s[l]=e,r})),n.grammar=e.languages.markup}}},tokenizePlaceholders:{value:function(n,a){if(n.language===a&&n.tokenStack){n.grammar=e.languages[a];var r=0,i=Object.keys(n.tokenStack);!function s(l){for(var o=0;o=i.length);o++){var u=l[o];if("string"==typeof u||u.content&&"string"==typeof u.content){var d=i[r],c=n.tokenStack[d],g="string"==typeof u?u:u.content,p=t(a,d),f=g.indexOf(p);if(f>-1){++r;var b=g.substring(0,f),h=new e.Token(a,e.tokenize(c,n.grammar),"language-"+a,c),m=g.substring(f+p.length),y=[];b&&y.push.apply(y,s([b])),y.push(h),m&&y.push.apply(y,s([m])),"string"==typeof u?l.splice.apply(l,[o,1].concat(y)):u.content=y}}else u.content&&s(u.content)}return l}(n.tokens)}}}})}(t),function(e){var t=/\/\*[\s\S]*?\*\/|\/\/.*|#(?!\[).*/,n=[{pattern:/\b(?:false|true)\b/i,alias:"boolean"},{pattern:/(::\s*)\b[a-z_]\w*\b(?!\s*\()/i,greedy:!0,lookbehind:!0},{pattern:/(\b(?:case|const)\s+)\b[a-z_]\w*(?=\s*[;=])/i,greedy:!0,lookbehind:!0},/\b(?:null)\b/i,/\b[A-Z_][A-Z0-9_]*\b(?!\s*\()/],a=/\b0b[01]+(?:_[01]+)*\b|\b0o[0-7]+(?:_[0-7]+)*\b|\b0x[\da-f]+(?:_[\da-f]+)*\b|(?:\b\d+(?:_\d+)*\.?(?:\d+(?:_\d+)*)?|\B\.\d+)(?:e[+-]?\d+)?/i,r=/|\?\?=?|\.{3}|\??->|[!=]=?=?|::|\*\*=?|--|\+\+|&&|\|\||<<|>>|[?~]|[/^|%*&<>.+-]=?/,i=/[{}\[\](),:;]/;e.languages.php={delimiter:{pattern:/\?>$|^<\?(?:php(?=\s)|=)?/i,alias:"important"},comment:t,variable:/\$+(?:\w+\b|(?=\{))/,package:{pattern:/(namespace\s+|use\s+(?:function\s+)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,lookbehind:!0,inside:{punctuation:/\\/}},"class-name-definition":{pattern:/(\b(?:class|enum|interface|trait)\s+)\b[a-z_]\w*(?!\\)\b/i,lookbehind:!0,alias:"class-name"},"function-definition":{pattern:/(\bfunction\s+)[a-z_]\w*(?=\s*\()/i,lookbehind:!0,alias:"function"},keyword:[{pattern:/(\(\s*)\b(?:array|bool|boolean|float|int|integer|object|string)\b(?=\s*\))/i,alias:"type-casting",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)\b(?:array(?!\s*\()|bool|callable|(?:false|null)(?=\s*\|)|float|int|iterable|mixed|object|self|static|string)\b(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b(?:array(?!\s*\()|bool|callable|(?:false|null)(?=\s*\|)|float|int|iterable|mixed|never|object|self|static|string|void)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/\b(?:array(?!\s*\()|bool|float|int|iterable|mixed|object|string|void)\b/i,alias:"type-declaration",greedy:!0},{pattern:/(\|\s*)(?:false|null)\b|\b(?:false|null)(?=\s*\|)/i,alias:"type-declaration",greedy:!0,lookbehind:!0},{pattern:/\b(?:parent|self|static)(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(\byield\s+)from\b/i,lookbehind:!0},/\bclass\b/i,{pattern:/((?:^|[^\s>:]|(?:^|[^-])>|(?:^|[^:]):)\s*)\b(?:abstract|and|array|as|break|callable|case|catch|clone|const|continue|declare|default|die|do|echo|else|elseif|empty|enddeclare|endfor|endforeach|endif|endswitch|endwhile|enum|eval|exit|extends|final|finally|fn|for|foreach|function|global|goto|if|implements|include|include_once|instanceof|insteadof|interface|isset|list|match|namespace|never|new|or|parent|print|private|protected|public|readonly|require|require_once|return|self|static|switch|throw|trait|try|unset|use|var|while|xor|yield|__halt_compiler)\b/i,lookbehind:!0}],"argument-name":{pattern:/([(,]\s*)\b[a-z_]\w*(?=\s*:(?!:))/i,lookbehind:!0},"class-name":[{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self|\s+static))\s+|\bcatch\s*\()\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/(\|\s*)\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/\b[a-z_]\w*(?!\\)\b(?=\s*\|)/i,greedy:!0},{pattern:/(\|\s*)(?:\\?\b[a-z_]\w*)+\b/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(?:\\?\b[a-z_]\w*)+\b(?=\s*\|)/i,alias:"class-name-fully-qualified",greedy:!0,inside:{punctuation:/\\/}},{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self\b|\s+static\b))\s+|\bcatch\s*\()(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*\$)/i,alias:"type-declaration",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-declaration"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*::)/i,alias:["class-name-fully-qualified","static-context"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/([(,?]\s*)[a-z_]\w*(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-hint"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b[a-z_]\w*(?!\\)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:["class-name-fully-qualified","return-type"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:n,function:{pattern:/(^|[^\\\w])\\?[a-z_](?:[\w\\]*\w)?(?=\s*\()/i,lookbehind:!0,inside:{punctuation:/\\/}},property:{pattern:/(->\s*)\w+/,lookbehind:!0},number:a,operator:r,punctuation:i};var s={pattern:/\{\$(?:\{(?:\{[^{}]+\}|[^{}]+)\}|[^{}])+\}|(^|[^\\{])\$+(?:\w+(?:\[[^\r\n\[\]]+\]|->\w+)?)/,lookbehind:!0,inside:e.languages.php},l=[{pattern:/<<<'([^']+)'[\r\n](?:.*[\r\n])*?\1;/,alias:"nowdoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<'[^']+'|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<'?|[';]$/}}}},{pattern:/<<<(?:"([^"]+)"[\r\n](?:.*[\r\n])*?\1;|([a-z_]\w*)[\r\n](?:.*[\r\n])*?\2;)/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<(?:"[^"]+"|[a-z_]\w*)|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<"?|[";]$/}},interpolation:s}},{pattern:/`(?:\\[\s\S]|[^\\`])*`/,alias:"backtick-quoted-string",greedy:!0},{pattern:/'(?:\\[\s\S]|[^\\'])*'/,alias:"single-quoted-string",greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,alias:"double-quoted-string",greedy:!0,inside:{interpolation:s}}];e.languages.insertBefore("php","variable",{string:l,attribute:{pattern:/#\[(?:[^"'\/#]|\/(?![*/])|\/\/.*$|#(?!\[).*$|\/\*(?:[^*]|\*(?!\/))*\*\/|"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*')+\](?=\s*[a-z$#])/im,greedy:!0,inside:{"attribute-content":{pattern:/^(#\[)[\s\S]+(?=\]$)/,lookbehind:!0,inside:{comment:t,string:l,"attribute-class-name":[{pattern:/([^:]|^)\b[a-z_]\w*(?!\\)\b/i,alias:"class-name",greedy:!0,lookbehind:!0},{pattern:/([^:]|^)(?:\\?\b[a-z_]\w*)+/i,alias:["class-name","class-name-fully-qualified"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:n,number:a,operator:r,punctuation:i}},delimiter:{pattern:/^#\[|\]$/,alias:"punctuation"}}}}),e.hooks.add("before-tokenize",(function(t){/<\?/.test(t.code)&&e.languages["markup-templating"].buildPlaceholders(t,"php",/<\?(?:[^"'/#]|\/(?![*/])|("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|(?:\/\/|#(?!\[))(?:[^?\n\r]|\?(?!>))*(?=$|\?>|[\r\n])|#\[|\/\*(?:[^*]|\*(?!\/))*(?:\*\/|$))*?(?:\?>|$)/g)})),e.hooks.add("after-tokenize",(function(t){e.languages["markup-templating"].tokenizePlaceholders(t,"php")}))}(t),function(e){var t=/[*&][^\s[\]{},]+/,n=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,a="(?:"+n.source+"(?:[ \t]+"+t.source+")?|"+t.source+"(?:[ \t]+"+n.source+")?)",r="(?:[^\\s\\x00-\\x08\\x0e-\\x1f!\"#%&'*,\\-:>?@[\\]`{|}\\x7f-\\x84\\x86-\\x9f\\ud800-\\udfff\\ufffe\\uffff]|[?:-])(?:[ \t]*(?:(?![#:])|:))*".replace(//g,(function(){return"[^\\s\\x00-\\x08\\x0e-\\x1f,[\\]{}\\x7f-\\x84\\x86-\\x9f\\ud800-\\udfff\\ufffe\\uffff]"})),i="\"(?:[^\"\\\\\r\n]|\\\\.)*\"|'(?:[^'\\\\\r\n]|\\\\.)*'";function s(e,t){t=(t||"").replace(/m/g,"")+"m";var n="([:\\-,[{]\\s*(?:\\s<>[ \t]+)?)(?:<>)(?=[ \t]*(?:$|,|\\]|\\}|(?:[\r\n]\\s*)?#))".replace(/<>/g,(function(){return a})).replace(/<>/g,(function(){return e}));return RegExp(n,t)}e.languages.yaml={scalar:{pattern:RegExp("([\\-:]\\s*(?:\\s<>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\\S[^\r\n]*(?:\\2[^\r\n]+)*)".replace(/<>/g,(function(){return a}))),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp("((?:^|[:\\-,[{\r\n?])[ \t]*(?:<>[ \t]+)?)<>(?=\\s*:\\s)".replace(/<>/g,(function(){return a})).replace(/<>/g,(function(){return"(?:"+r+"|"+i+")"}))),lookbehind:!0,greedy:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:s("\\d{4}-\\d\\d?-\\d\\d?(?:[tT]|[ \t]+)\\d\\d?:\\d{2}:\\d{2}(?:\\.\\d*)?(?:[ \t]*(?:Z|[-+]\\d\\d?(?::\\d{2})?))?|\\d{4}-\\d{2}-\\d{2}|\\d\\d?:\\d{2}(?::\\d{2}(?:\\.\\d*)?)?"),lookbehind:!0,alias:"number"},boolean:{pattern:s("false|true","i"),lookbehind:!0,alias:"important"},null:{pattern:s("null|~","i"),lookbehind:!0,alias:"important"},string:{pattern:s(i),lookbehind:!0,greedy:!0},number:{pattern:s("[+-]?(?:0x[\\da-f]+|0o[0-7]+|(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:e[+-]?\\d+)?|\\.inf|\\.nan)","i"),lookbehind:!0},tag:n,important:t,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},e.languages.yml=e.languages.yaml}(t),t.manual=!0;const n=e({mounted(){t.highlightAll(this.$el)},updated(){t.highlightAll(this.$el)},render(){return this.$scopedSlots.default({})}},null,null,!1,null,null,null,null).exports;export{n as default}; diff --git a/kirby/panel/dist/js/IndexView.min.js b/kirby/panel/dist/js/IndexView.min.js new file mode 100644 index 0000000..b6a13b3 --- /dev/null +++ b/kirby/panel/dist/js/IndexView.min.js @@ -0,0 +1 @@ +import{n as e}from"./index.min.js";import"./vendor.min.js";const t=e({props:{categories:Array,info:String,tab:String}},(function(){var e=this,t=e._self._c;return t("k-panel-inside",{staticClass:"k-lab-index-view"},[t("k-header",[e._v("Lab")]),t("k-tabs",{attrs:{tab:e.tab,tabs:[{name:"examples",label:"Examples",link:"/lab"},{name:"docs",label:"Docs",link:"/lab/docs"}]}}),e.info?t("k-box",{attrs:{icon:"question",theme:"info",text:e.info,html:!0}}):e._e(),e._l(e.categories,(function(e){return t("k-section",{key:e.name,attrs:{headline:e.name}},[t("k-collection",{attrs:{items:e.examples,empty:{icon:e.icon,text:"Add examples to "+e.path}}})],1)}))],2)}),[],!1,null,null,null,null).exports;export{t as default}; diff --git a/kirby/panel/dist/js/PlaygroundView.min.js b/kirby/panel/dist/js/PlaygroundView.min.js new file mode 100644 index 0000000..0254521 --- /dev/null +++ b/kirby/panel/dist/js/PlaygroundView.min.js @@ -0,0 +1 @@ +import{D as t}from"./Docs.min.js";import{n as e}from"./index.min.js";import"./vendor.min.js";const n=e({props:{docs:Object},emits:["cancel"],computed:{options(){const t=[{icon:"expand",link:"lab/docs/"+this.docs.component}];return this.docs.github&&t.unshift({icon:"github",link:this.docs.github,target:"_blank"}),t}}},(function(){var t=this,e=t._self._c;return e("k-drawer",t._b({ref:"drawer",staticClass:"k-form-drawer",attrs:{options:t.options},on:{submit:function(e){return t.$emit("cancel")}}},"k-drawer",t.$attrs,!1),[e("k-lab-docs",t._b({},"k-lab-docs",t.docs,!1))],1)}),[],!1,null,null,null,null).exports;const l=e({props:{code:{type:Boolean,default:!0},label:String,flex:Boolean},data:()=>({mode:"preview"}),computed:{component(){return window.UiExamples[this.label]}}},(function(){var t=this,e=t._self._c;return e("div",{staticClass:"k-lab-example",attrs:{"data-flex":t.flex,tabindex:"0"}},[e("header",{staticClass:"k-lab-example-header"},[e("h3",{staticClass:"k-lab-example-label"},[t._v(t._s(t.label))]),t.code?e("k-button-group",{staticClass:"k-lab-example-inspector",attrs:{layout:"collapsed"}},[e("k-button",{attrs:{theme:"preview"===t.mode?"info":null,icon:"preview",size:"xs",title:"Preview"},on:{click:function(e){t.mode="preview"}}}),e("k-button",{attrs:{theme:"inspect"===t.mode?"info":null,icon:"code",size:"xs",title:"Vue code"},on:{click:function(e){t.mode="inspect"}}})],1):t._e()],1),"preview"===t.mode?e("div",{staticClass:"k-lab-example-canvas"},[t._t("default")],2):t._e(),"inspect"===t.mode?e("div",{staticClass:"k-lab-example-code"},[e("k-code",{attrs:{language:"html"}},[t._v(t._s(t.component))])],1):t._e()])}),[],!1,null,null,null,null).exports;const a=e({},(function(){return(0,this._self._c)("div",{staticClass:"k-lab-examples"},[this._t("default")],2)}),[],!1,null,null,null,null).exports;const o=e({methods:{submit(t){const e=Object.fromEntries(new FormData(t));this.$panel.dialog.open({component:"k-lab-output-dialog",props:{code:JSON.stringify(e,null,2)}})}}},(function(){var t=this,e=t._self._c;return e("form",{staticClass:"k-lab-form",on:{submit:function(e){return e.preventDefault(),t.submit(e.target)}}},[t._t("default"),e("footer",[e("k-button",{attrs:{type:"submit",icon:"check",theme:"positive",variant:"filled"}},[t._v(" Submit ")])],1)],2)}),[],!1,null,null,null,null).exports;const s=e({props:{code:String,language:{default:"js",type:String}},emits:["cancel"]},(function(){var t=this,e=t._self._c;return e("k-dialog",t._b({attrs:{size:"large","cancel-button":!1,"submit-button":!1},on:{cancel:function(e){return t.$emit("cancel")}}},"k-dialog",t.$attrs,!1),[e("k-code",{attrs:{language:t.language}},[t._v(t._s(t.code))])],1)}),[],!1,null,null,null,null).exports;const i=e({},(function(){var t=this._self._c;return t("div",{staticClass:"k-table"},[t("table",[t("tbody",[t("tr",[t("td",{staticClass:"k-table-cell",attrs:{"data-mobile":"true"}},[this._t("default")],2)])])])])}),[],!1,null,null,null,null).exports;Vue.component("k-lab-docs",t),Vue.component("k-lab-docs-drawer",n),Vue.component("k-lab-example",l),Vue.component("k-lab-examples",a),Vue.component("k-lab-form",o),Vue.component("k-lab-output-dialog",s),Vue.component("k-lab-table-cell",i);const r=e({props:{docs:String,examples:[Object,Array],file:String,github:String,props:[Object,Array],styles:String,tab:String,tabs:{type:Array,default:()=>[]},template:String,title:String},data:()=>({component:null}),watch:{tab:{handler(){this.createComponent()},immediate:!0}},mounted(){this.$panel.view.path.replace(/lab\//,"")},methods:{async createComponent(){if(!this.file)return;const{default:t}=await import(this.$panel.url(this.file)+"?cache="+Date.now());t.template=this.template,this.component={...t},window.UiExamples=this.examples},openDocs(){this.$panel.drawer.open(`lab/docs/${this.docs}`)},async reloadComponent(){await this.$panel.view.refresh(),this.createComponent()},reloadDocs(){this.$panel.drawer.isOpen&&this.$panel.drawer.refresh()}}},(function(){var t=this,e=t._self._c;return e("k-panel-inside",{staticClass:"k-lab-playground-view",attrs:{"data-has-tabs":t.tabs.length>1}},[e("k-header",{scopedSlots:t._u([{key:"buttons",fn:function(){return[t.docs||t.github?e("k-button-group",[t.docs?e("k-button",{attrs:{text:t.docs,icon:"book",size:"sm",variant:"filled"},on:{click:t.openDocs}}):t._e(),t.github?e("k-button",{attrs:{link:t.github,icon:"github",size:"sm",target:"_blank",variant:"filled"}}):t._e()],1):t._e()]},proxy:!0}])},[t._v(" "+t._s(t.title)+" ")]),e("k-tabs",{attrs:{tab:t.tab,tabs:t.tabs}}),t.component?e(t.component,t._b({tag:"component"},"component",t.props,!1)):t._e(),t.styles?e("style",{tag:"component",domProps:{innerHTML:t._s(t.styles)}}):t._e()],1)}),[],!1,null,null,null,null).exports;export{r as default}; diff --git a/kirby/panel/dist/js/container-query-polyfill.modern.min.js b/kirby/panel/dist/js/container-query-polyfill.modern.min.js new file mode 100644 index 0000000..ddb773d --- /dev/null +++ b/kirby/panel/dist/js/container-query-polyfill.modern.min.js @@ -0,0 +1 @@ +function e(){return e=Object.assign?Object.assign.bind():function(e){for(var t=1;t0?{type:2,value:n/r}:{type:1};case 6:return null!=n&&null!=r?{type:4,value:r>=n?"portrait":"landscape"}:{type:1}}}function n(e,t){switch(e.type){case 1:case 2:case 3:case 4:return i(e,t);case 5:{const n=t.sizeFeatures.get(e.feature);return null==n?{type:1}:n}case 6:return e.value}}function r(e){return{type:5,value:e}}function u(e,t,n){return r(function(e,t,n){switch(n){case 1:return e===t;case 2:return e>t;case 3:return e>=t;case 4:return ee*t))}return null}function c(e,t){switch(e.type){case 2:return 0===e.value?0:null;case 3:return l(e,t)}return null}function i(e,t){switch(e.type){case 4:return function(e,t){const o=n(e.left,t),s=n(e.right,t),l=e.operator;if(4===o.type&&4===s.type||5===o.type&&5===s.type)return i=o,a=s,1===l?r(i.value===a.value):{type:1};var i,a;if(3===o.type||3===s.type){const e=c(o,t),n=c(s,t);if(null!=e&&null!=n)return u(e,n,l)}else if(2===o.type&&2===s.type)return u(o.value,s.value,l);return{type:1}}(e,t);case 2:return function(e,t){const n=i(e.left,t);return 5!==n.type||!0!==n.value?n:i(e.right,t)}(e,t);case 3:return function(e,t){const n=i(e.left,t);return 5===n.type&&!0===n.value?n:i(e.right,t)}(e,t);case 1:{const n=i(e.value,t);return 5===n.type?{type:5,value:!n.value}:{type:1}}case 5:return a(n(e,t));case 6:return a(e.value)}}function a(e){switch(e.type){case 5:return e;case 2:case 3:return{type:5,value:e.value>0}}return{type:1}}const f=Array.from({length:4},(()=>Math.floor(256*Math.random()).toString(16))).join(""),p=S("container"),y=S("container-type"),h=S("container-name"),v=`data-cqs-${f}`,d=`data-cqc-${f}`,m=S("cqw"),w=S("cqh"),g=S("cqi"),b=S("cqb");function S(e){return`--cq-${e}-${f}`}const x=Symbol();function q(e,t){const n={value:t,errorIndices:[],index:-1,at(r){const u=n.index+r;return u>=e.length?t:e[u]},consume:e=>(n.index+=e,n.value=n.at(0),n.value),reconsume(){n.index-=1},error(){n.errorIndices.push(n.index)}};return n}function C(e){return q(e,{type:0})}function*$(e){const t=[];let n=!1;for(const b of e){const e=b.codePointAt(0);n&&10!==e&&(n=!1,t.push(10)),0===e||e>=55296&&e<=57343?t.push(65533):13===e?n=!0:t.push(e)}const r=q(t,-1),{at:u,consume:o,error:s,reconsume:l}=r;function c(){return String.fromCodePoint(r.value)}function i(){return{type:13,value:c()}}function a(){for(;z(u(1));)o(1)}function f(){for(;-1!==r.value;)if(o(1),42===u(0)&&47===u(1))return void o(1);s()}function p(){const[e,t]=function(){let e=0,t="",n=u(1);for(43!==n&&45!==n||(o(1),t+=c());k(u(1));)o(1),t+=c();if(46===u(1)&&k(u(2)))for(e=1,o(1),t+=c();k(u(1));)o(1),t+=c();if(n=u(1),69===n||101===n){const n=u(2);if(k(n))for(e=1,o(1),t+=c();k(u(1));)o(1),t+=c();else if((45===n||43===n)&&k(u(3)))for(e=1,o(1),t+=c(),o(1),t+=c();k(u(1));)o(1),t+=c()}return[t,e]}(),n=u(1);return d(n,u(1),u(2))?{type:15,value:e,flag:t,unit:w()}:37===n?(o(1),{type:16,value:e}):{type:17,value:e,flag:t}}function y(){const e=w();let t=u(1);if("url"===e.toLowerCase()&&40===t){for(o(1);z(u(1))&&z(u(2));)o(1);t=u(1);const n=u(2);return 34===t||39===t?{type:23,value:e}:!z(t)||34!==n&&39!==n?function(){let e="";for(a();;){const n=o(1);if(41===n)return{type:20,value:e};if(-1===n)return s(),{type:20,value:e};if(z(n)){a();const t=u(1);return 41===t||-1===t?(o(1),-1===n&&s(),{type:20,value:e}):(g(),{type:21})}if(34===n||39===n||40===n||(t=n)>=0&&t<=8||11===t||t>=14&&t<=31||127===t)return s(),g(),{type:21};if(92===n){if(!j(n,u(1)))return s(),{type:21};e+=v()}else e+=c()}var t}():{type:23,value:e}}return 40===t?(o(1),{type:23,value:e}):{type:24,value:e}}function h(e){let t="";for(;;){const n=o(1);if(-1===n||n===e)return-1===n&&s(),{type:2,value:t};if(E(n))return s(),l(),{type:3};if(92===n){const e=u(1);if(-1===e)continue;E(e)?o(1):t+=v()}else t+=c()}}function v(){const e=o(1);if(A(e)){const t=[e];for(let e=0;e<5;e++){const e=u(1);if(!A(e))break;t.push(e),o(1)}z(u(1))&&o(1);let n=parseInt(String.fromCodePoint(...t),16);return(0===n||n>=55296&&n<=57343||n>1114111)&&(n=65533),String.fromCodePoint(n)}return-1===e?(s(),String.fromCodePoint(65533)):c()}function d(e,t,n){return 45===e?L(t)||45===t||j(t,n):!!L(e)}function m(e,t,n){return 43===e||45===e?k(t)||46===t&&k(n):!(46!==e||!k(t))||!!k(e)}function w(){let e="";for(;;){const t=o(1);if(M(t))e+=c();else{if(!j(t,u(1)))return l(),e;e+=v()}}}function g(){for(;;){const e=o(1);if(-1===e)return;j(e,u(1))&&v()}}for(;;){const e=o(1);if(47===e&&42===u(1))o(2),f();else if(z(e))a(),yield{type:1};else if(34===e)yield h(e);else if(35===e){const e=u(1);M(e)||j(e,u(2))?yield{type:14,flag:d(u(1),u(2),u(3))?1:0,value:w()}:yield i()}else if(39===e)yield h(e);else if(40===e)yield{type:4};else if(41===e)yield{type:5};else if(43===e)m(e,u(1),u(2))?(l(),yield p()):yield i();else if(44===e)yield{type:6};else if(45===e){const t=u(1),n=u(2);m(e,t,n)?(l(),yield p()):45===t&&62===n?(o(2),yield{type:19}):d(e,t,n)?(l(),yield y()):yield i()}else if(46===e)m(e,u(1),u(2))?(l(),yield p()):yield i();else if(58===e)yield{type:7};else if(59===e)yield{type:8};else if(60===e)33===u(1)&&45===u(2)&&45===u(3)?yield{type:18}:yield i();else if(64===e)if(d(u(1),u(2),u(3))){const e=w();yield{type:22,value:e}}else yield i();else if(91===e)yield{type:9};else if(92===e)j(e,u(1))?(l(),yield y()):(s(),yield i());else if(93===e)yield{type:10};else if(123===e)yield{type:11};else if(125===e)yield{type:12};else if(k(e))l(),yield p();else if(L(e))l(),yield y();else{if(-1===e)return yield{type:0},r.errorIndices;yield{type:13,value:c()}}}}function k(e){return e>=48&&e<=57}function A(e){return k(e)||e>=65&&e<=70||e>=97&&e<=102}function E(e){return 10===e||13===e||12===e}function z(e){return E(e)||9===e||32===e}function L(e){return e>=65&&e<=90||e>=97&&e<=122||e>=128||95===e}function j(e,t){return 92===e&&!E(t)}function M(e){return L(e)||k(e)||45===e}const T={11:12,9:10,4:5};function P(t,n){const r=function(e,t){const n=[];for(;;)switch(e.consume(1).type){case 1:break;case 0:return{type:3,value:n};case 18:case 19:if(!1!==t){e.reconsume();const t=U(e);t!==x&&n.push(t)}break;case 22:e.reconsume(),n.push(F(e));break;default:{e.reconsume();const t=U(e);t!==x&&n.push(t);break}}}(C(t),!0===n);return e({},r,{value:r.value.map((t=>{return 26===t.type?0===(n=t).value.value.type?e({},n,{value:e({},n.value,{value:(r=n.value.value.value,function(e){const t=[],n=[];for(;;){const r=e.consume(1);switch(r.type){case 1:case 8:break;case 0:return{type:1,value:[...n,...t]};case 22:e.reconsume(),t.push(F(e));break;case 24:{const t=[r];let u=e.at(1);for(;8!==u.type&&0!==u.type;)t.push(I(e)),u=e.at(1);const o=R(C(t));o!==x&&n.push(o);break}case 13:if("&"===r.value){e.reconsume();const n=U(e);n!==x&&t.push(n);break}default:{e.error(),e.reconsume();let t=e.at(1);for(;8!==t.type&&0!==t.type;)I(e),t=e.at(1);break}}}}(C(r)))})}):n:t;var n,r}))})}function N(e){const t=C(e),n=[];for(;;){if(0===t.consume(1).type)return n;t.reconsume(),n.push(I(t))}}function O(e){for(;1===e.at(1).type;)e.consume(1)}function F(e){let t=e.consume(1);if(22!==t.type)throw new Error(`Unexpected type ${t.type}`);const n=t.value,r=[];for(;;)switch(t=e.consume(1),t.type){case 8:return{type:25,name:n,prelude:r,value:null};case 0:return e.error(),{type:25,name:n,prelude:r,value:null};case 11:return{type:25,name:n,prelude:r,value:Q(e)};case 28:if(11===t.source.type)return{type:25,name:n,prelude:r,value:t};default:e.reconsume(),r.push(I(e))}}function U(e){let t=e.value;const n=[];for(;;)switch(t=e.consume(1),t.type){case 0:return e.error(),x;case 11:return{type:26,prelude:n,value:Q(e)};case 28:if(11===t.source.type)return{type:26,prelude:n,value:t};default:e.reconsume(),n.push(I(e))}}function R(e){const t=e.consume(1);if(24!==t.type)throw new Error(`Unexpected type ${t.type}`);const n=t.value,r=[];let u=!1;if(O(e),7!==e.at(1).type)return e.error(),x;for(e.consume(1),O(e);0!==e.at(1).type;)r.push(I(e));const o=r[r.length-2],s=r[r.length-1];return o&&13===o.type&&"!"===o.value&&24===s.type&&"important"===s.value.toLowerCase()&&(u=!0,r.splice(r.length-2)),{type:29,name:n,value:r,important:u}}function I(e){const t=e.consume(1);switch(t.type){case 11:case 9:case 4:return Q(e);case 23:return function(e){let t=e.value;if(23!==t.type)throw new Error(`Unexpected type ${t.type}`);const n=t.value,r=[];for(;;)switch(t=e.consume(1),t.type){case 5:return{type:27,name:n,value:r};case 0:return e.error(),{type:27,name:n,value:r};default:e.reconsume(),r.push(I(e))}}(e);default:return t}}function Q(e){let t=e.value;const n=t,r=T[n.type];if(!r)throw new Error(`Unexpected type ${t.type}`);const u=[];for(;;)switch(t=e.consume(1),t.type){case r:return{type:28,source:n,value:{type:0,value:u}};case 0:return e.error(),{type:28,source:n,value:{type:0,value:u}};default:e.reconsume(),u.push(I(e))}}function H(e){return O(e),0===e.at(1).type}const V={11:["{","}"],9:["[","]"],4:["(",")"]};function D(e,t){switch(e.type){case 25:return`@${CSS.escape(e.name)} ${e.prelude.map((e=>D(e))).join("")}${e.value?D(e.value):";"}`;case 26:return`${e.prelude.map((e=>D(e))).join("")}${D(e.value)}`;case 28:{const[t,n]=V[e.source.type];return`${t}${W(e.value)}${n}`}case 27:return`${CSS.escape(e.name)}(${e.value.map((e=>D(e))).join("")})`;case 29:return`${CSS.escape(e.name)}:${e.value.map((e=>D(e))).join("")}${e.important?" !important":""}`;case 1:return" ";case 8:return";";case 7:return":";case 14:return"#"+CSS.escape(e.value);case 24:return CSS.escape(e.value);case 15:return e.value+CSS.escape(e.unit);case 13:case 17:return e.value;case 2:return`"${CSS.escape(e.value)}"`;case 6:return",";case 20:return"url("+CSS.escape(e.value)+")";case 22:return"@"+CSS.escape(e.value);case 16:return e.value+"%";default:throw new Error(`Unsupported token ${e.type}`)}}function W(e,t){return e.value.map((t=>{let n=D(t);return 29===t.type&&0!==e.type&&(n+=";"),n})).join("")}function _(e){return D(e)}function B(e){const t=e.at(1);return 13===t.type&&"="===t.value&&(e.consume(1),!0)}function G(e,t){const n=[];for(;;){const r=e.at(1);if(0===r.type||t&&7===r.type||13===r.type&&(">"===r.value||"<"===r.value||"="===r.value))break;n.push(e.consume(1))}return n}function Y(e){O(e);const t=e.consume(1);return 13!==t.type?x:">"===t.value?B(e)?3:2:"<"===t.value?B(e)?5:4:"="===t.value?1:x}function J(e){return 4===e||5===e}function K(e){return 2===e||3===e}function X(e,t,n){const r=function(e){O(e);const t=e.consume(1);return O(e),24!==t.type||0!==e.at(1).type?x:t.value}(C(e));if(r===x)return x;let u=r.toLowerCase();return u=n?n(u):u,t.has(u)?u:x}function Z(e){return{type:13,value:e}}function ee(e,t){return{type:29,name:e,value:t,important:!1}}function te(e){return{type:24,value:e}}function ne(e,t){return{type:27,name:e,value:t}}function re(e){return ne("var",[te(e)])}function ue(e,t){O(e);let n=!1,r=e.at(1);if(24===r.type){if("not"!==r.value.toLowerCase())return x;e.consume(1),O(e),n=!0}let u=function(e){const t=e.consume(1);switch(t.type){case 28:{if(4!==t.source.type)return x;const e=ue(C(t.value.value),null);return e!==x?e:{type:4,value:t}}case 27:return{type:4,value:t};default:return x}}(e);if(u===x)return x;u=n?{type:1,value:u}:u,O(e),r=e.at(1);const o=24===r.type?r.value.toLowerCase():null;if(null!==o){if(e.consume(1),O(e),"and"!==o&&"or"!==o||null!==t&&o!==t)return x;const n=ue(e,o);return n===x?x:{type:"and"===o?2:3,left:u,right:n}}return H(e)?u:x}function oe(e){return ue(e,null)}function se(e){switch(e.type){case 1:return[te("not"),{type:1},...se(e.value)];case 2:case 3:return[...se(e.left),{type:1},te(2===e.type?"and":"or"),{type:1},...se(e.right)];case 4:return[e.value]}}const le={width:1,height:2,"inline-size":3,"block-size":4,"aspect-ratio":5,orientation:6},ce=new Set(Object.keys(le)),ie=new Set(["none","and","not","or","normal","auto"]),ae=new Set(["initial","inherit","revert","revert-layer","unset"]),fe=new Set(["size","inline-size"]);function pe(e,t,n,r){const u=n();if(u===x)return x;let o=[u,null];O(e);const s=e.at(1);if(13===s.type){if(s.value!==t)return x;e.consume(1),O(e);const n=r();O(e),n!==x&&(o=[u,n])}return H(e)?o:x}function ye(e){const t=e.consume(1);return 17===t.type?parseInt(t.value):x}function he(e){const t=C(e);O(t);const n=t.consume(1);let r=x;switch(n.type){case 17:t.reconsume(),r=function(e){const t=pe(e,"/",(()=>ye(e)),(()=>ye(e)));return t===x?x:{type:2,value:t[0]/(null!==t[1]?t[1]:1)}}(t);break;case 15:r={type:3,value:parseInt(n.value),unit:n.unit.toLowerCase()};break;case 24:{const e=n.value.toLowerCase();switch(e){case"landscape":case"portrait":r={type:4,value:e}}}}return r===x?x:H(t)?{type:6,value:r}:x}function ve(e){return!we(e=e.toLowerCase())&&!ie.has(e)}function de(e,t){const n=[];for(;;){O(e);const r=e.at(1);if(24!==r.type||!t(r.value))return n;e.consume(1),n.push(r.value)}}function me(e){const t=[];for(;;){O(e);const n=e.at(1);if(24!==n.type)break;const r=n.value;if(!ve(r))break;e.consume(1),t.push(r)}return t}function we(e){return ae.has(e)}function ge(e){return e.map((e=>"cq-"+e))}function be(e){const t=de(e,(e=>we(e)));return 1===t.length?ge(t):x}function Se(e,t){const n=de(e,(e=>"none"===e));if(1===n.length)return ge(n);if(0!==n.length)return x;if(t){const t=be(e);if(t!==x)return t}const r=me(e);return r.length>0&&(!t||H(e))?r:x}function xe(e,t){if(t){const t=be(e);if(t!==x)return t}return function(e){const t=de(e,(e=>"normal"===e));if(1===t.length)return ge(t);if(0!==t.length)return x;const n=de(e,(e=>fe.has(e)));return n.length>0&&H(e)?n:x}(e)}function qe(e){const t=C(e),n=be(t);if(n!==x)return[n,n];const r=pe(t,"/",(()=>Se(t,!1)),(()=>xe(t,!1)));return r!==x&&H(t)?[r[0],r[1]||[]]:x}function Ce(e){const t=C(e),n=me(t);if(!n||n.length>1)return x;const r=oe(t);if(r===x)return x;const u={features:new Set},o=$e(r,u);return H(t)?{name:n.length>0?n[0]:null,condition:o,features:u.features}:x}function $e(e,t){switch(e.type){case 1:return{type:1,value:$e(e.value,t)};case 2:case 3:return{type:2===e.type?2:3,left:$e(e.left,t),right:$e(e.right,t)};case 4:if(28===e.value.type){const n=function(e,t){const n=function(e,t){const n=G(e,!0),r=e.at(1);if(0===r.type){const e=X(n,t);return e!==x&&t.has(e)?{type:1,feature:e}:x}if(7===r.type){e.consume(1);const r=G(e,!1);let u=1;const o=X(n,t,(e=>e.startsWith("min-")?(u=3,e.substring(4)):e.startsWith("max-")?(u=5,e.substring(4)):e));return o!==x?{type:2,feature:o,bounds:[null,[u,r]]}:x}const u=Y(e);if(u===x)return x;const o=G(e,!1);if(0===e.at(1).type){const e=X(n,t);if(e!==x)return{type:2,feature:e,bounds:[null,[u,o]]};const r=X(o,t);return r!==x?{type:2,feature:r,bounds:[[u,n],null]}:x}const s=Y(e);if(s===x||!(K(u)&&K(s)||J(u)&&J(s)))return x;const l=G(e,!1),c=X(o,t);return c!==x?{type:2,feature:c,bounds:[[u,n],[s,l]]}:x}(e,ce);if(n===x)return x;const r=le[n.feature];if(null==r)return x;if(t.features.add(r),1===n.type)return{type:5,feature:r};{const e={type:5,feature:r};let t=x;if(null!==n.bounds[0]){const r=he(n.bounds[0][1]);if(r===x)return x;t={type:4,operator:n.bounds[0][0],left:r,right:e}}if(null!==n.bounds[1]){const r=he(n.bounds[1][1]);if(r===x)return x;const u={type:4,operator:n.bounds[1][0],left:e,right:r};t=t!==x?{type:2,left:t,right:u}:u}return t}}(C(e.value.value.value),t);if(n!==x)return n}return{type:6,value:{type:1}}}}let ke=0;const Ae={cqw:m,cqh:w,cqi:g,cqb:b},Ee=CSS.supports("selector(:where(div))"),ze=":not(.container-query-polyfill)";N(Array.from($(ze)));const Le=document.createElement("div"),je=new Set(["before","after","first-line","first-letter"]);function Me(e,t){return ne("calc",[{type:17,flag:e.flag,value:e.value},Z("*"),t])}function Te(t){return t.map((t=>{switch(t.type){case 15:return function(e){const t=e.unit,n=Ae[t];return null!=n?Me(e,re(n)):"cqmin"===t||"cqmax"===t?Me(e,ne(e.unit.slice(2),[re(g),{type:6},re(b)])):e}(t);case 27:return e({},t,{value:Te(t.value)})}return t}))}function Pe(t){switch(t.name){case"container":return qe(t.value)?e({},t,{name:p}):t;case"container-name":return Se(C(t.value),!0)?e({},t,{name:h}):t;case"container-type":return null!=xe(C(t.value),!0)?e({},t,{name:y}):t}return e({},t,{value:Te(t.value)})}function Ne(t,n){return e({},t,{value:t.value.map((t=>{switch(t.type){case 25:return Qe(t,n);case 26:return r=t,(u=n).transformStyleRule(e({},r,{value:Ue(r.value,u)}));default:return t}var r,u}))})}function Oe(e){return 0===e.type||6===e.type}function Fe(e){for(let t=e.length-1;t>=0;t--)if(1!==e[t].type)return e.slice(0,t+1);return e}function Ue(t,n){return function(t,n){const r=[];let u=null,o=null;for(const e of t.value.value)switch(e.type){case 25:{const t=n?n(e):e;t&&r.push(t)}break;case 29:{const t=Pe(e);switch(t.name){case p:{const t=qe(e.value);t!==x&&(u=t[0],o=t[1]);break}case h:{const t=Se(C(e.value),!0);t!==x&&(u=t);break}case y:{const t=xe(C(e.value),!0);t!==x&&(o=t);break}default:r.push(t)}}}return u&&u.length>0&&r.push(ee(h,[te(u.join(" "))])),o&&o.length>0&&r.push(ee(y,[te(o.join(" "))])),e({},t,{value:{type:2,value:r}})}(t,(e=>Qe(e,n)))}function Re(t){if(1===t.type)return e({},t,{value:Re(t.value)});if(2===t.type||3===t.type)return e({},t,{left:Re(t.left),right:Re(t.right)});if(4===t.type&&28===t.value.type){const n=function(e){const t=C(e);return O(t),24!==t.at(1).type?x:R(t)||x}(t.value.value.value);if(n!==x)return e({},t,{value:e({},t.value,{value:{type:0,value:[Pe(n)]}})})}return t}function Ie(t,n){let r=oe(C(t.prelude));return r=r!==x?Re(r):x,e({},t,{prelude:r!==x?se(r):t.prelude,value:t.value?e({},t.value,{value:Ne(P(t.value.value.value),n)}):null})}function Qe(t,n){switch(t.name.toLocaleLowerCase()){case"media":case"layer":return u=n,e({},r=t,{value:r.value?e({},r.value,{value:Ne(P(r.value.value.value),u)}):null});case"keyframes":return function(t,n){let r=null;return t.value&&(r=e({},t.value,{value:{type:3,value:P(t.value.value.value).value.map((t=>{switch(t.type){case 26:return u=n,e({},r=t,{value:Ue(r.value,u)});case 25:return Qe(t,n)}var r,u}))}})),e({},t,{value:r})}(t,n);case"supports":return Ie(t,n);case"container":return function(t,n){if(t.value){const r=Ce(t.prelude);if(r!==x){const u={rule:r,selector:null,parent:n.parent,uid:"c"+ke++},o=new Set,s=[],l=Ne(P(t.value.value.value),{descriptors:n.descriptors,parent:u,transformStyleRule:t=>{const[n,r]=function(e,t,n){const r=C(e),u=[],o=[];for(;;){if(0===r.at(1).type)return[u,o];const n=Math.max(0,r.index);for(;l=r.at(1),c=r.at(2),!(Oe(l)||7===l.type&&(7===c.type||24===c.type&&je.has(c.value.toLowerCase())));)r.consume(1);const i=r.index+1,a=e.slice(n,i),f=a.length>0?Fe(a):[Z("*")];for(;!Oe(r.at(1));)r.consume(1);const p=e.slice(i,Math.max(0,r.index+1));let y=f,h=[{type:28,source:{type:9},value:{type:0,value:[te(p.length>0?v:d),Z("~"),Z("="),{type:2,value:t}]}}];if(Ee)h=[Z(":"),ne("where",h)];else{const e=f.map(_).join("");e.endsWith(ze)?y=N(Array.from($(e.substring(0,e.length-ze.length)))):s.push({actual:e,expected:e+ze})}u.push(...f),o.push(...y),o.push(...h),o.push(...p),r.consume(1)}var l,c}(t.prelude,u.uid);if(s.length>0)return t;const l=n.map(_).join("");try{Le.matches(l),o.add(l)}catch(c){}return e({},t,{prelude:r})}}).value;if(s.length>0){const e=new Set,t=[];let n=0;for(const{actual:u}of s)n=Math.max(n,u.length);const r=Array.from({length:n},(()=>" ")).join("");for(const{actual:u,expected:o}of s)e.has(u)||(t.push(`${u}${r.substring(0,n-u.length)} => ${o}`),e.add(u));console.warn(`The :where() pseudo-class is not supported by this browser. To use the Container Query Polyfill, you must modify the selectors under your @container rules:\n\n${t.join("\n")}`)}return o.size>0&&(u.selector=Array.from(o).join(", ")),n.descriptors.push(u),{type:25,name:"media",prelude:[te("all")],value:e({},t.value,{value:{type:3,value:l}})}}}return t}(t,n)}var r,u;return t}class He{constructor(e){this.value=void 0,this.value=e}}function Ve(e,t){if(e===t)return!0;if(typeof e==typeof t&&null!==e&&null!==t&&"object"==typeof e){if(Array.isArray(e)){if(!Array.isArray(t)||t.length!==e.length)return!1;for(let n=0,r=e.length;nthis.styles.getPropertyValue(e)));this.context.viewportChanged({width:e.width,height:e.height})}}function nt(e){const t=new AbortController;return e(t.signal).catch((e=>{if(!(e instanceof DOMException&&"AbortError"===e.message))throw e})),t}function rt(e){let t=0;if(0===e.length)return t;if(e.startsWith("cq-")&&("normal"===(e=e.substring(3))||we(e)))return t;const n=e.split(" ");for(const r of n)switch(r){case"size":t|=3;break;case"inline-size":t|=1;break;default:return 0}return t}function ut(e){let t=0;return"none"!==e&&(t|=1,"contents"===e||"inline"===e||Je.test(e)||(t|=2)),t}function ot(e,t){return parseFloat(e(t))}function st(e,t){return t.reduce(((t,n)=>t+ot(e,n)),0)}function lt(e){let t=0,n=0;return"border-box"===e("box-sizing")&&(t=st(e,Ge),n=st(e,Ye)),{fontSize:ot(e,"font-size"),width:ot(e,"width")-t,height:ot(e,"height")-n}}function ct(e){return{containerType:rt(e(y).trim()),containerNames:(n=e(h).trim(),n.startsWith("cq-")&&("none"===(n=n.substring(3))||we(n))?new Set([]):new Set(0===n.length?[]:n.split(" "))),writingAxis:(t=e("writing-mode").trim(),Be.has(t)?1:0),displayFlags:ut(e("display").trim())};var t,n}function it(e,t,n){null!=n?n!=e.getPropertyValue(t)&&e.setProperty(t,n):e.removeProperty(t)}function at(e){const t=e[We];return null!=t?t:[]}function ft(e,t){e[We]=t}new Promise((e=>{})),window.CQPolyfill={version:"1.0.2"},"container"in document.documentElement.style||function(n){function r(e){return e[De]||null}const u=document.documentElement;if(r(u))return;const o=document.createElement(`cq-polyfill-${f}`),s=document.createElement("style");new MutationObserver((e=>{for(const t of e){for(const e of t.removedNodes){const t=r(e);null==t||t.disconnect()}t.target.nodeType!==Node.DOCUMENT_NODE&&t.target.nodeType!==Node.DOCUMENT_FRAGMENT_NODE&&null===t.target.parentNode||"attributes"===t.type&&t.attributeName&&(t.attributeName===v||t.attributeName===d||t.target instanceof Element&&t.target.getAttribute(t.attributeName)===t.oldValue)||(A(t.target).mutate(),S())}})).observe(u,{childList:!0,subtree:!0,attributes:!0,attributeOldValue:!0});const l=new ResizeObserver((e=>{for(const t of e)A(t.target).resize();A(u).update(C())})),c=new Ke(u);async function a(e,{source:t,url:n,signal:r}){const o=function(e,t){try{const n=Array.from($(e));if(t)for(let e=0;ee};return{source:W(Ne(P(n,!0),r)),descriptors:r.descriptors}}catch(n){return console.warn("An error occurred while transpiling stylesheet: "+n),{source:e,descriptors:[]}}}(t,n?n.toString():void 0);let s=()=>{},l=()=>{};const c=A(u);let i=!1;return null!=r&&r.aborted||(l=()=>{if(!i){const{sheet:t}=e;null!=t&&(ft(t,o.descriptors),i=!0,s=()=>{ft(t),c.mutate(),S()},c.mutate(),S())}}),{source:o.source,dispose:s,refresh:l}}const p={cqw:null,cqh:null};function y({width:e,height:t}){p.cqw=e,p.cqh=t}function h(e,t,n){if(e instanceof Element&&t){let r="";for(const[n,u]of t.conditions){const t=n.value;null!=t.selector&&null!=u&&!(2&~u)&&e.matches(t.selector)&&(r.length>0&&(r+=" "),r+=t.uid)}r.length>0?e.setAttribute(n,r):e.removeAttribute(n)}}function S(){l.unobserve(u),l.observe(u)}const x=()=>{const e=[];for(const t of document.styleSheets)for(const n of at(t))e.push([new He(n),0]);return e},q=window.getComputedStyle(u),C=()=>{const t=e=>q.getPropertyValue(e),n=ct(t),r=lt(t);return{parentState:null,conditions:x(),context:e({},p,{fontSize:r.fontSize,rootFontSize:r.fontSize,writingAxis:n.writingAxis}),displayFlags:n.displayFlags,isQueryContainer:!1}},k=e=>e;function A(n){let f=r(n);if(!f){let p,S=null,x=!1;n===u?(p=c,S=k):n===o?(x=!0,p=new tt(o,{viewportChanged:y})):p=n===s?new et(s):n instanceof HTMLLinkElement?new Xe(n,{registerStyleSheet:t=>a(n,e({},t))}):n instanceof HTMLStyleElement?new Ze(n,{registerStyleSheet:t=>a(n,e({},t))}):new Ke(n);let q=Symbol();if(null==S&&n instanceof Element){const r=function(n){const r=window.getComputedStyle(n);return function(n){let u=null;return(...n)=>{if(null==u||!Ve(u[0],n)){const o=((n,u)=>{const{context:o,conditions:s}=n,l=e=>r.getPropertyValue(e),c=ct(l),a=e({},o,{writingAxis:c.writingAxis});let f=s,p=!1,y=c.displayFlags;!(1&n.displayFlags)&&(y=0);const{containerType:h,containerNames:v}=c;if(h>0){const e=h>0&&!(2&~y),n=new Map(s.map((e=>[e[0].value,e[1]])));if(f=[],p=!0,e){const e=lt(l);a.fontSize=e.fontSize;const r=function(e,t){const n={value:t.width},r={value:t.height};let u=n,o=r;if(1===e.writingAxis){const e=u;u=o,o=e}return!!(2&~e.containerType)&&(o.value=void 0),{width:n.value,height:r.value,inlineSize:u.value,blockSize:o.value}}(c,e),u={sizeFeatures:r,treeContext:a},p=e=>{const{rule:r}=e,o=r.name,s=null==o||v.has(o)?function(e,n){const r=new Map,u=n.sizeFeatures;for(const s of e.features){const e=t(s,u);if(1===e.type)return null;r.set(s,e)}const o=i(e.condition,{sizeFeatures:r,treeContext:n.treeContext});return 5===o.type?o.value:null}(r,u):null;var l;return null==s?1===((null!=(l=n.get(e))?l:0)&&1):!0===s},y=(e,t)=>{let n=e.get(t);if(null==n){const r=p(t);n=(r?1:0)|(!0!==r||null!=t.parent&&1&~y(e,t.parent)?0:2),e.set(t,n)}return n},h=new Map;for(const t of s)f.push([t[0],y(h,t[0].value)]);a.cqw=null!=r.width?r.width/100:o.cqw,a.cqh=null!=r.height?r.height/100:o.cqh}}return{parentState:new He(n),conditions:f,context:a,displayFlags:y,isQueryContainer:p}})(...n);null!=u&&Ve(u[1],o)||(u=[n,o])}return u[1]}}()}(n);S=e=>r(e,q)}const C=S||k;let $=null;const E=e=>{const t=$,n=C(e);return $=n,[$,$!==t]},z=n instanceof HTMLElement||n instanceof SVGElement?n.style:null;let L=!1;f={connect(){for(let e=n.firstChild;null!=e;e=e.nextSibling)A(e);p.connected()},disconnect(){n instanceof Element&&(l.unobserve(n),n.removeAttribute(v),n.removeAttribute(d)),z&&(z.removeProperty(g),z.removeProperty(b),z.removeProperty(m),z.removeProperty(w));for(let e=n.firstChild;null!=e;e=e.nextSibling){const t=r(e);null==t||t.disconnect()}p.disconnected(),delete n[De]},update(e){const[t,r]=E(e);if(r){if(h(n,e,d),h(n,t,v),n instanceof Element){const e=x||t.isQueryContainer;e&&!L?(l.observe(n),L=!0):!e&&L&&(l.unobserve(n),L=!1)}if(z){const n=t.context,r=n.writingAxis;let u=null,o=null,s=null,l=null;(r!==e.context.writingAxis||t.isQueryContainer)&&(u=`var(${0===r?m:w})`,o=`var(${1===r?m:w})`),e&&!t.isQueryContainer||(n.cqw&&(s=n.cqw+"px"),n.cqh&&(l=n.cqh+"px")),it(z,g,u),it(z,b,o),it(z,m,s),it(z,w,l)}p.updated()}for(let u=n.firstChild;null!=u;u=u.nextSibling)A(u).update(t)},resize(){q=Symbol()},mutate(){q=Symbol();for(let e=n.firstChild;null!=e;e=e.nextSibling)A(e).mutate()}},n[De]=f,f.connect()}return f}u.prepend(s,o),A(u),S()}(); diff --git a/kirby/panel/dist/js/index.min.js b/kirby/panel/dist/js/index.min.js new file mode 100644 index 0000000..c3d944a --- /dev/null +++ b/kirby/panel/dist/js/index.min.js @@ -0,0 +1,2 @@ +const __vite__fileDeps=["./IndexView.min.js","./vendor.min.js","./DocsView.min.js","./Docs.min.js","./PlaygroundView.min.js","./Highlight.min.js"],__vite__mapDeps=i=>i.map(i=>__vite__fileDeps[i]); +import{v as t,I as e,P as i,S as n,F as s,N as o,s as l,l as a,w as r,a as u,b as c,c as d,e as p,t as h,d as m,f,g,h as k,i as b,k as v,D as y,j as $,E as w,m as x,n as _,o as C,T as S,u as O,p as M,q as A,r as j,x as I,y as D,z as E,A as T,B as L,C as B,G as q,H as P,V as N,J as z}from"./vendor.min.js";const F={},Y=function(t,e,i){let n=Promise.resolve();if(e&&e.length>0){const t=document.getElementsByTagName("link"),s=document.querySelector("meta[property=csp-nonce]"),o=(null==s?void 0:s.nonce)||(null==s?void 0:s.getAttribute("nonce"));n=Promise.all(e.map((e=>{if(e=function(t,e){return new URL(t,e).href}(e,i),e in F)return;F[e]=!0;const n=e.endsWith(".css"),s=n?'[rel="stylesheet"]':"";if(!!i)for(let i=t.length-1;i>=0;i--){const s=t[i];if(s.href===e&&(!n||"stylesheet"===s.rel))return}else if(document.querySelector(`link[href="${e}"]${s}`))return;const l=document.createElement("link");return l.rel=n?"stylesheet":"modulepreload",n||(l.as="script",l.crossOrigin=""),l.href=e,o&&l.setAttribute("nonce",o),document.head.appendChild(l),n?new Promise(((t,i)=>{l.addEventListener("load",t),l.addEventListener("error",(()=>i(new Error(`Unable to preload CSS for ${e}`))))})):void 0})))}return n.then((()=>t())).catch((t=>{const e=new Event("vite:preloadError",{cancelable:!0});if(e.payload=t,window.dispatchEvent(e),!e.defaultPrevented)throw t}))},R={created(){this.$panel.events.subscribe();for(const t of this.$panel.plugins.created)t(this);this.$panel.events.on("popstate",(()=>{this.$panel.open(window.location.href)})),this.$panel.events.on("drop",(()=>{this.$panel.drag.stop()})),this.$store.dispatch("content/init")},destroyed(){this.$panel.events.unsubscribe()},render(t){if(this.$panel.view.component)return t(this.$panel.view.component,{key:this.$panel.view.component,props:this.$panel.view.props})}},U={props:{after:String}},H={props:{autocomplete:String}},V={props:{autofocus:Boolean}},K={props:{before:String}},W={props:{disabled:Boolean}},J={props:{font:String}},G={props:{help:String}},X={props:{id:{type:[Number,String],default(){return this._uid}}}},Z={props:{invalid:Boolean}},Q={props:{label:String}},tt={props:{layout:{type:String,default:"list"}}},et={props:{maxlength:Number}},it={props:{minlength:Number}},nt={props:{name:[Number,String]}},st={props:{options:{default:()=>[],type:Array}}},ot={props:{pattern:String}},lt={props:{placeholder:[Number,String]}},at={props:{required:Boolean}},rt={props:{spellcheck:{type:Boolean,default:!0}}};function ut(t,e,i,n,s,o,l,a){var r,u="function"==typeof t?t.options:t;if(e&&(u.render=e,u.staticRenderFns=i,u._compiled=!0),n&&(u.functional=!0),o&&(u._scopeId="data-v-"+o),l?(r=function(t){(t=t||this.$vnode&&this.$vnode.ssrContext||this.parent&&this.parent.$vnode&&this.parent.$vnode.ssrContext)||"undefined"==typeof __VUE_SSR_CONTEXT__||(t=__VUE_SSR_CONTEXT__),s&&s.call(this,t),t&&t._registeredComponents&&t._registeredComponents.add(l)},u._ssrRegister=r):s&&(r=a?function(){s.call(this,(u.functional?this.parent:this).$root.$options.shadowRoot)}:s),r)if(u.functional){u._injectStyles=r;var c=u.render;u.render=function(t,e){return r.call(e),c(t,e)}}else{var d=u.beforeCreate;u.beforeCreate=d?[].concat(d,r):[r]}return{exports:t,options:u}}const ct={mixins:[tt],inheritAttrs:!1,props:{columns:{type:[Object,Array],default:()=>({})},fields:{type:Object,default:()=>({})},items:{type:Array,default:()=>[]},link:{type:Boolean,default:!0},sortable:Boolean,size:{type:String,default:"medium"},theme:String}};const dt=ut({mixins:[ct],props:{image:{type:[Object,Boolean],default:()=>({})}},emits:["change","hover","item","option","sort"],computed:{dragOptions(){return{sort:this.sortable,disabled:!1===this.sortable,draggable:".k-draggable-item"}},table(){return{columns:this.columns,fields:this.fields,rows:this.items,sortable:this.sortable}}},methods:{onDragStart(t,e){this.$panel.drag.start("text",e)},onOption(t,e,i){this.$emit("option",t,e,i)},imageOptions(t){let e=this.image,i=t.image;return!1!==e&&!1!==i&&("object"!=typeof e&&(e={}),"object"!=typeof i&&(i={}),{...i,...e})}}},(function(){var t=this,e=t._self._c;return"table"===t.layout?e("k-table",t._b({on:{change:function(e){return t.$emit("change",e)},sort:function(e){return t.$emit("sort",e)},option:t.onOption},scopedSlots:t._u([t.$scopedSlots.options?{key:"options",fn:function({row:e,rowIndex:i}){return[t._t("options",null,null,{item:e,index:i})]}}:null],null,!0)},"k-table",t.table,!1)):e("k-draggable",{staticClass:"k-items",class:"k-"+t.layout+"-items",attrs:{"data-layout":t.layout,"data-size":t.size,handle:!0,list:t.items,options:t.dragOptions},on:{change:function(e){return t.$emit("change",e)},end:function(e){return t.$emit("sort",t.items,e)}}},[t._l(t.items,(function(i,n){return[t._t("default",(function(){return[e("k-item",t._b({key:i.id??n,class:{"k-draggable-item":t.sortable&&i.sortable},attrs:{image:t.imageOptions(i),layout:t.layout,link:!!t.link&&i.link,sortable:t.sortable&&i.sortable,theme:t.theme,width:i.column},on:{click:function(e){return t.$emit("item",i,n)},drag:function(e){return t.onDragStart(e,i.dragText)},option:function(e){return t.onOption(e,i,n)}},nativeOn:{mouseover:function(e){return t.$emit("hover",e,i,n)}},scopedSlots:t._u([{key:"options",fn:function(){return[t._t("options",null,null,{item:i,index:n})]},proxy:!0}],null,!0)},"k-item",i,!1))]}),null,{item:i,itemIndex:n})]}))],2)}),[],!1,null,null,null,null).exports;const pt=ut({mixins:[ct],props:{empty:{type:Object,default:()=>({})},help:String,pagination:{type:[Boolean,Object],default:!1}},emits:["action","change","empty","item","option","paginate","sort"],computed:{hasPagination(){return!1!==this.pagination&&(!0!==this.paginationOptions.hide&&!(this.pagination.total<=this.pagination.limit))},paginationOptions(){return{limit:10,details:!0,keys:!1,total:0,hide:!1,..."object"!=typeof this.pagination?{}:this.pagination}}},watch:{$props(){this.$forceUpdate()}},methods:{onEmpty(t){t.stopPropagation(),this.$emit("empty")},onOption(...t){this.$emit("action",...t),this.$emit("option",...t)}}},(function(){var t=this,e=t._self._c;return e("div",{staticClass:"k-collection"},[0===t.items.length?e("k-empty",t._g(t._b({attrs:{layout:t.layout}},"k-empty",t.empty,!1),t.$listeners.empty?{click:t.onEmpty}:{})):e("k-items",t._b({on:{change:function(e){return t.$emit("change",e)},item:function(e){return t.$emit("item",e)},option:t.onOption,sort:function(e){return t.$emit("sort",e)}},scopedSlots:t._u([{key:"options",fn:function({item:e,index:i}){return[t._t("options",null,null,{item:e,index:i})]}}],null,!0)},"k-items",{columns:t.columns,fields:t.fields,items:t.items,layout:t.layout,link:t.link,size:t.size,sortable:t.sortable,theme:t.theme},!1)),t.help||t.hasPagination?e("footer",{staticClass:"k-collection-footer"},[e("k-text",{staticClass:"k-help k-collection-help",attrs:{html:t.help}}),t.hasPagination?e("k-pagination",t._b({on:{paginate:function(e){return t.$emit("paginate",e)}}},"k-pagination",t.paginationOptions,!1)):t._e()],1):t._e()],1)}),[],!1,null,null,null,null).exports;const ht=ut({mixins:[tt],props:{text:String,icon:String},emits:["click"],computed:{attrs(){const t={button:void 0!==this.$listeners.click,icon:this.icon,theme:"empty"};return"cardlets"!==this.layout&&"cards"!==this.layout||(t.align="center",t.height="var(--item-height-cardlet)"),t}}},(function(){var t=this;return(0,t._self._c)("k-box",t._b({staticClass:"k-empty",nativeOn:{click:function(e){return t.$emit("click",e)}}},"k-box",t.attrs,!1),[t._t("default",(function(){return[t._v(" "+t._s(t.text)+" ")]}))],2)}),[],!1,null,null,null,null).exports,mt={mixins:[tt],props:{image:[Object,Boolean],width:{type:String,default:"1/1"}}};const ft=ut({mixins:[mt],inheritAttrs:!1,computed:{attrs(){return{back:this.image.back??"gray-500",cover:!0,...this.image,ratio:"list"===this.layout?"auto":this.image.ratio,size:this.sizes}},sizes(){switch(this.width){case"1/2":case"2/4":return"(min-width: 30em) and (max-width: 65em) 59em, (min-width: 65em) 44em, 27em";case"1/3":return"(min-width: 30em) and (max-width: 65em) 59em, (min-width: 65em) 29.333em, 27em";case"1/4":return"(min-width: 30em) and (max-width: 65em) 59em, (min-width: 65em) 22em, 27em";case"2/3":return"(min-width: 30em) and (max-width: 65em) 59em, (min-width: 65em) 27em, 27em";case"3/4":return"(min-width: 30em) and (max-width: 65em) 59em, (min-width: 65em) 66em, 27em";default:return"(min-width: 30em) and (max-width: 65em) 59em, (min-width: 65em) 88em, 27em"}}}},(function(){var t=this,e=t._self._c;return t.image.src?e("k-image-frame",t._b({staticClass:"k-item-image"},"k-image-frame",t.attrs,!1)):e("k-icon-frame",t._b({staticClass:"k-item-image"},"k-icon-frame",t.attrs,!1))}),[],!1,null,null,null,null).exports;const gt=ut({mixins:[mt,tt],inheritAttrs:!1,props:{buttons:{type:Array,default:()=>[]},data:Object,info:String,link:{type:[Boolean,String,Function]},options:{type:[Array,Function,String]},sortable:Boolean,target:String,text:String,theme:String},emits:["action","click","drag","option"],computed:{hasFigure(){return!1!==this.image&&this.$helper.object.length(this.image)>0},title(){return this.$helper.string.stripHTML(this.$helper.string.unescapeHTML(this.text)).trim()}},methods:{onOption(t){this.$emit("action",t),this.$emit("option",t)}}},(function(){var t,e=this,i=e._self._c;return i("div",e._b({staticClass:"k-item",class:!!e.layout&&"k-"+e.layout+"-item",attrs:{"data-has-image":e.hasFigure,"data-layout":e.layout,"data-theme":e.theme},on:{click:function(t){return e.$emit("click",t)},dragstart:function(t){return e.$emit("drag",t)}}},"div",e.data,!1),[e._t("image",(function(){return[e.hasFigure?i("k-item-image",{attrs:{image:e.image,layout:e.layout,width:e.width}}):e._e()]})),e.sortable?i("k-sort-handle",{staticClass:"k-item-sort-handle",attrs:{tabindex:"-1"}}):e._e(),i("div",{staticClass:"k-item-content"},[i("h3",{staticClass:"k-item-title",attrs:{title:e.title}},[!1!==e.link?i("k-link",{attrs:{target:e.target,to:e.link}},[i("span",{domProps:{innerHTML:e._s(e.text??"–")}})]):i("span",{domProps:{innerHTML:e._s(e.text??"–")}})],1),e.info?i("p",{staticClass:"k-item-info",domProps:{innerHTML:e._s(e.info)}}):e._e()]),i("div",{staticClass:"k-item-options",attrs:{"data-only-option":!(null==(t=e.buttons)?void 0:t.length)||!e.options&&!e.$slots.options}},[e._l(e.buttons,(function(t,n){return i("k-button",e._b({key:"button-"+n},"k-button",t,!1))})),e._t("options",(function(){return[e.options?i("k-options-dropdown",{staticClass:"k-item-options-dropdown",attrs:{options:e.options},on:{option:e.onOption}}):e._e()]}))],2)],2)}),[],!1,null,null,null,null).exports,kt={install(t){t.component("k-collection",pt),t.component("k-empty",ht),t.component("k-item",gt),t.component("k-item-image",ft),t.component("k-items",dt)}};const bt=ut({},(function(){return(0,this._self._c)("div",{staticClass:"k-dialog-body"},[this._t("default")],2)}),[],!1,null,null,null,null).exports;function vt(t){return"object"==typeof t&&(null==t?void 0:t.constructor)===Object}function yt(t){return Object.keys(t??{}).length}function $t(t){return Object.keys(t).reduce(((e,i)=>(e[i.toLowerCase()]=t[i],e)),{})}const wt={clone:function(t){if(void 0!==t)return structuredClone(t)},isEmpty:function(t){return null==t||""===t||(!(!vt(t)||0!==yt(t))||0===t.length)},isObject:vt,length:yt,merge:function t(e,i={}){for(const n in i)i[n]instanceof Object&&Object.assign(i[n],t(e[n]??{},i[n]));return Object.assign(e??{},i),e},same:function(t,e){return JSON.stringify(t)===JSON.stringify(e)},toLowerKeys:$t},xt={props:{cancelButton:{default:!0,type:[Boolean,String,Object]},disabled:{default:!1,type:Boolean},icon:{default:"check",type:String},submitButton:{type:[Boolean,String,Object],default:!0},theme:{default:"positive",type:String}}};const _t=ut({mixins:[xt],emits:["cancel"],computed:{cancel(){return this.button(this.cancelButton,{click:()=>this.$emit("cancel"),class:"k-dialog-button-cancel",icon:"cancel",text:this.$t("cancel"),variant:"filled"})},submit(){return this.button(this.submitButton,{class:"k-dialog-button-submit",disabled:this.disabled||this.$panel.dialog.isLoading,icon:this.icon,text:this.$t("confirm"),theme:this.theme,type:"submit",variant:"filled"})}},methods:{button:(t,e)=>"string"==typeof t?{...e,text:t}:!1!==t&&(!1===vt(t)?e:{...e,...t})}},(function(){var t=this,e=t._self._c;return e("k-button-group",{staticClass:"k-dialog-buttons"},[t.cancel?e("k-button",t._b({},"k-button",t.cancel,!1)):t._e(),t.submit?e("k-button",t._b({attrs:{icon:t.$panel.dialog.isLoading?"loader":t.submit.icon}},"k-button",t.submit,!1)):t._e()],1)}),[],!1,null,null,null,null).exports,Ct={props:{empty:{default:()=>window.panel.$t("dialog.fields.empty"),type:String},fields:{default:()=>[],type:[Array,Object]},novalidate:{default:!0,type:Boolean},value:{default:()=>({}),type:Object}}};const St=ut({mixins:[Ct],emits:["input","submit"],computed:{hasFields(){return this.$helper.object.length(this.fields)>0}}},(function(){var t=this,e=t._self._c;return t.hasFields?e("k-fieldset",{staticClass:"k-dialog-fields",attrs:{novalidate:t.novalidate,fields:t.fields,value:t.value},on:{input:function(e){return t.$emit("input",e)},submit:function(e){return t.$emit("submit",e)}}}):e("k-box",{attrs:{theme:"info"}},[t._v(t._s(t.empty))])}),[],!1,null,null,null,null).exports;const Ot=ut({},(function(){return(0,this._self._c)("footer",{staticClass:"k-dialog-footer"},[this._t("default")],2)}),[],!1,null,null,null,null).exports;const Mt=ut({},(function(){var t=this,e=t._self._c;return"dialog"===t.$panel.notification.context?e("k-notification",{staticClass:"k-dialog-notification"}):t._e()}),[],!1,null,null,null,null).exports;const At=ut({props:{autofocus:{default:!0,type:Boolean},placeholder:{default:()=>window.panel.$t("search")+" …",type:String},value:{type:String}},emits:["search"]},(function(){var t=this;return(0,t._self._c)("k-input",{staticClass:"k-dialog-search",attrs:{autofocus:t.autofocus,placeholder:t.placeholder,spellcheck:!1,value:t.value,icon:"search",type:"text"},on:{input:function(e){return t.$emit("search",e)}}})}),[],!1,null,null,null,null).exports,jt={props:{empty:{type:String,default:()=>window.panel.$t("dialog.text.empty")},text:{type:String}}};const It=ut({mixins:[jt]},(function(){var t=this,e=t._self._c;return t.text?e("k-text",{attrs:{html:t.text}}):e("k-box",{attrs:{theme:"info"}},[t._v(t._s(t.empty))])}),[],!1,null,null,null,null).exports,Dt={install(t){t.component("k-dialog-body",bt),t.component("k-dialog-buttons",_t),t.component("k-dialog-fields",St),t.component("k-dialog-footer",Ot),t.component("k-dialog-notification",Mt),t.component("k-dialog-search",At),t.component("k-dialog-text",It)}},Et={mixins:[xt],props:{size:{default:"default",type:String},visible:{default:!1,type:Boolean}},emits:["cancel","close","input","submit","success"],methods:{cancel(){this.$emit("cancel")},close(){this.$emit("close")},error(t){this.$panel.notification.error(t)},focus(t){this.$panel.dialog.focus(t)},input(t){this.$emit("input",t)},open(){this.$panel.dialog.open(this)},submit(){this.$emit("submit",this.value)},success(t){this.$emit("success",t)}}};const Tt=ut({mixins:[Et]},(function(){var t=this,e=t._self._c;return t.visible?e("portal",{attrs:{to:"dialog"}},[e("form",{staticClass:"k-dialog",class:t.$vnode.data.staticClass,attrs:{"data-has-footer":t.cancelButton||t.submitButton,"data-size":t.size,method:"dialog"},on:{click:function(t){t.stopPropagation()},submit:function(e){return e.preventDefault(),t.$emit("submit")}}},[t._t("header",(function(){return[e("k-dialog-notification")]})),t.$slots.default?e("k-dialog-body",[t._t("default")],2):t._e(),t._t("footer",(function(){return[t.cancelButton||t.submitButton?e("k-dialog-footer",[e("k-dialog-buttons",{attrs:{"cancel-button":t.cancelButton,disabled:t.disabled,icon:t.icon,"submit-button":t.submitButton,theme:t.theme},on:{cancel:function(e){return t.$emit("cancel")}}})],1):t._e()]}))],2)]):t._e()}),[],!1,null,null,null,null).exports;const Lt=ut({mixins:[Et],props:{cancelButton:{default:!1},changes:{type:Array},loading:{type:Boolean},size:{default:"medium"},submitButton:{default:!1}},computed:{ids(){return Object.keys(this.store).filter((t=>{var e;return this.$helper.object.length(null==(e=this.store[t])?void 0:e.changes)>0}))},store(){return this.$store.state.content.models}},watch:{ids:{handler(t){this.$panel.dialog.refresh({method:"POST",body:{ids:t}})},immediate:!0}}},(function(){var t=this,e=t._self._c;return e("k-dialog",t._b({staticClass:"k-changes-dialog"},"k-dialog",t.$props,!1),[!1===t.loading?[e("k-headline",[t._v(t._s(t.$t("lock.unsaved")))]),t.changes.length?e("k-items",{attrs:{items:t.changes,layout:"list"}}):e("k-empty",{attrs:{icon:"edit-line"}},[t._v(t._s(t.$t("lock.unsaved.empty")))])]:[e("k-icon",{attrs:{type:"loader"}})]],2)}),[],!1,null,null,null,null).exports;const Bt=ut({mixins:[Et,Ct],props:{fields:{default:()=>({href:{label:window.panel.$t("email"),type:"email",icon:"email"},title:{label:window.panel.$t("title"),type:"text",icon:"title"}})},size:{default:"medium"},submitButton:{default:()=>window.panel.$t("insert")}},data(){return{values:{href:"",title:null,...this.value}}},methods:{submit(){this.$emit("submit",this.values)}}},(function(){var t=this;return(0,t._self._c)("k-form-dialog",t._b({attrs:{value:t.values},on:{cancel:function(e){return t.$emit("cancel")},input:function(e){t.values=e},submit:t.submit}},"k-form-dialog",t.$props,!1))}),[],!1,null,null,null,null).exports;const qt=ut({mixins:[Et],props:{details:[Object,Array],message:String,size:{default:"medium",type:String}},emits:["cancel"],computed:{detailsList(){return Array.fromObject(this.details)}}},(function(){var t=this,e=t._self._c;return e("k-dialog",{ref:"dialog",staticClass:"k-error-dialog",attrs:{"cancel-button":!1,"submit-button":!1,size:t.size,visible:t.visible},on:{cancel:function(e){return t.$emit("cancel")}}},[e("k-text",[t._v(t._s(t.message))]),t.detailsList.length?e("dl",{staticClass:"k-error-details"},[t._l(t.detailsList,(function(i,n){return[e("dt",{key:"detail-label-"+n},[t._v(" "+t._s(i.label)+" ")]),e("dd",{key:"detail-message-"+n},["object"==typeof i.message?[e("ul",t._l(i.message,(function(i,n){return e("li",{key:n},[t._v(" "+t._s(i)+" ")])})),0)]:[t._v(" "+t._s(i.message)+" ")]],2)]}))],2):t._e()],1)}),[],!1,null,null,null,null).exports;const Pt=ut({},(function(){var t=this;return(0,t._self._c)(t.$panel.dialog.component,t._g(t._b({key:t.$panel.dialog.timestamp,tag:"component",attrs:{visible:!0}},"component",t.$panel.dialog.props,!1),t.$panel.dialog.listeners()))}),[],!1,null,null,null,null).exports,Nt=(t,e)=>{let i=null;return(...n)=>{clearTimeout(i),i=setTimeout((()=>t.apply(void 0,n)),e)}},zt={props:{delay:{default:200,type:Number},hasSearch:{default:!0,type:Boolean}},data:()=>({query:null}),watch:{query(){!1!==this.hasSearch&&this.search()}},created(){this.search=Nt(this.search,this.delay)},methods:{async search(){console.warn("Search mixin: Please implement a `search` method.")}}},Ft={props:{endpoint:String,empty:Object,fetchParams:Object,item:{type:Function,default:t=>t},max:Number,multiple:{type:Boolean,default:!0},size:{type:String,default:"medium"},value:{type:Array,default:()=>[]}}};const Yt=ut({mixins:[Et,zt,Ft],emits:["cancel","fetched","submit"],data(){return{models:[],selected:this.value.reduce(((t,e)=>({...t,[e]:{id:e}})),{}),pagination:{limit:20,page:1,total:0}}},computed:{items(){return this.models.map(this.item)}},watch:{fetchParams(t,e){!1===this.$helper.object.same(t,e)&&(this.pagination.page=1,this.fetch())}},mounted(){this.fetch()},methods:{async fetch(){const t={page:this.pagination.page,search:this.query,...this.fetchParams};try{this.$panel.dialog.isLoading=!0;const e=await this.$api.get(this.endpoint,t);this.models=e.data,this.pagination=e.pagination,this.$emit("fetched",e)}catch(e){this.$panel.error(e),this.models=[]}finally{this.$panel.dialog.isLoading=!1}},isSelected(t){return void 0!==this.selected[t.id]},paginate(t){this.pagination.page=t.page,this.pagination.limit=t.limit,this.fetch()},submit(){this.$emit("submit",Object.values(this.selected))},async search(){this.pagination.page=0,await this.fetch()},toggle(t){if(!1!==this.multiple&&1!==this.max||(this.selected={}),this.isSelected(t))return Vue.del(this.selected,t.id);this.max&&this.max<=this.$helper.object.length(this.selected)||Vue.set(this.selected,t.id,t)}}},(function(){var t=this,e=t._self._c;return e("k-dialog",t._b({staticClass:"k-models-dialog",on:{cancel:function(e){return t.$emit("cancel")},submit:t.submit}},"k-dialog",t.$props,!1),[t._t("header"),t.hasSearch?e("k-dialog-search",{attrs:{value:t.query},on:{search:function(e){t.query=e}}}):t._e(),e("k-collection",{attrs:{empty:{...t.empty,text:t.$panel.dialog.isLoading?t.$t("loading"):t.empty.text},items:t.items,link:!1,pagination:{details:!0,dropdown:!1,align:"center",...t.pagination},sortable:!1,layout:"list"},on:{item:t.toggle,paginate:t.paginate},scopedSlots:t._u([{key:"options",fn:function({item:i}){return[t.isSelected(i)?e("k-button",{attrs:{icon:t.multiple&&1!==t.max?"check":"circle-nested",title:t.$t("remove"),theme:"info"},on:{click:function(e){return e.stopPropagation(),t.toggle(i)}}}):e("k-button",{attrs:{title:t.$t("select"),icon:"circle-outline"},on:{click:function(e){return e.stopPropagation(),t.toggle(i)}}}),t._t("options",null,null,{item:i})]}}],null,!0)})],2)}),[],!1,null,null,null,null).exports;const Rt=ut({mixins:[Et,Ft],props:{empty:{type:Object,default:()=>({icon:"image",text:window.panel.$t("dialog.files.empty")})}}},(function(){var t=this;return(0,t._self._c)("k-models-dialog",t._b({on:{cancel:function(e){return t.$emit("cancel")},submit:function(e){return t.$emit("submit",e)}}},"k-models-dialog",t.$props,!1))}),[],!1,null,null,null,null).exports;const Ut=ut({mixins:[Et,Ct],props:{size:{default:"medium"},submitButton:{default:()=>window.panel.$t("save")},text:{type:String}},emits:["cancel","input","submit"]},(function(){var t=this,e=t._self._c;return e("k-dialog",t._b({ref:"dialog",on:{cancel:function(e){return t.$emit("cancel")},submit:function(e){return t.$emit("submit",t.value)}}},"k-dialog",t.$props,!1),[t._t("default",(function(){return[t.text?e("k-dialog-text",{attrs:{text:t.text}}):t._e(),e("k-dialog-fields",{attrs:{fields:t.fields,novalidate:t.novalidate,value:t.value},on:{input:function(e){return t.$emit("input",e)},submit:function(e){return t.$emit("submit",e)}}})]}))],2)}),[],!1,null,null,null,null).exports;const Ht=ut({extends:Ut,watch:{"value.name"(t){this.fields.code.disabled||this.onNameChanges(t)},"value.code"(t){this.fields.code.disabled||(this.value.code=this.$helper.slug(t,[this.$panel.system.ascii]),this.onCodeChanges(this.value.code))}},methods:{onCodeChanges(t){if(!t)return this.value.locale=null;if(t.length>=2)if(-1!==t.indexOf("-")){let e=t.split("-"),i=[e[0],e[1].toUpperCase()];this.value.locale=i.join("_")}else{let e=this.$panel.system.locales??[];this.value.locale=null==e?void 0:e[t]}},onNameChanges(t){this.value.code=this.$helper.slug(t,[this.value.rules,this.$panel.system.ascii]).substr(0,2)}}},null,null,!1,null,null,null,null).exports;const Vt=ut({mixins:[{mixins:[Et],props:{license:Object,size:{default:"large"}}}]},(function(){var t=this,e=t._self._c;return e("k-dialog",t._b({ref:"dialog",staticClass:"k-license-dialog",on:{cancel:function(e){return t.$emit("cancel")},submit:function(e){return t.$emit("submit")}}},"k-dialog",t.$props,!1),[e("k-bar",{staticStyle:{"margin-bottom":"var(--spacing-2)"}},[e("h2",{staticClass:"k-headline"},[t._v(" "+t._s(t.$t("license"))+" ")])]),e("div",{staticClass:"k-table"},[e("table",{staticStyle:{"table-layout":"auto"}},[e("tbody",[e("tr",[e("th",{attrs:{"data-mobile":"true"}},[t._v(t._s(t.$t("type")))]),e("td",{attrs:{"data-mobile":"true"}},[t._v(t._s(t.license.type))])]),t.license.code?e("tr",[e("th",{attrs:{"data-mobile":"true"}},[t._v(t._s(t.$t("license.code")))]),e("td",{staticClass:"k-text",attrs:{"data-mobile":"true"}},[e("code",[t._v(t._s(t.license.code))])])]):t._e(),t.license.info?e("tr",[e("th",{attrs:{"data-mobile":"true"}},[t._v(t._s(t.$t("status")))]),e("td",{attrs:{"data-mobile":"true","data-theme":t.license.theme}},[e("p",{staticClass:"k-license-dialog-status"},[e("k-icon",{attrs:{type:t.license.icon}}),t._v(" "+t._s(t.license.info)+" ")],1)])]):t._e()])])])],1)}),[],!1,null,null,null,null).exports;const Kt=ut({mixins:[Et,Ct],props:{fields:{default:()=>({href:{label:window.panel.$t("link"),type:"link",placeholder:window.panel.$t("url.placeholder"),icon:"url"},title:{label:window.panel.$t("title"),type:"text",icon:"title"},target:{label:window.panel.$t("open.newWindow"),type:"toggle",text:[window.panel.$t("no"),window.panel.$t("yes")]}})},size:{default:"medium"},submitButton:{default:()=>window.panel.$t("insert")}},data(){return{values:{href:"",title:null,...this.value,target:Boolean(this.value.target??!1)}}},methods:{submit(){const t=this.values.href.replace("file://","/@/file/").replace("page://","/@/page/");this.$emit("submit",{...this.values,href:t,target:this.values.target?"_blank":null})}}},(function(){var t=this;return(0,t._self._c)("k-form-dialog",t._b({attrs:{value:t.values},on:{cancel:function(e){return t.$emit("cancel")},input:function(e){t.values=e},submit:t.submit}},"k-form-dialog",t.$props,!1))}),[],!1,null,null,null,null).exports;const Wt=ut({mixins:[Ut],props:{blueprints:{type:Array},size:{default:"medium",type:String},submitButton:{type:[String,Boolean],default:()=>window.panel.$t("save")},template:{type:String}},computed:{templates(){return this.blueprints.map((t=>({text:t.title,value:t.name})))}},methods:{pick(t){this.$panel.dialog.reload({query:{...this.$panel.dialog.query,slug:this.value.slug,template:t,title:this.value.title}})}}},(function(){var t=this,e=t._self._c;return e("k-form-dialog",t._b({ref:"dialog",staticClass:"k-page-create-dialog",on:{cancel:function(e){return t.$emit("cancel")},submit:function(e){return t.$emit("submit",t.value)}}},"k-form-dialog",t.$props,!1),[t.templates.length>1?e("k-select-field",{staticClass:"k-page-template-switch",attrs:{empty:!1,label:t.$t("template"),options:t.templates,required:!0,value:t.template},on:{input:function(e){return t.pick(e)}}}):t._e(),e("k-dialog-fields",{attrs:{fields:t.fields,novalidate:t.novalidate,value:t.value},on:{input:function(e){return t.$emit("input",e)},submit:function(e){return t.$emit("submit",e)}}})],1)}),[],!1,null,null,null,null).exports;const Jt=ut({mixins:[Et],props:{value:{default:()=>({}),type:Object}},emits:["cancel","input","submit"],methods:{select(t){this.$emit("input",{...this.value,parent:t.value})}}},(function(){var t=this,e=t._self._c;return e("k-dialog",t._b({ref:"dialog",staticClass:"k-page-move-dialog",attrs:{"submit-button":{icon:"parent",text:t.$t("move")},size:"medium"},on:{cancel:function(e){return t.$emit("cancel")},submit:function(e){return t.$emit("submit",t.value)}}},"k-dialog",t.$props,!1),[e("k-headline",[t._v(t._s(t.$t("page.move")))]),e("div",{staticClass:"k-page-move-parent",attrs:{tabindex:"0","data-autofocus":""}},[e("k-page-tree",{attrs:{current:t.value.parent,move:t.value.move,identifier:"id"},on:{select:t.select}})],1)],1)}),[],!1,null,null,null,null).exports;const Gt=ut({mixins:[Et,Ft],props:{empty:{type:Object,default:()=>({icon:"page",text:window.panel.$t("dialog.pages.empty")})}},data:()=>({model:null,parent:null})},(function(){var t=this,e=t._self._c;return e("k-models-dialog",t._b({attrs:{"fetch-params":{parent:t.parent}},on:{cancel:function(e){return t.$emit("cancel")},fetched:function(e){t.model=e.model},submit:function(e){return t.$emit("submit",e)}},scopedSlots:t._u([t.model?{key:"header",fn:function(){return[e("header",{staticClass:"k-pages-dialog-navbar"},[e("k-button",{attrs:{disabled:!t.model.id,title:t.$t("back"),icon:"angle-left"},on:{click:function(e){t.parent=t.model.parent}}}),e("k-headline",[t._v(t._s(t.model.title))])],1)]},proxy:!0}:null,t.model?{key:"options",fn:function({item:i}){return[e("k-button",{staticClass:"k-pages-dialog-option",attrs:{disabled:!i.hasChildren,title:t.$t("open"),icon:"angle-right"},on:{click:function(e){e.stopPropagation(),t.parent=i.id}}})]}}:null],null,!0)},"k-models-dialog",t.$props,!1))}),[],!1,null,null,null,null).exports;const Xt=ut({mixins:[{mixins:[Et,jt]}]},(function(){var t=this,e=t._self._c;return e("k-dialog",t._b({ref:"dialog",on:{cancel:function(e){return t.$emit("cancel")},submit:function(e){return t.$emit("submit")}}},"k-dialog",t.$props,!1),[t._t("default",(function(){return[e("k-dialog-text",{attrs:{text:t.text}})]}))],2)}),[],!1,null,null,null,null).exports;const Zt=ut({mixins:[Xt],props:{icon:{default:"trash"},submitButton:{default:()=>window.panel.$t("delete")},theme:{default:"negative"}}},(function(){var t=this;return(0,t._self._c)("k-text-dialog",t._b({ref:"dialog",on:{cancel:function(e){return t.$emit("cancel")},submit:function(e){return t.$emit("submit")}}},"k-text-dialog",t.$props,!1),[t._t("default")],2)}),[],!1,null,null,null,null).exports;const Qt=ut({mixins:[Et,zt],props:{type:String},emits:["cancel"],data(){return{isLoading:!1,items:[],pagination:{},selected:-1,current:this.type??(this.$panel.searches[this.$panel.view.search]?this.$panel.view.search:Object.keys(this.$panel.searches)[0])}},computed:{currentType(){return this.$panel.searches[this.current]??this.types[0]},types(){return Object.values(this.$panel.searches).map((t=>({...t,current:this.current===t.id,click:()=>{this.current=t.id,this.focus()}})))}},watch:{current(){this.search()}},methods:{clear(){this.items=[],this.query=null},focus(){var t;null==(t=this.$refs.input)||t.focus()},navigate(t){t&&(this.$go(t.link),this.close())},onDown(){this.selected=0&&this.select(this.selected-1)},async search(){var t,e;this.isLoading=!0,null==(t=this.$refs.types)||t.close(),null==(e=this.select)||e.call(this,-1);try{if(null===this.query||this.query.length<2)throw Error("Empty query");const t=await this.$search(this.current,this.query);this.items=t.results,this.pagination=t.pagination}catch{this.items=[],this.pagination={}}finally{this.isLoading=!1}},select(t){var e;this.selected=t;const i=(null==(e=this.$refs.items)?void 0:e.$el.querySelectorAll(".k-item"))??[];for(const n of i)delete n.dataset.selected;t>=0&&(i[t].dataset.selected=!0)}}},(function(){var t,e=this,i=e._self._c;return i("k-dialog",e._b({staticClass:"k-search-dialog",attrs:{"cancel-button":!1,"submit-button":!1,role:"search",size:"medium"},on:{cancel:function(t){return e.$emit("cancel")},submit:e.submit}},"k-dialog",e.$props,!1),[i("div",{staticClass:"k-search-dialog-input"},[i("k-button",{staticClass:"k-search-dialog-types",attrs:{dropdown:!0,icon:e.currentType.icon,text:e.currentType.label,variant:"dimmed"},on:{click:function(t){return e.$refs.types.toggle()}}}),i("k-dropdown-content",{ref:"types",attrs:{options:e.types}}),i("k-search-input",{ref:"input",attrs:{"aria-label":e.$t("search"),autofocus:!0,value:e.query},on:{input:function(t){e.query=t}},nativeOn:{keydown:[function(t){return!t.type.indexOf("key")&&e._k(t.keyCode,"down",40,t.key,["Down","ArrowDown"])?null:(t.preventDefault(),e.onDown.apply(null,arguments))},function(t){return!t.type.indexOf("key")&&e._k(t.keyCode,"up",38,t.key,["Up","ArrowUp"])?null:(t.preventDefault(),e.onUp.apply(null,arguments))},function(t){return!t.type.indexOf("key")&&e._k(t.keyCode,"enter",13,t.key,"Enter")?null:e.onEnter.apply(null,arguments)}]}}),i("k-button",{staticClass:"k-search-dialog-close",attrs:{icon:e.isLoading?"loader":"cancel",title:e.$t("close")},on:{click:e.close}})],1),(null==(t=e.query)?void 0:t.length)>1?i("div",{staticClass:"k-search-dialog-results"},[e.items.length?i("k-collection",{ref:"items",attrs:{items:e.items},nativeOn:{mouseout:function(t){return e.select(-1)}}}):e._e(),i("footer",{staticClass:"k-search-dialog-footer"},[e.items.length?e.items.length({text:window.panel.$t("activate"),icon:"lock",theme:"notice"})}},emits:["cancel","input","submit"]},(function(){var t=this,e=t._self._c;return e("k-dialog",t._b({ref:"dialog",on:{cancel:function(e){return t.$emit("cancel")},submit:function(e){return t.$emit("submit")}}},"k-dialog",t.$props,!1),[e("k-dialog-text",{staticClass:"k-totp-dialog-intro",attrs:{text:t.$t("login.totp.enable.intro")}}),e("div",{staticClass:"k-totp-dialog-grid"},[e("div",{staticClass:"k-totp-qrcode"},[e("k-info-field",{attrs:{label:t.$t("login.totp.enable.qr.label"),text:t.qr,help:t.$t("login.totp.enable.qr.help",{secret:t.value.secret}),theme:"passive"}})],1),e("k-dialog-fields",{staticClass:"k-totp-dialog-fields",attrs:{fields:{info:{label:t.$t("login.totp.enable.confirm.headline"),type:"info",text:t.$t("login.totp.enable.confirm.text"),theme:"none"},confirm:{label:t.$t("login.totp.enable.confirm.label"),type:"text",counter:!1,font:"monospace",required:!0,placeholder:t.$t("login.code.placeholder.totp"),help:t.$t("login.totp.enable.confirm.help")},secret:{type:"hidden"}},novalidate:!0,value:t.value},on:{input:function(e){return t.$emit("input",e)},submit:function(e){return t.$emit("submit",e)}}})],1)],1)}),[],!1,null,null,null,null).exports;const ee=ut({mixins:[Et],props:{submitButton:{type:[String,Boolean,Object],default:()=>({icon:"upload",text:window.panel.$t("upload")})}}},(function(){var t=this,e=t._self._c;return e("k-dialog",t._b({ref:"dialog",staticClass:"k-upload-dialog",attrs:{disabled:t.disabled||0===t.$panel.upload.files.length},on:{cancel:function(e){return t.$emit("cancel")},submit:function(e){return t.$emit("submit")}}},"k-dialog",t.$props,!1),[e("k-dropzone",{on:{drop:function(e){return t.$panel.upload.select(e)}}},[0===t.$panel.upload.files.length?e("k-empty",{attrs:{icon:"upload",layout:"cards"},on:{click:function(e){return t.$panel.upload.pick()}}},[t._v(" "+t._s(t.$t("files.empty"))+" ")]):e("k-upload-items",{attrs:{items:t.$panel.upload.files},on:{remove:e=>{t.$panel.upload.remove(e.id)},rename:(t,e)=>{t.name=e}}})],1)],1)}),[],!1,null,null,null,null).exports;const ie=ut({extends:ee,props:{original:Object,submitButton:{type:[String,Boolean,Object],default:()=>({icon:"upload",text:window.panel.$t("replace")})}},computed:{file(){return this.$panel.upload.files[0]}}},(function(){var t,e,i,n,s=this,o=s._self._c;return o("k-dialog",s._b({ref:"dialog",staticClass:"k-upload-dialog k-upload-replace-dialog",on:{cancel:function(t){return s.$emit("cancel")},submit:function(t){return s.$emit("submit")}}},"k-dialog",s.$props,!1),[o("ul",{staticClass:"k-upload-items"},[o("li",{staticClass:"k-upload-original"},[o("k-upload-item-preview",{attrs:{color:null==(t=s.original.image)?void 0:t.color,icon:null==(e=s.original.image)?void 0:e.icon,url:s.original.url,type:s.original.mime}})],1),o("li",[s._v("←")]),o("k-upload-item",s._b({attrs:{color:null==(i=s.original.image)?void 0:i.color,editable:!1,icon:null==(n=s.original.image)?void 0:n.icon,name:s.$helper.file.name(s.original.filename),removable:!1}},"k-upload-item",s.file,!1))],1)])}),[],!1,null,null,null,null).exports;const ne=ut({mixins:[Et,Ft],props:{empty:{type:Object,default:()=>({icon:"users",text:window.panel.$t("dialog.users.empty")})},item:{type:Function,default:t=>({...t,key:t.email,info:t.info!==t.text?t.info:null})}}},(function(){var t=this;return(0,t._self._c)("k-models-dialog",t._b({on:{cancel:function(e){return t.$emit("cancel")},submit:function(e){return t.$emit("submit",e)}}},"k-models-dialog",t.$props,!1))}),[],!1,null,null,null,null).exports,se={install(t){t.use(Dt),t.component("k-dialog",Tt),t.component("k-changes-dialog",Lt),t.component("k-email-dialog",Bt),t.component("k-error-dialog",qt),t.component("k-fiber-dialog",Pt),t.component("k-files-dialog",Rt),t.component("k-form-dialog",Ut),t.component("k-license-dialog",Vt),t.component("k-link-dialog",Kt),t.component("k-language-dialog",Ht),t.component("k-models-dialog",Yt),t.component("k-page-create-dialog",Wt),t.component("k-page-move-dialog",Jt),t.component("k-pages-dialog",Gt),t.component("k-remove-dialog",Zt),t.component("k-search-dialog",Qt),t.component("k-text-dialog",Xt),t.component("k-totp-dialog",te),t.component("k-upload-dialog",ee),t.component("k-upload-replace-dialog",ie),t.component("k-users-dialog",ne)}};const oe=ut({},(function(){return(0,this._self._c)("div",{staticClass:"k-drawer-body scroll-y-auto"},[this._t("default")],2)}),[],!1,null,null,null,null).exports,le={props:{empty:{type:String,default:()=>window.panel.$t("drawer.fields.empty")},fields:Object,novalidate:{type:Boolean,default:!0},value:Object}};const ae=ut({mixins:[le],emits:["input","submit"],computed:{hasFields(){return this.$helper.object.length(this.fields)>0}}},(function(){var t=this,e=t._self._c;return t.hasFields?e("k-fieldset",{staticClass:"k-drawer-fields",attrs:{novalidate:t.novalidate,fields:t.fields,value:t.value},on:{input:function(e){return t.$emit("input",e)},submit:function(e){return t.$emit("submit",e)}}}):e("k-box",{attrs:{theme:"info"}},[t._v(t._s(t.empty))])}),[],!1,null,null,null,null).exports,re={props:{breadcrumb:{default:()=>[],type:Array},tab:{type:String},tabs:{default:()=>({}),type:Object}}};const ue=ut({mixins:[re],emits:["crumb","tab"]},(function(){var t=this,e=t._self._c;return e("header",{staticClass:"k-drawer-header"},[e("nav",{staticClass:"k-breadcrumb k-drawer-breadcrumb"},[e("ol",t._l(t.breadcrumb,(function(i,n){return e("li",{key:i.id},[e("k-button",{staticClass:"k-breadcrumb-link",attrs:{icon:i.props.icon,text:i.props.title,current:n===t.breadcrumb.length-1,variant:"dimmed"},on:{click:function(e){return t.$emit("crumb",i.id)}}})],1)})),0)]),e("k-drawer-tabs",{attrs:{tab:t.tab,tabs:t.tabs},on:{open:function(e){return t.$emit("tab",e)}}}),e("nav",{staticClass:"k-drawer-options"},[t._t("default"),e("k-button",{staticClass:"k-drawer-option",attrs:{icon:"check",type:"submit"}})],2)],1)}),[],!1,null,null,null,null).exports;const ce=ut({},(function(){var t=this,e=t._self._c;return"drawer"===t.$panel.notification.context?e("k-notification",{staticClass:"k-drawer-notification"}):t._e()}),[],!1,null,null,null,null).exports;const de=ut({mixins:[{props:{tab:{type:String},tabs:{default:()=>({}),type:[Array,Object]}}}],emits:["open"],computed:{hasTabs(){return this.$helper.object.length(this.tabs)>1}}},(function(){var t=this,e=t._self._c;return t.hasTabs?e("nav",{staticClass:"k-drawer-tabs"},t._l(t.tabs,(function(i){return e("k-button",{key:i.name,staticClass:"k-drawer-tab",attrs:{current:t.tab===i.name,text:i.label},on:{click:function(e){return t.$emit("open",i.name)}}})})),1):t._e()}),[],!1,null,null,null,null).exports,pe={props:{empty:{type:String,default:()=>window.panel.$t("drawer.text.empty")},text:{type:String}}};const he=ut({mixins:[pe]},(function(){var t=this,e=t._self._c;return t.text?e("k-text",{attrs:{html:t.text}}):e("k-box",{attrs:{theme:"info"}},[t._v(t._s(t.empty))])}),[],!1,null,null,null,null).exports,me={install(t){t.component("k-drawer-body",oe),t.component("k-drawer-fields",ae),t.component("k-drawer-header",ue),t.component("k-drawer-notification",ce),t.component("k-drawer-tabs",de),t.component("k-drawer-text",he)}},fe={mixins:[re],props:{disabled:{default:!1,type:Boolean},icon:String,id:String,options:{type:Array},title:String,visible:{default:!1,type:Boolean}}};const ge=ut({mixins:[fe],emits:["cancel","crumb","submit","tab"]},(function(){var t=this,e=t._self._c;return t.visible?e("portal",{attrs:{to:"drawer"}},[e("form",{staticClass:"k-drawer",class:t.$vnode.data.staticClass,attrs:{"aria-disabled":t.disabled,method:"dialog"},on:{submit:function(e){return e.preventDefault(),t.$emit("submit")}}},[e("k-drawer-notification"),e("k-drawer-header",{attrs:{breadcrumb:t.breadcrumb,tab:t.tab,tabs:t.tabs},on:{crumb:function(e){return t.$emit("crumb",e)},tab:function(e){return t.$emit("tab",e)}}},[t._t("options",(function(){return[t._l(t.options,(function(i,n){return[i.dropdown?[e("k-button",t._b({key:"btn-"+n,staticClass:"k-drawer-option",on:{click:function(e){t.$refs["dropdown-"+n][0].toggle()}}},"k-button",i,!1)),e("k-dropdown-content",{key:"dropdown-"+n,ref:"dropdown-"+n,refInFor:!0,attrs:{options:i.dropdown,"align-x":"end",theme:"light"}})]:e("k-button",t._b({key:n,staticClass:"k-drawer-option"},"k-button",i,!1))]}))]}))],2),e("k-drawer-body",[t._t("default")],2)],1)]):t._e()}),[],!1,null,null,null,null).exports,ke={props:{hidden:{type:Boolean},next:{type:Object},prev:{type:Object}}};const be=ut({mixins:[fe,le,ke],emits:["cancel","crumb","input","next","prev","remove","show","submit","tab"]},(function(){var t=this,e=t._self._c;return e("k-form-drawer",t._b({ref:"drawer",staticClass:"k-block-drawer",on:{cancel:function(e){return t.$emit("cancel",e)},crumb:function(e){return t.$emit("crumb",e)},input:function(e){return t.$emit("input",e)},submit:function(e){return t.$emit("submit",e)},tab:function(e){return t.$emit("tab",e)}},scopedSlots:t._u([{key:"options",fn:function(){return[t.hidden?e("k-button",{staticClass:"k-drawer-option",attrs:{icon:"hidden"},on:{click:function(e){return t.$emit("show")}}}):t._e(),e("k-button",{staticClass:"k-drawer-option",attrs:{disabled:!t.prev,icon:"angle-left"},on:{click:function(e){return t.$emit("prev")}}}),e("k-button",{staticClass:"k-drawer-option",attrs:{disabled:!t.next,icon:"angle-right"},on:{click:function(e){return t.$emit("next")}}}),e("k-button",{staticClass:"k-drawer-option",attrs:{icon:"trash"},on:{click:function(e){return t.$emit("remove")}}})]},proxy:!0}])},"k-form-drawer",t.$props,!1))}),[],!1,null,null,null,null).exports;const ve=ut({methods:{isCurrent(t){return this.$panel.drawer.id===t}}},(function(){var t=this,e=t._self._c;return e("div",t._l(t.$panel.drawer.history.milestones,(function(i){return e(i.component,t._g(t._b({key:i.id,tag:"component",attrs:{breadcrumb:t.$panel.drawer.breadcrumb,disabled:!1===t.isCurrent(i.id),visible:!0}},"component",t.isCurrent(i.id)?t.$panel.drawer.props:i.props,!1),t.isCurrent(i.id)?t.$panel.drawer.listeners():i.on))})),1)}),[],!1,null,null,null,null).exports;const ye=ut({mixins:[fe,le],emits:["cancel","crumb","input","submit","tab"]},(function(){var t=this,e=t._self._c;return e("k-drawer",t._b({ref:"drawer",staticClass:"k-form-drawer",on:{cancel:function(e){return t.$emit("cancel")},crumb:function(e){return t.$emit("crumb",e)},submit:function(e){return t.$emit("submit",t.value)},tab:function(e){return t.$emit("tab",e)}}},"k-drawer",t.$props,!1),[t._t("options",null,{slot:"options"}),e("k-drawer-fields",{attrs:{fields:t.fields,value:t.value},on:{input:function(e){return t.$emit("input",e)},submit:function(e){return t.$emit("submit",e)}}})],2)}),[],!1,null,null,null,null).exports;const $e=ut({mixins:[fe,le,{props:{next:{type:Object},prev:{type:Object}}}],emits:["cancel","crumb","input","next","prev","remove","submit","tab"]},(function(){var t=this,e=t._self._c;return e("k-form-drawer",t._b({ref:"drawer",staticClass:"k-structure-drawer",on:{cancel:function(e){return t.$emit("cancel",e)},crumb:function(e){return t.$emit("crumb",e)},input:function(e){return t.$emit("input",e)},submit:function(e){return t.$emit("submit",e)},tab:function(e){return t.$emit("tab",e)}},scopedSlots:t._u([{key:"options",fn:function(){return[e("k-button",{staticClass:"k-drawer-option",attrs:{disabled:!t.prev,icon:"angle-left"},on:{click:function(e){return t.$emit("prev")}}}),e("k-button",{staticClass:"k-drawer-option",attrs:{disabled:!t.next,icon:"angle-right"},on:{click:function(e){return t.$emit("next")}}}),e("k-button",{staticClass:"k-drawer-option",attrs:{icon:"trash"},on:{click:function(e){return t.$emit("remove")}}})]},proxy:!0}])},"k-form-drawer",t.$props,!1))}),[],!1,null,null,null,null).exports;const we=ut({mixins:[fe,pe],emits:["cancel","crumb","input","submit","tab"]},(function(){var t=this,e=t._self._c;return e("k-drawer",t._b({ref:"drawer",staticClass:"k-text-drawer",on:{cancel:function(e){return t.$emit("cancel")},crumb:function(e){return t.$emit("crumb",e)},submit:function(e){return t.$emit("submit",t.value)},tab:function(e){return t.$emit("tab",e)}}},"k-drawer",t.$props,!1),[t._t("options",null,{slot:"options"}),e("k-dialog-text",{attrs:{text:t.text}})],2)}),[],!1,null,null,null,null).exports,xe={install(t){t.use(me),t.component("k-drawer",ge),t.component("k-block-drawer",be),t.component("k-fiber-drawer",ve),t.component("k-form-drawer",ye),t.component("k-structure-drawer",$e),t.component("k-text-drawer",we)}};const _e=ut({mounted(){window.panel.deprecated(" will be removed in a future version. Since Kirby 4.0, you don't need it anymore as wrapper element. Use `` as standalone instead.")}},(function(){return(0,this._self._c)("span",{staticClass:"k-dropdown",on:{click:function(t){t.stopPropagation()}}},[this._t("default")],2)}),[],!1,null,null,null,null).exports;let Ce=null;const Se=ut({props:{align:{type:String},alignX:{type:String,default:"start"},alignY:{type:String,default:"bottom"},disabled:{type:Boolean,default:!1},navigate:{default:!0,type:Boolean},options:[Array,Function,String],theme:{type:String,default:"dark"}},emits:["action","close","open"],data(){return{axis:{x:this.alignX,y:this.alignY},position:{x:0,y:0},isOpen:!1,items:[],opener:null}},mounted(){this.align&&window.panel.deprecated(": `align` prop will be removed in a future version. Use the `alignX` prop instead.")},methods:{close(){var t;null==(t=this.$refs.dropdown)||t.close()},async fetchOptions(t){return this.options?"string"==typeof this.options?this.$dropdown(this.options)(t):"function"==typeof this.options?this.options(t):Array.isArray(this.options)?t(this.options):void 0:t(this.items)},focus(t=0){this.$refs.navigate.focus(t)},onClick(){this.close()},onClose(){this.resetPosition(),this.isOpen=Ce=!1,this.$emit("close"),window.removeEventListener("resize",this.setPosition)},async onOpen(){this.isOpen=!0;const t=window.scrollY;Ce=this,await this.$nextTick(),this.$el&&this.opener&&(window.addEventListener("resize",this.setPosition),await this.setPosition(),window.scrollTo(0,t),this.$emit("open"))},onOptionClick(t){return this.close(),"function"==typeof t.click?t.click.call(this):"string"==typeof t.click?this.$emit("action",t.click):void(t.click&&(t.click.name&&this.$emit(t.click.name,t.click.payload),t.click.global&&this.$events.emit(t.click.global,t.click.payload)))},open(t){var e,i;if(!0===this.disabled)return!1;Ce&&Ce!==this&&Ce.close(),this.opener=t??(null==(e=window.event)?void 0:e.target.closest("button"))??(null==(i=window.event)?void 0:i.target),this.fetchOptions((t=>{this.items=t,this.onOpen()}))},async setPosition(){this.axis={x:this.alignX??this.align,y:this.alignY},"right"===this.axis.x?this.axis.x="end":"left"===this.axis.x&&(this.axis.x="start"),"rtl"===this.$panel.direction&&("start"===this.axis.x?this.axis.x="end":"end"===this.axis.x&&(this.axis.x="start")),this.opener.$el&&(this.opener=this.opener.$el);const t=this.opener.getBoundingClientRect();this.position.x=t.left+window.scrollX+t.width,this.position.y=t.top+window.scrollY+t.height,!0!==this.$el.open&&this.$el.showModal(),await this.$nextTick();const e=this.$el.getBoundingClientRect(),i=10;"end"===this.axis.x?t.left-e.widthwindow.innerWidth-i&&e.width+ie.top&&(this.axis.y="bottom"):t.top+e.height>window.innerHeight-i&&e.height+i!0===t.default));t.push(this.item(e)),t.push("-");const i=this.languages.filter((t=>!1===t.default));for(const n of i)t.push(this.item(n));return t}},methods:{change(t){this.$reload({query:{language:t.code}})},item(t){return{click:()=>this.change(t),current:t.code===this.language.code,text:t.name}}}},(function(){var t=this,e=t._self._c;return t.languages.length>1?e("div",{staticClass:"k-languages-dropdown"},[e("k-button",{attrs:{dropdown:!0,text:t.code,icon:"translate",responsive:"text",size:"sm",variant:"filled"},on:{click:function(e){return t.$refs.languages.toggle()}}}),e("k-dropdown-content",{ref:"languages",attrs:{options:t.options}})],1):t._e()}),[],!1,null,null,null,null).exports;const Ae=ut({props:{align:{type:String,default:"right"},disabled:{type:Boolean},icon:{type:String,default:"dots"},options:{type:[Array,Function,String],default:()=>[]},text:{type:[Boolean,String],default:!0},theme:{type:String,default:"dark"},size:String,variant:String},emits:["action","option"],computed:{hasSingleOption(){return Array.isArray(this.options)&&1===this.options.length}},methods:{onAction(t,e,i){"function"==typeof t?t.call(this):(this.$emit("action",t,e,i),this.$emit("option",t,e,i))},toggle(t=this.$el){this.$refs.options.toggle(t)}}},(function(){var t=this,e=t._self._c;return t.hasSingleOption?e("k-button",{staticClass:"k-options-dropdown-toggle",attrs:{disabled:t.disabled,icon:t.options[0].icon??t.icon,size:t.options[0].size??t.size,title:t.options[0].title??t.options[0].tooltip??t.options[0].text,variant:t.options[0].variant??t.variant},on:{click:function(e){return t.onAction(t.options[0].option??t.options[0].click,t.options[0],0)}}},[!0===t.text?[t._v(" "+t._s(t.options[0].text)+" ")]:!1!==t.text?[t._v(" "+t._s(t.text)+" ")]:t._e()],2):t.options.length?e("div",{staticClass:"k-options-dropdown"},[e("k-button",{staticClass:"k-options-dropdown-toggle",attrs:{disabled:t.disabled,dropdown:!0,icon:t.icon,size:t.size,text:!0!==t.text&&!1!==t.text?t.text:null,title:t.$t("options"),variant:t.variant},on:{click:function(e){return t.$refs.options.toggle()}}}),e("k-dropdown-content",{ref:"options",staticClass:"k-options-dropdown-content",attrs:{"align-x":t.align,options:t.options},on:{action:t.onAction}})],1):t._e()}),[],!1,null,null,null,null).exports,je={mixins:[V,W,X,nt,at]},Ie={mixins:[je],inheritAttrs:!1,emits:["input"],methods:{focus(){this.$el.focus()}}},De={mixins:[V,W,st,at],props:{ignore:{default:()=>[],type:Array},max:Number,min:Number,search:{default:!0,type:[Object,Boolean]}}},Ee={mixins:[je,De],props:{create:{type:[Boolean,Object],default:!1},multiple:{type:Boolean,default:!0},value:{type:[Array,String],default:()=>[]}},emits:["create","escape","input"]};const Te=ut({mixins:[Ie,Ee],data(){return{display:this.search.display??!0,query:""}},computed:{choices(){let t=this.filteredOptions;return!0!==this.display&&(t=t.slice(0,this.display)),t.map((t=>({...t,disabled:t.disabled||this.isFull&&!1===this.value.includes(t.value),text:this.highlight(t.text)})))},filteredOptions(){if(!(this.query.length<(this.search.min??0)))return this.$helper.array.search(this.options,this.query,{field:"text"})},isFull(){return this.max&&this.value.length>=this.max},placeholder(){return this.search.placeholder?this.search.placeholder:this.options.length>0?this.$t("filter")+"…":this.$t("enter")+"…"},showCreate(){var t;if(!1===this.create)return!1;if(this.isFull)return!1;if(0===this.query.trim().length)return!1;if(!0===this.ignore.includes(this.query))return!1;if(!0===(null==(t=this.create.ignore)?void 0:t.includes(this.query)))return!1;return 0===this.options.filter((t=>t.text===this.query||t.value===this.query)).length},showEmpty(){return!1===this.create&&0===this.filteredOptions.length}},watch:{value:{handler(){this.$emit("invalid",this.$v.$invalid,this.$v)},immediate:!0}},methods:{add(){this.showCreate&&this.$emit("create",this.query)},enter(t){var e;null==(e=t.target)||e.click()},escape(){0===this.query.length?this.$emit("escape"):this.query=""},focus(){var t;this.$refs.search?this.$refs.search.focus():null==(t=this.$refs.options)||t.focus()},highlight(t){if(t=this.$helper.string.stripHTML(t),this.query.length>0){const e=new RegExp(`(${RegExp.escape(this.query)})`,"ig");return t.replace(e,"$1")}return t},input(t){this.$emit("input",t)}},validations(){return{value:{required:!this.required||t.required,minLength:!this.min||t.minLength(this.min),maxLength:!this.max||t.maxLength(this.max)}}}},(function(){var t=this,e=t._self._c;return e("k-navigate",{staticClass:"k-picklist-input",attrs:{element:"nav",axis:"y",select:"input[type=search], label, .k-picklist-input-body button"},on:{prev:function(e){return t.$emit("escape")}}},[t.search?e("header",{staticClass:"k-picklist-input-header"},[e("div",{staticClass:"k-picklist-input-search"},[e("k-search-input",{ref:"search",attrs:{autofocus:t.autofocus,disabled:t.disabled,placeholder:t.placeholder,value:t.query},on:{input:function(e){t.query=e}},nativeOn:{keydown:[function(e){return!e.type.indexOf("key")&&t._k(e.keyCode,"escape",void 0,e.key,void 0)?null:(e.preventDefault(),t.escape.apply(null,arguments))},function(e){return!e.type.indexOf("key")&&t._k(e.keyCode,"enter",13,e.key,"Enter")?null:(e.preventDefault(),t.add.apply(null,arguments))}]}}),t.showCreate?e("k-button",{staticClass:"k-picklist-input-create",attrs:{icon:"add",size:"xs"},on:{click:t.add}}):t._e()],1)]):t._e(),t.filteredOptions.length?[e("div",{staticClass:"k-picklist-input-body"},[e(t.multiple?"k-checkboxes-input":"k-radio-input",{ref:"options",tag:"component",staticClass:"k-picklist-input-options",attrs:{disabled:t.disabled,options:t.choices,value:t.value},on:{input:t.input},nativeOn:{keydown:function(e){return!e.type.indexOf("key")&&t._k(e.keyCode,"enter",13,e.key,"Enter")?null:(e.preventDefault(),t.enter.apply(null,arguments))}}}),!0!==t.display&&t.filteredOptions.length>t.display?e("k-button",{staticClass:"k-picklist-input-more",attrs:{icon:"angle-down"},on:{click:function(e){t.display=!0}}},[t._v(" "+t._s(t.$t("options.all",{count:t.filteredOptions.length}))+" ")]):t._e()],1)]:t.showEmpty?[e("div",{staticClass:"k-picklist-input-body"},[e("p",{staticClass:"k-picklist-input-empty"},[t._v(" "+t._s(t.$t("options.none"))+" ")])])]:t._e()],2)}),[],!1,null,null,null,null).exports;const Le=ut({mixins:[Ee],emits:["create","input"],methods:{close(){this.$refs.dropdown.close()},add(t){this.$emit("create",t)},input(t){this.$emit("input",t)},open(t){this.$refs.dropdown.open(t)},toggle(){this.$refs.dropdown.toggle()}}},(function(){var t=this,e=t._self._c;return e("k-dropdown-content",{ref:"dropdown",staticClass:"k-picklist-dropdown",attrs:{"align-x":"start",disabled:t.disabled,navigate:!1},nativeOn:{click:function(t){t.stopPropagation()}}},[e("k-picklist-input",t._b({on:{create:t.add,input:t.input,escape:function(e){return t.$refs.dropdown.close()}},nativeOn:{click:function(t){t.stopPropagation()}}},"k-picklist-input",t.$props,!1))],1)}),[],!1,null,null,null,null).exports,Be={install(t){t.component("k-dropdown",_e),t.component("k-dropdown-content",Se),t.component("k-dropdown-item",Oe),t.component("k-languages-dropdown",Me),t.component("k-options-dropdown",Ae),t.component("k-picklist-dropdown",Le)}};const qe=ut({props:{html:{type:Boolean,default:!1},limit:{type:Number,default:10},skip:{type:Array,default:()=>[]},options:Array,query:String},emits:["leave","search","select"],data:()=>({matches:[],selected:{text:null}}),mounted(){window.panel.deprecated(" will be removed in a future version.")},methods:{close(){this.$refs.dropdown.close()},onSelect(t){this.$emit("select",t),this.$refs.dropdown.close()},search(t){const e=this.options.filter((t=>-1!==this.skip.indexOf(t.value)));this.matches=this.$helper.array.search(e,t,{field:"text",limit:this.limit}),this.$emit("search",t,this.matches),this.$refs.dropdown.open()}}},(function(){var t=this,e=t._self._c;return e("div",{staticClass:"k-autocomplete"},[t._t("default"),e("k-dropdown-content",{ref:"dropdown",attrs:{autofocus:!0},on:{leave:function(e){return t.$emit("leave")}}},t._l(t.matches,(function(i,n){return e("k-dropdown-item",t._b({key:n,nativeOn:{mousedown:function(e){return t.onSelect(i)},keydown:[function(e){return!e.type.indexOf("key")&&t._k(e.keyCode,"tab",9,e.key,"Tab")?null:(e.preventDefault(),t.onSelect(i))},function(e){return!e.type.indexOf("key")&&t._k(e.keyCode,"enter",13,e.key,"Enter")?null:(e.preventDefault(),t.onSelect(i))},function(e){return!e.type.indexOf("key")&&t._k(e.keyCode,"left",37,e.key,["Left","ArrowLeft"])||"button"in e&&0!==e.button?null:(e.preventDefault(),t.close.apply(null,arguments))},function(e){return!e.type.indexOf("key")&&t._k(e.keyCode,"backspace",void 0,e.key,void 0)?null:(e.preventDefault(),t.close.apply(null,arguments))},function(e){return!e.type.indexOf("key")&&t._k(e.keyCode,"delete",[8,46],e.key,["Backspace","Delete","Del"])?null:(e.preventDefault(),t.close.apply(null,arguments))}]}},"k-dropdown-item",i,!1),[e("span",{domProps:{innerHTML:t._s(t.html?i.text:t.$esc(i.text))}})])})),1),t._v(" "+t._s(t.query)+" ")],2)}),[],!1,null,null,null,null).exports;const Pe=ut({props:{count:Number,min:Number,max:Number,required:{type:Boolean,default:!1}},computed:{valid(){return!1===this.required&&0===this.count||(!0!==this.required||0!==this.count)&&(!(this.min&&this.countthis.max))}}},(function(){var t=this,e=t._self._c;return e("span",{staticClass:"k-counter",attrs:{"data-invalid":!t.valid}},[e("span",[t._v(t._s(t.count))]),t.min||t.max?e("span",{staticClass:"k-counter-rules"},[t.min&&t.max?[t._v(t._s(t.min)+"–"+t._s(t.max))]:t.min?[t._v("≥ "+t._s(t.min))]:t.max?[t._v("≤ "+t._s(t.max))]:t._e()],2):t._e()])}),[],!1,null,null,null,null).exports;const Ne=ut({props:{disabled:Boolean,config:Object,fields:{type:[Array,Object],default:()=>[]},novalidate:{type:Boolean,default:!1},value:{type:Object,default:()=>({})}},emits:["focus","input","submit"],data:()=>({errors:{}}),methods:{focus(t){var e,i;null==(i=null==(e=this.$refs.fields)?void 0:e.focus)||i.call(e,t)},onFocus(t,e,i){this.$emit("focus",t,e,i)},onInput(t,e,i){this.$emit("input",t,e,i)},onInvalid(t){this.$emit("invalid",t)},onSubmit(){this.$emit("submit",this.value)},submit(){this.$refs.submitter.click()}}},(function(){var t=this,e=t._self._c;return e("form",{ref:"form",staticClass:"k-form",attrs:{method:"POST",autocomplete:"off",novalidate:""},on:{submit:function(e){return e.preventDefault(),t.onSubmit.apply(null,arguments)}}},[t._t("header"),t._t("default",(function(){return[e("k-fieldset",{ref:"fields",attrs:{disabled:t.disabled,fields:t.fields,novalidate:t.novalidate,value:t.value},on:{focus:t.onFocus,input:t.onInput,invalid:t.onInvalid,submit:t.onSubmit}})]})),t._t("footer"),e("input",{ref:"submitter",staticClass:"k-form-submitter",attrs:{type:"submit"}})],2)}),[],!1,null,null,null,null).exports;const ze=ut({props:{lock:[Boolean,Object]},data:()=>({isLoading:null,isLocking:null}),computed:{api(){return[this.$panel.view.path+"/lock",null,null,!0]},buttons(){return"unlock"===this.mode?[{icon:"check",text:this.$t("lock.isUnlocked"),click:()=>this.resolve()},{icon:"download",text:this.$t("download"),click:()=>this.download()}]:"lock"===this.mode?[{icon:this.lock.data.unlockable?"unlock":"loader",text:this.$t("lock.isLocked",{email:this.$esc(this.lock.data.email)}),title:this.$t("lock.unlock"),disabled:!this.lock.data.unlockable,click:()=>this.unlock()}]:"changes"===this.mode?[{icon:"undo",text:this.$t("revert"),click:()=>this.revert()},{icon:"check",text:this.$t("save"),click:()=>this.save()}]:[]},disabled(){return"unlock"!==this.mode&&("lock"===this.mode?!this.lock.data.unlockable:"changes"===this.mode&&this.isDisabled)},hasChanges(){return this.$store.getters["content/hasChanges"]()},isDisabled(){return!1===this.$store.state.content.status.enabled},isLocked(){return"lock"===this.lockState},isUnlocked(){return"unlock"===this.lockState},mode(){return null!==this.lockState?this.lockState:!0===this.hasChanges?"changes":null},lockState(){return this.supportsLocking&&this.lock?this.lock.state:null},supportsLocking(){return!1!==this.lock},theme(){return"lock"===this.mode?"negative":"unlock"===this.mode?"info":"changes"===this.mode?"notice":null}},watch:{hasChanges:{handler(t,e){!0===this.supportsLocking&&!1===this.isLocked&&!1===this.isUnlocked&&(!0===t?(this.locking(),this.isLocking=setInterval(this.locking,3e4)):e&&(clearInterval(this.isLocking),this.locking(!1)))},immediate:!0},isLocked(t){!1===t&&this.$events.emit("model.reload")}},mounted(){this.supportsLocking&&(this.isLoading=setInterval(this.check,1e4)),this.$events.on("view.save",this.save)},destroyed(){clearInterval(this.isLoading),clearInterval(this.isLocking),this.$events.off("view.save",this.save)},methods:{async check(){if(!1===this.$panel.isOffline){const{lock:t}=await this.$api.get(...this.api);Vue.set(this.$panel.view.props,"lock",t)}},download(){let t="";const e=this.$store.getters["content/changes"]();for(const n in e){const i=e[n];t+=n+": \n\n","object"==typeof i&&Object.keys(i).length||Array.isArray(i)&&i.length?t+=JSON.stringify(i,null,2):t+=i,t+="\n\n----\n\n"}let i=document.createElement("a");i.setAttribute("href","data:text/plain;charset=utf-8,"+encodeURIComponent(t)),i.setAttribute("download",this.$panel.view.path+".txt"),i.style.display="none",document.body.appendChild(i),i.click(),document.body.removeChild(i)},async locking(t=!0){if(!0!==this.$panel.isOffline)if(!0===t)try{await this.$api.patch(...this.api)}catch{clearInterval(this.isLocking),this.$store.dispatch("content/revert")}else clearInterval(this.isLocking),await this.$api.delete(...this.api)},async resolve(){await this.unlock(!1),this.$store.dispatch("content/revert")},revert(){this.$panel.dialog.open({component:"k-remove-dialog",props:{submitButton:{icon:"undo",text:this.$t("revert")},text:this.$t("revert.confirm")},on:{submit:()=>{this.$store.dispatch("content/revert"),this.$panel.dialog.close()}}})},async save(t){var e;null==(e=null==t?void 0:t.preventDefault)||e.call(t),await this.$store.dispatch("content/save"),this.$events.emit("model.update"),this.$panel.notification.success()},async unlock(t=!0){const e=[this.$panel.view.path+"/unlock",null,null,!0];!0!==t?(await this.$api.delete(...e),this.$reload({silent:!0})):this.$panel.dialog.open({component:"k-remove-dialog",props:{submitButton:{icon:"unlock",text:this.$t("lock.unlock")},text:this.$t("lock.unlock.submit",{email:this.$esc(this.lock.data.email)})},on:{submit:async()=>{await this.$api.patch(...e),this.$panel.dialog.close(),this.$reload({silent:!0})}}})}}},(function(){var t=this,e=t._self._c;return t.buttons.length>0?e("k-button-group",{staticClass:"k-form-buttons",attrs:{layout:"collapsed"}},t._l(t.buttons,(function(i){return e("k-button",t._b({key:i.icon,attrs:{size:"sm",variant:"filled",disabled:t.isDisabled,responsive:!0,theme:t.theme}},"k-button",i,!1))})),1):t._e()}),[],!1,null,null,null,null).exports,Fe={mixins:[W,G,X,Q,nt,at],props:{counter:[Boolean,Object],endpoints:Object,input:[String,Number],translate:Boolean,type:String}};const Ye=ut({mixins:[Fe],inheritAttrs:!1,emits:["blur","focus"]},(function(){var t=this,e=t._self._c;return e("div",{class:"k-field k-field-name-"+t.name,attrs:{"data-disabled":t.disabled,"data-translate":t.translate},on:{focusin:function(e){return t.$emit("focus",e)},focusout:function(e){return t.$emit("blur",e)}}},[t._t("header",(function(){return[e("header",{staticClass:"k-field-header"},[t._t("label",(function(){return[e("k-label",{attrs:{input:t.input,required:t.required,title:t.label,type:"field"}},[t._v(" "+t._s(t.label)+" ")])]})),t._t("options"),t._t("counter",(function(){return[t.counter?e("k-counter",t._b({staticClass:"k-field-counter",attrs:{required:t.required}},"k-counter",t.counter,!1)):t._e()]}))],2)]})),t._t("default"),t._t("footer",(function(){return[t.help||t.$slots.help?e("footer",{staticClass:"k-field-footer"},[t._t("help",(function(){return[t.help?e("k-text",{staticClass:"k-help k-field-help",attrs:{html:t.help}}):t._e()]}))],2):t._e()]}))],2)}),[],!1,null,null,null,null).exports;const Re=ut({props:{config:Object,disabled:Boolean,fields:{type:[Array,Object],default:()=>({})},novalidate:{type:Boolean,default:!1},value:{type:Object,default:()=>({})}},emits:["focus","input","invalid","submit"],data:()=>({errors:{}}),methods:{focus(t){if(t)return void(this.hasField(t)&&"function"==typeof this.$refs[t][0].focus&&this.$refs[t][0].focus());const e=Object.keys(this.$refs)[0];this.focus(e)},hasFieldType(t){return this.$helper.isComponent(`k-${t}-field`)},hasField(t){var e;return null==(e=this.$refs[t])?void 0:e[0]},onInvalid(t,e,i,n){this.errors[n]=e,this.$emit("invalid",this.errors)},onInput(t,e,i){const n=this.value;this.$set(n,i,t),this.$emit("input",n,e,i)},hasErrors(){return this.$helper.object.length(this.errors)>0}}},(function(){var t=this,e=t._self._c;return e("div",{staticClass:"k-fieldset"},[e("k-grid",{attrs:{variant:"fields"}},[t._l(t.fields,(function(i,n){return[t.$helper.field.isVisible(i,t.value)?e("k-column",{key:i.signature,attrs:{width:i.width}},[t.hasFieldType(i.type)?e("k-"+i.type+"-field",t._b({ref:n,refInFor:!0,tag:"component",attrs:{disabled:t.disabled||i.disabled,"form-data":t.value,name:n,novalidate:t.novalidate,value:t.value[n]},on:{input:function(e){return t.onInput(e,i,n)},focus:function(e){return t.$emit("focus",e,i,n)},invalid:(e,s)=>t.onInvalid(e,s,i,n),submit:function(e){return t.$emit("submit",e,i,n)}}},"component",i,!1)):e("k-box",{attrs:{theme:"negative"}},[e("k-text",{attrs:{size:"small"}},[t._v(" "+t._s(t.$t("error.field.type.missing",{name:n,type:i.type}))+" ")])],1)],1):t._e()]}))],2)],1)}),[],!1,null,null,null,null).exports,Ue={mixins:[U,K,W,Z],inheritAttrs:!1,props:{autofocus:Boolean,type:String,icon:[String,Boolean],novalidate:{type:Boolean,default:!1},value:{type:[String,Boolean,Number,Object,Array],default:null}}};const He=ut({mixins:[Ue],data(){return{isInvalid:this.invalid,listeners:{...this.$listeners,invalid:(t,e)=>{this.isInvalid=t,this.$emit("invalid",t,e)}}}},computed:{inputProps(){return{...this.$props,...this.$attrs}}},watch:{invalid(){this.isInvalid=this.invalid}},methods:{blur(t){(null==t?void 0:t.relatedTarget)&&!1===this.$el.contains(t.relatedTarget)&&this.trigger(null,"blur")},focus(t){this.trigger(t,"focus")},select(t){this.trigger(t,"select")},trigger(t,e){var i,n,s;if("INPUT"===(null==(i=null==t?void 0:t.target)?void 0:i.tagName)&&"function"==typeof(null==(n=null==t?void 0:t.target)?void 0:n[e]))return void t.target[e]();if("function"==typeof(null==(s=this.$refs.input)?void 0:s[e]))return void this.$refs.input[e]();const o=this.$el.querySelector("input, select, textarea");"function"==typeof(null==o?void 0:o[e])&&o[e]()}}},(function(){var t=this,e=t._self._c;return e("div",{staticClass:"k-input",attrs:{"data-disabled":t.disabled,"data-invalid":!t.novalidate&&t.isInvalid,"data-type":t.type}},[t.$slots.before||t.before?e("span",{staticClass:"k-input-description k-input-before",on:{click:t.focus}},[t._t("before",(function(){return[t._v(t._s(t.before))]}))],2):t._e(),e("span",{staticClass:"k-input-element",on:{click:function(e){return e.stopPropagation(),t.focus.apply(null,arguments)}}},[t._t("default",(function(){return[e("k-"+t.type+"-input",t._g(t._b({ref:"input",tag:"component",attrs:{value:t.value}},"component",t.inputProps,!1),t.listeners))]}))],2),t.$slots.after||t.after?e("span",{staticClass:"k-input-description k-input-after",on:{click:t.focus}},[t._t("after",(function(){return[t._v(t._s(t.after))]}))],2):t._e(),t.$slots.icon||t.icon?e("span",{staticClass:"k-input-icon",on:{click:t.focus}},[t._t("icon",(function(){return[e("k-icon",{attrs:{type:t.icon}})]}))],2):t._e()])}),[],!1,null,null,null,null).exports;const Ve=ut({props:{accept:{type:String,default:"*"},attributes:{type:Object},max:{type:Number},method:{type:String,default:"POST"},multiple:{type:Boolean,default:!0},url:{type:String}},emits:["success"],methods:{open(t){window.panel.deprecated(" will be removed in a future version. Use `$panel.upload.open()` instead."),this.$panel.upload.pick(this.params(t))},params(t){return{...this.$props,...t??{},on:{complete:(t,e)=>{this.$emit("success",t,e)}}}},select(t){this.$panel.upload.select(t.target.files)},drop(t,e){window.panel.deprecated(" will be removed in a future version. Use `$panel.upload.select()` instead."),this.$panel.upload.open(t,this.params(e))},upload(t,e){window.panel.deprecated(" will be removed in a future version. Use `$panel.upload.select()` instead."),this.$panel.upload.select(t,this.params(e)),this.$panel.upload.start()}},render:()=>""},null,null,!1,null,null,null,null).exports,Ke={props:{content:{default:()=>({}),type:[Array,Object]},fieldset:{default:()=>({}),type:Object}}};const We=ut({mixins:[Ke],inheritAttrs:!1,computed:{icon(){return this.fieldset.icon??"box"},label(){if(!this.fieldset.label||0===this.fieldset.label.length)return!1;if(this.fieldset.label===this.name)return!1;let t=this.$helper.string.template(this.fieldset.label,this.content);return"…"!==t&&(t=this.$helper.string.stripHTML(t),this.$helper.string.unescapeHTML(t))},name(){return this.fieldset.name??this.fieldset.label}}},(function(){var t=this,e=t._self._c;return e("div",{staticClass:"k-block-title"},[e("k-icon",{staticClass:"k-block-icon",attrs:{type:t.icon}}),t.name?e("span",{staticClass:"k-block-name"},[t._v(" "+t._s(t.name)+" ")]):t._e(),t.label?e("span",{staticClass:"k-block-label"},[t._v(" "+t._s(t.label)+" ")]):t._e()],1)}),[],!1,null,null,null,null).exports,Je={mixins:[Ke,W],props:{endpoints:{default:()=>({}),type:[Array,Object]},id:String}};const Ge=ut({mixins:[Je],inheritAttrs:!1,methods:{field(t,e=null){let i=null;for(const n of Object.values(this.fieldset.tabs??{}))n.fields[t]&&(i=n.fields[t]);return i??e},open(){this.$emit("open")},update(t){this.$emit("update",{...this.content,...t})}}},(function(){var t=this;return(0,t._self._c)("k-block-title",{attrs:{content:t.content,fieldset:t.fieldset},nativeOn:{dblclick:function(e){return t.$emit("open")}}})}),[],!1,null,null,null,null).exports,Xe={props:{isBatched:Boolean,isFull:Boolean,isHidden:Boolean,isMergable:Boolean}};const Ze=ut({mixins:[Xe],props:{isEditable:Boolean,isSplitable:Boolean},emits:["chooseToAppend","chooseToConvert","chooseToPrepend","copy","duplicate","hide","merge","open","paste","remove","removeSelected","show","split","sortDown","sortUp"],computed:{buttons(){return this.isBatched?[{icon:"template",title:this.$t("copy"),click:()=>this.$emit("copy")},{when:this.isMergable,icon:"merge",title:this.$t("merge"),click:()=>this.$emit("merge")},{icon:"trash",title:this.$t("remove"),click:()=>this.$emit("removeSelected")}]:[{when:this.isEditable,icon:"edit",title:this.$t("edit"),click:()=>this.$emit("open")},{icon:"add",title:this.$t("insert.after"),disabled:this.isFull,click:()=>this.$emit("chooseToAppend")},{icon:"trash",title:this.$t("delete"),click:()=>this.$emit("remove")},{icon:"sort",title:this.$t("sort.drag"),class:"k-sort-handle",key:t=>this.sort(t)},{icon:"dots",title:this.$t("more"),dropdown:[{icon:"angle-up",label:this.$t("insert.before"),disabled:this.isFull,click:()=>this.$emit("chooseToPrepend")},{icon:"angle-down",label:this.$t("insert.after"),disabled:this.isFull,click:()=>this.$emit("chooseToAppend")},"-",{when:this.isEditable,icon:"edit",label:this.$t("edit"),click:()=>this.$emit("open")},{icon:"refresh",label:this.$t("field.blocks.changeType"),click:()=>this.$emit("chooseToConvert")},{when:this.isSplitable,icon:"split",label:this.$t("split"),click:()=>this.$emit("split")},"-",{icon:"template",label:this.$t("copy"),click:()=>this.$emit("copy")},{icon:"download",label:this.$t("paste.after"),disabled:this.isFull,click:()=>this.$emit("paste")},"-",{icon:this.isHidden?"preview":"hidden",label:this.isHidden?this.$t("show"):this.$t("hide"),click:()=>this.$emit(this.isHidden?"show":"hide")},{icon:"copy",label:this.$t("duplicate"),click:()=>this.$emit("duplicate")},"-",{icon:"trash",label:this.$t("delete"),click:()=>this.$emit("remove")}]}]}},methods:{open(){this.$refs.options.open()},sort(t){switch(t.preventDefault(),t.key){case"ArrowUp":this.$emit("sortUp");break;case"ArrowDown":this.$emit("sortDown")}}}},(function(){return(0,this._self._c)("k-toolbar",{staticClass:"k-block-options",attrs:{buttons:this.buttons},nativeOn:{mousedown:function(t){t.preventDefault()}}})}),[],!1,null,null,null,null).exports;const Qe=ut({mixins:[Je,Xe],inheritAttrs:!1,props:{attrs:{default:()=>({}),type:[Array,Object]},isLastSelected:Boolean,isSelected:Boolean,name:String,next:Object,prev:Object,type:String},emits:["append","chooseToAppend","chooseToConvert","chooseToPrepend","close","copy","duplicate","focus","hide","merge","open","paste","prepend","remove","selectDown","selectUp","show","sortDown","sortUp","split","submit","update"],computed:{className(){let t=["k-block-type-"+this.type];return this.fieldset.preview&&this.fieldset.preview!==this.type&&t.push("k-block-type-"+this.fieldset.preview),!1===this.wysiwyg&&t.push("k-block-type-default"),t},containerType(){const t=this.fieldset.preview;return!1!==t&&(t&&this.$helper.isComponent("k-block-type-"+t)?t:!!this.$helper.isComponent("k-block-type-"+this.type)&&this.type)},customComponent(){return this.wysiwyg?this.wysiwygComponent:"k-block-type-default"},isDisabled(){return!0===this.disabled||!0===this.fieldset.disabled},isEditable(){return!1!==this.fieldset.editable},listeners(){return{append:t=>this.$emit("append",t),chooseToAppend:t=>this.$emit("chooseToAppend",t),chooseToConvert:t=>this.$emit("chooseToConvert",t),chooseToPrepend:t=>this.$emit("chooseToPrepend",t),close:()=>this.$emit("close"),copy:()=>this.$emit("copy"),duplicate:()=>this.$emit("duplicate"),focus:()=>this.$emit("focus"),hide:()=>this.$emit("hide"),merge:()=>this.$emit("merge"),open:t=>this.open(t),paste:()=>this.$emit("paste"),prepend:t=>this.$emit("prepend",t),remove:()=>this.remove(),removeSelected:()=>this.$emit("removeSelected"),show:()=>this.$emit("show"),sortDown:()=>this.$emit("sortDown"),sortUp:()=>this.$emit("sortUp"),split:t=>this.$emit("split",t),update:t=>this.$emit("update",t)}},tabs(){const t=this.fieldset.tabs??{};for(const[e,i]of Object.entries(t))for(const[n]of Object.entries(i.fields??{}))t[e].fields[n].section=this.name,t[e].fields[n].endpoints={field:this.endpoints.field+"/fieldsets/"+this.type+"/fields/"+n,section:this.endpoints.section,model:this.endpoints.model};return t},wysiwyg(){return!1!==this.wysiwygComponent},wysiwygComponent(){return!!this.containerType&&"k-block-type-"+this.containerType}},methods:{backspace(t){if(t.target.matches("[contenteditable], input, textarea"))return!1;t.preventDefault(),this.remove()},close(){this.$panel.drawer.close(this.id)},focus(){var t,e;"function"==typeof(null==(t=this.$refs.editor)?void 0:t.focus)?this.$refs.editor.focus():null==(e=this.$refs.container)||e.focus()},goTo(t){var e;t&&(null==(e=t.$refs.container)||e.focus(),t.open(null,!0))},isSplitable(){var t;return!0!==this.isFull&&(!!this.$refs.editor&&((this.$refs.editor.isSplitable??!0)&&"function"==typeof(null==(t=this.$refs.editor)?void 0:t.split)))},onClose(){this.$emit("close"),this.focus()},onFocus(t){this.disabled||this.$emit("focus",t)},onFocusIn(t){var e,i;this.disabled||(null==(i=null==(e=this.$refs.options)?void 0:e.$el)?void 0:i.contains(t.target))||this.$emit("focus",t)},onInput(t){this.$emit("update",t)},open(t,e=!1){!this.isEditable||this.isBatched||this.isDisabled||(this.$panel.drawer.open({component:"k-block-drawer",id:this.id,tab:t,on:{close:this.onClose,input:this.onInput,next:()=>this.goTo(this.next),prev:()=>this.goTo(this.prev),remove:this.remove,show:this.show,submit:this.submit},props:{hidden:this.isHidden,icon:this.fieldset.icon??"box",next:this.next,prev:this.prev,tabs:this.tabs,title:this.fieldset.name,value:this.content},replace:e}),this.$emit("open"))},remove(){if(this.isBatched)return this.$emit("removeSelected");this.$panel.dialog.open({component:"k-remove-dialog",props:{text:this.$t("field.blocks.delete.confirm")},on:{submit:()=>{this.$panel.dialog.close(),this.close(),this.$emit("remove",this.id)}}})},show(){this.$emit("show")},submit(){this.close(),this.$emit("submit")}}},(function(){var t=this,e=t._self._c;return e("div",{ref:"container",staticClass:"k-block-container",class:["k-block-container-fieldset-"+t.type,t.containerType?"k-block-container-type-"+t.containerType:""],attrs:{"data-batched":t.isBatched,"data-disabled":t.isDisabled,"data-hidden":t.isHidden,"data-id":t.id,"data-last-selected":t.isLastSelected,"data-selected":t.isSelected,"data-translate":t.fieldset.translate,tabindex:t.isDisabled?null:0},on:{keydown:[function(e){return!e.type.indexOf("key")&&t._k(e.keyCode,"j",void 0,e.key,void 0)?null:e.ctrlKey?(e.preventDefault(),e.stopPropagation(),t.$emit("merge")):null},function(e){return!e.type.indexOf("key")&&t._k(e.keyCode,"down",40,e.key,["Down","ArrowDown"])?null:e.ctrlKey&&e.altKey?(e.preventDefault(),e.stopPropagation(),t.$emit("selectDown")):null},function(e){return!e.type.indexOf("key")&&t._k(e.keyCode,"up",38,e.key,["Up","ArrowUp"])?null:e.ctrlKey&&e.altKey?(e.preventDefault(),e.stopPropagation(),t.$emit("selectUp")):null},function(e){return!e.type.indexOf("key")&&t._k(e.keyCode,"down",40,e.key,["Down","ArrowDown"])?null:e.ctrlKey&&e.shiftKey?(e.preventDefault(),e.stopPropagation(),t.$emit("sortDown")):null},function(e){return!e.type.indexOf("key")&&t._k(e.keyCode,"up",38,e.key,["Up","ArrowUp"])?null:e.ctrlKey&&e.shiftKey?(e.preventDefault(),e.stopPropagation(),t.$emit("sortUp")):null},function(e){return!e.type.indexOf("key")&&t._k(e.keyCode,"backspace",void 0,e.key,void 0)?null:e.ctrlKey?(e.stopPropagation(),t.backspace.apply(null,arguments)):null}],focus:function(e){return e.stopPropagation(),t.onFocus.apply(null,arguments)},focusin:function(e){return e.stopPropagation(),t.onFocusIn.apply(null,arguments)}}},[e("div",{staticClass:"k-block",class:t.className,attrs:{"data-disabled":t.isDisabled}},[e(t.customComponent,t._g(t._b({ref:"editor",tag:"component",attrs:{tabs:t.tabs}},"component",t.$props,!1),t.listeners))],1),t.isDisabled?t._e():e("k-block-options",t._g(t._b({ref:"options"},"k-block-options",{isBatched:t.isBatched,isEditable:t.isEditable,isFull:t.isFull,isHidden:t.isHidden,isMergable:t.isMergable,isSplitable:t.isSplitable()},!1),{...t.listeners,split:()=>t.$refs.editor.split(),open:()=>{"function"==typeof t.$refs.editor.open?t.$refs.editor.open():t.open()}}))],1)}),[],!1,null,null,null,null).exports,ti={mixins:[V,W,X],props:{empty:String,endpoints:Object,fieldsets:Object,fieldsetGroups:Object,group:String,max:{type:Number,default:null},value:{type:Array,default:()=>[]}},emits:["input"]};const ei=ut({mixins:[ti],inheritAttrs:!1,data(){return{blocks:this.value??[],isEditing:!1,isMultiSelectKey:!1,selected:[]}},computed:{draggableOptions(){return{id:this.id,handle:".k-sort-handle",list:this.blocks,move:this.move,delay:10,data:{fieldsets:this.fieldsets,isFull:this.isFull},options:{group:this.group}}},hasFieldsets(){return this.$helper.object.length(this.fieldsets)>0},isEmpty(){return 0===this.blocks.length},isFull(){return null!==this.max&&this.blocks.length>=this.max},isMergable(){if(this.selected.length<2)return!1;const t=this.selected.map((t=>this.find(t)));return!(new Set(t.map((t=>t.type))).size>1)&&"function"==typeof this.ref(t[0]).$refs.editor.merge}},watch:{value(){this.blocks=this.value}},mounted(){!0===this.$props.autofocus&&setTimeout(this.focus,100),this.$events.on("blur",this.onBlur),this.$events.on("click",this.onClickGlobal),this.$events.on("copy",this.onCopy),this.$events.on("keydown",this.onKey),this.$events.on("keyup",this.onKey),this.$events.on("paste",this.onPaste)},destroyed(){this.$events.off("blur",this.onBlur),this.$events.off("click",this.onClickGlobal),this.$events.off("copy",this.onCopy),this.$events.off("keydown",this.onKey),this.$events.off("keyup",this.onKey),this.$events.off("paste",this.onPaste)},methods:{async add(t="text",e){const i=await this.$api.get(this.endpoints.field+"/fieldsets/"+t);this.blocks.splice(e,0,i),this.save(),await this.$nextTick(),this.focusOrOpen(i)},choose(t){if(1===this.$helper.object.length(this.fieldsets))return this.add(Object.values(this.fieldsets)[0].type,t);this.$panel.dialog.open({component:"k-block-selector",props:{fieldsetGroups:this.fieldsetGroups,fieldsets:this.fieldsets},on:{submit:e=>{this.add(e,t),this.$panel.dialog.close()},paste:e=>{this.paste(e,t)}}})},chooseToConvert(t){this.$panel.dialog.open({component:"k-block-selector",props:{disabledFieldsets:[t.type],fieldsetGroups:this.fieldsetGroups,fieldsets:this.fieldsets,headline:this.$t("field.blocks.changeType")},on:{submit:e=>{this.convert(e,t),this.$panel.dialog.close()},paste:this.paste}})},copy(t){if(0===this.blocks.length)return!1;if(0===this.selected.length)return!1;let e=[];for(const i of this.blocks)this.selected.includes(i.id)&&e.push(i);if(0===e.length)return!1;this.$helper.clipboard.write(e,t),this.selected=e.map((t=>t.id)),this.$panel.notification.success({message:this.$t("copy.success",{count:e.length}),icon:"template"})},copyAll(){this.selectAll(),this.copy(),this.deselectAll()},async convert(t,e){var i;const n=this.findIndex(e.id);if(-1===n)return!1;const s=t=>{let e={};for(const i of Object.values((null==t?void 0:t.tabs)??{}))e={...e,...i.fields};return e},o=this.blocks[n],l=await this.$api.get(this.endpoints.field+"/fieldsets/"+t),a=this.fieldsets[o.type],r=this.fieldsets[t];if(!r)return!1;let u=l.content;const c=s(r),d=s(a);for(const[p,h]of Object.entries(c)){const t=d[p];(null==t?void 0:t.type)===h.type&&(null==(i=null==o?void 0:o.content)?void 0:i[p])&&(u[p]=o.content[p])}this.blocks[n]={...l,id:o.id,content:u},this.save()},deselect(t){const e=this.selected.findIndex((e=>e===t.id));-1!==e&&this.selected.splice(e,1)},deselectAll(){this.selected=[]},async duplicate(t,e){const i={...structuredClone(t),id:this.$helper.uuid()};this.blocks.splice(e+1,0,i),this.save()},fieldset(t){return this.fieldsets[t.type]??{icon:"box",name:t.type,tabs:{content:{fields:{}}},type:t.type}},find(t){return this.blocks.find((e=>e.id===t))},findIndex(t){return this.blocks.findIndex((e=>e.id===t))},focus(t){const e=this.ref(t);this.selected=[(null==t?void 0:t.id)??this.blocks[0]],null==e||e.focus(),null==e||e.$el.scrollIntoView({block:"nearest"})},focusOrOpen(t){this.fieldsets[t.type].wysiwyg?this.focus(t):this.open(t)},hide(t){Vue.set(t,"isHidden",!0),this.save()},isInputEvent(){const t=document.querySelector(":focus");return null==t?void 0:t.matches("input, textarea, [contenteditable], .k-writer")},isLastSelected(t){const[e]=this.selected.slice(-1);return e&&t.id===e},isOnlyInstance:()=>1===document.querySelectorAll(".k-blocks").length,isSelected(t){return this.selected.includes(t.id)},async merge(){if(this.isMergable){const t=this.selected.map((t=>this.find(t)));this.ref(t[0]).$refs.editor.merge(t);for(const e of t.slice(1))this.remove(e);await this.$nextTick(),this.focus(t[0])}},move(t){if(t.from!==t.to){const e=t.draggedContext.element,i=t.relatedContext.component.componentData||t.relatedContext.component.$parent.componentData;if(!1===Object.keys(i.fieldsets).includes(e.type))return!1;if(!0===i.isFull)return!1}return!0},onBlur(){0===this.selected.length&&(this.isMultiSelectKey=!1)},onClickBlock(t,e){e&&this.isMultiSelectKey&&this.onKey(e),this.isMultiSelectKey&&(e.preventDefault(),e.stopPropagation(),this.isSelected(t)?this.deselect(t):this.select(t))},onClickGlobal(t){var e;if("function"==typeof t.target.closest&&(t.target.closest(".k-dialog")||t.target.closest(".k-drawer")))return;const i=document.querySelector(".k-overlay:last-of-type");!1!==this.$el.contains(t.target)||!1!==(null==i?void 0:i.contains(t.target))?i&&!1===(null==(e=this.$el.closest(".k-layout-column"))?void 0:e.contains(t.target))&&this.deselectAll():this.deselectAll()},onCopy(t){return!1!==this.$el.contains(t.target)&&!0!==this.isEditing&&!0!==this.$panel.dialog.isOpen&&!0!==this.isInputEvent(t)&&this.copy(t)},onFocus(t){!1===this.isMultiSelectKey&&(this.selected=[t.id])},async onKey(t){if(this.isMultiSelectKey=t.metaKey||t.ctrlKey||t.altKey,"Escape"===t.code&&this.selected.length>1){const t=this.find(this.selected[0]);await this.$nextTick(),this.focus(t)}},onPaste(t){return!0!==this.isInputEvent(t)&&(!0!==this.isEditing&&!0!==this.$panel.dialog.isOpen&&((0!==this.selected.length||!1!==this.$el.contains(t.target))&&this.paste(t)))},open(t){var e;null==(e=this.$refs["block-"+t.id])||e[0].open()},async paste(t,e){const i=this.$helper.clipboard.read(t);let n=await this.$api.post(this.endpoints.field+"/paste",{html:i});if(void 0===e){let t=this.selected[this.selected.length-1];-1===(e=this.findIndex(t))&&(e=this.blocks.length),e++}if(this.max){const t=this.max-this.blocks.length;n=n.slice(0,t)}this.blocks.splice(e,0,...n),this.save(),this.$panel.notification.success({message:this.$t("paste.success",{count:n.length}),icon:"download"})},pasteboard(){this.$panel.dialog.open({component:"k-block-pasteboard",on:{paste:this.paste}})},prevNext(t){var e;if(this.blocks[t])return null==(e=this.$refs["block-"+this.blocks[t].id])?void 0:e[0]},ref(t){var e,i;return null==(i=this.$refs["block-"+((null==t?void 0:t.id)??(null==(e=this.blocks[0])?void 0:e.id))])?void 0:i[0]},remove(t){const e=this.findIndex(t.id);-1!==e&&(this.deselect(t),this.$delete(this.blocks,e),this.save())},removeAll(){this.$panel.dialog.open({component:"k-remove-dialog",props:{text:this.$t("field.blocks.delete.confirm.all"),submitButton:this.$t("delete.all")},on:{submit:()=>{this.selected=[],this.blocks=[],this.save(),this.$panel.dialog.close()}}})},removeSelected(){this.$panel.dialog.open({component:"k-remove-dialog",props:{text:this.$t("field.blocks.delete.confirm.selected")},on:{submit:()=>{for(const t of this.selected){const e=this.findIndex(t);-1!==e&&this.$delete(this.blocks,e)}this.deselectAll(),this.save(),this.$panel.dialog.close()}}})},save(){this.$emit("input",this.blocks)},select(t){!1===this.isSelected(t)&&this.selected.push(t.id)},selectDown(){const t=this.selected[this.selected.length-1],e=this.findIndex(t)+1;e=0&&this.select(this.blocks[e])},selectAll(){this.selected=Object.values(this.blocks).map((t=>t.id))},show(t){Vue.set(t,"isHidden",!1),this.save()},async sort(t,e,i){if(i<0)return;let n=structuredClone(this.blocks);n.splice(e,1),n.splice(i,0,t),this.blocks=n,this.save(),await this.$nextTick(),this.focus(t)},async split(t,e,i){const n=structuredClone(t);n.content={...n.content,...i[0]};const s=await this.$api.get(this.endpoints.field+"/fieldsets/"+t.type);s.content={...s.content,...n.content,...i[1]},this.blocks.splice(e,1,n,s),this.save(),await this.$nextTick(),this.focus(s)},update(t,e){const i=this.findIndex(t.id);if(-1!==i)for(const n in e)Vue.set(this.blocks[i].content,n,e[n]);this.save()}}},(function(){var t=this,e=t._self._c;return e("div",{staticClass:"k-blocks",attrs:{"data-disabled":t.disabled,"data-empty":0===t.blocks.length}},[t.hasFieldsets?[e("k-draggable",t._b({staticClass:"k-blocks-list",attrs:{"data-multi-select-key":t.isMultiSelectKey},on:{sort:t.save},scopedSlots:t._u([0===t.blocks.length?{key:"footer",fn:function(){return[e("k-empty",{staticClass:"k-blocks-empty",attrs:{icon:"box"},on:{click:function(e){return t.choose(t.blocks.length)}}},[t._v(" "+t._s(t.empty??t.$t("field.blocks.empty"))+" ")])]},proxy:!0}:null],null,!0)},"k-draggable",t.draggableOptions,!1),t._l(t.blocks,(function(i,n){return e("k-block",t._b({key:i.id,ref:"block-"+i.id,refInFor:!0,on:{append:function(e){return t.add(e,n+1)},chooseToAppend:function(e){return t.choose(n+1)},chooseToConvert:function(e){return t.chooseToConvert(i)},chooseToPrepend:function(e){return t.choose(n)},close:function(e){t.isEditing=!1},copy:function(e){return t.copy()},duplicate:function(e){return t.duplicate(i,n)},focus:function(e){return t.onFocus(i)},hide:function(e){return t.hide(i)},merge:function(e){return t.merge()},open:function(e){t.isEditing=!0},paste:function(e){return t.pasteboard()},prepend:function(e){return t.add(e,n)},remove:function(e){return t.remove(i)},removeSelected:t.removeSelected,show:function(e){return t.show(i)},selectDown:t.selectDown,selectUp:t.selectUp,sortDown:function(e){return t.sort(i,n,n+1)},sortUp:function(e){return t.sort(i,n,n-1)},split:function(e){return t.split(i,n,e)},update:function(e){return t.update(i,e)}},nativeOn:{click:function(e){return t.onClickBlock(i,e)}}},"k-block",{...i,disabled:t.disabled,endpoints:t.endpoints,fieldset:t.fieldset(i),isBatched:t.isSelected(i)&&t.selected.length>1,isFull:t.isFull,isHidden:!0===i.isHidden,isLastSelected:t.isLastSelected(i),isMergable:t.isMergable,isSelected:t.isSelected(i),next:t.prevNext(n+1),prev:t.prevNext(n-1)},!1))})),1)]:e("k-empty",{attrs:{icon:"box"}},[t._v(" "+t._s(t.$t("field.blocks.fieldsets.empty"))+" ")])],2)}),[],!1,null,null,null,null).exports;const ii=ut({inheritAttrs:!1,emits:["close","paste","submit"],computed:{shortcut(){return this.$helper.keyboard.metaKey()+"+v"}},methods:{paste(t){this.$emit("close"),this.$emit("paste",t)}}},(function(){var t=this,e=t._self._c;return e("k-dialog",{ref:"dialog",staticClass:"k-block-importer",attrs:{"cancel-button":!1,"submit-button":!1,visible:!0,size:"large"},on:{cancel:function(e){return t.$emit("cancel")},submit:function(e){return t.$emit("submit")}}},[e("label",{attrs:{for:"pasteboard"},domProps:{innerHTML:t._s(t.$t("field.blocks.fieldsets.paste",{shortcut:t.shortcut}))}}),e("textarea",{attrs:{id:"pasteboard"},on:{paste:function(e){return e.preventDefault(),t.paste.apply(null,arguments)}}})])}),[],!1,null,null,null,null).exports;const ni=ut({inheritAttrs:!1,props:{disabledFieldsets:{default:()=>[],type:Array},fieldsets:{type:Object},fieldsetGroups:{type:Object},headline:{type:String},size:{type:String,default:"medium"},value:{default:null,type:String}},emits:["cancel","input","paste","submit"],data:()=>({selected:null}),computed:{groups(){const t={};let e=0;const i=this.fieldsetGroups??{blocks:{label:this.$t("field.blocks.fieldsets.label"),sets:Object.keys(this.fieldsets)}};for(const n in i){const s=i[n];s.open=!1!==s.open,s.fieldsets=s.sets.filter((t=>this.fieldsets[t])).map((t=>(e++,{...this.fieldsets[t],index:e}))),0!==s.fieldsets.length&&(t[n]=s)}return t},shortcut(){return this.$helper.keyboard.metaKey()+"+v"}},mounted(){this.$events.on("paste",this.paste)},destroyed(){this.$events.off("paste",this.paste)},methods:{paste(t){this.$emit("paste",t),this.close()}}},(function(){var t=this,e=t._self._c;return e("k-dialog",{staticClass:"k-block-selector",attrs:{"cancel-button":!1,size:t.size,"submit-button":!1,visible:!0},on:{cancel:function(e){return t.$emit("cancel")},submit:function(e){return t.$emit("submit",t.value)}}},[t.headline?e("k-headline",[t._v(" "+t._s(t.headline)+" ")]):t._e(),t._l(t.groups,(function(i,n){return e("details",{key:n,attrs:{open:i.open}},[e("summary",[t._v(t._s(i.label))]),e("k-navigate",{staticClass:"k-block-types"},t._l(i.fieldsets,(function(i){return e("k-button",{key:i.name,attrs:{disabled:t.disabledFieldsets.includes(i.type),icon:i.icon??"box",text:i.name,size:"lg"},on:{click:function(e){return t.$emit("submit",i.type)}},nativeOn:{focus:function(e){return t.$emit("input",i.type)}}})})),1)],1)})),e("p",{staticClass:"k-clipboard-hint",domProps:{innerHTML:t._s(t.$t("field.blocks.fieldsets.paste",{shortcut:t.shortcut}))}})],2)}),[],!1,null,null,null,null).exports;const si=ut({inheritAttrs:!1,props:{caption:String,captionMarks:{default:!0,type:[Boolean,Array]},disabled:Boolean,isEmpty:Boolean,emptyIcon:String,emptyText:String},emits:["open","update"]},(function(){var t=this,e=t._self._c;return e("figure",{staticClass:"k-block-figure"},[t.isEmpty?e("k-button",{staticClass:"k-block-figure-empty",attrs:{disabled:t.disabled,icon:t.emptyIcon,text:t.emptyText},on:{click:function(e){return t.$emit("open")}}}):e("span",{staticClass:"k-block-figure-container",attrs:{"data-disabled":t.disabled},on:{dblclick:function(e){return t.$emit("open")}}},[t._t("default")],2),t.caption?e("figcaption",[e("k-writer",{attrs:{disabled:t.disabled,inline:!0,marks:t.captionMarks,value:t.caption},on:{input:function(e){return t.$emit("update",{caption:e})}}})],1):t._e()],1)}),[],!1,null,null,null,null).exports;const oi=ut({extends:Ge,computed:{placeholder(){return this.field("code",{}).placeholder},languages(){return this.field("language",{options:[]}).options}},methods:{focus(){this.$refs.code.focus()}}},(function(){var t=this,e=t._self._c;return e("div",{staticClass:"k-block-type-code-editor"},[e("k-input",{ref:"code",attrs:{buttons:!1,disabled:t.disabled,placeholder:t.placeholder,spellcheck:!1,value:t.content.code,font:"monospace",type:"textarea"},on:{input:function(e){return t.update({code:e})}}}),t.languages.length?e("div",{staticClass:"k-block-type-code-editor-language"},[e("k-input",{ref:"language",attrs:{disabled:t.disabled,empty:!1,options:t.languages,value:t.content.language,icon:"code",type:"select"},on:{input:function(e){return t.update({language:e})}}})],1):t._e()],1)}),[],!1,null,null,null,null).exports;const li=ut({extends:Ge,props:{endpoints:Object,tabs:Object},data(){return{collapsed:this.state(),tab:Object.keys(this.tabs)[0]}},computed:{fields(){var t;return null==(t=this.tabs[this.tab])?void 0:t.fields},values(){return Object.assign({},this.content)}},methods:{open(){this.$emit("open",this.tab)},state(t){const e=`kirby.fieldsBlock.${this.endpoints.field}.${this.id}`;if(void 0===t)return JSON.parse(sessionStorage.getItem(e));sessionStorage.setItem(e,t)},toggle(){this.collapsed=!this.collapsed,this.state(this.collapsed)}}},(function(){var t=this,e=t._self._c;return e("div",{attrs:{"data-collapsed":t.collapsed},on:{dblclick:function(e){!t.fieldset.wysiwyg&&t.$emit("open")}}},[e("header",{staticClass:"k-block-type-fields-header"},[e("k-block-title",{attrs:{content:t.values,fieldset:t.fieldset},nativeOn:{click:function(e){return t.toggle.apply(null,arguments)}}}),t.collapsed?t._e():e("k-drawer-tabs",{attrs:{tab:t.tab,tabs:t.fieldset.tabs},on:{open:function(e){t.tab=e}}})],1),t.collapsed?t._e():e("k-form",{ref:"form",staticClass:"k-block-type-fields-form",attrs:{autofocus:!0,disabled:t.disabled||!t.fieldset.wysiwyg,fields:t.fields,value:t.values},on:{input:function(e){return t.$emit("update",e)}}})],1)}),[],!1,null,null,null,null).exports;const ai=ut({extends:Ge,computed:{captionMarks(){return this.field("caption",{marks:!0}).marks},crop(){return this.content.crop},ratio(){return this.content.ratio}}},(function(){var t,e=this,i=e._self._c;return i("figure",[i("ul",{on:{dblclick:e.open}},[(null==(t=e.content.images)?void 0:t.length)?e._l(e.content.images,(function(t){return i("li",{key:t.id},[i("k-image-frame",{attrs:{ratio:e.ratio,cover:e.crop,src:t.url,srcset:t.image.srcset,alt:t.alt}})],1)})):e._l(3,(function(t){return i("li",{key:t,staticClass:"k-block-type-gallery-placeholder"},[i("k-image-frame",{attrs:{ratio:e.ratio}})],1)}))],2),e.content.caption?i("figcaption",[i("k-writer",{attrs:{disabled:e.disabled,inline:!0,marks:e.captionMarks,value:e.content.caption},on:{input:function(t){return e.$emit("update",{caption:t})}}})],1):e._e()])}),[],!1,null,null,null,null).exports;const ri=ut({extends:Ge,inheritAttrs:!1,emits:["append","open","split","update"],computed:{isSplitable(){return this.content.text.length>0&&!1===this.$refs.input.isCursorAtStart&&!1===this.$refs.input.isCursorAtEnd},keys(){return{Enter:()=>!0===this.$refs.input.isCursorAtEnd?this.$emit("append","text"):this.split(),"Mod-Enter":this.split}},levels(){return this.field("level",{options:[]}).options},textField(){return this.field("text",{marks:!0})}},methods:{focus(){this.$refs.input.focus()},merge(t){this.update({text:t.map((t=>t.content.text)).join(" ")})},split(){var t,e;const i=null==(e=(t=this.$refs.input).getSplitContent)?void 0:e.call(t);i&&this.$emit("split",[{text:i[0]},{level:"h"+Math.min(parseInt(this.content.level.slice(1))+1,6),text:i[1]}])}}},(function(){var t=this,e=t._self._c;return e("div",{staticClass:"k-block-type-heading-input",attrs:{"data-level":t.content.level}},[e("k-writer",t._b({ref:"input",attrs:{disabled:t.disabled,inline:!0,keys:t.keys,value:t.content.text},on:{input:function(e){return t.update({text:e})}}},"k-writer",t.textField,!1)),t.levels.length>1?e("k-input",{ref:"level",staticClass:"k-block-type-heading-level",attrs:{disabled:t.disabled,empty:!1,options:t.levels,value:t.content.level,type:"select"},on:{input:function(e){return t.update({level:e})}}}):t._e()],1)}),[],!1,null,null,null,null).exports;const ui=ut({extends:Ge,computed:{captionMarks(){return this.field("caption",{marks:!0}).marks},crop(){return this.content.crop??!1},src(){var t,e;return"web"===this.content.location?this.content.src:!!(null==(e=null==(t=this.content.image)?void 0:t[0])?void 0:e.url)&&this.content.image[0].url},ratio(){return this.content.ratio??!1}}},(function(){var t=this,e=t._self._c;return e("k-block-figure",{attrs:{caption:t.content.caption,"caption-marks":t.captionMarks,"empty-text":t.$t("field.blocks.image.placeholder")+" …",disabled:t.disabled,"is-empty":!t.src,"empty-icon":"image"},on:{open:t.open,update:t.update}},[t.src?[t.ratio?e("k-image-frame",{attrs:{ratio:t.ratio,cover:t.crop,alt:t.content.alt,src:t.src}}):e("img",{staticClass:"k-block-type-image-auto",attrs:{alt:t.content.alt,src:t.src}})]:t._e()],2)}),[],!1,null,null,null,null).exports;const ci=ut({},(function(){return this._self._c,this._m(0)}),[function(){var t=this._self._c;return t("div",[t("hr")])}],!1,null,null,null,null).exports;const di=ut({extends:Ge,emits:["open","split","update"],computed:{isSplitable(){return this.content.text.length>0&&!1===this.input().isCursorAtStart&&!1===this.input().isCursorAtEnd},keys(){return{"Mod-Enter":this.split}},marks(){return this.field("text",{}).marks}},methods:{focus(){this.$refs.input.focus()},input(){return this.$refs.input.$refs.input.$refs.input},merge(t){this.update({text:t.map((t=>t.content.text)).join("").replaceAll("
    ","")})},split(){var t,e;const i=null==(e=(t=this.input()).getSplitContent)?void 0:e.call(t);i&&this.$emit("split",[{text:i[0].replace(/(
  • <\/p><\/li><\/ul>)$/,"

")},{text:i[1].replace(/^(