From 376431b2f85a66b8ccd604e9ae94884a8bbe23c4 Mon Sep 17 00:00:00 2001 From: Jay Oswald Date: Wed, 20 Nov 2024 17:20:30 +1100 Subject: [PATCH] adding after gitignore removal --- .../simplesamlphp/modules/authorize/LICENSE | 459 ++++++++++++ .../simplesamlphp/modules/authorize/README.md | 27 + .../modules/authorize/composer.json | 49 ++ .../modules/authorize/docs/authorize.md | 158 ++++ .../locales/af/LC_MESSAGES/authorize.po | 27 + .../locales/ar/LC_MESSAGES/authorize.po | 28 + .../locales/cs/LC_MESSAGES/authorize.po | 28 + .../locales/da/LC_MESSAGES/authorize.po | 27 + .../locales/de/LC_MESSAGES/authorize.po | 28 + .../locales/el/LC_MESSAGES/authorize.po | 28 + .../locales/en/LC_MESSAGES/authorize.po | 32 + .../locales/es/LC_MESSAGES/authorize.po | 27 + .../locales/et/LC_MESSAGES/authorize.po | 27 + .../locales/eu/LC_MESSAGES/authorize.po | 27 + .../locales/fi/LC_MESSAGES/authorize.po | 27 + .../locales/fr/LC_MESSAGES/authorize.po | 27 + .../locales/he/LC_MESSAGES/authorize.po | 27 + .../locales/hr/LC_MESSAGES/authorize.po | 29 + .../locales/hu/LC_MESSAGES/authorize.po | 27 + .../locales/id/LC_MESSAGES/authorize.po | 28 + .../locales/it/LC_MESSAGES/authorize.po | 27 + .../locales/ja/LC_MESSAGES/authorize.po | 25 + .../locales/lt/LC_MESSAGES/authorize.po | 28 + .../locales/lv/LC_MESSAGES/authorize.po | 28 + .../locales/nb/LC_MESSAGES/authorize.po | 27 + .../locales/nl/LC_MESSAGES/authorize.po | 32 + .../locales/nn/LC_MESSAGES/authorize.po | 27 + .../locales/pl/LC_MESSAGES/authorize.po | 21 + .../locales/pt-br/LC_MESSAGES/authorize.po | 27 + .../locales/pt/LC_MESSAGES/authorize.po | 27 + .../locales/ro/LC_MESSAGES/authorize.po | 29 + .../locales/ru/LC_MESSAGES/authorize.po | 28 + .../locales/sl/LC_MESSAGES/authorize.po | 28 + .../locales/sr/LC_MESSAGES/authorize.po | 29 + .../locales/st/LC_MESSAGES/authorize.po | 27 + .../locales/sv/LC_MESSAGES/authorize.po | 27 + .../locales/xh/LC_MESSAGES/authorize.po | 26 + .../locales/zh-tw/LC_MESSAGES/authorize.po | 25 + .../locales/zh/LC_MESSAGES/authorize.po | 25 + .../locales/zu/LC_MESSAGES/authorize.po | 26 + .../authorize/routing/routes/routes.yml | 14 + .../authorize/src/Auth/Process/Authorize.php | 238 ++++++ .../authorize/src/Controller/Authorize.php | 128 ++++ .../authorize/templates/authorize_403.twig | 36 + .extlib/simplesamlphp/modules/consent/LICENSE | 459 ++++++++++++ .../simplesamlphp/modules/consent/README.md | 7 + .../modules/consent/composer.json | 52 ++ .../modules/consent/docs/consent.md | 346 +++++++++ .../consent/locales/af/LC_MESSAGES/consent.po | 71 ++ .../consent/locales/ar/LC_MESSAGES/consent.po | 68 ++ .../consent/locales/cs/LC_MESSAGES/consent.po | 70 ++ .../consent/locales/da/LC_MESSAGES/consent.po | 69 ++ .../consent/locales/de/LC_MESSAGES/consent.po | 73 ++ .../consent/locales/el/LC_MESSAGES/consent.po | 74 ++ .../consent/locales/en/LC_MESSAGES/consent.po | 72 ++ .../consent/locales/es/LC_MESSAGES/consent.po | 74 ++ .../consent/locales/et/LC_MESSAGES/consent.po | 67 ++ .../consent/locales/eu/LC_MESSAGES/consent.po | 69 ++ .../consent/locales/fi/LC_MESSAGES/consent.po | 63 ++ .../consent/locales/fr/LC_MESSAGES/consent.po | 74 ++ .../consent/locales/he/LC_MESSAGES/consent.po | 64 ++ .../consent/locales/hr/LC_MESSAGES/consent.po | 70 ++ .../consent/locales/hu/LC_MESSAGES/consent.po | 68 ++ .../consent/locales/id/LC_MESSAGES/consent.po | 68 ++ .../consent/locales/it/LC_MESSAGES/consent.po | 71 ++ .../consent/locales/ja/LC_MESSAGES/consent.po | 64 ++ .../consent/locales/lb/LC_MESSAGES/consent.po | 31 + .../consent/locales/lt/LC_MESSAGES/consent.po | 71 ++ .../consent/locales/lv/LC_MESSAGES/consent.po | 65 ++ .../consent/locales/nb/LC_MESSAGES/consent.po | 71 ++ .../consent/locales/nl/LC_MESSAGES/consent.po | 74 ++ .../consent/locales/nn/LC_MESSAGES/consent.po | 69 ++ .../consent/locales/pl/LC_MESSAGES/consent.po | 57 ++ .../locales/pt-br/LC_MESSAGES/consent.po | 64 ++ .../consent/locales/pt/LC_MESSAGES/consent.po | 70 ++ .../consent/locales/ro/LC_MESSAGES/consent.po | 70 ++ .../consent/locales/ru/LC_MESSAGES/consent.po | 70 ++ .../consent/locales/sl/LC_MESSAGES/consent.po | 70 ++ .../consent/locales/sr/LC_MESSAGES/consent.po | 70 ++ .../consent/locales/st/LC_MESSAGES/consent.po | 68 ++ .../consent/locales/sv/LC_MESSAGES/consent.po | 70 ++ .../consent/locales/tr/LC_MESSAGES/consent.po | 61 ++ .../consent/locales/xh/LC_MESSAGES/consent.po | 69 ++ .../locales/zh-tw/LC_MESSAGES/consent.po | 67 ++ .../consent/locales/zh/LC_MESSAGES/consent.po | 67 ++ .../consent/locales/zu/LC_MESSAGES/consent.po | 71 ++ .../consent/public/assets/css/consent.css | 18 + .../modules/consent/routing/routes/routes.yml | 16 + .../consent/src/Auth/Process/Consent.php | 439 +++++++++++ .../consent/src/Consent/Store/Cookie.php | 357 +++++++++ .../consent/src/Consent/Store/Database.php | 489 ++++++++++++ .../src/Controller/ConsentController.php | 315 ++++++++ .../modules/consent/src/Logout.php | 30 + .../modules/consent/src/Store.php | 156 ++++ .../consent/templates/consentform.twig | 61 ++ .../consent/templates/logout_completed.twig | 7 + .../modules/consent/templates/noconsent.twig | 18 + .../modules/consentAdmin/LICENSE | 459 ++++++++++++ .../modules/consentAdmin/README.md | 5 + .../modules/consentAdmin/composer.json | 59 ++ .../config/module_consentAdmin.php.dist | 37 + .../modules/consentAdmin/docs/consentAdmin.md | 84 +++ .../consentAdmin/hooks/hook_configpage.php | 23 + .../locales/ar/LC_MESSAGES/consentAdmin.po | 151 ++++ .../locales/cs/LC_MESSAGES/consentAdmin.po | 153 ++++ .../locales/da/LC_MESSAGES/consentAdmin.po | 198 +++++ .../locales/de/LC_MESSAGES/consentAdmin.po | 160 ++++ .../locales/el/LC_MESSAGES/consentAdmin.po | 152 ++++ .../locales/en/LC_MESSAGES/consentAdmin.po | 161 ++++ .../locales/es/LC_MESSAGES/consentAdmin.po | 160 ++++ .../locales/et/LC_MESSAGES/consentAdmin.po | 154 ++++ .../locales/eu/LC_MESSAGES/consentAdmin.po | 154 ++++ .../locales/fr/LC_MESSAGES/consentAdmin.po | 158 ++++ .../locales/he/LC_MESSAGES/consentAdmin.po | 152 ++++ .../locales/hr/LC_MESSAGES/consentAdmin.po | 155 ++++ .../locales/hu/LC_MESSAGES/consentAdmin.po | 152 ++++ .../locales/id/LC_MESSAGES/consentAdmin.po | 158 ++++ .../locales/it/LC_MESSAGES/consentAdmin.po | 158 ++++ .../locales/ja/LC_MESSAGES/consentAdmin.po | 152 ++++ .../locales/lt/LC_MESSAGES/consentAdmin.po | 153 ++++ .../locales/lv/LC_MESSAGES/consentAdmin.po | 155 ++++ .../locales/nb/LC_MESSAGES/consentAdmin.po | 156 ++++ .../locales/nl/LC_MESSAGES/consentAdmin.po | 158 ++++ .../locales/nn/LC_MESSAGES/consentAdmin.po | 156 ++++ .../locales/pt/LC_MESSAGES/consentAdmin.po | 152 ++++ .../locales/ro/LC_MESSAGES/consentAdmin.po | 157 ++++ .../locales/ru/LC_MESSAGES/consentAdmin.po | 155 ++++ .../locales/sl/LC_MESSAGES/consentAdmin.po | 153 ++++ .../locales/sr/LC_MESSAGES/consentAdmin.po | 155 ++++ .../locales/sv/LC_MESSAGES/consentAdmin.po | 154 ++++ .../locales/zh-tw/LC_MESSAGES/consentAdmin.po | 152 ++++ .../locales/zh/LC_MESSAGES/consentAdmin.po | 152 ++++ .../public/assets/css/consentAdmin.css | 44 ++ .../public/assets/js/consentAdmin.js | 79 ++ .../consentAdmin/routing/routes/routes.yml | 9 + .../src/Controller/ConsentAdmin.php | 417 +++++++++++ .../consentAdmin/templates/consentadmin.twig | 82 +++ .../templates/consentadminajax.twig | 9 + .../simplesamlphp/modules/discopower/LICENSE | 459 ++++++++++++ .../modules/discopower/README.md | 30 + .../modules/discopower/composer.json | 47 ++ .../config-templates/module_discopower.php | 64 ++ .../modules/discopower/docs/discopower.md | 127 ++++ .../locales/af/LC_MESSAGES/discopower.po | 103 +++ .../locales/da/LC_MESSAGES/discopower.po | 95 +++ .../locales/el/LC_MESSAGES/discopower.po | 95 +++ .../locales/en/LC_MESSAGES/discopower.po | 107 +++ .../locales/es/LC_MESSAGES/discopower.po | 95 +++ .../locales/fr/LC_MESSAGES/discopower.po | 100 +++ .../locales/gl/LC_MESSAGES/discopower.po | 77 ++ .../locales/nl/LC_MESSAGES/discopower.po | 101 +++ .../locales/ru/LC_MESSAGES/discopower.po | 84 +++ .../locales/st/LC_MESSAGES/discopower.po | 34 + .../locales/xh/LC_MESSAGES/discopower.po | 49 ++ .../locales/zh-tw/LC_MESSAGES/discopower.po | 89 +++ .../locales/zu/LC_MESSAGES/discopower.po | 40 + .../discopower/public/assets/css/disco.css | 101 +++ .../images/ui-bg_glass_55_fbf9ee_1x400.png | Bin 0 -> 445 bytes .../images/ui-bg_glass_65_ffffff_1x400.png | Bin 0 -> 317 bytes .../images/ui-bg_glass_75_dadada_1x400.png | Bin 0 -> 375 bytes .../images/ui-bg_glass_75_e6e6e6_1x400.png | Bin 0 -> 376 bytes .../images/ui-bg_glass_95_fef1ec_1x400.png | Bin 0 -> 442 bytes .../ui-bg_highlight-soft_75_cccccc_1x100.png | Bin 0 -> 377 bytes .../images/ui-icons_222222_256x240.png | Bin 0 -> 7077 bytes .../images/ui-icons_2e83ff_256x240.png | Bin 0 -> 4670 bytes .../images/ui-icons_454545_256x240.png | Bin 0 -> 7142 bytes .../images/ui-icons_888888_256x240.png | Bin 0 -> 7163 bytes .../images/ui-icons_cd0a0a_256x240.png | Bin 0 -> 4670 bytes .../css/ui-theme-1.13.2/jquery-ui.min.css | 7 + .../public/assets/js/jquery-3.6.0.min.js | 2 + .../public/assets/js/jquery-ui-1.13.2.min.js | 6 + .../public/assets/js/jquery.livesearch.js | 44 ++ .../public/assets/js/quicksilver.js | 102 +++ .../discopower/public/assets/js/suggest.js | 25 + .../discopower/public/assets/js/tablist.js | 14 + .../discopower/routing/routes/routes.yml | 6 + .../discopower/src/Controller/DiscoPower.php | 81 ++ .../modules/discopower/src/PowerIdPDisco.php | 487 ++++++++++++ .../modules/discopower/templates/disco.twig | 69 ++ .extlib/simplesamlphp/modules/ldap/LICENSE | 459 ++++++++++++ .extlib/simplesamlphp/modules/ldap/README.md | 34 + .extlib/simplesamlphp/modules/ldap/UPGRADE.md | 38 + .../simplesamlphp/modules/ldap/composer.json | 56 ++ .../simplesamlphp/modules/ldap/docs/ldap.md | 638 ++++++++++++++++ .../ldap/src/Auth/InvalidCredentialResult.php | 213 ++++++ .../src/Auth/Process/AttributeAddFromLDAP.php | 189 +++++ .../Auth/Process/AttributeAddUsersGroups.php | 387 ++++++++++ .../ldap/src/Auth/Process/BaseFilter.php | 290 ++++++++ .../modules/ldap/src/Auth/Source/Ldap.php | 260 +++++++ .../ldap/src/Auth/Source/LdapMulti.php | 150 ++++ .../ldap/src/Connector/ActiveDirectory.php | 48 ++ .../modules/ldap/src/Connector/Ldap.php | 229 ++++++ .../ldap/src/Connector/LdapHelpers.php | 79 ++ .../modules/ldap/src/ConnectorFactory.php | 61 ++ .../modules/ldap/src/ConnectorInterface.php | 72 ++ .../simplesamlphp/modules/metarefresh/LICENSE | 459 ++++++++++++ .../modules/metarefresh/README.md | 11 + .../modules/metarefresh/bin/metarefresh.php | 157 ++++ .../modules/metarefresh/composer.json | 49 ++ .../config-templates/module_metarefresh.php | 95 +++ .../docs/simplesamlphp-automated_metadata.md | 275 +++++++ .../metarefresh/hooks/hook_configpage.php | 22 + .../modules/metarefresh/hooks/hook_cron.php | 31 + .../locales/en/LC_MESSAGES/metarefresh.po | 25 + .../metarefresh/routing/routes/routes.yaml | 4 + .../modules/metarefresh/src/ARP.php | 154 ++++ .../src/Controller/MetaRefresh.php | 99 +++ .../modules/metarefresh/src/MetaLoader.php | 695 ++++++++++++++++++ .../modules/metarefresh/src/MetaRefresh.php | 153 ++++ .../modules/metarefresh/templates/fetch.twig | 23 + .extlib/simplesamlphp/modules/radius/LICENSE | 459 ++++++++++++ .../simplesamlphp/modules/radius/README.md | 7 + .../modules/radius/composer.json | 47 ++ .../modules/radius/docs/radius.md | 113 +++ .../modules/radius/src/Auth/Source/Radius.php | 271 +++++++ .extlib/simplesamlphp/modules/sqlauth/LICENSE | 459 ++++++++++++ .../simplesamlphp/modules/sqlauth/README.md | 9 + .../modules/sqlauth/composer.json | 48 ++ .../simplesamlphp/modules/sqlauth/docs/sql.md | 243 ++++++ .../src/Auth/Source/PasswordVerify.php | 180 +++++ .../modules/sqlauth/src/Auth/Source/SQL.php | 298 ++++++++ .../simplesamlphp/modules/statistics/LICENSE | 459 ++++++++++++ .../modules/statistics/README.md | 25 + .../modules/statistics/bin/loganalyzer.php | 91 +++ .../modules/statistics/bin/logcleaner.php | 94 +++ .../modules/statistics/composer.json | 48 ++ .../config/module_statistics.php.dist | 191 +++++ .../docs/authproc_statisticswithattribute.md | 27 + .../modules/statistics/docs/statistics.md | 217 ++++++ .../statistics/hooks/hook_configpage.php | 27 + .../modules/statistics/hooks/hook_cron.php | 48 ++ .../statistics/hooks/hook_sanitycheck.php | 44 ++ .../locales/en/LC_MESSAGES/statistics.po | 5 + .../locales/es/LC_MESSAGES/statistics.po | 5 + .../locales/nb/LC_MESSAGES/statistics.po | 5 + .../locales/nn/LC_MESSAGES/statistics.po | 5 + .../public/assets/css/statistics.css | 135 ++++ .../images/ui-bg_glass_55_fbf9ee_1x400.png | Bin 0 -> 445 bytes .../images/ui-bg_glass_65_ffffff_1x400.png | Bin 0 -> 317 bytes .../images/ui-bg_glass_75_dadada_1x400.png | Bin 0 -> 375 bytes .../images/ui-bg_glass_75_e6e6e6_1x400.png | Bin 0 -> 376 bytes .../images/ui-bg_glass_95_fef1ec_1x400.png | Bin 0 -> 442 bytes .../ui-bg_highlight-soft_75_cccccc_1x100.png | Bin 0 -> 377 bytes .../images/ui-icons_222222_256x240.png | Bin 0 -> 7077 bytes .../images/ui-icons_2e83ff_256x240.png | Bin 0 -> 4670 bytes .../images/ui-icons_454545_256x240.png | Bin 0 -> 7142 bytes .../images/ui-icons_888888_256x240.png | Bin 0 -> 7163 bytes .../images/ui-icons_cd0a0a_256x240.png | Bin 0 -> 4670 bytes .../css/ui-theme-1.13.2/jquery-ui.min.css | 7 + .../public/assets/js/jquery-1.12.4.min.js | 5 + .../public/assets/js/jquery-ui-1.13.2.min.js | 6 + .../statistics/public/assets/js/statistics.js | 16 + .../statistics/routing/routes/routes.yaml | 15 + .../modules/statistics/src/ACL.php | 315 ++++++++ .../modules/statistics/src/AccessCheck.php | 100 +++ .../modules/statistics/src/Aggregator.php | 373 ++++++++++ .../Auth/Process/StatisticsWithAttribute.php | 120 +++ .../statistics/src/Controller/Statistics.php | 248 +++++++ .../modules/statistics/src/DateHandler.php | 102 +++ .../statistics/src/DateHandlerMonth.php | 67 ++ .../statistics/src/Graph/GoogleCharts.php | 197 +++++ .../modules/statistics/src/LogCleaner.php | 204 +++++ .../modules/statistics/src/LogParser.php | 74 ++ .../modules/statistics/src/RatioDataset.php | 127 ++++ .../modules/statistics/src/Ruleset.php | 140 ++++ .../modules/statistics/src/StatDataset.php | 438 +++++++++++ .../src/Statistics/FieldPresentation/Base.php | 46 ++ .../Statistics/FieldPresentation/Entity.php | 27 + .../src/Statistics/Rulesets/BaseRule.php | 187 +++++ .../src/Statistics/Rulesets/Ratio.php | 127 ++++ .../statistics/templates/statistics.twig | 226 ++++++ .../statistics/templates/statmeta.twig | 40 + 272 files changed, 28241 insertions(+) create mode 100644 .extlib/simplesamlphp/modules/authorize/LICENSE create mode 100644 .extlib/simplesamlphp/modules/authorize/README.md create mode 100644 .extlib/simplesamlphp/modules/authorize/composer.json create mode 100644 .extlib/simplesamlphp/modules/authorize/docs/authorize.md create mode 100644 .extlib/simplesamlphp/modules/authorize/locales/af/LC_MESSAGES/authorize.po create mode 100644 .extlib/simplesamlphp/modules/authorize/locales/ar/LC_MESSAGES/authorize.po create mode 100644 .extlib/simplesamlphp/modules/authorize/locales/cs/LC_MESSAGES/authorize.po create mode 100644 .extlib/simplesamlphp/modules/authorize/locales/da/LC_MESSAGES/authorize.po create mode 100644 .extlib/simplesamlphp/modules/authorize/locales/de/LC_MESSAGES/authorize.po create mode 100644 .extlib/simplesamlphp/modules/authorize/locales/el/LC_MESSAGES/authorize.po create mode 100644 .extlib/simplesamlphp/modules/authorize/locales/en/LC_MESSAGES/authorize.po create mode 100644 .extlib/simplesamlphp/modules/authorize/locales/es/LC_MESSAGES/authorize.po create mode 100644 .extlib/simplesamlphp/modules/authorize/locales/et/LC_MESSAGES/authorize.po create mode 100644 .extlib/simplesamlphp/modules/authorize/locales/eu/LC_MESSAGES/authorize.po create mode 100644 .extlib/simplesamlphp/modules/authorize/locales/fi/LC_MESSAGES/authorize.po create mode 100644 .extlib/simplesamlphp/modules/authorize/locales/fr/LC_MESSAGES/authorize.po create mode 100644 .extlib/simplesamlphp/modules/authorize/locales/he/LC_MESSAGES/authorize.po create mode 100644 .extlib/simplesamlphp/modules/authorize/locales/hr/LC_MESSAGES/authorize.po create mode 100644 .extlib/simplesamlphp/modules/authorize/locales/hu/LC_MESSAGES/authorize.po create mode 100644 .extlib/simplesamlphp/modules/authorize/locales/id/LC_MESSAGES/authorize.po create mode 100644 .extlib/simplesamlphp/modules/authorize/locales/it/LC_MESSAGES/authorize.po create mode 100644 .extlib/simplesamlphp/modules/authorize/locales/ja/LC_MESSAGES/authorize.po create mode 100644 .extlib/simplesamlphp/modules/authorize/locales/lt/LC_MESSAGES/authorize.po create mode 100644 .extlib/simplesamlphp/modules/authorize/locales/lv/LC_MESSAGES/authorize.po create mode 100644 .extlib/simplesamlphp/modules/authorize/locales/nb/LC_MESSAGES/authorize.po create mode 100644 .extlib/simplesamlphp/modules/authorize/locales/nl/LC_MESSAGES/authorize.po create mode 100644 .extlib/simplesamlphp/modules/authorize/locales/nn/LC_MESSAGES/authorize.po create mode 100644 .extlib/simplesamlphp/modules/authorize/locales/pl/LC_MESSAGES/authorize.po create mode 100644 .extlib/simplesamlphp/modules/authorize/locales/pt-br/LC_MESSAGES/authorize.po create mode 100644 .extlib/simplesamlphp/modules/authorize/locales/pt/LC_MESSAGES/authorize.po create mode 100644 .extlib/simplesamlphp/modules/authorize/locales/ro/LC_MESSAGES/authorize.po create mode 100644 .extlib/simplesamlphp/modules/authorize/locales/ru/LC_MESSAGES/authorize.po create mode 100644 .extlib/simplesamlphp/modules/authorize/locales/sl/LC_MESSAGES/authorize.po create mode 100644 .extlib/simplesamlphp/modules/authorize/locales/sr/LC_MESSAGES/authorize.po create mode 100644 .extlib/simplesamlphp/modules/authorize/locales/st/LC_MESSAGES/authorize.po create mode 100644 .extlib/simplesamlphp/modules/authorize/locales/sv/LC_MESSAGES/authorize.po create mode 100644 .extlib/simplesamlphp/modules/authorize/locales/xh/LC_MESSAGES/authorize.po create mode 100644 .extlib/simplesamlphp/modules/authorize/locales/zh-tw/LC_MESSAGES/authorize.po create mode 100644 .extlib/simplesamlphp/modules/authorize/locales/zh/LC_MESSAGES/authorize.po create mode 100644 .extlib/simplesamlphp/modules/authorize/locales/zu/LC_MESSAGES/authorize.po create mode 100644 .extlib/simplesamlphp/modules/authorize/routing/routes/routes.yml create mode 100644 .extlib/simplesamlphp/modules/authorize/src/Auth/Process/Authorize.php create mode 100644 .extlib/simplesamlphp/modules/authorize/src/Controller/Authorize.php create mode 100644 .extlib/simplesamlphp/modules/authorize/templates/authorize_403.twig create mode 100644 .extlib/simplesamlphp/modules/consent/LICENSE create mode 100644 .extlib/simplesamlphp/modules/consent/README.md create mode 100644 .extlib/simplesamlphp/modules/consent/composer.json create mode 100644 .extlib/simplesamlphp/modules/consent/docs/consent.md create mode 100644 .extlib/simplesamlphp/modules/consent/locales/af/LC_MESSAGES/consent.po create mode 100644 .extlib/simplesamlphp/modules/consent/locales/ar/LC_MESSAGES/consent.po create mode 100644 .extlib/simplesamlphp/modules/consent/locales/cs/LC_MESSAGES/consent.po create mode 100644 .extlib/simplesamlphp/modules/consent/locales/da/LC_MESSAGES/consent.po create mode 100644 .extlib/simplesamlphp/modules/consent/locales/de/LC_MESSAGES/consent.po create mode 100644 .extlib/simplesamlphp/modules/consent/locales/el/LC_MESSAGES/consent.po create mode 100644 .extlib/simplesamlphp/modules/consent/locales/en/LC_MESSAGES/consent.po create mode 100644 .extlib/simplesamlphp/modules/consent/locales/es/LC_MESSAGES/consent.po create mode 100644 .extlib/simplesamlphp/modules/consent/locales/et/LC_MESSAGES/consent.po create mode 100644 .extlib/simplesamlphp/modules/consent/locales/eu/LC_MESSAGES/consent.po create mode 100644 .extlib/simplesamlphp/modules/consent/locales/fi/LC_MESSAGES/consent.po create mode 100644 .extlib/simplesamlphp/modules/consent/locales/fr/LC_MESSAGES/consent.po create mode 100644 .extlib/simplesamlphp/modules/consent/locales/he/LC_MESSAGES/consent.po create mode 100644 .extlib/simplesamlphp/modules/consent/locales/hr/LC_MESSAGES/consent.po create mode 100644 .extlib/simplesamlphp/modules/consent/locales/hu/LC_MESSAGES/consent.po create mode 100644 .extlib/simplesamlphp/modules/consent/locales/id/LC_MESSAGES/consent.po create mode 100644 .extlib/simplesamlphp/modules/consent/locales/it/LC_MESSAGES/consent.po create mode 100644 .extlib/simplesamlphp/modules/consent/locales/ja/LC_MESSAGES/consent.po create mode 100644 .extlib/simplesamlphp/modules/consent/locales/lb/LC_MESSAGES/consent.po create mode 100644 .extlib/simplesamlphp/modules/consent/locales/lt/LC_MESSAGES/consent.po create mode 100644 .extlib/simplesamlphp/modules/consent/locales/lv/LC_MESSAGES/consent.po create mode 100644 .extlib/simplesamlphp/modules/consent/locales/nb/LC_MESSAGES/consent.po create mode 100644 .extlib/simplesamlphp/modules/consent/locales/nl/LC_MESSAGES/consent.po create mode 100644 .extlib/simplesamlphp/modules/consent/locales/nn/LC_MESSAGES/consent.po create mode 100644 .extlib/simplesamlphp/modules/consent/locales/pl/LC_MESSAGES/consent.po create mode 100644 .extlib/simplesamlphp/modules/consent/locales/pt-br/LC_MESSAGES/consent.po create mode 100644 .extlib/simplesamlphp/modules/consent/locales/pt/LC_MESSAGES/consent.po create mode 100644 .extlib/simplesamlphp/modules/consent/locales/ro/LC_MESSAGES/consent.po create mode 100644 .extlib/simplesamlphp/modules/consent/locales/ru/LC_MESSAGES/consent.po create mode 100644 .extlib/simplesamlphp/modules/consent/locales/sl/LC_MESSAGES/consent.po create mode 100644 .extlib/simplesamlphp/modules/consent/locales/sr/LC_MESSAGES/consent.po create mode 100644 .extlib/simplesamlphp/modules/consent/locales/st/LC_MESSAGES/consent.po create mode 100644 .extlib/simplesamlphp/modules/consent/locales/sv/LC_MESSAGES/consent.po create mode 100644 .extlib/simplesamlphp/modules/consent/locales/tr/LC_MESSAGES/consent.po create mode 100644 .extlib/simplesamlphp/modules/consent/locales/xh/LC_MESSAGES/consent.po create mode 100644 .extlib/simplesamlphp/modules/consent/locales/zh-tw/LC_MESSAGES/consent.po create mode 100644 .extlib/simplesamlphp/modules/consent/locales/zh/LC_MESSAGES/consent.po create mode 100644 .extlib/simplesamlphp/modules/consent/locales/zu/LC_MESSAGES/consent.po create mode 100644 .extlib/simplesamlphp/modules/consent/public/assets/css/consent.css create mode 100644 .extlib/simplesamlphp/modules/consent/routing/routes/routes.yml create mode 100644 .extlib/simplesamlphp/modules/consent/src/Auth/Process/Consent.php create mode 100644 .extlib/simplesamlphp/modules/consent/src/Consent/Store/Cookie.php create mode 100644 .extlib/simplesamlphp/modules/consent/src/Consent/Store/Database.php create mode 100644 .extlib/simplesamlphp/modules/consent/src/Controller/ConsentController.php create mode 100644 .extlib/simplesamlphp/modules/consent/src/Logout.php create mode 100644 .extlib/simplesamlphp/modules/consent/src/Store.php create mode 100644 .extlib/simplesamlphp/modules/consent/templates/consentform.twig create mode 100644 .extlib/simplesamlphp/modules/consent/templates/logout_completed.twig create mode 100644 .extlib/simplesamlphp/modules/consent/templates/noconsent.twig create mode 100644 .extlib/simplesamlphp/modules/consentAdmin/LICENSE create mode 100644 .extlib/simplesamlphp/modules/consentAdmin/README.md create mode 100644 .extlib/simplesamlphp/modules/consentAdmin/composer.json create mode 100644 .extlib/simplesamlphp/modules/consentAdmin/config/module_consentAdmin.php.dist create mode 100644 .extlib/simplesamlphp/modules/consentAdmin/docs/consentAdmin.md create mode 100644 .extlib/simplesamlphp/modules/consentAdmin/hooks/hook_configpage.php create mode 100644 .extlib/simplesamlphp/modules/consentAdmin/locales/ar/LC_MESSAGES/consentAdmin.po create mode 100644 .extlib/simplesamlphp/modules/consentAdmin/locales/cs/LC_MESSAGES/consentAdmin.po create mode 100644 .extlib/simplesamlphp/modules/consentAdmin/locales/da/LC_MESSAGES/consentAdmin.po create mode 100644 .extlib/simplesamlphp/modules/consentAdmin/locales/de/LC_MESSAGES/consentAdmin.po create mode 100644 .extlib/simplesamlphp/modules/consentAdmin/locales/el/LC_MESSAGES/consentAdmin.po create mode 100644 .extlib/simplesamlphp/modules/consentAdmin/locales/en/LC_MESSAGES/consentAdmin.po create mode 100644 .extlib/simplesamlphp/modules/consentAdmin/locales/es/LC_MESSAGES/consentAdmin.po create mode 100644 .extlib/simplesamlphp/modules/consentAdmin/locales/et/LC_MESSAGES/consentAdmin.po create mode 100644 .extlib/simplesamlphp/modules/consentAdmin/locales/eu/LC_MESSAGES/consentAdmin.po create mode 100644 .extlib/simplesamlphp/modules/consentAdmin/locales/fr/LC_MESSAGES/consentAdmin.po create mode 100644 .extlib/simplesamlphp/modules/consentAdmin/locales/he/LC_MESSAGES/consentAdmin.po create mode 100644 .extlib/simplesamlphp/modules/consentAdmin/locales/hr/LC_MESSAGES/consentAdmin.po create mode 100644 .extlib/simplesamlphp/modules/consentAdmin/locales/hu/LC_MESSAGES/consentAdmin.po create mode 100644 .extlib/simplesamlphp/modules/consentAdmin/locales/id/LC_MESSAGES/consentAdmin.po create mode 100644 .extlib/simplesamlphp/modules/consentAdmin/locales/it/LC_MESSAGES/consentAdmin.po create mode 100644 .extlib/simplesamlphp/modules/consentAdmin/locales/ja/LC_MESSAGES/consentAdmin.po create mode 100644 .extlib/simplesamlphp/modules/consentAdmin/locales/lt/LC_MESSAGES/consentAdmin.po create mode 100644 .extlib/simplesamlphp/modules/consentAdmin/locales/lv/LC_MESSAGES/consentAdmin.po create mode 100644 .extlib/simplesamlphp/modules/consentAdmin/locales/nb/LC_MESSAGES/consentAdmin.po create mode 100644 .extlib/simplesamlphp/modules/consentAdmin/locales/nl/LC_MESSAGES/consentAdmin.po create mode 100644 .extlib/simplesamlphp/modules/consentAdmin/locales/nn/LC_MESSAGES/consentAdmin.po create mode 100644 .extlib/simplesamlphp/modules/consentAdmin/locales/pt/LC_MESSAGES/consentAdmin.po create mode 100644 .extlib/simplesamlphp/modules/consentAdmin/locales/ro/LC_MESSAGES/consentAdmin.po create mode 100644 .extlib/simplesamlphp/modules/consentAdmin/locales/ru/LC_MESSAGES/consentAdmin.po create mode 100644 .extlib/simplesamlphp/modules/consentAdmin/locales/sl/LC_MESSAGES/consentAdmin.po create mode 100644 .extlib/simplesamlphp/modules/consentAdmin/locales/sr/LC_MESSAGES/consentAdmin.po create mode 100644 .extlib/simplesamlphp/modules/consentAdmin/locales/sv/LC_MESSAGES/consentAdmin.po create mode 100644 .extlib/simplesamlphp/modules/consentAdmin/locales/zh-tw/LC_MESSAGES/consentAdmin.po create mode 100644 .extlib/simplesamlphp/modules/consentAdmin/locales/zh/LC_MESSAGES/consentAdmin.po create mode 100644 .extlib/simplesamlphp/modules/consentAdmin/public/assets/css/consentAdmin.css create mode 100644 .extlib/simplesamlphp/modules/consentAdmin/public/assets/js/consentAdmin.js create mode 100644 .extlib/simplesamlphp/modules/consentAdmin/routing/routes/routes.yml create mode 100644 .extlib/simplesamlphp/modules/consentAdmin/src/Controller/ConsentAdmin.php create mode 100644 .extlib/simplesamlphp/modules/consentAdmin/templates/consentadmin.twig create mode 100644 .extlib/simplesamlphp/modules/consentAdmin/templates/consentadminajax.twig create mode 100644 .extlib/simplesamlphp/modules/discopower/LICENSE create mode 100644 .extlib/simplesamlphp/modules/discopower/README.md create mode 100644 .extlib/simplesamlphp/modules/discopower/composer.json create mode 100644 .extlib/simplesamlphp/modules/discopower/config-templates/module_discopower.php create mode 100644 .extlib/simplesamlphp/modules/discopower/docs/discopower.md create mode 100644 .extlib/simplesamlphp/modules/discopower/locales/af/LC_MESSAGES/discopower.po create mode 100644 .extlib/simplesamlphp/modules/discopower/locales/da/LC_MESSAGES/discopower.po create mode 100644 .extlib/simplesamlphp/modules/discopower/locales/el/LC_MESSAGES/discopower.po create mode 100644 .extlib/simplesamlphp/modules/discopower/locales/en/LC_MESSAGES/discopower.po create mode 100644 .extlib/simplesamlphp/modules/discopower/locales/es/LC_MESSAGES/discopower.po create mode 100644 .extlib/simplesamlphp/modules/discopower/locales/fr/LC_MESSAGES/discopower.po create mode 100644 .extlib/simplesamlphp/modules/discopower/locales/gl/LC_MESSAGES/discopower.po create mode 100644 .extlib/simplesamlphp/modules/discopower/locales/nl/LC_MESSAGES/discopower.po create mode 100644 .extlib/simplesamlphp/modules/discopower/locales/ru/LC_MESSAGES/discopower.po create mode 100644 .extlib/simplesamlphp/modules/discopower/locales/st/LC_MESSAGES/discopower.po create mode 100644 .extlib/simplesamlphp/modules/discopower/locales/xh/LC_MESSAGES/discopower.po create mode 100644 .extlib/simplesamlphp/modules/discopower/locales/zh-tw/LC_MESSAGES/discopower.po create mode 100644 .extlib/simplesamlphp/modules/discopower/locales/zu/LC_MESSAGES/discopower.po create mode 100644 .extlib/simplesamlphp/modules/discopower/public/assets/css/disco.css create mode 100644 .extlib/simplesamlphp/modules/discopower/public/assets/css/ui-theme-1.13.2/images/ui-bg_glass_55_fbf9ee_1x400.png create mode 100644 .extlib/simplesamlphp/modules/discopower/public/assets/css/ui-theme-1.13.2/images/ui-bg_glass_65_ffffff_1x400.png create mode 100644 .extlib/simplesamlphp/modules/discopower/public/assets/css/ui-theme-1.13.2/images/ui-bg_glass_75_dadada_1x400.png create mode 100644 .extlib/simplesamlphp/modules/discopower/public/assets/css/ui-theme-1.13.2/images/ui-bg_glass_75_e6e6e6_1x400.png create mode 100644 .extlib/simplesamlphp/modules/discopower/public/assets/css/ui-theme-1.13.2/images/ui-bg_glass_95_fef1ec_1x400.png create mode 100644 .extlib/simplesamlphp/modules/discopower/public/assets/css/ui-theme-1.13.2/images/ui-bg_highlight-soft_75_cccccc_1x100.png create mode 100644 .extlib/simplesamlphp/modules/discopower/public/assets/css/ui-theme-1.13.2/images/ui-icons_222222_256x240.png create mode 100644 .extlib/simplesamlphp/modules/discopower/public/assets/css/ui-theme-1.13.2/images/ui-icons_2e83ff_256x240.png create mode 100644 .extlib/simplesamlphp/modules/discopower/public/assets/css/ui-theme-1.13.2/images/ui-icons_454545_256x240.png create mode 100644 .extlib/simplesamlphp/modules/discopower/public/assets/css/ui-theme-1.13.2/images/ui-icons_888888_256x240.png create mode 100644 .extlib/simplesamlphp/modules/discopower/public/assets/css/ui-theme-1.13.2/images/ui-icons_cd0a0a_256x240.png create mode 100644 .extlib/simplesamlphp/modules/discopower/public/assets/css/ui-theme-1.13.2/jquery-ui.min.css create mode 100644 .extlib/simplesamlphp/modules/discopower/public/assets/js/jquery-3.6.0.min.js create mode 100644 .extlib/simplesamlphp/modules/discopower/public/assets/js/jquery-ui-1.13.2.min.js create mode 100644 .extlib/simplesamlphp/modules/discopower/public/assets/js/jquery.livesearch.js create mode 100644 .extlib/simplesamlphp/modules/discopower/public/assets/js/quicksilver.js create mode 100644 .extlib/simplesamlphp/modules/discopower/public/assets/js/suggest.js create mode 100644 .extlib/simplesamlphp/modules/discopower/public/assets/js/tablist.js create mode 100644 .extlib/simplesamlphp/modules/discopower/routing/routes/routes.yml create mode 100644 .extlib/simplesamlphp/modules/discopower/src/Controller/DiscoPower.php create mode 100644 .extlib/simplesamlphp/modules/discopower/src/PowerIdPDisco.php create mode 100644 .extlib/simplesamlphp/modules/discopower/templates/disco.twig create mode 100644 .extlib/simplesamlphp/modules/ldap/LICENSE create mode 100644 .extlib/simplesamlphp/modules/ldap/README.md create mode 100644 .extlib/simplesamlphp/modules/ldap/UPGRADE.md create mode 100644 .extlib/simplesamlphp/modules/ldap/composer.json create mode 100644 .extlib/simplesamlphp/modules/ldap/docs/ldap.md create mode 100644 .extlib/simplesamlphp/modules/ldap/src/Auth/InvalidCredentialResult.php create mode 100644 .extlib/simplesamlphp/modules/ldap/src/Auth/Process/AttributeAddFromLDAP.php create mode 100644 .extlib/simplesamlphp/modules/ldap/src/Auth/Process/AttributeAddUsersGroups.php create mode 100644 .extlib/simplesamlphp/modules/ldap/src/Auth/Process/BaseFilter.php create mode 100644 .extlib/simplesamlphp/modules/ldap/src/Auth/Source/Ldap.php create mode 100644 .extlib/simplesamlphp/modules/ldap/src/Auth/Source/LdapMulti.php create mode 100644 .extlib/simplesamlphp/modules/ldap/src/Connector/ActiveDirectory.php create mode 100644 .extlib/simplesamlphp/modules/ldap/src/Connector/Ldap.php create mode 100644 .extlib/simplesamlphp/modules/ldap/src/Connector/LdapHelpers.php create mode 100644 .extlib/simplesamlphp/modules/ldap/src/ConnectorFactory.php create mode 100644 .extlib/simplesamlphp/modules/ldap/src/ConnectorInterface.php create mode 100644 .extlib/simplesamlphp/modules/metarefresh/LICENSE create mode 100644 .extlib/simplesamlphp/modules/metarefresh/README.md create mode 100644 .extlib/simplesamlphp/modules/metarefresh/bin/metarefresh.php create mode 100644 .extlib/simplesamlphp/modules/metarefresh/composer.json create mode 100644 .extlib/simplesamlphp/modules/metarefresh/config-templates/module_metarefresh.php create mode 100644 .extlib/simplesamlphp/modules/metarefresh/docs/simplesamlphp-automated_metadata.md create mode 100644 .extlib/simplesamlphp/modules/metarefresh/hooks/hook_configpage.php create mode 100644 .extlib/simplesamlphp/modules/metarefresh/hooks/hook_cron.php create mode 100644 .extlib/simplesamlphp/modules/metarefresh/locales/en/LC_MESSAGES/metarefresh.po create mode 100644 .extlib/simplesamlphp/modules/metarefresh/routing/routes/routes.yaml create mode 100644 .extlib/simplesamlphp/modules/metarefresh/src/ARP.php create mode 100644 .extlib/simplesamlphp/modules/metarefresh/src/Controller/MetaRefresh.php create mode 100644 .extlib/simplesamlphp/modules/metarefresh/src/MetaLoader.php create mode 100644 .extlib/simplesamlphp/modules/metarefresh/src/MetaRefresh.php create mode 100644 .extlib/simplesamlphp/modules/metarefresh/templates/fetch.twig create mode 100644 .extlib/simplesamlphp/modules/radius/LICENSE create mode 100644 .extlib/simplesamlphp/modules/radius/README.md create mode 100644 .extlib/simplesamlphp/modules/radius/composer.json create mode 100644 .extlib/simplesamlphp/modules/radius/docs/radius.md create mode 100644 .extlib/simplesamlphp/modules/radius/src/Auth/Source/Radius.php create mode 100644 .extlib/simplesamlphp/modules/sqlauth/LICENSE create mode 100644 .extlib/simplesamlphp/modules/sqlauth/README.md create mode 100644 .extlib/simplesamlphp/modules/sqlauth/composer.json create mode 100644 .extlib/simplesamlphp/modules/sqlauth/docs/sql.md create mode 100644 .extlib/simplesamlphp/modules/sqlauth/src/Auth/Source/PasswordVerify.php create mode 100644 .extlib/simplesamlphp/modules/sqlauth/src/Auth/Source/SQL.php create mode 100644 .extlib/simplesamlphp/modules/statistics/LICENSE create mode 100644 .extlib/simplesamlphp/modules/statistics/README.md create mode 100644 .extlib/simplesamlphp/modules/statistics/bin/loganalyzer.php create mode 100644 .extlib/simplesamlphp/modules/statistics/bin/logcleaner.php create mode 100644 .extlib/simplesamlphp/modules/statistics/composer.json create mode 100644 .extlib/simplesamlphp/modules/statistics/config/module_statistics.php.dist create mode 100644 .extlib/simplesamlphp/modules/statistics/docs/authproc_statisticswithattribute.md create mode 100644 .extlib/simplesamlphp/modules/statistics/docs/statistics.md create mode 100644 .extlib/simplesamlphp/modules/statistics/hooks/hook_configpage.php create mode 100644 .extlib/simplesamlphp/modules/statistics/hooks/hook_cron.php create mode 100644 .extlib/simplesamlphp/modules/statistics/hooks/hook_sanitycheck.php create mode 100644 .extlib/simplesamlphp/modules/statistics/locales/en/LC_MESSAGES/statistics.po create mode 100644 .extlib/simplesamlphp/modules/statistics/locales/es/LC_MESSAGES/statistics.po create mode 100644 .extlib/simplesamlphp/modules/statistics/locales/nb/LC_MESSAGES/statistics.po create mode 100644 .extlib/simplesamlphp/modules/statistics/locales/nn/LC_MESSAGES/statistics.po create mode 100644 .extlib/simplesamlphp/modules/statistics/public/assets/css/statistics.css create mode 100644 .extlib/simplesamlphp/modules/statistics/public/assets/css/ui-theme-1.13.2/images/ui-bg_glass_55_fbf9ee_1x400.png create mode 100644 .extlib/simplesamlphp/modules/statistics/public/assets/css/ui-theme-1.13.2/images/ui-bg_glass_65_ffffff_1x400.png create mode 100644 .extlib/simplesamlphp/modules/statistics/public/assets/css/ui-theme-1.13.2/images/ui-bg_glass_75_dadada_1x400.png create mode 100644 .extlib/simplesamlphp/modules/statistics/public/assets/css/ui-theme-1.13.2/images/ui-bg_glass_75_e6e6e6_1x400.png create mode 100644 .extlib/simplesamlphp/modules/statistics/public/assets/css/ui-theme-1.13.2/images/ui-bg_glass_95_fef1ec_1x400.png create mode 100644 .extlib/simplesamlphp/modules/statistics/public/assets/css/ui-theme-1.13.2/images/ui-bg_highlight-soft_75_cccccc_1x100.png create mode 100644 .extlib/simplesamlphp/modules/statistics/public/assets/css/ui-theme-1.13.2/images/ui-icons_222222_256x240.png create mode 100644 .extlib/simplesamlphp/modules/statistics/public/assets/css/ui-theme-1.13.2/images/ui-icons_2e83ff_256x240.png create mode 100644 .extlib/simplesamlphp/modules/statistics/public/assets/css/ui-theme-1.13.2/images/ui-icons_454545_256x240.png create mode 100644 .extlib/simplesamlphp/modules/statistics/public/assets/css/ui-theme-1.13.2/images/ui-icons_888888_256x240.png create mode 100644 .extlib/simplesamlphp/modules/statistics/public/assets/css/ui-theme-1.13.2/images/ui-icons_cd0a0a_256x240.png create mode 100644 .extlib/simplesamlphp/modules/statistics/public/assets/css/ui-theme-1.13.2/jquery-ui.min.css create mode 100644 .extlib/simplesamlphp/modules/statistics/public/assets/js/jquery-1.12.4.min.js create mode 100644 .extlib/simplesamlphp/modules/statistics/public/assets/js/jquery-ui-1.13.2.min.js create mode 100644 .extlib/simplesamlphp/modules/statistics/public/assets/js/statistics.js create mode 100644 .extlib/simplesamlphp/modules/statistics/routing/routes/routes.yaml create mode 100644 .extlib/simplesamlphp/modules/statistics/src/ACL.php create mode 100644 .extlib/simplesamlphp/modules/statistics/src/AccessCheck.php create mode 100644 .extlib/simplesamlphp/modules/statistics/src/Aggregator.php create mode 100644 .extlib/simplesamlphp/modules/statistics/src/Auth/Process/StatisticsWithAttribute.php create mode 100644 .extlib/simplesamlphp/modules/statistics/src/Controller/Statistics.php create mode 100644 .extlib/simplesamlphp/modules/statistics/src/DateHandler.php create mode 100644 .extlib/simplesamlphp/modules/statistics/src/DateHandlerMonth.php create mode 100644 .extlib/simplesamlphp/modules/statistics/src/Graph/GoogleCharts.php create mode 100644 .extlib/simplesamlphp/modules/statistics/src/LogCleaner.php create mode 100644 .extlib/simplesamlphp/modules/statistics/src/LogParser.php create mode 100644 .extlib/simplesamlphp/modules/statistics/src/RatioDataset.php create mode 100644 .extlib/simplesamlphp/modules/statistics/src/Ruleset.php create mode 100644 .extlib/simplesamlphp/modules/statistics/src/StatDataset.php create mode 100644 .extlib/simplesamlphp/modules/statistics/src/Statistics/FieldPresentation/Base.php create mode 100644 .extlib/simplesamlphp/modules/statistics/src/Statistics/FieldPresentation/Entity.php create mode 100644 .extlib/simplesamlphp/modules/statistics/src/Statistics/Rulesets/BaseRule.php create mode 100644 .extlib/simplesamlphp/modules/statistics/src/Statistics/Rulesets/Ratio.php create mode 100644 .extlib/simplesamlphp/modules/statistics/templates/statistics.twig create mode 100644 .extlib/simplesamlphp/modules/statistics/templates/statmeta.twig diff --git a/.extlib/simplesamlphp/modules/authorize/LICENSE b/.extlib/simplesamlphp/modules/authorize/LICENSE new file mode 100644 index 000000000..a345e48d0 --- /dev/null +++ b/.extlib/simplesamlphp/modules/authorize/LICENSE @@ -0,0 +1,459 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + \ No newline at end of file diff --git a/.extlib/simplesamlphp/modules/authorize/README.md b/.extlib/simplesamlphp/modules/authorize/README.md new file mode 100644 index 000000000..3eae423b5 --- /dev/null +++ b/.extlib/simplesamlphp/modules/authorize/README.md @@ -0,0 +1,27 @@ +# Authorize + +![Build Status](https://github.com/simplesamlphp/simplesamlphp-module-authorize/workflows/CI/badge.svg?branch=master) +[![Coverage Status](https://codecov.io/gh/simplesamlphp/simplesamlphp-module-authorize/branch/master/graph/badge.svg)](https://codecov.io/gh/simplesamlphp/simplesamlphp-module-authorize) +[![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/simplesamlphp/simplesamlphp-module-authorize/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/simplesamlphp/simplesamlphp-module-authorize/?branch=master) +[![Type Coverage](https://shepherd.dev/github/simplesamlphp/simplesamlphp-module-authorize/coverage.svg)](https://shepherd.dev/github/simplesamlphp/simplesamlphp-module-authorize) +[![Psalm Level](https://shepherd.dev/github/simplesamlphp/simplesamlphp-module-authorize/level.svg)](https://shepherd.dev/github/simplesamlphp/simplesamlphp-module-authorize) + +## Install + +Install with composer + +```bash + vendor/bin/composer require simplesamlphp/simplesamlphp-module-authorize +``` + +## Configuration + +Next thing you need to do is to enable the module: in `config.php`, +search for the `module.enable` key and set `authorize` to true: + +```php + 'module.enable' => [ + 'authorize' => true, + … + ], +``` diff --git a/.extlib/simplesamlphp/modules/authorize/composer.json b/.extlib/simplesamlphp/modules/authorize/composer.json new file mode 100644 index 000000000..1d6e5d460 --- /dev/null +++ b/.extlib/simplesamlphp/modules/authorize/composer.json @@ -0,0 +1,49 @@ +{ + "name": "simplesamlphp/simplesamlphp-module-authorize", + "description": "This module provides a user authorization filter based on attribute matching", + "type": "simplesamlphp-module", + "keywords": ["simplesamlphp", "authorize"], + "license": "LGPL-2.1-or-later", + "authors": [ + { + "name": "Ernesto Revilla", + "email": "erny@yaco.es" + } + ], + "config": { + "preferred-install": { + "simplesamlphp/simplesamlphp": "source", + "*": "dist" + }, + "allow-plugins": { + "composer/package-versions-deprecated": true, + "dealerdirect/phpcodesniffer-composer-installer": true, + "phpstan/extension-installer": true, + "simplesamlphp/composer-module-installer": true + } + }, + "autoload": { + "psr-4": { + "SimpleSAML\\Module\\authorize\\": "src/" + } + }, + "autoload-dev": { + "psr-4": { + "SimpleSAML\\Module\\Authorize\\Tests\\Utils\\": "tests/Utils", + "SimpleSAML\\Test\\Utils\\": "vendor/simplesamlphp/simplesamlphp/tests/Utils" + } + }, + "require": { + "php": "^8.1", + "simplesamlphp/assert": "^1.0", + "simplesamlphp/simplesamlphp": "^2.1", + "symfony/http-foundation": "^6.4" + }, + "require-dev": { + "simplesamlphp/simplesamlphp-test-framework": "^1.5" + }, + "support": { + "issues": "https://github.com/simplesamlphp/simplesamlphp-module-authorize/issues", + "source": "https://github.com/simplesamlphp/simplesamlphp-module-authorize" + } +} diff --git a/.extlib/simplesamlphp/modules/authorize/docs/authorize.md b/.extlib/simplesamlphp/modules/authorize/docs/authorize.md new file mode 100644 index 000000000..9a7bb676b --- /dev/null +++ b/.extlib/simplesamlphp/modules/authorize/docs/authorize.md @@ -0,0 +1,158 @@ +# authorize Module + +* Author: Ernesto Revilla , Yaco Sistemas, Ryan Panning +* Package: SimpleSAMLphp + +This module provides a user authorization filter based on attribute matching +for those applications that do not cleanly separate authentication from +authorization and set some default permissions for authenticated users. + +`authorize:Authorize` +: Authorize certain users based on attribute matching + +## `authorize:Authorize` + +There are three configuration options that can be defined: `deny`, `regex`, +and `reject_msg`. All other filter configuration options are considered +attribute matching rules. + +Unauthorized users will be shown a 403 Forbidden page. + +### `deny` + +The default action of the filter is to authorize only if an attribute match +is found (default allow). When set to TRUE, this option reverses that rule and +authorizes the user unless an attribute match is found (default deny), causing +an unauthorized action. + +**Note**: This option needs to be boolean (TRUE/FALSE) else it will be considered + an attribute matching rule. + +### `regex` + +Turn regex pattern matching on or off for the attribute values defined. For +backwards compatibility, this option defaults to TRUE, but can be turned off +by setting it to FALSE. + +**Note**: This option needs to be boolean (TRUE/FALSE) else it will be + considered an attribute matching rule. + +### `reject_msg` + +This option can be used to provide a localised, custom message to an +unauthorised user. For example: tailored instructions on how to fix the +authorisation issue, specific contact details, etc. + +It should be an array of key/value pairs, with the keys as the language code. +You can use HTML in the message. See below for an example. + +### `errorURL` + +If the identity provider includes an `errorURL` in metadata, this option turns +on or off the generation of a context-specific errorURL in accordance with the +REFEDS SAML2 Metadata Deployment Profile for errorURL. Defaults to TRUE. + +**Note**: This option needs to be boolean (TRUE/FALSE) else it will be + considered an attribute matching rule. + +### `allow_reauthentication` + +This option can be used to allow users to re-authenticate if they are +unauthorized. If set to TRUE, the user will be shown a button to re-authenticate. +If set to FALSE, the user will not be shown a button to re-authenticate. + +**Note**: This option needs to be boolean (TRUE/FALSE) else it will be + considered FALSE. + +### `show_user_attribute` + +This option can be used to show the user attribute, to inform the with which +account they are logged in. If set to a valid attribute, the user will see +the first value of that attribute. + +**Note**: This option needs to be a string else it will be considered disabled. + Default value is NULL. + +## Attribute Rules + +Each additional filter configuration option is considered an attribute matching +rule. For each attribute, you can specify a string or array of strings to match. +If one of those attributes match one of the rules (OR operator), the user is +authorized/unauthorized (depending on the deny config option). + +**Note**: If regex is enabled, you must use the preg_match format, i.e. you have + to enclose it with a delimiter that does not appear inside the regex + (e.g. slash (/), at sign (@), number sign (#) or underscore (`_`)). + +### Problems + +* Once you get the forbidden page, you can't logout at the IdP directly, + (as far as I know), you have to close the browser. + +### Examples + +To use this filter configure it in `config/config.php`. +For unstructured attributes use `^` and `$` to anchor your regex as necessary: + +```php +'authproc.sp' => [ + 60 => [ + 'class' => 'authorize:Authorize', + 'uid' => [ + '/^.*@example.com$/', + /* + * Use anchors to prevent matching + * 'wronguser1@example.edu.attacker.com' + */ + '/^(user1|user2|user3)@example.edu$/', + ], + 'schacUserStatus' => '@urn:mace:terena.org:userStatus:' . + 'example.org:service:active.*@', + ] +] +``` + +An alternate way of using this filter is to deny certain users. Or even use +multiple filters to create a simple ACL, by first allowing a group of users but +then denying a "black list" of users. + +```php +'authproc.sp' => [ + 60 => array[ + 'class' => 'authorize:Authorize', + 'deny' => true, + 'uid' => [ + '/.*@students.example.edu$/', + '/^(stu1|stu2|stu3)@example.edu$/', + ] + ] +] +``` + +The regex pattern matching can be turned off, allowing for exact attribute +matching rules. This can be helpful in cases where you know what the value +should be. An example of this is with the memberOf attribute or using the +ldap:AttributeAddUsersGroups filter with the group attribute. + +Additionally, some helpful instructions are shown. + +```php +'authproc.sp' => [ + 60 => [ + 'class' => 'authorize:Authorize', + 'regex' => false, + 'group' => [ + 'CN=SimpleSAML Students,CN=Users,DC=example,DC=edu', + 'CN=All Teachers,OU=Staff,DC=example,DC=edu', + ], + 'reject_msg' => [ + 'en' => 'This service is only available to students and' . + ' teachers. Please contact ' . + 'support.', + 'nl' => 'Deze dienst is alleen beschikbaar voor studenten en ' . + 'docenten. Neem contact op met ' . + 'support.', + ], + ], +], +``` diff --git a/.extlib/simplesamlphp/modules/authorize/locales/af/LC_MESSAGES/authorize.po b/.extlib/simplesamlphp/modules/authorize/locales/af/LC_MESSAGES/authorize.po new file mode 100644 index 000000000..b0658b10a --- /dev/null +++ b/.extlib/simplesamlphp/modules/authorize/locales/af/LC_MESSAGES/authorize.po @@ -0,0 +1,27 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: af\n" +"Language-Team: \n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "Access forbidden" +msgstr "Toegang verbode" + +msgid "" +"You don't have the needed privileges to access this application. Please " +"contact the administrator if you find this to be incorrect." +msgstr "" +"Jy het nie die nodige regte vir toegang na die aansoek nie. Kontak " +"asseblief die administrateur indien dit inkorrek is." + diff --git a/.extlib/simplesamlphp/modules/authorize/locales/ar/LC_MESSAGES/authorize.po b/.extlib/simplesamlphp/modules/authorize/locales/ar/LC_MESSAGES/authorize.po new file mode 100644 index 000000000..daa41edd3 --- /dev/null +++ b/.extlib/simplesamlphp/modules/authorize/locales/ar/LC_MESSAGES/authorize.po @@ -0,0 +1,28 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: ar\n" +"Language-Team: \n" +"Plural-Forms: nplurals=6; plural=(n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n>=3 " +"&& n<=10 ? 3 : n>=11 && n<=99 ? 4 : 5)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "Access forbidden" +msgstr "ممنوع الدخول" + +msgid "" +"You don't have the needed privileges to access this application. Please " +"contact the administrator if you find this to be incorrect." +msgstr "" +"لا يمكنك الدخول لهذا التطبيق. قم بأخطار إدارة الموقع ان كنت تظن ان هذا " +"غير صحيح" + diff --git a/.extlib/simplesamlphp/modules/authorize/locales/cs/LC_MESSAGES/authorize.po b/.extlib/simplesamlphp/modules/authorize/locales/cs/LC_MESSAGES/authorize.po new file mode 100644 index 000000000..c03e8bd10 --- /dev/null +++ b/.extlib/simplesamlphp/modules/authorize/locales/cs/LC_MESSAGES/authorize.po @@ -0,0 +1,28 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: cs\n" +"Language-Team: \n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "Access forbidden" +msgstr "Přístup odmítnut" + +msgid "" +"You don't have the needed privileges to access this application. Please " +"contact the administrator if you find this to be incorrect." +msgstr "" +"Nemáte dostatečná práva pro přístup k této aplikaci. Prosím, kontaktujte " +"administrátora, pokud toto omezení shledáváte nesprávné." + diff --git a/.extlib/simplesamlphp/modules/authorize/locales/da/LC_MESSAGES/authorize.po b/.extlib/simplesamlphp/modules/authorize/locales/da/LC_MESSAGES/authorize.po new file mode 100644 index 000000000..a6aad5f75 --- /dev/null +++ b/.extlib/simplesamlphp/modules/authorize/locales/da/LC_MESSAGES/authorize.po @@ -0,0 +1,27 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: da\n" +"Language-Team: \n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "Access forbidden" +msgstr "Adgang forbudt" + +msgid "" +"You don't have the needed privileges to access this application. Please " +"contact the administrator if you find this to be incorrect." +msgstr "" +"Du har ikke de nødvendige privilegier til at tilgå applikationen. Kontakt" +" administratoren hvis du mener at dette ikke er korrekt." + diff --git a/.extlib/simplesamlphp/modules/authorize/locales/de/LC_MESSAGES/authorize.po b/.extlib/simplesamlphp/modules/authorize/locales/de/LC_MESSAGES/authorize.po new file mode 100644 index 000000000..2a0db7853 --- /dev/null +++ b/.extlib/simplesamlphp/modules/authorize/locales/de/LC_MESSAGES/authorize.po @@ -0,0 +1,28 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: de\n" +"Language-Team: \n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "Access forbidden" +msgstr "Zugriff verboten" + +msgid "" +"You don't have the needed privileges to access this application. Please " +"contact the administrator if you find this to be incorrect." +msgstr "" +"Sie haben nicht die erforderlichen Berechtigungen um auf diese Anwendung " +"zuzugreifen. Bitte kontaktieren Sie einen Administrator, wenn Sie dies " +"ungerechtfertigt finden." + diff --git a/.extlib/simplesamlphp/modules/authorize/locales/el/LC_MESSAGES/authorize.po b/.extlib/simplesamlphp/modules/authorize/locales/el/LC_MESSAGES/authorize.po new file mode 100644 index 000000000..748e9f414 --- /dev/null +++ b/.extlib/simplesamlphp/modules/authorize/locales/el/LC_MESSAGES/authorize.po @@ -0,0 +1,28 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: el\n" +"Language-Team: \n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "Access forbidden" +msgstr "Δεν επιτρέπεται η πρόσβαση" + +msgid "" +"You don't have the needed privileges to access this application. Please " +"contact the administrator if you find this to be incorrect." +msgstr "" +"Δεν έχετε τα απαραίτητα δικαιώματα για να αποκτήσετε πρόσβαση σε αυτή την" +" υπηρεσία. Παρακαλούμε επικοινωνήστε με το διαχειριστή αν θεωρείτε ότι " +"αυτό να είναι λανθασμένο." + diff --git a/.extlib/simplesamlphp/modules/authorize/locales/en/LC_MESSAGES/authorize.po b/.extlib/simplesamlphp/modules/authorize/locales/en/LC_MESSAGES/authorize.po new file mode 100644 index 000000000..d9f2d8e54 --- /dev/null +++ b/.extlib/simplesamlphp/modules/authorize/locales/en/LC_MESSAGES/authorize.po @@ -0,0 +1,32 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: en\n" +"Language-Team: \n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "Access forbidden" +msgstr "Access forbidden" + +msgid "" +"You don't have the needed privileges to access this application. Please " +"contact the administrator if you find this to be incorrect." +msgstr "" +"You don't have the needed privileges to access this application. Please " +"contact the administrator if you find this to be incorrect." + +msgid "Change account?" +msgstr "Change account?" + +msgid "You are currently logged in as" +msgstr "You are currently logged in as" diff --git a/.extlib/simplesamlphp/modules/authorize/locales/es/LC_MESSAGES/authorize.po b/.extlib/simplesamlphp/modules/authorize/locales/es/LC_MESSAGES/authorize.po new file mode 100644 index 000000000..836c58ee8 --- /dev/null +++ b/.extlib/simplesamlphp/modules/authorize/locales/es/LC_MESSAGES/authorize.po @@ -0,0 +1,27 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: es\n" +"Language-Team: \n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "Access forbidden" +msgstr "Acceso denegado" + +msgid "" +"You don't have the needed privileges to access this application. Please " +"contact the administrator if you find this to be incorrect." +msgstr "" +"No tiene los privilegios necesarios para acceder a esta aplicación. Si " +"considera que esto no es correcto, consulte el administrador." + diff --git a/.extlib/simplesamlphp/modules/authorize/locales/et/LC_MESSAGES/authorize.po b/.extlib/simplesamlphp/modules/authorize/locales/et/LC_MESSAGES/authorize.po new file mode 100644 index 000000000..175ed0d8f --- /dev/null +++ b/.extlib/simplesamlphp/modules/authorize/locales/et/LC_MESSAGES/authorize.po @@ -0,0 +1,27 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: et\n" +"Language-Team: \n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "Access forbidden" +msgstr "Juurdepääs keelatud" + +msgid "" +"You don't have the needed privileges to access this application. Please " +"contact the administrator if you find this to be incorrect." +msgstr "" +"Sul pole sellele rakendusele ligipääsuks vajalikke õigusi. Kui arvad " +"teisiti, siis võta palun ühendust administraatoriga." + diff --git a/.extlib/simplesamlphp/modules/authorize/locales/eu/LC_MESSAGES/authorize.po b/.extlib/simplesamlphp/modules/authorize/locales/eu/LC_MESSAGES/authorize.po new file mode 100644 index 000000000..5a74e6f26 --- /dev/null +++ b/.extlib/simplesamlphp/modules/authorize/locales/eu/LC_MESSAGES/authorize.po @@ -0,0 +1,27 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: eu\n" +"Language-Team: \n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "Access forbidden" +msgstr "Sarrera debekatua" + +msgid "" +"You don't have the needed privileges to access this application. Please " +"contact the administrator if you find this to be incorrect." +msgstr "" +"Ez duzu beharrezko pribilegiorik aplikazio honetan sartzeko. Hau okerra " +"dela baderitzozu, jar zaitez administratzailearekin harremanetan. " + diff --git a/.extlib/simplesamlphp/modules/authorize/locales/fi/LC_MESSAGES/authorize.po b/.extlib/simplesamlphp/modules/authorize/locales/fi/LC_MESSAGES/authorize.po new file mode 100644 index 000000000..0c585fd68 --- /dev/null +++ b/.extlib/simplesamlphp/modules/authorize/locales/fi/LC_MESSAGES/authorize.po @@ -0,0 +1,27 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: fi\n" +"Language-Team: \n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "Access forbidden" +msgstr "Pääsy estetty." + +msgid "" +"You don't have the needed privileges to access this application. Please " +"contact the administrator if you find this to be incorrect." +msgstr "" +"Sinulla ei ole tarvittavia oikeuksia käyttää tätä sovellusta. Ota " +"yhteyttä ylläpitoon, jos huomaat tämän olevan virheellinen." + diff --git a/.extlib/simplesamlphp/modules/authorize/locales/fr/LC_MESSAGES/authorize.po b/.extlib/simplesamlphp/modules/authorize/locales/fr/LC_MESSAGES/authorize.po new file mode 100644 index 000000000..2e42d4830 --- /dev/null +++ b/.extlib/simplesamlphp/modules/authorize/locales/fr/LC_MESSAGES/authorize.po @@ -0,0 +1,27 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: fr\n" +"Language-Team: \n" +"Plural-Forms: nplurals=2; plural=(n > 1)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "Access forbidden" +msgstr "Accès refusé" + +msgid "" +"You don't have the needed privileges to access this application. Please " +"contact the administrator if you find this to be incorrect." +msgstr "" +"Vos privilèges sont insuffisants pour accéder à cette application. " +"Contactez vous administrateur si cette situation est anormale." + diff --git a/.extlib/simplesamlphp/modules/authorize/locales/he/LC_MESSAGES/authorize.po b/.extlib/simplesamlphp/modules/authorize/locales/he/LC_MESSAGES/authorize.po new file mode 100644 index 000000000..dfd63862f --- /dev/null +++ b/.extlib/simplesamlphp/modules/authorize/locales/he/LC_MESSAGES/authorize.po @@ -0,0 +1,27 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: he\n" +"Language-Team: \n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "Access forbidden" +msgstr "גישה אסורה" + +msgid "" +"You don't have the needed privileges to access this application. Please " +"contact the administrator if you find this to be incorrect." +msgstr "" +"אין לך הרשאות מספקות לגשת לישום זה. צור קשר עם מנהל המערכת שלך אם עובדה " +"זו לא נכונה." + diff --git a/.extlib/simplesamlphp/modules/authorize/locales/hr/LC_MESSAGES/authorize.po b/.extlib/simplesamlphp/modules/authorize/locales/hr/LC_MESSAGES/authorize.po new file mode 100644 index 000000000..2dbb50dcc --- /dev/null +++ b/.extlib/simplesamlphp/modules/authorize/locales/hr/LC_MESSAGES/authorize.po @@ -0,0 +1,29 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: hr\n" +"Language-Team: \n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "Access forbidden" +msgstr "Pristup zabranjen" + +msgid "" +"You don't have the needed privileges to access this application. Please " +"contact the administrator if you find this to be incorrect." +msgstr "" +"Nemate potrebne ovlasti za pristup ovoj aplikaciji. Molimo kontaktirajte " +"administratora aplikacije ako smatrate da bi vam pristup aplikaciji " +"trebao biti omogućen." + diff --git a/.extlib/simplesamlphp/modules/authorize/locales/hu/LC_MESSAGES/authorize.po b/.extlib/simplesamlphp/modules/authorize/locales/hu/LC_MESSAGES/authorize.po new file mode 100644 index 000000000..5c46a8b24 --- /dev/null +++ b/.extlib/simplesamlphp/modules/authorize/locales/hu/LC_MESSAGES/authorize.po @@ -0,0 +1,27 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: hu\n" +"Language-Team: \n" +"Plural-Forms: nplurals=1; plural=0\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "Access forbidden" +msgstr "Hozzáférés megtagadva" + +msgid "" +"You don't have the needed privileges to access this application. Please " +"contact the administrator if you find this to be incorrect." +msgstr "" +"Önnek nincsenek meg a szükséges jogosultságai a lap megtekintéséhez. " +"Kérjük, forduljon az oldal adminisztrátorához." + diff --git a/.extlib/simplesamlphp/modules/authorize/locales/id/LC_MESSAGES/authorize.po b/.extlib/simplesamlphp/modules/authorize/locales/id/LC_MESSAGES/authorize.po new file mode 100644 index 000000000..b4702e29d --- /dev/null +++ b/.extlib/simplesamlphp/modules/authorize/locales/id/LC_MESSAGES/authorize.po @@ -0,0 +1,28 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: id\n" +"Language-Team: \n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "Access forbidden" +msgstr "Dilarang mengakses" + +msgid "" +"You don't have the needed privileges to access this application. Please " +"contact the administrator if you find this to be incorrect." +msgstr "" +"Anda tidak memiliki hak yang diperlukan untuk mengakses aplikasi ini. " +"Silahkan menghubungi administrator jika seharusnya anda dapat mengakses " +"aplikasi ini." + diff --git a/.extlib/simplesamlphp/modules/authorize/locales/it/LC_MESSAGES/authorize.po b/.extlib/simplesamlphp/modules/authorize/locales/it/LC_MESSAGES/authorize.po new file mode 100644 index 000000000..a3256c642 --- /dev/null +++ b/.extlib/simplesamlphp/modules/authorize/locales/it/LC_MESSAGES/authorize.po @@ -0,0 +1,27 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: it\n" +"Language-Team: \n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "Access forbidden" +msgstr "Accesso vietato" + +msgid "" +"You don't have the needed privileges to access this application. Please " +"contact the administrator if you find this to be incorrect." +msgstr "" +"Non si dispone dei privilegi per accedere a questa applicazione. " +"Contattare l'amministratore se si ritiene che si tratti di un errore." + diff --git a/.extlib/simplesamlphp/modules/authorize/locales/ja/LC_MESSAGES/authorize.po b/.extlib/simplesamlphp/modules/authorize/locales/ja/LC_MESSAGES/authorize.po new file mode 100644 index 000000000..4608d3ae0 --- /dev/null +++ b/.extlib/simplesamlphp/modules/authorize/locales/ja/LC_MESSAGES/authorize.po @@ -0,0 +1,25 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: ja\n" +"Language-Team: \n" +"Plural-Forms: nplurals=1; plural=0\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "Access forbidden" +msgstr "アクセスが禁止されています" + +msgid "" +"You don't have the needed privileges to access this application. Please " +"contact the administrator if you find this to be incorrect." +msgstr "あなたはこのアプリケーションにアクセスする権限を持っていません。これが正しくない場合、管理者にお問い合わせください。" + diff --git a/.extlib/simplesamlphp/modules/authorize/locales/lt/LC_MESSAGES/authorize.po b/.extlib/simplesamlphp/modules/authorize/locales/lt/LC_MESSAGES/authorize.po new file mode 100644 index 000000000..ef816e9cc --- /dev/null +++ b/.extlib/simplesamlphp/modules/authorize/locales/lt/LC_MESSAGES/authorize.po @@ -0,0 +1,28 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: lt\n" +"Language-Team: \n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"(n%100<10 || n%100>=20) ? 1 : 2)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "Access forbidden" +msgstr "Priėjimas uždraustas" + +msgid "" +"You don't have the needed privileges to access this application. Please " +"contact the administrator if you find this to be incorrect." +msgstr "" +"Jūs neturite reikiamų teisių šiai aplikacijai pasiekti. Prašome " +"susisiekti su administratoriumi, jei manote, kad taip neturėtų būti." + diff --git a/.extlib/simplesamlphp/modules/authorize/locales/lv/LC_MESSAGES/authorize.po b/.extlib/simplesamlphp/modules/authorize/locales/lv/LC_MESSAGES/authorize.po new file mode 100644 index 000000000..486afdf9c --- /dev/null +++ b/.extlib/simplesamlphp/modules/authorize/locales/lv/LC_MESSAGES/authorize.po @@ -0,0 +1,28 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: lv\n" +"Language-Team: \n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 :" +" 2)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "Access forbidden" +msgstr "Pieeja liegta" + +msgid "" +"You don't have the needed privileges to access this application. Please " +"contact the administrator if you find this to be incorrect." +msgstr "" +"Jums nav pietiekamu tiesību šīs aplikācijas izmantošanai. Vaicājiet " +"administratoram." + diff --git a/.extlib/simplesamlphp/modules/authorize/locales/nb/LC_MESSAGES/authorize.po b/.extlib/simplesamlphp/modules/authorize/locales/nb/LC_MESSAGES/authorize.po new file mode 100644 index 000000000..192f3009b --- /dev/null +++ b/.extlib/simplesamlphp/modules/authorize/locales/nb/LC_MESSAGES/authorize.po @@ -0,0 +1,27 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: nb_NO\n" +"Language-Team: \n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "Access forbidden" +msgstr "Ingen tilgang" + +msgid "" +"You don't have the needed privileges to access this application. Please " +"contact the administrator if you find this to be incorrect." +msgstr "" +"Du har ikke de nødvendige rettighetene til å nå denne siden. Vennligst " +"kontakt administratoren dersom du mener dette ikke stemmer." + diff --git a/.extlib/simplesamlphp/modules/authorize/locales/nl/LC_MESSAGES/authorize.po b/.extlib/simplesamlphp/modules/authorize/locales/nl/LC_MESSAGES/authorize.po new file mode 100644 index 000000000..22ab2b3d5 --- /dev/null +++ b/.extlib/simplesamlphp/modules/authorize/locales/nl/LC_MESSAGES/authorize.po @@ -0,0 +1,32 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: nl\n" +"Language-Team: \n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "Access forbidden" +msgstr "Geen toegang" + +msgid "" +"You don't have the needed privileges to access this application. Please " +"contact the administrator if you find this to be incorrect." +msgstr "" +"U heeft niet genoeg rechten om deze applicatie te benaderen. Benader de " +"beheerder als u denkt dat dit ten onrechte is." + +msgid "Change account?" +msgstr "Verander account?" + +msgid "You are currently logged in as" +msgstr "Je bent ingelogd als" diff --git a/.extlib/simplesamlphp/modules/authorize/locales/nn/LC_MESSAGES/authorize.po b/.extlib/simplesamlphp/modules/authorize/locales/nn/LC_MESSAGES/authorize.po new file mode 100644 index 000000000..3c8b1a5b1 --- /dev/null +++ b/.extlib/simplesamlphp/modules/authorize/locales/nn/LC_MESSAGES/authorize.po @@ -0,0 +1,27 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: nn\n" +"Language-Team: \n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "Access forbidden" +msgstr "Ingen tilgang" + +msgid "" +"You don't have the needed privileges to access this application. Please " +"contact the administrator if you find this to be incorrect." +msgstr "" +"Du har ikkje tilgang fordi du manglar rettane til å gå inn. Ta kontakt " +"med administrator dersom dette er feil." + diff --git a/.extlib/simplesamlphp/modules/authorize/locales/pl/LC_MESSAGES/authorize.po b/.extlib/simplesamlphp/modules/authorize/locales/pl/LC_MESSAGES/authorize.po new file mode 100644 index 000000000..7459d2cc9 --- /dev/null +++ b/.extlib/simplesamlphp/modules/authorize/locales/pl/LC_MESSAGES/authorize.po @@ -0,0 +1,21 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: pl\n" +"Language-Team: \n" +"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && " +"(n%100<10 || n%100>=20) ? 1 : 2)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "Access forbidden" +msgstr "Dostęp zabroniony" + diff --git a/.extlib/simplesamlphp/modules/authorize/locales/pt-br/LC_MESSAGES/authorize.po b/.extlib/simplesamlphp/modules/authorize/locales/pt-br/LC_MESSAGES/authorize.po new file mode 100644 index 000000000..943248fb9 --- /dev/null +++ b/.extlib/simplesamlphp/modules/authorize/locales/pt-br/LC_MESSAGES/authorize.po @@ -0,0 +1,27 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: pt_BR\n" +"Language-Team: \n" +"Plural-Forms: nplurals=2; plural=(n > 1)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "Access forbidden" +msgstr "Acesso proibido" + +msgid "" +"You don't have the needed privileges to access this application. Please " +"contact the administrator if you find this to be incorrect." +msgstr "" +"Você não tem privilégios necessários para acessar esta aplicação. Entre " +"em contato com o administrador se você achar que isso seja incorreto." + diff --git a/.extlib/simplesamlphp/modules/authorize/locales/pt/LC_MESSAGES/authorize.po b/.extlib/simplesamlphp/modules/authorize/locales/pt/LC_MESSAGES/authorize.po new file mode 100644 index 000000000..0cee9e124 --- /dev/null +++ b/.extlib/simplesamlphp/modules/authorize/locales/pt/LC_MESSAGES/authorize.po @@ -0,0 +1,27 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: pt\n" +"Language-Team: \n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "Access forbidden" +msgstr "Acesso negado" + +msgid "" +"You don't have the needed privileges to access this application. Please " +"contact the administrator if you find this to be incorrect." +msgstr "" +"Não tem privilégios para aceder a esta aplicação. Contacte o " +"administrador caso ache necessário." + diff --git a/.extlib/simplesamlphp/modules/authorize/locales/ro/LC_MESSAGES/authorize.po b/.extlib/simplesamlphp/modules/authorize/locales/ro/LC_MESSAGES/authorize.po new file mode 100644 index 000000000..bba6251fb --- /dev/null +++ b/.extlib/simplesamlphp/modules/authorize/locales/ro/LC_MESSAGES/authorize.po @@ -0,0 +1,29 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: ro\n" +"Language-Team: \n" +"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100" +" < 20)) ? 1 : 2)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "Access forbidden" +msgstr "Accesul nu este permis" + +msgid "" +"You don't have the needed privileges to access this application. Please " +"contact the administrator if you find this to be incorrect." +msgstr "" +"Nu aveți drepturile necesare pentru a accesa/folosi această aplicație. Vă" +" rugăm să contactați administratorul sistemului dacă considerați această " +"afirmație ca fiind incorectă." + diff --git a/.extlib/simplesamlphp/modules/authorize/locales/ru/LC_MESSAGES/authorize.po b/.extlib/simplesamlphp/modules/authorize/locales/ru/LC_MESSAGES/authorize.po new file mode 100644 index 000000000..e50f73b3e --- /dev/null +++ b/.extlib/simplesamlphp/modules/authorize/locales/ru/LC_MESSAGES/authorize.po @@ -0,0 +1,28 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: ru\n" +"Language-Team: \n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "Access forbidden" +msgstr "Доступ запрещён" + +msgid "" +"You don't have the needed privileges to access this application. Please " +"contact the administrator if you find this to be incorrect." +msgstr "" +"У вас нет необходимых прав для доступа к этому приложению. Пожалуйста, " +"свяжитесь с администратором, если вы считаете, что это неправильно." + diff --git a/.extlib/simplesamlphp/modules/authorize/locales/sl/LC_MESSAGES/authorize.po b/.extlib/simplesamlphp/modules/authorize/locales/sl/LC_MESSAGES/authorize.po new file mode 100644 index 000000000..d54b12dac --- /dev/null +++ b/.extlib/simplesamlphp/modules/authorize/locales/sl/LC_MESSAGES/authorize.po @@ -0,0 +1,28 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: sl\n" +"Language-Team: \n" +"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 " +"|| n%100==4 ? 2 : 3)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "Access forbidden" +msgstr "Dostop zavrnjen" + +msgid "" +"You don't have the needed privileges to access this application. Please " +"contact the administrator if you find this to be incorrect." +msgstr "" +"Za dostop do spletne storitve nima ustreznih pravic. Obrnite se na " +"administratorja vašega IdP." + diff --git a/.extlib/simplesamlphp/modules/authorize/locales/sr/LC_MESSAGES/authorize.po b/.extlib/simplesamlphp/modules/authorize/locales/sr/LC_MESSAGES/authorize.po new file mode 100644 index 000000000..14ea59a1d --- /dev/null +++ b/.extlib/simplesamlphp/modules/authorize/locales/sr/LC_MESSAGES/authorize.po @@ -0,0 +1,29 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: sr\n" +"Language-Team: \n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "Access forbidden" +msgstr "Pristup zabranjen" + +msgid "" +"You don't have the needed privileges to access this application. Please " +"contact the administrator if you find this to be incorrect." +msgstr "" +"Nemate potrebna ovlašćenja za pristup ovoj aplikaciji. Molimo " +"kontaktirajte administratora aplikacije ako smatrate da bi vam pristup " +"aplikaciji trebao biti omogućen." + diff --git a/.extlib/simplesamlphp/modules/authorize/locales/st/LC_MESSAGES/authorize.po b/.extlib/simplesamlphp/modules/authorize/locales/st/LC_MESSAGES/authorize.po new file mode 100644 index 000000000..a70c53337 --- /dev/null +++ b/.extlib/simplesamlphp/modules/authorize/locales/st/LC_MESSAGES/authorize.po @@ -0,0 +1,27 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: st\n" +"Language-Team: \n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "Access forbidden" +msgstr "Phihlello e thibetswe" + +msgid "" +"You don't have the needed privileges to access this application. Please " +"contact the administrator if you find this to be incorrect." +msgstr "" +"Ha o na makgabane a lokelang ho fihlella tshebediso ena. Ka kopo ikopanye " +"le motsamaisi haeba o fumana sena se sa nepahala." + diff --git a/.extlib/simplesamlphp/modules/authorize/locales/sv/LC_MESSAGES/authorize.po b/.extlib/simplesamlphp/modules/authorize/locales/sv/LC_MESSAGES/authorize.po new file mode 100644 index 000000000..b763f46f6 --- /dev/null +++ b/.extlib/simplesamlphp/modules/authorize/locales/sv/LC_MESSAGES/authorize.po @@ -0,0 +1,27 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: sv\n" +"Language-Team: \n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "Access forbidden" +msgstr "Förbjuden access" + +msgid "" +"You don't have the needed privileges to access this application. Please " +"contact the administrator if you find this to be incorrect." +msgstr "" +"Du har inte tillräckliga rättigheter för att använda denna applikation. " +"Ta kontakt med administratören om detta inte stämmer." + diff --git a/.extlib/simplesamlphp/modules/authorize/locales/xh/LC_MESSAGES/authorize.po b/.extlib/simplesamlphp/modules/authorize/locales/xh/LC_MESSAGES/authorize.po new file mode 100644 index 000000000..8f42c8b43 --- /dev/null +++ b/.extlib/simplesamlphp/modules/authorize/locales/xh/LC_MESSAGES/authorize.po @@ -0,0 +1,26 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2018-11-15 14:49+0200\n" +"PO-Revision-Date: 2018-11-15 14:49+0200\n" +"Last-Translator: \n" +"Language-Team: \n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 1.3\n" + +msgid "Access Forbidden" +msgstr "Ufikelelo luthintelwe" + +msgid "" +"You don't have the needed privileges to access this application. Please " +"contact the administrator if you find this to be incorrect." +msgstr "" +"Awunawo amalungelo afunekayo ukuze ufikelele olu setyenziso. Nceda " +"uqhagamshelane nomlawuli ukuba ngaba ukufumanisa oku kungachanekanga." + diff --git a/.extlib/simplesamlphp/modules/authorize/locales/zh-tw/LC_MESSAGES/authorize.po b/.extlib/simplesamlphp/modules/authorize/locales/zh-tw/LC_MESSAGES/authorize.po new file mode 100644 index 000000000..46cec0a9d --- /dev/null +++ b/.extlib/simplesamlphp/modules/authorize/locales/zh-tw/LC_MESSAGES/authorize.po @@ -0,0 +1,25 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: zh_Hant_TW\n" +"Language-Team: \n" +"Plural-Forms: nplurals=1; plural=0\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "Access forbidden" +msgstr "禁止存取" + +msgid "" +"You don't have the needed privileges to access this application. Please " +"contact the administrator if you find this to be incorrect." +msgstr "您沒有所需的權限存取此程式,如果這不是正確的,請連絡您的系統管理員。" + diff --git a/.extlib/simplesamlphp/modules/authorize/locales/zh/LC_MESSAGES/authorize.po b/.extlib/simplesamlphp/modules/authorize/locales/zh/LC_MESSAGES/authorize.po new file mode 100644 index 000000000..c5d743c07 --- /dev/null +++ b/.extlib/simplesamlphp/modules/authorize/locales/zh/LC_MESSAGES/authorize.po @@ -0,0 +1,25 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: zh\n" +"Language-Team: \n" +"Plural-Forms: nplurals=1; plural=0\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "Access forbidden" +msgstr "禁止访问" + +msgid "" +"You don't have the needed privileges to access this application. Please " +"contact the administrator if you find this to be incorrect." +msgstr "你没有权限访问该应用,如果你认为这是一个错误,请联系管理员" + diff --git a/.extlib/simplesamlphp/modules/authorize/locales/zu/LC_MESSAGES/authorize.po b/.extlib/simplesamlphp/modules/authorize/locales/zu/LC_MESSAGES/authorize.po new file mode 100644 index 000000000..b4e89c510 --- /dev/null +++ b/.extlib/simplesamlphp/modules/authorize/locales/zu/LC_MESSAGES/authorize.po @@ -0,0 +1,26 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2018-11-15 14:49+0200\n" +"PO-Revision-Date: 2018-11-15 14:49+0200\n" +"Last-Translator: \n" +"Language-Team: \n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 1.3\n" + +msgid "Access forbidden" +msgstr "Ukufinyelela kwenqatshelwe" + +msgid "" +"You don't have the needed privileges to access this application. Please " +"contact the administrator if you find this to be incorrect." +msgstr "" +"Awunawo amalungelo adingekile okufinyelela lolu hlelo. Sicela uthinte " +"umlawuli uma uthola ukuthi lokhu akulona iqiniso." + diff --git a/.extlib/simplesamlphp/modules/authorize/routing/routes/routes.yml b/.extlib/simplesamlphp/modules/authorize/routing/routes/routes.yml new file mode 100644 index 000000000..931152c7a --- /dev/null +++ b/.extlib/simplesamlphp/modules/authorize/routing/routes/routes.yml @@ -0,0 +1,14 @@ +--- + +authorize-error-forbidden: + path: /error/forbidden + defaults: { + _controller: 'SimpleSAML\Module\authorize\Controller\Authorize::forbidden' + } + methods: [GET] +authorize-reauthenticate: + path: /error/reauthenticate + defaults: { + _controller: 'SimpleSAML\Module\authorize\Controller\Authorize::reauthenticate' + } + methods: [GET] diff --git a/.extlib/simplesamlphp/modules/authorize/src/Auth/Process/Authorize.php b/.extlib/simplesamlphp/modules/authorize/src/Auth/Process/Authorize.php new file mode 100644 index 000000000..3fc05e34b --- /dev/null +++ b/.extlib/simplesamlphp/modules/authorize/src/Auth/Process/Authorize.php @@ -0,0 +1,238 @@ +deny = $config['deny']; + unset($config['deny']); + } + + // Check for the regex option + // Must be bool specifically, if not, it might be for an attrib filter below + if (isset($config['regex']) && is_bool($config['regex'])) { + $this->regex = $config['regex']; + unset($config['regex']); + } + + // Check for the reject_msg option; Must be array of languages + if (isset($config['reject_msg']) && is_array($config['reject_msg'])) { + $this->reject_msg = $config['reject_msg']; + unset($config['reject_msg']); + } + + // Check for the errorURL option + // Must be bool specifically, if not, it might be for an attrib filter below + if (isset($config['errorURL']) && is_bool($config['errorURL'])) { + $this->errorURL = $config['errorURL']; + unset($config['errorURL']); + } + + if (isset($config['allow_reauthentication']) && is_bool($config['allow_reauthentication'])) { + $this->allow_reauthentication = $config['allow_reauthentication']; + unset($config['allow_reauthentication']); + } + + if (isset($config['show_user_attribute']) && is_string($config['show_user_attribute'])) { + $this->show_user_attribute = $config['show_user_attribute']; + unset($config['show_user_attribute']); + } + + foreach ($config as $attribute => $values) { + if (is_string($values)) { + $arrayUtils = new Utils\Arrays(); + $values = $arrayUtils->arrayize($values); + } elseif (!is_array($values)) { + throw new Exception(sprintf( + 'Filter Authorize: Attribute values is neither string nor array: %s', + var_export($attribute, true), + )); + } + + foreach ($values as $value) { + if (!is_string($value)) { + throw new Exception(sprintf( + 'Filter Authorize: Each value should be a string for attribute: %s value: %s config: %s', + var_export($attribute, true), + var_export($value, true), + var_export($config, true), + )); + } + } + $this->valid_attribute_values[$attribute] = $values; + } + } + + + /** + * Apply filter to validate attributes. + * + * @param array &$state The current request + */ + public function process(array &$state): void + { + Assert::keyExists($state, 'Attributes'); + + $authorize = $this->deny; + $attributes = &$state['Attributes']; + $ctx = []; + + // Store the rejection message array in the $state + if (!empty($this->reject_msg)) { + $state['authprocAuthorize_reject_msg'] = $this->reject_msg; + } + $state['authprocAuthorize_errorURL'] = $this->errorURL; + $state['authprocAuthorize_allow_reauthentication'] = $this->allow_reauthentication; + $arrayUtils = new Utils\Arrays(); + foreach ($this->valid_attribute_values as $name => $patterns) { + if (array_key_exists($name, $attributes)) { + foreach ($patterns as $pattern) { + $values = $arrayUtils->arrayize($attributes[$name]); + foreach ($values as $value) { + if ($this->regex) { + $matched = preg_match($pattern, $value); + } else { + $matched = ($value === $pattern); + } + + if ($matched) { + $authorize = ($this->deny ? false : true); + array_push($ctx, $name); + break 3; + } + } + } + } + } + + if (!$authorize) { + if ($this->show_user_attribute !== null && array_key_exists($this->show_user_attribute, $attributes)) { + $userAttribute = $attributes[$this->show_user_attribute][0] ?? null; + if ($userAttribute !== null) { + $state['authprocAuthorize_user_attribute'] = $userAttribute; + } + } + + // Try to hint at which attributes may have failed as context for errorURL processing + if ($this->deny) { + $state['authprocAuthorize_ctx'] = implode(' ', $ctx); + } else { + $state['authprocAuthorize_ctx'] = implode( + ' ', + array_diff(array_keys($this->valid_attribute_values), $ctx), + ); + } + $this->unauthorized($state); + } + } + + + /** + * When the process logic determines that the user is not + * authorized for this service, then forward the user to + * an 403 unauthorized page. + * + * Separated this code into its own method so that child + * classes can override it and change the action. Forward + * thinking in case a "chained" ACL is needed, more complex + * permission logic. + * + * @param array $state + */ + protected function unauthorized(array &$state): void + { + // Save state and redirect to 403 page + $id = Auth\State::saveState($state, 'authorize:Authorize'); + $url = Module::getModuleURL('authorize/error/forbidden'); + $httpUtils = new Utils\HTTP(); + $httpUtils->redirectTrustedURL($url, ['StateId' => $id]); + } +} diff --git a/.extlib/simplesamlphp/modules/authorize/src/Controller/Authorize.php b/.extlib/simplesamlphp/modules/authorize/src/Controller/Authorize.php new file mode 100644 index 000000000..d7e8785ed --- /dev/null +++ b/.extlib/simplesamlphp/modules/authorize/src/Controller/Authorize.php @@ -0,0 +1,128 @@ +query->get('StateId', false); + if (!is_string($stateId)) { + throw new Error\BadRequest('Missing required StateId query parameter.'); + } + + /** @var array $state */ + $state = Auth\State::loadState($stateId, 'authorize:Authorize'); + + $t = new Template($this->config, 'authorize:authorize_403.twig'); + if (isset($state['Source']['auth'])) { + $t->data['source'] = $state['Source']['auth']; + } + if (isset($state['authprocAuthorize_reject_msg'])) { + $t->data['reject_msg'] = $state['authprocAuthorize_reject_msg']; + } + + if (isset($state['Source']['auth'])) { + $t->data['LogoutURL'] = Module::getModuleURL( + 'core/logout/' . urlencode($state['Source']['auth']), + ); + } + if (isset($state['authprocAuthorize_user_attribute'])) { + $t->data['user_attribute'] = $state['authprocAuthorize_user_attribute']; + } + + $t->data['allow_reauthentication'] = $state['authprocAuthorize_allow_re_authenticate_on_unauthorized'] ?? false; + $stateId = Auth\State::saveState($state, 'authorize:Authorize'); + $t->data['url_reauthentication'] = + Module::getModuleURL('authorize/error/reauthenticate', ['StateId' => $stateId]); + + if ( + isset($state['authprocAuthorize_errorURL']) + && $state['authprocAuthorize_errorURL'] === true + && isset($state['Source']['errorURL']) + ) { + $errorURL = $state['Source']['errorURL']; + $errorURL = str_replace('ERRORURL_CODE', 'AUTHORIZATION_FAILURE', $errorURL); + if (isset($state['saml:sp:State']['core:SP'])) { + $errorURL = str_replace('ERRORURL_RP', urlencode($state['saml:sp:State']['core:SP']), $errorURL); + } + if (isset($state['saml:AuthnInstant'])) { + $errorURL = str_replace('ERRORURL_TS', $state['saml:AuthnInstant'], $errorURL); + } else { + $errorURL = str_replace('ERRORURL_TS', strval(time()), $errorURL); + } + $errorURL = str_replace('ERRORURL_TID', urlencode($this->session->getTrackID()), $errorURL); + if (isset($state['authprocAuthorize_ctx'])) { + $errorURL = str_replace('ERRORURL_CTX', urlencode($state['authprocAuthorize_ctx']), $errorURL); + } + $t->data['errorURL'] = $errorURL; + } + + $t->setStatusCode(403); + return $t; + } + + public function reauthenticate(Request $request): void + { + $stateId = $request->query->get('StateId', false); + if (!is_string($stateId)) { + throw new Error\BadRequest('Missing required StateId query parameter.'); + } + /** @var array $state */ + $state = Auth\State::loadState($stateId, 'authorize:Authorize'); + + $authSource = $state['Source']['auth']; + if (empty($authSource)) { + throw new Error\BadRequest('Missing required auth source.'); + } + $parameters = ['ForceAuthn' => true]; + + if (isset($state['\\SimpleSAML\\Auth\\State.restartURL'])) { + $returnToUrl = $state['\\SimpleSAML\\Auth\\State.restartURL'] ; + $parameters['ReturnTo'] = $returnToUrl; + } + + $auth = new Auth\Simple($authSource); + $auth->login($parameters); + } +} diff --git a/.extlib/simplesamlphp/modules/authorize/templates/authorize_403.twig b/.extlib/simplesamlphp/modules/authorize/templates/authorize_403.twig new file mode 100644 index 000000000..5871088ad --- /dev/null +++ b/.extlib/simplesamlphp/modules/authorize/templates/authorize_403.twig @@ -0,0 +1,36 @@ +{% extends "base.twig" %} + +{% block content %} +

{% trans %}Access forbidden{% endtrans %}

+{% if reject_msg is defined %} +

{{ reject_msg|translateFromArray|raw }}

+{% else %} +

{% trans %}You don't have the needed privileges to access this application. Please contact the administrator if you find this to be incorrect.{% endtrans %}

+{% endif %} +{% if user_attribute is defined %} +

{% trans %}You are currently logged in as{% endtrans %} {{ user_attribute }}

+{% endif %} +{% if allow_reauthentication is defined %} +

+ + + +

+{% endif %} +{% if errorURL is defined %} +

+ {% trans %}Your identity provider provides additional information that may help you solve this.{% endtrans %} +
+ + + +

+{% endif %} +{% if LogoutURL is defined %} +

+ + + +

+{% endif %} +{% endblock%} diff --git a/.extlib/simplesamlphp/modules/consent/LICENSE b/.extlib/simplesamlphp/modules/consent/LICENSE new file mode 100644 index 000000000..a345e48d0 --- /dev/null +++ b/.extlib/simplesamlphp/modules/consent/LICENSE @@ -0,0 +1,459 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + \ No newline at end of file diff --git a/.extlib/simplesamlphp/modules/consent/README.md b/.extlib/simplesamlphp/modules/consent/README.md new file mode 100644 index 000000000..385aa0316 --- /dev/null +++ b/.extlib/simplesamlphp/modules/consent/README.md @@ -0,0 +1,7 @@ +# Consent module + +![Build Status](https://github.com/simplesamlphp/simplesamlphp-module-consent/actions/workflows/php.yml/badge.svg) +[![Coverage Status](https://codecov.io/gh/simplesamlphp/simplesamlphp-module-consent/branch/master/graph/badge.svg)](https://codecov.io/gh/simplesamlphp/simplesamlphp-module-consent) +[![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/simplesamlphp/simplesamlphp-module-consent/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/simplesamlphp/simplesamlphp-module-consent/?branch=master) +[![Type Coverage](https://shepherd.dev/github/simplesamlphp/simplesamlphp-module-consent/coverage.svg)](https://shepherd.dev/github/simplesamlphp/simplesamlphp-module-consent) +[![Psalm Level](https://shepherd.dev/github/simplesamlphp/simplesamlphp-module-consent/level.svg)](https://shepherd.dev/github/simplesamlphp/simplesamlphp-module-consent) diff --git a/.extlib/simplesamlphp/modules/consent/composer.json b/.extlib/simplesamlphp/modules/consent/composer.json new file mode 100644 index 000000000..2f83d1e9a --- /dev/null +++ b/.extlib/simplesamlphp/modules/consent/composer.json @@ -0,0 +1,52 @@ +{ + "name": "simplesamlphp/simplesamlphp-module-consent", + "description": "A module that will ask for user consent before releasing attributes", + "type": "simplesamlphp-module", + "keywords": ["simplesamlphp", "consent"], + "license": "LGPL-2.1-or-later", + "authors": [ + { + "name": "Olav Morken", + "email": "lavmrk@gmail.com" + } + ], + "config": { + "preferred-install": { + "simplesamlphp/simplesamlphp": "source", + "*": "dist" + }, + "allow-plugins": { + "composer/package-versions-deprecated": true, + "simplesamlphp/composer-module-installer": true, + "dealerdirect/phpcodesniffer-composer-installer": true + } + }, + "autoload": { + "psr-4": { + "SimpleSAML\\Module\\consent\\": "src/" + } + }, + "autoload-dev": { + "psr-4": { + "SimpleSAML\\Test\\Utils\\": "vendor/simplesamlphp/simplesamlphp/tests/Utils" + } + }, + "require": { + "php": "^8.1", + "ext-pdo": "*", + + "simplesamlphp/assert": "^1.1", + "simplesamlphp/composer-module-installer": "^1.3.4", + "simplesamlphp/saml2": "^4.6", + + "simplesamlphp/simplesamlphp": "^2.1", + "symfony/http-foundation": "^6.4" + }, + "require-dev": { + "simplesamlphp/simplesamlphp-test-framework": "^1.7" + }, + "support": { + "issues": "https://github.com/simplesamlphp/simplesamlphp-module-consent/issues", + "source": "https://github.com/simplesamlphp/simplesamlphp-module-consent" + } +} diff --git a/.extlib/simplesamlphp/modules/consent/docs/consent.md b/.extlib/simplesamlphp/modules/consent/docs/consent.md new file mode 100644 index 000000000..c3cae46ca --- /dev/null +++ b/.extlib/simplesamlphp/modules/consent/docs/consent.md @@ -0,0 +1,346 @@ +# Consent module + + + +The consent module is implemented as an Authentication Processing Filter. That +means it can be configured in the global config.php file or the SP remote or +IdP hosted metadata. + +It is recommended to run the consent module at the IdP, and configure the +filter to run after all attribute mangling filters have completed, to show the +user the exact same attributes that are sent to the SP. + +* [Read more about processing filters in SimpleSAMLphp](simplesamlphp-authproc) + +## How to setup the consent module + +First you need to enable the consent module; in `config.php`, search for the +`module.enable` key and add `consent` with value `true`: + +```php +'module.enable' => [ + 'consent' => true, + … +], +``` + +In order to generate the privacy preserving hashes in the consent module, you +need to pick one attribute that is always available and that is unique to all +users. An example of such an attribute is uid or eduPersonPrincipalName. + +If the attribute defined above is not available for a user, an error message +will be shown, and the user will not be allowed through the filter. So make +sure that you select an attribute that is available to all users. + +Add the filter to your Identity Provider hosted metadata authproc filters +list, specifying the attribute you've selected. + +```php +90 => [ + 'class' => 'consent:Consent', + 'identifyingAttribute' => 'uid', +], +``` + +This setup uses no persistent storage at all. This means that the user will +always be asked to give consent each time she logs in. + +## Using storage + +The consent module is shipped with two storage options, Cookie and Database. + +### Using cookies as storage + +In order to use a storage backend, you need to set the `store` option. To use +cookies as storage you need to set the `store` option to `consent:Cookie`. + +Example: + +```php +90 => [ + 'class' => 'consent:Consent', + 'identifyingAttribute' => 'uid', + 'store' => 'consent:Cookie', +], +``` + +If necessary, you can set the cookie parameters in the config array using the +same semantics as other cookies (default values shown): + +```php +90 => [ + 'class' => 'consent:Consent', + 'identifyingAttribute' => 'uid', + 'store' => [ + 'consent:Cookie', + 'name' => '\SimpleSAML\Module\consent', # prefix for name + 'lifetime' => 7776000, + 'path' => '/', + 'domain' => '', + 'secure' => true, + 'samesite' => null, + ], +], +``` + +### Using a database as storage + +In order to use a database backend storage, you first need to setup the +database. + +Here is the initialization SQL script: + +```sql +CREATE TABLE consent ( + consent_date TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + usage_date TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + hashed_user_id VARCHAR(80) NOT NULL, + service_id VARCHAR(255) NOT NULL, + attribute VARCHAR(80) NOT NULL, + UNIQUE (hashed_user_id, service_id) +); +``` + +The `consent:Database` backend storage has the following options: + +`class` +: Must be set to `consent:Database`. + +`dsn` +: Data Source Name must comply to the syntax for the PHP PDO layer. + +`username` +: Username for the database user to be used for the connection. + +`password` +: Password for the database user used for the connection. + +`table` +: Name of the table used for storing the consents. This option is optional + and defaults to `consent`. + +`timeout` +: The number of seconds to wait for a connection to the database server. This + option is optional. If unset, it uses the default from the database-driver. + +Example config using PostgreSQL database: + +```php +90 => [ + 'class' => 'consent:Consent', + 'identifyingAttribute' => 'uid', + 'store' => [ + 'consent:Database', + 'dsn' => 'pgsql:host=sql.example.org;dbname=consent', + 'username' => 'simplesaml', + 'password' => 'sdfsdf', + ], +], +``` + +Example config using MySQL database: + +```php +90 => [ + 'class' => 'consent:Consent', + 'identifyingAttribute' => 'uid', + 'store' => [ + 'consent:Database', + 'dsn' => 'mysql:host=db.example.org;dbname=simplesaml', + 'username' => 'simplesaml', + 'password' => 'sdfsdf', + ], +], +``` + +------- + +The following options can be used when configuring the Consent module: + +`includeValues` +: Boolean value that indicates whether the values of the attributes should be + used in calculating the unique hashes that identifies the consent. If + includeValues is set and the value of an attribute changes, then the + consent becomes invalid. This option is optional and defaults to FALSE. + +`checked` +: Boolean value that indicates whether the "Remember" consent checkbox is + checked by default. This option is optional and defaults to FALSE. + +`focus` +: Indicates whether the "Yes" or "No" button is in focus by default. This + option is optional and can take the value 'yes' or 'no' as strings. If + omitted neither will receive focus. + +`store` +: Configuration of the Consent storage backend. The store option is given in + the format `:` and refers to the class + `\SimpleSAML\Module\\Consent\Store\`. The consent module + comes with two built in storage backends: 'consent:Cookie' and + 'consent:Database'. See the separate section on setting up consent using + different storage methods. This option is optional. If the option is not + set, then the user is asked to consent, but the consent is not saved. + +`hiddenAttributes` +: Whether the value of the attributes should be hidden. Set to an array of + the attributes that should have their value hidden. Default behaviour is + that all attribute values are shown. + +`attributes.exclude` +: Allows certain attributes to be excluded from the attribute hash when + `includeValues` is `true` (and as a side effect, to be hidden from display + as `hiddenAttributes` does). Set to an array of the attributes that should + be excluded. Default behaviour is to include all values in the hash. + +`showNoConsentAboutService` +: Whether we will show a link to more information about the service from the + no consent page (configured in the SP metadata as the MDUI `InformationURL`). + Defaults to `true`. + +### External options + +The following options can be set in other places in SimpleSAMLphp: + +`PrivacyStatementURL` +: This is an absolute URL for where a user can find a privacy policy for the SP. + If set, this will be shown on the consent page. + This option can be set in + [SP-remote metadata](./simplesamlphp-reference-sp-remote) and in + [IdP-hosted metadata](./simplesamlphp-reference-idp-hosted) using the MDUI-extension. + The entry in the SP-remote metadata overrides the option in the IdP-hosted metadata. + +`consent.disable` +: Disable consent for a set of services. See section `Disabling consent`. + +### Disabling consent + +Consent can be disabled either in the IdP metadata or in the SP metadata. +To disable consent for one or more SPs for a given IdP, add the +`consent.disable`-option to the IdP metadata. To disable consent for one or +more IdPs for a given SP, add the `consent.disable`-option to the SP metadata. + +### Examples + +Disable consent for a given IdP: + +```php +$metadata['https://idp.example.org/'] = [ + [...], + 'consent.disable' => true, +]; +``` + +Disable consent for some SPs connected to a given IdP: + +```php +$metadata['https://idp.example.org/'] = [ + [...], + 'consent.disable' => [ + 'https://sp1.example.org/', + 'https://sp2.example.org/', + ], +]; +``` + +Disable consent for a given SP: + +```php +$metadata['https://sp.example.org'] = [ + [...] + 'consent.disable' => true, +], +``` + +Disable consent for some IdPs for a given SP: + +```php +$metadata['https://sp.example.org'] = [ + [...] + 'consent.disable' => [ + 'https://idp1.example.org/', + 'https://idp2.example.org/', + ], +], +``` + +### Regular expression support + +You can use regular expressions to evaluate the entityId of either the IdP +or the SP. It makes it possible to disable consent for an entire domain or +for a range of specific entityIds. Just use an array instead of a flat string +with the following format (note that flat string and array entries are allowed +at the same time) : + +```php +$metadata['https://sp.example.org'] = [ + [...] + 'consent.disable' => [ + 'https://idp1.example.org/', + ['type' => 'regex', 'pattern' => '/.*\.mycompany\.com.*/i'], + ], +], +``` + +### Attribute presentation + +It is possible to change the way the attributes are represented in the consent +page. This is done by implementing an attribute array reordering function. + +To create this function, you have to create a file named + +`hook_attributepresentation.php` + +and place it under the + +`/hooks` + +directory. To be found and called, the function must be named + +`_hook_attributepresentation(&$para)` + +The parameter `$para` is a reference to the attribute array. By manipulating +this array you can change the way the attributes are presented to the user on +the consent and status page. + +If you want the attributes to be listed in more than one level, you can make +the function add a `child_` prefix to the root node attribute name in a recursive +attribute tree. + +### Example + +These values will be listed as an bullet list + +```php +Array ( + [objectClass] => Array ( + [0] => top + [1] => person + ) +) +``` + +This array has two child arrays. These will be listed in two separate sub +tables. + +```php +Array ( + [child_eduPersonOrgUnitDN] => Array ( + [0] => Array ( + [ou] => Array ( + [0] => ET + ) + [cn] => Array ( + [0] => Eksterne tjenester + ) + ) + [1] => Array ( + [ou] => Array ( + [0] => TA + ) + [cn] => Array ( + [0] => Tjenesteavdeling + ) + ) + ) +) +``` diff --git a/.extlib/simplesamlphp/modules/consent/locales/af/LC_MESSAGES/consent.po b/.extlib/simplesamlphp/modules/consent/locales/af/LC_MESSAGES/consent.po new file mode 100644 index 000000000..160e197d8 --- /dev/null +++ b/.extlib/simplesamlphp/modules/consent/locales/af/LC_MESSAGES/consent.po @@ -0,0 +1,71 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: af\n" +"Language-Team: \n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "Yes, continue" +msgstr "Ja, voortgaan" + +msgid "Return to consent page" +msgstr "Keer terug na die toestemmingsbladsy" + +msgid "Go to information page for the service" +msgstr "Gaan na die informasie bladsy vir die diens" + +msgid "Abort login to %SPNAME%" +msgstr "Kanseleer aanmelding na %SPNAME%" + +msgid "The purpose of %SPNAME% is %SPDESC%" +msgstr "Die doel van %SPNAME% is %SPDESC%" + +msgid "" +"List the information about you that is about to be transmitted to the " +"service you are going to login to" +msgstr "" +"Lys die informasie mbt. jou wat op die punt is om gestuur te word vir die" +" diens waarby jy wil aanmeld." + +msgid "Consent about releasing personal information" +msgstr "Toestemming mbt. die vrystelling van persoonlike informasie" + +msgid "No consent given" +msgstr "Geen toestemming is gegee nie" + +msgid "You did not give consent for transferring your attributes to %SPNAME%." +msgstr "" +"Jy het nie toestemming gegee vir die oordrag van jou eienskappe na %SPNAME%" +" nie." + +msgid "Remember" +msgstr "Onthou" + +msgid "Show content" +msgstr "Vertoon inhoud" + +msgid "%SPNAME% requires that the information below is transferred." +msgstr "%SPNAME% vereis dat die inligting hieronder oorgedra word." + +msgid "Privacy policy for the service" +msgstr "Privaatheidsbeleid vir die diens" + +msgid "No, cancel" +msgstr "Nee, kanselleer" + +msgid "User information" +msgstr "Gebruiker informasie" + +msgid "Information that will be sent to %SPNAME%" +msgstr "Informasie wat gestuur sal word na %SPNAME%" + diff --git a/.extlib/simplesamlphp/modules/consent/locales/ar/LC_MESSAGES/consent.po b/.extlib/simplesamlphp/modules/consent/locales/ar/LC_MESSAGES/consent.po new file mode 100644 index 000000000..e4c0ed0cf --- /dev/null +++ b/.extlib/simplesamlphp/modules/consent/locales/ar/LC_MESSAGES/consent.po @@ -0,0 +1,68 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: ar\n" +"Language-Team: \n" +"Plural-Forms: nplurals=6; plural=(n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n>=3 " +"&& n<=10 ? 3 : n>=11 && n<=99 ? 4 : 5)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "Yes, continue" +msgstr "نعم، واصل" + +msgid "Return to consent page" +msgstr "عد لصفحة الموافقة" + +msgid "Go to information page for the service" +msgstr "اذهب لصفحة المعلومات عن الخدمة" + +msgid "Abort login to %SPNAME%" +msgstr "إلغاء عملية الدخول ل%SPNAME%" + +msgid "The purpose of %SPNAME% is %SPDESC%" +msgstr "الغرض من %SPNAME% هو %SPDESC%" + +msgid "" +"List the information about you that is about to be transmitted to the " +"service you are going to login to" +msgstr "قائمة معلوماتك التي ستحول لمقدم الخدمة الذي ترغب بتسجيل الدخول اليه" + +msgid "Consent about releasing personal information" +msgstr "اوافق علي نشر سماتي الشخصية" + +msgid "No consent given" +msgstr "لم تعطي الموافقة" + +msgid "You did not give consent for transferring your attributes to %SPNAME%." +msgstr "لم توافق علي تحويل سماتك لمقدم الخدمة" + +msgid "Remember" +msgstr "تذكرألغت ذكر" + +msgid "Show content" +msgstr "اظهراليها ظهر المحتوي" + +msgid "%SPNAME% requires that the information below is transferred." +msgstr "يحتاج %SPNAME% تحويل البيانات أدناه " + +msgid "Privacy policy for the service" +msgstr "سياسة الخصوصية للخدمة" + +msgid "No, cancel" +msgstr "لا، الغ" + +msgid "User information" +msgstr "معلومات المستخدم" + +msgid "Information that will be sent to %SPNAME%" +msgstr "المعلومات التي سيتم إرسالها ل %SPNAME%" + diff --git a/.extlib/simplesamlphp/modules/consent/locales/cs/LC_MESSAGES/consent.po b/.extlib/simplesamlphp/modules/consent/locales/cs/LC_MESSAGES/consent.po new file mode 100644 index 000000000..393ef8f67 --- /dev/null +++ b/.extlib/simplesamlphp/modules/consent/locales/cs/LC_MESSAGES/consent.po @@ -0,0 +1,70 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: cs\n" +"Language-Team: \n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "Yes, continue" +msgstr "Ano, akceptuji" + +msgid "Return to consent page" +msgstr "Zpátky na stránku pro souhlas" + +msgid "Go to information page for the service" +msgstr "Jdi na stránku s informacemi o službě" + +msgid "Abort login to %SPNAME%" +msgstr "Zrušit přihlášení k %SPNAME%" + +msgid "The purpose of %SPNAME% is %SPDESC%" +msgstr "Cíl %SPNAME% v %SPDESC%" + +msgid "" +"List the information about you that is about to be transmitted to the " +"service you are going to login to" +msgstr "" +"Seznam informací o vás, které budou předány službě, ke které se " +"přihlašujete" + +msgid "Consent about releasing personal information" +msgstr "Obsah odesílaných osobních informací" + +msgid "No consent given" +msgstr "Souhlas nebyl vydán" + +msgid "You did not give consent for transferring your attributes to %SPNAME%." +msgstr "Nedal jste souhlas pro zaslání svých atributů poskytovateli služeb." + +msgid "Remember" +msgstr "Zapamatuj" + +msgid "Show content" +msgstr "Zobrazit obsah" + +msgid "%SPNAME% requires that the information below is transferred." +msgstr "Můžete se přihlásit do služby %SPNAME%" + +msgid "Privacy policy for the service" +msgstr "Bezpečnostní politika služby" + +msgid "No, cancel" +msgstr "Ne, neakceptuji" + +msgid "User information" +msgstr "Uživatelské informace" + +msgid "Information that will be sent to %SPNAME%" +msgstr "Atributy, které mohou být zaslány službě" + diff --git a/.extlib/simplesamlphp/modules/consent/locales/da/LC_MESSAGES/consent.po b/.extlib/simplesamlphp/modules/consent/locales/da/LC_MESSAGES/consent.po new file mode 100644 index 000000000..03d2ae27b --- /dev/null +++ b/.extlib/simplesamlphp/modules/consent/locales/da/LC_MESSAGES/consent.po @@ -0,0 +1,69 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: da\n" +"Language-Team: \n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "Yes, continue" +msgstr "Ja, jeg accepterer" + +msgid "Return to consent page" +msgstr "Gå tilbage" + +msgid "Go to information page for the service" +msgstr "Gå til side med information om tjenesten" + +msgid "Abort login to %SPNAME%" +msgstr "Afbryd login til %SPNAME%" + +msgid "The purpose of %SPNAME% is %SPDESC%" +msgstr "%SPNAME% har til formål at %SPDESC%" + +msgid "" +"List the information about you that is about to be transmitted to the " +"service you are going to login to" +msgstr "Informationer som vil blive sendt til den service du er ved at logge in på" + +msgid "Consent about releasing personal information" +msgstr "Samtykke til at frigive personlige oplysninger" + +msgid "No consent given" +msgstr "Manglende samtykke" + +msgid "You did not give consent for transferring your attributes to %SPNAME%." +msgstr "Du har ikke givet samtykke til overleveringen af oplysninger til tjenesten" + +msgid "Remember" +msgstr "Husk samtykke" + +msgid "Show content" +msgstr "Vis indhold" + +msgid "%SPNAME% requires that the information below is transferred." +msgstr "" +"%SPNAME% kræver at nedenstående oplysninger overføres fra %IDPNAME%. Vil du " +"acceptere dette?" + +msgid "Privacy policy for the service" +msgstr "Tjenestens politik vedrørende personoplysninger" + +msgid "No, cancel" +msgstr "Nej, jeg accepterer ikke" + +msgid "User information" +msgstr "Bruger information" + +msgid "Information that will be sent to %SPNAME%" +msgstr "Attributter som bliver sendt til %SPNAME%" + diff --git a/.extlib/simplesamlphp/modules/consent/locales/de/LC_MESSAGES/consent.po b/.extlib/simplesamlphp/modules/consent/locales/de/LC_MESSAGES/consent.po new file mode 100644 index 000000000..5d2c6128e --- /dev/null +++ b/.extlib/simplesamlphp/modules/consent/locales/de/LC_MESSAGES/consent.po @@ -0,0 +1,73 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: de\n" +"Language-Team: \n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "Yes, continue" +msgstr "Ja, ich stimme zu" + +msgid "Return to consent page" +msgstr "Zurück" + +msgid "Go to information page for the service" +msgstr "Gehe zur Informationsseite dieses Dienstes" + +msgid "Abort login to %SPNAME%" +msgstr "Anmeldung am Service Provider %SPNAME% abbrechen" + +msgid "The purpose of %SPNAME% is %SPDESC%" +msgstr "Der Zweck von %SPNAME% ist %SPDESC%" + +msgid "" +"List the information about you that is about to be transmitted to the " +"service you are going to login to" +msgstr "" +"Zeige die Information über Sie, die an den Service, auf dem Sie sich " +"einloggen werden, übermittelt werden" + +msgid "Consent about releasing personal information" +msgstr "Zustimmung zur Weitergabe persönlicher Daten" + +msgid "No consent given" +msgstr "Zustimmung verweigert" + +msgid "You did not give consent for transferring your attributes to %SPNAME%." +msgstr "" +"Sie haben der Weitergabe ihrer Daten an den Service Provider nicht " +"zugestimmt." + +msgid "Remember" +msgstr "Zustimmung merken" + +msgid "Show content" +msgstr "Zeige Inhalt" + +msgid "%SPNAME% requires that the information below is transferred." +msgstr "" +"%SPNAME% erfordert die Übertragung untenstehender Information von %IDPNAME%. " +"Akzeptieren Sie das?" + +msgid "Privacy policy for the service" +msgstr "Datenschutzrichtlinie des Dienstes" + +msgid "No, cancel" +msgstr "Nein, ich stimme nicht zu" + +msgid "User information" +msgstr "Benutzerdaten" + +msgid "Information that will be sent to %SPNAME%" +msgstr "Informationen, die an %SPNAME% gesandt werden" + diff --git a/.extlib/simplesamlphp/modules/consent/locales/el/LC_MESSAGES/consent.po b/.extlib/simplesamlphp/modules/consent/locales/el/LC_MESSAGES/consent.po new file mode 100644 index 000000000..25e0cfa45 --- /dev/null +++ b/.extlib/simplesamlphp/modules/consent/locales/el/LC_MESSAGES/consent.po @@ -0,0 +1,74 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: el\n" +"Language-Team: \n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "Yes, continue" +msgstr "Αποδοχή" + +msgid "Return to consent page" +msgstr "Επιστροφή στη σελίδα δήλωσης συγκατάθεσης" + +msgid "Go to information page for the service" +msgstr "Επιπλέον πληροφορίες για την υπηρεσία" + +msgid "Abort login to %SPNAME%" +msgstr "Ακύρωση εισόδου στην υπηρεσία %SPNAME%" + +msgid "The purpose of %SPNAME% is %SPDESC%" +msgstr "Περιγραφή όπως παρέχεται από την υπηρεσία: %SPDESC%" + +msgid "" +"List the information about you that is about to be transmitted to the " +"service you are going to login to" +msgstr "" +"Εμφάνιση πληροφοριών που θα διαμοιραστούν με την υπηρεσία κατά την " +"πρόσβαση σε αυτή" + +msgid "Consent about releasing personal information" +msgstr "Δήλωση συγκατάθεσης για τον διαμοιρασμό προσωπικών δεδομένων" + +msgid "No consent given" +msgstr "Μη αποδοχή συγκατάθεσης" + +msgid "You did not give consent for transferring your attributes to %SPNAME%." +msgstr "" +"Δεν έχετε δώσει συγκατάθεση για τον διαμοιρασμό προσωπικών δεδομένων με " +"την υπηρεσία %SPNAME%" + +msgid "Remember" +msgstr "Να θυμάσαι την επιλογή μου" + +msgid "Show content" +msgstr "Εμφάνιση λεπτομερειών" + +msgid "%SPNAME% requires that the information below is transferred." +msgstr "" +"Εάν προχωρήσετε, τα στοιχεία που ακολουθούν θα διαμοιραστούν με την " +"υπηρεσία %SPNAME%. Συμφωνείτε με την απελευθέρωση των στοιχείων " +"αυτών στην υπηρεσία κάθε φορά που επιθυμείτε πρόσβαση σε αυτή;" + +msgid "Privacy policy for the service" +msgstr "Πολιτική προστασίας απορρήτου υπηρεσίας" + +msgid "No, cancel" +msgstr "Απόρριψη" + +msgid "User information" +msgstr "Πληροφορίες χρήστη" + +msgid "Information that will be sent to %SPNAME%" +msgstr "Πληροφορίες που θα διαμοιραστούν με την υπηρεσία %SPNAME%" + diff --git a/.extlib/simplesamlphp/modules/consent/locales/en/LC_MESSAGES/consent.po b/.extlib/simplesamlphp/modules/consent/locales/en/LC_MESSAGES/consent.po new file mode 100644 index 000000000..cc5dce908 --- /dev/null +++ b/.extlib/simplesamlphp/modules/consent/locales/en/LC_MESSAGES/consent.po @@ -0,0 +1,72 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: en\n" +"Language-Team: \n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "Privacy policy for the service" +msgstr "Privacy policy for the service" + +msgid "Yes, continue" +msgstr "Yes, continue" + +msgid "Return to consent page" +msgstr "Return to consent page" + +msgid "Go to information page for the service" +msgstr "Go to information page for the service" + +msgid "Abort login to %SPNAME%" +msgstr "Abort login to %SPNAME%" + +msgid "The purpose of %SPNAME% is %SPDESC%" +msgstr "The purpose of %SPNAME% is %SPDESC%" + +msgid "" +"List the information about you that is about to be transmitted to the " +"service you are going to login to" +msgstr "" +"List the information about you that is about to be transmitted to the " +"service you are going to login to" + +msgid "Consent about releasing personal information" +msgstr "Consent about releasing personal information" + +msgid "No consent given" +msgstr "No consent given" + +msgid "You did not give consent for transferring your attributes to %SPNAME%." +msgstr "You did not give consent for transferring your attributes to %SPNAME%." + +msgid "Remember" +msgstr "Remember" + +msgid "Show content" +msgstr "Show content" + +msgid "%SPNAME% requires that the information below is transferred." +msgstr "%SPNAME% requires that the information below is transferred." + +msgid "Privacy policy for the service" +msgstr "Privacy policy for the service" + +msgid "No, cancel" +msgstr "No, cancel" + +msgid "User information" +msgstr "User information" + +msgid "Information that will be sent to %SPNAME%" +msgstr "Information that will be sent to %SPNAME%" + diff --git a/.extlib/simplesamlphp/modules/consent/locales/es/LC_MESSAGES/consent.po b/.extlib/simplesamlphp/modules/consent/locales/es/LC_MESSAGES/consent.po new file mode 100644 index 000000000..b3e595e4b --- /dev/null +++ b/.extlib/simplesamlphp/modules/consent/locales/es/LC_MESSAGES/consent.po @@ -0,0 +1,74 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: es\n" +"Language-Team: \n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "Yes, continue" +msgstr "Sí" + +msgid "Return to consent page" +msgstr "Volver a la página de consentimiento" + +msgid "Go to information page for the service" +msgstr "Ir a la página de información del servicio" + +msgid "Abort login to %SPNAME%" +msgstr "Cancelar la identificación en %SPNAME%" + +msgid "The purpose of %SPNAME% is %SPDESC%" +msgstr "El propósito de %SPNAME% es %SPDESC%" + +msgid "" +"List the information about you that is about to be transmitted to the " +"service you are going to login to" +msgstr "" +"Muestra que información relativa a usted va a ser transmitida al servicio" +" en el que se va a identificar" + +msgid "Consent about releasing personal information" +msgstr "Consentimiento para la liberación de información personal" + +msgid "No consent given" +msgstr "No se dió el consentimiento" + +msgid "You did not give consent for transferring your attributes to %SPNAME%." +msgstr "" +"No ha dado su consentimiento para tranferir sus atributos al proveedor de" +" servicio." + +msgid "Remember" +msgstr "Recordar el consentimiento" + +msgid "Show content" +msgstr "Mostrart consentimiento" + +msgid "%SPNAME% requires that the information below is transferred." +msgstr "" +"Está a punto de acceder al servicio %SPNAME%. El servicio requiere que la " +"información que se muestra a continuación sea transferida desde %IDPNAME%. " +"¿Acepta esto?" + +msgid "Privacy policy for the service" +msgstr "Política de privacidad para el servicio" + +msgid "No, cancel" +msgstr "No" + +msgid "User information" +msgstr "Información del usuario" + +msgid "Information that will be sent to %SPNAME%" +msgstr "Atributos que serán enviados al servicio" + diff --git a/.extlib/simplesamlphp/modules/consent/locales/et/LC_MESSAGES/consent.po b/.extlib/simplesamlphp/modules/consent/locales/et/LC_MESSAGES/consent.po new file mode 100644 index 000000000..4ba9d9d1f --- /dev/null +++ b/.extlib/simplesamlphp/modules/consent/locales/et/LC_MESSAGES/consent.po @@ -0,0 +1,67 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: et\n" +"Language-Team: \n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "Yes, continue" +msgstr "Jah, jätka" + +msgid "Return to consent page" +msgstr "Tagasi nõusoleku lehele" + +msgid "Go to information page for the service" +msgstr "Mine teenuse infolehele" + +msgid "Abort login to %SPNAME%" +msgstr "Katkesta sisselogimine: %SPNAME%" + +msgid "The purpose of %SPNAME% is %SPDESC%" +msgstr "Teenuse %SPNAME% eesmärk on %SPDESC%" + +msgid "" +"List the information about you that is about to be transmitted to the " +"service you are going to login to" +msgstr "Teave sinu kohta, mis edastatakse teenusele, millesse asud sisse logima" + +msgid "Consent about releasing personal information" +msgstr "Nõusolek isikuandmete edastamiseks" + +msgid "No consent given" +msgstr "Nõusolekut pole antud" + +msgid "You did not give consent for transferring your attributes to %SPNAME%." +msgstr "Sa ei andnud nõusolekut sinu atribuutide teenusepakkujale edastamiseks." + +msgid "Remember" +msgstr "Jäta meelde" + +msgid "Show content" +msgstr "Näita sisu" + +msgid "%SPNAME% requires that the information below is transferred." +msgstr "%SPNAME% nõuab allpool oleva info edastamist." + +msgid "Privacy policy for the service" +msgstr "Teenuse privaatsuspoliitika" + +msgid "No, cancel" +msgstr "Ei, loobu" + +msgid "User information" +msgstr "Kasutajainfo" + +msgid "Information that will be sent to %SPNAME%" +msgstr "Andmed saadetakse %SPNAME%-le" + diff --git a/.extlib/simplesamlphp/modules/consent/locales/eu/LC_MESSAGES/consent.po b/.extlib/simplesamlphp/modules/consent/locales/eu/LC_MESSAGES/consent.po new file mode 100644 index 000000000..127451df8 --- /dev/null +++ b/.extlib/simplesamlphp/modules/consent/locales/eu/LC_MESSAGES/consent.po @@ -0,0 +1,69 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: eu\n" +"Language-Team: \n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "Yes, continue" +msgstr "Bai, jarraitu" + +msgid "Return to consent page" +msgstr "Itzuli onespen orrira" + +msgid "Go to information page for the service" +msgstr "Joan zerbitzuaren informazio orrira" + +msgid "Abort login to %SPNAME%" +msgstr "Bertan behera utzi zerbitzuan identifikazioa" + +msgid "The purpose of %SPNAME% is %SPDESC%" +msgstr "Zerbtizuaren xedea %SPDESC% da" + +msgid "" +"List the information about you that is about to be transmitted to the " +"service you are going to login to" +msgstr "" +"Zu identifikatuko zaren zerbitzura zure ze informazio bidaliko den " +"erakusten du " + +msgid "Consent about releasing personal information" +msgstr "Informazio pertsonala askatzeko onespena " + +msgid "No consent given" +msgstr "Ez da onespena eman" + +msgid "You did not give consent for transferring your attributes to %SPNAME%." +msgstr "Ez duzu onespena eman zure atributuak zerbitzuari transferitzeko." + +msgid "Remember" +msgstr "Onespena gogoratu" + +msgid "Show content" +msgstr "Erakutsi onespena" + +msgid "%SPNAME% requires that the information below is transferred." +msgstr "Zerbitzuak, hemen agertzen den informazioa lekualdatzea eskatzen du." + +msgid "Privacy policy for the service" +msgstr "Zerbitzuarentzako pribatutasun-politika" + +msgid "No, cancel" +msgstr "Ez, utzi" + +msgid "User information" +msgstr "Erabiltzailearen informazioa" + +msgid "Information that will be sent to %SPNAME%" +msgstr "Zerbitzura bidaliko diren atributuak" + diff --git a/.extlib/simplesamlphp/modules/consent/locales/fi/LC_MESSAGES/consent.po b/.extlib/simplesamlphp/modules/consent/locales/fi/LC_MESSAGES/consent.po new file mode 100644 index 000000000..a76ccc9f6 --- /dev/null +++ b/.extlib/simplesamlphp/modules/consent/locales/fi/LC_MESSAGES/consent.po @@ -0,0 +1,63 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: fi\n" +"Language-Team: \n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "Yes, continue" +msgstr "Kyllä" + +msgid "Return to consent page" +msgstr "Palaa hyväksyntäsivulle" + +msgid "Go to information page for the service" +msgstr "Siirry palvelun tiedot -sivulle" + +msgid "The purpose of %SPNAME% is %SPDESC%" +msgstr "Palvelun %SPNAME% käyttötarkoitus on %SPDESC%" + +msgid "" +"List the information about you that is about to be transmitted to the " +"service you are going to login to" +msgstr "Näytä tietosi, joita ollaan siirtämässä palveluun" + +msgid "Consent about releasing personal information" +msgstr "Henkilötietojen luovutuksen hyväksyntä" + +msgid "No consent given" +msgstr "Lupaa ei annettu" + +msgid "You did not give consent for transferring your attributes to %SPNAME%." +msgstr "Et antanut lupaa siirtää henkilötietojasi palveluntarjoajalle" + +msgid "Remember" +msgstr "Muista" + +msgid "%SPNAME% requires that the information below is transferred." +msgstr "" +"Olet kirjautumassa palveluun %SPNAME%. Identiteetilähteesi henkilötietojasi" +" palvelun tarjoajalle. Hyväksytkö tietojen siirron?" + +msgid "Privacy policy for the service" +msgstr "Tietosuojaseloste palvelulle" + +msgid "No, cancel" +msgstr "ei" + +msgid "User information" +msgstr "Käyttäjätiedot" + +msgid "Information that will be sent to %SPNAME%" +msgstr "Tiedot lähetetään palvelulle %SPNAME%" + diff --git a/.extlib/simplesamlphp/modules/consent/locales/fr/LC_MESSAGES/consent.po b/.extlib/simplesamlphp/modules/consent/locales/fr/LC_MESSAGES/consent.po new file mode 100644 index 000000000..50c3a8975 --- /dev/null +++ b/.extlib/simplesamlphp/modules/consent/locales/fr/LC_MESSAGES/consent.po @@ -0,0 +1,74 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: fr\n" +"Language-Team: \n" +"Plural-Forms: nplurals=2; plural=(n > 1)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "Yes, continue" +msgstr "Oui" + +msgid "Return to consent page" +msgstr "Retour à la page de consentement" + +msgid "Go to information page for the service" +msgstr "Aller à la page d'information sur ce service" + +msgid "Abort login to %SPNAME%" +msgstr "Annuler la connexion au fournisseur de service %SPNAME%" + +msgid "The purpose of %SPNAME% is %SPDESC%" +msgstr "L'objet de %SPNAME% est %SPDESC%" + +msgid "" +"List the information about you that is about to be transmitted to the " +"service you are going to login to" +msgstr "" +"Liste des informations vous concernant qui seront envoyées au service " +"auquel vous allez vous connecter" + +msgid "Consent about releasing personal information" +msgstr "Consentement pour la divulgation d'informations personnelles" + +msgid "No consent given" +msgstr "Aucun consentement n'a été donné" + +msgid "You did not give consent for transferring your attributes to %SPNAME%." +msgstr "" +"Vous n'avez pas donné votre consentement à la divulgation de vos " +"attributs pour ce fournisseur de service." + +msgid "Remember" +msgstr "Se souvenir du consentement" + +msgid "Show content" +msgstr "Montrer le contenu" + +msgid "%SPNAME% requires that the information below is transferred." +msgstr "" +"Vous êtes sur le point de vous connecter au service %SPNAME%. Lors de " +"l'ouverture de session, le fournisseur d'identité enverra des " +"informations sur votre identité à ce service. Acceptez-vous cela ?" + +msgid "Privacy policy for the service" +msgstr "Politique de confidentialité pour ce service" + +msgid "No, cancel" +msgstr "Non" + +msgid "User information" +msgstr "Information sur l'usager" + +msgid "Information that will be sent to %SPNAME%" +msgstr "Informations qui seront envoyées à %SPNAME%" + diff --git a/.extlib/simplesamlphp/modules/consent/locales/he/LC_MESSAGES/consent.po b/.extlib/simplesamlphp/modules/consent/locales/he/LC_MESSAGES/consent.po new file mode 100644 index 000000000..be1d49062 --- /dev/null +++ b/.extlib/simplesamlphp/modules/consent/locales/he/LC_MESSAGES/consent.po @@ -0,0 +1,64 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: he\n" +"Language-Team: \n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "Yes, continue" +msgstr "כן, המשך" + +msgid "Return to consent page" +msgstr "חזור לדף הסכמה" + +msgid "Go to information page for the service" +msgstr "לך אל דף המידע של השירות" + +msgid "The purpose of %SPNAME% is %SPDESC%" +msgstr "המטרה של %SPNAME% היא %SPDESC%" + +msgid "" +"List the information about you that is about to be transmitted to the " +"service you are going to login to" +msgstr "הצג את המידע עליך אשר יועבר לשירות שאתה עומד להתחבר אליו" + +msgid "Consent about releasing personal information" +msgstr "הסכמה להעברת מידע אישי" + +msgid "No consent given" +msgstr "לא ניתנה הסכמה" + +msgid "You did not give consent for transferring your attributes to %SPNAME%." +msgstr "לא נתנת הסכמה להעברת המאפיינים לספק השירות." + +msgid "Remember" +msgstr "זכור" + +msgid "Show content" +msgstr "הצג תוכן" + +msgid "%SPNAME% requires that the information below is transferred." +msgstr "%SPNAME% דורש שמידע הנ\"ל יועבר" + +msgid "Privacy policy for the service" +msgstr "מדיניות הפרטיות של השירות" + +msgid "No, cancel" +msgstr "לא, בטל" + +msgid "User information" +msgstr "מידע על המשתמש" + +msgid "Information that will be sent to %SPNAME%" +msgstr "המידע ישלח ל %SPNAME%" + diff --git a/.extlib/simplesamlphp/modules/consent/locales/hr/LC_MESSAGES/consent.po b/.extlib/simplesamlphp/modules/consent/locales/hr/LC_MESSAGES/consent.po new file mode 100644 index 000000000..5b79c3580 --- /dev/null +++ b/.extlib/simplesamlphp/modules/consent/locales/hr/LC_MESSAGES/consent.po @@ -0,0 +1,70 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: hr\n" +"Language-Team: \n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "Yes, continue" +msgstr "Da, nastavi" + +msgid "Return to consent page" +msgstr "Povratak na stranicu za kreiranje dozvola" + +msgid "Go to information page for the service" +msgstr "Idi na stranicu s informacijama o servisu" + +msgid "Abort login to %SPNAME%" +msgstr "Odustani od prijave u %SPNAME%" + +msgid "The purpose of %SPNAME% is %SPDESC%" +msgstr "Namjena servisa %SPNAME% je %SPDESC%" + +msgid "" +"List the information about you that is about to be transmitted to the " +"service you are going to login to" +msgstr "" +"Prikaži popis vaših podataka koji će biti prosljeđeni servisu kojem " +"želite pristupiti" + +msgid "Consent about releasing personal information" +msgstr "Dozvola za isporuku osobnih podataka" + +msgid "No consent given" +msgstr "Isporuka podataka nije odobrena" + +msgid "You did not give consent for transferring your attributes to %SPNAME%." +msgstr "Niste dali pristanak da se vaši podaci isporuče davatelju usluge." + +msgid "Remember" +msgstr "Zapamti moj odabir" + +msgid "Show content" +msgstr "Prikaži sadržaj" + +msgid "%SPNAME% requires that the information below is transferred." +msgstr "Servis %SPNAME% zahtjeva isporuku dolje navedenih podataka." + +msgid "Privacy policy for the service" +msgstr "Politika zaštite privatnosti kod servisa" + +msgid "No, cancel" +msgstr "Ne, odustani" + +msgid "User information" +msgstr "Informacije o korisniku" + +msgid "Information that will be sent to %SPNAME%" +msgstr "Informacije koje će biti poslane servisu %SPNAME%" + diff --git a/.extlib/simplesamlphp/modules/consent/locales/hu/LC_MESSAGES/consent.po b/.extlib/simplesamlphp/modules/consent/locales/hu/LC_MESSAGES/consent.po new file mode 100644 index 000000000..f5092f8f7 --- /dev/null +++ b/.extlib/simplesamlphp/modules/consent/locales/hu/LC_MESSAGES/consent.po @@ -0,0 +1,68 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: hu\n" +"Language-Team: \n" +"Plural-Forms: nplurals=1; plural=0\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "Yes, continue" +msgstr "Igen, elfogadom" + +msgid "Return to consent page" +msgstr "Vissza az hozzájárulás-kezelő oldalra" + +msgid "Go to information page for the service" +msgstr "A szolgáltatás információs oldalára" + +msgid "The purpose of %SPNAME% is %SPDESC%" +msgstr "A szolgáltatás (%SPNAME%) ezt a célt szolgálja: %SPDESC%" + +msgid "" +"List the information about you that is about to be transmitted to the " +"service you are going to login to" +msgstr "" +"Ezeket az adatokat fogjuk elküldeni Önről annak a szolgáltatásnak, ahová " +"be kíván jelentkezni" + +msgid "Consent about releasing personal information" +msgstr "Hozzájárulás személyes adatok kiadásához" + +msgid "No consent given" +msgstr "Nincs hozzájárulás" + +msgid "You did not give consent for transferring your attributes to %SPNAME%." +msgstr "Nem adta hozzájárulását, hogy adatait továbbadjuk a szolgáltatónak." + +msgid "Remember" +msgstr "Emlékezzen a hozzájárulásra" + +msgid "Show content" +msgstr "Részletek" + +msgid "%SPNAME% requires that the information below is transferred." +msgstr "" +"Ön azonosítja magát ehhez a szolgáltatáshoz %SPNAME%. Az azonosítás során " +"%IDPNAME% az alábbi adatokat fogja küldeni a szolgáltatásnak. Engedélyezi?" + +msgid "Privacy policy for the service" +msgstr "A szolgáltatás adatvádelmi nyilatkozata" + +msgid "No, cancel" +msgstr "Nem, nem fogadom el" + +msgid "User information" +msgstr "Felhasználói információk" + +msgid "Information that will be sent to %SPNAME%" +msgstr "A(z) %SPNAME% szolgáltatónak küldött adatok" + diff --git a/.extlib/simplesamlphp/modules/consent/locales/id/LC_MESSAGES/consent.po b/.extlib/simplesamlphp/modules/consent/locales/id/LC_MESSAGES/consent.po new file mode 100644 index 000000000..27f0edb3d --- /dev/null +++ b/.extlib/simplesamlphp/modules/consent/locales/id/LC_MESSAGES/consent.po @@ -0,0 +1,68 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: id\n" +"Language-Team: \n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "Yes, continue" +msgstr "Yam lanjutkan" + +msgid "Return to consent page" +msgstr "Kembali ke halaman persetujuan" + +msgid "Go to information page for the service" +msgstr "Pergi ke halaman informasi untul layanan" + +msgid "The purpose of %SPNAME% is %SPDESC%" +msgstr "Tujuan dari %SPNAME% adalah %SPDESC%" + +msgid "" +"List the information about you that is about to be transmitted to the " +"service you are going to login to" +msgstr "" +"Daftar informasi tentang Anda yang akan dikirimkan ke service tujuan " +"login Anda." + +msgid "Consent about releasing personal information" +msgstr "Persetujuan tentang melepas informasi personal" + +msgid "No consent given" +msgstr "Tidan ada persetujuan yang diberikan" + +msgid "You did not give consent for transferring your attributes to %SPNAME%." +msgstr "" +"Anda tidak memberikan persetujuan untuk mentransfer atribut-atribute Anda" +" ke service provider." + +msgid "Remember" +msgstr "Ingat" + +msgid "Show content" +msgstr "Perlihatkan konten" + +msgid "%SPNAME% requires that the information below is transferred." +msgstr "%SPNAME% mensyaratkan informasi dibawah ini harus ditransder." + +msgid "Privacy policy for the service" +msgstr "Kebijakan privasi untuk layanan" + +msgid "No, cancel" +msgstr "Tidak, batalkan" + +msgid "User information" +msgstr "Informasi User" + +msgid "Information that will be sent to %SPNAME%" +msgstr "Informasi yang akan dikirim ke %SPNAME%" + diff --git a/.extlib/simplesamlphp/modules/consent/locales/it/LC_MESSAGES/consent.po b/.extlib/simplesamlphp/modules/consent/locales/it/LC_MESSAGES/consent.po new file mode 100644 index 000000000..8cc716857 --- /dev/null +++ b/.extlib/simplesamlphp/modules/consent/locales/it/LC_MESSAGES/consent.po @@ -0,0 +1,71 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: it\n" +"Language-Team: \n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "Yes, continue" +msgstr "Sì, continuare" + +msgid "Return to consent page" +msgstr "Torna alla pagina del consenso" + +msgid "Go to information page for the service" +msgstr "Vai alla pagina di informazioni per il servizio" + +msgid "Abort login to %SPNAME%" +msgstr "Login interrotto a %SPNAME%" + +msgid "The purpose of %SPNAME% is %SPDESC%" +msgstr "Lo scopo di %SPNAME% è %SPDESC%" + +msgid "" +"List the information about you that is about to be transmitted to the " +"service you are going to login to" +msgstr "" +"Mostra le informazioni su di te che stanno per essere trasferire al " +"servizio a cui ti vuoi collegare" + +msgid "Consent about releasing personal information" +msgstr "Consenso al rilascio delle informazioni personali" + +msgid "No consent given" +msgstr "Nessun consenso dato" + +msgid "You did not give consent for transferring your attributes to %SPNAME%." +msgstr "" +"Non hai dato il consenso per trasferire i tuoi attributi al service " +"provider." + +msgid "Remember" +msgstr "Ricordare" + +msgid "Show content" +msgstr "Mostra contenuto" + +msgid "%SPNAME% requires that the information below is transferred." +msgstr "%SPNAME% richiede che l'informazione sotto riportata sia trasferita." + +msgid "Privacy policy for the service" +msgstr "Politica della privacy per il servizio" + +msgid "No, cancel" +msgstr "No, cancellare" + +msgid "User information" +msgstr "Informazioni utente" + +msgid "Information that will be sent to %SPNAME%" +msgstr "Informazioni che saranno inviate a %SPNAME%" + diff --git a/.extlib/simplesamlphp/modules/consent/locales/ja/LC_MESSAGES/consent.po b/.extlib/simplesamlphp/modules/consent/locales/ja/LC_MESSAGES/consent.po new file mode 100644 index 000000000..0487f0856 --- /dev/null +++ b/.extlib/simplesamlphp/modules/consent/locales/ja/LC_MESSAGES/consent.po @@ -0,0 +1,64 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: ja\n" +"Language-Team: \n" +"Plural-Forms: nplurals=1; plural=0\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "Yes, continue" +msgstr "はい、続けます" + +msgid "Return to consent page" +msgstr "承認ページに戻る" + +msgid "Go to information page for the service" +msgstr "サービスの為の情報ページを参照" + +msgid "The purpose of %SPNAME% is %SPDESC%" +msgstr "%SPNAME%の目的は%SPDESC%です" + +msgid "" +"List the information about you that is about to be transmitted to the " +"service you are going to login to" +msgstr "一覧の情報はあなたがログインする際にサービスに転送されます。" + +msgid "Consent about releasing personal information" +msgstr "個人情報の承認を解除" + +msgid "No consent given" +msgstr "承認はありません" + +msgid "You did not give consent for transferring your attributes to %SPNAME%." +msgstr "あなたはサービスプロバイダに属性を転送する事を承認していません。" + +msgid "Remember" +msgstr "記憶する" + +msgid "Show content" +msgstr "内容を表示する" + +msgid "%SPNAME% requires that the information below is transferred." +msgstr "%SPNAME%は以下の変換された情報を要求します。" + +msgid "Privacy policy for the service" +msgstr "サービスのプライバシポリシー" + +msgid "No, cancel" +msgstr "いいえ、キャンセルします" + +msgid "User information" +msgstr "ユーザー情報" + +msgid "Information that will be sent to %SPNAME%" +msgstr "%SPNAME%として送信される情報" + diff --git a/.extlib/simplesamlphp/modules/consent/locales/lb/LC_MESSAGES/consent.po b/.extlib/simplesamlphp/modules/consent/locales/lb/LC_MESSAGES/consent.po new file mode 100644 index 000000000..dd6a59d75 --- /dev/null +++ b/.extlib/simplesamlphp/modules/consent/locales/lb/LC_MESSAGES/consent.po @@ -0,0 +1,31 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: lb\n" +"Language-Team: \n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "Yes, continue" +msgstr "Jo" + +msgid "Remember" +msgstr "Zoustëmmung verhalen" + +msgid "%SPNAME% requires that the information below is transferred." +msgstr "" +"Dir sidd dobäi Iech um Service unzemellen %SPNAME%. Wärend dem Login " +"Prozess schéckt den Identity Provider Attributer, déi Informatiounen " +"iwwert Är Identitéit enthalen. Akzeptéier Dir dat?" + +msgid "No, cancel" +msgstr "Nee, ofbriechen" diff --git a/.extlib/simplesamlphp/modules/consent/locales/lt/LC_MESSAGES/consent.po b/.extlib/simplesamlphp/modules/consent/locales/lt/LC_MESSAGES/consent.po new file mode 100644 index 000000000..4ae7438fe --- /dev/null +++ b/.extlib/simplesamlphp/modules/consent/locales/lt/LC_MESSAGES/consent.po @@ -0,0 +1,71 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: lt\n" +"Language-Team: \n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"(n%100<10 || n%100>=20) ? 1 : 2)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "Yes, continue" +msgstr "Taip, tęsti" + +msgid "Return to consent page" +msgstr "Grįžti į leidimų puslapį" + + +msgid "Go to information page for the service" +msgstr "Pereiti į šios paslaugos informacinį puslapį" + +msgid "Abort login to %SPNAME%" +msgstr "Atšaukti prisijungimą prie %SPNAME%" + +msgid "The purpose of %SPNAME% is %SPDESC%" +msgstr "%SPNAME% paskirtis yra %SPDESC%" + +msgid "" +"List the information about you that is about to be transmitted to the " +"service you are going to login to" +msgstr "" +"Peržiūrėti informaciją apie jus, kuri bus persiųsta paslaugai, į kurią " +"jungiatės" + +msgid "Consent about releasing personal information" +msgstr "Leidimas perduoti asmeninę informaciją" + +msgid "No consent given" +msgstr "Leidimas neduotas" + +msgid "You did not give consent for transferring your attributes to %SPNAME%." +msgstr "Jūs nedavėte sutikimo persiųsti Jūsų atributus %SPNAME% paslaugos teikėjui." + +msgid "Remember" +msgstr "Įsiminti" + +msgid "Show content" +msgstr "Parodyti leidimą" + +msgid "%SPNAME% requires that the information below is transferred." +msgstr "%SPNAME% reikalauja persiųsti žemiau pateiktą informaciją" + +msgid "Privacy policy for the service" +msgstr "Šios paslaugos privatumo politika" + +msgid "No, cancel" +msgstr "Ne, nutraukti" + +msgid "User information" +msgstr "Vartotojo informacija" + +msgid "Information that will be sent to %SPNAME%" +msgstr "Informacija, kuri bus persiųsta į %SPNAME%" + diff --git a/.extlib/simplesamlphp/modules/consent/locales/lv/LC_MESSAGES/consent.po b/.extlib/simplesamlphp/modules/consent/locales/lv/LC_MESSAGES/consent.po new file mode 100644 index 000000000..dbb88d085 --- /dev/null +++ b/.extlib/simplesamlphp/modules/consent/locales/lv/LC_MESSAGES/consent.po @@ -0,0 +1,65 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: lv\n" +"Language-Team: \n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 :" +" 2)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "Yes, continue" +msgstr "Jā, turpināt" + +msgid "Return to consent page" +msgstr "Atgriezties uz noteikumu lapu" + +msgid "Go to information page for the service" +msgstr "Iet uz servisa informācijas lapu" + +msgid "The purpose of %SPNAME% is %SPDESC%" +msgstr "%SPNAME% nolūks ir %SPDESC%" + +msgid "" +"List the information about you that is about to be transmitted to the " +"service you are going to login to" +msgstr "Informācija par Jums, kas tiks sūtīta servisam, kuram Jūs pieslēdzaties" + +msgid "Consent about releasing personal information" +msgstr "Noteikumi par personīgās informācijas nodošanu" + +msgid "No consent given" +msgstr "Nav noteikumu" + +msgid "You did not give consent for transferring your attributes to %SPNAME%." +msgstr "Jūs neesat devis atļauju pārraidīt informāciju servisa piegādātājam." + +msgid "Remember" +msgstr "Atcerēties" + +msgid "Show content" +msgstr "Rādīt saturu" + +msgid "%SPNAME% requires that the information below is transferred." +msgstr "%SPNAME% prasa pārraidīt pa tīklu zemāk esošo informāciju." + +msgid "Privacy policy for the service" +msgstr "Servisa drošības noteikumi" + +msgid "No, cancel" +msgstr "Nē, atcelt" + +msgid "User information" +msgstr "Lietotāja informācija" + +msgid "Information that will be sent to %SPNAME%" +msgstr "Informācija, kas tiks sūtīta %SPNAME%" + diff --git a/.extlib/simplesamlphp/modules/consent/locales/nb/LC_MESSAGES/consent.po b/.extlib/simplesamlphp/modules/consent/locales/nb/LC_MESSAGES/consent.po new file mode 100644 index 000000000..ad802b95a --- /dev/null +++ b/.extlib/simplesamlphp/modules/consent/locales/nb/LC_MESSAGES/consent.po @@ -0,0 +1,71 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: nb_NO\n" +"Language-Team: \n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "Yes, continue" +msgstr "Ja, fortsett" + +msgid "Return to consent page" +msgstr "Gå tilbake til samtykkesiden" + +msgid "Go to information page for the service" +msgstr "Gå til informasjonsside om tjenesten" + +msgid "Abort login to %SPNAME%" +msgstr "Avbryt innlogging til %SPNAME%" + +msgid "The purpose of %SPNAME% is %SPDESC%" +msgstr "Formålet med %SPNAME% er %SPDESC%" + +msgid "" +"List the information about you that is about to be transmitted to the " +"service you are going to login to" +msgstr "" +"Her listes den innformasjonen om deg som blir send til den tjenesten du " +"er i ferd med å logge på" + +msgid "Consent about releasing personal information" +msgstr "Samtykke om overføring av personinformasjon" + +msgid "No consent given" +msgstr "Ikke akseptert overføring av informasjon" + +msgid "You did not give consent for transferring your attributes to %SPNAME%." +msgstr "Du har ikke akseptert å overlevere opplysninger til %SPNAME%." + +msgid "Remember" +msgstr "Godta også for fremtiden" + +msgid "Show content" +msgstr "Vis innhold" + +msgid "%SPNAME% requires that the information below is transferred." +msgstr "" +"For å fullføre innloggingen må du godta at opplysningene nedenfor sendes " +"til %SPNAME%." + +msgid "Privacy policy for the service" +msgstr "Personvern for tjenesten" + +msgid "No, cancel" +msgstr "Nei, avbryt" + +msgid "User information" +msgstr "Bruker innformasjon" + +msgid "Information that will be sent to %SPNAME%" +msgstr "Opplysninger som vil bli sendt til %SPNAME%" + diff --git a/.extlib/simplesamlphp/modules/consent/locales/nl/LC_MESSAGES/consent.po b/.extlib/simplesamlphp/modules/consent/locales/nl/LC_MESSAGES/consent.po new file mode 100644 index 000000000..e8bebf928 --- /dev/null +++ b/.extlib/simplesamlphp/modules/consent/locales/nl/LC_MESSAGES/consent.po @@ -0,0 +1,74 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: nl\n" +"Language-Team: \n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "Yes, continue" +msgstr "Ja, ik ga akkoord" + +msgid "Return to consent page" +msgstr "Keer terug naar de toestemmingspagina" + +msgid "Go to information page for the service" +msgstr "Ga naar de informatiepagina voor de service" + +msgid "Abort login to %SPNAME%" +msgstr "Inloggen op %SPNAME% afbreken" + +msgid "The purpose of %SPNAME% is %SPDESC%" +msgstr "Het doel van %SPNAME% is %SPDESC%" + +msgid "" +"List the information about you that is about to be transmitted to the " +"service you are going to login to" +msgstr "" +"De informatie die over jou bekend is en naar de service waarop je wilt " +"inloggen verstuurd zal worden" + +msgid "Consent about releasing personal information" +msgstr "Toestemming voor het vrijgeven van persoonsgegevens" + +msgid "No consent given" +msgstr "Geen toestemming gegeven" + +msgid "You did not give consent for transferring your attributes to %SPNAME%." +msgstr "" +"U heeft geen toestemming gegeven om uw attributen naar %SPNAME% " +"te versturen." + +msgid "Remember" +msgstr "Bewaar toestemming" + +msgid "Show content" +msgstr "Toon inhoud" + +msgid "%SPNAME% requires that the information below is transferred." +msgstr "" +"U gaat inloggen bij de dienst %SPNAME%. Tijdens het loginproces stuurt de " +"identity provider zgn. attributen met daarin informatie over uw " +"identiteit voor deze dienst. Bent u het daarmee eens?" + +msgid "Privacy policy for the service" +msgstr "Privacybeleid voor de dienst" + +msgid "No, cancel" +msgstr "Nee, ik weiger" + +msgid "User information" +msgstr "Gerbuikersinformatie" + +msgid "Information that will be sent to %SPNAME%" +msgstr "Informatie die naar %SPNAME% zal worden gestuurd" + diff --git a/.extlib/simplesamlphp/modules/consent/locales/nn/LC_MESSAGES/consent.po b/.extlib/simplesamlphp/modules/consent/locales/nn/LC_MESSAGES/consent.po new file mode 100644 index 000000000..e92b85e57 --- /dev/null +++ b/.extlib/simplesamlphp/modules/consent/locales/nn/LC_MESSAGES/consent.po @@ -0,0 +1,69 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: nn\n" +"Language-Team: \n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "Yes, continue" +msgstr "Ja, fortsett" + +msgid "Return to consent page" +msgstr "Gå tilbake til samtykkesida" + +msgid "Go to information page for the service" +msgstr "Gå til informasjonssida for tenesta" + +msgid "Abort login to %SPNAME%" +msgstr "Avbryt innlogging til %SPNAME%" + +msgid "The purpose of %SPNAME% is %SPDESC%" +msgstr "Hensikta med %SPNAME% er %SPDESC%" + +msgid "" +"List the information about you that is about to be transmitted to the " +"service you are going to login to" +msgstr "List informasjon om deg som blir overført til tenesta du skal logga inn på" + +msgid "Consent about releasing personal information" +msgstr "Samtykke til overføring av personinformasjon" + +msgid "No consent given" +msgstr "Ikkje akseptert overføring av informasjon" + +msgid "You did not give consent for transferring your attributes to %SPNAME%." +msgstr "Du har ikkje akseptert til at dine opplysningar kan sendast til %SPNAME%." + +msgid "Remember" +msgstr "Godta også for framtida" + +msgid "Show content" +msgstr "Vis innhald" + +msgid "%SPNAME% requires that the information below is transferred." +msgstr "" +"For å fullføra innlogginga må du godta at opplysningane under blir sende " +"til %SPNAME%" + +msgid "Privacy policy for the service" +msgstr "Personvern for tenesta" + +msgid "No, cancel" +msgstr "Nei, avbryt" + +msgid "User information" +msgstr "Brukarinformasjon" + +msgid "Information that will be sent to %SPNAME%" +msgstr "Opplysningar som blir sende til %SPNAME%" + diff --git a/.extlib/simplesamlphp/modules/consent/locales/pl/LC_MESSAGES/consent.po b/.extlib/simplesamlphp/modules/consent/locales/pl/LC_MESSAGES/consent.po new file mode 100644 index 000000000..685f32bfd --- /dev/null +++ b/.extlib/simplesamlphp/modules/consent/locales/pl/LC_MESSAGES/consent.po @@ -0,0 +1,57 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: pl\n" +"Language-Team: \n" +"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && " +"(n%100<10 || n%100>=20) ? 1 : 2)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "Yes, continue" +msgstr "Tak, akceptuję" + +msgid "Return to consent page" +msgstr "Powrót do strony wydania zezwolenia." + +msgid "Go to information page for the service" +msgstr "Przejdź do strony informacyjnej dla tego serwisu" + +msgid "The purpose of %SPNAME% is %SPDESC%" +msgstr "Celem %SPNAME% jest %SPDESC%" + +msgid "Consent about releasing personal information" +msgstr "Zgoda na wysłanie danych osobistych" + +msgid "No consent given" +msgstr "Nie wyrażono zgody" + +msgid "You did not give consent for transferring your attributes to %SPNAME%." +msgstr "Nie wyraziłeś zgody na przesłanie Twoich atrybutów do Dostawcy Serwisu." + +msgid "Remember" +msgstr "Pamiętaj moją zgodę" + +msgid "Show content" +msgstr "Wyświetl zawartość" + +msgid "%SPNAME% requires that the information below is transferred." +msgstr "%SPNAME% wymaga aby poniższa informacja została przesłana." + +msgid "Privacy policy for the service" +msgstr "Polityka prywatności dla serwisu" + +msgid "No, cancel" +msgstr "Nie, nie akceptuję" + +msgid "Information that will be sent to %SPNAME%" +msgstr "Atrybuty, które zostaną przesłane do serwisu" + diff --git a/.extlib/simplesamlphp/modules/consent/locales/pt-br/LC_MESSAGES/consent.po b/.extlib/simplesamlphp/modules/consent/locales/pt-br/LC_MESSAGES/consent.po new file mode 100644 index 000000000..9323b1f22 --- /dev/null +++ b/.extlib/simplesamlphp/modules/consent/locales/pt-br/LC_MESSAGES/consent.po @@ -0,0 +1,64 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: pt_BR\n" +"Language-Team: \n" +"Plural-Forms: nplurals=2; plural=(n > 1)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "Yes, continue" +msgstr "Sim, Aceito" + +msgid "Return to consent page" +msgstr "Retornar a página de consentimento" + +msgid "Go to information page for the service" +msgstr "Ir para a Página de Informação do serviço" + +msgid "" +"List the information about you that is about to be transmitted to the " +"service you are going to login to" +msgstr "" +"Liste as informações sobre você que está prestes a ser transmitida para o" +" serviço que você está acessando" + +msgid "Consent about releasing personal information" +msgstr "Consentimento sobre a liberação de informações pessoais" + +msgid "No consent given" +msgstr "Nenhum consentimento dado" + +msgid "You did not give consent for transferring your attributes to %SPNAME%." +msgstr "" +"Você não deu o consentimento para a transferência de seus atributos para " +"o provedor de serviços." + +msgid "Remember" +msgstr "Lembrar Consentimento" + +msgid "Show content" +msgstr "Mostrar Conteúdo" + +msgid "%SPNAME% requires that the information below is transferred." +msgstr "" +"Você está prestes a acessar o serviço %SPNAME%. O serviço exige que as " +"informações a seguir sejam transferidas do %IDPNAME%. Você aceita isso?" + +msgid "Privacy policy for the service" +msgstr "Política de Privacidade deste serviço" + +msgid "No, cancel" +msgstr "Não, não aceito" + +msgid "User information" +msgstr "Informações do Usuário" + diff --git a/.extlib/simplesamlphp/modules/consent/locales/pt/LC_MESSAGES/consent.po b/.extlib/simplesamlphp/modules/consent/locales/pt/LC_MESSAGES/consent.po new file mode 100644 index 000000000..5c922b0e7 --- /dev/null +++ b/.extlib/simplesamlphp/modules/consent/locales/pt/LC_MESSAGES/consent.po @@ -0,0 +1,70 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: pt\n" +"Language-Team: \n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "Yes, continue" +msgstr "Sim, Aceito" + +msgid "Return to consent page" +msgstr "Voltar à página de consentimento" + +msgid "Go to information page for the service" +msgstr "Ir para página de informação do serviço" + +msgid "The purpose of %SPNAME% is %SPDESC%" +msgstr "O propósito de %SPNAME% é %SPDESC%" + +msgid "" +"List the information about you that is about to be transmitted to the " +"service you are going to login to" +msgstr "" +"Listar a informação acerca de si que será enviada para o serviço no qual " +"se está autenticar" + +msgid "Consent about releasing personal information" +msgstr "Consentimento do envio de informação pessoal" + +msgid "No consent given" +msgstr "Consentimento negado" + +msgid "You did not give consent for transferring your attributes to %SPNAME%." +msgstr "" +"Negou o consentimento para a transferência dos seus atributos para o " +"fornecedor de serviço." + +msgid "Remember" +msgstr "Lembrar a minha escolha" + +msgid "Show content" +msgstr "Mostrar conteúdo" + +msgid "%SPNAME% requires that the information below is transferred." +msgstr "" +"O serviço %SPNAME% necessita que a informação apresentada em baixo seja " +"transferida." + +msgid "Privacy policy for the service" +msgstr "Política de privacidade do serviço" + +msgid "No, cancel" +msgstr "Não aceito" + +msgid "User information" +msgstr "Informação do utilizador" + +msgid "Information that will be sent to %SPNAME%" +msgstr "Informação que irá ser enviada para %SPNAME%" + diff --git a/.extlib/simplesamlphp/modules/consent/locales/ro/LC_MESSAGES/consent.po b/.extlib/simplesamlphp/modules/consent/locales/ro/LC_MESSAGES/consent.po new file mode 100644 index 000000000..363ea3a2c --- /dev/null +++ b/.extlib/simplesamlphp/modules/consent/locales/ro/LC_MESSAGES/consent.po @@ -0,0 +1,70 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: ro\n" +"Language-Team: \n" +"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100" +" < 20)) ? 1 : 2)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "Yes, continue" +msgstr "Da, continuă" + +msgid "Return to consent page" +msgstr "Întoarcere la pagina de consimțământ" + +msgid "Go to information page for the service" +msgstr "Link la pagina serviciului" + +msgid "Abort login to %SPNAME%" +msgstr "Anulează cererea de autentificare la %SPNAME%" + +msgid "The purpose of %SPNAME% is %SPDESC%" +msgstr "Scopul %SPNAME% este %SPDESC%" + +msgid "" +"List the information about you that is about to be transmitted to the " +"service you are going to login to" +msgstr "" +"Afișează informațiile care vor fi trimise la serviciul unde doriți să vă " +"autentificați" + +msgid "Consent about releasing personal information" +msgstr "Acordul pentru a furniza informații personale" + +msgid "No consent given" +msgstr "Nu a fost dat acordul (consimțământul)" + +msgid "You did not give consent for transferring your attributes to %SPNAME%." +msgstr "Nu ați fost de acord să trimiteți atributele către %SPNAME%." + +msgid "Remember" +msgstr "Ține minte" + +msgid "Show content" +msgstr "Arată conținutul" + +msgid "%SPNAME% requires that the information below is transferred." +msgstr "%SPNAME% solicită trimiterea informațiilor de mai jos." + +msgid "Privacy policy for the service" +msgstr "Politica de confidențialitate pentru serviciu" + +msgid "No, cancel" +msgstr "Nu, renunț" + +msgid "User information" +msgstr "Informații despre utilizator" + +msgid "Information that will be sent to %SPNAME%" +msgstr "Informații care vor fi trimise la %SPNAME%" + diff --git a/.extlib/simplesamlphp/modules/consent/locales/ru/LC_MESSAGES/consent.po b/.extlib/simplesamlphp/modules/consent/locales/ru/LC_MESSAGES/consent.po new file mode 100644 index 000000000..7e7834c7c --- /dev/null +++ b/.extlib/simplesamlphp/modules/consent/locales/ru/LC_MESSAGES/consent.po @@ -0,0 +1,70 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: ru\n" +"Language-Team: \n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "Yes, continue" +msgstr "Да, продолжить" + +msgid "Return to consent page" +msgstr "Вернуться на страницу для выражения согласия" + +msgid "Go to information page for the service" +msgstr "Перейти на страницу с информацией о данной службе" + +msgid "Abort login to %SPNAME%" +msgstr "Прекратить логин в %SPNAME%" + +msgid "The purpose of %SPNAME% is %SPDESC%" +msgstr "Цель %SPNAME% - %SPDESC%" + +msgid "" +"List the information about you that is about to be transmitted to the " +"service you are going to login to" +msgstr "" +"Выдать список информации, которая будет передана службе, в которую вы " +"пытаетесь войти" + +msgid "Consent about releasing personal information" +msgstr "Согласие на передачу некоторых персональных данных" + +msgid "No consent given" +msgstr "Нет данного согласия" + +msgid "You did not give consent for transferring your attributes to %SPNAME%." +msgstr "Вы не дали согласия на передачу ваших атрибутов к поставщику услуг." + +msgid "Remember" +msgstr "Запомнить" + +msgid "Show content" +msgstr "Показать содержимое" + +msgid "%SPNAME% requires that the information below is transferred." +msgstr "%SPNAME% требует, чтобы информация, представленная ниже, была передана." + +msgid "Privacy policy for the service" +msgstr "Политика конфиденциальности для службы" + +msgid "No, cancel" +msgstr "Нет, отменить" + +msgid "User information" +msgstr "Информация о пользователе" + +msgid "Information that will be sent to %SPNAME%" +msgstr "Информация, которая будет передана в %SPNAME%" + diff --git a/.extlib/simplesamlphp/modules/consent/locales/sl/LC_MESSAGES/consent.po b/.extlib/simplesamlphp/modules/consent/locales/sl/LC_MESSAGES/consent.po new file mode 100644 index 000000000..24a719a23 --- /dev/null +++ b/.extlib/simplesamlphp/modules/consent/locales/sl/LC_MESSAGES/consent.po @@ -0,0 +1,70 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: sl\n" +"Language-Team: \n" +"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 " +"|| n%100==4 ? 2 : 3)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "Yes, continue" +msgstr "Da, nadaljuj" + +msgid "Return to consent page" +msgstr "Vrnitev na privolitveno stran" + +msgid "Go to information page for the service" +msgstr "Pojdi na spletno stran z informacijami o storitvi" + +msgid "The purpose of %SPNAME% is %SPDESC%" +msgstr "Namen %SPNAME%: %SPDESC%" + +msgid "" +"List the information about you that is about to be transmitted to the " +"service you are going to login to" +msgstr "" +"Seznam podatkov o vas, ki bodo posredovani storitvi, v katero se " +"nameravate prijaviti" + +msgid "Consent about releasing personal information" +msgstr "Odločitev o privolitvi posredovanja vaših osebnih podatkov" + +msgid "No consent given" +msgstr "Privolitev ni bila dana." + +msgid "You did not give consent for transferring your attributes to %SPNAME%." +msgstr "Niste podali privolitve za posredovanje atributov SP-ju." + +msgid "Remember" +msgstr "Zapomni si privolitev." + +msgid "Show content" +msgstr "Prikaži vsebino" + +msgid "%SPNAME% requires that the information below is transferred." +msgstr "" +"Pravkar se nameravate prijaviti v storitev %SPNAME%. Med postopkom prijave " +"bo IdP tej storitvi posredoval atribute, ki vsebujejo informacije o vaši " +"identiteti. Ali se s tem strinjate? " + +msgid "Privacy policy for the service" +msgstr "Politika zasebnosti za ta SP" + +msgid "No, cancel" +msgstr "Ne, prekliči" + +msgid "User information" +msgstr "Podatki o uporabniku" + +msgid "Information that will be sent to %SPNAME%" +msgstr "Atributi, ki bodo poslani SPju" + diff --git a/.extlib/simplesamlphp/modules/consent/locales/sr/LC_MESSAGES/consent.po b/.extlib/simplesamlphp/modules/consent/locales/sr/LC_MESSAGES/consent.po new file mode 100644 index 000000000..b812e01b2 --- /dev/null +++ b/.extlib/simplesamlphp/modules/consent/locales/sr/LC_MESSAGES/consent.po @@ -0,0 +1,70 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: sr\n" +"Language-Team: \n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "Yes, continue" +msgstr "Da, nastavi" + +msgid "Return to consent page" +msgstr "Povratak na stranicu za kreiranje pristanka" + +msgid "Go to information page for the service" +msgstr "Idi na stranicu sa informacijama o servisu" + +msgid "Abort login to %SPNAME%" +msgstr "Prekini prijavu na %SPNAME%" + +msgid "The purpose of %SPNAME% is %SPDESC%" +msgstr "Namena servisa %SPNAME% je %SPDESC%" + +msgid "" +"List the information about you that is about to be transmitted to the " +"service you are going to login to" +msgstr "" +"Prikaži spisak podataka o vama koji će biti prosleđeni servisu kome " +"želite pristupiti" + +msgid "Consent about releasing personal information" +msgstr "Pristanak za slanje ličnih podataka" + +msgid "No consent given" +msgstr "Slanje podataka nije odobreno" + +msgid "You did not give consent for transferring your attributes to %SPNAME%." +msgstr "Niste odobrili da se vaši podaci pošalju davaocu servisa." + +msgid "Remember" +msgstr "Zapamti moj izbor" + +msgid "Show content" +msgstr "Prikaži sadržaj" + +msgid "%SPNAME% requires that the information below is transferred." +msgstr "Servis %SPNAME% zahteva slanje dole navedenih podataka." + +msgid "Privacy policy for the service" +msgstr "Politika zaštite privatnosti kod servisa" + +msgid "No, cancel" +msgstr "Ne, odustani" + +msgid "User information" +msgstr "Informacije o korisniku" + +msgid "Information that will be sent to %SPNAME%" +msgstr "Informacije koje će biti poslate servisu %SPNAME%" + diff --git a/.extlib/simplesamlphp/modules/consent/locales/st/LC_MESSAGES/consent.po b/.extlib/simplesamlphp/modules/consent/locales/st/LC_MESSAGES/consent.po new file mode 100644 index 000000000..78d487c6a --- /dev/null +++ b/.extlib/simplesamlphp/modules/consent/locales/st/LC_MESSAGES/consent.po @@ -0,0 +1,68 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2019-12-12 08:47+0200\n" +"PO-Revision-Date: 2019-12-12 08:47+0200\n" +"Last-Translator: \n" +"Language-Team: \n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 1.3\n" + +msgid "Yes, continue" +msgstr "E, tswela pele" + +msgid "The purpose of %SPNAME% is %SPDESC%" +msgstr "Sepheo sa %SPNAME% ke %SPDESC%" + +msgid "You did not give consent for transferring your attributes to %SPNAME%." +msgstr "Ha o a fana ka tumello bakeng sa ho fetisetsa makgabane a hao ho %SPNAME%." + +msgid "" +"List the information about you that is about to be transmitted to the " +"service you are going to login to" +msgstr "" +"Hlahlamisa tlhahisoleseding e mabapi le wena e haufi le ho fetisetswa " +"tshebeletsong eo o tlo kena ho yona" + +msgid "Abort login to %SPNAME%" +msgstr "Kgaotsa keno ho %SPNAME%" + +msgid "Privacy policy for the service" +msgstr "Leano la sephiri bakeng sa tshebeletso" + +msgid "Consent about releasing personal information" +msgstr "Tumello e mabapi le tlhahisoleseding ya botho" + +msgid "Return to consent page" +msgstr "Kgutlela leqepheng la tumello" + +msgid "Privacy policy for the service" +msgstr "Leano la sephiri bakeng sa tshebeletso" + +msgid "No, cancel" +msgstr "Tjhe, hlakola" + +msgid "No consent given" +msgstr "Ha ho tumello e fanweng" + +msgid "User information" +msgstr "Tlhahisoleseding ya mosebedisi" + +msgid "Remember" +msgstr "Hopola" + +msgid "%SPNAME% requires that the information below is transferred." +msgstr "%SPNAME% e hloka hore tlhahisoleseding e ka tlase mona e fetiswe." + +msgid "Go to information page for the service" +msgstr "Eya leqepheng la tlhahisoleseding bakeng sa tshebeletso" + +msgid "Information that will be sent to %SPNAME%" +msgstr "Tlhahisoleseding e tla romelwa ho %SPNAME%" + diff --git a/.extlib/simplesamlphp/modules/consent/locales/sv/LC_MESSAGES/consent.po b/.extlib/simplesamlphp/modules/consent/locales/sv/LC_MESSAGES/consent.po new file mode 100644 index 000000000..fb43de9de --- /dev/null +++ b/.extlib/simplesamlphp/modules/consent/locales/sv/LC_MESSAGES/consent.po @@ -0,0 +1,70 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: sv\n" +"Language-Team: \n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "Yes, continue" +msgstr "Ja" + +msgid "Return to consent page" +msgstr "Åter till sidan för samtycke" + +msgid "Go to information page for the service" +msgstr "Gå till tjänstens informationssida" + +msgid "The purpose of %SPNAME% is %SPDESC%" +msgstr "Syftet med %SPNAME% är %SPDESC%" + +msgid "" +"List the information about you that is about to be transmitted to the " +"service you are going to login to" +msgstr "" +"Visa den nformation om din användare som kommer att skickas till tjänsten" +" som du är på väg att logga in i" + +msgid "Consent about releasing personal information" +msgstr "Samtycke gällande överföring av personinformation" + +msgid "No consent given" +msgstr "Inget samtycket givet" + +msgid "You did not give consent for transferring your attributes to %SPNAME%." +msgstr "" +"Du gav inte samtycke för att överföra dina attribut till " +"tjänsteleverantören." + +msgid "Remember" +msgstr "Spara samtycke" + +msgid "Show content" +msgstr "Visa samtycke" + +msgid "%SPNAME% requires that the information below is transferred." +msgstr "" +"Du är på väg att logga in i tjänsten %SPNAME%. Tjänsten kräver att " +"informationen nedan skickas från %IDPNAME%. Är detta okej?" + +msgid "Privacy policy for the service" +msgstr "Tjänstens policy för personlig integritet" + +msgid "No, cancel" +msgstr "Nej" + +msgid "User information" +msgstr "Användarinformation" + +msgid "Information that will be sent to %SPNAME%" +msgstr "Attribut som kommer att skickas till tjänsten" + diff --git a/.extlib/simplesamlphp/modules/consent/locales/tr/LC_MESSAGES/consent.po b/.extlib/simplesamlphp/modules/consent/locales/tr/LC_MESSAGES/consent.po new file mode 100644 index 000000000..fcfe4d1ed --- /dev/null +++ b/.extlib/simplesamlphp/modules/consent/locales/tr/LC_MESSAGES/consent.po @@ -0,0 +1,61 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: tr\n" +"Language-Team: \n" +"Plural-Forms: nplurals=1; plural=0\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "Yes, continue" +msgstr "Evet, devam et" + +msgid "Return to consent page" +msgstr "Onay sayfasına geri dön" + +msgid "Go to information page for the service" +msgstr "Servis için bilgi sayfasına git" + +msgid "The purpose of %SPNAME% is %SPDESC%" +msgstr "%SPNAME%'in amacı %SPDESC%'tir" + +msgid "" +"List the information about you that is about to be transmitted to the " +"service you are going to login to" +msgstr "Girmek istediğiniz servise gönderilecek bilginizi listeleyin" + +msgid "Consent about releasing personal information" +msgstr "Kişisel bilgilerin verilmesi hakkında onay" + +msgid "No consent given" +msgstr "Onay verilmemiş" + +msgid "You did not give consent for transferring your attributes to %SPNAME%." +msgstr "Bilgilerinizin servis sağlayıcıya gönderilmesi için onay vermediniz." + +msgid "Remember" +msgstr "Hatırla" + +msgid "%SPNAME% requires that the information below is transferred." +msgstr "%SPNAME% aşağıdaki bilgilerin gönderilmesine ihtiyaç duyuyor." + +msgid "Privacy policy for the service" +msgstr "Servis için gizlilik politikası" + +msgid "No, cancel" +msgstr "Hayır, iptal et" + +msgid "User information" +msgstr "Kullanıcı bilgisi" + +msgid "Information that will be sent to %SPNAME%" +msgstr "%SPNAME%'e gönderilecek bilgiler" + diff --git a/.extlib/simplesamlphp/modules/consent/locales/xh/LC_MESSAGES/consent.po b/.extlib/simplesamlphp/modules/consent/locales/xh/LC_MESSAGES/consent.po new file mode 100644 index 000000000..19f53e51f --- /dev/null +++ b/.extlib/simplesamlphp/modules/consent/locales/xh/LC_MESSAGES/consent.po @@ -0,0 +1,69 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2018-11-15 14:49+0200\n" +"PO-Revision-Date: 2019-12-12 08:47+0200\n" +"Last-Translator: \n" +"Language-Team: \n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 1.3\n" + +msgid "Privacy policy for the service" +msgstr "Ipolisi yokugcinwa kwemfihlelo yenkonzo" + +msgid "Consent about releasing personal information" +msgstr "Imvume malunga nokukhutshwa kwenkcazelo yobuqu" + +msgid "Yes, continue" +msgstr "Ewe, qhubeka" + +msgid "No consent given" +msgstr "Akukho mvume inikelweyo" + +msgid "Information that will be sent to %SPNAME%" +msgstr "Inkcazelo eza kuthunyelwa ku-%SPNAME%" + +msgid "Go to information page for the service" +msgstr "Yiya kwikhasi lenkcazelo ukuze ufumane inkonzo" + +msgid "Return to consent page" +msgstr "Buyela kwikhasi lemvume" + +msgid "No, cancel" +msgstr "Hayi, rhoxisa" + +msgid "Show content" +msgstr "Bonisa iimpawu" + +msgid "Privacy policy for the service" +msgstr "Ipolisi yokugcinwa kwemfihlelo yenkonzo" + +msgid "The purpose of %SPNAME% is %SPDESC%" +msgstr "Injongo ye-%SPNAME% yi-%SPDESC%" + +msgid "Abort login to %SPNAME%" +msgstr "Yeka ungeno kwi-%SPNAME%" + +msgid "Remember" +msgstr "Khumbula" + +msgid "%SPNAME% requires that the information below is transferred." +msgstr "I-%SPNAME% idinga ukuba inkcazelo engezantsi idluliselwe." + +msgid "User information" +msgstr "Inkcazelo yomsebenzisi" + +msgid "" +"List the information about you that is about to be transmitted to the " +"service you are going to login to" +msgstr "Dwelisa inkcazelo engawe eza kudluliselwa kwinkonzo oza kungena kuyo" + +msgid "You did not give consent for transferring your attributes to %SPNAME%." +msgstr "Awuyinikelanga imvume yokudluliselwa iimpawu zakho kwi-%SPNAME%." + diff --git a/.extlib/simplesamlphp/modules/consent/locales/zh-tw/LC_MESSAGES/consent.po b/.extlib/simplesamlphp/modules/consent/locales/zh-tw/LC_MESSAGES/consent.po new file mode 100644 index 000000000..d9e774be7 --- /dev/null +++ b/.extlib/simplesamlphp/modules/consent/locales/zh-tw/LC_MESSAGES/consent.po @@ -0,0 +1,67 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: zh_Hant_TW\n" +"Language-Team: \n" +"Plural-Forms: nplurals=1; plural=0\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "Yes, continue" +msgstr "是,繼續" + +msgid "Return to consent page" +msgstr "回到同意頁面" + +msgid "Go to information page for the service" +msgstr "至服務資訊頁面" + +msgid "Abort login to %SPNAME%" +msgstr "關於登入至 %SPNAME%" + +msgid "The purpose of %SPNAME% is %SPDESC%" +msgstr "%SPNAME% 的目的地為 %SPDESC%" + +msgid "" +"List the information about you that is about to be transmitted to the " +"service you are going to login to" +msgstr "將關於我傳送至您預計要登入的服務" + +msgid "Consent about releasing personal information" +msgstr "同意有關於個人關係資訊" + +msgid "No consent given" +msgstr "尚未同意" + +msgid "You did not give consent for transferring your attributes to %SPNAME%." +msgstr "您不同意傳輸您的屬性至服務提供者。" + +msgid "Remember" +msgstr "記住" + +msgid "Show content" +msgstr "顯示內容" + +msgid "%SPNAME% requires that the information below is transferred." +msgstr "%SPNAME% 要求該資訊於這個傳送。" + +msgid "Privacy policy for the service" +msgstr "服務隱私權政策" + +msgid "No, cancel" +msgstr "不,取消" + +msgid "User information" +msgstr "使用者資訊" + +msgid "Information that will be sent to %SPNAME%" +msgstr "資訊將被傳送至 %SPNAME%" + diff --git a/.extlib/simplesamlphp/modules/consent/locales/zh/LC_MESSAGES/consent.po b/.extlib/simplesamlphp/modules/consent/locales/zh/LC_MESSAGES/consent.po new file mode 100644 index 000000000..fd6ef6910 --- /dev/null +++ b/.extlib/simplesamlphp/modules/consent/locales/zh/LC_MESSAGES/consent.po @@ -0,0 +1,67 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: zh\n" +"Language-Team: \n" +"Plural-Forms: nplurals=1; plural=0\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "Yes, continue" +msgstr "是的,继续" + +msgid "Return to consent page" +msgstr "返回同意界面" + +msgid "Go to information page for the service" +msgstr "获取该服务的信息" + +msgid "Abort login to %SPNAME%" +msgstr "中止登录到%SPNAME%" + +msgid "The purpose of %SPNAME% is %SPDESC%" +msgstr "%SPNAME%的目的是%SPDESC%" + +msgid "" +"List the information about you that is about to be transmitted to the " +"service you are going to login to" +msgstr "当你登录时将要传输给服务的信息列表" + +msgid "Consent about releasing personal information" +msgstr "同意开放个人信息" + +msgid "No consent given" +msgstr "未同意" + +msgid "You did not give consent for transferring your attributes to %SPNAME%." +msgstr "你没有同意传输你的相关属性给服务提供者" + +msgid "Remember" +msgstr "记住" + +msgid "Show content" +msgstr "显示内容" + +msgid "%SPNAME% requires that the information below is transferred." +msgstr "%SPNAME%请求的信息已经被传输出去" + +msgid "Privacy policy for the service" +msgstr "该服务的隐私策略" + +msgid "No, cancel" +msgstr "不,取消" + +msgid "User information" +msgstr "用户信息" + +msgid "Information that will be sent to %SPNAME%" +msgstr "信息将会发送给%SPNAME%" + diff --git a/.extlib/simplesamlphp/modules/consent/locales/zu/LC_MESSAGES/consent.po b/.extlib/simplesamlphp/modules/consent/locales/zu/LC_MESSAGES/consent.po new file mode 100644 index 000000000..c0029a684 --- /dev/null +++ b/.extlib/simplesamlphp/modules/consent/locales/zu/LC_MESSAGES/consent.po @@ -0,0 +1,71 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2018-11-15 14:49+0200\n" +"PO-Revision-Date: 2019-12-12 08:47+0200\n" +"Last-Translator: \n" +"Language-Team: \n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 1.3\n" + +msgid "Privacy policy for the service" +msgstr "Inqubomgomo yobumfihlo yesevisi" + +msgid "Consent about releasing personal information" +msgstr "Imvume mayelana nokukhulula ulwazi lomuntu siqu" + +msgid "Yes, continue" +msgstr "Yebo, qhubeka" + +msgid "No consent given" +msgstr "Ayikho imvume enikeziwe" + +msgid "Information that will be sent to %SPNAME%" +msgstr "Ulwazi oluzothunyelwa ku-%SPNAME%" + +msgid "Go to information page for the service" +msgstr "Iya ekhasini lolwazi lesevisi" + +msgid "Return to consent page" +msgstr "Buyela ekhasini lemvume" + +msgid "No, cancel" +msgstr "Cha, khansela" + +msgid "Show content" +msgstr "Bonisa izici" + +msgid "Privacy policy for the service" +msgstr "Inqubomgomo yobumfihlo yesevisi" + +msgid "The purpose of %SPNAME% is %SPDESC%" +msgstr "Injongo ye-%SPNAME% yi-%SPDESC%" + +msgid "Abort login to %SPNAME%" +msgstr "Yeka ukungena ku-%SPNAME%" + +msgid "Remember" +msgstr "Khumbula" + +msgid "%SPNAME% requires that the information below is transferred." +msgstr "I-%SPNAME% idinga ukuthi ulwazi olungezansi ludluliswe." + +msgid "User information" +msgstr "Ulwazi lomsebenzisi" + +msgid "" +"List the information about you that is about to be transmitted to the " +"service you are going to login to" +msgstr "" +"Enza uhlu olumayelana nolwazi lwakho oluzodluliselwa kusevisi ozongena " +"kuyo" + +msgid "You did not give consent for transferring your attributes to %SPNAME%." +msgstr "Awuzange uyinikeze imvume yokudlulisa izici zakho ku-%SPNAME%." + diff --git a/.extlib/simplesamlphp/modules/consent/public/assets/css/consent.css b/.extlib/simplesamlphp/modules/consent/public/assets/css/consent.css new file mode 100644 index 000000000..dd9c5dbe1 --- /dev/null +++ b/.extlib/simplesamlphp/modules/consent/public/assets/css/consent.css @@ -0,0 +1,18 @@ +h3#attributeheader { + margin: 1.5em 0 0.5em; +} + +form#consent-yes { + display: inline; + margin: 0; + padding: 0; +} + +form#consent-no { + display: inline; + margin-left: 0.5em; +} + +.hidden { + display: none; +} diff --git a/.extlib/simplesamlphp/modules/consent/routing/routes/routes.yml b/.extlib/simplesamlphp/modules/consent/routing/routes/routes.yml new file mode 100644 index 000000000..8df54c112 --- /dev/null +++ b/.extlib/simplesamlphp/modules/consent/routing/routes/routes.yml @@ -0,0 +1,16 @@ +consent-getconsent: + path: /getconsent + defaults: { _controller: 'SimpleSAML\Module\consent\Controller\ConsentController::getconsent' } + methods: [GET] +consent-noconsent: + path: /noconsent + defaults: { _controller: 'SimpleSAML\Module\consent\Controller\ConsentController::noconsent' } + methods: [GET] +consent-logout: + path: /logout + defaults: { _controller: 'SimpleSAML\Module\consent\Controller\ConsentController::logout' } + methods: [GET] +consent-logoutcompleted: + path: /logoutcompleted + defaults: { _controller: 'SimpleSAML\Module\consent\Controller\ConsentController::logoutcompleted' } + methods: [GET] diff --git a/.extlib/simplesamlphp/modules/consent/src/Auth/Process/Consent.php b/.extlib/simplesamlphp/modules/consent/src/Auth/Process/Consent.php new file mode 100644 index 000000000..50069c6e4 --- /dev/null +++ b/.extlib/simplesamlphp/modules/consent/src/Auth/Process/Consent.php @@ -0,0 +1,439 @@ +includeValues = $config['includeValues']; + } + + if (array_key_exists('checked', $config)) { + if (!is_bool($config['checked'])) { + throw new Error\Exception( + 'Consent: checked must be boolean. ' . + var_export($config['checked'], true) . ' given.', + ); + } + $this->checked = $config['checked']; + } + + if (array_key_exists('focus', $config)) { + if (!in_array($config['focus'], ['yes', 'no'], true)) { + throw new Error\Exception( + 'Consent: focus must be a string with values `yes` or `no`. ' . + var_export($config['focus'], true) . ' given.', + ); + } + $this->focus = $config['focus']; + } + + if (array_key_exists('hiddenAttributes', $config)) { + if (!is_array($config['hiddenAttributes'])) { + throw new Error\Exception( + 'Consent: hiddenAttributes must be an array. ' . + var_export($config['hiddenAttributes'], true) . ' given.', + ); + } + $this->hiddenAttributes = $config['hiddenAttributes']; + } + + if (array_key_exists('attributes.exclude', $config)) { + if (!is_array($config['attributes.exclude'])) { + throw new Error\Exception( + 'Consent: attributes.exclude must be an array. ' . + var_export($config['attributes.exclude'], true) . ' given.', + ); + } + $this->noconsentattributes = $config['attributes.exclude']; + } + + if (array_key_exists('store', $config)) { + try { + $this->store = \SimpleSAML\Module\consent\Store::parseStoreConfig($config['store']); + } catch (Exception $e) { + Logger::error( + 'Consent: Could not create consent storage: ' . + $e->getMessage(), + ); + } + } + + if (array_key_exists('showNoConsentAboutService', $config)) { + if (!is_bool($config['showNoConsentAboutService'])) { + throw new Error\Exception('Consent: showNoConsentAboutService must be a boolean.'); + } + $this->showNoConsentAboutService = $config['showNoConsentAboutService']; + } + + Assert::keyExists( + $config, + 'identifyingAttribute', + "Consent: Missing mandatory 'identifyingAttribute' config setting.", + ); + Assert::stringNotEmpty( + $config['identifyingAttribute'], + "Consent: 'identifyingAttribute' must be a non-empty string.", + ); + $this->identifyingAttribute = $config['identifyingAttribute']; + } + + + /** + * Helper function to check whether consent is disabled. + * + * @param mixed $option The consent.disable option. Either an array of array, an array or a boolean. + * @param string $entityId The entityID of the SP/IdP. + * + * @return boolean True if disabled, false if not. + */ + private static function checkDisable($option, string $entityId): bool + { + if (is_array($option)) { + // Check if consent.disable array has one element that is an array + if (count($option) === count($option, COUNT_RECURSIVE)) { + // Array is not multidimensional. Simple in_array search suffices + return in_array($entityId, $option, true); + } + + // Array contains at least one element that is an array, verify both possibilities + if (in_array($entityId, $option, true)) { + return true; + } + + // Search in multidimensional arrays + foreach ($option as $optionToTest) { + if (!is_array($optionToTest)) { + continue; // bad option + } + + if (!array_key_exists('type', $optionToTest)) { + continue; // option has no type + } + + // Option has a type - switch processing depending on type value : + if ($optionToTest['type'] === 'regex') { + // regex-based consent disabling + + if (!array_key_exists('pattern', $optionToTest)) { + continue; // no pattern defined + } + + if (preg_match($optionToTest['pattern'], $entityId) === 1) { + return true; + } + } else { + // option type is not supported + continue; + } + } // end foreach + + // Base case : no match + return false; + } else { + return (bool) $option; + } + } + + + /** + * Process a authentication response + * + * This function saves the state, and redirects the user to the page where the user can authorize the release of + * the attributes. If storage is used and the consent has already been given the user is passed on. + * + * @param array &$state The state of the response. + * + * + * @throws \SimpleSAML\Module\saml\Error\NoPassive if the request was passive and consent is needed. + */ + public function process(array &$state): void + { + Assert::keyExists($state, 'Destination'); + Assert::keyExists($state['Destination'], 'entityid'); + Assert::keyExists($state['Destination'], 'metadata-set'); + Assert::keyExists($state['Source'], 'entityid'); + Assert::keyExists($state['Source'], 'metadata-set'); + + $spEntityId = $state['Destination']['entityid']; + $idpEntityId = $state['Source']['entityid']; + + $metadata = \SimpleSAML\Metadata\MetaDataStorageHandler::getMetadataHandler(); + + /** + * If the consent module is active on a bridge $state['saml:sp:IdP'] + * will contain an entry id for the remote IdP. If not, then the + * consent module is active on a local IdP and nothing needs to be + * done. + */ + if (isset($state['saml:sp:IdP'])) { + $idpEntityId = $state['saml:sp:IdP']; + $idpmeta = $metadata->getMetaData($idpEntityId, 'saml20-idp-remote'); + $state['Source'] = $idpmeta; + } + + $statsData = ['spEntityID' => $spEntityId]; + + // Do not use consent if disabled + if ( + isset($state['Source']['consent.disable']) && + self::checkDisable($state['Source']['consent.disable'], $spEntityId) + ) { + Logger::debug('Consent: Consent disabled for entity ' . $spEntityId . ' with IdP ' . $idpEntityId); + Stats::log('consent:disabled', $statsData); + return; + } + if ( + isset($state['Destination']['consent.disable']) && + self::checkDisable($state['Destination']['consent.disable'], $idpEntityId) + ) { + Logger::debug('Consent: Consent disabled for entity ' . $spEntityId . ' with IdP ' . $idpEntityId); + Stats::log('consent:disabled', $statsData); + return; + } + + if ($this->store !== null) { + $attributes = $state['Attributes']; + Assert::keyExists( + $attributes, + $this->identifyingAttribute, + "Consent: Missing '" . $this->identifyingAttribute . "' in user's attributes.", + ); + + $source = $state['Source']['metadata-set'] . '|' . $idpEntityId; + $destination = $state['Destination']['metadata-set'] . '|' . $spEntityId; + + Assert::keyExists( + $attributes, + $this->identifyingAttribute, + sprintf("Consent: No attribute '%s' was found in the user's attributes.", $this->identifyingAttribute), + ); + + $userId = $attributes[$this->identifyingAttribute][0]; + Assert::stringNotEmpty($userId); + + // Remove attributes that do not require consent + foreach ($attributes as $attrkey => $attrval) { + if (in_array($attrkey, $this->noconsentattributes, true)) { + unset($attributes[$attrkey]); + } + } + + Logger::debug('Consent: userid: ' . $userId); + Logger::debug('Consent: source: ' . $source); + Logger::debug('Consent: destination: ' . $destination); + + $hashedUserId = self::getHashedUserID($userId, $source); + $targetedId = self::getTargetedID($userId, $source, $destination); + $attributeSet = self::getAttributeHash($attributes, $this->includeValues); + + Logger::debug( + 'Consent: hasConsent() [' . $hashedUserId . '|' . $targetedId . '|' . $attributeSet . ']', + ); + + try { + if ($this->store->hasConsent($hashedUserId, $targetedId, $attributeSet)) { + // Consent already given + Logger::stats('consent found'); + Stats::log('consent:found', $statsData); + return; + } + + Logger::stats('consent notfound'); + Stats::log('consent:notfound', $statsData); + + $state['consent:store'] = $this->store; + $state['consent:store.userId'] = $hashedUserId; + $state['consent:store.destination'] = $targetedId; + $state['consent:store.attributeSet'] = $attributeSet; + } catch (\Exception $e) { + Logger::error('Consent: Error reading from storage: ' . $e->getMessage()); + Logger::stats('Consent failed'); + Stats::log('consent:failed', $statsData); + } + } else { + Logger::stats('consent nostorage'); + Stats::log('consent:nostorage', $statsData); + } + + $state['consent:focus'] = $this->focus; + $state['consent:checked'] = $this->checked; + $state['consent:hiddenAttributes'] = $this->hiddenAttributes; + $state['consent:noconsentattributes'] = $this->noconsentattributes; + $state['consent:showNoConsentAboutService'] = $this->showNoConsentAboutService; + + // user interaction necessary. Throw exception on isPassive request + if (isset($state['isPassive']) && $state['isPassive'] === true) { + Stats::log('consent:nopassive', $statsData); + throw new Module\saml\Error\NoPassive( + Constants::STATUS_REQUESTER, + 'Unable to give consent on passive request.', + ); + } + + // Save state and redirect + $id = Auth\State::saveState($state, 'consent:request'); + $url = Module::getModuleURL('consent/getconsent'); + + $httpUtils = new Utils\HTTP(); + $httpUtils->redirectTrustedURL($url, ['StateId' => $id]); + } + + + /** + * Generate a unique identifier of the user. + * + * @param string $userid The user id. + * @param string $source The source id. + * + * @return string SHA1 of the user id, source id and salt. + */ + public static function getHashedUserID(string $userid, string $source): string + { + $configUtils = new Utils\Config(); + return hash('sha1', $userid . '|' . $configUtils->getSecretSalt() . '|' . $source); + } + + + /** + * Generate a unique targeted identifier. + * + * @param string $userid The user id. + * @param string $source The source id. + * @param string $destination The destination id. + * + * @return string SHA1 of the user id, source id, destination id and salt. + */ + public static function getTargetedID(string $userid, string $source, string $destination): string + { + $configUtils = new Utils\Config(); + return hash('sha1', $userid . '|' . $configUtils->getSecretSalt() . '|' . $source . '|' . $destination); + } + + + /** + * Generate unique identifier for attributes. + * + * Create a hash value for the attributes that changes when attributes are added or removed. If the attribute + * values are included in the hash, the hash will change if the values change. + * + * @param array $attributes The attributes. + * @param bool $includeValues Whether or not to include the attribute value in the generation of the hash. + * + * @return string SHA1 of the user id, source id, destination id and salt. + */ + public static function getAttributeHash(array $attributes, bool $includeValues = false): string + { + if ($includeValues) { + foreach ($attributes as &$values) { + sort($values); + } + ksort($attributes); + $hashBase = serialize($attributes); + } else { + $names = array_keys($attributes); + sort($names); + $hashBase = implode('|', $names); + } + return hash('sha1', $hashBase); + } +} diff --git a/.extlib/simplesamlphp/modules/consent/src/Consent/Store/Cookie.php b/.extlib/simplesamlphp/modules/consent/src/Consent/Store/Cookie.php new file mode 100644 index 000000000..924b56cef --- /dev/null +++ b/.extlib/simplesamlphp/modules/consent/src/Consent/Store/Cookie.php @@ -0,0 +1,357 @@ + + * 'authproc' => array( + * array( + * 'consent:Consent', + * 'store' => 'consent:Cookie', + * ), + * ), + * + * + * @package SimpleSAMLphp + */ + +class Cookie extends \SimpleSAML\Module\consent\Store +{ + /** + * @var string Cookie name prefix + */ + private $name; + + /** + * @var int Cookie lifetime + */ + private $lifetime; + + /** + * @var string Cookie path + */ + private $path; + + /** + * @var string Cookie domain + */ + private $domain = ''; + + /** + * @var bool Cookie secure flag + */ + private $secure; + + /** + * @var string|null Cookie samesite flag + */ + private $samesite = null; + + /** + * Parse configuration. + * + * This constructor parses the configuration. + * + * @param array $config Configuration for database consent store. + * + * @throws \Exception in case of a configuration error. + */ + public function __construct(array $config) + { + parent::__construct($config); + + if (array_key_exists('name', $config)) { + $this->name = $config['name']; + } else { + $this->name = '\SimpleSAML\Module\consent'; + } + + if (array_key_exists('lifetime', $config)) { + $this->lifetime = (int) $config['lifetime']; + } else { + $this->lifetime = 7776000; // (90*24*60*60) + } + + if (array_key_exists('path', $config)) { + $this->path = $config['path']; + } else { + $globalConfig = Configuration::getInstance(); + $this->path = $globalConfig->getBasePath(); + } + + if (array_key_exists('domain', $config)) { + $this->domain = $config['domain']; + } + + if (array_key_exists('secure', $config)) { + $this->secure = (bool) $config['secure']; + } else { + $httpUtils = new Utils\HTTP(); + $this->secure = $httpUtils->isHTTPS(); + } + + if (array_key_exists('samesite', $config)) { + $this->samesite = $config['samesite']; + } + } + + /** + * Check for consent. + * + * This function checks whether a given user has authorized the release of the attributes identified by + * $attributeSet from $source to $destination. + * + * @param string $userId The hash identifying the user at an IdP. + * @param string $destinationId A string which identifies the destination. + * @param string $attributeSet A hash which identifies the attributes. + * + * @return bool True if the user has given consent earlier, false if not (or on error). + */ + public function hasConsent(string $userId, string $destinationId, string $attributeSet): bool + { + $cookieName = $this->getCookieName($userId, $destinationId); + + $data = $userId . ':' . $attributeSet . ':' . $destinationId; + + Logger::debug('Consent cookie - Get [' . $data . ']'); + + if (!array_key_exists($cookieName, $_COOKIE)) { + Logger::debug( + 'Consent cookie - no cookie with name \'' . $cookieName . '\'.', + ); + return false; + } + if (!is_string($_COOKIE[$cookieName])) { + Logger::warning( + 'Value of consent cookie wasn\'t a string. Was: ' . + var_export($_COOKIE[$cookieName], true), + ); + return false; + } + + $data = self::sign($data); + + if ($_COOKIE[$cookieName] !== $data) { + Logger::info( + 'Attribute set changed from the last time consent was given.', + ); + return false; + } + + Logger::debug( + 'Consent cookie - found cookie with correct name and value.', + ); + + return true; + } + + + /** + * Save consent. + * + * Called when the user asks for the consent to be saved. If consent information for the given user and destination + * already exists, it should be overwritten. + * + * @param string $userId The hash identifying the user at an IdP. + * @param string $destinationId A string which identifies the destination. + * @param string $attributeSet A hash which identifies the attributes. + * + * @return bool + */ + public function saveConsent(string $userId, string $destinationId, string $attributeSet): bool + { + $name = $this->getCookieName($userId, $destinationId); + $value = $userId . ':' . $attributeSet . ':' . $destinationId; + + Logger::debug('Consent cookie - Set [' . $value . ']'); + + $value = self::sign($value); + return $this->setConsentCookie($name, $value); + } + + + /** + * Delete consent. + * + * Called when a user revokes consent for a given destination. + * + * @param string $userId The hash identifying the user at an IdP. + * @param string $destinationId A string which identifies the destination. + * + */ + public function deleteConsent(string $userId, string $destinationId): void + { + $name = $this->getCookieName($userId, $destinationId); + $this->setConsentCookie($name, null); + } + + + /** + * Delete consent. + * + * @param string $userId The hash identifying the user at an IdP. + * + * + * @throws \Exception This method always throws an exception indicating that it is not possible to delete all given + * consents with this handler. + */ + public function deleteAllConsents(string $userId): void + { + throw new Exception( + 'The cookie consent handler does not support delete of all consents...', + ); + } + + + /** + * Retrieve consents. + * + * This function should return a list of consents the user has saved. + * + * @param string $userId The hash identifying the user at an IdP. + * + * @return array Array of all destination ids the user has given consent for. + */ + public function getConsents(string $userId): array + { + $ret = []; + + $cookieNameStart = $this->name . ':'; + $cookieNameStartLen = strlen($cookieNameStart); + foreach ($_COOKIE as $name => $value) { + if (substr($name, 0, $cookieNameStartLen) !== $cookieNameStart) { + continue; + } + + $value = self::verify($value); + if ($value === false) { + continue; + } + + $tmp = explode(':', $value, 3); + if (count($tmp) !== 3) { + Logger::warning( + 'Consent cookie with invalid value: ' . $value, + ); + continue; + } + + if ($userId !== $tmp[0]) { + // Wrong user + continue; + } + + $destination = $tmp[2]; + $ret[] = $destination; + } + + return $ret; + } + + + /** + * Calculate a signature of some data. + * + * This function calculates a signature of the data. + * + * @param string $data The data which should be signed. + * + * @return string The signed data. + */ + private static function sign(string $data): string + { + $configUtils = new Utils\Config(); + $secretSalt = $configUtils->getSecretSalt(); + + return sha1($secretSalt . $data . $secretSalt) . ':' . $data; + } + + + /** + * Verify signed data. + * + * This function verifies signed data. + * + * @param string $signedData The data which is signed. + * + * @return string|false The data, or false if the signature is invalid. + */ + private static function verify(string $signedData) + { + $data = explode(':', $signedData, 2); + if (count($data) !== 2) { + Logger::warning('Consent cookie: Missing signature.'); + return false; + } + $data = $data[1]; + + $newSignedData = self::sign($data); + if ($newSignedData !== $signedData) { + Logger::warning('Consent cookie: Invalid signature.'); + return false; + } + + return $data; + } + + + /** + * Get cookie name. + * + * This function gets the cookie name for the given user & destination. + * + * @param string $userId The hash identifying the user at an IdP. + * @param string $destinationId A string which identifies the destination. + * + * @return string The cookie name + */ + private function getCookieName(string $userId, string $destinationId): string + { + return $this->name . ':' . sha1($userId . ':' . $destinationId); + } + + + /** + * Helper function for setting a cookie. + * + * @param string $name Name of the cookie. + * @param string|null $value Value of the cookie. Set this to null to delete the cookie. + * + * @return bool + */ + private function setConsentCookie(string $name, ?string $value): bool + { + $globalConfig = Configuration::getInstance(); + $httpUtils = new Utils\HTTP(); + + $params = [ + 'lifetime' => $this->lifetime, + 'path' => $this->path, + 'domain' => $this->domain, + 'httponly' => true, + 'secure' => $httpUtils->isHTTPS(), + 'samesite' => $this->samesite, + ]; + + try { + $httpUtils->setCookie($name, $value, $params, false); + return true; + } catch (Error\CannotSetCookie $e) { + return false; + } + } +} diff --git a/.extlib/simplesamlphp/modules/consent/src/Consent/Store/Database.php b/.extlib/simplesamlphp/modules/consent/src/Consent/Store/Database.php new file mode 100644 index 000000000..c488f2ac7 --- /dev/null +++ b/.extlib/simplesamlphp/modules/consent/src/Consent/Store/Database.php @@ -0,0 +1,489 @@ +dsn = $config['dsn']; + $this->dateTime = (0 === strpos($this->dsn, 'sqlite:')) ? 'DATETIME("NOW")' : 'NOW()'; + + if (array_key_exists('username', $config)) { + if (!is_string($config['username'])) { + throw new Exception('consent:Database - \'username\' is supposed to be a string.'); + } + $this->username = $config['username']; + } + + if (array_key_exists('password', $config)) { + if (!is_string($config['password'])) { + throw new Exception('consent:Database - \'password\' is supposed to be a string.'); + } + $this->password = $config['password']; + } + + if (array_key_exists('options', $config)) { + if (!is_array($config['options'])) { + throw new Exception('consent:Database - \'options\' is supposed to be an array.'); + } + $this->options = $config['options']; + } else { + $this->options = []; + } + + if (array_key_exists('table', $config)) { + if (!is_string($config['table'])) { + throw new Exception('consent:Database - \'table\' is supposed to be a string.'); + } + $this->table = $config['table']; + } else { + $this->table = 'consent'; + } + + if (isset($config['timeout'])) { + if (!is_int($config['timeout'])) { + throw new Exception('consent:Database - \'timeout\' is supposed to be an integer.'); + } + $this->timeout = $config['timeout']; + } + } + + + /** + * Called before serialization. + * + * @return array The variables which should be serialized. + */ + public function __sleep(): array + { + return [ + 'dsn', + 'dateTime', + 'username', + 'password', + 'table', + 'timeout', + ]; + } + + + /** + * Check for consent. + * + * This function checks whether a given user has authorized the release of + * the attributes identified by $attributeSet from $source to $destination. + * + * @param string $userId The hash identifying the user at an IdP. + * @param string $destinationId A string which identifies the destination. + * @param string $attributeSet A hash which identifies the attributes. + * + * @return bool True if the user has given consent earlier, false if not + * (or on error). + */ + public function hasConsent(string $userId, string $destinationId, string $attributeSet): bool + { + $st = $this->execute( + 'UPDATE ' . $this->table . ' ' . + 'SET usage_date = ' . $this->dateTime . ' ' . + 'WHERE hashed_user_id = ? AND service_id = ? AND attribute = ?', + [$userId, $destinationId, $attributeSet], + ); + + if ($st === false) { + return false; + } + + $rowCount = $st->rowCount(); + if ($rowCount === 0) { + Logger::debug('consent:Database - No consent found.'); + return false; + } else { + Logger::debug('consent:Database - Consent found.'); + return true; + } + } + + + /** + * Save consent. + * + * Called when the user asks for the consent to be saved. If consent information + * for the given user and destination already exists, it should be overwritten. + * + * @param string $userId The hash identifying the user at an IdP. + * @param string $destinationId A string which identifies the destination. + * @param string $attributeSet A hash which identifies the attributes. + * + * @return bool True if consent is deleted, false otherwise. + */ + public function saveConsent(string $userId, string $destinationId, string $attributeSet): bool + { + // Check for old consent (with different attribute set) + $st = $this->execute( + 'UPDATE ' . $this->table . ' ' . + 'SET consent_date = ' . $this->dateTime . ', usage_date = ' . $this->dateTime . ', attribute = ? ' . + 'WHERE hashed_user_id = ? AND service_id = ?', + [$attributeSet, $userId, $destinationId], + ); + + if ($st === false) { + return false; + } + + if ($st->rowCount() > 0) { + // Consent has already been stored in the database + Logger::debug('consent:Database - Updated old consent.'); + return false; + } + + // Add new consent + $st = $this->execute( + 'INSERT INTO ' . $this->table . ' (' . 'consent_date, usage_date, hashed_user_id, service_id, attribute' . + ') ' . 'VALUES (' . $this->dateTime . ', ' . $this->dateTime . ', ?, ?, ?)', + [$userId, $destinationId, $attributeSet], + ); + + if ($st !== false) { + Logger::debug('consent:Database - Saved new consent.'); + } + return true; + } + + + /** + * Delete consent. + * + * Called when a user revokes consent for a given destination. + * + * @param string $userId The hash identifying the user at an IdP. + * @param string $destinationId A string which identifies the destination. + * + * @return int Number of consents deleted + */ + public function deleteConsent(string $userId, string $destinationId): int + { + $st = $this->execute( + 'DELETE FROM ' . $this->table . ' WHERE hashed_user_id = ? AND service_id = ?;', + [$userId, $destinationId], + ); + + if ($st === false) { + return 0; + } + + if ($st->rowCount() > 0) { + Logger::debug('consent:Database - Deleted consent.'); + return $st->rowCount(); + } + + Logger::warning('consent:Database - Attempted to delete nonexistent consent'); + return 0; + } + + + /** + * Delete all consents. + * + * @param string $userId The hash identifying the user at an IdP. + * + * @return int Number of consents deleted + */ + public function deleteAllConsents(string $userId): int + { + $st = $this->execute( + 'DELETE FROM ' . $this->table . ' WHERE hashed_user_id = ?', + [$userId], + ); + + if ($st === false) { + return 0; + } + + if ($st->rowCount() > 0) { + Logger::debug('consent:Database - Deleted (' . $st->rowCount() . ') consent(s) . '); + return $st->rowCount(); + } + + Logger::warning('consent:Database - Attempted to delete nonexistent consent'); + return 0; + } + + + /** + * Retrieve consents. + * + * This function should return a list of consents the user has saved. + * + * @param string $userId The hash identifying the user at an IdP. + * + * @return array Array of all destination ids the user has given consent for. + */ + public function getConsents(string $userId): array + { + $ret = []; + + $st = $this->execute( + 'SELECT service_id, attribute, consent_date, usage_date FROM ' . $this->table . + ' WHERE hashed_user_id = ?', + [$userId], + ); + + if ($st === false) { + return []; + } + + while ($row = $st->fetch(PDO::FETCH_NUM)) { + $ret[] = $row; + } + + return $ret; + } + + + /** + * Prepare and execute statement. + * + * This function prepares and executes a statement. On error, false will be + * returned. + * + * @param string $statement The statement which should be executed. + * @param array $parameters Parameters for the statement. + * + * @return \PDOStatement|false The statement, or false if execution failed. + */ + private function execute(string $statement, array $parameters) + { + $db = $this->getDB(); + if ($db === false) { + return false; + } + + $st = $db->prepare($statement); + if ($st === false) { + Logger::error( + 'consent:Database - Error preparing statement \'' . + $statement . '\': ' . self::formatError($db->errorInfo()), + ); + return false; + } + + if ($st->execute($parameters) !== true) { + Logger::error( + 'consent:Database - Error executing statement \'' . + $statement . '\': ' . self::formatError($st->errorInfo()), + ); + return false; + } + + return $st; + } + + + /** + * Get statistics from the database + * + * The returned array contains 3 entries + * - total: The total number of consents + * - users: Total number of uses that have given consent + * ' services: Total number of services that has been given consent to + * + * @return array Array containing the statistics + */ + public function getStatistics(): array + { + $ret = []; + + // Get total number of consents + $st = $this->execute('SELECT COUNT(*) AS no FROM ' . $this->table, []); + + if ($st === false) { + return []; + } + + if ($row = $st->fetch(PDO::FETCH_NUM)) { + $ret['total'] = $row[0]; + } + + // Get total number of users that has given consent + $st = $this->execute( + 'SELECT COUNT(*) AS no ' . + 'FROM (SELECT DISTINCT hashed_user_id FROM ' . $this->table . ' ) AS foo', + [], + ); + + if ($st === false) { + return []; + } + + if ($row = $st->fetch(PDO::FETCH_NUM)) { + $ret['users'] = $row[0]; + } + + // Get total number of services that has been given consent to + $st = $this->execute( + 'SELECT COUNT(*) AS no FROM (SELECT DISTINCT service_id FROM ' . $this->table . ') AS foo', + [], + ); + + if ($st === false) { + return []; + } + + if ($row = $st->fetch(PDO::FETCH_NUM)) { + $ret['services'] = $row[0]; + } + + return $ret; + } + + + /** + * Get database handle. + * + * @return \PDO|false Database handle, or false if we fail to connect. + */ + private function getDB() + { + if ($this->db !== null) { + return $this->db; + } + + $driver_options = []; + if (isset($this->timeout)) { + $driver_options[PDO::ATTR_TIMEOUT] = $this->timeout; + } + if (!empty($this->options)) { + $this->options = array_merge($driver_options, $this->options); + } else { + $this->options = $driver_options; + } + + $this->db = new PDO($this->dsn, $this->username, $this->password, $this->options); + + return $this->db; + } + + + /** + * Format PDO error. + * + * This function formats a PDO error, as returned from errorInfo. + * + * @param array $error The error information. + * + * @return string Error text. + */ + private static function formatError(array $error): string + { + Assert::greaterThanEq(count($error), 3); + + return $error[0] . ' - ' . $error[2] . ' (' . $error[1] . ')'; + } + + + /** + * A quick selftest of the consent database. + * + * @return boolean True if OK, false if not. Will throw an exception on connection errors. + */ + public function selftest(): bool + { + $st = $this->execute( + 'SELECT * FROM ' . $this->table . ' WHERE hashed_user_id = ? AND service_id = ? AND attribute = ?', + ['test', 'test', 'test'], + ); + + if ($st === false) { + // normally, the test will fail by an exception, so we won't reach this code + return false; + } + return true; + } +} diff --git a/.extlib/simplesamlphp/modules/consent/src/Controller/ConsentController.php b/.extlib/simplesamlphp/modules/consent/src/Controller/ConsentController.php new file mode 100644 index 000000000..9d02e4a98 --- /dev/null +++ b/.extlib/simplesamlphp/modules/consent/src/Controller/ConsentController.php @@ -0,0 +1,315 @@ +config = $config; + $this->session = $session; + } + + + /** + * Inject the \SimpleSAML\Auth\State dependency. + * + * @param \SimpleSAML\Auth\State $authState + */ + public function setAuthState(Auth\State $authState): void + { + $this->authState = $authState; + } + + + /** + * Inject the \SimpleSAML\Logger dependency. + * + * @param \SimpleSAML\Logger $logger + */ + public function setLogger(Logger $logger): void + { + $this->logger = $logger; + } + + + /** + * Display consent form. + * + * @param \Symfony\Component\HttpFoundation\Request $request The current request. + * + * @return \SimpleSAML\XHTML\Template|\SimpleSAML\HTTP\RunnableResponse + */ + public function getconsent(Request $request) + { + $this->logger::info('Consent - getconsent: Accessing consent interface'); + + $stateId = $request->query->get('StateId'); + if ($stateId === null) { + throw new Error\BadRequest('Missing required StateId query parameter.'); + } + + $state = $this->authState::loadState($stateId, 'consent:request'); + + if (is_null($state)) { + throw new Error\NoState(); + } elseif (array_key_exists('core:SP', $state)) { + $spentityid = $state['core:SP']; + } elseif (array_key_exists('saml:sp:State', $state)) { + $spentityid = $state['saml:sp:State']['core:SP']; + } else { + $spentityid = 'UNKNOWN'; + } + + // The user has pressed the yes-button + if ($request->query->get('yes') !== null) { + if ($request->query->get('saveconsent') !== null) { + $this->logger::stats('consentResponse remember'); + } else { + $this->logger::stats('consentResponse rememberNot'); + } + + $statsInfo = [ + 'remember' => $request->query->get('saveconsent'), + ]; + if (isset($state['Destination']['entityid'])) { + $statsInfo['spEntityID'] = $state['Destination']['entityid']; + } + Stats::log('consent:accept', $statsInfo); + + if ( + array_key_exists('consent:store', $state) + && $request->query->get('saveconsent') === '1' + ) { + // Save consent + $store = $state['consent:store']; + $userId = $state['consent:store.userId']; + $targetedId = $state['consent:store.destination']; + $attributeSet = $state['consent:store.attributeSet']; + + $this->logger::debug( + 'Consent - saveConsent() : [' . $userId . '|' . $targetedId . '|' . $attributeSet . ']', + ); + try { + $store->saveConsent($userId, $targetedId, $attributeSet); + } catch (Exception $e) { + $this->logger::error('Consent: Error writing to storage: ' . $e->getMessage()); + } + } + + return new RunnableResponse([Auth\ProcessingChain::class, 'resumeProcessing'], [$state]); + } + + // Prepare attributes for presentation + $attributes = $state['Attributes']; + $noconsentattributes = $state['consent:noconsentattributes']; + + // Remove attributes that do not require consent + foreach ($attributes as $attrkey => $attrval) { + if (in_array($attrkey, $noconsentattributes, true)) { + unset($attributes[$attrkey]); + } + } + $para = [ + 'attributes' => &$attributes, + ]; + + // Reorder attributes according to attributepresentation hooks + Module::callHooks('attributepresentation', $para); + + // Unset the values for attributes that need to be hidden + if (array_key_exists('consent:hiddenAttributes', $state)) { + foreach ($state['consent:hiddenAttributes'] as $hidden) { + if (array_key_exists($hidden, $attributes)) { + $attributes[$hidden] = null; + } + } + } + + // Make, populate and layout consent form + $t = new Template($this->config, 'consent:consentform.twig'); + $l = $t->getLocalization(); + $l->addAttributeDomains(); + $t->data['attributes'] = $attributes; + $t->data['checked'] = $state['consent:checked']; + $t->data['stateId'] = $stateId; + $t->data['source'] = $state['Source']; + $t->data['destination'] = $state['Destination']; + + if (isset($state['Destination']['description'])) { + $t->data['descr_purpose'] = $state['Destination']['description']; + } elseif (isset($state['Destination']['UIInfo']['Description'])) { + $t->data['descr_purpose'] = $state['Destination']['UIInfo']['Description']; + } + + // Fetch privacy policy + if ( + array_key_exists('UIInfo', $state['Destination']) && + array_key_exists('PrivacyStatementURL', $state['Destination']['UIInfo']) && + (!empty($state['Destination']['UIInfo']['PrivacyStatementURL'])) + ) { + $privacypolicy = reset($state['Destination']['UIInfo']['PrivacyStatementURL']); + } elseif ( + array_key_exists('UIInfo', $state['Source']) && + array_key_exists('PrivacyStatementURL', $state['Source']['UIInfo']) && + (!empty($state['Source']['UIInfo']['PrivacyStatementURL'])) + ) { + $privacypolicy = reset($state['Source']['UIInfo']['PrivacyStatementURL']); + } else { + $privacypolicy = false; + } + if ($privacypolicy !== false) { + $privacypolicy = str_replace( + '%SPENTITYID%', + urlencode($spentityid), + $privacypolicy, + ); + } + $t->data['sppp'] = $privacypolicy; + + // Set focus element + switch ($state['consent:focus']) { + case 'yes': + $t->data['autofocus'] = 'yesbutton'; + break; + case 'no': + $t->data['autofocus'] = 'nobutton'; + break; + case null: + default: + break; + } + + $t->data['usestorage'] = array_key_exists('consent:store', $state); + + return $t; + } + + + /** + * @param \Symfony\Component\HttpFoundation\Request $request The current request. + * + * @return \SimpleSAML\XHTML\Template + */ + public function noconsent(Request $request): Template + { + $stateId = $request->query->get('StateId'); + if ($stateId === null) { + throw new Error\BadRequest('Missing required StateId query parameter.'); + } + + $state = $this->authState::loadState($stateId, 'consent:request'); + if (is_null($state)) { + throw new Error\NoState(); + } + + $resumeFrom = Module::getModuleURL( + 'consent/getconsent', + ['StateId' => $stateId], + ); + + $logoutLink = Module::getModuleURL( + 'consent/logout', + ['StateId' => $stateId], + ); + + $aboutService = null; + if (!isset($state['consent:showNoConsentAboutService']) || $state['consent:showNoConsentAboutService']) { + if (isset($state['Destination']['UIInfo']['InformationURL'])) { + $aboutService = reset($state['Destination']['UIInfo']['InformationURL']); + } + } + + $statsInfo = []; + if (isset($state['Destination']['entityid'])) { + $statsInfo['spEntityID'] = $state['Destination']['entityid']; + } + Stats::log('consent:reject', $statsInfo); + + $t = new Template($this->config, 'consent:noconsent.twig'); + $t->data['dstMetadata'] = $state['Destination']; + $t->data['resumeFrom'] = $resumeFrom; + $t->data['aboutService'] = $aboutService; + $t->data['logoutLink'] = $logoutLink; + return $t; + } + + + /** + * @param \Symfony\Component\HttpFoundation\Request $request The current request. + * + * @return \SimpleSAML\HTTP\RunnableResponse + */ + public function logout(Request $request): RunnableResponse + { + $stateId = $request->query->get('StateId', null); + if ($stateId === null) { + throw new Error\BadRequest('Missing required StateId query parameter.'); + } + + $state = $this->authState::loadState($stateId, 'consent:request'); + if (is_null($state)) { + throw new Error\NoState(); + } + $state['Responder'] = ['\SimpleSAML\Module\consent\Logout', 'postLogout']; + + $idp = IdP::getByState($state); + return new RunnableResponse([$idp, 'handleLogoutRequest'], [&$state, $stateId]); + } + + + /** + * @return \SimpleSAML\XHTML\Template + */ + public function logoutcompleted(): Template + { + return new Template($this->config, 'consent:logout_completed.twig'); + } +} diff --git a/.extlib/simplesamlphp/modules/consent/src/Logout.php b/.extlib/simplesamlphp/modules/consent/src/Logout.php new file mode 100644 index 000000000..94bf70215 --- /dev/null +++ b/.extlib/simplesamlphp/modules/consent/src/Logout.php @@ -0,0 +1,30 @@ +redirectTrustedURL($url); + } +} diff --git a/.extlib/simplesamlphp/modules/consent/src/Store.php b/.extlib/simplesamlphp/modules/consent/src/Store.php new file mode 100644 index 000000000..581474ad5 --- /dev/null +++ b/.extlib/simplesamlphp/modules/consent/src/Store.php @@ -0,0 +1,156 @@ + +{% endblock %} + +{% block content %} +

{{ '%SPNAME% requires that the information below is transferred.'|trans({'%SPNAME%': destination|entityDisplayName() }) }}

+ +{% if descr_purpose is defined and descr_purpose != "" %} +

{{ 'The purpose of %SPNAME% is %SPDESC%'|trans({'%SPNAME%': destination|entityDisplayName(), '%SPDESC%': descr_purpose|translateFromArray }) }}

+{% endif %} + + + + + +{% if sppp != false %} +

{{ 'Privacy policy for the service'|trans }} + {{ destination|entityDisplayName() }} +

+{% endif %} + +

{{ 'Information that will be sent to %SPNAME%'|trans({'%SPNAME%': destination|entityDisplayName() }) }}

+ +{% set items = attributes %} + +{% embed '_table.twig' -%} + + {% block namecol -%} + {% set translated = name|trans %} + {% if translated != name %} {{ translated }}
{% endif %} {{ name }} + {% endblock %} + + + {% block value -%} + {% if name =='jpegPhoto'-%} + {{ 'Content of jpegPhoto attribute'|trans }} + {% else %}{{ value }}{% endif -%} + {% endblock %} + +{%- endembed %} + +{% endblock %} diff --git a/.extlib/simplesamlphp/modules/consent/templates/logout_completed.twig b/.extlib/simplesamlphp/modules/consent/templates/logout_completed.twig new file mode 100644 index 000000000..203d2db10 --- /dev/null +++ b/.extlib/simplesamlphp/modules/consent/templates/logout_completed.twig @@ -0,0 +1,7 @@ +{% set pagetitle = 'Logged out'|trans %} +{% extends "base.twig" %} + +{% block content %} +

{{ header }}

+

{{ 'You have been logged out.'|trans }}

+{% endblock %} diff --git a/.extlib/simplesamlphp/modules/consent/templates/noconsent.twig b/.extlib/simplesamlphp/modules/consent/templates/noconsent.twig new file mode 100644 index 000000000..eb0d643e8 --- /dev/null +++ b/.extlib/simplesamlphp/modules/consent/templates/noconsent.twig @@ -0,0 +1,18 @@ +{% set pagetitle = 'No consent given'|trans %} +{% extends "base.twig" %} +{% block content %} +

{{ header }}

+

{{ 'You did not give consent for transferring your attributes to %SPNAME%.'|trans({'%SPNAME%': dstMetadata|entityDisplayName }) }}

+ +

+ {% if resumeFrom %} + {{ 'Return to consent page'|trans }} + {% endif %} + + {% if aboutService %} + {{ 'Go to information page for the service'|trans }} + {% endif %} + + {{ 'Abort login to %SPNAME%'|trans({'%SPNAME%': dstMetadata|entityDisplayName }) }} +

+{% endblock %} diff --git a/.extlib/simplesamlphp/modules/consentAdmin/LICENSE b/.extlib/simplesamlphp/modules/consentAdmin/LICENSE new file mode 100644 index 000000000..a345e48d0 --- /dev/null +++ b/.extlib/simplesamlphp/modules/consentAdmin/LICENSE @@ -0,0 +1,459 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + \ No newline at end of file diff --git a/.extlib/simplesamlphp/modules/consentAdmin/README.md b/.extlib/simplesamlphp/modules/consentAdmin/README.md new file mode 100644 index 000000000..49d98d218 --- /dev/null +++ b/.extlib/simplesamlphp/modules/consentAdmin/README.md @@ -0,0 +1,5 @@ +![Build Status](https://github.com/simplesamlphp/simplesamlphp-module-consentadmin/workflows/CI/badge.svg?branch=master) +[![Coverage Status](https://codecov.io/gh/simplesamlphp/simplesamlphp-module-consentadmin/branch/master/graph/badge.svg)](https://codecov.io/gh/simplesamlphp/simplesamlphp-module-consentadmin) +[![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/simplesamlphp/simplesamlphp-module-consentadmin/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/simplesamlphp/simplesamlphp-module-consentadmin/?branch=master) +[![Type Coverage](https://shepherd.dev/github/simplesamlphp/simplesamlphp-module-consentadmin/coverage.svg)](https://shepherd.dev/github/simplesamlphp/simplesamlphp-module-consentadmin) +[![Psalm Level](https://shepherd.dev/github/simplesamlphp/simplesamlphp-module-consentadmin/level.svg)](https://shepherd.dev/github/simplesamlphp/simplesamlphp-module-consentadmin) diff --git a/.extlib/simplesamlphp/modules/consentAdmin/composer.json b/.extlib/simplesamlphp/modules/consentAdmin/composer.json new file mode 100644 index 000000000..bf4f49196 --- /dev/null +++ b/.extlib/simplesamlphp/modules/consentAdmin/composer.json @@ -0,0 +1,59 @@ +{ + "name": "simplesamlphp/simplesamlphp-module-consentadmin", + "description": "A module that allows users to manage their consent", + "type": "simplesamlphp-module", + "keywords": ["simplesamlphp", "consentadmin"], + "license": "LGPL-2.1-or-later", + "authors": [ + { + "name": "Jacob Christiansen", + "email": "jach@wayf.dk" + }, + { + "name": "Olav Morken", + "email": "olav.morken@uninett.no" + } + ], + "config": { + "preferred-install": { + "simplesamlphp/simplesamlphp": "source", + "*": "dist" + }, + "allow-plugins": { + "composer/package-versions-deprecated": true, + "simplesamlphp/composer-module-installer": true, + "dealerdirect/phpcodesniffer-composer-installer": true, + "phpstan/extension-installer": true, + "simplesamlphp/composer-xmlprovider-installer": true + } + }, + "autoload": { + "psr-4": { + "SimpleSAML\\Module\\consentAdmin\\": "src/" + } + }, + "autoload-dev": { + "psr-4": { + "SimpleSAML\\Test\\Utils\\": "vendor/simplesamlphp/simplesamlphp/tests/Utils" + } + }, + "require": { + "php": "^8.1", + + "simplesamlphp/assert": "^1.1.0", + "simplesamlphp/composer-module-installer": "^1.3.4", + "simplesamlphp/simplesamlphp": "^2.2", + "simplesamlphp/simplesamlphp-module-consent": "^1.3.0", + "symfony/http-foundation": "^6.4.0" + }, + "require-dev": { + "simplesamlphp/simplesamlphp-test-framework": "^1.7.0" + }, + "extra": { + "ssp-mixedcase-module-name": "consentAdmin" + }, + "support": { + "issues": "https://github.com/simplesamlphp/simplesamlphp-module-consentadmin/issues", + "source": "https://github.com/simplesamlphp/simplesamlphp-module-consentadmin" + } +} diff --git a/.extlib/simplesamlphp/modules/consentAdmin/config/module_consentAdmin.php.dist b/.extlib/simplesamlphp/modules/consentAdmin/config/module_consentAdmin.php.dist new file mode 100644 index 000000000..976b4e5eb --- /dev/null +++ b/.extlib/simplesamlphp/modules/consentAdmin/config/module_consentAdmin.php.dist @@ -0,0 +1,37 @@ + [ + 'consent:Database', + 'dsn' => 'mysql:host=DBHOST;dbname=DBNAME', + 'username' => 'USERNAME', + 'password' => 'PASSWORD', + ], + + // Hash attributes including values or not + 'attributes.hash' => true, + + // If you set attributes.exclude in the consent module, this must match + // 'attributes.exclude' => [], + + // Where to direct the user after logout + // REMEMBER to prefix with http:// otherwise the relaystate is only appended + // to saml2 logout URL + 'returnURL' => 'http://www.wayf.dk', + + // Shows description of the services if set to true (defaults to true) + 'showDescription' => true, + + // Set authority + 'authority' => 'saml2', + + // The attribute to use as user identifier (defaults to eduPersonPrincipalName + 'identifyingAttribute' => 'eduPersonPrincipalName', +]; diff --git a/.extlib/simplesamlphp/modules/consentAdmin/docs/consentAdmin.md b/.extlib/simplesamlphp/modules/consentAdmin/docs/consentAdmin.md new file mode 100644 index 000000000..d5597c195 --- /dev/null +++ b/.extlib/simplesamlphp/modules/consentAdmin/docs/consentAdmin.md @@ -0,0 +1,84 @@ +Installing and configuring the consentAdmin module +================================================== + +The consentAdmin module is an addon to the consent module. This means that +you can not use consentAdmin without the consent module. If you have not +installed and configured the consent module, please do. + + * [How to install and configure the consent module](./consent:consent) + +The consentAdmin module only works when the consent module is using a +database to store the consents. + +Setting up the consentAdmin module +---------------------------------- + +The first thing you need to do is to enable the consentAdmin module: in +`config.php`, search for the `module.enable` key and set `consentAdmin` to true: + +``` + 'module.enable' => [ + 'consentAdmin' => true, + … + ], +``` + + +Next you need to copy the module config file to the config directory: + + cp modules/consentAdmin/config-templates/module_consentAdmin.php config/ + +Then you will need to set up the database. The consentAdmin uses the same +table as the consent module, but you still need the set the correct +credentials in the config file. Example: + + 'consentadmin' => array( + 'consent:Database', + 'dsn' => 'mysql:host=sql.uninett.no;dbname=andreas_consent', + 'username' => 'simplesaml', + 'password' => 'sdfsdf', + ), + +Notice that credentials usually is the same as for the consent module, but +can be different. + +Go to the frontpage of your SimpleSAMLphp installation. A link to the +consentAdmin module has been added to the frontpage. + +Setting optional parameters +--------------------------- + +In order to make the consentAdmin module work together with the consent +module correctly, you need to set the configuration 'attributes.hash' +according to the value of 'includeValues' configuration in the consent +module. Likewise, if you've used the 'attributes.exclude' configuration +option in the consent module, you should also set the 'attributes.exclude' +configuration option here to match. + +You should also set the 'returnURL' configuration in order to pass on your +users when the press the 'Logout' link. + +What does consentAdmin do +------------------------- + +When logging into the consentAdmin module, you will be presented with a list +of all services connected to the IdP together with at checkbox indicating +whether the user has given consent to the given service. By clicking the +'Show attributes', you will be presented with a list of attributes that are +released to the service, when the user is accessing that service. +consentAdmin are running the processing filters that have been defined for +each service. +ConsentAdmin will not show services that consent has been disabled for in +the consent module. + +Processing filters +------------------ + +The call to these filters are made with an isPassive request, with means that +no filter is allowed to make userinteraction. + +It is up to the developers of the filters to respect the isPassive request. +The preferred thing to do is to make your setup so that only filters that +modify attributes is run. Othervise it is recommended that developers of +filters to throw a 'NoPassive' exception, if the filter can not run without +userinteraction. diff --git a/.extlib/simplesamlphp/modules/consentAdmin/hooks/hook_configpage.php b/.extlib/simplesamlphp/modules/consentAdmin/hooks/hook_configpage.php new file mode 100644 index 000000000..d6f72afb0 --- /dev/null +++ b/.extlib/simplesamlphp/modules/consentAdmin/hooks/hook_configpage.php @@ -0,0 +1,23 @@ +data['links'][] = [ + 'href' => Module::getModuleURL('consentAdmin/'), + 'text' => Translate::noop('Consent administration'), + ]; + + $template->getLocalization()->addModuleDomain('consentAdmin'); +} diff --git a/.extlib/simplesamlphp/modules/consentAdmin/locales/ar/LC_MESSAGES/consentAdmin.po b/.extlib/simplesamlphp/modules/consentAdmin/locales/ar/LC_MESSAGES/consentAdmin.po new file mode 100644 index 000000000..beaaeff8f --- /dev/null +++ b/.extlib/simplesamlphp/modules/consentAdmin/locales/ar/LC_MESSAGES/consentAdmin.po @@ -0,0 +1,151 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: ar\n" +"Language-Team: \n" +"Plural-Forms: nplurals=6; plural=(n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n>=3 " +"&& n<=10 ? 3 : n>=11 && n<=99 ? 4 : 5)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "{consentAdmin:consentadmin:status_header}" +msgstr "حالة الموافقة" + +msgid "{consentAdmin:consentadmin:attributes_text}" +msgstr "السمات" + +msgid "{consentAdmin:consentadmin:service_provider_header}" +msgstr "مقدم الخدمة" + +msgid "{consentAdmin:consentadmin:removed}" +msgstr "تم حذف الموافقة" + +msgid "{consentAdmin:consentadmin:show}" +msgstr "اظهار" + +msgid "{consentAdmin:consentadmin:attribute_org}" +msgstr "المنظمة" + +msgid "{consentAdmin:consentadmin:attribute_injected}" +msgstr "السمات التي تم تقديمها" + +msgid "{consentAdmin:consentadmin:show_hide_attributes}" +msgstr "اظهر/ اخفي السمات" + +msgid "{consentAdmin:consentadmin:consentadmin_purpose}" +msgstr "غرض الخدمة هو" + +msgid "{consentAdmin:consentadmin:hide}" +msgstr "اخفاء" + +msgid "{consentAdmin:consentadmin:sp_empty_description}" +msgstr "لا يوجد وصف" + +msgid "{consentAdmin:consentadmin:service_providers_for}" +msgstr "مشغلي الخدمة ل" + +msgid "{consentAdmin:consentadmin:consentadmin_description2}" +msgstr "" +"لحذف موافقتكالغي صندوق مشغل الخدمة

روابط

" + +msgid "{consentAdmin:consentadmin:login}" +msgstr "تسجيل الدخول" + +msgid "{consentAdmin:consentadmin:consentadmin_description1}" +msgstr "يمكنك رؤية وتعديل موافقتك علي مشغلي الخدمات هنا " + +msgid "{consentAdmin:consentadmin:updated}" +msgstr "تحديث الموافقة" + +msgid "{consentAdmin:consentadmin:unknown}" +msgstr "غير معروف" + +msgid "{consentAdmin:consentadmin:added}" +msgstr "تمت اضافة الموافقة" + +msgid "{consentAdmin:consentadmin:attribute_id}" +msgstr "الهوية" + +msgid "Injected attribute" +msgstr "السمات التي تم تقديمها" + +msgid "Show" +msgstr "اظهار" + +msgid "Consent Added" +msgstr "تمت اضافة الموافقة" + +msgid "Consent Administration" +msgstr "ادارة الموافقة" + +msgid "Here you can view and edit your consent for the Service Providers." +msgstr "يمكنك رؤية وتعديل موافقتك علي مشغلي الخدمات هنا " + +msgid "Unknown ..." +msgstr "غير معروف" + +msgid "Identity" +msgstr "الهوية" + +msgid "The purpose of the service is" +msgstr "غرض الخدمة هو" + +msgid "Hide" +msgstr "اخفاء" + +msgid "Service Provider" +msgstr "مقدم الخدمة" + +msgid "Service Providers for" +msgstr "مشغلي الخدمة ل" + +msgid "login" +msgstr "تسجيل الدخول" + +msgid "(name not specified)" +msgstr "الاسم غير محدد" + +msgid "Consent Updated" +msgstr "تحديث الموافقة" + +msgid "Consent status" +msgstr "حالة الموافقة" + +msgid "(no description)" +msgstr "لا يوجد وصف" + +msgid "attributes" +msgstr "السمات" + +msgid "" +"

How to delete your consent

" +"Uncheck the box corresponding to the service provider\n" +"

Links

" +"" +msgstr "" +"لحذف موافقتكالغي صندوق مشغل الخدمة

روابط

" + +msgid "Consent Removed" +msgstr "تم حذف الموافقة" + +msgid "show/hide attributes" +msgstr "اظهر/ اخفي السمات" + +msgid "Organisation" +msgstr "المنظمة" + diff --git a/.extlib/simplesamlphp/modules/consentAdmin/locales/cs/LC_MESSAGES/consentAdmin.po b/.extlib/simplesamlphp/modules/consentAdmin/locales/cs/LC_MESSAGES/consentAdmin.po new file mode 100644 index 000000000..0f8f5c4aa --- /dev/null +++ b/.extlib/simplesamlphp/modules/consentAdmin/locales/cs/LC_MESSAGES/consentAdmin.po @@ -0,0 +1,153 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: cs\n" +"Language-Team: \n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "{consentAdmin:consentadmin:status_header}" +msgstr "Stav povolení" + +msgid "{consentAdmin:consentadmin:attributes_text}" +msgstr "atributy" + +msgid "{consentAdmin:consentadmin:service_provider_header}" +msgstr "Poskytovatel služeb" + +msgid "{consentAdmin:consentadmin:removed}" +msgstr "Odebrané povolení" + +msgid "{consentAdmin:consentadmin:show}" +msgstr "Zobrazit" + +msgid "{consentAdmin:consentadmin:attribute_org}" +msgstr "Organizace" + +msgid "{consentAdmin:consentadmin:attribute_injected}" +msgstr "Vložený atribut" + +msgid "{consentAdmin:consentadmin:show_hide_attributes}" +msgstr "zobrazit/skrýt atributy" + +msgid "{consentAdmin:consentadmin:consentadmin_purpose}" +msgstr "Účel služby je" + +msgid "{consentAdmin:consentadmin:hide}" +msgstr "Skrýt" + +msgid "{consentAdmin:consentadmin:sp_empty_description}" +msgstr "(žádný popis)" + +msgid "{consentAdmin:consentadmin:service_providers_for}" +msgstr "Poskytovatelé služeb pro" + +msgid "{consentAdmin:consentadmin:consentadmin_description2}" +msgstr "" +"

Jak smazat vaše povolení

Odznačte políčko odpovídající " +"poskytovateli služeb

Odkazy

" + +msgid "{consentAdmin:consentadmin:login}" +msgstr "přihlášení" + +msgid "{consentAdmin:consentadmin:consentadmin_description1}" +msgstr "Zde můžete zobrazit a upravit vaše povolení pro Poskytovatele služeb." + +msgid "{consentAdmin:consentadmin:updated}" +msgstr "Aktualizované povolení" + +msgid "{consentAdmin:consentadmin:unknown}" +msgstr "Neznámý ..." + +msgid "{consentAdmin:consentadmin:added}" +msgstr "Udělené povolení" + +msgid "{consentAdmin:consentadmin:attribute_id}" +msgstr "Identita" + +msgid "Injected attribute" +msgstr "Vložený atribut" + +msgid "Show" +msgstr "Zobrazit" + +msgid "Consent Added" +msgstr "Udělené povolení" + +msgid "Consent Administration" +msgstr "Administrace povolení" + +msgid "Here you can view and edit your consent for the Service Providers." +msgstr "Zde můžete zobrazit a upravit vaše povolení pro Poskytovatele služeb." + +msgid "Unknown ..." +msgstr "Neznámý ..." + +msgid "Identity" +msgstr "Identita" + +msgid "The purpose of the service is" +msgstr "Účel služby je" + +msgid "Hide" +msgstr "Skrýt" + +msgid "Service Provider" +msgstr "Poskytovatel služeb" + +msgid "Service Providers for" +msgstr "Poskytovatelé služeb pro" + +msgid "login" +msgstr "přihlášení" + +msgid "(name not specified)" +msgstr "(jméno nespecifikováno)" + +msgid "Consent Updated" +msgstr "Aktualizované povolení" + +msgid "Consent status" +msgstr "Stav povolení" + +msgid "(no description)" +msgstr "(žádný popis)" + +msgid "attributes" +msgstr "atributy" + +msgid "" +"

How to delete your consent

" +"Uncheck the box corresponding to the service provider\n" +"

Links

" +"" +msgstr "" +"

Jak smazat vaše povolení

Odznačte políčko odpovídající " +"poskytovateli služeb

Odkazy

" + +msgid "Consent Removed" +msgstr "Odebrané povolení" + +msgid "show/hide attributes" +msgstr "zobrazit/skrýt atributy" + +msgid "Organisation" +msgstr "Organizace" + diff --git a/.extlib/simplesamlphp/modules/consentAdmin/locales/da/LC_MESSAGES/consentAdmin.po b/.extlib/simplesamlphp/modules/consentAdmin/locales/da/LC_MESSAGES/consentAdmin.po new file mode 100644 index 000000000..0ccc73a95 --- /dev/null +++ b/.extlib/simplesamlphp/modules/consentAdmin/locales/da/LC_MESSAGES/consentAdmin.po @@ -0,0 +1,198 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: da\n" +"Language-Team: \n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "{consentAdmin:consentadmin:status_header}" +msgstr "Samtykke status" + +msgid "{consentAdmin:consentadmin:attributes_text}" +msgstr "attributter" + +msgid "{consentAdmin:consentadmin:service_provider_header}" +msgstr "Service Provider" + +msgid "{consentAdmin:consentadmin:removed}" +msgstr "Samtykke slettet" + +msgid "{consentAdmin:consentadmin:show}" +msgstr "Vis" + +msgid "{consentAdmin:consentadmin:attribute_org}" +msgstr "Organisation" + +msgid "{consentAdmin:consentadmin:attribute_injected}" +msgstr "Injiceret attribut" + +msgid "{consentAdmin:consentadmin:show_hide_attributes}" +msgstr "vis/skjul attributter" + +msgid "{consentAdmin:consentadmin:consentadmin_purpose}" +msgstr "Formålet med tjenesten er" + +msgid "{consentAdmin:consentadmin:hide}" +msgstr "Skjul" + +msgid "{consentAdmin:consentadmin:sp_empty_description}" +msgstr "(ingen beskrivelse)" + +msgid "{consentAdmin:consentadmin:service_providers_for}" +msgstr "Service Providers for" + +msgid "{consentAdmin:consentadmin:consentadmin_description2}" +msgstr "" +"

Sådan sletter du et samtykke

Fjern fluebenet ud for tjenesten, " +"samtykket tilhører.

Hvilke data gemmer WAYF om dig?

  • Når du" +" giver dit samtykke, henter WAYF dine oplysninger fra din institution og " +"sender de relevante videre til tjenesteudbyderen
  • Ingen af " +"oplysningerne gemmes af WAYF
  • Hvis du har bedt WAYF huske dit samtykke," +" gemmes personhenførbare data heller ikke hos WAYF. Oplysningen om, at du" +" har givet dit samtykke, gemmes på en ikke-personhenførbar " +"måde

Hvilke rettigheder har du?

Du har ret til at trække et " +"samtykke tilbage.

Hvor længe gemmes dine samtykker?

Et samtykke " +"slettes tre år efter, at du sidst har benyttet det.

Hvordan beskyttes " +"mine oplysninger?

WAYF foretager behandlinger af personoplysninger i " +"henhold til persondataloven (lov nr. 429 af 31. maj 2000 med senere " +"ændringer). Du kan læse nærmere om registreredes rettigheder i " +"persondatalovens afsnit III.Persondataloven

Links

" + +msgid "{consentAdmin:consentadmin:login}" +msgstr "login" + +msgid "{consentAdmin:consentadmin:consentadmin_description1}" +msgstr "" +"WAYF videregiver kun oplysninger til eksterne tjenester, hvis du giver " +"dit samtykke til det. Hvilke oplysninger det drejer sig om, varierer alt " +"efter hvad tjenesteudbyderen har behov for. Det kan for eksempel " +"være:
  • Dit navn
  • Din e-mail-adresse
  • Din " +"institution
  • Etc.
Hvis du sætter et flueben ud for Husk dette " +"samtykke, vil du ikke blive spurgt, næste gang du besøger " +"tjenesteudbyderen. Så husker WAYF, at du allerede har givet samtykke til " +"at videregive oplysninger til tjenesteudbyderen.

Nedenfor er opført de" +" tjenester, som du for øjeblikket har givet løbende samtykke til:" + +msgid "{consentAdmin:consentadmin:updated}" +msgstr "Samtykke Opdateret" + +msgid "{consentAdmin:consentadmin:unknown}" +msgstr "Ukendt ..." + +msgid "{consentAdmin:consentadmin:added}" +msgstr "Samtykke givet" + +msgid "{consentAdmin:consentadmin:attribute_id}" +msgstr "Identitet" + +msgid "Injected attribute" +msgstr "Injiceret attribut" + +msgid "Show" +msgstr "Vis" + +msgid "Consent Added" +msgstr "Samtykke givet" + +msgid "Consent Administration" +msgstr "Administrer dine samtykker" + +msgid "Here you can view and edit your consent for the Service Providers." +msgstr "" +"WAYF videregiver kun oplysninger til eksterne tjenester, hvis du giver " +"dit samtykke til det. Hvilke oplysninger det drejer sig om, varierer alt " +"efter hvad tjenesteudbyderen har behov for. Det kan for eksempel " +"være:

  • Dit navn
  • Din e-mail-adresse
  • Din " +"institution
  • Etc.
Hvis du sætter et flueben ud for Husk dette " +"samtykke, vil du ikke blive spurgt, næste gang du besøger " +"tjenesteudbyderen. Så husker WAYF, at du allerede har givet samtykke til " +"at videregive oplysninger til tjenesteudbyderen.

Nedenfor er opført de" +" tjenester, som du for øjeblikket har givet løbende samtykke til:" + +msgid "Unknown ..." +msgstr "Ukendt ..." + +msgid "Identity" +msgstr "Identitet" + +msgid "The purpose of the service is" +msgstr "Formålet med tjenesten er" + +msgid "Hide" +msgstr "Skjul" + +msgid "Service Provider" +msgstr "Service Provider" + +msgid "Service Providers for" +msgstr "Service Providers for" + +msgid "login" +msgstr "login" + +msgid "(name not specified)" +msgstr "(navn ikke angivet)" + +msgid "Consent Updated" +msgstr "Samtykke Opdateret" + +msgid "Consent status" +msgstr "Samtykke status" + +msgid "(no description)" +msgstr "(ingen beskrivelse)" + +msgid "attributes" +msgstr "attributter" + +msgid "" +"

How to delete your consent

" +"Uncheck the box corresponding to the service provider\n" +"

Links

" +"" +msgstr "" +"

Sådan sletter du et samtykke

Fjern fluebenet ud for tjenesten, " +"samtykket tilhører.

Hvilke data gemmer WAYF om dig?

  • Når du" +" giver dit samtykke, henter WAYF dine oplysninger fra din institution og " +"sender de relevante videre til tjenesteudbyderen
  • Ingen af " +"oplysningerne gemmes af WAYF
  • Hvis du har bedt WAYF huske dit samtykke," +" gemmes personhenførbare data heller ikke hos WAYF. Oplysningen om, at du" +" har givet dit samtykke, gemmes på en ikke-personhenførbar " +"måde

Hvilke rettigheder har du?

Du har ret til at trække et " +"samtykke tilbage.

Hvor længe gemmes dine samtykker?

Et samtykke " +"slettes tre år efter, at du sidst har benyttet det.

Hvordan beskyttes " +"mine oplysninger?

WAYF foretager behandlinger af personoplysninger i " +"henhold til persondataloven (lov nr. 429 af 31. maj 2000 med senere " +"ændringer). Du kan læse nærmere om registreredes rettigheder i " +"persondatalovens afsnit III.Persondataloven

Links

" + +msgid "Consent Removed" +msgstr "Samtykke slettet" + +msgid "show/hide attributes" +msgstr "vis/skjul attributter" + +msgid "Organisation" +msgstr "Organisation" + diff --git a/.extlib/simplesamlphp/modules/consentAdmin/locales/de/LC_MESSAGES/consentAdmin.po b/.extlib/simplesamlphp/modules/consentAdmin/locales/de/LC_MESSAGES/consentAdmin.po new file mode 100644 index 000000000..44c7efec4 --- /dev/null +++ b/.extlib/simplesamlphp/modules/consentAdmin/locales/de/LC_MESSAGES/consentAdmin.po @@ -0,0 +1,160 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: de\n" +"Language-Team: \n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "{consentAdmin:consentadmin:status_header}" +msgstr "Status der Einverständniserklärung" + +msgid "{consentAdmin:consentadmin:attributes_text}" +msgstr "Attribute" + +msgid "{consentAdmin:consentadmin:service_provider_header}" +msgstr "Diensteanbieter" + +msgid "{consentAdmin:consentadmin:removed}" +msgstr "Einverständnis entfernt" + +msgid "{consentAdmin:consentadmin:show}" +msgstr "Zeige an" + +msgid "{consentAdmin:consentadmin:attribute_org}" +msgstr "Organisation" + +msgid "{consentAdmin:consentadmin:attribute_injected}" +msgstr "Eingekoppeltes Attribut" + +msgid "{consentAdmin:consentadmin:show_hide_attributes}" +msgstr "Attribute anzeigen/verstecken" + +msgid "{consentAdmin:consentadmin:consentadmin_purpose}" +msgstr "Der Zweck dieses Dienstes ist" + +msgid "{consentAdmin:consentadmin:hide}" +msgstr "Verstecke" + +msgid "{consentAdmin:consentadmin:sp_empty_description}" +msgstr "(keine Beschreibung)" + +msgid "{consentAdmin:consentadmin:service_providers_for}" +msgstr "Diensteanbieter für" + +msgid "{consentAdmin:consentadmin:consentadmin_description2}" +msgstr "" +"

Wie Sie Ihre Einverständniserklärung löschen

Entfernen Sie das " +"Häkchen von der Box des jeweiligen " +"Diensteanbieters

Links

" + +msgid "{consentAdmin:consentadmin:login}" +msgstr "Anmeldung" + +msgid "{consentAdmin:consentadmin:consentadmin_description1}" +msgstr "" +"Hier können Sie Ihre Einverständniserklärungen für die Diensteanbieter " +"anzeigen und bearbeiten." + +msgid "{consentAdmin:consentadmin:updated}" +msgstr "Einverständnis aktualisiert" + +msgid "{consentAdmin:consentadmin:unknown}" +msgstr "Unbekannt..." + +msgid "{consentAdmin:consentadmin:added}" +msgstr "Einverständnis hinzugefügt" + +msgid "{consentAdmin:consentadmin:attribute_id}" +msgstr "Identität" + +msgid "Injected attribute" +msgstr "Eingekoppeltes Attribut" + +msgid "Show" +msgstr "Zeige an" + +msgid "Consent Added" +msgstr "Einverständnis hinzugefügt" + +msgid "Consent Administration" +msgstr "Verwaltung von Einverständniserklärungen" + +msgid "Here you can view and edit your consent for the Service Providers." +msgstr "" +"Hier können Sie Ihre Einverständniserklärungen für die Diensteanbieter " +"anzeigen und bearbeiten." + +msgid "Unknown ..." +msgstr "Unbekannt..." + +msgid "Identity" +msgstr "Identität" + +msgid "The purpose of the service is" +msgstr "Der Zweck dieses Dienstes ist" + +msgid "Hide" +msgstr "Verstecke" + +msgid "Service Provider" +msgstr "Diensteanbieter" + +msgid "Service Providers for" +msgstr "Diensteanbieter für" + +msgid "login" +msgstr "Anmeldung" + +msgid "(name not specified)" +msgstr "(Name nicht angegeben)" + +msgid "Consent Updated" +msgstr "Einverständnis aktualisiert" + +msgid "Consent status" +msgstr "Status der Einverständniserklärung" + +msgid "(no description)" +msgstr "(keine Beschreibung)" + +msgid "attributes" +msgstr "Attribute" + +msgid "" +"

How to delete your consent

" +"Uncheck the box corresponding to the service provider\n" +"

Links

" +"" +msgstr "" +"

Wie Sie Ihre Einverständniserklärung löschen

Entfernen Sie das " +"Häkchen von der Box des jeweiligen " +"Diensteanbieters

Links

" + +msgid "Consent Removed" +msgstr "Einverständnis entfernt" + +msgid "show/hide attributes" +msgstr "Attribute anzeigen/verstecken" + +msgid "Organisation" +msgstr "Organisation" + diff --git a/.extlib/simplesamlphp/modules/consentAdmin/locales/el/LC_MESSAGES/consentAdmin.po b/.extlib/simplesamlphp/modules/consentAdmin/locales/el/LC_MESSAGES/consentAdmin.po new file mode 100644 index 000000000..de949f48d --- /dev/null +++ b/.extlib/simplesamlphp/modules/consentAdmin/locales/el/LC_MESSAGES/consentAdmin.po @@ -0,0 +1,152 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: el\n" +"Language-Team: \n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "{consentAdmin:consentadmin:status_header}" +msgstr "Κατάσταση συγκατάθεσης" + +msgid "{consentAdmin:consentadmin:attributes_text}" +msgstr "στοιχείων" + +msgid "{consentAdmin:consentadmin:service_provider_header}" +msgstr "Πάροχος Υπηρεσιών" + +msgid "{consentAdmin:consentadmin:removed}" +msgstr "Η συγκατάθεση αναιρέθηκε" + +msgid "{consentAdmin:consentadmin:show}" +msgstr "Εμφάνιση" + +msgid "{consentAdmin:consentadmin:attribute_org}" +msgstr "Οργανισμός" + +msgid "{consentAdmin:consentadmin:attribute_injected}" +msgstr "Εισαχθέν στοιχείο" + +msgid "{consentAdmin:consentadmin:show_hide_attributes}" +msgstr "εμφάνιση/απόκρυψη στοιχείων" + +msgid "{consentAdmin:consentadmin:consentadmin_purpose}" +msgstr "Ο σκοπός της υπηρεσίας είναι" + +msgid "{consentAdmin:consentadmin:hide}" +msgstr "Απόκρυψη" + +msgid "{consentAdmin:consentadmin:sp_empty_description}" +msgstr "(χωρίς περιγραφή)" + +msgid "{consentAdmin:consentadmin:service_providers_for}" +msgstr "Πάροχοι Υπηρεσιών για" + +msgid "{consentAdmin:consentadmin:consentadmin_description2}" +msgstr "" +"

Πώς να αναιρέσετε τη συγκατάθεσή σας

Αποεπιλέξτε το κουτί " +"επιλογής που αντιστοιχεί στον πάροχο υπηρεσιών" + +msgid "{consentAdmin:consentadmin:login}" +msgstr "είσοδος" + +msgid "{consentAdmin:consentadmin:consentadmin_description1}" +msgstr "" +"Εδώ μπορείτε να δείτε και να επεξεργαστείτε τις δηλώσεις συγκατάθεσής σας" +" για τους παρόχους υπηρεσιών" + +msgid "{consentAdmin:consentadmin:updated}" +msgstr "Η συγκατάθεση ενημερώθηκε" + +msgid "{consentAdmin:consentadmin:unknown}" +msgstr "Άγνωστο..." + +msgid "{consentAdmin:consentadmin:added}" +msgstr "Η συγκατάθεση προστέθηκε" + +msgid "{consentAdmin:consentadmin:attribute_id}" +msgstr "Ταυτότητα" + +msgid "Injected attribute" +msgstr "Εισαχθέν στοιχείο" + +msgid "Show" +msgstr "Εμφάνιση" + +msgid "Consent Added" +msgstr "Η συγκατάθεση προστέθηκε" + +msgid "Consent Administration" +msgstr "Διαχείριση Δηλώσεων Συγκατάθεσης" + +msgid "Here you can view and edit your consent for the Service Providers." +msgstr "" +"Εδώ μπορείτε να δείτε και να επεξεργαστείτε τις δηλώσεις συγκατάθεσής σας" +" για τους παρόχους υπηρεσιών" + +msgid "Unknown ..." +msgstr "Άγνωστο..." + +msgid "Identity" +msgstr "Ταυτότητα" + +msgid "The purpose of the service is" +msgstr "Ο σκοπός της υπηρεσίας είναι" + +msgid "Hide" +msgstr "Απόκρυψη" + +msgid "Service Provider" +msgstr "Πάροχος Υπηρεσιών" + +msgid "Service Providers for" +msgstr "Πάροχοι Υπηρεσιών για" + +msgid "login" +msgstr "είσοδος" + +msgid "(name not specified)" +msgstr "(χωρίς όνομα)" + +msgid "Consent Updated" +msgstr "Η συγκατάθεση ενημερώθηκε" + +msgid "Consent status" +msgstr "Κατάσταση συγκατάθεσης" + +msgid "(no description)" +msgstr "(χωρίς περιγραφή)" + +msgid "attributes" +msgstr "στοιχείων" + +msgid "" +"

How to delete your consent

" +"Uncheck the box corresponding to the service provider\n" +"

Links

" +"" +msgstr "" +"

Πώς να αναιρέσετε τη συγκατάθεσή σας

Αποεπιλέξτε το κουτί " +"επιλογής που αντιστοιχεί στον πάροχο υπηρεσιών" + +msgid "Consent Removed" +msgstr "Η συγκατάθεση αναιρέθηκε" + +msgid "show/hide attributes" +msgstr "εμφάνιση/απόκρυψη στοιχείων" + +msgid "Organisation" +msgstr "Οργανισμός" + diff --git a/.extlib/simplesamlphp/modules/consentAdmin/locales/en/LC_MESSAGES/consentAdmin.po b/.extlib/simplesamlphp/modules/consentAdmin/locales/en/LC_MESSAGES/consentAdmin.po new file mode 100644 index 000000000..f90769501 --- /dev/null +++ b/.extlib/simplesamlphp/modules/consentAdmin/locales/en/LC_MESSAGES/consentAdmin.po @@ -0,0 +1,161 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: en\n" +"Language-Team: \n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "{consentAdmin:consentadmin:status_header}" +msgstr "Consent status" + +msgid "{consentAdmin:consentadmin:attributes_text}" +msgstr "attributes" + +msgid "{consentAdmin:consentadmin:service_provider_header}" +msgstr "Service Provider" + +msgid "{consentAdmin:consentadmin:removed}" +msgstr "Consent Removed" + +msgid "{consentAdmin:consentadmin:show}" +msgstr "Show" + +msgid "{consentAdmin:consentadmin:attribute_org}" +msgstr "Organisation" + +msgid "{consentAdmin:consentadmin:attribute_injected}" +msgstr "Injected attribute" + +msgid "{consentAdmin:consentadmin:show_hide_attributes}" +msgstr "show/hide attributes" + +msgid "{consentAdmin:consentadmin:consentadmin_purpose}" +msgstr "The purpose of the service is" + +msgid "{consentAdmin:consentadmin:hide}" +msgstr "Hide" + +msgid "{consentAdmin:consentadmin:sp_empty_description}" +msgstr "(no description)" + +msgid "{consentAdmin:consentadmin:service_providers_for}" +msgstr "Service Providers for" + +msgid "{consentAdmin:consentadmin:consentadmin_description2}" +msgstr "" +"

How to delete your consent

" +"Uncheck the box corresponding to the service provider\n" +"

Links

" +"" + +msgid "{consentAdmin:consentadmin:login}" +msgstr "login" + +msgid "{consentAdmin:consentadmin:consentadmin_description1}" +msgstr "Here you can view and edit your consent for the Service Providers." + +msgid "{consentAdmin:consentadmin:updated}" +msgstr "Consent Updated" + +msgid "{consentAdmin:consentadmin:unknown}" +msgstr "Unknown ..." + +msgid "{consentAdmin:consentadmin:added}" +msgstr "Consent Added" + +msgid "{consentAdmin:consentadmin:attribute_id}" +msgstr "Identity" + +msgid "Injected attribute" +msgstr "Injected attribute" + +msgid "Show" +msgstr "Show" + +msgid "Consent Added" +msgstr "Consent Added" + +msgid "Consent Administration" +msgstr "Consent Administration" + +msgid "Here you can view and edit your consent for the Service Providers." +msgstr "Here you can view and edit your consent for the Service Providers." + +msgid "Unknown ..." +msgstr "Unknown ..." + +msgid "Identity" +msgstr "Identity" + +msgid "The purpose of the service is" +msgstr "The purpose of the service is" + +msgid "Hide" +msgstr "Hide" + +msgid "Service Provider" +msgstr "Service Provider" + +msgid "Service Providers for" +msgstr "Service Providers for" + +msgid "login" +msgstr "login" + +msgid "(name not specified)" +msgstr "(name not specified)" + +msgid "Consent Updated" +msgstr "Consent Updated" + +msgid "Consent status" +msgstr "Consent status" + +msgid "(no description)" +msgstr "(no description)" + +msgid "attributes" +msgstr "attributes" + +msgid "" +"

How to delete your consent

" +"Uncheck the box corresponding to the service provider\n" +"

Links

" +"" +msgstr "" +"

How to delete your consent

" +"Uncheck the box corresponding to the service provider\n" +"

Links

" +"" + +msgid "Consent Removed" +msgstr "Consent Removed" + +msgid "show/hide attributes" +msgstr "show/hide attributes" + +msgid "Organisation" +msgstr "Organisation" + +msgid "Consent administration" +msgstr "Consent administration" + diff --git a/.extlib/simplesamlphp/modules/consentAdmin/locales/es/LC_MESSAGES/consentAdmin.po b/.extlib/simplesamlphp/modules/consentAdmin/locales/es/LC_MESSAGES/consentAdmin.po new file mode 100644 index 000000000..419daa383 --- /dev/null +++ b/.extlib/simplesamlphp/modules/consentAdmin/locales/es/LC_MESSAGES/consentAdmin.po @@ -0,0 +1,160 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: es\n" +"Language-Team: \n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "{consentAdmin:consentadmin:status_header}" +msgstr "Estado del consentimiento" + +msgid "{consentAdmin:consentadmin:attributes_text}" +msgstr "Atributos" + +msgid "{consentAdmin:consentadmin:service_provider_header}" +msgstr "Proveedor de servicio" + +msgid "{consentAdmin:consentadmin:removed}" +msgstr "Consentimiento eliminado" + +msgid "{consentAdmin:consentadmin:show}" +msgstr "Mostrar" + +msgid "{consentAdmin:consentadmin:attribute_org}" +msgstr "Organización" + +msgid "{consentAdmin:consentadmin:attribute_injected}" +msgstr "Atributo inyectado" + +msgid "{consentAdmin:consentadmin:show_hide_attributes}" +msgstr "Mostrar/ocultar atributos" + +msgid "{consentAdmin:consentadmin:consentadmin_purpose}" +msgstr "El propósito del servicio es" + +msgid "{consentAdmin:consentadmin:hide}" +msgstr "Ocultar" + +msgid "{consentAdmin:consentadmin:sp_empty_description}" +msgstr "(sin descripción)" + +msgid "{consentAdmin:consentadmin:service_providers_for}" +msgstr "Proveedores de servicio para" + +msgid "{consentAdmin:consentadmin:consentadmin_description2}" +msgstr "" +"

Como eliminar su consentimiento

Desmarque la opción " +"correspondiente al proveedor de servicios

Vínculos

" + +msgid "{consentAdmin:consentadmin:login}" +msgstr "entrar" + +msgid "{consentAdmin:consentadmin:consentadmin_description1}" +msgstr "" +"Aquí puedes visualizar y editar tu consentimiento para los proveedores de" +" servicio" + +msgid "{consentAdmin:consentadmin:updated}" +msgstr "Consentimiento actualizado" + +msgid "{consentAdmin:consentadmin:unknown}" +msgstr "Desconocido ..." + +msgid "{consentAdmin:consentadmin:added}" +msgstr "Consentimiento añadido" + +msgid "{consentAdmin:consentadmin:attribute_id}" +msgstr "Identidad" + +msgid "Injected attribute" +msgstr "Atributo inyectado" + +msgid "Show" +msgstr "Mostrar" + +msgid "Consent Added" +msgstr "Consentimiento añadido" + +msgid "Consent Administration" +msgstr "Administración de consentimiento" + +msgid "Here you can view and edit your consent for the Service Providers." +msgstr "" +"Aquí puedes visualizar y editar tu consentimiento para los proveedores de" +" servicio" + +msgid "Unknown ..." +msgstr "Desconocido ..." + +msgid "Identity" +msgstr "Identidad" + +msgid "The purpose of the service is" +msgstr "El propósito del servicio es" + +msgid "Hide" +msgstr "Ocultar" + +msgid "Service Provider" +msgstr "Proveedor de servicio" + +msgid "Service Providers for" +msgstr "Proveedores de servicio para" + +msgid "login" +msgstr "entrar" + +msgid "(name not specified)" +msgstr "(nombre no especificado)" + +msgid "Consent Updated" +msgstr "Consentimiento actualizado" + +msgid "Consent status" +msgstr "Estado del consentimiento" + +msgid "(no description)" +msgstr "(sin descripción)" + +msgid "attributes" +msgstr "Atributos" + +msgid "" +"

How to delete your consent

" +"Uncheck the box corresponding to the service provider\n" +"

Links

" +"" +msgstr "" +"

Como eliminar su consentimiento

Desmarque la opción " +"correspondiente al proveedor de servicios

Vínculos

" + +msgid "Consent Removed" +msgstr "Consentimiento eliminado" + +msgid "show/hide attributes" +msgstr "Mostrar/ocultar atributos" + +msgid "Organisation" +msgstr "Organización" + +msgid "Consent administration" +msgstr "Administración del consentimiento" diff --git a/.extlib/simplesamlphp/modules/consentAdmin/locales/et/LC_MESSAGES/consentAdmin.po b/.extlib/simplesamlphp/modules/consentAdmin/locales/et/LC_MESSAGES/consentAdmin.po new file mode 100644 index 000000000..196f8ed6f --- /dev/null +++ b/.extlib/simplesamlphp/modules/consentAdmin/locales/et/LC_MESSAGES/consentAdmin.po @@ -0,0 +1,154 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: et\n" +"Language-Team: \n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "{consentAdmin:consentadmin:status_header}" +msgstr "Nõusoleku olek" + +msgid "{consentAdmin:consentadmin:attributes_text}" +msgstr "atribuudid" + +msgid "{consentAdmin:consentadmin:service_provider_header}" +msgstr "Teenusepakkuja" + +msgid "{consentAdmin:consentadmin:removed}" +msgstr "Nõusolek eemaldatud" + +msgid "{consentAdmin:consentadmin:show}" +msgstr "Näita" + +msgid "{consentAdmin:consentadmin:attribute_org}" +msgstr "Organisatsioon" + +msgid "{consentAdmin:consentadmin:attribute_injected}" +msgstr "XXXSüstitud atribuut" + +msgid "{consentAdmin:consentadmin:show_hide_attributes}" +msgstr "näita/peida atribuudid" + +msgid "{consentAdmin:consentadmin:consentadmin_purpose}" +msgstr "Selle teenuse eesmärk on" + +msgid "{consentAdmin:consentadmin:hide}" +msgstr "Peida" + +msgid "{consentAdmin:consentadmin:sp_empty_description}" +msgstr "(kirjeldus puudub)" + +msgid "{consentAdmin:consentadmin:service_providers_for}" +msgstr "Teenusepakkujad" + +msgid "{consentAdmin:consentadmin:consentadmin_description2}" +msgstr "" +"

Kuidas eemaldada nõusolekut

Eemalda vastava teenusepakkuja " +"juurest märge

Viited

" + +msgid "{consentAdmin:consentadmin:login}" +msgstr "logi sisse" + +msgid "{consentAdmin:consentadmin:consentadmin_description1}" +msgstr "Siin saad näha ja muuta teenusepakkujatega nõusolekuid." + +msgid "{consentAdmin:consentadmin:updated}" +msgstr "Nõusolek uuendatud" + +msgid "{consentAdmin:consentadmin:unknown}" +msgstr "Tundmatu..." + +msgid "{consentAdmin:consentadmin:added}" +msgstr "Nõusolek lisatud" + +msgid "{consentAdmin:consentadmin:attribute_id}" +msgstr "Identiteet" + +msgid "Injected attribute" +msgstr "XXXSüstitud atribuut" + +msgid "Show" +msgstr "Näita" + +msgid "Consent Added" +msgstr "Nõusolek lisatud" + +msgid "Consent Administration" +msgstr "Nõusoleku administreerimine" + +msgid "Here you can view and edit your consent for the Service Providers." +msgstr "Siin saad näha ja muuta teenusepakkujatega nõusolekuid." + +msgid "Unknown ..." +msgstr "Tundmatu..." + +msgid "Identity" +msgstr "Identiteet" + +msgid "The purpose of the service is" +msgstr "Selle teenuse eesmärk on" + +msgid "Hide" +msgstr "Peida" + +msgid "Service Provider" +msgstr "Teenusepakkuja" + +msgid "Service Providers for" +msgstr "Teenusepakkujad" + +msgid "login" +msgstr "logi sisse" + +msgid "(name not specified)" +msgstr "(nimi määramata)" + +msgid "Consent Updated" +msgstr "Nõusolek uuendatud" + +msgid "Consent status" +msgstr "Nõusoleku olek" + +msgid "(no description)" +msgstr "(kirjeldus puudub)" + +msgid "attributes" +msgstr "atribuudid" + +msgid "" +"

How to delete your consent

" +"Uncheck the box corresponding to the service provider\n" +"

Links

" +"" +msgstr "" +"

Kuidas eemaldada nõusolekut

Eemalda vastava teenusepakkuja " +"juurest märge

Viited

" + +msgid "Consent Removed" +msgstr "Nõusolek eemaldatud" + +msgid "show/hide attributes" +msgstr "näita/peida atribuudid" + +msgid "Organisation" +msgstr "Organisatsioon" + diff --git a/.extlib/simplesamlphp/modules/consentAdmin/locales/eu/LC_MESSAGES/consentAdmin.po b/.extlib/simplesamlphp/modules/consentAdmin/locales/eu/LC_MESSAGES/consentAdmin.po new file mode 100644 index 000000000..822008b96 --- /dev/null +++ b/.extlib/simplesamlphp/modules/consentAdmin/locales/eu/LC_MESSAGES/consentAdmin.po @@ -0,0 +1,154 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: eu\n" +"Language-Team: \n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "{consentAdmin:consentadmin:status_header}" +msgstr "Onespenaren egoera" + +msgid "{consentAdmin:consentadmin:attributes_text}" +msgstr "Atributuak" + +msgid "{consentAdmin:consentadmin:service_provider_header}" +msgstr "Zerbitzu hornitzailea" + +msgid "{consentAdmin:consentadmin:removed}" +msgstr "Onespena ezabatua" + +msgid "{consentAdmin:consentadmin:show}" +msgstr "Erakutsi" + +msgid "{consentAdmin:consentadmin:attribute_org}" +msgstr "Erakundea" + +msgid "{consentAdmin:consentadmin:attribute_injected}" +msgstr "Atributua sartuta" + +msgid "{consentAdmin:consentadmin:show_hide_attributes}" +msgstr "erakutsi/ezkutatu atributuak" + +msgid "{consentAdmin:consentadmin:consentadmin_purpose}" +msgstr "Zerbitzuaren xedea hau da" + +msgid "{consentAdmin:consentadmin:hide}" +msgstr "Ezkutatu" + +msgid "{consentAdmin:consentadmin:sp_empty_description}" +msgstr "(deskribapenik gabe)" + +msgid "{consentAdmin:consentadmin:service_providers_for}" +msgstr "Zerbitzu hornitzaileak hontarako: " + +msgid "{consentAdmin:consentadmin:consentadmin_description2}" +msgstr "" +"

Zure onespena nola ezabatu

Zerbitzu hornitzaileari dagokion " +"aukerari marka kendu ezaiozu

Loturak

" + +msgid "{consentAdmin:consentadmin:login}" +msgstr "sartu" + +msgid "{consentAdmin:consentadmin:consentadmin_description1}" +msgstr "Hemen, zerbitzu hornitzaileentzat onespena bistara eta edita dezakezu" + +msgid "{consentAdmin:consentadmin:updated}" +msgstr "Onespena eguneratua" + +msgid "{consentAdmin:consentadmin:unknown}" +msgstr "Ezezaguna..." + +msgid "{consentAdmin:consentadmin:added}" +msgstr "Onespena gehitua" + +msgid "{consentAdmin:consentadmin:attribute_id}" +msgstr "Identitatea" + +msgid "Injected attribute" +msgstr "Atributua sartuta" + +msgid "Show" +msgstr "Erakutsi" + +msgid "Consent Added" +msgstr "Onespena gehitua" + +msgid "Consent Administration" +msgstr "Onespenaren kudeaketa" + +msgid "Here you can view and edit your consent for the Service Providers." +msgstr "Hemen, zerbitzu hornitzaileentzat onespena bistara eta edita dezakezu" + +msgid "Unknown ..." +msgstr "Ezezaguna..." + +msgid "Identity" +msgstr "Identitatea" + +msgid "The purpose of the service is" +msgstr "Zerbitzuaren xedea hau da" + +msgid "Hide" +msgstr "Ezkutatu" + +msgid "Service Provider" +msgstr "Zerbitzu hornitzailea" + +msgid "Service Providers for" +msgstr "Zerbitzu hornitzaileak hontarako: " + +msgid "login" +msgstr "sartu" + +msgid "(name not specified)" +msgstr "(izena ez da zehaztu)" + +msgid "Consent Updated" +msgstr "Onespena eguneratua" + +msgid "Consent status" +msgstr "Onespenaren egoera" + +msgid "(no description)" +msgstr "(deskribapenik gabe)" + +msgid "attributes" +msgstr "Atributuak" + +msgid "" +"

How to delete your consent

" +"Uncheck the box corresponding to the service provider\n" +"

Links

" +"" +msgstr "" +"

Zure onespena nola ezabatu

Zerbitzu hornitzaileari dagokion " +"aukerari marka kendu ezaiozu

Loturak

" + +msgid "Consent Removed" +msgstr "Onespena ezabatua" + +msgid "show/hide attributes" +msgstr "erakutsi/ezkutatu atributuak" + +msgid "Organisation" +msgstr "Erakundea" + diff --git a/.extlib/simplesamlphp/modules/consentAdmin/locales/fr/LC_MESSAGES/consentAdmin.po b/.extlib/simplesamlphp/modules/consentAdmin/locales/fr/LC_MESSAGES/consentAdmin.po new file mode 100644 index 000000000..05964530d --- /dev/null +++ b/.extlib/simplesamlphp/modules/consentAdmin/locales/fr/LC_MESSAGES/consentAdmin.po @@ -0,0 +1,158 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: fr\n" +"Language-Team: \n" +"Plural-Forms: nplurals=2; plural=(n > 1)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "{consentAdmin:consentadmin:status_header}" +msgstr "Statut du consentement" + +msgid "{consentAdmin:consentadmin:attributes_text}" +msgstr "attributs" + +msgid "{consentAdmin:consentadmin:service_provider_header}" +msgstr "Fournisseurs de service" + +msgid "{consentAdmin:consentadmin:removed}" +msgstr "Consentement révoqué" + +msgid "{consentAdmin:consentadmin:show}" +msgstr "Voir" + +msgid "{consentAdmin:consentadmin:attribute_org}" +msgstr "Institution" + +msgid "{consentAdmin:consentadmin:attribute_injected}" +msgstr "Attribut ajouté" + +msgid "{consentAdmin:consentadmin:show_hide_attributes}" +msgstr "voir/cacher les attributs" + +msgid "{consentAdmin:consentadmin:consentadmin_purpose}" +msgstr "L'objet de ce service est" + +msgid "{consentAdmin:consentadmin:hide}" +msgstr "Cacher" + +msgid "{consentAdmin:consentadmin:sp_empty_description}" +msgstr "(pas de description)" + +msgid "{consentAdmin:consentadmin:service_providers_for}" +msgstr "Fournisseurs de service pour" + +msgid "{consentAdmin:consentadmin:consentadmin_description2}" +msgstr "" +"

Comment révoquer un consentement

Décochez la case correspondante " +"au fournisseur de service

Liens

" + +msgid "{consentAdmin:consentadmin:login}" +msgstr "Connexion" + +msgid "{consentAdmin:consentadmin:consentadmin_description1}" +msgstr "" +"Vous pouvez ici voir et modifier les consentements donnés pour les " +"fournisseurs de service." + +msgid "{consentAdmin:consentadmin:updated}" +msgstr "Consentement mis ) jour" + +msgid "{consentAdmin:consentadmin:unknown}" +msgstr "Inconnu ..." + +msgid "{consentAdmin:consentadmin:added}" +msgstr "Consentement ajouté" + +msgid "{consentAdmin:consentadmin:attribute_id}" +msgstr "Identité" + +msgid "Injected attribute" +msgstr "Attribut ajouté" + +msgid "Show" +msgstr "Voir" + +msgid "Consent Added" +msgstr "Consentement ajouté" + +msgid "Consent Administration" +msgstr "Administration des consentements" + +msgid "Here you can view and edit your consent for the Service Providers." +msgstr "" +"Vous pouvez ici voir et modifier les consentements donnés pour les " +"fournisseurs de service." + +msgid "Unknown ..." +msgstr "Inconnu ..." + +msgid "Identity" +msgstr "Identité" + +msgid "The purpose of the service is" +msgstr "L'objet de ce service est" + +msgid "Hide" +msgstr "Cacher" + +msgid "Service Provider" +msgstr "Fournisseurs de service" + +msgid "Service Providers for" +msgstr "Fournisseurs de service pour" + +msgid "login" +msgstr "Connexion" + +msgid "(name not specified)" +msgstr "(nom non indiqué)" + +msgid "Consent Updated" +msgstr "Consentement mis ) jour" + +msgid "Consent status" +msgstr "Statut du consentement" + +msgid "(no description)" +msgstr "(pas de description)" + +msgid "attributes" +msgstr "attributs" + +msgid "" +"

How to delete your consent

" +"Uncheck the box corresponding to the service provider\n" +"

Links

" +"" +msgstr "" +"

Comment révoquer un consentement

Décochez la case correspondante " +"au fournisseur de service

Liens

" + +msgid "Consent Removed" +msgstr "Consentement révoqué" + +msgid "show/hide attributes" +msgstr "voir/cacher les attributs" + +msgid "Organisation" +msgstr "Institution" + diff --git a/.extlib/simplesamlphp/modules/consentAdmin/locales/he/LC_MESSAGES/consentAdmin.po b/.extlib/simplesamlphp/modules/consentAdmin/locales/he/LC_MESSAGES/consentAdmin.po new file mode 100644 index 000000000..d48af2c45 --- /dev/null +++ b/.extlib/simplesamlphp/modules/consentAdmin/locales/he/LC_MESSAGES/consentAdmin.po @@ -0,0 +1,152 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: he\n" +"Language-Team: \n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "{consentAdmin:consentadmin:status_header}" +msgstr "מצב הסכמה" + +msgid "{consentAdmin:consentadmin:attributes_text}" +msgstr "מאפיינים" + +msgid "{consentAdmin:consentadmin:service_provider_header}" +msgstr "ספק שירות" + +msgid "{consentAdmin:consentadmin:removed}" +msgstr "הסכמה הוסרה" + +msgid "{consentAdmin:consentadmin:show}" +msgstr "הצג" + +msgid "{consentAdmin:consentadmin:attribute_org}" +msgstr "אירגון" + +msgid "{consentAdmin:consentadmin:attribute_injected}" +msgstr "מאפיין מוזרק" + +msgid "{consentAdmin:consentadmin:show_hide_attributes}" +msgstr "הראה\\הסתר מאפיינים" + +msgid "{consentAdmin:consentadmin:consentadmin_purpose}" +msgstr "מטרת השירות היא" + +msgid "{consentAdmin:consentadmin:hide}" +msgstr "הסתר" + +msgid "{consentAdmin:consentadmin:sp_empty_description}" +msgstr "(אין תיאור)" + +msgid "{consentAdmin:consentadmin:service_providers_for}" +msgstr "ספקי שירות עבור" + +msgid "{consentAdmin:consentadmin:consentadmin_description2}" +msgstr "" +"

איך להסיר את הסכמתך

לחץ בתיבה המתאימה לספק השירות " +"

קישורים

" + +msgid "{consentAdmin:consentadmin:login}" +msgstr "התחבר" + +msgid "{consentAdmin:consentadmin:consentadmin_description1}" +msgstr "כאן אתה יכול לראות ולערוך את הסכמותך לספקי השירות" + +msgid "{consentAdmin:consentadmin:updated}" +msgstr "הסכמה עודכנה" + +msgid "{consentAdmin:consentadmin:unknown}" +msgstr "לא ידוע..." + +msgid "{consentAdmin:consentadmin:added}" +msgstr "הסכמה הוספה" + +msgid "{consentAdmin:consentadmin:attribute_id}" +msgstr "זהות" + +msgid "Injected attribute" +msgstr "מאפיין מוזרק" + +msgid "Show" +msgstr "הצג" + +msgid "Consent Added" +msgstr "הסכמה הוספה" + +msgid "Consent Administration" +msgstr "מנהל הסכמותת" + +msgid "Here you can view and edit your consent for the Service Providers." +msgstr "כאן אתה יכול לראות ולערוך את הסכמותך לספקי השירות" + +msgid "Unknown ..." +msgstr "לא ידוע..." + +msgid "Identity" +msgstr "זהות" + +msgid "The purpose of the service is" +msgstr "מטרת השירות היא" + +msgid "Hide" +msgstr "הסתר" + +msgid "Service Provider" +msgstr "ספק שירות" + +msgid "Service Providers for" +msgstr "ספקי שירות עבור" + +msgid "login" +msgstr "התחבר" + +msgid "(name not specified)" +msgstr "(לא ניתן שם)" + +msgid "Consent Updated" +msgstr "הסכמה עודכנה" + +msgid "Consent status" +msgstr "מצב הסכמה" + +msgid "(no description)" +msgstr "(אין תיאור)" + +msgid "attributes" +msgstr "מאפיינים" + +msgid "" +"

How to delete your consent

" +"Uncheck the box corresponding to the service provider\n" +"

Links

" +"" +msgstr "" +"

איך להסיר את הסכמתך

לחץ בתיבה המתאימה לספק השירות " +"

קישורים

" + +msgid "Consent Removed" +msgstr "הסכמה הוסרה" + +msgid "show/hide attributes" +msgstr "הראה\\הסתר מאפיינים" + +msgid "Organisation" +msgstr "אירגון" + diff --git a/.extlib/simplesamlphp/modules/consentAdmin/locales/hr/LC_MESSAGES/consentAdmin.po b/.extlib/simplesamlphp/modules/consentAdmin/locales/hr/LC_MESSAGES/consentAdmin.po new file mode 100644 index 000000000..46db9f915 --- /dev/null +++ b/.extlib/simplesamlphp/modules/consentAdmin/locales/hr/LC_MESSAGES/consentAdmin.po @@ -0,0 +1,155 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: hr\n" +"Language-Team: \n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "{consentAdmin:consentadmin:status_header}" +msgstr "Stanje dozvola" + +msgid "{consentAdmin:consentadmin:attributes_text}" +msgstr "atributi" + +msgid "{consentAdmin:consentadmin:service_provider_header}" +msgstr "Davatelj usluge" + +msgid "{consentAdmin:consentadmin:removed}" +msgstr "Dozvola uklonjena" + +msgid "{consentAdmin:consentadmin:show}" +msgstr "Prikaži" + +msgid "{consentAdmin:consentadmin:attribute_org}" +msgstr "Ustanova" + +msgid "{consentAdmin:consentadmin:attribute_injected}" +msgstr "Ubačeni atribut" + +msgid "{consentAdmin:consentadmin:show_hide_attributes}" +msgstr "prikaži/sakrij atribute" + +msgid "{consentAdmin:consentadmin:consentadmin_purpose}" +msgstr "Namjena ovog servisa je" + +msgid "{consentAdmin:consentadmin:hide}" +msgstr "Sakrij" + +msgid "{consentAdmin:consentadmin:sp_empty_description}" +msgstr "(nema opisa)" + +msgid "{consentAdmin:consentadmin:service_providers_for}" +msgstr "Davatelji usluga za" + +msgid "{consentAdmin:consentadmin:consentadmin_description2}" +msgstr "" +"

Kako obrisati dozvolu

Maknite kvačicu iz polja koje se odnosi na" +" davatelja usluge

Poveznice

" + +msgid "{consentAdmin:consentadmin:login}" +msgstr "Prijavi se" + +msgid "{consentAdmin:consentadmin:consentadmin_description1}" +msgstr "Ovdje možete pregledati i mijenjati vaše dozvole davateljima usluga." + +msgid "{consentAdmin:consentadmin:updated}" +msgstr "Dozvola ažurirana" + +msgid "{consentAdmin:consentadmin:unknown}" +msgstr "Nepoznato ..." + +msgid "{consentAdmin:consentadmin:added}" +msgstr "Dozvola dodana" + +msgid "{consentAdmin:consentadmin:attribute_id}" +msgstr "Identitet" + +msgid "Injected attribute" +msgstr "Ubačeni atribut" + +msgid "Show" +msgstr "Prikaži" + +msgid "Consent Added" +msgstr "Dozvola dodana" + +msgid "Consent Administration" +msgstr "Administracija dozvola" + +msgid "Here you can view and edit your consent for the Service Providers." +msgstr "Ovdje možete pregledati i mijenjati vaše dozvole davateljima usluga." + +msgid "Unknown ..." +msgstr "Nepoznato ..." + +msgid "Identity" +msgstr "Identitet" + +msgid "The purpose of the service is" +msgstr "Namjena ovog servisa je" + +msgid "Hide" +msgstr "Sakrij" + +msgid "Service Provider" +msgstr "Davatelj usluge" + +msgid "Service Providers for" +msgstr "Davatelji usluga za" + +msgid "login" +msgstr "Prijavi se" + +msgid "(name not specified)" +msgstr "(naziv nije specificiran)" + +msgid "Consent Updated" +msgstr "Dozvola ažurirana" + +msgid "Consent status" +msgstr "Stanje dozvola" + +msgid "(no description)" +msgstr "(nema opisa)" + +msgid "attributes" +msgstr "atributi" + +msgid "" +"

How to delete your consent

" +"Uncheck the box corresponding to the service provider\n" +"

Links

" +"" +msgstr "" +"

Kako obrisati dozvolu

Maknite kvačicu iz polja koje se odnosi na" +" davatelja usluge

Poveznice

" + +msgid "Consent Removed" +msgstr "Dozvola uklonjena" + +msgid "show/hide attributes" +msgstr "prikaži/sakrij atribute" + +msgid "Organisation" +msgstr "Ustanova" + diff --git a/.extlib/simplesamlphp/modules/consentAdmin/locales/hu/LC_MESSAGES/consentAdmin.po b/.extlib/simplesamlphp/modules/consentAdmin/locales/hu/LC_MESSAGES/consentAdmin.po new file mode 100644 index 000000000..a79632a1c --- /dev/null +++ b/.extlib/simplesamlphp/modules/consentAdmin/locales/hu/LC_MESSAGES/consentAdmin.po @@ -0,0 +1,152 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: hu\n" +"Language-Team: \n" +"Plural-Forms: nplurals=1; plural=0\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "{consentAdmin:consentadmin:status_header}" +msgstr "Hozzájárulás állapota" + +msgid "{consentAdmin:consentadmin:attributes_text}" +msgstr "." + +msgid "{consentAdmin:consentadmin:service_provider_header}" +msgstr "Szolgáltató" + +msgid "{consentAdmin:consentadmin:removed}" +msgstr "Hozzájárulás visszavonva" + +msgid "{consentAdmin:consentadmin:show}" +msgstr "Attribútumok megjelenítése" + +msgid "{consentAdmin:consentadmin:attribute_org}" +msgstr "Intézmény" + +msgid "{consentAdmin:consentadmin:attribute_injected}" +msgstr "Attribútum beszúrása" + +msgid "{consentAdmin:consentadmin:show_hide_attributes}" +msgstr "Attribútumok megjelenítése/rejtése" + +msgid "{consentAdmin:consentadmin:consentadmin_purpose}" +msgstr "A szolgáltatás leírása" + +msgid "{consentAdmin:consentadmin:hide}" +msgstr "Attribútumok rejtése" + +msgid "{consentAdmin:consentadmin:sp_empty_description}" +msgstr "(nincs leírás)" + +msgid "{consentAdmin:consentadmin:service_providers_for}" +msgstr "Szolgáltató" + +msgid "{consentAdmin:consentadmin:consentadmin_description2}" +msgstr "" +"

Hogyan kell visszavonni egy hozzájárulást?

A szolgáltatóhoz " +"tartozó jelölőnégyzetben szüntesse meg a kijelölést!" + +msgid "{consentAdmin:consentadmin:login}" +msgstr "Belépés" + +msgid "{consentAdmin:consentadmin:consentadmin_description1}" +msgstr "" +"Ezen az oldalon lehet szolgáltatónként (SP) az adakezelési " +"hozzájárulásokat megtekinteni és módosítani." + +msgid "{consentAdmin:consentadmin:updated}" +msgstr "Hozzájárulás frissítve" + +msgid "{consentAdmin:consentadmin:unknown}" +msgstr "Ismeretlen ..." + +msgid "{consentAdmin:consentadmin:added}" +msgstr "Hozzájárulás rögzítve" + +msgid "{consentAdmin:consentadmin:attribute_id}" +msgstr "Azonosság" + +msgid "Injected attribute" +msgstr "Attribútum beszúrása" + +msgid "Show" +msgstr "Attribútumok megjelenítése" + +msgid "Consent Added" +msgstr "Hozzájárulás rögzítve" + +msgid "Consent Administration" +msgstr "Adatkezelési hozzájárulások kezelése" + +msgid "Here you can view and edit your consent for the Service Providers." +msgstr "" +"Ezen az oldalon lehet szolgáltatónként (SP) az adakezelési " +"hozzájárulásokat megtekinteni és módosítani." + +msgid "Unknown ..." +msgstr "Ismeretlen ..." + +msgid "Identity" +msgstr "Azonosság" + +msgid "The purpose of the service is" +msgstr "A szolgáltatás leírása" + +msgid "Hide" +msgstr "Attribútumok rejtése" + +msgid "Service Provider" +msgstr "Szolgáltató" + +msgid "Service Providers for" +msgstr "Szolgáltató" + +msgid "login" +msgstr "Belépés" + +msgid "(name not specified)" +msgstr "(nincs név)" + +msgid "Consent Updated" +msgstr "Hozzájárulás frissítve" + +msgid "Consent status" +msgstr "Hozzájárulás állapota" + +msgid "(no description)" +msgstr "(nincs leírás)" + +msgid "attributes" +msgstr "." + +msgid "" +"

How to delete your consent

" +"Uncheck the box corresponding to the service provider\n" +"

Links

" +"" +msgstr "" +"

Hogyan kell visszavonni egy hozzájárulást?

A szolgáltatóhoz " +"tartozó jelölőnégyzetben szüntesse meg a kijelölést!" + +msgid "Consent Removed" +msgstr "Hozzájárulás visszavonva" + +msgid "show/hide attributes" +msgstr "Attribútumok megjelenítése/rejtése" + +msgid "Organisation" +msgstr "Intézmény" + diff --git a/.extlib/simplesamlphp/modules/consentAdmin/locales/id/LC_MESSAGES/consentAdmin.po b/.extlib/simplesamlphp/modules/consentAdmin/locales/id/LC_MESSAGES/consentAdmin.po new file mode 100644 index 000000000..dc90e2d5c --- /dev/null +++ b/.extlib/simplesamlphp/modules/consentAdmin/locales/id/LC_MESSAGES/consentAdmin.po @@ -0,0 +1,158 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: id\n" +"Language-Team: \n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "{consentAdmin:consentadmin:status_header}" +msgstr "Status consent" + +msgid "{consentAdmin:consentadmin:attributes_text}" +msgstr "Attribute" + +msgid "{consentAdmin:consentadmin:service_provider_header}" +msgstr "Service Provider" + +msgid "{consentAdmin:consentadmin:removed}" +msgstr "Consent telah dibuang" + +msgid "{consentAdmin:consentadmin:show}" +msgstr "Perlihatkan" + +msgid "{consentAdmin:consentadmin:attribute_org}" +msgstr "Organisasi" + +msgid "{consentAdmin:consentadmin:attribute_injected}" +msgstr "Attribut yang diinjeksi" + +msgid "{consentAdmin:consentadmin:show_hide_attributes}" +msgstr "Tunjukkan/sembunyikan attribute" + +msgid "{consentAdmin:consentadmin:consentadmin_purpose}" +msgstr "Tujuan dari layanan ini adalah" + +msgid "{consentAdmin:consentadmin:hide}" +msgstr "Sembunyikan" + +msgid "{consentAdmin:consentadmin:sp_empty_description}" +msgstr "(Tidak ada penjelasan)" + +msgid "{consentAdmin:consentadmin:service_providers_for}" +msgstr "Service Provider untuk" + +msgid "{consentAdmin:consentadmin:consentadmin_description2}" +msgstr "" +"

Bagaimana cara menghapus consent anda

Hapus centak pada kotak " +"service provider yang anda maksud

Link

" + +msgid "{consentAdmin:consentadmin:login}" +msgstr "login" + +msgid "{consentAdmin:consentadmin:consentadmin_description1}" +msgstr "" +"Disini anda dapat melihat dan mengedit consent anda untuk Service " +"Provider." + +msgid "{consentAdmin:consentadmin:updated}" +msgstr "Consent telah diupdate" + +msgid "{consentAdmin:consentadmin:unknown}" +msgstr "Tidak diketahui..." + +msgid "{consentAdmin:consentadmin:added}" +msgstr "Consent telah ditambahkan" + +msgid "{consentAdmin:consentadmin:attribute_id}" +msgstr "Identitas" + +msgid "Injected attribute" +msgstr "Attribut yang diinjeksi" + +msgid "Show" +msgstr "Perlihatkan" + +msgid "Consent Added" +msgstr "Consent telah ditambahkan" + +msgid "Consent Administration" +msgstr "Administrasi Consent" + +msgid "Here you can view and edit your consent for the Service Providers." +msgstr "" +"Disini anda dapat melihat dan mengedit consent anda untuk Service " +"Provider." + +msgid "Unknown ..." +msgstr "Tidak diketahui..." + +msgid "Identity" +msgstr "Identitas" + +msgid "The purpose of the service is" +msgstr "Tujuan dari layanan ini adalah" + +msgid "Hide" +msgstr "Sembunyikan" + +msgid "Service Provider" +msgstr "Service Provider" + +msgid "Service Providers for" +msgstr "Service Provider untuk" + +msgid "login" +msgstr "login" + +msgid "(name not specified)" +msgstr "(Nama tidak diisi)" + +msgid "Consent Updated" +msgstr "Consent telah diupdate" + +msgid "Consent status" +msgstr "Status consent" + +msgid "(no description)" +msgstr "(Tidak ada penjelasan)" + +msgid "attributes" +msgstr "Attribute" + +msgid "" +"

How to delete your consent

" +"Uncheck the box corresponding to the service provider\n" +"

Links

" +"" +msgstr "" +"

Bagaimana cara menghapus consent anda

Hapus centak pada kotak " +"service provider yang anda maksud

Link

" + +msgid "Consent Removed" +msgstr "Consent telah dibuang" + +msgid "show/hide attributes" +msgstr "Tunjukkan/sembunyikan attribute" + +msgid "Organisation" +msgstr "Organisasi" + diff --git a/.extlib/simplesamlphp/modules/consentAdmin/locales/it/LC_MESSAGES/consentAdmin.po b/.extlib/simplesamlphp/modules/consentAdmin/locales/it/LC_MESSAGES/consentAdmin.po new file mode 100644 index 000000000..fe5ec46e0 --- /dev/null +++ b/.extlib/simplesamlphp/modules/consentAdmin/locales/it/LC_MESSAGES/consentAdmin.po @@ -0,0 +1,158 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: it\n" +"Language-Team: \n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "{consentAdmin:consentadmin:status_header}" +msgstr "Stato del consenso" + +msgid "{consentAdmin:consentadmin:attributes_text}" +msgstr "attributi" + +msgid "{consentAdmin:consentadmin:service_provider_header}" +msgstr "Service Provider" + +msgid "{consentAdmin:consentadmin:removed}" +msgstr "Consenso Rimosso" + +msgid "{consentAdmin:consentadmin:show}" +msgstr "Mostra" + +msgid "{consentAdmin:consentadmin:attribute_org}" +msgstr "Organizzazione" + +msgid "{consentAdmin:consentadmin:attribute_injected}" +msgstr "Attributo inserito" + +msgid "{consentAdmin:consentadmin:show_hide_attributes}" +msgstr "Mostra/nascondi attributi" + +msgid "{consentAdmin:consentadmin:consentadmin_purpose}" +msgstr "Lo scopo di questo servizio è" + +msgid "{consentAdmin:consentadmin:hide}" +msgstr "Nascondi" + +msgid "{consentAdmin:consentadmin:sp_empty_description}" +msgstr "(nessuna descrizione)" + +msgid "{consentAdmin:consentadmin:service_providers_for}" +msgstr "Service provider per" + +msgid "{consentAdmin:consentadmin:consentadmin_description2}" +msgstr "" +"

Come rimuovere il consenso>

Togliere il segno di spunta al " +"corrispondente service provider

Collegamenti

" + +msgid "{consentAdmin:consentadmin:login}" +msgstr "connessione" + +msgid "{consentAdmin:consentadmin:consentadmin_description1}" +msgstr "" +"Qui è possibile vedere e modificare i consensi per i vari Service " +"Provider." + +msgid "{consentAdmin:consentadmin:updated}" +msgstr "Consenso Aggiornato" + +msgid "{consentAdmin:consentadmin:unknown}" +msgstr "Sconosciuto..." + +msgid "{consentAdmin:consentadmin:added}" +msgstr "Consenso Aggiunto" + +msgid "{consentAdmin:consentadmin:attribute_id}" +msgstr "Identità" + +msgid "Injected attribute" +msgstr "Attributo inserito" + +msgid "Show" +msgstr "Mostra" + +msgid "Consent Added" +msgstr "Consenso Aggiunto" + +msgid "Consent Administration" +msgstr "Amministrazione del consenso" + +msgid "Here you can view and edit your consent for the Service Providers." +msgstr "" +"Qui è possibile vedere e modificare i consensi per i vari Service " +"Provider." + +msgid "Unknown ..." +msgstr "Sconosciuto..." + +msgid "Identity" +msgstr "Identità" + +msgid "The purpose of the service is" +msgstr "Lo scopo di questo servizio è" + +msgid "Hide" +msgstr "Nascondi" + +msgid "Service Provider" +msgstr "Service Provider" + +msgid "Service Providers for" +msgstr "Service provider per" + +msgid "login" +msgstr "connessione" + +msgid "(name not specified)" +msgstr "(nome non specificato)" + +msgid "Consent Updated" +msgstr "Consenso Aggiornato" + +msgid "Consent status" +msgstr "Stato del consenso" + +msgid "(no description)" +msgstr "(nessuna descrizione)" + +msgid "attributes" +msgstr "attributi" + +msgid "" +"

How to delete your consent

" +"Uncheck the box corresponding to the service provider\n" +"

Links

" +"" +msgstr "" +"

Come rimuovere il consenso>

Togliere il segno di spunta al " +"corrispondente service provider

Collegamenti

" + +msgid "Consent Removed" +msgstr "Consenso Rimosso" + +msgid "show/hide attributes" +msgstr "Mostra/nascondi attributi" + +msgid "Organisation" +msgstr "Organizzazione" + diff --git a/.extlib/simplesamlphp/modules/consentAdmin/locales/ja/LC_MESSAGES/consentAdmin.po b/.extlib/simplesamlphp/modules/consentAdmin/locales/ja/LC_MESSAGES/consentAdmin.po new file mode 100644 index 000000000..9b7aeb229 --- /dev/null +++ b/.extlib/simplesamlphp/modules/consentAdmin/locales/ja/LC_MESSAGES/consentAdmin.po @@ -0,0 +1,152 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: ja\n" +"Language-Team: \n" +"Plural-Forms: nplurals=1; plural=0\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "{consentAdmin:consentadmin:status_header}" +msgstr "承認ステータス" + +msgid "{consentAdmin:consentadmin:attributes_text}" +msgstr "属性" + +msgid "{consentAdmin:consentadmin:service_provider_header}" +msgstr "サービスプロバイダ" + +msgid "{consentAdmin:consentadmin:removed}" +msgstr "承認が削除されました" + +msgid "{consentAdmin:consentadmin:show}" +msgstr "表示" + +msgid "{consentAdmin:consentadmin:attribute_org}" +msgstr "組織" + +msgid "{consentAdmin:consentadmin:attribute_injected}" +msgstr "挿入された属性" + +msgid "{consentAdmin:consentadmin:show_hide_attributes}" +msgstr "表示/非表示属性" + +msgid "{consentAdmin:consentadmin:consentadmin_purpose}" +msgstr "サービスの目的: " + +msgid "{consentAdmin:consentadmin:hide}" +msgstr "非表示" + +msgid "{consentAdmin:consentadmin:sp_empty_description}" +msgstr "(記述無し)" + +msgid "{consentAdmin:consentadmin:service_providers_for}" +msgstr "サービスプロバイダ - " + +msgid "{consentAdmin:consentadmin:consentadmin_description2}" +msgstr "" +"

承認の削除方法

該当するサービスプロバイダのチェックを外します。

リンク

" + +msgid "{consentAdmin:consentadmin:login}" +msgstr "ログイン" + +msgid "{consentAdmin:consentadmin:consentadmin_description1}" +msgstr "ここは、サービスプロバイダの承認を表示したり編集することが出来ます。" + +msgid "{consentAdmin:consentadmin:updated}" +msgstr "承認が更新されました" + +msgid "{consentAdmin:consentadmin:unknown}" +msgstr "不明…" + +msgid "{consentAdmin:consentadmin:added}" +msgstr "承認が追加されました" + +msgid "{consentAdmin:consentadmin:attribute_id}" +msgstr "識別子" + +msgid "Injected attribute" +msgstr "挿入された属性" + +msgid "Show" +msgstr "表示" + +msgid "Consent Added" +msgstr "承認が追加されました" + +msgid "Consent Administration" +msgstr "承認管理" + +msgid "Here you can view and edit your consent for the Service Providers." +msgstr "ここは、サービスプロバイダの承認を表示したり編集することが出来ます。" + +msgid "Unknown ..." +msgstr "不明…" + +msgid "Identity" +msgstr "識別子" + +msgid "The purpose of the service is" +msgstr "サービスの目的: " + +msgid "Hide" +msgstr "非表示" + +msgid "Service Provider" +msgstr "サービスプロバイダ" + +msgid "Service Providers for" +msgstr "サービスプロバイダ - " + +msgid "login" +msgstr "ログイン" + +msgid "(name not specified)" +msgstr "(名前無し)" + +msgid "Consent Updated" +msgstr "承認が更新されました" + +msgid "Consent status" +msgstr "承認ステータス" + +msgid "(no description)" +msgstr "(記述無し)" + +msgid "attributes" +msgstr "属性" + +msgid "" +"

How to delete your consent

" +"Uncheck the box corresponding to the service provider\n" +"

Links

" +"" +msgstr "" +"

承認の削除方法

該当するサービスプロバイダのチェックを外します。

リンク

" + +msgid "Consent Removed" +msgstr "承認が削除されました" + +msgid "show/hide attributes" +msgstr "表示/非表示属性" + +msgid "Organisation" +msgstr "組織" + diff --git a/.extlib/simplesamlphp/modules/consentAdmin/locales/lt/LC_MESSAGES/consentAdmin.po b/.extlib/simplesamlphp/modules/consentAdmin/locales/lt/LC_MESSAGES/consentAdmin.po new file mode 100644 index 000000000..6aa25d10e --- /dev/null +++ b/.extlib/simplesamlphp/modules/consentAdmin/locales/lt/LC_MESSAGES/consentAdmin.po @@ -0,0 +1,153 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: lt\n" +"Language-Team: \n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"(n%100<10 || n%100>=20) ? 1 : 2)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "{consentAdmin:consentadmin:status_header}" +msgstr "Leidimo statusas" + +msgid "{consentAdmin:consentadmin:attributes_text}" +msgstr "atributai" + +msgid "{consentAdmin:consentadmin:service_provider_header}" +msgstr "Paslaugos tiekėjas" + +msgid "{consentAdmin:consentadmin:removed}" +msgstr "Leidimas pašalintas" + +msgid "{consentAdmin:consentadmin:show}" +msgstr "Parodyti" + +msgid "{consentAdmin:consentadmin:attribute_org}" +msgstr "Organizacija" + +msgid "{consentAdmin:consentadmin:attribute_injected}" +msgstr "Įterptas atributas" + +msgid "{consentAdmin:consentadmin:show_hide_attributes}" +msgstr "Rodyti/slėpti atributus" + +msgid "{consentAdmin:consentadmin:consentadmin_purpose}" +msgstr "Paslaugos paskirtis yra" + +msgid "{consentAdmin:consentadmin:hide}" +msgstr "Paslėpti" + +msgid "{consentAdmin:consentadmin:sp_empty_description}" +msgstr "(apibūdinimas nenurodytas)" + +msgid "{consentAdmin:consentadmin:service_providers_for}" +msgstr "Paslaugos tiekėjai" + +msgid "{consentAdmin:consentadmin:consentadmin_description2}" +msgstr "" +"

Kaip pašalinti savo leidimą

Panaikinkite pažymėjimą ties " +"atitinkamu paslaugos teikėju

Nuorodos

" + +msgid "{consentAdmin:consentadmin:login}" +msgstr "Prisijungti" + +msgid "{consentAdmin:consentadmin:consentadmin_description1}" +msgstr "Čia jūs galite peržiūrėti ir keisti savo leidimus paslaugų teikėjams" + +msgid "{consentAdmin:consentadmin:updated}" +msgstr "Leidimas atnaujintas" + +msgid "{consentAdmin:consentadmin:unknown}" +msgstr "Nežinoma..." + +msgid "{consentAdmin:consentadmin:added}" +msgstr "Leidimas pridėtas" + +msgid "{consentAdmin:consentadmin:attribute_id}" +msgstr "Tapatybė" + +msgid "Injected attribute" +msgstr "Įterptas atributas" + +msgid "Show" +msgstr "Parodyti" + +msgid "Consent Added" +msgstr "Leidimas pridėtas" + +msgid "Consent Administration" +msgstr "Leidimų administravimas" + +msgid "Here you can view and edit your consent for the Service Providers." +msgstr "Čia jūs galite peržiūrėti ir keisti savo leidimus paslaugų teikėjams" + +msgid "Unknown ..." +msgstr "Nežinoma..." + +msgid "Identity" +msgstr "Tapatybė" + +msgid "The purpose of the service is" +msgstr "Paslaugos paskirtis yra" + +msgid "Hide" +msgstr "Paslėpti" + +msgid "Service Provider" +msgstr "Paslaugos tiekėjas" + +msgid "Service Providers for" +msgstr "Paslaugos tiekėjai" + +msgid "login" +msgstr "Prisijungti" + +msgid "(name not specified)" +msgstr "(pavadinimas nenurodytas)" + +msgid "Consent Updated" +msgstr "Leidimas atnaujintas" + +msgid "Consent status" +msgstr "Leidimo statusas" + +msgid "(no description)" +msgstr "(apibūdinimas nenurodytas)" + +msgid "attributes" +msgstr "atributai" + +msgid "" +"

How to delete your consent

" +"Uncheck the box corresponding to the service provider\n" +"

Links

" +"" +msgstr "" +"

Kaip pašalinti savo leidimą

Panaikinkite pažymėjimą ties " +"atitinkamu paslaugos teikėju

Nuorodos

" + +msgid "Consent Removed" +msgstr "Leidimas pašalintas" + +msgid "show/hide attributes" +msgstr "Rodyti/slėpti atributus" + +msgid "Organisation" +msgstr "Organizacija" + diff --git a/.extlib/simplesamlphp/modules/consentAdmin/locales/lv/LC_MESSAGES/consentAdmin.po b/.extlib/simplesamlphp/modules/consentAdmin/locales/lv/LC_MESSAGES/consentAdmin.po new file mode 100644 index 000000000..79b915a1c --- /dev/null +++ b/.extlib/simplesamlphp/modules/consentAdmin/locales/lv/LC_MESSAGES/consentAdmin.po @@ -0,0 +1,155 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: lv\n" +"Language-Team: \n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 :" +" 2)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "{consentAdmin:consentadmin:status_header}" +msgstr "Noteikumu statuss" + +msgid "{consentAdmin:consentadmin:attributes_text}" +msgstr "atribūti" + +msgid "{consentAdmin:consentadmin:service_provider_header}" +msgstr "Servisa piegādātājs" + +msgid "{consentAdmin:consentadmin:removed}" +msgstr "Noņemtie noteikumi" + +msgid "{consentAdmin:consentadmin:show}" +msgstr "Parādīt" + +msgid "{consentAdmin:consentadmin:attribute_org}" +msgstr "Organizācija" + +msgid "{consentAdmin:consentadmin:attribute_injected}" +msgstr "Ievietots atribūts" + +msgid "{consentAdmin:consentadmin:show_hide_attributes}" +msgstr "rādīšanas/slēpšanas atribūti" + +msgid "{consentAdmin:consentadmin:consentadmin_purpose}" +msgstr "Šī servisa nolūks ir" + +msgid "{consentAdmin:consentadmin:hide}" +msgstr "Slēpt" + +msgid "{consentAdmin:consentadmin:sp_empty_description}" +msgstr "(nav apraksta)" + +msgid "{consentAdmin:consentadmin:service_providers_for}" +msgstr "Servisa piegādātāji priekš" + +msgid "{consentAdmin:consentadmin:consentadmin_description2}" +msgstr "" +"

Kā dzēst noteikumus

Izņemiet ķeksīti pie atbilstošā servisa " +"piegādātāja

Saites

" + +msgid "{consentAdmin:consentadmin:login}" +msgstr "pieslēgties" + +msgid "{consentAdmin:consentadmin:consentadmin_description1}" +msgstr "Šeit Jūs varat aplūkot un labot noteikumus priekš servisu piegādātājiem" + +msgid "{consentAdmin:consentadmin:updated}" +msgstr "Uzlabotie noteikumi" + +msgid "{consentAdmin:consentadmin:unknown}" +msgstr "Nezināms ..." + +msgid "{consentAdmin:consentadmin:added}" +msgstr "Pievienotie noteikumi" + +msgid "{consentAdmin:consentadmin:attribute_id}" +msgstr "Identitāte" + +msgid "Injected attribute" +msgstr "Ievietots atribūts" + +msgid "Show" +msgstr "Parādīt" + +msgid "Consent Added" +msgstr "Pievienotie noteikumi" + +msgid "Consent Administration" +msgstr "Noteikumu administrators" + +msgid "Here you can view and edit your consent for the Service Providers." +msgstr "Šeit Jūs varat aplūkot un labot noteikumus priekš servisu piegādātājiem" + +msgid "Unknown ..." +msgstr "Nezināms ..." + +msgid "Identity" +msgstr "Identitāte" + +msgid "The purpose of the service is" +msgstr "Šī servisa nolūks ir" + +msgid "Hide" +msgstr "Slēpt" + +msgid "Service Provider" +msgstr "Servisa piegādātājs" + +msgid "Service Providers for" +msgstr "Servisa piegādātāji priekš" + +msgid "login" +msgstr "pieslēgties" + +msgid "(name not specified)" +msgstr "(vārds nav norādīts)" + +msgid "Consent Updated" +msgstr "Uzlabotie noteikumi" + +msgid "Consent status" +msgstr "Noteikumu statuss" + +msgid "(no description)" +msgstr "(nav apraksta)" + +msgid "attributes" +msgstr "atribūti" + +msgid "" +"

How to delete your consent

" +"Uncheck the box corresponding to the service provider\n" +"

Links

" +"" +msgstr "" +"

Kā dzēst noteikumus

Izņemiet ķeksīti pie atbilstošā servisa " +"piegādātāja

Saites

" + +msgid "Consent Removed" +msgstr "Noņemtie noteikumi" + +msgid "show/hide attributes" +msgstr "rādīšanas/slēpšanas atribūti" + +msgid "Organisation" +msgstr "Organizācija" + diff --git a/.extlib/simplesamlphp/modules/consentAdmin/locales/nb/LC_MESSAGES/consentAdmin.po b/.extlib/simplesamlphp/modules/consentAdmin/locales/nb/LC_MESSAGES/consentAdmin.po new file mode 100644 index 000000000..af2c8a30d --- /dev/null +++ b/.extlib/simplesamlphp/modules/consentAdmin/locales/nb/LC_MESSAGES/consentAdmin.po @@ -0,0 +1,156 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: nb_NO\n" +"Language-Team: \n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "{consentAdmin:consentadmin:status_header}" +msgstr "Samtykke status" + +msgid "{consentAdmin:consentadmin:attributes_text}" +msgstr "persondata" + +msgid "{consentAdmin:consentadmin:service_provider_header}" +msgstr "Tjenesteleverandør" + +msgid "{consentAdmin:consentadmin:removed}" +msgstr "Samtykke trukket tilbake" + +msgid "{consentAdmin:consentadmin:show}" +msgstr "Vis" + +msgid "{consentAdmin:consentadmin:attribute_org}" +msgstr "Organisasjon" + +msgid "{consentAdmin:consentadmin:attribute_injected}" +msgstr "Persondata lagt til" + +msgid "{consentAdmin:consentadmin:show_hide_attributes}" +msgstr "vis/skjul persondata" + +msgid "{consentAdmin:consentadmin:consentadmin_purpose}" +msgstr "Hensikten med denne tjenesten er" + +msgid "{consentAdmin:consentadmin:hide}" +msgstr "Skjul" + +msgid "{consentAdmin:consentadmin:sp_empty_description}" +msgstr "(ingen beskrivelse)" + +msgid "{consentAdmin:consentadmin:service_providers_for}" +msgstr "Tjenesteleverandører for" + +msgid "{consentAdmin:consentadmin:consentadmin_description2}" +msgstr "" +"

Hvordan trekke samtykke tilbake

Fjern haken i boksen for gitte " +"tjenestetilbyder

Lenker

" + +msgid "{consentAdmin:consentadmin:login}" +msgstr "login" + +msgid "{consentAdmin:consentadmin:consentadmin_description1}" +msgstr "Her kan du se og endre dine samtykker for tjenester." + +msgid "{consentAdmin:consentadmin:updated}" +msgstr "Samtykke oppdatert" + +msgid "{consentAdmin:consentadmin:unknown}" +msgstr "Ukjent..." + +msgid "{consentAdmin:consentadmin:added}" +msgstr "Samtykke gitt" + +msgid "{consentAdmin:consentadmin:attribute_id}" +msgstr "Identitet" + +msgid "Injected attribute" +msgstr "Persondata lagt til" + +msgid "Show" +msgstr "Vis" + +msgid "Consent Added" +msgstr "Samtykke gitt" + +msgid "Consent Administration" +msgstr "Samtykkeadministrasjon" + +msgid "Here you can view and edit your consent for the Service Providers." +msgstr "Her kan du se og endre dine samtykker for tjenester." + +msgid "Unknown ..." +msgstr "Ukjent..." + +msgid "Identity" +msgstr "Identitet" + +msgid "The purpose of the service is" +msgstr "Hensikten med denne tjenesten er" + +msgid "Hide" +msgstr "Skjul" + +msgid "Service Provider" +msgstr "Tjenesteleverandør" + +msgid "Service Providers for" +msgstr "Tjenesteleverandører for" + +msgid "login" +msgstr "login" + +msgid "(name not specified)" +msgstr "(navn ikke spesifisert)" + +msgid "Consent Updated" +msgstr "Samtykke oppdatert" + +msgid "Consent status" +msgstr "Samtykke status" + +msgid "(no description)" +msgstr "(ingen beskrivelse)" + +msgid "attributes" +msgstr "persondata" + +msgid "" +"

How to delete your consent

" +"Uncheck the box corresponding to the service provider\n" +"

Links

" +"" +msgstr "" +"

Hvordan trekke samtykke tilbake

Fjern haken i boksen for gitte " +"tjenestetilbyder

Lenker

" + +msgid "Consent Removed" +msgstr "Samtykke trukket tilbake" + +msgid "show/hide attributes" +msgstr "vis/skjul persondata" + +msgid "Organisation" +msgstr "Organisasjon" + +msgid "Consent administration" +msgstr "Samtykke administrasjon" diff --git a/.extlib/simplesamlphp/modules/consentAdmin/locales/nl/LC_MESSAGES/consentAdmin.po b/.extlib/simplesamlphp/modules/consentAdmin/locales/nl/LC_MESSAGES/consentAdmin.po new file mode 100644 index 000000000..adb624a0a --- /dev/null +++ b/.extlib/simplesamlphp/modules/consentAdmin/locales/nl/LC_MESSAGES/consentAdmin.po @@ -0,0 +1,158 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: nl\n" +"Language-Team: \n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "{consentAdmin:consentadmin:status_header}" +msgstr "Toestemming Status" + +msgid "{consentAdmin:consentadmin:attributes_text}" +msgstr "attributen" + +msgid "{consentAdmin:consentadmin:service_provider_header}" +msgstr "Service Provider" + +msgid "{consentAdmin:consentadmin:removed}" +msgstr "Toestemming Verwijderd" + +msgid "{consentAdmin:consentadmin:show}" +msgstr "Bekijk" + +msgid "{consentAdmin:consentadmin:attribute_org}" +msgstr "Organisatie" + +msgid "{consentAdmin:consentadmin:attribute_injected}" +msgstr "Geïnjecteerd attibuut" + +msgid "{consentAdmin:consentadmin:show_hide_attributes}" +msgstr "bekijk/verberg attributen" + +msgid "{consentAdmin:consentadmin:consentadmin_purpose}" +msgstr "Het nut van de server is" + +msgid "{consentAdmin:consentadmin:hide}" +msgstr "Verberg" + +msgid "{consentAdmin:consentadmin:sp_empty_description}" +msgstr "(geen omschrijving)" + +msgid "{consentAdmin:consentadmin:service_providers_for}" +msgstr "Service Providers voor" + +msgid "{consentAdmin:consentadmin:consentadmin_description2}" +msgstr "" +"

Hoe verwijdert u toestemmingen

Vinkt u het vakje af dat " +"overeenkomt met de dienstverlener

Links

" + +msgid "{consentAdmin:consentadmin:login}" +msgstr "login" + +msgid "{consentAdmin:consentadmin:consentadmin_description1}" +msgstr "" +"Hier kunt u uw verleende toestemmingen voor dienstverleners bekijken en " +"bewerken." + +msgid "{consentAdmin:consentadmin:updated}" +msgstr "Toestemming Bijgewerkt" + +msgid "{consentAdmin:consentadmin:unknown}" +msgstr "Onbekend..." + +msgid "{consentAdmin:consentadmin:added}" +msgstr "Toestemming Toegevoegd" + +msgid "{consentAdmin:consentadmin:attribute_id}" +msgstr "Identiteit" + +msgid "Injected attribute" +msgstr "Geïnjecteerd attibuut" + +msgid "Show" +msgstr "Bekijk" + +msgid "Consent Added" +msgstr "Toestemming Toegevoegd" + +msgid "Consent Administration" +msgstr "Toestemming Beheer" + +msgid "Here you can view and edit your consent for the Service Providers." +msgstr "" +"Hier kunt u uw verleende toestemmingen voor dienstverleners bekijken en " +"bewerken." + +msgid "Unknown ..." +msgstr "Onbekend..." + +msgid "Identity" +msgstr "Identiteit" + +msgid "The purpose of the service is" +msgstr "Het nut van de server is" + +msgid "Hide" +msgstr "Verberg" + +msgid "Service Provider" +msgstr "Service Provider" + +msgid "Service Providers for" +msgstr "Service Providers voor" + +msgid "login" +msgstr "login" + +msgid "(name not specified)" +msgstr "(naam niet opgegeven)" + +msgid "Consent Updated" +msgstr "Toestemming Bijgewerkt" + +msgid "Consent status" +msgstr "Toestemming Status" + +msgid "(no description)" +msgstr "(geen omschrijving)" + +msgid "attributes" +msgstr "attributen" + +msgid "" +"

How to delete your consent

" +"Uncheck the box corresponding to the service provider\n" +"

Links

" +"" +msgstr "" +"

Hoe verwijderdt u toestemmingen

Vinkt u het vakje af dat " +"overeenkomt met de dienstverlener

Links

" + +msgid "Consent Removed" +msgstr "Toestemming Verwijderd" + +msgid "show/hide attributes" +msgstr "bekijk/verberg attributen" + +msgid "Organisation" +msgstr "Organisatie" + diff --git a/.extlib/simplesamlphp/modules/consentAdmin/locales/nn/LC_MESSAGES/consentAdmin.po b/.extlib/simplesamlphp/modules/consentAdmin/locales/nn/LC_MESSAGES/consentAdmin.po new file mode 100644 index 000000000..c3453d3f0 --- /dev/null +++ b/.extlib/simplesamlphp/modules/consentAdmin/locales/nn/LC_MESSAGES/consentAdmin.po @@ -0,0 +1,156 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: nn\n" +"Language-Team: \n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "{consentAdmin:consentadmin:status_header}" +msgstr "Samtykkestatus" + +msgid "{consentAdmin:consentadmin:attributes_text}" +msgstr "persondata" + +msgid "{consentAdmin:consentadmin:service_provider_header}" +msgstr "Tenesteleverandør" + +msgid "{consentAdmin:consentadmin:removed}" +msgstr "Samtykke trukke tilbake" + +msgid "{consentAdmin:consentadmin:show}" +msgstr "Vis" + +msgid "{consentAdmin:consentadmin:attribute_org}" +msgstr "Organisasjon" + +msgid "{consentAdmin:consentadmin:attribute_injected}" +msgstr "Persondata lagt til" + +msgid "{consentAdmin:consentadmin:show_hide_attributes}" +msgstr "vis/skjul personinformasjon" + +msgid "{consentAdmin:consentadmin:consentadmin_purpose}" +msgstr "Formålet med tenesta er" + +msgid "{consentAdmin:consentadmin:hide}" +msgstr "Skjul" + +msgid "{consentAdmin:consentadmin:sp_empty_description}" +msgstr "(mangler informasjon)" + +msgid "{consentAdmin:consentadmin:service_providers_for}" +msgstr "Tenesteleverandør for " + +msgid "{consentAdmin:consentadmin:consentadmin_description2}" +msgstr "" +"

Korleis dra tilbake samtykke

Fjern haka i boksen for enkelte " +"tenester

Lenker

" + +msgid "{consentAdmin:consentadmin:login}" +msgstr "logg inn" + +msgid "{consentAdmin:consentadmin:consentadmin_description1}" +msgstr "Her kan du sjå og endra dine samtykke til tenestene." + +msgid "{consentAdmin:consentadmin:updated}" +msgstr "Samtykke oppdatert" + +msgid "{consentAdmin:consentadmin:unknown}" +msgstr "Ukjent..." + +msgid "{consentAdmin:consentadmin:added}" +msgstr "Samtykke lagt til" + +msgid "{consentAdmin:consentadmin:attribute_id}" +msgstr "Identitet" + +msgid "Injected attribute" +msgstr "Persondata lagt til" + +msgid "Show" +msgstr "Vis" + +msgid "Consent Added" +msgstr "Samtykke lagt til" + +msgid "Consent Administration" +msgstr "Samtykkeadministrasjon" + +msgid "Here you can view and edit your consent for the Service Providers." +msgstr "Her kan du sjå og endra dine samtykke til tenestene." + +msgid "Unknown ..." +msgstr "Ukjent..." + +msgid "Identity" +msgstr "Identitet" + +msgid "The purpose of the service is" +msgstr "Formålet med tenesta er" + +msgid "Hide" +msgstr "Skjul" + +msgid "Service Provider" +msgstr "Tenesteleverandør" + +msgid "Service Providers for" +msgstr "Tenesteleverandør for " + +msgid "login" +msgstr "logg inn" + +msgid "(name not specified)" +msgstr "(namn ikkje spesifisert)" + +msgid "Consent Updated" +msgstr "Samtykke oppdatert" + +msgid "Consent status" +msgstr "Samtykkestatus" + +msgid "(no description)" +msgstr "(mangler informasjon)" + +msgid "attributes" +msgstr "persondata" + +msgid "" +"

How to delete your consent

" +"Uncheck the box corresponding to the service provider\n" +"

Links

" +"" +msgstr "" +"

Korleis dra tilbake samtykke

Fjern haka i boksen for enkelte " +"tenester

Lenker

" + +msgid "Consent Removed" +msgstr "Samtykke trukke tilbake" + +msgid "show/hide attributes" +msgstr "vis/skjul personinformasjon" + +msgid "Organisation" +msgstr "Organisasjon" + +msgid "Consent administration" +msgstr "Samtykke administrasjon" diff --git a/.extlib/simplesamlphp/modules/consentAdmin/locales/pt/LC_MESSAGES/consentAdmin.po b/.extlib/simplesamlphp/modules/consentAdmin/locales/pt/LC_MESSAGES/consentAdmin.po new file mode 100644 index 000000000..ed983bf54 --- /dev/null +++ b/.extlib/simplesamlphp/modules/consentAdmin/locales/pt/LC_MESSAGES/consentAdmin.po @@ -0,0 +1,152 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: pt\n" +"Language-Team: \n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "{consentAdmin:consentadmin:status_header}" +msgstr "Consentimento" + +msgid "{consentAdmin:consentadmin:attributes_text}" +msgstr "atributos" + +msgid "{consentAdmin:consentadmin:service_provider_header}" +msgstr "Fornecedor de Serviço" + +msgid "{consentAdmin:consentadmin:removed}" +msgstr "Consentimento removido" + +msgid "{consentAdmin:consentadmin:show}" +msgstr "Mostrar" + +msgid "{consentAdmin:consentadmin:attribute_org}" +msgstr "Organização" + +msgid "{consentAdmin:consentadmin:attribute_injected}" +msgstr "Atributo injectado" + +msgid "{consentAdmin:consentadmin:show_hide_attributes}" +msgstr "mostrar/esconder atributos" + +msgid "{consentAdmin:consentadmin:consentadmin_purpose}" +msgstr "Este serviço destina-se a" + +msgid "{consentAdmin:consentadmin:hide}" +msgstr "Esconder" + +msgid "{consentAdmin:consentadmin:sp_empty_description}" +msgstr "(sem descrição)" + +msgid "{consentAdmin:consentadmin:service_providers_for}" +msgstr "Fornecedores de Serviços para" + +msgid "{consentAdmin:consentadmin:consentadmin_description2}" +msgstr "" +"

Como remover o seu consentimento

Retire a marca correspondente " +"ao fornecedor de serviço que pretende remover." + +msgid "{consentAdmin:consentadmin:login}" +msgstr "Entrar" + +msgid "{consentAdmin:consentadmin:consentadmin_description1}" +msgstr "" +"Nesta página pode ver e editar o seu consentimento dado aos Fornecedores " +"de Serviços." + +msgid "{consentAdmin:consentadmin:updated}" +msgstr "Consentimento actualizado" + +msgid "{consentAdmin:consentadmin:unknown}" +msgstr "Desconhecido ..." + +msgid "{consentAdmin:consentadmin:added}" +msgstr "Consentimento adicionado" + +msgid "{consentAdmin:consentadmin:attribute_id}" +msgstr "Identidade" + +msgid "Injected attribute" +msgstr "Atributo injectado" + +msgid "Show" +msgstr "Mostrar" + +msgid "Consent Added" +msgstr "Consentimento adicionado" + +msgid "Consent Administration" +msgstr "Administração de Consentimento" + +msgid "Here you can view and edit your consent for the Service Providers." +msgstr "" +"Nesta página pode ver e editar o seu consentimento dado aos Fornecedores " +"de Serviços." + +msgid "Unknown ..." +msgstr "Desconhecido ..." + +msgid "Identity" +msgstr "Identidade" + +msgid "The purpose of the service is" +msgstr "Este serviço destina-se a" + +msgid "Hide" +msgstr "Esconder" + +msgid "Service Provider" +msgstr "Fornecedor de Serviço" + +msgid "Service Providers for" +msgstr "Fornecedores de Serviços para" + +msgid "login" +msgstr "Entrar" + +msgid "(name not specified)" +msgstr "(nome não especificado)" + +msgid "Consent Updated" +msgstr "Consentimento actualizado" + +msgid "Consent status" +msgstr "Consentimento" + +msgid "(no description)" +msgstr "(sem descrição)" + +msgid "attributes" +msgstr "atributos" + +msgid "" +"

How to delete your consent

" +"Uncheck the box corresponding to the service provider\n" +"

Links

" +"" +msgstr "" +"

Como remover o seu consentimento

Retire a marca correspondente " +"ao fornecedor de serviço que pretende remover." + +msgid "Consent Removed" +msgstr "Consentimento removido" + +msgid "show/hide attributes" +msgstr "mostrar/esconder atributos" + +msgid "Organisation" +msgstr "Organização" + diff --git a/.extlib/simplesamlphp/modules/consentAdmin/locales/ro/LC_MESSAGES/consentAdmin.po b/.extlib/simplesamlphp/modules/consentAdmin/locales/ro/LC_MESSAGES/consentAdmin.po new file mode 100644 index 000000000..b651cb28e --- /dev/null +++ b/.extlib/simplesamlphp/modules/consentAdmin/locales/ro/LC_MESSAGES/consentAdmin.po @@ -0,0 +1,157 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: ro\n" +"Language-Team: \n" +"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100" +" < 20)) ? 1 : 2)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "{consentAdmin:consentadmin:status_header}" +msgstr "Stare acord (consimțământ)" + +msgid "{consentAdmin:consentadmin:attributes_text}" +msgstr "atribute" + +msgid "{consentAdmin:consentadmin:service_provider_header}" +msgstr "Furnizor de servicii" + +msgid "{consentAdmin:consentadmin:removed}" +msgstr "Acordul a fost înlăturat" + +msgid "{consentAdmin:consentadmin:show}" +msgstr "Arată" + +msgid "{consentAdmin:consentadmin:attribute_org}" +msgstr "Instituție" + +msgid "{consentAdmin:consentadmin:attribute_injected}" +msgstr "Atribut introdus" + +msgid "{consentAdmin:consentadmin:show_hide_attributes}" +msgstr "arată/ascunde atributele" + +msgid "{consentAdmin:consentadmin:consentadmin_purpose}" +msgstr "Scopul acestui serviciu este" + +msgid "{consentAdmin:consentadmin:hide}" +msgstr "Ascunde" + +msgid "{consentAdmin:consentadmin:sp_empty_description}" +msgstr "(fără descriere)" + +msgid "{consentAdmin:consentadmin:service_providers_for}" +msgstr "Furnizori de servicii pentru" + +msgid "{consentAdmin:consentadmin:consentadmin_description2}" +msgstr "" +"

Cum poate fi anulat acordul dumneavoastră

Debifați căsuța " +"corespunzătoare furnizorului de servicii

Link-uri

" + +msgid "{consentAdmin:consentadmin:login}" +msgstr "autentificare" + +msgid "{consentAdmin:consentadmin:consentadmin_description1}" +msgstr "" +"Aici puteți edita acordul/consimțământul dumneavoastră pentru Furnizorii " +"de servicii." + +msgid "{consentAdmin:consentadmin:updated}" +msgstr "Acordul a fost actualizat" + +msgid "{consentAdmin:consentadmin:unknown}" +msgstr "Necunoscut ..." + +msgid "{consentAdmin:consentadmin:added}" +msgstr "Acordul a fost adăugat" + +msgid "{consentAdmin:consentadmin:attribute_id}" +msgstr "Identitate" + +msgid "Injected attribute" +msgstr "Atribut introdus" + +msgid "Show" +msgstr "Arată" + +msgid "Consent Added" +msgstr "Acordul a fost adăugat" + +msgid "Consent Administration" +msgstr "Administrarea acordurilor (consimțămintelor)" + +msgid "Here you can view and edit your consent for the Service Providers." +msgstr "" +"Aici puteți edita acordul/consimțământul dumneavoastră pentru Furnizorii " +"de servicii." + +msgid "Unknown ..." +msgstr "Necunoscut ..." + +msgid "Identity" +msgstr "Identitate" + +msgid "The purpose of the service is" +msgstr "Scopul acestui serviciu este" + +msgid "Hide" +msgstr "Ascunde" + +msgid "Service Provider" +msgstr "Furnizor de servicii" + +msgid "Service Providers for" +msgstr "Furnizori de servicii pentru" + +msgid "login" +msgstr "autentificare" + +msgid "(name not specified)" +msgstr "(nu a fost specificat numele)" + +msgid "Consent Updated" +msgstr "Acordul a fost actualizat" + +msgid "Consent status" +msgstr "Stare acord (consimțământ)" + +msgid "(no description)" +msgstr "(fără descriere)" + +msgid "attributes" +msgstr "atribute" + +msgid "" +"

How to delete your consent

" +"Uncheck the box corresponding to the service provider\n" +"

Links

" +"" +msgstr "" +"

Cum poate fi anulat acordul dumneavoastră

Debifați căsuța " +"corespunzătoare furnizorului de servicii

Link-uri

" + +msgid "Consent Removed" +msgstr "Acordul a fost înlăturat" + +msgid "show/hide attributes" +msgstr "arată/ascunde atributele" + +msgid "Organisation" +msgstr "Instituție" + diff --git a/.extlib/simplesamlphp/modules/consentAdmin/locales/ru/LC_MESSAGES/consentAdmin.po b/.extlib/simplesamlphp/modules/consentAdmin/locales/ru/LC_MESSAGES/consentAdmin.po new file mode 100644 index 000000000..176299e18 --- /dev/null +++ b/.extlib/simplesamlphp/modules/consentAdmin/locales/ru/LC_MESSAGES/consentAdmin.po @@ -0,0 +1,155 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: ru\n" +"Language-Team: \n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "{consentAdmin:consentadmin:status_header}" +msgstr "Статус согласия" + +msgid "{consentAdmin:consentadmin:attributes_text}" +msgstr "атрибуты" + +msgid "{consentAdmin:consentadmin:service_provider_header}" +msgstr "Сервис провайдер" + +msgid "{consentAdmin:consentadmin:removed}" +msgstr "Согласие отозвано" + +msgid "{consentAdmin:consentadmin:show}" +msgstr "Показать" + +msgid "{consentAdmin:consentadmin:attribute_org}" +msgstr "Организация" + +msgid "{consentAdmin:consentadmin:attribute_injected}" +msgstr "Введенный атрибут" + +msgid "{consentAdmin:consentadmin:show_hide_attributes}" +msgstr "Показать/скрыть атрибуты" + +msgid "{consentAdmin:consentadmin:consentadmin_purpose}" +msgstr "Целью сервиса является" + +msgid "{consentAdmin:consentadmin:hide}" +msgstr "Скрыть" + +msgid "{consentAdmin:consentadmin:sp_empty_description}" +msgstr "(описание отсутствует)" + +msgid "{consentAdmin:consentadmin:service_providers_for}" +msgstr "Сервис провайдеры для" + +msgid "{consentAdmin:consentadmin:consentadmin_description2}" +msgstr "" +"

Как удалить ваше согласие

Снимите выделение с сервис провайдера " +"

Ссылки

" + +msgid "{consentAdmin:consentadmin:login}" +msgstr "Вход" + +msgid "{consentAdmin:consentadmin:consentadmin_description1}" +msgstr "" +"В этом поле можно просмотреть и отредактировать текст вашего согласия для" +" сервис провайдеров." + +msgid "{consentAdmin:consentadmin:updated}" +msgstr "Согласие обновлено" + +msgid "{consentAdmin:consentadmin:unknown}" +msgstr "Неизвестно.." + +msgid "{consentAdmin:consentadmin:added}" +msgstr "Согласие добавлено" + +msgid "{consentAdmin:consentadmin:attribute_id}" +msgstr "Идентификационная информация" + +msgid "Injected attribute" +msgstr "Введенный атрибут" + +msgid "Show" +msgstr "Показать" + +msgid "Consent Added" +msgstr "Согласие добавлено" + +msgid "Consent Administration" +msgstr "Управление согласием" + +msgid "Here you can view and edit your consent for the Service Providers." +msgstr "" +"В этом поле можно просмотреть и отредактировать текст вашего согласия для" +" сервис провайдеров." + +msgid "Unknown ..." +msgstr "Неизвестно.." + +msgid "Identity" +msgstr "Идентификационная информация" + +msgid "The purpose of the service is" +msgstr "Целью сервиса является" + +msgid "Hide" +msgstr "Скрыть" + +msgid "Service Provider" +msgstr "Сервис провайдер" + +msgid "Service Providers for" +msgstr "Сервис провайдеры для" + +msgid "login" +msgstr "Вход" + +msgid "(name not specified)" +msgstr "(имя не указано)" + +msgid "Consent Updated" +msgstr "Согласие обновлено" + +msgid "Consent status" +msgstr "Статус согласия" + +msgid "(no description)" +msgstr "(описание отсутствует)" + +msgid "attributes" +msgstr "атрибуты" + +msgid "" +"

How to delete your consent

" +"Uncheck the box corresponding to the service provider\n" +"

Links

" +"" +msgstr "" +"

Как удалить ваше согласие

Снимите выделение с сервис провайдера " +"

Ссылки

" + +msgid "Consent Removed" +msgstr "Согласие отозвано" + +msgid "show/hide attributes" +msgstr "Показать/скрыть атрибуты" + +msgid "Organisation" +msgstr "Организация" + diff --git a/.extlib/simplesamlphp/modules/consentAdmin/locales/sl/LC_MESSAGES/consentAdmin.po b/.extlib/simplesamlphp/modules/consentAdmin/locales/sl/LC_MESSAGES/consentAdmin.po new file mode 100644 index 000000000..a4f99cd0c --- /dev/null +++ b/.extlib/simplesamlphp/modules/consentAdmin/locales/sl/LC_MESSAGES/consentAdmin.po @@ -0,0 +1,153 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: sl\n" +"Language-Team: \n" +"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 " +"|| n%100==4 ? 2 : 3)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "{consentAdmin:consentadmin:status_header}" +msgstr "Status privolitve" + +msgid "{consentAdmin:consentadmin:attributes_text}" +msgstr "atributi" + +msgid "{consentAdmin:consentadmin:service_provider_header}" +msgstr "Ponudnik storitve" + +msgid "{consentAdmin:consentadmin:removed}" +msgstr "Privolitev razveljavljena" + +msgid "{consentAdmin:consentadmin:show}" +msgstr "Prikaži" + +msgid "{consentAdmin:consentadmin:attribute_org}" +msgstr "Organizacija" + +msgid "{consentAdmin:consentadmin:attribute_injected}" +msgstr "Vrinjen atribut" + +msgid "{consentAdmin:consentadmin:show_hide_attributes}" +msgstr "Prikaži/Skrij atribute" + +msgid "{consentAdmin:consentadmin:consentadmin_purpose}" +msgstr "Namen storitve: " + +msgid "{consentAdmin:consentadmin:hide}" +msgstr "Skrij" + +msgid "{consentAdmin:consentadmin:sp_empty_description}" +msgstr "(brez opisa)" + +msgid "{consentAdmin:consentadmin:service_providers_for}" +msgstr "Ponudniki storitev za" + +msgid "{consentAdmin:consentadmin:consentadmin_description2}" +msgstr "" +"

Kako razveljavim dano privolitev?

Odstranite kljukico pred " +"SPjem, za katerega želite razveljaviti dano privolitev

Povezave

" +"" + +msgid "{consentAdmin:consentadmin:login}" +msgstr "Prijava" + +msgid "{consentAdmin:consentadmin:consentadmin_description1}" +msgstr "Pregled in urejanje privolitev za posamezen SP." + +msgid "{consentAdmin:consentadmin:updated}" +msgstr "Privolitev posodobljena" + +msgid "{consentAdmin:consentadmin:unknown}" +msgstr "Neznan..." + +msgid "{consentAdmin:consentadmin:added}" +msgstr "Privolitev dodana" + +msgid "{consentAdmin:consentadmin:attribute_id}" +msgstr "Identiteta" + +msgid "Injected attribute" +msgstr "Vrinjen atribut" + +msgid "Show" +msgstr "Prikaži" + +msgid "Consent Added" +msgstr "Privolitev dodana" + +msgid "Consent Administration" +msgstr "Upravljanje s privolitvami" + +msgid "Here you can view and edit your consent for the Service Providers." +msgstr "Pregled in urejanje privolitev za posamezen SP." + +msgid "Unknown ..." +msgstr "Neznan..." + +msgid "Identity" +msgstr "Identiteta" + +msgid "The purpose of the service is" +msgstr "Namen storitve: " + +msgid "Hide" +msgstr "Skrij" + +msgid "Service Provider" +msgstr "Ponudnik storitve" + +msgid "Service Providers for" +msgstr "Ponudniki storitev za" + +msgid "login" +msgstr "Prijava" + +msgid "(name not specified)" +msgstr "(brez naziva)" + +msgid "Consent Updated" +msgstr "Privolitev posodobljena" + +msgid "Consent status" +msgstr "Status privolitve" + +msgid "(no description)" +msgstr "(brez opisa)" + +msgid "attributes" +msgstr "atributi" + +msgid "" +"

How to delete your consent

" +"Uncheck the box corresponding to the service provider\n" +"

Links

" +"" +msgstr "" +"

Kako razveljavim dano privolitev?

Odstranite kljukico pred " +"SPjem, za katerega želite razveljaviti dano privolitev

Povezave

" +"" + +msgid "Consent Removed" +msgstr "Privolitev razveljavljena" + +msgid "show/hide attributes" +msgstr "Prikaži/Skrij atribute" + +msgid "Organisation" +msgstr "Organizacija" + diff --git a/.extlib/simplesamlphp/modules/consentAdmin/locales/sr/LC_MESSAGES/consentAdmin.po b/.extlib/simplesamlphp/modules/consentAdmin/locales/sr/LC_MESSAGES/consentAdmin.po new file mode 100644 index 000000000..0ce9332fe --- /dev/null +++ b/.extlib/simplesamlphp/modules/consentAdmin/locales/sr/LC_MESSAGES/consentAdmin.po @@ -0,0 +1,155 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: sr\n" +"Language-Team: \n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "{consentAdmin:consentadmin:status_header}" +msgstr "Stanje dozvole" + +msgid "{consentAdmin:consentadmin:attributes_text}" +msgstr "atributi" + +msgid "{consentAdmin:consentadmin:service_provider_header}" +msgstr "Davalac Servisa" + +msgid "{consentAdmin:consentadmin:removed}" +msgstr "Dozvola uklonjena" + +msgid "{consentAdmin:consentadmin:show}" +msgstr "Prikaži" + +msgid "{consentAdmin:consentadmin:attribute_org}" +msgstr "Institucija" + +msgid "{consentAdmin:consentadmin:attribute_injected}" +msgstr "Ubačeni atribut" + +msgid "{consentAdmin:consentadmin:show_hide_attributes}" +msgstr "prikaži/sakrij atribute" + +msgid "{consentAdmin:consentadmin:consentadmin_purpose}" +msgstr "Namena ovog servisa je" + +msgid "{consentAdmin:consentadmin:hide}" +msgstr "Sakrij" + +msgid "{consentAdmin:consentadmin:sp_empty_description}" +msgstr "(nema opisa)" + +msgid "{consentAdmin:consentadmin:service_providers_for}" +msgstr "Davaoci Servisa za" + +msgid "{consentAdmin:consentadmin:consentadmin_description2}" +msgstr "" +"

Kako obrisati dozvolu

Uklonite kvačicu iz polja koje se odnosi " +"na davaoca servisa

Linkovi

" + +msgid "{consentAdmin:consentadmin:login}" +msgstr "Prijavi se" + +msgid "{consentAdmin:consentadmin:consentadmin_description1}" +msgstr "Ovde možete pregledati i menjati vaše dozvole davaocima servisa." + +msgid "{consentAdmin:consentadmin:updated}" +msgstr "Dozvola ažurirana" + +msgid "{consentAdmin:consentadmin:unknown}" +msgstr "Nepoznato ..." + +msgid "{consentAdmin:consentadmin:added}" +msgstr "Dozvola dodata" + +msgid "{consentAdmin:consentadmin:attribute_id}" +msgstr "Identitet" + +msgid "Injected attribute" +msgstr "Ubačeni atribut" + +msgid "Show" +msgstr "Prikaži" + +msgid "Consent Added" +msgstr "Dozvola dodata" + +msgid "Consent Administration" +msgstr "Administracija dozvola" + +msgid "Here you can view and edit your consent for the Service Providers." +msgstr "Ovde možete pregledati i menjati vaše dozvole davaocima servisa." + +msgid "Unknown ..." +msgstr "Nepoznato ..." + +msgid "Identity" +msgstr "Identitet" + +msgid "The purpose of the service is" +msgstr "Namena ovog servisa je" + +msgid "Hide" +msgstr "Sakrij" + +msgid "Service Provider" +msgstr "Davalac Servisa" + +msgid "Service Providers for" +msgstr "Davaoci Servisa za" + +msgid "login" +msgstr "Prijavi se" + +msgid "(name not specified)" +msgstr "(ime nije specificirano)" + +msgid "Consent Updated" +msgstr "Dozvola ažurirana" + +msgid "Consent status" +msgstr "Stanje dozvole" + +msgid "(no description)" +msgstr "(nema opisa)" + +msgid "attributes" +msgstr "atributi" + +msgid "" +"

How to delete your consent

" +"Uncheck the box corresponding to the service provider\n" +"

Links

" +"" +msgstr "" +"

Kako obrisati dozvolu

Uklonite kvačicu iz polja koje se odnosi " +"na davaoca servisa

Linkovi

" + +msgid "Consent Removed" +msgstr "Dozvola uklonjena" + +msgid "show/hide attributes" +msgstr "prikaži/sakrij atribute" + +msgid "Organisation" +msgstr "Institucija" + diff --git a/.extlib/simplesamlphp/modules/consentAdmin/locales/sv/LC_MESSAGES/consentAdmin.po b/.extlib/simplesamlphp/modules/consentAdmin/locales/sv/LC_MESSAGES/consentAdmin.po new file mode 100644 index 000000000..1418df6a8 --- /dev/null +++ b/.extlib/simplesamlphp/modules/consentAdmin/locales/sv/LC_MESSAGES/consentAdmin.po @@ -0,0 +1,154 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: sv\n" +"Language-Team: \n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "{consentAdmin:consentadmin:status_header}" +msgstr "Samtyckesstatus" + +msgid "{consentAdmin:consentadmin:attributes_text}" +msgstr "attribut" + +msgid "{consentAdmin:consentadmin:service_provider_header}" +msgstr "Tjänsteleverantör" + +msgid "{consentAdmin:consentadmin:removed}" +msgstr "Samtycke borttaget" + +msgid "{consentAdmin:consentadmin:show}" +msgstr "Visa" + +msgid "{consentAdmin:consentadmin:attribute_org}" +msgstr "Organisation" + +msgid "{consentAdmin:consentadmin:attribute_injected}" +msgstr "Tillfört attribut" + +msgid "{consentAdmin:consentadmin:show_hide_attributes}" +msgstr "visa/göm attribut" + +msgid "{consentAdmin:consentadmin:consentadmin_purpose}" +msgstr "Systet med tjänsten är" + +msgid "{consentAdmin:consentadmin:hide}" +msgstr "Göm" + +msgid "{consentAdmin:consentadmin:sp_empty_description}" +msgstr "(ingen beskrivning)" + +msgid "{consentAdmin:consentadmin:service_providers_for}" +msgstr "Tjänsteleverantörer för" + +msgid "{consentAdmin:consentadmin:consentadmin_description2}" +msgstr "" +"

Hur du tar bort ditt samtycke

Ta bort markeringen i rutan " +"kopplad till tjänsteleverantören

Länkar

" + +msgid "{consentAdmin:consentadmin:login}" +msgstr "Logga in" + +msgid "{consentAdmin:consentadmin:consentadmin_description1}" +msgstr "Här kan du se och ändra dina samtycken för olika tjänsteleverantörer." + +msgid "{consentAdmin:consentadmin:updated}" +msgstr "Samtycke uppdaterat" + +msgid "{consentAdmin:consentadmin:unknown}" +msgstr "Okänd..." + +msgid "{consentAdmin:consentadmin:added}" +msgstr "Samtycke tillagt" + +msgid "{consentAdmin:consentadmin:attribute_id}" +msgstr "Identitet" + +msgid "Injected attribute" +msgstr "Tillfört attribut" + +msgid "Show" +msgstr "Visa" + +msgid "Consent Added" +msgstr "Samtycke tillagt" + +msgid "Consent Administration" +msgstr "Samtyckesadministration" + +msgid "Here you can view and edit your consent for the Service Providers." +msgstr "Här kan du se och ändra dina samtycken för olika tjänsteleverantörer." + +msgid "Unknown ..." +msgstr "Okänd..." + +msgid "Identity" +msgstr "Identitet" + +msgid "The purpose of the service is" +msgstr "Systet med tjänsten är" + +msgid "Hide" +msgstr "Göm" + +msgid "Service Provider" +msgstr "Tjänsteleverantör" + +msgid "Service Providers for" +msgstr "Tjänsteleverantörer för" + +msgid "login" +msgstr "Logga in" + +msgid "(name not specified)" +msgstr "(namn ej angivet)" + +msgid "Consent Updated" +msgstr "Samtycke uppdaterat" + +msgid "Consent status" +msgstr "Samtyckesstatus" + +msgid "(no description)" +msgstr "(ingen beskrivning)" + +msgid "attributes" +msgstr "attribut" + +msgid "" +"

How to delete your consent

" +"Uncheck the box corresponding to the service provider\n" +"

Links

" +"" +msgstr "" +"

Hur du tar bort ditt samtycke

Ta bort markeringen i rutan " +"kopplad till tjänsteleverantören

Länkar

" + +msgid "Consent Removed" +msgstr "Samtycke borttaget" + +msgid "show/hide attributes" +msgstr "visa/göm attribut" + +msgid "Organisation" +msgstr "Organisation" + diff --git a/.extlib/simplesamlphp/modules/consentAdmin/locales/zh-tw/LC_MESSAGES/consentAdmin.po b/.extlib/simplesamlphp/modules/consentAdmin/locales/zh-tw/LC_MESSAGES/consentAdmin.po new file mode 100644 index 000000000..ddbef9e56 --- /dev/null +++ b/.extlib/simplesamlphp/modules/consentAdmin/locales/zh-tw/LC_MESSAGES/consentAdmin.po @@ -0,0 +1,152 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: zh_Hant_TW\n" +"Language-Team: \n" +"Plural-Forms: nplurals=1; plural=0\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "{consentAdmin:consentadmin:status_header}" +msgstr "許可狀態" + +msgid "{consentAdmin:consentadmin:attributes_text}" +msgstr "屬性" + +msgid "{consentAdmin:consentadmin:service_provider_header}" +msgstr "服務提供者" + +msgid "{consentAdmin:consentadmin:removed}" +msgstr "同意移除" + +msgid "{consentAdmin:consentadmin:show}" +msgstr "顯示" + +msgid "{consentAdmin:consentadmin:attribute_org}" +msgstr "組織" + +msgid "{consentAdmin:consentadmin:attribute_injected}" +msgstr "加入屬性" + +msgid "{consentAdmin:consentadmin:show_hide_attributes}" +msgstr "顯示/隱藏屬性" + +msgid "{consentAdmin:consentadmin:consentadmin_purpose}" +msgstr "此項服務的目的為" + +msgid "{consentAdmin:consentadmin:hide}" +msgstr "隱藏" + +msgid "{consentAdmin:consentadmin:sp_empty_description}" +msgstr "(無描述)" + +msgid "{consentAdmin:consentadmin:service_providers_for}" +msgstr "服務提供者的" + +msgid "{consentAdmin:consentadmin:consentadmin_description2}" +msgstr "" +"

在這刪除您的授權

取消勾選服務提供者對應的核取方塊

連結

" + +msgid "{consentAdmin:consentadmin:login}" +msgstr "登入" + +msgid "{consentAdmin:consentadmin:consentadmin_description1}" +msgstr "這邊可以檢視及修改您同意的服務提供者。" + +msgid "{consentAdmin:consentadmin:updated}" +msgstr "同意更新" + +msgid "{consentAdmin:consentadmin:unknown}" +msgstr "未知..." + +msgid "{consentAdmin:consentadmin:added}" +msgstr "同意新增" + +msgid "{consentAdmin:consentadmin:attribute_id}" +msgstr "身分" + +msgid "Injected attribute" +msgstr "加入屬性" + +msgid "Show" +msgstr "顯示" + +msgid "Consent Added" +msgstr "同意新增" + +msgid "Consent Administration" +msgstr "管轄許可" + +msgid "Here you can view and edit your consent for the Service Providers." +msgstr "這邊可以檢視及修改您同意的服務提供者。" + +msgid "Unknown ..." +msgstr "未知..." + +msgid "Identity" +msgstr "身分" + +msgid "The purpose of the service is" +msgstr "此項服務的目的為" + +msgid "Hide" +msgstr "隱藏" + +msgid "Service Provider" +msgstr "服務提供者" + +msgid "Service Providers for" +msgstr "服務提供者的" + +msgid "login" +msgstr "登入" + +msgid "(name not specified)" +msgstr "(未定義名稱)" + +msgid "Consent Updated" +msgstr "同意更新" + +msgid "Consent status" +msgstr "許可狀態" + +msgid "(no description)" +msgstr "(無描述)" + +msgid "attributes" +msgstr "屬性" + +msgid "" +"

How to delete your consent

" +"Uncheck the box corresponding to the service provider\n" +"

Links

" +"" +msgstr "" +"

在這刪除您的授權

取消勾選服務提供者對應的核取方塊

連結

" + +msgid "Consent Removed" +msgstr "同意移除" + +msgid "show/hide attributes" +msgstr "顯示/隱藏屬性" + +msgid "Organisation" +msgstr "組織" + diff --git a/.extlib/simplesamlphp/modules/consentAdmin/locales/zh/LC_MESSAGES/consentAdmin.po b/.extlib/simplesamlphp/modules/consentAdmin/locales/zh/LC_MESSAGES/consentAdmin.po new file mode 100644 index 000000000..70e3225c2 --- /dev/null +++ b/.extlib/simplesamlphp/modules/consentAdmin/locales/zh/LC_MESSAGES/consentAdmin.po @@ -0,0 +1,152 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: zh\n" +"Language-Team: \n" +"Plural-Forms: nplurals=1; plural=0\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "{consentAdmin:consentadmin:status_header}" +msgstr "许可状态" + +msgid "{consentAdmin:consentadmin:attributes_text}" +msgstr "属性" + +msgid "{consentAdmin:consentadmin:service_provider_header}" +msgstr "服务提供商" + +msgid "{consentAdmin:consentadmin:removed}" +msgstr "已经移除的许可" + +msgid "{consentAdmin:consentadmin:show}" +msgstr "显示" + +msgid "{consentAdmin:consentadmin:attribute_org}" +msgstr "组织" + +msgid "{consentAdmin:consentadmin:attribute_injected}" +msgstr "注入的属性" + +msgid "{consentAdmin:consentadmin:show_hide_attributes}" +msgstr "显示/隐藏属性" + +msgid "{consentAdmin:consentadmin:consentadmin_purpose}" +msgstr "该服务的用途" + +msgid "{consentAdmin:consentadmin:hide}" +msgstr "隐藏" + +msgid "{consentAdmin:consentadmin:sp_empty_description}" +msgstr "(没有描述)" + +msgid "{consentAdmin:consentadmin:service_providers_for}" +msgstr "服务提供商服务于" + +msgid "{consentAdmin:consentadmin:consentadmin_description2}" +msgstr "" +"

如何删除你的许可

反选相应的SP选择框

Links

" + +msgid "{consentAdmin:consentadmin:login}" +msgstr "登陆" + +msgid "{consentAdmin:consentadmin:consentadmin_description1}" +msgstr "在这里你可以查看和编辑你的SP许可" + +msgid "{consentAdmin:consentadmin:updated}" +msgstr "已经更新的许可" + +msgid "{consentAdmin:consentadmin:unknown}" +msgstr "未知..." + +msgid "{consentAdmin:consentadmin:added}" +msgstr "已经添加的许可" + +msgid "{consentAdmin:consentadmin:attribute_id}" +msgstr "身份" + +msgid "Injected attribute" +msgstr "注入的属性" + +msgid "Show" +msgstr "显示" + +msgid "Consent Added" +msgstr "已经添加的许可" + +msgid "Consent Administration" +msgstr "管理员许可" + +msgid "Here you can view and edit your consent for the Service Providers." +msgstr "在这里你可以查看和编辑你的SP许可" + +msgid "Unknown ..." +msgstr "未知..." + +msgid "Identity" +msgstr "身份" + +msgid "The purpose of the service is" +msgstr "该服务的用途" + +msgid "Hide" +msgstr "隐藏" + +msgid "Service Provider" +msgstr "服务提供商" + +msgid "Service Providers for" +msgstr "服务提供商服务于" + +msgid "login" +msgstr "登陆" + +msgid "(name not specified)" +msgstr "(没有指定名字)" + +msgid "Consent Updated" +msgstr "已经更新的许可" + +msgid "Consent status" +msgstr "许可状态" + +msgid "(no description)" +msgstr "(没有描述)" + +msgid "attributes" +msgstr "属性" + +msgid "" +"

How to delete your consent

" +"Uncheck the box corresponding to the service provider\n" +"

Links

" +"" +msgstr "" +"

如何删除你的许可

反选相应的SP选择框

Links

" + +msgid "Consent Removed" +msgstr "已经移除的许可" + +msgid "show/hide attributes" +msgstr "显示/隐藏属性" + +msgid "Organisation" +msgstr "组织" + diff --git a/.extlib/simplesamlphp/modules/consentAdmin/public/assets/css/consentAdmin.css b/.extlib/simplesamlphp/modules/consentAdmin/public/assets/css/consentAdmin.css new file mode 100644 index 000000000..219306bc4 --- /dev/null +++ b/.extlib/simplesamlphp/modules/consentAdmin/public/assets/css/consentAdmin.css @@ -0,0 +1,44 @@ +.ca-sp-name { + font-weight: bold; +} + +td.ca-sp-name { + vertical-align: top; +} + +td.ca-allowed { + vertical-align: top; +} + +tr.row0 td { + background-color: #888; + color: black; +} + +tr.row1 td { + background-color: #aaa; + color: black; +} + +a.orange { + color: #ffd633; +} + +span.show-hide { + font-size: 80%; +} + +a.service-url { + color: black; + font-weight: bold; +} + +span[id^="hiding_"], +span[id*="hiding_"] { + display: none; +} + +div[id^="attributes_"], +div[id*="attributes_"] { + display: none; +} diff --git a/.extlib/simplesamlphp/modules/consentAdmin/public/assets/js/consentAdmin.js b/.extlib/simplesamlphp/modules/consentAdmin/public/assets/js/consentAdmin.js new file mode 100644 index 000000000..44402d0c2 --- /dev/null +++ b/.extlib/simplesamlphp/modules/consentAdmin/public/assets/js/consentAdmin.js @@ -0,0 +1,79 @@ +var xmlHttp; + +function checkConsent() +{ + var show_spid = this.id.charAt(this.id.length - 1); + var checkbox = document.getElementById("checkbox_" + show_spid); + + xmlHttp = GetXmlHttpObject() + if (xmlHttp === null) { + alert("Browser does not support HTTP Request") + return + } + + var url = "consentAdmin.php" + url = url + "?cv=" + checkbox.value + url = url + "&action=" + checkbox.checked + url = url + "&sid=" + Math.random() + + xmlHttp.onreadystatechange = function () { + if (xmlHttp.readyState == 4 || xmlHttp.readyState == "complete") { + document.getElementById("consentText_" + show_spid).innerHTML = xmlHttp.responseText; + } + } + + xmlHttp.open("GET", url, true) + xmlHttp.send(null) +} + +// This function creates an XMLHttpRequest +function GetXmlHttpObject() +{ + var xmlHttp = null; + try { + // Firefox, Opera 8.0+, Safari + xmlHttp = new XMLHttpRequest(); + } catch (e) { + //Internet Explorer + try { + xmlHttp = new ActiveXObject("Msxml2.XMLHTTP"); + } catch (e) { + xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); + } + } + return xmlHttp; +} + +function toggleShowAttributes() +{ + var show_spid = this.id.charAt(this.id.length - 1); + + var disp = document.getElementById('attributes_' + show_spid); + var showing = document.getElementById('showing_' + show_spid); + var hiding = document.getElementById('hiding_' + show_spid); + + disp.style.display = (disp.style.display == 'none' ? 'block' : 'none'); + showing.style.display = (disp.style.display == 'none' ? 'inline' : 'none'); + hiding.style.display = (disp.style.display == 'none' ? 'none' : 'inline'); +} + +document.addEventListener( + 'DOMContentLoaded', + function () { + var show_hide = document.getElementsByClassName("show_hide"); + for (var i = 0; i < show_hide.length; i++) { + show_hide[i].addEventListener( + 'click', + toggleShowAttributes + ); + } + + var checkbox = document.getElementsByClassName("checkbox"); + for (var j = 0; j < checkbox.length; j++) { + checkbox[j].addEventListener( + 'click', + checkConsent + ); + } + } +); diff --git a/.extlib/simplesamlphp/modules/consentAdmin/routing/routes/routes.yml b/.extlib/simplesamlphp/modules/consentAdmin/routing/routes/routes.yml new file mode 100644 index 000000000..5c39acbda --- /dev/null +++ b/.extlib/simplesamlphp/modules/consentAdmin/routing/routes/routes.yml @@ -0,0 +1,9 @@ +consentadmin-main: + path: / + defaults: { _controller: 'SimpleSAML\Module\consentAdmin\Controller\ConsentAdmin::main' } + methods: [GET] + +consentadmin-logout: + path: /logout + defaults: { _controller: 'SimpleSAML\Module\consentAdmin\Controller\ConsentAdmin::logout' } + methods: [GET] diff --git a/.extlib/simplesamlphp/modules/consentAdmin/src/Controller/ConsentAdmin.php b/.extlib/simplesamlphp/modules/consentAdmin/src/Controller/ConsentAdmin.php new file mode 100644 index 000000000..fd19d75c2 --- /dev/null +++ b/.extlib/simplesamlphp/modules/consentAdmin/src/Controller/ConsentAdmin.php @@ -0,0 +1,417 @@ +config = $config; + $this->moduleConfig = Configuration::getConfig('module_consentAdmin.php'); + $this->metadataStorageHandler = MetaDataStorageHandler::getMetadataHandler(); + $this->session = $session; + } + + + /** + * Inject the \SimpleSAML\Module\consent\Store dependency. + * + * @param \SimpleSAML\Module\consent\Store $store + */ + public function setStore(Store $store): void + { + $this->store = $store; + } + + + /** + * Inject the \SimpleSAML\Auth\Simple dependency. + * + * @param \SimpleSAML\Auth\Simple $authSimple + */ + public function setAuthSimple(Auth\Simple $authSimple): void + { + $this->authSimple = $authSimple; + } + + + /** + * Inject the \SimpleSAML\Metadata\MetaDataStorageHandler dependency. + * + * @param \SimpleSAML\Metadata\MetaDataStorageHandler $handler + */ + public function setMetadataStorageHandler(MetadataStorageHandler $handler): void + { + $this->metadataStorageHandler = $handler; + } + + + /** + * Inject the \SimpleSAML\Module\consent\Auth\Process\Consent dependency. + * + * @param \SimpleSAML\Module\consent\Auth\Process\Consent $consent + */ + public function setConsent(Consent $consent): void + { + $this->consent = $consent; + } + + + /** + * @param \Symfony\Component\HttpFoundation\Request $request The current request. + * + * @return void + */ + public function logout(Request $request): void + { + $authority = $this->moduleConfig->getValue('authority'); + $as = new $this->authSimple($authority); + + $returnURL = $this->moduleConfig->getValue('returnURL'); + $as->logout($returnURL); + } + + + /** + * @param \Symfony\Component\HttpFoundation\Request $request The current request. + * + * @return \SimpleSAML\XHTML\Template + */ + public function main(Request $request): Template + { + $hashAttributes = $this->moduleConfig->getOptionalValue('attributes.hash', false); + $excludeAttributes = $this->moduleConfig->getOptionalValue('attributes.exclude', []); + + // Check if valid local session exists + $authority = $this->moduleConfig->getValue('authority'); + $as = new $this->authSimple($authority); + $as->requireAuth(); + + // Get released attributes + $attributes = $as->getAttributes(); + + // Get metadata storage handler + $metadata = $this->metadataStorageHandler; + + /* + * Get IdP id and metadata + */ + $idp_entityid = $metadata->getMetaDataCurrentEntityID('saml20-idp-hosted'); + $idp_metadata = $metadata->getMetaData($idp_entityid, 'saml20-idp-hosted'); + + // Calc correct source + if ($as->getAuthData('saml:sp:IdP') !== null) { + // from a remote idp (as bridge) + $source = 'saml20-idp-remote|' . $as->getAuthData('saml:sp:IdP'); + } else { + // from the local idp + $source = $idp_metadata['metadata-set'] . '|' . $idp_entityid; + } + + // Get user ID + $userid_attributename = $this->moduleConfig->getOptionalString( + 'identifyingAttribute', + 'eduPersonPrincipalName', + ); + $userids = $attributes[$userid_attributename]; + + if (empty($userids)) { + throw new Exception(sprintf( + 'Could not generate useridentifier for storing consent. Attribute [%s] was not available.', + $userid_attributename, + )); + } + + $userid = $userids[0]; + + // Get all SP metadata + $all_sp_metadata = $metadata->getList('saml20-sp-remote'); + + $sp_entityid = $request->query->get('cv'); + $action = $request->query->get('action'); + + Logger::notice('consentAdmin: sp: ' . $sp_entityid . ' action: ' . $action); + + // Remove services, whitch have consent disabled + if (isset($idp_metadata['consent.disable'])) { + foreach ($idp_metadata['consent.disable'] as $disable) { + if (array_key_exists($disable, $all_sp_metadata)) { + unset($all_sp_metadata[$disable]); + } + } + } + + Logger::info('consentAdmin: ' . $idp_entityid); + + // Parse consent config + $consent_storage = $this->store::parseStoreConfig($this->moduleConfig->getValue('consentadmin')); + + // Calc correct user ID hash + $hashed_user_id = $this->consent::getHashedUserID($userid, $source); + + // If a checkbox have been clicked + if ($action !== null && $sp_entityid !== null) { + // init template to enable translation of status messages + $template = new Template( + $this->config, + 'consentAdmin:consentadminajax.twig', + 'consentAdmin:consentadmin', + ); + + // Get SP metadata + $sp_metadata = $metadata->getMetaData($sp_entityid, 'saml20-sp-remote'); + + // Run AuthProc filters + list($targeted_id, $attribute_hash, $attributes) = $this->driveProcessingChain( + $idp_metadata, + $source, + $sp_metadata, + $sp_entityid, + $attributes, + $userid, + $hashAttributes, + $excludeAttributes, + ); + + // Add a consent (or update if attributes have changed and old consent for SP and IdP exists) + if ($action == 'true') { + $isStored = $consent_storage->saveConsent($hashed_user_id, $targeted_id, $attribute_hash); + } else { + if ($action == 'false') { + // Got consent, so this is a request to remove it + $consent_storage->deleteConsent($hashed_user_id, $targeted_id); + $isStored = false; + } else { + Logger::info('consentAdmin: unknown action'); + $isStored = null; + } + } + $template->data['isStored'] = $isStored; + return $template; + } + + // Get all consents for user + $user_consent_list = $consent_storage->getConsents($hashed_user_id); + + // Parse list of consents + $user_consent = []; + foreach ($user_consent_list as $c) { + $user_consent[$c[0]] = $c[1]; + } + + // Init template + $template = new Template($this->config, 'consentAdmin:consentadmin.twig', 'consentAdmin:consentadmin'); + $template->getLocalization()->addAttributeDomains(); + + $sp_list = []; + + // Process consents for all SP + foreach ($all_sp_metadata as $sp_entityid => $sp_values) { + // Get metadata for SP + $sp_metadata = $metadata->getMetaData($sp_entityid, 'saml20-sp-remote'); + + // Run attribute filters + list($targeted_id, $attribute_hash, $attributes) = $this->driveProcessingChain( + $idp_metadata, + $source, + $sp_metadata, + $sp_entityid, + $attributes, + $userid, + $hashAttributes, + $excludeAttributes, + ); + + // Check if consent exists + if (array_key_exists($targeted_id, $user_consent)) { + $sp_status = "changed"; + Logger::info('consentAdmin: changed'); + // Check if consent is valid. (Possible that attributes has changed) + if ($user_consent[$targeted_id] == $attribute_hash) { + Logger::info('consentAdmin: ok'); + $sp_status = "ok"; + } + // Consent does not exist + } else { + Logger::info('consentAdmin: none'); + $sp_status = "none"; + } + + // Set description of SP + $sp_description = null; + if (!empty($sp_metadata['description']) && is_array($sp_metadata['description'])) { + $sp_description = $sp_metadata['description']; + } + + // Add a URL to the service if present in metadata + $sp_service_url = isset($sp_metadata['ServiceURL']) ? $sp_metadata['ServiceURL'] : null; + + // Fill out array for the template + $sp_list[$sp_entityid] = [ + 'spentityid' => $sp_entityid, + 'name' => $template->getEntityDisplayName($sp_metadata), + 'description' => $sp_description, + 'consentStatus' => $sp_status, + 'consentValue' => $sp_entityid, + 'attributes_by_sp' => $attributes, + 'serviceurl' => $sp_service_url, + ]; + } + + $template->data['header'] = 'Consent Administration'; + $template->data['spList'] = $sp_list; + $template->data['showDescription'] = $this->moduleConfig->getBoolean('showDescription'); + + return $template; + } + + + /** + * Runs the processing chain and ignores all filter which have user + * interaction. + * + * @param array $idp_metadata + * @param string $source + * @param array $sp_metadata + * @param string $sp_entityid + * @param array $attributes + * @param string $userid + * @param bool $hashAttributes + * @param array $excludeAttributes + * @return array + */ + private function driveProcessingChain( + array $idp_metadata, + string $source, + array $sp_metadata, + string $sp_entityid, + array $attributes, + string $userid, + bool $hashAttributes, + array $excludeAttributes, + ): array { + /* + * Create a new processing chain + */ + $pc = new Auth\ProcessingChain($idp_metadata, $sp_metadata, 'idp'); + + /* + * Construct the state. + * REMEMBER: Do not set Return URL if you are calling processStatePassive + */ + $authProcState = [ + 'Attributes' => $attributes, + 'Destination' => $sp_metadata, + 'SPMetadata' => $sp_metadata, + 'Source' => $idp_metadata, + 'IdPMetadata' => $idp_metadata, + 'isPassive' => true, + ]; + + /* we're being bridged, so add that info to the state */ + if (strpos($source, '-idp-remote|') !== false) { + /** @var int $i */ + $i = strpos($source, '|'); + $authProcState['saml:sp:IdP'] = substr($source, $i + 1); + } + + /* + * Call processStatePAssive. + * We are not interested in any user interaction, only modifications to the attributes + */ + $pc->processStatePassive($authProcState); + + $attributes = $authProcState['Attributes']; + // Remove attributes that do not require consent/should be excluded + foreach ($attributes as $attrkey => $attrval) { + if (in_array($attrkey, $excludeAttributes)) { + unset($attributes[$attrkey]); + } + } + + /* + * Generate identifiers and hashes + */ + $destination = $sp_metadata['metadata-set'] . '|' . $sp_entityid; + + $targeted_id = $this->consent::getTargetedID($userid, $source, $destination); + $attribute_hash = $this->consent::getAttributeHash($attributes, $hashAttributes); + + Logger::info('consentAdmin: user: ' . $userid); + Logger::info('consentAdmin: target: ' . $targeted_id); + Logger::info('consentAdmin: attribute: ' . $attribute_hash); + + // Return values + return [$targeted_id, $attribute_hash, $attributes]; + } +} diff --git a/.extlib/simplesamlphp/modules/consentAdmin/templates/consentadmin.twig b/.extlib/simplesamlphp/modules/consentAdmin/templates/consentadmin.twig new file mode 100644 index 000000000..dc05381d8 --- /dev/null +++ b/.extlib/simplesamlphp/modules/consentAdmin/templates/consentadmin.twig @@ -0,0 +1,82 @@ +{% set pagetitle = 'Consent Administration'|trans %} +{% extends "base.twig" %} + +{% block preload %} + +{% endblock %} + +{% block postload %} + +{% endblock %} + +{% block content %} + +

{{ '{consentAdmin:consentadmin:consentadmin_header}'|trans }}

+

{{ '{consentAdmin:consentadmin:consentadmin_description1}'|trans }}

+ + + + + + + +{% for spName, spValues in spList %} + + {% if loop.index0 % 2 == 0 %} + {% set rowClass = 'row0' %} + {% else %} + {% set rowClass = 'row1' %} + {% endif %} + + + + + + +{% endfor %} +
{{ '{consentAdmin:consentadmin:service_provider_header}'|trans }}{{ '{consentAdmin:consentadmin:status_header}'|trans }}
+ + + {% if spValues.serviceurl is defined %} + {{ spValues.name|translateFromArray|default(spName)|escape('html') }} + {% else %} + {{ spValues.name|translateFromArray|default(spName)|escape('html') }} + {% endif %} + + + {{ '{consentAdmin:consentadmin:show}'|trans }} + {{ '{consentAdmin:consentadmin:hide}'|trans }} + {{ '{consentAdmin:consentadmin:attributes_text}'|trans }} + + + +
+ {% if showDescription %} +

{{ '{consentAdmin:consentadmin:consentadmin_purpose}'|trans }}{{ spValues.description|translateFromArray|default('(no description)')|escape('html') }}

+ {% endif %} +
    + {% for attrName, attrValue in spValues.attributes_by_sp %} + {% if attrValue|length > 1 %} +
  • {{ attrName|trans|escape('html') }}: +
      + {% for valKey, value in attrValue %} +
    • {{ value|escape('html') }}
    • + {% endfor %} +
    +
  • + {% else %} +
  • {{ attrName|escape('html') }}: {{ attrValue|first|escape('html') }}
  • + {% endif %} + {% endfor %} +
+
+
+ {% if spValues.consentStatus == 'changed' %}attributes has changed{% endif %} +
+ +

{{ '{consentAdmin:consentadmin:consentadmin_description2}'|trans|raw }}

+ +

Logout

+

Logout

+ +{% endblock %} diff --git a/.extlib/simplesamlphp/modules/consentAdmin/templates/consentadminajax.twig b/.extlib/simplesamlphp/modules/consentAdmin/templates/consentadminajax.twig new file mode 100644 index 000000000..7e4b570de --- /dev/null +++ b/.extlib/simplesamlphp/modules/consentAdmin/templates/consentadminajax.twig @@ -0,0 +1,9 @@ +{% block content %} +{% if isStored == true %} +{{ 'added'|trans }} +{% elseif isStored == false %} +{{ 'updated'|trans }} +{% else %} +{{ 'unknown'|trans }} +{% endif %} +{% endblock %} diff --git a/.extlib/simplesamlphp/modules/discopower/LICENSE b/.extlib/simplesamlphp/modules/discopower/LICENSE new file mode 100644 index 000000000..a345e48d0 --- /dev/null +++ b/.extlib/simplesamlphp/modules/discopower/LICENSE @@ -0,0 +1,459 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + \ No newline at end of file diff --git a/.extlib/simplesamlphp/modules/discopower/README.md b/.extlib/simplesamlphp/modules/discopower/README.md new file mode 100644 index 000000000..714a5cf63 --- /dev/null +++ b/.extlib/simplesamlphp/modules/discopower/README.md @@ -0,0 +1,30 @@ +# DiscoPower + +![Build Status](https://github.com/simplesamlphp/simplesamlphp-module-discopower/workflows/CI/badge.svg?branch=master) +[![Coverage Status](https://codecov.io/gh/simplesamlphp/simplesamlphp-module-discopower/branch/master/graph/badge.svg)](https://codecov.io/gh/simplesamlphp/simplesamlphp-module-discopower) +[![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/simplesamlphp/simplesamlphp-module-discopower/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/simplesamlphp/simplesamlphp-module-discopower/?branch=master) +[![Type Coverage](https://shepherd.dev/github/simplesamlphp/simplesamlphp-module-discopower/coverage.svg)](https://shepherd.dev/github/simplesamlphp/simplesamlphp-module-discopower) +[![Psalm Level](https://shepherd.dev/github/simplesamlphp/simplesamlphp-module-discopower/level.svg)](https://shepherd.dev/github/simplesamlphp/simplesamlphp-module-discopower) + +A more advanced replacement for the built-in discovery service, DiscoPower +supports grouping identity providers into tabs and provides mechanisms +to sort, filter and search. + +## Installation + +Once you have installed SimpleSAMLphp, installing this module is +very simple. Just execute the following command in the root of your +SimpleSAMLphp installation: + +```sh +composer.phar require simplesamlphp/simplesamlphp-module-discopower:dev-master +``` + +where `dev-master` instructs Composer to install the `master` (**development**) +branch from the Git repository. See the +[releases](https://github.com/simplesamlphp/simplesamlphp-module-discopower/releases) +available if you want to use a stable version of the module. + +## Documentation + +See [docs/discopower.md](https://github.com/simplesamlphp/simplesamlphp-module-discopower/blob/master/docs/discopower.md) diff --git a/.extlib/simplesamlphp/modules/discopower/composer.json b/.extlib/simplesamlphp/modules/discopower/composer.json new file mode 100644 index 000000000..b67cf81c7 --- /dev/null +++ b/.extlib/simplesamlphp/modules/discopower/composer.json @@ -0,0 +1,47 @@ +{ + "name": "simplesamlphp/simplesamlphp-module-discopower", + "description": "Fancy tabbed discovery service with filtering capabilities where SPs can have different sets of metadata listed", + "type": "simplesamlphp-module", + "keywords": ["simplesamlphp", "discopower", "discovery"], + "license": "LGPL-2.1-or-later", + "authors": [ + { + "name": "Andreas Åkre Solberg", + "email": "andreas.solberg@uninett.no" + } + ], + "config": { + "preferred-install": { + "simplesamlphp/simplesamlphp": "source", + "*": "dist" + }, + "allow-plugins": { + "composer/package-versions-deprecated": true, + "simplesamlphp/composer-module-installer": true + } + }, + "autoload": { + "psr-4": { + "SimpleSAML\\modules\\discopower\\": "src/" + } + }, + "autoload-dev": { + "psr-4": { + "SimpleSAML\\Test\\Utils\\": "vendor/simplesamlphp/simplesamlphp/tests/Utils" + } + }, + "require": { + "php": "^8.0", + + "simplesamlphp/assert": "^1.0.0", + "simplesamlphp/simplesamlphp": "*", + "simplesamlphp/composer-module-installer": "^1.3.2" + }, + "require-dev": { + "simplesamlphp/simplesamlphp-test-framework": "~1.3.2 <1.4" + }, + "support": { + "issues": "https://github.com/simplesamlphp/simplesamlphp-module-discopower/issues", + "source": "https://github.com/simplesamlphp/simplesamlphp-module-discopower" + } +} diff --git a/.extlib/simplesamlphp/modules/discopower/config-templates/module_discopower.php b/.extlib/simplesamlphp/modules/discopower/config-templates/module_discopower.php new file mode 100644 index 000000000..f8794ff5d --- /dev/null +++ b/.extlib/simplesamlphp/modules/discopower/config-templates/module_discopower.php @@ -0,0 +1,64 @@ + 0, + + /* + * List a set of tags (Tabs) that should be listed in a specific order. + * All other available tabs will be listed after the ones specified below. + */ + 'taborder' => ['norway'], + + /* + * the 'tab' parameter allows you to limit the tabs to a specific list. (excluding unlisted tags) + * + * 'tabs' => ['norway', 'finland'], + */ + + /* + * The 'defaultweight' parameter is used to determine the sort weight when + * 'discopower.weight' is not explicitly set for the entity, and allows you + * to influence the sorting of the otherwise alphabetical display. Larger + * values appear higher up than smaller ones. The default defaultweight is 100. + * + * 'defaultweight' => 100, + */ + + /* + * If you want to change the scoring algorithm to a more google suggest like one + * (filters by start of words) uncomment this ... + * + * 'score' => 'suggest', + */ + + /* + * The domain to use for common domain cookie support. + * This must be a parent domain of the domain hosting the discovery service. + * + * If this is NULL (the default), common domain cookie support will be disabled. + */ + 'cdc.domain' => null, + + /* + * The lifetime of the common domain cookie, in seconds. + * + * If this is NULL (the default), the common domain cookie will be deleted when the browser closes. + * + * Example: 'cdc.lifetime' => 180*24*60*60, // 180 days + */ + 'cdc.lifetime' => null, + + /* + * If you are configuring a protocol bridge, setting this to `true` will + * parse the URL return parameter and use it to find 'discopower.filter' + * configuration in SP metadata on the other side of the bridge. + * Because it introduces a small risk, the default is `false`. + * + * 'useunsafereturn' => false, + */ +]; diff --git a/.extlib/simplesamlphp/modules/discopower/docs/discopower.md b/.extlib/simplesamlphp/modules/discopower/docs/discopower.md new file mode 100644 index 000000000..831762dbf --- /dev/null +++ b/.extlib/simplesamlphp/modules/discopower/docs/discopower.md @@ -0,0 +1,127 @@ +# DiscoPower + +DiscoPower is a more advanced replacement for the built-in discovery service. It supports grouping identity providers into tabs and provides mechanisms to sort, filter and search. + +## Enable the module + +In `config.php`, search for the `module.enable` key and set `discopower` to true: + +```php + 'module.enable' => [ + 'discopower' => true, + … + ], +``` + +## Configuration + +DiscoPower expects to find its configuration in `config/module_discopower.php`. There is a sample configuration in [config-templates](../config-templates/) that can be copied and adapted. + +### Config options + +`defaulttab` +: An integer specifying which tab should be displayed first. Tabs number left to right, starting at zero. The default is `0` which is the first tab. + +`taborder` +: List a set of tags (Tabs) that should be listed in a specific order. All other available tabs will be listed after the ones specified. + +`tabs` +: Allows you to limit the tabs to a specific list. Unlisted tags are excluded from display. + +`score` +: Change the way DiscoPower scores results in searches. Valid options are `quicksilver` or `suggest`, with `quicksilver` being the default. + +`cdc.domain` +: The domain to use for common domain cookie support. This must be a parent domain of the domain hosting the discovery service. If this is `null` (the default), common domain cookie support will be disabled. + +`cdc.lifetime` +: The lifetime of the common domain cookie, in seconds. If this is `null` (the default), the common domain cookie will be deleted when the browser closes. + +`useunsafereturn` +: See [Filtering on a protocol bridge](#filtering-on-a-protocol-bridge). Defaults to `false`. + +## Enabling DiscoPower for a service + +To enable the use of DiscoPower, you need to edit your [service provider configuration](https://simplesamlphp.org/docs/stable/simplesamlphp-sp) in `config/authsources.php` and set the `discoURL` parameter to point at the DiscoPower module: + +```php + [ + 'saml:SP', + 'discoURL' => 'https://sp1.example.org/simplesaml/module.php/discopower/disco.php', + ], +]; +``` + +This causes SimpleSAMLphp to use DiscoPower in preference to the built-in discovery interface. + +## Arranging identity providers onto tabs + +DiscoPower determines its list of identity providers by parsing the [IdP remote metadata](https://simplesamlphp.org/docs/stable/simplesamlphp-reference-idp-remote). + +In order to specify which tab(s) an identity provider should be displayed on, you can set the `tabs` attribute in the entity's metadata. If you're using locally hosted metadata, you can do this by simply editing your metadata as follows: + +```php +$metadata['https://idp1.example.net/'] = [ + // ... + 'tags' => ['tag1', 'tag2'], +]; +``` + +The order in which these tags is displayed is controlled by the `taborder` parameter in `config/module_discopower.php`. + +## Filtering identity providers + +You can filter the tabs or individual entities displayed to particular services by editing their metadata entry in saml20-sp-remote to include a `discopower.filter` stanza. + +```php +$metadata['https://sp1.example.org/'] = [ + // ... + 'discopower.filter' => [ + 'entities.include' => [ ... ], + 'entities.exclude' => [ ... ], + 'tags.include' => [ ... ], + 'tags.exclude' => [ ... ], + ], +]; +``` + +The `.include` versions take precedence over the `.exclude` ones. If both are specified, the list of identity providers is first filtered to the `.include` lists, and then any `.exclude`d ones are removed. + +### Filtering on a protocol bridge + +If you have configured SimpleSAMLphp as a [protocol bridge](https://simplesamlphp.org/docs/stable/simplesamlphp-advancedfeatures#section_2), you may want to filter entities arriving from the other side of the bridge and for which you do not have metadata in saml20-sp-remote. Unfortunately, this makes it difficult to safely filter the list of identity providers, and so this functionality is disabled by default. + +In this scenario, the only way to infer the entityId is from the `return` parameter of the disco URL. As the `return` parameter is information that came from the user's browser, it should not be trusted. A user could manipulate the entityId in the `return` parameter to change what your DiscoPower service sees as the originating service. If you're filtering your entities to prevent people from learning of their existance, this potentially means your filters can be bypassed and people can learn about identity providers you do not wish them to know about. + +However, if, as is often the case, you're not worried if users learn all the IdPs you support and are merely filtering to improve the user interface, then you may consider this relatively safe. In this case, you can enable support for filtering over the protocol bridge by setting the `useunsafereturn` option in `config/module_discopower.php` to `true`. + +## Changing the display order + +By default, DiscoPower sorts identity providers alphabetically by the English name (specified by the `name` parameter in metadata). Where providers do not have names, they're sorted by their `entityId`. However, providers with only an entityId will always appear below those with an English name. + +If you wish to manipulate the default sort order, the easiest way to do this is by setting a `discopower.weight` in the identity provider's metadata. Weights are numeric values, and higher weights are sorted above lower ones. Where weights are not specified, they inherit the `defaultweight` from `config/module_discopower.php` (which itself defaults to 100). + +Thus to force a particular identity provider to the top of the list, you can set it's weight very high, like this: + +```php +$metadata['https://idp2.example.net/'] = [ + // ... + 'name' => ['en' => 'IdP 1'], + 'tags' => ['tag1', 'tag2'], + 'discopower.weight' => 200, +]; +``` + +More complex sorting can be done with a hook. To do this, create a file named `hook_discosort.php` and place it under the `/hooks` directory. This file should contain a function named: + +```php +_hook_discosort(&$entities) +``` + +where the `$entities` parameter is a reference to an array containing the metadata objects for each entity on a given tab. This is suitable for passing to a function like [`uasort()`](https://www.php.net/manual/en/function.uasort.php), but you're free to sort it using any method you wish. + +## Interacting with metarefresh + +If you're making use of the [metarefresh](https://github.com/simplesamlphp/simplesamlphp-module-metarefresh) module for automated metadata management, then you need to add any metadata paramters into the appropriate `template` in `config/config-metarefresh.php` so that they get applied each time metadata is refreshed. diff --git a/.extlib/simplesamlphp/modules/discopower/locales/af/LC_MESSAGES/discopower.po b/.extlib/simplesamlphp/modules/discopower/locales/af/LC_MESSAGES/discopower.po new file mode 100644 index 000000000..9b811e984 --- /dev/null +++ b/.extlib/simplesamlphp/modules/discopower/locales/af/LC_MESSAGES/discopower.po @@ -0,0 +1,103 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2018-11-15 15:02+0200\n" +"Last-Translator: \n" +"Language-Team: \n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 1.3\n" + +msgid "{discopower:tabs:ukacessfederation}" +msgstr "UK Toegangs Federasie" + +msgid "{discopower:tabs:switzerland}" +msgstr "Switserland" + +msgid "{discopower:tabs:greece}" +msgstr "Griekeland" + +msgid "{discopower:tabs:southafrica}" +msgstr "Suid-Afrika" + +msgid "{discopower:tabs:kalmar}" +msgstr "Kalmar" + +msgid "{discopower:tabs:denmark}" +msgstr "Denmark" + +msgid "{discopower:tabs:sweden}" +msgstr "Swede" + +msgid "{discopower:tabs:edugain}" +msgstr "eduGAIN" + +msgid "{discopower:tabs:iceland}" +msgstr "Ysland" + +msgid "{discopower:tabs:finland}" +msgstr "Finland" + +msgid "{discopower:tabs:incommon}" +msgstr "InCommon" + +msgid "{discopower:tabs:norway}" +msgstr "Noorweë" + +msgid "{discopower:tabs:misc}" +msgstr "Verskeie" + +msgid "Sweden" +msgstr "Swede" + +msgid "Denmark" +msgstr "Denmark" + +msgid "Iceland" +msgstr "Ysland" + +msgid "UK Access Federation" +msgstr "UK Toegangs Federasie" + +msgid "Kalmar" +msgstr "Kalmar" + +msgid "Switzerland" +msgstr "Switserland" + +msgid "Norway" +msgstr "Noorweë" + +msgid "Greece" +msgstr "Griekeland" + +msgid "South Africa" +msgstr "Suid-Afrika" + +msgid "Miscellaneous" +msgstr "Verskeie" + +msgid "Finland" +msgstr "Finland" + +msgid "eduGAIN" +msgstr "eduGAIN" + +msgid "InCommon" +msgstr "InCommon" + +msgid "{discopower:tabs:incremental_search}" +msgstr "Inkrementele soektog..." + +msgid "" +"The institution you've chosen will be saved in this browser so that " +"you do not need to select it each time you login." +msgstr "" +"Die instelling wat jy gekies het, sal in hierdie webblaaier gestoor word " +"sodat jy dit nie hoef te kies elke keer as jy aanmeld nie." diff --git a/.extlib/simplesamlphp/modules/discopower/locales/da/LC_MESSAGES/discopower.po b/.extlib/simplesamlphp/modules/discopower/locales/da/LC_MESSAGES/discopower.po new file mode 100644 index 000000000..456a0a080 --- /dev/null +++ b/.extlib/simplesamlphp/modules/discopower/locales/da/LC_MESSAGES/discopower.po @@ -0,0 +1,95 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: da\n" +"Language-Team: \n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "{discopower:tabs:ukacessfederation}" +msgstr "Storbritanniens adgangsføderation" + +msgid "{discopower:tabs:switzerland}" +msgstr "Schweiz" + +msgid "{discopower:tabs:greece}" +msgstr "Grækenland" + +msgid "{discopower:tabs:southafrica}" +msgstr "Sydafrika" + +msgid "{discopower:tabs:kalmar}" +msgstr "Kalmar" + +msgid "{discopower:tabs:denmark}" +msgstr "Danmark" + +msgid "{discopower:tabs:sweden}" +msgstr "Sverige" + +msgid "{discopower:tabs:edugain}" +msgstr "eduGAIN" + +msgid "{discopower:tabs:iceland}" +msgstr "Island" + +msgid "{discopower:tabs:finland}" +msgstr "Finland" + +msgid "{discopower:tabs:incommon}" +msgstr "InCommon" + +msgid "{discopower:tabs:norway}" +msgstr "Norge" + +msgid "{discopower:tabs:misc}" +msgstr "Forskellige" + +msgid "Sweden" +msgstr "Sverige" + +msgid "Denmark" +msgstr "Danmark" + +msgid "Iceland" +msgstr "Island" + +msgid "UK Access Federation" +msgstr "Storbritanniens adgangsføderation" + +msgid "Kalmar" +msgstr "Kalmar" + +msgid "Switzerland" +msgstr "Schweiz" + +msgid "Norway" +msgstr "Norge" + +msgid "Greece" +msgstr "Grækenland" + +msgid "South Africa" +msgstr "Sydafrika" + +msgid "Miscellaneous" +msgstr "Forskellige" + +msgid "Finland" +msgstr "Finland" + +msgid "eduGAIN" +msgstr "eduGAIN" + +msgid "InCommon" +msgstr "InCommon" + diff --git a/.extlib/simplesamlphp/modules/discopower/locales/el/LC_MESSAGES/discopower.po b/.extlib/simplesamlphp/modules/discopower/locales/el/LC_MESSAGES/discopower.po new file mode 100644 index 000000000..d284eaf5c --- /dev/null +++ b/.extlib/simplesamlphp/modules/discopower/locales/el/LC_MESSAGES/discopower.po @@ -0,0 +1,95 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: el\n" +"Language-Team: \n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "{discopower:tabs:ukacessfederation}" +msgstr "Ομοσπονδία UK Access" + +msgid "{discopower:tabs:switzerland}" +msgstr "Ελβετία" + +msgid "{discopower:tabs:greece}" +msgstr "Ελλάδα" + +msgid "{discopower:tabs:southafrica}" +msgstr "Νότια Αφρική" + +msgid "{discopower:tabs:kalmar}" +msgstr "Kalmar" + +msgid "{discopower:tabs:denmark}" +msgstr "Δανία" + +msgid "{discopower:tabs:sweden}" +msgstr "Σουηδία" + +msgid "{discopower:tabs:edugain}" +msgstr "eduGAIN" + +msgid "{discopower:tabs:iceland}" +msgstr "Ισλανδία" + +msgid "{discopower:tabs:finland}" +msgstr "Φινλανδία" + +msgid "{discopower:tabs:incommon}" +msgstr "InCommon" + +msgid "{discopower:tabs:norway}" +msgstr "Νορβηγία" + +msgid "{discopower:tabs:misc}" +msgstr "Άλλοι φορείς" + +msgid "Sweden" +msgstr "Σουηδία" + +msgid "Denmark" +msgstr "Δανία" + +msgid "Iceland" +msgstr "Ισλανδία" + +msgid "UK Access Federation" +msgstr "Ομοσπονδία UK Access" + +msgid "Kalmar" +msgstr "Kalmar" + +msgid "Switzerland" +msgstr "Ελβετία" + +msgid "Norway" +msgstr "Νορβηγία" + +msgid "Greece" +msgstr "Ελλάδα" + +msgid "South Africa" +msgstr "Νότια Αφρική" + +msgid "Miscellaneous" +msgstr "Άλλοι φορείς" + +msgid "Finland" +msgstr "Φινλανδία" + +msgid "eduGAIN" +msgstr "eduGAIN" + +msgid "InCommon" +msgstr "InCommon" + diff --git a/.extlib/simplesamlphp/modules/discopower/locales/en/LC_MESSAGES/discopower.po b/.extlib/simplesamlphp/modules/discopower/locales/en/LC_MESSAGES/discopower.po new file mode 100644 index 000000000..8065b2e87 --- /dev/null +++ b/.extlib/simplesamlphp/modules/discopower/locales/en/LC_MESSAGES/discopower.po @@ -0,0 +1,107 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2019-03-20 15:27+0200\n" +"Last-Translator: \n" +"Language: en\n" +"Language-Team: \n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "{discopower:tabs:ukacessfederation}" +msgstr "UK Access Federation" + +msgid "{discopower:tabs:switzerland}" +msgstr "Switzerland" + +msgid "{discopower:tabs:greece}" +msgstr "Greece" + +msgid "{discopower:tabs:southafrica}" +msgstr "South Africa" + +msgid "{discopower:tabs:kalmar}" +msgstr "Kalmar" + +msgid "{discopower:tabs:netherlands}" +msgstr "The Netherlands" + +msgid "{discopower:tabs:denmark}" +msgstr "Denmark" + +msgid "{discopower:tabs:sweden}" +msgstr "Sweden" + +msgid "{discopower:tabs:edugain}" +msgstr "eduGAIN" + +msgid "{discopower:tabs:iceland}" +msgstr "Iceland" + +msgid "{discopower:tabs:finland}" +msgstr "Finland" + +msgid "{discopower:tabs:incommon}" +msgstr "InCommon" + +msgid "{discopower:tabs:norway}" +msgstr "Norway" + +msgid "{discopower:tabs:misc}" +msgstr "Miscellaneous" + +msgid "Sweden" +msgstr "Sweden" + +msgid "Denmark" +msgstr "Denmark" + +msgid "Iceland" +msgstr "Iceland" + +msgid "UK Access Federation" +msgstr "UK Access Federation" + +msgid "Kalmar" +msgstr "Kalmar" + +msgid "Switzerland" +msgstr "Switzerland" + +msgid "Norway" +msgstr "Norway" + +msgid "Greece" +msgstr "Greece" + +msgid "South Africa" +msgstr "South Africa" + +msgid "Miscellaneous" +msgstr "Miscellaneous" + +msgid "Finland" +msgstr "Finland" + +msgid "eduGAIN" +msgstr "eduGAIN" + +msgid "InCommon" +msgstr "InCommon" + +msgid "{discopower:tabs:incremental_search}" +msgstr "Incremental search..." + +msgid "" +"The institution you've chosen will be saved in this browser so that " +"you do not need to select it each time you login." +msgstr "" +"The institution you've chosen will be saved in this browser so that " +"you do not need to select it each time you login." diff --git a/.extlib/simplesamlphp/modules/discopower/locales/es/LC_MESSAGES/discopower.po b/.extlib/simplesamlphp/modules/discopower/locales/es/LC_MESSAGES/discopower.po new file mode 100644 index 000000000..8e8c5b4ea --- /dev/null +++ b/.extlib/simplesamlphp/modules/discopower/locales/es/LC_MESSAGES/discopower.po @@ -0,0 +1,95 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: es\n" +"Language-Team: \n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "{discopower:tabs:ukacessfederation}" +msgstr "Federación de Acceso de Reino Unido" + +msgid "{discopower:tabs:switzerland}" +msgstr "Suiza" + +msgid "{discopower:tabs:greece}" +msgstr "Grecia" + +msgid "{discopower:tabs:southafrica}" +msgstr "Sudáfrica" + +msgid "{discopower:tabs:kalmar}" +msgstr "Kalmar" + +msgid "{discopower:tabs:denmark}" +msgstr "Dinamarca" + +msgid "{discopower:tabs:sweden}" +msgstr "Suecia" + +msgid "{discopower:tabs:edugain}" +msgstr "eduGAIN" + +msgid "{discopower:tabs:iceland}" +msgstr "Islandia" + +msgid "{discopower:tabs:finland}" +msgstr "Finlandia" + +msgid "{discopower:tabs:incommon}" +msgstr "InCommon" + +msgid "{discopower:tabs:norway}" +msgstr "Noruega" + +msgid "{discopower:tabs:misc}" +msgstr "Otros" + +msgid "Sweden" +msgstr "Suecia" + +msgid "Denmark" +msgstr "Dinamarca" + +msgid "Iceland" +msgstr "Islandia" + +msgid "UK Access Federation" +msgstr "Federación de Acceso de Reino Unido" + +msgid "Kalmar" +msgstr "Kalmar" + +msgid "Switzerland" +msgstr "Suiza" + +msgid "Norway" +msgstr "Noruega" + +msgid "Greece" +msgstr "Grecia" + +msgid "South Africa" +msgstr "Sudáfrica" + +msgid "Miscellaneous" +msgstr "Otros" + +msgid "Finland" +msgstr "Finlandia" + +msgid "eduGAIN" +msgstr "eduGAIN" + +msgid "InCommon" +msgstr "InCommon" + diff --git a/.extlib/simplesamlphp/modules/discopower/locales/fr/LC_MESSAGES/discopower.po b/.extlib/simplesamlphp/modules/discopower/locales/fr/LC_MESSAGES/discopower.po new file mode 100644 index 000000000..a6e95f84e --- /dev/null +++ b/.extlib/simplesamlphp/modules/discopower/locales/fr/LC_MESSAGES/discopower.po @@ -0,0 +1,100 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.19.6\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2022-12-12 16:05+0200\n" +"PO-Revision-Date: 2022-12-12 16:05+0200\n" +"Last-Translator: \n" +"Language: fr\n" +"Language-Team: \n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "{discopower:tabs:ukacessfederation}" +msgstr "UK Accès Federation" + +msgid "{discopower:tabs:switzerland}" +msgstr "Suisse" + +msgid "{discopower:tabs:greece}" +msgstr "Grèce" + +msgid "{discopower:tabs:southafrica}" +msgstr "Afrique du Sud" + +msgid "{discopower:tabs:kalmar}" +msgstr "Kalmar" + +msgid "{discopower:tabs:netherlands}" +msgstr "Pays-Bas" + +msgid "{discopower:tabs:denmark}" +msgstr "Danemark" + +msgid "{discopower:tabs:sweden}" +msgstr "Suède" + +msgid "{discopower:tabs:edugain}" +msgstr "Europe (eduGAIN)" + +msgid "{discopower:tabs:iceland}" +msgstr "Islande" + +msgid "{discopower:tabs:finland}" +msgstr "Finlande" + +msgid "{discopower:tabs:incommon}" +msgstr "En Commun" + +msgid "{discopower:tabs:norway}" +msgstr "Norvège" + +msgid "{discopower:tabs:misc}" +msgstr "Divers" + +msgid "{discopower:tabs:incremental_search}" +msgstr "Recherche incrémentale..." + +msgid "Sweden" +msgstr "Suède" + +msgid "Denmark" +msgstr "Danemark" + +msgid "Iceland" +msgstr "Islande" + +msgid "UK Access Federation" +msgstr "UK Accès Federation" + +msgid "Kalmar" +msgstr "Kalmar" + +msgid "Switzerland" +msgstr "Suisse" + +msgid "Norway" +msgstr "Norvège" + +msgid "Greece" +msgstr "Grèce" + +msgid "South Africa" +msgstr "Afrique du Sud" + +msgid "Miscellaneous" +msgstr "Divers" + +msgid "Finland" +msgstr "Finlande" + +msgid "eduGAIN" +msgstr "eduGAIN" + +msgid "InCommon" +msgstr "InCommon" diff --git a/.extlib/simplesamlphp/modules/discopower/locales/gl/LC_MESSAGES/discopower.po b/.extlib/simplesamlphp/modules/discopower/locales/gl/LC_MESSAGES/discopower.po new file mode 100644 index 000000000..533795283 --- /dev/null +++ b/.extlib/simplesamlphp/modules/discopower/locales/gl/LC_MESSAGES/discopower.po @@ -0,0 +1,77 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: gl\n" +"Language-Team: \n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "{discopower:tabs:switzerland}" +msgstr "Suiza" + +msgid "{discopower:tabs:greece}" +msgstr "Grecia" + +msgid "{discopower:tabs:southafrica}" +msgstr "Suráfrica" + +msgid "{discopower:tabs:denmark}" +msgstr "Dinamarca" + +msgid "{discopower:tabs:sweden}" +msgstr "Suecia" + +msgid "{discopower:tabs:edugain}" +msgstr "eduGAIN" + +msgid "{discopower:tabs:iceland}" +msgstr "Islandia" + +msgid "{discopower:tabs:finland}" +msgstr "Finlandia" + +msgid "{discopower:tabs:norway}" +msgstr "Noruega" + +msgid "{discopower:tabs:misc}" +msgstr "Miscelanea" + +msgid "Sweden" +msgstr "Suecia" + +msgid "Denmark" +msgstr "Dinamarca" + +msgid "Iceland" +msgstr "Islandia" + +msgid "Switzerland" +msgstr "Suiza" + +msgid "Norway" +msgstr "Noruega" + +msgid "Greece" +msgstr "Grecia" + +msgid "South Africa" +msgstr "Suráfrica" + +msgid "Miscellaneous" +msgstr "Miscelanea" + +msgid "Finland" +msgstr "Finlandia" + +msgid "eduGAIN" +msgstr "eduGAIN" + diff --git a/.extlib/simplesamlphp/modules/discopower/locales/nl/LC_MESSAGES/discopower.po b/.extlib/simplesamlphp/modules/discopower/locales/nl/LC_MESSAGES/discopower.po new file mode 100644 index 000000000..0dc4dd1f3 --- /dev/null +++ b/.extlib/simplesamlphp/modules/discopower/locales/nl/LC_MESSAGES/discopower.po @@ -0,0 +1,101 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: nl\n" +"Language-Team: \n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "{discopower:tabs:ukacessfederation}" +msgstr "UK Access Federation" + +msgid "{discopower:tabs:switzerland}" +msgstr "Zwitserland" + +msgid "{discopower:tabs:greece}" +msgstr "Griekenland" + +msgid "{discopower:tabs:southafrica}" +msgstr "Zuid-Afrika" + +msgid "{discopower:tabs:kalmar}" +msgstr "Kalmar" + +msgid "{discopower:tabs:netherlands}" +msgstr "Nederland" + +msgid "{discopower:tabs:denmark}" +msgstr "Denemarken" + +msgid "{discopower:tabs:sweden}" +msgstr "Zweden" + +msgid "{discopower:tabs:edugain}" +msgstr "eduGAIN" + +msgid "{discopower:tabs:iceland}" +msgstr "IJsland" + +msgid "{discopower:tabs:finland}" +msgstr "Finland" + +msgid "{discopower:tabs:incommon}" +msgstr "InCommon" + +msgid "{discopower:tabs:norway}" +msgstr "Noorwegen" + +msgid "{discopower:tabs:misc}" +msgstr "Overige" + +msgid "{discopower:tabs:incremental_search}" +msgstr "Zoeken" + +msgid "Sweden" +msgstr "Zweden" + +msgid "Denmark" +msgstr "Denemarken" + +msgid "Iceland" +msgstr "IJsland" + +msgid "UK Access Federation" +msgstr "UK Access Federation" + +msgid "Kalmar" +msgstr "Kalmar" + +msgid "Switzerland" +msgstr "Zwitserland" + +msgid "Norway" +msgstr "Noorwegen" + +msgid "Greece" +msgstr "Griekenland" + +msgid "South Africa" +msgstr "Zuid-Afrika" + +msgid "Miscellaneous" +msgstr "Overige" + +msgid "Finland" +msgstr "Finland" + +msgid "eduGAIN" +msgstr "eduGAIN" + +msgid "InCommon" +msgstr "InCommon" + diff --git a/.extlib/simplesamlphp/modules/discopower/locales/ru/LC_MESSAGES/discopower.po b/.extlib/simplesamlphp/modules/discopower/locales/ru/LC_MESSAGES/discopower.po new file mode 100644 index 000000000..4ceba15c0 --- /dev/null +++ b/.extlib/simplesamlphp/modules/discopower/locales/ru/LC_MESSAGES/discopower.po @@ -0,0 +1,84 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: ru\n" +"Language-Team: \n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "{discopower:tabs:switzerland}" +msgstr "Швейцария" + +msgid "{discopower:tabs:greece}" +msgstr "Греция" + +msgid "{discopower:tabs:kalmar}" +msgstr "Кальмар" + +msgid "{discopower:tabs:denmark}" +msgstr "Дания" + +msgid "{discopower:tabs:sweden}" +msgstr "Швеция" + +msgid "{discopower:tabs:southafrica}" +msgstr "Южная Африка" + +msgid "{discopower:tabs:edugain}" +msgstr "eduGAIN" + +msgid "{discopower:tabs:iceland}" +msgstr "Исландия" + +msgid "{discopower:tabs:finland}" +msgstr "Финляндия" + +msgid "{discopower:tabs:norway}" +msgstr "Норвегия" + +msgid "{discopower:tabs:misc}" +msgstr "Разное" + +msgid "Sweden" +msgstr "Швеция" + +msgid "South Africa" +msgstr "Южная Африка" + +msgid "Denmark" +msgstr "Дания" + +msgid "Iceland" +msgstr "Исландия" + +msgid "Kalmar" +msgstr "Кальмар" + +msgid "Switzerland" +msgstr "Швейцария" + +msgid "Norway" +msgstr "Норвегия" + +msgid "Greece" +msgstr "Греция" + +msgid "Miscellaneous" +msgstr "Разное" + +msgid "Finland" +msgstr "Финляндия" + +msgid "eduGAIN" +msgstr "eduGAIN" + diff --git a/.extlib/simplesamlphp/modules/discopower/locales/st/LC_MESSAGES/discopower.po b/.extlib/simplesamlphp/modules/discopower/locales/st/LC_MESSAGES/discopower.po new file mode 100644 index 000000000..e44e30506 --- /dev/null +++ b/.extlib/simplesamlphp/modules/discopower/locales/st/LC_MESSAGES/discopower.po @@ -0,0 +1,34 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2019-12-12 14:14+0200\n" +"PO-Revision-Date: 2019-12-12 14:14+0200\n" +"Last-Translator: \n" +"Language-Team: \n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 1.3\n" + +msgid "Incremental search..." +msgstr "Patlo e Eketsang..." + +msgid "{discopower:tabs:incremental_search}" +msgstr "Patlo e Eketsang..." + +msgid "{discopower:tabs:misc}" +msgstr "Fapakaneng" + +msgid "{discopower:tabs:southafrica}" +msgstr "Afrika Boroa" + +msgid "Miscellaneous" +msgstr "Fapakaneng" + +msgid "South Africa" +msgstr "Afrika Boroa" + diff --git a/.extlib/simplesamlphp/modules/discopower/locales/xh/LC_MESSAGES/discopower.po b/.extlib/simplesamlphp/modules/discopower/locales/xh/LC_MESSAGES/discopower.po new file mode 100644 index 000000000..526caa6bd --- /dev/null +++ b/.extlib/simplesamlphp/modules/discopower/locales/xh/LC_MESSAGES/discopower.po @@ -0,0 +1,49 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2018-11-15 14:48+0200\n" +"PO-Revision-Date: 2018-11-15 15:02+0200\n" +"Last-Translator: \n" +"Language-Team: \n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 1.3\n" + +msgid "{discopower:tabs:misc}" +msgstr "Ezahlukahlukeneyo" + +msgid "{discopower:tabs:finland}" +msgstr "Finlend" + +msgid "{discopower:tabs:sweden}" +msgstr "Swiden" + +msgid "{discopower:tabs:southafrica}" +msgstr "uMzantsi Afrika" + +msgid "{discopower:tabs:switzerland}" +msgstr "Swizalend" + +msgid "{discopower:tabs:iceland}" +msgstr "Ayisilend" + +msgid "{discopower:tabs:denmark}" +msgstr "Dominikha" + +msgid "{discopower:tabs:greece}" +msgstr "Grisi" + +msgid "{discopower:tabs:edugain}" +msgstr "eduGAIN" + +msgid "{discopower:tabs:norway}" +msgstr "Norowe" + +msgid "{discopower:tabs:incremental_search}" +msgstr "Ukhangelo oluqhubekayo..." + diff --git a/.extlib/simplesamlphp/modules/discopower/locales/zh-tw/LC_MESSAGES/discopower.po b/.extlib/simplesamlphp/modules/discopower/locales/zh-tw/LC_MESSAGES/discopower.po new file mode 100644 index 000000000..b097dd1bb --- /dev/null +++ b/.extlib/simplesamlphp/modules/discopower/locales/zh-tw/LC_MESSAGES/discopower.po @@ -0,0 +1,89 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2016-10-12 09:23+0200\n" +"PO-Revision-Date: 2016-10-14 12:14+0200\n" +"Last-Translator: \n" +"Language: zh_Hant_TW\n" +"Language-Team: \n" +"Plural-Forms: nplurals=1; plural=0\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "{discopower:tabs:ukacessfederation}" +msgstr "英國 Access Management Federation for Education and Research." + +msgid "{discopower:tabs:switzerland}" +msgstr "瑞士" + +msgid "{discopower:tabs:kalmar}" +msgstr "卡爾馬" + +msgid "{discopower:tabs:denmark}" +msgstr "丹麥" + +msgid "{discopower:tabs:sweden}" +msgstr "瑞典" + +msgid "{discopower:tabs:southafrica}" +msgstr "南非" + +msgid "{discopower:tabs:edugain}" +msgstr "eduGAIN" + +msgid "{discopower:tabs:iceland}" +msgstr "冰島" + +msgid "{discopower:tabs:finland}" +msgstr "芬蘭" + +msgid "{discopower:tabs:incommon}" +msgstr "InCommon" + +msgid "{discopower:tabs:norway}" +msgstr "挪威" + +msgid "{discopower:tabs:misc}" +msgstr "雜項" + +msgid "Sweden" +msgstr "瑞典" + +msgid "South Africa" +msgstr "南非" + +msgid "Denmark" +msgstr "丹麥" + +msgid "Iceland" +msgstr "冰島" + +msgid "UK Access Federation" +msgstr "英國 Access Management Federation for Education and Research." + +msgid "Kalmar" +msgstr "卡爾馬" + +msgid "Switzerland" +msgstr "瑞士" + +msgid "Norway" +msgstr "挪威" + +msgid "Miscellaneous" +msgstr "雜項" + +msgid "Finland" +msgstr "芬蘭" + +msgid "eduGAIN" +msgstr "eduGAIN" + +msgid "InCommon" +msgstr "InCommon" + diff --git a/.extlib/simplesamlphp/modules/discopower/locales/zu/LC_MESSAGES/discopower.po b/.extlib/simplesamlphp/modules/discopower/locales/zu/LC_MESSAGES/discopower.po new file mode 100644 index 000000000..bd6fd92b0 --- /dev/null +++ b/.extlib/simplesamlphp/modules/discopower/locales/zu/LC_MESSAGES/discopower.po @@ -0,0 +1,40 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2018-11-15 14:48+0200\n" +"PO-Revision-Date: 2018-11-15 14:48+0200\n" +"Last-Translator: \n" +"Language-Team: \n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 1.3\n" + +msgid "{discopower:tabs:misc}" +msgstr "Ezihlukahlukene" + +msgid "{discopower:tabs:sweden}" +msgstr "Sweden" + +msgid "{discopower:tabs:incremental_search}" +msgstr "Ukucinga okukhulayo..." + +msgid "{discopower:tabs:southafrica}" +msgstr "iNingizimu Afrika" + +msgid "{discopower:tabs:switzerland}" +msgstr "ESwitzerland" + +msgid "{discopower:tabs:iceland}" +msgstr "I-Iceland" + +msgid "{discopower:tabs:edugain}" +msgstr "eduGAIN" + +msgid "{discopower:tabs:norway}" +msgstr "ENorway" + diff --git a/.extlib/simplesamlphp/modules/discopower/public/assets/css/disco.css b/.extlib/simplesamlphp/modules/discopower/public/assets/css/disco.css new file mode 100644 index 000000000..09366b758 --- /dev/null +++ b/.extlib/simplesamlphp/modules/discopower/public/assets/css/disco.css @@ -0,0 +1,101 @@ +.inlinesearch { + float: right; + margin: 0em 3px .5em 1em; +} +.inlinesearch input { + border: 1px solid #ccc; + padding: 2px 2px 2px 20px; + margin: 0px 2px 0px 0px; +} +.inlinesearch * { + margin: 0px; + padding: 0px; +} +div.metalist { + clear: both; + list-style: none; + margin: 1em 2px .5em 2px; + padding: 0px; +} +a.metaentry { + display: block; + border: 1px solid #ccc; + margin: 0px 0px -1px 0px; + padding: .2em 1em .2em 20px; + cursor: pointer; + cursor: hand; +} +a.metaentry.favourite::before { +} +a.metaentry:hover { + border: 1px solid #ccc; + background: #eee; +} +a.metaentry img.entryicon { + display: none; +} +a.metaentry:hover img.entryicon { + display: inline; + top: 0px; + bottom: 0px; + clear: both; + float: right; + margin: 1em; + padding: 3px; + border: 1px solid #999; +} + +div.favourite { + margin: 1em 0px; + padding: 1em; + border: 1px solid #ccc; + background-color: #eee; +} +#favouritesubmit { + margin-top: 1ex; +} + +#favouriteremember { + margin: 1ex 0 0; +} + +div#content { + margin: .4em ! important; +} + +form { + display: inline; +} + +table#statmeta { + width: 100%; +} + +ul.tabset_tabs { + margin: 0px; + padding: 0px; + list-style: none; +} + +ul.tabset_tabs li { + background: none; + color: #222; + display: inline-block; + padding: 10px 15px; + cursor: pointer; +} + +ul.tabset_tabs li.current { + background: #ededed; + color: #222; +} + +.tabset_content { + display: none; + background: #ededed; + padding: 15px; +} + +.tabset_content.current { + display: inherit; +} diff --git a/.extlib/simplesamlphp/modules/discopower/public/assets/css/ui-theme-1.13.2/images/ui-bg_glass_55_fbf9ee_1x400.png b/.extlib/simplesamlphp/modules/discopower/public/assets/css/ui-theme-1.13.2/images/ui-bg_glass_55_fbf9ee_1x400.png new file mode 100644 index 0000000000000000000000000000000000000000..d1a47ab50141f22e0436bda1d605f63ba597ff29 GIT binary patch literal 445 zcmeAS@N?(olHy`uVBq!ia0vp^j6gI&fCzz`*b-fq}tl1_Oh5!JJ)zHb4osByV?@|6srw@%;`^ zguTSm*OmPlJD-R#$NrV_n}9;So-U3d9>?FFSL9-H6lr)^KQBojr@3RpVm3z!!)lJ# zVXGqzGVlJbU_RJf(JETj{aE_oBT<*b-tj*!`|o?X%#xcyqAgM4KHJqPuV&q;{q`>I z1B+MUiJr9vN$<*>9G|F&=-dsQv0;%?yot%j%P074w*(g^i@m9I-Mh{614}p;vrV?+ ziwpm|GY=c|$bVw9NmL2$cvGndbeL+1YeY#(Vo9o1a#1RfVlXl=GSW3L*EKW=F*2|+ zHMBCY&^9ozGB7AFeCLg#AvZrIGp!Q01~#3r??4S2a2rZ8b5n~;5_1c1>j|_h*8u8a N@O1TaS?83{1OT1Qk`Vv^ literal 0 HcmV?d00001 diff --git a/.extlib/simplesamlphp/modules/discopower/public/assets/css/ui-theme-1.13.2/images/ui-bg_glass_65_ffffff_1x400.png b/.extlib/simplesamlphp/modules/discopower/public/assets/css/ui-theme-1.13.2/images/ui-bg_glass_65_ffffff_1x400.png new file mode 100644 index 0000000000000000000000000000000000000000..32e6d9fc55127b7674bf00ad0967167090faf956 GIT binary patch literal 317 zcmeAS@N?(olHy`uVBq!ia0vp^j6gI2NH8$CE1Q=ADVB6cUq=Rpjs4tz5?O(Kg=CK) zUj~LMH3o);76yi2K%s^g3=E|P3=FRl7#OT(FffQ0%-I!a1C(G&@^*J&V7%KUyadQ& zFY)wsWq-!bCt}R8f2I5;ppc-ai(`n!`Q(fQiPpshB99svre>UAylk>D6DX-#;u=ws zl30>zm0Xkxq!^40jEr;*%ykV-LW~ToObx9JEVK;_tPBjw3*UL8Xvob^$xN%nt$|G^ m>^o3{2Hb{{%-q!ClEmBs+Nn{1`6_P!I zd>I(3)EF2VS{N990fib~Fff!FFfhDIU|_JC!N4G1FlSew4N!t9$=luK|9_FyhG&61 z_7YEDSN3P@d?Lmi`&Y_u0t$J1x;TbdoKCLzHNUelQKVN%Yw`N+l6lpJhW`?iMADN? z5_kM>@6>F6c#&OgSy|iie#v>i4Gq~03}+b_{!2@WIe0|D_yeDut1}}bgUmZ&g?PLC zdZ4kYC9V-ADTyViR>?)FK#IZ0z{p6~z+BhRB*e(T%GA)xz(U)=z{Nn{1`6_P!I zd>I(3)EF2VS{N990fib~Fff!FFfhDIU|_JC!N4G1FlSew4N!t9$=luK|9_FyhG&61 z_7YEDSN3P@d?Lmi`&Y_u0t)$fx;TbdoKCKoe*DM*gDyA0Qo+NU(|OMKO3b^Tm~`j# zk&4F7kJ`eI&DGra)ZF~kj^+FG#LtwFH?B!ZONu!9!LzT^vEqQNO;;NW6T=k)A**{I z6ixumRV{IiC`m~yNwrEYN(E93Mg~Skx(4RDh9)6K23DqqRt6T@1_o9J2IYnCyiqjd v=BH$)RpQpbrW5uZs6hj6LrG?CYH>+oZUJsRftKYOKs^keu6{1-oD!M<#(rz` literal 0 HcmV?d00001 diff --git a/.extlib/simplesamlphp/modules/discopower/public/assets/css/ui-theme-1.13.2/images/ui-bg_glass_95_fef1ec_1x400.png b/.extlib/simplesamlphp/modules/discopower/public/assets/css/ui-theme-1.13.2/images/ui-bg_glass_95_fef1ec_1x400.png new file mode 100644 index 0000000000000000000000000000000000000000..7e9cfd0944880151a5e8fc6dc2f61ccb9a3def49 GIT binary patch literal 442 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 GH~#_TRY|P? literal 0 HcmV?d00001 diff --git a/.extlib/simplesamlphp/modules/discopower/public/assets/css/ui-theme-1.13.2/images/ui-icons_2e83ff_256x240.png b/.extlib/simplesamlphp/modules/discopower/public/assets/css/ui-theme-1.13.2/images/ui-icons_2e83ff_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..4f47a15cfd500a8da6a2b8c66865b49bb9193b40 GIT binary patch literal 4670 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 Mx~4jBwa~Hu13@F3j{pDw literal 0 HcmV?d00001 diff --git a/.extlib/simplesamlphp/modules/discopower/public/assets/css/ui-theme-1.13.2/images/ui-icons_454545_256x240.png b/.extlib/simplesamlphp/modules/discopower/public/assets/css/ui-theme-1.13.2/images/ui-icons_454545_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..bf0e4b1c756c52ed04a985e7d0c7d34915aadea8 GIT binary patch literal 7142 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 literal 0 HcmV?d00001 diff --git a/.extlib/simplesamlphp/modules/discopower/public/assets/css/ui-theme-1.13.2/images/ui-icons_cd0a0a_256x240.png b/.extlib/simplesamlphp/modules/discopower/public/assets/css/ui-theme-1.13.2/images/ui-icons_cd0a0a_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..8623f32ad46e9b919edab8b9bebe695b724659a4 GIT binary patch literal 4670 zcmeHLg;Uhs*Z+QZ=?V#ASAlH` z=y^Y`r+<7dNLAB74sB2~f0HH7dz{CQ;@ADzd3IGJa0bmUU0E$@v z!0MY@XL|j7F~%E)7FvB&RR3-NHv(GJ(J#)UW`i~}HV3SA!Y)Z>%{TM}x#X577QM4E z4*iL6eqjDcJ2lI1 zFbh{($hY^MPrr_rZug}ml;Jvx7aw(>rw0HX40JSs1X6C@bAueMXQV~GOip(}ilV8I zw;TZIJ@quzEP}sp+@W@ytYReV(k)ueO5?0G$dUJMfceXcciG(;3-B7w_gqvg#Jwei zo}Iww- z$>0!$MKK{J9p4rYlkkG5iV&1i;3)jkL=g;xV6(70+qNvI@I1u{N?H*7UmlxUvsz{nic z4C8$dza05DU}(Y zQKNl&-8PN^41-XdaKxG%I!RnC@qemtO-f1hYtKuW__5e}ZryQ_Sh%;sw9o5#j=BQY z^~FqO%{deLbX_rW5^-HDgke;1x^S|Q+IHu7e$wgR*t8mHop}{1Pd{!g=bXOtwvV1x z%#yTdYZOx{yxp;T*K1@DNEh2)80N5h(Y;P*jIXO7;Ou&c9`i}`DTFkZH;0-sszSs~ zc1CSvaaZjiko#XAjP!=l1RooS3@Jygk_+T|wahOAx0SB4w6@qANcZzhFnCJi^E{lh z(v1hI$1#7<+JGnMlb3Cbv(5tULvx?`esE%e<0#8Me%QSj`jZrO2ZK&Uv6da~v}VUh ztWR^{cdcm*vq&kb)OqW4z5%2IPfI?ShjLDzHm` z;V@h?g_94m=zLS2DJ4s=j(rs4J)yKle?pN&EOAARj@pP{MS`tWfxju#BSHgA1mLf~54zbGje z6n2rYyvQCnygitRA{=Bfw3}d380Jsy`&Y_V(yvP}CD>`?VAOZ%iN|j|69^xXe-qcb zuN~UvXM4XUUm@dsejwa-v!Zjv`^;tVugS6df>M1NELo00_=e)9Y2BvQ1AURY=vE<6?S*;8TNl?_>KNOqf*~;t! z^)Z8I;f5G@GroN}FB%oy5o*g|t7dobkA6VbCLsh6|^iaI(~(9i||dpG+xTt zguGja&DE%f^L5QPTyKIZL}*h4@Q2J*FHsYeUXd75fGBIcEn$lvE4sPJ)cOM^3Jycc zPnr6zI7k*q1X5|g?A<*OOOf0EX-qvw5?cotm$u_y_f0XSWbaqDSw;Z$0$hA740W_O zH?nj5;n|G=P%C-(im31Y32+7Lgk{Ll$Q0E_Z|}3k=M$Lv=^FAg0_BP#|0(azU)!%# zl}WeiWieg^0k!-u(>hCDYo-FD&4HYb1D+u>dADm}IL{vSlcb9G+cRTM6#)pku1VQZ z)gEc6)RI=-5AzG_ov?u*8=ZcAt^8!wqC3Chz>sptEq6)f9NXGx&z_NeHyOcnsb^J( z2Nw5~I>z=S@Q$yW{L<+viQRHOZ;*9Lxe6|j2yx{78nx{De)evk657FW^%J$+hpG!l zvd`4LJ6qD}VdT0uH;^K>w6WhON|)N_Qrf!O#mqJoZ%VOvq1z}6T*w(f6Q1kgfoI@z z+3vUDt~JVb5F$xrW@!_OG=pH`#1+;#9-L-ATb<$Qs!}<2SjPBG9v;*1;0Kl|@Hu-9 zH!HX=h!H{26RGF}V%`$ny2b8-k<2d>ng~Mg938-pR!CAJsmSATjRTBFipSz@v)T6< zd+w8X$*hh~&;khrffY8_6+^F@CXORkzE7gmeU%&F@goxNy0dRm;n=dW_%1BIQ?OyZ ziHTQ%!tFI~*p1;6ZPPSlOmqQy06o`BuJ3B!PGx zWAcf(u=>pJC@1o`;tJy6Y}jAL9NkZ5>YtWjw8N~5F}}|{aX<@K2~pdBU#({9wKmwb z^bo)CTAA0HlFaWOsVSObo0eDbpIx0gYa!8nsk>RCXV>;Dr0X`dmTlnNdrds>RIJT;&gSLvN_lWDP6w-c`Pb$ z!&v(jEq!4@zOdPbr>lnw8RNF$hmmt*mivm9P zF(O3g{+M~YEP0$(Mjscoz6z;>(G1el(b3UB)~?+S=h6=oi|mYx&+w;_S2E`Y=%dB+ zhbG9#)g;NnkjbD7RR64nLT9VsfM;#U>b`F@+YM6gSN5gZ_3nFrjuwB%vnBY`WVyJy zy86bkW2>8uW=VO96K_rPaMXQR_E)yQqJubo>OqD-awAT8(S4mnxienjas&)7!oe!f z@pvG*qW&P6Qx#vX^Oei~U1h!Qi0*N{o^oVb7LstO+w@H)Ec^Lj&vRPN=~K+c;>t*| zz-6(63s$SUnG)YoRsNFamGhc4KR9TQz&p&a`-R{o=Yg;VY%5xl`wIRnR^`aBZ3+c! zjkFNflHSZz(u&w8nj9s!Wi#eXhE$0hBM-#g?${OpYp+>m+#oX*3JH^_T>&a1%G;q> z@&X!z025?rPm|_U@rA~C;rAcOJx%oKFMJn-aLQ$z1n!L5zHlC))x&Us78K$37T#6% zNv!R{r~5k&_G>!#|RjSs2zwOWve%b~2^5URl?(AYdTZoir_g#%{pE&Y;h zzCsN_*0ba%Z(?mOnh70h_znZE-}6Uv22X*uRlc zTu~lbFwafQ)ntPot%kEQINC}N48beCK_o{2! znY>a{%ZgAK%H^9-$tQmAoip+hEj)&$j0J?=#+Nw)ZKEBSs4YlXqhn7{6e9{3f%xa3 z=!-j3C?_QCH9;bXTpQErcHLdHzw>POxr9z^u|L^&7Tzs^58LHl%|?E;tEW`STn98X7IuVE^`fV9Y}cM$UXZ($_OGY+>GkqTvzPvzCQ=q2uW>Txj^@x4)SrDFAJKRm%Cu!^gQV+ztG(y zRof)m;|KLBtX4aP$Nz+W20K6=>r|ImR6JGL*yu;GcZ^9fto{~|fg2sOqO*&1`xVNa z?frILIOs!ZDHln&%G?t%Z0bOUPq1Cj$j$GPr+@*OFs?Bc6M@!F;u@gM}{iC)>=$>Jz z#?6MqTxmABge6u({>TV*M49sIIAzK$Z6VlPlgZO8nUr0?i5eY6TMihcOG+6{UKbP7ZmM{Y^r(<8i(DaoGM zUQDy(bz9<#Ykacb@FXzf3)}b9Rf2B7UnOIMpdXYW@OS&abm@8lcf7$<9r~R!=$9Rt z%fJaqx_Ak8o0)G#Rhdh!sPr;PvLQwEa^IDwk&$wNn$$JF9Pvg?)PF1I9CtaoMt+e* zbv3acJQ)zBhn9np%q)og2D9HeEH}J;#F2E6@0D`q$QX@)gGz2_ zIaxmO=%LkbBsb@ZCum75E{;S}*X;a0Y@n9kYpQZY05)gEj!-q~70A1wT~0;`zZ2f1 zNBQ9_)A1(fFYzmAEo-!sJ=$5((a-r@0FrP?Nm00*sD!kIBwSHiPEkhk8XT?&hg;oa zSpI(mFCQm&mk>ZgL0(2w0xl{kYXO&6l#n@}`Y+*9uQ~ZSLGXV)pxwQk{n7SbzW?Dw zMnVxT|1ZZ>AxQ9?!~U0J?&E?EviEZa)SP@AocZ*;>|LGBob8=L?sYkzf9e2$o|duZ JM|D*6{{Rl%P-y@F literal 0 HcmV?d00001 diff --git a/.extlib/simplesamlphp/modules/discopower/public/assets/css/ui-theme-1.13.2/jquery-ui.min.css b/.extlib/simplesamlphp/modules/discopower/public/assets/css/ui-theme-1.13.2/jquery-ui.min.css new file mode 100644 index 000000000..3cad40996 --- /dev/null +++ b/.extlib/simplesamlphp/modules/discopower/public/assets/css/ui-theme-1.13.2/jquery-ui.min.css @@ -0,0 +1,7 @@ +/*! jQuery UI - v1.13.2 - 2022-07-14 +* http://jqueryui.com +* Includes: core.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, dialog.css, draggable.css, resizable.css, progressbar.css, selectable.css, selectmenu.css, slider.css, sortable.css, spinner.css, tabs.css, tooltip.css, theme.css +* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana%2CArial%2Csans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=cccccc&bgTextureHeader=highlight_soft&bgImgOpacityHeader=75&borderColorHeader=aaaaaa&fcHeader=222222&iconColorHeader=222222&bgColorContent=ffffff&bgTextureContent=flat&bgImgOpacityContent=75&borderColorContent=aaaaaa&fcContent=222222&iconColorContent=222222&bgColorDefault=e6e6e6&bgTextureDefault=glass&bgImgOpacityDefault=75&borderColorDefault=d3d3d3&fcDefault=555555&iconColorDefault=888888&bgColorHover=dadada&bgTextureHover=glass&bgImgOpacityHover=75&borderColorHover=999999&fcHover=212121&iconColorHover=454545&bgColorActive=ffffff&bgTextureActive=glass&bgImgOpacityActive=65&borderColorActive=aaaaaa&fcActive=212121&iconColorActive=454545&bgColorHighlight=fbf9ee&bgTextureHighlight=glass&bgImgOpacityHighlight=55&borderColorHighlight=fcefa1&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=glass&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px +* Copyright jQuery Foundation and other contributors; Licensed MIT */ + +.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;-ms-filter:"alpha(opacity=0)"}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important;pointer-events:none}.ui-icon{display:inline-block;vertical-align:middle;margin-top:-.25em;position:relative;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-icon-block{left:50%;margin-left:-8px;display:block}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin:2px 0 0 0;padding:.5em .5em .5em .7em;font-size:100%}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:0}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{margin:0;cursor:pointer;list-style-image:url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")}.ui-menu .ui-menu-item-wrapper{position:relative;padding:3px 1em 3px .4em}.ui-menu .ui-menu-divider{margin:5px 0;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-state-focus,.ui-menu .ui-state-active{margin:-1px}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item-wrapper{padding-left:2em}.ui-menu .ui-icon{position:absolute;top:0;bottom:0;left:.2em;margin:auto 0}.ui-menu .ui-menu-icon{left:auto;right:0}.ui-button{padding:.4em 1em;display:inline-block;position:relative;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2em;box-sizing:border-box;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-button-icon-only{text-indent:0}.ui-button-icon-only .ui-icon{position:absolute;top:50%;left:50%;margin-top:-8px;margin-left:-8px}.ui-button.ui-icon-notext .ui-icon{padding:0;width:2.1em;height:2.1em;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-icon-notext .ui-icon{width:auto;height:auto;text-indent:0;white-space:normal;padding:.4em 1em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-controlgroup{vertical-align:middle;display:inline-block}.ui-controlgroup > .ui-controlgroup-item{float:left;margin-left:0;margin-right:0}.ui-controlgroup > .ui-controlgroup-item:focus,.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus{z-index:9999}.ui-controlgroup-vertical > .ui-controlgroup-item{display:block;float:none;width:100%;margin-top:0;margin-bottom:0;text-align:left}.ui-controlgroup-vertical .ui-controlgroup-item{box-sizing:border-box}.ui-controlgroup .ui-controlgroup-label{padding:.4em 1em}.ui-controlgroup .ui-controlgroup-label span{font-size:80%}.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item{border-left:none}.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item{border-top:none}.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content{border-right:none}.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content{border-bottom:none}.ui-controlgroup-vertical .ui-spinner-input{width:75%;width:calc( 100% - 2.4em )}.ui-controlgroup-vertical .ui-spinner .ui-spinner-up{border-top-style:solid}.ui-checkboxradio-label .ui-icon-background{box-shadow:inset 1px 1px 1px #ccc;border-radius:.12em;border:none}.ui-checkboxradio-radio-label .ui-icon-background{width:16px;height:16px;border-radius:1em;overflow:visible;border:none}.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon{background-image:none;width:8px;height:8px;border-width:4px;border-style:solid}.ui-checkboxradio-disabled{pointer-events:none}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:45%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:bold;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-datepicker .ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat;left:.5em;top:.3em}.ui-dialog{position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:20px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-n{height:2px;top:0}.ui-dialog .ui-resizable-e{width:2px;right:0}.ui-dialog .ui-resizable-s{height:2px;bottom:0}.ui-dialog .ui-resizable-w{width:2px;left:0}.ui-dialog .ui-resizable-se,.ui-dialog .ui-resizable-sw,.ui-dialog .ui-resizable-ne,.ui-dialog .ui-resizable-nw{width:7px;height:7px}.ui-dialog .ui-resizable-se{right:0;bottom:0}.ui-dialog .ui-resizable-sw{left:0;bottom:0}.ui-dialog .ui-resizable-ne{right:0;top:0}.ui-dialog .ui-resizable-nw{left:0;top:0}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-draggable-handle{-ms-touch-action:none;touch-action:none}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block;-ms-touch-action:none;touch-action:none}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url("data:image/gif;base64,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");height:100%;-ms-filter:"alpha(opacity=25)";opacity:0.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-selectable{-ms-touch-action:none;touch-action:none}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black}.ui-selectmenu-menu{padding:0;margin:0;position:absolute;top:0;left:0;display:none}.ui-selectmenu-menu .ui-menu{overflow:auto;overflow-x:hidden;padding-bottom:1px}.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup{font-size:1em;font-weight:bold;line-height:1.5;padding:2px 0.4em;margin:0.5em 0 0 0;height:auto;border:0}.ui-selectmenu-open{display:block}.ui-selectmenu-text{display:block;margin-right:20px;overflow:hidden;text-overflow:ellipsis}.ui-selectmenu-button.ui-button{text-align:left;white-space:nowrap;width:14em}.ui-selectmenu-icon.ui-icon{float:right;margin-top:0}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:pointer;-ms-touch-action:none;touch-action:none}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-sortable-handle{-ms-touch-action:none;touch-action:none}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:none;background:none;color:inherit;padding:.222em 0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:2em}.ui-spinner-button{width:1.6em;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top-style:none;border-bottom-style:none;border-right-style:none}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav .ui-tabs-anchor{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor{cursor:text}.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px}body .ui-tooltip{border-width:2px}.ui-widget{font-family:Verdana,Arial,sans-serif;font-size:1.1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Verdana,Arial,sans-serif;font-size:1em}.ui-widget.ui-widget-content{border:1px solid #d3d3d3}.ui-widget-content{border:1px solid #aaa;background:#fff;color:#222}.ui-widget-content a{color:#222}.ui-widget-header{border:1px solid #aaa;background:#ccc url("images/ui-bg_highlight-soft_75_cccccc_1x100.png") 50% 50% repeat-x;color:#222;font-weight:bold}.ui-widget-header a{color:#222}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default,.ui-button,html .ui-button.ui-state-disabled:hover,html .ui-button.ui-state-disabled:active{border:1px solid #d3d3d3;background:#e6e6e6 url("images/ui-bg_glass_75_e6e6e6_1x400.png") 50% 50% repeat-x;font-weight:normal;color:#555}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited,a.ui-button,a:link.ui-button,a:visited.ui-button,.ui-button{color:#555;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus,.ui-button:hover,.ui-button:focus{border:1px solid #999;background:#dadada url("images/ui-bg_glass_75_dadada_1x400.png") 50% 50% repeat-x;font-weight:normal;color:#212121}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited,a.ui-button:hover,a.ui-button:focus{color:#212121;text-decoration:none}.ui-visual-focus{box-shadow:0 0 3px 1px rgb(94,158,214)}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active,a.ui-button:active,.ui-button:active,.ui-button.ui-state-active:hover{border:1px solid #aaa;background:#fff url("images/ui-bg_glass_65_ffffff_1x400.png") 50% 50% repeat-x;font-weight:normal;color:#212121}.ui-icon-background,.ui-state-active .ui-icon-background{border:#aaa;background-color:#212121}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#212121;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #fcefa1;background:#fbf9ee url("images/ui-bg_glass_55_fbf9ee_1x400.png") 50% 50% repeat-x;color:#363636}.ui-state-checked{border:1px solid #fcefa1;background:#fbf9ee}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#363636}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #cd0a0a;background:#fef1ec url("images/ui-bg_glass_95_fef1ec_1x400.png") 50% 50% repeat-x;color:#cd0a0a}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#cd0a0a}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#cd0a0a}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;-ms-filter:"alpha(opacity=70)";font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;-ms-filter:"alpha(opacity=35)";background-image:none}.ui-state-disabled .ui-icon{-ms-filter:"alpha(opacity=35)"}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url("images/ui-icons_222222_256x240.png")}.ui-widget-header .ui-icon{background-image:url("images/ui-icons_222222_256x240.png")}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon,.ui-button:hover .ui-icon,.ui-button:focus .ui-icon{background-image:url("images/ui-icons_454545_256x240.png")}.ui-state-active .ui-icon,.ui-button:active .ui-icon{background-image:url("images/ui-icons_454545_256x240.png")}.ui-state-highlight .ui-icon,.ui-button .ui-state-highlight.ui-icon{background-image:url("images/ui-icons_2e83ff_256x240.png")}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url("images/ui-icons_cd0a0a_256x240.png")}.ui-button .ui-icon{background-image:url("images/ui-icons_888888_256x240.png")}.ui-icon-blank.ui-icon-blank.ui-icon-blank{background-image:none}.ui-icon-caret-1-n{background-position:0 0}.ui-icon-caret-1-ne{background-position:-16px 0}.ui-icon-caret-1-e{background-position:-32px 0}.ui-icon-caret-1-se{background-position:-48px 0}.ui-icon-caret-1-s{background-position:-65px 0}.ui-icon-caret-1-sw{background-position:-80px 0}.ui-icon-caret-1-w{background-position:-96px 0}.ui-icon-caret-1-nw{background-position:-112px 0}.ui-icon-caret-2-n-s{background-position:-128px 0}.ui-icon-caret-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-65px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-65px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:1px -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:4px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:4px}.ui-widget-overlay{background:#aaa;opacity:.3;-ms-filter:Alpha(Opacity=30)}.ui-widget-shadow{-webkit-box-shadow:-8px -8px 8px #aaa;box-shadow:-8px -8px 8px #aaa} \ No newline at end of file diff --git a/.extlib/simplesamlphp/modules/discopower/public/assets/js/jquery-3.6.0.min.js b/.extlib/simplesamlphp/modules/discopower/public/assets/js/jquery-3.6.0.min.js new file mode 100644 index 000000000..c4c6022f2 --- /dev/null +++ b/.extlib/simplesamlphp/modules/discopower/public/assets/js/jquery-3.6.0.min.js @@ -0,0 +1,2 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0",options:{classes:{},disabled:!1,create:null},_createWidget:function(t,e){e=V(e||this.defaultElement||this)[0],this.element=V(e),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=V(),this.hoverable=V(),this.focusable=V(),this.classesElementLookup={},e!==this&&(V.data(e,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===e&&this.destroy()}}),this.document=V(e.style?e.ownerDocument:e.document||e),this.window=V(this.document[0].defaultView||this.document[0].parentWindow)),this.options=V.widget.extend({},this.options,this._getCreateOptions(),t),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:V.noop,_create:V.noop,_init:V.noop,destroy:function(){var i=this;this._destroy(),V.each(this.classesElementLookup,function(t,e){i._removeClass(e,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:V.noop,widget:function(){return this.element},option:function(t,e){var i,s,n,o=t;if(0===arguments.length)return V.widget.extend({},this.options);if("string"==typeof t)if(o={},t=(i=t.split(".")).shift(),i.length){for(s=o[t]=V.widget.extend({},this.options[t]),n=0;n
"),i=e.children()[0];return V("body").append(e),t=i.offsetWidth,e.css("overflow","scroll"),t===(i=i.offsetWidth)&&(i=e[0].clientWidth),e.remove(),s=t-i},getScrollInfo:function(t){var e=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),i=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),e="scroll"===e||"auto"===e&&t.widthx(k(s),k(n))?o.important="horizontal":o.important="vertical",u.using.call(this,t,o)}),a.offset(V.extend(h,{using:t}))})},V.ui.position={fit:{left:function(t,e){var i=e.within,s=i.isWindow?i.scrollLeft:i.offset.left,n=i.width,o=t.left-e.collisionPosition.marginLeft,a=s-o,r=o+e.collisionWidth-n-s;e.collisionWidth>n?0n?0")[0],w=d.each;function P(t){return null==t?t+"":"object"==typeof t?p[e.call(t)]||"object":typeof t}function M(t,e,i){var s=v[e.type]||{};return null==t?i||!e.def?null:e.def:(t=s.floor?~~t:parseFloat(t),isNaN(t)?e.def:s.mod?(t+s.mod)%s.mod:Math.min(s.max,Math.max(0,t)))}function S(s){var n=m(),o=n._rgba=[];return s=s.toLowerCase(),w(g,function(t,e){var i=e.re.exec(s),i=i&&e.parse(i),e=e.space||"rgba";if(i)return i=n[e](i),n[_[e].cache]=i[_[e].cache],o=n._rgba=i._rgba,!1}),o.length?("0,0,0,0"===o.join()&&d.extend(o,B.transparent),n):B[s]}function H(t,e,i){return 6*(i=(i+1)%1)<1?t+(e-t)*i*6:2*i<1?e:3*i<2?t+(e-t)*(2/3-i)*6:t}y.style.cssText="background-color:rgba(1,1,1,.5)",b.rgba=-1o.mod/2?s+=o.mod:s-n>o.mod/2&&(s-=o.mod)),l[i]=M((n-s)*a+s,e)))}),this[e](l)},blend:function(t){if(1===this._rgba[3])return this;var e=this._rgba.slice(),i=e.pop(),s=m(t)._rgba;return m(d.map(e,function(t,e){return(1-i)*s[e]+i*t}))},toRgbaString:function(){var t="rgba(",e=d.map(this._rgba,function(t,e){return null!=t?t:2").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0}),e={width:i.width(),height:i.height()},n=document.activeElement;try{n.id}catch(t){n=document.body}return i.wrap(t),i[0]!==n&&!V.contains(i[0],n)||V(n).trigger("focus"),t=i.parent(),"static"===i.css("position")?(t.css({position:"relative"}),i.css({position:"relative"})):(V.extend(s,{position:i.css("position"),zIndex:i.css("z-index")}),V.each(["top","left","bottom","right"],function(t,e){s[e]=i.css(e),isNaN(parseInt(s[e],10))&&(s[e]="auto")}),i.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"})),i.css(e),t.css(s).show()},removeWrapper:function(t){var e=document.activeElement;return t.parent().is(".ui-effects-wrapper")&&(t.parent().replaceWith(t),t[0]!==e&&!V.contains(t[0],e)||V(e).trigger("focus")),t}}),V.extend(V.effects,{version:"1.13.2",define:function(t,e,i){return i||(i=e,e="effect"),V.effects.effect[t]=i,V.effects.effect[t].mode=e,i},scaledDimensions:function(t,e,i){if(0===e)return{height:0,width:0,outerHeight:0,outerWidth:0};var s="horizontal"!==i?(e||100)/100:1,e="vertical"!==i?(e||100)/100:1;return{height:t.height()*e,width:t.width()*s,outerHeight:t.outerHeight()*e,outerWidth:t.outerWidth()*s}},clipToBox:function(t){return{width:t.clip.right-t.clip.left,height:t.clip.bottom-t.clip.top,left:t.clip.left,top:t.clip.top}},unshift:function(t,e,i){var s=t.queue();1").insertAfter(t).css({display:/^(inline|ruby)/.test(t.css("display"))?"inline-block":"block",visibility:"hidden",marginTop:t.css("marginTop"),marginBottom:t.css("marginBottom"),marginLeft:t.css("marginLeft"),marginRight:t.css("marginRight"),float:t.css("float")}).outerWidth(t.outerWidth()).outerHeight(t.outerHeight()).addClass("ui-effects-placeholder"),t.data(j+"placeholder",e)),t.css({position:i,left:s.left,top:s.top}),e},removePlaceholder:function(t){var e=j+"placeholder",i=t.data(e);i&&(i.remove(),t.removeData(e))},cleanUp:function(t){V.effects.restoreStyle(t),V.effects.removePlaceholder(t)},setTransition:function(s,t,n,o){return o=o||{},V.each(t,function(t,e){var i=s.cssUnit(e);0");l.appendTo("body").addClass(t.className).css({top:s.top-a,left:s.left-r,height:i.innerHeight(),width:i.innerWidth(),position:n?"fixed":"absolute"}).animate(o,t.duration,t.easing,function(){l.remove(),"function"==typeof e&&e()})}}),V.fx.step.clip=function(t){t.clipInit||(t.start=V(t.elem).cssClip(),"string"==typeof t.end&&(t.end=G(t.end,t.elem)),t.clipInit=!0),V(t.elem).cssClip({top:t.pos*(t.end.top-t.start.top)+t.start.top,right:t.pos*(t.end.right-t.start.right)+t.start.right,bottom:t.pos*(t.end.bottom-t.start.bottom)+t.start.bottom,left:t.pos*(t.end.left-t.start.left)+t.start.left})},Y={},V.each(["Quad","Cubic","Quart","Quint","Expo"],function(e,t){Y[t]=function(t){return Math.pow(t,e+2)}}),V.extend(Y,{Sine:function(t){return 1-Math.cos(t*Math.PI/2)},Circ:function(t){return 1-Math.sqrt(1-t*t)},Elastic:function(t){return 0===t||1===t?t:-Math.pow(2,8*(t-1))*Math.sin((80*(t-1)-7.5)*Math.PI/15)},Back:function(t){return t*t*(3*t-2)},Bounce:function(t){for(var e,i=4;t<((e=Math.pow(2,--i))-1)/11;);return 1/Math.pow(4,3-i)-7.5625*Math.pow((3*e-2)/22-t,2)}}),V.each(Y,function(t,e){V.easing["easeIn"+t]=e,V.easing["easeOut"+t]=function(t){return 1-e(1-t)},V.easing["easeInOut"+t]=function(t){return t<.5?e(2*t)/2:1-e(-2*t+2)/2}});y=V.effects,V.effects.define("blind","hide",function(t,e){var i={up:["bottom","top"],vertical:["bottom","top"],down:["top","bottom"],left:["right","left"],horizontal:["right","left"],right:["left","right"]},s=V(this),n=t.direction||"up",o=s.cssClip(),a={clip:V.extend({},o)},r=V.effects.createPlaceholder(s);a.clip[i[n][0]]=a.clip[i[n][1]],"show"===t.mode&&(s.cssClip(a.clip),r&&r.css(V.effects.clipToBox(a)),a.clip=o),r&&r.animate(V.effects.clipToBox(a),t.duration,t.easing),s.animate(a,{queue:!1,duration:t.duration,easing:t.easing,complete:e})}),V.effects.define("bounce",function(t,e){var i,s,n=V(this),o=t.mode,a="hide"===o,r="show"===o,l=t.direction||"up",h=t.distance,c=t.times||5,o=2*c+(r||a?1:0),u=t.duration/o,d=t.easing,p="up"===l||"down"===l?"top":"left",f="up"===l||"left"===l,g=0,t=n.queue().length;for(V.effects.createPlaceholder(n),l=n.css(p),h=h||n["top"==p?"outerHeight":"outerWidth"]()/3,r&&((s={opacity:1})[p]=l,n.css("opacity",0).css(p,f?2*-h:2*h).animate(s,u,d)),a&&(h/=Math.pow(2,c-1)),(s={})[p]=l;g").css({position:"absolute",visibility:"visible",left:-s*p,top:-i*f}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:p,height:f,left:n+(u?a*p:0),top:o+(u?r*f:0),opacity:u?0:1}).animate({left:n+(u?0:a*p),top:o+(u?0:r*f),opacity:u?1:0},t.duration||500,t.easing,m)}),V.effects.define("fade","toggle",function(t,e){var i="show"===t.mode;V(this).css("opacity",i?0:1).animate({opacity:i?1:0},{queue:!1,duration:t.duration,easing:t.easing,complete:e})}),V.effects.define("fold","hide",function(e,t){var i=V(this),s=e.mode,n="show"===s,o="hide"===s,a=e.size||15,r=/([0-9]+)%/.exec(a),l=!!e.horizFirst?["right","bottom"]:["bottom","right"],h=e.duration/2,c=V.effects.createPlaceholder(i),u=i.cssClip(),d={clip:V.extend({},u)},p={clip:V.extend({},u)},f=[u[l[0]],u[l[1]]],s=i.queue().length;r&&(a=parseInt(r[1],10)/100*f[o?0:1]),d.clip[l[0]]=a,p.clip[l[0]]=a,p.clip[l[1]]=0,n&&(i.cssClip(p.clip),c&&c.css(V.effects.clipToBox(p)),p.clip=u),i.queue(function(t){c&&c.animate(V.effects.clipToBox(d),h,e.easing).animate(V.effects.clipToBox(p),h,e.easing),t()}).animate(d,h,e.easing).animate(p,h,e.easing).queue(t),V.effects.unshift(i,s,4)}),V.effects.define("highlight","show",function(t,e){var i=V(this),s={backgroundColor:i.css("backgroundColor")};"hide"===t.mode&&(s.opacity=0),V.effects.saveStyle(i),i.css({backgroundImage:"none",backgroundColor:t.color||"#ffff99"}).animate(s,{queue:!1,duration:t.duration,easing:t.easing,complete:e})}),V.effects.define("size",function(s,e){var n,i=V(this),t=["fontSize"],o=["borderTopWidth","borderBottomWidth","paddingTop","paddingBottom"],a=["borderLeftWidth","borderRightWidth","paddingLeft","paddingRight"],r=s.mode,l="effect"!==r,h=s.scale||"both",c=s.origin||["middle","center"],u=i.css("position"),d=i.position(),p=V.effects.scaledDimensions(i),f=s.from||p,g=s.to||V.effects.scaledDimensions(i,0);V.effects.createPlaceholder(i),"show"===r&&(r=f,f=g,g=r),n={from:{y:f.height/p.height,x:f.width/p.width},to:{y:g.height/p.height,x:g.width/p.width}},"box"!==h&&"both"!==h||(n.from.y!==n.to.y&&(f=V.effects.setTransition(i,o,n.from.y,f),g=V.effects.setTransition(i,o,n.to.y,g)),n.from.x!==n.to.x&&(f=V.effects.setTransition(i,a,n.from.x,f),g=V.effects.setTransition(i,a,n.to.x,g))),"content"!==h&&"both"!==h||n.from.y!==n.to.y&&(f=V.effects.setTransition(i,t,n.from.y,f),g=V.effects.setTransition(i,t,n.to.y,g)),c&&(c=V.effects.getBaseline(c,p),f.top=(p.outerHeight-f.outerHeight)*c.y+d.top,f.left=(p.outerWidth-f.outerWidth)*c.x+d.left,g.top=(p.outerHeight-g.outerHeight)*c.y+d.top,g.left=(p.outerWidth-g.outerWidth)*c.x+d.left),delete f.outerHeight,delete f.outerWidth,i.css(f),"content"!==h&&"both"!==h||(o=o.concat(["marginTop","marginBottom"]).concat(t),a=a.concat(["marginLeft","marginRight"]),i.find("*[width]").each(function(){var t=V(this),e=V.effects.scaledDimensions(t),i={height:e.height*n.from.y,width:e.width*n.from.x,outerHeight:e.outerHeight*n.from.y,outerWidth:e.outerWidth*n.from.x},e={height:e.height*n.to.y,width:e.width*n.to.x,outerHeight:e.height*n.to.y,outerWidth:e.width*n.to.x};n.from.y!==n.to.y&&(i=V.effects.setTransition(t,o,n.from.y,i),e=V.effects.setTransition(t,o,n.to.y,e)),n.from.x!==n.to.x&&(i=V.effects.setTransition(t,a,n.from.x,i),e=V.effects.setTransition(t,a,n.to.x,e)),l&&V.effects.saveStyle(t),t.css(i),t.animate(e,s.duration,s.easing,function(){l&&V.effects.restoreStyle(t)})})),i.animate(g,{queue:!1,duration:s.duration,easing:s.easing,complete:function(){var t=i.offset();0===g.opacity&&i.css("opacity",f.opacity),l||(i.css("position","static"===u?"relative":u).offset(t),V.effects.saveStyle(i)),e()}})}),V.effects.define("scale",function(t,e){var i=V(this),s=t.mode,s=parseInt(t.percent,10)||(0===parseInt(t.percent,10)||"effect"!==s?0:100),s=V.extend(!0,{from:V.effects.scaledDimensions(i),to:V.effects.scaledDimensions(i,s,t.direction||"both"),origin:t.origin||["middle","center"]},t);t.fade&&(s.from.opacity=1,s.to.opacity=0),V.effects.effect.size.call(this,s,e)}),V.effects.define("puff","hide",function(t,e){t=V.extend(!0,{},t,{fade:!0,percent:parseInt(t.percent,10)||150});V.effects.effect.scale.call(this,t,e)}),V.effects.define("pulsate","show",function(t,e){var i=V(this),s=t.mode,n="show"===s,o=2*(t.times||5)+(n||"hide"===s?1:0),a=t.duration/o,r=0,l=1,s=i.queue().length;for(!n&&i.is(":visible")||(i.css("opacity",0).show(),r=1);l li > :first-child").add(t.find("> :not(li)").even())},heightStyle:"auto",icons:{activeHeader:"ui-icon-triangle-1-s",header:"ui-icon-triangle-1-e"},activate:null,beforeActivate:null},hideProps:{borderTopWidth:"hide",borderBottomWidth:"hide",paddingTop:"hide",paddingBottom:"hide",height:"hide"},showProps:{borderTopWidth:"show",borderBottomWidth:"show",paddingTop:"show",paddingBottom:"show",height:"show"},_create:function(){var t=this.options;this.prevShow=this.prevHide=V(),this._addClass("ui-accordion","ui-widget ui-helper-reset"),this.element.attr("role","tablist"),t.collapsible||!1!==t.active&&null!=t.active||(t.active=0),this._processPanels(),t.active<0&&(t.active+=this.headers.length),this._refresh()},_getCreateEventData:function(){return{header:this.active,panel:this.active.length?this.active.next():V()}},_createIcons:function(){var t,e=this.options.icons;e&&(t=V(""),this._addClass(t,"ui-accordion-header-icon","ui-icon "+e.header),t.prependTo(this.headers),t=this.active.children(".ui-accordion-header-icon"),this._removeClass(t,e.header)._addClass(t,null,e.activeHeader)._addClass(this.headers,"ui-accordion-icons"))},_destroyIcons:function(){this._removeClass(this.headers,"ui-accordion-icons"),this.headers.children(".ui-accordion-header-icon").remove()},_destroy:function(){var t;this.element.removeAttr("role"),this.headers.removeAttr("role aria-expanded aria-selected aria-controls tabIndex").removeUniqueId(),this._destroyIcons(),t=this.headers.next().css("display","").removeAttr("role aria-hidden aria-labelledby").removeUniqueId(),"content"!==this.options.heightStyle&&t.css("height","")},_setOption:function(t,e){"active"!==t?("event"===t&&(this.options.event&&this._off(this.headers,this.options.event),this._setupEvents(e)),this._super(t,e),"collapsible"!==t||e||!1!==this.options.active||this._activate(0),"icons"===t&&(this._destroyIcons(),e&&this._createIcons())):this._activate(e)},_setOptionDisabled:function(t){this._super(t),this.element.attr("aria-disabled",t),this._toggleClass(null,"ui-state-disabled",!!t),this._toggleClass(this.headers.add(this.headers.next()),null,"ui-state-disabled",!!t)},_keydown:function(t){if(!t.altKey&&!t.ctrlKey){var e=V.ui.keyCode,i=this.headers.length,s=this.headers.index(t.target),n=!1;switch(t.keyCode){case e.RIGHT:case e.DOWN:n=this.headers[(s+1)%i];break;case e.LEFT:case e.UP:n=this.headers[(s-1+i)%i];break;case e.SPACE:case e.ENTER:this._eventHandler(t);break;case e.HOME:n=this.headers[0];break;case e.END:n=this.headers[i-1]}n&&(V(t.target).attr("tabIndex",-1),V(n).attr("tabIndex",0),V(n).trigger("focus"),t.preventDefault())}},_panelKeyDown:function(t){t.keyCode===V.ui.keyCode.UP&&t.ctrlKey&&V(t.currentTarget).prev().trigger("focus")},refresh:function(){var t=this.options;this._processPanels(),!1===t.active&&!0===t.collapsible||!this.headers.length?(t.active=!1,this.active=V()):!1===t.active?this._activate(0):this.active.length&&!V.contains(this.element[0],this.active[0])?this.headers.length===this.headers.find(".ui-state-disabled").length?(t.active=!1,this.active=V()):this._activate(Math.max(0,t.active-1)):t.active=this.headers.index(this.active),this._destroyIcons(),this._refresh()},_processPanels:function(){var t=this.headers,e=this.panels;"function"==typeof this.options.header?this.headers=this.options.header(this.element):this.headers=this.element.find(this.options.header),this._addClass(this.headers,"ui-accordion-header ui-accordion-header-collapsed","ui-state-default"),this.panels=this.headers.next().filter(":not(.ui-accordion-content-active)").hide(),this._addClass(this.panels,"ui-accordion-content","ui-helper-reset ui-widget-content"),e&&(this._off(t.not(this.headers)),this._off(e.not(this.panels)))},_refresh:function(){var i,t=this.options,e=t.heightStyle,s=this.element.parent();this.active=this._findActive(t.active),this._addClass(this.active,"ui-accordion-header-active","ui-state-active")._removeClass(this.active,"ui-accordion-header-collapsed"),this._addClass(this.active.next(),"ui-accordion-content-active"),this.active.next().show(),this.headers.attr("role","tab").each(function(){var t=V(this),e=t.uniqueId().attr("id"),i=t.next(),s=i.uniqueId().attr("id");t.attr("aria-controls",s),i.attr("aria-labelledby",e)}).next().attr("role","tabpanel"),this.headers.not(this.active).attr({"aria-selected":"false","aria-expanded":"false",tabIndex:-1}).next().attr({"aria-hidden":"true"}).hide(),this.active.length?this.active.attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0}).next().attr({"aria-hidden":"false"}):this.headers.eq(0).attr("tabIndex",0),this._createIcons(),this._setupEvents(t.event),"fill"===e?(i=s.height(),this.element.siblings(":visible").each(function(){var t=V(this),e=t.css("position");"absolute"!==e&&"fixed"!==e&&(i-=t.outerHeight(!0))}),this.headers.each(function(){i-=V(this).outerHeight(!0)}),this.headers.next().each(function(){V(this).height(Math.max(0,i-V(this).innerHeight()+V(this).height()))}).css("overflow","auto")):"auto"===e&&(i=0,this.headers.next().each(function(){var t=V(this).is(":visible");t||V(this).show(),i=Math.max(i,V(this).css("height","").height()),t||V(this).hide()}).height(i))},_activate:function(t){t=this._findActive(t)[0];t!==this.active[0]&&(t=t||this.active[0],this._eventHandler({target:t,currentTarget:t,preventDefault:V.noop}))},_findActive:function(t){return"number"==typeof t?this.headers.eq(t):V()},_setupEvents:function(t){var i={keydown:"_keydown"};t&&V.each(t.split(" "),function(t,e){i[e]="_eventHandler"}),this._off(this.headers.add(this.headers.next())),this._on(this.headers,i),this._on(this.headers.next(),{keydown:"_panelKeyDown"}),this._hoverable(this.headers),this._focusable(this.headers)},_eventHandler:function(t){var e=this.options,i=this.active,s=V(t.currentTarget),n=s[0]===i[0],o=n&&e.collapsible,a=o?V():s.next(),r=i.next(),a={oldHeader:i,oldPanel:r,newHeader:o?V():s,newPanel:a};t.preventDefault(),n&&!e.collapsible||!1===this._trigger("beforeActivate",t,a)||(e.active=!o&&this.headers.index(s),this.active=n?V():s,this._toggle(a),this._removeClass(i,"ui-accordion-header-active","ui-state-active"),e.icons&&(i=i.children(".ui-accordion-header-icon"),this._removeClass(i,null,e.icons.activeHeader)._addClass(i,null,e.icons.header)),n||(this._removeClass(s,"ui-accordion-header-collapsed")._addClass(s,"ui-accordion-header-active","ui-state-active"),e.icons&&(n=s.children(".ui-accordion-header-icon"),this._removeClass(n,null,e.icons.header)._addClass(n,null,e.icons.activeHeader)),this._addClass(s.next(),"ui-accordion-content-active")))},_toggle:function(t){var e=t.newPanel,i=this.prevShow.length?this.prevShow:t.oldPanel;this.prevShow.add(this.prevHide).stop(!0,!0),this.prevShow=e,this.prevHide=i,this.options.animate?this._animate(e,i,t):(i.hide(),e.show(),this._toggleComplete(t)),i.attr({"aria-hidden":"true"}),i.prev().attr({"aria-selected":"false","aria-expanded":"false"}),e.length&&i.length?i.prev().attr({tabIndex:-1,"aria-expanded":"false"}):e.length&&this.headers.filter(function(){return 0===parseInt(V(this).attr("tabIndex"),10)}).attr("tabIndex",-1),e.attr("aria-hidden","false").prev().attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0})},_animate:function(t,i,e){var s,n,o,a=this,r=0,l=t.css("box-sizing"),h=t.length&&(!i.length||t.index()",delay:300,options:{icons:{submenu:"ui-icon-caret-1-e"},items:"> *",menus:"ul",position:{my:"left top",at:"right top"},role:"menu",blur:null,focus:null,select:null},_create:function(){this.activeMenu=this.element,this.mouseHandled=!1,this.lastMousePosition={x:null,y:null},this.element.uniqueId().attr({role:this.options.role,tabIndex:0}),this._addClass("ui-menu","ui-widget ui-widget-content"),this._on({"mousedown .ui-menu-item":function(t){t.preventDefault(),this._activateItem(t)},"click .ui-menu-item":function(t){var e=V(t.target),i=V(V.ui.safeActiveElement(this.document[0]));!this.mouseHandled&&e.not(".ui-state-disabled").length&&(this.select(t),t.isPropagationStopped()||(this.mouseHandled=!0),e.has(".ui-menu").length?this.expand(t):!this.element.is(":focus")&&i.closest(".ui-menu").length&&(this.element.trigger("focus",[!0]),this.active&&1===this.active.parents(".ui-menu").length&&clearTimeout(this.timer)))},"mouseenter .ui-menu-item":"_activateItem","mousemove .ui-menu-item":"_activateItem",mouseleave:"collapseAll","mouseleave .ui-menu":"collapseAll",focus:function(t,e){var i=this.active||this._menuItems().first();e||this.focus(t,i)},blur:function(t){this._delay(function(){V.contains(this.element[0],V.ui.safeActiveElement(this.document[0]))||this.collapseAll(t)})},keydown:"_keydown"}),this.refresh(),this._on(this.document,{click:function(t){this._closeOnDocumentClick(t)&&this.collapseAll(t,!0),this.mouseHandled=!1}})},_activateItem:function(t){var e,i;this.previousFilter||t.clientX===this.lastMousePosition.x&&t.clientY===this.lastMousePosition.y||(this.lastMousePosition={x:t.clientX,y:t.clientY},e=V(t.target).closest(".ui-menu-item"),i=V(t.currentTarget),e[0]===i[0]&&(i.is(".ui-state-active")||(this._removeClass(i.siblings().children(".ui-state-active"),null,"ui-state-active"),this.focus(t,i))))},_destroy:function(){var t=this.element.find(".ui-menu-item").removeAttr("role aria-disabled").children(".ui-menu-item-wrapper").removeUniqueId().removeAttr("tabIndex role aria-haspopup");this.element.removeAttr("aria-activedescendant").find(".ui-menu").addBack().removeAttr("role aria-labelledby aria-expanded aria-hidden aria-disabled tabIndex").removeUniqueId().show(),t.children().each(function(){var t=V(this);t.data("ui-menu-submenu-caret")&&t.remove()})},_keydown:function(t){var e,i,s,n=!0;switch(t.keyCode){case V.ui.keyCode.PAGE_UP:this.previousPage(t);break;case V.ui.keyCode.PAGE_DOWN:this.nextPage(t);break;case V.ui.keyCode.HOME:this._move("first","first",t);break;case V.ui.keyCode.END:this._move("last","last",t);break;case V.ui.keyCode.UP:this.previous(t);break;case V.ui.keyCode.DOWN:this.next(t);break;case V.ui.keyCode.LEFT:this.collapse(t);break;case V.ui.keyCode.RIGHT:this.active&&!this.active.is(".ui-state-disabled")&&this.expand(t);break;case V.ui.keyCode.ENTER:case V.ui.keyCode.SPACE:this._activate(t);break;case V.ui.keyCode.ESCAPE:this.collapse(t);break;default:e=this.previousFilter||"",s=n=!1,i=96<=t.keyCode&&t.keyCode<=105?(t.keyCode-96).toString():String.fromCharCode(t.keyCode),clearTimeout(this.filterTimer),i===e?s=!0:i=e+i,e=this._filterMenuItems(i),(e=s&&-1!==e.index(this.active.next())?this.active.nextAll(".ui-menu-item"):e).length||(i=String.fromCharCode(t.keyCode),e=this._filterMenuItems(i)),e.length?(this.focus(t,e),this.previousFilter=i,this.filterTimer=this._delay(function(){delete this.previousFilter},1e3)):delete this.previousFilter}n&&t.preventDefault()},_activate:function(t){this.active&&!this.active.is(".ui-state-disabled")&&(this.active.children("[aria-haspopup='true']").length?this.expand(t):this.select(t))},refresh:function(){var t,e,s=this,n=this.options.icons.submenu,i=this.element.find(this.options.menus);this._toggleClass("ui-menu-icons",null,!!this.element.find(".ui-icon").length),e=i.filter(":not(.ui-menu)").hide().attr({role:this.options.role,"aria-hidden":"true","aria-expanded":"false"}).each(function(){var t=V(this),e=t.prev(),i=V("").data("ui-menu-submenu-caret",!0);s._addClass(i,"ui-menu-icon","ui-icon "+n),e.attr("aria-haspopup","true").prepend(i),t.attr("aria-labelledby",e.attr("id"))}),this._addClass(e,"ui-menu","ui-widget ui-widget-content ui-front"),(t=i.add(this.element).find(this.options.items)).not(".ui-menu-item").each(function(){var t=V(this);s._isDivider(t)&&s._addClass(t,"ui-menu-divider","ui-widget-content")}),i=(e=t.not(".ui-menu-item, .ui-menu-divider")).children().not(".ui-menu").uniqueId().attr({tabIndex:-1,role:this._itemRole()}),this._addClass(e,"ui-menu-item")._addClass(i,"ui-menu-item-wrapper"),t.filter(".ui-state-disabled").attr("aria-disabled","true"),this.active&&!V.contains(this.element[0],this.active[0])&&this.blur()},_itemRole:function(){return{menu:"menuitem",listbox:"option"}[this.options.role]},_setOption:function(t,e){var i;"icons"===t&&(i=this.element.find(".ui-menu-icon"),this._removeClass(i,null,this.options.icons.submenu)._addClass(i,null,e.submenu)),this._super(t,e)},_setOptionDisabled:function(t){this._super(t),this.element.attr("aria-disabled",String(t)),this._toggleClass(null,"ui-state-disabled",!!t)},focus:function(t,e){var i;this.blur(t,t&&"focus"===t.type),this._scrollIntoView(e),this.active=e.first(),i=this.active.children(".ui-menu-item-wrapper"),this._addClass(i,null,"ui-state-active"),this.options.role&&this.element.attr("aria-activedescendant",i.attr("id")),i=this.active.parent().closest(".ui-menu-item").children(".ui-menu-item-wrapper"),this._addClass(i,null,"ui-state-active"),t&&"keydown"===t.type?this._close():this.timer=this._delay(function(){this._close()},this.delay),(i=e.children(".ui-menu")).length&&t&&/^mouse/.test(t.type)&&this._startOpening(i),this.activeMenu=e.parent(),this._trigger("focus",t,{item:e})},_scrollIntoView:function(t){var e,i,s;this._hasScroll()&&(i=parseFloat(V.css(this.activeMenu[0],"borderTopWidth"))||0,s=parseFloat(V.css(this.activeMenu[0],"paddingTop"))||0,e=t.offset().top-this.activeMenu.offset().top-i-s,i=this.activeMenu.scrollTop(),s=this.activeMenu.height(),t=t.outerHeight(),e<0?this.activeMenu.scrollTop(i+e):s",options:{appendTo:null,autoFocus:!1,delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null,change:null,close:null,focus:null,open:null,response:null,search:null,select:null},requestIndex:0,pending:0,liveRegionTimer:null,_create:function(){var i,s,n,t=this.element[0].nodeName.toLowerCase(),e="textarea"===t,t="input"===t;this.isMultiLine=e||!t&&this._isContentEditable(this.element),this.valueMethod=this.element[e||t?"val":"text"],this.isNewMenu=!0,this._addClass("ui-autocomplete-input"),this.element.attr("autocomplete","off"),this._on(this.element,{keydown:function(t){if(this.element.prop("readOnly"))s=n=i=!0;else{s=n=i=!1;var e=V.ui.keyCode;switch(t.keyCode){case e.PAGE_UP:i=!0,this._move("previousPage",t);break;case e.PAGE_DOWN:i=!0,this._move("nextPage",t);break;case e.UP:i=!0,this._keyEvent("previous",t);break;case e.DOWN:i=!0,this._keyEvent("next",t);break;case e.ENTER:this.menu.active&&(i=!0,t.preventDefault(),this.menu.select(t));break;case e.TAB:this.menu.active&&this.menu.select(t);break;case e.ESCAPE:this.menu.element.is(":visible")&&(this.isMultiLine||this._value(this.term),this.close(t),t.preventDefault());break;default:s=!0,this._searchTimeout(t)}}},keypress:function(t){if(i)return i=!1,void(this.isMultiLine&&!this.menu.element.is(":visible")||t.preventDefault());if(!s){var e=V.ui.keyCode;switch(t.keyCode){case e.PAGE_UP:this._move("previousPage",t);break;case e.PAGE_DOWN:this._move("nextPage",t);break;case e.UP:this._keyEvent("previous",t);break;case e.DOWN:this._keyEvent("next",t)}}},input:function(t){if(n)return n=!1,void t.preventDefault();this._searchTimeout(t)},focus:function(){this.selectedItem=null,this.previous=this._value()},blur:function(t){clearTimeout(this.searching),this.close(t),this._change(t)}}),this._initSource(),this.menu=V("
    ").appendTo(this._appendTo()).menu({role:null}).hide().attr({unselectable:"on"}).menu("instance"),this._addClass(this.menu.element,"ui-autocomplete","ui-front"),this._on(this.menu.element,{mousedown:function(t){t.preventDefault()},menufocus:function(t,e){var i,s;if(this.isNewMenu&&(this.isNewMenu=!1,t.originalEvent&&/^mouse/.test(t.originalEvent.type)))return this.menu.blur(),void this.document.one("mousemove",function(){V(t.target).trigger(t.originalEvent)});s=e.item.data("ui-autocomplete-item"),!1!==this._trigger("focus",t,{item:s})&&t.originalEvent&&/^key/.test(t.originalEvent.type)&&this._value(s.value),(i=e.item.attr("aria-label")||s.value)&&String.prototype.trim.call(i).length&&(clearTimeout(this.liveRegionTimer),this.liveRegionTimer=this._delay(function(){this.liveRegion.html(V("
    ").text(i))},100))},menuselect:function(t,e){var i=e.item.data("ui-autocomplete-item"),s=this.previous;this.element[0]!==V.ui.safeActiveElement(this.document[0])&&(this.element.trigger("focus"),this.previous=s,this._delay(function(){this.previous=s,this.selectedItem=i})),!1!==this._trigger("select",t,{item:i})&&this._value(i.value),this.term=this._value(),this.close(t),this.selectedItem=i}}),this.liveRegion=V("
    ",{role:"status","aria-live":"assertive","aria-relevant":"additions"}).appendTo(this.document[0].body),this._addClass(this.liveRegion,null,"ui-helper-hidden-accessible"),this._on(this.window,{beforeunload:function(){this.element.removeAttr("autocomplete")}})},_destroy:function(){clearTimeout(this.searching),this.element.removeAttr("autocomplete"),this.menu.element.remove(),this.liveRegion.remove()},_setOption:function(t,e){this._super(t,e),"source"===t&&this._initSource(),"appendTo"===t&&this.menu.element.appendTo(this._appendTo()),"disabled"===t&&e&&this.xhr&&this.xhr.abort()},_isEventTargetInWidget:function(t){var e=this.menu.element[0];return t.target===this.element[0]||t.target===e||V.contains(e,t.target)},_closeOnClickOutside:function(t){this._isEventTargetInWidget(t)||this.close()},_appendTo:function(){var t=this.options.appendTo;return t=!(t=!(t=t&&(t.jquery||t.nodeType?V(t):this.document.find(t).eq(0)))||!t[0]?this.element.closest(".ui-front, dialog"):t).length?this.document[0].body:t},_initSource:function(){var i,s,n=this;Array.isArray(this.options.source)?(i=this.options.source,this.source=function(t,e){e(V.ui.autocomplete.filter(i,t.term))}):"string"==typeof this.options.source?(s=this.options.source,this.source=function(t,e){n.xhr&&n.xhr.abort(),n.xhr=V.ajax({url:s,data:t,dataType:"json",success:function(t){e(t)},error:function(){e([])}})}):this.source=this.options.source},_searchTimeout:function(s){clearTimeout(this.searching),this.searching=this._delay(function(){var t=this.term===this._value(),e=this.menu.element.is(":visible"),i=s.altKey||s.ctrlKey||s.metaKey||s.shiftKey;t&&(e||i)||(this.selectedItem=null,this.search(null,s))},this.options.delay)},search:function(t,e){return t=null!=t?t:this._value(),this.term=this._value(),t.length").append(V("
    ").text(e.label)).appendTo(t)},_move:function(t,e){if(this.menu.element.is(":visible"))return this.menu.isFirstItem()&&/^previous/.test(t)||this.menu.isLastItem()&&/^next/.test(t)?(this.isMultiLine||this._value(this.term),void this.menu.blur()):void this.menu[t](e);this.search(null,e)},widget:function(){return this.menu.element},_value:function(){return this.valueMethod.apply(this.element,arguments)},_keyEvent:function(t,e){this.isMultiLine&&!this.menu.element.is(":visible")||(this._move(t,e),e.preventDefault())},_isContentEditable:function(t){if(!t.length)return!1;var e=t.prop("contentEditable");return"inherit"===e?this._isContentEditable(t.parent()):"true"===e}}),V.extend(V.ui.autocomplete,{escapeRegex:function(t){return t.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&")},filter:function(t,e){var i=new RegExp(V.ui.autocomplete.escapeRegex(e),"i");return V.grep(t,function(t){return i.test(t.label||t.value||t)})}}),V.widget("ui.autocomplete",V.ui.autocomplete,{options:{messages:{noResults:"No search results.",results:function(t){return t+(1").text(e))},100))}});V.ui.autocomplete;var tt=/ui-corner-([a-z]){2,6}/g;V.widget("ui.controlgroup",{version:"1.13.2",defaultElement:"
    ",options:{direction:"horizontal",disabled:null,onlyVisible:!0,items:{button:"input[type=button], input[type=submit], input[type=reset], button, a",controlgroupLabel:".ui-controlgroup-label",checkboxradio:"input[type='checkbox'], input[type='radio']",selectmenu:"select",spinner:".ui-spinner-input"}},_create:function(){this._enhance()},_enhance:function(){this.element.attr("role","toolbar"),this.refresh()},_destroy:function(){this._callChildMethod("destroy"),this.childWidgets.removeData("ui-controlgroup-data"),this.element.removeAttr("role"),this.options.items.controlgroupLabel&&this.element.find(this.options.items.controlgroupLabel).find(".ui-controlgroup-label-contents").contents().unwrap()},_initWidgets:function(){var o=this,a=[];V.each(this.options.items,function(s,t){var e,n={};if(t)return"controlgroupLabel"===s?((e=o.element.find(t)).each(function(){var t=V(this);t.children(".ui-controlgroup-label-contents").length||t.contents().wrapAll("")}),o._addClass(e,null,"ui-widget ui-widget-content ui-state-default"),void(a=a.concat(e.get()))):void(V.fn[s]&&(n=o["_"+s+"Options"]?o["_"+s+"Options"]("middle"):{classes:{}},o.element.find(t).each(function(){var t=V(this),e=t[s]("instance"),i=V.widget.extend({},n);"button"===s&&t.parent(".ui-spinner").length||((e=e||t[s]()[s]("instance"))&&(i.classes=o._resolveClassesValues(i.classes,e)),t[s](i),i=t[s]("widget"),V.data(i[0],"ui-controlgroup-data",e||t[s]("instance")),a.push(i[0]))})))}),this.childWidgets=V(V.uniqueSort(a)),this._addClass(this.childWidgets,"ui-controlgroup-item")},_callChildMethod:function(e){this.childWidgets.each(function(){var t=V(this).data("ui-controlgroup-data");t&&t[e]&&t[e]()})},_updateCornerClass:function(t,e){e=this._buildSimpleOptions(e,"label").classes.label;this._removeClass(t,null,"ui-corner-top ui-corner-bottom ui-corner-left ui-corner-right ui-corner-all"),this._addClass(t,null,e)},_buildSimpleOptions:function(t,e){var i="vertical"===this.options.direction,s={classes:{}};return s.classes[e]={middle:"",first:"ui-corner-"+(i?"top":"left"),last:"ui-corner-"+(i?"bottom":"right"),only:"ui-corner-all"}[t],s},_spinnerOptions:function(t){t=this._buildSimpleOptions(t,"ui-spinner");return t.classes["ui-spinner-up"]="",t.classes["ui-spinner-down"]="",t},_buttonOptions:function(t){return this._buildSimpleOptions(t,"ui-button")},_checkboxradioOptions:function(t){return this._buildSimpleOptions(t,"ui-checkboxradio-label")},_selectmenuOptions:function(t){var e="vertical"===this.options.direction;return{width:e&&"auto",classes:{middle:{"ui-selectmenu-button-open":"","ui-selectmenu-button-closed":""},first:{"ui-selectmenu-button-open":"ui-corner-"+(e?"top":"tl"),"ui-selectmenu-button-closed":"ui-corner-"+(e?"top":"left")},last:{"ui-selectmenu-button-open":e?"":"ui-corner-tr","ui-selectmenu-button-closed":"ui-corner-"+(e?"bottom":"right")},only:{"ui-selectmenu-button-open":"ui-corner-top","ui-selectmenu-button-closed":"ui-corner-all"}}[t]}},_resolveClassesValues:function(i,s){var n={};return V.each(i,function(t){var e=s.options.classes[t]||"",e=String.prototype.trim.call(e.replace(tt,""));n[t]=(e+" "+i[t]).replace(/\s+/g," ")}),n},_setOption:function(t,e){"direction"===t&&this._removeClass("ui-controlgroup-"+this.options.direction),this._super(t,e),"disabled"!==t?this.refresh():this._callChildMethod(e?"disable":"enable")},refresh:function(){var n,o=this;this._addClass("ui-controlgroup ui-controlgroup-"+this.options.direction),"horizontal"===this.options.direction&&this._addClass(null,"ui-helper-clearfix"),this._initWidgets(),n=this.childWidgets,(n=this.options.onlyVisible?n.filter(":visible"):n).length&&(V.each(["first","last"],function(t,e){var i,s=n[e]().data("ui-controlgroup-data");s&&o["_"+s.widgetName+"Options"]?((i=o["_"+s.widgetName+"Options"](1===n.length?"only":e)).classes=o._resolveClassesValues(i.classes,s),s.element[s.widgetName](i)):o._updateCornerClass(n[e](),e)}),this._callChildMethod("refresh"))}});V.widget("ui.checkboxradio",[V.ui.formResetMixin,{version:"1.13.2",options:{disabled:null,label:null,icon:!0,classes:{"ui-checkboxradio-label":"ui-corner-all","ui-checkboxradio-icon":"ui-corner-all"}},_getCreateOptions:function(){var t,e=this._super()||{};return this._readType(),t=this.element.labels(),this.label=V(t[t.length-1]),this.label.length||V.error("No label found for checkboxradio widget"),this.originalLabel="",(t=this.label.contents().not(this.element[0])).length&&(this.originalLabel+=t.clone().wrapAll("
    ").parent().html()),this.originalLabel&&(e.label=this.originalLabel),null!=(t=this.element[0].disabled)&&(e.disabled=t),e},_create:function(){var t=this.element[0].checked;this._bindFormResetHandler(),null==this.options.disabled&&(this.options.disabled=this.element[0].disabled),this._setOption("disabled",this.options.disabled),this._addClass("ui-checkboxradio","ui-helper-hidden-accessible"),this._addClass(this.label,"ui-checkboxradio-label","ui-button ui-widget"),"radio"===this.type&&this._addClass(this.label,"ui-checkboxradio-radio-label"),this.options.label&&this.options.label!==this.originalLabel?this._updateLabel():this.originalLabel&&(this.options.label=this.originalLabel),this._enhance(),t&&this._addClass(this.label,"ui-checkboxradio-checked","ui-state-active"),this._on({change:"_toggleClasses",focus:function(){this._addClass(this.label,null,"ui-state-focus ui-visual-focus")},blur:function(){this._removeClass(this.label,null,"ui-state-focus ui-visual-focus")}})},_readType:function(){var t=this.element[0].nodeName.toLowerCase();this.type=this.element[0].type,"input"===t&&/radio|checkbox/.test(this.type)||V.error("Can't create checkboxradio on element.nodeName="+t+" and element.type="+this.type)},_enhance:function(){this._updateIcon(this.element[0].checked)},widget:function(){return this.label},_getRadioGroup:function(){var t=this.element[0].name,e="input[name='"+V.escapeSelector(t)+"']";return t?(this.form.length?V(this.form[0].elements).filter(e):V(e).filter(function(){return 0===V(this)._form().length})).not(this.element):V([])},_toggleClasses:function(){var t=this.element[0].checked;this._toggleClass(this.label,"ui-checkboxradio-checked","ui-state-active",t),this.options.icon&&"checkbox"===this.type&&this._toggleClass(this.icon,null,"ui-icon-check ui-state-checked",t)._toggleClass(this.icon,null,"ui-icon-blank",!t),"radio"===this.type&&this._getRadioGroup().each(function(){var t=V(this).checkboxradio("instance");t&&t._removeClass(t.label,"ui-checkboxradio-checked","ui-state-active")})},_destroy:function(){this._unbindFormResetHandler(),this.icon&&(this.icon.remove(),this.iconSpace.remove())},_setOption:function(t,e){if("label"!==t||e){if(this._super(t,e),"disabled"===t)return this._toggleClass(this.label,null,"ui-state-disabled",e),void(this.element[0].disabled=e);this.refresh()}},_updateIcon:function(t){var e="ui-icon ui-icon-background ";this.options.icon?(this.icon||(this.icon=V(""),this.iconSpace=V(" "),this._addClass(this.iconSpace,"ui-checkboxradio-icon-space")),"checkbox"===this.type?(e+=t?"ui-icon-check ui-state-checked":"ui-icon-blank",this._removeClass(this.icon,null,t?"ui-icon-blank":"ui-icon-check")):e+="ui-icon-blank",this._addClass(this.icon,"ui-checkboxradio-icon",e),t||this._removeClass(this.icon,null,"ui-icon-check ui-state-checked"),this.icon.prependTo(this.label).after(this.iconSpace)):void 0!==this.icon&&(this.icon.remove(),this.iconSpace.remove(),delete this.icon)},_updateLabel:function(){var t=this.label.contents().not(this.element[0]);this.icon&&(t=t.not(this.icon[0])),(t=this.iconSpace?t.not(this.iconSpace[0]):t).remove(),this.label.append(this.options.label)},refresh:function(){var t=this.element[0].checked,e=this.element[0].disabled;this._updateIcon(t),this._toggleClass(this.label,"ui-checkboxradio-checked","ui-state-active",t),null!==this.options.label&&this._updateLabel(),e!==this.options.disabled&&this._setOptions({disabled:e})}}]);var et;V.ui.checkboxradio;V.widget("ui.button",{version:"1.13.2",defaultElement:"
    "+(0
    ":""):"")}f+=_}return f+=F,t._keyEvent=!1,f},_generateMonthYearHeader:function(t,e,i,s,n,o,a,r){var l,h,c,u,d,p,f=this._get(t,"changeMonth"),g=this._get(t,"changeYear"),m=this._get(t,"showMonthAfterYear"),_=this._get(t,"selectMonthLabel"),v=this._get(t,"selectYearLabel"),b="
    ",y="";if(o||!f)y+=""+a[e]+"";else{for(l=s&&s.getFullYear()===i,h=n&&n.getFullYear()===i,y+=""}if(m||(b+=y+(!o&&f&&g?"":" ")),!t.yearshtml)if(t.yearshtml="",o||!g)b+=""+i+"";else{for(a=this._get(t,"yearRange").split(":"),u=(new Date).getFullYear(),d=(_=function(t){t=t.match(/c[+\-].*/)?i+parseInt(t.substring(1),10):t.match(/[+\-].*/)?u+parseInt(t,10):parseInt(t,10);return isNaN(t)?u:t})(a[0]),p=Math.max(d,_(a[1]||"")),d=s?Math.max(d,s.getFullYear()):d,p=n?Math.min(p,n.getFullYear()):p,t.yearshtml+="",b+=t.yearshtml,t.yearshtml=null}return b+=this._get(t,"yearSuffix"),m&&(b+=(!o&&f&&g?"":" ")+y),b+="
    "},_adjustInstDate:function(t,e,i){var s=t.selectedYear+("Y"===i?e:0),n=t.selectedMonth+("M"===i?e:0),e=Math.min(t.selectedDay,this._getDaysInMonth(s,n))+("D"===i?e:0),e=this._restrictMinMax(t,this._daylightSavingAdjust(new Date(s,n,e)));t.selectedDay=e.getDate(),t.drawMonth=t.selectedMonth=e.getMonth(),t.drawYear=t.selectedYear=e.getFullYear(),"M"!==i&&"Y"!==i||this._notifyChange(t)},_restrictMinMax:function(t,e){var i=this._getMinMaxDate(t,"min"),t=this._getMinMaxDate(t,"max"),e=i&&e=i.getTime())&&(!s||e.getTime()<=s.getTime())&&(!n||e.getFullYear()>=n)&&(!o||e.getFullYear()<=o)},_getFormatConfig:function(t){var e=this._get(t,"shortYearCutoff");return{shortYearCutoff:e="string"!=typeof e?e:(new Date).getFullYear()%100+parseInt(e,10),dayNamesShort:this._get(t,"dayNamesShort"),dayNames:this._get(t,"dayNames"),monthNamesShort:this._get(t,"monthNamesShort"),monthNames:this._get(t,"monthNames")}},_formatDate:function(t,e,i,s){e||(t.currentDay=t.selectedDay,t.currentMonth=t.selectedMonth,t.currentYear=t.selectedYear);e=e?"object"==typeof e?e:this._daylightSavingAdjust(new Date(s,i,e)):this._daylightSavingAdjust(new Date(t.currentYear,t.currentMonth,t.currentDay));return this.formatDate(this._get(t,"dateFormat"),e,this._getFormatConfig(t))}}),V.fn.datepicker=function(t){if(!this.length)return this;V.datepicker.initialized||(V(document).on("mousedown",V.datepicker._checkExternalClick),V.datepicker.initialized=!0),0===V("#"+V.datepicker._mainDivId).length&&V("body").append(V.datepicker.dpDiv);var e=Array.prototype.slice.call(arguments,1);return"string"==typeof t&&("isDisabled"===t||"getDate"===t||"widget"===t)||"option"===t&&2===arguments.length&&"string"==typeof arguments[1]?V.datepicker["_"+t+"Datepicker"].apply(V.datepicker,[this[0]].concat(e)):this.each(function(){"string"==typeof t?V.datepicker["_"+t+"Datepicker"].apply(V.datepicker,[this].concat(e)):V.datepicker._attachDatepicker(this,t)})},V.datepicker=new st,V.datepicker.initialized=!1,V.datepicker.uuid=(new Date).getTime(),V.datepicker.version="1.13.2";V.datepicker,V.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase());var rt=!1;V(document).on("mouseup",function(){rt=!1});V.widget("ui.mouse",{version:"1.13.2",options:{cancel:"input, textarea, button, select, option",distance:1,delay:0},_mouseInit:function(){var e=this;this.element.on("mousedown."+this.widgetName,function(t){return e._mouseDown(t)}).on("click."+this.widgetName,function(t){if(!0===V.data(t.target,e.widgetName+".preventClickEvent"))return V.removeData(t.target,e.widgetName+".preventClickEvent"),t.stopImmediatePropagation(),!1}),this.started=!1},_mouseDestroy:function(){this.element.off("."+this.widgetName),this._mouseMoveDelegate&&this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(t){if(!rt){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(t),this._mouseDownEvent=t;var e=this,i=1===t.which,s=!("string"!=typeof this.options.cancel||!t.target.nodeName)&&V(t.target).closest(this.options.cancel).length;return i&&!s&&this._mouseCapture(t)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){e.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(t)&&this._mouseDelayMet(t)&&(this._mouseStarted=!1!==this._mouseStart(t),!this._mouseStarted)?(t.preventDefault(),!0):(!0===V.data(t.target,this.widgetName+".preventClickEvent")&&V.removeData(t.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(t){return e._mouseMove(t)},this._mouseUpDelegate=function(t){return e._mouseUp(t)},this.document.on("mousemove."+this.widgetName,this._mouseMoveDelegate).on("mouseup."+this.widgetName,this._mouseUpDelegate),t.preventDefault(),rt=!0)):!0}},_mouseMove:function(t){if(this._mouseMoved){if(V.ui.ie&&(!document.documentMode||document.documentMode<9)&&!t.button)return this._mouseUp(t);if(!t.which)if(t.originalEvent.altKey||t.originalEvent.ctrlKey||t.originalEvent.metaKey||t.originalEvent.shiftKey)this.ignoreMissingWhich=!0;else if(!this.ignoreMissingWhich)return this._mouseUp(t)}return(t.which||t.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(t),t.preventDefault()):(this._mouseDistanceMet(t)&&this._mouseDelayMet(t)&&(this._mouseStarted=!1!==this._mouseStart(this._mouseDownEvent,t),this._mouseStarted?this._mouseDrag(t):this._mouseUp(t)),!this._mouseStarted)},_mouseUp:function(t){this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,t.target===this._mouseDownEvent.target&&V.data(t.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(t)),this._mouseDelayTimer&&(clearTimeout(this._mouseDelayTimer),delete this._mouseDelayTimer),this.ignoreMissingWhich=!1,rt=!1,t.preventDefault()},_mouseDistanceMet:function(t){return Math.max(Math.abs(this._mouseDownEvent.pageX-t.pageX),Math.abs(this._mouseDownEvent.pageY-t.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),V.ui.plugin={add:function(t,e,i){var s,n=V.ui[t].prototype;for(s in i)n.plugins[s]=n.plugins[s]||[],n.plugins[s].push([e,i[s]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;n").css("position","absolute").appendTo(t.parent()).outerWidth(t.outerWidth()).outerHeight(t.outerHeight()).offset(t.offset())[0]})},_unblockFrames:function(){this.iframeBlocks&&(this.iframeBlocks.remove(),delete this.iframeBlocks)},_blurActiveElement:function(t){var e=V.ui.safeActiveElement(this.document[0]);V(t.target).closest(e).length||V.ui.safeBlur(e)},_mouseStart:function(t){var e=this.options;return this.helper=this._createHelper(t),this._addClass(this.helper,"ui-draggable-dragging"),this._cacheHelperProportions(),V.ui.ddmanager&&(V.ui.ddmanager.current=this),this._cacheMargins(),this.cssPosition=this.helper.css("position"),this.scrollParent=this.helper.scrollParent(!0),this.offsetParent=this.helper.offsetParent(),this.hasFixedAncestor=0i[2]&&(o=i[2]+this.offset.click.left),t.pageY-this.offset.click.top>i[3]&&(a=i[3]+this.offset.click.top)),s.grid&&(t=s.grid[1]?this.originalPageY+Math.round((a-this.originalPageY)/s.grid[1])*s.grid[1]:this.originalPageY,a=!i||t-this.offset.click.top>=i[1]||t-this.offset.click.top>i[3]?t:t-this.offset.click.top>=i[1]?t-s.grid[1]:t+s.grid[1],t=s.grid[0]?this.originalPageX+Math.round((o-this.originalPageX)/s.grid[0])*s.grid[0]:this.originalPageX,o=!i||t-this.offset.click.left>=i[0]||t-this.offset.click.left>i[2]?t:t-this.offset.click.left>=i[0]?t-s.grid[0]:t+s.grid[0]),"y"===s.axis&&(o=this.originalPageX),"x"===s.axis&&(a=this.originalPageY)),{top:a-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+("fixed"===this.cssPosition?-this.offset.scroll.top:n?0:this.offset.scroll.top),left:o-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+("fixed"===this.cssPosition?-this.offset.scroll.left:n?0:this.offset.scroll.left)}},_clear:function(){this._removeClass(this.helper,"ui-draggable-dragging"),this.helper[0]===this.element[0]||this.cancelHelperRemoval||this.helper.remove(),this.helper=null,this.cancelHelperRemoval=!1,this.destroyOnClear&&this.destroy()},_trigger:function(t,e,i){return i=i||this._uiHash(),V.ui.plugin.call(this,t,[e,i,this],!0),/^(drag|start|stop)/.test(t)&&(this.positionAbs=this._convertPositionTo("absolute"),i.offset=this.positionAbs),V.Widget.prototype._trigger.call(this,t,e,i)},plugins:{},_uiHash:function(){return{helper:this.helper,position:this.position,originalPosition:this.originalPosition,offset:this.positionAbs}}}),V.ui.plugin.add("draggable","connectToSortable",{start:function(e,t,i){var s=V.extend({},t,{item:i.element});i.sortables=[],V(i.options.connectToSortable).each(function(){var t=V(this).sortable("instance");t&&!t.options.disabled&&(i.sortables.push(t),t.refreshPositions(),t._trigger("activate",e,s))})},stop:function(e,t,i){var s=V.extend({},t,{item:i.element});i.cancelHelperRemoval=!1,V.each(i.sortables,function(){var t=this;t.isOver?(t.isOver=0,i.cancelHelperRemoval=!0,t.cancelHelperRemoval=!1,t._storedCSS={position:t.placeholder.css("position"),top:t.placeholder.css("top"),left:t.placeholder.css("left")},t._mouseStop(e),t.options.helper=t.options._helper):(t.cancelHelperRemoval=!0,t._trigger("deactivate",e,s))})},drag:function(i,s,n){V.each(n.sortables,function(){var t=!1,e=this;e.positionAbs=n.positionAbs,e.helperProportions=n.helperProportions,e.offset.click=n.offset.click,e._intersectsWith(e.containerCache)&&(t=!0,V.each(n.sortables,function(){return this.positionAbs=n.positionAbs,this.helperProportions=n.helperProportions,this.offset.click=n.offset.click,t=this!==e&&this._intersectsWith(this.containerCache)&&V.contains(e.element[0],this.element[0])?!1:t})),t?(e.isOver||(e.isOver=1,n._parent=s.helper.parent(),e.currentItem=s.helper.appendTo(e.element).data("ui-sortable-item",!0),e.options._helper=e.options.helper,e.options.helper=function(){return s.helper[0]},i.target=e.currentItem[0],e._mouseCapture(i,!0),e._mouseStart(i,!0,!0),e.offset.click.top=n.offset.click.top,e.offset.click.left=n.offset.click.left,e.offset.parent.left-=n.offset.parent.left-e.offset.parent.left,e.offset.parent.top-=n.offset.parent.top-e.offset.parent.top,n._trigger("toSortable",i),n.dropped=e.element,V.each(n.sortables,function(){this.refreshPositions()}),n.currentItem=n.element,e.fromOutside=n),e.currentItem&&(e._mouseDrag(i),s.position=e.position)):e.isOver&&(e.isOver=0,e.cancelHelperRemoval=!0,e.options._revert=e.options.revert,e.options.revert=!1,e._trigger("out",i,e._uiHash(e)),e._mouseStop(i,!0),e.options.revert=e.options._revert,e.options.helper=e.options._helper,e.placeholder&&e.placeholder.remove(),s.helper.appendTo(n._parent),n._refreshOffsets(i),s.position=n._generatePosition(i,!0),n._trigger("fromSortable",i),n.dropped=!1,V.each(n.sortables,function(){this.refreshPositions()}))})}}),V.ui.plugin.add("draggable","cursor",{start:function(t,e,i){var s=V("body"),i=i.options;s.css("cursor")&&(i._cursor=s.css("cursor")),s.css("cursor",i.cursor)},stop:function(t,e,i){i=i.options;i._cursor&&V("body").css("cursor",i._cursor)}}),V.ui.plugin.add("draggable","opacity",{start:function(t,e,i){e=V(e.helper),i=i.options;e.css("opacity")&&(i._opacity=e.css("opacity")),e.css("opacity",i.opacity)},stop:function(t,e,i){i=i.options;i._opacity&&V(e.helper).css("opacity",i._opacity)}}),V.ui.plugin.add("draggable","scroll",{start:function(t,e,i){i.scrollParentNotHidden||(i.scrollParentNotHidden=i.helper.scrollParent(!1)),i.scrollParentNotHidden[0]!==i.document[0]&&"HTML"!==i.scrollParentNotHidden[0].tagName&&(i.overflowOffset=i.scrollParentNotHidden.offset())},drag:function(t,e,i){var s=i.options,n=!1,o=i.scrollParentNotHidden[0],a=i.document[0];o!==a&&"HTML"!==o.tagName?(s.axis&&"x"===s.axis||(i.overflowOffset.top+o.offsetHeight-t.pageY
    ").css({overflow:"hidden",position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,t={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(t),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(t),this._proportionallyResize()),this._setupHandles(),e.autoHide&&V(this.element).on("mouseenter",function(){e.disabled||(i._removeClass("ui-resizable-autohide"),i._handles.show())}).on("mouseleave",function(){e.disabled||i.resizing||(i._addClass("ui-resizable-autohide"),i._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy(),this._addedHandles.remove();function t(t){V(t).removeData("resizable").removeData("ui-resizable").off(".resizable")}var e;return this.elementIsWrapper&&(t(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),t(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;case"aspectRatio":this._aspectRatio=!!e}},_setupHandles:function(){var t,e,i,s,n,o=this.options,a=this;if(this.handles=o.handles||(V(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=V(),this._addedHandles=V(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),i=this.handles.split(","),this.handles={},e=0;e"),this._addClass(n,"ui-resizable-handle "+s),n.css({zIndex:o.zIndex}),this.handles[t]=".ui-resizable-"+t,this.element.children(this.handles[t]).length||(this.element.append(n),this._addedHandles=this._addedHandles.add(n));this._renderAxis=function(t){var e,i,s;for(e in t=t||this.element,this.handles)this.handles[e].constructor===String?this.handles[e]=this.element.children(this.handles[e]).first().show():(this.handles[e].jquery||this.handles[e].nodeType)&&(this.handles[e]=V(this.handles[e]),this._on(this.handles[e],{mousedown:a._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(i=V(this.handles[e],this.element),s=/sw|ne|nw|se|n|s/.test(e)?i.outerHeight():i.outerWidth(),i=["padding",/ne|nw|n/.test(e)?"Top":/se|sw|s/.test(e)?"Bottom":/^e$/.test(e)?"Right":"Left"].join(""),t.css(i,s),this._proportionallyResize()),this._handles=this._handles.add(this.handles[e])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){a.resizing||(this.className&&(n=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),a.axis=n&&n[1]?n[1]:"se")}),o.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._addedHandles.remove()},_mouseCapture:function(t){var e,i,s=!1;for(e in this.handles)(i=V(this.handles[e])[0])!==t.target&&!V.contains(i,t.target)||(s=!0);return!this.options.disabled&&s},_mouseStart:function(t){var e,i,s=this.options,n=this.element;return this.resizing=!0,this._renderProxy(),e=this._num(this.helper.css("left")),i=this._num(this.helper.css("top")),s.containment&&(e+=V(s.containment).scrollLeft()||0,i+=V(s.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:e,top:i},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:n.width(),height:n.height()},this.originalSize=this._helper?{width:n.outerWidth(),height:n.outerHeight()}:{width:n.width(),height:n.height()},this.sizeDiff={width:n.outerWidth()-n.width(),height:n.outerHeight()-n.height()},this.originalPosition={left:e,top:i},this.originalMousePosition={left:t.pageX,top:t.pageY},this.aspectRatio="number"==typeof s.aspectRatio?s.aspectRatio:this.originalSize.width/this.originalSize.height||1,s=V(".ui-resizable-"+this.axis).css("cursor"),V("body").css("cursor","auto"===s?this.axis+"-resize":s),this._addClass("ui-resizable-resizing"),this._propagate("start",t),!0},_mouseDrag:function(t){var e=this.originalMousePosition,i=this.axis,s=t.pageX-e.left||0,e=t.pageY-e.top||0,i=this._change[i];return this._updatePrevProperties(),i&&(e=i.apply(this,[t,s,e]),this._updateVirtualBoundaries(t.shiftKey),(this._aspectRatio||t.shiftKey)&&(e=this._updateRatio(e,t)),e=this._respectSize(e,t),this._updateCache(e),this._propagate("resize",t),e=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),V.isEmptyObject(e)||(this._updatePrevProperties(),this._trigger("resize",t,this.ui()),this._applyChanges())),!1},_mouseStop:function(t){this.resizing=!1;var e,i,s,n=this.options,o=this;return this._helper&&(s=(e=(i=this._proportionallyResizeElements).length&&/textarea/i.test(i[0].nodeName))&&this._hasScroll(i[0],"left")?0:o.sizeDiff.height,i=e?0:o.sizeDiff.width,e={width:o.helper.width()-i,height:o.helper.height()-s},i=parseFloat(o.element.css("left"))+(o.position.left-o.originalPosition.left)||null,s=parseFloat(o.element.css("top"))+(o.position.top-o.originalPosition.top)||null,n.animate||this.element.css(V.extend(e,{top:s,left:i})),o.helper.height(o.size.height),o.helper.width(o.size.width),this._helper&&!n.animate&&this._proportionallyResize()),V("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",t),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s=this.options,n={minWidth:this._isNumber(s.minWidth)?s.minWidth:0,maxWidth:this._isNumber(s.maxWidth)?s.maxWidth:1/0,minHeight:this._isNumber(s.minHeight)?s.minHeight:0,maxHeight:this._isNumber(s.maxHeight)?s.maxHeight:1/0};(this._aspectRatio||t)&&(e=n.minHeight*this.aspectRatio,i=n.minWidth/this.aspectRatio,s=n.maxHeight*this.aspectRatio,t=n.maxWidth/this.aspectRatio,e>n.minWidth&&(n.minWidth=e),i>n.minHeight&&(n.minHeight=i),st.width,a=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,r=this.originalPosition.left+this.originalSize.width,l=this.originalPosition.top+this.originalSize.height,h=/sw|nw|w/.test(i),i=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),a&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&h&&(t.left=r-e.minWidth),s&&h&&(t.left=r-e.maxWidth),a&&i&&(t.top=l-e.minHeight),n&&i&&(t.top=l-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];e<4;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;e
    ").css({overflow:"hidden"}),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++e.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize;return{left:this.originalPosition.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize;return{top:this.originalPosition.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(t,e,i){return V.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},sw:function(t,e,i){return V.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[t,e,i]))},ne:function(t,e,i){return V.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},nw:function(t,e,i){return V.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[t,e,i]))}},_propagate:function(t,e){V.ui.plugin.call(this,t,[e,this.ui()]),"resize"!==t&&this._trigger(t,e,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),V.ui.plugin.add("resizable","animate",{stop:function(e){var i=V(this).resizable("instance"),t=i.options,s=i._proportionallyResizeElements,n=s.length&&/textarea/i.test(s[0].nodeName),o=n&&i._hasScroll(s[0],"left")?0:i.sizeDiff.height,a=n?0:i.sizeDiff.width,n={width:i.size.width-a,height:i.size.height-o},a=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,o=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(V.extend(n,o&&a?{top:o,left:a}:{}),{duration:t.animateDuration,easing:t.animateEasing,step:function(){var t={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};s&&s.length&&V(s[0]).css({width:t.width,height:t.height}),i._updateCache(t),i._propagate("resize",e)}})}}),V.ui.plugin.add("resizable","containment",{start:function(){var i,s,n=V(this).resizable("instance"),t=n.options,e=n.element,o=t.containment,a=o instanceof V?o.get(0):/parent/.test(o)?e.parent().get(0):o;a&&(n.containerElement=V(a),/document/.test(o)||o===document?(n.containerOffset={left:0,top:0},n.containerPosition={left:0,top:0},n.parentData={element:V(document),left:0,top:0,width:V(document).width(),height:V(document).height()||document.body.parentNode.scrollHeight}):(i=V(a),s=[],V(["Top","Right","Left","Bottom"]).each(function(t,e){s[t]=n._num(i.css("padding"+e))}),n.containerOffset=i.offset(),n.containerPosition=i.position(),n.containerSize={height:i.innerHeight()-s[3],width:i.innerWidth()-s[1]},t=n.containerOffset,e=n.containerSize.height,o=n.containerSize.width,o=n._hasScroll(a,"left")?a.scrollWidth:o,e=n._hasScroll(a)?a.scrollHeight:e,n.parentData={element:a,left:t.left,top:t.top,width:o,height:e}))},resize:function(t){var e=V(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.position,o=e._aspectRatio||t.shiftKey,a={top:0,left:0},r=e.containerElement,t=!0;r[0]!==document&&/static/.test(r.css("position"))&&(a=s),n.left<(e._helper?s.left:0)&&(e.size.width=e.size.width+(e._helper?e.position.left-s.left:e.position.left-a.left),o&&(e.size.height=e.size.width/e.aspectRatio,t=!1),e.position.left=i.helper?s.left:0),n.top<(e._helper?s.top:0)&&(e.size.height=e.size.height+(e._helper?e.position.top-s.top:e.position.top),o&&(e.size.width=e.size.height*e.aspectRatio,t=!1),e.position.top=e._helper?s.top:0),i=e.containerElement.get(0)===e.element.parent().get(0),n=/relative|absolute/.test(e.containerElement.css("position")),i&&n?(e.offset.left=e.parentData.left+e.position.left,e.offset.top=e.parentData.top+e.position.top):(e.offset.left=e.element.offset().left,e.offset.top=e.element.offset().top),n=Math.abs(e.sizeDiff.width+(e._helper?e.offset.left-a.left:e.offset.left-s.left)),s=Math.abs(e.sizeDiff.height+(e._helper?e.offset.top-a.top:e.offset.top-s.top)),n+e.size.width>=e.parentData.width&&(e.size.width=e.parentData.width-n,o&&(e.size.height=e.size.width/e.aspectRatio,t=!1)),s+e.size.height>=e.parentData.height&&(e.size.height=e.parentData.height-s,o&&(e.size.width=e.size.height*e.aspectRatio,t=!1)),t||(e.position.left=e.prevPosition.left,e.position.top=e.prevPosition.top,e.size.width=e.prevSize.width,e.size.height=e.prevSize.height)},stop:function(){var t=V(this).resizable("instance"),e=t.options,i=t.containerOffset,s=t.containerPosition,n=t.containerElement,o=V(t.helper),a=o.offset(),r=o.outerWidth()-t.sizeDiff.width,o=o.outerHeight()-t.sizeDiff.height;t._helper&&!e.animate&&/relative/.test(n.css("position"))&&V(this).css({left:a.left-s.left-i.left,width:r,height:o}),t._helper&&!e.animate&&/static/.test(n.css("position"))&&V(this).css({left:a.left-s.left-i.left,width:r,height:o})}}),V.ui.plugin.add("resizable","alsoResize",{start:function(){var t=V(this).resizable("instance").options;V(t.alsoResize).each(function(){var t=V(this);t.data("ui-resizable-alsoresize",{width:parseFloat(t.width()),height:parseFloat(t.height()),left:parseFloat(t.css("left")),top:parseFloat(t.css("top"))})})},resize:function(t,i){var e=V(this).resizable("instance"),s=e.options,n=e.originalSize,o=e.originalPosition,a={height:e.size.height-n.height||0,width:e.size.width-n.width||0,top:e.position.top-o.top||0,left:e.position.left-o.left||0};V(s.alsoResize).each(function(){var t=V(this),s=V(this).data("ui-resizable-alsoresize"),n={},e=t.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];V.each(e,function(t,e){var i=(s[e]||0)+(a[e]||0);i&&0<=i&&(n[e]=i||null)}),t.css(n)})},stop:function(){V(this).removeData("ui-resizable-alsoresize")}}),V.ui.plugin.add("resizable","ghost",{start:function(){var t=V(this).resizable("instance"),e=t.size;t.ghost=t.originalElement.clone(),t.ghost.css({opacity:.25,display:"block",position:"relative",height:e.height,width:e.width,margin:0,left:0,top:0}),t._addClass(t.ghost,"ui-resizable-ghost"),!1!==V.uiBackCompat&&"string"==typeof t.options.ghost&&t.ghost.addClass(this.options.ghost),t.ghost.appendTo(t.helper)},resize:function(){var t=V(this).resizable("instance");t.ghost&&t.ghost.css({position:"relative",height:t.size.height,width:t.size.width})},stop:function(){var t=V(this).resizable("instance");t.ghost&&t.helper&&t.helper.get(0).removeChild(t.ghost.get(0))}}),V.ui.plugin.add("resizable","grid",{resize:function(){var t,e=V(this).resizable("instance"),i=e.options,s=e.size,n=e.originalSize,o=e.originalPosition,a=e.axis,r="number"==typeof i.grid?[i.grid,i.grid]:i.grid,l=r[0]||1,h=r[1]||1,c=Math.round((s.width-n.width)/l)*l,u=Math.round((s.height-n.height)/h)*h,d=n.width+c,p=n.height+u,f=i.maxWidth&&i.maxWidthd,s=i.minHeight&&i.minHeight>p;i.grid=r,m&&(d+=l),s&&(p+=h),f&&(d-=l),g&&(p-=h),/^(se|s|e)$/.test(a)?(e.size.width=d,e.size.height=p):/^(ne)$/.test(a)?(e.size.width=d,e.size.height=p,e.position.top=o.top-u):/^(sw)$/.test(a)?(e.size.width=d,e.size.height=p,e.position.left=o.left-c):((p-h<=0||d-l<=0)&&(t=e._getPaddingPlusBorderDimensions(this)),0=+this.uiDialog.css("z-index")&&(this.uiDialog.css("z-index",s+1),i=!0),i&&!e&&this._trigger("focus",t),i},open:function(){var t=this;this._isOpen?this._moveToTop()&&this._focusTabbable():(this._isOpen=!0,this.opener=V(V.ui.safeActiveElement(this.document[0])),this._size(),this._position(),this._createOverlay(),this._moveToTop(null,!0),this.overlay&&this.overlay.css("z-index",this.uiDialog.css("z-index")-1),this._show(this.uiDialog,this.options.show,function(){t._focusTabbable(),t._trigger("focus")}),this._makeFocusTarget(),this._trigger("open"))},_focusTabbable:function(){var t=this._focusedElement;(t=!(t=!(t=!(t=!(t=t||this.element.find("[autofocus]")).length?this.element.find(":tabbable"):t).length?this.uiDialogButtonPane.find(":tabbable"):t).length?this.uiDialogTitlebarClose.filter(":tabbable"):t).length?this.uiDialog:t).eq(0).trigger("focus")},_restoreTabbableFocus:function(){var t=V.ui.safeActiveElement(this.document[0]);this.uiDialog[0]===t||V.contains(this.uiDialog[0],t)||this._focusTabbable()},_keepFocus:function(t){t.preventDefault(),this._restoreTabbableFocus(),this._delay(this._restoreTabbableFocus)},_createWrapper:function(){this.uiDialog=V("
    ").hide().attr({tabIndex:-1,role:"dialog"}).appendTo(this._appendTo()),this._addClass(this.uiDialog,"ui-dialog","ui-widget ui-widget-content ui-front"),this._on(this.uiDialog,{keydown:function(t){if(this.options.closeOnEscape&&!t.isDefaultPrevented()&&t.keyCode&&t.keyCode===V.ui.keyCode.ESCAPE)return t.preventDefault(),void this.close(t);var e,i,s;t.keyCode!==V.ui.keyCode.TAB||t.isDefaultPrevented()||(e=this.uiDialog.find(":tabbable"),i=e.first(),s=e.last(),t.target!==s[0]&&t.target!==this.uiDialog[0]||t.shiftKey?t.target!==i[0]&&t.target!==this.uiDialog[0]||!t.shiftKey||(this._delay(function(){s.trigger("focus")}),t.preventDefault()):(this._delay(function(){i.trigger("focus")}),t.preventDefault()))},mousedown:function(t){this._moveToTop(t)&&this._focusTabbable()}}),this.element.find("[aria-describedby]").length||this.uiDialog.attr({"aria-describedby":this.element.uniqueId().attr("id")})},_createTitlebar:function(){var t;this.uiDialogTitlebar=V("
    "),this._addClass(this.uiDialogTitlebar,"ui-dialog-titlebar","ui-widget-header ui-helper-clearfix"),this._on(this.uiDialogTitlebar,{mousedown:function(t){V(t.target).closest(".ui-dialog-titlebar-close")||this.uiDialog.trigger("focus")}}),this.uiDialogTitlebarClose=V("").button({label:V("").text(this.options.closeText).html(),icon:"ui-icon-closethick",showLabel:!1}).appendTo(this.uiDialogTitlebar),this._addClass(this.uiDialogTitlebarClose,"ui-dialog-titlebar-close"),this._on(this.uiDialogTitlebarClose,{click:function(t){t.preventDefault(),this.close(t)}}),t=V("").uniqueId().prependTo(this.uiDialogTitlebar),this._addClass(t,"ui-dialog-title"),this._title(t),this.uiDialogTitlebar.prependTo(this.uiDialog),this.uiDialog.attr({"aria-labelledby":t.attr("id")})},_title:function(t){this.options.title?t.text(this.options.title):t.html(" ")},_createButtonPane:function(){this.uiDialogButtonPane=V("
    "),this._addClass(this.uiDialogButtonPane,"ui-dialog-buttonpane","ui-widget-content ui-helper-clearfix"),this.uiButtonSet=V("
    ").appendTo(this.uiDialogButtonPane),this._addClass(this.uiButtonSet,"ui-dialog-buttonset"),this._createButtons()},_createButtons:function(){var s=this,t=this.options.buttons;this.uiDialogButtonPane.remove(),this.uiButtonSet.empty(),V.isEmptyObject(t)||Array.isArray(t)&&!t.length?this._removeClass(this.uiDialog,"ui-dialog-buttons"):(V.each(t,function(t,e){var i;e=V.extend({type:"button"},e="function"==typeof e?{click:e,text:t}:e),i=e.click,t={icon:e.icon,iconPosition:e.iconPosition,showLabel:e.showLabel,icons:e.icons,text:e.text},delete e.click,delete e.icon,delete e.iconPosition,delete e.showLabel,delete e.icons,"boolean"==typeof e.text&&delete e.text,V("",e).button(t).appendTo(s.uiButtonSet).on("click",function(){i.apply(s.element[0],arguments)})}),this._addClass(this.uiDialog,"ui-dialog-buttons"),this.uiDialogButtonPane.appendTo(this.uiDialog))},_makeDraggable:function(){var n=this,o=this.options;function a(t){return{position:t.position,offset:t.offset}}this.uiDialog.draggable({cancel:".ui-dialog-content, .ui-dialog-titlebar-close",handle:".ui-dialog-titlebar",containment:"document",start:function(t,e){n._addClass(V(this),"ui-dialog-dragging"),n._blockFrames(),n._trigger("dragStart",t,a(e))},drag:function(t,e){n._trigger("drag",t,a(e))},stop:function(t,e){var i=e.offset.left-n.document.scrollLeft(),s=e.offset.top-n.document.scrollTop();o.position={my:"left top",at:"left"+(0<=i?"+":"")+i+" top"+(0<=s?"+":"")+s,of:n.window},n._removeClass(V(this),"ui-dialog-dragging"),n._unblockFrames(),n._trigger("dragStop",t,a(e))}})},_makeResizable:function(){var n=this,o=this.options,t=o.resizable,e=this.uiDialog.css("position"),t="string"==typeof t?t:"n,e,s,w,se,sw,ne,nw";function a(t){return{originalPosition:t.originalPosition,originalSize:t.originalSize,position:t.position,size:t.size}}this.uiDialog.resizable({cancel:".ui-dialog-content",containment:"document",alsoResize:this.element,maxWidth:o.maxWidth,maxHeight:o.maxHeight,minWidth:o.minWidth,minHeight:this._minHeight(),handles:t,start:function(t,e){n._addClass(V(this),"ui-dialog-resizing"),n._blockFrames(),n._trigger("resizeStart",t,a(e))},resize:function(t,e){n._trigger("resize",t,a(e))},stop:function(t,e){var i=n.uiDialog.offset(),s=i.left-n.document.scrollLeft(),i=i.top-n.document.scrollTop();o.height=n.uiDialog.height(),o.width=n.uiDialog.width(),o.position={my:"left top",at:"left"+(0<=s?"+":"")+s+" top"+(0<=i?"+":"")+i,of:n.window},n._removeClass(V(this),"ui-dialog-resizing"),n._unblockFrames(),n._trigger("resizeStop",t,a(e))}}).css("position",e)},_trackFocus:function(){this._on(this.widget(),{focusin:function(t){this._makeFocusTarget(),this._focusedElement=V(t.target)}})},_makeFocusTarget:function(){this._untrackInstance(),this._trackingInstances().unshift(this)},_untrackInstance:function(){var t=this._trackingInstances(),e=V.inArray(this,t);-1!==e&&t.splice(e,1)},_trackingInstances:function(){var t=this.document.data("ui-dialog-instances");return t||this.document.data("ui-dialog-instances",t=[]),t},_minHeight:function(){var t=this.options;return"auto"===t.height?t.minHeight:Math.min(t.minHeight,t.height)},_position:function(){var t=this.uiDialog.is(":visible");t||this.uiDialog.show(),this.uiDialog.position(this.options.position),t||this.uiDialog.hide()},_setOptions:function(t){var i=this,s=!1,n={};V.each(t,function(t,e){i._setOption(t,e),t in i.sizeRelatedOptions&&(s=!0),t in i.resizableRelatedOptions&&(n[t]=e)}),s&&(this._size(),this._position()),this.uiDialog.is(":data(ui-resizable)")&&this.uiDialog.resizable("option",n)},_setOption:function(t,e){var i,s=this.uiDialog;"disabled"!==t&&(this._super(t,e),"appendTo"===t&&this.uiDialog.appendTo(this._appendTo()),"buttons"===t&&this._createButtons(),"closeText"===t&&this.uiDialogTitlebarClose.button({label:V("").text(""+this.options.closeText).html()}),"draggable"===t&&((i=s.is(":data(ui-draggable)"))&&!e&&s.draggable("destroy"),!i&&e&&this._makeDraggable()),"position"===t&&this._position(),"resizable"===t&&((i=s.is(":data(ui-resizable)"))&&!e&&s.resizable("destroy"),i&&"string"==typeof e&&s.resizable("option","handles",e),i||!1===e||this._makeResizable()),"title"===t&&this._title(this.uiDialogTitlebar.find(".ui-dialog-title")))},_size:function(){var t,e,i,s=this.options;this.element.show().css({width:"auto",minHeight:0,maxHeight:"none",height:0}),s.minWidth>s.width&&(s.width=s.minWidth),t=this.uiDialog.css({height:"auto",width:s.width}).outerHeight(),e=Math.max(0,s.minHeight-t),i="number"==typeof s.maxHeight?Math.max(0,s.maxHeight-t):"none","auto"===s.height?this.element.css({minHeight:e,maxHeight:i,height:"auto"}):this.element.height(Math.max(0,s.height-t)),this.uiDialog.is(":data(ui-resizable)")&&this.uiDialog.resizable("option","minHeight",this._minHeight())},_blockFrames:function(){this.iframeBlocks=this.document.find("iframe").map(function(){var t=V(this);return V("
    ").css({position:"absolute",width:t.outerWidth(),height:t.outerHeight()}).appendTo(t.parent()).offset(t.offset())[0]})},_unblockFrames:function(){this.iframeBlocks&&(this.iframeBlocks.remove(),delete this.iframeBlocks)},_allowInteraction:function(t){return!!V(t.target).closest(".ui-dialog").length||!!V(t.target).closest(".ui-datepicker").length},_createOverlay:function(){var i,s;this.options.modal&&(i=V.fn.jquery.substring(0,4),s=!0,this._delay(function(){s=!1}),this.document.data("ui-dialog-overlays")||this.document.on("focusin.ui-dialog",function(t){var e;s||((e=this._trackingInstances()[0])._allowInteraction(t)||(t.preventDefault(),e._focusTabbable(),"3.4."!==i&&"3.5."!==i||e._delay(e._restoreTabbableFocus)))}.bind(this)),this.overlay=V("
    ").appendTo(this._appendTo()),this._addClass(this.overlay,null,"ui-widget-overlay ui-front"),this._on(this.overlay,{mousedown:"_keepFocus"}),this.document.data("ui-dialog-overlays",(this.document.data("ui-dialog-overlays")||0)+1))},_destroyOverlay:function(){var t;this.options.modal&&this.overlay&&((t=this.document.data("ui-dialog-overlays")-1)?this.document.data("ui-dialog-overlays",t):(this.document.off("focusin.ui-dialog"),this.document.removeData("ui-dialog-overlays")),this.overlay.remove(),this.overlay=null)}}),!1!==V.uiBackCompat&&V.widget("ui.dialog",V.ui.dialog,{options:{dialogClass:""},_createWrapper:function(){this._super(),this.uiDialog.addClass(this.options.dialogClass)},_setOption:function(t,e){"dialogClass"===t&&this.uiDialog.removeClass(this.options.dialogClass).addClass(e),this._superApply(arguments)}});V.ui.dialog;function lt(t,e,i){return e<=t&&t").appendTo(this.element),this._addClass(this.valueDiv,"ui-progressbar-value","ui-widget-header"),this._refreshValue()},_destroy:function(){this.element.removeAttr("role aria-valuemin aria-valuemax aria-valuenow"),this.valueDiv.remove()},value:function(t){if(void 0===t)return this.options.value;this.options.value=this._constrainedValue(t),this._refreshValue()},_constrainedValue:function(t){return void 0===t&&(t=this.options.value),this.indeterminate=!1===t,"number"!=typeof t&&(t=0),!this.indeterminate&&Math.min(this.options.max,Math.max(this.min,t))},_setOptions:function(t){var e=t.value;delete t.value,this._super(t),this.options.value=this._constrainedValue(e),this._refreshValue()},_setOption:function(t,e){"max"===t&&(e=Math.max(this.min,e)),this._super(t,e)},_setOptionDisabled:function(t){this._super(t),this.element.attr("aria-disabled",t),this._toggleClass(null,"ui-state-disabled",!!t)},_percentage:function(){return this.indeterminate?100:100*(this.options.value-this.min)/(this.options.max-this.min)},_refreshValue:function(){var t=this.options.value,e=this._percentage();this.valueDiv.toggle(this.indeterminate||t>this.min).width(e.toFixed(0)+"%"),this._toggleClass(this.valueDiv,"ui-progressbar-complete",null,t===this.options.max)._toggleClass("ui-progressbar-indeterminate",null,this.indeterminate),this.indeterminate?(this.element.removeAttr("aria-valuenow"),this.overlayDiv||(this.overlayDiv=V("
    ").appendTo(this.valueDiv),this._addClass(this.overlayDiv,"ui-progressbar-overlay"))):(this.element.attr({"aria-valuemax":this.options.max,"aria-valuenow":t}),this.overlayDiv&&(this.overlayDiv.remove(),this.overlayDiv=null)),this.oldValue!==t&&(this.oldValue=t,this._trigger("change")),t===this.options.max&&this._trigger("complete")}}),V.widget("ui.selectable",V.ui.mouse,{version:"1.13.2",options:{appendTo:"body",autoRefresh:!0,distance:0,filter:"*",tolerance:"touch",selected:null,selecting:null,start:null,stop:null,unselected:null,unselecting:null},_create:function(){var i=this;this._addClass("ui-selectable"),this.dragged=!1,this.refresh=function(){i.elementPos=V(i.element[0]).offset(),i.selectees=V(i.options.filter,i.element[0]),i._addClass(i.selectees,"ui-selectee"),i.selectees.each(function(){var t=V(this),e=t.offset(),e={left:e.left-i.elementPos.left,top:e.top-i.elementPos.top};V.data(this,"selectable-item",{element:this,$element:t,left:e.left,top:e.top,right:e.left+t.outerWidth(),bottom:e.top+t.outerHeight(),startselected:!1,selected:t.hasClass("ui-selected"),selecting:t.hasClass("ui-selecting"),unselecting:t.hasClass("ui-unselecting")})})},this.refresh(),this._mouseInit(),this.helper=V("
    "),this._addClass(this.helper,"ui-selectable-helper")},_destroy:function(){this.selectees.removeData("selectable-item"),this._mouseDestroy()},_mouseStart:function(i){var s=this,t=this.options;this.opos=[i.pageX,i.pageY],this.elementPos=V(this.element[0]).offset(),this.options.disabled||(this.selectees=V(t.filter,this.element[0]),this._trigger("start",i),V(t.appendTo).append(this.helper),this.helper.css({left:i.pageX,top:i.pageY,width:0,height:0}),t.autoRefresh&&this.refresh(),this.selectees.filter(".ui-selected").each(function(){var t=V.data(this,"selectable-item");t.startselected=!0,i.metaKey||i.ctrlKey||(s._removeClass(t.$element,"ui-selected"),t.selected=!1,s._addClass(t.$element,"ui-unselecting"),t.unselecting=!0,s._trigger("unselecting",i,{unselecting:t.element}))}),V(i.target).parents().addBack().each(function(){var t,e=V.data(this,"selectable-item");if(e)return t=!i.metaKey&&!i.ctrlKey||!e.$element.hasClass("ui-selected"),s._removeClass(e.$element,t?"ui-unselecting":"ui-selected")._addClass(e.$element,t?"ui-selecting":"ui-unselecting"),e.unselecting=!t,e.selecting=t,(e.selected=t)?s._trigger("selecting",i,{selecting:e.element}):s._trigger("unselecting",i,{unselecting:e.element}),!1}))},_mouseDrag:function(s){if(this.dragged=!0,!this.options.disabled){var t,n=this,o=this.options,a=this.opos[0],r=this.opos[1],l=s.pageX,h=s.pageY;return ll||i.righth||i.bottoma&&i.rightr&&i.bottom",options:{appendTo:null,classes:{"ui-selectmenu-button-open":"ui-corner-top","ui-selectmenu-button-closed":"ui-corner-all"},disabled:null,icons:{button:"ui-icon-triangle-1-s"},position:{my:"left top",at:"left bottom",collision:"none"},width:!1,change:null,close:null,focus:null,open:null,select:null},_create:function(){var t=this.element.uniqueId().attr("id");this.ids={element:t,button:t+"-button",menu:t+"-menu"},this._drawButton(),this._drawMenu(),this._bindFormResetHandler(),this._rendered=!1,this.menuItems=V()},_drawButton:function(){var t,e=this,i=this._parseOption(this.element.find("option:selected"),this.element[0].selectedIndex);this.labels=this.element.labels().attr("for",this.ids.button),this._on(this.labels,{click:function(t){this.button.trigger("focus"),t.preventDefault()}}),this.element.hide(),this.button=V("",{tabindex:this.options.disabled?-1:0,id:this.ids.button,role:"combobox","aria-expanded":"false","aria-autocomplete":"list","aria-owns":this.ids.menu,"aria-haspopup":"true",title:this.element.attr("title")}).insertAfter(this.element),this._addClass(this.button,"ui-selectmenu-button ui-selectmenu-button-closed","ui-button ui-widget"),t=V("").appendTo(this.button),this._addClass(t,"ui-selectmenu-icon","ui-icon "+this.options.icons.button),this.buttonItem=this._renderButtonItem(i).appendTo(this.button),!1!==this.options.width&&this._resizeButton(),this._on(this.button,this._buttonEvents),this.button.one("focusin",function(){e._rendered||e._refreshMenu()})},_drawMenu:function(){var i=this;this.menu=V("
      ",{"aria-hidden":"true","aria-labelledby":this.ids.button,id:this.ids.menu}),this.menuWrap=V("
      ").append(this.menu),this._addClass(this.menuWrap,"ui-selectmenu-menu","ui-front"),this.menuWrap.appendTo(this._appendTo()),this.menuInstance=this.menu.menu({classes:{"ui-menu":"ui-corner-bottom"},role:"listbox",select:function(t,e){t.preventDefault(),i._setSelection(),i._select(e.item.data("ui-selectmenu-item"),t)},focus:function(t,e){e=e.item.data("ui-selectmenu-item");null!=i.focusIndex&&e.index!==i.focusIndex&&(i._trigger("focus",t,{item:e}),i.isOpen||i._select(e,t)),i.focusIndex=e.index,i.button.attr("aria-activedescendant",i.menuItems.eq(e.index).attr("id"))}}).menu("instance"),this.menuInstance._off(this.menu,"mouseleave"),this.menuInstance._closeOnDocumentClick=function(){return!1},this.menuInstance._isDivider=function(){return!1}},refresh:function(){this._refreshMenu(),this.buttonItem.replaceWith(this.buttonItem=this._renderButtonItem(this._getSelectedItem().data("ui-selectmenu-item")||{})),null===this.options.width&&this._resizeButton()},_refreshMenu:function(){var t=this.element.find("option");this.menu.empty(),this._parseOptions(t),this._renderMenu(this.menu,this.items),this.menuInstance.refresh(),this.menuItems=this.menu.find("li").not(".ui-selectmenu-optgroup").find(".ui-menu-item-wrapper"),this._rendered=!0,t.length&&(t=this._getSelectedItem(),this.menuInstance.focus(null,t),this._setAria(t.data("ui-selectmenu-item")),this._setOption("disabled",this.element.prop("disabled")))},open:function(t){this.options.disabled||(this._rendered?(this._removeClass(this.menu.find(".ui-state-active"),null,"ui-state-active"),this.menuInstance.focus(null,this._getSelectedItem())):this._refreshMenu(),this.menuItems.length&&(this.isOpen=!0,this._toggleAttr(),this._resizeMenu(),this._position(),this._on(this.document,this._documentClick),this._trigger("open",t)))},_position:function(){this.menuWrap.position(V.extend({of:this.button},this.options.position))},close:function(t){this.isOpen&&(this.isOpen=!1,this._toggleAttr(),this.range=null,this._off(this.document),this._trigger("close",t))},widget:function(){return this.button},menuWidget:function(){return this.menu},_renderButtonItem:function(t){var e=V("");return this._setText(e,t.label),this._addClass(e,"ui-selectmenu-text"),e},_renderMenu:function(s,t){var n=this,o="";V.each(t,function(t,e){var i;e.optgroup!==o&&(i=V("
    • ",{text:e.optgroup}),n._addClass(i,"ui-selectmenu-optgroup","ui-menu-divider"+(e.element.parent("optgroup").prop("disabled")?" ui-state-disabled":"")),i.appendTo(s),o=e.optgroup),n._renderItemData(s,e)})},_renderItemData:function(t,e){return this._renderItem(t,e).data("ui-selectmenu-item",e)},_renderItem:function(t,e){var i=V("
    • "),s=V("
      ",{title:e.element.attr("title")});return e.disabled&&this._addClass(i,null,"ui-state-disabled"),this._setText(s,e.label),i.append(s).appendTo(t)},_setText:function(t,e){e?t.text(e):t.html(" ")},_move:function(t,e){var i,s=".ui-menu-item";this.isOpen?i=this.menuItems.eq(this.focusIndex).parent("li"):(i=this.menuItems.eq(this.element[0].selectedIndex).parent("li"),s+=":not(.ui-state-disabled)"),(s="first"===t||"last"===t?i["first"===t?"prevAll":"nextAll"](s).eq(-1):i[t+"All"](s).eq(0)).length&&this.menuInstance.focus(e,s)},_getSelectedItem:function(){return this.menuItems.eq(this.element[0].selectedIndex).parent("li")},_toggle:function(t){this[this.isOpen?"close":"open"](t)},_setSelection:function(){var t;this.range&&(window.getSelection?((t=window.getSelection()).removeAllRanges(),t.addRange(this.range)):this.range.select(),this.button.trigger("focus"))},_documentClick:{mousedown:function(t){this.isOpen&&(V(t.target).closest(".ui-selectmenu-menu, #"+V.escapeSelector(this.ids.button)).length||this.close(t))}},_buttonEvents:{mousedown:function(){var t;window.getSelection?(t=window.getSelection()).rangeCount&&(this.range=t.getRangeAt(0)):this.range=document.selection.createRange()},click:function(t){this._setSelection(),this._toggle(t)},keydown:function(t){var e=!0;switch(t.keyCode){case V.ui.keyCode.TAB:case V.ui.keyCode.ESCAPE:this.close(t),e=!1;break;case V.ui.keyCode.ENTER:this.isOpen&&this._selectFocusedItem(t);break;case V.ui.keyCode.UP:t.altKey?this._toggle(t):this._move("prev",t);break;case V.ui.keyCode.DOWN:t.altKey?this._toggle(t):this._move("next",t);break;case V.ui.keyCode.SPACE:this.isOpen?this._selectFocusedItem(t):this._toggle(t);break;case V.ui.keyCode.LEFT:this._move("prev",t);break;case V.ui.keyCode.RIGHT:this._move("next",t);break;case V.ui.keyCode.HOME:case V.ui.keyCode.PAGE_UP:this._move("first",t);break;case V.ui.keyCode.END:case V.ui.keyCode.PAGE_DOWN:this._move("last",t);break;default:this.menu.trigger(t),e=!1}e&&t.preventDefault()}},_selectFocusedItem:function(t){var e=this.menuItems.eq(this.focusIndex).parent("li");e.hasClass("ui-state-disabled")||this._select(e.data("ui-selectmenu-item"),t)},_select:function(t,e){var i=this.element[0].selectedIndex;this.element[0].selectedIndex=t.index,this.buttonItem.replaceWith(this.buttonItem=this._renderButtonItem(t)),this._setAria(t),this._trigger("select",e,{item:t}),t.index!==i&&this._trigger("change",e,{item:t}),this.close(e)},_setAria:function(t){t=this.menuItems.eq(t.index).attr("id");this.button.attr({"aria-labelledby":t,"aria-activedescendant":t}),this.menu.attr("aria-activedescendant",t)},_setOption:function(t,e){var i;"icons"===t&&(i=this.button.find("span.ui-icon"),this._removeClass(i,null,this.options.icons.button)._addClass(i,null,e.button)),this._super(t,e),"appendTo"===t&&this.menuWrap.appendTo(this._appendTo()),"width"===t&&this._resizeButton()},_setOptionDisabled:function(t){this._super(t),this.menuInstance.option("disabled",t),this.button.attr("aria-disabled",t),this._toggleClass(this.button,null,"ui-state-disabled",t),this.element.prop("disabled",t),t?(this.button.attr("tabindex",-1),this.close()):this.button.attr("tabindex",0)},_appendTo:function(){var t=this.options.appendTo;return t=!(t=!(t=t&&(t.jquery||t.nodeType?V(t):this.document.find(t).eq(0)))||!t[0]?this.element.closest(".ui-front, dialog"):t).length?this.document[0].body:t},_toggleAttr:function(){this.button.attr("aria-expanded",this.isOpen),this._removeClass(this.button,"ui-selectmenu-button-"+(this.isOpen?"closed":"open"))._addClass(this.button,"ui-selectmenu-button-"+(this.isOpen?"open":"closed"))._toggleClass(this.menuWrap,"ui-selectmenu-open",null,this.isOpen),this.menu.attr("aria-hidden",!this.isOpen)},_resizeButton:function(){var t=this.options.width;!1!==t?(null===t&&(t=this.element.show().outerWidth(),this.element.hide()),this.button.outerWidth(t)):this.button.css("width","")},_resizeMenu:function(){this.menu.outerWidth(Math.max(this.button.outerWidth(),this.menu.width("").outerWidth()+1))},_getCreateOptions:function(){var t=this._super();return t.disabled=this.element.prop("disabled"),t},_parseOptions:function(t){var i=this,s=[];t.each(function(t,e){e.hidden||s.push(i._parseOption(V(e),t))}),this.items=s},_parseOption:function(t,e){var i=t.parent("optgroup");return{element:t,index:e,value:t.val(),label:t.text(),optgroup:i.attr("label")||"",disabled:i.prop("disabled")||t.prop("disabled")}},_destroy:function(){this._unbindFormResetHandler(),this.menuWrap.remove(),this.button.remove(),this.element.show(),this.element.removeUniqueId(),this.labels.attr("for",this.ids.element)}}]),V.widget("ui.slider",V.ui.mouse,{version:"1.13.2",widgetEventPrefix:"slide",options:{animate:!1,classes:{"ui-slider":"ui-corner-all","ui-slider-handle":"ui-corner-all","ui-slider-range":"ui-corner-all ui-widget-header"},distance:0,max:100,min:0,orientation:"horizontal",range:!1,step:1,value:0,values:null,change:null,slide:null,start:null,stop:null},numPages:5,_create:function(){this._keySliding=!1,this._mouseSliding=!1,this._animateOff=!0,this._handleIndex=null,this._detectOrientation(),this._mouseInit(),this._calculateNewMax(),this._addClass("ui-slider ui-slider-"+this.orientation,"ui-widget ui-widget-content"),this._refresh(),this._animateOff=!1},_refresh:function(){this._createRange(),this._createHandles(),this._setupEvents(),this._refreshValue()},_createHandles:function(){var t,e=this.options,i=this.element.find(".ui-slider-handle"),s=[],n=e.values&&e.values.length||1;for(i.length>n&&(i.slice(n).remove(),i=i.slice(0,n)),t=i.length;t");this.handles=i.add(V(s.join("")).appendTo(this.element)),this._addClass(this.handles,"ui-slider-handle","ui-state-default"),this.handle=this.handles.eq(0),this.handles.each(function(t){V(this).data("ui-slider-handle-index",t).attr("tabIndex",0)})},_createRange:function(){var t=this.options;t.range?(!0===t.range&&(t.values?t.values.length&&2!==t.values.length?t.values=[t.values[0],t.values[0]]:Array.isArray(t.values)&&(t.values=t.values.slice(0)):t.values=[this._valueMin(),this._valueMin()]),this.range&&this.range.length?(this._removeClass(this.range,"ui-slider-range-min ui-slider-range-max"),this.range.css({left:"",bottom:""})):(this.range=V("
      ").appendTo(this.element),this._addClass(this.range,"ui-slider-range")),"min"!==t.range&&"max"!==t.range||this._addClass(this.range,"ui-slider-range-"+t.range)):(this.range&&this.range.remove(),this.range=null)},_setupEvents:function(){this._off(this.handles),this._on(this.handles,this._handleEvents),this._hoverable(this.handles),this._focusable(this.handles)},_destroy:function(){this.handles.remove(),this.range&&this.range.remove(),this._mouseDestroy()},_mouseCapture:function(t){var i,s,n,o,e,a,r=this,l=this.options;return!l.disabled&&(this.elementSize={width:this.element.outerWidth(),height:this.element.outerHeight()},this.elementOffset=this.element.offset(),a={x:t.pageX,y:t.pageY},i=this._normValueFromMouse(a),s=this._valueMax()-this._valueMin()+1,this.handles.each(function(t){var e=Math.abs(i-r.values(t));(e=this._valueMax())return this._valueMax();var e=0=e&&(t+=0this.options.max&&(t-=i),this.max=parseFloat(t.toFixed(this._precision()))},_precision:function(){var t=this._precisionOf(this.options.step);return t=null!==this.options.min?Math.max(t,this._precisionOf(this.options.min)):t},_precisionOf:function(t){var e=t.toString(),t=e.indexOf(".");return-1===t?0:e.length-t-1},_valueMin:function(){return this.options.min},_valueMax:function(){return this.max},_refreshRange:function(t){"vertical"===t&&this.range.css({width:"",left:""}),"horizontal"===t&&this.range.css({height:"",bottom:""})},_refreshValue:function(){var e,i,t,s,n,o=this.options.range,a=this.options,r=this,l=!this._animateOff&&a.animate,h={};this._hasMultipleValues()?this.handles.each(function(t){i=(r.values(t)-r._valueMin())/(r._valueMax()-r._valueMin())*100,h["horizontal"===r.orientation?"left":"bottom"]=i+"%",V(this).stop(1,1)[l?"animate":"css"](h,a.animate),!0===r.options.range&&("horizontal"===r.orientation?(0===t&&r.range.stop(1,1)[l?"animate":"css"]({left:i+"%"},a.animate),1===t&&r.range[l?"animate":"css"]({width:i-e+"%"},{queue:!1,duration:a.animate})):(0===t&&r.range.stop(1,1)[l?"animate":"css"]({bottom:i+"%"},a.animate),1===t&&r.range[l?"animate":"css"]({height:i-e+"%"},{queue:!1,duration:a.animate}))),e=i}):(t=this.value(),s=this._valueMin(),n=this._valueMax(),i=n!==s?(t-s)/(n-s)*100:0,h["horizontal"===this.orientation?"left":"bottom"]=i+"%",this.handle.stop(1,1)[l?"animate":"css"](h,a.animate),"min"===o&&"horizontal"===this.orientation&&this.range.stop(1,1)[l?"animate":"css"]({width:i+"%"},a.animate),"max"===o&&"horizontal"===this.orientation&&this.range.stop(1,1)[l?"animate":"css"]({width:100-i+"%"},a.animate),"min"===o&&"vertical"===this.orientation&&this.range.stop(1,1)[l?"animate":"css"]({height:i+"%"},a.animate),"max"===o&&"vertical"===this.orientation&&this.range.stop(1,1)[l?"animate":"css"]({height:100-i+"%"},a.animate))},_handleEvents:{keydown:function(t){var e,i,s,n=V(t.target).data("ui-slider-handle-index");switch(t.keyCode){case V.ui.keyCode.HOME:case V.ui.keyCode.END:case V.ui.keyCode.PAGE_UP:case V.ui.keyCode.PAGE_DOWN:case V.ui.keyCode.UP:case V.ui.keyCode.RIGHT:case V.ui.keyCode.DOWN:case V.ui.keyCode.LEFT:if(t.preventDefault(),!this._keySliding&&(this._keySliding=!0,this._addClass(V(t.target),null,"ui-state-active"),!1===this._start(t,n)))return}switch(s=this.options.step,e=i=this._hasMultipleValues()?this.values(n):this.value(),t.keyCode){case V.ui.keyCode.HOME:i=this._valueMin();break;case V.ui.keyCode.END:i=this._valueMax();break;case V.ui.keyCode.PAGE_UP:i=this._trimAlignValue(e+(this._valueMax()-this._valueMin())/this.numPages);break;case V.ui.keyCode.PAGE_DOWN:i=this._trimAlignValue(e-(this._valueMax()-this._valueMin())/this.numPages);break;case V.ui.keyCode.UP:case V.ui.keyCode.RIGHT:if(e===this._valueMax())return;i=this._trimAlignValue(e+s);break;case V.ui.keyCode.DOWN:case V.ui.keyCode.LEFT:if(e===this._valueMin())return;i=this._trimAlignValue(e-s)}this._slide(t,n,i)},keyup:function(t){var e=V(t.target).data("ui-slider-handle-index");this._keySliding&&(this._keySliding=!1,this._stop(t,e),this._change(t,e),this._removeClass(V(t.target),null,"ui-state-active"))}}}),V.widget("ui.sortable",V.ui.mouse,{version:"1.13.2",widgetEventPrefix:"sort",ready:!1,options:{appendTo:"parent",axis:!1,connectWith:!1,containment:!1,cursor:"auto",cursorAt:!1,dropOnEmpty:!0,forcePlaceholderSize:!1,forceHelperSize:!1,grid:!1,handle:!1,helper:"original",items:"> *",opacity:!1,placeholder:!1,revert:!1,scroll:!0,scrollSensitivity:20,scrollSpeed:20,scope:"default",tolerance:"intersect",zIndex:1e3,activate:null,beforeStop:null,change:null,deactivate:null,out:null,over:null,receive:null,remove:null,sort:null,start:null,stop:null,update:null},_isOverAxis:function(t,e,i){return e<=t&&t*{ cursor: "+o.cursor+" !important; }").appendTo(n)),o.zIndex&&(this.helper.css("zIndex")&&(this._storedZIndex=this.helper.css("zIndex")),this.helper.css("zIndex",o.zIndex)),o.opacity&&(this.helper.css("opacity")&&(this._storedOpacity=this.helper.css("opacity")),this.helper.css("opacity",o.opacity)),this.scrollParent[0]!==this.document[0]&&"HTML"!==this.scrollParent[0].tagName&&(this.overflowOffset=this.scrollParent.offset()),this._trigger("start",t,this._uiHash()),this._preserveHelperProportions||this._cacheHelperProportions(),!i)for(s=this.containers.length-1;0<=s;s--)this.containers[s]._trigger("activate",t,this._uiHash(this));return V.ui.ddmanager&&(V.ui.ddmanager.current=this),V.ui.ddmanager&&!o.dropBehaviour&&V.ui.ddmanager.prepareOffsets(this,t),this.dragging=!0,this._addClass(this.helper,"ui-sortable-helper"),this.helper.parent().is(this.appendTo)||(this.helper.detach().appendTo(this.appendTo),this.offset.parent=this._getParentOffset()),this.position=this.originalPosition=this._generatePosition(t),this.originalPageX=t.pageX,this.originalPageY=t.pageY,this.lastPositionAbs=this.positionAbs=this._convertPositionTo("absolute"),this._mouseDrag(t),!0},_scroll:function(t){var e=this.options,i=!1;return this.scrollParent[0]!==this.document[0]&&"HTML"!==this.scrollParent[0].tagName?(this.overflowOffset.top+this.scrollParent[0].offsetHeight-t.pageYt[this.floating?"width":"height"]?h&&c:o",i.document[0]);return i._addClass(t,"ui-sortable-placeholder",s||i.currentItem[0].className)._removeClass(t,"ui-sortable-helper"),"tbody"===n?i._createTrPlaceholder(i.currentItem.find("tr").eq(0),V("",i.document[0]).appendTo(t)):"tr"===n?i._createTrPlaceholder(i.currentItem,t):"img"===n&&t.attr("src",i.currentItem.attr("src")),s||t.css("visibility","hidden"),t},update:function(t,e){s&&!o.forcePlaceholderSize||(e.height()&&(!o.forcePlaceholderSize||"tbody"!==n&&"tr"!==n)||e.height(i.currentItem.innerHeight()-parseInt(i.currentItem.css("paddingTop")||0,10)-parseInt(i.currentItem.css("paddingBottom")||0,10)),e.width()||e.width(i.currentItem.innerWidth()-parseInt(i.currentItem.css("paddingLeft")||0,10)-parseInt(i.currentItem.css("paddingRight")||0,10)))}}),i.placeholder=V(o.placeholder.element.call(i.element,i.currentItem)),i.currentItem.after(i.placeholder),o.placeholder.update(i,i.placeholder)},_createTrPlaceholder:function(t,e){var i=this;t.children().each(function(){V(" ",i.document[0]).attr("colspan",V(this).attr("colspan")||1).appendTo(e)})},_contactContainers:function(t){for(var e,i,s,n,o,a,r,l,h,c=null,u=null,d=this.containers.length-1;0<=d;d--)V.contains(this.currentItem[0],this.containers[d].element[0])||(this._intersectsWith(this.containers[d].containerCache)?c&&V.contains(this.containers[d].element[0],c.element[0])||(c=this.containers[d],u=d):this.containers[d].containerCache.over&&(this.containers[d]._trigger("out",t,this._uiHash(this)),this.containers[d].containerCache.over=0));if(c)if(1===this.containers.length)this.containers[u].containerCache.over||(this.containers[u]._trigger("over",t,this._uiHash(this)),this.containers[u].containerCache.over=1);else{for(i=1e4,s=null,n=(l=c.floating||this._isFloating(this.currentItem))?"left":"top",o=l?"width":"height",h=l?"pageX":"pageY",e=this.items.length-1;0<=e;e--)V.contains(this.containers[u].element[0],this.items[e].item[0])&&this.items[e].item[0]!==this.currentItem[0]&&(a=this.items[e].item.offset()[n],r=!1,t[h]-a>this.items[e][o]/2&&(r=!0),Math.abs(t[h]-a)this.containment[2]&&(i=this.containment[2]+this.offset.click.left),t.pageY-this.offset.click.top>this.containment[3]&&(s=this.containment[3]+this.offset.click.top)),e.grid&&(t=this.originalPageY+Math.round((s-this.originalPageY)/e.grid[1])*e.grid[1],s=!this.containment||t-this.offset.click.top>=this.containment[1]&&t-this.offset.click.top<=this.containment[3]?t:t-this.offset.click.top>=this.containment[1]?t-e.grid[1]:t+e.grid[1],t=this.originalPageX+Math.round((i-this.originalPageX)/e.grid[0])*e.grid[0],i=!this.containment||t-this.offset.click.left>=this.containment[0]&&t-this.offset.click.left<=this.containment[2]?t:t-this.offset.click.left>=this.containment[0]?t-e.grid[0]:t+e.grid[0])),{top:s-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+("fixed"===this.cssPosition?-this.scrollParent.scrollTop():o?0:n.scrollTop()),left:i-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+("fixed"===this.cssPosition?-this.scrollParent.scrollLeft():o?0:n.scrollLeft())}},_rearrange:function(t,e,i,s){i?i[0].appendChild(this.placeholder[0]):e.item[0].parentNode.insertBefore(this.placeholder[0],"down"===this.direction?e.item[0]:e.item[0].nextSibling),this.counter=this.counter?++this.counter:1;var n=this.counter;this._delay(function(){n===this.counter&&this.refreshPositions(!s)})},_clear:function(t,e){this.reverting=!1;var i,s=[];if(!this._noFinalSort&&this.currentItem.parent().length&&this.placeholder.before(this.currentItem),this._noFinalSort=null,this.helper[0]===this.currentItem[0]){for(i in this._storedCSS)"auto"!==this._storedCSS[i]&&"static"!==this._storedCSS[i]||(this._storedCSS[i]="");this.currentItem.css(this._storedCSS),this._removeClass(this.currentItem,"ui-sortable-helper")}else this.currentItem.show();function n(e,i,s){return function(t){s._trigger(e,t,i._uiHash(i))}}for(this.fromOutside&&!e&&s.push(function(t){this._trigger("receive",t,this._uiHash(this.fromOutside))}),!this.fromOutside&&this.domPosition.prev===this.currentItem.prev().not(".ui-sortable-helper")[0]&&this.domPosition.parent===this.currentItem.parent()[0]||e||s.push(function(t){this._trigger("update",t,this._uiHash())}),this!==this.currentContainer&&(e||(s.push(function(t){this._trigger("remove",t,this._uiHash())}),s.push(function(e){return function(t){e._trigger("receive",t,this._uiHash(this))}}.call(this,this.currentContainer)),s.push(function(e){return function(t){e._trigger("update",t,this._uiHash(this))}}.call(this,this.currentContainer)))),i=this.containers.length-1;0<=i;i--)e||s.push(n("deactivate",this,this.containers[i])),this.containers[i].containerCache.over&&(s.push(n("out",this,this.containers[i])),this.containers[i].containerCache.over=0);if(this.storedCursor&&(this.document.find("body").css("cursor",this.storedCursor),this.storedStylesheet.remove()),this._storedOpacity&&this.helper.css("opacity",this._storedOpacity),this._storedZIndex&&this.helper.css("zIndex","auto"===this._storedZIndex?"":this._storedZIndex),this.dragging=!1,e||this._trigger("beforeStop",t,this._uiHash()),this.placeholder[0].parentNode.removeChild(this.placeholder[0]),this.cancelHelperRemoval||(this.helper[0]!==this.currentItem[0]&&this.helper.remove(),this.helper=null),!e){for(i=0;i",widgetEventPrefix:"spin",options:{classes:{"ui-spinner":"ui-corner-all","ui-spinner-down":"ui-corner-br","ui-spinner-up":"ui-corner-tr"},culture:null,icons:{down:"ui-icon-triangle-1-s",up:"ui-icon-triangle-1-n"},incremental:!0,max:null,min:null,numberFormat:null,page:10,step:1,change:null,spin:null,start:null,stop:null},_create:function(){this._setOption("max",this.options.max),this._setOption("min",this.options.min),this._setOption("step",this.options.step),""!==this.value()&&this._value(this.element.val(),!0),this._draw(),this._on(this._events),this._refresh(),this._on(this.window,{beforeunload:function(){this.element.removeAttr("autocomplete")}})},_getCreateOptions:function(){var s=this._super(),n=this.element;return V.each(["min","max","step"],function(t,e){var i=n.attr(e);null!=i&&i.length&&(s[e]=i)}),s},_events:{keydown:function(t){this._start(t)&&this._keydown(t)&&t.preventDefault()},keyup:"_stop",focus:function(){this.previous=this.element.val()},blur:function(t){this.cancelBlur?delete this.cancelBlur:(this._stop(),this._refresh(),this.previous!==this.element.val()&&this._trigger("change",t))},mousewheel:function(t,e){var i=V.ui.safeActiveElement(this.document[0]);if(this.element[0]===i&&e){if(!this.spinning&&!this._start(t))return!1;this._spin((0").parent().append("")},_draw:function(){this._enhance(),this._addClass(this.uiSpinner,"ui-spinner","ui-widget ui-widget-content"),this._addClass("ui-spinner-input"),this.element.attr("role","spinbutton"),this.buttons=this.uiSpinner.children("a").attr("tabIndex",-1).attr("aria-hidden",!0).button({classes:{"ui-button":""}}),this._removeClass(this.buttons,"ui-corner-all"),this._addClass(this.buttons.first(),"ui-spinner-button ui-spinner-up"),this._addClass(this.buttons.last(),"ui-spinner-button ui-spinner-down"),this.buttons.first().button({icon:this.options.icons.up,showLabel:!1}),this.buttons.last().button({icon:this.options.icons.down,showLabel:!1}),this.buttons.height()>Math.ceil(.5*this.uiSpinner.height())&&0e.max?e.max:null!==e.min&&t"},_buttonHtml:function(){return""}});var ct;V.ui.spinner;V.widget("ui.tabs",{version:"1.13.2",delay:300,options:{active:null,classes:{"ui-tabs":"ui-corner-all","ui-tabs-nav":"ui-corner-all","ui-tabs-panel":"ui-corner-bottom","ui-tabs-tab":"ui-corner-top"},collapsible:!1,event:"click",heightStyle:"content",hide:null,show:null,activate:null,beforeActivate:null,beforeLoad:null,load:null},_isLocal:(ct=/#.*$/,function(t){var e=t.href.replace(ct,""),i=location.href.replace(ct,"");try{e=decodeURIComponent(e)}catch(t){}try{i=decodeURIComponent(i)}catch(t){}return 1?@\[\]\^`{|}~]/g,"\\$&"):""},refresh:function(){var t=this.options,e=this.tablist.children(":has(a[href])");t.disabled=V.map(e.filter(".ui-state-disabled"),function(t){return e.index(t)}),this._processTabs(),!1!==t.active&&this.anchors.length?this.active.length&&!V.contains(this.tablist[0],this.active[0])?this.tabs.length===t.disabled.length?(t.active=!1,this.active=V()):this._activate(this._findNextTab(Math.max(0,t.active-1),!1)):t.active=this.tabs.index(this.active):(t.active=!1,this.active=V()),this._refresh()},_refresh:function(){this._setOptionDisabled(this.options.disabled),this._setupEvents(this.options.event),this._setupHeightStyle(this.options.heightStyle),this.tabs.not(this.active).attr({"aria-selected":"false","aria-expanded":"false",tabIndex:-1}),this.panels.not(this._getPanelForTab(this.active)).hide().attr({"aria-hidden":"true"}),this.active.length?(this.active.attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0}),this._addClass(this.active,"ui-tabs-active","ui-state-active"),this._getPanelForTab(this.active).show().attr({"aria-hidden":"false"})):this.tabs.eq(0).attr("tabIndex",0)},_processTabs:function(){var l=this,t=this.tabs,e=this.anchors,i=this.panels;this.tablist=this._getList().attr("role","tablist"),this._addClass(this.tablist,"ui-tabs-nav","ui-helper-reset ui-helper-clearfix ui-widget-header"),this.tablist.on("mousedown"+this.eventNamespace,"> li",function(t){V(this).is(".ui-state-disabled")&&t.preventDefault()}).on("focus"+this.eventNamespace,".ui-tabs-anchor",function(){V(this).closest("li").is(".ui-state-disabled")&&this.blur()}),this.tabs=this.tablist.find("> li:has(a[href])").attr({role:"tab",tabIndex:-1}),this._addClass(this.tabs,"ui-tabs-tab","ui-state-default"),this.anchors=this.tabs.map(function(){return V("a",this)[0]}).attr({tabIndex:-1}),this._addClass(this.anchors,"ui-tabs-anchor"),this.panels=V(),this.anchors.each(function(t,e){var i,s,n,o=V(e).uniqueId().attr("id"),a=V(e).closest("li"),r=a.attr("aria-controls");l._isLocal(e)?(n=(i=e.hash).substring(1),s=l.element.find(l._sanitizeSelector(i))):(n=a.attr("aria-controls")||V({}).uniqueId()[0].id,(s=l.element.find(i="#"+n)).length||(s=l._createPanel(n)).insertAfter(l.panels[t-1]||l.tablist),s.attr("aria-live","polite")),s.length&&(l.panels=l.panels.add(s)),r&&a.data("ui-tabs-aria-controls",r),a.attr({"aria-controls":n,"aria-labelledby":o}),s.attr("aria-labelledby",o)}),this.panels.attr("role","tabpanel"),this._addClass(this.panels,"ui-tabs-panel","ui-widget-content"),t&&(this._off(t.not(this.tabs)),this._off(e.not(this.anchors)),this._off(i.not(this.panels)))},_getList:function(){return this.tablist||this.element.find("ol, ul").eq(0)},_createPanel:function(t){return V("
      ").attr("id",t).data("ui-tabs-destroy",!0)},_setOptionDisabled:function(t){var e,i;for(Array.isArray(t)&&(t.length?t.length===this.anchors.length&&(t=!0):t=!1),i=0;e=this.tabs[i];i++)e=V(e),!0===t||-1!==V.inArray(i,t)?(e.attr("aria-disabled","true"),this._addClass(e,null,"ui-state-disabled")):(e.removeAttr("aria-disabled"),this._removeClass(e,null,"ui-state-disabled"));this.options.disabled=t,this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!0===t)},_setupEvents:function(t){var i={};t&&V.each(t.split(" "),function(t,e){i[e]="_eventHandler"}),this._off(this.anchors.add(this.tabs).add(this.panels)),this._on(!0,this.anchors,{click:function(t){t.preventDefault()}}),this._on(this.anchors,i),this._on(this.tabs,{keydown:"_tabKeydown"}),this._on(this.panels,{keydown:"_panelKeydown"}),this._focusable(this.tabs),this._hoverable(this.tabs)},_setupHeightStyle:function(t){var i,e=this.element.parent();"fill"===t?(i=e.height(),i-=this.element.outerHeight()-this.element.height(),this.element.siblings(":visible").each(function(){var t=V(this),e=t.css("position");"absolute"!==e&&"fixed"!==e&&(i-=t.outerHeight(!0))}),this.element.children().not(this.panels).each(function(){i-=V(this).outerHeight(!0)}),this.panels.each(function(){V(this).height(Math.max(0,i-V(this).innerHeight()+V(this).height()))}).css("overflow","auto")):"auto"===t&&(i=0,this.panels.each(function(){i=Math.max(i,V(this).height("").height())}).height(i))},_eventHandler:function(t){var e=this.options,i=this.active,s=V(t.currentTarget).closest("li"),n=s[0]===i[0],o=n&&e.collapsible,a=o?V():this._getPanelForTab(s),r=i.length?this._getPanelForTab(i):V(),i={oldTab:i,oldPanel:r,newTab:o?V():s,newPanel:a};t.preventDefault(),s.hasClass("ui-state-disabled")||s.hasClass("ui-tabs-loading")||this.running||n&&!e.collapsible||!1===this._trigger("beforeActivate",t,i)||(e.active=!o&&this.tabs.index(s),this.active=n?V():s,this.xhr&&this.xhr.abort(),r.length||a.length||V.error("jQuery UI Tabs: Mismatching fragment identifier."),a.length&&this.load(this.tabs.index(s),t),this._toggle(t,i))},_toggle:function(t,e){var i=this,s=e.newPanel,n=e.oldPanel;function o(){i.running=!1,i._trigger("activate",t,e)}function a(){i._addClass(e.newTab.closest("li"),"ui-tabs-active","ui-state-active"),s.length&&i.options.show?i._show(s,i.options.show,o):(s.show(),o())}this.running=!0,n.length&&this.options.hide?this._hide(n,this.options.hide,function(){i._removeClass(e.oldTab.closest("li"),"ui-tabs-active","ui-state-active"),a()}):(this._removeClass(e.oldTab.closest("li"),"ui-tabs-active","ui-state-active"),n.hide(),a()),n.attr("aria-hidden","true"),e.oldTab.attr({"aria-selected":"false","aria-expanded":"false"}),s.length&&n.length?e.oldTab.attr("tabIndex",-1):s.length&&this.tabs.filter(function(){return 0===V(this).attr("tabIndex")}).attr("tabIndex",-1),s.attr("aria-hidden","false"),e.newTab.attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0})},_activate:function(t){var t=this._findActive(t);t[0]!==this.active[0]&&(t=(t=!t.length?this.active:t).find(".ui-tabs-anchor")[0],this._eventHandler({target:t,currentTarget:t,preventDefault:V.noop}))},_findActive:function(t){return!1===t?V():this.tabs.eq(t)},_getIndex:function(t){return t="string"==typeof t?this.anchors.index(this.anchors.filter("[href$='"+V.escapeSelector(t)+"']")):t},_destroy:function(){this.xhr&&this.xhr.abort(),this.tablist.removeAttr("role").off(this.eventNamespace),this.anchors.removeAttr("role tabIndex").removeUniqueId(),this.tabs.add(this.panels).each(function(){V.data(this,"ui-tabs-destroy")?V(this).remove():V(this).removeAttr("role tabIndex aria-live aria-busy aria-selected aria-labelledby aria-hidden aria-expanded")}),this.tabs.each(function(){var t=V(this),e=t.data("ui-tabs-aria-controls");e?t.attr("aria-controls",e).removeData("ui-tabs-aria-controls"):t.removeAttr("aria-controls")}),this.panels.show(),"content"!==this.options.heightStyle&&this.panels.css("height","")},enable:function(i){var t=this.options.disabled;!1!==t&&(t=void 0!==i&&(i=this._getIndex(i),Array.isArray(t)?V.map(t,function(t){return t!==i?t:null}):V.map(this.tabs,function(t,e){return e!==i?e:null})),this._setOptionDisabled(t))},disable:function(t){var e=this.options.disabled;if(!0!==e){if(void 0===t)e=!0;else{if(t=this._getIndex(t),-1!==V.inArray(t,e))return;e=Array.isArray(e)?V.merge([t],e).sort():[t]}this._setOptionDisabled(e)}},load:function(t,s){t=this._getIndex(t);function n(t,e){"abort"===e&&o.panels.stop(!1,!0),o._removeClass(i,"ui-tabs-loading"),a.removeAttr("aria-busy"),t===o.xhr&&delete o.xhr}var o=this,i=this.tabs.eq(t),t=i.find(".ui-tabs-anchor"),a=this._getPanelForTab(i),r={tab:i,panel:a};this._isLocal(t[0])||(this.xhr=V.ajax(this._ajaxSettings(t,s,r)),this.xhr&&"canceled"!==this.xhr.statusText&&(this._addClass(i,"ui-tabs-loading"),a.attr("aria-busy","true"),this.xhr.done(function(t,e,i){setTimeout(function(){a.html(t),o._trigger("load",s,r),n(i,e)},1)}).fail(function(t,e){setTimeout(function(){n(t,e)},1)})))},_ajaxSettings:function(t,i,s){var n=this;return{url:t.attr("href").replace(/#.*$/,""),beforeSend:function(t,e){return n._trigger("beforeLoad",i,V.extend({jqXHR:t,ajaxSettings:e},s))}}},_getPanelForTab:function(t){t=V(t).attr("aria-controls");return this.element.find(this._sanitizeSelector("#"+t))}}),!1!==V.uiBackCompat&&V.widget("ui.tabs",V.ui.tabs,{_processTabs:function(){this._superApply(arguments),this._addClass(this.tabs,"ui-tab")}});V.ui.tabs;V.widget("ui.tooltip",{version:"1.13.2",options:{classes:{"ui-tooltip":"ui-corner-all ui-widget-shadow"},content:function(){var t=V(this).attr("title");return V("").text(t).html()},hide:!0,items:"[title]:not([disabled])",position:{my:"left top+15",at:"left bottom",collision:"flipfit flip"},show:!0,track:!1,close:null,open:null},_addDescribedBy:function(t,e){var i=(t.attr("aria-describedby")||"").split(/\s+/);i.push(e),t.data("ui-tooltip-id",e).attr("aria-describedby",String.prototype.trim.call(i.join(" ")))},_removeDescribedBy:function(t){var e=t.data("ui-tooltip-id"),i=(t.attr("aria-describedby")||"").split(/\s+/),e=V.inArray(e,i);-1!==e&&i.splice(e,1),t.removeData("ui-tooltip-id"),(i=String.prototype.trim.call(i.join(" ")))?t.attr("aria-describedby",i):t.removeAttr("aria-describedby")},_create:function(){this._on({mouseover:"open",focusin:"open"}),this.tooltips={},this.parents={},this.liveRegion=V("
      ").attr({role:"log","aria-live":"assertive","aria-relevant":"additions"}).appendTo(this.document[0].body),this._addClass(this.liveRegion,null,"ui-helper-hidden-accessible"),this.disabledTitles=V([])},_setOption:function(t,e){var i=this;this._super(t,e),"content"===t&&V.each(this.tooltips,function(t,e){i._updateContent(e.element)})},_setOptionDisabled:function(t){this[t?"_disable":"_enable"]()},_disable:function(){var s=this;V.each(this.tooltips,function(t,e){var i=V.Event("blur");i.target=i.currentTarget=e.element[0],s.close(i,!0)}),this.disabledTitles=this.disabledTitles.add(this.element.find(this.options.items).addBack().filter(function(){var t=V(this);if(t.is("[title]"))return t.data("ui-tooltip-title",t.attr("title")).removeAttr("title")}))},_enable:function(){this.disabledTitles.each(function(){var t=V(this);t.data("ui-tooltip-title")&&t.attr("title",t.data("ui-tooltip-title"))}),this.disabledTitles=V([])},open:function(t){var i=this,e=V(t?t.target:this.element).closest(this.options.items);e.length&&!e.data("ui-tooltip-id")&&(e.attr("title")&&e.data("ui-tooltip-title",e.attr("title")),e.data("ui-tooltip-open",!0),t&&"mouseover"===t.type&&e.parents().each(function(){var t,e=V(this);e.data("ui-tooltip-open")&&((t=V.Event("blur")).target=t.currentTarget=this,i.close(t,!0)),e.attr("title")&&(e.uniqueId(),i.parents[this.id]={element:this,title:e.attr("title")},e.attr("title",""))}),this._registerCloseHandlers(t,e),this._updateContent(e,t))},_updateContent:function(e,i){var t=this.options.content,s=this,n=i?i.type:null;if("string"==typeof t||t.nodeType||t.jquery)return this._open(i,e,t);(t=t.call(e[0],function(t){s._delay(function(){e.data("ui-tooltip-open")&&(i&&(i.type=n),this._open(i,e,t))})}))&&this._open(i,e,t)},_open:function(t,e,i){var s,n,o,a=V.extend({},this.options.position);function r(t){a.of=t,n.is(":hidden")||n.position(a)}i&&((s=this._find(e))?s.tooltip.find(".ui-tooltip-content").html(i):(e.is("[title]")&&(t&&"mouseover"===t.type?e.attr("title",""):e.removeAttr("title")),s=this._tooltip(e),n=s.tooltip,this._addDescribedBy(e,n.attr("id")),n.find(".ui-tooltip-content").html(i),this.liveRegion.children().hide(),(i=V("
      ").html(n.find(".ui-tooltip-content").html())).removeAttr("name").find("[name]").removeAttr("name"),i.removeAttr("id").find("[id]").removeAttr("id"),i.appendTo(this.liveRegion),this.options.track&&t&&/^mouse/.test(t.type)?(this._on(this.document,{mousemove:r}),r(t)):n.position(V.extend({of:e},this.options.position)),n.hide(),this._show(n,this.options.show),this.options.track&&this.options.show&&this.options.show.delay&&(o=this.delayedShow=setInterval(function(){n.is(":visible")&&(r(a.of),clearInterval(o))},13)),this._trigger("open",t,{tooltip:n})))},_registerCloseHandlers:function(t,e){var i={keyup:function(t){t.keyCode===V.ui.keyCode.ESCAPE&&((t=V.Event(t)).currentTarget=e[0],this.close(t,!0))}};e[0]!==this.element[0]&&(i.remove=function(){var t=this._find(e);t&&this._removeTooltip(t.tooltip)}),t&&"mouseover"!==t.type||(i.mouseleave="close"),t&&"focusin"!==t.type||(i.focusout="close"),this._on(!0,e,i)},close:function(t){var e,i=this,s=V(t?t.currentTarget:this.element),n=this._find(s);n?(e=n.tooltip,n.closing||(clearInterval(this.delayedShow),s.data("ui-tooltip-title")&&!s.attr("title")&&s.attr("title",s.data("ui-tooltip-title")),this._removeDescribedBy(s),n.hiding=!0,e.stop(!0),this._hide(e,this.options.hide,function(){i._removeTooltip(V(this))}),s.removeData("ui-tooltip-open"),this._off(s,"mouseleave focusout keyup"),s[0]!==this.element[0]&&this._off(s,"remove"),this._off(this.document,"mousemove"),t&&"mouseleave"===t.type&&V.each(this.parents,function(t,e){V(e.element).attr("title",e.title),delete i.parents[t]}),n.closing=!0,this._trigger("close",t,{tooltip:e}),n.hiding||(n.closing=!1))):s.removeData("ui-tooltip-open")},_tooltip:function(t){var e=V("
      ").attr("role","tooltip"),i=V("
      ").appendTo(e),s=e.uniqueId().attr("id");return this._addClass(i,"ui-tooltip-content"),this._addClass(e,"ui-tooltip","ui-widget ui-widget-content"),e.appendTo(this._appendTo(t)),this.tooltips[s]={element:t,tooltip:e}},_find:function(t){t=t.data("ui-tooltip-id");return t?this.tooltips[t]:null},_removeTooltip:function(t){clearInterval(this.delayedShow),t.remove(),delete this.tooltips[t.attr("id")]},_appendTo:function(t){t=t.closest(".ui-front, dialog");return t=!t.length?this.document[0].body:t},_destroy:function(){var s=this;V.each(this.tooltips,function(t,e){var i=V.Event("blur"),e=e.element;i.target=i.currentTarget=e[0],s.close(i,!0),V("#"+t).remove(),e.data("ui-tooltip-title")&&(e.attr("title")||e.attr("title",e.data("ui-tooltip-title")),e.removeData("ui-tooltip-title"))}),this.liveRegion.remove()}}),!1!==V.uiBackCompat&&V.widget("ui.tooltip",V.ui.tooltip,{options:{tooltipClass:null},_tooltip:function(){var t=this._superApply(arguments);return this.options.tooltipClass&&t.tooltip.addClass(this.options.tooltipClass),t}});V.ui.tooltip}); \ No newline at end of file diff --git a/.extlib/simplesamlphp/modules/discopower/public/assets/js/jquery.livesearch.js b/.extlib/simplesamlphp/modules/discopower/public/assets/js/jquery.livesearch.js new file mode 100644 index 000000000..fb8f1a484 --- /dev/null +++ b/.extlib/simplesamlphp/modules/discopower/public/assets/js/jquery.livesearch.js @@ -0,0 +1,44 @@ +jQuery.fn.liveUpdate = function (list) { + list = jQuery(list); + + if (list.length) { + var rows = list.children('a'), + cache = rows.map(function () { + var keywords = jQuery(this).attr('data-keywords') || ""; + return jQuery(this).text().toLowerCase() + " " + keywords.toLowerCase(); + }); + + this.keyup(filter).keyup().parents('form').submit(function () { + return false; + }); + } + + return this; + + function filter() + { + var term = jQuery.trim(jQuery(this).val().toLowerCase()), scores = []; + + if (!term) { + rows.show(); + } else { + rows.hide(); + + cache.each(function (i) { + var score = this.score(term); + if (score > 0) { + scores.push([score, i]); + } + }); + + jQuery.each( + scores.sort(function (a, b) { + return b[0] - a[0]; + }), + function () { + jQuery(rows[ this[1] ]).show(); + } + ); + } + } +}; diff --git a/.extlib/simplesamlphp/modules/discopower/public/assets/js/quicksilver.js b/.extlib/simplesamlphp/modules/discopower/public/assets/js/quicksilver.js new file mode 100644 index 000000000..831cf0bd2 --- /dev/null +++ b/.extlib/simplesamlphp/modules/discopower/public/assets/js/quicksilver.js @@ -0,0 +1,102 @@ +// qs_score - Quicksilver Score +// +// A port of the Quicksilver string ranking algorithm +// +// "hello world".score("axl") //=> 0.0 +// "hello world".score("ow") //=> 0.6 +// "hello world".score("hello world") //=> 1.0 +// +// Tested in Firefox 2 and Safari 3 +// +// The Quicksilver code is available here +// http://code.google.com/p/blacktree-alchemy/ +// http://blacktree-alchemy.googlecode.com/svn/trunk/Crucible/Code/NSString+BLTRRanking.m +// +// The MIT License +// +// Copyright (c) 2008 Lachie Cox +// +// 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. + + +String.prototype.score = function (abbreviation,offset) { + offset = offset || 0 // TODO: I think this is unused... remove + + if (abbreviation.length === 0) { + return 0.9 + } + if (abbreviation.length > this.length) { + return 0.0 + } + + for (var i = abbreviation.length; i > 0; i--) { + var sub_abbreviation = abbreviation.substring(0,i) + var index = this.indexOf(sub_abbreviation) + + + if (index < 0) { + continue; + } + if (index + abbreviation.length > this.length + offset) { + continue; + } + + var next_string = this.substring(index + sub_abbreviation.length) + var next_abbreviation = null + + if (i >= abbreviation.length) { + next_abbreviation = '' + } else { + next_abbreviation = abbreviation.substring(i) + } + + var remaining_score = next_string.score(next_abbreviation,offset + index) + + if (remaining_score > 0) { + var score = this.length - next_string.length; + + if (index != 0) { + var j = 0; + var c = this.charCodeAt(index - 1) + if ( c == 32 || c == 9) { + for (j = (index - 2); j >= 0; j--) { + c = this.charCodeAt(j) + score -= ((c == 32 || c == 9) ? 1 : 0.15) + } + // XXX maybe not port this heuristic + // + // } else if ([[NSCharacterSet uppercaseLetterCharacterSet] characterIsMember:[self characterAtIndex:matchedRange.location]]) { + // for (j = matchedRange.location-1; j >= (int) searchRange.location; j--) { + // if ([[NSCharacterSet uppercaseLetterCharacterSet] characterIsMember:[self characterAtIndex:j]]) + // score--; + // else + // score -= 0.15; + // } + } else { + score -= index + } + } + + score += remaining_score * next_string.length + score /= this.length; + return score + } + } + return 0.0 +} diff --git a/.extlib/simplesamlphp/modules/discopower/public/assets/js/suggest.js b/.extlib/simplesamlphp/modules/discopower/public/assets/js/suggest.js new file mode 100644 index 000000000..c30e7ba6a --- /dev/null +++ b/.extlib/simplesamlphp/modules/discopower/public/assets/js/suggest.js @@ -0,0 +1,25 @@ +var suggest_cache = new Array; + +String.prototype.score = function (abbreviation,offset) { + if (suggest_cache['abv'] != abbreviation) { + suggest_cache['abv'] = abbreviation; + var words = abbreviation.split(/\s/); + suggest_cache['len'] = words.length; + suggest_cache.re = new Array; + + //words.each(); + for (var i = 0; i < suggest_cache['len']; ++i) { + suggest_cache['re'][i] = new Array(); + // /\b/ doesn't work when i a non-ascii - oddly enough \s does ... + suggest_cache['re'][i]['initialword'] = new RegExp("^" + words[i], "i"); + suggest_cache['re'][i]['word'] = new RegExp("[\\s-()_]" + words[i], "i"); + } + } + + for (var j = 0; j < suggest_cache['len']; ++j) { + if (!(this.match(suggest_cache['re'][j]['initialword']) || this.match(suggest_cache['re'][j]['word']))) { + return 0; + } + } + return 1; +} diff --git a/.extlib/simplesamlphp/modules/discopower/public/assets/js/tablist.js b/.extlib/simplesamlphp/modules/discopower/public/assets/js/tablist.js new file mode 100644 index 000000000..7dd0927aa --- /dev/null +++ b/.extlib/simplesamlphp/modules/discopower/public/assets/js/tablist.js @@ -0,0 +1,14 @@ +$(document).ready(function () { + $("#tabdiv").tabs(); + $.getJSON("tablist", function (data) { + $("#tabdiv").select(data["default"]); + for (var i = 0; i < data["tabs"].length; i++) { + var tab = data["tabs"][i]; + $("#query_" + tab).liveUpdate("#list_" + tab); + if (data["faventry"] === null && i === 0) { + $("#query_" + tab).focus(); + } + } + }); + $('#favouriteremember').tooltip(); +}); diff --git a/.extlib/simplesamlphp/modules/discopower/routing/routes/routes.yml b/.extlib/simplesamlphp/modules/discopower/routing/routes/routes.yml new file mode 100644 index 000000000..46c5b5bd8 --- /dev/null +++ b/.extlib/simplesamlphp/modules/discopower/routing/routes/routes.yml @@ -0,0 +1,6 @@ +discopower-main: + path: /disco.php + defaults: { _controller: 'SimpleSAML\Module\discopower\Controller\DiscoPower::main' } +discopower-tablist: + path: /tablist + defaults: { _controller: 'SimpleSAML\Module\discopower\Controller\DiscoPower::tablist' } diff --git a/.extlib/simplesamlphp/modules/discopower/src/Controller/DiscoPower.php b/.extlib/simplesamlphp/modules/discopower/src/Controller/DiscoPower.php new file mode 100644 index 000000000..54294a053 --- /dev/null +++ b/.extlib/simplesamlphp/modules/discopower/src/Controller/DiscoPower.php @@ -0,0 +1,81 @@ +getData('discopower:tabList', 'tabs'); + $faventry = $session->getData('discopower:tabList', 'faventry'); + $defaulttab = $session->getData('discopower:tabList', 'defaulttab'); + + if (!is_array($tabs)) { + throw new Error\Exception('Could not get tab list from session'); + } + + $response = new JsonResponse(); + + // handle JSONP requests + if ($request->query->has('callback')) { + $callback = $request->query->get('callback'); + if (!preg_match('/^[a-z0-9_]+$/i', $callback)) { + throw new Error\Exception('Unsafe JSONP callback function name ' . var_export($callback, true)); + } + $response->setCallback($callback); + } + + $response->setData( + [ + 'faventry' => $faventry, + 'default' => $defaulttab, + 'tabs' => $tabs, + ] + ); + return $response; + } +} diff --git a/.extlib/simplesamlphp/modules/discopower/src/PowerIdPDisco.php b/.extlib/simplesamlphp/modules/discopower/src/PowerIdPDisco.php new file mode 100644 index 000000000..1a263ea6a --- /dev/null +++ b/.extlib/simplesamlphp/modules/discopower/src/PowerIdPDisco.php @@ -0,0 +1,487 @@ +discoconfig = Configuration::getConfig('module_discopower.php'); + + $this->cdcDomain = $this->discoconfig->getOptionalString('cdc.domain', null); + if ($this->cdcDomain !== null && $this->cdcDomain[0] !== '.') { + // ensure that the CDC domain starts with a dot ('.') as required by the spec + $this->cdcDomain = '.' . $this->cdcDomain; + } + + $this->cdcLifetime = $this->discoconfig->getOptionalInteger('cdc.lifetime', null); + + self::$defaultWeight = $this->discoconfig->getOptionalInteger('defaultweight', 100); + } + + + /** + * Log a message. + * + * This is an helper function for logging messages. It will prefix the messages with our discovery service type. + * + * @param string $message The message which should be logged. + */ + protected function log(string $message): void + { + Logger::info('PowerIdPDisco.' . $this->instance . ': ' . $message); + } + + + /** + * Compare two entities. + * + * This function is used to sort the entity list. It sorts based on weights, + * and where those aren't available, English name. It puts larger weights + * higher, and will always put IdP's with names configured before those with + * only an entityID. + * + * @param array $a The metadata of the first entity. + * @param array $b The metadata of the second entity. + * + * @return int How $a compares to $b. + */ + public static function mcmp(array $a, array $b): int + { + // default weights + if (!isset($a['discopower.weight']) || !is_int($a['discopower.weight'])) { + $a['discopower.weight'] = self::$defaultWeight; + } + if (!isset($b['discopower.weight']) || !is_int($b['discopower.weight'])) { + $b['discopower.weight'] = self::$defaultWeight; + } + if ($a['discopower.weight'] > $b['discopower.weight']) { + return -1; // higher weights further up + } elseif ($b['discopower.weight'] > $a['discopower.weight']) { + return 1; // lower weights further down + } elseif (isset($a['name']['en']) && isset($b['name']['en'])) { + return strcasecmp($a['name']['en'], $b['name']['en']); + } elseif (isset($a['name']['en'])) { + return -1; // place name before entity ID + } elseif (isset($b['name']['en'])) { + return 1; // Place entity ID after name + } else { + return strcasecmp($a['entityid'], $b['entityid']); + } + } + + + /** + * Structure the list of IdPs in a hierarchy based upon the tags. + * + * @param array $list A list of IdPs. + * + * @return array The list of IdPs structured accordingly. + */ + protected function idplistStructured(array $list): array + { + $slist = []; + + $order = $this->discoconfig->getOptionalArray('taborder', []); + foreach ($order as $oe) { + $slist[$oe] = []; + } + + $enableTabs = $this->discoconfig->getOptionalArray('tabs', []); + + foreach ($list as $key => $val) { + $tags = ['misc']; + if (array_key_exists('tags', $val)) { + $tags = $val['tags']; + } + + + foreach ($tags as $tag) { + if (!empty($enableTabs) && !in_array($tag, $enableTabs)) { + continue; + } + $slist[$tag][$key] = $val; + } + } + + foreach ($slist as $tab => $tbslist) { + uasort($slist[$tab], [self::class, 'mcmp']); + // reorder with a hook if one exists + Module::callHooks('discosort', $slist[$tab]); + } + + return $slist; + } + + + /** + * Do the actual filtering according the rules defined. + * + * @param array $filter A set of rules regarding filtering. + * @param array $entry An entry to be evaluated by the filters. + * @param boolean $default What to do in case the entity does not match any rules. Defaults to true. + * + * @return boolean True if the entity should be kept, false if it should be discarded according to the filters. + */ + private function processFilter(array $filter, array $entry, bool $default = true): bool + { + if (in_array($entry['entityid'], $filter['entities.include'])) { + return true; + } + if (in_array($entry['entityid'], $filter['entities.exclude'])) { + return false; + } + + if (array_key_exists('tags', $entry)) { + foreach ($filter['tags.include'] as $fe) { + if (in_array($fe, $entry['tags'])) { + return true; + } + } + foreach ($filter['tags.exclude'] as $fe) { + if (in_array($fe, $entry['tags'])) { + return false; + } + } + } + return $default; + } + + + /** + * Filter a list of entities according to any filters defined in the parent class, plus discopower configuration + * options regarding filtering. + * + * @param array $list A list of entities to filter. + * + * @return array The list in $list after filtering entities. + */ + protected function filterList(array $list): array + { + $list = parent::filterList($list); + + try { + $spmd = $this->metadata->getMetaData($this->spEntityId, 'saml20-sp-remote'); + } catch (Exception $e) { + if ( + $this->discoconfig->getOptionalBoolean('useunsafereturn', false) + && array_key_exists('return', $_GET) + ) { + /* + * Get the SP metadata from the other side of the protocol bridge by retrieving the state. + * Because the disco is not explicitly passed the state ID, we can use a crude hack to + * infer it from the return parameter. This should be relatively safe because we're not + * going to trust it for anything other than finding the `discopower.filter` elements, + * and because the SP could bypass all of this anyway by specifying a known IdP in scoping. + */ + try { + parse_str(parse_url($_GET['return'], PHP_URL_QUERY), $returnState); + $state = Auth\State::loadState($returnState['AuthID'], 'saml:sp:sso'); + if ($state && array_key_exists('SPMetadata', $state)) { + $spmd = $state['SPMetadata']; + $this->log('Updated SP metadata from ' . $this->spEntityId . ' to ' . $spmd['entityid']); + } + } catch (Exception $e) { + return $list; + } + } else { + return $list; + } + } + + if (!isset($spmd) || !array_key_exists('discopower.filter', $spmd)) { + return $list; + } + $filter = $spmd['discopower.filter']; + + if (!array_key_exists('entities.include', $filter)) { + $filter['entities.include'] = []; + } + if (!array_key_exists('entities.exclude', $filter)) { + $filter['entities.exclude'] = []; + } + if (!array_key_exists('tags.include', $filter)) { + $filter['tags.include'] = []; + } + if (!array_key_exists('tags.exclude', $filter)) { + $filter['tags.exclude'] = []; + } + + $defaultrule = true; + if ( + array_key_exists('entities.include', $spmd['discopower.filter']) + || array_key_exists('tags.include', $spmd['discopower.filter']) + ) { + $defaultrule = false; + } + + $returnlist = []; + foreach ($list as $key => $entry) { + if ($this->processFilter($filter, $entry, $defaultrule)) { + $returnlist[$key] = $entry; + } + } + return $returnlist; + } + + + /** + * Handles a request to this discovery service. + * + * The IdP disco parameters should be set before calling this function. + */ + public function handleRequest(): void + { + $this->start(); + + // no choice made. Show discovery service page + $idpList = $this->getIdPList(); + $idpList = $this->idplistStructured($this->filterList($idpList)); + $preferredIdP = $this->getRecommendedIdP(); + + $t = new Template($this->config, 'discopower:disco.twig'); + $translator = $t->getTranslator(); + + $t->data['return'] = $this->returnURL; + $t->data['returnIDParam'] = $this->returnIdParam; + $t->data['entityID'] = $this->spEntityId; + $t->data['defaulttab'] = $this->discoconfig->getOptionalInteger('defaulttab', 0); + + $idpList = $this->processMetadata($t, $idpList); + + $t->data['idplist'] = $idpList; + $t->data['faventry'] = null; + foreach ($idpList as $tab => $slist) { + if (!empty($preferredIdP) && array_key_exists($preferredIdP, $slist)) { + $t->data['faventry'] = $slist[$preferredIdP]; + break; + } + } + + if (isset($t->data['faventry'])) { + $t->data['autofocus'] = 'favouritesubmit'; + } + + /* store the tab list in the session */ + $session = Session::getSessionFromRequest(); + if (array_key_exists('faventry', $t->data)) { + $session->setData('discopower:tabList', 'faventry', $t->data['faventry']); + } + $session->setData('discopower:tabList', 'tabs', array_keys($idpList)); + $session->setData('discopower:tabList', 'defaulttab', $t->data['defaulttab']); + + $httpUtils = new Utils\HTTP(); + $t->data['score'] = $this->discoconfig->getOptionalString('score', 'quicksilver'); + $t->data['preferredidp'] = $preferredIdP; + $t->data['urlpattern'] = htmlspecialchars($httpUtils->getSelfURLNoQuery()); + $t->data['rememberenabled'] = $this->config->getOptionalBoolean('idpdisco.enableremember', false); + $t->data['rememberchecked'] = $this->config->getOptionalBoolean('idpdisco.rememberchecked', false); + foreach (array_keys($idpList) as $tab) { + Assert::regex( + $tab, + '/^[a-z_][a-z0-9_-]+$/', + 'Tags can contain alphanumeric characters, hyphens and underscores.' + . ' They must start with a A-Z or an underscore.', + ); + + $translatableTag = "{discopower:tabs:$tab}"; + if ($translator::translateSingularGettext($translatableTag) === $translatableTag) { + $t->data['tabNames'][$tab] = $translator::noop($tab); + } else { + $t->data['tabNames'][$tab] = $translator::noop($translatableTag); + } + } + $t->send(); + } + + + /** + * @param \SimpleSAML\XHTML\Template $t + * @param array $metadata + * @return array + */ + private function processMetadata(Template $t, array $metadata): array + { + $basequerystring = '?' . + 'entityID=' . urlencode($t->data['entityID']) . '&' . + 'return=' . urlencode($t->data['return']) . '&' . + 'returnIDParam=' . urlencode($t->data['returnIDParam']) . '&idpentityid='; + + $httpUtils = new Utils\HTTP(); + foreach ($metadata as $tab => $idps) { + foreach ($idps as $entityid => $entity) { + $entity['actionUrl'] = $basequerystring . urlencode($entity['entityid']); + if (array_key_exists('icon', $entity) && $entity['icon'] !== null) { + $entity['iconUrl'] = $httpUtils->resolveURL($entity['icon']); + } + $entity['keywords'] = implode(' ', + $t->getEntityPropertyTranslation('Keywords', $entity['UIInfo'] ?? []) ?? [] + ); + $metadata[$tab][$entityid] = $entity; + } + } + return $metadata; + } + + + /** + * Get the IdP entities saved in the common domain cookie. + * + * @return array List of IdP entities. + */ + private function getCDC(): array + { + if (!isset($_COOKIE['_saml_idp'])) { + return []; + } + + $ret = (string) $_COOKIE['_saml_idp']; + $ret = explode(' ', $ret); + foreach ($ret as &$idp) { + $idp = base64_decode($idp); + if ($idp === false) { + // not properly base64 encoded + return []; + } + } + + return $ret; + } + + + /** + * Save the current IdP choice to a cookie. + * + * This function overrides the corresponding function in the parent class, to add support for common domain cookie. + * + * @param string $idp The entityID of the IdP. + */ + protected function setPreviousIdP(string $idp): void + { + if ($this->cdcDomain === null) { + parent::setPreviousIdP($idp); + return; + } + + $list = $this->getCDC(); + + $prevIndex = array_search($idp, $list, true); + if ($prevIndex !== false) { + unset($list[$prevIndex]); + } + $list[] = $idp; + + foreach ($list as &$value) { + $value = base64_encode($value); + } + $newCookie = implode(' ', $list); + + while (strlen($newCookie) > 4000) { + // the cookie is too long. Remove the oldest elements until it is short enough + $tmp = explode(' ', $newCookie, 2); + if (count($tmp) === 1) { + // we are left with a single entityID whose base64 representation is too long to fit in a cookie + break; + } + $newCookie = $tmp[1]; + } + + $params = [ + 'lifetime' => $this->cdcLifetime, + 'domain' => $this->cdcDomain, + 'secure' => true, + 'httponly' => false, + ]; + + $httpUtils = new Utils\HTTP(); + $httpUtils->setCookie('_saml_idp', $newCookie, $params, false); + } + + + /** + * Retrieve the previous IdP the user used. + * + * This function overrides the corresponding function in the parent class, to add support for common domain cookie. + * + * @return string|null The entity id of the previous IdP the user used, or null if this is the first time. + */ + protected function getPreviousIdP(): ?string + { + if ($this->cdcDomain === null) { + return parent::getPreviousIdP(); + } + + $prevIdPs = $this->getCDC(); + while (count($prevIdPs) > 0) { + $idp = array_pop($prevIdPs); + $idp = $this->validateIdP($idp); + if ($idp !== null) { + return $idp; + } + } + + return null; + } +} diff --git a/.extlib/simplesamlphp/modules/discopower/templates/disco.twig b/.extlib/simplesamlphp/modules/discopower/templates/disco.twig new file mode 100644 index 000000000..5bb445216 --- /dev/null +++ b/.extlib/simplesamlphp/modules/discopower/templates/disco.twig @@ -0,0 +1,69 @@ +{% set pagetitle = 'Select your identity provider'|trans %} +{% extends "base.twig" %} + +{% block preload %} + + +{% endblock %} +{% block postload %} + + + + + +{% endblock %} + +{% block content %} + {% if faventry is not empty %} +
      {{ 'You have previously chosen to authenticate at'|trans }} + {{ faventry|entityDisplayName }}
      +
      + + + + + + {% if rememberenabled %} + + {% endif %} +
      +
      + {% endif %} + +
      + + + {% for tab, idps in idplist %} + {% if idps is not empty %} +
      +
      +
      + +
      +
      + +
      + {% endif %} + {% endfor %} +
      +{% endblock %} diff --git a/.extlib/simplesamlphp/modules/ldap/LICENSE b/.extlib/simplesamlphp/modules/ldap/LICENSE new file mode 100644 index 000000000..a345e48d0 --- /dev/null +++ b/.extlib/simplesamlphp/modules/ldap/LICENSE @@ -0,0 +1,459 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + \ No newline at end of file diff --git a/.extlib/simplesamlphp/modules/ldap/README.md b/.extlib/simplesamlphp/modules/ldap/README.md new file mode 100644 index 000000000..e9dc3d51e --- /dev/null +++ b/.extlib/simplesamlphp/modules/ldap/README.md @@ -0,0 +1,34 @@ +# LDAP Module + +![Build Status](https://github.com/simplesamlphp/simplesamlphp-module-ldap/workflows/CI/badge.svg?branch=master) +[![Coverage Status](https://codecov.io/gh/simplesamlphp/simplesamlphp-module-ldap/branch/master/graph/badge.svg)](https://codecov.io/gh/simplesamlphp/simplesamlphp-module-ldap) +[![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/simplesamlphp/simplesamlphp-module-ldap/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/simplesamlphp/simplesamlphp-module-ldap/?branch=master) +[![Type Coverage](https://shepherd.dev/github/simplesamlphp/simplesamlphp-module-ldap/coverage.svg)](https://shepherd.dev/github/simplesamlphp/simplesamlphp-module-ldap) +[![Psalm Level](https://shepherd.dev/github/simplesamlphp/simplesamlphp-module-ldap/level.svg)](https://shepherd.dev/github/simplesamlphp/simplesamlphp-module-ldap) + +This module provides authproc-filters and authentication sources for interaction +with LDAP directories. + +## Installation + +Once you have installed SimpleSAMLphp, installing this module is very simple. +Just execute the following command in the root of your SimpleSAMLphp +installation: + +```bash +composer.phar require simplesamlphp/simplesamlphp-module-ldap:dev-master +``` + +where `dev-master` instructs Composer to install the `master` branch from the +Git repository. See the [releases][releases] +available if you want to use a stable version of the module. + +Next thing you need to do is to enable the module: in `config.php`, +search for the `module.enable` key and set `ldap` to true: + +```php + 'module.enable' => [ + 'ldap' => true, + … + ], +``` diff --git a/.extlib/simplesamlphp/modules/ldap/UPGRADE.md b/.extlib/simplesamlphp/modules/ldap/UPGRADE.md new file mode 100644 index 000000000..074f56945 --- /dev/null +++ b/.extlib/simplesamlphp/modules/ldap/UPGRADE.md @@ -0,0 +1,38 @@ +# Upgrade notes for SimpleSAMLphp LDAP-module 2.0 + +SimpleSAMLphp LDAP-module 2.0 is a major new release which has cleaned up +support for a lot of things that have been marked deprecated in previous +SimpleSAMLphp releases. + +The following changes are relevant for installers and/or developers. + +## Software requirements + +- The minimum PHP version required is now PHP 7.4. +- The module now depends on symfony/ldap. + +## Configuration + +Some settings for the authsources and authproc-filters have been renamed +to follow the Symfony naming convention: + +- 'hostname' becomes 'connection_string' and can no longer contain simple + hostnames or IP-addresses, but must be given one or more ldap(s):// URIs. +- 'enableTLS' becomes 'encryption' and can be set to 'ssl', 'tls' or 'none', + following symfony naming convention. +- 'search.base' is not always an array of OUs. +- 'search.scope' can now be set to 'base', 'one' or 'sub'. + +The authsources themselves have been renamed: + +- 'ldap:LDAP' becomes 'ldap:Ldap' +- 'ldap:LDAPMulti' becomes 'ldap:LdapMulti' + +Some new settings have been added for the authsources: + +- 'version' can be used to set the LDAP-version to be used. Defaults to v3. +- 'options' can be set to deal with LDAP connection options like referrals + or connection timeouts. See the example config-template. + See [Symfony documentation][1] for the available options. + +[1]: https://github.com/symfony/symfony/blob/5.4/src/Symfony/Component/Ldap/Adapter/ExtLdap/ConnectionOptions.php diff --git a/.extlib/simplesamlphp/modules/ldap/composer.json b/.extlib/simplesamlphp/modules/ldap/composer.json new file mode 100644 index 000000000..eebf7a5b6 --- /dev/null +++ b/.extlib/simplesamlphp/modules/ldap/composer.json @@ -0,0 +1,56 @@ +{ + "name": "simplesamlphp/simplesamlphp-module-ldap", + "description": "A module that provides authentication against LDAP stores", + "type": "simplesamlphp-module", + "keywords": ["simplesamlphp", "ldap"], + "license": "LGPL-2.1-or-later", + "authors": [ + { + "name": "Olav Morken", + "email": "olavmrk@gmail.com" + }, + { + "name": "Tim van Dijen", + "email": "tvdijen@gmail.com" + } + ], + "config": { + "preferred-install": { + "simplesamlphp/simplesamlphp": "source", + "*": "dist" + }, + "allow-plugins": { + "composer/package-versions-deprecated": true, + "simplesamlphp/composer-module-installer": true, + "dealerdirect/phpcodesniffer-composer-installer": true, + "simplesamlphp/composer-xmlprovider-installer": true, + "phpstan/extension-installer": true + } + }, + "autoload": { + "psr-4": { + "SimpleSAML\\Module\\ldap\\": "src/" + } + }, + "autoload-dev": { + "psr-4": { + "SimpleSAML\\Test\\Utils\\": "vendor/simplesamlphp/simplesamlphp/tests/Utils" + } + }, + "require": { + "php": "^8.0", + "ext-ldap": "*", + + "simplesamlphp/assert": "^1.0.0", + "simplesamlphp/composer-module-installer": "^1.3.4", + "simplesamlphp/simplesamlphp": "^2.0", + "symfony/ldap": "^6.0" + }, + "require-dev": { + "simplesamlphp/simplesamlphp-test-framework": "^1.5.5" + }, + "support": { + "issues": "https://github.com/simplesamlphp/simplesamlphp-module-ldap/issues", + "source": "https://github.com/simplesamlphp/simplesamlphp-module-ldap" + } +} diff --git a/.extlib/simplesamlphp/modules/ldap/docs/ldap.md b/.extlib/simplesamlphp/modules/ldap/docs/ldap.md new file mode 100644 index 000000000..40f64d99b --- /dev/null +++ b/.extlib/simplesamlphp/modules/ldap/docs/ldap.md @@ -0,0 +1,638 @@ +# LDAP module + +The LDAP module provides a method for authenticating users against an +LDAP server. There are two separate authentication modules and two +authentication processing filters: + +`ldap:Ldap` +: Authenticate the user against a single LDAP server. + +`ldap:LdapMulti` +: Allow the user to chose one LDAP server to authenticate against. + +`ldap:AttributeAddFromLDAP` +: Adds an attribute value from LDAP to the request + +`ldap:AttributeAddUsersGroups` +: Add an attribute to the request with all the user's group memberships + +## `ldap:Ldap` + +This module is used when you have an organization with a single LDAP +server with all the users. To create an LDAP authentication source, open +`config/authsources.php` in a text editor, and add an entry for the +authentication source: + +```php + 'example-ldap' => [ + 'ldap:Ldap', + + /** + * The connection string for the LDAP-server. + * You can add multiple by separating them with a space. + */ + 'connection_string' => 'ldap.example.org', + + /** + * Whether SSL/TLS should be used when contacting the LDAP server. + * Possible values are 'ssl', 'tls' or 'none' + */ + 'encryption' => 'ssl', + + /** + * The LDAP version to use when interfacing the LDAP-server. + * Defaults to 3 + */ + 'version' => 3, + + /** + * Set to TRUE to enable LDAP debug level. Passed to the LDAP connector class. + * + * Default: FALSE + * Required: No + */ + 'debug' => false, + + /** + * The LDAP-options to pass when setting up a connection + * See [Symfony documentation][1] + */ + 'options' => [ + /** + * Set whether to follow referrals. + * AD Controllers may require 0x00 to function. + * Possible values are 0x00 (NEVER), 0x01 (SEARCHING), + * 0x02 (FINDING) or 0x03 (ALWAYS). + */ + 'referrals' => 0x00, + + 'network_timeout' => 3, + ], + + /** + * The connector to use. + * Defaults to '\SimpleSAML\Module\ldap\Connector\Ldap', but can be set + * to '\SimpleSAML\Module\ldap\Connector\ActiveDirectory' when + * authenticating against Microsoft Active Directory. This will + * provide you with more specific error messages. + */ + 'connector' => '\SimpleSAML\Module\ldap\Connector\Ldap', + + /** + * Which attributes should be retrieved from the LDAP server. + * This can be an array of attribute names, or NULL, in which case + * all attributes are fetched. + */ + 'attributes' => null, + + /** + * Which attributes should be base64 encoded after retrieval from + * the LDAP server. + */ + 'attributes.binary' => [ + 'jpegPhoto', + 'objectGUID', + 'objectSid', + 'mS-DS-ConsistencyGuid' + ], + + /** + * The pattern which should be used to create the user's DN given + * the username. %username% in this pattern will be replaced with + * the user's username. + * + * This option is not used if the search.enable option is set to TRUE. + */ + 'dnpattern' => 'uid=%username%,ou=people,dc=example,dc=org', + + /** + * As an alternative to specifying a pattern for the users DN, it is + * possible to search for the username in a set of attributes. This is + * enabled by this option. + */ + 'search.enable' => false, + + /** + * An array on DNs which will be used as a base for the search. In + * case of multiple strings, they will be searched in the order given. + */ + 'search.base' => [ + 'ou=people,dc=example,dc=org', + ], + + /** + * The scope of the search. Valid values are 'sub' and 'one' and + * 'base', first one being the default if no value is set. + */ + 'search.scope' => 'sub', + + /** + * The attribute(s) the username should match against. + * + * This is an array with one or more attribute names. Any of the + * attributes in the array may match the value the username. + */ + 'search.attributes' => ['uid', 'mail'], + + /** + * Additional filters that must match for the entire LDAP search to + * be true. + * + * This should be a single string conforming to [RFC 1960][2] + * and [RFC 2544][3]. The string is appended to the search attributes + */ + 'search.filter' => '(&(objectClass=Person)(|(sn=Doe)(cn=John *)))', + + /** + * The username & password where SimpleSAMLphp should bind to before + * searching. If this is left NULL, no bind will be performed before + * searching. + */ + 'search.username' => null, + 'search.password' => null, + ], +``` + +[1]: https://github.com/symfony/symfony/blob/5.4/src/Symfony/Component/Ldap/Adapter/ExtLdap/ConnectionOptions.php +[2]: https://datatracker.ietf.org/doc/html/rfc1960 +[3]: https://datatracker.ietf.org/doc/html/rfc2544 + +You should update the name of this authentication source +(`example-ldap`) to have a name which makes sense to your organization. +You also need to update the `hostname` and `dnpattern` options. The +`hostname` should be the hostname of your LDAP server, and the +`dnpattern` should be a pattern which can be used to generate the `dn` +of a user with a given username. + +All other options have default values, and are not required. + +## Searching for a user + +Sometimes you cannot generate the user's `dn` from the username, or you +may want to allow the user to authenticate with for example their email +address as the username. In this case, you can configure the LDAP +module to search for the users `dn` by searching for the username in +one or more attributes. + +To enable searching, you must set the `search.enable` option to `TRUE`. +You must then configure the `search.base` and the `search.attributes` +options. The `search.base`-option must be the `dn` which should be used +as the base/root of the search. The `search.attributes`-option is an +array with attributes the username should be matched against. + +You can also append the `search.filter` option to further limit your search. +The `search.filter` field is optional and need not be included in your +configuration file. + +The `dnpattern` option will not be used if searching is enabled. + +Some LDAP servers may require authentication before a search can be +performed. In this case, you should configure the `search.username` +and `search.password` options. The `search.username` option is a `dn` +which can be used to perform a search, and the `search.password` option +is the password for that `dn`. + +## Configuring failover + +You can configure multiple LDAP servers in the hostname option by separating +the individual hosts with a space. This enables the builtin LDAP failover +in OpenLDAP. + +Note that OpenLDAP waits for a timeout from the first server before attempting +to connect to the other. To avoid a very long wait, it is recommended to change +the timeouts. This can be done in the system-wide ldap configuration file. + +NETWORK_TIMEOUT 10 +TIMELIMIT 15 +TIMEOUT 20 + +In this case, if we are unable to connect to the first LDAP server within +10 seconds, we will attempt the next. +(Note: the NETWORK_TIMEOUT option was introduced with OpenLDAP version 2.4.) + +Example: + +```php + /* Configuration that uses two ldap servers. */ + 'example-ldap' => [ + 'ldap:Ldap', + /* The hostname of the LDAP server. */ + 'connect_string' => 'ldaps://ldap1.example.org ldaps://ldap2.example.org', + 'dnpattern' => 'uid=%username%,ou=people,dc=example,dc=org', + ], +``` + +### `ldap:LdapMulti` + +This module can be used if your organization has separate groups with +separate LDAP servers or separate LDAP configurations. To use this +authentication module, open `config/authsources.php` in a text editor, +and add an entry which uses this module: + +```php + 'example-ldapmulti' => [ + 'ldap:LdapMulti', + + /* + * The way the organization as part of the username should be handled. + * Three possible values: + * - 'none': No handling of the organization. Allows '@' to be part + * of the username. + * - 'allow': Will allow users to type 'username@organization'. + * - 'force': Force users to type 'username@organization'. The dropdown + * list will be hidden. + * + * The default is 'none'. + */ + 'username_organization_method' => 'none', + + /* + * Whether the organization should be included as part of the username + * when authenticating. If this is set to TRUE, the username will be on + * the form @. If this is FALSE, the + * username will be used as the user enters it. + * + * The default is FALSE. + */ + 'include_organization_in_username' => false, + + /* + * A list of available LDAP servers. + * + * The index is an identifier for the organization/group. When + * 'username_organization_method' is set to something other than 'none', + * the organization-part of the username is matched against the index. + * + * The value of each element is an array in the same format as an LDAP + * authentication source. + */ + 'mapping' => [ + 'employees' => [ + /** + * A short name/description for this group. Will be shown in a + * dropdown list when the user logs on. + * + * This option can be a string or an array with + * language => text mappings. + */ + 'description' => 'Employees', + 'authsource' => ''example-ldap, + ], + + 'students' => [ + 'description' => 'Students', + 'authsource' => 'example-ldap-2', + ], + ], + + ], +``` + +The name of the authentication source (`example-ldapmulti`) should be +changed to something that makes sense for your organization. Each entry +in the configuration represents the configuration for one group of +users. The `description`-option in each group is the name of the group, +and will be shown to the user in a dropdown list on the login page. + +The `description`-option can also be an array with descriptions in +different languages: + +```php + 'description' => [ + 'en' => 'Employees', + 'no' => 'Ansatte', + ], +``` + +All options from the `ldap:Ldap` configuration can be used in each +group, and you should refer to the documentation for that module for +more information about available options. + +### `ldap:AttributeAddFromLDAP` + +Filter to add attributes to the identity by executing a query against +an LDAP directory. In addition to all the configuration options available +in the ldap:AttributeAddUsersGroups filter (below), these are the filter +specific configuration options: + +```php + 50 => [ + 'class' => 'ldap:AttributeAddFromLDAP', + + /** + * The attributes to search for and their mappings. This must be an array, + * and keys can be skipped. If you skip a key, then the attribute will be + * exported with the same name as the LDAP attribute. + * + * Default: NULL + * Required: Yes + */ + 'attributes' => ['mail', 'jpegPhoto' => 'jpegphoto'], + + /** + * The attribute policy that defines what to do with attributes that are + * already part of the attributes of the user. Can be one of: + * + * - add: blindly add the values. If the attribute already exists and has + * the same value, the result of the filter will be two equal values. + * + * - merge: carefully merge the values. If a value is already part of + * the attribute, do not add a duplicate. + * + * - replace: if the attribute is present before running the filter, + * replace its values with the ones obtained at this point. + * + * Default: merge + * Required: No + */ + 'attribute.policy' => 'merge', + + /** + * The search filter to find the user in LDAP. + * + * Note: Variable substitution will be performed on this option. + * Any attribute in the identity can be substituted by surrounding + * it with percent symbols (%). For instance %cn% would be replaced + * with the CN of the user. + * + * Default: NULL + * Required: Yes + */ + 'search.filter' => '(uid=%uid%)', + ]; +``` + +## Backwards Compatibility + +Previous versions of this filter allowed just one attribute to be fetched from +the LDAP at a time. The options 'attribute.new' and 'search.attribute' were used +instead of the new option 'attributes'. Fortunately, the filter is backwards +compatible, so your old configuration will still work, but keep in mind that the +old configuration style is deprecated now and will be removed in 2.0. + +Example: + +This is the most basic configuration possible. It will look at the +authsource for all LDAP connection information and queries LDAP for +the specific attributes requested. + +```php + 50 => [ + 'class' => 'ldap:AttributeAddFromLDAP', + 'authsource' => 'example-ldap', + 'attributes' => ['displayName' => 'cn', 'jpegPhoto'], + 'search.filter' => '(uid=%uid%)', + ] +``` + +If no authsource is available then you can specify the connection info +using the filter configuration. Note: Not all of the options below are +required, see the config options for ldap:AttributeAddFromLDAP above. + +```php + 50 => [ + 'class' => 'ldap:AttributeAddFromLDAP', + 'connection_string' => 'ldap.example.org', + 'search.username' => 'CN=LDAP User,CN=Users,DC=example,DC=org', + 'search.password' => 'Abc123', + 'search.base' => ['DC=example,DC=org'], + 'search.filter' => '(uid=%uid%)', + 'attributes' => ['displayName' => 'cn', 'jpegPhoto'], + ] +``` + +### `ldap:AttributeAddUsersGroups` + +This filter will add the logged in user's LDAP group memberships to +a specified request attribute. Although most LDAP products have a +memberOf attribute which only lists the direct membership relations, +this filter checks those relation for "sub" groups, recursively +checking the hierarchy for all groups the user would technically be +a member of. This can be helpful for other filters to know. Below is +a listing of all configuration options and their details. + +```php + 50 => [ + 'class' => 'ldap:AttributeAddUsersGroups', + + + /** + * LDAP connection settings can be retrieved from an ldap:LDAP + * authsource. Specify the authsource name here to pull that + * data from the authsources.php file in the config folder. + * + * Note: ldap:LDAPMulti is not supported as the SimpleSAMLphp + * framework does not pass any information about which + * LDAP source the user selected. + * + * Default: NULL + * Require: No + */ + 'authsource' => null, + 'authsource' => 'example-ldap', + + + /** + * This is the attribute name which the users groups will be + * added to. If the attribute exists in the request then the + * filter will attempt to add them. + * + * Default: 'groups' + * Required: No + */ + 'attribute.groups' => 'groups', + + + /** + * The base DNs used to search LDAP. May not be needed if searching + * LDAP using the standard method, meaning that no Product is specified. + * + * Default: [] + * Required: No + * AuthSource: search.base + */ + 'search.base' => [ + 'OU=Staff,DC=example,DC=org', + 'OU=Students,DC=example,DC=org' + ], + + + /** + * Set to TRUE to enable LDAP debug level. Passed to + * the LDAP connection class. + * + * Default: FALSE + * Required: No + * AuthSource: debug + */ + 'debug' => false, + 'debug' => true, + + + /** + * Whether SSL/TLS should be used when contacting the LDAP server. + * Possible values are 'ssl', 'tls' or 'none' + */ + 'encryption' => 'tls', + 'encryption' => 'ssl', + + + /** + * This is the hostname string of LDAP server(s) to try + * and connect to. It should be the same format as the + * LDAP authsource hostname as it is passed to that class. + * + * Note: Multiple servers are separated by a space. + * + * Default: NULL + * Required: Yes, unless authsource is used + * AuthSource: hostname + */ + 'connection_string' => 'ldap.example.org', + 'connection_string' => 'ad1.example.org ad2.example.org', + + + /** + * This is the password used to bind to LDAP. + * + * Default: NULL + * Required: No, only if required for binding. + * AuthSource: search.password OR priv.password + */ + 'search.password' => 'Abc123', + + + /** + * By specifying the directory service product name, the number + * of LDAP queries can be drastically reduced. The reason is + * that most products have a special query to recursively search + * group membership. + * + * Note: Only ActiveDirectory is currently supported + * (OpenLDAP is implemented but not supported, see example below). + * + * Default: '' + * Required: No + */ + 'ldap.product' => '', + 'ldap.product' => 'ActiveDirectory', + 'ldap.product' => 'OpenLDAP', + + + /** + * The LDAP timeout value passed to the LDAP connection class. + * + * Default: 0 + * Required: No + * AuthSource: timeout + */ + 'timeout' => 0, + 'timeout' => 30, + + + /** + * This is the username used to bind to LDAP with. + * More than likely will need to be in the DN of + * user binding to LDAP. + * + * Default: NULL + * Required: No, only if required for binding. + * AuthSource: search.username OR priv.username + */ + 'search.username' => 'CN=LDAP User,CN=Users,DC=example,DC=org', + + + /** + * The following attribute.* and type.* configuration options + * define the LDAP schema and should only be defined/modified + * if the schema has been modified or the LDAP product used + * uses other attribute names. By default, the schema is setup + * for ActiveDirectory. + * + * Defaults: Listed Below + * Required: No + */ + 'attribute.dn' => 'distinguishedName', + 'attribute.groups' => 'groups', // Also noted above + 'attribute.member' => 'member', + 'attribute.memberOf' => 'memberOf', + 'attribute.groupname' => 'name', + 'attribute.return' => 'distinguishedName', + 'attribute.type' => 'objectClass', + 'attribute.username' => 'sAMAccountName', + + + /** + * As mentioned above, these can be changed if the LDAP schema + * has been modified. These list the Object/Entry Type for a given + * DN, in relation to the 'attribute.type' config option above. + * These are used to determine the type of entry. + * + * Defaults: Listed Below + * Required: No + */ + 'type.group' => 'group', + 'type.user' => 'user', + + + /** + * LDAP search filters to be added to the base filters for this + * authproc-filter. It's an array of key => value pairs that will + * be translated to (key=value) in the ldap query. + */ + 'additional_filters' => [], + ] +``` + +### Example + +This is the most basic configuration possible. It will look at the +authsource for all LDAP connection information and manually search +the hierarchy for the users group memberships. + +```php + 50 => [ + 'class' => 'ldap:AttributeAddUsersGroups', + 'authsource' => 'example-ldap' + ] +``` + +By making one small change we can optimize the filter to use better +group search methods and eliminate un-needed LDAP queries. + +```php + 50 => [ + 'class' => 'ldap:AttributeAddUsersGroups', + 'authsource' => 'example-ldap', + 'ldap.product' => 'ActiveDirectory' + ] +``` + +If no authsource is available then you can specify the connection info +using the filter configuration. Note: Not all of the options below are +required, see the config info above for details. + +```php + 50 => [ + 'class' => 'ldap:AttributeAddUsersGroups', + 'connection_string' => 'ldaps://ldap.example.org', + 'search.username' => 'CN=LDAP User,CN=Users,DC=example,DC=org', + 'search.password' => 'Abc123', + 'search.base' => ['DC=example,DC=org'], + ] +``` + +Example for unsupported OpenLDAP usage. +Intention is to filter in `ou=groups,dc=example,dc=com` for +`(memberUid = )` and take only the attribute `cn` (=name of the group). + +```php + 50 => [ + 'class' => 'ldap:AttributeAddUsersGroups', + 'ldap.product' => 'OpenLDAP', + 'search.base' => ['ou=groups,dc=example,dc=org'], + 'attribute.username' => 'uid', + 'attribute.member' => 'cn', + 'attribute.memberOf' => 'memberUid', + ], +``` diff --git a/.extlib/simplesamlphp/modules/ldap/src/Auth/InvalidCredentialResult.php b/.extlib/simplesamlphp/modules/ldap/src/Auth/InvalidCredentialResult.php new file mode 100644 index 000000000..9f05f486b --- /dev/null +++ b/.extlib/simplesamlphp/modules/ldap/src/Auth/InvalidCredentialResult.php @@ -0,0 +1,213 @@ + [ + self::ERROR_LOGON_FAILURE, + self::LDAP_NO_SUCH_OBJECT, + self::NT_STATUS_LOGON_FAILURE, + ], + self::KEY_PASSWORD_ERROR => [ + self::ERROR_PASSWORD_EXPIRED, + self::ERROR_PASSWORD_MUST_CHANGE, + self::NT_STATUS_PASSWORD_EXPIRED, + self::NT_STATUS_PASSWORD_MUST_CHANGE, + ], + self::KEY_ACCOUNT_ERROR => [ + self::ERROR_ACCOUNT_DISABLED, + self::ERROR_ACCOUNT_EXPIRED, + self::ERROR_ACCOUNT_LOCKED_OUT, + ], + self::KEY_RESTRICTION => [ + self::ERROR_ACCOUNT_RESTRICTION, + self::ERROR_INVALID_LOGON_HOURS, + self::ERROR_INVALID_WORKSTATION, + self::ERROR_TOO_MANY_CONTEXT_IDS, + ], + ]; + + /** + * For Simple Binds this is the part after NT_STATUS_ + * Otherwise it is the HEX code from `data ([0-9a-f]+)` + * + * @var string|null The error code. + */ + protected ?string $code; + + /** + * @var string the message as it came from LDAP + */ + protected string $rawMessage; + + + /** + * Parses the message when possible to determine what the actual error is + * + * @param string $message + * + * @return \SimpleSAML\Module\ldap\Auth\InvalidCredentialResult + */ + public static function fromDiagnosticMessage(string $message): self + { + if (strpos($message, 'Simple Bind Failed:') === 0) { + list(, $tmp) = explode(':', $message, 2); + $code = str_replace('NT_STATUS_', '', $tmp); + } elseif (preg_match('/data\s(.*)?,/', $message, $match)) { + $code = $match[1]; + } else { + $code = null; + } + + return new self($code, $message); + } + + + /** + * @param string|null $code + * @param string $rawMessage + */ + protected function __construct(?string $code, string $rawMessage) + { + $this->code = $code; + $this->rawMessage = $rawMessage; + } + + + /** + * Returns the code that was pulled from the raw message + * + * @return string|null + */ + public function getCode(): ?string + { + return $this->code; + } + + + /** + * Returns the raw message + * + * @return string + */ + public function getRawMessage(): string + { + return $this->rawMessage; + } + + + /** + * Allows the default code mappings to be updated + * @param array $codes + * @return void + */ + public function updateCodeMap(array $codes): void + { + $this->codeMap = array_merge_recursive($this->codeMap, $codes); + } + + + /** + * Allows the default code mappings to be replaced + * + * @param array $codes + * @return void + */ + public function replaceCodeMap(array $codes): void + { + $this->codeMap = $codes; + } + + + /** + * @return bool Whether or not the password had an error + */ + public function isPasswordError(): bool + { + return in_array($this->code, $this->codeMap[self::KEY_PASSWORD_ERROR]); + } + + + /** + * @return bool Whether or not the account had an error + */ + public function isAccountError(): bool + { + return in_array($this->code, $this->codeMap[self::KEY_ACCOUNT_ERROR]); + } + + + /** + * @return bool Whether or not there was an auth problem + */ + public function isInvalidCredential(): bool + { + return in_array($this->code, $this->codeMap[self::KEY_INVALID_CREDENTIAL]); + } + + + /** + * @return bool Whether or not there is a restriction in place + */ + public function isRestricted(): bool + { + return in_array($this->code, $this->codeMap[self::KEY_RESTRICTION]); + } +} diff --git a/.extlib/simplesamlphp/modules/ldap/src/Auth/Process/AttributeAddFromLDAP.php b/.extlib/simplesamlphp/modules/ldap/src/Auth/Process/AttributeAddFromLDAP.php new file mode 100644 index 000000000..40923e9e1 --- /dev/null +++ b/.extlib/simplesamlphp/modules/ldap/src/Auth/Process/AttributeAddFromLDAP.php @@ -0,0 +1,189 @@ +binaryAttributes = $this->config->getOptionalArray('attributes.binary', []); + $this->searchAttributes = $this->config->getOptionalArrayize('attributes', []); + if (empty($this->searchAttributes)) { + $new_attribute = $this->config->getString('attribute.new'); + $this->searchAttributes[$new_attribute] = $this->config->getString('search.attribute'); + } + $this->searchFilter = $this->config->getString('search.filter'); + + // get the attribute policy + $this->attrPolicy = $this->config->getOptionalString('attribute.policy', 'merge'); + Assert::oneOf($this->attrPolicy, ['merge', 'replace', 'add']); + + $this->searchUsername = $this->config->getOptionalString('search.username', null); + $this->searchPassword = $this->config->getOptionalString('search.password', null); + } + + + /** + * Add attributes from an LDAP server. + * + * @param array &$state The current request + */ + public function process(array &$state): void + { + Assert::keyExists($state, 'Attributes'); + $attributes = &$state['Attributes']; + + // perform a merge on the ldap_search_filter + // loop over the attributes and build the search and replace arrays + $arrSearch = $arrReplace = []; + foreach ($attributes as $attr => $val) { + $arrSearch[] = '%' . $attr . '%'; + + if (is_array($val) && count($val) > 0 && strlen($val[0]) > 0) { + $arrReplace[] = $this->connector->escapeFilterValue($val[0], true); + } else { + $arrReplace[] = ''; + } + } + + // merge the attributes into the ldap_search_filter + /** @psalm-var string[] $arrReplace */ + $filter = str_replace($arrSearch, $arrReplace, $this->searchFilter); + if (strpos($filter, '%') !== false) { + Logger::info(sprintf( + '%s: There are non-existing attributes in the search filter. (%s)', + $this->title, + $filter + )); + return; + } + + $this->connector->bind($this->searchUsername, $this->searchPassword); + + $wantedAttrs = $this->config->getOptionalValue( + 'attributes', + // If specifically set to NULL return all attributes, if not set at all return nothing (safe default) + in_array('attributes', $this->config->getOptions(), true) ? ['*'] : [], + ); + + $options = [ + 'scope' => $this->config->getOptionalString('search.scope', Query::SCOPE_SUB), + 'timeout' => $this->config->getOptionalInteger('timeout', 3), + 'filter' => array_values($wantedAttrs), + ]; + + $entries = $this->connector->searchForMultiple( + $this->searchBase, + $filter, + $options, + true + ); + + $results = []; + foreach ($entries as $entry) { + $tmp = array_intersect_key( + $entry->getAttributes(), + array_fill_keys(array_values($this->searchAttributes), null) + ); + + $binaries = array_intersect( + array_keys($tmp), + $this->binaryAttributes, + ); + foreach ($binaries as $binary) { + /** @psalm-var array $attr */ + $attr = $entry->getAttribute($binary); + $tmp[$binary] = array_map('base64_encode', $attr); + } + + $results[] = $tmp; + } + + // handle [multiple] values + foreach ($results as $result) { + foreach ($this->searchAttributes as $target => $name) { + // If there is no mapping defined, just use the name of the LDAP-attribute as a target + if (is_int($target)) { + $target = $name; + } + + if (isset($attributes[$target]) && $this->attrPolicy === 'replace') { + unset($attributes[$target]); + } + + if (isset($result[$name])) { + if (isset($attributes[$target])) { + foreach (array_values($result[$name]) as $value) { + if ($this->attrPolicy === 'merge') { + if (!in_array($value, $attributes[$target], true)) { + $attributes[$target][] = $value; + } + } else { + $attributes[$target][] = $value; + } + } + } else { + $attributes[$target] = array_values($result[$name]); + } + } + } + } + } +} diff --git a/.extlib/simplesamlphp/modules/ldap/src/Auth/Process/AttributeAddUsersGroups.php b/.extlib/simplesamlphp/modules/ldap/src/Auth/Process/AttributeAddUsersGroups.php new file mode 100644 index 000000000..f82150a6a --- /dev/null +++ b/.extlib/simplesamlphp/modules/ldap/src/Auth/Process/AttributeAddUsersGroups.php @@ -0,0 +1,387 @@ +searchUsername = $this->config->getOptionalString('search.username', null); + $this->searchPassword = $this->config->getOptionalString('search.password', null); + $this->product = $this->config->getOptionalString('ldap.product', null); + } + + + /** + * LDAP search filters to be added to the base filters for this authproc-filter. + * It's an array of key => value pairs that will be translated to (key=value) in the ldap query. + * + * @var array + */ + protected array $additional_filters; + + + /** + * This is run when the filter is processed by SimpleSAML. + * It will attempt to find the current users groups using + * the best method possible for the LDAP product. The groups + * are then added to the request attributes. + * + * @throws \SimpleSAML\Error\Exception + * @param array &$state + */ + public function process(array &$state): void + { + Assert::keyExists($state, 'Attributes'); + + // Log the process + Logger::debug(sprintf( + '%s : Attempting to get the users groups...', + $this->title + )); + + $this->additional_filters = $this->config->getOptionalArray('additional_filters', []); + + // Reference the attributes, just to make the names shorter + $attributes = &$state['Attributes']; + $map = &$this->attribute_map; + + // Get the users groups from LDAP + $groups = $this->getGroups($attributes); + + // If there are none, do not proceed + if (empty($groups)) { + return; + } + + // Make the array if it is not set already + if (!isset($attributes[$map['groups']])) { + $attributes[$map['groups']] = []; + } + + // Must be an array, else cannot merge groups + if (!is_array($attributes[$map['groups']])) { + throw new Error\Exception(sprintf( + '%s : The group attribute [%s] is not an array of group DNs. %s', + $this->title, + $map['groups'], + $this->varExport($attributes[$map['groups']]) + )); + } + + // Add the users group(s) + $group_attribute = &$attributes[$map['groups']]; + $group_attribute = array_merge($group_attribute, $groups); + $group_attribute = array_unique($group_attribute); + + // All done + Logger::debug(sprintf( + '%s : Added users groups to the group attribute[%s]: %s', + $this->title, + $map['groups'], + implode('; ', $groups) + )); + } + + + /** + * Will perform a search using the required attribute values from the user to + * get their group membership, recursively. + * + * @throws \SimpleSAML\Error\Exception + * @param array $attributes + * @return array + */ + protected function getGroups(array $attributes): array + { + // Log the request + Logger::debug(sprintf( + '%s : Checking for groups based on the best method for the LDAP product.', + $this->title + )); + + $this->connector->bind($this->searchUsername, $this->searchPassword); + + $options = [ + 'scope' => $this->config->getOptionalString('search.scope', Query::SCOPE_SUB), + 'timeout' => $this->config->getOptionalInteger('timeout', 3), + ]; + + // Reference the map, just to make the name shorter + $map = &$this->attribute_map; + + + // All map-properties are guaranteed to exist and have a default value + $dn_attribute = $map['dn']; + $return_attribute = $map['return']; + + // Based on the directory service, search LDAP for groups + // If any attributes are needed, prepare them before calling search method + switch ($this->product) { + case 'ActiveDirectory': + // Log the AD specific search + Logger::debug(sprintf( + '%s : Searching LDAP using ActiveDirectory specific method.', + $this->title + )); + + // Make sure the defined DN attribute exists + if (!isset($attributes[$dn_attribute])) { + Logger::warning(sprintf( + "%s : The DN attribute [%s] is not defined in the user's Attributes: %s", + $this->title, + $dn_attribute, + implode(', ', array_keys($attributes)), + )); + + return []; + } + + // Make sure the defined DN attribute has a value + if (!isset($attributes[$dn_attribute][0]) || !$attributes[$dn_attribute][0]) { + Logger::warning(sprintf( + '%s : The DN attribute [%s] does not have a [0] value defined. %s', + $this->title, + $dn_attribute, + $this->varExport($attributes[$dn_attribute]) + )); + + return []; + } + + // Log the search + $arrayUtils = new Utils\Arrays(); + Logger::debug(sprintf( + '%s : Searching ActiveDirectory group membership.' + . ' DN: %s DN Attribute: %s Member Attribute: %s Type Attribute: %s Type Value: %s Base: %s', + $this->title, + $attributes[$dn_attribute][0], + $dn_attribute, + $map['member'], + $map['type'], + $this->type_map['group'], + implode('; ', $arrayUtils->arrayize($this->searchBase)) + )); + + $filter = sprintf( + "(&(%s=%s)(%s=%s))", + $map['type'], + $this->type_map['group'], + $map['member'] . ':1.2.840.113556.1.4.1941:', + $this->connector->escapeFilterValue($attributes[$dn_attribute][0], true), + ); + + $entries = $this->connector->searchForMultiple( + $this->searchBase, + $filter, + $options, + true + ); + + break; + case 'OpenLDAP': + // Log the OpenLDAP specific search + Logger::debug(sprintf( + '%s : Searching LDAP using OpenLDAP specific method.', + $this->title + )); + + Logger::debug(sprintf( + '%s : Searching for groups in base [%s] with filter (%s=%s) and attributes %s', + $this->title, + implode(', ', $this->searchBase), + $map['memberOf'], + $attributes[$map['username']][0], + $map['member'] + )); + + $filter = sprintf( + '(&(%s=%s))', + $map['memberOf'], + $attributes[$map['username']][0] + ); + + $entries = $this->connector->searchForMultiple( + $this->searchBase, + $filter, + $options, + true + ); + + break; + default: + // Log the generic search + Logger::debug( + sprintf('%s : Searching LDAP using the generic search method.', $this->title) + ); + + // Make sure the defined memberOf attribute exists + Assert::keyExists( + $attributes, + $map['memberOf'], + sprintf( + "%s : The memberOf attribute [%s] is not defined in the user's attributes: [%s]", + $this->title, + $map['memberOf'], + implode(', ', array_keys($attributes)) + ), + Error\Exception::class, + ); + + // MemberOf must be an array of group DN's + Assert::isArray( + $attributes[$map['memberOf']], + sprintf( + '%s : The memberOf attribute [%s] is not an array of group DNs; %s', + $this->title, + $map['memberOf'], + $this->varExport($attributes[$map['memberOf']]), + ), + Error\Exception::class, + ); + + Logger::debug(sprintf( + '%s : Checking DNs for groups. DNs: %s Attributes: %s, %s Group Type: %s', + $this->title, + implode('; ', $attributes[$map['memberOf']]), + $map['memberOf'], + $map['type'], + $this->type_map['group'] + )); + + // Search for the users group membership, recursively + $entries = $this->search($attributes[$map['memberOf']], $options); + } + + $groups = []; + foreach ($entries as $entry) { + if ($entry->hasAttribute($return_attribute)) { + /** @psalm-var array $values */ + $values = $entry->getAttribute($return_attribute); + $groups[] = array_pop($values); + continue; + } elseif ($entry->hasAttribute(strtolower($return_attribute))) { + // Some backends return lowercase attributes + /** @psalm-var array $values */ + $values = $entry->getAttribute(strtolower($return_attribute)); + $groups[] = array_pop($values); + continue; + } + + // Could not find return attribute, log and continue + Logger::notice(sprintf( + '%s : The return attribute [%s] could not be found in entry `%s`.', + $this->title, + implode(', ', array_unique([$map['return'], strtolower($map['return'])])), + $entry->getDn(), + )); + Logger::debug(sprintf('%s : Entry was: %s', $this->title, $this->varExport($entry))); + } + + // All done + Logger::debug(sprintf( + '%s : User found to be a member of the following groups: %s', + $this->title, + empty($groups) ? 'none' : implode('; ', $groups), + )); + + return $groups; + } + + + /** + * Looks for groups from the list of DN's passed. Also + * recursively searches groups for further membership. + * Avoids loops by only searching a DN once. Returns + * the list of groups found. + * + * @param array $memberOf + * @param array $options + * @return array + */ + protected function search(array $memberOf, array $options): array + { + // Shorten the variable name + $map = &$this->attribute_map; + + // Used to determine what DN's have already been searched + static $searched = []; + + // Init the groups variable + $entries = []; + + // Set scope to 'base' + $options['scope'] = Query::SCOPE_BASE; + + // Check each DN of the passed memberOf + foreach ($memberOf as $dn) { + // Avoid infinite loops, only need to check a DN once + if (isset($searched[$dn])) { + continue; + } + + // Track all DN's that are searched + // Use DN for key as well, isset() is faster than in_array() + $searched[$dn] = $dn; + + // Query LDAP for the attribute values for the DN + $entry = $this->connector->search( + [$dn], + sprintf("(%s=%s)", $map['type'], $this->type_map['group']), + $options, + true, + ); + + if ($entry === null) { + // Probably the DN does not exist within the given search base + continue; + } + + // Add to found groups array + $entries[] = $entry; + + // Recursively search "sub" groups + $subGroups = $entry->getAttribute($map['memberOf']); + if (!empty($subGroups)) { + $entries = array_merge($entries, $this->search($subGroups, $options)); + } + } + + return $entries; + } +} diff --git a/.extlib/simplesamlphp/modules/ldap/src/Auth/Process/BaseFilter.php b/.extlib/simplesamlphp/modules/ldap/src/Auth/Process/BaseFilter.php new file mode 100644 index 000000000..33e453052 --- /dev/null +++ b/.extlib/simplesamlphp/modules/ldap/src/Auth/Process/BaseFilter.php @@ -0,0 +1,290 @@ +title = 'ldap:' . $classname; + + // Log the construction + Logger::debug(sprintf('%s : Creating and configuring the filter.', $this->title)); + + // If an authsource was defined (an not empty string)... + if (isset($config['authsource']) && $config['authsource'] !== '') { + $authconfig = $this->parseAuthSourceConfig($config['authsource']); + + // Merge the authsource config with the filter config, + // but have the filter config override the authsource config + $config = array_merge($authconfig, $config); + + // Authsource complete + Logger::debug(sprintf( + '%s : Retrieved authsource [%s] configuration values: %s', + $this->title, + $config['authsource'], + $this->varExport($authconfig) + )); + } + + // Convert the config array to a config class, + // that way we can verify type and define defaults. + // Store in the instance in-case needed later, by a child class. + $this->config = Configuration::loadFromArray($config, 'ldap:AuthProcess'); + + // Initialize the Ldap-object + $this->connector = ConnectorFactory::fromAuthSource($config['authsource']); + + // Set all the filter values, setting defaults if needed + $this->searchBase = $this->config->getOptionalArray('search.base', []); + + // Log the member values retrieved above + Logger::debug(sprintf( + '%s : Configuration values retrieved; BaseDN: %s', + $this->title, + $this->varExport($this->searchBase) + )); + + // Setup the attribute map which will be used to search LDAP + $this->attribute_map = [ + 'dn' => $this->config->getOptionalString('attribute.dn', 'distinguishedName'), + 'groups' => $this->config->getOptionalString('attribute.groups', 'groups'), + 'member' => $this->config->getOptionalString('attribute.member', 'member'), + 'memberOf' => $this->config->getOptionalString('attribute.memberOf', 'memberOf'), + 'name' => $this->config->getOptionalString('attribute.groupname', 'name'), + 'return' => $this->config->getOptionalString('attribute.return', 'distinguishedName'), + 'type' => $this->config->getOptionalString('attribute.type', 'objectClass'), + 'username' => $this->config->getOptionalString('attribute.username', 'sAMAccountName'), + ]; + + // Log the attribute map + Logger::debug(sprintf( + '%s : Attribute map created: %s', + $this->title, + $this->varExport($this->attribute_map) + )); + + // Setup the object type map which is used to determine a DNs' type + $this->type_map = [ + 'group' => $this->config->getOptionalString('type.group', 'group'), + 'user' => $this->config->getOptionalString('type.user', 'user'), + ]; + + // Log the type map + Logger::debug(sprintf( + '%s : Type map created: %s', + $this->title, + $this->varExport($this->type_map) + )); + } + + + /** + * Parse authsource config + * + * @param string $as The name of the authsource + */ + private function parseAuthSourceConfig(string $as): array + { + // Log the authsource request + Logger::debug(sprintf( + '%s : Attempting to get configuration values from authsource [%s]', + $this->title, + $as + )); + + // Get the authsources file, which should contain the config + $authsources = Configuration::getConfig('authsources.php'); + + // Verify that the authsource config exists + if (!$authsources->hasValue($as)) { + throw new Error\Exception(sprintf( + '%s : Authsource [%s] defined in filter parameters not found in authsources.php', + $this->title, + $as + )); + } + + // Get just the specified authsource config values + $authsource = $authsources->getArray($as); + + // Make sure it is an ldap source + if (isset($authsource[0]) && !in_array($authsource[0], self::$ldapsources)) { + throw new Error\Exception(sprintf( + '%s : Authsource [%s] specified in filter parameters is not an ldap:LDAP type', + $this->title, + $as + )); + } + + // Build the authsource config + $authconfig = []; + if (isset($authsource['connection_string'])) { + $authconfig['connection_string'] = $authsource['connection_string']; + } + if (isset($authsource['encryption'])) { + $authconfig['encryption'] = $authsource['encryption']; + } + if (isset($authsource['version'])) { + $authconfig['version'] = $authsource['version']; + } + if (isset($authsource['timeout'])) { + $authconfig['timeout'] = $authsource['timeout']; + } + if (isset($authsource['debug'])) { + $authconfig['debug'] = $authsource['debug']; + } + if (isset($authsource['referrals'])) { + $authconfig['referrals'] = $authsource['referrals']; + } + + // only set when search.enabled = true + if (isset($authsource['search.enable']) && ($authsource['search.enable'] === true)) { + if (isset($authsource['search.base'])) { + $authconfig['search.base'] = $authsource['search.base']; + } + if (isset($authsource['search.scope'])) { + $authconfig['search.scope'] = $authsource['search.scope']; + } + + if (isset($authsource['search.username'])) { + $authconfig['search.username'] = $authsource['search.username']; + } + if (isset($authsource['search.password'])) { + $authconfig['search.password'] = $authsource['search.password']; + } + + // Only set the username attribute if the authsource specifies one attribute + if ( + isset($authsource['search.attributes']) + && is_array($authsource['search.attributes']) + && count($authsource['search.attributes']) == 1 + ) { + $authconfig['attribute.username'] = reset($authsource['search.attributes']); + } + } + + // only set when priv.read = true + if (isset($authsource['priv.read']) && $authsource['priv.read']) { + if (isset($authsource['priv.username'])) { + $authconfig['priv.username'] = $authsource['priv.username']; + } + if (isset($authsource['priv.password'])) { + $authconfig['priv.password'] = $authsource['priv.password']; + } + } + + return $authconfig; + } + + + /** + * Local utility function to get details about a variable, + * basically converting it to a string to be used in a log + * message. The var_export() function returns several lines + * so this will remove the new lines and trim each line. + * + * @param mixed $value + * @return string + */ + protected function varExport($value): string + { + if (is_array($value)) { + // remove sensitive data + foreach ($value as $key => &$val) { + if ($key === 'search.password' || $key === 'priv.password') { + $val = empty($val) ? '' : '********'; + } + } + unset($val); + } + + $export = var_export($value, true); + $lines = explode("\n", $export); + foreach ($lines as &$line) { + $line = trim($line); + } + return implode(' ', $lines); + } +} diff --git a/.extlib/simplesamlphp/modules/ldap/src/Auth/Source/Ldap.php b/.extlib/simplesamlphp/modules/ldap/src/Auth/Source/Ldap.php new file mode 100644 index 000000000..579b30c82 --- /dev/null +++ b/.extlib/simplesamlphp/modules/ldap/src/Auth/Source/Ldap.php @@ -0,0 +1,260 @@ +ldapConfig = Configuration::loadFromArray( + $config, + 'authsources[' . var_export($this->authId, true) . ']' + ); + + $this->connector = ConnectorFactory::fromAuthSource($this->authId); + } + + + /** + * Attempt to log in using the given username and password. + * + * @param string $username The username the user wrote. + * @param string $password The password the user wrote. + * @return array Associative array with the users attributes. + */ + protected function login(string $username, #[\SensitiveParameter]string $password): array + { + if (preg_match('/^\s*$/', $password)) { + // The empty string is considered an anonymous bind to Symfony + throw new Error\Error('WRONGUSERPASS'); + } + + $searchScope = $this->ldapConfig->getOptionalString('search.scope', Query::SCOPE_SUB); + Assert::oneOf($searchScope, [Query::SCOPE_BASE, Query::SCOPE_ONE, Query::SCOPE_SUB]); + + $timeout = $this->ldapConfig->getOptionalInteger('timeout', 3); + Assert::natural($timeout); + + $attributes = $this->ldapConfig->getOptionalValue( + 'attributes', + // If specifically set to NULL return all attributes, if not set at all return nothing (safe default) + in_array('attributes', $this->ldapConfig->getOptions(), true) ? ['*'] : [], + ); + + $searchBase = $this->ldapConfig->getArray('search.base'); + + $options = [ + 'scope' => $searchScope, + 'timeout' => $timeout, + 'filter' => $attributes, + ]; + + $searchEnable = $this->ldapConfig->getOptionalBoolean('search.enable', false); + if ($searchEnable === false) { + $dnPattern = $this->ldapConfig->getString('dnpattern'); + $dn = str_replace('%username%', $username, $dnPattern); + } else { + $searchUsername = $this->ldapConfig->getOptionalString('search.username', null); + Assert::nullOrNotWhitespaceOnly($searchUsername); + + $searchPassword = $this->ldapConfig->getOptionalString('search.password', null); + Assert::nullOrnotWhitespaceOnly($searchPassword); + + try { + $this->connector->bind($searchUsername, $searchPassword); + } catch (Error\Error $e) { + throw new Error\Exception("Unable to bind using the configured search.username and search.password."); + } + + $filter = $this->buildSearchFilter($username); + + try { + $entry = /** @scrutinizer-ignore-type */$this->connector->search($searchBase, $filter, $options, false); + $dn = $entry->getDn(); + } catch (Error\Exception $e) { + throw new Error\Error('WRONGUSERPASS'); + } + } + + /* Verify the credentials */ + $this->connector->bind($dn, $password); + + /* If the credentials were correct, rebind using a privileged account to read attributes */ + $readUsername = $this->ldapConfig->getOptionalString('priv.username', null); + $readPassword = $this->ldapConfig->getOptionalString('priv.password', null); + if ($readUsername !== null) { + $this->connector->bind($readUsername, $readPassword); + } + + $options['scope'] = Query::SCOPE_BASE; + $filter = '(objectClass=*)'; + + $entry = $this->connector->search([$dn], $filter, $options, false); + + return $this->processAttributes(/** @scrutinizer-ignore-type */$entry); + } + + + /** + * Attempt to find a user's attributes given its username. + * + * @param string $username The username who's attributes we want. + * @return array Associative array with the users attributes. + */ + public function getAttributes(string $username): array + { + $searchUsername = $this->ldapConfig->getOptionalString('search.username', null); + Assert::nullOrNotWhitespaceOnly($searchUsername); + + $searchPassword = $this->ldapConfig->getOptionalString('search.password', null); + Assert::nullOrnotWhitespaceOnly($searchPassword); + + try { + $this->connector->bind($searchUsername, $searchPassword); + } catch (Error\Error $e) { + throw new Error\Exception("Unable to bind using the configured search.username and search.password."); + } + + $searchEnable = $this->ldapConfig->getOptionalBoolean('search.enable', false); + if ($searchEnable === false) { + $dnPattern = $this->ldapConfig->getString('dnpattern'); + $filter = '(' . str_replace('%username%', $this->escapeFilterValue($username), $dnPattern) . ')'; + } else { + $filter = $this->buildSearchFilter($username); + } + + $searchScope = $this->ldapConfig->getOptionalString('search.scope', Query::SCOPE_SUB); + Assert::oneOf($searchScope, [Query::SCOPE_BASE, Query::SCOPE_ONE, Query::SCOPE_SUB]); + + $timeout = $this->ldapConfig->getOptionalInteger('timeout', 3); + Assert::natural($timeout); + + $attributes = $this->ldapConfig->getOptionalValue( + 'attributes', + // If specifically set to NULL return all attributes, if not set at all return nothing (safe default) + in_array('attributes', $this->ldapConfig->getOptions(), true) ? ['*'] : [], + ); + + $searchBase = $this->ldapConfig->getArray('search.base'); + $options = [ + 'scope' => $searchScope, + 'timeout' => $timeout, + 'filter' => $attributes, + ]; + + try { + /** @var \Symfony\Component\Ldap\Entry $entry */ + $entry = $this->connector->search($searchBase, $filter, $options, false); + } catch (Error\Exception $e) { + throw new Error\Error('WRONGUSERPASS'); + } + + return $this->processAttributes($entry); + } + + + /** + * @param \Symfony\Component\Ldap\Entry $entry + * @return array + */ + private function processAttributes(Entry $entry): array + { + $result = $entry->getAttributes(); + + $binaries = array_intersect( + array_keys($result), + $this->ldapConfig->getOptionalArray('attributes.binary', []), + ); + + foreach ($binaries as $binary) { + $result[$binary] = array_map('base64_encode', $result[$binary]); + } + + return $result; + } + + + /** + * @param string $username + * @return string + */ + private function buildSearchFilter(string $username): string + { + $searchAttributes = $this->ldapConfig->getArray('search.attributes'); + /** @psalm-var string|null $searchFilter */ + $searchFilter = $this->ldapConfig->getOptionalString('search.filter', null); + + $filter = ''; + foreach ($searchAttributes as $attr) { + $filter .= '(' . $attr . '=' . $this->escapeFilterValue($username) . ')'; + } + $filter = '(|' . $filter . ')'; + + // Append LDAP filters if defined + if ($searchFilter !== null) { + $filter = "(&" . $filter . $searchFilter . ")"; + } + + return $filter; + } + + + /** + * @return \SimpleSAML\Module\ldap\ConnectorInterface + */ + public function getConnector(): ConnectorInterface + { + return $this->connector; + } +} diff --git a/.extlib/simplesamlphp/modules/ldap/src/Auth/Source/LdapMulti.php b/.extlib/simplesamlphp/modules/ldap/src/Auth/Source/LdapMulti.php new file mode 100644 index 000000000..a4f2472dc --- /dev/null +++ b/.extlib/simplesamlphp/modules/ldap/src/Auth/Source/LdapMulti.php @@ -0,0 +1,150 @@ + authsource. + */ + private array $mapping; + + /** + * An array with descriptions for organizations. + */ + private array $orgs; + + /** + * An array of organization IDs to LDAP configuration objects. + */ + private array $ldapOrgs; + + /** + * Whether we should include the organization as part of the username. + */ + private bool $includeOrgInUsername; + + + /** + * Constructor for this authentication source. + * + * @param array $info Information about this authentication source. + * @param array $config Configuration. + */ + public function __construct(array $info, array $config) + { + // Call the parent constructor first, as required by the interface + parent::__construct($info, $config); + + $this->ldapConfig = Configuration::loadFromArray( + $config, + 'authsources[' . var_export($this->authId, true) . ']' + ); + + $usernameOrgMethod = $this->ldapConfig->getValueValidate( + 'username_organization_method', + ['none', 'allow', 'force'] + ); + $this->setUsernameOrgMethod($usernameOrgMethod); + + $this->includeOrgInUsername = $this->ldapConfig->getOptionalBoolean( + 'include_organization_in_username', + false + ); + + $this->mapping = $this->ldapConfig->getArray('mapping'); + Assert::notEmpty($this->mapping); + + $organizations = array_keys($this->mapping); + $authsources = Configuration::getConfig('authsources.php'); + + foreach ($organizations as $organization) { + Assert::keyExists($this->mapping[$organization], 'authsource'); + $authsource = $this->mapping[$organization]['authsource']; + Assert::notNull(Auth\Source::getById($authsource, Ldap::class)); + + if (array_key_exists('description', $this->mapping[$organization])) { + $this->orgs[$organization] = $this->mapping[$organization]['description']; + } else { + $this->orgs[$organization] = $organization; + } + + $this->ldapOrgs[$organization] = Configuration::loadFromArray( + $authsources->getValue($authsource), + 'authsources[' . var_export($this->authId, true) . '][' . var_export($organization, true) . ']' + ); + } + } + + + /** + * Attempt to log in using the given username and password. + * + * @param string $username The username the user wrote. + * @param string $password The password the user wrote. + * @return array Associative array with the users attributes. + */ + protected function login(string $username, #[\SensitiveParameter]string $password, string $organization): array + { + if ($this->includeOrgInUsername) { + $username = $username . '@' . $organization; + } + + $authsource = $this->mapping[$organization]['authsource']; + + if (!array_key_exists($organization, $this->ldapOrgs)) { + // The organization is unknown to us. + throw new Error\Error('WRONGUSERPASS'); + } + + $sourceConfig = $this->ldapOrgs[$organization]; + + $ldap = new class (['AuthId' => $authsource], $sourceConfig->toArray()) extends Ldap + { + public function loginOverload(string $username, #[\SensitiveParameter]string $password): array + { + return $this->login($username, $password); + } + }; + + return $ldap->loginOverload($username, $password); + } + + + /** + * Retrieve list of organizations. + * + * @return array Associative array with the organizations. + */ + protected function getOrganizations(): array + { + return $this->orgs; + } +} diff --git a/.extlib/simplesamlphp/modules/ldap/src/Connector/ActiveDirectory.php b/.extlib/simplesamlphp/modules/ldap/src/Connector/ActiveDirectory.php new file mode 100644 index 000000000..e74e79792 --- /dev/null +++ b/.extlib/simplesamlphp/modules/ldap/src/Connector/ActiveDirectory.php @@ -0,0 +1,48 @@ +adapter->getConnection()->getResource(), + LDAP_OPT_DIAGNOSTIC_MESSAGE, + $message + ); + + $result = InvalidCredentialResult::fromDiagnosticMessage($message); + if ($result->isInvalidCredential()) { + return self::ERR_WRONG_PASS; + } elseif ($result->isPasswordError()) { + return self::ERR_PASSWORD_RESET; + } elseif ($result->isAccountError()) { + return self::ERR_ACCOUNT_RESET; + } elseif ($result->isRestricted()) { + return self::ERR_LOGON_RESTRICTION; + } + + // default to the wrong user pass + return self::ERR_WRONG_PASS; + } +} diff --git a/.extlib/simplesamlphp/modules/ldap/src/Connector/Ldap.php b/.extlib/simplesamlphp/modules/ldap/src/Connector/Ldap.php new file mode 100644 index 000000000..2293c4438 --- /dev/null +++ b/.extlib/simplesamlphp/modules/ldap/src/Connector/Ldap.php @@ -0,0 +1,229 @@ + false, 'network_timeout' => 3] + ) { + foreach (explode(' ', $connection_strings) as $connection_string) { + Assert::regex($connection_string, '#^ldap[s]?:\/\/#'); + } + + Logger::debug(sprintf( + "Setting up LDAP connection: host='%s', encryption=%s, version=%d, debug=%s, timeout=%d, referrals=%s.", + $connection_strings, + $encryption, + $version, + var_export($debug, true), + $options['timeout'] ?? ini_get('default_socket_timeout'), + var_export($options['referrals'] ?? false, true), + )); + + $this->adapter = new Adapter( + [ + 'connection_string' => $connection_strings, + 'encryption' => $encryption, + 'version' => $version, + 'debug' => $debug, + 'options' => $options, + ] + ); + + $this->connection = new LdapObject($this->adapter); + } + + + /** + * @return \Symfony\Component\Ldap\Adapter\AdapterInterface + */ + public function getAdapter(): AdapterInterface + { + return $this->adapter; + } + + + /** + * @inheritDoc + */ + public function bind(?string $username, #[\SensitiveParameter]?string $password): void + { + try { + $this->connection->bind($username, strval($password)); + } catch (InvalidCredentialsException $e) { + throw new Error\Error($this->resolveBindError($e)); + } + + if ($username === null) { + Logger::debug("LDAP bind(): Anonymous bind succesful."); + } else { + Logger::debug(sprintf("LDAP bind(): Bind successful for DN '%s'.", $username)); + } + } + + + /** + * @inheritDoc + */ + public function search( + array $searchBase, + string $filter, + array $options, + bool $allowMissing + ): ?Entry { + $entry = null; + + foreach ($searchBase as $base) { + $query = $this->connection->query($base, $filter, $options); + $result = $query->execute()->toArray(); + + if (count($result) > 1) { + throw new Error\Exception( + sprintf( + "LDAP search(): Found %d entries searching base '%s' for '%s'", + count($result), + $base, + $filter, + ) + ); + } elseif (count($result) === 1) { + $entry = array_pop($result); + break; + } else { + Logger::debug( + sprintf( + "LDAP search(): Found no entries searching base '%s' for '%s'", + $base, + $filter, + ) + ); + } + } + + if ($entry === null && $allowMissing === false) { + throw new Error\Exception( + sprintf( + "Object not found using search base [%s] and filter '%s'", + implode(', ', $searchBase), + $filter + ) + ); + } + + return $entry; + } + + + /** + * @inheritDoc + */ + public function searchForMultiple( + array $searchBase, + string $filter, + array $options, + bool $allowMissing + ): array { + $results = []; + + foreach ($searchBase as $base) { + $query = $this->connection->query($base, $filter, $options); + $result = $query->execute()->toArray(); + $results = array_merge($results, $result); + + Logger::debug(sprintf( + "Library - LDAP search(): Found %d entries searching base '%s' for '%s'", + count($result), + $base, + $filter, + )); + } + + if (empty($results) && ($allowMissing === false)) { + throw new Error\Exception( + sprintf( + "No Objects found using search base [%s] and filter '%s'", + implode(', ', $searchBase), + $filter + ) + ); + } + + return $results; + } + + + /** + * Resolve the message to a UI exception + * + * @param InvalidCredentialsException $e + * @return string + */ + protected function resolveBindError(InvalidCredentialsException $e): string + { + return self::ERR_WRONG_PASS; + } + + + /** + * @param \Symfony\Component\Ldap\Entry $entry + * @return bool + */ + public function updateEntry(Entry $entry): bool + { + try { + $this->adapter->getEntryManager()->update($entry); + return true; + } catch (LdapException $e) { + Logger::warning($e->getMessage()); + return false; + } + } +} diff --git a/.extlib/simplesamlphp/modules/ldap/src/Connector/LdapHelpers.php b/.extlib/simplesamlphp/modules/ldap/src/Connector/LdapHelpers.php new file mode 100644 index 000000000..9d87b62ca --- /dev/null +++ b/.extlib/simplesamlphp/modules/ldap/src/Connector/LdapHelpers.php @@ -0,0 +1,79 @@ +arrayize($values); + + foreach ($values as $key => $val) { + if ($val === null) { + $val = '\0'; // apply escaped "null" if string is empty + } else { + // Escaping of filter meta characters + $val = str_replace('\\', '\5c', $val); + $val = str_replace('*', '\2a', $val); + $val = str_replace('(', '\28', $val); + $val = str_replace(')', '\29', $val); + + // ASCII < 32 escaping + $val = $this->asc2hex32($val); + } + + $values[$key] = $val; + } + + if ($singleValue) { + return $values[0]; + } + + return $values; + } + + + /** + * Converts all ASCII chars < 32 to "\HEX" + * + * @param string $string String to convert + * @return string + */ + public function asc2hex32(string $string): string + { + for ($i = 0; $i < strlen($string); $i++) { + $char = substr($string, $i, 1); + + if (ord($char) < 32) { + $hex = str_pad(dechex(ord($char)), 2, '0', STR_PAD_LEFT); + $string = str_replace($char, '\\' . $hex, $string); + } + } + + return $string; + } +} diff --git a/.extlib/simplesamlphp/modules/ldap/src/ConnectorFactory.php b/.extlib/simplesamlphp/modules/ldap/src/ConnectorFactory.php new file mode 100644 index 000000000..9220e0586 --- /dev/null +++ b/.extlib/simplesamlphp/modules/ldap/src/ConnectorFactory.php @@ -0,0 +1,61 @@ +hasValue($authSource)) { + throw new Error\Exception(sprintf( + 'Authsource [%s] not found in authsources.php', + $authSource + )); + } + + // Get just the specified authsource config values + $ldapConfig = $authSources->getConfigItem($authSource); + $type = $ldapConfig->toArray(); + Assert::oneOf(current($type), ['ldap:Ldap']); + + $encryption = $ldapConfig->getOptionalString('encryption', 'ssl'); + Assert::oneOf($encryption, ['none', 'ssl', 'tls']); + + $version = $ldapConfig->getOptionalInteger('version', 3); + Assert::positiveInteger($version); + + $class = $ldapConfig->getOptionalString('connector', Connector\Ldap::class); + Assert::classExists($class); + Assert::implementsInterface($class, ConnectorInterface::class); + + return /** @psalm-var \SimpleSAML\Module\ldap\ConnectionInterface */ new $class( + $ldapConfig->getString('connection_string'), + $encryption, + $version, + $ldapConfig->getOptionalString('extension', 'ext_ldap'), + $ldapConfig->getOptionalBoolean('debug', false), + $ldapConfig->getOptionalArray('options', [ + 'network_timeout' => 3, + 'referrals' => false, + ]), + ); + } +} diff --git a/.extlib/simplesamlphp/modules/ldap/src/ConnectorInterface.php b/.extlib/simplesamlphp/modules/ldap/src/ConnectorInterface.php new file mode 100644 index 000000000..0dc3682f5 --- /dev/null +++ b/.extlib/simplesamlphp/modules/ldap/src/ConnectorInterface.php @@ -0,0 +1,72 @@ +getConfigDir(); +\SimpleSAML\Configuration::setConfigDir($configdir); + +// $outputDir contains the directory we will store the generated metadata in +$sysUtils = new \SimpleSAML\Utils\System(); +$outputDir = $sysUtils->resolvePath('metadata-generated'); + +/* $toStdOut is a boolean telling us whether we will print the output to stdout instead + * of writing it to files in $outputDir. + */ +$toStdOut = false; + +/* $certificates contains the certificates which should be used to check the signature of the signed + * EntityDescriptor in the metadata, or NULL if signature verification shouldn't be done. + */ +$certificates = null; + +// This variable contains the files we will parse +$files = []; + +// Parse arguments + +$progName = array_shift($argv); + +foreach ($argv as $a) { + if (strlen($a) === 0) { + continue; + } + + if ($a[0] !== '-') { + // Not an option. Assume that it is a file we should parse + $files[] = $a; + continue; + } + + if (strpos($a, '=') !== false) { + $p = strpos($a, '='); + $v = substr($a, $p + 1); + $a = substr($a, 0, $p); + } else { + $v = null; + } + + // Map short options to long options + $shortOptMap = [ + '-h' => '--help', + '-o' => '--out-dir', + '-s' => '--stdout', + ]; + if (array_key_exists($a, $shortOptMap)) { + $a = $shortOptMap[$a]; + } + + switch ($a) { + case '--certificate': + if ($v === null || strlen($v) === 0) { + echo 'The --certficate option requires a parameter.' . "\n"; + echo 'Please run `' . $progName . ' --help` for usage information.' . "\n"; + exit(1); + } + $certificates[] = $v; + break; + case '--help': + printHelp(); + exit(0); + case '--out-dir': + if ($v === null || strlen($v) === 0) { + echo 'The --out-dir option requires a parameter.' . "\n"; + echo 'Please run `' . $progName . ' --help` for usage information.' . "\n"; + exit(1); + } + $outputDir = $sysUtils->resolvePath($v); + break; + case '--stdout': + $toStdOut = true; + break; + default: + echo 'Unknown option: ' . $a . "\n"; + echo 'Please run `' . $progName . ' --help` for usage information.' . "\n"; + exit(1); + } +} + +if (count($files) === 0) { + echo $progName . ': Missing input files. Please run `' . $progName . ' --help` for usage information.' . "\n"; + exit(1); +} + +// The metadata global variable will be filled with the metadata we extract +$metaloader = new \SimpleSAML\Module\metarefresh\MetaLoader(); + +foreach ($files as $f) { + $source = ['src' => $f]; + if (isset($certificates)) { + $source['certificates'] = $certificates; + } + $metaloader->loadSource($source); +} + +if ($toStdOut) { + $metaloader->dumpMetadataStdOut(); +} else { + $metaloader->writeMetadataFiles($outputDir); +} + +/** + * This function prints the help output. + */ +function printHelp(): void +{ + global $progName; + + /* '======================================================================' */ + echo 'Usage: ' . $progName . ' [options] [files]' . "\n"; + echo "\n"; + echo 'This program parses SAML metadata files and outputs configuration that can' . "\n"; + echo 'be added to the metadata files in metadata/.' . "\n"; + echo "\n"; + echo 'Options:' . "\n"; + echo ' --certificate= The certificate which should be used' . "\n"; + echo ' to check the signature of the metadata.' . "\n"; + echo ' The file are stored in the cert dir.' . "\n"; + echo ' It is possibility to add multiple' . "\n"; + echo ' --certificate options to handle' . "\n"; + echo ' key rollover.' . "\n"; + echo ' -h, --help Print this help.' . "\n"; + echo ' -o=, --out-dir= Write the output to this directory. The' . "\n"; + echo ' default directory is metadata-generated/.' . "\n"; + echo ' Non-absolute paths will be relative to the SimpleSAMLphp' . "\n"; + echo ' base directory.' . "\n"; + echo ' -s, --stdout Write the output to stdout instead of' . "\n"; + echo ' separate files in the output directory.' . "\n"; + echo "\n"; +} diff --git a/.extlib/simplesamlphp/modules/metarefresh/composer.json b/.extlib/simplesamlphp/modules/metarefresh/composer.json new file mode 100644 index 000000000..4aa6fc997 --- /dev/null +++ b/.extlib/simplesamlphp/modules/metarefresh/composer.json @@ -0,0 +1,49 @@ +{ + "name": "simplesamlphp/simplesamlphp-module-metarefresh", + "description": "The metarefresh module will download and parse metadata documents and store them locally", + "type": "simplesamlphp-module", + "keywords": ["simplesamlphp", "metarefresh"], + "license": "LGPL-2.1-or-later", + "authors": [ + { + "name": "Andreas Åkre Solberg", + "email": "andreas.solberg@uninett.no" + } + ], + "config": { + "preferred-install": { + "simplesamlphp/simplesamlphp": "source", + "*": "dist" + }, + "allow-plugins": { + "composer/package-versions-deprecated": true, + "simplesamlphp/composer-module-installer": true + } + }, + "autoload": { + "psr-4": { + "SimpleSAML\\Module\\metarefresh\\": "src/" + } + }, + "autoload-dev": { + "psr-4": { + "SimpleSAML\\Test\\Utils\\": "vendor/simplesamlphp/simplesamlphp/tests/Utils" + } + }, + "require": { + "php": "^8.0", + + "simplesamlphp/assert": "^1.0.0", + "simplesamlphp/composer-module-installer": "^1.3.4", + "simplesamlphp/simplesamlphp": "^2.0", + "simplesamlphp/xml-common": "^1.12", + "symfony/http-foundation": "^6.0" + }, + "require-dev": { + "simplesamlphp/simplesamlphp-test-framework": "^1.5.5" + }, + "support": { + "issues": "https://github.com/simplesamlphp/simplesamlphp-module-metarefresh/issues", + "source": "https://github.com/simplesamlphp/simplesamlphp-module-metarefresh" + } +} diff --git a/.extlib/simplesamlphp/modules/metarefresh/config-templates/module_metarefresh.php b/.extlib/simplesamlphp/modules/metarefresh/config-templates/module_metarefresh.php new file mode 100644 index 000000000..3d9899efe --- /dev/null +++ b/.extlib/simplesamlphp/modules/metarefresh/config-templates/module_metarefresh.php @@ -0,0 +1,95 @@ + true, + + 'sets' => [ + + 'kalmar' => [ + 'cron' => ['hourly'], + 'sources' => [ + [ + /* + * entityIDs that should be excluded from this src. + */ + #'blacklist' => array( + # 'http://some.other.uni/idp', + #), + + /* + * Whitelist: only keep these EntityIDs. + */ + #'whitelist' => array( + # 'http://some.uni/idp', + # 'http://some.other.uni/idp', + #), + + #'conditionalGET' => true, + 'src' => 'https://kalmar2.org/simplesaml/module.php/aggregator/?id=kalmarcentral&set=saml2&exclude=norway', + 'certificates' => [ + 'current.crt', + 'rollover.crt', + ], + 'validateFingerprint' => '59:1D:4B:46:70:46:3E:ED:A9:1F:CC:81:6D:C0:AF:2A:09:2A:A8:01', + #'validateFingerprintAlgorithm' => RobRichards\XMLSecLibs\XMLSecurityDSig::SHA1, + 'template' => [ + 'tags' => ['kalmar'], + 'authproc' => [ + 51 => ['class' => 'core:AttributeMap', 'oid2name'], + ], + ], + + 'regex-template' => [ + "#^https://www\.example\.com/sp$#" => [ + 'assertion.encryption' => false, + ], + ], + + /* + * The sets of entities to load, any combination of: + * - 'saml20-idp-remote' + * - 'saml20-sp-remote' + * - 'attributeauthority-remote' + * + * All of them will be used by default. + * + * This option takes precedence over the same option per metadata set. + */ + //'types' => [], + ], + ], + + 'expireAfter' => 34560060, // Maximum 4 days cache time (3600*24*4) + 'outputDir' => 'metadata/metadata-kalmar-consuming/', + + /* + * Which output format the metadata should be saved as. + * Can be 'flatfile' or 'serialize'. 'flatfile' is the default. + */ + 'outputFormat' => 'flatfile', + + /* + * The sets of entities to load, any combination of: + * - 'saml20-idp-remote' + * - 'saml20-sp-remote' + * - 'attributeauthority-remote' + * + * All of them will be used by default. + */ + //'types' => [], + ], + ], +]; diff --git a/.extlib/simplesamlphp/modules/metarefresh/docs/simplesamlphp-automated_metadata.md b/.extlib/simplesamlphp/modules/metarefresh/docs/simplesamlphp-automated_metadata.md new file mode 100644 index 000000000..794f5f8eb --- /dev/null +++ b/.extlib/simplesamlphp/modules/metarefresh/docs/simplesamlphp-automated_metadata.md @@ -0,0 +1,275 @@ +# Automated Metadata Management + +[TOC] + +## Introduction + +If you want to connect an Identity Provider, or a Service Provider to a **federation**, you need to setup metadata for the entries that you trust. In many federations, in particular federations based upon the Shibboleth software, it is normal to setup automated distribution of metadata using the SAML 2.0 Metadata XML Format. + +Some central administration or authority, provides a URL with a SAML 2.0 document including metadata for all entities in the federation. + +The present document explains how to setup automated downloading and parsing of a metadata document on a specific URL. + +## Preparations + +You need to enable the following modules: + + 1. [cron](https://simplesamlphp.org/docs/stable/cron/cron.html) + 2. metarefresh + +The cron module allows you to do tasks regularly, by setting up a cron job that calls a hook in SimpleSAMLphp. +It is shipped with the SimpleSAMLphp core. + +The metarefresh module will download and parse the metadata document and store it in metadata files cached locally +and needs to be installed separately: + +```bash +composer require simplesamlphp/simplesamlphp-module-metarefresh +``` + +In `config.php`, search for the `module.enable` key and set `cron` and `metarefresh` to true: + +```php + 'module.enable' => [ + 'cron' => true, + 'metarefresh' => true, + … + ], +``` + +Then, you will need to copy the `config-templates` files of the two modules above into the global `config/` directory. + +```sh +cd /var/simplesamlphp +cp modules/cron/config-templates/*.php config/ +cp modules/metarefresh/config-templates/*.php config/ +``` + +## Testing it manually + +It is often useful to verify that the metadata sources we want to use can be +parsed and verified by metarefresh, before actually configuring it. We can do +so in the command line, by invoking metarefresh with the URL of the metadata +set we want to check. For instance, if we want to configure the metadata of the +SWITCH AAI Test Federation: + +```sh +cd modules/metarefresh/bin +./metarefresh.php -s http://metadata.aai.switch.ch/metadata.aaitest.xml +``` + +### Note + +If you have the SimpleSAMLphp configuration-directory in a non-default place, remember to set the +`SIMPLESAMLPHP_CONFIG_DIR` environment-variable to point to this directory _before_ running the commands above. + +```sh +export SIMPLESAMLPHP_CONFIG_DIR='/custom/config/location' +``` + +The `-s` option sends the output to the console (for testing purposes). If the +output makes sense, continue. If you get a lot of error messages, try to read +them and fix the problems that might be causing them. If you are having +problems and you can't figure out the cause, you can always send an e-mail to +the SimpleSAMLphp mailing list and ask for advice. + +## Configuring the metarefresh module + +Now we are going to proceed to configure the metarefresh module. First, edit the configuration file `config/module_metarefresh.php`. + +Here's an example of a possible configuration for the Kalmar Federation, +UK Access Management Federation, and eduGAIN: + +```php +$config = [ + 'sets' => [ + 'kalmar' => [ + 'cron' => ['hourly'], + 'sources' => [ + [ + 'src' => 'https://kalmar.feide.no/simplesaml/module.php/aggregator/?id=kalmarcentral&mimetype=text/plain&exclude=norway', + 'certificates' => [ + 'current.crt', + 'rollover.crt', + ], + 'template' => [ + 'tags' => ['kalmar'], + 'authproc' => [ + 51 => ['class' => 'core:AttributeMap', 'oid2name'], + ], + ], + ], + ], + 'expireAfter' => 60*60*24*4, // Maximum 4 days cache time. + 'outputDir' => 'metadata/metarefresh-kalmar/', + 'outputFormat' => 'flatfile', + ], + 'uk' => [ + 'cron' => ['hourly'], + 'sources' => [ + [ + 'src' => 'http://metadata.ukfederation.org.uk/ukfederation-metadata.xml', + ], + ], + 'expireAfter' => 60*60*24*4, // Maximum 4 days cache time. + 'outputDir' => 'metadata/metarefresh-ukaccess/', + 'outputFormat' => 'serialize', + ], + 'edugain' => [ + 'cron' => ['daily'], + 'sources' => [ + [ + 'src' => 'https://metadata.surfconext.nl/edugain-downstream.xml', + 'certificates' => [ + 'SURFconext-metadata-signer.pem', + ], + ], + ], + 'attributewhitelist' => [ + [ + '#EntityAttributes#' => [ + '#urn:oasis:names:tc:SAML:attribute:assurance-certification#' + => ['#https://refeds.org/sirtfi#'], + '#http://macedir.org/entity-category-support#' + => ['#http://refeds.org/category/research-and-scholarship#'], + ], + ], + [ + '#RegistrationInfo#' => [ + '#registrationAuthority#' + => '#http://www.surfconext.nl/#', + ], + '#EntityAttributes#' => [ + '#urn:oasis:names:tc:SAML:attribute:assurance-certification#' + => ['#https://refeds.org/sirtfi#'], + ], + ], + ], + ], + ], +]; +``` + +The configuration consists of one or more metadata sets. Each metadata set has +its own configuration, representing a metadata set of sources. Some +federations will provide you with detailed instructions on how to configure +metarefresh to fetch their metadata automatically, like, for instance, [the +InCommon federation in the US](https://spaces.at.internet2.edu/x/JggOCg). Whenever +a federation provides you with specific instructions to configure metarefresh, +be sure to use them from the authoritative source. + +The metarefresh module supports the following configuration options: + +`cron` +: Which cron tags will refresh this metadata set. + +`sources` +: An array of metadata sources that will be included in this + metadata set. The contents of this option will be described later in more detail. + +`expireAfter` +: The maximum number of seconds a metadata entry will be valid. + +`outputDir` +: The directory where the generated metadata will be stored. Non-absolute paths + will be relative to the SimpleSAMLphp base directory. + +`outputFormat` +: The format of the generated metadata files. This must match the + metadata source added in `config.php`. + +`types` +: The sets of entities to load. An array containing strings identifying the different types of entities that will be + loaded. Valid types are: `saml20-idp-remote`, `saml20-sp-remote`, `attributeauthority-remote`. + All entity types will be loaded by default. + +Each metadata source has the following options: + +`src` +: The source URL where the metadata will be fetched from. + +`certificates` +: An array of certificate files, the filename is relative to the `cert/`-directory, + that will be used to verify the signature of the metadata. The public key will + be extracted from the certificate and everything else will be ignored. So it is + possible to use a self signed certificate that has expired. Add more than one + certificate to be able to handle key rollover. + +`template` +: This is an array which will be combined with the metadata fetched to + generate the final metadata array. + +`regex-template` +: This is an array of arrays that allows metadata elements to be added or changed for al entities matching a regular + expression. The key of each element is a regular expression that will be matched against all entity IDs in metadata. + If the regular expression matches, the value array will be combined with the metadata fetched to generate the final + metadata array. + +`types` +: Same as the option with the same name at the metadata set level. This option has precedence when both are specified, + allowing a more fine grained configuration for every metadata source. + +`whitelist` +: This is an array that allows for selectively refreshing a list of identity providers. Only data from identity + providers that exist in the whitelist will be processed and written to disk. This is especially useful for hosting + environments that have strict limits memory and maximum execution time. + +`blacklist` +: This is an array that allows for selectively skipping a list of identity providers. Only data from identity + providers that do not appear in the blacklist are processed and written to disk. + +`attributewhitelist` +: This is a multilevel array for selectively refreshing a list of identity providers based on specific attributes + patterns in their metadata. Only data from identity providers that match at least one element of the top-level array + will be processed and written to disk. + Matching of such a top-level element, itself being a (multi-level) array, means that at each level (recursively) the + key and value match with the identity provider's metadata. Scalar keys and values are matched using PCRE. + A typical use-case is to accept only identity providers from eduGAIN that match a combination of specific + EntityAttributes, such as the `https://refeds.org/sirtfi` assurance-certification *and* + `http://refeds.org/category/research-and-scholarship` entity-category. + Another example is filtering identity providers from a specific federation, by filtering on specific values of the + registrationAuthority inside the RegistrationInfo. + +After you have configured the metadata sources, you need to give the +web-server write access to the output directories. Following the previous example: + +```sh +chown www-data /var/simplesamlphp/metadata/metarefresh-kalmar/ +chown www-data /var/simplesamlphp/metadata/metarefresh-ukaccess/ +``` + +Now you can configure SimpleSAMLphp to use the metadata fetched by metarefresh. Edit the main +config.php file, and modify the `metadata.sources` directive accordingly: + +```php +'metadata.sources' => [ + ['type' => 'flatfile'], + ['type' => 'flatfile', 'directory' => 'metadata/metarefresh-kalmar'], + ['type' => 'serialize', 'directory' => 'metadata/metarefresh-ukaccess'], +], +``` + +Remember that the `type` parameter here must match the `outputFormat` in the configuration of the module. + +## Configuring the cron module + +See the [cron module documentation](https://simplesamlphp.org/docs/stable/cron:cron) to configure `cron` + +Once you have invoked cron, and if this operation seems to run fine, navigate +to the **SimpleSAMLphp Admin** › **Federation**. Here you will see a list +of all the Identity Providers trusted. They will be listed with information +about the maximum duration of their cached version, such as *(expires in 96.0 +hours)*. + +You *may* need to adjust the below php.ini settings if the metadata files you consume are quite large. + +* `memory_limit` +* `max_execution_time` + +## Metadata duration + +SAML metadata may supply a `cacheDuration` attribute which indicates the +maximum time to keep metadata cached. Because this module is run from cron, it +cannot decide how often it is run and enforce this duration on its own. Make +sure to run metarefresh from cron at least as often as the shortest +`cacheDuration` in your metadata sources. diff --git a/.extlib/simplesamlphp/modules/metarefresh/hooks/hook_configpage.php b/.extlib/simplesamlphp/modules/metarefresh/hooks/hook_configpage.php new file mode 100644 index 000000000..1e24d9a00 --- /dev/null +++ b/.extlib/simplesamlphp/modules/metarefresh/hooks/hook_configpage.php @@ -0,0 +1,22 @@ +data['links'][] = [ + 'href' => Module::getModuleURL('metarefresh/'), + 'text' => Translate::noop('Metarefresh'), + ]; + + $template->getLocalization()->addModuleDomain('metarefresh'); +} diff --git a/.extlib/simplesamlphp/modules/metarefresh/hooks/hook_cron.php b/.extlib/simplesamlphp/modules/metarefresh/hooks/hook_cron.php new file mode 100644 index 000000000..1402bdb71 --- /dev/null +++ b/.extlib/simplesamlphp/modules/metarefresh/hooks/hook_cron.php @@ -0,0 +1,31 @@ +runRefresh($croninfo['tag']); + } catch (\Exception $e) { + $croninfo['summary'][] = 'Error during metarefresh: ' . $e->getMessage(); + } +} diff --git a/.extlib/simplesamlphp/modules/metarefresh/locales/en/LC_MESSAGES/metarefresh.po b/.extlib/simplesamlphp/modules/metarefresh/locales/en/LC_MESSAGES/metarefresh.po new file mode 100644 index 000000000..cd068b675 --- /dev/null +++ b/.extlib/simplesamlphp/modules/metarefresh/locales/en/LC_MESSAGES/metarefresh.po @@ -0,0 +1,25 @@ + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: SimpleSAMLphp 1.15\n" +"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n" +"POT-Creation-Date: 2017-12-06 09:23+0200\n" +"PO-Revision-Date: 2017-12-06 12:14+0200\n" +"Last-Translator: \n" +"Language: en\n" +"Language-Team: \n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +msgid "Metarefresh" +msgstr "Metarefresh" + +msgid "No output from metarefresh." +msgstr "No output from metarefresh." + +msgid "Fetched metadata" +msgstr "Fetched metadata" diff --git a/.extlib/simplesamlphp/modules/metarefresh/routing/routes/routes.yaml b/.extlib/simplesamlphp/modules/metarefresh/routing/routes/routes.yaml new file mode 100644 index 000000000..55552f55f --- /dev/null +++ b/.extlib/simplesamlphp/modules/metarefresh/routing/routes/routes.yaml @@ -0,0 +1,4 @@ +metarefresh-main: + path: / + defaults: { _controller: 'SimpleSAML\Module\metarefresh\Controller\MetaRefresh::main' } + methods: [GET] diff --git a/.extlib/simplesamlphp/modules/metarefresh/src/ARP.php b/.extlib/simplesamlphp/modules/metarefresh/src/ARP.php new file mode 100644 index 000000000..89f898672 --- /dev/null +++ b/.extlib/simplesamlphp/modules/metarefresh/src/ARP.php @@ -0,0 +1,154 @@ +metadata = $metadata; + $this->prefix = $prefix; + $this->suffix = $suffix; + + if (isset($attributemap_filename)) { + $this->loadAttributeMap($attributemap_filename); + } + } + + + /** + * @param string $attributemap_filename + * + */ + private function loadAttributeMap(string $attributemap_filename): void + { + $config = \SimpleSAML\Configuration::getInstance(); + + /** @psalm-suppress PossiblyNullOperand */ + include($config->getPathValue('attributemap', 'attributemap/') . $attributemap_filename . '.php'); + + // Note that $attributemap is defined in the included attributemap-file! + /** @psalm-var array $attributemap */ + $this->attributes = $attributemap; + } + + + /** + * @param string $name + * + * @return string + */ + private function surround(string $name): string + { + $ret = ''; + if (!empty($this->prefix)) { + $ret .= $this->prefix; + } + $ret .= $name; + if (!empty($this->suffix)) { + $ret .= $this->suffix; + } + return $ret; + } + + + /** + * @param string $name + * + * @return string + */ + private function getAttributeID(string $name): string + { + if (empty($this->attributes)) { + return $this->surround($name); + } + if (array_key_exists($name, $this->attributes)) { + return $this->surround($this->attributes[$name]); + } + return $this->surround($name); + } + + + /** + * @return string + */ + public function getXML(): string + { + $xml = << + +MSG; + + foreach ($this->metadata as $metadata) { + $xml .= $this->getEntryXML($metadata['metadata']); + } + + $xml .= ''; + return $xml; + } + + + /** + * @param array $entry + * + * @return string + */ + private function getEntryXML(array $entry): string + { + $entityid = $entry['entityid']; + return ' ' . $this->getEntryXMLcontent($entry) . ''; + } + + + /** + * @param array $entry + * + * @return string + */ + private function getEntryXMLcontent(array $entry): string + { + if (!array_key_exists('attributes', $entry)) { + return ''; + } + + $ret = ''; + foreach ($entry['attributes'] as $a) { + $ret .= ' '; + } + return $ret; + } +} diff --git a/.extlib/simplesamlphp/modules/metarefresh/src/Controller/MetaRefresh.php b/.extlib/simplesamlphp/modules/metarefresh/src/Controller/MetaRefresh.php new file mode 100644 index 000000000..f8719c534 --- /dev/null +++ b/.extlib/simplesamlphp/modules/metarefresh/src/Controller/MetaRefresh.php @@ -0,0 +1,99 @@ +module_config = Configuration::getConfig('module_metarefresh.php'); + $this->authUtils = new Utils\Auth(); + } + + + /** + * Inject the \SimpleSAML\Utils\Auth dependency. + * + * @param \SimpleSAML\Utils\Auth $authUtils + */ + public function setAuthUtils(Utils\Auth $authUtils): void + { + $this->authUtils = $authUtils; + } + + /** + * Inject the \SimpleSAML\Configuration dependency. + * + * @param \SimpleSAML\Configuration $module_config + */ + public function setModuleConfig(Configuration $module_config): void + { + $this->module_config = $module_config; + } + + /** + * @return \SimpleSAML\XHTML\Template + */ + public function main(): Template + { + $this->authUtils->requireAdmin(); + + Logger::setCaptureLog(true); + + $mf = new \SimpleSAML\Module\metarefresh\MetaRefresh($this->config, $this->module_config); + + try { + $mf->runRefresh(); + } catch (Exception $e) { + $e = Error\Exception::fromException($e); + $e->logWarning(); + } + + $logentries = Logger::getCapturedLog(); + + $t = new Template($this->config, 'metarefresh:fetch.twig'); + $t->data['logentries'] = $logentries; + return $t; + } +} diff --git a/.extlib/simplesamlphp/modules/metarefresh/src/MetaLoader.php b/.extlib/simplesamlphp/modules/metarefresh/src/MetaLoader.php new file mode 100644 index 000000000..ce3b3177d --- /dev/null +++ b/.extlib/simplesamlphp/modules/metarefresh/src/MetaLoader.php @@ -0,0 +1,695 @@ +expire = $expire; + $this->oldMetadataSrc = $oldMetadataSrc; + $this->stateFile = $stateFile; + + // Read file containing $state from disk + /** @psalm-var array|null */ + $state = null; + if (!is_null($stateFile) && is_readable($stateFile)) { + include($stateFile); + } + + if (!empty($state)) { + $this->state = $state; + } + } + + + /** + * Get the types of entities that will be loaded. + * + * @return array The entity types allowed. + */ + public function getTypes(): array + { + return $this->types; + } + + + /** + * Set the types of entities that will be loaded. + * + * @param string|array $types Either a string with the name of one single type allowed, or an array with a list of + * types. Pass an empty array to reset to all types of entities. + */ + public function setTypes($types): void + { + if (!is_array($types)) { + $types = [$types]; + } + $this->types = $types; + } + + + /** + * This function processes a SAML metadata file. + * + * @param array $source + */ + public function loadSource(array $source): void + { + if (preg_match('@^https?://@i', $source['src'])) { + // Build new HTTP context + $context = $this->createContext($source); + + $httpUtils = new Utils\HTTP(); + // GET! + try { + /** @var array $response We know this because we set the third parameter to `true` */ + $response = $httpUtils->fetch($source['src'], $context, true); + list($data, $responseHeaders) = $response; + } catch (Exception $e) { + Logger::warning('metarefresh: ' . $e->getMessage()); + } + + // We have response headers, so the request succeeded + if (!isset($responseHeaders)) { + // No response headers, this means the request failed in some way, so re-use old data + Logger::info('No response from ' . $source['src'] . ' - attempting to re-use cached metadata'); + $this->addCachedMetadata($source); + return; + } elseif (preg_match('@^HTTP/1\.[01]\s304\s@', $responseHeaders[0])) { + // 304 response + Logger::debug('Received HTTP 304 (Not Modified) - attempting to re-use cached metadata'); + $this->addCachedMetadata($source); + return; + } elseif (!preg_match('@^HTTP/1\.[01]\s200\s@', $responseHeaders[0])) { + // Other error + Logger::info('Error from ' . $source['src'] . ' - attempting to re-use cached metadata'); + $this->addCachedMetadata($source); + return; + } + } else { + // Local file. + $data = file_get_contents($source['src']); + $responseHeaders = null; + } + + // Everything OK. Proceed. + if (isset($source['conditionalGET']) && $source['conditionalGET']) { + // Stale or no metadata, so a fresh copy + Logger::debug('Downloaded fresh copy'); + } + + try { + $entities = $this->loadXML($data, $source); + } catch (Exception $e) { + Logger::notice( + 'XML parser error when parsing ' . $source['src'] . ' - attempting to re-use cached metadata' + ); + Logger::debug('XML parser returned: ' . $e->getMessage()); + $this->addCachedMetadata($source); + return; + } + + foreach ($entities as $entity) { + if (!$this->processBlacklist($entity, $source)) { + continue; + } + if (!$this->processWhitelist($entity, $source)) { + continue; + } + if (!$this->processAttributeWhitelist($entity, $source)) { + continue; + } + if (!$this->processCertificates($entity, $source)) { + continue; + } + + $template = null; + if (array_key_exists('template', $source)) { + $template = $source['template']; + } + + if (array_key_exists('regex-template', $source)) { + foreach ($source['regex-template'] as $e => $t) { + if (preg_match($e, $entity->getEntityID())) { + if (is_array($template)) { + $template = array_merge($template, $t); + } else { + $template = $t; + } + } + } + } + + if (in_array('saml20-sp-remote', $this->types, true)) { + $this->addMetadata($source['src'], $entity->getMetadata20SP(), 'saml20-sp-remote', $template); + } + if (in_array('saml20-idp-remote', $this->types, true)) { + $this->addMetadata($source['src'], $entity->getMetadata20IdP(), 'saml20-idp-remote', $template); + } + if (in_array('attributeauthority-remote', $this->types, true)) { + $attributeAuthorities = $entity->getAttributeAuthorities(); + if (count($attributeAuthorities) && !empty($attributeAuthorities[0])) { + $this->addMetadata( + $source['src'], + $attributeAuthorities[0], + 'attributeauthority-remote', + $template + ); + } + } + } + + Logger::debug(sprintf('Found %d entities', count($entities))); + $this->saveState($source, $responseHeaders); + } + + + /** + * @param \SimpleSAML\Metadata\SAMLParser $entity + * @param array $source + * @bool + */ + private function processCertificates(Metadata\SAMLParser $entity, array $source): bool + { + if (array_key_exists('certificates', $source) && ($source['certificates'] !== null)) { + if (!$entity->validateSignature($source['certificates'])) { + $entityId = $entity->getEntityId(); + Logger::notice( + 'Skipping "' . $entityId . '" - could not verify signature using certificate.' . "\n" + ); + return false; + } + } + return true; + } + + + /** + * @param \SimpleSAML\Metadata\SAMLParser $entity + * @param array $source + * @bool + */ + private function processBlacklist(Metadata\SAMLParser $entity, array $source): bool + { + if (isset($source['blacklist'])) { + if (!empty($source['blacklist']) && in_array($entity->getEntityId(), $source['blacklist'], true)) { + Logger::info('Skipping "' . $entity->getEntityId() . '" - blacklisted.' . "\n"); + return false; + } + } + return true; + } + + + /** + * @param \SimpleSAML\Metadata\SAMLParser $entity + * @param array $source + * @bool + */ + private function processWhitelist(Metadata\SAMLParser $entity, array $source): bool + { + if (isset($source['whitelist'])) { + if (!empty($source['whitelist']) && !in_array($entity->getEntityId(), $source['whitelist'], true)) { + Logger::info('Skipping "' . $entity->getEntityId() . '" - not in the whitelist.' . "\n"); + return false; + } + } + return true; + } + + + /** + * @param \SimpleSAML\Metadata\SAMLParser $entity + * @param array $source + * @bool + */ + private function processAttributeWhitelist(Metadata\SAMLParser $entity, array $source): bool + { + /* Do we have an attribute whitelist? */ + if (isset($source['attributewhitelist']) && !empty($source['attributewhitelist'])) { + $idpMetadata = $entity->getMetadata20IdP(); + if (!isset($idpMetadata)) { + /* Skip non-IdPs */ + return false; + } + + /** + * Do a recursive comparison for each whitelist of the attributewhitelist with the idpMetadata for this + * IdP. At least one of these whitelists should match + */ + $match = false; + foreach ($source['attributewhitelist'] as $whitelist) { + if ($this->containsArray($whitelist, $idpMetadata)) { + $match = true; + break; + } + } + if (!$match) { + /* No match found -> next IdP */ + return false; + } + Logger::debug('Whitelisted entityID: ' . $entity->getEntityID()); + } + return true; + } + + + /** + * @param array|string $src + * @param array|string $dst + * @return bool + * + * Recursively checks whether array $dst contains array $src. If $src + * is not an array, a literal comparison is being performed. + */ + private function containsArray($src, $dst): bool + { + if (is_array($src)) { + if (!is_array($dst)) { + return false; + } + $dstKeys = array_keys($dst); + + /* Loop over all src keys */ + foreach ($src as $srcKey => $srcval) { + if (is_int($srcKey)) { + /* key is number, check that the key appears as one + * of the destination keys: if not, then src has + * more keys than dst */ + if (!array_key_exists($srcKey, $dst)) { + return false; + } + + /* loop over dest keys, to find value: we don't know + * whether they are in the same order */ + $submatch = false; + foreach ($dstKeys as $dstKey) { + if ($this->containsArray($srcval, $dst[$dstKey])) { + $submatch = true; + break; + } + } + if (!$submatch) { + return false; + } + } else { + /* key is regexp: find matching keys */ + /** @var array|false $matchingDstKeys */ + $matchingDstKeys = preg_grep($srcKey, $dstKeys); + if (!is_array($matchingDstKeys)) { + return false; + } + + $match = false; + foreach ($matchingDstKeys as $dstKey) { + if ($this->containsArray($srcval, $dst[$dstKey])) { + /* Found a match */ + $match = true; + break; + } + } + if (!$match) { + /* none of the keys has a matching value */ + return false; + } + } + } + /* each src key/value matches */ + return true; + } else { + /* src is not an array, do a regexp match against dst */ + return (preg_match($src, strval($dst)) === 1); + } + } + + /** + * Create HTTP context, with any available caches taken into account + * + * @param array $source + * @return array + */ + private function createContext(array $source): array + { + $config = Configuration::getInstance(); + $name = $config->getOptionalString('technicalcontact_name', null); + $mail = $config->getOptionalString('technicalcontact_email', null); + + $rawheader = "User-Agent: SimpleSAMLphp metarefresh, run by $name <$mail>\r\n"; + + if (isset($source['conditionalGET']) && $source['conditionalGET']) { + if (array_key_exists($source['src'], $this->state)) { + $sourceState = $this->state[$source['src']]; + + if (isset($sourceState['last-modified'])) { + $rawheader .= 'If-Modified-Since: ' . $sourceState['last-modified'] . "\r\n"; + } + + if (isset($sourceState['etag'])) { + $rawheader .= 'If-None-Match: ' . $sourceState['etag'] . "\r\n"; + } + } + } + + return ['http' => ['header' => $rawheader]]; + } + + private function addCachedMetadata(array $source): void + { + if (!isset($this->oldMetadataSrc)) { + Logger::info('No oldMetadataSrc, cannot re-use cached metadata'); + return; + } + + foreach ($this->types as $type) { + foreach ($this->oldMetadataSrc->getMetadataSet($type) as $entity) { + if (array_key_exists('metarefresh:src', $entity)) { + if ($entity['metarefresh:src'] == $source['src']) { + $this->addMetadata($source['src'], $entity, $type); + } + } + } + } + } + + + /** + * Store caching state data for a source + * + * @param array $source + * @param array|null $responseHeaders + */ + private function saveState(array $source, ?array $responseHeaders): void + { + if (isset($source['conditionalGET']) && $source['conditionalGET']) { + // Headers section + if ($responseHeaders !== null) { + $candidates = ['last-modified', 'etag']; + + foreach ($candidates as $candidate) { + if (array_key_exists($candidate, $responseHeaders)) { + $this->state[$source['src']][$candidate] = $responseHeaders[$candidate]; + } + } + } + + if (!empty($this->state[$source['src']])) { + // Timestamp when this src was requested. + $this->state[$source['src']]['requested_at'] = $this->getTime(); + $this->changed = true; + } + } + } + + + /** + * Parse XML metadata and return entities + * + * @param string $data + * @param array $source + * @return \SimpleSAML\Metadata\SAMLParser[] + * @throws \Exception + */ + private function loadXML(string $data, array $source): array + { + try { + $doc = DOMDocumentFactory::fromString($data); + } catch (Exception $e) { + throw new Exception('Failed to read XML from ' . $source['src']); + } + return Metadata\SAMLParser::parseDescriptorsElement($doc->documentElement); + } + + + /** + * This function writes the state array back to disk + * + */ + public function writeState(): void + { + if ($this->changed && !is_null($this->stateFile)) { + Logger::debug('Writing: ' . $this->stateFile); + $sysUtils = new Utils\System(); + $sysUtils->writeFile( + $this->stateFile, + "getTime() . ".\n" . + " Do not update it manually as it will get overwritten. */\n" . + '$state = ' . var_export($this->state, true) . ";\n", + 0644 + ); + } + } + + + /** + * This function writes the metadata to stdout. + * + */ + public function dumpMetadataStdOut(): void + { + foreach ($this->metadata as $category => $elements) { + echo '/* The following data should be added to metadata/' . $category . '.php. */' . "\n"; + + foreach ($elements as $m) { + $filename = $m['filename']; + $entityID = $m['metadata']['entityid']; + $time = $this->getTime(); + echo "\n"; + echo '/* The following metadata was generated from ' . $filename . ' on ' . $time . '. */' . "\n"; + echo '$metadata[\'' . addslashes($entityID) . '\'] = ' . var_export($m['metadata'], true) . ';' . "\n"; + } + + echo "\n"; + echo '/* End of data which should be added to metadata/' . $category . '.php. */' . "\n"; + echo "\n"; + } + } + + + /** + * This function adds metadata from the specified file to the list of metadata. + * This function will return without making any changes if $metadata is NULL. + * + * @param string $filename The filename the metadata comes from. + * @param \SAML2\XML\md\AttributeAuthorityDescriptor[]|null $metadata The metadata. + * @param string $type The metadata type. + * @param array|null $template The template. + */ + private function addMetadata(string $filename, ?array $metadata, string $type, array $template = null): void + { + if ($metadata === null) { + return; + } + + if (isset($template)) { + $metadata = array_merge($metadata, $template); + } + + $metadata['metarefresh:src'] = $filename; + if (!array_key_exists($type, $this->metadata)) { + $this->metadata[$type] = []; + } + + // If expire is defined in constructor... + if (!empty($this->expire)) { + // If expire is already in metadata + if (array_key_exists('expire', $metadata)) { + // Override metadata expire with more restrictive global config + if ($this->expire < $metadata['expire']) { + $metadata['expire'] = $this->expire; + } + + // If expire is not already in metadata use global config + } else { + $metadata['expire'] = $this->expire; + } + } + $this->metadata[$type][] = ['filename' => $filename, 'metadata' => $metadata]; + } + + + /** + * This function writes the metadata to an ARP file + * + * @param \SimpleSAML\Configuration $config + */ + public function writeARPfile(Configuration $config): void + { + $arpfile = $config->getString('arpfile'); + $types = ['saml20-sp-remote']; + + $md = []; + foreach ($this->metadata as $category => $elements) { + if (!in_array($category, $types, true)) { + continue; + } + $md = array_merge($md, $elements); + } + + // $metadata, $attributemap, $prefix, $suffix + $arp = new ARP( + $md, + $config->getOptionalString('attributemap', ''), + $config->getOptionalString('prefix', ''), + $config->getOptionalString('suffix', '') + ); + + + $arpxml = $arp->getXML(); + + Logger::info('Writing ARP file: ' . $arpfile . "\n"); + file_put_contents($arpfile, $arpxml); + } + + + /** + * This function writes the metadata to to separate files in the output directory. + * + * @param string $outputDir + */ + public function writeMetadataFiles(string $outputDir): void + { + while (strlen($outputDir) > 0 && $outputDir[strlen($outputDir) - 1] === '/') { + $outputDir = substr($outputDir, 0, strlen($outputDir) - 1); + } + + if (!file_exists($outputDir)) { + Logger::info('Creating directory: ' . $outputDir . "\n"); + $res = @mkdir($outputDir, 0777, true); + if ($res === false) { + throw new Exception('Error creating directory: ' . $outputDir); + } + } + + foreach ($this->types as $type) { + $filename = $outputDir . '/' . $type . '.php'; + + if (array_key_exists($type, $this->metadata)) { + $elements = $this->metadata[$type]; + Logger::debug('Writing: ' . $filename); + + $content = 'getTime() . "\nDo not update it manually as it will get overwritten\n" . '*/' . "\n"; + + foreach ($elements as $m) { + $entityID = $m['metadata']['entityid']; + $content .= "\n" . '$metadata[\''; + $content .= addslashes($entityID) . '\'] = ' . var_export($m['metadata'], true) . ';' . "\n"; + } + + $sysUtils = new Utils\System(); + $sysUtils->writeFile($filename, $content, 0644); + } elseif (is_file($filename)) { + if (unlink($filename)) { + Logger::debug('Deleting stale metadata file: ' . $filename); + } else { + Logger::warning('Could not delete stale metadata file: ' . $filename); + } + } + } + } + + + /** + * Save metadata for loading with the 'serialize' metadata loader. + * + * @param string $outputDir The directory we should save the metadata to. + */ + public function writeMetadataSerialize(string $outputDir): void + { + $metaHandler = new Metadata\MetaDataStorageHandlerSerialize(['directory' => $outputDir]); + + // First we add all the metadata entries to the metadata handler + foreach ($this->metadata as $set => $elements) { + foreach ($elements as $m) { + $entityId = $m['metadata']['entityid']; + + Logger::debug(sprintf( + 'metarefresh: Add metadata entry %s in set %s.', + var_export($entityId, true), + var_export($set, true), + )); + $metaHandler->saveMetadata($entityId, $set, $m['metadata']); + } + } + } + + + /** + * This function uses the `PDO` metadata handler to upsert metadata in database. + * + * @param \SimpleSAML\Configuration $globalConfig + * @param array $config An associative array with the configuration for `PDO` handler. + * + * @return void + */ + public function writeMetadataPdo(Configuration $globalConfig, array $config = []): void + { + $metaHandler = new Metadata\MetaDataStorageHandlerPdo($globalConfig->toArray(), $config); + + foreach ($this->metadata as $set => $elements) { + foreach ($elements as $m) { + $entityId = $m['metadata']['entityid']; + + Logger::debug("PDO Metarefresh: Upsert metadata entry `{$entityId}` in set `{$set}`."); + $metaHandler->addEntry($entityId, $set, $m['metadata']); + } + } + } + + + /** + * @return string + */ + private function getTime(): string + { + // The current date, as a string + return gmdate('Y-m-d\\TH:i:s\\Z'); + } +} diff --git a/.extlib/simplesamlphp/modules/metarefresh/src/MetaRefresh.php b/.extlib/simplesamlphp/modules/metarefresh/src/MetaRefresh.php new file mode 100644 index 000000000..b918e4aca --- /dev/null +++ b/.extlib/simplesamlphp/modules/metarefresh/src/MetaRefresh.php @@ -0,0 +1,153 @@ +config = $config; + $this->modconfig = $modconfig; + } + + /** + * @param string $crontag Only refresh sets which allow this crontag + */ + public function runRefresh(string $crontag = null): void + { + $sets = $this->modconfig->getArray('sets'); + /** @var string $datadir */ + $datadir = $this->config->getPathValue('datadir', 'data/'); + $stateFile = $datadir . 'metarefresh-state.php'; + + foreach ($sets as $setkey => $set) { + $set = Configuration::loadFromArray($set); + + // Only process sets where cron matches the current cron tag + $cronTags = $set->getArray('cron'); + if ($crontag !== null && !in_array($crontag, $cronTags, true)) { + Logger::debug('[metarefresh]: Skipping set [' . $setkey . '], not allowed for cron tag ' . $crontag); + continue; + } + + Logger::info('[metarefresh]: Executing set [' . $setkey . ']'); + + $expireAfter = $set->getOptionalInteger('expireAfter', null); + if ($expireAfter !== null) { + $expire = time() + $expireAfter; + } else { + $expire = null; + } + + $outputDir = $set->getString('outputDir'); + $outputDir = $this->config->resolvePath($outputDir); + if ($outputDir === null) { + throw new Exception("Invalid outputDir specified."); + } + + $outputFormat = $set->getValueValidate('outputFormat', ['flatfile', 'serialize', 'pdo'], 'flatfile'); + + $oldMetadataSrc = MetaDataStorageSource::getSource([ + 'type' => $outputFormat, + 'directory' => $outputDir, + ]); + + $metaloader = new MetaLoader($expire, $stateFile, $oldMetadataSrc); + + // Get global blacklist, whitelist, attributewhitelist and caching info + $blacklist = $this->modconfig->getOptionalArray('blacklist', []); + $whitelist = $this->modconfig->getOptionalArray('whitelist', []); + $attributewhitelist = $this->modconfig->getOptionalArray('attributewhitelist', []); + $conditionalGET = $this->modconfig->getOptionalBoolean('conditionalGET', false); + + // get global type filters + $available_types = [ + 'saml20-idp-remote', + 'saml20-sp-remote', + 'attributeauthority-remote' + ]; + $set_types = $set->getOptionalArray('types', $available_types); + + foreach ($set->getArray('sources') as $source) { + // filter metadata by type of entity + if (isset($source['types'])) { + $metaloader->setTypes($source['types']); + } else { + $metaloader->setTypes($set_types); + } + + // Merge global and src specific blacklists + if (isset($source['blacklist'])) { + $source['blacklist'] = array_unique(array_merge($source['blacklist'], $blacklist)); + } else { + $source['blacklist'] = $blacklist; + } + + // Merge global and src specific whitelists + if (isset($source['whitelist'])) { + $source['whitelist'] = array_unique(array_merge($source['whitelist'], $whitelist)); + } else { + $source['whitelist'] = $whitelist; + } + + # Merge global and src specific attributewhitelists: cannot use array_unique for multi-dim. + if (isset($source['attributewhitelist'])) { + $source['attributewhitelist'] = array_merge($source['attributewhitelist'], $attributewhitelist); + } else { + $source['attributewhitelist'] = $attributewhitelist; + } + + // Let src specific conditionalGET override global one + if (!isset($source['conditionalGET'])) { + $source['conditionalGET'] = $conditionalGET; + } + + Logger::debug('[metarefresh]: In set [' . $setkey . '] loading source [' . $source['src'] . ']'); + $metaloader->loadSource($source); + } + + // Write state information back to disk + $metaloader->writeState(); + + switch ($outputFormat) { + case 'flatfile': + $metaloader->writeMetadataFiles($outputDir); + break; + case 'serialize': + $metaloader->writeMetadataSerialize($outputDir); + break; + case 'pdo': + $metaloader->writeMetadataPdo($this->config); + break; + } + + if ($set->hasValue('arp')) { + $arpconfig = Configuration::loadFromArray($set->getValue('arp')); + $metaloader->writeARPfile($arpconfig); + } + } + } +} diff --git a/.extlib/simplesamlphp/modules/metarefresh/templates/fetch.twig b/.extlib/simplesamlphp/modules/metarefresh/templates/fetch.twig new file mode 100644 index 000000000..f236ba615 --- /dev/null +++ b/.extlib/simplesamlphp/modules/metarefresh/templates/fetch.twig @@ -0,0 +1,23 @@ +{% set pagetitle = "Metarefresh" | trans %} + +{% extends "base.twig" %} + +{% block content %} + +{% if logentries %} +

      {{ "Fetched metadata" | trans }}

      +
      +
      +{% for logentry in logentries %}
      +{{ logentry }}
      +{% endfor %}
      +
      +{% else %} +
      {{ "No output from metarefresh." | trans }}
      +{% endif %} + + + +{% endblock content %} diff --git a/.extlib/simplesamlphp/modules/radius/LICENSE b/.extlib/simplesamlphp/modules/radius/LICENSE new file mode 100644 index 000000000..a345e48d0 --- /dev/null +++ b/.extlib/simplesamlphp/modules/radius/LICENSE @@ -0,0 +1,459 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + \ No newline at end of file diff --git a/.extlib/simplesamlphp/modules/radius/README.md b/.extlib/simplesamlphp/modules/radius/README.md new file mode 100644 index 000000000..870f57013 --- /dev/null +++ b/.extlib/simplesamlphp/modules/radius/README.md @@ -0,0 +1,7 @@ +# Module for RADIUS authentication + +![Build Status](https://github.com/simplesamlphp/simplesamlphp-module-radius/workflows/CI/badge.svg?branch=master) +[![Coverage Status](https://codecov.io/gh/simplesamlphp/simplesamlphp-module-radius/branch/master/graph/badge.svg)](https://codecov.io/gh/simplesamlphp/simplesamlphp-module-radius) +[![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/simplesamlphp/simplesamlphp-module-radius/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/simplesamlphp/simplesamlphp-module-radius/?branch=master) +[![Type Coverage](https://shepherd.dev/github/simplesamlphp/simplesamlphp-module-radius/coverage.svg)](https://shepherd.dev/github/simplesamlphp/simplesamlphp-module-radius) +[![Psalm Level](https://shepherd.dev/github/simplesamlphp/simplesamlphp-module-radius/level.svg)](https://shepherd.dev/github/simplesamlphp/simplesamlphp-module-radius) diff --git a/.extlib/simplesamlphp/modules/radius/composer.json b/.extlib/simplesamlphp/modules/radius/composer.json new file mode 100644 index 000000000..e302b0465 --- /dev/null +++ b/.extlib/simplesamlphp/modules/radius/composer.json @@ -0,0 +1,47 @@ +{ + "name": "simplesamlphp/simplesamlphp-module-radius", + "description": "A module that is able perform authentication against a RADIUS server", + "type": "simplesamlphp-module", + "keywords": ["simplesamlphp", "radius"], + "license": "LGPL-2.1-or-later", + "authors": [ + { + "name": "Olav Morken", + "email": "olavmrk@gmail.com" + } + ], + "config": { + "preferred-install": { + "simplesamlphp/simplesamlphp": "source", + "*": "dist" + }, + "allow-plugins": { + "composer/package-versions-deprecated": true, + "simplesamlphp/composer-module-installer": true + } + }, + "autoload": { + "psr-4": { + "SimpleSAML\\Module\\radius\\": "src/" + } + }, + "autoload-dev": { + "psr-4": { + "SimpleSAML\\Test\\Utils\\": "vendor/simplesamlphp/simplesamlphp/tests/Utils" + } + }, + "require": { + "php": ">=7.4 || ^8.0", + + "dapphp/radius": "^3.0.0", + "simplesamlphp/composer-module-installer": "^1.3.2", + "simplesamlphp/simplesamlphp": "^2.0.0" + }, + "require-dev": { + "simplesamlphp/simplesamlphp-test-framework": "~1.6" + }, + "support": { + "issues": "https://github.com/tvdijen/simplesamlphp-module-radius/issues", + "source": "https://github.com/tvdijen/simplesamlphp-module-radius" + } +} diff --git a/.extlib/simplesamlphp/modules/radius/docs/radius.md b/.extlib/simplesamlphp/modules/radius/docs/radius.md new file mode 100644 index 000000000..0c10bb66c --- /dev/null +++ b/.extlib/simplesamlphp/modules/radius/docs/radius.md @@ -0,0 +1,113 @@ +RADIUS module +============= + +The RADIUS module provides a single authentication module: + +`radius:Radius` +: Authenticate a user against a RADIUS server. + +This authentication module contacts a RADIUS server, and authenticates +the user by using username & password authentication. + +To use this module, enable the radius module: in `config.php`, search +for the `module.enable` key and set `radius` to true: + +```php + 'module.enable' => [ + 'radius' => true, + … + ], +``` + +Then you need to add a authentication source which uses the `radius:Radius` +module to `config/authsources.php`: + +```php + 'example-radius' => [ + 'radius:Radius', + + /* + * An array with the radius servers to use, up to 10. + * The options are: + * - hostname: the hostname of the radius server, or its IP address. Required. + * - port: the port of the radius server. Optional, defaults to 1812. + * - secret: the radius secret to use with this server. Required. + */ + 'servers' => [ + [ + 'hostname' => 'radius1.example.org', + 'port' => 1812, + 'secret' => 'topsecret' + ], + [ + 'hostname' => 'radius2.example.org', + 'port' => 1812, + 'secret' => 'topsecret' + ] + ], + + /* + * The timeout for contacting the RADIUS server, in seconds. + * Optional, defaults to 5 seconds. + */ + 'timeout' => 5, + + /* + * Set debug modus + */ + 'debug' => true, + + /* + * The NAS identifier to use when querying the radius server. + * Optional, defaults to the current host name. + */ + 'nas_identifier' => 'client.example.org', + + /* + * An optional realm that will be suffixed to the username entered + * by the user. When set to "example.edu", and the user enters + * "bob" as their username, the radius server will be queried for + * the username "bob@example.edu". + * Optional, defaults to NULL. + */ + 'realm' => 'example.edu', + + /* + * The attribute name we should store the username in. This username + * will not be saved in any attribute if this is NULL. + * Optional, defaults to NULL. + */ + 'username_attribute' => 'eduPersonPrincipalName', + ], +``` + +User attributes +--------------- + +If the RADIUS server is configured to include attributes for the user in +the response, this module may be able to extract them. This requires the +attributes to be stored in a vendor-specific attribute in the response +from the RADIUS server. + +The code expects one vendor-attribute with a specific vendor and a specific +vendor attribute type for each user attribute. The vendor-attribute must +contain a value of the form `=`. + +The following configuration options are available for user attributes: + +```php + /* + * This is the vendor for the vendor-specific attribute which contains + * the attributes for this user. This can be NULL if no attributes are + * included in the response. + * Optional, defaults to NULL. + */ + 'attribute_vendor' => 23735, + + /* + * The vendor attribute-type of the attribute which contains the + * attributes for the user. + * Required if 'vendor' is set. + */ + 'attribute_vendor_type' => 4, +``` diff --git a/.extlib/simplesamlphp/modules/radius/src/Auth/Source/Radius.php b/.extlib/simplesamlphp/modules/radius/src/Auth/Source/Radius.php new file mode 100644 index 000000000..fecbdbe02 --- /dev/null +++ b/.extlib/simplesamlphp/modules/radius/src/Auth/Source/Radius.php @@ -0,0 +1,271 @@ +authId, true) + ); + + $this->servers = $cfg->getArray('servers'); + // For backwards compatibility + if (empty($this->servers)) { + $this->hostname = $cfg->getString('hostname'); + $this->port = $cfg->getOptionalIntegerRange('port', 1, 65535, 1812); + $this->secret = $cfg->getString('secret'); + $this->servers[] = [ + 'hostname' => $this->hostname, + 'port' => $this->port, + 'secret' => $this->secret + ]; + } + $this->debug = $cfg->getOptionalBoolean('debug', false); + $this->timeout = $cfg->getOptionalInteger('timeout', 5); + $this->realm = $cfg->getOptionalString('realm', null); + $this->usernameAttribute = $cfg->getOptionalString('username_attribute', null); + $this->nasIdentifier = $cfg->getOptionalString('nas_identifier', null); + + $this->vendor = $cfg->getOptionalInteger('attribute_vendor', null); + if ($this->vendor !== null) { + $this->vendorType = $cfg->getInteger('attribute_vendor_type'); + } + } + + + /** + * Attempt to log in using the given username and password. + * + * @param string $username The username the user wrote. + * @param string $password The password the user wrote. + * @return array[] Associative array with the user's attributes. + */ + protected function login(string $username, string $password): array + { + $radius = new RadiusClient(); + $response = false; + + // Try to add all radius servers, trigger a failure if no one works + foreach ($this->servers as $server) { + $radius->setServer($server['hostname']); + $radius->setAuthenticationPort($server['port']); + $radius->setSecret($server['secret']); + $radius->setDebug($this->debug); + $radius->setTimeout($this->timeout); + $radius->setIncludeMessageAuthenticator(); + + $httpUtils = new Utils\HTTP(); + $radius->setNasIpAddress($_SERVER['SERVER_ADDR'] ?: $httpUtils->getSelfHost()); + + if ($this->nasIdentifier !== null) { + $radius->setAttribute(self::RADIUS_NAS_IDENTIFIER, $this->nasIdentifier); + } + + if ($this->realm !== null) { + $radius->setRadiusSuffix('@' . $this->realm); + } + $response = $radius->accessRequest($username, $password); + + if ($response !== false) { + break; + } + } + + if ($response === false) { + $errorCode = $radius->getErrorCode(); + switch ($errorCode) { + case $radius::TYPE_ACCESS_REJECT: + throw new Error\Error('WRONGUSERPASS'); + case $radius::TYPE_ACCESS_CHALLENGE: + throw new Exception('Radius authentication error: Challenge requested, but not supported.'); + default: + throw new Exception(sprintf( + 'Error during radius authentication; %s (%d)', + $radius->getErrorMessage(), + $errorCode + )); + } + } + + // If we get this far, we have a valid login + + $attributes = []; + if ($this->usernameAttribute !== null) { + $attributes[$this->usernameAttribute] = [$username]; + } + + if ($this->vendor === null) { + /* + * We aren't interested in any vendor-specific attributes. We are + * therefore done now. + */ + return $attributes; + } else { + foreach ($radius->getReceivedAttributes() as $content) { + if ($content[0] == 26) { // is a Vendor-Specific attribute + $vsa = $radius->decodeVendorSpecificContent($content[1]); + + // matches configured Vendor and Type + if ($vsa[0][0] === $this->vendor && $vsa[0][1] === $this->vendorType) { + // SAML attributes expected in a URN=value, so split at first = + $decomposed = explode("=", $vsa[0][2], 2); + $attributes[$decomposed[0]][] = $decomposed[1]; + } + } + } + } + + return array_merge($attributes, $this->getAttributes($radius)); + } + + + /** + * @param \Dapphp\Radius\Radius $radius + * @return array + */ + private function getAttributes(RadiusClient $radius): array + { + // get AAI attribute sets. + $resa = $radius->getReceivedAttributes(); + $attributes = []; + + // Use the received user name + if ($resa['attr'] === self::RADIUS_USERNAME && $this->usernameAttribute !== null) { + $attributes[$this->usernameAttribute] = [$resa['data']]; + return $attributes; + } + + if ($resa['attr'] !== self::RADIUS_VENDOR_SPECIFIC) { + return $attributes; + } + + $resv = $resa['data']; + if ($resv === false) { + throw new Exception(sprintf( + 'Error getting vendor specific attribute', + $radius->getErrorMessage(), + $radius->getErrorCode() + )); + } + + $vendor = $resv['vendor']; + $attrv = $resv['attr']; + $datav = $resv['data']; + + if ($vendor !== $this->vendor || $attrv !== $this->vendorType) { + return $attributes; + } + + $attrib_name = strtok($datav, '='); + /** @psalm-suppress TooFewArguments */ + $attrib_value = strtok('='); + + // if the attribute name is already in result set, add another value + if (array_key_exists($attrib_name, $attributes)) { + $attributes[$attrib_name][] = $attrib_value; + } else { + $attributes[$attrib_name] = [$attrib_value]; + } + + return $attributes; + } +} diff --git a/.extlib/simplesamlphp/modules/sqlauth/LICENSE b/.extlib/simplesamlphp/modules/sqlauth/LICENSE new file mode 100644 index 000000000..a345e48d0 --- /dev/null +++ b/.extlib/simplesamlphp/modules/sqlauth/LICENSE @@ -0,0 +1,459 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + \ No newline at end of file diff --git a/.extlib/simplesamlphp/modules/sqlauth/README.md b/.extlib/simplesamlphp/modules/sqlauth/README.md new file mode 100644 index 000000000..ac31f5b01 --- /dev/null +++ b/.extlib/simplesamlphp/modules/sqlauth/README.md @@ -0,0 +1,9 @@ +# SimpleSAMLphp `sqlauth` module + +This is a authentication module for authenticating a user against a SQL database. See [the documentation](https://simplesamlphp.org/docs/contrib_modules/sqlauth/sql.html) for details of how to use this module. + +![Build Status](https://github.com/simplesamlphp/simplesamlphp-module-sqlauth/workflows/CI/badge.svg?branch=master) +[![Coverage Status](https://codecov.io/gh/simplesamlphp/simplesamlphp-module-sqlauth/branch/master/graph/badge.svg)](https://codecov.io/gh/simplesamlphp/simplesamlphp-module-sqlauth) +[![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/simplesamlphp/simplesamlphp-module-sqlauth/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/simplesamlphp/simplesamlphp-module-sqlauth/?branch=master) +[![Type Coverage](https://shepherd.dev/github/simplesamlphp/simplesamlphp-module-sqlauth/coverage.svg)](https://shepherd.dev/github/simplesamlphp/simplesamlphp-module-sqlauth) +[![Psalm Level](https://shepherd.dev/github/simplesamlphp/simplesamlphp-module-sqlauth/level.svg)](https://shepherd.dev/github/simplesamlphp/simplesamlphp-module-sqlauth) diff --git a/.extlib/simplesamlphp/modules/sqlauth/composer.json b/.extlib/simplesamlphp/modules/sqlauth/composer.json new file mode 100644 index 000000000..740222b7a --- /dev/null +++ b/.extlib/simplesamlphp/modules/sqlauth/composer.json @@ -0,0 +1,48 @@ +{ + "name": "simplesamlphp/simplesamlphp-module-sqlauth", + "description": "This is a authentication module for authenticating a user against a SQL database", + "type": "simplesamlphp-module", + "keywords": ["simplesamlphp", "sqlauth"], + "license": "LGPL-2.1-or-later", + "authors": [ + { + "name": "Olav Morken", + "email": "olavmrk@gmail.com" + } + ], + "config": { + "preferred-install": { + "simplesamlphp/simplesamlphp": "source", + "*": "dist" + }, + "allow-plugins": { + "composer/package-versions-deprecated": true, + "simplesamlphp/composer-module-installer": true, + "dealerdirect/phpcodesniffer-composer-installer": true + } + }, + "autoload": { + "psr-4": { + "SimpleSAML\\Module\\sqlauth\\": "src/" + } + }, + "autoload-dev": { + "psr-4": { + "SimpleSAML\\Test\\Utils\\": "vendor/simplesamlphp/simplesamlphp/tests/Utils" + } + }, + "require": { + "php": "^8.1", + "ext-pdo": "*", + "simplesamlphp/assert": "^1.1.0", + "simplesamlphp/composer-module-installer": "^1.3.4", + "simplesamlphp/simplesamlphp": "^2.2" + }, + "require-dev": { + "simplesamlphp/simplesamlphp-test-framework": "^1.6.0" + }, + "support": { + "issues": "https://github.com/simplesamlphp/simplesamlphp-module-sqlauth/issues", + "source": "https://github.com/simplesamlphp/simplesamlphp-module-sqlauth" + } +} diff --git a/.extlib/simplesamlphp/modules/sqlauth/docs/sql.md b/.extlib/simplesamlphp/modules/sqlauth/docs/sql.md new file mode 100644 index 000000000..3fc54ee1f --- /dev/null +++ b/.extlib/simplesamlphp/modules/sqlauth/docs/sql.md @@ -0,0 +1,243 @@ +`sqlauth:SQL` +============= + +These are authentication modules for authenticating a user against a +SQL database. + +The SQL module performs password verification in the database itself +using database functions such as sha512 and storing a salt in the +database. The PasswordVerify module verifies passwords in php using +the password_verify() function. The PasswordVerify module was created +to ask the least of the database either because there is minimal +support in the database or to allow the same code to work against many +databases without modification. More information on PasswordVerify is +provided at the end of this document. + +Options +------- + +`dsn` +: The DSN which should be used to connect to the database server. + Check the various database drivers in the [PHP documentation](http://php.net/manual/en/pdo.drivers.php) for a description of the various DSN formats. + +`username` +: The username which should be used when connecting to the database server. + +`password` +: The password which should be used when connecting to the database server. + +`query` +: The SQL query or queries which should be used to authenticate the user and retrieve their attributes. + +`username_regex` +: (Optional) A regular expression that the username must match. Useful if the type of the username column in the database isn't a string (eg. an integer), or if the format is well known (eg. email address, single word with no spaces, etc) to avoid going to the database for a query that will never result in successful authentication. + +`passwordhashcolumn` +: (Optional) Only When using the sqlauth:PasswordVerify module. This is the name of the column that contains the hashed password. The default is to look for a column 'passwordhash' in the database. + +Writing a Query / Queries +------------------------- + +A `query` can be either a single string with an SQL statement, or an array of queries, run in order. That single string (or the first query in the array) is the "authentication query" - the parameters `:username` and `:password` are available and should be evaluated by the query for authenticaion purposes. If the username/password is incorrect, the "authentication query" should return no rows. The rows returned represent attributes to be returned. + +Taking this example schema: + +```sql + CREATE TABLE users ( + uid VARCHAR(30) NOT NULL PRIMARY KEY, + password TEXT NOT NULL, + salt TEXT NOT NULL, + givenName TEXT NOT NULL, + email TEXT NOT NULL, + eduPersonPrincipalName TEXT NOT NULL + ); + CREATE TABLE usergroups ( + uid VARCHAR(30) NOT NULL REFERENCES users (uid) ON DELETE CASCADE ON UPDATE CASCADE, + groupname VARCHAR(30) NOT NULL, + UNIQUE(uid, groupname) + ); +``` + +a basic entry with a single SQL string in `authsources.php` might look like this (PostgreSQL, SHA512 of salt + password, base64 encoded with the salt stored in an independent column): + +```php + 'example-sql' => [ + 'sqlauth:SQL', + 'dsn' => 'pgsql:host=postgresql;port=5432;dbname=simplesaml', + 'username' => 'simplesaml', + 'password' => 'secretpassword', + 'query' => "select uid, givenName as \"givenName\", email from users where uid=:username and password=encode(sha512(concat((select salt from users where uid=1), :password)::bytea), 'base64')", + 'username_regex' => '/^[a-z]+$/', // Username will only be acceptable if it is a single lower case word + ], +``` + +It's worth repeating at this point that if authentication is unsuccessful (ie. the username / password pair don't match), this query **must** return zero rows. Assuming the username / password pair provided was a match, the name of the columns in result set will be used as attribute names. In the above case, PostgreSQL lowercases the names by default, which we correct with the "as" clause. The result might look like this: + +| Attribute Name | Attribute Value | +|----------------|-----------------| +| uid | [ bobsmith ] | +| givenName | [ Bob ] | +| email | [ bob@example.com ] | + +You'll likely need to collect attributes from more than just the table with the username and password hash. There are two supported ways to do this: table joins on your authentication query, or providing an array of queries for the `query` parameter instead of just the single query. + +A basic example of the single query with join: + +```php + 'example-sql' => [ + 'sqlauth:SQL', + 'dsn' => 'pgsql:host=postgresql;port=5432;dbname=simplesaml', + 'username' => 'simplesaml', + 'password' => 'secretpassword', + 'query' => "select u.uid, u.givenName as \"givenName\", ug.groupname as \"groupName\" from users u left join usergroups ug on (u.uid=ug.uid) where u.uid=:username and u.password=encode(sha512(concat((select salt from users where uid=1), :password)::bytea), 'base64')", + ], +``` + +which can also be written as: + +```php + 'example-sql' => [ + 'sqlauth:SQL', + 'dsn' => 'pgsql:host=postgresql;port=5432;dbname=simplesaml', + 'username' => 'simplesaml', + 'password' => 'secretpassword', + 'query' => [ + "select uid, givenName as \"givenName\", email from users where uid=:username and password=encode(sha512(concat((select salt from users where uid=1), :password)::bytea), 'base64')", + "select groupName as \"groupName\" from usergroups where uid=:username", + ], + "select u.uid, u.givenName, ug.groupname from users u left join usergroups ug on (u.uid=ug.uid) where u.uid=:username and u.password=encode(sha512(concat((select salt from users where uid=1), :password)::bytea), 'base64')", + ], +``` + +both of which will return attributes like: + +| Attribute Name | Attribute Value | +|----------------|-----------------| +| uid | [ bobsmith ] | +| givenName | [ Bob ] | +| email | [ bob@example.com ] | +| groupName | [ users, staff ] | + +For simple cases, the single query will suffice. As the number of tables you are joining to collate your attributes gets higher, then using the query list will make your configuration more maintainable. + +In summary: + +- If the single string query (or the first query if it's an array of queries) returns no rows, that indicates authentication failed. +- The single string query (or the first query if it's an array of queries) should use the passed `:username` and `:password` query parameters to do authentication. +- If more than one query is desirable or required to get all of the attributes, you can specify an array of queries. In this case, the result set of the second and subsequent queries in that array provide attributes only - only the first query is used to determine if the username/password is correct or not, and as such :password is only passed to the first query in the list. +- If `query` is an array of queries, because the second and subsequent queries have no role in authentication, these queries may return no rows, simply indicating that query should have no effect on the final returned attribute set. +- If any query returns multiple rows, they will be merged into the attributes. +- If multiple queries return the same column names, they will also be merged into the same attributes. +- Duplicate values and NULL values will be removed. + +Further Examples +---------------- + +```sql +Example query - SHA256 of salt + password, with the salt stored in an independent column, MySQL server: + + SELECT uid, givenName, email, eduPersonPrincipalName + FROM users + WHERE uid = :username + AND PASSWORD = SHA2( + CONCAT( + (SELECT salt FROM users WHERE uid = :username), + :password + ), + 256 + ) +``` + +Example query - SHA256 of salt + password, with the salt stored in an independent column. Multiple groups, MySQL server: + +```sql + SELECT users.uid, givenName, email, eduPersonPrincipalName, groupname AS groups + FROM users LEFT JOIN usergroups ON users.uid = usergroups.username + WHERE users.uid = :username + AND PASSWORD = SHA2( + CONCAT( + (SELECT salt FROM users WHERE uid = :username), + :password + ), + 256 + ) +``` + +Example query - SHA512 of salt + password, stored as salt (32 bytes) + sha256(salt + password) in password-field, PostgreSQL server: + +```sql + SELECT uid, givenName, email, eduPersonPrincipalName + FROM users + WHERE username = :username + AND SUBSTRING( + password FROM LENGTH(password) - 31 + ) = SHA2( + CONCAT( + SUBSTRING(password FROM 1 FOR LENGTH(password) - 32), + :password + ), + 512 + ) +``` + +Security considerations +----------------------- + +Please never store passwords in plaintext in a database. You should always hash your passwords with a secure one-way +function like the ones in the SHA2 family. Use randomly generated salts with a length at least equal to the hash of the +password itself. Salts should be per-password, that meaning every time a password changes, the salt must change, and +therefore salts must be stored in the database alongside the passwords they were used for. Application-wide salts can +be used (by just concatenating them to the input of the hash function), but should never replace per-password salts, +used instead as an additional security measure. + +One way hashing algorithms like MD5 or SHA1 are considered insecure and should therefore be avoided. + +The PasswordVerify module +------------------------- + +Users and passwords have to be set in the database by other means than the PasswordVerify module. + +For example: + +```sql + CREATE TABLE users ( + uid VARCHAR(30) NOT NULL PRIMARY KEY, + passwordhash TEXT NOT NULL, + givenName TEXT NOT NULL, + email TEXT NOT NULL, + eduPersonPrincipalName TEXT NOT NULL + ); +``` + +A user can be added with a known password "FIXMEPASSWORD" as shown below. + +```php +$dsn = "pgsql:host=..."; +$username = "fixme"; +$password = ""; +$options = array(); + +$query = "insert into users values ('test@example.com',:passwordhash, 'test', 'test@example.com', 'test@example.com' )"; + +$db = new PDO($dsn, $username, $password, $options); +$db->exec("SET NAMES 'UTF8'"); + +$params = ["passwordhash" => password_hash("FIXMEPASSWORD", PASSWORD_ARGON2ID ) ]; +$sth = $db->prepare($query); +$sth->execute($params); +``` + +Since the above is using the default passwordhash column name this can +then be used with the following addition to authsources.php. + +```php +'smalldb-dbauth' => [ + 'sqlauth:PasswordVerify', + 'dsn' => 'pgsql:host=...', + 'username' => 'dbuser', + 'password' => 'dbpassword', + 'passwodhashcolumn' => 'passwordhash', + 'query' => 'select uid, email, passwordhash, eduPersonPrincipalName from users where uid = :username ', +], + +``` diff --git a/.extlib/simplesamlphp/modules/sqlauth/src/Auth/Source/PasswordVerify.php b/.extlib/simplesamlphp/modules/sqlauth/src/Auth/Source/PasswordVerify.php new file mode 100644 index 000000000..ae338b3dd --- /dev/null +++ b/.extlib/simplesamlphp/modules/sqlauth/src/Auth/Source/PasswordVerify.php @@ -0,0 +1,180 @@ +passwordhashcolumn = $config['passwordhashcolumn']; + } + } + + + + /** + * Attempt to log in using the given username and password. + * + * On a successful login, this function should return the users attributes. On failure, + * it should throw an exception. If the error was caused by the user entering the wrong + * username or password, a \SimpleSAML\Error\Error('WRONGUSERPASS') should be thrown. + * + * Note that both the username and the password are UTF-8 encoded. + * + * @param string $username The username the user wrote. + * @param string $password The password the user wrote. + * @return array Associative array with the users attributes. + */ + protected function login(string $username, string $password): array + { + $this->verifyUserNameWithRegex($username); + + $db = $this->connect(); + $params = ['username' => $username]; + $attributes = []; + + $numQueries = count($this->query); + for ($x = 0; $x < $numQueries; $x++) { + $data = $this->executeQuery($db, $this->query[$x], $params); + + Logger::info('sqlauth:' . $this->authId . ': Got ' . count($data) . + ' rows from database'); + + /** + * Sanity check, passwordhash must be in each resulting tuple and must have + * the same value in every tuple. + * + * Note that $pwhash will contain the passwordhash value after this loop. + */ + $pwhash = null; + if ($x === 0) { + if (count($data) === 0) { + // No rows returned - invalid username/password + Logger::error(sprintf( + 'sqlauth:%s: No rows in result set. Probably wrong username/password.', + $this->authId, + )); + throw new Error\Error('WRONGUSERPASS'); + } + + foreach ($data as $row) { + if ( + !array_key_exists($this->passwordhashcolumn, $row) + || is_null($row[$this->passwordhashcolumn]) + ) { + Logger::error(sprintf( + 'sqlauth:%s: column `%s` must be in every result tuple.', + $this->authId, + $this->passwordhashcolumn, + )); + throw new Error\Error('WRONGUSERPASS'); + } + if ($pwhash) { + if ($pwhash != $row[$this->passwordhashcolumn]) { + Logger::error(sprintf( + 'sqlauth:%s: column %s must be THE SAME in every result tuple.', + $this->authId, + $this->passwordhashcolumn, + )); + throw new Error\Error('WRONGUSERPASS'); + } + } + $pwhash = $row[$this->passwordhashcolumn]; + } + + /** + * This should never happen as the count(data) test above would have already thrown. + * But checking twice doesn't hurt. + */ + if (is_null($pwhash)) { + if ($pwhash != $row[$this->passwordhashcolumn]) { + Logger::error(sprintf( + 'sqlauth:%s: column `%s` does not contain a password hash.', + $this->authId, + $this->passwordhashcolumn, + )); + throw new Error\Error('WRONGUSERPASS'); + } + } + + /** + * VERIFICATION! + * Now to check if the password the user supplied is actually valid + */ + if (!password_verify($password, $pwhash)) { + Logger::error(sprintf( + 'sqlauth:%s: password is incorrect.', + $this->authId, + )); + throw new Error\Error('WRONGUSERPASS'); + } + } + + $this->extractAttributes($attributes, $data, [$this->passwordhashcolumn]); + } + + Logger::info(sprintf( + 'sqlauth:%s: Attributes: %s', + $this->authId, + implode(',', array_keys($attributes)), + )); + + return $attributes; + } +} diff --git a/.extlib/simplesamlphp/modules/sqlauth/src/Auth/Source/SQL.php b/.extlib/simplesamlphp/modules/sqlauth/src/Auth/Source/SQL.php new file mode 100644 index 000000000..d65371563 --- /dev/null +++ b/.extlib/simplesamlphp/modules/sqlauth/src/Auth/Source/SQL.php @@ -0,0 +1,298 @@ +authId); + } + + if (!is_string($config[$param])) { + throw new Exception('Expected parameter \'' . $param . + '\' for authentication source ' . $this->authId . + ' to be a string. Instead it was: ' . + var_export($config[$param], true)); + } + } + + // Query can be a single query or an array of queries. + if (!array_key_exists('query', $config)) { + throw new Exception('Missing required attribute \'query\' ' . + 'for authentication source ' . $this->authId); + } elseif (is_array($config['query']) && (count($config['query']) < 1)) { + throw new Exception('Required attribute \'query\' is an empty ' . + 'list of queries for authentication source ' . $this->authId); + } + + $this->dsn = $config['dsn']; + $this->username = $config['username']; + $this->password = $config['password']; + $this->query = is_string($config['query']) ? [$config['query']] : $config['query']; + if (isset($config['options'])) { + $this->options = $config['options']; + } + + // Optional "username_regex" parameter + $this->username_regex = array_key_exists('username_regex', $config) ? $config['username_regex'] : null; + } + + + /** + * Create a database connection. + * + * @return \PDO The database connection. + */ + protected function connect(): PDO + { + try { + $db = new PDO($this->dsn, $this->username, $this->password, $this->options); + } catch (PDOException $e) { + // Obfuscate the password if it's part of the dsn + $obfuscated_dsn = preg_replace('/(user|password)=(.*?([;]|$))/', '${1}=***', $this->dsn); + + throw new Exception('sqlauth:' . $this->authId . ': - Failed to connect to \'' . + $obfuscated_dsn . '\': ' . $e->getMessage()); + } + + $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); + + $driver = explode(':', $this->dsn, 2); + $driver = strtolower($driver[0]); + + // Driver specific initialization + switch ($driver) { + case 'mysql': + // Use UTF-8 + $db->exec("SET NAMES 'utf8mb4'"); + break; + case 'pgsql': + // Use UTF-8 + $db->exec("SET NAMES 'UTF8'"); + break; + } + + return $db; + } + + /** + * Extract SQL columns into SAML attribute array + * + * @param $attributes output place to store extracted attributes + * @param array $data Associative array from database in the format of PDO fetchAll + * @param array $forbiddenAttributes An array of attributes to never return + * @return $attributes + */ + protected function extractAttributes(&$attributes, $data, $forbiddenAttributes = []) + { + foreach ($data as $row) { + foreach ($row as $name => $value) { + if ($value === null) { + continue; + } + if (in_array($name, $forbiddenAttributes)) { + continue; + } + + $value = (string) $value; + + if (!array_key_exists($name, $attributes)) { + $attributes[$name] = []; + } + + if (in_array($value, $attributes[$name], true)) { + // Value already exists in attribute + continue; + } + + $attributes[$name][] = $value; + } + } + return $attributes; + } + + /** + * Execute the query with given parameters and return the tuples that result. + * + * @param string $query SQL to execute + * @param array $params parameters to the SQL query + * @return tuples that result + */ + protected function executeQuery(PDO $db, string $query, array $params): array + { + try { + $sth = $db->prepare($query); + } catch (PDOException $e) { + throw new Exception('sqlauth:' . $this->authId . + ': - Failed to prepare query: ' . $e->getMessage()); + } + + try { + $sth->execute($params); + } catch (PDOException $e) { + throw new Exception('sqlauth:' . $this->authId . + ': - Failed to execute query: ' . $e->getMessage()); + } + + try { + $data = $sth->fetchAll(PDO::FETCH_ASSOC); + return $data; + } catch (PDOException $e) { + throw new Exception('sqlauth:' . $this->authId . + ': - Failed to fetch result set: ' . $e->getMessage()); + } + } + + /** + * If there is a username_regex then verify the passed username against it and + * throw an exception if it fails. + * + * @param string $username The username the user wrote. + */ + protected function verifyUserNameWithRegex(string $username): void + { + if ($this->username_regex !== null) { + if (!preg_match($this->username_regex, $username)) { + Logger::error('sqlauth:' . $this->authId . + ": Username doesn't match username_regex."); + throw new Error\Error('WRONGUSERPASS'); + } + } + } + + /** + * Attempt to log in using the given username and password. + * + * On a successful login, this function should return the users attributes. On failure, + * it should throw an exception. If the error was caused by the user entering the wrong + * username or password, a \SimpleSAML\Error\Error('WRONGUSERPASS') should be thrown. + * + * Note that both the username and the password are UTF-8 encoded. + * + * @param string $username The username the user wrote. + * @param string $password The password the user wrote. + * @return array Associative array with the users attributes. + */ + protected function login( + string $username, + #[\SensitiveParameter] + string $password, + ): array { + $this->verifyUserNameWithRegex($username); + + $db = $this->connect(); + $params = ['username' => $username, 'password' => $password]; + $attributes = []; + + $numQueries = count($this->query); + for ($x = 0; $x < $numQueries; $x++) { + $data = $this->executeQuery($db, $this->query[$x], $params); + + Logger::info('sqlauth:' . $this->authId . ': Got ' . count($data) . + ' rows from database'); + + if ($x === 0) { + if (count($data) === 0) { + // No rows returned from first query - invalid username/password + Logger::error('sqlauth:' . $this->authId . + ': No rows in result set. Probably wrong username/password.'); + throw new Error\Error('WRONGUSERPASS'); + } + /* Only the first query should be passed the password, as that is the only + * one used for authentication. Subsequent queries are only used for + * getting attribute lists, so only need the username. */ + unset($params['password']); + } + + /* Extract attributes. We allow the resultset to consist of multiple rows. Attributes + * which are present in more than one row will become multivalued. null values and + * duplicate values will be skipped. All values will be converted to strings. + */ + $this->extractAttributes($attributes, $data, []); + } + + Logger::info('sqlauth:' . $this->authId . ': Attributes: ' . implode(',', array_keys($attributes))); + + return $attributes; + } +} diff --git a/.extlib/simplesamlphp/modules/statistics/LICENSE b/.extlib/simplesamlphp/modules/statistics/LICENSE new file mode 100644 index 000000000..a345e48d0 --- /dev/null +++ b/.extlib/simplesamlphp/modules/statistics/LICENSE @@ -0,0 +1,459 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + \ No newline at end of file diff --git a/.extlib/simplesamlphp/modules/statistics/README.md b/.extlib/simplesamlphp/modules/statistics/README.md new file mode 100644 index 000000000..4c7592666 --- /dev/null +++ b/.extlib/simplesamlphp/modules/statistics/README.md @@ -0,0 +1,25 @@ +# Statistics module + +![Build Status](https://github.com/simplesamlphp/simplesamlphp-module-statistics/workflows/CI/badge.svg?branch=master) +[![Coverage Status](https://codecov.io/gh/simplesamlphp/simplesamlphp-module-statistics/branch/master/graph/badge.svg)](https://codecov.io/gh/simplesamlphp/simplesamlphp-module-statistics) +[![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/simplesamlphp/simplesamlphp-module-statistics/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/simplesamlphp/simplesamlphp-module-statistics/?branch=master) +[![Type Coverage](https://shepherd.dev/github/simplesamlphp/simplesamlphp-module-statistics/coverage.svg)](https://shepherd.dev/github/simplesamlphp/simplesamlphp-module-statistics) +[![Psalm Level](https://shepherd.dev/github/simplesamlphp/simplesamlphp-module-statistics/level.svg)](https://shepherd.dev/github/simplesamlphp/simplesamlphp-module-statistics) + +## Install + +Install with composer + +```bash +vendor/bin/composer require simplesamlphp/simplesamlphp-module-statistics +``` + +## Configuration + +Next thing you need to do is to enable the module: + +in `config.php`, search for the `module.enable` key and set `statistics` to true: + +```php +'module.enable' => [ 'statistics' => true, … ], +``` diff --git a/.extlib/simplesamlphp/modules/statistics/bin/loganalyzer.php b/.extlib/simplesamlphp/modules/statistics/bin/loganalyzer.php new file mode 100644 index 000000000..6421c23f8 --- /dev/null +++ b/.extlib/simplesamlphp/modules/statistics/bin/loganalyzer.php @@ -0,0 +1,91 @@ +#!/usr/bin/env php +getConfigDir(); +\SimpleSAML\Configuration::setConfigDir($configdir); +$timeUtils->initTimezone(); + +$progName = array_shift($argv); +$debug = false; +$dryrun = false; + +foreach ($argv as $a) { + if (strlen($a) === 0) { + continue; + } + if (strpos($a, '=') !== false) { + $p = strpos($a, '='); + $v = substr($a, $p + 1); + $a = substr($a, 0, $p); + } else { + $v = null; + } + + // Map short options to long options. + $shortOptMap = ['-d' => '--debug']; + if (array_key_exists($a, $shortOptMap)) { + $a = $shortOptMap[$a]; + } + switch ($a) { + case '--help': + printHelp(); + exit(0); + case '--debug': + $debug = true; + break; + case '--dry-run': + $dryrun = true; + break; + default: + echo 'Unknown option: ' . $a . "\n"; + echo 'Please run `' . $progName . ' --help` for usage information.' . "\n"; + exit(1); + } +} + +$aggregator = new \SimpleSAML\Module\statistics\Aggregator(true); +$aggregator->dumpConfig(); +$aggregator->debugInfo(); +$results = $aggregator->aggregate($debug); +$aggregator->debugInfo(); + +if (!$dryrun) { + $aggregator->store($results); +} + +foreach ($results as $slot => $val) { + foreach ($val as $sp => $no) { + echo $sp . " " . count($no) . " - "; + } + echo "\n"; +} + + +/** + * This function prints the help output. + */ +function printHelp(): void +{ + global $progName; + + echo <<getConfigDir(); +\SimpleSAML\Configuration::setConfigDir($configdir); + +$progName = array_shift($argv); +$debug = false; +$dryrun = false; +$output = '/tmp/simplesamlphp-new.log'; +$infile = null; + +foreach ($argv as $a) { + if (strlen($a) === 0) { + continue; + } + if (strpos($a, '=') !== false) { + $p = strpos($a, '='); + $v = substr($a, $p + 1); + $a = substr($a, 0, $p); + } else { + $v = null; + } + + // Map short options to long options. + $shortOptMap = ['-d' => '--debug']; + if (array_key_exists($a, $shortOptMap)) { + $a = $shortOptMap[$a]; + } + + switch ($a) { + case '--help': + printHelp(); + exit(0); + case '--debug': + $debug = true; + break; + case '--dry-run': + $dryrun = true; + break; + case '--infile': + $infile = $v; + break; + case '--outfile': + $output = $v; + break; + default: + echo 'Unknown option: ' . $a . "\n"; + echo 'Please run `' . $progName . ' --help` for usage information.' . "\n"; + exit(1); + } +} + +$cleaner = new \SimpleSAML\Module\statistics\LogCleaner($infile); +$cleaner->dumpConfig(); +$todelete = $cleaner->clean($debug); + +echo "Cleaning these trackIDs: " . join(', ', $todelete) . "\n"; + +if (!$dryrun) { + $cleaner->store($todelete, $output); +} + +/** + * This function prints the help output. + */ +function printHelp(): void +{ + global $progName; + + echo << false, + + // The authentication source that should be used. + 'auth' => 'admin', + + // Alternative 1: List of allowed users. + //'useridattr' => 'eduPersonPrincipalName', + //'allowedUsers' => array('andreas@uninett.no', 'ola.normann@sp.example.org'), + + // Alternative 2: External ACL list. + //'acl' => 'adminlist', + + 'default' => 'sso', + + 'statdir' => '/tmp/stats/', + 'inputfile' => '/var/log/simplesamlphp.stat', + 'offset' => 60 * 60 * 2 + 60 * 60 * 24 * 3, // Two hours offset to match epoch and norwegian winter time. + + 'datestart' => 1, + 'datelength' => 15, + 'offsetspan' => 21, + + // Dimensions on graph from Google Charts in pixels... + 'dimension.x' => 800, + 'dimension.y' => 350, + + /* + * Do you want to generate statistics using the cron module? If so, specify which cron tag to use. + * Examples: daily, weekly + * To not run statistics in cron, set value to + * 'cron_tag' => null, + */ + 'cron_tag' => 'daily', + + /* + * Set max running time for this script. This is also controlled by max_execution_time in php.ini + * and is set to 30 sec by default. Your web server can have other timeout configurations that may + * also interrupt PHP execution. Apache has a Timeout directive and IIS has a + * CGI timeout function. Both default to 300 seconds. + */ + 'time_limit' => 300, + + 'timeres' => [ + 'day' => [ + 'name' => 'Day', + 'slot' => 60 * 15, // Slots of 15 minutes + 'fileslot' => 60 * 60 * 24, // One day (24 hours) file slots + 'axislabelint' => 6 * 4, // Number of slots per label. 4 per hour *6 = 6 hours + 'dateformat-period' => 'j. M', // 4. Mars + 'dateformat-intra' => 'j. M H:i', // 4. Mars 12:30 + ], + 'week' => [ + 'name' => 'Week', + 'slot' => 60 * 60, // Slots of one hour + 'fileslot' => 60 * 60 * 24 * 7, // 7 days of data in each file + 'axislabelint' => 24, // Number of slots per label. 24 is one each day + 'dateformat-period' => 'j. M', // 4. Mars + 'dateformat-intra' => 'j. M H:i', // 4. Mars 12:30 + ], + 'month' => [ + 'name' => 'Month', + 'slot' => 60 * 60 * 24, // Slots of one day + 'fileslot' => 60 * 60 * 24 * 30, // 30 days of data in each file + 'axislabelint' => 7, // Number of slots per label. 7 days => 1 week + 'dateformat-period' => 'j. M Y H:i', // 4. Mars 12:30 + 'dateformat-intra' => 'j. M', // 4. Mars + ], + 'monthaligned' => [ + 'name' => 'AlignedMonth', + 'slot' => 60 * 60 * 24, // Slots of one day + 'fileslot' => null, // 30 days of data in each file + 'customDateHandler' => 'month', + 'axislabelint' => 7, // Number of slots per label. 7 days => 1 week + 'dateformat-period' => 'j. M Y H:i', // 4. Mars 12:30 + 'dateformat-intra' => 'j. M', // 4. Mars + ], + 'days180' => [ + 'name' => '180 days', + 'slot' => 60 * 60 * 24, // Slots of 1 day (24 hours) + 'fileslot' => 60 * 60 * 24 * 180, // 80 days of data in each file + 'axislabelint' => 30, // Number of slots per label. 7 days => 1 week + 'dateformat-period' => 'j. M', // 4. Mars + 'dateformat-intra' => 'j. M', // 4. Mars + ], + ], + + 'statrules' => [ + 'sloratio' => [ + 'name' => 'SLO to SSO ratio', + 'descr' => 'Comparison of the number of Single Log-Out compared to Single Sign-On.' . + ' Graph shows how many logouts where initiated for each Single Sign-On.', + 'type' => 'calculated', + 'presenter' => 'statistics:Ratio', + 'ref' => ['slo', 'sso'], + 'fieldPresentation' => [ + 'class' => 'statistics:Entity', + 'config' => 'saml20-sp-remote', + ], + ], + 'ssomulti' => [ + 'name' => 'Requests per session', + 'descr' => 'Number of SSO request pairs exchanged between IdP and SP within the same IdP session.' . + ' A high number indicates that the session at the SP is timing out faster than at the IdP.', + 'type' => 'calculated', + 'presenter' => 'statistics:Ratio', + 'ref' => ['sso', 'ssofirst'], + 'fieldPresentation' => [ + 'class' => 'statistics:Entity', + 'config' => 'saml20-sp-remote', + ], + ], + 'sso' => [ + 'name' => 'SSO to service', + 'descr' => 'The number of logins at a Service Provider.', + 'action' => 'saml20-idp-SSO', + 'col' => 6, // Service Provider EntityID + 'fieldPresentation' => [ + 'class' => 'statistics:Entity', + 'config' => 'saml20-sp-remote', + ], + ], + 'ssofirst' => [ + 'name' => 'SSO-first to service', + 'descr' => 'The number of logins at a Service Provider.', + 'action' => 'saml20-idp-SSO-first', + 'col' => 6, // Service Provider EntityID + 'fieldPresentation' => [ + 'class' => 'statistics:Entity', + 'config' => 'saml20-sp-remote', + ], + ], + 'slo' => [ + 'name' => 'SLO initiated from service', + 'descr' => 'The number of initiated Single Logout from each of the service providers.', + 'action' => 'saml20-idp-SLO', + 'col' => 7, // Service Provider EntityID that initiated the logout. + 'fieldPresentation' => [ + 'class' => 'statistics:Entity', + 'config' => 'saml20-sp-remote', + ], + ], + 'consent' => [ + 'name' => 'Consent', + 'descr' => 'Consent statistics. Every time a user logs in to a service an entry is logged for' . + ' one of three states: consent was found, consent was not found or consent storage was not available.', + 'action' => 'consent', + 'col' => 6, + 'fieldPresentation' => [ + 'class' => 'statistics:Entity', + 'config' => 'saml20-sp-remote', + ], + ], + 'consentresponse' => [ + 'name' => 'Consent response', + 'descr' => 'Consent response statistics. Every time a user accepts consent,' . + ' it is logged whether the user selected to remember the consent to next time.', + 'action' => 'consentResponse', + 'col' => 6, + 'fieldPresentation' => [ + 'class' => 'statistics:Entity', + 'config' => 'saml20-sp-remote', + ], + ], + 'slopages' => [ + 'name' => 'SLO iframe pages', + 'descr' => 'The varioust IFrame SLO pages a user visits', + 'action' => 'slo-iframe', + 'col' => 6, // Page the user visits. + ], + 'slofail' => [ + 'name' => 'Failed iframe IdP-init SLOs', + 'descr' => 'The number of logout failures from various SPs', + 'action' => 'slo-iframe-fail', + 'col' => 6, // Service Provider EntityID that wasn't logged out. + 'fieldPresentation' => [ + 'class' => 'statistics:Entity', + 'config' => 'saml20-sp-remote', + ], + ], + ], +]; diff --git a/.extlib/simplesamlphp/modules/statistics/docs/authproc_statisticswithattribute.md b/.extlib/simplesamlphp/modules/statistics/docs/authproc_statisticswithattribute.md new file mode 100644 index 000000000..c22aba30d --- /dev/null +++ b/.extlib/simplesamlphp/modules/statistics/docs/authproc_statisticswithattribute.md @@ -0,0 +1,27 @@ +`statistics:StatisticsWithAttribute` +============================== + +This filter logs a statistics entry that can be parsed by the statistics module. + +Parameters +---------- + +`attributename` +: The name of an attribute that should be included in the statistics entry. + +`type` +: The type of the statistics entry. + +`skipPassive` +: A boolean indicating whether passive requests should be skipped. Defaults to `false`, in which case the type tag is prefixed with 'passive-'. + +Example +------- + +Log the realm of the user: + + 45 => [ + 'class' => 'statistics:StatisticsWithAttribute', + 'attributename' => 'realm', + 'type' => 'saml20-idp-SSO', + ], diff --git a/.extlib/simplesamlphp/modules/statistics/docs/statistics.md b/.extlib/simplesamlphp/modules/statistics/docs/statistics.md new file mode 100644 index 000000000..1fd08e6a3 --- /dev/null +++ b/.extlib/simplesamlphp/modules/statistics/docs/statistics.md @@ -0,0 +1,217 @@ +# The SimpleSAMLphp statistics module + +## Configure your logs + +It's recommended to use syslog for logging, then a separate log level is +dedicated to statistics. You need to get all statistics log entries +in one log file. Here is how I do it in syslog.conf: + +```bash +# SimpleSAMLphp logging +local5.* /var/log/simplesamlphp.log +# Notice level is reserved for statistics only... +local5.=notice /var/log/simplesamlphp.stat +``` + +Then make sure you have configured this correctly such that you +have one log file like this: + +```bash +# ls -la /var/log/simplesamlphp.stat +-rw-r--r-- 1 root root 76740 Nov 15 13:37 /var/log/simplesamlphp.stat +``` + +With content that looks like this: + +```bash +# tail /var/log/simplesamlphp.stat + +Nov 15 12:01:49 www1 simplesamlphp-foodle[31960]: 5 STAT [77013b4b6e] saml20-sp-SSO urn:mace:feide.no:services:no.feide.foodle sam.feide.no andreas@uninett.no + +Nov 15 13:01:14 www1 simplesamlphp-openwiki[2247]: 5 STAT [50292b9d04] saml20-sp-SSO urn:mace:feide.no:services:no.feide.openwikicore sam.feide.no NA + +Nov 15 13:16:39 www1 simplesamlphp-openwiki[2125]: 5 STAT [3493d5d87f] saml20-sp-SSO urn:mace:feide.no:services:no.feide.openwikicore sam.feide.no NA + +Nov 15 13:37:27 www1 simplesamlphp-foodle[3146]: 5 STAT [77013b4b6e] AUTH-login-admin OK +``` + +Here you can see that I collect statistics in one file for several +installations. You could easily separate each instance of SimpleSAMLphp +into separate files (your preference). + +## Configure the statistics module + +First enable the statistics module, as you enable any other module: in +`config.php`, search for the `module.enable` key and set `statistics` to true: + +```php +'module.enable' => [ + 'statistics' => true, + … +], +``` + +Then take the configuration template: + +```bash +cp modules/statistics/config-templates/*.php config/ +``` + +Make sure the `simplesamlphp.stat` file is readable. SimpleSAMLphp will read data from it: + +```php +'inputfile' => '/var/log/simplesamlphp.stat', +``` + +Make sure the `stats` dir is writable. SimpleSAMLphp will write data here: + +```php +'statdir' => '/var/lib/simplesamlphp/stats/', +``` + +## Configuring the syntax of the logfile + +Syslog uses different date formats on different environments, so you need to do +some manual tweaking to make sure that SimpleSAMLphp knows how to interpret the +logs. + +There are three parameter values you need to make sure are correct. + +```php +'datestart' => 1, +'datelength' => 15, +'offsetspan' => 21, +``` + +The first `datestart` is 1 when the date starts from the beginning of the line. +The `datelength` parameter tells how many characters long the date is. + +The `offsetspan` parameter shows on which character the first column starts, +such that the STAT keyword becomes column number 3. + +Use the `loganalyzer` script with the `--debug` parameter to debug whether your +configuration is correct. If not, then it easy to see what is wrong, for +example if the STAT keyword is not in column 3. + +NOTE: when using `--debug`, no output is being written to disk! + +Here is some example output: + +```bash +bash $ cd modules/statistics/bin + +$ ./loganalyzer.php --debug + +Statistics directory : /var/lib/simplesamlphp/stats/ + +Input file : /Users/andreas/Desktop/simplesamlphp.log + +Offset : 4237200 + +---------------------------------------- + +Log line: Feb 11 11:32:57 moria-app1 syslog_moria-app1[6630]: 5 STAT [2d41ee3f1e] AUTH-login-admin Failed + +Date parse [Feb 11 11:32:57] to [Wed, 11 Feb 09 11:32:57 +0100] +``` + +```php +Array +( + [0] => moria-app1 + [1] => syslog_moria-app1[6630]: + [2] => 5 + [3] => STAT + [4] => [2d41ee3f1e] + [5] => AUTH-login-admin + [6] => Failed +) +``` + +In the debug output, please verify four things: + + 1. That the first field in the date parse line contains all the characters + that are part of the timestamp, compared with the log line on the line + above. + 2. Verify that the second field in the date parse line is correct: + corresponding to the input timestamp. + 3. That the first `[0]` field contains all the characters from the + first column. + 4. That column `[3]` is STAT. + +### Setup cron + +You also should setup the cron module: + +```php +'module.enable' => [ + 'cron' => true, + … +], +``` + +Then take the configuration template: + +```bash +cp modules/cron/config-templates/*.php config/ +``` + +Then configure the `cron` module. + +Replace, at least, the value `secret` with your secret value into the `module_cron.php` config file: + +```php +$config = [ + 'key' => 'secret', + 'allowed_tags' => ['daily', 'hourly', 'frequent'], + 'debug_message' => true, + 'sendemail' => true, +]; +``` + +### Alternative to using the cron module + +As an alternative to using the cron module you can run the +script `statistics/bin/loganalyzer.php` manually. + +## Presentation of the statistics + +At the Installation page there will be a link "show statistics", go there and +if SimpleSAMLphp finds the statistics files in the `statdir` generated from +cron or the script you will see statistics. Enjoy. + +## Security + +This module relies on displaying images from Google's APIs. Make sure to add +`chart.apis.google.com` to the `img-src` Content-Security-Policy header. + +## Error Handling + +If the execution of the script `loganalyzer.php` generates the error: + +```bash +# php loganalyzer.php --debug +PHP Fatal error: Uncaught SimpleSAML\Error\CriticalConfigurationError: The configuration (config/config.php) is invalid: Missing configuration file +``` + +It means that the script doesn't find the `config.php` under the main SimpleSAMLphp directory. + +(Probably you've installed SimpleSAMLphp as a composer dependency) + +The problem can be solved easily by setting the following environment variable to the right path of `config/` dir: + +```bash +export SIMPLESAMLPHP_CONFIG_DIR=/var/simplesamlphp/config/ +``` + +### Support + +If you need help to make this work, or want to discuss SimpleSAMLphp with other +users of the software, you are fortunate: Around SimpleSAMLphp there is a great +Open source community, and you are welcome to join! The forums are open for you +to ask questions, contribute answers other further questions, request +improvements or contribute with code or plugins of your own. + +- [SimpleSAMLphp homepage](http://simplesamlphp.org) +- [List of all available SimpleSAMLphp documentation](http://simplesamlphp.org/docs/stable/) +- [Join the SimpleSAMLphp user's mailing list](http://simplesamlphp.org/lists) diff --git a/.extlib/simplesamlphp/modules/statistics/hooks/hook_configpage.php b/.extlib/simplesamlphp/modules/statistics/hooks/hook_configpage.php new file mode 100644 index 000000000..e6178b7d6 --- /dev/null +++ b/.extlib/simplesamlphp/modules/statistics/hooks/hook_configpage.php @@ -0,0 +1,27 @@ +data['links'][] = [ + 'href' => Module::getModuleURL('statistics/'), + 'text' => Translate::noop('Show statistics'), + ]; + + $template->data['links'][] = [ + 'href' => Module::getModuleURL('statistics/metadata'), + 'text' => Translate::noop('Show statistics metadata'), + ]; + + $template->getLocalization()->addModuleDomain('statistics'); +} diff --git a/.extlib/simplesamlphp/modules/statistics/hooks/hook_cron.php b/.extlib/simplesamlphp/modules/statistics/hooks/hook_cron.php new file mode 100644 index 000000000..0e3c68ee3 --- /dev/null +++ b/.extlib/simplesamlphp/modules/statistics/hooks/hook_cron.php @@ -0,0 +1,48 @@ +getOptionalValue('cron_tag', null))) { + return; + } + if ($statconfig->getOptionalValue('cron_tag', null) !== $croninfo['tag']) { + return; + } + + $maxtime = $statconfig->getOptionalInteger('time_limit', null); + if ($maxtime) { + set_time_limit($maxtime); + } + + try { + $aggregator = new Aggregator(); + $results = $aggregator->aggregate(); + if (empty($results)) { + Logger::notice('Output from statistics aggregator was empty.'); + } else { + $aggregator->store($results); + } + } catch (Exception $e) { + $message = 'Loganalyzer threw exception: ' . $e->getMessage(); + Logger::warning($message); + $croninfo['summary'][] = $message; + } +} diff --git a/.extlib/simplesamlphp/modules/statistics/hooks/hook_sanitycheck.php b/.extlib/simplesamlphp/modules/statistics/hooks/hook_sanitycheck.php new file mode 100644 index 000000000..d74d4d59a --- /dev/null +++ b/.extlib/simplesamlphp/modules/statistics/hooks/hook_sanitycheck.php @@ -0,0 +1,44 @@ +getMessage(); + return; + } + + $statdir = $statconfig->getValue('statdir'); + $inputfile = $statconfig->getValue('inputfile'); + + if (file_exists($statdir)) { + $hookinfo['info'][] = '[statistics] Statistics dir [' . $statdir . '] exists'; + if (is_writable($statdir)) { + $hookinfo['info'][] = '[statistics] Statistics dir [' . $statdir . '] is writable'; + } else { + $hookinfo['errors'][] = '[statistics] Statistics dir [' . $statdir . '] is not writable'; + } + } else { + $hookinfo['errors'][] = '[statistics] Statistics dir [' . $statdir . '] does not exist'; + } + + if (file_exists($inputfile)) { + $hookinfo['info'][] = '[statistics] Input file [' . $inputfile . '] exists'; + } else { + $hookinfo['errors'][] = '[statistics] Input file [' . $inputfile . '] does not exist'; + } +} diff --git a/.extlib/simplesamlphp/modules/statistics/locales/en/LC_MESSAGES/statistics.po b/.extlib/simplesamlphp/modules/statistics/locales/en/LC_MESSAGES/statistics.po new file mode 100644 index 000000000..6ef3d4f30 --- /dev/null +++ b/.extlib/simplesamlphp/modules/statistics/locales/en/LC_MESSAGES/statistics.po @@ -0,0 +1,5 @@ +msgid "Show statistics" +msgstr "Show statistics" + +msgid "Show statistics metadata" +msgstr "Show statistics metadata" diff --git a/.extlib/simplesamlphp/modules/statistics/locales/es/LC_MESSAGES/statistics.po b/.extlib/simplesamlphp/modules/statistics/locales/es/LC_MESSAGES/statistics.po new file mode 100644 index 000000000..7b8908c3f --- /dev/null +++ b/.extlib/simplesamlphp/modules/statistics/locales/es/LC_MESSAGES/statistics.po @@ -0,0 +1,5 @@ +msgid "Show statistics" +msgstr "Mostrar estadísticas" + +msgid "Show statistics metadata" +msgstr "Mostrar metadatos de las estadísticas" diff --git a/.extlib/simplesamlphp/modules/statistics/locales/nb/LC_MESSAGES/statistics.po b/.extlib/simplesamlphp/modules/statistics/locales/nb/LC_MESSAGES/statistics.po new file mode 100644 index 000000000..900d2106a --- /dev/null +++ b/.extlib/simplesamlphp/modules/statistics/locales/nb/LC_MESSAGES/statistics.po @@ -0,0 +1,5 @@ +msgid "Show statistics" +msgstr "Vis statistikker" + +msgid "Show statistics metadata" +msgstr "Vis metadata om statistikker" diff --git a/.extlib/simplesamlphp/modules/statistics/locales/nn/LC_MESSAGES/statistics.po b/.extlib/simplesamlphp/modules/statistics/locales/nn/LC_MESSAGES/statistics.po new file mode 100644 index 000000000..c33df927d --- /dev/null +++ b/.extlib/simplesamlphp/modules/statistics/locales/nn/LC_MESSAGES/statistics.po @@ -0,0 +1,5 @@ +msgid "Show statistics" +msgstr "Vis statistikkar" + +msgid "Show statistics metadata" +msgstr "Vis metadata om statistikkar" diff --git a/.extlib/simplesamlphp/modules/statistics/public/assets/css/statistics.css b/.extlib/simplesamlphp/modules/statistics/public/assets/css/statistics.css new file mode 100644 index 000000000..68c82bd33 --- /dev/null +++ b/.extlib/simplesamlphp/modules/statistics/public/assets/css/statistics.css @@ -0,0 +1,135 @@ +@media all { + div#content { + margin: 0.4em !important; + } + + .tableview { + border-collapse: collapse; + border: 1px solid #ccc; + margin: 1em; + width: 80%; + } + + .tableview th, + .tableview td { + border: 1px solid #ccc; + padding: 0 5px; + } + + table.timeseries tr.odd td { + background-color: #f4f4f4; + } + + .tableview tr.total td { + color: #500; + font-weight: bold; + } + + .tableview tr.even td { + background: #f5f5f5; + border-top: 1px solid #e0e0e0; + border-bottom: 1px solid #e0e0e0; + } + + .tableview th { + background: #e5e5e5; + } + + .tableview th.value, + .tableview td.value { + text-align: right; + } + + table.timeseries td { + padding-right: 2em; + border: 1px solid #ccc; + } + + td.datacontent { + text-align: right; + } + + table.selecttime { + width: 100%; + border: 1px solid #ccc; + background: #eee; + margin: 1px 0; + padding: 0; + } + + td.selecttime-icon { + width: 50px; + padding: 0; + } + + td.selecttime-icon img { + margin: 0; + } + + td.selecttime-link-grey { + color: #ccc; + } + + td.td-right { + text-align: right; + } + + td.td-next-right { + padding-right: 4px; + } + + td.td-left { + text-align: left; + } + + p.p-right { + text-align: right; + } + + form { + display: inline; + } + + table#statmeta { + width: 100%; + } + + ul.tabset-tabs { + margin: 0; + padding: 0; + list-style: none; + } + + ul.tabset-tabs li { + background: none; + color: #222; + display: inline-block; + padding: 10px 15px; + cursor: pointer; + } + + ul.tabset-tabs li.current { + background: #ededed; + color: #222; + } + + .tabset-content { + display: none; + background: #ededed; + padding: 15px; + } + + .tabset-content.current { + display: inherit; + } + + #graph img { + max-width: 77%; + height: auto; + } + + #table img { + max-width: 77%; + height: auto; + } +} diff --git a/.extlib/simplesamlphp/modules/statistics/public/assets/css/ui-theme-1.13.2/images/ui-bg_glass_55_fbf9ee_1x400.png b/.extlib/simplesamlphp/modules/statistics/public/assets/css/ui-theme-1.13.2/images/ui-bg_glass_55_fbf9ee_1x400.png new file mode 100644 index 0000000000000000000000000000000000000000..d1a47ab50141f22e0436bda1d605f63ba597ff29 GIT binary patch literal 445 zcmeAS@N?(olHy`uVBq!ia0vp^j6gI&fCzz`*b-fq}tl1_Oh5!JJ)zHb4osByV?@|6srw@%;`^ zguTSm*OmPlJD-R#$NrV_n}9;So-U3d9>?FFSL9-H6lr)^KQBojr@3RpVm3z!!)lJ# zVXGqzGVlJbU_RJf(JETj{aE_oBT<*b-tj*!`|o?X%#xcyqAgM4KHJqPuV&q;{q`>I z1B+MUiJr9vN$<*>9G|F&=-dsQv0;%?yot%j%P074w*(g^i@m9I-Mh{614}p;vrV?+ ziwpm|GY=c|$bVw9NmL2$cvGndbeL+1YeY#(Vo9o1a#1RfVlXl=GSW3L*EKW=F*2|+ zHMBCY&^9ozGB7AFeCLg#AvZrIGp!Q01~#3r??4S2a2rZ8b5n~;5_1c1>j|_h*8u8a N@O1TaS?83{1OT1Qk`Vv^ literal 0 HcmV?d00001 diff --git a/.extlib/simplesamlphp/modules/statistics/public/assets/css/ui-theme-1.13.2/images/ui-bg_glass_65_ffffff_1x400.png b/.extlib/simplesamlphp/modules/statistics/public/assets/css/ui-theme-1.13.2/images/ui-bg_glass_65_ffffff_1x400.png new file mode 100644 index 0000000000000000000000000000000000000000..32e6d9fc55127b7674bf00ad0967167090faf956 GIT binary patch literal 317 zcmeAS@N?(olHy`uVBq!ia0vp^j6gI2NH8$CE1Q=ADVB6cUq=Rpjs4tz5?O(Kg=CK) zUj~LMH3o);76yi2K%s^g3=E|P3=FRl7#OT(FffQ0%-I!a1C(G&@^*J&V7%KUyadQ& zFY)wsWq-!bCt}R8f2I5;ppc-ai(`n!`Q(fQiPpshB99svre>UAylk>D6DX-#;u=ws zl30>zm0Xkxq!^40jEr;*%ykV-LW~ToObx9JEVK;_tPBjw3*UL8Xvob^$xN%nt$|G^ m>^o3{2Hb{{%-q!ClEmBs+Nn{1`6_P!I zd>I(3)EF2VS{N990fib~Fff!FFfhDIU|_JC!N4G1FlSew4N!t9$=luK|9_FyhG&61 z_7YEDSN3P@d?Lmi`&Y_u0t$J1x;TbdoKCLzHNUelQKVN%Yw`N+l6lpJhW`?iMADN? z5_kM>@6>F6c#&OgSy|iie#v>i4Gq~03}+b_{!2@WIe0|D_yeDut1}}bgUmZ&g?PLC zdZ4kYC9V-ADTyViR>?)FK#IZ0z{p6~z+BhRB*e(T%GA)xz(U)=z{Nn{1`6_P!I zd>I(3)EF2VS{N990fib~Fff!FFfhDIU|_JC!N4G1FlSew4N!t9$=luK|9_FyhG&61 z_7YEDSN3P@d?Lmi`&Y_u0t)$fx;TbdoKCKoe*DM*gDyA0Qo+NU(|OMKO3b^Tm~`j# zk&4F7kJ`eI&DGra)ZF~kj^+FG#LtwFH?B!ZONu!9!LzT^vEqQNO;;NW6T=k)A**{I z6ixumRV{IiC`m~yNwrEYN(E93Mg~Skx(4RDh9)6K23DqqRt6T@1_o9J2IYnCyiqjd v=BH$)RpQpbrW5uZs6hj6LrG?CYH>+oZUJsRftKYOKs^keu6{1-oD!M<#(rz` literal 0 HcmV?d00001 diff --git a/.extlib/simplesamlphp/modules/statistics/public/assets/css/ui-theme-1.13.2/images/ui-bg_glass_95_fef1ec_1x400.png b/.extlib/simplesamlphp/modules/statistics/public/assets/css/ui-theme-1.13.2/images/ui-bg_glass_95_fef1ec_1x400.png new file mode 100644 index 0000000000000000000000000000000000000000..7e9cfd0944880151a5e8fc6dc2f61ccb9a3def49 GIT binary patch literal 442 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 GH~#_TRY|P? literal 0 HcmV?d00001 diff --git a/.extlib/simplesamlphp/modules/statistics/public/assets/css/ui-theme-1.13.2/images/ui-icons_2e83ff_256x240.png b/.extlib/simplesamlphp/modules/statistics/public/assets/css/ui-theme-1.13.2/images/ui-icons_2e83ff_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..4f47a15cfd500a8da6a2b8c66865b49bb9193b40 GIT binary patch literal 4670 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 Mx~4jBwa~Hu13@F3j{pDw literal 0 HcmV?d00001 diff --git a/.extlib/simplesamlphp/modules/statistics/public/assets/css/ui-theme-1.13.2/images/ui-icons_454545_256x240.png b/.extlib/simplesamlphp/modules/statistics/public/assets/css/ui-theme-1.13.2/images/ui-icons_454545_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..bf0e4b1c756c52ed04a985e7d0c7d34915aadea8 GIT binary patch literal 7142 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 literal 0 HcmV?d00001 diff --git a/.extlib/simplesamlphp/modules/statistics/public/assets/css/ui-theme-1.13.2/images/ui-icons_cd0a0a_256x240.png b/.extlib/simplesamlphp/modules/statistics/public/assets/css/ui-theme-1.13.2/images/ui-icons_cd0a0a_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..8623f32ad46e9b919edab8b9bebe695b724659a4 GIT binary patch literal 4670 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 JM|D*6{{Rl%P-y@F literal 0 HcmV?d00001 diff --git a/.extlib/simplesamlphp/modules/statistics/public/assets/css/ui-theme-1.13.2/jquery-ui.min.css b/.extlib/simplesamlphp/modules/statistics/public/assets/css/ui-theme-1.13.2/jquery-ui.min.css new file mode 100644 index 000000000..3cad40996 --- /dev/null +++ b/.extlib/simplesamlphp/modules/statistics/public/assets/css/ui-theme-1.13.2/jquery-ui.min.css @@ -0,0 +1,7 @@ +/*! jQuery UI - v1.13.2 - 2022-07-14 +* http://jqueryui.com +* Includes: core.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, dialog.css, draggable.css, resizable.css, progressbar.css, selectable.css, selectmenu.css, slider.css, sortable.css, spinner.css, tabs.css, tooltip.css, theme.css +* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana%2CArial%2Csans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=cccccc&bgTextureHeader=highlight_soft&bgImgOpacityHeader=75&borderColorHeader=aaaaaa&fcHeader=222222&iconColorHeader=222222&bgColorContent=ffffff&bgTextureContent=flat&bgImgOpacityContent=75&borderColorContent=aaaaaa&fcContent=222222&iconColorContent=222222&bgColorDefault=e6e6e6&bgTextureDefault=glass&bgImgOpacityDefault=75&borderColorDefault=d3d3d3&fcDefault=555555&iconColorDefault=888888&bgColorHover=dadada&bgTextureHover=glass&bgImgOpacityHover=75&borderColorHover=999999&fcHover=212121&iconColorHover=454545&bgColorActive=ffffff&bgTextureActive=glass&bgImgOpacityActive=65&borderColorActive=aaaaaa&fcActive=212121&iconColorActive=454545&bgColorHighlight=fbf9ee&bgTextureHighlight=glass&bgImgOpacityHighlight=55&borderColorHighlight=fcefa1&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=glass&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px +* Copyright jQuery Foundation and other contributors; Licensed MIT */ + +.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;-ms-filter:"alpha(opacity=0)"}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important;pointer-events:none}.ui-icon{display:inline-block;vertical-align:middle;margin-top:-.25em;position:relative;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-icon-block{left:50%;margin-left:-8px;display:block}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin:2px 0 0 0;padding:.5em .5em .5em .7em;font-size:100%}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:0}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{margin:0;cursor:pointer;list-style-image:url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")}.ui-menu .ui-menu-item-wrapper{position:relative;padding:3px 1em 3px .4em}.ui-menu .ui-menu-divider{margin:5px 0;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-state-focus,.ui-menu .ui-state-active{margin:-1px}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item-wrapper{padding-left:2em}.ui-menu .ui-icon{position:absolute;top:0;bottom:0;left:.2em;margin:auto 0}.ui-menu .ui-menu-icon{left:auto;right:0}.ui-button{padding:.4em 1em;display:inline-block;position:relative;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2em;box-sizing:border-box;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-button-icon-only{text-indent:0}.ui-button-icon-only .ui-icon{position:absolute;top:50%;left:50%;margin-top:-8px;margin-left:-8px}.ui-button.ui-icon-notext .ui-icon{padding:0;width:2.1em;height:2.1em;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-icon-notext .ui-icon{width:auto;height:auto;text-indent:0;white-space:normal;padding:.4em 1em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-controlgroup{vertical-align:middle;display:inline-block}.ui-controlgroup > .ui-controlgroup-item{float:left;margin-left:0;margin-right:0}.ui-controlgroup > .ui-controlgroup-item:focus,.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus{z-index:9999}.ui-controlgroup-vertical > .ui-controlgroup-item{display:block;float:none;width:100%;margin-top:0;margin-bottom:0;text-align:left}.ui-controlgroup-vertical .ui-controlgroup-item{box-sizing:border-box}.ui-controlgroup .ui-controlgroup-label{padding:.4em 1em}.ui-controlgroup .ui-controlgroup-label span{font-size:80%}.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item{border-left:none}.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item{border-top:none}.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content{border-right:none}.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content{border-bottom:none}.ui-controlgroup-vertical .ui-spinner-input{width:75%;width:calc( 100% - 2.4em )}.ui-controlgroup-vertical .ui-spinner .ui-spinner-up{border-top-style:solid}.ui-checkboxradio-label .ui-icon-background{box-shadow:inset 1px 1px 1px #ccc;border-radius:.12em;border:none}.ui-checkboxradio-radio-label .ui-icon-background{width:16px;height:16px;border-radius:1em;overflow:visible;border:none}.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon{background-image:none;width:8px;height:8px;border-width:4px;border-style:solid}.ui-checkboxradio-disabled{pointer-events:none}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:45%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:bold;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-datepicker .ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat;left:.5em;top:.3em}.ui-dialog{position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:20px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-n{height:2px;top:0}.ui-dialog .ui-resizable-e{width:2px;right:0}.ui-dialog .ui-resizable-s{height:2px;bottom:0}.ui-dialog .ui-resizable-w{width:2px;left:0}.ui-dialog .ui-resizable-se,.ui-dialog .ui-resizable-sw,.ui-dialog .ui-resizable-ne,.ui-dialog .ui-resizable-nw{width:7px;height:7px}.ui-dialog .ui-resizable-se{right:0;bottom:0}.ui-dialog .ui-resizable-sw{left:0;bottom:0}.ui-dialog .ui-resizable-ne{right:0;top:0}.ui-dialog .ui-resizable-nw{left:0;top:0}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-draggable-handle{-ms-touch-action:none;touch-action:none}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block;-ms-touch-action:none;touch-action:none}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url("data:image/gif;base64,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");height:100%;-ms-filter:"alpha(opacity=25)";opacity:0.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-selectable{-ms-touch-action:none;touch-action:none}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black}.ui-selectmenu-menu{padding:0;margin:0;position:absolute;top:0;left:0;display:none}.ui-selectmenu-menu .ui-menu{overflow:auto;overflow-x:hidden;padding-bottom:1px}.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup{font-size:1em;font-weight:bold;line-height:1.5;padding:2px 0.4em;margin:0.5em 0 0 0;height:auto;border:0}.ui-selectmenu-open{display:block}.ui-selectmenu-text{display:block;margin-right:20px;overflow:hidden;text-overflow:ellipsis}.ui-selectmenu-button.ui-button{text-align:left;white-space:nowrap;width:14em}.ui-selectmenu-icon.ui-icon{float:right;margin-top:0}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:pointer;-ms-touch-action:none;touch-action:none}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-sortable-handle{-ms-touch-action:none;touch-action:none}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:none;background:none;color:inherit;padding:.222em 0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:2em}.ui-spinner-button{width:1.6em;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top-style:none;border-bottom-style:none;border-right-style:none}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav .ui-tabs-anchor{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor{cursor:text}.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px}body .ui-tooltip{border-width:2px}.ui-widget{font-family:Verdana,Arial,sans-serif;font-size:1.1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Verdana,Arial,sans-serif;font-size:1em}.ui-widget.ui-widget-content{border:1px solid #d3d3d3}.ui-widget-content{border:1px solid #aaa;background:#fff;color:#222}.ui-widget-content a{color:#222}.ui-widget-header{border:1px solid #aaa;background:#ccc url("images/ui-bg_highlight-soft_75_cccccc_1x100.png") 50% 50% repeat-x;color:#222;font-weight:bold}.ui-widget-header a{color:#222}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default,.ui-button,html .ui-button.ui-state-disabled:hover,html .ui-button.ui-state-disabled:active{border:1px solid #d3d3d3;background:#e6e6e6 url("images/ui-bg_glass_75_e6e6e6_1x400.png") 50% 50% repeat-x;font-weight:normal;color:#555}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited,a.ui-button,a:link.ui-button,a:visited.ui-button,.ui-button{color:#555;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus,.ui-button:hover,.ui-button:focus{border:1px solid #999;background:#dadada url("images/ui-bg_glass_75_dadada_1x400.png") 50% 50% repeat-x;font-weight:normal;color:#212121}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited,a.ui-button:hover,a.ui-button:focus{color:#212121;text-decoration:none}.ui-visual-focus{box-shadow:0 0 3px 1px rgb(94,158,214)}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active,a.ui-button:active,.ui-button:active,.ui-button.ui-state-active:hover{border:1px solid #aaa;background:#fff url("images/ui-bg_glass_65_ffffff_1x400.png") 50% 50% repeat-x;font-weight:normal;color:#212121}.ui-icon-background,.ui-state-active .ui-icon-background{border:#aaa;background-color:#212121}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#212121;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #fcefa1;background:#fbf9ee url("images/ui-bg_glass_55_fbf9ee_1x400.png") 50% 50% repeat-x;color:#363636}.ui-state-checked{border:1px solid #fcefa1;background:#fbf9ee}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#363636}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #cd0a0a;background:#fef1ec url("images/ui-bg_glass_95_fef1ec_1x400.png") 50% 50% repeat-x;color:#cd0a0a}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#cd0a0a}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#cd0a0a}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;-ms-filter:"alpha(opacity=70)";font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;-ms-filter:"alpha(opacity=35)";background-image:none}.ui-state-disabled .ui-icon{-ms-filter:"alpha(opacity=35)"}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url("images/ui-icons_222222_256x240.png")}.ui-widget-header .ui-icon{background-image:url("images/ui-icons_222222_256x240.png")}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon,.ui-button:hover .ui-icon,.ui-button:focus .ui-icon{background-image:url("images/ui-icons_454545_256x240.png")}.ui-state-active .ui-icon,.ui-button:active .ui-icon{background-image:url("images/ui-icons_454545_256x240.png")}.ui-state-highlight .ui-icon,.ui-button .ui-state-highlight.ui-icon{background-image:url("images/ui-icons_2e83ff_256x240.png")}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url("images/ui-icons_cd0a0a_256x240.png")}.ui-button .ui-icon{background-image:url("images/ui-icons_888888_256x240.png")}.ui-icon-blank.ui-icon-blank.ui-icon-blank{background-image:none}.ui-icon-caret-1-n{background-position:0 0}.ui-icon-caret-1-ne{background-position:-16px 0}.ui-icon-caret-1-e{background-position:-32px 0}.ui-icon-caret-1-se{background-position:-48px 0}.ui-icon-caret-1-s{background-position:-65px 0}.ui-icon-caret-1-sw{background-position:-80px 0}.ui-icon-caret-1-w{background-position:-96px 0}.ui-icon-caret-1-nw{background-position:-112px 0}.ui-icon-caret-2-n-s{background-position:-128px 0}.ui-icon-caret-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-65px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-65px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:1px -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:4px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:4px}.ui-widget-overlay{background:#aaa;opacity:.3;-ms-filter:Alpha(Opacity=30)}.ui-widget-shadow{-webkit-box-shadow:-8px -8px 8px #aaa;box-shadow:-8px -8px 8px #aaa} \ No newline at end of file diff --git a/.extlib/simplesamlphp/modules/statistics/public/assets/js/jquery-1.12.4.min.js b/.extlib/simplesamlphp/modules/statistics/public/assets/js/jquery-1.12.4.min.js new file mode 100644 index 000000000..e83647587 --- /dev/null +++ b/.extlib/simplesamlphp/modules/statistics/public/assets/js/jquery-1.12.4.min.js @@ -0,0 +1,5 @@ +/*! jQuery v1.12.4 | (c) jQuery Foundation | jquery.org/license */ +!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=a.document,e=c.slice,f=c.concat,g=c.push,h=c.indexOf,i={},j=i.toString,k=i.hasOwnProperty,l={},m="1.12.4",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return e.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:e.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a){return n.each(this,a)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(e.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor()},push:g,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(n.isPlainObject(c)||(b=n.isArray(c)))?(b?(b=!1,f=a&&n.isArray(a)?a:[]):f=a&&n.isPlainObject(a)?a:{},g[d]=n.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray||function(a){return"array"===n.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){var b=a&&a.toString();return!n.isArray(a)&&b-parseFloat(b)+1>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==n.type(a)||a.nodeType||n.isWindow(a))return!1;try{if(a.constructor&&!k.call(a,"constructor")&&!k.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(!l.ownFirst)for(b in a)return k.call(a,b);for(b in a);return void 0===b||k.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?i[j.call(a)]||"object":typeof a},globalEval:function(b){b&&n.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b){var c,d=0;if(s(a)){for(c=a.length;c>d;d++)if(b.call(a[d],d,a[d])===!1)break}else for(d in a)if(b.call(a[d],d,a[d])===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):g.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(h)return h.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,e,g=0,h=[];if(s(a))for(d=a.length;d>g;g++)e=b(a[g],g,c),null!=e&&h.push(e);else for(g in a)e=b(a[g],g,c),null!=e&&h.push(e);return f.apply([],h)},guid:1,proxy:function(a,b){var c,d,f;return"string"==typeof b&&(f=a[b],b=a,a=f),n.isFunction(a)?(c=e.call(arguments,2),d=function(){return a.apply(b||this,c.concat(e.call(arguments)))},d.guid=a.guid=a.guid||n.guid++,d):void 0},now:function(){return+new Date},support:l}),"function"==typeof Symbol&&(n.fn[Symbol.iterator]=c[Symbol.iterator]),n.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(a,b){i["[object "+b+"]"]=b.toLowerCase()});function s(a){var b=!!a&&"length"in a&&a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ga(),z=ga(),A=ga(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+M+"))|)"+L+"*\\]",O=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+N+")*)|.*)\\)|)",P=new RegExp(L+"+","g"),Q=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),R=new RegExp("^"+L+"*,"+L+"*"),S=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),T=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),U=new RegExp(O),V=new RegExp("^"+M+"$"),W={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M+"|[*])"),ATTR:new RegExp("^"+N),PSEUDO:new RegExp("^"+O),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},X=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,Z=/^[^{]+\{\s*\[native \w/,$=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,_=/[+~]/,aa=/'|\\/g,ba=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),ca=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},da=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(ea){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function fa(a,b,d,e){var f,h,j,k,l,o,r,s,w=b&&b.ownerDocument,x=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==x&&9!==x&&11!==x)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==x&&(o=$.exec(a)))if(f=o[1]){if(9===x){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(w&&(j=w.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(o[2])return H.apply(d,b.getElementsByTagName(a)),d;if((f=o[3])&&c.getElementsByClassName&&b.getElementsByClassName)return H.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==x)w=b,s=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(aa,"\\$&"):b.setAttribute("id",k=u),r=g(a),h=r.length,l=V.test(k)?"#"+k:"[id='"+k+"']";while(h--)r[h]=l+" "+qa(r[h]);s=r.join(","),w=_.test(a)&&oa(b.parentNode)||b}if(s)try{return H.apply(d,w.querySelectorAll(s)),d}catch(y){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(Q,"$1"),b,d,e)}function ga(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ha(a){return a[u]=!0,a}function ia(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ja(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function ka(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function la(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function na(a){return ha(function(b){return b=+b,ha(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function oa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=fa.support={},f=fa.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=fa.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ia(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ia(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Z.test(n.getElementsByClassName),c.getById=ia(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return"undefined"!=typeof b.getElementsByClassName&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=Z.test(n.querySelectorAll))&&(ia(function(a){o.appendChild(a).innerHTML="",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ia(function(a){var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Z.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ia(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",O)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Z.test(o.compareDocumentPosition),t=b||Z.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return ka(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?ka(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},fa.matches=function(a,b){return fa(a,null,null,b)},fa.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(T,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return fa(b,n,null,[a]).length>0},fa.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},fa.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},fa.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},fa.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=fa.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=fa.selectors={cacheLength:50,createPseudo:ha,match:W,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ba,ca),a[3]=(a[3]||a[4]||a[5]||"").replace(ba,ca),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||fa.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&fa.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return W.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&U.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ba,ca).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=fa.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(P," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||fa.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ha(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ha(function(a){var b=[],c=[],d=h(a.replace(Q,"$1"));return d[u]?ha(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ha(function(a){return function(b){return fa(a,b).length>0}}),contains:ha(function(a){return a=a.replace(ba,ca),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ha(function(a){return V.test(a||"")||fa.error("unsupported lang: "+a),a=a.replace(ba,ca).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Y.test(a.nodeName)},input:function(a){return X.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:na(function(){return[0]}),last:na(function(a,b){return[b-1]}),eq:na(function(a,b,c){return[0>c?c+b:c]}),even:na(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:na(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:na(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:na(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function ra(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j,k=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(j=b[u]||(b[u]={}),i=j[b.uniqueID]||(j[b.uniqueID]={}),(h=i[d])&&h[0]===w&&h[1]===f)return k[2]=h[2];if(i[d]=k,k[2]=a(b,c,g))return!0}}}function sa(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ta(a,b,c){for(var d=0,e=b.length;e>d;d++)fa(a,b[d],c);return c}function ua(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(c&&!c(f,d,e)||(g.push(f),j&&b.push(h)));return g}function va(a,b,c,d,e,f){return d&&!d[u]&&(d=va(d)),e&&!e[u]&&(e=va(e,f)),ha(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ta(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:ua(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=ua(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=ua(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function wa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ra(function(a){return a===b},h,!0),l=ra(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[ra(sa(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return va(i>1&&sa(m),i>1&&qa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(Q,"$1"),c,e>i&&wa(a.slice(i,e)),f>e&&wa(a=a.slice(e)),f>e&&qa(a))}m.push(c)}return sa(m)}function xa(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=F.call(i));u=ua(u)}H.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&fa.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ha(f):f}return h=fa.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=wa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,xa(e,d)),f.selector=a}return f},i=fa.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ba,ca),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=W.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ba,ca),_.test(j[0].type)&&oa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&qa(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,!b||_.test(a)&&oa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ia(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ia(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ja("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ia(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ja("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ia(function(a){return null==a.getAttribute("disabled")})||ja(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),fa}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.uniqueSort=n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&n(a).is(c))break;d.push(a)}return d},v=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},w=n.expr.match.needsContext,x=/^<([\w-]+)\s*\/?>(?:<\/\1>|)$/,y=/^.[^:#\[\.,]*$/;function z(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(y.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return n.inArray(a,b)>-1!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;e>b;b++)if(n.contains(d[b],this))return!0}));for(b=0;e>b;b++)n.find(a,d[b],c);return c=this.pushStack(e>1?n.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(z(this,a||[],!1))},not:function(a){return this.pushStack(z(this,a||[],!0))},is:function(a){return!!z(this,"string"==typeof a&&w.test(a)?n(a):a||[],!1).length}});var A,B=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=n.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||A,"string"==typeof a){if(e="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:B.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),x.test(e[1])&&n.isPlainObject(b))for(e in b)n.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}if(f=d.getElementById(e[2]),f&&f.parentNode){if(f.id!==e[2])return A.find(a);this.length=1,this[0]=f}return this.context=d,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?"undefined"!=typeof c.ready?c.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};C.prototype=n.fn,A=n(d);var D=/^(?:parents|prev(?:Until|All))/,E={children:!0,contents:!0,next:!0,prev:!0};n.fn.extend({has:function(a){var b,c=n(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(n.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=w.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?n.inArray(this[0],n(a)):n.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.uniqueSort(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function F(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return u(a,"parentNode")},parentsUntil:function(a,b,c){return u(a,"parentNode",c)},next:function(a){return F(a,"nextSibling")},prev:function(a){return F(a,"previousSibling")},nextAll:function(a){return u(a,"nextSibling")},prevAll:function(a){return u(a,"previousSibling")},nextUntil:function(a,b,c){return u(a,"nextSibling",c)},prevUntil:function(a,b,c){return u(a,"previousSibling",c)},siblings:function(a){return v((a.parentNode||{}).firstChild,a)},children:function(a){return v(a.firstChild)},contents:function(a){return n.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(E[a]||(e=n.uniqueSort(e)),D.test(a)&&(e=e.reverse())),this.pushStack(e)}});var G=/\S+/g;function H(a){var b={};return n.each(a.match(G)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?H(a):n.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h-1)f.splice(c,1),h>=c&&h--}),this},has:function(a){return a?n.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=!0,c||j.disable(),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().progress(c.notify).done(c.resolve).fail(c.reject):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=e.call(arguments),d=c.length,f=1!==d||a&&n.isFunction(a.promise)?d:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(d){b[a]=this,c[a]=arguments.length>1?e.call(arguments):d,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(d>1)for(i=new Array(d),j=new Array(d),k=new Array(d);d>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().progress(h(b,j,i)).done(h(b,k,c)).fail(g.reject):--f;return f||g.resolveWith(k,c),g.promise()}});var I;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){(a===!0?--n.readyWait:n.isReady)||(n.isReady=!0,a!==!0&&--n.readyWait>0||(I.resolveWith(d,[n]),n.fn.triggerHandler&&(n(d).triggerHandler("ready"),n(d).off("ready"))))}});function J(){d.addEventListener?(d.removeEventListener("DOMContentLoaded",K),a.removeEventListener("load",K)):(d.detachEvent("onreadystatechange",K),a.detachEvent("onload",K))}function K(){(d.addEventListener||"load"===a.event.type||"complete"===d.readyState)&&(J(),n.ready())}n.ready.promise=function(b){if(!I)if(I=n.Deferred(),"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll)a.setTimeout(n.ready);else if(d.addEventListener)d.addEventListener("DOMContentLoaded",K),a.addEventListener("load",K);else{d.attachEvent("onreadystatechange",K),a.attachEvent("onload",K);var c=!1;try{c=null==a.frameElement&&d.documentElement}catch(e){}c&&c.doScroll&&!function f(){if(!n.isReady){try{c.doScroll("left")}catch(b){return a.setTimeout(f,50)}J(),n.ready()}}()}return I.promise(b)},n.ready.promise();var L;for(L in n(l))break;l.ownFirst="0"===L,l.inlineBlockNeedsLayout=!1,n(function(){var a,b,c,e;c=d.getElementsByTagName("body")[0],c&&c.style&&(b=d.createElement("div"),e=d.createElement("div"),e.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(e).appendChild(b),"undefined"!=typeof b.style.zoom&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",l.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(e))}),function(){var a=d.createElement("div");l.deleteExpando=!0;try{delete a.test}catch(b){l.deleteExpando=!1}a=null}();var M=function(a){var b=n.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b},N=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,O=/([A-Z])/g;function P(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(O,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:N.test(c)?n.parseJSON(c):c}catch(e){}n.data(a,b,c)}else c=void 0; +}return c}function Q(a){var b;for(b in a)if(("data"!==b||!n.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;return!0}function R(a,b,d,e){if(M(a)){var f,g,h=n.expando,i=a.nodeType,j=i?n.cache:a,k=i?a[h]:a[h]&&h;if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||n.guid++:h),j[k]||(j[k]=i?{}:{toJSON:n.noop}),"object"!=typeof b&&"function"!=typeof b||(e?j[k]=n.extend(j[k],b):j[k].data=n.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[n.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[n.camelCase(b)])):f=g,f}}function S(a,b,c){if(M(a)){var d,e,f=a.nodeType,g=f?n.cache:a,h=f?a[n.expando]:n.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){n.isArray(b)?b=b.concat(n.map(b,n.camelCase)):b in d?b=[b]:(b=n.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!Q(d):!n.isEmptyObject(d))return}(c||(delete g[h].data,Q(g[h])))&&(f?n.cleanData([a],!0):l.deleteExpando||g!=g.window?delete g[h]:g[h]=void 0)}}}n.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?n.cache[a[n.expando]]:a[n.expando],!!a&&!Q(a)},data:function(a,b,c){return R(a,b,c)},removeData:function(a,b){return S(a,b)},_data:function(a,b,c){return R(a,b,c,!0)},_removeData:function(a,b){return S(a,b,!0)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=n.data(f),1===f.nodeType&&!n._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),P(f,d,e[d])));n._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){n.data(this,a)}):arguments.length>1?this.each(function(){n.data(this,a,b)}):f?P(f,a,n.data(f,a)):void 0},removeData:function(a){return this.each(function(){n.removeData(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=n._data(a,b),c&&(!d||n.isArray(c)?d=n._data(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return n._data(a,c)||n._data(a,c,{empty:n.Callbacks("once memory").add(function(){n._removeData(a,b+"queue"),n._removeData(a,c)})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.lengthh;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},Z=/^(?:checkbox|radio)$/i,$=/<([\w:-]+)/,_=/^$|\/(?:java|ecma)script/i,aa=/^\s+/,ba="abbr|article|aside|audio|bdi|canvas|data|datalist|details|dialog|figcaption|figure|footer|header|hgroup|main|mark|meter|nav|output|picture|progress|section|summary|template|time|video";function ca(a){var b=ba.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}!function(){var a=d.createElement("div"),b=d.createDocumentFragment(),c=d.createElement("input");a.innerHTML="
      a",l.leadingWhitespace=3===a.firstChild.nodeType,l.tbody=!a.getElementsByTagName("tbody").length,l.htmlSerialize=!!a.getElementsByTagName("link").length,l.html5Clone="<:nav>"!==d.createElement("nav").cloneNode(!0).outerHTML,c.type="checkbox",c.checked=!0,b.appendChild(c),l.appendChecked=c.checked,a.innerHTML="",l.noCloneChecked=!!a.cloneNode(!0).lastChild.defaultValue,b.appendChild(a),c=d.createElement("input"),c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),a.appendChild(c),l.checkClone=a.cloneNode(!0).cloneNode(!0).lastChild.checked,l.noCloneEvent=!!a.addEventListener,a[n.expando]=1,l.attributes=!a.getAttribute(n.expando)}();var da={option:[1,""],legend:[1,"
      ","
      "],area:[1,"",""],param:[1,"",""],thead:[1,"","
      "],tr:[2,"","
      "],col:[2,"","
      "],td:[3,"","
      "],_default:l.htmlSerialize?[0,"",""]:[1,"X
      ","
      "]};da.optgroup=da.option,da.tbody=da.tfoot=da.colgroup=da.caption=da.thead,da.th=da.td;function ea(a,b){var c,d,e=0,f="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||n.nodeName(d,b)?f.push(d):n.merge(f,ea(d,b));return void 0===b||b&&n.nodeName(a,b)?n.merge([a],f):f}function fa(a,b){for(var c,d=0;null!=(c=a[d]);d++)n._data(c,"globalEval",!b||n._data(b[d],"globalEval"))}var ga=/<|&#?\w+;/,ha=/r;r++)if(g=a[r],g||0===g)if("object"===n.type(g))n.merge(q,g.nodeType?[g]:g);else if(ga.test(g)){i=i||p.appendChild(b.createElement("div")),j=($.exec(g)||["",""])[1].toLowerCase(),m=da[j]||da._default,i.innerHTML=m[1]+n.htmlPrefilter(g)+m[2],f=m[0];while(f--)i=i.lastChild;if(!l.leadingWhitespace&&aa.test(g)&&q.push(b.createTextNode(aa.exec(g)[0])),!l.tbody){g="table"!==j||ha.test(g)?""!==m[1]||ha.test(g)?0:i:i.firstChild,f=g&&g.childNodes.length;while(f--)n.nodeName(k=g.childNodes[f],"tbody")&&!k.childNodes.length&&g.removeChild(k)}n.merge(q,i.childNodes),i.textContent="";while(i.firstChild)i.removeChild(i.firstChild);i=p.lastChild}else q.push(b.createTextNode(g));i&&p.removeChild(i),l.appendChecked||n.grep(ea(q,"input"),ia),r=0;while(g=q[r++])if(d&&n.inArray(g,d)>-1)e&&e.push(g);else if(h=n.contains(g.ownerDocument,g),i=ea(p.appendChild(g),"script"),h&&fa(i),c){f=0;while(g=i[f++])_.test(g.type||"")&&c.push(g)}return i=null,p}!function(){var b,c,e=d.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(l[b]=c in a)||(e.setAttribute(c,"t"),l[b]=e.attributes[c].expando===!1);e=null}();var ka=/^(?:input|select|textarea)$/i,la=/^key/,ma=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,na=/^(?:focusinfocus|focusoutblur)$/,oa=/^([^.]*)(?:\.(.+)|)/;function pa(){return!0}function qa(){return!1}function ra(){try{return d.activeElement}catch(a){}}function sa(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)sa(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=qa;else if(!e)return a;return 1===f&&(g=e,e=function(a){return n().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=n.guid++)),a.each(function(){n.event.add(this,b,e,d,c)})}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=n._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=n.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return"undefined"==typeof n||a&&n.event.triggered===a.type?void 0:n.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(G)||[""],h=b.length;while(h--)f=oa.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=n.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=n.event.special[o]||{},l=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},i),(m=g[o])||(m=g[o]=[],m.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,l):m.push(l),n.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=n.hasData(a)&&n._data(a);if(r&&(k=r.events)){b=(b||"").match(G)||[""],j=b.length;while(j--)if(h=oa.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=m.length;while(f--)g=m[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(m.splice(f,1),g.selector&&m.delegateCount--,l.remove&&l.remove.call(a,g));i&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(k)&&(delete r.handle,n._removeData(a,"events"))}},trigger:function(b,c,e,f){var g,h,i,j,l,m,o,p=[e||d],q=k.call(b,"type")?b.type:b,r=k.call(b,"namespace")?b.namespace.split("."):[];if(i=m=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!na.test(q+n.event.triggered)&&(q.indexOf(".")>-1&&(r=q.split("."),q=r.shift(),r.sort()),h=q.indexOf(":")<0&&"on"+q,b=b[n.expando]?b:new n.Event(q,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=r.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+r.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:n.makeArray(c,[b]),l=n.event.special[q]||{},f||!l.trigger||l.trigger.apply(e,c)!==!1)){if(!f&&!l.noBubble&&!n.isWindow(e)){for(j=l.delegateType||q,na.test(j+q)||(i=i.parentNode);i;i=i.parentNode)p.push(i),m=i;m===(e.ownerDocument||d)&&p.push(m.defaultView||m.parentWindow||a)}o=0;while((i=p[o++])&&!b.isPropagationStopped())b.type=o>1?j:l.bindType||q,g=(n._data(i,"events")||{})[b.type]&&n._data(i,"handle"),g&&g.apply(i,c),g=h&&i[h],g&&g.apply&&M(i)&&(b.result=g.apply(i,c),b.result===!1&&b.preventDefault());if(b.type=q,!f&&!b.isDefaultPrevented()&&(!l._default||l._default.apply(p.pop(),c)===!1)&&M(e)&&h&&e[q]&&!n.isWindow(e)){m=e[h],m&&(e[h]=null),n.event.triggered=q;try{e[q]()}catch(s){}n.event.triggered=void 0,m&&(e[h]=m)}return b.result}},dispatch:function(a){a=n.event.fix(a);var b,c,d,f,g,h=[],i=e.call(arguments),j=(n._data(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,c=0;while((g=f.handlers[c++])&&!a.isImmediatePropagationStopped())a.rnamespace&&!a.rnamespace.test(g.namespace)||(a.handleObj=g,a.data=g.data,d=((n.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==d&&(a.result=d)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&("click"!==a.type||isNaN(a.button)||a.button<1))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?n(e,this).index(i)>-1:n.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h]","i"),va=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,wa=/\s*$/g,Aa=ca(d),Ba=Aa.appendChild(d.createElement("div"));function Ca(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function Da(a){return a.type=(null!==n.find.attr(a,"type"))+"/"+a.type,a}function Ea(a){var b=ya.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Fa(a,b){if(1===b.nodeType&&n.hasData(a)){var c,d,e,f=n._data(a),g=n._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)n.event.add(b,c,h[c][d])}g.data&&(g.data=n.extend({},g.data))}}function Ga(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!l.noCloneEvent&&b[n.expando]){e=n._data(b);for(d in e.events)n.removeEvent(b,d,e.handle);b.removeAttribute(n.expando)}"script"===c&&b.text!==a.text?(Da(b).text=a.text,Ea(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),l.html5Clone&&a.innerHTML&&!n.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&Z.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:"input"!==c&&"textarea"!==c||(b.defaultValue=a.defaultValue)}}function Ha(a,b,c,d){b=f.apply([],b);var e,g,h,i,j,k,m=0,o=a.length,p=o-1,q=b[0],r=n.isFunction(q);if(r||o>1&&"string"==typeof q&&!l.checkClone&&xa.test(q))return a.each(function(e){var f=a.eq(e);r&&(b[0]=q.call(this,e,f.html())),Ha(f,b,c,d)});if(o&&(k=ja(b,a[0].ownerDocument,!1,a,d),e=k.firstChild,1===k.childNodes.length&&(k=e),e||d)){for(i=n.map(ea(k,"script"),Da),h=i.length;o>m;m++)g=k,m!==p&&(g=n.clone(g,!0,!0),h&&n.merge(i,ea(g,"script"))),c.call(a[m],g,m);if(h)for(j=i[i.length-1].ownerDocument,n.map(i,Ea),m=0;h>m;m++)g=i[m],_.test(g.type||"")&&!n._data(g,"globalEval")&&n.contains(j,g)&&(g.src?n._evalUrl&&n._evalUrl(g.src):n.globalEval((g.text||g.textContent||g.innerHTML||"").replace(za,"")));k=e=null}return a}function Ia(a,b,c){for(var d,e=b?n.filter(b,a):a,f=0;null!=(d=e[f]);f++)c||1!==d.nodeType||n.cleanData(ea(d)),d.parentNode&&(c&&n.contains(d.ownerDocument,d)&&fa(ea(d,"script")),d.parentNode.removeChild(d));return a}n.extend({htmlPrefilter:function(a){return a.replace(va,"<$1>")},clone:function(a,b,c){var d,e,f,g,h,i=n.contains(a.ownerDocument,a);if(l.html5Clone||n.isXMLDoc(a)||!ua.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(Ba.innerHTML=a.outerHTML,Ba.removeChild(f=Ba.firstChild)),!(l.noCloneEvent&&l.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(d=ea(f),h=ea(a),g=0;null!=(e=h[g]);++g)d[g]&&Ga(e,d[g]);if(b)if(c)for(h=h||ea(a),d=d||ea(f),g=0;null!=(e=h[g]);g++)Fa(e,d[g]);else Fa(a,f);return d=ea(f,"script"),d.length>0&&fa(d,!i&&ea(a,"script")),d=h=e=null,f},cleanData:function(a,b){for(var d,e,f,g,h=0,i=n.expando,j=n.cache,k=l.attributes,m=n.event.special;null!=(d=a[h]);h++)if((b||M(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)m[e]?n.event.remove(d,e):n.removeEvent(d,e,g.handle);j[f]&&(delete j[f],k||"undefined"==typeof d.removeAttribute?d[i]=void 0:d.removeAttribute(i),c.push(f))}}}),n.fn.extend({domManip:Ha,detach:function(a){return Ia(this,a,!0)},remove:function(a){return Ia(this,a)},text:function(a){return Y(this,function(a){return void 0===a?n.text(this):this.empty().append((this[0]&&this[0].ownerDocument||d).createTextNode(a))},null,a,arguments.length)},append:function(){return Ha(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ca(this,a);b.appendChild(a)}})},prepend:function(){return Ha(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ca(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return Ha(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return Ha(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&n.cleanData(ea(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&n.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return Y(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(ta,""):void 0;if("string"==typeof a&&!wa.test(a)&&(l.htmlSerialize||!ua.test(a))&&(l.leadingWhitespace||!aa.test(a))&&!da[($.exec(a)||["",""])[1].toLowerCase()]){a=n.htmlPrefilter(a);try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(ea(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=[];return Ha(this,arguments,function(b){var c=this.parentNode;n.inArray(this,a)<0&&(n.cleanData(ea(this)),c&&c.replaceChild(b,this))},a)}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=0,e=[],f=n(a),h=f.length-1;h>=d;d++)c=d===h?this:this.clone(!0),n(f[d])[b](c),g.apply(e,c.get());return this.pushStack(e)}});var Ja,Ka={HTML:"block",BODY:"block"};function La(a,b){var c=n(b.createElement(a)).appendTo(b.body),d=n.css(c[0],"display");return c.detach(),d}function Ma(a){var b=d,c=Ka[a];return c||(c=La(a,b),"none"!==c&&c||(Ja=(Ja||n("