From 1b9386794db7a3126de310e85e21893cacd8708c Mon Sep 17 00:00:00 2001 From: Kilian Saffran Date: Wed, 23 Oct 2019 14:03:27 +0200 Subject: [PATCH] v20191023 --- CGI/api/db.cgi | 126 + CGI/api/lib/dksconfig.pm | 44 + CGI/api/lib/dksdb.pm | 417 + CGI/api/lib/sendemail.pm | 130 + CGI/api/lib/session.pm | 232 + CGI/api/service.cgi | 207 + CGI/api/system.cgi | 167 + CGI/api/tmp/sql.log | 170 + CGI/index.cgi | 199 + CGI/tmpl/app/hourtrax/index.tt | 60 + CGI/tmpl/app/hourtrax/module/clock/index.js | 0 CGI/tmpl/app/hourtrax/module/clock/index.tt | 0 CGI/tmpl/app/hourtrax/module/members/index.js | 0 CGI/tmpl/app/hourtrax/module/members/index.tt | 0 .../app/hourtrax/module/settings/index.js | 0 .../app/hourtrax/module/settings/index.tt | 0 .../app/hourtrax/module/timetrack/index.js | 0 .../app/hourtrax/module/timetrack/index.tt | 0 CGI/tmpl/app/timeclock/index.js | 99 + CGI/tmpl/app/timeclock/index.tt | 96 + CGI/tmpl/app/timeclock/login.js | 154 + CGI/tmpl/app/timeclock/track.js | 58 + CGI/tmpl/block/snackbar.tt | 1 + CGI/tmpl/skeleton/app.tt | 3 + CGI/tmpl/skeleton/file.tt | 3 + CGI/tmpl/skeleton/index.tt | 35 + CGI/tmpl/skeleton/module.tt | 60 + Hourtraxsrv.pl | 108 + access.log | 519 + bin/Hourtraxsrv.pl | 35 +- data/.dks | 1 + data/hourtrax.sqlite | Bin 8192 -> 13312 bytes error.log | 55 + htdocs/clock.html | 89 + htdocs/css/admin.css | 240 + htdocs/css/clock.css | 236 + htdocs/css/w3pro.css | 378 + htdocs/img/hourtrax.png | Bin 0 -> 23443 bytes htdocs/index.html | 249 + htdocs/js/admin.js | 78 + htdocs/js/admin_ht.js | 249 + htdocs/js/database.js | 71 + htdocs/js/fieldsave.js | 48 + htdocs/js/formsave.js | 55 + htdocs/js/jquery-3.2.1.min.js | 4 + htdocs/js/moduleglobal.js | 24 + htdocs/js/request.js | 149 + htdocs/js/request_old.js | 105 + htdocs/js/sysconfig.js | 149 + htdocs/supported.html | 12 + htdocs/test.html | 29 + htdocs/vendor/choices/base.css | 191 + htdocs/vendor/choices/base.min.css | 1 + htdocs/vendor/choices/choices.css | 368 + htdocs/vendor/choices/choices.js | 6787 +++++ htdocs/vendor/choices/choices.min.css | 1 + htdocs/vendor/choices/choices.min.js | 58 + htdocs/vendor/choices/scripts/choices.js | 6787 +++++ htdocs/vendor/choices/scripts/choices.min.js | 58 + htdocs/vendor/flatpickr/flatpickr.css | 784 + htdocs/vendor/flatpickr/flatpickr.js | 2596 ++ htdocs/vendor/flatpickr/flatpickr.min.css | 13 + htdocs/vendor/flatpickr/flatpickr.min.js | 2 + htdocs/vendor/flatpickr/ie.css | 13 + htdocs/vendor/flatpickr/index.d.ts | 4 + htdocs/vendor/flatpickr/l10n/de.d.ts | 66 + htdocs/vendor/flatpickr/l10n/de.js | 70 + htdocs/vendor/flatpickr/l10n/default.d.ts | 3 + htdocs/vendor/flatpickr/l10n/default.js | 83 + htdocs/vendor/flatpickr/l10n/fr.d.ts | 66 + htdocs/vendor/flatpickr/l10n/fr.js | 75 + htdocs/vendor/flatpickr/l10n/lu.d.ts | 67 + htdocs/vendor/flatpickr/l10n/lu.js | 71 + .../plugins/confirmDate/confirmDate.css | 24 + .../plugins/confirmDate/confirmDate.d.ts | 9 + .../plugins/confirmDate/confirmDate.js | 84 + .../plugins/labelPlugin/labelPlugin.d.ts | 3 + .../plugins/labelPlugin/labelPlugin.js | 31 + .../flatpickr/plugins/minMaxTimePlugin.d.ts | 17 + .../flatpickr/plugins/minMaxTimePlugin.js | 326 + .../flatpickr/plugins/monthSelect/index.d.ts | 13 + .../flatpickr/plugins/monthSelect/index.js | 174 + .../flatpickr/plugins/monthSelect/style.css | 69 + .../plugins/monthSelect/tests.spec.d.ts | 1 + .../vendor/flatpickr/plugins/rangePlugin.d.ts | 12 + .../vendor/flatpickr/plugins/rangePlugin.js | 146 + .../flatpickr/plugins/scrollPlugin.d.ts | 3 + .../vendor/flatpickr/plugins/scrollPlugin.js | 58 + .../plugins/weekSelect/weekSelect.d.ts | 7 + .../plugins/weekSelect/weekSelect.js | 86 + htdocs/vendor/flatpickr/themes/airbnb.css | 872 + htdocs/vendor/flatpickr/themes/confetti.css | 795 + htdocs/vendor/flatpickr/themes/dark.css | 784 + htdocs/vendor/flatpickr/themes/light.css | 798 + .../vendor/flatpickr/themes/material_blue.css | 795 + .../flatpickr/themes/material_green.css | 795 + .../flatpickr/themes/material_orange.css | 795 + .../vendor/flatpickr/themes/material_red.css | 795 + htdocs/vendor/flatpickr/types/globals.d.ts | 20 + htdocs/vendor/flatpickr/types/instance.d.ts | 118 + htdocs/vendor/flatpickr/types/locale.d.ts | 45 + htdocs/vendor/flatpickr/types/options.d.ts | 144 + htdocs/vendor/flatpickr/typings.d.ts | 38 + htdocs/vendor/flatpickr/utils/dates.d.ts | 17 + htdocs/vendor/flatpickr/utils/dom.d.ts | 6 + htdocs/vendor/flatpickr/utils/formatting.d.ts | 13 + htdocs/vendor/flatpickr/utils/index.d.ts | 8 + htdocs/vendor/flatpickr/utils/polyfills.d.ts | 0 .../vendor/moment/moment-with-locales.min.js | 1 + htdocs/vendor/moment/moment.min.js | 1 + .../css/bootstrap/tabulator_bootstrap.css | 842 + .../css/bootstrap/tabulator_bootstrap.min.css | 3 + .../bootstrap/tabulator_bootstrap.min.css.map | 1 + .../css/bootstrap/tabulator_bootstrap4.css | 1045 + .../bootstrap/tabulator_bootstrap4.min.css | 3 + .../tabulator_bootstrap4.min.css.map | 1 + .../tabulator/css/bulma/tabulator_bulma.css | 847 + .../css/bulma/tabulator_bulma.min.css | 3 + .../css/bulma/tabulator_bulma.min.css.map | 1 + .../css/semantic-ui/tabulator_semantic-ui.css | 1322 + .../semantic-ui/tabulator_semantic-ui.min.css | 3 + .../tabulator_semantic-ui.min.css.map | 1 + htdocs/vendor/tabulator/css/tabulator.css | 807 + htdocs/vendor/tabulator/css/tabulator.min.css | 3 + .../tabulator/css/tabulator.min.css.map | 1 + .../tabulator/css/tabulator_midnight.css | 810 + .../tabulator/css/tabulator_midnight.min.css | 3 + .../css/tabulator_midnight.min.css.map | 1 + .../vendor/tabulator/css/tabulator_modern.css | 832 + .../tabulator/css/tabulator_modern.min.css | 3 + .../css/tabulator_modern.min.css.map | 1 + .../vendor/tabulator/css/tabulator_simple.css | 804 + .../tabulator/css/tabulator_simple.min.css | 3 + .../css/tabulator_simple.min.css.map | 1 + .../vendor/tabulator/css/tabulator_site.css | 804 + .../tabulator/css/tabulator_site.min.css | 3 + .../tabulator/css/tabulator_site.min.css.map | 1 + htdocs/vendor/tabulator/js/jquery_wrapper.js | 46 + .../vendor/tabulator/js/jquery_wrapper.min.js | 2 + .../vendor/tabulator/js/modules/accessor.js | 91 + .../tabulator/js/modules/accessor.min.js | 2 + htdocs/vendor/tabulator/js/modules/ajax.js | 465 + .../vendor/tabulator/js/modules/ajax.min.js | 2 + .../js/modules/calculation_colums.js | 468 + .../js/modules/calculation_colums.min.js | 2 + .../vendor/tabulator/js/modules/clipboard.js | 1014 + .../tabulator/js/modules/clipboard.min.js | 2 + .../vendor/tabulator/js/modules/data_tree.js | 335 + .../tabulator/js/modules/data_tree.min.js | 2 + .../vendor/tabulator/js/modules/download.js | 900 + .../tabulator/js/modules/download.min.js | 2 + htdocs/vendor/tabulator/js/modules/edit.js | 1712 ++ .../vendor/tabulator/js/modules/edit.min.js | 2 + htdocs/vendor/tabulator/js/modules/filter.js | 752 + .../vendor/tabulator/js/modules/filter.min.js | 2 + htdocs/vendor/tabulator/js/modules/format.js | 626 + .../vendor/tabulator/js/modules/format.min.js | 2 + .../tabulator/js/modules/frozen_columns.js | 243 + .../js/modules/frozen_columns.min.js | 2 + .../tabulator/js/modules/frozen_rows.js | 98 + .../tabulator/js/modules/frozen_rows.min.js | 2 + .../vendor/tabulator/js/modules/group_rows.js | 1048 + .../tabulator/js/modules/group_rows.min.js | 2 + htdocs/vendor/tabulator/js/modules/history.js | 133 + .../tabulator/js/modules/history.min.js | 2 + .../tabulator/js/modules/html_table_export.js | 377 + .../js/modules/html_table_export.min.js | 2 + .../tabulator/js/modules/html_table_import.js | 203 + .../js/modules/html_table_import.min.js | 2 + .../tabulator/js/modules/keybindings.js | 378 + .../tabulator/js/modules/keybindings.min.js | 2 + .../tabulator/js/modules/moveable_columns.js | 289 + .../js/modules/moveable_columns.min.js | 2 + .../tabulator/js/modules/moveable_rows.js | 580 + .../tabulator/js/modules/moveable_rows.min.js | 2 + htdocs/vendor/tabulator/js/modules/mutator.js | 113 + .../tabulator/js/modules/mutator.min.js | 2 + htdocs/vendor/tabulator/js/modules/page.js | 636 + .../vendor/tabulator/js/modules/page.min.js | 2 + .../tabulator/js/modules/persistence.js | 222 + .../tabulator/js/modules/persistence.min.js | 2 + htdocs/vendor/tabulator/js/modules/print.js | 96 + .../vendor/tabulator/js/modules/print.min.js | 2 + .../tabulator/js/modules/reactive_data.js | 235 + .../tabulator/js/modules/reactive_data.min.js | 2 + .../tabulator/js/modules/resize_columns.js | 161 + .../js/modules/resize_columns.min.js | 2 + .../tabulator/js/modules/resize_rows.js | 98 + .../tabulator/js/modules/resize_rows.min.js | 2 + .../tabulator/js/modules/resize_table.js | 38 + .../tabulator/js/modules/resize_table.min.js | 2 + .../tabulator/js/modules/responsive_layout.js | 255 + .../js/modules/responsive_layout.min.js | 2 + .../vendor/tabulator/js/modules/select_row.js | 359 + .../tabulator/js/modules/select_row.min.js | 2 + htdocs/vendor/tabulator/js/modules/sort.js | 560 + .../vendor/tabulator/js/modules/sort.min.js | 2 + .../vendor/tabulator/js/modules/validate.js | 212 + .../tabulator/js/modules/validate.min.js | 2 + htdocs/vendor/tabulator/js/tabulator.js | 22796 ++++++++++++++++ htdocs/vendor/tabulator/js/tabulator.min.js | 11 + htdocs/vendor/tabulator/js/tabulator_core.js | 7812 ++++++ .../vendor/tabulator/js/tabulator_core.min.js | 5 + startapp.sh | 4 + syncdb.pl | 108 + web/clock.html | 8 +- web/css/w3pro.css | 378 + web/index.html | 8 +- web/js/admin.js | 6 +- web/js/fieldsave.js | 48 + web/js/formsave.js | 55 + web/js/request_new.js | 149 + web/vendor/choices/base.css | 191 + web/vendor/choices/base.min.css | 1 + web/vendor/choices/choices.css | 368 + web/vendor/choices/choices.js | 6787 +++++ web/vendor/choices/choices.min.css | 1 + web/vendor/choices/choices.min.js | 58 + web/vendor/choices/scripts/choices.js | 6787 +++++ web/vendor/choices/scripts/choices.min.js | 58 + web/vendor/flatpickr/flatpickr.css | 784 + web/vendor/flatpickr/flatpickr.js | 2596 ++ web/vendor/flatpickr/flatpickr.min.css | 13 + web/vendor/flatpickr/flatpickr.min.js | 2 + web/vendor/flatpickr/ie.css | 13 + web/vendor/flatpickr/index.d.ts | 4 + web/vendor/flatpickr/l10n/de.d.ts | 66 + web/vendor/flatpickr/l10n/de.js | 70 + web/vendor/flatpickr/l10n/default.d.ts | 3 + web/vendor/flatpickr/l10n/default.js | 83 + web/vendor/flatpickr/l10n/fr.d.ts | 66 + web/vendor/flatpickr/l10n/fr.js | 75 + web/vendor/flatpickr/l10n/lu.d.ts | 67 + web/vendor/flatpickr/l10n/lu.js | 71 + .../plugins/confirmDate/confirmDate.css | 24 + .../plugins/confirmDate/confirmDate.d.ts | 9 + .../plugins/confirmDate/confirmDate.js | 84 + .../plugins/labelPlugin/labelPlugin.d.ts | 3 + .../plugins/labelPlugin/labelPlugin.js | 31 + .../flatpickr/plugins/minMaxTimePlugin.d.ts | 17 + .../flatpickr/plugins/minMaxTimePlugin.js | 326 + .../flatpickr/plugins/monthSelect/index.d.ts | 13 + .../flatpickr/plugins/monthSelect/index.js | 174 + .../flatpickr/plugins/monthSelect/style.css | 69 + .../plugins/monthSelect/tests.spec.d.ts | 1 + web/vendor/flatpickr/plugins/rangePlugin.d.ts | 12 + web/vendor/flatpickr/plugins/rangePlugin.js | 146 + .../flatpickr/plugins/scrollPlugin.d.ts | 3 + web/vendor/flatpickr/plugins/scrollPlugin.js | 58 + .../plugins/weekSelect/weekSelect.d.ts | 7 + .../plugins/weekSelect/weekSelect.js | 86 + web/vendor/flatpickr/themes/airbnb.css | 872 + web/vendor/flatpickr/themes/confetti.css | 795 + web/vendor/flatpickr/themes/dark.css | 784 + web/vendor/flatpickr/themes/light.css | 798 + web/vendor/flatpickr/themes/material_blue.css | 795 + .../flatpickr/themes/material_green.css | 795 + .../flatpickr/themes/material_orange.css | 795 + web/vendor/flatpickr/themes/material_red.css | 795 + web/vendor/flatpickr/types/globals.d.ts | 20 + web/vendor/flatpickr/types/instance.d.ts | 118 + web/vendor/flatpickr/types/locale.d.ts | 45 + web/vendor/flatpickr/types/options.d.ts | 144 + web/vendor/flatpickr/typings.d.ts | 38 + web/vendor/flatpickr/utils/dates.d.ts | 17 + web/vendor/flatpickr/utils/dom.d.ts | 6 + web/vendor/flatpickr/utils/formatting.d.ts | 13 + web/vendor/flatpickr/utils/index.d.ts | 8 + web/vendor/flatpickr/utils/polyfills.d.ts | 0 web/vendor/moment/moment-with-locales.min.js | 1 + web/vendor/moment/moment.min.js | 1 + .../css/bootstrap/tabulator_bootstrap.css | 842 + .../css/bootstrap/tabulator_bootstrap.min.css | 3 + .../bootstrap/tabulator_bootstrap.min.css.map | 1 + .../css/bootstrap/tabulator_bootstrap4.css | 1045 + .../bootstrap/tabulator_bootstrap4.min.css | 3 + .../tabulator_bootstrap4.min.css.map | 1 + .../tabulator/css/bulma/tabulator_bulma.css | 847 + .../css/bulma/tabulator_bulma.min.css | 3 + .../css/bulma/tabulator_bulma.min.css.map | 1 + .../css/semantic-ui/tabulator_semantic-ui.css | 1322 + .../semantic-ui/tabulator_semantic-ui.min.css | 3 + .../tabulator_semantic-ui.min.css.map | 1 + web/vendor/tabulator/css/tabulator.css | 807 + web/vendor/tabulator/css/tabulator.min.css | 3 + .../tabulator/css/tabulator.min.css.map | 1 + .../tabulator/css/tabulator_midnight.css | 810 + .../tabulator/css/tabulator_midnight.min.css | 3 + .../css/tabulator_midnight.min.css.map | 1 + web/vendor/tabulator/css/tabulator_modern.css | 832 + .../tabulator/css/tabulator_modern.min.css | 3 + .../css/tabulator_modern.min.css.map | 1 + web/vendor/tabulator/css/tabulator_simple.css | 804 + .../tabulator/css/tabulator_simple.min.css | 3 + .../css/tabulator_simple.min.css.map | 1 + web/vendor/tabulator/css/tabulator_site.css | 804 + .../tabulator/css/tabulator_site.min.css | 3 + .../tabulator/css/tabulator_site.min.css.map | 1 + web/vendor/tabulator/js/jquery_wrapper.js | 46 + web/vendor/tabulator/js/jquery_wrapper.min.js | 2 + web/vendor/tabulator/js/modules/accessor.js | 91 + .../tabulator/js/modules/accessor.min.js | 2 + web/vendor/tabulator/js/modules/ajax.js | 465 + web/vendor/tabulator/js/modules/ajax.min.js | 2 + .../js/modules/calculation_colums.js | 468 + .../js/modules/calculation_colums.min.js | 2 + web/vendor/tabulator/js/modules/clipboard.js | 1014 + .../tabulator/js/modules/clipboard.min.js | 2 + web/vendor/tabulator/js/modules/data_tree.js | 335 + .../tabulator/js/modules/data_tree.min.js | 2 + web/vendor/tabulator/js/modules/download.js | 900 + .../tabulator/js/modules/download.min.js | 2 + web/vendor/tabulator/js/modules/edit.js | 1712 ++ web/vendor/tabulator/js/modules/edit.min.js | 2 + web/vendor/tabulator/js/modules/filter.js | 752 + web/vendor/tabulator/js/modules/filter.min.js | 2 + web/vendor/tabulator/js/modules/format.js | 626 + web/vendor/tabulator/js/modules/format.min.js | 2 + .../tabulator/js/modules/frozen_columns.js | 243 + .../js/modules/frozen_columns.min.js | 2 + .../tabulator/js/modules/frozen_rows.js | 98 + .../tabulator/js/modules/frozen_rows.min.js | 2 + web/vendor/tabulator/js/modules/group_rows.js | 1048 + .../tabulator/js/modules/group_rows.min.js | 2 + web/vendor/tabulator/js/modules/history.js | 133 + .../tabulator/js/modules/history.min.js | 2 + .../tabulator/js/modules/html_table_export.js | 377 + .../js/modules/html_table_export.min.js | 2 + .../tabulator/js/modules/html_table_import.js | 203 + .../js/modules/html_table_import.min.js | 2 + .../tabulator/js/modules/keybindings.js | 378 + .../tabulator/js/modules/keybindings.min.js | 2 + .../tabulator/js/modules/moveable_columns.js | 289 + .../js/modules/moveable_columns.min.js | 2 + .../tabulator/js/modules/moveable_rows.js | 580 + .../tabulator/js/modules/moveable_rows.min.js | 2 + web/vendor/tabulator/js/modules/mutator.js | 113 + .../tabulator/js/modules/mutator.min.js | 2 + web/vendor/tabulator/js/modules/page.js | 636 + web/vendor/tabulator/js/modules/page.min.js | 2 + .../tabulator/js/modules/persistence.js | 222 + .../tabulator/js/modules/persistence.min.js | 2 + web/vendor/tabulator/js/modules/print.js | 96 + web/vendor/tabulator/js/modules/print.min.js | 2 + .../tabulator/js/modules/reactive_data.js | 235 + .../tabulator/js/modules/reactive_data.min.js | 2 + .../tabulator/js/modules/resize_columns.js | 161 + .../js/modules/resize_columns.min.js | 2 + .../tabulator/js/modules/resize_rows.js | 98 + .../tabulator/js/modules/resize_rows.min.js | 2 + .../tabulator/js/modules/resize_table.js | 38 + .../tabulator/js/modules/resize_table.min.js | 2 + .../tabulator/js/modules/responsive_layout.js | 255 + .../js/modules/responsive_layout.min.js | 2 + web/vendor/tabulator/js/modules/select_row.js | 359 + .../tabulator/js/modules/select_row.min.js | 2 + web/vendor/tabulator/js/modules/sort.js | 560 + web/vendor/tabulator/js/modules/sort.min.js | 2 + web/vendor/tabulator/js/modules/validate.js | 212 + .../tabulator/js/modules/validate.min.js | 2 + web/vendor/tabulator/js/tabulator.js | 22796 ++++++++++++++++ web/vendor/tabulator/js/tabulator.min.js | 11 + web/vendor/tabulator/js/tabulator_core.js | 7812 ++++++ web/vendor/tabulator/js/tabulator_core.min.js | 5 + 364 files changed, 161168 insertions(+), 30 deletions(-) create mode 100755 CGI/api/db.cgi create mode 100755 CGI/api/lib/dksconfig.pm create mode 100755 CGI/api/lib/dksdb.pm create mode 100755 CGI/api/lib/sendemail.pm create mode 100755 CGI/api/lib/session.pm create mode 100644 CGI/api/service.cgi create mode 100644 CGI/api/system.cgi create mode 100644 CGI/api/tmp/sql.log create mode 100755 CGI/index.cgi create mode 100755 CGI/tmpl/app/hourtrax/index.tt create mode 100644 CGI/tmpl/app/hourtrax/module/clock/index.js create mode 100644 CGI/tmpl/app/hourtrax/module/clock/index.tt create mode 100644 CGI/tmpl/app/hourtrax/module/members/index.js create mode 100644 CGI/tmpl/app/hourtrax/module/members/index.tt create mode 100644 CGI/tmpl/app/hourtrax/module/settings/index.js create mode 100644 CGI/tmpl/app/hourtrax/module/settings/index.tt create mode 100644 CGI/tmpl/app/hourtrax/module/timetrack/index.js create mode 100644 CGI/tmpl/app/hourtrax/module/timetrack/index.tt create mode 100644 CGI/tmpl/app/timeclock/index.js create mode 100644 CGI/tmpl/app/timeclock/index.tt create mode 100644 CGI/tmpl/app/timeclock/login.js create mode 100644 CGI/tmpl/app/timeclock/track.js create mode 100755 CGI/tmpl/block/snackbar.tt create mode 100755 CGI/tmpl/skeleton/app.tt create mode 100755 CGI/tmpl/skeleton/file.tt create mode 100755 CGI/tmpl/skeleton/index.tt create mode 100755 CGI/tmpl/skeleton/module.tt create mode 100644 Hourtraxsrv.pl create mode 100644 access.log create mode 120000 data/.dks create mode 100644 error.log create mode 100644 htdocs/clock.html create mode 100644 htdocs/css/admin.css create mode 100644 htdocs/css/clock.css create mode 100755 htdocs/css/w3pro.css create mode 100644 htdocs/img/hourtrax.png create mode 100644 htdocs/index.html create mode 100755 htdocs/js/admin.js create mode 100644 htdocs/js/admin_ht.js create mode 100644 htdocs/js/database.js create mode 100755 htdocs/js/fieldsave.js create mode 100755 htdocs/js/formsave.js create mode 100644 htdocs/js/jquery-3.2.1.min.js create mode 100755 htdocs/js/moduleglobal.js create mode 100755 htdocs/js/request.js create mode 100644 htdocs/js/request_old.js create mode 100644 htdocs/js/sysconfig.js create mode 100644 htdocs/supported.html create mode 100644 htdocs/test.html create mode 100755 htdocs/vendor/choices/base.css create mode 100755 htdocs/vendor/choices/base.min.css create mode 100755 htdocs/vendor/choices/choices.css create mode 100755 htdocs/vendor/choices/choices.js create mode 100755 htdocs/vendor/choices/choices.min.css create mode 100755 htdocs/vendor/choices/choices.min.js create mode 100755 htdocs/vendor/choices/scripts/choices.js create mode 100755 htdocs/vendor/choices/scripts/choices.min.js create mode 100755 htdocs/vendor/flatpickr/flatpickr.css create mode 100755 htdocs/vendor/flatpickr/flatpickr.js create mode 100755 htdocs/vendor/flatpickr/flatpickr.min.css create mode 100755 htdocs/vendor/flatpickr/flatpickr.min.js create mode 100755 htdocs/vendor/flatpickr/ie.css create mode 100755 htdocs/vendor/flatpickr/index.d.ts create mode 100755 htdocs/vendor/flatpickr/l10n/de.d.ts create mode 100755 htdocs/vendor/flatpickr/l10n/de.js create mode 100755 htdocs/vendor/flatpickr/l10n/default.d.ts create mode 100755 htdocs/vendor/flatpickr/l10n/default.js create mode 100755 htdocs/vendor/flatpickr/l10n/fr.d.ts create mode 100755 htdocs/vendor/flatpickr/l10n/fr.js create mode 100755 htdocs/vendor/flatpickr/l10n/lu.d.ts create mode 100755 htdocs/vendor/flatpickr/l10n/lu.js create mode 100755 htdocs/vendor/flatpickr/plugins/confirmDate/confirmDate.css create mode 100755 htdocs/vendor/flatpickr/plugins/confirmDate/confirmDate.d.ts create mode 100755 htdocs/vendor/flatpickr/plugins/confirmDate/confirmDate.js create mode 100755 htdocs/vendor/flatpickr/plugins/labelPlugin/labelPlugin.d.ts create mode 100755 htdocs/vendor/flatpickr/plugins/labelPlugin/labelPlugin.js create mode 100755 htdocs/vendor/flatpickr/plugins/minMaxTimePlugin.d.ts create mode 100755 htdocs/vendor/flatpickr/plugins/minMaxTimePlugin.js create mode 100755 htdocs/vendor/flatpickr/plugins/monthSelect/index.d.ts create mode 100755 htdocs/vendor/flatpickr/plugins/monthSelect/index.js create mode 100755 htdocs/vendor/flatpickr/plugins/monthSelect/style.css create mode 100755 htdocs/vendor/flatpickr/plugins/monthSelect/tests.spec.d.ts create mode 100755 htdocs/vendor/flatpickr/plugins/rangePlugin.d.ts create mode 100755 htdocs/vendor/flatpickr/plugins/rangePlugin.js create mode 100755 htdocs/vendor/flatpickr/plugins/scrollPlugin.d.ts create mode 100755 htdocs/vendor/flatpickr/plugins/scrollPlugin.js create mode 100755 htdocs/vendor/flatpickr/plugins/weekSelect/weekSelect.d.ts create mode 100755 htdocs/vendor/flatpickr/plugins/weekSelect/weekSelect.js create mode 100755 htdocs/vendor/flatpickr/themes/airbnb.css create mode 100755 htdocs/vendor/flatpickr/themes/confetti.css create mode 100755 htdocs/vendor/flatpickr/themes/dark.css create mode 100755 htdocs/vendor/flatpickr/themes/light.css create mode 100755 htdocs/vendor/flatpickr/themes/material_blue.css create mode 100755 htdocs/vendor/flatpickr/themes/material_green.css create mode 100755 htdocs/vendor/flatpickr/themes/material_orange.css create mode 100755 htdocs/vendor/flatpickr/themes/material_red.css create mode 100755 htdocs/vendor/flatpickr/types/globals.d.ts create mode 100755 htdocs/vendor/flatpickr/types/instance.d.ts create mode 100755 htdocs/vendor/flatpickr/types/locale.d.ts create mode 100755 htdocs/vendor/flatpickr/types/options.d.ts create mode 100755 htdocs/vendor/flatpickr/typings.d.ts create mode 100755 htdocs/vendor/flatpickr/utils/dates.d.ts create mode 100755 htdocs/vendor/flatpickr/utils/dom.d.ts create mode 100755 htdocs/vendor/flatpickr/utils/formatting.d.ts create mode 100755 htdocs/vendor/flatpickr/utils/index.d.ts create mode 100755 htdocs/vendor/flatpickr/utils/polyfills.d.ts create mode 100755 htdocs/vendor/moment/moment-with-locales.min.js create mode 100755 htdocs/vendor/moment/moment.min.js create mode 100755 htdocs/vendor/tabulator/css/bootstrap/tabulator_bootstrap.css create mode 100755 htdocs/vendor/tabulator/css/bootstrap/tabulator_bootstrap.min.css create mode 100755 htdocs/vendor/tabulator/css/bootstrap/tabulator_bootstrap.min.css.map create mode 100755 htdocs/vendor/tabulator/css/bootstrap/tabulator_bootstrap4.css create mode 100755 htdocs/vendor/tabulator/css/bootstrap/tabulator_bootstrap4.min.css create mode 100755 htdocs/vendor/tabulator/css/bootstrap/tabulator_bootstrap4.min.css.map create mode 100755 htdocs/vendor/tabulator/css/bulma/tabulator_bulma.css create mode 100755 htdocs/vendor/tabulator/css/bulma/tabulator_bulma.min.css create mode 100755 htdocs/vendor/tabulator/css/bulma/tabulator_bulma.min.css.map create mode 100755 htdocs/vendor/tabulator/css/semantic-ui/tabulator_semantic-ui.css create mode 100755 htdocs/vendor/tabulator/css/semantic-ui/tabulator_semantic-ui.min.css create mode 100755 htdocs/vendor/tabulator/css/semantic-ui/tabulator_semantic-ui.min.css.map create mode 100755 htdocs/vendor/tabulator/css/tabulator.css create mode 100755 htdocs/vendor/tabulator/css/tabulator.min.css create mode 100755 htdocs/vendor/tabulator/css/tabulator.min.css.map create mode 100755 htdocs/vendor/tabulator/css/tabulator_midnight.css create mode 100755 htdocs/vendor/tabulator/css/tabulator_midnight.min.css create mode 100755 htdocs/vendor/tabulator/css/tabulator_midnight.min.css.map create mode 100755 htdocs/vendor/tabulator/css/tabulator_modern.css create mode 100755 htdocs/vendor/tabulator/css/tabulator_modern.min.css create mode 100755 htdocs/vendor/tabulator/css/tabulator_modern.min.css.map create mode 100755 htdocs/vendor/tabulator/css/tabulator_simple.css create mode 100755 htdocs/vendor/tabulator/css/tabulator_simple.min.css create mode 100755 htdocs/vendor/tabulator/css/tabulator_simple.min.css.map create mode 100755 htdocs/vendor/tabulator/css/tabulator_site.css create mode 100755 htdocs/vendor/tabulator/css/tabulator_site.min.css create mode 100755 htdocs/vendor/tabulator/css/tabulator_site.min.css.map create mode 100755 htdocs/vendor/tabulator/js/jquery_wrapper.js create mode 100755 htdocs/vendor/tabulator/js/jquery_wrapper.min.js create mode 100755 htdocs/vendor/tabulator/js/modules/accessor.js create mode 100755 htdocs/vendor/tabulator/js/modules/accessor.min.js create mode 100755 htdocs/vendor/tabulator/js/modules/ajax.js create mode 100755 htdocs/vendor/tabulator/js/modules/ajax.min.js create mode 100755 htdocs/vendor/tabulator/js/modules/calculation_colums.js create mode 100755 htdocs/vendor/tabulator/js/modules/calculation_colums.min.js create mode 100755 htdocs/vendor/tabulator/js/modules/clipboard.js create mode 100755 htdocs/vendor/tabulator/js/modules/clipboard.min.js create mode 100755 htdocs/vendor/tabulator/js/modules/data_tree.js create mode 100755 htdocs/vendor/tabulator/js/modules/data_tree.min.js create mode 100755 htdocs/vendor/tabulator/js/modules/download.js create mode 100755 htdocs/vendor/tabulator/js/modules/download.min.js create mode 100755 htdocs/vendor/tabulator/js/modules/edit.js create mode 100755 htdocs/vendor/tabulator/js/modules/edit.min.js create mode 100755 htdocs/vendor/tabulator/js/modules/filter.js create mode 100755 htdocs/vendor/tabulator/js/modules/filter.min.js create mode 100755 htdocs/vendor/tabulator/js/modules/format.js create mode 100755 htdocs/vendor/tabulator/js/modules/format.min.js create mode 100755 htdocs/vendor/tabulator/js/modules/frozen_columns.js create mode 100755 htdocs/vendor/tabulator/js/modules/frozen_columns.min.js create mode 100755 htdocs/vendor/tabulator/js/modules/frozen_rows.js create mode 100755 htdocs/vendor/tabulator/js/modules/frozen_rows.min.js create mode 100755 htdocs/vendor/tabulator/js/modules/group_rows.js create mode 100755 htdocs/vendor/tabulator/js/modules/group_rows.min.js create mode 100755 htdocs/vendor/tabulator/js/modules/history.js create mode 100755 htdocs/vendor/tabulator/js/modules/history.min.js create mode 100755 htdocs/vendor/tabulator/js/modules/html_table_export.js create mode 100755 htdocs/vendor/tabulator/js/modules/html_table_export.min.js create mode 100755 htdocs/vendor/tabulator/js/modules/html_table_import.js create mode 100755 htdocs/vendor/tabulator/js/modules/html_table_import.min.js create mode 100755 htdocs/vendor/tabulator/js/modules/keybindings.js create mode 100755 htdocs/vendor/tabulator/js/modules/keybindings.min.js create mode 100755 htdocs/vendor/tabulator/js/modules/moveable_columns.js create mode 100755 htdocs/vendor/tabulator/js/modules/moveable_columns.min.js create mode 100755 htdocs/vendor/tabulator/js/modules/moveable_rows.js create mode 100755 htdocs/vendor/tabulator/js/modules/moveable_rows.min.js create mode 100755 htdocs/vendor/tabulator/js/modules/mutator.js create mode 100755 htdocs/vendor/tabulator/js/modules/mutator.min.js create mode 100755 htdocs/vendor/tabulator/js/modules/page.js create mode 100755 htdocs/vendor/tabulator/js/modules/page.min.js create mode 100755 htdocs/vendor/tabulator/js/modules/persistence.js create mode 100755 htdocs/vendor/tabulator/js/modules/persistence.min.js create mode 100755 htdocs/vendor/tabulator/js/modules/print.js create mode 100755 htdocs/vendor/tabulator/js/modules/print.min.js create mode 100755 htdocs/vendor/tabulator/js/modules/reactive_data.js create mode 100755 htdocs/vendor/tabulator/js/modules/reactive_data.min.js create mode 100755 htdocs/vendor/tabulator/js/modules/resize_columns.js create mode 100755 htdocs/vendor/tabulator/js/modules/resize_columns.min.js create mode 100755 htdocs/vendor/tabulator/js/modules/resize_rows.js create mode 100755 htdocs/vendor/tabulator/js/modules/resize_rows.min.js create mode 100755 htdocs/vendor/tabulator/js/modules/resize_table.js create mode 100755 htdocs/vendor/tabulator/js/modules/resize_table.min.js create mode 100755 htdocs/vendor/tabulator/js/modules/responsive_layout.js create mode 100755 htdocs/vendor/tabulator/js/modules/responsive_layout.min.js create mode 100755 htdocs/vendor/tabulator/js/modules/select_row.js create mode 100755 htdocs/vendor/tabulator/js/modules/select_row.min.js create mode 100755 htdocs/vendor/tabulator/js/modules/sort.js create mode 100755 htdocs/vendor/tabulator/js/modules/sort.min.js create mode 100755 htdocs/vendor/tabulator/js/modules/validate.js create mode 100755 htdocs/vendor/tabulator/js/modules/validate.min.js create mode 100755 htdocs/vendor/tabulator/js/tabulator.js create mode 100755 htdocs/vendor/tabulator/js/tabulator.min.js create mode 100755 htdocs/vendor/tabulator/js/tabulator_core.js create mode 100755 htdocs/vendor/tabulator/js/tabulator_core.min.js create mode 100644 startapp.sh create mode 100644 syncdb.pl create mode 100755 web/css/w3pro.css create mode 100755 web/js/fieldsave.js create mode 100755 web/js/formsave.js create mode 100755 web/js/request_new.js create mode 100755 web/vendor/choices/base.css create mode 100755 web/vendor/choices/base.min.css create mode 100755 web/vendor/choices/choices.css create mode 100755 web/vendor/choices/choices.js create mode 100755 web/vendor/choices/choices.min.css create mode 100755 web/vendor/choices/choices.min.js create mode 100755 web/vendor/choices/scripts/choices.js create mode 100755 web/vendor/choices/scripts/choices.min.js create mode 100755 web/vendor/flatpickr/flatpickr.css create mode 100755 web/vendor/flatpickr/flatpickr.js create mode 100755 web/vendor/flatpickr/flatpickr.min.css create mode 100755 web/vendor/flatpickr/flatpickr.min.js create mode 100755 web/vendor/flatpickr/ie.css create mode 100755 web/vendor/flatpickr/index.d.ts create mode 100755 web/vendor/flatpickr/l10n/de.d.ts create mode 100755 web/vendor/flatpickr/l10n/de.js create mode 100755 web/vendor/flatpickr/l10n/default.d.ts create mode 100755 web/vendor/flatpickr/l10n/default.js create mode 100755 web/vendor/flatpickr/l10n/fr.d.ts create mode 100755 web/vendor/flatpickr/l10n/fr.js create mode 100755 web/vendor/flatpickr/l10n/lu.d.ts create mode 100755 web/vendor/flatpickr/l10n/lu.js create mode 100755 web/vendor/flatpickr/plugins/confirmDate/confirmDate.css create mode 100755 web/vendor/flatpickr/plugins/confirmDate/confirmDate.d.ts create mode 100755 web/vendor/flatpickr/plugins/confirmDate/confirmDate.js create mode 100755 web/vendor/flatpickr/plugins/labelPlugin/labelPlugin.d.ts create mode 100755 web/vendor/flatpickr/plugins/labelPlugin/labelPlugin.js create mode 100755 web/vendor/flatpickr/plugins/minMaxTimePlugin.d.ts create mode 100755 web/vendor/flatpickr/plugins/minMaxTimePlugin.js create mode 100755 web/vendor/flatpickr/plugins/monthSelect/index.d.ts create mode 100755 web/vendor/flatpickr/plugins/monthSelect/index.js create mode 100755 web/vendor/flatpickr/plugins/monthSelect/style.css create mode 100755 web/vendor/flatpickr/plugins/monthSelect/tests.spec.d.ts create mode 100755 web/vendor/flatpickr/plugins/rangePlugin.d.ts create mode 100755 web/vendor/flatpickr/plugins/rangePlugin.js create mode 100755 web/vendor/flatpickr/plugins/scrollPlugin.d.ts create mode 100755 web/vendor/flatpickr/plugins/scrollPlugin.js create mode 100755 web/vendor/flatpickr/plugins/weekSelect/weekSelect.d.ts create mode 100755 web/vendor/flatpickr/plugins/weekSelect/weekSelect.js create mode 100755 web/vendor/flatpickr/themes/airbnb.css create mode 100755 web/vendor/flatpickr/themes/confetti.css create mode 100755 web/vendor/flatpickr/themes/dark.css create mode 100755 web/vendor/flatpickr/themes/light.css create mode 100755 web/vendor/flatpickr/themes/material_blue.css create mode 100755 web/vendor/flatpickr/themes/material_green.css create mode 100755 web/vendor/flatpickr/themes/material_orange.css create mode 100755 web/vendor/flatpickr/themes/material_red.css create mode 100755 web/vendor/flatpickr/types/globals.d.ts create mode 100755 web/vendor/flatpickr/types/instance.d.ts create mode 100755 web/vendor/flatpickr/types/locale.d.ts create mode 100755 web/vendor/flatpickr/types/options.d.ts create mode 100755 web/vendor/flatpickr/typings.d.ts create mode 100755 web/vendor/flatpickr/utils/dates.d.ts create mode 100755 web/vendor/flatpickr/utils/dom.d.ts create mode 100755 web/vendor/flatpickr/utils/formatting.d.ts create mode 100755 web/vendor/flatpickr/utils/index.d.ts create mode 100755 web/vendor/flatpickr/utils/polyfills.d.ts create mode 100755 web/vendor/moment/moment-with-locales.min.js create mode 100755 web/vendor/moment/moment.min.js create mode 100755 web/vendor/tabulator/css/bootstrap/tabulator_bootstrap.css create mode 100755 web/vendor/tabulator/css/bootstrap/tabulator_bootstrap.min.css create mode 100755 web/vendor/tabulator/css/bootstrap/tabulator_bootstrap.min.css.map create mode 100755 web/vendor/tabulator/css/bootstrap/tabulator_bootstrap4.css create mode 100755 web/vendor/tabulator/css/bootstrap/tabulator_bootstrap4.min.css create mode 100755 web/vendor/tabulator/css/bootstrap/tabulator_bootstrap4.min.css.map create mode 100755 web/vendor/tabulator/css/bulma/tabulator_bulma.css create mode 100755 web/vendor/tabulator/css/bulma/tabulator_bulma.min.css create mode 100755 web/vendor/tabulator/css/bulma/tabulator_bulma.min.css.map create mode 100755 web/vendor/tabulator/css/semantic-ui/tabulator_semantic-ui.css create mode 100755 web/vendor/tabulator/css/semantic-ui/tabulator_semantic-ui.min.css create mode 100755 web/vendor/tabulator/css/semantic-ui/tabulator_semantic-ui.min.css.map create mode 100755 web/vendor/tabulator/css/tabulator.css create mode 100755 web/vendor/tabulator/css/tabulator.min.css create mode 100755 web/vendor/tabulator/css/tabulator.min.css.map create mode 100755 web/vendor/tabulator/css/tabulator_midnight.css create mode 100755 web/vendor/tabulator/css/tabulator_midnight.min.css create mode 100755 web/vendor/tabulator/css/tabulator_midnight.min.css.map create mode 100755 web/vendor/tabulator/css/tabulator_modern.css create mode 100755 web/vendor/tabulator/css/tabulator_modern.min.css create mode 100755 web/vendor/tabulator/css/tabulator_modern.min.css.map create mode 100755 web/vendor/tabulator/css/tabulator_simple.css create mode 100755 web/vendor/tabulator/css/tabulator_simple.min.css create mode 100755 web/vendor/tabulator/css/tabulator_simple.min.css.map create mode 100755 web/vendor/tabulator/css/tabulator_site.css create mode 100755 web/vendor/tabulator/css/tabulator_site.min.css create mode 100755 web/vendor/tabulator/css/tabulator_site.min.css.map create mode 100755 web/vendor/tabulator/js/jquery_wrapper.js create mode 100755 web/vendor/tabulator/js/jquery_wrapper.min.js create mode 100755 web/vendor/tabulator/js/modules/accessor.js create mode 100755 web/vendor/tabulator/js/modules/accessor.min.js create mode 100755 web/vendor/tabulator/js/modules/ajax.js create mode 100755 web/vendor/tabulator/js/modules/ajax.min.js create mode 100755 web/vendor/tabulator/js/modules/calculation_colums.js create mode 100755 web/vendor/tabulator/js/modules/calculation_colums.min.js create mode 100755 web/vendor/tabulator/js/modules/clipboard.js create mode 100755 web/vendor/tabulator/js/modules/clipboard.min.js create mode 100755 web/vendor/tabulator/js/modules/data_tree.js create mode 100755 web/vendor/tabulator/js/modules/data_tree.min.js create mode 100755 web/vendor/tabulator/js/modules/download.js create mode 100755 web/vendor/tabulator/js/modules/download.min.js create mode 100755 web/vendor/tabulator/js/modules/edit.js create mode 100755 web/vendor/tabulator/js/modules/edit.min.js create mode 100755 web/vendor/tabulator/js/modules/filter.js create mode 100755 web/vendor/tabulator/js/modules/filter.min.js create mode 100755 web/vendor/tabulator/js/modules/format.js create mode 100755 web/vendor/tabulator/js/modules/format.min.js create mode 100755 web/vendor/tabulator/js/modules/frozen_columns.js create mode 100755 web/vendor/tabulator/js/modules/frozen_columns.min.js create mode 100755 web/vendor/tabulator/js/modules/frozen_rows.js create mode 100755 web/vendor/tabulator/js/modules/frozen_rows.min.js create mode 100755 web/vendor/tabulator/js/modules/group_rows.js create mode 100755 web/vendor/tabulator/js/modules/group_rows.min.js create mode 100755 web/vendor/tabulator/js/modules/history.js create mode 100755 web/vendor/tabulator/js/modules/history.min.js create mode 100755 web/vendor/tabulator/js/modules/html_table_export.js create mode 100755 web/vendor/tabulator/js/modules/html_table_export.min.js create mode 100755 web/vendor/tabulator/js/modules/html_table_import.js create mode 100755 web/vendor/tabulator/js/modules/html_table_import.min.js create mode 100755 web/vendor/tabulator/js/modules/keybindings.js create mode 100755 web/vendor/tabulator/js/modules/keybindings.min.js create mode 100755 web/vendor/tabulator/js/modules/moveable_columns.js create mode 100755 web/vendor/tabulator/js/modules/moveable_columns.min.js create mode 100755 web/vendor/tabulator/js/modules/moveable_rows.js create mode 100755 web/vendor/tabulator/js/modules/moveable_rows.min.js create mode 100755 web/vendor/tabulator/js/modules/mutator.js create mode 100755 web/vendor/tabulator/js/modules/mutator.min.js create mode 100755 web/vendor/tabulator/js/modules/page.js create mode 100755 web/vendor/tabulator/js/modules/page.min.js create mode 100755 web/vendor/tabulator/js/modules/persistence.js create mode 100755 web/vendor/tabulator/js/modules/persistence.min.js create mode 100755 web/vendor/tabulator/js/modules/print.js create mode 100755 web/vendor/tabulator/js/modules/print.min.js create mode 100755 web/vendor/tabulator/js/modules/reactive_data.js create mode 100755 web/vendor/tabulator/js/modules/reactive_data.min.js create mode 100755 web/vendor/tabulator/js/modules/resize_columns.js create mode 100755 web/vendor/tabulator/js/modules/resize_columns.min.js create mode 100755 web/vendor/tabulator/js/modules/resize_rows.js create mode 100755 web/vendor/tabulator/js/modules/resize_rows.min.js create mode 100755 web/vendor/tabulator/js/modules/resize_table.js create mode 100755 web/vendor/tabulator/js/modules/resize_table.min.js create mode 100755 web/vendor/tabulator/js/modules/responsive_layout.js create mode 100755 web/vendor/tabulator/js/modules/responsive_layout.min.js create mode 100755 web/vendor/tabulator/js/modules/select_row.js create mode 100755 web/vendor/tabulator/js/modules/select_row.min.js create mode 100755 web/vendor/tabulator/js/modules/sort.js create mode 100755 web/vendor/tabulator/js/modules/sort.min.js create mode 100755 web/vendor/tabulator/js/modules/validate.js create mode 100755 web/vendor/tabulator/js/modules/validate.min.js create mode 100755 web/vendor/tabulator/js/tabulator.js create mode 100755 web/vendor/tabulator/js/tabulator.min.js create mode 100755 web/vendor/tabulator/js/tabulator_core.js create mode 100755 web/vendor/tabulator/js/tabulator_core.min.js diff --git a/CGI/api/db.cgi b/CGI/api/db.cgi new file mode 100755 index 0000000..a69e00b --- /dev/null +++ b/CGI/api/db.cgi @@ -0,0 +1,126 @@ +#!/Users/kilian/perl5/perlbrew/perls/perl-5.24.1/bin/perl +use strict; +use FindBin qw($Bin); +# use lib ('CGI/api/lib/perl5'); +# use lib ('CGI/api/lib'); +use lib ($Bin.'/CGI/api/lib/perl5'); +use lib ($Bin.'/CGI/api/lib'); +use CGI; +use CGI::Cookie; +# use CGI::Carp qw/fatalsToBrowser/; +use File::Basename; +use JSON::PP; +use UUID::Tiny ':std'; +use dksconfig qw/$sitecfg/; +use dksdb; + +# use session; +#use sendemail; +my $cgi = new CGI(); +my $scriptpath = $cgi->url(-absolute => 1); +my $p = (); +my @params = $cgi->param(); +foreach my $pe (@params){ + $p->{$pe} = $cgi->param($pe); +} +my $html->{result} = (); +# $p->{sid} = $cgi->cookie($sitecfg->{cookiename}); +# my $se = session->new(); +# my $sess = $se->getsession($p->{sid}); +print $cgi->header(-type=>"application/json", -charset => "utf-8"); +my $dbredirect = {}; +if ($sitecfg->{dbtype} eq "SQLite"){ + if (exists($p->{db})){ + $dbredirect->{dsn} = "DBI:SQLite:dbname=".$sitecfg->{datapath}.'/'.$p->{db}.'.sqlite'; + } +} +$html->{conn} = $dbredirect; +# if ($sess == undef){ +# $html->{error} = "No Authorisation"; +# print JSON::PP::encode_json($html); +# exit(0); +# } +# $html->{p} = $p; +# $html->{sess} =$sess; +#my $datapath = $ENV{"DOCUMENT_ROOT"}.dirname(dirname($scriptpath)).'/data/'; +if (($cgi->request_method() eq "GET") || ($cgi->request_method() eq "POST")){ + + # my @params = $cgi->param(); + # foreach my $pp (@params){ + # $p->{$pp} = $cgi->param($pp); + # } + my $db = dksdb->new($dbredirect); + if (exists($p->{get})){ + my $sql = "select * from vw_".$p->{get}; + if (exists($p->{fields}) ){ + $sql = "select ".$p->{fields}." from vw_".$p->{get}; + } + if (exists($p->{filter})){ + $sql .= " WHERE ".$p->{filter}.";"; + } + $html->{result}->{sqldata} = $db->query($sql); + } + elsif (exists($p->{set})){ + my $type = "ins"; + foreach my $x (keys(%{$p})){ + if ($x =~ /^ident_/ ){ + if ($p->{$x} ne ""){ + $type = "upd"; + } else { + my $uuid = create_uuid(UUID_TIME); + my $uuid_str=uuid_to_string($uuid); + $p->{$x} = $uuid_str; + } + + } + } + + my $x = $p; + delete $x->{sid}; + delete $x->{set}; + my @sql = (); + + if ($type eq "ins"){ + + @sql = $db->create_ddl_insert($x); + }else { + @sql = $db->create_ddl_update($x); + } + if (scalar(@sql) > 0 ){ + my $rid = $db->query($sql[0]); + if (keys(%{$rid}) > 0 ){ + $html->{result} = $rid->{0}; + } + } + } + elsif (exists($p->{del})){ + my $x = $p; + delete $x->{sid}; + delete $x->{del}; + my @sql = $db->create_ddl_delete($x); + if (scalar(@sql) > 0 ){ + my $rid = $db->exec($sql[0]); + if (keys(%{$rid}) > 0 ){ + $html->{result} = $rid->{0}; + } + } + } + elsif (exists($p->{sql})){ + if (exists($p->{key})){ + $html->{result} = $db->querybykey($p->{key},$p->{sql}); + } + if ((lc($p->{sql}) =~ /^insert/) || (lc($p->{sql}) =~ /^update/) || (lc($p->{sql}) =~ /^delete/)){ + $html->{result} = $db->exec($p->{sql}); + } + else { + $html->{result} = $db->query($p->{sql}); + } + } + elsif (exists($p->{ddl})){ + $html->{result} = $db->exec($p->{sql}); + } +} +print JSON::PP::encode_json($html); +# for my $e ( keys %ENV ) { +# print "$e: $ENV{$e}
"; +# } \ No newline at end of file diff --git a/CGI/api/lib/dksconfig.pm b/CGI/api/lib/dksconfig.pm new file mode 100755 index 0000000..fba0eb5 --- /dev/null +++ b/CGI/api/lib/dksconfig.pm @@ -0,0 +1,44 @@ +package dksconfig; + +use strict; +# use lib ('./lib/perl5'); +# use lib ('./lib'); +# use lib ('./'); +use File::Basename; +use Exporter 'import'; +our @EXPORT_OK = qw($sitecfg); +my $cfgpath='dks'; +if ($^O eq "MSWin32"){ + $cfgpath = $ENV{APPDATA}.'/dks'; +} elsif ($^O eq "darwin"){ + $cfgpath = $ENV{HOME}.'/.dks'; +} else { + $cfgpath = $ENV{HOME}.'/.dks'; +} +$cfgpath =~ s/\\/\//g; +our $sitecfg ={ + #cookiename => undef, + datapath => $cfgpath, + dbtype => 'SQLite', #'PgPP' or ScLite + dsn => 'DBI:SQLite:dbname='.$cfgpath.'/hourtrax.sqlite', + dbuser => '', + dbpassword => '', + basepath => '/', + staticpath => 'htdocs/', + #dsn => 'DBI:PgPP:dbname=fldlu_db;host=DKS-LAPTOP.fritz.box', + #dsn => 'DBI:PgPP:dbname=fldlu_db;host=sql629.your-server.de', + #dbuser => 'fldlu_user', + #dbpassword => 'Tm6G1bjQSudiEBAY', + page => 'index.tt', + pagename => 'index', + # basepath => substr((exists($ENV{"SCRIPT_FILENAME"})?dirname($ENV{"SCRIPT_FILENAME"}):dirname($0)),length($ENV{"DOCUMENT_ROOT"})), + # datapath => substr((exists($ENV{"SCRIPT_FILENAME"})?dirname($ENV{"SCRIPT_FILENAME"}):dirname($0)),length($ENV{"DOCUMENT_ROOT"})).'/data/', + # docroot => $ENV{"DOCUMENT_ROOT"}, + # registration_enabled => '1', + # default_group => 'users', + # sitename => 'FLD Member Area', + # season => '2019-2020', + # season_id => 2 +}; + +1; \ No newline at end of file diff --git a/CGI/api/lib/dksdb.pm b/CGI/api/lib/dksdb.pm new file mode 100755 index 0000000..07326cf --- /dev/null +++ b/CGI/api/lib/dksdb.pm @@ -0,0 +1,417 @@ +package dksdb; + +use strict; +use lib ('./lib/perl5'); +use lib ('./lib'); +use lib ('./'); +#BEGIN { $ENV{DBI_PUREPERL} = 2 } +use DBI; +use File::Basename; + +use Digest::SHA::PurePerl qw(sha256_hex); +use DBD::PgPP; +use DBD::SQLite; +use URI::Encode qw(uri_encode uri_decode); +use Encode; +use dksconfig qw($sitecfg); +use Text::Unidecode; + + +sub new { + my $class = shift; + my $param = shift; + my $self = bless {}, $class; + foreach my $p (keys %{$param}){ + $self->{$p} = $param->{$p}; + } + + return $self; +} + +sub securetext(){ + my $self = shift; + my $text = shift; + $text =~ s/'/''/g; + return $text; +} + +sub query(){ + my $self = shift; + my $stat = shift; + # my $vw_info = shift; + my @retdata = (); + my $dbh = DBI->connect(((exists($self->{dsn}))?$self->{dsn}:$sitecfg->{dsn}),$sitecfg->{dbuser},$sitecfg->{dbpassword},{PrintError=>0,RaiseError=>0,AutoCommit=>1}) or return \@retdata;#$retdata[0] = "dbquery Connection Error!".$!; + $stat = encode("utf8", $stat); + open FILE,">>tmp/sql.log"; + print FILE "$stat\n"; + close FILE; + my $sth = $dbh->prepare($stat) or return \@retdata;#$retdata[0] = "dbquery".$dbh->errstr. "- SQL: ".$stat;; + + + $sth->execute() or return \@retdata; #"dbquery: ".$sth->errstr; + + while(my $data = $sth->fetchrow_hashref()){ + my $row = (); + foreach my $k (keys %{$data}){ + $row->{$k} = decode("utf-8",$data->{$k}); + } + push @retdata,$row; + } + + $sth->finish(); + $dbh->disconnect(); + + return \@retdata; +} + +sub querybykey(){ + my $self = shift; + my $key = shift; + my $stat = shift; + #my $retempty = shift; + my @retdata =(); + my $dbh = DBI->connect(((exists($self->{dsn}))?$self->{dsn}:$sitecfg->{dsn}),$sitecfg->{dbuser},$sitecfg->{dbpassword},{PrintError=>0,RaiseError=>0,AutoCommit=>1}) or return \@retdata;#$retdata[0] = "dbquery Connection Error!".$!; + # $stat = encode("utf8", $stat); + + # open FILE,">>sql.log"; + # print FILE "$stat\n"; + # close FILE; + my $sth = $dbh->prepare($stat) or return \@retdata;#$retdata[0] = "dbquery: ".$stat; + $sth->execute() or return \@retdata;#$retata[0] = "dbquery: ".$stat; + while(my $data = $sth->fetchrow_hashref()) + { + if (exists $data->{$key}){ + my $row = (); + foreach my $k (keys %{$data}){ + $row->{$k} = decode("utf-8",$data->{$k}); + } + push @retdata,$row; + } + } + # if (keys(%{$retdata}) == 0){ + # $retdata =(); + # } + $sth->finish(); + $dbh->disconnect(); + return \@retdata; +} + +# sub dbquerysorted(){ +# my $self = shift; +# my $stat = shift; +# # my $vw_info = shift; +# my $retdata; +# my $dbh = DBI->connect(((exists($self->{dsn}))?$self->{dsn}:$sitecfg->{dsn}),$sitecfg->{dbuser},$sitecfg->{dbpassword},{PrintError=>0,RaiseError=>0,AutoCommit=>1}) or return $retdata->{error} = "dbquery Connection Error!".$!; +# # $stat = encode("utf8", $stat); +# # open FILE,">>tmp/sql.log"; +# # print FILE "\n==\n$stat\n==\n"; +# # close FILE; +# my $sth = $dbh->prepare($stat) or return $retdata->{error} = "dbquerysorted ".$dbh->errstr. "- SQL: ".$stat;; + + +# $sth->execute() or return $retdata->{error} = "dbquerysorted: ".$sth->errstr; +# my $count = 0; + +# while(my $data = $sth->fetchrow_hashref()) +# { +# #$retdata->{$count} = $data; +# my $row = (); +# foreach my $k (keys %{$data}){ +# $row->{$k} = decode("utf-8",$data->{$k}); +# } +# push @retdata,$row; +# } + +# # my $qstruct = (); +# # my $num_fields = $sth->{NUM_OF_FIELDS}; + +# # for ( my $i=0; $i< $num_fields; $i++ ) { +# # $qstruct->{$i}->{name} = $sth->{NAME}->[$i]; +# # #$qstruct->{$i}->{type} = $sth->{COMMENT}->[$i]; +# # #$qstruct->{$i}->{precision} = $sth->{PRECISION}->[$i]; +# # } + +# $sth->finish(); +# $dbh->disconnect(); + +# return $retdata; +# } + +sub exec(){ + my $self = shift; + my $stat = shift; + my $retdata; + my $dbh = DBI->connect(((exists($self->{dsn}))?$self->{dsn}:$sitecfg->{dsn}),$sitecfg->{dbuser},$sitecfg->{dbpassword},{PrintError=>0,RaiseError=>0,AutoCommit=>1}) or return $retdata->{error} = "exec Connection Error!".$!; + # $stat = decode("UTF-8", $stat); + open FILE,">>tmp/sql.log"; + print FILE "\n==\n$stat\n==\n"; + close FILE; + my $sth = $dbh->prepare($stat) or return $retdata->{error} = "exec ".$dbh->errstr. "- SQL: ".$stat; + $retdata->{success} = $dbh->do($stat) or return $retdata->{error} = "dbexec ".$dbh->errstr. "- SQL: ".$stat; + $dbh->disconnect(); + return $retdata; +} + +# sub dbqueryarray(){ +# my $self = shift; +# my $stat = shift; +# my @retdata = (); +# my $dbh = DBI->connect(((exists($self->{dsn}))?$self->{dsn}:$sitecfg->{dsn}),$sitecfg->{dbuser},$sitecfg->{dbpassword},{PrintError=>0,RaiseError=>0,AutoCommit=>1}) or return ({"error" => "dbqueryarray Connection Error!".$!}); +# #$stat = encode("utf8", $stat); +# #open FILE,">>/tmp/sql.log"; +# #print "$stat\n"; +# # close FILE; +# my $sth = $dbh->prepare($stat); + +# $sth->execute() or print "dbqueryarray: ".$sth->errstr; +# my $count = 0; + +# while(my $data = $sth->fetchrow_hashref()) +# { +# my $row = (); +# foreach my $k (keys %{$data}){ +# $row->{$k} = decode("utf-8",$data->{$k}); +# } +# push @retdata,$row; +# } + +# $sth->finish(); +# $dbh->disconnect(); +# #%retdata = sort {$a <=> $b} keys %retdata; +# return \@retdata; +# } + + +sub create_ddl_insert(){ + my $self = shift; + my $data = shift; + my $fields = (); + my @ddl = (); + + foreach my $f (keys(%{$data})){ + if (($f =~ /\_/) && ($f !~ /^ident_/)){ + my $t = substr($f,0,index($f,"_")); + my $c = substr($f,length($t)+1); + #my ($t,$c) = $f =~ m/(.+)\_(.+)/; + $fields->{$t}->{$c} = $data->{$f}; + } elsif ($f =~ /^ident_/){ + my $f2 = $f; + $f2 =~ s/^ident_//; + + my $t = substr($f2,0,index($f2,"_")); + my $c = substr($f2,length($t)+1); + $fields->{$t}->{$c} = $data->{$f}; + } + + } + + foreach my $tb (keys(%{$fields})){ + my @sqlcol = (); + my @sqlval = (); + foreach my $c (keys(%{$fields->{$tb}})){ + my $v = $fields->{$tb}->{$c}; + $v =~ s/'/''/g; + push (@sqlcol,$c); + if ($v eq ''){ + $v = 'null'; + } else { + $v = "'".$v."'"; + } + push (@sqlval,$v); + } + push(@ddl,"INSERT INTO ".$tb." (".join(",",@sqlcol).") VALUES (".join(",",@sqlval).") returning id;"); + } + return @ddl; +} + +sub create_ddl_insert_json(){ + my $self = shift; + my $schema = shift; + my $table = shift; + my $columns = shift; + my $data = shift; + my @ddl = (); + my @sqlcol = (); + my @sqlval = (); + foreach my $c (keys(%{$data})){ + #if (exists($columns->{$c})){ + push (@sqlcol,'"'.$c.'"'); + my $v = $data->{$c}; + + if ($v eq ''){ + $v = 'null'; + }elsif ($v =~ /^data:.+;base64,/){ + $v =~ s/'/''/g; + $v = "'".$v."'"; + } + else { + $v= uri_decode($v); + $v =~ s/'/''/g; + if ($columns->{$c}->{data_type} eq "ARRAY"){ + if (ref($data->{$c}) eq "ARRAY"){ + $v = "{\"".join("\",\"",@{$data->{$c}})."\"}"; + } + else { + $v = 'null'; + } + $v =~ s/""/null/g; + }elsif ($columns->{$c}->{data_type} =~ /^timestamp/ ){ + + }elsif($columns->{$c}->{data_type} eq "date"){ + + }elsif($columns->{$c}->{data_type} eq "time"){ + + } + $v = "'".$v."'"; + } + push (@sqlval,$v); + #} + } + return "INSERT INTO ".$schema.".\"".$table."\" (".join(",",@sqlcol).") VALUES (".join(",",@sqlval).");"; +} + +sub create_ddl_update(){ + my $self = shift; + my $data = shift; + my $fields = (); + my @ddl = (); + foreach my $f (keys(%{$data})){ + if ($f =~ /^ident_/){ + my $fx = substr($f,6); + my $t = substr($fx,0,index($fx,"_")); + my $c = substr($fx,length($t)+1); + #my ($t,$c) = $f =~ m/^ident_(.+)\_([a-z0-9|\_]+)/; + $fields->{$t}->{cond}->{$c} = $data->{$f}; + } elsif ( ($f !~ /^ident/) && ($f =~ /.+\_.+/) ){ + my $t = substr($f,0,index($f,"_")); + my $c = substr($f,length($t)+1); + #my ($t,$c) = $f =~ m/^(.+)\_([a-z0-9|\_]+)/; + $fields->{$t}->{fields}->{$c} = $data->{$f}; + } + } + foreach my $tb (keys(%{$fields})){ + my @sqlupd = (); + my @sqlcond = (); + foreach my $c (keys(%{$fields->{$tb}->{fields}})){ + + my $v = $fields->{$tb}->{fields}->{$c}; + $v =~ s/'/''/g; + + if ($c =~ /-/){ + my @jp = split('-',$c); + if ($v eq ''){ + $v = 'null'; + } else { + $v = '"'.$v.'"'; + } + $c = 'jsonb_set(to_jsonb('.$jp[0].'),\'{"'.$jp[1].'"}\',\''.$v.'\')::json'; + push (@sqlupd,$jp[0]."=".$c); + }else { + if ($v eq ''){ + $v = 'null'; + } else { + $v = "'".$v."'"; + } + push (@sqlupd,$c."=".$v); + } + + } + foreach my $c (keys(%{$fields->{$tb}->{cond}})){ + my $v = $fields->{$tb}->{cond}->{$c}; + $v =~ s/'/''/g; + if ($v eq ''){ + $v = 'null'; + } else { + $v = "'".$v."'"; + } + push (@sqlcond,$c."=".$v); + } + push(@ddl,"UPDATE ".$tb." SET ".join(",",@sqlupd)." WHERE ".join(" AND ",@sqlcond).";"); + } + + return @ddl; +} + +sub create_cnt_statement(){ + my $self = shift; + my $data = shift; + my $fields = (); + my @ddl = (); + foreach my $f (keys(%{$data})){ + if ($f =~ /^ident_/){ + my $fx = substr($f,6); + my $t = substr($fx,0,index($fx,"_")); + my $c = substr($fx,length($t)+1); + #my ($t,$c) = $f =~ m/^ident_(.+)\_([a-z0-9|\_]+)/; + $fields->{$t}->{cond}->{$c} = $data->{$f}; + } + } + foreach my $tb (keys(%{$fields})){ + my @sqlcond = (); + foreach my $c (keys(%{$fields->{$tb}->{cond}})){ + my $v = $fields->{$tb}->{cond}->{$c}; + $v =~ s/'/''/g; + if ($v eq ''){ + $v = 'null'; + } else { + $v = "'".$v."'"; + } + push (@sqlcond,$c."=".$v); + } + push(@ddl,"SELECT count(*) as cnt from ".$tb." WHERE ".join(" AND ",@sqlcond).";"); + } + # open FILE,">>tmp/sql.log"; + # print FILE "\n==\n".join("\n",@ddl)."\n==\n"; + # close FILE; + return @ddl; +} + +sub create_ddl_delete(){ + my $self = shift; + my $data = shift; + my $fields = (); + my @ddl = (); + my @refcols = (); + my $refdata = (); + foreach my $f (keys(%{$data})){ + if ($f =~ /^ident_/){ + my ($t,$c) = $f =~ m/ident_(.+)\_(.+)/; + + $fields->{$t}->{cond}->{$c} = $data->{$f}; + push(@refcols,"'".$c.'_'.$t."'"); + $refdata->{$c.'_'.$t} = $data->{$f}; + } + } + +# my $ref = $self->dbquerysorted("select TABLE_NAME,COLUMN_NAME from information_schema.KEY_COLUMN_USAGE where COLUMN_NAME in (".join(",",@refcols).") and CONSTRAINT_SCHEMA='".$self->{dbname}."';"); +# foreach my $r (keys(%{$ref})){ +# my $refv = $refdata->{$ref->{$r}->{COLUMN_NAME}}; +# if ($refv eq ''){ +# $refv = ' is null'; +# } else { +# $refv =~ s/'/''/g; +# $refv = "='".$refv."'"; +# } +# push(@ddl,"DELETE from ".$ref->{$r}->{TABLE_NAME}." where ".$ref->{$r}->{COLUMN_NAME}.$refv.";"); +# } + foreach my $tb (keys(%{$fields})){ + my @sqlcond = (); + foreach my $c (keys(%{$fields->{$tb}->{cond}})){ + my $v = $fields->{$tb}->{cond}->{$c}; + $v =~ s/'/''/g; + push (@sqlcond,$c."='".$v."'"); + } + push(@ddl,"DELETE FROM ".$tb." WHERE ".join(" AND ",@sqlcond).";"); + } + return @ddl; +} + +sub textunidecode(){ + my $self = shift; + my $text = shift; + $text = lc(unidecode(decode("utf-8",$text))); + $text =~ s/^[a-z0-9]//g; + return $text; +} + +1; diff --git a/CGI/api/lib/sendemail.pm b/CGI/api/lib/sendemail.pm new file mode 100755 index 0000000..58ed8fb --- /dev/null +++ b/CGI/api/lib/sendemail.pm @@ -0,0 +1,130 @@ +package sendemail; + +use strict; +use lib ('./lib/perl5'); +use lib ('./lib'); +use lib ('./'); +use Data::Dumper; +use File::Basename qw/dirname basename/; +use dksdb; + +sub new { + my $class = shift; + my $self = bless {}, $class; + $self->{server} = "mail.your-server.de"; + $self->{port} = "587"; + $self->{user} = 'kilian.saffran@fld.lu'; + $self->{password} = "Y6cWvXR6D2"; + $self->{from} = 'webmaster@fld.lu'; + return $self; +} + +sub sendemail(){ + my $self = shift; + my $template = shift; + my $iduser = shift; + my $sendto = shift; + my $data = shift; + my $attach = shift; + my $body = ""; + my $subject = ""; + my $maildata = (); + my $db = dksdb->new(); + my $send = -1; + my $tmpl = $db->query("select *,ml.mailtemplate from mailtemplates mt join maillayouts ml on (mt.id_maillayout=ml.id) where templatename='".$template."';"); + if (keys(%{$tmpl}) > 0){ + $tmpl = $tmpl->{0}; + } + # open (LOG,">>tmp/sendmail.log"); + # print LOG $ENV{SCRIPT_FILENAME}; + # print LOG "SEND EMAIL:".Dumper($data)."\n"; + # close(LOG); + my $datasql = $tmpl->{'emaildatasql'}; + $data->{id} = $iduser; + foreach my $key (keys(%{$data})){ + my $srch = '%%'.lc($key).'%%'; + my $repl = $data->{$key}; + $datasql =~ s/$srch/$repl/g; + } + # open (LOG,">>tmp/sendmail.log"); + # print LOG "TEMPLATE DATA:".$datasql."\n"; + # close(LOG); + $maildata = $db->query($datasql); + + $body = $tmpl->{'emailtext'}; + $subject = $tmpl->{'mailsubject'}; + foreach my $key (keys(%{$maildata->{0}})){ + $data->{$key} = $maildata->{0}->{$key}; + } + foreach my $key (keys(%{$data})){ + my $srch = '%%'.lc($key).'%%'; + my $repl = $data->{$key}; + $body =~ s/$srch/$repl/g; + $subject =~ s/$srch/$repl/g; + } + my $bodytmpl = $tmpl->{mailtemplate}; + $bodytmpl =~ s/%%BODYCONTENT%%/$body/; + my $siteurl = $ENV{'REQUEST_SCHEME'}.'://'.$ENV{"HTTP_HOST"}; + $bodytmpl =~ s/%%siteurl%%/$siteurl/g; + $bodytmpl =~ s/%%SITEURL%%/$siteurl/g; + $bodytmpl =~ s/\r//g; + #$bodytmpl =~ s/"/\\\"/g; + #PROD REPLACE all not replaced DATA + #$bodytmpl =~ s/%%\w+%%//g; + #$sendto = 'ksaffran@dks.lu'; + # open (LOG,">>tmp/sendmail.log"); + # print LOG "SUBJECT:".$subject."\n"; + # print LOG "BODY TEXT:".$bodytmpl."\n"; + # close(LOG); + if (($bodytmpl ne "") && ($subject ne "") && ($sendto =~ /.+\@.+\..+/)){ + + + my $binsemail = dirname($ENV{'SCRIPT_FILENAME'}).'/sendEmail'; + my $f = dirname($ENV{SCRIPT_FILENAME}).'/tmp/mailbody_'.$sendto.'.txt'; + $f =~ s/\@/_/g; + if (! -e $binsemail){ + $binsemail = dirname($ENV{'SCRIPT_FILENAME'}).'/api/sendEmail'; + $f = dirname($ENV{SCRIPT_FILENAME}).'/api/tmp/mailbody_'.$sendto.'.txt'; + $f =~ s/\@/_/g; + if (! -e $binsemail){ + return 256; + } + } + + my $cmd= 'perl "'.$binsemail.'" -f '.$tmpl->{mailfrom}.' '; + $cmd .= ' -s "'.$self->{server}.':'.$self->{port}.'" -xu "'.$self->{user}.'" -xp "'.$self->{password}.'" -q '; + $cmd .= '-o tls=auto '; + $cmd .= '-o message-content-type=html '; + $cmd .= '-o message-charset=ISO-8859-1 '; + $cmd .= '-o message-file='.$f.' '; + $cmd .= '-t "'.$sendto.'" '; + $cmd .= '-u "'.$subject.'" '; + # open (LOG,">>sendmail.log"); + # print LOG $cmd."\n"; + # # print LOG "BODY TEXT:".$bodytmpl."\n"; + # close(LOG); + open(EML,">".$f); + print EML $bodytmpl; + close(EML); + # $cmd .= '-m "'.$bodytmpl.'" '; + if ($attach != undef){ + $cmd .= " -a"; + + foreach my $a (@{$attach}){ + $cmd .= " ".$a." "; + } + } + # open (LOG,">>tmp/sendmail.log"); + # print LOG "SEND EMAIL CMD:".$cmd."\n"; + # close(LOG); + # $cmd =~ s/'/''/g; + $send = system($cmd); + # open (LOG,">>tmp/sendmail.log"); + # print LOG "CMD RETURN NUM:".$send."\n"; + # close(LOG); + unlink($f); + } + return $send; +} + +1; \ No newline at end of file diff --git a/CGI/api/lib/session.pm b/CGI/api/lib/session.pm new file mode 100755 index 0000000..44ab6a1 --- /dev/null +++ b/CGI/api/lib/session.pm @@ -0,0 +1,232 @@ +package session; + +use strict; +use lib ('./lib/perl5'); +use lib ('./lib'); +use lib ('./'); +use File::Basename; +use Digest::SHA qw(sha256_hex); + +use dksdb; +use sendemail; +# use Data::Dumper; + +sub new { + my $class = shift; + my $self = bless {}, $class; + $self->{db} = dksdb->new(); + return $self; +} + +sub checklogin(){ + my $self = shift; + my $login = shift; + my $password = shift; + # open FILE,">>tmp/sql.log"; + # print FILE "pwd: $password\n"; + # close(FILE); + my $pwd = sha256_hex($password); + my $ret->{messagetype} ='w3-red'; + # my $newsid = undef; + $login = lc($login); + $login =~ s/^\s+//; + $login =~ s/\s+$//; + + $ret->{message} = "Passwuert oder Login onbekannt!"; + $ret->{messagetype} = "w3-red"; + $ret->{sid} = undef; + my $user = $self->{db}->dbquerysorted("select id from users where lower(username)=lower('".$self->{db}->securetext($login)."') and userpassword = '".$pwd."' and \"blocked\" is null;"); + # open FILE,">>tmp/sql.log"; + # print FILE "select id from users where username= '".$self->{db}->securetext($login)."' and userpassword = '".$pwd."' and \"blocked\" is null;\n"; + # close FILE; + if (keys(%{$user}) > 0){ + $ret->{sid} = $self->randomstring(40); + $self->{db}->dbexec("DELETE FROM sessions where id_user=".$user->{0}->{id}." and remote_addr='".$ENV{REMOTE_ADDR}."' and user_agent='".$ENV{HTTP_USER_AGENT}."';"); + my $r = $self->{db}->dbexec("INSERT INTO sessions (id_user,idsession,remote_addr,user_agent) VALUES (".$user->{0}->{id}.", '".$ret->{sid}."', '".$ENV{REMOTE_ADDR}."', '".$ENV{HTTP_USER_AGENT}."');"); + } + return $ret; +} + +sub savepassword(){ + my $self = shift; + my $iduser = shift; + my $newpwd = shift; + my $pwd = sha256_hex($newpwd); + $self->{db}->dbexec("UPDATE users SET userpassword = '".$pwd."' WHERE id=".$iduser.";"); + return 1; +} + +sub passwordforgotten(){ + my $self = shift; + my $email = shift; + my $ret->{messagetype} ='w3-red'; + $ret->{message} = "Onbekannt E-mail!"; + my $sql = "select id,userpassword from users where username='".$self->{db}->securetext($email)."';"; + my $ex = $self->{db}->dbquerysorted($sql); + if (keys(%{$ex}) > 0){ + my $newpwd = $self->randomstring(12); + my $pwd = sha256_hex($newpwd); + $self->{db}->dbexec("UPDATE users SET userpassword = '".$pwd."' WHERE id=".$ex->{0}->{id}.";"); + my $data->{newpassword} = $newpwd; + my $eml = sendemail->new(); + my $mret = $eml->sendemail('user_forgotpasswd',$ex->{0}->{id},$email,$data,undef); + if ($mret != 0){ + $ret->{messagetype} ='w3-red'; + $ret->{message} = "Den Moment ass et leider nët méglech d'Passwuert autmatesch zreckzesetzen,
wend dech w.e.g. via E-Mail un webmaster\@fld.lu!"; + return $ret; + } + $ret->{message} = "Mir hun dir eng E-Mail, matt engem neien Passwuert gescheckt!"; + $ret->{messagetype} = "w3-green"; + } + return $ret; +} + +sub registeruser(){ + my $self = shift; + my $data = shift; + my $ret->{messagetype} ='w3-red'; + $ret->{message} = "Een Fehler ass passéiert, probéier et spéier nach eemol!"; + $ret->{page} = "message.tt"; + if (!exists($data->{license}) || !exists($data->{regcode}) || !exists($data->{email}) || !exists($data->{terms})){ + $ret->{message} = "W.e.g. All Felder ausfëllen!"; + $ret->{page} = "register.tt"; + return $ret; + } + foreach my $d (%{$data}){ + $data->{$d} = $self->{db}->securetext($data->{$d}); + } + + my $user = $self->{db}->dbquerysorted("select id from users where username='".$data->{email}."';"); + if (keys(%{$user}) > 0){ + $ret->{page} = "register.tt"; + $ret->{message} = "Een Benotzer matt der selwechter E-Mail existéiert schon!"; + return $ret; + } + my $license = $self->{db}->dbquerysorted("select us.id as id_user,lic.license,mb.id as id_member,us.username,us.vcode,us.regcode from members mb join licenses lic on (lic.id_member=mb.id) join users us on (mb.id_user=us.id) where us.regcode='".$data->{regcode}."' and lic.license='".$data->{license}."' limit 1"); + if (keys(%{$license}) == 0){ + $ret->{message} = "Falsch Lizenz-Nummer oder falschen Régistréierungs-Code!"; + return $ret; + } + my $regcode = $license->{0}->{regcode}; + my $newcode = $self->randomstring(6); + #my $usergroup = $self->{db}->dbquerysorted("select id from usergroups where usergroup ='avocat';"); + my $newuserid = $self->{db}->dbquerysorted("UPDATE users set username='".$data->{email}."',vcode='".$newcode."' where id=".$license->{0}->{id_user}." ;"); + my $maildata->{vcode} = $newcode; + my $eml = sendemail->new(); + my $mret = $eml->sendemail('user_verification',$license->{0}->{id_user},$data->{email},$maildata,undef); + if ($mret == 0){ + $ret->{message} = "Merci,
Mir hun dir elo eng E-Mail gescheckt, mattengem Code fir deng E-Mail ze verifizéieren!
Gëff desen Code w.e.g. an daat Feld hei drënner an!
Bei Problemer wend dech w.e.g. via E-Mail un webmaster\@fld.lu"; + $ret->{messagetype} = "w3-green"; + $ret->{page} = "validationcode.tt"; + } else { + $self->{db}->dbexec("UPDATE users set username='".$data->{email}."',vcode=null where id=".$license->{0}->{id_user}." ;"); + $ret->{message} = "Aus iergend engem Grond konnten mir dir keng E-Mail un '".$data->{email}."' schecken! Falls dess E-Mail-Address net existéiert, versich et nach eng Kéier matt enger E-Mail-Address, déi existéiert!
Bei Problemer wend dech w.e.g. via E-Mail un webmaster\@fld.lu"; + $ret->{messagetype} = "w3-red"; + $ret->{page} = "register.tt"; + } + #$self->{db}->dbexec("insert into appaccess (id_user) values (".$newuserid->{0}->{id}.");"); + # $ret->{messagetype} = "w3-green"; + + return $ret; +} + +sub validateaccount(){ + my $self = shift; + my $data = shift; + foreach my $d (%{$data}){ + $data->{$d} = $self->{db}->securetext($data->{$d}); + } + + my $ret->{messagetype} ='w3-red'; + my $vcodedata = $self->{db}->dbquerysorted("select id,vcode,username from users where vcode='".$data->{vcode}."';"); + if (keys(%{$vcodedata}) == 0){ + $ret->{message} = "Benotzer onbekannt oder Code falsch!"; + $ret->{page} = "validationcode.tt"; + } + my $newpwd = $self->randomstring(12); + my $pwd = sha256_hex($newpwd); + my $maildata->{password} = $newpwd; + my $eml = sendemail->new(); + my $newuserid = $self->{db}->dbquerysorted("UPDATE users set userpassword='".$pwd."',vcode=null,regcode=null where id=".$vcodedata->{0}->{id}." returning id,username;"); + my $mret = $eml->sendemail('user_registration',$vcodedata->{0}->{id},$vcodedata->{0}->{username},$maildata,undef); + if ($mret == 0){ + $ret->{message} = "Merci,
Mir hun dir elo eng E-Mail gescheckt, matt all deenen néidegen Donnéeen fir dech anzeloggen!
Bei Problemer wend dech w.e.g. via E-Mail un webmaster\@fld.lu"; + $ret->{messagetype} = "w3-green"; + $ret->{page} = "message.tt"; + } else { + $ret->{message} = "Aus iergend engem Grond konnten mir dir keng E-Mail un '".$newuserid->{0}->{username}."' schecken! Falls dess E-Mail-Address net existéiert, versich et nach eng Kéier matt enger E-Mail-Address, déi existéiert!
Bei Problemer wend dech w.e.g. via E-Mail un webmaster\@fld.lu"; + $ret->{page} = "message.tt"; + } + return $ret; +} + +sub getsession($){ + my $self = shift; + my $sid = shift; + my $sql ="select se.idsession,us.id,us.username,string_agg(distinct(aug.usergroup),',') as usergroups from sessions se +join users us on (us.id=se.id_user) +left join useringroups uig on (us.id=uig.id_user) +left join usergroups aug on (aug.id=uig.id_group) +where se.idsession= '".$self->{db}->securetext($sid)."' +and se.remote_addr= '".$ENV{REMOTE_ADDR}."' +and se.user_agent='".$ENV{HTTP_USER_AGENT}."' and us.blocked is null group by se.id,us.id;"; + my $res= $self->{db}->dbquerysorted($sql); + my $ret = undef; + if (keys(%{$res}) > 0){ + return $res->{0}; + } + return $ret; +} + +sub deletesession(){ + my $self = shift; + my $sid = shift; + $self->{db}->dbexec("DELETE FROM sessions where idsession='".$self->{db}->securetext($sid)."';"); +} + +sub randomstring(){ + my $self = shift; + my $num = shift; + my @alphanumeric = ('a'..'z', 'A'..'Z', 0..9); + my $randstring = join '', map $alphanumeric[rand @alphanumeric], 0..$num; + return $randstring; +} + + +# sub deleteprofile(){ +# my $self = shift; +# my $data = shift; +# my $ret->{message} = "mot de passe ou profile inconnue!"; +# $ret->{messagetype} = "danger"; +# if ($data->{id_user} eq ''){ +# $ret->{sid} = undef; +# return $ret; +# } +# my $pwd = sha256_hex($data->{password}); +# my $user = $self->{db}->dbquerysorted("select id from users where id= '".$data->{id_user}."' and userpassword = '".$pwd."';"); +# if (keys(%{$user}) > 0){ +# $self->admindeleteuser($data->{id_user}); +# my $ret->{'message'} = "Votre profile a été supprimé!"; +# $ret->{'messagetype'} = "info"; +# $ret->{sid} = undef; +# } +# return $ret; + +# } + +# sub admindeleteuser(){ +# my $self = shift; +# my $id_user = shift; +# my @dl = ("DELETE FROM public.useringroups WHERE id_uset=".$id_user.";", +# "DELETE FROM public.userclients WHERE id_user=".$id_user.";", +# "DELETE FROM public.appaccess WHERE id_user=".$id_user.";", +# "DELETE FROM public.modulepreferences WHERE id_user=".$id_user.";",, +# "DELETE FROM public.sessions WHERE id_user=".$id_user.";", +# "delete from users where id=".$id_user.";"); +# foreach my $s (@dl){ +# $self->{db}->dbexec($s); +# } +# return 1; +# } + +1; \ No newline at end of file diff --git a/CGI/api/service.cgi b/CGI/api/service.cgi new file mode 100644 index 0000000..7e2156f --- /dev/null +++ b/CGI/api/service.cgi @@ -0,0 +1,207 @@ +#!/Users/kilian/perl5/perlbrew/perls/perl-5.24.1/bin/perl +use strict; +use FindBin qw($Bin $RealBin); +# use lib ('CGI/api/lib/perl5'); +# use lib ('CGI/api/lib'); +use lib ($Bin.'/CGI/api/lib/perl5'); +use lib ($Bin.'/CGI/api/lib'); +use CGI; +use CGI::Cookie; +# use CGI::Carp qw/fatalsToBrowser/; +use File::Basename; +use JSON::PP; +use dksconfig qw/$sitecfg/; +use dksdb; + +# use session; +#use sendemail; +my $cgi = new CGI(); +my $scriptpath = $cgi->url(-absolute => 1); +my $p = (); +my @params = $cgi->param(); +foreach my $pe (@params){ + $p->{$pe} = $cgi->param($pe); +} +my $html->{result} = (); +# $p->{sid} = $cgi->cookie($sitecfg->{cookiename}); +# my $se = session->new(); +# my $sess = $se->getsession($p->{sid}); +print $cgi->header(-type=>"application/json", -charset => "utf-8"); + +if (exists($p->{fn})){ + if ($p->{fn} eq "info"){ + $html->{result} = &appinfo($p); + } + if ($$p->{fn} eq "preferences"){ + $html->{result} = &preferences($p); + } + if ($p->{fn} eq "setaccess"){ + $html->{result} = &setWebLogin($p); + } + if ($p->{fn} eq "getaccess"){ + $html->{result} = &getWebLogin($p); + } + if (($p->{fn} eq "stop") || ($p->{fn} eq "unload")){ + exit(0); + } +} +print JSON::PP::encode_json($html); + +sub preferences(){ + + my $req =shift; + my $name = &getAppName(); + my $pref= (); + my $appcfgpath = &getappconfigpath(); + if (exists($req->{page})){ + $appcfgpath =~ s/\\/\//g; + if (-e $appcfgpath.'/'.$req->{page}.'.json'){ + open(PREF,$appcfgpath.'/'.$req->{page}.'.json'); + my $strpref = ""; + while (my $l = ){ + $strpref .= $l; + } + close(PREF); + $pref=JSON::PP::decode_json($strpref); + } + my @kk = keys(%{$p}); + my $setcron = ''; + #print "keys.".Dumper(@kk)."\n"; + if (scalar(@kk) > 0){ + foreach my $px (@kk){ + my $newpref = JSON::PP::decode_json($req->{$px}); + if ($p eq 'sync'){ + $setcron = $p; + } + #if (exists($pref->{result}->{$p})){ + $pref->{$p} = $newpref; + #} + } + open(PREF,">".$appcfgpath.'/'.$req->{page}.'.json'); + print PREF JSON::PP::encode_json($pref); + close(PREF); + + } + if ($setcron ne ''){ + if ($setcron eq 'sync'){ + &setcron(dirname($0).'/syncdb.pl',$pref->{sync}->{time}); + } + } + } + +} + +sub appinfo(){ + my $req = shift; + my $ret = (); + + my $name = basename($0); + $name =~ s/srv\.pl$//; + $name =~ s/srv\.exe$//; + $ret->{OS} = $^O; + $ret->{app} = $name; + $ret->{appcfgpath} = &getappconfigpath(); + if ($^O eq "MSWin32"){ + $ret->{home} = $ENV{USERPROFILE}; + $ret->{user} = $ENV{USERNAME}; + $$ret->{hostname} = $ENV{COMPUTERNAME}; + $ret->{arch} = $ENV{PROCESSOR_ARCHITEW6432}; + $ret->{appcfgpath} =~ s/\\/\//g; + $ret->{home} =~ s/\\/\//g; + } else { + $ret->{home} = $ENV{HOME}; + $ret->{user} = $ENV{USER}; + $ret->{hostname} = `hostname -s`; + chomp($ret->{hostname}); + $ret->{arch} = `uname -m`; + chomp($ret->{arch}); + } + if (! -e $ret->{appcfgpath}){ + make_path($ret->{appcfgpath}); + } + if (-e $ret->{appcfgpath}.'/'.$name.'.json'){ + open(LCFG,$ret->{appcfgpath}.'/'.$name.'.json'); + my $strprofile = ""; + while (my $l = ){ + $strprofile .= $l; + } + close(LCFG); + if ($strprofile ne ""){ + $ret->{appconfig} = JSON::PP::decode_json($strprofile); + } + } + if (!exists($ret->{appconfig})){ + $ret->{appconfig} = undef; + } + return $ret; +} + +sub getWebLogin(){ + + my $req = shift; + my $ret = (); + + my $apppath = &getappconfigpath(); + my $loginname= ""; + print "read:". $apppath.'/'.&getAppName().'.passwd'."\n"; + if (-e $apppath.'/'.&getAppName().'.passwd'){ + open(AUTH,$apppath.'/'.&getAppName().'.passwd'); + while (my $l = ){ + chomp($l); + if ($l eq ""){ next;} + ($loginname) = $l =~ m/^(\w+)\=.*/; + } + close(AUTH); + } + $ret->{login} = $loginname; + return $ret; +} + +sub setWebLogin(){ + my $req = shift; + my $ret = -1; + my $apppath = &getappconfigpath(); + if (exists($req->{login}) && exists($req->{passwd})){ + open(AUTH,">".$apppath.'/'.&getAppName().'.passwd'); + print AUTH $req->{login}.'='.$req->{passwd}; + close(AUTH); + $ret = 0; + } + return $ret; +} + +sub getappconfigpath(){ + my $datadir = dirname($RealBin).'/data'; + return $datadir; +} + +sub getAppName(){ + my $name = basename($0); + $name =~ s/srv\.pl$//; + $name =~ s/srv\.exe$//; + return lc($name); +} + +sub setcron(){ + my $script =shift; + my $time = shift; + print "setcron\n"; + my $strcron = `crontab -l`; + my @lines = split("\n",$strcron); + my $crontabline = ""; + if ((defined($time) && $time =~ /\d\d:\d\d/)){ + $crontabline = int(substr($time,3,2)).' '.int(substr($time,0,2)).' * * * '.$script; + } + my $newcrontab = ""; + foreach my $l (@lines){ + chomp($l); + if ($l !~ $script){ + $newcrontab .= $l."\n"; + } + } + if ($crontabline ne ""){ + $newcrontab .= $crontabline."\n"; + } + print "\n----\n".$newcrontab."\n----\n"; + system('sudo echo "'.$newcrontab.'" > /var/spool/cron/crontabs/'.$ENV{USER}); +} diff --git a/CGI/api/system.cgi b/CGI/api/system.cgi new file mode 100644 index 0000000..5d0d463 --- /dev/null +++ b/CGI/api/system.cgi @@ -0,0 +1,167 @@ +#!/Users/kilian/perl5/perlbrew/perls/perl-5.24.1/bin/perl +use strict; +use FindBin qw($Bin); +# use lib ('CGI/api/lib/perl5'); +# use lib ('CGI/api/lib'); +use lib ($Bin.'/CGI/api/lib/perl5'); +use lib ($Bin.'/CGI/api/lib'); +use CGI; +use CGI::Cookie; +# use CGI::Carp qw/fatalsToBrowser/; +use File::Basename; +use JSON::PP; +use dksconfig qw/$sitecfg/; +use dksdb; + +# use session; +#use sendemail; +my $cgi = new CGI(); +my $scriptpath = $cgi->url(-absolute => 1); +my $p = (); +my @params = $cgi->param(); +foreach my $pe (@params){ + $p->{$pe} = $cgi->param($pe); +} +my $html->{result} = undef; +# $p->{sid} = $cgi->cookie($sitecfg->{cookiename}); +# my $se = session->new(); +# my $sess = $se->getsession($p->{sid}); +print $cgi->header(-type=>"application/json", -charset => "utf-8"); +if (exists($p->{fn})) { + if ($p->{fn} eq "getconfig"){ + $html->{result} = &getconfig($p); + } elsif ($p->{fn} eq "setconfig") { + $html->{result} = &setconfig($p); + } elsif ($p->{fn} eq "shutdown"){ + print "Shutdown launched!\n"; + system('sudo shutdown -h now'); + $html->{result} = "shutdown launched"; + } elsif ($p->{fn} eq "restart"){ + print "Restart launched!\n"; + system('sudo shutdown -r now'); + $html->{result} = "restart launched"; + } +} +print JSON::PP::encode_json($html); + +sub getconfig(){ + + my $req = shift; + my $ret = (); + my @sections = ('lan','wlan','hostname','activenet'); + if (exists($req->{section})){ + @sections = split(',',$req->{section}); + } + foreach my $s (@sections){ + if ($s eq 'wlan') { + $ret->{$s} = &getwifinetworks(); + } elsif ($s eq 'hostname') { + $ret->{$s} = &gethostname(); + } elsif ($s eq 'activenet'){ + $ret->{$s} = &getactivenet(); + } + } + return $ret; +} + +sub setconfig(){ + my $req = shift; + my $ret = (); + my @sections = ('wlan','hostname'); + if (exists($req->{section})){ + @sections = split(',',$req->{section}); + } + foreach my $k (@sections){ + my $values = JSON::PP::decode_json($req->{$k}); + #print Dumper($values); + if ($k eq 'wlan'){ + $ret->{$k} = &setwifinetwork($values); + } + if ($k eq 'hostname'){ + $ret->{$k} = &sethostname($values); + } + } + return $ret; +} + +#weblogin + +sub getactivenet(){ + my $netconfig = `ip -4 a show`; +my @rows = split("\n",$netconfig); +my $net = (); +my $cnet = ""; +foreach my $r (@rows){ + chomp($r); + if ($r =~ /^\d:/){ + my ($tmp) = $r =~ m/^\d:\s(.+):/; + $cnet = $tmp; + } elsif ($r =~ /^\s+inet\s/){ + my ($ip) = $r =~ m/^\s+inet\s([\d|\.]+)/; + $net->{$cnet} = $ip; + } +} + return $net; +} + +#hostname +sub gethostname(){ + my $hostname = `hostname -s`; + chomp($hostname); + return $hostname; +} + +sub sethostname(){ + my $data = shift; + my $ret = -1; + if (exists($data->{hostname}) && $data->{hostname} ne ""){ + system("sudo hostnamectl set-hostname ".$data->{hostname}); + my $ret = system('sudo sed -i "s/^127.0.1.1.*/127.0.1.1\t'.$data->{hostname}.'/" /etc/hosts'); + } + return $ret; +} + +#wlan +sub getwifinetworks(){ + my $cmd = "sudo wpa_cli -i wlan0 status | grep -e \"^ssid=\" | awk -F \"=\" '\{ print \$2 \}'"; + my $current = `$cmd`; + chomp($current); + my $wifi->{ssid} = undef; + if ($current ne ""){ + $wifi->{ssid} = $current; + } + my $strlist = `sudo iw wlan0 scan | grep SSID | sed \'s/.*SSID: //g\'`; + my @list = split("\n",$strlist); + $wifi->{networks} = \@list; + return $wifi; + +} + +sub setwifinetwork(){ + my $data = shift; + my $strwpa = 'ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev'."\n"; + $strwpa .= 'update_config=1'."\n"; + $strwpa .= 'country=GB'."\n"; + + if (exists($data->{hiddenssid})){ + $strwpa .= "\t".'scan_ssid=1'."\n"; + } + if (exists($data->{passphrase})){ + my $cmd = 'wpa_passphrase "'.$data->{ssid}.'" "'.$data->{passphrase}.'"'; + my $enc = `$cmd`; + #chomp($enc); + $strwpa .= $enc; + } else { + $strwpa .= 'network={'."\n"; + $strwpa .= "\t".'ssid="'.$data->{ssid}."\"\n"; + $strwpa .= "\t".'key_mgmt=NONE'."\n"; + $strwpa .= '}'."\n"; + } + + print $strwpa."\n---\n"; + my $st = system('echo "'.$strwpa.'" > /tmp/wpa_supplicant.conf'); + $st = system('sudo cp /tmp/wpa_supplicant.conf /etc/wpa_supplicant/wpa_supplicant.conf'); + my $cmd = "sudo wpa_cli -i wlan0 reconfigure"; + my $ret = system($cmd); + return 1; +} diff --git a/CGI/api/tmp/sql.log b/CGI/api/tmp/sql.log new file mode 100644 index 0000000..ee4b182 --- /dev/null +++ b/CGI/api/tmp/sql.log @@ -0,0 +1,170 @@ + +== +select id,prename,surname,case when pin is null then 'nopin' else null end as haspin, case when blocked is not null then 'blocked' else null end as isblocked from staff st left join (select idstaff,max(startdate) as startdate from contract where startdate <= CURRENT_DATE group by idstaff) co on (st.id=co.idstaff); +== + +== +select id,prename,surname,case when pin is null then 'nopin' else null end as haspin, case when blocked is not null then 'blocked' else null end as isblocked from staff st left join (select id_staff,max(startdate) as startdate from contract where startdate <= CURRENT_DATE group by id_staff) co on (st.id=co.id_staff); +== + +== +select id,prename,surname,case when pin is null then 'nopin' else null end as haspin, case when blocked is not null then 'blocked' else null end as isblocked from staff st left join (select id_staff,max(startdate) as startdate from contract where startdate <= CURRENT_DATE group by id_staff) co on (st.id=co.id_staff); +== +select id,prename,surname,case when pin is null then 'nopin' else null end as haspin, case when blocked is not null then 'blocked' else null end as isblocked from staff st left join (select id_staff,max(startdate) as startdate from contract where startdate <= CURRENT_DATE group by id_staff) co on (st.id=co.id_staff); +select id,prename,surname,case when pin is null then 'nopin' else null end as haspin, case when blocked is not null then 'blocked' else null end as isblocked from staff st left join (select id_staff,max(startdate) as startdate from contract where startdate <= CURRENT_DATE group by id_staff) co on (st.id=co.id_staff); +select id,prename,surname,case when pin is null then 'nopin' else null end as haspin, case when blocked is not null then 'blocked' else null end as isblocked from staff st left join (select id_staff,max(startdate) as startdate from contract where startdate <= CURRENT_DATE group by id_staff) co on (st.id=co.id_staff); +select id,prename,surname,case when pin is null then 'nopin' else null end as haspin, case when blocked is not null then 'blocked' else null end as isblocked from staff st left join (select id_staff,max(startdate) as startdate from contract where startdate <= CURRENT_DATE group by id_staff) co on (st.id=co.id_staff); +select id,prename,surname,case when pin is null then 'nopin' else null end as haspin, case when blocked is not null then 'blocked' else null end as isblocked from staff st left join (select id_staff,max(startdate) as startdate from contract where startdate <= CURRENT_DATE group by id_staff) co on (st.id=co.id_staff); +select id,prename,surname,case when pin is null then 'nopin' else null end as haspin, case when blocked is not null then 'blocked' else null end as isblocked from staff st left join (select id_staff,max(startdate) as startdate from contract where startdate <= CURRENT_DATE group by id_staff) co on (st.id=co.id_staff); +select id,prename,surname,case when pin is null then 'nopin' else null end as haspin, case when blocked is not null then 'blocked' else null end as isblocked from staff st left join (select id_staff,max(startdate) as startdate from contract where startdate <= CURRENT_DATE group by id_staff) co on (st.id=co.id_staff); +select id from staff where id='null' and pin='1234'; +update staff set loginattemps=(select case when max(loginattemps) is null then 1 else loginattemps+1 end as newattemps from staff where id='null') where id='null"; +select id,prename,surname,case when pin is null then 'nopin' else null end as haspin, case when blocked is not null then 'blocked' else null end as isblocked from staff st left join (select id_staff,max(startdate) as startdate from contract where startdate <= CURRENT_DATE group by id_staff) co on (st.id=co.id_staff); +select id,prename,surname,case when pin is null then 'nopin' else null end as haspin, case when blocked is not null then 'blocked' else null end as isblocked from staff st left join (select id_staff,max(startdate) as startdate from contract where startdate <= CURRENT_DATE group by id_staff) co on (st.id=co.id_staff); +select id,prename,surname,case when pin is null then 'nopin' else null end as haspin, case when blocked is not null then 'blocked' else null end as isblocked from staff st left join (select id_staff,max(startdate) as startdate from contract where startdate <= CURRENT_DATE group by id_staff) co on (st.id=co.id_staff); +select id,prename,surname,case when pin is null then 'nopin' else null end as haspin, case when blocked is not null then 'blocked' else null end as isblocked from staff st left join (select id_staff,max(startdate) as startdate from contract where startdate <= CURRENT_DATE group by id_staff) co on (st.id=co.id_staff); +select id from staff where id='1' and pin='1234'; +update staff set loginattemps=null where id='1'; +select id,prename,surname,case when pin is null then 'nopin' else null end as haspin, case when blocked is not null then 'blocked' else null end as isblocked from staff st left join (select id_staff,max(startdate) as startdate from contract where startdate <= CURRENT_DATE group by id_staff) co on (st.id=co.id_staff); +select id,prename,surname,case when pin is null then 'nopin' else null end as haspin, case when blocked is not null then 'blocked' else null end as isblocked from staff st left join (select id_staff,max(startdate) as startdate from contract where startdate <= CURRENT_DATE group by id_staff) co on (st.id=co.id_staff); +select id,prename,surname,case when pin is null then 'nopin' else null end as haspin, case when blocked is not null then 'blocked' else null end as isblocked from staff st left join (select id_staff,max(startdate) as startdate from contract where startdate <= CURRENT_DATE group by id_staff) co on (st.id=co.id_staff); +select id,prename,surname,case when pin is null then 'nopin' else null end as haspin, case when blocked is not null then 'blocked' else null end as isblocked from staff st left join (select id_staff,max(startdate) as startdate from contract where startdate <= CURRENT_DATE group by id_staff) co on (st.id=co.id_staff); +select id,prename,surname,case when pin is null then 'nopin' else null end as haspin, case when blocked is not null then 'blocked' else null end as isblocked from staff st left join (select id_staff,max(startdate) as startdate from contract where startdate <= CURRENT_DATE group by id_staff) co on (st.id=co.id_staff); +select id,prename,surname,case when pin is null then 'nopin' else null end as haspin, case when blocked is not null then 'blocked' else null end as isblocked from staff st left join (select id_staff,max(startdate) as startdate from contract where startdate <= CURRENT_DATE group by id_staff) co on (st.id=co.id_staff); +select id,prename,surname,case when pin is null then 'nopin' else null end as haspin, case when blocked is not null then 'blocked' else null end as isblocked from staff st left join (select id_staff,max(startdate) as startdate from contract where startdate <= CURRENT_DATE group by id_staff) co on (st.id=co.id_staff); +select id,prename,surname,case when pin is null then 'nopin' else null end as haspin, case when blocked is not null then 'blocked' else null end as isblocked from staff st left join (select id_staff,max(startdate) as startdate from contract where startdate <= CURRENT_DATE group by id_staff) co on (st.id=co.id_staff); +select id,prename,surname,case when pin is null then 'nopin' else null end as haspin, case when blocked is not null then 'blocked' else null end as isblocked from staff st left join (select id_staff,max(startdate) as startdate from contract where startdate <= CURRENT_DATE group by id_staff) co on (st.id=co.id_staff); +select id,prename,surname,case when pin is null then 'nopin' else null end as haspin, case when blocked is not null then 'blocked' else null end as isblocked from staff st left join (select id_staff,max(startdate) as startdate from contract where startdate <= CURRENT_DATE group by id_staff) co on (st.id=co.id_staff); +select id,prename,surname,case when pin is null then 'nopin' else null end as haspin, case when blocked is not null then 'blocked' else null end as isblocked from staff st left join (select id_staff,max(startdate) as startdate from contract where startdate <= CURRENT_DATE group by id_staff) co on (st.id=co.id_staff); +select id,prename,surname,case when pin is null then 'nopin' else null end as haspin, case when blocked is not null then 'blocked' else null end as isblocked from staff st left join (select id_staff,max(startdate) as startdate from contract where startdate <= CURRENT_DATE group by id_staff) co on (st.id=co.id_staff); +select id,prename,surname,case when pin is null then 'nopin' else null end as haspin, case when blocked is not null then 'blocked' else null end as isblocked from staff st left join (select id_staff,max(startdate) as startdate from contract where startdate <= CURRENT_DATE group by id_staff) co on (st.id=co.id_staff); +select id,prename,surname,case when pin is null then 'nopin' else null end as haspin, case when blocked is not null then 'blocked' else null end as isblocked from staff st left join (select id_staff,max(startdate) as startdate from contract where startdate <= CURRENT_DATE group by id_staff) co on (st.id=co.id_staff); +select id,prename,surname,case when pin is null then 'nopin' else null end as haspin, case when blocked is not null then 'blocked' else null end as isblocked from staff st left join (select id_staff,max(startdate) as startdate from contract where startdate <= CURRENT_DATE group by id_staff) co on (st.id=co.id_staff); +select id,prename,surname,case when pin is null then 'nopin' else null end as haspin, case when blocked is not null then 'blocked' else null end as isblocked from staff st left join (select id_staff,max(startdate) as startdate from contract where startdate <= CURRENT_DATE group by id_staff) co on (st.id=co.id_staff); +select id,prename,surname,case when pin is null then 'nopin' else null end as haspin, case when blocked is not null then 'blocked' else null end as isblocked from staff st left join (select id_staff,max(startdate) as startdate from contract where startdate <= CURRENT_DATE group by id_staff) co on (st.id=co.id_staff); +select * from staff +select * from staff +select id,prename,surname,case when pin is null then 'nopin' else null end as haspin, case when blocked is not null then 'blocked' else null end as isblocked from staff st left join (select id_staff,max(startdate) as startdate from contract where startdate <= CURRENT_DATE group by id_staff) co on (st.id=co.id_staff); +select id,prename,surname,case when pin is null then 'nopin' else null end as haspin, case when blocked is not null then 'blocked' else null end as isblocked from staff st left join (select id_staff,max(startdate) as startdate from contract where startdate <= CURRENT_DATE group by id_staff) co on (st.id=co.id_staff); +select id,prename,surname,case when pin is null then 'nopin' else null end as haspin, case when blocked is not null then 'blocked' else null end as isblocked from staff st left join (select id_staff,max(startdate) as startdate from contract where startdate <= CURRENT_DATE group by id_staff) co on (st.id=co.id_staff); +select id,prename,surname,case when pin is null then 'nopin' else null end as haspin, case when blocked is not null then 'blocked' else null end as isblocked from staff st left join (select id_staff,max(startdate) as startdate from contract where startdate <= CURRENT_DATE group by id_staff) co on (st.id=co.id_staff); +select id,prename,surname,case when pin is null then 'nopin' else null end as haspin, case when blocked is not null then 'blocked' else null end as isblocked from staff st left join (select id_staff,max(startdate) as startdate from contract where startdate <= CURRENT_DATE group by id_staff) co on (st.id=co.id_staff); +select id,prename,surname,case when pin is null then 'nopin' else null end as haspin, case when blocked is not null then 'blocked' else null end as isblocked from staff st left join (select id_staff,max(startdate) as startdate from contract where startdate <= CURRENT_DATE group by id_staff) co on (st.id=co.id_staff); +select id from staff where id='1' and pin='1234'; +update staff set loginattemps=null where id='1'; +select id,prename,surname,case when pin is null then 'nopin' else null end as haspin, case when blocked is not null then 'blocked' else null end as isblocked from staff st left join (select id_staff,max(startdate) as startdate from contract where startdate <= CURRENT_DATE group by id_staff) co on (st.id=co.id_staff); +select id from staff where id='1' and pin='1234'; +update staff set loginattemps=null where id='1'; +select last_id, case when current_stamp_in is not null then strftime('%d.%m.%Y
%H:%M',current_stamp_in) else null end as current_stamp_in, case when current_stamp_out is not null then strftime('%d.%m.%Y
%H:%M',current_stamp_out) else null end as current_stamp_out,cast((daytrack / 3600.0) as integer) || ':' || case when cast(((daytrack % 3600.0) / 60.0) as integer) < 10 then '0' else '' end || cast(((daytrack % 3600.0) / 60.0) as integer) as monthtrack from (select max(id) as last_id, case when date(max(stamp_in)) = CURRENT_DATE then max(stamp_in) else null end as current_stamp_in,case when date(max(stamp_out)) = CURRENT_DATE then max(stamp_out) else null end as current_stamp_out,sum(case when stamp_out is not null then cast(strftime('%s',stamp_out) as integer) - cast(strftime('%s',stamp_in) as integer) else 0 end) as daytrack from hours where id_staff='1' and stamp_in between date('now','start of month') and date('now','start of month','+1 month','-1 day')); +select id,prename,surname,case when pin is null then 'nopin' else null end as haspin, case when blocked is not null then 'blocked' else null end as isblocked from staff st left join (select id_staff,max(startdate) as startdate from contract where startdate <= CURRENT_DATE group by id_staff) co on (st.id=co.id_staff); +select id from staff where id='1' and pin='1234'; +select last_id, case when current_stamp_in is not null then strftime('%d.%m.%Y
%H:%M',current_stamp_in) else null end as current_stamp_in, case when current_stamp_out is not null then strftime('%d.%m.%Y
%H:%M',current_stamp_out) else null end as current_stamp_out,cast((daytrack / 3600.0) as integer) || ':' || case when cast(((daytrack % 3600.0) / 60.0) as integer) < 10 then '0' else '' end || cast(((daytrack % 3600.0) / 60.0) as integer) as monthtrack from (select max(id) as last_id, case when date(max(stamp_in)) = CURRENT_DATE then max(stamp_in) else null end as current_stamp_in,case when date(max(stamp_out)) = CURRENT_DATE then max(stamp_out) else null end as current_stamp_out,sum(case when stamp_out is not null then cast(strftime('%s',stamp_out) as integer) - cast(strftime('%s',stamp_in) as integer) else 0 end) as daytrack from hours where id_staff='1' and stamp_in between date('now','start of month') and date('now','start of month','+1 month','-1 day')); +update staff set loginattemps=null where id='1'; +select id,prename,surname,case when pin is null then 'nopin' else null end as haspin, case when blocked is not null then 'blocked' else null end as isblocked from staff st left join (select id_staff,max(startdate) as startdate from contract where startdate <= CURRENT_DATE group by id_staff) co on (st.id=co.id_staff); +select id from staff where id='1' and pin='1234'; +update staff set loginattemps=null where id='1'; +select last_id, case when current_stamp_in is not null then strftime('%d.%m.%Y
%H:%M',current_stamp_in) else null end as current_stamp_in, case when current_stamp_out is not null then strftime('%d.%m.%Y
%H:%M',current_stamp_out) else null end as current_stamp_out,cast((daytrack / 3600.0) as integer) || ':' || case when cast(((daytrack % 3600.0) / 60.0) as integer) < 10 then '0' else '' end || cast(((daytrack % 3600.0) / 60.0) as integer) as monthtrack from (select max(id) as last_id, case when date(max(stamp_in)) = CURRENT_DATE then max(stamp_in) else null end as current_stamp_in,case when date(max(stamp_out)) = CURRENT_DATE then max(stamp_out) else null end as current_stamp_out,sum(case when stamp_out is not null then cast(strftime('%s',stamp_out) as integer) - cast(strftime('%s',stamp_in) as integer) else 0 end) as daytrack from hours where id_staff='1' and stamp_in between date('now','start of month') and date('now','start of month','+1 month','-1 day')); +select id,prename,surname,case when pin is null then 'nopin' else null end as haspin, case when blocked is not null then 'blocked' else null end as isblocked from staff st left join (select id_staff,max(startdate) as startdate from contract where startdate <= CURRENT_DATE group by id_staff) co on (st.id=co.id_staff); +select id from staff where id='1' and pin='1234'; +update staff set loginattemps=null where id='1'; +select last_id, case when current_stamp_in is not null then strftime('%d.%m.%Y
%H:%M',current_stamp_in) else null end as current_stamp_in, case when current_stamp_out is not null then strftime('%d.%m.%Y
%H:%M',current_stamp_out) else null end as current_stamp_out,cast((daytrack / 3600.0) as integer) || ':' || case when cast(((daytrack % 3600.0) / 60.0) as integer) < 10 then '0' else '' end || cast(((daytrack % 3600.0) / 60.0) as integer) as monthtrack from (select max(id) as last_id, case when date(max(stamp_in)) = CURRENT_DATE then max(stamp_in) else null end as current_stamp_in,case when date(max(stamp_out)) = CURRENT_DATE then max(stamp_out) else null end as current_stamp_out,sum(case when stamp_out is not null then cast(strftime('%s',stamp_out) as integer) - cast(strftime('%s',stamp_in) as integer) else 0 end) as daytrack from hours where id_staff='1' and stamp_in between date('now','start of month') and date('now','start of month','+1 month','-1 day')); +insert into hours (idstaff,stamp_in) VALUES ('1',CURRENT_TIMESTAMP); +select id,prename,surname,case when pin is null then 'nopin' else null end as haspin, case when blocked is not null then 'blocked' else null end as isblocked from staff st left join (select id_staff,max(startdate) as startdate from contract where startdate <= CURRENT_DATE group by id_staff) co on (st.id=co.id_staff); +select id from staff where id='1' and pin='1234'; +update staff set loginattemps=null where id='1'; +select last_id, case when current_stamp_in is not null then strftime('%d.%m.%Y
%H:%M',current_stamp_in) else null end as current_stamp_in, case when current_stamp_out is not null then strftime('%d.%m.%Y
%H:%M',current_stamp_out) else null end as current_stamp_out,cast((daytrack / 3600.0) as integer) || ':' || case when cast(((daytrack % 3600.0) / 60.0) as integer) < 10 then '0' else '' end || cast(((daytrack % 3600.0) / 60.0) as integer) as monthtrack from (select max(id) as last_id, case when date(max(stamp_in)) = CURRENT_DATE then max(stamp_in) else null end as current_stamp_in,case when date(max(stamp_out)) = CURRENT_DATE then max(stamp_out) else null end as current_stamp_out,sum(case when stamp_out is not null then cast(strftime('%s',stamp_out) as integer) - cast(strftime('%s',stamp_in) as integer) else 0 end) as daytrack from hours where id_staff='1' and stamp_in between date('now','start of month') and date('now','start of month','+1 month','-1 day')); +insert into hours (idstaff,stamp_in) VALUES ('1',CURRENT_TIMESTAMP); +select id,prename,surname,case when pin is null then 'nopin' else null end as haspin, case when blocked is not null then 'blocked' else null end as isblocked from staff st left join (select id_staff,max(startdate) as startdate from contract where startdate <= CURRENT_DATE group by id_staff) co on (st.id=co.id_staff); +select id from staff where id='1' and pin='1234'; +update staff set loginattemps=null where id='1'; +select last_id, case when current_stamp_in is not null then strftime('%d.%m.%Y
%H:%M',current_stamp_in) else null end as current_stamp_in, case when current_stamp_out is not null then strftime('%d.%m.%Y
%H:%M',current_stamp_out) else null end as current_stamp_out,cast((daytrack / 3600.0) as integer) || ':' || case when cast(((daytrack % 3600.0) / 60.0) as integer) < 10 then '0' else '' end || cast(((daytrack % 3600.0) / 60.0) as integer) as monthtrack from (select max(id) as last_id, case when date(max(stamp_in)) = CURRENT_DATE then max(stamp_in) else null end as current_stamp_in,case when date(max(stamp_out)) = CURRENT_DATE then max(stamp_out) else null end as current_stamp_out,sum(case when stamp_out is not null then cast(strftime('%s',stamp_out) as integer) - cast(strftime('%s',stamp_in) as integer) else 0 end) as daytrack from hours where id_staff='1' and stamp_in between date('now','start of month') and date('now','start of month','+1 month','-1 day')); +select id,prename,surname,case when pin is null then 'nopin' else null end as haspin, case when blocked is not null then 'blocked' else null end as isblocked from staff st left join (select id_staff,max(startdate) as startdate from contract where startdate <= CURRENT_DATE group by id_staff) co on (st.id=co.id_staff); +select id from staff where id='1' and pin='1234'; +update staff set loginattemps=null where id='1'; +select last_id, case when current_stamp_in is not null then strftime('%d.%m.%Y
%H:%M',current_stamp_in) else null end as current_stamp_in, case when current_stamp_out is not null then strftime('%d.%m.%Y
%H:%M',current_stamp_out) else null end as current_stamp_out,cast((daytrack / 3600.0) as integer) || ':' || case when cast(((daytrack % 3600.0) / 60.0) as integer) < 10 then '0' else '' end || cast(((daytrack % 3600.0) / 60.0) as integer) as monthtrack from (select max(id) as last_id, case when date(max(stamp_in)) = CURRENT_DATE then max(stamp_in) else null end as current_stamp_in,case when date(max(stamp_out)) = CURRENT_DATE then max(stamp_out) else null end as current_stamp_out,sum(case when stamp_out is not null then cast(strftime('%s',stamp_out) as integer) - cast(strftime('%s',stamp_in) as integer) else 0 end) as daytrack from hours where id_staff='1' and stamp_in between date('now','start of month') and date('now','start of month','+1 month','-1 day')); +insert into hours (idstaff,stamp_in) VALUES ('1',CURRENT_TIMESTAMP); +select id,prename,surname,case when pin is null then 'nopin' else null end as haspin, case when blocked is not null then 'blocked' else null end as isblocked from staff st left join (select id_staff,max(startdate) as startdate from contract where startdate <= CURRENT_DATE group by id_staff) co on (st.id=co.id_staff); +select id from staff where id='1' and pin='1234'; +update staff set loginattemps=null where id='1'; +select last_id, case when current_stamp_in is not null then strftime('%d.%m.%Y
%H:%M',current_stamp_in) else null end as current_stamp_in, case when current_stamp_out is not null then strftime('%d.%m.%Y
%H:%M',current_stamp_out) else null end as current_stamp_out,cast((daytrack / 3600.0) as integer) || ':' || case when cast(((daytrack % 3600.0) / 60.0) as integer) < 10 then '0' else '' end || cast(((daytrack % 3600.0) / 60.0) as integer) as monthtrack from (select max(id) as last_id, case when date(max(stamp_in)) = CURRENT_DATE then max(stamp_in) else null end as current_stamp_in,case when date(max(stamp_out)) = CURRENT_DATE then max(stamp_out) else null end as current_stamp_out,sum(case when stamp_out is not null then cast(strftime('%s',stamp_out) as integer) - cast(strftime('%s',stamp_in) as integer) else 0 end) as daytrack from hours where id_staff='1' and stamp_in between date('now','start of month') and date('now','start of month','+1 month','-1 day')); +select id,prename,surname,case when pin is null then 'nopin' else null end as haspin, case when blocked is not null then 'blocked' else null end as isblocked from staff st left join (select id_staff,max(startdate) as startdate from contract where startdate <= CURRENT_DATE group by id_staff) co on (st.id=co.id_staff); +select id from staff where id='1' and pin='1234'; + +== +update staff set loginattemps=null where id='1'; +== +select last_id, case when current_stamp_in is not null then strftime('%d.%m.%Y
%H:%M',current_stamp_in) else null end as current_stamp_in, case when current_stamp_out is not null then strftime('%d.%m.%Y
%H:%M',current_stamp_out) else null end as current_stamp_out,cast((daytrack / 3600.0) as integer) || ':' || case when cast(((daytrack % 3600.0) / 60.0) as integer) < 10 then '0' else '' end || cast(((daytrack % 3600.0) / 60.0) as integer) as monthtrack from (select max(id) as last_id, case when date(max(stamp_in)) = CURRENT_DATE then max(stamp_in) else null end as current_stamp_in,case when date(max(stamp_out)) = CURRENT_DATE then max(stamp_out) else null end as current_stamp_out,sum(case when stamp_out is not null then cast(strftime('%s',stamp_out) as integer) - cast(strftime('%s',stamp_in) as integer) else 0 end) as daytrack from hours where id_staff='1' and stamp_in between date('now','start of month') and date('now','start of month','+1 month','-1 day')); + +== +insert into hours (idstaff,stamp_in) VALUES ('1',CURRENT_TIMESTAMP); +== +select id,prename,surname,case when pin is null then 'nopin' else null end as haspin, case when blocked is not null then 'blocked' else null end as isblocked from staff st left join (select id_staff,max(startdate) as startdate from contract where startdate <= CURRENT_DATE group by id_staff) co on (st.id=co.id_staff); +select id from staff where id='1' and pin='1234'; + +== +update staff set loginattemps=null where id='1'; +== +select last_id, case when current_stamp_in is not null then strftime('%d.%m.%Y
%H:%M',current_stamp_in) else null end as current_stamp_in, case when current_stamp_out is not null then strftime('%d.%m.%Y
%H:%M',current_stamp_out) else null end as current_stamp_out,cast((daytrack / 3600.0) as integer) || ':' || case when cast(((daytrack % 3600.0) / 60.0) as integer) < 10 then '0' else '' end || cast(((daytrack % 3600.0) / 60.0) as integer) as monthtrack from (select max(id) as last_id, case when date(max(stamp_in)) = CURRENT_DATE then max(stamp_in) else null end as current_stamp_in,case when date(max(stamp_out)) = CURRENT_DATE then max(stamp_out) else null end as current_stamp_out,sum(case when stamp_out is not null then cast(strftime('%s',stamp_out) as integer) - cast(strftime('%s',stamp_in) as integer) else 0 end) as daytrack from hours where id_staff='1' and stamp_in between date('now','start of month') and date('now','start of month','+1 month','-1 day')); + +== +insert into hours (idstaff,stamp_in) VALUES ('1',CURRENT_TIMESTAMP); +== +select id,prename,surname,case when pin is null then 'nopin' else null end as haspin, case when blocked is not null then 'blocked' else null end as isblocked from staff st left join (select id_staff,max(startdate) as startdate from contract where startdate <= CURRENT_DATE group by id_staff) co on (st.id=co.id_staff); +select id,prename,surname,case when pin is null then 'nopin' else null end as haspin, case when blocked is not null then 'blocked' else null end as isblocked from staff st left join (select id_staff,max(startdate) as startdate from contract where startdate <= CURRENT_DATE group by id_staff) co on (st.id=co.id_staff); +select id from staff where id='1' and pin='1234'; + +== +update staff set loginattemps=null where id='1'; +== +select last_id, case when current_stamp_in is not null then strftime('%d.%m.%Y
%H:%M',current_stamp_in) else null end as current_stamp_in, case when current_stamp_out is not null then strftime('%d.%m.%Y
%H:%M',current_stamp_out) else null end as current_stamp_out,cast((daytrack / 3600.0) as integer) || ':' || case when cast(((daytrack % 3600.0) / 60.0) as integer) < 10 then '0' else '' end || cast(((daytrack % 3600.0) / 60.0) as integer) as monthtrack from (select max(id) as last_id, case when date(max(stamp_in)) = CURRENT_DATE then max(stamp_in) else null end as current_stamp_in,case when date(max(stamp_out)) = CURRENT_DATE then max(stamp_out) else null end as current_stamp_out,sum(case when stamp_out is not null then cast(strftime('%s',stamp_out) as integer) - cast(strftime('%s',stamp_in) as integer) else 0 end) as daytrack from hours where id_staff='1' and stamp_in between date('now','start of month') and date('now','start of month','+1 month','-1 day')); + +== +insert into hours (id_staff,stamp_in) VALUES ('1',CURRENT_TIMESTAMP); +== +select id,prename,surname,case when pin is null then 'nopin' else null end as haspin, case when blocked is not null then 'blocked' else null end as isblocked from staff st left join (select id_staff,max(startdate) as startdate from contract where startdate <= CURRENT_DATE group by id_staff) co on (st.id=co.id_staff); +select id from staff where id='1' and pin='1234'; + +== +update staff set loginattemps=null where id='1'; +== +select last_id, case when current_stamp_in is not null then strftime('%d.%m.%Y
%H:%M',current_stamp_in) else null end as current_stamp_in, case when current_stamp_out is not null then strftime('%d.%m.%Y
%H:%M',current_stamp_out) else null end as current_stamp_out,cast((daytrack / 3600.0) as integer) || ':' || case when cast(((daytrack % 3600.0) / 60.0) as integer) < 10 then '0' else '' end || cast(((daytrack % 3600.0) / 60.0) as integer) as monthtrack from (select max(id) as last_id, case when date(max(stamp_in)) = CURRENT_DATE then max(stamp_in) else null end as current_stamp_in,case when date(max(stamp_out)) = CURRENT_DATE then max(stamp_out) else null end as current_stamp_out,sum(case when stamp_out is not null then cast(strftime('%s',stamp_out) as integer) - cast(strftime('%s',stamp_in) as integer) else 0 end) as daytrack from hours where id_staff='1' and stamp_in between date('now','start of month') and date('now','start of month','+1 month','-1 day')); + +== +update hours set stamp_out=CURRENT_TIMESTAMP where id_staff='1' and id='25'; +== +select id,prename,surname,case when pin is null then 'nopin' else null end as haspin, case when blocked is not null then 'blocked' else null end as isblocked from staff st left join (select id_staff,max(startdate) as startdate from contract where startdate <= CURRENT_DATE group by id_staff) co on (st.id=co.id_staff); +select id from staff where id='1' and pin='1234'; +select last_id, case when current_stamp_in is not null then strftime('%d.%m.%Y
%H:%M',current_stamp_in) else null end as current_stamp_in, case when current_stamp_out is not null then strftime('%d.%m.%Y
%H:%M',current_stamp_out) else null end as current_stamp_out,cast((daytrack / 3600.0) as integer) || ':' || case when cast(((daytrack % 3600.0) / 60.0) as integer) < 10 then '0' else '' end || cast(((daytrack % 3600.0) / 60.0) as integer) as monthtrack from (select max(id) as last_id, case when date(max(stamp_in)) = CURRENT_DATE then max(stamp_in) else null end as current_stamp_in,case when date(max(stamp_out)) = CURRENT_DATE then max(stamp_out) else null end as current_stamp_out,sum(case when stamp_out is not null then cast(strftime('%s',stamp_out) as integer) - cast(strftime('%s',stamp_in) as integer) else 0 end) as daytrack from hours where id_staff='1' and stamp_in between date('now','start of month') and date('now','start of month','+1 month','-1 day')); + +== +update staff set loginattemps=null where id='1'; +== + +== +insert into hours (id_staff,stamp_in) VALUES ('1',CURRENT_TIMESTAMP); +== +select id,prename,surname,case when pin is null then 'nopin' else null end as haspin, case when blocked is not null then 'blocked' else null end as isblocked from staff st left join (select id_staff,max(startdate) as startdate from contract where startdate <= CURRENT_DATE group by id_staff) co on (st.id=co.id_staff); +select id from staff where id='1' and pin='1234'; + +== +update staff set loginattemps=null where id='1'; +== +select last_id, case when current_stamp_in is not null then strftime('%d.%m.%Y
%H:%M',current_stamp_in) else null end as current_stamp_in, case when current_stamp_out is not null then strftime('%d.%m.%Y
%H:%M',current_stamp_out) else null end as current_stamp_out,cast((daytrack / 3600.0) as integer) || ':' || case when cast(((daytrack % 3600.0) / 60.0) as integer) < 10 then '0' else '' end || cast(((daytrack % 3600.0) / 60.0) as integer) as monthtrack from (select max(id) as last_id, case when date(max(stamp_in)) = CURRENT_DATE then max(stamp_in) else null end as current_stamp_in,case when date(max(stamp_out)) = CURRENT_DATE then max(stamp_out) else null end as current_stamp_out,sum(case when stamp_out is not null then cast(strftime('%s',stamp_out) as integer) - cast(strftime('%s',stamp_in) as integer) else 0 end) as daytrack from hours where id_staff='1' and stamp_in between date('now','start of month') and date('now','start of month','+1 month','-1 day')); +select id,prename,surname,case when pin is null then 'nopin' else null end as haspin, case when blocked is not null then 'blocked' else null end as isblocked from staff st left join (select id_staff,max(startdate) as startdate from contract where startdate <= CURRENT_DATE group by id_staff) co on (st.id=co.id_staff); +select id from staff where id='1' and pin='1234'; + +== +update staff set loginattemps=null where id='1'; +== +select last_id, case when current_stamp_in is not null then strftime('%d.%m.%Y
%H:%M',current_stamp_in) else null end as current_stamp_in, case when current_stamp_out is not null then strftime('%d.%m.%Y
%H:%M',current_stamp_out) else null end as current_stamp_out,cast((daytrack / 3600.0) as integer) || ':' || case when cast(((daytrack % 3600.0) / 60.0) as integer) < 10 then '0' else '' end || cast(((daytrack % 3600.0) / 60.0) as integer) as monthtrack from (select max(id) as last_id, case when date(max(stamp_in)) = CURRENT_DATE then max(stamp_in) else null end as current_stamp_in,case when date(max(stamp_out)) = CURRENT_DATE then max(stamp_out) else null end as current_stamp_out,sum(case when stamp_out is not null then cast(strftime('%s',stamp_out) as integer) - cast(strftime('%s',stamp_in) as integer) else 0 end) as daytrack from hours where id_staff='1' and stamp_in between date('now','start of month') and date('now','start of month','+1 month','-1 day')); + +== +insert into hours (id_staff,stamp_in) VALUES ('1',CURRENT_TIMESTAMP); +== +select id,prename,surname,case when pin is null then 'nopin' else null end as haspin, case when blocked is not null then 'blocked' else null end as isblocked from staff st left join (select id_staff,max(startdate) as startdate from contract where startdate <= CURRENT_DATE group by id_staff) co on (st.id=co.id_staff); +select id from staff where id='1' and pin='1234'; + +== +update staff set loginattemps=null where id='1'; +== +select last_id, case when current_stamp_in is not null then strftime('%d.%m.%Y
%H:%M',current_stamp_in) else null end as current_stamp_in, case when current_stamp_out is not null then strftime('%d.%m.%Y
%H:%M',current_stamp_out) else null end as current_stamp_out,cast((daytrack / 3600.0) as integer) || ':' || case when cast(((daytrack % 3600.0) / 60.0) as integer) < 10 then '0' else '' end || cast(((daytrack % 3600.0) / 60.0) as integer) as monthtrack from (select max(id) as last_id, case when date(max(stamp_in)) = CURRENT_DATE then max(stamp_in) else null end as current_stamp_in,case when date(max(stamp_out)) = CURRENT_DATE then max(stamp_out) else null end as current_stamp_out,sum(case when stamp_out is not null then cast(strftime('%s',stamp_out) as integer) - cast(strftime('%s',stamp_in) as integer) else 0 end) as daytrack from hours where id_staff='1' and stamp_in between date('now','start of month') and date('now','start of month','+1 month','-1 day')); diff --git a/CGI/index.cgi b/CGI/index.cgi new file mode 100755 index 0000000..2ac6aa4 --- /dev/null +++ b/CGI/index.cgi @@ -0,0 +1,199 @@ +#!C:\Strawberry\perl\bin\perl.exe + +use strict; +use FindBin qw($Bin); +# use lib ('CGI/api/lib/perl5'); +# use lib ('CGI/api/lib'); +use lib ($Bin.'/CGI/api/lib/perl5'); +use lib ($Bin.'/CGI/api/lib'); +# use lib ('./api/lib/perl5'); +# use lib ('./api/lib'); +use File::Basename qw/dirname basename/; +use Template; +# use Template::Constants qw( :debug ); +use CGI; +#use CGI::Carp qw(fatalsToBrowser); +use CGI::Cookie; +use Data::Dumper; +use JSON::PP; + +use dksconfig qw/$sitecfg/; +# use session; + +my $skl = "skeleton/index.tt"; +my $cgi = new CGI(); +my $p=(); +my $cookie; +my $vars = $sitecfg; + +#$vars->{filepath} = substr($cgi->url({-absolute=>1}),length($vars->{basepath})+1); +$vars->{filepath} = substr($ENV{PATH_INFO},1); +$vars->{baseurl} = $cgi->url({-base=>1}).$vars->{basepath}; + +if ($vars->{basepath} eq "/"){ + $vars->{siteurl} = $cgi->url({-base=>1}); +}else { + $vars->{siteurl} = $cgi->url({-base=>1}).dirname($vars->{basepath}); + $vars->{docroot} = $vars->{docroot}.dirname($vars->{basepath}); + #$vars->{sitepath} = dirname($vars->{basepath}); +} + + +if ($vars->{filepath} ne ""){ + $vars->{suffix} = substr($vars->{filepath},rindex($vars->{filepath},'.')); + $vars->{page} = $vars->{filepath}; + $vars->{page} =~ s/html$/tt/; +} +$vars->{abspath} = ""; + +# my $sess = (); +# my $se = session->new(); +# $p->{sid} = $cgi->cookie($vars->{cookiename}); +if ($cgi->request_method() eq "GET"){ + my @params = $cgi->param(); + foreach my $pp (@params){ + $p->{$pp} = $cgi->param($pp); + } + +} + +# if ($cgi->request_method() eq "POST"){ + +# my @params = $cgi->param(); +# foreach my $pp (@params){ +# $p->{$pp} = $cgi->param($pp); +# } +# # $vars->{hasposts} = $p; +# # if (exists($p->{'btnlogin'})){ +# # my $ret = $se->checklogin($p->{login},$p->{password}); +# # if ($ret->{sid} ne ""){ +# # $p->{sid} = $ret->{sid}; +# # $cookie = CGI::Cookie->new(-name=>$vars->{cookiename},-value=>$p->{sid},-httponly => 1); +# # }else { +# # $vars->{message} = $ret->{message}; +# # $vars->{messagetype} = $ret->{messagetype}; +# # $vars->{page} = "message.tt"; +# # } +# # } +# # if (exists($p->{'btnregister'})){ + +# # my $ret = $se->registeruser($p); + +# # $vars->{message} = $ret->{message}; +# # $vars->{messagetype} = $ret->{messagetype}; +# # $vars->{page} = $ret->{page}; +# # } +# # if (exists($p->{'btnforgotpassword'})){ +# # my $ret = $se->passwordforgotten($p->{email}); +# # $vars->{message} = $ret->{message}; +# # $vars->{messagetype} = $ret->{messagetype}; +# # $vars->{page} = "message.tt"; +# # } +# # if (exists($p->{'btnvalidateemail'})){ +# # my $ret = $se->validateaccount($p); +# # $vars->{message} = $ret->{message}; +# # $vars->{messagetype} = $ret->{messagetype}; +# # $vars->{page} = "message.tt"; +# # } +# # if (exists($p->{'btnresendcode'})){ +# # my $ret = $se->resendcode($p->{email}); +# # $vars->{message} = $ret->{message}; +# # $vars->{messagetype} = $ret->{messagetype}; +# # $vars->{page} = "message.tt"; +# # } + +# # if (exists($p->{logout})){ +# # $se->deletesession($p->{sid}); +# # $p->{sid} = ""; +# # $cookie = CGI::Cookie->new(-name=>$vars->{cookiename},-value=>"",-httponly => 1); +# # } +# # if (exists($p->{btndeleteprofile})){ +# # my $ret = $se->deleteprofile($p->{deleteprofile}); +# # $vars->{message} = $ret->{message}; +# # $vars->{messagetype} = $ret->{messagetype}; +# # $vars->{page} = "message.tt"; +# # if (exists($ret->{sid})){ +# # $p->{sid} = ""; +# # } +# # $cookie = CGI::Cookie->new(-name=>$vars->{cookiename},-value=>"",-httponly => 1); +# # } +# } + +# # if ($p->{sid} ne ""){ +# # $sess = $se->getsession($p->{sid}); +# # } + + +# #$vars->{beforex} = $vars->{page}; +# if (!exists($sess->{id}) || (!exists($p->{sid})) || $p->{sid} eq ""){ +# $skl = "skeleton/index.tt"; +# } +# # if ($vars->{page} eq "deleteprofile.tt") { +# # $skl = "skeleton/login.tt"; +# # } +# # my ($appname) = $ENV{REQUEST_URI} =~ /.*\/module\/(\w+)\/.*/; +# if ($p->{sid} ne ""){ +# $vars->{session} = $sess; +# } +# #SESSION - End +# # #BEGIN - Browser Blocking +# # if (($ENV{HTTP_USER_AGENT} !~ /Chrome/) || ($ENV{HTTP_USER_AGENT} =~ /Edge/) || ($ENV{HTTP_USER_AGENT} =~ /Firefox/)){ +# # $skl = "skeleton/browser.tt"; +# # } +# # #END - Browser Blocking +my $ctype = 'text/html'; +if ($vars->{suffix} eq ".js"){ + $ctype= "text/javascript"; +} elsif ($vars->{suffix} eq ".css"){ + $ctype = "text/css"; +} +#print $cgi->header(-type=>$ctype, -charset=>"utf-8",-cookie => $cookie); +print $cgi->header(-type=>$ctype, -charset=>"utf-8"); + +# print dirname($ENV{"SCRIPT_FILENAME"}); + +my $template = Template->new({INCLUDE_PATH => [$Bin.'/CGI/tmpl']}); +#} + +my @lv = split(/\//,$vars->{filepath}); +my $absnum = scalar(@lv)-1; + +for (my $i=0;$i<$absnum;$i++){ + $vars->{abspath} .= "../"; +} +if ($vars->{page} =~ /^app/){ + my @spl = split("/",$vars->{page}); + $vars->{app} = $spl[1]; +} +# $vars->{page} = $vars->{page}; +if ($vars->{page} =~ /module/){ + $vars->{module} = basename(dirname($vars->{page})); +} +$vars->{pagename} = basename($vars->{page}); +$vars->{pagename} =~ s/\.tt$//; +# my ($appname) = $ENV{REQUEST_URI} =~ /.*\/apps\/(\w+)\/.*/; +#$vars->{requri} = $ENV{REQUEST_URI}; + +#BEGIN - iFrame - Modules +#$skl ne "skeleton/login.tt" && +if ($vars->{page} =~ /module/){ + $skl = "skeleton/module.tt"; + if ($vars->{page} !~ /\.tt$/) { + $skl = "skeleton/file.tt"; + } + $vars->{params}= $p; +}elsif ($vars->{page} =~ /^app/){ + $skl = "skeleton/app.tt"; + if ($vars->{page} !~ /\.tt$/) { + $skl = "skeleton/file.tt"; + } + $vars->{params}= $p; +} + +#END - iFrame - Modules + +$template->process($skl,$vars) || die "Template process failed: ", $template->error(), "\n"; +print '/*
'.Dumper($vars)."
*/";
+
+
+
diff --git a/CGI/tmpl/app/hourtrax/index.tt b/CGI/tmpl/app/hourtrax/index.tt
new file mode 100755
index 0000000..74a2955
--- /dev/null
+++ b/CGI/tmpl/app/hourtrax/index.tt
@@ -0,0 +1,60 @@
+[% USE date %]
+[% vstamp=date.format(date.now, '%d%m%Y%H%M%S') %]
+
+
+
+
+
+
+  
+  
+
+Invoice Journal
+
+
+
+
+
+
+
+ +
+
+ +
+ + +
+ +
+ + +
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/CGI/tmpl/app/hourtrax/module/clock/index.js b/CGI/tmpl/app/hourtrax/module/clock/index.js new file mode 100644 index 0000000..e69de29 diff --git a/CGI/tmpl/app/hourtrax/module/clock/index.tt b/CGI/tmpl/app/hourtrax/module/clock/index.tt new file mode 100644 index 0000000..e69de29 diff --git a/CGI/tmpl/app/hourtrax/module/members/index.js b/CGI/tmpl/app/hourtrax/module/members/index.js new file mode 100644 index 0000000..e69de29 diff --git a/CGI/tmpl/app/hourtrax/module/members/index.tt b/CGI/tmpl/app/hourtrax/module/members/index.tt new file mode 100644 index 0000000..e69de29 diff --git a/CGI/tmpl/app/hourtrax/module/settings/index.js b/CGI/tmpl/app/hourtrax/module/settings/index.js new file mode 100644 index 0000000..e69de29 diff --git a/CGI/tmpl/app/hourtrax/module/settings/index.tt b/CGI/tmpl/app/hourtrax/module/settings/index.tt new file mode 100644 index 0000000..e69de29 diff --git a/CGI/tmpl/app/hourtrax/module/timetrack/index.js b/CGI/tmpl/app/hourtrax/module/timetrack/index.js new file mode 100644 index 0000000..e69de29 diff --git a/CGI/tmpl/app/hourtrax/module/timetrack/index.tt b/CGI/tmpl/app/hourtrax/module/timetrack/index.tt new file mode 100644 index 0000000..e69de29 diff --git a/CGI/tmpl/app/timeclock/index.js b/CGI/tmpl/app/timeclock/index.js new file mode 100644 index 0000000..3b6211e --- /dev/null +++ b/CGI/tmpl/app/timeclock/index.js @@ -0,0 +1,99 @@ +var app={ + interval: null, + intervaltime: 60, + currentscreen: 'scrloader', + showscreen: function screen(screenid){ + //console.log("old screen:" + app.currentscreen); + document.getElementById(app.currentscreen).style.display = 'none'; + document.getElementById(screenid).style.display = 'block'; + app.currentscreen = screenid; + //console.log("new screen:" + app.currentscreen); + }, + checkIdle: function(){ + if (app.intervaltime < 0){ + location.href = "clock.html"; + } else { + app.intervaltime = app.intervaltime - 1; + } + }, + startCheckIdle: function(){ + window.setInterval(app.checkIdle(),1000); + + }, + stopCheckIdle: function(){ + window.clearInterval(app.interval); + }, + database: 'hourtrax', + // reqdata: function(method,url,data,callback){ + // var host = ''; + // var ret = null; + // var rdata = null; + // var async = true; + // if (callback == null){ + // async = false; + // } + // if (location.protocol === 'file:'){ + // host = 'http://localhost:6060'; + // } + // var request = new XMLHttpRequest(); + // if (typeof data == 'object'){ + // var xdata = []; + // for (var i in data){ + // var value = ''; + // if (typeof(data[i]) == 'object'){ + // value = encodeURICOmponent(JSON.stringify(data[i])); + // } else { + // value = encodeURIComponent(data[i]); + // } + // xdata.push(i + "=" + value); + // } + // rdata = xdata.join("&"); + // }else { + // rdata = data; + // } + // //console.log("Data to send: " + decodeURIComponent(rdata)); + // var sendurl = host + '/' + url; + // if (method.toUpperCase() == 'GET'){ + // sendurl = sendurl + '?' + rdata; + // } + // //console.log("sending URL: " + method + " => " +sendurl); + // request.open(method.toUpperCase(), sendurl, false); + // request.onload = function(){ + // if (request.status >= 200 && request.status <= 400){ + // //console.log("Status returned: " + request.status + "resp:" + request.getResponseHeader("Content-Type")); + // if (request.getResponseHeader("Content-Type").indexOf('application/json') == 0){ + // var xparse = JSON.parse(request.responseText); + // ret = xparse.result; + // }else { + // ret = request.responseText; + // } + // ////console.log("data returned: " + request.responseText); + // if (callback){ + // callback(ret); + // } + + // } else { + // //console.log("ServerERROR: " + request.status + "\n" + request.responseText); + // alert("ServerERROR:" + request.status + "\n" + request.responseText); + // } + // }; + // request.onerror = function(){ + // //console.log("ERROR: connection ERROR\n" + url); + // alert("Connection ERROR!\n" + url); + // }; + // if (method.toUpperCase() == 'POST'){ + // request.setRequestHeader('Content-Type','application/x-www-form-urlencoded; charset=UTF-8'); + // request.send(rdata); + // } else { + // //request.withCredentials = true; + // request.send(); + // } + // return ret; + // } +} + +window.onload = function() { + //console.log('window - onload'); + login.gotoUsers(); +}; + diff --git a/CGI/tmpl/app/timeclock/index.tt b/CGI/tmpl/app/timeclock/index.tt new file mode 100644 index 0000000..afd9261 --- /dev/null +++ b/CGI/tmpl/app/timeclock/index.tt @@ -0,0 +1,96 @@ +[% USE date %] +[% vstamp=date.format(date.now, '%d%m%Y%H%M%S') %] + + + + +DKS Hourtrax + + + + + + + + + +
+

HourTrax  

+   +
+   +   +
+ +
+
+ +
+
+
Bonjour Prename,
+
+
+
+ + + + + + + + + + + + +
+
+
+
Bonjour Prename,
+
+
+
+ + + + + + + + + + + + +
+
+
+
Prénom Nom
+
Total heures mois courrant: 00:00 h
+
+ +
+
+
+ + + +
+
+ +
+ +
+ + + + + + + + + + + \ No newline at end of file diff --git a/CGI/tmpl/app/timeclock/login.js b/CGI/tmpl/app/timeclock/login.js new file mode 100644 index 0000000..2687bab --- /dev/null +++ b/CGI/tmpl/app/timeclock/login.js @@ -0,0 +1,154 @@ +var login = { + userid: null, + pinfield: null, + gotoLogin: function (btn){ + document.getElementById("reload").style.visibility = 'visible'; + document.getElementById("mnuviews").style.visibility = 'hidden'; + login.pinfield = 'pincode'; + console.log(typeof(btn)); + console.log(btn); + app.intervaltime = 60; + + if (typeof(btn) == "object"){ + if (btn){ + console.log(btn); + document.getElementById("pinmessage").innerHTML = ''; + document.getElementById('pincode').value = ''; + document.getElementById("usergreeting1").innerHTML ="Bonjour " + btn.dataset.prename + ", entrez votre code pin:"; + login.userid= btn.dataset.id; + } else { + login.userid= btn.dataset.id; + document.getElementById("usergreeting1").innerHTML="Bonjour " + btn.getAttribute('data-prename') + ", Entrez votre code pin:"; + document.getElementById("pinmessage").innerHTML = ''; + app.startCheckIdle(); + } + + } else if ((typeof(btn) == "string") && (btn == 'notpasswd')) { + document.getElementById("usergreeting1").innerHTML ="Bonjour " + document.getElementById("btn_user_" + login.userid).dataset.prename + ", entrez votre code pin:"; + + } + app.showscreen('scruserpin'); + }, + gotoNewLogin: function (btn){ + document.getElementById("reload").style.visibility = 'visible'; + document.getElementById("mnuviews").style.visibility = 'hidden'; + console.log("New Login!"); + console.log(btn); + app.intervaltime = 60; + if (btn != null){ + login.userid= btn.getAttribute('data-id'); + document.getElementById("usergreeting2").innerHTML="Bonjour, " + btn.getAttribute('data-prename') + "! Entrez votre nouveau code pin:"; + app.startCheckIdle(); + } + + login.pinfield = "newpincode1"; + document.getElementById("newpincode1").value = ""; + document.getElementById("newpincode2").value = ""; + document.getElementById("pinmessage2").innerHTML = ''; + app.showscreen('scrnewuserpin'); + + }, + gotoUsers: function(){ + var sqlq = "select id,prename,surname,case when pin is null then 'nopin' else null end as haspin, case when blocked is not null then 'blocked' else null end as isblocked from staff st left join (select id_staff,max(startdate) as startdate from contract where startdate <= CURRENT_DATE group by id_staff) co on (st.id=co.id_staff);"; + req.reqdata("POST","db.cgi",{"sql":sqlq},login.loadUsers); + + }, + setPin:function (key){ + app.intervaltime = 60; + if (key == 'COR'){ + document.getElementById('pincode').value = ''; + document.getElementById('newpincode1').value = ''; + document.getElementById('newpincode2').value = ''; + if (login.pinfield == "newpincode2"){ + login.pinfield = "newpincode1"; + } + document.getElementById("pinmessage").innerHTML = ''; + document.getElementById("pinmessage2").innerHTML = ''; + } else if (key == 'OK'){ + if (login.pinfield == 'pincode'){ + app.showscreen('scrloader'); + //var xa = {"type":"querysorted","sql":"select id from staff where id='"+login.userid+"' and pin='"+document.getElementById("pincode").value+"';"}; + req.reqdata("POST","db.cgi",{"sql":"select id from staff where id='"+login.userid+"' and pin='"+document.getElementById("pincode").value+"';"},login.getAccess); + + } else if (login.pinfield == 'newpincode1'){ + login.pinfield = 'newpincode2'; + } else if (login.pinfield == 'newpincode2'){ + var pin1 = document.getElementById("newpincode1").value; + var pin2 = document.getElementById("newpincode2").value; + if ((pin1.length < 4) || (pin2.length < 4)){ + document.getElementById("pinmessage2").innerHTML = 'minimum 4 nombre requis!'; + } + else if (pin1 != pin2){ + document.getElementById("pinmessage2").innerHTML = 'les codes pin sont pas identiques!'; + } else { + app.showscreen('scrloader'); + //var xa = {"type":"exec",; + req.reqdata("POST","db.cgi",{"db":"hourtrax","type":"exec","sql":"UPDATE staff SET pin='"+ pin1 +"' WHERE id='"+login.userid+"';"},login.gotoLogin); + + } + } + + } else { + //console.log("Add number " + key); + var cobj = document.getElementById(login.pinfield); + var cpin = cobj.value; + + cobj.value = cpin + key; + } + }, + getAccess: function(data){ + app.intervaltime = 60; + console.log(data); + console.log('getAccess'); + if ((data) && (data[0])){ + + req.reqdata("POST","db.cgi",{"sql":"update staff set loginattemps=null where id='"+login.userid+"';"},null) + + // console.log("Access OK!") + // if (ret){ + var xq = "select last_id, case when current_stamp_in is not null then strftime('%d.%m.%Y
%H:%M',current_stamp_in) else null end as current_stamp_in, case when current_stamp_out is not null then strftime('%d.%m.%Y
%H:%M',current_stamp_out) else null end as current_stamp_out,cast((daytrack / 3600.0) as integer) || ':' || case when cast(((daytrack % 3600.0) / 60.0) as integer) < 10 then '0' else '' end || cast(((daytrack % 3600.0) / 60.0) as integer) as monthtrack from (select max(id) as last_id, case when date(max(stamp_in)) = CURRENT_DATE then max(stamp_in) else null end as current_stamp_in,case when date(max(stamp_out)) = CURRENT_DATE then max(stamp_out) else null end as current_stamp_out,sum(case when stamp_out is not null then cast(strftime('%s',stamp_out) as integer) - cast(strftime('%s',stamp_in) as integer) else 0 end) as daytrack from hours where id_staff='"+ login.userid+"' and stamp_in between date('now','start of month') and date('now','start of month','+1 month','-1 day'));"; + req.reqdata("POST","db.cgi",{"sql":xq},track.loadtrackscreen); + + // } + } else { + //var xa = {"type":"exec","sql":"update staff set loginattemps=(select case when max(loginattemps) is null then 1 else loginattemps+1 end as newattemps from staff where id='"+login.userid+"') where id='"+login.userid+'";'}; + req.reqdata("POST","db.cgi",{"sql":"update staff set loginattemps=(select case when max(loginattemps) is null then 1 else loginattemps+1 end as newattemps from staff where id='"+login.userid+"') where id='"+login.userid+'";'},null); + + document.getElementById("pinmessage").innerHTML = 'code pin pas correcte!'; + login.gotoLogin('notpassed'); + } + + //console.log(data); +// if(login.curpincode == '1234'){ +// +// } else { +// login.curpincode = ''; +// login.pinenc = ''; +// document.getElementById("pincode").innerHTML = login.pinenc; +// document.getElementById("pinmessage").innerHTML = 'Code pas correcte'; +// } + }, + loadUsers: function(data){ + document.getElementById("reload").style.visibility = 'hidden'; + document.getElementById("mnuviews").style.visibility = 'hidden'; + var ulist = document.getElementById("scruserlist"); + ulist.innerHTML = ''; + console.log('loadUsers'); + console.log( data); + if (data != null){ + var btns = ''; + for (var i in data){ + console.log(i); + var disabled = ";" + if (data[i].isblocked != null){ + diabled='disabled="1"'; + } + btns += ''; + } + ulist.innerHTML = btns; + } + app.stopCheckIdle(); + app.showscreen('scruserlist'); + } +} + diff --git a/CGI/tmpl/app/timeclock/track.js b/CGI/tmpl/app/timeclock/track.js new file mode 100644 index 0000000..3a21f44 --- /dev/null +++ b/CGI/tmpl/app/timeclock/track.js @@ -0,0 +1,58 @@ +var track = { + trackid: null, + setTrack: function(type){ + app.showscreen('scrloader'); + console.log(type); + var tracksql = ""; + if (type == 'in'){ + tracksql = "insert into hours (id_staff,stamp_in) VALUES ('"+ login.userid+"',CURRENT_TIMESTAMP);"; + } else if (type == 'out'){ + tracksql = "update hours set stamp_out=CURRENT_TIMESTAMP where id_staff='"+ login.userid+"' and id='"+track.trackid+"';"; + } + //var xt = {"type":"exec","sql":tracksql}; + console.log("TRACK SQL: " + tracksql); + req.reqdata("POST","db.cgi",{"sql":tracksql},track.loadsuccessscreen); + }, + loadtrackscreen: function(data){ + + console.log('loadtrackscreen'); + document.getElementById("mnuviews").style.visibility = 'visible'; + console.log(data); + if (data) { + var btn=document.getElementById("btn_user_" + login.userid); + document.getElementById("usergreeting3").innerHTML = btn.getAttribute("data-prename") + " " + btn.getAttribute("data-surname"); + document.getElementById("monthhours").innerHTML = data[0].monthtrack + "h"; + document.getElementById("btntrackin").setAttribute("disabled",false); + document.getElementById("btntrackout").setAttribute("disabled",false); + document.getElementById("lasttrackin").innerHTML = ' 
 '; + document.getElementById("lasttrackout").innerHTML = ' 
 '; + track.trackid = data[0].last_id; + if (data[0].current_stamp_in != null){ + document.getElementById("lasttrackin").innerHTML = data[0].current_stamp_in; + } + if (data[0].current_stamp_out != null){ + document.getElementById("lasttrackout").innerHTML = data[0].current_stamp_out; + } + if ((data[0].current_stamp_in == null) && (data[0].current_stamp_out == null)){ + document.getElementById("btntrackin").removeAttribute("disabled"); + } else if ((data[0].current_stamp_in != null) && (data[0].current_stamp_out == null)){ + document.getElementById("btntrackout").removeAttribute("disabled"); + } else if ((data[0].current_stamp_in != null) && (data[0].current_stamp_out != null)) { + if (data[0].current_stamp_in > data[0].current_stamp_out){ + document.getElementById("btntrackout").removeAttribute("disabled"); + } else { + document.getElementById("btntrackin").removeAttribute("disabled"); + } + } + } + //document.getElementById("usergreeting3").value = "" + app.showscreen('scrtimetracker'); + }, + loadsuccessscreen: function(data){ + console.log(data); + document.getElementById("statusmsg").innerHTML = "L'heure est enregistré"; + app.showscreen('scrstatus'); + track.trackid = null; + setTimeout("parent.admin.loadapp('timeclock');",3000); + } +} \ No newline at end of file diff --git a/CGI/tmpl/block/snackbar.tt b/CGI/tmpl/block/snackbar.tt new file mode 100755 index 0000000..464a162 --- /dev/null +++ b/CGI/tmpl/block/snackbar.tt @@ -0,0 +1 @@ +
\ No newline at end of file diff --git a/CGI/tmpl/skeleton/app.tt b/CGI/tmpl/skeleton/app.tt new file mode 100755 index 0000000..e5e9f5f --- /dev/null +++ b/CGI/tmpl/skeleton/app.tt @@ -0,0 +1,3 @@ +[% #USE DBI %] +[% #USE dksdb = DBI(dsn, dbuser, dbpassword) %] +[% INCLUDE $page %] \ No newline at end of file diff --git a/CGI/tmpl/skeleton/file.tt b/CGI/tmpl/skeleton/file.tt new file mode 100755 index 0000000..e5e9f5f --- /dev/null +++ b/CGI/tmpl/skeleton/file.tt @@ -0,0 +1,3 @@ +[% #USE DBI %] +[% #USE dksdb = DBI(dsn, dbuser, dbpassword) %] +[% INCLUDE $page %] \ No newline at end of file diff --git a/CGI/tmpl/skeleton/index.tt b/CGI/tmpl/skeleton/index.tt new file mode 100755 index 0000000..6756601 --- /dev/null +++ b/CGI/tmpl/skeleton/index.tt @@ -0,0 +1,35 @@ +[% USE date %] +[% vstamp=date.format(date.now, '%d%m%Y%H%M%S') %] + + + + + + + + + +Hourtrax + + +
+
+ +
Hourtrax
+ + +
+
+
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/CGI/tmpl/skeleton/module.tt b/CGI/tmpl/skeleton/module.tt new file mode 100755 index 0000000..363b097 --- /dev/null +++ b/CGI/tmpl/skeleton/module.tt @@ -0,0 +1,60 @@ +[% USE Dumper %] + +[% #USE dksdb = DBI(dsn, dbuser, dbpassword) %] +[% #USE date %] +[% vstamp=date.format(date.now, '%d%m%Y') %] + + + + + + + + + [% adminname %] - [% module %] - [% pagename %] + + + + + + + + + + + [% #INCLUDE "module/$module/css.tt" %] + + + + +
+ [% #IF session.id %] + [% INCLUDE $page %] +
+ + + + + + + + + + [% #INCLUDE "module/$module/javascript.tt" %] + + + [% #ELSE %] + + [% #END %] + [% INCLUDE block/snackbar.tt %] + + + \ No newline at end of file diff --git a/Hourtraxsrv.pl b/Hourtraxsrv.pl new file mode 100644 index 0000000..79e2143 --- /dev/null +++ b/Hourtraxsrv.pl @@ -0,0 +1,108 @@ +#!/usr/bin/perl +use strict; +use File::Basename; +use Getopt::Long; +use Time::HiRes; +use Data::Dumper; +#use lib ($ENV{HOME}.'/perl5/lib/perl5'); +use FindBin qw($RealBin); +use lib $RealBin; + +use Plack::Builder; +use Plack::App::File; +use Plack::App::WrapCGI; +use Plack::Middleware::Auth::Basic; +use Plack::Middleware::DirIndex; +use Plack::Request; +use Plack::Runner; +#use Module::Service; +#use Module::Test; +# use Module::SQLite; +# use Module::FileSystem; +# use Module::System; + +print $^O."\n"; +print dirname($RealBin)."\n"; +my $datadir = dirname($RealBin).'/data'; +my $webdir = dirname($RealBin).'/web'; +print "Datadir:".$datadir."\n"; +my @match = grep { /par-.*inc$/} @INC; + +# if ($^O ne "MSWin32"){ +# use POSIX qw(setsid); +# open STDIN, '/dev/null' or die "Can't read /dev/null: $!"; +# open STDOUT, '>/dev/null' or die "Can't write to /dev/null: $!"; +# open STDERR, '>/dev/null' or die "Can't write to /dev/null: $!"; + +# die "cannot start process $!" unless defined (my $child = fork); +# exit 0 if $child; +# setsid() or die "cannot start new session $!"; +# chdir('/'); +# umask(0); +# system("echo ".$$." > /home/dks/data/hourtrax.pid"); +# } + +my $basedir = dirname($0); +if (scalar(@match) > 0){ + $basedir = $match[0]; +} + +my $cfgpath = ""; +#print "BASEDIR:".$basedir."\n"; + + +# sub version { +# require Twiggy; +# print "Twiggy $Twiggy::VERSION\n"; +# } + + + +my $name = basename($0); +$name =~ s/srv\.pl$//; +$name =~ s/srv\.exe$//; +$name = lc($name); + +sub authen_cb { + my($username, $password, $env) = @_; + my $auth = 0; + #print "Check AUTH\n"; + if (-e $datadir.'/'.$name.'.passwd'){ + open(AUTH,$datadir.'/'.$name.'.passwd'); + while (my $l = ){ + chomp($l); + if ($l eq $username.'='.$password){ + $auth = 1; + last; + } + } + close(AUTH); + } + return $auth; + } + + +my $allapp = builder { + enable_if { $_[0]->{REMOTE_ADDR} ne 'localhost' && $_[0]->{REMOTE_ADDR} ne '127.0.0.1' } "Auth::Basic", authenticator => \&authen_cb; + enable "Plack::Middleware::DirIndex", dir_index => 'index.html'; + mount "/" => Plack::App::WrapCGI->new(script => dirname($0)."/CGI/index.cgi")->to_app; + + opendir(API,dirname($0)."/CGI/api"); + while (my $s = readdir(API)){ + if ($s =~ /\.cgi$/){ + mount "/api/".$s => Plack::App::WrapCGI->new(script => dirname($0)."/CGI/api/".$s)->to_app; + } + } + closedir(API); + mount "/htdocs" => Plack::App::File->new(root => dirname($0)."/htdocs")->to_app; +}; + + +my @args = ("-p","6060","--error-log","error.log","--access-log","access.log"); +my $runner = Plack::Runner->new(server => 'Starlight', env => 'deployment', ipv6 => '1' );#env => development, test +$runner->parse_options(@args); +$runner->run($allapp); + +print "Started\n"; + + diff --git a/access.log b/access.log new file mode 100644 index 0000000..c7346e4 --- /dev/null +++ b/access.log @@ -0,0 +1,519 @@ +127.0.0.1 - - [23/Oct/2019:10:00:23 +0200] "GET / HTTP/1.1" 200 2143 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:00:23 +0200] "GET /htdocs/img/hourtrax.png HTTP/1.1" 200 23443 "http://localhost:6060/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:00:23 +0200] "GET /htdocs/css/w3pro.css?v=23102019100023 HTTP/1.1" 200 26847 "http://localhost:6060/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:00:23 +0200] "GET /htdocs/js/request.js?v=23102019100023 HTTP/1.1" 200 5256 "http://localhost:6060/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:00:23 +0200] "GET /htdocs/js/admin.js?v=23102019100023 HTTP/1.1" 200 2438 "http://localhost:6060/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:01:46 +0200] "GET / HTTP/1.1" 200 2128 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:01:46 +0200] "GET /htdocs/css/w3pro.css?v=23102019100146 HTTP/1.1" 200 26847 "http://localhost:6060/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:01:46 +0200] "GET /htdocs/img/hourtrax.png HTTP/1.1" 200 23443 "http://localhost:6060/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:01:46 +0200] "GET /htdocs/js/admin.js?v=23102019100146 HTTP/1.1" 200 2438 "http://localhost:6060/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:01:46 +0200] "GET /htdocs/js/request.js?v=23102019100146 HTTP/1.1" 200 5256 "http://localhost:6060/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:01:56 +0200] "GET /app/timeclock/index.html HTTP/1.1" 200 711 "http://localhost:6060/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:01:58 +0200] "GET / HTTP/1.1" 200 2128 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:01:58 +0200] "GET /htdocs/css/w3pro.css?v=23102019100158 HTTP/1.1" 200 26847 "http://localhost:6060/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:01:58 +0200] "GET /htdocs/img/hourtrax.png HTTP/1.1" 200 23443 "http://localhost:6060/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:01:58 +0200] "GET /htdocs/js/request.js?v=23102019100158 HTTP/1.1" 200 5256 "http://localhost:6060/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:01:58 +0200] "GET /htdocs/js/admin.js?v=23102019100158 HTTP/1.1" 200 2438 "http://localhost:6060/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:02:00 +0200] "GET /app/hourtrax/index.html HTTP/1.1" 200 3372 "http://localhost:6060/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:02:00 +0200] "GET /htdocs/css/w3pro.css HTTP/1.1" 200 26847 "http://localhost:6060/app/hourtrax/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:02:00 +0200] "GET /htdocs/img/hourtrax.png HTTP/1.1" 200 23443 "http://localhost:6060/app/hourtrax/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:02:00 +0200] "GET /htdocs/js/request.js HTTP/1.1" 200 5256 "http://localhost:6060/app/hourtrax/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:02:00 +0200] "GET /htdocs/img/icons/menu_white.svg HTTP/1.1" 404 9 "http://localhost:6060/app/hourtrax/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:02:00 +0200] "GET /htdocs/js/admin.js HTTP/1.1" 200 2438 "http://localhost:6060/app/hourtrax/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:03:32 +0200] "GET /app/hourtrax/index.html HTTP/1.1" 200 3372 "http://localhost:6060/app/hourtrax/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:03:32 +0200] "GET /htdocs/img/hourtrax.png HTTP/1.1" 200 23443 "http://localhost:6060/app/hourtrax/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:03:32 +0200] "GET /htdocs/js/request.js HTTP/1.1" 200 5256 "http://localhost:6060/app/hourtrax/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:03:32 +0200] "GET /htdocs/img/icons/menu_white.svg HTTP/1.1" 404 9 "http://localhost:6060/app/hourtrax/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:03:32 +0200] "GET /htdocs/js/admin.js HTTP/1.1" 200 2438 "http://localhost:6060/app/hourtrax/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:03:32 +0200] "GET /htdocs/css/w3pro.css HTTP/1.1" 200 26847 "http://localhost:6060/app/hourtrax/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:03:39 +0200] "GET / HTTP/1.1" 200 2128 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:03:39 +0200] "GET /htdocs/css/w3pro.css?v=23102019100339 HTTP/1.1" 200 26847 "http://localhost:6060/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:03:39 +0200] "GET /htdocs/img/hourtrax.png HTTP/1.1" 200 23443 "http://localhost:6060/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:03:39 +0200] "GET /htdocs/js/admin.js?v=23102019100339 HTTP/1.1" 200 2438 "http://localhost:6060/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:03:39 +0200] "GET /htdocs/js/request.js?v=23102019100339 HTTP/1.1" 200 5256 "http://localhost:6060/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:11:16 +0200] "GET /app/timeclock/index.html HTTP/1.1" 200 5399 "http://localhost:6060/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:11:17 +0200] "GET /htdocs/css/w3pro.css?v=23102019101116 HTTP/1.1" 200 26847 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:11:17 +0200] "GET /htdocs/js/request.js HTTP/1.1" 200 5256 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:11:17 +0200] "GET /htdocs/js/admin.js HTTP/1.1" 200 2438 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:11:17 +0200] "GET /app/timeclock/index.js?v=23102019101116 HTTP/1.1" 200 3780 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:11:17 +0200] "GET /app/timeclock/track.js?v=23102019101116 HTTP/1.1" 200 3547 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:11:17 +0200] "GET /app/timeclock/login.js?v=23102019101116 HTTP/1.1" 200 8277 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:11:23 +0200] "GET /app/timeclock/index.html HTTP/1.1" 200 5399 "http://localhost:6060/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:11:23 +0200] "GET /htdocs/css/w3pro.css?v=23102019101123 HTTP/1.1" 200 26847 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:11:23 +0200] "GET /htdocs/js/request.js HTTP/1.1" 200 5256 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:11:23 +0200] "GET /htdocs/js/admin.js HTTP/1.1" 200 2438 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:11:23 +0200] "GET /app/timeclock/track.js?v=23102019101123 HTTP/1.1" 200 3547 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:11:23 +0200] "GET /app/timeclock/login.js?v=23102019101123 HTTP/1.1" 200 8277 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:11:23 +0200] "GET /app/timeclock/index.js?v=23102019101123 HTTP/1.1" 200 3780 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:11:49 +0200] "GET /app/timeclock/index.html HTTP/1.1" 200 5412 "http://localhost:6060/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:11:49 +0200] "GET /htdocs/css/clock.css?v=23102019101149 HTTP/1.1" 200 6290 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:11:49 +0200] "GET /htdocs/css/w3pro.css?v=23102019101149 HTTP/1.1" 200 26847 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:11:49 +0200] "GET /htdocs/js/admin.js HTTP/1.1" 200 2438 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:11:49 +0200] "GET /htdocs/js/request.js HTTP/1.1" 200 5256 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:11:49 +0200] "GET /app/timeclock/index.js?v=23102019101149 HTTP/1.1" 200 3780 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:11:49 +0200] "GET /app/timeclock/track.js?v=23102019101149 HTTP/1.1" 200 3547 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:11:49 +0200] "GET /app/timeclock/login.js?v=23102019101149 HTTP/1.1" 200 8277 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:11:58 +0200] "GET /app/timeclock/index.html HTTP/1.1" 200 5412 "http://localhost:6060/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:11:58 +0200] "GET /htdocs/css/clock.css?v=23102019101158 HTTP/1.1" 200 6290 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:11:58 +0200] "GET /htdocs/css/w3pro.css?v=23102019101158 HTTP/1.1" 200 26847 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:11:58 +0200] "GET /htdocs/js/request.js HTTP/1.1" 200 5256 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:11:58 +0200] "GET /htdocs/js/admin.js HTTP/1.1" 200 2438 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:11:58 +0200] "GET /app/timeclock/track.js?v=23102019101158 HTTP/1.1" 200 3547 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:11:58 +0200] "GET /app/timeclock/index.js?v=23102019101158 HTTP/1.1" 200 3780 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:11:58 +0200] "GET /app/timeclock/login.js?v=23102019101158 HTTP/1.1" 200 8277 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:12:47 +0200] "GET /app/timeclock/index.html HTTP/1.1" 200 5416 "http://localhost:6060/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:12:47 +0200] "GET /htdocs/js/admin.js HTTP/1.1" 200 2438 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:12:47 +0200] "GET /htdocs/css/clock.css?v=23102019101247 HTTP/1.1" 200 6290 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:12:47 +0200] "GET /htdocs/js/request.js HTTP/1.1" 200 5256 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:12:47 +0200] "GET /htdocs/css/w3pro.css?v=23102019101247 HTTP/1.1" 200 26847 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:12:48 +0200] "GET /app/timeclock/track.js?v=23102019101247 HTTP/1.1" 200 3551 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:12:48 +0200] "GET /app/timeclock/login.js?v=23102019101247 HTTP/1.1" 200 8281 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:12:48 +0200] "GET /app/timeclock/index.js?v=23102019101247 HTTP/1.1" 200 3784 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:12:48 +0200] "POST /sqlite/query HTTP/1.1" 200 2137 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:31:12 +0200] "GET /app/timeclock/index.html HTTP/1.1" 200 5367 "http://localhost:6060/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:31:12 +0200] "GET /htdocs/css/clock.css?v=23102019103112 HTTP/1.1" 200 6290 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:31:12 +0200] "GET /htdocs/css/w3pro.css?v=23102019103112 HTTP/1.1" 200 26847 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:31:12 +0200] "GET /htdocs/js/request.js HTTP/1.1" 200 5256 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:31:12 +0200] "GET /htdocs/js/admin.js HTTP/1.1" 200 2438 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:31:13 +0200] "GET /app/timeclock/track.js?v=23102019103112 HTTP/1.1" 200 3502 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:31:13 +0200] "GET /app/timeclock/index.js?v=23102019103112 HTTP/1.1" 200 3930 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:31:13 +0200] "GET /app/timeclock/login.js?v=23102019103112 HTTP/1.1" 200 8840 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:31:24 +0200] "GET /app/timeclock/index.html HTTP/1.1" 200 5367 "http://localhost:6060/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:31:24 +0200] "GET /htdocs/css/w3pro.css?v=23102019103124 HTTP/1.1" 200 26847 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:31:24 +0200] "GET /htdocs/js/request.js HTTP/1.1" 200 5256 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:31:24 +0200] "GET /htdocs/js/admin.js HTTP/1.1" 200 2438 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:31:24 +0200] "GET /htdocs/css/clock.css?v=23102019103124 HTTP/1.1" 200 6290 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:31:24 +0200] "GET /app/timeclock/index.js?v=23102019103124 HTTP/1.1" 200 3930 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:31:24 +0200] "GET /app/timeclock/track.js?v=23102019103124 HTTP/1.1" 200 3502 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:31:24 +0200] "GET /app/timeclock/login.js?v=23102019103124 HTTP/1.1" 200 8840 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:31:49 +0200] "GET /app/timeclock/index.html HTTP/1.1" 200 5367 "http://localhost:6060/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:31:49 +0200] "GET /htdocs/js/request.js HTTP/1.1" 200 5256 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:31:49 +0200] "GET /htdocs/css/w3pro.css?v=23102019103149 HTTP/1.1" 200 26847 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:31:49 +0200] "GET /htdocs/js/admin.js HTTP/1.1" 200 2438 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:31:49 +0200] "GET /htdocs/css/clock.css?v=23102019103149 HTTP/1.1" 200 6290 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:31:49 +0200] "GET /app/timeclock/index.js?v=23102019103149 HTTP/1.1" 200 3930 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:31:49 +0200] "GET /app/timeclock/track.js?v=23102019103149 HTTP/1.1" 200 3502 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:31:49 +0200] "GET /app/timeclock/login.js?v=23102019103149 HTTP/1.1" 200 8839 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:31:50 +0200] "POST /api/db.cgi HTTP/1.1" 200 226 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:34:20 +0200] "GET /api/db.cgi?db=hourtrax&type=array&sql=SELECT%20id%2C%20company%2C%20prename%2Csurname%2C%20address%2C%20zip%2C%20city%2C%20country%2C%20email%2C%20phone%2C%20mobile%2C%20ident%20FROM%20accounts%3B HTTP/1.1" 200 226 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:36:05 +0200] "GET /app/timeclock/index.html HTTP/1.1" 200 5367 "http://localhost:6060/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:36:06 +0200] "GET /htdocs/css/w3pro.css?v=23102019103605 HTTP/1.1" 200 26847 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:36:06 +0200] "GET /htdocs/js/request.js HTTP/1.1" 200 5256 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:36:06 +0200] "GET /htdocs/css/clock.css?v=23102019103605 HTTP/1.1" 200 6290 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:36:06 +0200] "GET /htdocs/js/admin.js HTTP/1.1" 200 2438 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:36:06 +0200] "GET /app/timeclock/index.js?v=23102019103605 HTTP/1.1" 200 3930 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:36:06 +0200] "GET /app/timeclock/track.js?v=23102019103605 HTTP/1.1" 200 3502 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:36:06 +0200] "GET /app/timeclock/login.js?v=23102019103605 HTTP/1.1" 200 8935 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:36:06 +0200] "POST /api/db.cgi HTTP/1.1" 200 98 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:36:14 +0200] "GET /api/db.cgi?db=hourtrax&type=array&sql=select%20id%2Cprename%2Csurname%2Ccase%20when%20pin%20is%20null%20then%20%27nopin%27%20else%20null%20end%20as%20haspin%2C%20case%20when%20blocked%20is%20not%20null%20then%20%27blocked%27%20else%20null%20end%20as%20isblocked%20from%20staff%20st%20left%20join%20(select%20idstaff%2Cmax(startdate)%20as%20startdate%20from%20contract%20where%20startdate%20%3C%3D%20CURRENT_DATE%20group%20by%20idstaff)%20co%20on%20(st.id%3Dco.idstaff)%3B HTTP/1.1" 200 98 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:39:51 +0200] "GET /app/timeclock/index.html HTTP/1.1" 200 5367 "http://localhost:6060/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:39:51 +0200] "GET /htdocs/css/clock.css?v=23102019103951 HTTP/1.1" 200 6290 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:39:51 +0200] "GET /htdocs/css/w3pro.css?v=23102019103951 HTTP/1.1" 200 26847 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:39:51 +0200] "GET /htdocs/js/request.js HTTP/1.1" 200 5256 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:39:51 +0200] "GET /htdocs/js/admin.js HTTP/1.1" 200 2438 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:39:51 +0200] "GET /app/timeclock/track.js?v=23102019103951 HTTP/1.1" 200 3502 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:39:51 +0200] "GET /app/timeclock/login.js?v=23102019103951 HTTP/1.1" 200 8935 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:39:51 +0200] "GET /app/timeclock/index.js?v=23102019103951 HTTP/1.1" 200 3930 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:39:51 +0200] "POST /api/db.cgi HTTP/1.1" 200 98 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:42:08 +0200] "GET /app/timeclock/index.html HTTP/1.1" 200 5367 "http://localhost:6060/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:42:08 +0200] "GET /htdocs/css/clock.css?v=23102019104208 HTTP/1.1" 200 6290 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:42:08 +0200] "GET /htdocs/css/w3pro.css?v=23102019104208 HTTP/1.1" 200 26847 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:42:08 +0200] "GET /htdocs/js/admin.js HTTP/1.1" 200 2438 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:42:08 +0200] "GET /htdocs/js/request.js HTTP/1.1" 200 5256 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:42:08 +0200] "GET /app/timeclock/index.js?v=23102019104208 HTTP/1.1" 200 3930 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:42:08 +0200] "GET /app/timeclock/track.js?v=23102019104208 HTTP/1.1" 200 3502 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:42:08 +0200] "GET /app/timeclock/login.js?v=23102019104208 HTTP/1.1" 200 8935 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:42:08 +0200] "POST /api/db.cgi HTTP/1.1" 200 98 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:42:25 +0200] "GET /api/db.cgi?db=hourtrax&type=array&sql=select%20id%2Cprename%2Csurname%2Ccase%20when%20pin%20is%20null%20then%20%27nopin%27%20else%20null%20end%20as%20haspin%2C%20case%20when%20blocked%20is%20not%20null%20then%20%27blocked%27%20else%20null%20end%20as%20isblocked%20from%20staff%20st%20left%20join%20(select%20idstaff%2Cmax(startdate)%20as%20startdate%20from%20contract%20where%20startdate%20%3C%3D%20CURRENT_DATE%20group%20by%20idstaff)%20co%20on%20(st.id%3Dco.idstaff)%3B HTTP/1.1" 200 98 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:10:43:49 +0200] "GET /api/db.cgi?db=hourtrax&type=array&sql=select%20id%2Cprename%2Csurname%2Ccase%20when%20pin%20is%20null%20then%20%27nopin%27%20else%20null%20end%20as%20haspin%2C%20case%20when%20blocked%20is%20not%20null%20then%20%27blocked%27%20else%20null%20end%20as%20isblocked%20from%20staff%20st%20left%20join%20(select%20idstaff%2Cmax(startdate)%20as%20startdate%20from%20contract%20where%20startdate%20%3C%3D%20CURRENT_DATE%20group%20by%20idstaff)%20co%20on%20(st.id%3Dco.idstaff)%3B HTTP/1.1" 200 98 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:05:16 +0200] "GET /app/timeclock/index.html HTTP/1.1" 200 5367 "http://localhost:6060/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:05:16 +0200] "GET /htdocs/css/clock.css?v=23102019110516 HTTP/1.1" 200 6290 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:05:16 +0200] "GET /htdocs/js/request.js HTTP/1.1" 200 5256 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:05:16 +0200] "GET /htdocs/css/w3pro.css?v=23102019110516 HTTP/1.1" 200 26847 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:05:16 +0200] "GET /htdocs/js/admin.js HTTP/1.1" 200 2438 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:05:17 +0200] "GET /app/timeclock/track.js?v=23102019110516 HTTP/1.1" 200 3502 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:05:17 +0200] "GET /app/timeclock/index.js?v=23102019110516 HTTP/1.1" 200 3930 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:05:17 +0200] "GET /app/timeclock/login.js?v=23102019110516 HTTP/1.1" 200 8908 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:05:17 +0200] "POST /api/db.cgi HTTP/1.1" 200 38 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:05:21 +0200] "GET /api/db.cgi?sql=select%20id%2Cprename%2Csurname%2Ccase%20when%20pin%20is%20null%20then%20%27nopin%27%20else%20null%20end%20as%20haspin%2C%20case%20when%20blocked%20is%20not%20null%20then%20%27blocked%27%20else%20null%20end%20as%20isblocked%20from%20staff%20st%20left%20join%20(select%20id_staff%2Cmax(startdate)%20as%20startdate%20from%20contract%20where%20startdate%20%3C%3D%20CURRENT_DATE%20group%20by%20id_staff)%20co%20on%20(st.id%3Dco.id_staff)%3B HTTP/1.1" 200 38 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:06:34 +0200] "GET /api/db.cgi?sql=select%20id%2Cprename%2Csurname%2Ccase%20when%20pin%20is%20null%20then%20%27nopin%27%20else%20null%20end%20as%20haspin%2C%20case%20when%20blocked%20is%20not%20null%20then%20%27blocked%27%20else%20null%20end%20as%20isblocked%20from%20staff%20st%20left%20join%20(select%20id_staff%2Cmax(startdate)%20as%20startdate%20from%20contract%20where%20startdate%20%3C%3D%20CURRENT_DATE%20group%20by%20id_staff)%20co%20on%20(st.id%3Dco.id_staff)%3B HTTP/1.1" 200 462 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:06:38 +0200] "GET /app/timeclock/index.html HTTP/1.1" 200 5367 "http://localhost:6060/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:06:38 +0200] "GET /htdocs/css/clock.css?v=23102019110638 HTTP/1.1" 200 6290 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:06:38 +0200] "GET /htdocs/css/w3pro.css?v=23102019110638 HTTP/1.1" 200 26847 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:06:38 +0200] "GET /htdocs/js/request.js HTTP/1.1" 200 5256 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:06:38 +0200] "GET /htdocs/js/admin.js HTTP/1.1" 200 2438 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:06:38 +0200] "GET /app/timeclock/track.js?v=23102019110638 HTTP/1.1" 200 3502 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:06:38 +0200] "GET /app/timeclock/login.js?v=23102019110638 HTTP/1.1" 200 8908 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:06:38 +0200] "GET /app/timeclock/index.js?v=23102019110638 HTTP/1.1" 200 3930 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:06:39 +0200] "POST /api/db.cgi HTTP/1.1" 200 462 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:08:27 +0200] "GET /api/db.cgi?sql=select%20id%2Cprename%2Csurname%2Ccase%20when%20pin%20is%20null%20then%20%27nopin%27%20else%20null%20end%20as%20haspin%2C%20case%20when%20blocked%20is%20not%20null%20then%20%27blocked%27%20else%20null%20end%20as%20isblocked%20from%20staff%20st%20left%20join%20(select%20id_staff%2Cmax(startdate)%20as%20startdate%20from%20contract%20where%20startdate%20%3C%3D%20CURRENT_DATE%20group%20by%20id_staff)%20co%20on%20(st.id%3Dco.id_staff)%3B HTTP/1.1" 200 457 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:09:44 +0200] "GET /app/timeclock/index.html HTTP/1.1" 200 5367 "http://localhost:6060/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:09:44 +0200] "GET /htdocs/css/clock.css?v=23102019110944 HTTP/1.1" 200 6290 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:09:44 +0200] "GET /htdocs/js/admin.js HTTP/1.1" 200 2438 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:09:44 +0200] "GET /htdocs/js/request.js HTTP/1.1" 200 5256 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:09:44 +0200] "GET /htdocs/css/w3pro.css?v=23102019110944 HTTP/1.1" 200 26847 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:09:44 +0200] "GET /app/timeclock/login.js?v=23102019110944 HTTP/1.1" 200 8790 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:09:44 +0200] "GET /app/timeclock/track.js?v=23102019110944 HTTP/1.1" 200 3502 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:09:44 +0200] "GET /app/timeclock/index.js?v=23102019110944 HTTP/1.1" 200 3930 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:09:44 +0200] "POST /api/db.cgi HTTP/1.1" 200 457 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:13:38 +0200] "GET /app/timeclock/index.html HTTP/1.1" 200 5367 "http://localhost:6060/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:13:38 +0200] "GET /htdocs/js/request.js HTTP/1.1" 200 5256 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:13:38 +0200] "GET /htdocs/js/admin.js HTTP/1.1" 200 2438 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:13:38 +0200] "GET /htdocs/css/clock.css?v=23102019111338 HTTP/1.1" 200 6290 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:13:38 +0200] "GET /htdocs/css/w3pro.css?v=23102019111338 HTTP/1.1" 200 26847 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:13:38 +0200] "GET /app/timeclock/track.js?v=23102019111338 HTTP/1.1" 200 3502 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:13:38 +0200] "GET /app/timeclock/index.js?v=23102019111338 HTTP/1.1" 200 3930 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:13:38 +0200] "GET /app/timeclock/login.js?v=23102019111338 HTTP/1.1" 200 8814 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:13:38 +0200] "POST /api/db.cgi HTTP/1.1" 200 457 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:20:00 +0200] "GET /app/timeclock/index.html HTTP/1.1" 200 5367 "http://localhost:6060/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:20:00 +0200] "GET /htdocs/css/clock.css?v=23102019112000 HTTP/1.1" 200 6290 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:20:00 +0200] "GET /htdocs/css/w3pro.css?v=23102019112000 HTTP/1.1" 200 26847 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:20:00 +0200] "GET /htdocs/js/request.js HTTP/1.1" 200 5256 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:20:00 +0200] "GET /htdocs/js/admin.js HTTP/1.1" 200 2438 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:20:00 +0200] "GET /app/timeclock/track.js?v=23102019112000 HTTP/1.1" 200 3502 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:20:00 +0200] "GET /app/timeclock/index.js?v=23102019112000 HTTP/1.1" 200 3930 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:20:00 +0200] "GET /app/timeclock/login.js?v=23102019112000 HTTP/1.1" 200 8753 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:20:47 +0200] "GET /app/timeclock/index.html HTTP/1.1" 200 5367 "http://localhost:6060/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:20:47 +0200] "GET /htdocs/js/admin.js HTTP/1.1" 200 2438 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:20:47 +0200] "GET /htdocs/css/clock.css?v=23102019112047 HTTP/1.1" 200 6290 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:20:47 +0200] "GET /htdocs/js/request.js HTTP/1.1" 200 5256 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:20:47 +0200] "GET /htdocs/css/w3pro.css?v=23102019112047 HTTP/1.1" 200 26847 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:20:47 +0200] "GET /app/timeclock/index.js?v=23102019112047 HTTP/1.1" 200 3930 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:20:47 +0200] "GET /app/timeclock/login.js?v=23102019112047 HTTP/1.1" 200 8753 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:20:47 +0200] "GET /app/timeclock/track.js?v=23102019112047 HTTP/1.1" 200 3502 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:20:47 +0200] "POST /api/db.cgi HTTP/1.1" 200 457 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:21:03 +0200] "GET /app/timeclock/index.html HTTP/1.1" 200 5367 "http://localhost:6060/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:21:03 +0200] "GET /htdocs/css/clock.css?v=23102019112103 HTTP/1.1" 200 6290 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:21:03 +0200] "GET /htdocs/css/w3pro.css?v=23102019112103 HTTP/1.1" 200 26847 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:21:03 +0200] "GET /htdocs/js/request.js HTTP/1.1" 200 5256 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:21:03 +0200] "GET /htdocs/js/admin.js HTTP/1.1" 200 2438 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:21:03 +0200] "GET /app/timeclock/login.js?v=23102019112103 HTTP/1.1" 200 8753 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:21:03 +0200] "GET /app/timeclock/track.js?v=23102019112103 HTTP/1.1" 200 3502 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:21:03 +0200] "GET /app/timeclock/index.js?v=23102019112103 HTTP/1.1" 200 3930 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:21:03 +0200] "POST /api/db.cgi HTTP/1.1" 200 457 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:21:46 +0200] "POST /api/db.cgi HTTP/1.1" 200 83 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:21:47 +0200] "POST /api/db.cgi HTTP/1.1" 200 83 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:24:45 +0200] "GET /app/timeclock/index.html HTTP/1.1" 200 5367 "http://localhost:6060/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:24:45 +0200] "GET /htdocs/css/clock.css?v=23102019112445 HTTP/1.1" 200 6290 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:24:45 +0200] "GET /htdocs/css/w3pro.css?v=23102019112445 HTTP/1.1" 200 26847 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:24:45 +0200] "GET /htdocs/js/admin.js HTTP/1.1" 200 2438 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:24:45 +0200] "GET /htdocs/js/request.js HTTP/1.1" 200 5256 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:24:46 +0200] "GET /app/timeclock/track.js?v=23102019112445 HTTP/1.1" 200 3502 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:24:46 +0200] "GET /app/timeclock/index.js?v=23102019112445 HTTP/1.1" 200 3930 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:24:46 +0200] "GET /app/timeclock/login.js?v=23102019112445 HTTP/1.1" 200 8812 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:24:46 +0200] "POST /api/db.cgi HTTP/1.1" 200 457 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:25:03 +0200] "GET /app/timeclock/index.html HTTP/1.1" 200 5367 "http://localhost:6060/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:25:03 +0200] "GET /htdocs/css/clock.css?v=23102019112503 HTTP/1.1" 200 6290 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:25:03 +0200] "GET /htdocs/css/w3pro.css?v=23102019112503 HTTP/1.1" 200 26847 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:25:03 +0200] "GET /htdocs/js/admin.js HTTP/1.1" 200 2438 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:25:03 +0200] "GET /htdocs/js/request.js HTTP/1.1" 200 5256 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:25:03 +0200] "GET /app/timeclock/index.js?v=23102019112503 HTTP/1.1" 200 3930 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:25:03 +0200] "GET /app/timeclock/login.js?v=23102019112503 HTTP/1.1" 200 8813 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:25:03 +0200] "GET /app/timeclock/track.js?v=23102019112503 HTTP/1.1" 200 3502 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:25:04 +0200] "POST /api/db.cgi HTTP/1.1" 200 457 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:25:15 +0200] "GET /app/timeclock/index.html HTTP/1.1" 200 5367 "http://localhost:6060/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:25:15 +0200] "GET /htdocs/css/clock.css?v=23102019112515 HTTP/1.1" 200 6290 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:25:15 +0200] "GET /htdocs/css/w3pro.css?v=23102019112515 HTTP/1.1" 200 26847 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:25:15 +0200] "GET /htdocs/js/request.js HTTP/1.1" 200 5256 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:25:15 +0200] "GET /htdocs/js/admin.js HTTP/1.1" 200 2438 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:25:15 +0200] "GET /app/timeclock/index.js?v=23102019112515 HTTP/1.1" 200 3930 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:25:15 +0200] "GET /app/timeclock/login.js?v=23102019112515 HTTP/1.1" 200 8813 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:25:15 +0200] "GET /app/timeclock/track.js?v=23102019112515 HTTP/1.1" 200 3502 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:25:15 +0200] "POST /api/db.cgi HTTP/1.1" 200 457 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:26:01 +0200] "GET /app/timeclock/index.html HTTP/1.1" 200 5378 "http://localhost:6060/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:26:01 +0200] "GET /htdocs/css/clock.css?v=23102019112601 HTTP/1.1" 200 6290 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:26:01 +0200] "GET /htdocs/css/w3pro.css?v=23102019112601 HTTP/1.1" 200 26847 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:26:01 +0200] "GET /htdocs/js/request.js HTTP/1.1" 200 5256 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:26:01 +0200] "GET /htdocs/js/admin.js HTTP/1.1" 200 2438 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:26:02 +0200] "GET /app/timeclock/track.js?v=23102019112601 HTTP/1.1" 200 3502 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:26:02 +0200] "GET /app/timeclock/index.js?v=23102019112601 HTTP/1.1" 200 3930 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:26:02 +0200] "GET /app/timeclock/login.js?v=23102019112601 HTTP/1.1" 200 8813 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:26:02 +0200] "POST /api/db.cgi HTTP/1.1" 200 457 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:26:42 +0200] "POST /api/db.cgi HTTP/1.1" 200 93 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:26:43 +0200] "POST /api/db.cgi HTTP/1.1" 200 83 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:31:11 +0200] "GET /app/timeclock/index.html HTTP/1.1" 200 5378 "http://localhost:6060/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:31:11 +0200] "GET /htdocs/css/clock.css?v=23102019113111 HTTP/1.1" 200 6290 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:31:11 +0200] "GET /htdocs/js/admin.js HTTP/1.1" 200 2438 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:31:11 +0200] "GET /htdocs/js/request.js HTTP/1.1" 200 5256 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:31:11 +0200] "GET /htdocs/css/w3pro.css?v=23102019113111 HTTP/1.1" 200 26847 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:31:11 +0200] "GET /app/timeclock/track.js?v=23102019113111 HTTP/1.1" 200 3502 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:31:11 +0200] "GET /app/timeclock/index.js?v=23102019113111 HTTP/1.1" 200 3930 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:31:11 +0200] "GET /app/timeclock/login.js?v=23102019113111 HTTP/1.1" 200 8731 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:31:11 +0200] "POST /api/db.cgi HTTP/1.1" 200 457 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:33:52 +0200] "GET /app/timeclock/index.html HTTP/1.1" 200 5378 "http://localhost:6060/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:33:53 +0200] "GET /htdocs/css/clock.css?v=23102019113352 HTTP/1.1" 200 6290 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:33:53 +0200] "GET /htdocs/css/w3pro.css?v=23102019113352 HTTP/1.1" 200 26847 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:33:53 +0200] "GET /htdocs/js/admin.js HTTP/1.1" 200 2438 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:33:53 +0200] "GET /htdocs/js/request.js HTTP/1.1" 200 5256 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:33:53 +0200] "GET /app/timeclock/index.js?v=23102019113352 HTTP/1.1" 200 3930 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:33:53 +0200] "GET /app/timeclock/track.js?v=23102019113352 HTTP/1.1" 200 3502 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:33:53 +0200] "GET /app/timeclock/login.js?v=23102019113352 HTTP/1.1" 200 8426 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:33:53 +0200] "POST /api/db.cgi HTTP/1.1" 200 457 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:34:29 +0200] "GET /api/db.cgi?sql=select%20id%2Cprename%2Csurname%2Ccase%20when%20pin%20is%20null%20then%20%27nopin%27%20else%20null%20end%20as%20haspin%2C%20case%20when%20blocked%20is%20not%20null%20then%20%27blocked%27%20else%20null%20end%20as%20isblocked%20from%20staff%20st%20left%20join%20(select%20id_staff%2Cmax(startdate)%20as%20startdate%20from%20contract%20where%20startdate%20%3C%3D%20CURRENT_DATE%20group%20by%20id_staff)%20co%20on%20(st.id%3Dco.id_staff)%3B HTTP/1.1" 200 457 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:43:23 +0200] "GET /app/timeclock/index.html HTTP/1.1" 200 5378 "http://localhost:6060/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:43:23 +0200] "GET /htdocs/css/clock.css?v=23102019114323 HTTP/1.1" 200 6290 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:43:23 +0200] "GET /htdocs/js/request.js HTTP/1.1" 200 5256 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:43:23 +0200] "GET /htdocs/css/w3pro.css?v=23102019114323 HTTP/1.1" 200 26847 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:43:23 +0200] "GET /htdocs/js/admin.js HTTP/1.1" 200 2438 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:43:24 +0200] "GET /app/timeclock/track.js?v=23102019114323 HTTP/1.1" 200 3502 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:43:24 +0200] "GET /app/timeclock/login.js?v=23102019114323 HTTP/1.1" 200 8426 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:43:24 +0200] "GET /app/timeclock/index.js?v=23102019114323 HTTP/1.1" 200 3930 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:46:09 +0200] "GET /api/db.cgi?sql=select%20*%20from%20staff; HTTP/1.1" 200 688 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:46:14 +0200] "GET /api/db.cgi?sql=select%20id%2Cprename%2Csurname%2Ccase%20when%20pin%20is%20null%20then%20%27nopin%27%20else%20null%20end%20as%20haspin%2C%20case%20when%20blocked%20is%20not%20null%20then%20%27blocked%27%20else%20null%20end%20as%20isblocked%20from%20staff%20st%20left%20join%20(select%20id_staff%2Cmax(startdate)%20as%20startdate%20from%20contract%20where%20startdate%20%3C%3D%20CURRENT_DATE%20group%20by%20id_staff)%20co%20on%20(st.id%3Dco.id_staff)%3B HTTP/1.1" 200 448 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:46:22 +0200] "GET /app/timeclock/index.html HTTP/1.1" 200 5378 "http://localhost:6060/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:46:22 +0200] "GET /htdocs/css/w3pro.css?v=23102019114622 HTTP/1.1" 200 26847 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:46:22 +0200] "GET /htdocs/css/clock.css?v=23102019114622 HTTP/1.1" 200 6290 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:46:22 +0200] "GET /htdocs/js/request.js HTTP/1.1" 200 5256 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:46:22 +0200] "GET /htdocs/js/admin.js HTTP/1.1" 200 2438 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:46:22 +0200] "GET /app/timeclock/track.js?v=23102019114622 HTTP/1.1" 200 3502 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:46:22 +0200] "GET /app/timeclock/index.js?v=23102019114622 HTTP/1.1" 200 3930 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:46:22 +0200] "GET /app/timeclock/login.js?v=23102019114622 HTTP/1.1" 200 8426 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:46:23 +0200] "POST /api/db.cgi HTTP/1.1" 200 448 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:46:27 +0200] "GET /app/timeclock/index.html HTTP/1.1" 200 5378 "http://localhost:6060/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:46:27 +0200] "GET /htdocs/css/clock.css?v=23102019114627 HTTP/1.1" 200 6290 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:46:27 +0200] "GET /htdocs/js/request.js HTTP/1.1" 200 5256 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:46:27 +0200] "GET /htdocs/js/admin.js HTTP/1.1" 200 2438 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:46:27 +0200] "GET /htdocs/css/w3pro.css?v=23102019114627 HTTP/1.1" 200 26847 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:46:27 +0200] "GET /app/timeclock/track.js?v=23102019114627 HTTP/1.1" 200 3502 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:46:27 +0200] "GET /app/timeclock/login.js?v=23102019114627 HTTP/1.1" 200 8426 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:46:27 +0200] "GET /app/timeclock/index.js?v=23102019114627 HTTP/1.1" 200 3930 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:46:27 +0200] "POST /api/db.cgi HTTP/1.1" 200 448 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:48:08 +0200] "GET /app/timeclock/index.html HTTP/1.1" 200 5385 "http://localhost:6060/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:48:08 +0200] "GET /htdocs/css/clock.css?v=23102019114808 HTTP/1.1" 200 6290 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:48:08 +0200] "GET /htdocs/css/w3pro.css?v=23102019114808 HTTP/1.1" 200 26847 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:48:08 +0200] "GET /htdocs/js/request.js HTTP/1.1" 200 5256 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:48:08 +0200] "GET /htdocs/js/admin.js HTTP/1.1" 200 2438 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:48:08 +0200] "GET /app/timeclock/track.js?v=23102019114808 HTTP/1.1" 200 3502 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:48:08 +0200] "GET /app/timeclock/index.js?v=23102019114808 HTTP/1.1" 200 3930 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:48:09 +0200] "GET /app/timeclock/login.js?v=23102019114808 HTTP/1.1" 200 8426 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:48:09 +0200] "POST /api/db.cgi HTTP/1.1" 200 448 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:48:11 +0200] "GET /app/timeclock/index.html HTTP/1.1" 200 5385 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:48:11 +0200] "GET /htdocs/css/clock.css?v=23102019114811 HTTP/1.1" 200 6290 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:48:11 +0200] "GET /htdocs/css/w3pro.css?v=23102019114811 HTTP/1.1" 200 26847 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:48:11 +0200] "GET /htdocs/js/admin.js HTTP/1.1" 200 2438 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:48:11 +0200] "GET /htdocs/js/request.js HTTP/1.1" 200 5256 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:48:11 +0200] "GET /app/timeclock/track.js?v=23102019114811 HTTP/1.1" 200 3502 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:48:11 +0200] "GET /app/timeclock/index.js?v=23102019114811 HTTP/1.1" 200 3930 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:48:11 +0200] "GET /app/timeclock/login.js?v=23102019114811 HTTP/1.1" 200 8426 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:48:11 +0200] "POST /api/db.cgi HTTP/1.1" 200 448 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:48:14 +0200] "GET /app/timeclock/index.html HTTP/1.1" 200 5385 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:48:14 +0200] "GET /htdocs/css/clock.css?v=23102019114814 HTTP/1.1" 200 6290 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:48:14 +0200] "GET /htdocs/css/w3pro.css?v=23102019114814 HTTP/1.1" 200 26847 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:48:14 +0200] "GET /htdocs/js/request.js HTTP/1.1" 200 5256 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:48:14 +0200] "GET /htdocs/js/admin.js HTTP/1.1" 200 2438 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:48:14 +0200] "GET /app/timeclock/track.js?v=23102019114814 HTTP/1.1" 200 3502 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:48:14 +0200] "GET /app/timeclock/index.js?v=23102019114814 HTTP/1.1" 200 3930 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:48:14 +0200] "GET /app/timeclock/login.js?v=23102019114814 HTTP/1.1" 200 8426 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:48:14 +0200] "POST /api/db.cgi HTTP/1.1" 200 448 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:48:22 +0200] "POST /api/db.cgi HTTP/1.1" 200 33 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:48:22 +0200] "POST /api/db.cgi HTTP/1.1" 200 23 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:54:36 +0200] "GET /app/timeclock/index.html HTTP/1.1" 200 5385 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:54:36 +0200] "GET /htdocs/css/clock.css?v=23102019115436 HTTP/1.1" 200 6290 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:54:36 +0200] "GET /htdocs/css/w3pro.css?v=23102019115436 HTTP/1.1" 200 26847 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:54:36 +0200] "GET /htdocs/js/request.js HTTP/1.1" 200 5256 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:54:36 +0200] "GET /htdocs/js/admin.js HTTP/1.1" 200 2438 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:54:36 +0200] "GET /app/timeclock/login.js?v=23102019115436 HTTP/1.1" 200 8408 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:54:36 +0200] "GET /app/timeclock/track.js?v=23102019115436 HTTP/1.1" 200 3502 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:54:36 +0200] "GET /app/timeclock/index.js?v=23102019115436 HTTP/1.1" 200 3930 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:54:36 +0200] "POST /api/db.cgi HTTP/1.1" 200 448 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:54:42 +0200] "POST /api/db.cgi HTTP/1.1" 200 33 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:54:42 +0200] "POST /api/db.cgi HTTP/1.1" 200 23 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:54:42 +0200] "POST /api/db.cgi HTTP/1.1" 200 166 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:55:03 +0200] "GET /app/timeclock/index.html HTTP/1.1" 200 5385 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:55:03 +0200] "GET /htdocs/css/clock.css?v=23102019115503 HTTP/1.1" 200 6290 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:55:03 +0200] "GET /htdocs/js/request.js HTTP/1.1" 200 5256 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:55:03 +0200] "GET /htdocs/js/admin.js HTTP/1.1" 200 2438 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:55:03 +0200] "GET /htdocs/css/w3pro.css?v=23102019115503 HTTP/1.1" 200 26847 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:55:03 +0200] "GET /app/timeclock/track.js?v=23102019115503 HTTP/1.1" 200 3502 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:55:03 +0200] "GET /app/timeclock/index.js?v=23102019115503 HTTP/1.1" 200 3930 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:55:03 +0200] "GET /app/timeclock/login.js?v=23102019115503 HTTP/1.1" 200 8408 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:55:03 +0200] "POST /api/db.cgi HTTP/1.1" 200 448 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:55:08 +0200] "POST /api/db.cgi HTTP/1.1" 200 33 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:55:08 +0200] "POST /api/db.cgi HTTP/1.1" 200 166 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:55:08 +0200] "POST /api/db.cgi HTTP/1.1" 200 23 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:56:34 +0200] "GET /app/timeclock/index.html HTTP/1.1" 200 5385 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:56:34 +0200] "GET /htdocs/css/clock.css?v=23102019115634 HTTP/1.1" 200 6290 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:56:34 +0200] "GET /htdocs/css/w3pro.css?v=23102019115634 HTTP/1.1" 200 26847 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:56:34 +0200] "GET /htdocs/js/admin.js HTTP/1.1" 200 2438 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:56:34 +0200] "GET /htdocs/js/request.js HTTP/1.1" 200 5256 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:56:34 +0200] "GET /app/timeclock/track.js?v=23102019115634 HTTP/1.1" 200 3390 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:56:34 +0200] "GET /app/timeclock/login.js?v=23102019115634 HTTP/1.1" 200 8408 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:56:34 +0200] "GET /app/timeclock/index.js?v=23102019115634 HTTP/1.1" 200 3930 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:56:34 +0200] "POST /api/db.cgi HTTP/1.1" 200 448 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:56:39 +0200] "POST /api/db.cgi HTTP/1.1" 200 33 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:56:39 +0200] "POST /api/db.cgi HTTP/1.1" 200 23 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:56:39 +0200] "POST /api/db.cgi HTTP/1.1" 200 166 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:58:24 +0200] "GET /app/timeclock/index.html HTTP/1.1" 200 5385 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:58:24 +0200] "GET /htdocs/css/clock.css?v=23102019115824 HTTP/1.1" 200 6290 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:58:24 +0200] "GET /htdocs/css/w3pro.css?v=23102019115824 HTTP/1.1" 200 26847 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:58:24 +0200] "GET /htdocs/js/admin.js HTTP/1.1" 200 2438 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:58:24 +0200] "GET /htdocs/js/request.js HTTP/1.1" 200 5256 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:58:24 +0200] "GET /app/timeclock/track.js?v=23102019115824 HTTP/1.1" 200 3401 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:58:24 +0200] "GET /app/timeclock/index.js?v=23102019115824 HTTP/1.1" 200 3930 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:58:24 +0200] "GET /app/timeclock/login.js?v=23102019115824 HTTP/1.1" 200 8408 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:58:24 +0200] "POST /api/db.cgi HTTP/1.1" 200 448 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:58:29 +0200] "POST /api/db.cgi HTTP/1.1" 200 33 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:58:29 +0200] "POST /api/db.cgi HTTP/1.1" 200 23 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:58:29 +0200] "POST /api/db.cgi HTTP/1.1" 200 166 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:58:30 +0200] "POST /api/db.cgi HTTP/1.1" 200 23 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:59:31 +0200] "GET /app/timeclock/index.html HTTP/1.1" 200 5385 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:59:31 +0200] "GET /htdocs/css/w3pro.css?v=23102019115931 HTTP/1.1" 200 26847 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:59:31 +0200] "GET /htdocs/css/clock.css?v=23102019115931 HTTP/1.1" 200 6290 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:59:31 +0200] "GET /htdocs/js/admin.js HTTP/1.1" 200 2438 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:59:31 +0200] "GET /htdocs/js/request.js HTTP/1.1" 200 5256 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:59:31 +0200] "GET /app/timeclock/index.js?v=23102019115931 HTTP/1.1" 200 3930 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:59:31 +0200] "GET /app/timeclock/track.js?v=23102019115931 HTTP/1.1" 200 3409 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:59:31 +0200] "GET /app/timeclock/login.js?v=23102019115931 HTTP/1.1" 200 8377 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:59:31 +0200] "POST /api/db.cgi HTTP/1.1" 200 448 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:59:36 +0200] "POST /api/db.cgi HTTP/1.1" 200 33 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:59:36 +0200] "POST /api/db.cgi HTTP/1.1" 200 23 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:59:36 +0200] "POST /api/db.cgi HTTP/1.1" 200 106 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:59:40 +0200] "POST /api/db.cgi HTTP/1.1" 200 23 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:59:43 +0200] "GET /app/timeclock/index.html HTTP/1.1" 200 5385 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:59:43 +0200] "GET /htdocs/css/clock.css?v=23102019115943 HTTP/1.1" 200 6290 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:59:43 +0200] "GET /htdocs/css/w3pro.css?v=23102019115943 HTTP/1.1" 200 26847 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:59:43 +0200] "GET /htdocs/js/request.js HTTP/1.1" 200 5256 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:59:43 +0200] "GET /htdocs/js/admin.js HTTP/1.1" 200 2438 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:59:43 +0200] "GET /app/timeclock/track.js?v=23102019115943 HTTP/1.1" 200 3409 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:59:43 +0200] "GET /app/timeclock/login.js?v=23102019115943 HTTP/1.1" 200 8377 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:59:43 +0200] "GET /app/timeclock/index.js?v=23102019115943 HTTP/1.1" 200 3930 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:59:43 +0200] "POST /api/db.cgi HTTP/1.1" 200 448 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:59:53 +0200] "POST /api/db.cgi HTTP/1.1" 200 33 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:59:53 +0200] "POST /api/db.cgi HTTP/1.1" 200 23 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:11:59:53 +0200] "POST /api/db.cgi HTTP/1.1" 200 106 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:02:20 +0200] "GET /app/timeclock/index.html HTTP/1.1" 200 5385 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:02:20 +0200] "GET /htdocs/css/w3pro.css?v=23102019120220 HTTP/1.1" 200 26847 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:02:20 +0200] "GET /htdocs/js/admin.js HTTP/1.1" 200 2438 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:02:20 +0200] "GET /htdocs/js/request.js HTTP/1.1" 200 5256 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:02:20 +0200] "GET /htdocs/css/clock.css?v=23102019120220 HTTP/1.1" 200 6290 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:02:21 +0200] "GET /app/timeclock/index.js?v=23102019120220 HTTP/1.1" 200 3930 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:02:21 +0200] "GET /app/timeclock/track.js?v=23102019120220 HTTP/1.1" 200 3409 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:02:21 +0200] "GET /app/timeclock/login.js?v=23102019120220 HTTP/1.1" 200 8377 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:02:21 +0200] "POST /api/db.cgi HTTP/1.1" 200 448 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:02:29 +0200] "POST /api/db.cgi HTTP/1.1" 200 33 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:02:29 +0200] "POST /api/db.cgi HTTP/1.1" 200 23 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:02:29 +0200] "POST /api/db.cgi HTTP/1.1" 200 106 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:02:31 +0200] "POST /api/db.cgi HTTP/1.1" 200 23 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:02:35 +0200] "GET /app/timeclock/index.html HTTP/1.1" 200 5385 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:02:35 +0200] "GET /htdocs/css/clock.css?v=23102019120235 HTTP/1.1" 200 6290 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:02:35 +0200] "GET /htdocs/css/w3pro.css?v=23102019120235 HTTP/1.1" 200 26847 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:02:35 +0200] "GET /htdocs/js/request.js HTTP/1.1" 200 5256 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:02:35 +0200] "GET /htdocs/js/admin.js HTTP/1.1" 200 2438 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:02:35 +0200] "GET /app/timeclock/login.js?v=23102019120235 HTTP/1.1" 200 8377 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:02:35 +0200] "GET /app/timeclock/track.js?v=23102019120235 HTTP/1.1" 200 3409 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:02:35 +0200] "GET /app/timeclock/index.js?v=23102019120235 HTTP/1.1" 200 3930 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:02:35 +0200] "POST /api/db.cgi HTTP/1.1" 200 448 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:02:39 +0200] "POST /api/db.cgi HTTP/1.1" 200 33 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:02:39 +0200] "POST /api/db.cgi HTTP/1.1" 200 23 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:02:39 +0200] "POST /api/db.cgi HTTP/1.1" 200 106 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:05:09 +0200] "GET /app/timeclock/index.html HTTP/1.1" 200 5385 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:05:10 +0200] "GET /htdocs/css/w3pro.css?v=23102019120509 HTTP/1.1" 200 26847 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:05:10 +0200] "GET /htdocs/css/clock.css?v=23102019120509 HTTP/1.1" 200 6290 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:05:10 +0200] "GET /htdocs/js/admin.js HTTP/1.1" 200 2438 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:05:10 +0200] "GET /htdocs/js/request.js HTTP/1.1" 200 5256 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:05:10 +0200] "GET /app/timeclock/track.js?v=23102019120509 HTTP/1.1" 200 3452 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:05:10 +0200] "GET /app/timeclock/index.js?v=23102019120509 HTTP/1.1" 200 3930 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:05:10 +0200] "GET /app/timeclock/login.js?v=23102019120509 HTTP/1.1" 200 8377 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:05:10 +0200] "POST /api/db.cgi HTTP/1.1" 200 448 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:05:14 +0200] "POST /api/db.cgi HTTP/1.1" 200 33 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:05:14 +0200] "POST /api/db.cgi HTTP/1.1" 200 111 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:05:14 +0200] "POST /api/db.cgi HTTP/1.1" 200 106 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:05:16 +0200] "POST /api/db.cgi HTTP/1.1" 200 142 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:05:19 +0200] "GET /app/timeclock/index.html HTTP/1.1" 200 5385 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:05:19 +0200] "GET /htdocs/css/clock.css?v=23102019120519 HTTP/1.1" 200 6290 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:05:19 +0200] "GET /htdocs/js/admin.js HTTP/1.1" 200 2438 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:05:19 +0200] "GET /htdocs/js/request.js HTTP/1.1" 200 5256 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:05:19 +0200] "GET /htdocs/css/w3pro.css?v=23102019120519 HTTP/1.1" 200 26847 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:05:19 +0200] "GET /app/timeclock/index.js?v=23102019120519 HTTP/1.1" 200 3930 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:05:19 +0200] "GET /app/timeclock/track.js?v=23102019120519 HTTP/1.1" 200 3452 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:05:19 +0200] "GET /app/timeclock/login.js?v=23102019120519 HTTP/1.1" 200 8377 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:05:19 +0200] "POST /api/db.cgi HTTP/1.1" 200 448 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:05:24 +0200] "POST /api/db.cgi HTTP/1.1" 200 33 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:05:24 +0200] "POST /api/db.cgi HTTP/1.1" 200 111 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:05:24 +0200] "POST /api/db.cgi HTTP/1.1" 200 106 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:06:11 +0200] "POST /api/db.cgi HTTP/1.1" 200 142 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:06:14 +0200] "GET /app/timeclock/index.html HTTP/1.1" 200 5385 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:06:14 +0200] "GET /htdocs/css/w3pro.css?v=23102019120614 HTTP/1.1" 200 26847 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:06:14 +0200] "GET /htdocs/css/clock.css?v=23102019120614 HTTP/1.1" 200 6290 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:06:14 +0200] "GET /htdocs/js/request.js HTTP/1.1" 200 5256 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:06:14 +0200] "GET /htdocs/js/admin.js HTTP/1.1" 200 2438 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:06:15 +0200] "GET /app/timeclock/index.js?v=23102019120614 HTTP/1.1" 200 3930 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:06:15 +0200] "GET /app/timeclock/track.js?v=23102019120614 HTTP/1.1" 200 3452 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:06:15 +0200] "GET /app/timeclock/login.js?v=23102019120614 HTTP/1.1" 200 8377 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:06:15 +0200] "POST /api/db.cgi HTTP/1.1" 200 448 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:06:53 +0200] "GET /app/timeclock/index.html HTTP/1.1" 200 5385 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:06:54 +0200] "GET /htdocs/css/clock.css?v=23102019120653 HTTP/1.1" 200 6290 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:06:54 +0200] "GET /htdocs/css/w3pro.css?v=23102019120653 HTTP/1.1" 200 26847 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:06:54 +0200] "GET /htdocs/js/request.js HTTP/1.1" 200 5256 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:06:54 +0200] "GET /htdocs/js/admin.js HTTP/1.1" 200 2438 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:06:54 +0200] "GET /app/timeclock/track.js?v=23102019120653 HTTP/1.1" 200 3454 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:06:54 +0200] "GET /app/timeclock/login.js?v=23102019120653 HTTP/1.1" 200 8377 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:06:54 +0200] "GET /app/timeclock/index.js?v=23102019120653 HTTP/1.1" 200 3930 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:06:54 +0200] "POST /api/db.cgi HTTP/1.1" 200 448 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:06:58 +0200] "POST /api/db.cgi HTTP/1.1" 200 33 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:06:58 +0200] "POST /api/db.cgi HTTP/1.1" 200 111 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:06:58 +0200] "POST /api/db.cgi HTTP/1.1" 200 106 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:06:59 +0200] "POST /api/db.cgi HTTP/1.1" 200 34 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:07:02 +0200] "GET /app/timeclock/index.html HTTP/1.1" 200 5385 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:07:02 +0200] "GET /htdocs/css/clock.css?v=23102019120702 HTTP/1.1" 200 6290 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:07:02 +0200] "GET /htdocs/css/w3pro.css?v=23102019120702 HTTP/1.1" 200 26847 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:07:02 +0200] "GET /htdocs/js/admin.js HTTP/1.1" 200 2438 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:07:02 +0200] "GET /htdocs/js/request.js HTTP/1.1" 200 5256 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:07:02 +0200] "GET /app/timeclock/login.js?v=23102019120702 HTTP/1.1" 200 8377 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:07:02 +0200] "GET /app/timeclock/index.js?v=23102019120702 HTTP/1.1" 200 3930 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:07:02 +0200] "GET /app/timeclock/track.js?v=23102019120702 HTTP/1.1" 200 3454 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:07:02 +0200] "POST /api/db.cgi HTTP/1.1" 200 448 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:07:06 +0200] "POST /api/db.cgi HTTP/1.1" 200 33 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:07:06 +0200] "POST /api/db.cgi HTTP/1.1" 200 111 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:07:06 +0200] "POST /api/db.cgi HTTP/1.1" 200 126 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:07:11 +0200] "POST /api/db.cgi HTTP/1.1" 200 34 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:07:13 +0200] "GET /app/timeclock/index.html HTTP/1.1" 200 5385 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:07:14 +0200] "GET /htdocs/css/clock.css?v=23102019120713 HTTP/1.1" 200 6290 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:07:14 +0200] "GET /htdocs/css/w3pro.css?v=23102019120713 HTTP/1.1" 200 26847 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:07:14 +0200] "GET /htdocs/js/request.js HTTP/1.1" 200 5256 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:07:14 +0200] "GET /htdocs/js/admin.js HTTP/1.1" 200 2438 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:07:14 +0200] "GET /app/timeclock/login.js?v=23102019120713 HTTP/1.1" 200 8377 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:07:14 +0200] "GET /app/timeclock/track.js?v=23102019120713 HTTP/1.1" 200 3454 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:07:14 +0200] "GET /app/timeclock/index.js?v=23102019120713 HTTP/1.1" 200 3930 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:07:14 +0200] "POST /api/db.cgi HTTP/1.1" 200 448 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:07:18 +0200] "POST /api/db.cgi HTTP/1.1" 200 33 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:07:18 +0200] "POST /api/db.cgi HTTP/1.1" 200 111 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:07:18 +0200] "POST /api/db.cgi HTTP/1.1" 200 144 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:07:34 +0200] "POST /api/db.cgi HTTP/1.1" 200 34 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:07:37 +0200] "GET /app/timeclock/index.html HTTP/1.1" 200 5385 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:07:37 +0200] "GET /htdocs/css/clock.css?v=23102019120737 HTTP/1.1" 200 6290 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:07:37 +0200] "GET /htdocs/css/w3pro.css?v=23102019120737 HTTP/1.1" 200 26847 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:07:37 +0200] "GET /htdocs/js/request.js HTTP/1.1" 200 5256 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:07:37 +0200] "GET /htdocs/js/admin.js HTTP/1.1" 200 2438 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:07:37 +0200] "GET /app/timeclock/track.js?v=23102019120737 HTTP/1.1" 200 3454 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:07:37 +0200] "GET /app/timeclock/login.js?v=23102019120737 HTTP/1.1" 200 8377 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:07:37 +0200] "GET /app/timeclock/index.js?v=23102019120737 HTTP/1.1" 200 3930 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:07:38 +0200] "POST /api/db.cgi HTTP/1.1" 200 448 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:07:42 +0200] "POST /api/db.cgi HTTP/1.1" 200 33 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:07:42 +0200] "POST /api/db.cgi HTTP/1.1" 200 111 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:07:42 +0200] "POST /api/db.cgi HTTP/1.1" 200 144 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:08:07 +0200] "GET /app/timeclock/index.html HTTP/1.1" 200 5385 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:08:07 +0200] "GET /htdocs/css/clock.css?v=23102019120807 HTTP/1.1" 200 6290 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:08:07 +0200] "GET /htdocs/css/w3pro.css?v=23102019120807 HTTP/1.1" 200 26847 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:08:07 +0200] "GET /htdocs/js/admin.js HTTP/1.1" 200 2438 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:08:07 +0200] "GET /htdocs/js/request.js HTTP/1.1" 200 5256 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:08:08 +0200] "GET /app/timeclock/track.js?v=23102019120807 HTTP/1.1" 200 3454 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:08:08 +0200] "GET /app/timeclock/login.js?v=23102019120807 HTTP/1.1" 200 8377 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:08:08 +0200] "GET /app/timeclock/index.js?v=23102019120807 HTTP/1.1" 200 3930 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:08:08 +0200] "POST /api/db.cgi HTTP/1.1" 200 448 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:08:26 +0200] "POST /api/db.cgi HTTP/1.1" 200 33 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:08:26 +0200] "POST /api/db.cgi HTTP/1.1" 200 111 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:08:26 +0200] "POST /api/db.cgi HTTP/1.1" 200 144 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:08:28 +0200] "POST /api/db.cgi HTTP/1.1" 200 34 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:08:31 +0200] "GET /app/timeclock/index.html HTTP/1.1" 200 5385 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:08:31 +0200] "GET /htdocs/css/w3pro.css?v=23102019120831 HTTP/1.1" 200 26847 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:08:31 +0200] "GET /htdocs/css/clock.css?v=23102019120831 HTTP/1.1" 200 6290 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:08:31 +0200] "GET /htdocs/js/request.js HTTP/1.1" 200 5256 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:08:31 +0200] "GET /htdocs/js/admin.js HTTP/1.1" 200 2438 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:08:31 +0200] "GET /app/timeclock/login.js?v=23102019120831 HTTP/1.1" 200 8377 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:08:31 +0200] "GET /app/timeclock/track.js?v=23102019120831 HTTP/1.1" 200 3454 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:08:31 +0200] "GET /app/timeclock/index.js?v=23102019120831 HTTP/1.1" 200 3930 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:08:31 +0200] "POST /api/db.cgi HTTP/1.1" 200 448 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:08:35 +0200] "POST /api/db.cgi HTTP/1.1" 200 33 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:08:35 +0200] "POST /api/db.cgi HTTP/1.1" 200 111 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +127.0.0.1 - - [23/Oct/2019:12:08:35 +0200] "POST /api/db.cgi HTTP/1.1" 200 144 "http://localhost:6060/app/timeclock/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" diff --git a/bin/Hourtraxsrv.pl b/bin/Hourtraxsrv.pl index 18f4ec4..79ba578 100644 --- a/bin/Hourtraxsrv.pl +++ b/bin/Hourtraxsrv.pl @@ -4,7 +4,7 @@ use File::Basename; use Getopt::Long; use Time::HiRes; use Data::Dumper; -use lib ($ENV{HOME}.'/perl5/lib/perl5'); +#use lib ($ENV{HOME}.'/perl5/lib/perl5'); use FindBin qw($RealBin); use lib $RealBin; @@ -28,19 +28,19 @@ my $webdir = dirname($RealBin).'/web'; print "Datadir:".$datadir."\n"; my @match = grep { /par-.*inc$/} @INC; -if ($^O ne "MSWin32"){ - use POSIX qw(setsid); - open STDIN, '/dev/null' or die "Can't read /dev/null: $!"; - open STDOUT, '>/dev/null' or die "Can't write to /dev/null: $!"; - open STDERR, '>/dev/null' or die "Can't write to /dev/null: $!"; +# if ($^O ne "MSWin32"){ +# use POSIX qw(setsid); +# open STDIN, '/dev/null' or die "Can't read /dev/null: $!"; +# open STDOUT, '>/dev/null' or die "Can't write to /dev/null: $!"; +# open STDERR, '>/dev/null' or die "Can't write to /dev/null: $!"; - die "cannot start process $!" unless defined (my $child = fork); - exit 0 if $child; - setsid() or die "cannot start new session $!"; - chdir('/'); - umask(0); - system("echo ".$$." > /home/dks/data/hourtrax.pid"); -} +# die "cannot start process $!" unless defined (my $child = fork); +# exit 0 if $child; +# setsid() or die "cannot start new session $!"; +# chdir('/'); +# umask(0); +# system("echo ".$$." > /home/dks/data/hourtrax.pid"); +# } my $basedir = dirname($0); if (scalar(@match) > 0){ @@ -51,10 +51,7 @@ my $cfgpath = ""; #print "BASEDIR:".$basedir."\n"; -sub version { - require Twiggy; - print "Twiggy $Twiggy::VERSION\n"; -} + @@ -93,8 +90,8 @@ my $allapp = builder { }; -my @args = ("-p","6060"); -my $runner = Plack::Runner->new(server => 'Twiggy', env => 'deployment', version_cb => \&version);#env => development, test +my @args = ("-p","6060","--error-log","error.log","--access-log","access.log"); +my $runner = Plack::Runner->new(server => 'Starlight', env => 'deployment', ipv6 => '1' );#env => development, test $runner->parse_options(@args); $runner->run($allapp); diff --git a/data/.dks b/data/.dks new file mode 120000 index 0000000..7a3e3e6 --- /dev/null +++ b/data/.dks @@ -0,0 +1 @@ +.dks \ No newline at end of file diff --git a/data/hourtrax.sqlite b/data/hourtrax.sqlite index 17b102bd945834994f07279c4c87cc9e9b9cade5..306fd4d2db672155b81e8b858c561932ffd14a6e 100644 GIT binary patch literal 13312 zcmeHN%Woq|8L#TH6FZDI>}F>?LljN#h$u74cIcPwc1w%4lQBcG87Je|JIhN^zdSUP z*jYa`3=-02M}iA~0Eazs0JK6N#2%Kzo|Y3rh$Dg%M-B*aMOulks@ecoA=IFt`*K_%1yK`#xcm<^p#^_a^M+iNEGY4lH&J3IzaHil44jkNE zaD9Tdvhkr<8+CZ>_B-LnGp`k- zSSM}!vFq^L2M7BVqY8N)uS=Z^n@-Gb@3ifBO%Kd>!I}E*{R)4#@+G6OU*~rkwOXZG zKc>c`x^e$->CXALUhv&hM#%U~#68BvJnnhUu}{r_6zXEnJUu%G$AbC|ZS8(9Y;?Si zYxlhNkb-XXadu~0&oAcJ*6_10FlX&{tJg8@UT|HCxExqNKCe4H$Aqy%-5zTaY6Kph zxb9=0Yv_vm!(6JkB|_@V4j-l$@|&CZD}L8~^8|+Oao2sb@3w5W8+}}eI6snjoA$|< z;mtca@&-zC%ZU7xTPB!$kFzHazr=be7^rcX#@gytgp{UPwk5YD31Z1E392oLf~i`z zpx9;2YC5K+*@|&$wj8hJ?whAD4R$42QDsrm1W^(ck(Ua(r0SA*kj^w#^9)lm70a?z z!L>?`plStIFw3GW*p4X5s-l#OYT>Tg^4t^Cu)SVegkua)mR?I`8aHl0dnmS5Dodto z3u?(x1=W&G!BP}WC~8i@w2PuBS*1O<1&FV~Jb6$Z1Cz7{0Wg7rsZLpwOR_46PEi!p zVzDV$PN^VRWk<5gWkoDBC8O_j+^6@A2aVn8E=;-ny_&IOjKdZH@NjLF!p=eDIG*@A z1`^jPiDt3vlq5?NWVcilR7chXtEmE=rGl-BTG6qa+P2xT%#OKzP^%hMe&=BSpgN&( z6kXAlpo(dtBJw@*NAeA#l3#!!IT8jE2BtD_n>27U##EN38RJY*DVj0P^g~$DF=l3N zgEX>nW{Mp563U`Ygnx}6kROsA^jGv2+T{Msb;sO4x|T%^1;tDW!TAXoFb zIm&@mR^~-b7e)Bz*PfZAQq&}uDVHi;Rhy~#%8|y)k@(5w$f{nDp}lK<1I6i1A?BgQ z3k4k(RQ5%{IFe*tR`lleIcn~|KMhg}_ky6{X8yk^2RIJ*R|=}?svP!)nWW;;3N2^G zaUluNmQqotA4vm>BBti@9F?aZYvavZqU9*zo;B=7syGUDuj=d@r=>9-1-G-r57GPT;E40rRU~Zt3%{GOKv%13TML|@c%Tpw_ z>5w&kFYQ+*)&d=c7_CftFEzl5vxWnfB1qs^VUlC1Ju<+Gv&;h)kVJW!ghlqaz{eP0 z0<2ylY-%QAaXIpPM98~{d`R9W@A`k!8alBj3?vMEQVd*KAZs`XVy3fclE*BvxSCDD zEep!hNWJV^+b7O-@^_TV5pvT{1dB{FJU;{hOFGBB0}K8yAvTYH1Q+_phdm@e#^iV)F9AU+r4+MQsW~T_{Jd%j~-NcmN&P=Z&&W^R^b{X zF*|=$sq^7*=qqEfZT{hxE42!Le%WHa=TAPnn7?@wKYQihf(30$#v8rK1`XiL97Fr9 zc_Q7PsC)q-anAvlm_)L42O<2z&KgEu%W=Owh+zA=3q1Rs5HcT2fyea2^)E~hSdLH? zq=Qxz)`J2w@RVaZ50z{pBF|9Pf%FJ5@Ej3#XnLUR!2PJS1Ew);2W;W~KGaEu8o}5A z$SvLZAH@HGGmeA!-wOO7{1LiFM?YNu#w0a`5y|Em_VZ~}k$`}YF6#i}$Q=4vBB4?} z*_ZX^P>BDpBvdBwb6-W|C#1&xllvLmCP%`+$H2g0I*WYSuQ5T>3vIU5GQ?No?D+Q~ zn6B-O z0>=s1vhh#8h{&JFugDLG3%ALUFpw}1i-Gm@0>TilOkW&HTu=GgQWpma*NLBvTpa&f z=lpEk#i6~=;{}w3y7^$!BCd4&U%?xQd_cZKN@S7y4fhsz$mQ^F@%QmVNJtLKz}9L8 zWtqkUbO!UR1e%Jb%i09f*5{_=FX`<6$b=!N$+$uDQyFvwtf&{LwiV4UNh2nj%eWqb zfN=O6ikXq00uf&f+qxEVJgCJ5`tSDD48qKD+MS0l%%traFHWd7w9E{u?bb@P+7T_z zuUN!nEJur+LwPfv8-tit12$4)5VOj={`$Xy$nVHI#3Qegm1Mvt3|wjkHq)8G#wEtS zWdnwwzbE+*TM~&tMz-CEz1!I0GJ~B&yp4p6q2g?l5Py$A$3MY4h%9rr;F27(GmwPC MK0V>EOQ$aV3v(UEYXATM literal 8192 zcmeGhO>Y}TbU$LpiRuPKi(5qzLnYLNcFWH0+PgNYz)9RB)U{LBrmYaN_G6r`>aVWX zDiPw4RzjS(b3(l!F2Dux2RI_cwFmCpk&r;W@Mi3F*Rg|Kw@?J0c)hc4-oCGS^PcnG zwX1p8C#cr)8m5m_ZjR%5?rnrPj;q2IgDV)PVKNsyz?~1xkD69F>5oq$6j^*kabn^l z{sH$rzkk#VN5c7TB9Y+ledL=~opgM&R%2hnM(NbM@UeYe#d;B^i?*UgUKXgO}pCC=bgw3)knvS zqf#p63gs%LcdeYgvKwDqJNPg*pIBMp@9!|}>{iqFOxq9ckzpMJ@H0>o6^dn4sO0lh zGtl1i9TPl->N_GZ1yZ!TgxqGPL16j(08NuG$aHxM?QceVd;8+(zK8dg?an}Hx=TYF z8{W#cN1A4XJl>+NH}u?gA8%j1wdXcX-zSZBC-4}mh*fXdw_ykSPBfivYxB{>#RSi} zO^1BYxl@O8SnYWrJXe`URm^T8JvsDb>_(!AbLaS*J!AA<>5w~J(zHpRLhu+Ja*RWZ zt5jp4Hy?|OH@Jwf#ED-DOCm3PE7+9JZ2V6xP!eL5mF1Hhr`F80jfsvWS+{jbv#~6h znq^C>oi?nRV_Jr-W*cVHahoJ>HXvelu%c>;j15V~k}4yd%wR2p=bq&M5C=zb|X7VHVFiGSC%Q+DGWJEPkxsN zBfdtBXr|JRjx9q{h@O%(M=>O;rhz&2q^-$D%CT$4y6IV_XRa4Zg=_(B6!XQxn9Wf$ zs<8+nMnsJhKNcT~?~9uF4FG0iW`UUnj6g^m8pUT7U&YXM3Vgl6JzP8yQW`C~0yskaJ1`VVcYwYBCJ!vnjpww7D zd{8Hj#D&i}0ZQ`X*Zc$e$9>PCumQv`_=DxMiP*ik@40(WF!#N^er>Ybc35>XC^VLK zwzhI5G=zXEyR2YbEFgv(UqtJ*K%bPE)QQEsfDBK+qqH>LFxV?D&($T zaGf`SO0KXutN%alaRmE1D1}eo=J;3C|DkcT#Ckik`aeCD&$Rx39$E!!asFp$>ggQ+ zI;RW2i9d$V{$I=w+VNgr=BQ1);@&tmzbvi9?!6L< zgu!{MLNE;GW8z`3MA3q{2O%*4kBN%G($fS+@pu08NbF`wfXcxpV`Lp5gal= + + + +DKS Hourtrax + + + + + + + + +
+

DKS HourTrax  

+   +
+   +   +
+ +
+
+ +
+
+
Bonjour Prename,
+
+
+
+ + + + + + + + + + + + +
+
+
+
Bonjour Prename,
+
+
+
+ + + + + + + + + + + + +
+
+
+
Prénom Nom
+
Total heures mois courrant: 00:00 h
+
+ +
+
+
+ + + +
+
+ +
+ +
+ + + + + + + + + \ No newline at end of file diff --git a/htdocs/css/admin.css b/htdocs/css/admin.css new file mode 100644 index 0000000..78685c1 --- /dev/null +++ b/htdocs/css/admin.css @@ -0,0 +1,240 @@ + * { + font-family: sans-sherif, Arial, Helvetica !important; + } + body,html { + margin: 0px; + } +header { + overflow: hidden; + position: fixed; /* Set the navbar to fixed position */ + top: 0; /* Position the navbar at the top of the page */ + width: 100%; /* Full width */ + height: 60px; + padding-left: 5px; + background: linear-gradient(to right, purple, gray); +} + +header > h1 { + color: yellow; + margin-top: 10px; + float: left; + text-shadow: 0px -1px 0px rgba(0,0,0,.5); +} +div.headerlinks { + margin-left: 10px; + margin-top: 5px; + float: left; +} +button { + /* display: inline-block; + */ + text-decoration: none; + color: #fff; + font-weight: bold; + background-color: #538fbe; + /* padding: 20px 70px; + font-size: 24px; */ + border: 1px solid #2d6898; + background-image: linear-gradient(bottom, rgb(73,132,180) 0%, rgb(97,155,203) 100%); + background-image: -o-linear-gradient(bottom, rgb(73,132,180) 0%, rgb(97,155,203) 100%); + background-image: -moz-linear-gradient(bottom, rgb(73,132,180) 0%, rgb(97,155,203) 100%); + background-image: -webkit-linear-gradient(bottom, rgb(73,132,180) 0%, rgb(97,155,203) 100%); + background-image: -ms-linear-gradient(bottom, rgb(73,132,180) 0%, rgb(97,155,203) 100%); + + background-image: -webkit-gradient( + linear, + left bottom, + left top, + color-stop(0, rgb(73,132,180)), + color-stop(1, rgb(97,155,203)) + ); + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; + text-shadow: 0px -1px 0px rgba(0,0,0,.5); + /* -webkit-box-shadow: 0px 6px 0px #2b638f, 0px 3px 15px rgba(0,0,0,.4), inset 0px 1px 0px rgba(255,255,255,.3), inset 0px 0px 3px rgba(255,255,255,.5); + -moz-box-shadow: 0px 6px 0px #2b638f, 0px 3px 15px rgba(0,0,0,.4), inset 0px 1px 0px rgba(255,255,255,.3), inset 0px 0px 3px rgba(255,255,255,.5); + box-shadow: 0px 6px 0px #2b638f, 0px 3px 15px rgba(0,0,0,.4), inset 0px 1px 0px rgba(255,255,255,.3), inset 0px 0px 3px rgba(255,255,255,.5); */ + /* -webkit-transition: all .1s ease-in-out; + -moz-transition: all .2s ease-in-out; + transition: all .2s ease-in-out; + -webkit-transform: rotateX(20deg); */ +} + + +button { + margin-left: 3px; + height: 30px; +} + +div.headerlinks button { + height: 50px; +} + + +section.main { + width: 1024px; + margin: auto; + margin-top: 70px; + +} +table { + margin-top: 10px; + width: 100%; + border: 1px solid silver; + border-collapse: collapse; +} +table thead { + background-color: gray; +} + +table thead th { + padding: 5px 10px; + border: 1px solid silver; +} + +table tbody tr:nth-child(even){ + background-color: rgba(128,0,128,0.3); + +} + +table tbody tr:hover { + background-color: #79bcff; +} + +table tbody td { + border: 1px solid silver; + padding: 5px 10px; +} +input[type=number]::-webkit-inner-spin-button, +input[type=number]::-webkit-outer-spin-button { + -webkit-appearance: none; + margin: 0; +} + + + +input, select { + border: 1px solid silver; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; + padding: 5px 10px; +} + +input:disabled { + border: 0; + color: #000000; + background: transparent !important; +} + +.page { + display: none; +} + +input[type=number] { + text-align: right; +} + + + +tbody > tr.selected { + background-color: #0080ff; +} + +.panel { + border: 1px solid silver; + width: 100%; + display: block; + border: 1px solid silver; + padding: 5px; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; + margin: 4px; +} + +.panel-head { + margin: 0px; + padding: 3px; + height: 20px; + +} + +h4 { + margin: 0px; + padding: 2px; +} + +.tabset > input[type="radio"] { + position: absolute; + left: -200vw; +} + +.tabset .tab-panel { + display: none; +} + +.tabset > input:first-child:checked ~ .tab-panels > .tab-panel:first-child, +.tabset > input:nth-child(3):checked ~ .tab-panels > .tab-panel:nth-child(2), +.tabset > input:nth-child(5):checked ~ .tab-panels > .tab-panel:nth-child(3), +.tabset > input:nth-child(7):checked ~ .tab-panels > .tab-panel:nth-child(4), +.tabset > input:nth-child(9):checked ~ .tab-panels > .tab-panel:nth-child(5), +.tabset > input:nth-child(11):checked ~ .tab-panels > .tab-panel:nth-child(6) { + display: block; +} + +.tabset > label { + position: relative; + display: inline-block; + padding: 15px 15px 15px; + border: 1px solid transparent; + border-bottom: 0; + cursor: pointer; + font-weight: 600; +} + +/* .tabset > label::after { + position: absolute; + left: 15px; + bottom: 10px; + width: 22px; + height: 4px; + background: #8d8d8d; +} */ + +.tabset > label:hover, +.tabset > input:focus + label { + color: #06c; +} + +.tabset > label:hover::after, +.tabset > input:focus + label::after, +.tabset > input:checked + label::after { + background: #06c; +} + +.tabset > input:checked + label { + border-color: #ccc; + border-bottom: 1px solid #fff; + margin-bottom: -1px; +} + +.tab-panel { + padding: 30px 0; + border-top: 1px solid #ccc; +} + +label.formlabel { + width: 120px; +} + +div.row { + margin-top: 3px; + margin-bottom: 3px; +} + +section.sysconfig { + display: none; +} + diff --git a/htdocs/css/clock.css b/htdocs/css/clock.css new file mode 100644 index 0000000..79ba471 --- /dev/null +++ b/htdocs/css/clock.css @@ -0,0 +1,236 @@ + + body,html { + overflow: hidden; + margin: 0px; + + } + div { + margin: auto; + } + header { + height: 60px; + padding-left: 5px; + background: linear-gradient(to right, purple, gray); + } + h1 { + padding-top: 5px; + margin-top: 0px; + color: yellow; + } + button { + display: inline-block; + text-decoration: none; + color: #fff; + font-weight: bold; + background-color: #538fbe; + /* padding: 20px 70px; + font-size: 24px; */ + border: 1px solid #2d6898; + background-image: linear-gradient(bottom, rgb(73,132,180) 0%, rgb(97,155,203) 100%); + background-image: -o-linear-gradient(bottom, rgb(73,132,180) 0%, rgb(97,155,203) 100%); + background-image: -moz-linear-gradient(bottom, rgb(73,132,180) 0%, rgb(97,155,203) 100%); + background-image: -webkit-linear-gradient(bottom, rgb(73,132,180) 0%, rgb(97,155,203) 100%); + background-image: -ms-linear-gradient(bottom, rgb(73,132,180) 0%, rgb(97,155,203) 100%); + + background-image: -webkit-gradient( + linear, + left bottom, + left top, + color-stop(0, rgb(73,132,180)), + color-stop(1, rgb(97,155,203)) + ); + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; + text-shadow: 0px -1px 0px rgba(0,0,0,.5); + -webkit-box-shadow: 0px 6px 0px #2b638f, 0px 3px 15px rgba(0,0,0,.4), inset 0px 1px 0px rgba(255,255,255,.3), inset 0px 0px 3px rgba(255,255,255,.5); + -moz-box-shadow: 0px 6px 0px #2b638f, 0px 3px 15px rgba(0,0,0,.4), inset 0px 1px 0px rgba(255,255,255,.3), inset 0px 0px 3px rgba(255,255,255,.5); + box-shadow: 0px 6px 0px #2b638f, 0px 3px 15px rgba(0,0,0,.4), inset 0px 1px 0px rgba(255,255,255,.3), inset 0px 0px 3px rgba(255,255,255,.5); + -webkit-transition: all .1s ease-in-out; + -moz-transition: all .2s ease-in-out; + transition: all .2s ease-in-out; + -webkit-transform: rotateX(20deg); +} + +button:hover { + background-image: linear-gradient(bottom, rgb(79,142,191) 0%, rgb(102,166,214) 100%); + background-image: -o-linear-gradient(bottom, rgb(79,142,191) 0%, rgb(102,166,214) 100%); + background-image: -moz-linear-gradient(bottom, rgb(79,142,191) 0%, rgb(102,166,214) 100%); + background-image: -webkit-linear-gradient(bottom, rgb(79,142,191) 0%, rgb(102,166,214) 100%); + background-image: -ms-linear-gradient(bottom, rgb(79,142,191) 0%, rgb(102,166,214) 100%); + + /* background-image: -webkit-gradient( + linear, + left bottom, + left top, + color-stop(0, rgb(79,142,191)), + color-stop(1, rgb(102,166,214)) + ); */ +} + +button:active { +-webkit-box-shadow: 0px 2px 0px #2b638f, 0px 1px 6px rgba(0,0,0,.4), inset 0px 1px 0px rgba(255,255,255,.3), inset 0px 0px 3px rgba(255,255,255,.5); +-moz-box-shadow: 0px 2px 0px #2b638f, 0px 1px 6px rgba(0,0,0,.4), inset 0px 1px 0px rgba(255,255,255,.3), inset 0px 0px 3px rgba(255,255,255,.5); +box-shadow: 0px 2px 0px #2b638f, 0px 1px 6px rgba(0,0,0,.4), inset 0px 1px 0px rgba(255,255,255,.3), inset 0px 0px 3px rgba(255,255,255,.5); + background-image: linear-gradient(bottom, rgb(88,154,204) 0%, rgb(90,150,199) 100%); + background-image: -o-linear-gradient(bottom, rgb(88,154,204) 0%, rgb(90,150,199) 100%); + background-image: -moz-linear-gradient(bottom, rgb(88,154,204) 0%, rgb(90,150,199) 100%); + background-image: -webkit-linear-gradient(bottom, rgb(88,154,204) 0%, rgb(90,150,199) 100%); + background-image: -ms-linear-gradient(bottom, rgb(88,154,204) 0%, rgb(90,150,199) 100%); + + background-image: -webkit-gradient( + linear, + left bottom, + left top, + color-stop(0, rgb(88,154,204)), + color-stop(1, rgb(90,150,199)) + ); + -webkit-transform: translate(0, 4px) rotateX(20deg); + -moz-transform: translate(0, 4px); + transform: translate(0, 4px); +} + +button:disabled { + background-image: none; + background-color: #f4f4f4; + color: #000; + font-weight: bold; + box-shadow: none; + -webkit-transform: none; +} + /* button { + background-color: lightgrey; + border: 1px solid silver; + outline: none; + } */ + button.user { + height: 90px; + width: 90px; + margin: 10px; + white-space: nowrap; + overflow: hidden; + } + button.btnkeypad { + height: 70px; + width: 70px; + margin: 5px; + font-weight: bold; + font-size: 20px; + white-space: nowrap; + overflow: hidden; + } + button.btntrack { + background-color: + height: 150px; + width: 150px; + margin: 15px; + font-weight: bold; + font-size: 30px; + white-space: nowrap; + overflow: hidden; + } + #scrloader { + display: none; + margin: auto; + border: 1px solid silver; + max-width: 800px; + width: 800px; + height: 430px; + max-height: 430px; + overflow: hidden; + } + #scruserlist { + display: none; + border: 1px solid silver; + max-width: 800px; + width: 800px; + height: 430px; + max-height: 430px; + overflow: hidden; + } + #scruserpin { + display: none; + margin: auto; + border: 1px solid silver; + max-width: 800px; + width: 800px; + height: 430px; + max-height: 430px; + overflow: hidden; + } + #scrnewuserpin { + display: none; + margin: auto; + border: 1px solid silver; + max-width: 800px; + width: 800px; + height: 430px; + max-height: 430px; + overflow: hidden; + } + #scrtimetracker{ + display: none; + margin: auto; + border: 1px solid silver; + max-width: 800px; + width: 800px; + height: 430px; + max-height: 430px; + overflow: hidden; + } + #scrstatus{ + display: none; + margin: auto; + border: 1px solid silver; + max-width: 800px; + width: 800px; + height: 430px; + max-height: 430px; + overflow: hidden; + } + #keypad { + border: 1px solid silver; + width: 270px; + margin: auto; + } + #timetracker{ + border: 1px solid silver; + width: 400px; + margin: auto; + margin-top: 20px; + text-align: center; + } + div.pincode { + text-align: center; + } + #pincode,#newpincode1,#newpincode2 { + min-height: 30px; + border: 1px solid silver; + width: 270px; + margin: auto; + text-align: center; + font-weight: bold; + font-size: 10px; + } + #newpincode1,#newpincode2{ + width: 135px; + } + .usergreeting { + text-align: center; + } + #pinmessage, #pinmessage2 { + height: 30px; + display: block; + color: red; + font-weight: bold; + text-align: center; + } + #lasttrackin,#lasttrackout { + font-size: 12px; + color: #000; + font-weight: bold; + } + + +/* screenheight: 480;*/ +/* screenwidth: 80px;*/ \ No newline at end of file diff --git a/htdocs/css/w3pro.css b/htdocs/css/w3pro.css new file mode 100755 index 0000000..3013489 --- /dev/null +++ b/htdocs/css/w3pro.css @@ -0,0 +1,378 @@ +/* W3PRO.CSS 4.13 June 2019 by Jan Egil and Borge Refsnes */ +html{box-sizing:border-box}*,*:before,*:after{box-sizing:inherit} +/* Extract from normalize.css by Nicolas Gallagher and Jonathan Neal git.io/normalize */ +html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0} +article,aside,details,figcaption,figure,footer,header,main,menu,nav,section{display:block}summary{display:list-item} +audio,canvas,progress,video{display:inline-block}progress{vertical-align:baseline} +audio:not([controls]){display:none;height:0}[hidden],template{display:none} +a{background-color:transparent}a:active,a:hover{outline-width:0} +abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted} +b,strong{font-weight:bolder}dfn{font-style:italic}mark{background:#ff0;color:#000} +small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline} +sub{bottom:-0.25em}sup{top:-0.5em}figure{margin:1em 40px}img{border-style:none} +code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}hr{box-sizing:content-box;height:0;overflow:visible} +button,input,select,textarea,optgroup{font:inherit;margin:0}optgroup{font-weight:bold} +button,input{overflow:visible}button,select{text-transform:none} +button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button} +button::-moz-focus-inner,[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner{border-style:none;padding:0} +button:-moz-focusring,[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring{outline:1px dotted ButtonText} +fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:.35em .625em .75em} +legend{color:inherit;display:table;max-width:100%;padding:0;white-space:normal}textarea{overflow:auto} +[type=checkbox],[type=radio]{padding:0} +[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto} +[type=search]{-webkit-appearance:textfield;outline-offset:-2px} +[type=search]::-webkit-search-decoration{-webkit-appearance:none} +::-webkit-file-upload-button{-webkit-appearance:button;font:inherit} +/* End extract */ +html,body{font-family:Verdana,sans-serif;font-size:15px;line-height:1.5}html{overflow-x:hidden} +h1{font-size:36px}h2{font-size:30px}h3{font-size:24px}h4{font-size:20px}h5{font-size:18px}h6{font-size:16px}.w3-serif{font-family:serif} +h1,h2,h3,h4,h5,h6{font-family:"Segoe UI",Arial,sans-serif;font-weight:400;margin: 0}.w3-wide{letter-spacing:4px} +hr{border:0;border-top:1px solid #eee;margin:20px 0} +.w3-image{max-width:100%;height:auto}img{vertical-align:middle}a{color:inherit} +.w3-table,.w3-table-all{border-collapse:collapse;border-spacing:0;width:100%;display:table}.w3-table-all{border:1px solid #ccc} +.w3-bordered tr,.w3-table-all tr{border-bottom:1px solid #ddd}.w3-striped tbody tr:nth-child(even){background-color:#f1f1f1} +.w3-table-all tr:nth-child(odd){background-color:#fff}.w3-table-all tr:nth-child(even){background-color:#f1f1f1} +.w3-hoverable tbody tr:hover,.w3-ul.w3-hoverable li:hover{background-color:#ccc}.w3-centered tr th,.w3-centered tr td{text-align:center} +.w3-table td,.w3-table th,.w3-table-all td,.w3-table-all th{padding:8px 8px;display:table-cell;text-align:left;vertical-align:top} +.w3-table th:first-child,.w3-table td:first-child,.w3-table-all th:first-child,.w3-table-all td:first-child{padding-left:16px} +.w3-btn,.w3-button{border:none;display:inline-block;padding:8px 16px;vertical-align:middle;overflow:hidden;text-decoration:none;color:inherit;background-color:inherit;text-align:center;cursor:pointer;white-space:nowrap} +.w3-btn:hover{box-shadow:0 8px 16px 0 rgba(0,0,0,0.2),0 6px 20px 0 rgba(0,0,0,0.19)} +.w3-btn,.w3-button{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none} +.w3-disabled,.w3-btn:disabled,.w3-button:disabled{cursor:not-allowed;opacity:0.3}.w3-disabled *,:disabled *{pointer-events:none} +.w3-btn.w3-disabled:hover,.w3-btn:disabled:hover{box-shadow:none} +.w3-badge,.w3-tag{background-color:#000;color:#fff;display:inline-block;padding-left:8px;padding-right:8px;text-align:center}.w3-badge{border-radius:50%} +.w3-ul{list-style-type:none;padding:0;margin:0}.w3-ul li{padding:8px 16px;border-bottom:1px solid #ddd}.w3-ul li:last-child{border-bottom:none} +.w3-tooltip,.w3-display-container{position:relative}.w3-tooltip .w3-text{display:none}.w3-tooltip:hover .w3-text{display:inline-block} +.w3-ripple:active{opacity:0.5}.w3-ripple{transition:opacity 0s} +.w3-input{padding:8px;display:block;border:1px solid #ccc;width:100%;background-color: #e8f0fe; } +.w3-select{padding:9px 0; display:block;width:100%;border:1px solid #ccc;background-color: #e8f0fe;} +.w3-dropdown-click,.w3-dropdown-hover{position:relative;display:inline-block;cursor:pointer} +.w3-dropdown-hover:hover .w3-dropdown-content{display:block; } +.w3-dropdown-hover:first-child,.w3-dropdown-click:hover{background-color:#ccc;color:#000} +.w3-dropdown-hover:hover > .w3-button:first-child,.w3-dropdown-click:hover > .w3-button:first-child{background-color:#ccc;color:#000} +.w3-dropdown-content{cursor:auto;color:#000;background-color:#fff;display:none;position:absolute;min-width:160px;margin:0;padding:0;z-index:1} +.w3-check,.w3-radio{width:24px;height:24px;position:relative;top:6px} +.w3-sidebar{height:100%;width:200px;background-color:#fff;position:fixed!important;z-index:1;overflow:auto} +.w3-bar-block .w3-dropdown-hover,.w3-bar-block .w3-dropdown-click{width:100%} +.w3-bar-block .w3-dropdown-hover .w3-dropdown-content,.w3-bar-block .w3-dropdown-click .w3-dropdown-content{min-width:100%} +.w3-bar-block .w3-dropdown-hover .w3-button,.w3-bar-block .w3-dropdown-click .w3-button{width:100%;text-align:left;padding:8px 16px} +.w3-main,#main{transition:margin-left .4s} +.w3-modal{z-index:3;display:none;padding-top:100px;position:fixed;left:0;top:0;width:100%;height:100%;overflow:auto;background-color:rgb(0,0,0);background-color:rgba(0,0,0,0.4)} +.w3-modal-content{margin:auto;background-color:#fff;position:relative;padding:0;outline:0;width:600px} +.w3-bar{width:100%;overflow:hidden}.w3-center .w3-bar{display:inline-block;width:auto} +.w3-bar .w3-bar-item{padding:8px 16px;float:left;width:auto;border:none;display:block;outline:0} +.w3-bar .w3-dropdown-hover,.w3-bar .w3-dropdown-click{position:static;float:left} +.w3-bar .w3-button{white-space:normal} +.w3-bar-block .w3-bar-item{width:100%;display:block;padding:8px 16px;text-align:left;border:none;white-space:normal;float:none;outline:0} +.w3-bar-block.w3-center .w3-bar-item{text-align:center}.w3-block{display:block;width:100%} +.w3-responsive{display:block;overflow-x:auto} +.w3-container:after,.w3-container:before,.w3-panel:after,.w3-panel:before,.w3-row:after,.w3-row:before,.w3-row-padding:after,.w3-row-padding:before, +.w3-cell-row:before,.w3-cell-row:after,.w3-clear:after,.w3-clear:before,.w3-bar:before,.w3-bar:after{content:"";display:table;clear:both} +.w3-col,.w3-half,.w3-third,.w3-twothird,.w3-threequarter,.w3-quarter{float:left;width:100%} +.w3-col.s1{width:8.33333%}.w3-col.s2{width:16.66666%}.w3-col.s3{width:24.99999%}.w3-col.s4{width:33.33333%} +.w3-col.s5{width:41.66666%}.w3-col.s6{width:49.99999%}.w3-col.s7{width:58.33333%}.w3-col.s8{width:66.66666%} +.w3-col.s9{width:74.99999%}.w3-col.s10{width:83.33333%}.w3-col.s11{width:91.66666%}.w3-col.s12{width:99.99999%} +@media (min-width:601px){.w3-col.m1{width:8.33333%}.w3-col.m2{width:16.66666%}.w3-col.m3,.w3-quarter{width:24.99999%}.w3-col.m4,.w3-third{width:33.33333%} +.w3-col.m5{width:41.66666%}.w3-col.m6,.w3-half{width:49.99999%}.w3-col.m7{width:58.33333%}.w3-col.m8,.w3-twothird{width:66.66666%} +.w3-col.m9,.w3-threequarter{width:74.99999%}.w3-col.m10{width:83.33333%}.w3-col.m11{width:91.66666%}.w3-col.m12{width:99.99999%}} +@media (min-width:993px){.w3-col.l1{width:8.33333%}.w3-col.l2{width:16.66666%}.w3-col.l3{width:24.99999%}.w3-col.l4{width:33.33333%} +.w3-col.l5{width:41.66666%}.w3-col.l6{width:49.99999%}.w3-col.l7{width:58.33333%}.w3-col.l8{width:66.66666%} +.w3-col.l9{width:74.99999%}.w3-col.l10{width:83.33333%}.w3-col.l11{width:91.66666%}.w3-col.l12{width:99.99999%}} +.w3-rest{overflow:hidden}.w3-stretch{margin-left:-16px;margin-right:-16px} +.w3-content,.w3-auto{margin-left:auto;margin-right:auto}.w3-content{max-width:980px}.w3-auto{max-width:1140px} +.w3-cell-row{display:table;width:100%}.w3-cell{display:table-cell} +.w3-cell-top{vertical-align:top}.w3-cell-middle{vertical-align:middle}.w3-cell-bottom{vertical-align:bottom} +.w3-hide{display:none!important}.w3-show-block,.w3-show{display:block!important}.w3-show-inline-block{display:inline-block!important} +@media (max-width:1205px){.w3-auto{max-width:95%}} +@media (max-width:600px){.w3-modal-content{margin:0 10px;width:auto!important}.w3-modal{padding-top:30px} +.w3-dropdown-hover.w3-mobile .w3-dropdown-content,.w3-dropdown-click.w3-mobile .w3-dropdown-content{position:relative} +.w3-hide-small{display:none!important}.w3-mobile{display:block;width:100%!important}.w3-bar-item.w3-mobile,.w3-dropdown-hover.w3-mobile,.w3-dropdown-click.w3-mobile{text-align:center} +.w3-dropdown-hover.w3-mobile,.w3-dropdown-hover.w3-mobile .w3-btn,.w3-dropdown-hover.w3-mobile .w3-button,.w3-dropdown-click.w3-mobile,.w3-dropdown-click.w3-mobile .w3-btn,.w3-dropdown-click.w3-mobile .w3-button{width:100%}} +@media (max-width:768px){.w3-modal-content{width:500px}.w3-modal{padding-top:50px}} +@media (min-width:993px){.w3-modal-content{width:900px}.w3-hide-large{display:none!important}.w3-sidebar.w3-collapse{display:block!important}} +@media (max-width:992px) and (min-width:601px){.w3-hide-medium{display:none!important}} +@media (max-width:992px){.w3-sidebar.w3-collapse{display:none}.w3-main{margin-left:0!important;margin-right:0!important}.w3-auto{max-width:100%}} +.w3-top,.w3-bottom{position:fixed;width:100%;z-index:1}.w3-top{top:0}.w3-bottom{bottom:0} +.w3-overlay{position:fixed;display:none;width:100%;height:100%;top:0;left:0;right:0;bottom:0;background-color:rgba(0,0,0,0.5);z-index:2} +.w3-display-topleft{position:absolute;left:0;top:0}.w3-display-topright{position:absolute;right:0;top:0} +.w3-display-bottomleft{position:absolute;left:0;bottom:0}.w3-display-bottomright{position:absolute;right:0;bottom:0} +.w3-display-middle{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%)} +.w3-display-left{position:absolute;top:50%;left:0%;transform:translate(0%,-50%);-ms-transform:translate(-0%,-50%)} +.w3-display-right{position:absolute;top:50%;right:0%;transform:translate(0%,-50%);-ms-transform:translate(0%,-50%)} +.w3-display-topmiddle{position:absolute;left:50%;top:0;transform:translate(-50%,0%);-ms-transform:translate(-50%,0%)} +.w3-display-bottommiddle{position:absolute;left:50%;bottom:0;transform:translate(-50%,0%);-ms-transform:translate(-50%,0%)} +.w3-display-container:hover .w3-display-hover{display:block}.w3-display-container:hover span.w3-display-hover{display:inline-block}.w3-display-hover{display:none} +.w3-display-position{position:absolute} +.w3-circle{border-radius:50%} +.w3-round-small{border-radius:2px}.w3-round,.w3-round-medium{border-radius:4px}.w3-round-large{border-radius:8px}.w3-round-xlarge{border-radius:16px}.w3-round-xxlarge{border-radius:32px} +.w3-row-padding,.w3-row-padding>.w3-half,.w3-row-padding>.w3-third,.w3-row-padding>.w3-twothird,.w3-row-padding>.w3-threequarter,.w3-row-padding>.w3-quarter,.w3-row-padding>.w3-col{padding:0 8px} +.w3-container,.w3-panel{padding:0.01em 16px}.w3-panel{margin-top:16px;margin-bottom:16px} +.w3-code,.w3-codespan{font-family:Consolas,"courier new";font-size:16px} +.w3-code{width:auto;background-color:#fff;padding:8px 12px;border-left:4px solid #4CAF50;word-wrap:break-word} +.w3-codespan{color:crimson;background-color:#f1f1f1;padding-left:4px;padding-right:4px;font-size:110%} +.w3-card,.w3-card-2{box-shadow:0 2px 5px 0 rgba(0,0,0,0.16)} +.w3-card-4,.w3-hover-shadow:hover{box-shadow:0 4px 10px 0 rgba(0,0,0,0.2),0 4px 20px 0 rgba(0,0,0,0.19)} +.w3-spin{animation:w3-spin 2s infinite linear}@keyframes w3-spin{0%{transform:rotate(0deg)}100%{transform:rotate(359deg)}} +.w3-animate-fading{animation:fading 10s infinite}@keyframes fading{0%{opacity:0}50%{opacity:1}100%{opacity:0}} +.w3-animate-opacity{animation:opac 0.8s}@keyframes opac{from{opacity:0} to{opacity:1}} +.w3-animate-top{position:relative;animation:animatetop 0.4s}@keyframes animatetop{from{top:-300px;opacity:0} to{top:0;opacity:1}} +.w3-animate-left{position:relative;animation:animateleft 0.4s}@keyframes animateleft{from{left:-300px;opacity:0} to{left:0;opacity:1}} +.w3-animate-right{position:relative;animation:animateright 0.4s}@keyframes animateright{from{right:-300px;opacity:0} to{right:0;opacity:1}} +.w3-animate-bottom{position:relative;animation:animatebottom 0.4s}@keyframes animatebottom{from{bottom:-300px;opacity:0} to{bottom:0;opacity:1}} +.w3-animate-zoom {animation:animatezoom 0.6s}@keyframes animatezoom{from{transform:scale(0)} to{transform:scale(1)}} +.w3-animate-input{transition:width 0.4s ease-in-out}.w3-animate-input:focus{width:100%!important} +.w3-opacity,.w3-hover-opacity:hover{opacity:0.60}.w3-opacity-off,.w3-hover-opacity-off:hover{opacity:1} +.w3-opacity-max{opacity:0.25}.w3-opacity-min{opacity:0.75} +.w3-greyscale-max,.w3-grayscale-max,.w3-hover-greyscale:hover,.w3-hover-grayscale:hover{filter:grayscale(100%)} +.w3-greyscale,.w3-grayscale{filter:grayscale(75%)}.w3-greyscale-min,.w3-grayscale-min{filter:grayscale(50%)} +.w3-sepia{filter:sepia(75%)}.w3-sepia-max,.w3-hover-sepia:hover{filter:sepia(100%)}.w3-sepia-min{filter:sepia(50%)} +.w3-tiny{font-size:10px!important}.w3-small{font-size:12px!important}.w3-medium{font-size:15px!important}.w3-large{font-size:18px!important} +.w3-xlarge{font-size:24px!important}.w3-xxlarge{font-size:36px!important}.w3-xxxlarge{font-size:48px!important}.w3-jumbo{font-size:64px!important} +.w3-left-align{text-align:left!important}.w3-right-align{text-align:right!important}.w3-justify{text-align:justify!important}.w3-center{text-align:center!important} +.w3-border-0{border:0!important}.w3-border{border:1px solid #ccc!important} +.w3-border-top{border-top:1px solid #ccc!important}.w3-border-bottom{border-bottom:1px solid #ccc!important} +.w3-border-left{border-left:1px solid #ccc!important}.w3-border-right{border-right:1px solid #ccc!important} +.w3-topbar{border-top:6px solid #ccc!important}.w3-bottombar{border-bottom:6px solid #ccc!important} +.w3-leftbar{border-left:6px solid #ccc!important}.w3-rightbar{border-right:6px solid #ccc!important} +.w3-section,.w3-code{margin-top:16px!important;margin-bottom:16px!important} +.w3-margin{margin:16px!important}.w3-margin-top{margin-top:16px!important}.w3-margin-bottom{margin-bottom:16px!important} +.w3-margin-left{margin-left:16px!important}.w3-margin-right{margin-right:16px!important} +.w3-padding-small{padding:4px 8px!important}.w3-padding{padding:8px 16px!important}.w3-padding-large{padding:12px 24px!important} +.w3-padding-16{padding-top:16px!important;padding-bottom:16px!important}.w3-padding-24{padding-top:24px!important;padding-bottom:24px!important} +.w3-padding-32{padding-top:32px!important;padding-bottom:32px!important}.w3-padding-48{padding-top:48px!important;padding-bottom:48px!important} +.w3-padding-64{padding-top:64px!important;padding-bottom:64px!important} +.w3-left{float:left!important}.w3-right{float:right!important} +.w3-button:hover{color:#000!important;background-color:#ccc!important} +.w3-transparent,.w3-hover-none:hover{background-color:transparent!important} +.w3-hover-none:hover{box-shadow:none!important} +/* DEFAULT COLORS */ +.w3-amber,.w3-hover-amber:hover{color:#000!important;background-color:#ffc107!important} +.w3-aqua,.w3-hover-aqua:hover{color:#000!important;background-color:#00ffff!important} +.w3-blue,.w3-hover-blue:hover{color:#fff!important;background-color:#2196F3!important} +.w3-light-blue,.w3-hover-light-blue:hover{color:#000!important;background-color:#87CEEB!important} +.w3-brown,.w3-hover-brown:hover{color:#fff!important;background-color:#795548!important} +.w3-cyan,.w3-hover-cyan:hover{color:#000!important;background-color:#00bcd4!important} +.w3-blue-grey,.w3-hover-blue-grey:hover{color:#fff!important;background-color:#607d8b!important} +.w3-green,.w3-hover-green:hover{color:#fff!important;background-color:#4CAF50!important} +.w3-light-green,.w3-hover-light-green:hover{color:#000!important;background-color:#8bc34a!important} +.w3-indigo,.w3-hover-indigo:hover{color:#fff!important;background-color:#3f51b5!important} +.w3-khaki,.w3-hover-khaki:hover{color:#000!important;background-color:#f0e68c!important} +.w3-lime,.w3-hover-lime:hover{color:#000!important;background-color:#cddc39!important} +.w3-orange,.w3-hover-orange:hover{color:#000!important;background-color:#ff9800!important} +.w3-deep-orange,.w3-hover-deep-orange:hover{color:#fff!important;background-color:#ff5722!important} +.w3-pink,.w3-hover-pink:hover{color:#fff!important;background-color:#e91e63!important} +.w3-purple,.w3-hover-purple:hover{color:#fff!important;background-color:#9c27b0!important} +.w3-deep-purple,.w3-hover-deep-purple:hover{color:#fff!important;background-color:#673ab7!important} +.w3-red,.w3-hover-red:hover{color:#fff!important;background-color:#f44336!important} +.w3-sand,.w3-hover-sand:hover{color:#000!important;background-color:#fdf5e6!important} +.w3-teal,.w3-hover-teal:hover{color:#fff!important;background-color:#009688!important} +.w3-yellow,.w3-hover-yellow:hover{color:#000!important;background-color:#ffeb3b!important} +.w3-white,.w3-hover-white:hover{color:#000!important;background-color:#fff!important} +.w3-black,.w3-hover-black:hover{color:#fff!important;background-color:#000!important} +.w3-grey,.w3-hover-grey:hover{color:#000!important;background-color:#9e9e9e!important} +.w3-light-grey,.w3-hover-light-grey:hover{color:#000!important;background-color:#f1f1f1!important} +.w3-dark-grey,.w3-hover-dark-grey:hover{color:#fff!important;background-color:#616161!important} +.w3-pale-red,.w3-hover-pale-red:hover{color:#000!important;background-color:#ffe7e7!important}.w3-pale-green,.w3-hover-pale-green:hover{color:#000!important;background-color:#e7ffe7!important} +.w3-pale-yellow,.w3-hover-pale-yellow:hover{color:#000!important;background-color:#ffffd7!important}.w3-pale-blue,.w3-hover-pale-blue:hover{color:#000!important;background-color:#e7ffff!important} +.w3-text-amber,.w3-hover-text-amber:hover{color:#ffc107!important} +.w3-text-aqua,.w3-hover-text-aqua:hover{color:#00ffff!important} +.w3-text-blue,.w3-hover-text-blue:hover{color:#2196F3!important} +.w3-text-light-blue,.w3-hover-text-light-blue:hover{color:#87CEEB!important} +.w3-text-brown,.w3-hover-text-brown:hover{color:#795548!important} +.w3-text-cyan,.w3-hover-text-cyan:hover{color:#00bcd4!important} +.w3-text-blue-grey,.w3-hover-text-blue-grey:hover{color:#607d8b!important} +.w3-text-green,.w3-hover-text-green:hover{color:#4CAF50!important} +.w3-text-light-green,.w3-hover-text-light-green:hover{color:#8bc34a!important} +.w3-text-indigo,.w3-hover-text-indigo:hover{color:#3f51b5!important} +.w3-text-khaki,.w3-hover-text-khaki:hover{color:#b4aa50!important} +.w3-text-lime,.w3-hover-text-lime:hover{color:#cddc39!important} +.w3-text-orange,.w3-hover-text-orange:hover{color:#ff9800!important} +.w3-text-deep-orange,.w3-hover-text-deep-orange:hover{color:#ff5722!important} +.w3-text-pink,.w3-hover-text-pink:hover{color:#e91e63!important} +.w3-text-purple,.w3-hover-text-purple:hover{color:#9c27b0!important} +.w3-text-deep-purple,.w3-hover-text-deep-purple:hover{color:#673ab7!important} +.w3-text-red,.w3-hover-text-red:hover{color:#f44336!important} +.w3-text-sand,.w3-hover-text-sand:hover{color:#fdf5e6!important} +.w3-text-teal,.w3-hover-text-teal:hover{color:#009688!important} +.w3-text-yellow,.w3-hover-text-yellow:hover{color:#d2be0e!important} +.w3-text-white,.w3-hover-text-white:hover{color:#fff!important} +.w3-text-black,.w3-hover-text-black:hover{color:#000!important} +.w3-text-grey,.w3-hover-text-grey:hover{color:#757575!important} +.w3-text-light-grey,.w3-hover-text-light-grey:hover{color:#f1f1f1!important} +.w3-text-dark-grey,.w3-hover-text-dark-grey:hover{color:#3a3a3a!important} +.w3-border-amber,.w3-hover-border-amber:hover{border-color:#ffc107!important} +.w3-border-aqua,.w3-hover-border-aqua:hover{border-color:#00ffff!important} +.w3-border-blue,.w3-hover-border-blue:hover{border-color:#2196F3!important} +.w3-border-light-blue,.w3-hover-border-light-blue:hover{border-color:#87CEEB!important} +.w3-border-brown,.w3-hover-border-brown:hover{border-color:#795548!important} +.w3-border-cyan,.w3-hover-border-cyan:hover{border-color:#00bcd4!important} +.w3-border-blue-grey,.w3-hover-blue-grey:hover{border-color:#607d8b!important} +.w3-border-green,.w3-hover-border-green:hover{border-color:#4CAF50!important} +.w3-border-light-green,.w3-hover-border-light-green:hover{border-color:#8bc34a!important} +.w3-border-indigo,.w3-hover-border-indigo:hover{border-color:#3f51b5!important} +.w3-border-khaki,.w3-hover-border-khaki:hover{border-color:#f0e68c!important} +.w3-border-lime,.w3-hover-border-lime:hover{border-color:#cddc39!important} +.w3-border-orange,.w3-hover-border-orange:hover{border-color:#ff9800!important} +.w3-border-deep-orange,.w3-hover-border-deep-orange:hover{border-color:#ff5722!important} +.w3-border-pink,.w3-hover-border-pink:hover{border-color:#e91e63!important} +.w3-border-purple,.w3-hover-border-purple:hover{border-color:#9c27b0!important} +.w3-border-deep-purple,.w3-hover-border-deep-purple:hover{border-color:#673ab7!important} +.w3-border-red,.w3-hover-border-red:hover{border-color:#f44336!important} +.w3-border-sand,.w3-hover-border-sand:hover{border-color:#fdf5e6!important} +.w3-border-teal,.w3-hover-border-teal:hover{border-color:#009688!important} +.w3-border-yellow,.w3-hover-border-yellow:hover{border-color:#ffeb3b!important} +.w3-border-white,.w3-hover-border-white:hover{border-color:#fff!important} +.w3-border-black,.w3-hover-border-black:hover{border-color:#000!important} +.w3-border-grey,.w3-hover-border-grey:hover{border-color:#9e9e9e!important} +.w3-border-light-grey,.w3-hover-border-light-grey:hover{border-color:#f1f1f1!important} +.w3-border-dark-grey,.w3-hover-border-dark-grey:hover{border-color:#616161!important} +.w3-border-pale-red,.w3-hover-border-pale-red:hover{border-color:#ffe7e7!important}.w3-border-pale-green,.w3-hover-border-pale-green:hover{border-color:#e7ffe7!important} +.w3-border-pale-yellow,.w3-hover-border-pale-yellow:hover{border-color:#ffffd7!important}.w3-border-pale-blue,.w3-hover-border-pale-blue:hover{border-color:#e7ffff!important} +/* DEFAULT THEME */ +.w3-theme-l5 {color:#000 !important; background-color:#f6f8fc !important} +.w3-theme-l4 {color:#000 !important; background-color:#e1e9f6 !important} +.w3-theme-l3 {color:#000 !important; background-color:#c3d3ed !important} +.w3-theme-l2 {color:#000 !important; background-color:#a5bee4 !important} +.w3-theme-l1 {color:#fff !important; background-color:#88a8db !important} +.w3-theme-d1 {color:#fff !important; background-color:#5180cb !important} +.w3-theme-d2 {color:#fff !important; background-color:#3a6fc3 !important} +.w3-theme-d3 {color:#fff !important; background-color:#3361aa !important} +.w3-theme-d4 {color:#fff !important; background-color:#2c5392 !important} +.w3-theme-d5 {color:#fff !important; background-color:#24457a !important} + +.w3-theme-light {color:#000 !important; background-color:#f6f8fc !important} +.w3-theme-dark {color:#fff !important; background-color:#24457a !important} +.w3-theme-action {color:#fff !important; background-color:#24457a !important} + +.w3-theme {color:#fff !important; background-color:#6a92d3 !important} +.w3-text-theme {color:#6a92d3 !important} +.w3-border-theme {border-color:#6a92d3 !important} + +.w3-hover-theme:hover {color:#fff !important; background-color:#6a92d3 !important} +.w3-hover-text-theme:hover {color:#6a92d3 !important} +.w3-hover-border-theme:hover {border-color:#6a92d3 !important} + +.w3-label { color: rgb(153, 150, 150);} +#main {margin-left: 210px;} +@media (max-width:768px){ + #sidebar { display: none;} + #main { margin-left: 0px;} +} + +.w3-select { + display: block; + font-size: 16px; + font-family: sans-serif; + font-weight: normal; + color: #444; + line-height: 1.3; + padding: .6em 1.4em .5em .8em; + width: 100%; + max-width: 100%; + box-sizing: border-box; + margin: 0; + border-bottom: 1px solid #aaa; + box-shadow: 0 1px 0 1px rgba(0,0,0,.04); + /* border-radius: .5em; */ + -moz-appearance: none; + -webkit-appearance: none; + appearance: none; + background-color: #e8f0fe; + background-image: url('data:image/svg+xml;charset=US-ASCII,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22292.4%22%20height%3D%22292.4%22%3E%3Cpath%20fill%3D%22%23000%22%20d%3D%22M287%2069.4a17.6%2017.6%200%200%200-13-5.4H18.4c-5%200-9.3%201.8-12.9%205.4A17.6%2017.6%200%200%200%200%2082.2c0%205%201.8%209.3%205.4%2012.9l128%20127.9c3.6%203.6%207.8%205.4%2012.8%205.4s9.2-1.8%2012.8-5.4L287%2095c3.5-3.5%205.4-7.8%205.4-12.8%200-5-1.9-9.2-5.5-12.8z%22%2F%3E%3C%2Fsvg%3E'), + linear-gradient(to bottom, #e8f0fe 0%,#e8f0fe 100%); + background-repeat: no-repeat, repeat; + background-position: right .7em top 50%, 0 0; + background-size: .65em auto, 100%; +} +.w3-select::-ms-expand { + display: none; +} +.w3-select:hover { + border-color: #888; +} +.w3-select:focus { + border-color: #aaa; + box-shadow: 0 0 1px 1px #6a92d3; + box-shadow: 0 0 0 1px -moz-mac-focusring; + color: #222; + outline: none; +} + + +.w3-select option { + font-weight:normal; +} + +.w3-table { + table-layout: fixed; +} + +.w3-text-line-through { text-decoration: line-through; } + +#snackbar { + visibility: hidden; + min-width: 250px; + margin-left: -125px; + background-color: #333; + color: #fff; + text-align: center; + border-radius: 2px; + padding: 16px; + position: fixed; + z-index: 1; + left: 50%; + bottom: 30px; + font-size: 17px; +} + +#snackbar.show { + visibility: visible; + -webkit-animation: fadein 0.5s, fadeout 0.5s 2.5s; + animation: fadein 0.5s, fadeout 0.5s 2.5s; +} + +@-webkit-keyframes fadein { + from {bottom: 0; opacity: 0;} + to {bottom: 30px; opacity: 1;} +} + +@keyframes fadein { + from {bottom: 0; opacity: 0;} + to {bottom: 30px; opacity: 1;} +} + +@-webkit-keyframes fadeout { + from {bottom: 30px; opacity: 1;} + to {bottom: 0; opacity: 0;} +} + +@keyframes fadeout { + from {bottom: 30px; opacity: 1;} + to {bottom: 0; opacity: 0;} +} + +.tabulator-header-filter > input { + background-color: #e8f0fe; + border: 1px solid #ccc; + font-weight: normal; +} + +.w3-readonly { + pointer-events:none; + padding:8px;display:block;border:0px;width:100%;background-color: #fff; +} + +.right-side-bg { + background: url("../img/bg1.jpg"); + background-size: cover; + min-height: 100vh; +} + +/* .mceContentBody { + background: #e8f0fe; + color:#000; +} */ + +/* .tabulator-row-even { + background-color: #757575; +} */ \ No newline at end of file diff --git a/htdocs/img/hourtrax.png b/htdocs/img/hourtrax.png new file mode 100644 index 0000000000000000000000000000000000000000..13998623150cd1b5c69775c66eed8a8577181c0c GIT binary patch literal 23443 zcmbSzhdY)38}R2Gd(Z4~Y<=x5^Wa$7NmfEcr0gwDWbYAWM@5kx$vP5c6Qb;uoxM5d zef-|*{Rdvxuz7P z?RLPQ&1wJK+lMW3JA*eydIxGEx7=)lvMTiGzFi~BW-@{4=^Oo3c~zH_FR=W#JN-us zS7U6WiV2NcLU#+p8$r0Fj``XHMLlaffBTIC?|jt(JL>D!PEO7Pr_HuvwsLBfulDn1 zUu_?c!?^$df4-1B<3hxJe6Xz7S%wv4#B7#f^{M7uKsU)n=||8?fCv~XaEE)G^{9G$ zv7xmlq#*;`GJL_>^6j>nFgs?nP&}F!5U`N;l7KDq3x5(c9p+RByID7~j?;7;RasuALHC384%~0Nxe{;z9D$8tgPzlm7z;q% z`QNbZX{$bgF&lO;8UE6*Q}Mw{(=`)GbkYv)5Pkv!wkO+T@Cg_YCcT=jDY+I8Zhmb! zatEJ9E*kb=Z^YFv|8b+EJk)mH?mT>kUl_IVzln#u^VVOxv3CF!lKE#CeNU0nvu*vm zO}RS};Ewt$$rE?5jhB-9BrBTh3V5Fz^JL&B=pzxp7U1bn351gIWb7!-s~3`BjJ|4q z)dKywk_ZNX`lEkF0B*r9n0xLtaU~=;u|?Nt?g{}bkZUJ_6b3P)IXnIHN7z8nQAoZq z*?#TRieJt0?q^zz2?)~+c+EuyhYrh_(6z-khCSH6bO)GARcyw(G^`=Dm!YlgmHabEYOmgHx(lb#{-n`6U_j}xi=$Qq>|F#;AlaWH0-iQ zKr0o34wL3#RG@KAPa>J|9!`RZ2LrGZ88muiYfnPyYG%EzEf9wznbBbc#-w&2U8NI^ zKSzsp1vnz)HFQTV|J6GV8(h3M7VSTk&4>u7VZOHR?EIPyb)X1xa-W!!X{bYQ$vrY6 z7a4p`h4&I>rxbifU&4dO2@jyc^a4t}9ZyFzM5jZg(-rtVa$7}Bh6x?Me@__Z!jd7Jsj&-L{L(Ipwwo#Z{8^)Q@ z5%^cbveW1dKNoOUyWz7cQ!=^ie6@wkjnibp9cr`~l6gT+>c2N$_XJBQLpd=`O6Cv< zDVb@l#19U!?yt*N2OV$g6!X9pUvDB#DABdetuLW*E4ns`+|4%F+#};Be;m$vKBm8( zvN$OKSTH9|c7=ae-3v-k3xx6PBD@YoX`Wh1p`BrFgjFMJexD?GA$-zG?3RGfM3`}y zz9T9o$dL-I3J-urZ5-tx@c7ghSQ2*2*U&ZK!VqIMddFFrz?1$$$HqhE0_6hQ8D+Z zskgzaey#b*h+iRCbZ{R>ifI9aQrxHye&jvu>=bu7AvvqdyC~6MX1RdN4;sC>rUJx( z#j;ORy(F73(6PQk+-*UjNKt|AzZ zue#{dOW8kJE8F>tpbJL^s!QfDq`96qsJ)q}^qIJya?} zqtSd$>WVAoAuxAeTo3?T*bXa@4Xs4czvZ4A1lXMaopz#w4K!vry`)4#{8A*ir}kU) zBzt5_q0<8b1*?aB3ueM=z81{#(R8{>7m{K^N+!+vuf`_$LwPbD1&0w9zJwNr8na?4 zf+8mgEP=6GS{pMa3_W=sQ;M^h5j|;xsFrmF#<1=M9DT!>;ap_SUmNAAPPk(WTJZ`a z$nfcif>UB0MA7E3slg>9l;^M13wXx$XN}}U+Cb1t83!|_JhCL<*wjGnZgHar6{af; z$O#}83*N&Kp%`Z%V(Tdb#s{Jq?Zh2$tTVzJ#*|Xh9vMkQ!ji$D`EbM5o*0(rUCEaN5PlJ?O&oO zgyHgVWN%LvC5d^L5fB%L_Ph@RvjjWjMwE`Q!oww1dW-^yOd!%Y%oEfBICQ;$T2}XlAP->o3xqqyP0mZK3`=9Bbg-qSBW$o;=Zd>bIY~}MDjKt zZ}Ok~c{+|gS0iCO{v^oS7W1W&0h0$YK-_CPSmE0xRs0^AR=xznr@2!f6=L3n{XIOW z#*g<@rN6(Tdylp_Rws~Lp4F*S}r79 zg-1(+_F*Eej)ZDA|MSK_WN4A_|5?bWWypD2h=`Fj5$L)8>N>6TXIAaZW7W_hYU_XQvA5h}q!vsGF zx^#1Luy=^YchpA8gtED^m^FBw;JABy$~Vh^rq z5hhh{H%2fKvpnUP#kN##b1)weyfsy1f#)6O-7#b?y`wD8j)5cjx@XDfl0m*>`B>*2 zw`hsqF|qOdoCdwRtWGuAsTpbCFevk?mbW6S`zQL}{n@Qe8s7R4g&~G2{ciG}=@2^*tOqj@jAr40%sZXx)ha9Cm_)(K^hUdHb zdE(hL&RyWbK;^~~$!@PfIrm%}=86qGXZCSa9uuneR-s3IxoDnA`-?|)#)L1&UqvYUvZdP(#t-gyhH%EF$LVX50 zce~NmAISYR{s0A~iM{Uz4=W#Uko!J&OVGbd24`CFX`+;%7X}M_ryH;PPQ52o@3A(j zr5wn%$nOf7iU;i3O%P6S#j(A4?J<5U?M-HFf0H4byoB#yfj{>U%iKcyi5cG9lYBZ1 z9C42n{TlcICd|WcmW#j01aoZ@X!f=K^^5i}yVqo+1~x_#wFsKoIW|wu{c;tj0_t4` zBZYrlBqnGa8YfZwjeRBz&SXxr)EXzEzn^!}v}h#P4X?e#M!x#-WAJ&YgL^>`KNE4j zg8A%2Kh^UYbiB6JLAz|lwU~}nH0cb)pM|QySodd)=il`7GJWsZj8|!E-DXS>Wiyrk z5Yurnx}pZtO?!S8;Vb`7CF+md2d+RqExyoE^+rYXm9*T?zKBLPj#Z`%uZI0)^Y;FI z!L^mnpf6#unF$L=ct|j6`k^qKsQuqgo1wl$hUFil*_ODU$(v9a5>?u|Mc@F0Nv(Nt{wuCO0?P%Mb+ipPm z{JSvAxI)m;gj4#Mv;{SO(xGV|*|Rf^!_p}~a+yjqwLMSQ!h*4=c=S!k7$Bw7RHHA? zUw!)VOX1+3J=W8I=6)T&~u{a zK%&yyC@}?vn};P#BZ>z)oQl-@cl~8<++x2Dd=f}ICu5KfPkCm-LWQ!AZ01IhxE;I` z4z#NLbOkk}^%1n)w)i`~pv@s!svcDwlSb4dzEuBOkjdo7R!9bQBqp}wP`-7G=>yK> zdN1r%TXpp{u=5y%E$ILGAdn_DlXZqc$CcRD1puPG+nCy{j2vwtc~@_w0c9F z-%it4j2@qi{b^2G_ao%351HqlGZKbBNziydZiH0;hM?`iUNU%g`|F?CkL``egL~x9COq*h=6ss0m`E9b zvM$yIU|Av4%yT9p9;`*#73Ktw(_$pTSDRBHyTw=VJ$mH3k^T6Gy!>}IDLrO~Nwi1Y4EX{)%lb$Fh zyRhX|%)V*1w5?mt=M_XnHN)J)b*yxf0ju{J;Ejt)|ks3DYi! z0icF={`Q#5=G|QtmWKQX$f6Z)^f}~5<-8`wiAv!kHQSqc1>-e;G9~_yA{VzC7+m>e z6uc^%_uI9;c8B*%5hFjbj-ip(@VEP`l0Kh3HkB&blPJlcV6wfrVO+*-P8ZSxXeg-f z2bu8CiLuvzwz(ml0vX=ndWGqeuS>)#q!I`WACf*uhXra7aXlSH*3~x@?K=`h&;~BT z9PiNgO@6MhkN7+I=+^<&Ud`THEznz-yF19WMlAV`Sz@W({_{v6<4>=jT*T!cW4=hS zq@=wHZ(r6J=JR>IHb>ymWcQ|t?=u0?3WDd;28--N1tu$1heIx4RK3D!sjI>E`P})K zOGfC$$}!!clQiZbCV{VZ?uXCZ&PMc5Xmg@kEaWJ0qG$2sD-MwlKONhW+To$^w^F5Y zWuqJod%HHpW|KzUL`x8H&mm=Mfot;36XBG#TuSMSQ}A+y^?84>8H2)s7Z>}5Y?LNl z{s{H%S;6~%j(a5j9#vCoVzp>AZwb;X1kX)BWuC-s%d$6+X^q|ldUZiADSv-~=M5Jk zupL4915TQ?bV5IalM6@BzVd4BbX602Qa2O*p8t9n4qpZ3&iImg#gO4~I|`!z#)St4 zfBMXUjDG|;&|WQK>0$Ve{Xg0-wr3ow_$^9Gy>x$Rs2w0 zf@LsYQ~Rl61nsLNk1G_9LnI#>eG1FI4l-Ye8Nhb@LG7#Zv#u1^Z@C4tfi67}Bjo&L zvC3gZ7Htvycyauhh=){X)~?x_-9o!^AKl}CW5uJ1ov2I>D?Qa2)0Y?L123PTIxGJc zyM3f9NJc6IQR3 zI~BmJpuPML+|Kg!7CYJ>M(!N^PjgR>xSywhZA&D~F-p^Y&PuiD`P$cY6gf+3vZ2qy z*Ju0WI@@nxr6%VvwGYBqgt_*5YNvs?d8hQda6~z_DJ*z4-=wx{X~RcBRE+;7h8q#~ z<`%v*yW4^eQtS)~{(^@eph#mL(!3uM3ay;ue!k8<`raw7>?l;NcZ>~Edo(krCWWt7 z1yLtf*InA~uS2cGnzgB4JVW&hnl%Yi`Q%bRQcGVRFpn2@2agFZYOz7{y~=UwIQ~5H zp!wMy4`!Ow|Fqyuz&S zBNUj=FA(`0k|^e&{f0IiVX+s@(ARoyer#sB_fbi(FnXSBCH=kYQ+b&~Y~Y-cdpd5A z5g`(t!xwW~*ykT=@s*5f5Kq$vN?=^;P@e)l@2ZHX9ci9o>8hy=F-I`J zVC+(O66E9&hQ$|*giL3VBN~hBX5RTyu&RG>q5khIoD?Vx`2Fd~#|{2#Qrd(9vl6{Q z1OGnU?-u92Mh4D~;o^b4td77a9^m=we2}P$0m(4wLX`$NHz+IKiL}S{<<-BVUHxtg zL@Q|AWtvb90uld_{%!e?`S=-$Ef5y6{SO4ZY{C6Ajk?^{wxWcVvG6I}Vt27ztnnXn zE4%qZiMB!C--re+b&X*E=>0qzA)^oD#XI4ed~j^BCyYH+ZEO&cQGC&k_$ljf&vNF? zE7j&pGc^GZf8_B?a3P%QFApCYYzY%Wn}YV(7r{odN+<;$LB#i`3$(W5P6qlg@tmz4r`am>d~)))1it2S@vng~JV4^#C8Nfx^A(PIR=>+<_VLCY>w7{u&p{HfP`DK{~^1BGfShvCB_i{r#szVH7Dbp6ra!`Ekdr`3m^ z486)1Mu&a@2y0qwW~&AhiRsD3GMGrX?2uNfhLkpfrg8Hwl zKk{Eh=#sr-;woLqcIIBUb;_~)ykYIn6MTmXR(s-Du6MruiOZU z)uQok^CT*#gvcF7S=JFp zl61T>E%A`9*z;1s#q#v$Fcgr?oI{C8yvdPIH=+b=S(JnIUtqkOVg>y)(Yy7XQtt#P z4DX9qh~Qz0P!lxN+nhT>!0UIuiik@L-tomjt8|N+sybfsMx)Q}t->{RI#Jx%*qAR3 zGDhT?;L*>Tk%RrPATfMpMb7bEe6-pwmTU27lC1I~j0z)I|F*1E+642)-JtVLFn`$* zGoP-yb}-S@cH{j1=^v_4pP{+^v%V}`sMpQCSMxm4&J$^FXV$&$k;4y{+O<&<^an)M z4?6kTtUd8-zMV%@&dY&N$dz3EL}XInZG`?uYq z1~>4~Mu{@_TpKfLpKkaOhoiTw8y4sJsEXgzJ>QBDywlxL`n`{@7RD@pwqQ@VG}3x? znIg4&23rgyos;lb#+C3=89fmR^U;d1az7y>(8!W~Jhc>f{;@$!0LPm4fH`j~&*Jp! z&Cy?@HP5I!Yly{HCGP*yVHydr#mHCyCH6s1aZx(A0D|R)Lbh_GeH4ta4?C{dx7N5m zwa-Wz$uizt{mx10erLL|y)BcG(eUk8P=Rs9^*N~0GhA)1PC(VXN zmcm|@^hUf8E0;DmyW@){!;ihsUm{KPTPoo8j*KG+;JxRM|7|h4hhT?(vR~kV!C=?R z#>Lx>Ln2J%`L_FKEZc_11KgIG=Lcw&N~3_l)83>HJsStHSzJ~&Z({v-_A%Hl%Iqbva;I%TZiD&B{`qoae;e1tV%k*$qZLJ zJ@wvt%RcExzP?q3ON>KjWwqtrwlV9^(Tll{guJ^~Qk2lk`ShCg0S+5T_5S-+*J%w) zp+fiSR@#Z_eqH_TAndBRCB{Tv?`F}&^|_;^SllW&=IOnHs zj@t5(2y}6D61SWxM z*KEeOJ9I7wKamO88T?NEUMnG6ilxZ#c7LquYrE3Nm)09Jv13@}<->sL^++=%;TS=} z1FaVE<$0IxsM`ap_tc2&hM=IrQ;L#Vj0cbba))zc;vks+#ipU-wFhM%R@y?h&MJ-@ znhUONEQMK`J2T!3`p0+M+^ja0M)TBJxI|vyy89VIYaty=fzBhqs0QO?L409(1}}Kk z;Kb$ck^dnLXYJlRc8JY9mU58U3{&PbBDy{P9ODg-DYAfr+JbDJ2l~C_;!K>Z#B++m z0DJvf52l?&dS%EXXSyeG z>w7J%LO6bB6nYg)VJI8Q)hfmp_rAO0J(K4ov6)glukMV&wj1e_r~Z#_HuK_y;(-0~ zz7YG1??QnV)F$+FGdtGWF}iQ37y=^of$eYz4DzO3MA4DZUPrWwP@JGnO{dD1#@n4E z_k{9spmY4kw&=@Bfe<&3TfPr`iO>jZgvrv{fx^^j#Hr0Y;o9Wk6Z!3d*yv95Wu8kH z9#h{DKmyWtj8LE@GtbFKPdeXXuuYO9>sF(iMn7I~7}ta+Pm84IV?KR#wxD>^M=5&I z!2x7Est3fJ7qu~4NP8VwyFKUIp5)mIV8tFk6dTV^z{n8Q$<6~ZM0m2zcW5GOQr`sK7ZDVF*ncmI=ziD@Cqqiw_ z7VOnfsRG1sEqzXyUh9i?CmW<33@G|U6A(?|z>wsCpbr8BmyJwSZCZd0Opt=5S(CzSI^0EQTj>5| z4jJv`jb;w9J1T8y-wEk7?dc00)vvpC`VngE(xXEa4@LeGV77Y;7{CR5>WpZZ_kK?Y zlzkngA+^kmv=c9N(Fxu7f3*N{W-6SFu(3}m4=mv{nkd&h|B*V=?>ZSqG9%mAN$L0d zc#zbu-7ZHi#%*f~$=_SLgb*y;zT*3fjd-u+-JAJLI`nF$DpC|vGyvI%SXDiH#8RmG zC4awg6E`jmW%=40C?aP{SA?j)S4^;DI>KYPzoj|0i`Zs=Lkj*pdqj_TM}Yj?(;ZcF zqBc2u^3vx@Uyn&KlSj=hSqqH6uO_xQ{QBSbYM$={-8Gvl+t*BHA)962KpFiB(`5%V zfc~$q#Ap&srOfQfA-ty`_jPt7E}1o5aD9JopLDb;Z`bu+vU$L1XI5=8he}YsCNP=( zo%WdNuu+2i`9dvpNzxT!$oq@=pbK6S@{D)yM;Sew~QDzv5@Cl;*~4jf$?=-;BQlxAvtN zvglXHIX=uN<~MUxRzX@Ssb}#;9ro&YfLj&QAIsH-EnM&d99b<~@Lu0=qv+{#UAV~@J zP(YWOr`=*d%_NWiwF2`2Sf*YVw8b^RJan?4+KVWYhEmbGWGy(OjJi8Q3@RV~t%1t# z@n&M>lD8oXT}6yo*W~^g`?b$~Y5@5yKmb`ziuMwWW`FpraPOibqx|+`234zTK9Eu?=Lc3xcoFtWzJ?)_)22m~!UcA)u&yHuTj8v&=nrQoWev zXnC|NkXL%1;KUO($Ue-+B&}?^iT1LpaMc3j;NRGuT(+#NjrgQ+b{qC&aSi?Y!z_D> z*Tw3t)(<-xA7;2QD|F_S7J2?lKWMI?#p93HWy6i)f3$7Oi(~ruDqa&N&Z|UPsC#t3Njl(X z3T5jboMY|pot?C3Gi7$jFZ8J_58yjqoiA=i#z0^b6qD`izsgpTP+`VU(Y69&DhJ0$ zr#XF0d2dJ7e7Zv_RdvZmV4(%J7n410%XiGp{GT=9#e6x=c~t=O{_?jnA-4Mo`e8Cy zf`2wDn=LG)3#Z#Ipr=Q1_&gQKeo47=_6?%L&A9_eBgWT*ZUYWC2}ec5-mU8Q94+KQ1oFv70fR)+WJAH|5Qti_#$x*nna&I zj56%t8iH9cY?;D}e=D|8Agi6)l*=d`{w6HvOhs_p%@;*}$fqPu#^*KXSo8tI{b$Aw z|8u^x^&?WH5-YCX$qRcNaWylupQ<8Bggp7 zADosLxzALZXoh!qkZS(vc|bf!g80IqMs4S7!L=&W62Gno=^L%bEC?$CG@!7(eB{Gq zZ=}1xI+ewJlQo(k_KL1@cky>7?25|B^QG~VUT3RlJzy&e;78VxqPI25#-Zwhgvx<% z!MKoM9&y^jqczYrD2Cm7+qTT68q}Ps35Lx`Zqlb(WxrddUIj~hRMKct{bw+JnsywA+g?l~&3pS487pi2n}*cz}F-y}``O zh#AVKp8VBH>38brh&NM#STMG-`HemiXom1189yC9TAhtGNVGboOS~7vkG7UMlj(lP zI})fiH{3SNL=v!S;>*bz5~xu4p(f6sh}z~KyoA?&u8LeF8X;mu2D@RxuBH%gm>)2^ z1_3xn4jCsr?VI@5$`jOOR(4LaMwQiyY8{!9f*s9|41lgpfj}!h z)%_8<7JT&Tea@a|W$jlXxWN$ffzE%v4-a=WfnKqv81hXSDPB>CmkHbW!~dS0_(N8f8eJ=@$VSVf)>qQu9%)NOsXjO7p>(FEXdsQ)2wfnoqXs@ zf^Y{d`&6ZfSeZz5m|{m}zuRp!yG=PB-$jh(XJp7Gd|6Hy@oXP=36V8&8dlkSaFa5b zf?q_4!n*xz0&c$d+Z;B-jv!LeA$d7~gb?`=)cymRy1t^*&4i-Gry(z1`5^cdMYha(HzS z$AmZmzdiw@ac8Ei-c*Emg#N_xQlfP61u# zrBQ`oT&{a!iVmTqd3=lAFoIO~z3vUSo1PQaRaUz@3(>nhJ?6%~xAU~6@3tz=z3!y4 zVN!5g1!~j@0MRR{{+b&6`1tW75!F9cc@{~8My8^og0-kkvkyNt@d-PncJ|m4_J^`L ziEw-vT->#<6tBCxyBH8F7<)XzN|kQC|HX~8xLjC2AfOVJH#fdLG!^vT*TVWy&XX_&EdbIXI5-EOo9;6EMA$kt7{#JF_sqmUOX5_e{;rN)mcF71S4h?n0@ zpZs@~;FW>v{JihL*5(o3Zzo+9Pd}(>1=*vq_%dVfyLlVYU(HFJR19A&1#++5=Wd}BtCG1T9c@j- z-Nn(W$cT7Sy%h>sDmLkq`0IH_gP(GuYtloNDT>=87Gq^ z7uPwex)hOCc*bx?IL8LPLRq$=2vNb6T*WXsW7r+;C?}>Wh%bz)q|K3eh zIadcXlZ$5@@?&l zDtt)$X<{xRX6}BlL^$V7Z~Q#!pX;>(XF3?3c+Pnpx zbES9RHki`-I>yhMfW@8G+h8YwL7OgWR?4dpLF)FL#Og}_rf4FcPg{J~TB2=bu??kh`6t?wj+n~fSf8i^L zgH%n(B;81kbbv$(@f=m^7y1|iqm|E|O3*{M&t?Ph15Hue_Sh~_E; z#=&04j03`AE~DZ>(XNrUA8{NU(nW*>Qltdh*%3tG{oBGtALMPHI)A%PTXVD~&{QH@ ze~vC>oFLg)fzQD}_J%@i(D0kiui9HYuw>y-)K~-YQFQ$;S>Z6h8-}vEj^cv%2_4_m zEe#AP_UatC!w|@bXpkBdkB&?hMg6XlB;@(Z0~5oxG2Wm>((n+gNAW1$C`etMg(HL2 zq~c!JxM<8c@Q!xh|715`Om>5vI+7c@@~7`+K^Er?as&S=uqvRCW0+<3(riGdG?;fT zl@G$Dv>}l(N(em8@3@bb(hV;xAc8Z&UogV%K$v^Pd$j?HgHV?{orprd!dSAd8|ct+ z^@S4NYbm!Ncr-C_Z55bP@0ExI!oy7E-zqlFe`C>5ps4imQz1!^ANJEXr`mZatLCkM z`1;3cvdVcp|Bh~202Ez^Gl1-}R{k(w*AfWl?11I#8hUjCJ9AXm&nia-S!2PY19G*& zS6faw2#=NGUw8885!!69jbC|gHclpXT z(V>YX8I(6_Qexk^(rkfm(qOT`GShRe1MfrF0F{53{7v_vcyFP<_fLMz>lo-QXU%FW zv{3T-znGus;js!nD1ixYY_vU3|BX^U*!95}Lr6N-P2)X#8rppL$Jzpm%PfBTHc~AX z2@`)<&OZo`(^<(Q048D<@-{sVIP-{V&9%q?`rlM^1YLKo|N0B)qh@8J&) z4Hnn5u83}BW%aobs%Yhfe;-;x4!^vgG))6>tnqBFVld@)dGLyjW#-ca!fFuXP1w|K zC(isiC|ad!4XnpUoKp@=URvrBywV2sc52rTt}G8M|Jg}H6`UsU8mo^z z)$JM(w$`R zTqw~se=dum)JRKx1{Ds{tMb68L_>CR$DEeAjz>kXXq+Ipmw>uD9J~B8w!cQ$J6Xl=w0;oe-F05?>#Y_)KF zuB=VPsobkW4OOnc7-IHy#=Q9ALwB!oJm|yxZ4Mqa=#Wu0(N{J{RA@qMD&h({mf!}Tq9g+FzcDtb z4*%+5wv^Yw4?Olhv5<8{qvCHM=M&+fRrGsybQcZF`PRF8(r_n58E` z+A!EOJ)lFaxhrRxc90_P^-~pcl?@(r#1mN=H?(DnM1MK-Vd``5gp7xz&|J6v-coiu5oZnX2ps{W^DE1R+4aUkSyoAsCF8jX>W-nHA~6JT1s9{ zVq`qym5mpzu%;O_d1_`lHrH#Yabr-V@~Swg1j4s!jyG|5Uc8^EP4_Y*H#_Dt*EajMy8+ zmhxTHU!OS$q(FnZKi=sqb@fqZnU13HHyl#0^uKhQ3QSUH&CobjTU{h8AHFol>n{wPy|T@n=8ehjjrKYbE8-aI>(C;n;|y4Z^%LFywo3DZHRHQ_ zcF@*b7oP6xBudYG|KT5d*;KMrkI)C&Jj=7O{88XE; zF-|?k$E2fTp`a2VqQl!wtv1LCyygDdDui8+Fo+52NZrJw31lI}Y=b*yi@zs#T^6)( z^3!>%nuz(pV}ATPk6|`MkQ_{o`p2Z^(~tIrxn;Z9&6$0^%BUT)!bm0$?4anQaS+~ z!Rrz?9^0`T5Vi;ylF~b_JQ!EmeJfxncDIf?$uXJ+7@fQ>J#KoFvh;vy!4V&E;ozb4 z*e9s}w}Eq%>vc2*>-q{|{=r59gQ!o@Dgzvn%ANl0r>0*#uwN@|CjFPUr$04_GZA++ zH++P2P)5LH_kLA=tv1$n(j^P(x6>fLM}Q0cm1O1eFAjnllROG zbD5*HInw^BN%@KGV(eLVx&f!lb;e*LWu^`AX2wQ`j_Yu@kbJ7f!M9~;vbcgM7M z5H3~(|5H!nd9PnNPBu5n*l8h7U2`IK^3LU8*B`2-_x3agKWakmk?OLM3dF(GsLOSA zbwA_U&uPdB6^#m%@`Bb!-~V^)bZpl)yM62vbg;TeU(o&#J?0b%g(@utjf@QO1Q0_| zqj&&h+?)c=xTl8)63YpjfI6(fG{C9(&rIXv>l6vDe;rjyH`z@`7g{9y$^7O6g zI|DUwYNdf$0uj=b7Z*vx3RRt%M0s7O9*0rWn0$lEp=~C2Ws{7d zD?(~N79?xOO%y8iSD^05Wv?mVR>0A$!RN@)cVtbux#OT3?s;r)@X!tgy3Oy44UICs z@J|9HEBdCa88rG31}w`Mfu;e93|O8%IRedZU&X|5m-yKxwtkG0>hrV)&l%zWpk^27 zgiYHZ#pbjn5*Od--@0IO@e3d>gAer`U7b!%8Wr+gmi@+udFnb)s`ngTsLaBd5ff8) zeU&O(Y*Se^E>$N1UYPxwkGn{x6kA1_X8v=1u@~ffLNFCrB?rI|#NnJ67*Lb7=H^~6 z8;Lel+k5l{OymkeEt5MiG{_O5p*igA>|)5BxHX96HHKAj_H+`Upu!4<9ioVtS`LwD z3`LzWe+OXw#0Y_3lr$)Dc5Vx-=)F`X-qk(`XL;ssBlxm9TS>D?)>N^p{vo`uDR5p!* zZI}xEXQrXE!#0x~5bFdpjusTTi{R$=-4DL}ifw!9I2yntihM<=Qw~RFKHx+jV}fBZ zF{ROe#6DGSly3|L!FJMhY+-Eaa72j25Oj|S4VI_`JRTJ87IO(a!O>>up^LN<_VC!? z9#IAmO}=d0cOZkJ?kZO$a>&FOEy3q#(GhL~5TrIL$yE8KHda&-s()~JCL+Mm@*jQ` zD>B9)J0|9dRvOd<(&yA44a1lhdBTkQNYOhAKrVm-(9rm5m3w6q*sDh>j;w zhEpGLp}pOHp-?_jGMu+(Ssoru%5X%P0mIVQU=>tF_FwJ!ZF0FYzwI9_6N%0+2R2z3 zhUoR8#t;e~<3awb%?PAf?*t77)U`U5vttVG@2b)t!V%4sbJXa4w;5>Xyn!NTTn^{7 zShV9u&dZI+8UpcMGIUk8g)+39FP}_6?4{uow<>YklW`B4!X$_;_+n_ec2ihv%<6w> zy!P9VnmUcmWA<@KYvI2*hZ|4>?na?7F+|j}iBq~2&z@-v5|qH$V#jb6!enSdaDIA8 zOEY}!;_!T9;ACL;Gn1h93a6O^Y>05#7!f-wK|=#WH}q~?u2u#!6Z6SoCGT|LBt#&S zkWx5BxjKIg(HwaAoTo~?PBNC|c}9Id#6O8?k!XsdFmqOlhUQdRCG0S>hxP`q_bz7@ zThHxAS27@m9&eup5VMS1j6Zan3i^f70YCxjHPWY2i*te4U7fh+J^JxQMQlu+5Iwnl zFQ=>oH7OPPr7cvP(hz`eV``I(v;} zI5}(S(E9)K$A1SMJ=&1c`8e>4axG%H=`yWA2q#to<=r6DP@64u<@LN~qqsZhheW+u z&==^P*qh>a7>})ZmeBRx3S7KXRYgw>!sN;FNuUX?D~7op-Tf5g-vq{BJ6BiFv(zU_ zXP%VLV`7T5Np;&VH&oK_vf$)h0+&;3el87=wj!8wvPN*IgHU&!1xaz(M} zhaCrBK`4L@L&rlrcKdBv3z<7^@~p;KJ4Oy`lM1QD4X9DW6}q|+BfN`;7SN!kc^~Z) zu))<>)|#Gr@`f7C`K^P9W|0?RU|f$+OOr}k_o>cCzUr*l&vJofyNnH)TOJ%A4+#O& zP8i5_m_%^j+!1{u{`}CWvVT)yc-c-`g^PHO59(F@3ZF}-#G9aeLc+^^)1pSW_#aXv z``E@#TxE+Kt=ice4LO&PJaD3&hX&8NAuV^TV69la>&!~+w(=EM_J{}I7N9yKr}ic$ zXV@PSJH|;88j}T*6L>(_*d2VU#uXfk3aFCES21qB2DZQ*Z+di$;BKx$DD8_%wiVRB zPoJP}gU<>FhMY#6TGaTKnakrKgbw+e0%y;h^59fm&tX6E=N>|d;`_n_qrn5Uyg;K%^LYuCjy(%c^`$fl(@%{3L}v)82j0g30-Opa1=uzUifE z>%N?AZ*;#tcJzGVR+^`m2Hr1G8$6@vXc*Ue@xU)bHtVpAZrmBv(8-j{DJ)8c-f2gM zJ@>Me{F7~6jm0&a{j?lu7iHBfBn5_T-n3Z*HjctEX9!5dx7=q@z1sccU5A%UJuCpq zy%-ZM`yc~X$`n03ZOL+IXiS<%hoL5=2;YZiDMZ*Qj3=<}-ns?=EAiF$0eD`m7L-g=IXsQ z%?IYJz)7$_J=uvH64UNjnbW$@K}^QU8~BbbWatz}xteKHOM=fB^TifwB8>3xL={!Ks>+|8XVw1> zvvm`?3<$u5AWaYss*MCd43D__v5EUj@4nCHE5{@ZO?)qg5$h_JX}iOdocF)G&qgn0 zF{R`L6Jc6Wr&Y1HK)C}9*ABX;-O9t=1((%JXWqBqPcz} z1_MHVUFSH_80}b^{T2DC%{rp%ctD(K+B8;PWnXnz8-O_@!18;b)Vezi4fDnw=Y{v% z3pq$by`Z%p=^lmdD-1kQ>9_Mq#-D?l;m1-QawaDES+o5u^x+^dh~;eON&1;2#n(EyOA8<4}FgVg0PMKbyx3fz) z&~kfz`Z1+BPIh90j zGKZN1EFTYGTj-0wjf0Y?L{88>k3DzIw)yzP!eIQ#F3#1J+YB$TY18YHY0<8sy1mrB zx}?Jg5UDV_-NaDgjr9u}WW7%uiA@?A5Rbl-rjqoTcQdaI);PT@2Vg>hHGi0qUQM@r850Xt4=Cy# zUi4;4U(sDCpvBj??PJyGkwVKMo}^6M$IJ!XpbV*@Q9hdQb&^!jUa3oA&ac{NT>>iz zw+<<0BpeXA0f&YjLAnsvi<4c{XZK+_cHODod&KxM^4jh{p=F!sRb46ISnKX(Lw3Fm zvR5r(f9yS8^ef@ys|@s+-N z2R-IqW7Sz#wtbVuP3=~`TJ(;M6YVwqN59kS%{YGaK=orb(%oXOx_apqZEiitK)O-}C}#YuZE}S<0`SS}FCOMR@6Z1i4KIIb)&P5W{QBK-_VoVyU&e|pP6KGU-k`0w6u;*Q^b<1(yBX{RMJ4YX;5rsuXE*_<^WAAhU z7%~G0BMGj5N-@+^*NY83`*lqSE&ztMHb6!{p1GObMaYYFX$URX_E~|); zBK!Ad?C~@C`LNtPH)64qrD6ACW8_}BcVl9|#%2_7!SX$0Kl{DypCAc}0D3@R?r{`} zqK)1g7QFI(^5k9_Z%4`bSU31tDshOH>@lkr{1tDmQ8=Nn`62rbCC3S06 zi=q{-fKkGkIF|iq&&G~E9P;G~7O%gjnZGcwAD)>_==9(D+>`HH+sx@HFMHZcBJiBr zD{r1Ww94Tm<#09vinImsEzc7Q3;p&e7Ix)Z!^PTpaXN}jd_j7q}D{RSb$1Fh(^>Oa> zLUgueh7a>rOy;tqh6HL(n`(SOx(fVTzKzWhYa;SWs36? z?L-W{{`JA+J2e^XMMAOQR0!3{voc2;1_ah@3+fc&B<9JKPT(Q)`^c$M9I!1_g{?j? zlAMJbQ+z7W$yL^F*D3N^s=PGrQ+kikKxN%}+WKYm+%eF{KzKUjHmZKa9UN~%#oiB|4BNYSiPgKJul2WO`J(deb+~>S zz9X^6b8f7MC=tPDe`@|MB_K$&;1+^v4C?5nbo}u73T9OOT4q)z3v3SXtxhc$DO)mF z{Hj{wA|La}C7XNTd;fk}LAv{G0!bmI5kUf5JY|BDMe78rN$TqjoRMYP|9QUI^HF{F z2=-%q+0?{u@O^z#x^-9Z^x=N&rqYy4iUQ*Mvk~=tvmh10y7iK+kM*GS}s`+KPb⪚Q>d=f>qvxw&F;?vR*ws5rVJnk*@u}z`o_$TOF4yy zB<}T0{d5oRzY?WxLZ71O!8-L|YBIO-$$xYq;?3m~`EPBYS?>E=PpkpX4${sRjkFZX zJk;>c=Wbr6t|(3y!m-bxr{)SDd%|&WL-1^(g{g-He}2I`Yi)ieGfR)9t6%;>Ki^ZnGgpznr0QIC zv8v_>QV-fkClW}be*`EaxRAF)rsYZmF86Cx7laNSv9$>FB%&?NRjssAza%v5_<8%6 z&f1VtjQmF}7EqIWBApqfJ2lXPWIeDGJQ;RFzLJaTp%ng^+x^EyX@M&(p99iRkpi?V z=LKy4@-;!-{7IB(bMtlc2y?Q1*PX_=Nb$S;U;i4ori?lL>ejFark{H+RgGUo_WXt1 z@hip9)s0(YBHnqLB@fThTTKehr{&^Jx)rvzVK+ZbN?YZe6u*`Zs9&2t5oI=z9LtM4 z0dkOXAscdgB|IU2W+s@T)~hFqU~sM2eC4-FOPwH>(mg8^o6t!?JyDn+;H0)aQ`cS* z*x%L@J8_iW-V_Q4)HsYJ_%N&(#B*&fgy05+Fj}YcRWZ^ZpXpB>S{AoYVE!WNqF~u^8?Li!bX=2t?RoZO3$N zs@`+W>Zj=)$Dup#tI9IUo6Acd`_eci=5j5oEkpH$ef2MzffM_rDkD=knA+OjFt{Ew zfb6~TFpQu`!tI}{HBDXA$d(X@DSQ$F$%T&QR|uu>2>NR~<6b?N(?(UgUQl_M@~J3r z<6@1Vh&_;*>w`fH&~Q|0Vns0T+~{8mp}5j7%v@-aw{ihND7$*&baAC$Y- zhyHrt*H}{t!4xjnl}bj_ydY}z{A7k-`YQ+GJm0?LaYe?*3f%DXE8dr4X{o+F*JCqZ z8hd(GcHef+1r8#aA+yYeD~Ow?K?LKAxNEo=M2{&~`^wiK)9ke`3S>O1wEg5ERF}k9 zUxvh;#0H`4&f`MNthzea0v$`8Y)s7VB+s6`c|({uwuMN${xehx&$JZU!Eb9PdN4Q& z&~!CK2Kh@5(4Hf@BD>$*$&R`Ed3n)#BO;l8^eiIS=_Fluw@uPPOrB|$0~+8xHCb5} z*?N2(>FIG}Mc=8jULdH9f7|kuJyE}KE;~#<8GB9}vgJKfi-Xlbk(1@DhiP0&V8o!h#7V`! z2N%3VR-ocS*bOb664bSe9wt>^m3h3%oWFF^ZxrKZ%6$^|%Pi-Hz-8LEfwf)y;vyA4 zuqPBq&Xum-IGSgUQwtosRBUb4?O1=#KfBw`mVZaHX^K)kov~~=<)OZ(xP_8iE%+$q z#{IS7^{FlJ{p>%TyRrZtu$LnxnrZB|-hwGSd-#}(7zvGF8q@1hE7MndlepzeHdf!x zZ`a|X{&OhV=$Q{N2*-vzE&*g@kdoEG1QNq~xX ztk!st_A?nD%I!6D^YY7zW}{BoPet-Vg&^N=59~tx%vE)D$*sg|!N6@>X6g_i?c0uK z&cBwf_Q>a;>~nr4&*mz#iqU+?1M27ThK}E)E2{jOI3ruT-(AwQ{A&aA=`}WHU`WLY z5h+kX86?vctoJ}BQpb?mwt)V~oa?>27K&D+yOict((&<}jlPS0M0}=O9COlY@m(xl zR7ygHq4b$qvl0tKDx$3C`T>48(8u><=GPlk0ns@q4d|38Ge7@1%WE31!?Hn|K zYbuxjH4S87ka5IBBX5Bf_A6Ou4fG)2>#R&C%8p9@Te{D7&LP|U-)S)F}%=~GnMSvT|-OTB5yJ#$h8^Wpo_|eQ0@MN?ydx@Hp zo-Fv8-YT!XG}Ak&F~P3GlJ&W`6WZYn{rnH?XmSGk#^f?f>XXBvy)I^S&1wylcdQdN z!z{`*?l!p{3ezArh0D7>Jbn?MMudS>Aob2h*40BwOb|&<2_Vn-Z}JH2t+&!~8%%vJ ze9)o&`v?cA=Hr9`$O0<=*t4b3JZ?@JcV@sq%^)1~gxIxdI*=H_M!a8RemQmUGSsiv zXXBtLtxFl$pSgsj52sKR*VE|EM|yWm5|`CIs!y)wlk5NKds!^O7ETk+9B#OSU;zSg ztGFGYI(>X{77Qm!lXZ{KKl9VesW zlHJ#&rr>^(;bg#0QBeJvcZb^f}7^hU44SE-y00-oWh_ zka#Wm0J?`^U!@AFiuKY=Xs782Y->OI{cEIyV5cDbDeQWJeCs2I4Ildev}XTX1WB{O`%=2h)@cTT6qG?Y|DH*6cn%tWbg6>i%GahdsFHpvVze;Yyk;J+`jFFPsxsSG_&S^RH9h&=t&%#iV61`1nrH0BBxKvxwMEzuP-IaG7I0fU1=$vjogWC$f zFXjN<^im*v^mfy&&pH1Qnobzs1A9NgM)cHW@6!T9;$hPn_C)`}?2%1ZDJ-Rh!4Hu8 zv!ilrZz~vBs^yG)l-65GiKeh~w$)tE?OUHCQ-u*`1Gk0$2_k5qjlcFVCQ;Y4Fc>x9 zI4|NK>=$}R&<_rBVw`z-I)e>YU8jyrF*cY7jc0mr&3&PdQ3dP=Q7RS}SqG&%-M$7FdY9}8ihfD2&n;^Ztp36C~PkN7Z~TCaZn0dx9km4a$HCcio_oSa5Gzp)Yj7{f85Z;ii7V-mVD!}u+xQWJ`{ZS z2;2f|A!j12FdB*8UGoO|NX{s<>EIRrLu)cxTX(^s`h#9S($X7jeE`vT;GKa{WSk8o-aUa6`nw310z9sliy4s zz$(bFZYy1N7S3vw0Zuirg*zsv)Ax}}LQ9~;-6s`>3lO2G0h5B%s4C<4`;#21szhIG({*_4Q(e!M+(R5sU)`&>na- zqq9P&=2^NqH@y0ljNlSSZtn-MfP=k{`z|J)4PDAopqJ zjI7ZXcw-m@tgOpp_7%SdGX!LHE8$4!1h?>D{S8F&y~C{dYv~2s{t4 z33sU>laK7R7l^W;(BzAs+o+>F7~FeXg!2vs4zBk)e~1@elNmau?x+Jz7LV?{dgDkL z;gcdNGbl$`auZ&QMdrgIW#o<;C0%q$5u-@F3NoKlZ=Xnl3U8MF*W%Q|5mTf51z*Lf zlkNnQkLyc)ZbvI|I-uAk2AC`$DW&exFgsJC0z44qVxM%*q$l$}IU0L(Bh{=qE)PN& zP}i_2FxAShNoaat2?7 zQ=7FGLKTr4bN5LACgjcT)Nho)krPNNT-eHiyIRsne|d5%h-B1)c*;E^%m{+u&jR}R z9_7@n4~nX{f5(JkUc)}w0LG?u$!rk$aJ}76v&gMZY;@Y5L~r%jRX!2`WcY8e-JeZ= za+hwH&XM#@WP0(I)7+5TlQv-aUiFL=B6z+QYr8)EAA&I? AX8-^I literal 0 HcmV?d00001 diff --git a/htdocs/index.html b/htdocs/index.html new file mode 100644 index 0000000..b3d2b60 --- /dev/null +++ b/htdocs/index.html @@ -0,0 +1,249 @@ + + + + +Hourtrax - Admin + + + + + + + + + +
+

Hourtrax

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
NomPrénomdate debutH/(Semaine)bloquéinactiveCode PIN 
+
+
+ +
+
+

Export des données comme fichier CSV:

+
+ + + +
+
+
+

pause obligatoire

+
+ max longueur pause: minutes +
+
+ pause de à +
+
+ déduire toujours +
+
+ si pointé dans la + periode marqué, déduire ce qui manque +
+ + +
+
+

Synchronisation base de donnée

+
+ DB-Type: + +
+ +
+ Utilisateur:  Mot + de passe: +
+
+ Synchronisation quotidienne à +
+
+ Base de donnée +
+
+ Nom: +
+
+ Champs: +
+ +
+ SQL: + + +
+
+ +   +   + +
+
+
+

Backup

+
+ Host: Dossier partagé: +
+
+ Utilisateur:  Mot + de passe: +
+
+ Backup quotidien à +
+
+ Max nombre de backups à garder: +
+ +
+
+

Accès Admin

+
+ +
+
+ + + +
+ + +
+
+ +
+ Hostname: +
+
+ Wifi SSID: + Mot de passe: +
+ +

Réseau actuelle:

+
+ +
+
+ +
+ +
+ + + + + + \ No newline at end of file diff --git a/htdocs/js/admin.js b/htdocs/js/admin.js new file mode 100755 index 0000000..a78096f --- /dev/null +++ b/htdocs/js/admin.js @@ -0,0 +1,78 @@ +var admin = { + current_dataset: {}, + loadapp: function(appident){ + console.log(appident); + console.log(location.origin + '/app/' + appident + '/index.html'); + location.href=location.origin + '/app/' + appident + '/index.html'; + }, + loadpage: function(modulepage,modulename){ + console.log(admin.current_dataset); + console.log("Load module:" + modulepage); + if (modulename){ + document.getElementById("modulename").innerHTML = modulename; + } + var pm = []; + for (var i in admin.current_dataset){ + pm.push(i + "=" + encodeURIComponent(admin.current_dataset[i])); + } + if (pm.length > 0){ + modulepage = modulepage + "?" + pm.join("&"); + } + console.log(modulepage); + document.getElementById("moduleframe").setAttribute('src',modulepage); + }, + sidebarclick: function(modulepage,modulename){ + admin.ladpage(modulepage,modulename); + }, + logout: function(){ + req.reqdata("POST",location.href,{"logout":"1"},admin.reloadpage); + + }, + reloadpage(page){ + location.href=location.href; + + }, + getdatasets: function(){ + req.reqdata("POST","db.cgi",{"db":app,"type":"array","sql":"select * from datastores;"},admin.loaddatasets); + }, + loaddatasets: function(data){ + console.log(data); + var gdt = document.getElementById('globaldatasets'); + gdt.innerHTML = ''; + if (data && data.sqldata){ + var opts = ';' + for (var i in data.sqldata){ + opts += ''; + } + gdt.innerHTML = opts; + } + if (admin.current_dataset.db){ + + }else { + admin.current_dataset["db"]=gdt.value; + } + console.log(admin.current_dataset); + } +} + +function reload_page(){ + location.href=location.href; +} + +function closeSidebar(){ + document.getElementById("sidebar").style.display = "none"; + document.getElementById("main").style.margin = "0 0 0 0"; + document.getElementById("modulename").style.setProperty("margin-left","0px"); +} + +function openSidebar(){ + document.getElementById("sidebar").style.display = "block"; + document.getElementById("main").style.setProperty("margin-left","210px"); + document.getElementById("modulename").style.setProperty("margin-left","150px"); +} + +document.addEventListener("DOMContentLoaded", function() { + if (app && app != ""){ + //admin.getdatasets(); + } +}); \ No newline at end of file diff --git a/htdocs/js/admin_ht.js b/htdocs/js/admin_ht.js new file mode 100644 index 0000000..751b0e4 --- /dev/null +++ b/htdocs/js/admin_ht.js @@ -0,0 +1,249 @@ +var admin = { + lastrow: null, + lastpage: null, + lasttracktable: null, + currentrowdata: null, + loadpage: function (pagename){ + //disable all first + admin.lastrow = null; + document.getElementById(admin.lastpage).style.display = 'none'; + if (pagename == 'page_track'){ + document.getElementById("select_table").style.display = 'inline'; + + document.getElementById("page_track").style.display = 'block'; + admin.change_tracktable(); + + } else if (pagename == 'page_staff'){ + document.getElementById("page_staff").style.display = 'block'; + admin.loadtable_staff(); + }else if (pagename == 'page_exportdata'){ + document.getElementById("page_exportdata").style.display = 'block'; + } else if (pagename == 'page_sysconfig'){ + sysconfig.showsection(sysconfig.lastsection); + document.getElementById("page_sysconfig").style.display = 'block'; + + } + admin.lastpage=pagename; + }, + change_tracktable: function(){ + document.getElementById("cmb_trackdate").style.display = 'none'; + document.getElementById("cmb_trackmonth").style.display = 'none'; + document.getElementById("select_staff").style.display = 'none'; + if (admin.lasttracktable != null){ + document.getElementById(admin.lasttracktable).style.display = 'none'; + } + var tablesel = document.getElementById("select_table").value; + //console.log(tablesel); + document.getElementById('table_' + tablesel).style.display = 'block'; + admin.lasttracktable = 'table_' + tablesel; + if (tablesel == "trackbyday"){ + document.getElementById('cmb_trackdate').style.display = 'inline'; + admin.loadtable_trackbyday(); + }else if (tablesel == "trackbystaff"){ + document.getElementById("cmb_trackmonth").style.display = 'inline'; + document.getElementById("select_staff").style.display = 'inline'; + admin.loadtable_trackbystaff(); + } else { + admin.loadtable_trackincomplete(); + } + }, + loadtable_staff: function(){ + admin.lastrow = null; + document.getElementById("table_staff_tbody").innerHTML=""; + var xq = {"type":"querysorted","sql":"select st.id,st.prename,st.surname,st.pin,st.disabled,st.blocked, co.startdate, co.weekhours from staff st left join contract co on (st.id=co.idstaff) order by st.surname,st.prename,st.id;"}; + var tbldata = req.reqdata('POST','sqlite/query',xq,null); + var ntbldata = ''; + for (var i in tbldata.sqldata){ + var row = ''; + //row += ''; + row += ''; + row += ''; + row += ''; + row += 'h'; + row += ''; + row += ''; + row += ''; + row += ''; + row += ''; + ntbldata += row; + } + document.getElementById("table_staff_tbody").innerHTML=ntbldata; + }, + loadtable_trackbyday: function(){ + admin.lastrow = null; + document.getElementById("table_trackbyday_tbody").innerHTML=""; + var trackdate = document.getElementById("cmb_trackdate").value; + //console.log("trackdate" + trackdate); + var xq = {"type":"querysorted","sql":"select hr.id,co.idstaff,st.prename,st.surname,hr.stamp_in, hr.stamp_out from staff st left join contract co on (st.id=co.idstaff) left join (select id,idstaff,stamp_in,stamp_out from hours where date(stamp_in) = date('"+trackdate +"')) hr on (st.id=hr.idstaff) where st.disabled is null and co.startdate <= date('"+ trackdate +"') order by st.surname,st.prename,co.idstaff;"}; + var tbldata = req.reqdata('POST','sqlite/query',xq,null); + var ntbldata = ''; + for (var i in tbldata.sqldata){ + var row=''; + row += ''+tbldata.sqldata[i].surname+' '+tbldata.sqldata[i].prename+''; + row += ''; + row += ''; + row +=''; + ntbldata += row; + } + document.getElementById("table_trackbyday_tbody").innerHTML=ntbldata; + }, + loadtable_trackbystaff: function(){ + admin.lastrow = null; + document.getElementById("table_trackbystaff_tbody").innerHTML=""; + var trackdate = document.getElementById("cmb_trackmonth").value; + var staffid = document.getElementById("select_staff").value; + var bdate = new Date(trackdate + "-01"); + var edate = new Date(bdate.getFullYear(),bdate.getMonth()+1,1); + var sqldays = new Array(); + var cdate2 = new Date(); + for (var cdate2=bdate;cdate2<=edate;cdate2.setDate(cdate2.getDate() +1)){ + sqldays.push ("SELECT date('" + cdate2.toISOString().substring(0,10) +"') as daydate"); + } + var sqlret = sqldays.join(' UNION ALL '); + + var sql = "select md.daydate,hr.id,hr.stamp_in,hr.stamp_out,hr.idstaff from (" + sqlret +") md left join (select * from hours where idstaff='"+staffid+"' and date(stamp_in) between date('"+trackdate+"-01') and date('"+trackdate+"-01','+1 month','-1 day')) hr on (date(hr.stamp_in)= md.daydate);"; + var xq = {"type":"querysorted","sql":sql}; + var tbldata = req.reqdata('POST','sqlite/query',xq,null); + var ntbldata = ''; + +// var cdate = new Date(bdate); +// +// while (cdate <= enddate){ +// console.log("cdate:" + cdate.toISOString()); +// cdate.setDate(cdate.getDate() + 1); +// } + for (var i in tbldata.sqldata){ + + var row=''; + row += ''; + row += ''; + row += ''; + row +=''; + ntbldata += row; + } + document.getElementById("table_trackbystaff_tbody").innerHTML=ntbldata; + }, + loadtable_trackincomplete: function(){ + admin.lastrow = null; + document.getElementById("table_trackincomplete_tbody").innerHTML=""; + var xq = {"type":"querysorted","sql":"select hr.id,hr.idstaff,st.prename,st.surname,hr.stamp_in,hr.stamp_out from hours hr left join staff st on (hr.idstaff=st.id) where stamp_out is null order by hr.stamp_in,st.surname,st.prename,st.id; "}; + var tbldata = req.reqdata('POST','sqlite/query',xq,null); + var ntbldata = ''; + for (var i in tbldata.sqldata){ + + var row=''; + row += ''; + row += ''+tbldata.sqldata[i].surname+' '+tbldata.sqldata[i].prename+''; + row += ''; + row += ''; + row +=''; + ntbldata += row; + } + document.getElementById("table_trackincomplete_tbody").innerHTML=ntbldata; + }, + deleteRow: function(table,id){ + + var xq = {"type":"exec","sql":"delete from "+ table+" WHERE id='"+ id +"';"}; + var ret = req.reqdata('POST','sqlite/exec',xq,null); + if (ret){ + admin.loadpage(admin.lastpage); + } + }, + addRow: function(){ + + }, + export_data: function(){ + + }, + save_config: function(){ + + }, + changeData: function(field){ + var dbfield = field.id.split("_"); + + var where=[]; + for (var i in admin.currentrowdata){ + where.push( i + "='" +admin.currentrowdata[i] + "'"); + } + var sql = ""; + var value= "'" + field.value + "'"; + if (field.type == "date"){ + value= "date('"+ field.value+"')"; + } else if (field.type == "number"){ + value= field.value; + } else if (field.type == "checkbox"){ + if (field.checked == true){ + value= "'1'"; + } else { + value= "null"; + } + + } + if (field.value == ''){ + value = "null"; + } + if (where.length > 0 ){ + sql = "UPDATE " + dbfield[0] +" SET " + dbfield[1] + "=" + value + " WHERE "+ where.join(" AND ") +";"; + } else { + sql = "INSERT INTO " + dbfield[0] + " (" + dbfield[1] + ") VALUES (" + value + ");"; + } + console.log(sql); + var xu = {"type":"exec","sql":sql}; + var tbldata = req.reqdata('POST','sqlite/query',xu,req.asyncNoEvent); + //console.log(field.type); + //console.log(field.id + " " + field.tagName + " " + field.type); + + }, + + load_select_staff: function(selected){ + document.getElementById("select_staff").innerHTML=''; + var xq = {"type":"querysorted","sql":"select id,prename,surname from staff order by surname,prename,id"}; + var cmbdata = req.reqdata('POST','sqlite/query',xq,null); + var tcmbdata = ''; + for (var i in cmbdata.sqldata){ + tcmbdata += ''; + } + document.getElementById("select_staff").innerHTML=tcmbdata; + }, + setRowEditable: function(row){ + //console.log("set Editable!"); + if (row == admin.lastrow){ + return false; + } + if (admin.lastrow != null){ + var lins = admin.lastrow.getElementsByTagName('input'); + for (var z=0;z < lins.length; z++){ + //console.log("YUppi " + z); + document.getElementById(lins[z].id).setAttribute('disabled',true); + } + } + admin.currentrowdata = row.dataset; + var ins = row.getElementsByTagName('input'); + for (var z=0;z < ins.length; z++){ + //console.log("Yeah " + z); + if (document.getElementById(ins[z].id).getAttribute('readonly') == null){ + document.getElementById(ins[z].id).removeAttribute('disabled'); + } + + } + + ////console.log(row.dataset); + admin.lastrow = row; + return true; + } + } +window.onload = function() { + //console.log('window - onload'); + admin.lastpage = 'page_track'; + admin.loadpage('page_track'); + var cdate = new Date(); + //console.log(cdate.toISOString().substring(0,10)); + document.getElementById("cmb_trackdate").value = cdate.toISOString().substring(0,10); + document.getElementById("cmb_trackmonth").value = cdate.toISOString().substring(0,7); + admin.load_select_staff(null); + var nav = navigator.userAgent + + /*if (nav.indexOf("Chrome/65") == -1){ + location.href='/supported.html'; + }*/s +};s \ No newline at end of file diff --git a/htdocs/js/database.js b/htdocs/js/database.js new file mode 100644 index 0000000..5b8a697 --- /dev/null +++ b/htdocs/js/database.js @@ -0,0 +1,71 @@ +var appdb = { + dbfile: null, + url: null, + dbquery: function(sQuery){ + var type='querysorted'; + var result= {sqldata:[]}; + //console.log(this.url + 'db=' + this.dbfile + '&type=' + type + '&sql=' +encodeURIComponent(sQuery)); + //dump(this.url + 'db=' + this.dbfile + '&type=' + type + '&sql=' +encodeURIComponent(sQuery) + "\n"); + $.ajax({ + encoding:"UTF-8", + method: "POST", + url:this.url + '/query', + data: 'db=' + this.dbfile + '&type=' + type + '&sql=' +encodeURIComponent(sQuery), + crossDomain: true, + success: function (data){ + //dump(data + "\n"); + result=data.result; + }, + error: function(data){ + alert("Error:" + JSON.stringify(data)); + console.log("Error:" + JSON.stringify(data)); + }, + async:false + }); + return result; + }, + dbqueryarray: function(sQuery){ + var type='queryarray'; + var result= {sqldata:[]}; + //console.log(this.url + 'db=' + this.dbfile + '&type=' + type + '&sql=' +encodeURIComponent(sQuery)); + //alert(this.url + 'db=' + this.dbfile + '&type=' + type + '&sql=' +encodeURIComponent(sQuery) + "\n"); + $.ajax({ + encoding:"UTF-8", + method: "POST", + url:this.url + '/query', + data: 'db=' + this.dbfile + '&type=' + type + '&sql=' +encodeURIComponent(sQuery), + crossDomain: true, + success: function (data){ + result=data.result; + }, + error: function(data){ + alert("Error:" + JSON.stringify(data)); + console.log("Error:" + JSON.stringify(data)); + }, + async:false + }); + return result; + }, + dbexec: function(sQuery){ + var type='exec'; + var result= {sqldata:[]}; + //dump(this.url + 'db=' + this.dbfile + '&type=' + type + '&sql=' +encodeURIComponent(sQuery) + "\n"); + //console.log(this.url + '&db=' + this.dbfile + '&type=' + type + '&sql=' +encodeURIComponent(sQuery) ); + $.ajax({ + encoding:"UTF-8", + method: "POST", + url:this.url + '/exec', + data: 'db=' + this.dbfile + '&type=' + type + '&sql=' +encodeURIComponent(sQuery), + crossDomain: true, + success: function (data){ + result=data.result; + }, + error: function(data){ + alert("Error:" + JSON.stringify(data)); + console.log("Error:" + JSON.stringify(data)); + }, + async:false + }); + return result; + } +} \ No newline at end of file diff --git a/htdocs/js/fieldsave.js b/htdocs/js/fieldsave.js new file mode 100755 index 0000000..bf317a0 --- /dev/null +++ b/htdocs/js/fieldsave.js @@ -0,0 +1,48 @@ +var fsaveelements = document.querySelectorAll("input.fieldsave"); +for (var i = 0; i < fsaveelements.length; i++) { + fsaveelements[i].addEventListener('blur', function (event) { + savefield(event.currentTarget.id); + }, false); +} + +function savefield(obj){ + // console.log("save"); + var field = {"ident":obj.id}; + //var obj = document.getElementById(objid); + var fieldname = obj.getAttribute('name'); + var xsp = fieldname.split("_"); + // console.log(xsp); + // console.log(xsp[0] + "_id"); + var identfield = document.getElementById("id"); + field["ident_" + xsp[0] + "_id"] = identfield.value; + if (obj.tagName == 'TEXTAREA'){ + field[obj.getAttribute('name')] = obj.innerHTML; + } else if (obj.tagName == "SELECT"){ + field[obj.getAttribute('name')] = obj.value; + } else if ((obj.getAttribute('type') == "checkbox")){ + if ($("#" +objid).prop('checked')){ + field[obj.getAttribute('name')] = obj.value; + } else { + field[obj.getAttribute('name')] = ""; + } + + } else if (obj.getAttribute('type') == "file") { + if (obj.value != ""){ + alert("file save TODO!") + return false; + } + } else { + field[obj.getAttribute('name')] = obj.value; + } + + field["fn"] = "savefield"; + // console.log(field); + + req.reqdata("POST","index.cgi",field,fieldsaved); + return false; +} + +function fieldsaved(data){ + console.log("field saved"); + // console.log(data); +} \ No newline at end of file diff --git a/htdocs/js/formsave.js b/htdocs/js/formsave.js new file mode 100755 index 0000000..7229ed6 --- /dev/null +++ b/htdocs/js/formsave.js @@ -0,0 +1,55 @@ +function saveform(frmid,aftercallback=null){ + // console.log("ID:" + frmid); + var frm = document.getElementById("frm_" + frmid); + //console.log(frm); + var flds={"fn":"saveform"}; + for (var i = 0; i < frm.elements.length; i++) { + var field = frm.elements[i]; + //console.log(field.id + "=>" + field.name + "=>" + field.tagName + "=>"+ field.classList); + if (field.tagName == "INPUT" || field.tagName == "SELECT" || field.tagName == "TEXTAREA"){ + if (field.classList.contains("tagedit")){ + var ndata = field.value.split(","); + flds[field.getAttribute("name")] = ndata; + }else if (field.tagName == "TEXTAREA" ){ + if (field.classList.contains("richeditarea")){ + flds[field.getAttribute("name")] = tinymce.get(field.id).getContent(); + } else { + flds[field.getAttribute("name")] = field.innerHTML; + } + + } + else { + flds[field.getAttribute("name")] = field.value; + } + + } + // console.log(field); + } + //console.log(flds); + + //console.log("aftercallback:" + aftercallback); + if (aftercallback){ + req.reqdata("POST","index.cgi",flds,aftercallback); + formsaved({}); + } + else { + req.reqdata("POST","index.cgi",flds,formsaved); + } + return false; +} + +function formsaved(data){ + var sb = document.getElementById("snackbar"); + sb.className="show w3-green"; + sb.innerHTML = 'Donnéen goufen gespaichert!'; + setTimeout(function(){ sb.className = sb.className.replace("show w3-green", ""); }, 3000); + return false; +} + +function showsnackbar(xclass,xmessage){ + var sb = document.getElementById("snackbar"); + sb.className="show " + xclass; + sb.innerHTML = xmessage; + setTimeout(function(){ sb.className = sb.className.replace(sb.className, ""); }, 3000); + return false; +} \ No newline at end of file diff --git a/htdocs/js/jquery-3.2.1.min.js b/htdocs/js/jquery-3.2.1.min.js new file mode 100644 index 0000000..644d35e --- /dev/null +++ b/htdocs/js/jquery-3.2.1.min.js @@ -0,0 +1,4 @@ +/*! jQuery v3.2.1 | (c) JS Foundation and other contributors | jquery.org/license */ +!function(a,b){"use strict";"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){"use strict";var c=[],d=a.document,e=Object.getPrototypeOf,f=c.slice,g=c.concat,h=c.push,i=c.indexOf,j={},k=j.toString,l=j.hasOwnProperty,m=l.toString,n=m.call(Object),o={};function p(a,b){b=b||d;var c=b.createElement("script");c.text=a,b.head.appendChild(c).parentNode.removeChild(c)}var q="3.2.1",r=function(a,b){return new r.fn.init(a,b)},s=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,t=/^-ms-/,u=/-([a-z])/g,v=function(a,b){return b.toUpperCase()};r.fn=r.prototype={jquery:q,constructor:r,length:0,toArray:function(){return f.call(this)},get:function(a){return null==a?f.call(this):a<0?this[a+this.length]:this[a]},pushStack:function(a){var b=r.merge(this.constructor(),a);return b.prevObject=this,b},each:function(a){return r.each(this,a)},map:function(a){return this.pushStack(r.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(f.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(a<0?b:0);return this.pushStack(c>=0&&c0&&b-1 in a)}var x=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=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C={}.hasOwnProperty,D=[],E=D.pop,F=D.push,G=D.push,H=D.slice,I=function(a,b){for(var c=0,d=a.length;c+~]|"+K+")"+K+"*"),S=new RegExp("="+K+"*([^\\]'\"]*?)"+K+"*\\]","g"),T=new RegExp(N),U=new RegExp("^"+L+"$"),V={ID:new RegExp("^#("+L+")"),CLASS:new RegExp("^\\.("+L+")"),TAG:new RegExp("^("+L+"|[*])"),ATTR:new RegExp("^"+M),PSEUDO:new RegExp("^"+N),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+K+"*(even|odd|(([+-]|)(\\d*)n|)"+K+"*(?:([+-]|)"+K+"*(\\d+)|))"+K+"*\\)|)","i"),bool:new RegExp("^(?:"+J+")$","i"),needsContext:new RegExp("^"+K+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+K+"*((?:-\\d)?\\d*)"+K+"*\\)|)(?=[^-]|$)","i")},W=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Y=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,$=/[+~]/,_=new RegExp("\\\\([\\da-f]{1,6}"+K+"?|("+K+")|.)","ig"),aa=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:d<0?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ba=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ca=function(a,b){return b?"\0"===a?"\ufffd":a.slice(0,-1)+"\\"+a.charCodeAt(a.length-1).toString(16)+" ":"\\"+a},da=function(){m()},ea=ta(function(a){return a.disabled===!0&&("form"in a||"label"in a)},{dir:"parentNode",next:"legend"});try{G.apply(D=H.call(v.childNodes),v.childNodes),D[v.childNodes.length].nodeType}catch(fa){G={apply:D.length?function(a,b){F.apply(a,H.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s=b&&b.ownerDocument,w=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==w&&9!==w&&11!==w)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==w&&(l=Z.exec(a)))if(f=l[1]){if(9===w){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(s&&(j=s.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(l[2])return G.apply(d,b.getElementsByTagName(a)),d;if((f=l[3])&&c.getElementsByClassName&&b.getElementsByClassName)return G.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==w)s=b,r=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(ba,ca):b.setAttribute("id",k=u),o=g(a),h=o.length;while(h--)o[h]="#"+k+" "+sa(o[h]);r=o.join(","),s=$.test(a)&&qa(b.parentNode)||b}if(r)try{return G.apply(d,s.querySelectorAll(r)),d}catch(x){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(P,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("fieldset");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&a.sourceIndex-b.sourceIndex;if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return function(b){return"form"in b?b.parentNode&&b.disabled===!1?"label"in b?"label"in b.parentNode?b.parentNode.disabled===a:b.disabled===a:b.isDisabled===a||b.isDisabled!==!a&&ea(b)===a:b.disabled===a:"label"in b&&b.disabled===a}}function pa(a){return ia(function(b){return b=+b,ia(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 qa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return!!b&&"HTML"!==b.nodeName},m=ga.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),v!==n&&(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Y.test(n.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){return a.getAttribute("id")===b}},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(_,aa);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c,d,e,f=b.getElementById(a);if(f){if(c=f.getAttributeNode("id"),c&&c.value===a)return[f];e=b.getElementsByName(a),d=0;while(f=e[d++])if(c=f.getAttributeNode("id"),c&&c.value===a)return[f]}return[]}}),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){if("undefined"!=typeof b.getElementsByClassName&&p)return b.getElementsByClassName(a)},r=[],q=[],(c.qsa=Y.test(n.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+K+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+K+"*(?:value|"+J+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){a.innerHTML="";var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+K+"*[*^$|!~]?="),2!==a.querySelectorAll(":enabled").length&&q.push(":enabled",":disabled"),o.appendChild(a).disabled=!0,2!==a.querySelectorAll(":disabled").length&&q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Y.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"*"),s.call(a,"[s!='']:x"),r.push("!=",N)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Y.test(o.compareDocumentPosition),t=b||Y.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?I(k,a)-I(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?I(k,a)-I(k,b):0;if(e===f)return la(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?la(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(S,"='$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 ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&C.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},ga.escape=function(a){return(a+"").replace(ba,ca)},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.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=ga.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=ga.selectors={cacheLength:50,createPseudo:ia,match:V,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(_,aa),a[3]=(a[3]||a[4]||a[5]||"").replace(_,aa),"~="===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]||ga.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]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return V.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&T.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(_,aa).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("(^|"+K+")"+a+"("+K+"|$)"))&&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=ga.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(O," ")+" ").indexOf(c)>-1:"|="===b&&(e===c||e.slice(0,c.length+1)===c+"-"))}},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()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=I(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(P,"$1"));return d[u]?ia(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:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(_,aa),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return U.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(_,aa).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:oa(!1),disabled:oa(!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 X.test(a.nodeName)},input:function(a){return W.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:pa(function(){return[0]}),last:pa(function(a,b){return[b-1]}),eq:pa(function(a,b,c){return[c<0?c+b:c]}),even:pa(function(a,b){for(var c=0;c=0;)a.push(d);return a}),gt:pa(function(a,b,c){for(var d=c<0?c+b:c;++d1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function va(a,b,c){for(var d=0,e=b.length;d-1&&(f[j]=!(g[j]=l))}}else r=wa(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):G.apply(g,r)})}function ya(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ta(function(a){return a===b},h,!0),l=ta(function(a){return I(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}];i1&&ua(m),i>1&&sa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(P,"$1"),c,i0,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]=E.call(i));u=wa(u)}G.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&ga.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=ya(b[c]),f[u]?d.push(f):e.push(f);f=A(a,za(e,d)),f.selector=a}return f},i=ga.select=function(a,b,c,e){var f,i,j,k,l,m="function"==typeof a&&a,n=!e&&g(a=m.selector||a);if(c=c||[],1===n.length){if(i=n[0]=n[0].slice(0),i.length>2&&"ID"===(j=i[0]).type&&9===b.nodeType&&p&&d.relative[i[1].type]){if(b=(d.find.ID(j.matches[0].replace(_,aa),b)||[])[0],!b)return c;m&&(b=b.parentNode),a=a.slice(i.shift().value.length)}f=V.needsContext.test(a)?0:i.length;while(f--){if(j=i[f],d.relative[k=j.type])break;if((l=d.find[k])&&(e=l(j.matches[0].replace(_,aa),$.test(i[0].type)&&qa(b.parentNode)||b))){if(i.splice(f,1),a=e.length&&sa(i),!a)return G.apply(c,e),c;break}}}return(m||h(a,n))(e,b,!p,c,!b||$.test(a)&&qa(b.parentNode)||b),c},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("fieldset"))}),ja(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){if(!c)return a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){if(!c&&"input"===a.nodeName.toLowerCase())return a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(J,function(a,b,c){var d;if(!c)return a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);r.find=x,r.expr=x.selectors,r.expr[":"]=r.expr.pseudos,r.uniqueSort=r.unique=x.uniqueSort,r.text=x.getText,r.isXMLDoc=x.isXML,r.contains=x.contains,r.escapeSelector=x.escape;var y=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&r(a).is(c))break;d.push(a)}return d},z=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},A=r.expr.match.needsContext;function B(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()}var C=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i,D=/^.[^:#\[\.,]*$/;function E(a,b,c){return r.isFunction(b)?r.grep(a,function(a,d){return!!b.call(a,d,a)!==c}):b.nodeType?r.grep(a,function(a){return a===b!==c}):"string"!=typeof b?r.grep(a,function(a){return i.call(b,a)>-1!==c}):D.test(b)?r.filter(b,a,c):(b=r.filter(b,a),r.grep(a,function(a){return i.call(b,a)>-1!==c&&1===a.nodeType}))}r.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?r.find.matchesSelector(d,a)?[d]:[]:r.find.matches(a,r.grep(b,function(a){return 1===a.nodeType}))},r.fn.extend({find:function(a){var b,c,d=this.length,e=this;if("string"!=typeof a)return this.pushStack(r(a).filter(function(){for(b=0;b1?r.uniqueSort(c):c},filter:function(a){return this.pushStack(E(this,a||[],!1))},not:function(a){return this.pushStack(E(this,a||[],!0))},is:function(a){return!!E(this,"string"==typeof a&&A.test(a)?r(a):a||[],!1).length}});var F,G=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,H=r.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||F,"string"==typeof a){if(e="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:G.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 r?b[0]:b,r.merge(this,r.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),C.test(e[1])&&r.isPlainObject(b))for(e in b)r.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}return f=d.getElementById(e[2]),f&&(this[0]=f,this.length=1),this}return a.nodeType?(this[0]=a,this.length=1,this):r.isFunction(a)?void 0!==c.ready?c.ready(a):a(r):r.makeArray(a,this)};H.prototype=r.fn,F=r(d);var I=/^(?:parents|prev(?:Until|All))/,J={children:!0,contents:!0,next:!0,prev:!0};r.fn.extend({has:function(a){var b=r(a,this),c=b.length;return this.filter(function(){for(var a=0;a-1:1===c.nodeType&&r.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?r.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?i.call(r(a),this[0]):i.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(r.uniqueSort(r.merge(this.get(),r(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function K(a,b){while((a=a[b])&&1!==a.nodeType);return a}r.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return y(a,"parentNode")},parentsUntil:function(a,b,c){return y(a,"parentNode",c)},next:function(a){return K(a,"nextSibling")},prev:function(a){return K(a,"previousSibling")},nextAll:function(a){return y(a,"nextSibling")},prevAll:function(a){return y(a,"previousSibling")},nextUntil:function(a,b,c){return y(a,"nextSibling",c)},prevUntil:function(a,b,c){return y(a,"previousSibling",c)},siblings:function(a){return z((a.parentNode||{}).firstChild,a)},children:function(a){return z(a.firstChild)},contents:function(a){return B(a,"iframe")?a.contentDocument:(B(a,"template")&&(a=a.content||a),r.merge([],a.childNodes))}},function(a,b){r.fn[a]=function(c,d){var e=r.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=r.filter(d,e)),this.length>1&&(J[a]||r.uniqueSort(e),I.test(a)&&e.reverse()),this.pushStack(e)}});var L=/[^\x20\t\r\n\f]+/g;function M(a){var b={};return r.each(a.match(L)||[],function(a,c){b[c]=!0}),b}r.Callbacks=function(a){a="string"==typeof a?M(a):r.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=e||a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h-1)f.splice(c,1),c<=h&&h--}),this},has:function(a){return a?r.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=g=[],c||b||(f=c=""),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};function N(a){return a}function O(a){throw a}function P(a,b,c,d){var e;try{a&&r.isFunction(e=a.promise)?e.call(a).done(b).fail(c):a&&r.isFunction(e=a.then)?e.call(a,b,c):b.apply(void 0,[a].slice(d))}catch(a){c.apply(void 0,[a])}}r.extend({Deferred:function(b){var c=[["notify","progress",r.Callbacks("memory"),r.Callbacks("memory"),2],["resolve","done",r.Callbacks("once memory"),r.Callbacks("once memory"),0,"resolved"],["reject","fail",r.Callbacks("once memory"),r.Callbacks("once memory"),1,"rejected"]],d="pending",e={state:function(){return d},always:function(){return f.done(arguments).fail(arguments),this},"catch":function(a){return e.then(null,a)},pipe:function(){var a=arguments;return r.Deferred(function(b){r.each(c,function(c,d){var e=r.isFunction(a[d[4]])&&a[d[4]];f[d[1]](function(){var a=e&&e.apply(this,arguments);a&&r.isFunction(a.promise)?a.promise().progress(b.notify).done(b.resolve).fail(b.reject):b[d[0]+"With"](this,e?[a]:arguments)})}),a=null}).promise()},then:function(b,d,e){var f=0;function g(b,c,d,e){return function(){var h=this,i=arguments,j=function(){var a,j;if(!(b=f&&(d!==O&&(h=void 0,i=[a]),c.rejectWith(h,i))}};b?k():(r.Deferred.getStackHook&&(k.stackTrace=r.Deferred.getStackHook()),a.setTimeout(k))}}return r.Deferred(function(a){c[0][3].add(g(0,a,r.isFunction(e)?e:N,a.notifyWith)),c[1][3].add(g(0,a,r.isFunction(b)?b:N)),c[2][3].add(g(0,a,r.isFunction(d)?d:O))}).promise()},promise:function(a){return null!=a?r.extend(a,e):e}},f={};return r.each(c,function(a,b){var g=b[2],h=b[5];e[b[1]]=g.add,h&&g.add(function(){d=h},c[3-a][2].disable,c[0][2].lock),g.add(b[3].fire),f[b[0]]=function(){return f[b[0]+"With"](this===f?void 0:this,arguments),this},f[b[0]+"With"]=g.fireWith}),e.promise(f),b&&b.call(f,f),f},when:function(a){var b=arguments.length,c=b,d=Array(c),e=f.call(arguments),g=r.Deferred(),h=function(a){return function(c){d[a]=this,e[a]=arguments.length>1?f.call(arguments):c,--b||g.resolveWith(d,e)}};if(b<=1&&(P(a,g.done(h(c)).resolve,g.reject,!b),"pending"===g.state()||r.isFunction(e[c]&&e[c].then)))return g.then();while(c--)P(e[c],h(c),g.reject);return g.promise()}});var Q=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;r.Deferred.exceptionHook=function(b,c){a.console&&a.console.warn&&b&&Q.test(b.name)&&a.console.warn("jQuery.Deferred exception: "+b.message,b.stack,c)},r.readyException=function(b){a.setTimeout(function(){throw b})};var R=r.Deferred();r.fn.ready=function(a){return R.then(a)["catch"](function(a){r.readyException(a)}),this},r.extend({isReady:!1,readyWait:1,ready:function(a){(a===!0?--r.readyWait:r.isReady)||(r.isReady=!0,a!==!0&&--r.readyWait>0||R.resolveWith(d,[r]))}}),r.ready.then=R.then;function S(){d.removeEventListener("DOMContentLoaded",S), +a.removeEventListener("load",S),r.ready()}"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll?a.setTimeout(r.ready):(d.addEventListener("DOMContentLoaded",S),a.addEventListener("load",S));var T=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===r.type(c)){e=!0;for(h in c)T(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,r.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(r(a),c)})),b))for(;h1,null,!0)},removeData:function(a){return this.each(function(){X.remove(this,a)})}}),r.extend({queue:function(a,b,c){var d;if(a)return b=(b||"fx")+"queue",d=W.get(a,b),c&&(!d||Array.isArray(c)?d=W.access(a,b,r.makeArray(c)):d.push(c)),d||[]},dequeue:function(a,b){b=b||"fx";var c=r.queue(a,b),d=c.length,e=c.shift(),f=r._queueHooks(a,b),g=function(){r.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 W.get(a,c)||W.access(a,c,{empty:r.Callbacks("once memory").add(function(){W.remove(a,[b+"queue",c])})})}}),r.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length\x20\t\r\n\f]+)/i,la=/^$|\/(?:java|ecma)script/i,ma={option:[1,""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};ma.optgroup=ma.option,ma.tbody=ma.tfoot=ma.colgroup=ma.caption=ma.thead,ma.th=ma.td;function na(a,b){var c;return c="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):[],void 0===b||b&&B(a,b)?r.merge([a],c):c}function oa(a,b){for(var c=0,d=a.length;c-1)e&&e.push(f);else if(j=r.contains(f.ownerDocument,f),g=na(l.appendChild(f),"script"),j&&oa(g),c){k=0;while(f=g[k++])la.test(f.type||"")&&c.push(f)}return l}!function(){var a=d.createDocumentFragment(),b=a.appendChild(d.createElement("div")),c=d.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),o.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="",o.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var ra=d.documentElement,sa=/^key/,ta=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,ua=/^([^.]*)(?:\.(.+)|)/;function va(){return!0}function wa(){return!1}function xa(){try{return d.activeElement}catch(a){}}function ya(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)ya(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=wa;else if(!e)return a;return 1===f&&(g=e,e=function(a){return r().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=r.guid++)),a.each(function(){r.event.add(this,b,e,d,c)})}r.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=W.get(a);if(q){c.handler&&(f=c,c=f.handler,e=f.selector),e&&r.find.matchesSelector(ra,e),c.guid||(c.guid=r.guid++),(i=q.events)||(i=q.events={}),(g=q.handle)||(g=q.handle=function(b){return"undefined"!=typeof r&&r.event.triggered!==b.type?r.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(L)||[""],j=b.length;while(j--)h=ua.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n&&(l=r.event.special[n]||{},n=(e?l.delegateType:l.bindType)||n,l=r.event.special[n]||{},k=r.extend({type:n,origType:p,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&r.expr.match.needsContext.test(e),namespace:o.join(".")},f),(m=i[n])||(m=i[n]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,o,g)!==!1||a.addEventListener&&a.addEventListener(n,g)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),r.event.global[n]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=W.hasData(a)&&W.get(a);if(q&&(i=q.events)){b=(b||"").match(L)||[""],j=b.length;while(j--)if(h=ua.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n){l=r.event.special[n]||{},n=(d?l.delegateType:l.bindType)||n,m=i[n]||[],h=h[2]&&new RegExp("(^|\\.)"+o.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&p!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,o,q.handle)!==!1||r.removeEvent(a,n,q.handle),delete i[n])}else for(n in i)r.event.remove(a,n+b[j],c,d,!0);r.isEmptyObject(i)&&W.remove(a,"handle events")}},dispatch:function(a){var b=r.event.fix(a),c,d,e,f,g,h,i=new Array(arguments.length),j=(W.get(this,"events")||{})[b.type]||[],k=r.event.special[b.type]||{};for(i[0]=b,c=1;c=1))for(;j!==this;j=j.parentNode||this)if(1===j.nodeType&&("click"!==a.type||j.disabled!==!0)){for(f=[],g={},c=0;c-1:r.find(e,this,null,[j]).length),g[e]&&f.push(d);f.length&&h.push({elem:j,handlers:f})}return j=this,i\x20\t\r\n\f]*)[^>]*)\/>/gi,Aa=/\s*$/g;function Ea(a,b){return B(a,"table")&&B(11!==b.nodeType?b:b.firstChild,"tr")?r(">tbody",a)[0]||a:a}function Fa(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function Ga(a){var b=Ca.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Ha(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(W.hasData(a)&&(f=W.access(a),g=W.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;c1&&"string"==typeof q&&!o.checkClone&&Ba.test(q))return a.each(function(e){var f=a.eq(e);s&&(b[0]=q.call(this,e,f.html())),Ja(f,b,c,d)});if(m&&(e=qa(b,a[0].ownerDocument,!1,a,d),f=e.firstChild,1===e.childNodes.length&&(e=f),f||d)){for(h=r.map(na(e,"script"),Fa),i=h.length;l")},clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=r.contains(a.ownerDocument,a);if(!(o.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||r.isXMLDoc(a)))for(g=na(h),f=na(a),d=0,e=f.length;d0&&oa(g,!i&&na(a,"script")),h},cleanData:function(a){for(var b,c,d,e=r.event.special,f=0;void 0!==(c=a[f]);f++)if(U(c)){if(b=c[W.expando]){if(b.events)for(d in b.events)e[d]?r.event.remove(c,d):r.removeEvent(c,d,b.handle);c[W.expando]=void 0}c[X.expando]&&(c[X.expando]=void 0)}}}),r.fn.extend({detach:function(a){return Ka(this,a,!0)},remove:function(a){return Ka(this,a)},text:function(a){return T(this,function(a){return void 0===a?r.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=a)})},null,a,arguments.length)},append:function(){return Ja(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ea(this,a);b.appendChild(a)}})},prepend:function(){return Ja(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ea(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return Ja(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return Ja(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&&(r.cleanData(na(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null!=a&&a,b=null==b?a:b,this.map(function(){return r.clone(this,a,b)})},html:function(a){return T(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!Aa.test(a)&&!ma[(ka.exec(a)||["",""])[1].toLowerCase()]){a=r.htmlPrefilter(a);try{for(;c1)}});function _a(a,b,c,d,e){return new _a.prototype.init(a,b,c,d,e)}r.Tween=_a,_a.prototype={constructor:_a,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||r.easing._default,this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(r.cssNumber[c]?"":"px")},cur:function(){var a=_a.propHooks[this.prop];return a&&a.get?a.get(this):_a.propHooks._default.get(this)},run:function(a){var b,c=_a.propHooks[this.prop];return this.options.duration?this.pos=b=r.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):_a.propHooks._default.set(this),this}},_a.prototype.init.prototype=_a.prototype,_a.propHooks={_default:{get:function(a){var b;return 1!==a.elem.nodeType||null!=a.elem[a.prop]&&null==a.elem.style[a.prop]?a.elem[a.prop]:(b=r.css(a.elem,a.prop,""),b&&"auto"!==b?b:0)},set:function(a){r.fx.step[a.prop]?r.fx.step[a.prop](a):1!==a.elem.nodeType||null==a.elem.style[r.cssProps[a.prop]]&&!r.cssHooks[a.prop]?a.elem[a.prop]=a.now:r.style(a.elem,a.prop,a.now+a.unit)}}},_a.propHooks.scrollTop=_a.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},r.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2},_default:"swing"},r.fx=_a.prototype.init,r.fx.step={};var ab,bb,cb=/^(?:toggle|show|hide)$/,db=/queueHooks$/;function eb(){bb&&(d.hidden===!1&&a.requestAnimationFrame?a.requestAnimationFrame(eb):a.setTimeout(eb,r.fx.interval),r.fx.tick())}function fb(){return a.setTimeout(function(){ab=void 0}),ab=r.now()}function gb(a,b){var c,d=0,e={height:a};for(b=b?1:0;d<4;d+=2-b)c=ca[d],e["margin"+c]=e["padding"+c]=a;return b&&(e.opacity=e.width=a),e}function hb(a,b,c){for(var d,e=(kb.tweeners[b]||[]).concat(kb.tweeners["*"]),f=0,g=e.length;f1)},removeAttr:function(a){return this.each(function(){r.removeAttr(this,a)})}}),r.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return"undefined"==typeof a.getAttribute?r.prop(a,b,c):(1===f&&r.isXMLDoc(a)||(e=r.attrHooks[b.toLowerCase()]||(r.expr.match.bool.test(b)?lb:void 0)),void 0!==c?null===c?void r.removeAttr(a,b):e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:(a.setAttribute(b,c+""),c):e&&"get"in e&&null!==(d=e.get(a,b))?d:(d=r.find.attr(a,b), +null==d?void 0:d))},attrHooks:{type:{set:function(a,b){if(!o.radioValue&&"radio"===b&&B(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}},removeAttr:function(a,b){var c,d=0,e=b&&b.match(L);if(e&&1===a.nodeType)while(c=e[d++])a.removeAttribute(c)}}),lb={set:function(a,b,c){return b===!1?r.removeAttr(a,c):a.setAttribute(c,c),c}},r.each(r.expr.match.bool.source.match(/\w+/g),function(a,b){var c=mb[b]||r.find.attr;mb[b]=function(a,b,d){var e,f,g=b.toLowerCase();return d||(f=mb[g],mb[g]=e,e=null!=c(a,b,d)?g:null,mb[g]=f),e}});var nb=/^(?:input|select|textarea|button)$/i,ob=/^(?:a|area)$/i;r.fn.extend({prop:function(a,b){return T(this,r.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[r.propFix[a]||a]})}}),r.extend({prop:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return 1===f&&r.isXMLDoc(a)||(b=r.propFix[b]||b,e=r.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=r.find.attr(a,"tabindex");return b?parseInt(b,10):nb.test(a.nodeName)||ob.test(a.nodeName)&&a.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),o.optSelected||(r.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null},set:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}}),r.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){r.propFix[this.toLowerCase()]=this});function pb(a){var b=a.match(L)||[];return b.join(" ")}function qb(a){return a.getAttribute&&a.getAttribute("class")||""}r.fn.extend({addClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).addClass(a.call(this,b,qb(this)))});if("string"==typeof a&&a){b=a.match(L)||[];while(c=this[i++])if(e=qb(c),d=1===c.nodeType&&" "+pb(e)+" "){g=0;while(f=b[g++])d.indexOf(" "+f+" ")<0&&(d+=f+" ");h=pb(d),e!==h&&c.setAttribute("class",h)}}return this},removeClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).removeClass(a.call(this,b,qb(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof a&&a){b=a.match(L)||[];while(c=this[i++])if(e=qb(c),d=1===c.nodeType&&" "+pb(e)+" "){g=0;while(f=b[g++])while(d.indexOf(" "+f+" ")>-1)d=d.replace(" "+f+" "," ");h=pb(d),e!==h&&c.setAttribute("class",h)}}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):r.isFunction(a)?this.each(function(c){r(this).toggleClass(a.call(this,c,qb(this),b),b)}):this.each(function(){var b,d,e,f;if("string"===c){d=0,e=r(this),f=a.match(L)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else void 0!==a&&"boolean"!==c||(b=qb(this),b&&W.set(this,"__className__",b),this.setAttribute&&this.setAttribute("class",b||a===!1?"":W.get(this,"__className__")||""))})},hasClass:function(a){var b,c,d=0;b=" "+a+" ";while(c=this[d++])if(1===c.nodeType&&(" "+pb(qb(c))+" ").indexOf(b)>-1)return!0;return!1}});var rb=/\r/g;r.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=r.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,r(this).val()):a,null==e?e="":"number"==typeof e?e+="":Array.isArray(e)&&(e=r.map(e,function(a){return null==a?"":a+""})),b=r.valHooks[this.type]||r.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=r.valHooks[e.type]||r.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(rb,""):null==c?"":c)}}}),r.extend({valHooks:{option:{get:function(a){var b=r.find.attr(a,"value");return null!=b?b:pb(r.text(a))}},select:{get:function(a){var b,c,d,e=a.options,f=a.selectedIndex,g="select-one"===a.type,h=g?null:[],i=g?f+1:e.length;for(d=f<0?i:g?f:0;d-1)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),r.each(["radio","checkbox"],function(){r.valHooks[this]={set:function(a,b){if(Array.isArray(b))return a.checked=r.inArray(r(a).val(),b)>-1}},o.checkOn||(r.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var sb=/^(?:focusinfocus|focusoutblur)$/;r.extend(r.event,{trigger:function(b,c,e,f){var g,h,i,j,k,m,n,o=[e||d],p=l.call(b,"type")?b.type:b,q=l.call(b,"namespace")?b.namespace.split("."):[];if(h=i=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!sb.test(p+r.event.triggered)&&(p.indexOf(".")>-1&&(q=p.split("."),p=q.shift(),q.sort()),k=p.indexOf(":")<0&&"on"+p,b=b[r.expando]?b:new r.Event(p,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=q.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:r.makeArray(c,[b]),n=r.event.special[p]||{},f||!n.trigger||n.trigger.apply(e,c)!==!1)){if(!f&&!n.noBubble&&!r.isWindow(e)){for(j=n.delegateType||p,sb.test(j+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),i=h;i===(e.ownerDocument||d)&&o.push(i.defaultView||i.parentWindow||a)}g=0;while((h=o[g++])&&!b.isPropagationStopped())b.type=g>1?j:n.bindType||p,m=(W.get(h,"events")||{})[b.type]&&W.get(h,"handle"),m&&m.apply(h,c),m=k&&h[k],m&&m.apply&&U(h)&&(b.result=m.apply(h,c),b.result===!1&&b.preventDefault());return b.type=p,f||b.isDefaultPrevented()||n._default&&n._default.apply(o.pop(),c)!==!1||!U(e)||k&&r.isFunction(e[p])&&!r.isWindow(e)&&(i=e[k],i&&(e[k]=null),r.event.triggered=p,e[p](),r.event.triggered=void 0,i&&(e[k]=i)),b.result}},simulate:function(a,b,c){var d=r.extend(new r.Event,c,{type:a,isSimulated:!0});r.event.trigger(d,null,b)}}),r.fn.extend({trigger:function(a,b){return this.each(function(){r.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];if(c)return r.event.trigger(a,b,c,!0)}}),r.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(a,b){r.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),r.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),o.focusin="onfocusin"in a,o.focusin||r.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){r.event.simulate(b,a.target,r.event.fix(a))};r.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=W.access(d,b);e||d.addEventListener(a,c,!0),W.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=W.access(d,b)-1;e?W.access(d,b,e):(d.removeEventListener(a,c,!0),W.remove(d,b))}}});var tb=a.location,ub=r.now(),vb=/\?/;r.parseXML=function(b){var c;if(!b||"string"!=typeof b)return null;try{c=(new a.DOMParser).parseFromString(b,"text/xml")}catch(d){c=void 0}return c&&!c.getElementsByTagName("parsererror").length||r.error("Invalid XML: "+b),c};var wb=/\[\]$/,xb=/\r?\n/g,yb=/^(?:submit|button|image|reset|file)$/i,zb=/^(?:input|select|textarea|keygen)/i;function Ab(a,b,c,d){var e;if(Array.isArray(b))r.each(b,function(b,e){c||wb.test(a)?d(a,e):Ab(a+"["+("object"==typeof e&&null!=e?b:"")+"]",e,c,d)});else if(c||"object"!==r.type(b))d(a,b);else for(e in b)Ab(a+"["+e+"]",b[e],c,d)}r.param=function(a,b){var c,d=[],e=function(a,b){var c=r.isFunction(b)?b():b;d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(null==c?"":c)};if(Array.isArray(a)||a.jquery&&!r.isPlainObject(a))r.each(a,function(){e(this.name,this.value)});else for(c in a)Ab(c,a[c],b,e);return d.join("&")},r.fn.extend({serialize:function(){return r.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=r.prop(this,"elements");return a?r.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!r(this).is(":disabled")&&zb.test(this.nodeName)&&!yb.test(a)&&(this.checked||!ja.test(a))}).map(function(a,b){var c=r(this).val();return null==c?null:Array.isArray(c)?r.map(c,function(a){return{name:b.name,value:a.replace(xb,"\r\n")}}):{name:b.name,value:c.replace(xb,"\r\n")}}).get()}});var Bb=/%20/g,Cb=/#.*$/,Db=/([?&])_=[^&]*/,Eb=/^(.*?):[ \t]*([^\r\n]*)$/gm,Fb=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Gb=/^(?:GET|HEAD)$/,Hb=/^\/\//,Ib={},Jb={},Kb="*/".concat("*"),Lb=d.createElement("a");Lb.href=tb.href;function Mb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(L)||[];if(r.isFunction(c))while(d=f[e++])"+"===d[0]?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Nb(a,b,c,d){var e={},f=a===Jb;function g(h){var i;return e[h]=!0,r.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Ob(a,b){var c,d,e=r.ajaxSettings.flatOptions||{};for(c in b)void 0!==b[c]&&((e[c]?a:d||(d={}))[c]=b[c]);return d&&r.extend(!0,a,d),a}function Pb(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===d&&(d=a.mimeType||b.getResponseHeader("Content-Type"));if(d)for(e in h)if(h[e]&&h[e].test(d)){i.unshift(e);break}if(i[0]in c)f=i[0];else{for(e in c){if(!i[0]||a.converters[e+" "+i[0]]){f=e;break}g||(g=e)}f=f||g}if(f)return f!==i[0]&&i.unshift(f),c[f]}function Qb(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}r.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:tb.href,type:"GET",isLocal:Fb.test(tb.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Kb,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":r.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Ob(Ob(a,r.ajaxSettings),b):Ob(r.ajaxSettings,a)},ajaxPrefilter:Mb(Ib),ajaxTransport:Mb(Jb),ajax:function(b,c){"object"==typeof b&&(c=b,b=void 0),c=c||{};var e,f,g,h,i,j,k,l,m,n,o=r.ajaxSetup({},c),p=o.context||o,q=o.context&&(p.nodeType||p.jquery)?r(p):r.event,s=r.Deferred(),t=r.Callbacks("once memory"),u=o.statusCode||{},v={},w={},x="canceled",y={readyState:0,getResponseHeader:function(a){var b;if(k){if(!h){h={};while(b=Eb.exec(g))h[b[1].toLowerCase()]=b[2]}b=h[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return k?g:null},setRequestHeader:function(a,b){return null==k&&(a=w[a.toLowerCase()]=w[a.toLowerCase()]||a,v[a]=b),this},overrideMimeType:function(a){return null==k&&(o.mimeType=a),this},statusCode:function(a){var b;if(a)if(k)y.always(a[y.status]);else for(b in a)u[b]=[u[b],a[b]];return this},abort:function(a){var b=a||x;return e&&e.abort(b),A(0,b),this}};if(s.promise(y),o.url=((b||o.url||tb.href)+"").replace(Hb,tb.protocol+"//"),o.type=c.method||c.type||o.method||o.type,o.dataTypes=(o.dataType||"*").toLowerCase().match(L)||[""],null==o.crossDomain){j=d.createElement("a");try{j.href=o.url,j.href=j.href,o.crossDomain=Lb.protocol+"//"+Lb.host!=j.protocol+"//"+j.host}catch(z){o.crossDomain=!0}}if(o.data&&o.processData&&"string"!=typeof o.data&&(o.data=r.param(o.data,o.traditional)),Nb(Ib,o,c,y),k)return y;l=r.event&&o.global,l&&0===r.active++&&r.event.trigger("ajaxStart"),o.type=o.type.toUpperCase(),o.hasContent=!Gb.test(o.type),f=o.url.replace(Cb,""),o.hasContent?o.data&&o.processData&&0===(o.contentType||"").indexOf("application/x-www-form-urlencoded")&&(o.data=o.data.replace(Bb,"+")):(n=o.url.slice(f.length),o.data&&(f+=(vb.test(f)?"&":"?")+o.data,delete o.data),o.cache===!1&&(f=f.replace(Db,"$1"),n=(vb.test(f)?"&":"?")+"_="+ub++ +n),o.url=f+n),o.ifModified&&(r.lastModified[f]&&y.setRequestHeader("If-Modified-Since",r.lastModified[f]),r.etag[f]&&y.setRequestHeader("If-None-Match",r.etag[f])),(o.data&&o.hasContent&&o.contentType!==!1||c.contentType)&&y.setRequestHeader("Content-Type",o.contentType),y.setRequestHeader("Accept",o.dataTypes[0]&&o.accepts[o.dataTypes[0]]?o.accepts[o.dataTypes[0]]+("*"!==o.dataTypes[0]?", "+Kb+"; q=0.01":""):o.accepts["*"]);for(m in o.headers)y.setRequestHeader(m,o.headers[m]);if(o.beforeSend&&(o.beforeSend.call(p,y,o)===!1||k))return y.abort();if(x="abort",t.add(o.complete),y.done(o.success),y.fail(o.error),e=Nb(Jb,o,c,y)){if(y.readyState=1,l&&q.trigger("ajaxSend",[y,o]),k)return y;o.async&&o.timeout>0&&(i=a.setTimeout(function(){y.abort("timeout")},o.timeout));try{k=!1,e.send(v,A)}catch(z){if(k)throw z;A(-1,z)}}else A(-1,"No Transport");function A(b,c,d,h){var j,m,n,v,w,x=c;k||(k=!0,i&&a.clearTimeout(i),e=void 0,g=h||"",y.readyState=b>0?4:0,j=b>=200&&b<300||304===b,d&&(v=Pb(o,y,d)),v=Qb(o,v,y,j),j?(o.ifModified&&(w=y.getResponseHeader("Last-Modified"),w&&(r.lastModified[f]=w),w=y.getResponseHeader("etag"),w&&(r.etag[f]=w)),204===b||"HEAD"===o.type?x="nocontent":304===b?x="notmodified":(x=v.state,m=v.data,n=v.error,j=!n)):(n=x,!b&&x||(x="error",b<0&&(b=0))),y.status=b,y.statusText=(c||x)+"",j?s.resolveWith(p,[m,x,y]):s.rejectWith(p,[y,x,n]),y.statusCode(u),u=void 0,l&&q.trigger(j?"ajaxSuccess":"ajaxError",[y,o,j?m:n]),t.fireWith(p,[y,x]),l&&(q.trigger("ajaxComplete",[y,o]),--r.active||r.event.trigger("ajaxStop")))}return y},getJSON:function(a,b,c){return r.get(a,b,c,"json")},getScript:function(a,b){return r.get(a,void 0,b,"script")}}),r.each(["get","post"],function(a,b){r[b]=function(a,c,d,e){return r.isFunction(c)&&(e=e||d,d=c,c=void 0),r.ajax(r.extend({url:a,type:b,dataType:e,data:c,success:d},r.isPlainObject(a)&&a))}}),r._evalUrl=function(a){return r.ajax({url:a,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},r.fn.extend({wrapAll:function(a){var b;return this[0]&&(r.isFunction(a)&&(a=a.call(this[0])),b=r(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstElementChild)a=a.firstElementChild;return a}).append(this)),this},wrapInner:function(a){return r.isFunction(a)?this.each(function(b){r(this).wrapInner(a.call(this,b))}):this.each(function(){var b=r(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=r.isFunction(a);return this.each(function(c){r(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(a){return this.parent(a).not("body").each(function(){r(this).replaceWith(this.childNodes)}),this}}),r.expr.pseudos.hidden=function(a){return!r.expr.pseudos.visible(a)},r.expr.pseudos.visible=function(a){return!!(a.offsetWidth||a.offsetHeight||a.getClientRects().length)},r.ajaxSettings.xhr=function(){try{return new a.XMLHttpRequest}catch(b){}};var Rb={0:200,1223:204},Sb=r.ajaxSettings.xhr();o.cors=!!Sb&&"withCredentials"in Sb,o.ajax=Sb=!!Sb,r.ajaxTransport(function(b){var c,d;if(o.cors||Sb&&!b.crossDomain)return{send:function(e,f){var g,h=b.xhr();if(h.open(b.type,b.url,b.async,b.username,b.password),b.xhrFields)for(g in b.xhrFields)h[g]=b.xhrFields[g];b.mimeType&&h.overrideMimeType&&h.overrideMimeType(b.mimeType),b.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest");for(g in e)h.setRequestHeader(g,e[g]);c=function(a){return function(){c&&(c=d=h.onload=h.onerror=h.onabort=h.onreadystatechange=null,"abort"===a?h.abort():"error"===a?"number"!=typeof h.status?f(0,"error"):f(h.status,h.statusText):f(Rb[h.status]||h.status,h.statusText,"text"!==(h.responseType||"text")||"string"!=typeof h.responseText?{binary:h.response}:{text:h.responseText},h.getAllResponseHeaders()))}},h.onload=c(),d=h.onerror=c("error"),void 0!==h.onabort?h.onabort=d:h.onreadystatechange=function(){4===h.readyState&&a.setTimeout(function(){c&&d()})},c=c("abort");try{h.send(b.hasContent&&b.data||null)}catch(i){if(c)throw i}},abort:function(){c&&c()}}}),r.ajaxPrefilter(function(a){a.crossDomain&&(a.contents.script=!1)}),r.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(a){return r.globalEval(a),a}}}),r.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET")}),r.ajaxTransport("script",function(a){if(a.crossDomain){var b,c;return{send:function(e,f){b=r(" + + \ No newline at end of file diff --git a/htdocs/vendor/choices/base.css b/htdocs/vendor/choices/base.css new file mode 100755 index 0000000..2d090bd --- /dev/null +++ b/htdocs/vendor/choices/base.css @@ -0,0 +1,191 @@ +/*============================================= += Generic styling = +=============================================*/ +* { + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +*, +*:before, +*:after { + box-sizing: border-box; +} + +html, +body { + position: relative; + margin: 0; + width: 100%; + height: 100%; +} + +body { + font-family: "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; + font-size: 16px; + line-height: 1.4; + color: #FFFFFF; + background-color: #333; + overflow-x: hidden; +} + +label { + display: block; + margin-bottom: 8px; + font-size: 14px; + font-weight: 500; + cursor: pointer; +} + +p { + margin-top: 0; +} + +hr { + display: block; + margin: 30px 0; + border: 0; + border-bottom: 1px solid #eaeaea; + height: 1px; +} + +h1, +h2, +h3, +h4, +h5, +h6 { + margin-top: 0; + margin-bottom: 12px; + font-weight: 400; + line-height: 1.2; +} + +a, +a:visited, +a:focus { + color: #FFFFFF; + text-decoration: none; + font-weight: 600; +} + +.form-control { + display: block; + width: 100%; + background-color: #f9f9f9; + padding: 12px; + border: 1px solid #ddd; + border-radius: 2.5px; + font-size: 14px; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + margin-bottom: 24px; +} + +h1, +.h1 { + font-size: 32px; +} + +h2, +.h2 { + font-size: 24px; +} + +h3, +.h3 { + font-size: 20px; +} + +h4, +.h4 { + font-size: 18px; +} + +h5, +.h5 { + font-size: 16px; +} + +h6, +.h6 { + font-size: 14px; +} + +p { + margin-bottom: 8px; +} + +label + p { + margin-top: -4px; +} + +.container { + display: block; + margin: auto; + max-width: 40em; + padding: 48px; +} + +@media (max-width: 620px) { + .container { + padding: 0; + } +} + +.section { + background-color: #FFFFFF; + padding: 24px; + color: #333; +} + +.section a, +.section a:visited, +.section a:focus { + color: #00bcd4; +} + +.logo { + display: block; + margin-bottom: 12px; +} + +.logo__img { + width: 100%; + height: auto; + display: inline-block; + max-width: 100%; + vertical-align: top; + padding: 6px 0; +} + +.visible-ie { + display: none; +} + +.push-bottom { + margin-bottom: 24px; +} + +.zero-bottom { + margin-bottom: 0; +} + +.zero-top { + margin-top: 0; +} + +.text-center { + text-align: center; +} + +.is-hidden { + display: none; +} + +[data-test-hook] { + margin-bottom: 24px; +} + +/*===== End of Section comment block ======*/ diff --git a/htdocs/vendor/choices/base.min.css b/htdocs/vendor/choices/base.min.css new file mode 100755 index 0000000..7992056 --- /dev/null +++ b/htdocs/vendor/choices/base.min.css @@ -0,0 +1 @@ +*{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}*,:after,:before{box-sizing:border-box}body,html{position:relative;margin:0;width:100%;height:100%}body{font-family:"Helvetica Neue",Helvetica,Arial,"Lucida Grande",sans-serif;font-size:16px;line-height:1.4;color:#fff;background-color:#333;overflow-x:hidden}hr,label{display:block}label,p{margin-bottom:8px}label{font-size:14px;font-weight:500;cursor:pointer}p{margin-top:0}hr{margin:30px 0;border:0;border-bottom:1px solid #eaeaea;height:1px}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:12px;font-weight:400;line-height:1.2}a,a:focus,a:visited{color:#fff;text-decoration:none;font-weight:600}.form-control{display:block;width:100%;background-color:#f9f9f9;padding:12px;border:1px solid #ddd;border-radius:2.5px;font-size:14px;-webkit-appearance:none;-moz-appearance:none;appearance:none;margin-bottom:24px}.h1,h1{font-size:32px}.h2,h2{font-size:24px}.h3,h3{font-size:20px}.h4,h4{font-size:18px}.h5,h5{font-size:16px}.h6,h6{font-size:14px}label+p{margin-top:-4px}.container{display:block;margin:auto;max-width:40em;padding:48px}@media (max-width:620px){.container{padding:0}}.section{background-color:#fff;padding:24px;color:#333}.section a,.section a:focus,.section a:visited{color:#00bcd4}.logo{display:block;margin-bottom:12px}.logo__img{width:100%;height:auto;display:inline-block;max-width:100%;vertical-align:top;padding:6px 0}.visible-ie{display:none}.push-bottom{margin-bottom:24px}.zero-bottom{margin-bottom:0}.zero-top{margin-top:0}.text-center{text-align:center}.is-hidden{display:none}[data-test-hook]{margin-bottom:24px} \ No newline at end of file diff --git a/htdocs/vendor/choices/choices.css b/htdocs/vendor/choices/choices.css new file mode 100755 index 0000000..e3bc037 --- /dev/null +++ b/htdocs/vendor/choices/choices.css @@ -0,0 +1,368 @@ +/*=============================== += Choices = +===============================*/ +.choices { + position: relative; + margin-bottom: 24px; + font-size: 16px; +} + +.choices:focus { + outline: none; +} + +.choices:last-child { + margin-bottom: 0; +} + +.choices.is-disabled .choices__inner, +.choices.is-disabled .choices__input { + background-color: #EAEAEA; + cursor: not-allowed; + user-select: none; +} + +.choices.is-disabled .choices__item { + cursor: not-allowed; +} + +.choices[data-type*="select-one"] { + cursor: pointer; +} + +.choices[data-type*="select-one"] .choices__inner { + padding-bottom: 7.5px; + +} + +.choices[data-type*="select-one"] .choices__input { + display: block; + width: 100%; + padding: 10px; + border-bottom: 1px solid #DDDDDD; + background-color: #FFFFFF; + margin: 0; +} + +.choices[data-type*="select-one"] .choices__button { + background-image: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjEiIGhlaWdodD0iMjEiIHZpZXdCb3g9IjAgMCAyMSAyMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48ZyBmaWxsPSIjMDAwIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPjxwYXRoIGQ9Ik0yLjU5Mi4wNDRsMTguMzY0IDE4LjM2NC0yLjU0OCAyLjU0OEwuMDQ0IDIuNTkyeiIvPjxwYXRoIGQ9Ik0wIDE4LjM2NEwxOC4zNjQgMGwyLjU0OCAyLjU0OEwyLjU0OCAyMC45MTJ6Ii8+PC9nPjwvc3ZnPg==); + padding: 0; + background-size: 8px; + position: absolute; + top: 50%; + right: 0; + margin-top: -10px; + margin-right: 25px; + height: 20px; + width: 20px; + /* border-radius: 10em; */ + opacity: .5; +} + +.choices[data-type*="select-one"] .choices__button:hover, .choices[data-type*="select-one"] .choices__button:focus { + opacity: 1; +} + +.choices[data-type*="select-one"] .choices__button:focus { + box-shadow: 0px 0px 0px 2px #00BCD4; +} + +.choices[data-type*="select-one"]:after { + content: ""; + height: 0; + width: 0; + border-style: solid; + border-color: #333333 transparent transparent transparent; + border-width: 5px; + position: absolute; + right: 11.5px; + top: 50%; + margin-top: -2.5px; + pointer-events: none; +} + +.choices[data-type*="select-one"].is-open:after { + border-color: transparent transparent #333333 transparent; + margin-top: -7.5px; +} + +.choices[data-type*="select-one"][dir="rtl"]:after { + left: 11.5px; + right: auto; +} + +.choices[data-type*="select-one"][dir="rtl"] .choices__button { + right: auto; + left: 0; + margin-left: 25px; + margin-right: 0; +} + +.choices[data-type*="select-multiple"] .choices__inner, +.choices[data-type*="text"] .choices__inner { + cursor: text; +} + +.choices[data-type*="select-multiple"] .choices__button, +.choices[data-type*="text"] .choices__button { + position: relative; + display: inline-block; + margin-top: 0; + margin-right: -4px; + margin-bottom: 0; + margin-left: 8px; + padding-left: 16px; + border-left: 1px solid #008fa1; + background-image: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjEiIGhlaWdodD0iMjEiIHZpZXdCb3g9IjAgMCAyMSAyMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48ZyBmaWxsPSIjRkZGIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPjxwYXRoIGQ9Ik0yLjU5Mi4wNDRsMTguMzY0IDE4LjM2NC0yLjU0OCAyLjU0OEwuMDQ0IDIuNTkyeiIvPjxwYXRoIGQ9Ik0wIDE4LjM2NEwxOC4zNjQgMGwyLjU0OCAyLjU0OEwyLjU0OCAyMC45MTJ6Ii8+PC9nPjwvc3ZnPg==); + background-size: 8px; + width: 8px; + line-height: 1; + opacity: .75; + border-radius: 0; +} + +.choices[data-type*="select-multiple"] .choices__button:hover, .choices[data-type*="select-multiple"] .choices__button:focus, +.choices[data-type*="text"] .choices__button:hover, +.choices[data-type*="text"] .choices__button:focus { + opacity: 1; +} + +.choices__inner { + display: inline-block; + vertical-align: top; + width: 100%; + background-color: #e8f0fe; + padding: 7.5px 7.5px 3.75px; + border: 1px solid #ccc; + /* border-radius: 2.5px; */ + /* font-size: 14px; */ + min-height: 44px; + overflow: hidden; + /* font-weight: bold; */ +} + +.is-focused .choices__inner, +.is-open .choices__inner { + border-color: #b7b7b7; +} + +.is-open .choices__inner { + /* border-radius: 2.5px 2.5px 0 0; */ +} + +.is-flipped.is-open .choices__inner { + /* border-radius: 0 0 2.5px 2.5px; */ +} + +.choices__list { + margin: 0; + padding-left: 0; + list-style: none; +} + +.choices__list--single { + display: inline-block; + padding: 4px 16px 4px 4px; + width: 100%; +} + +[dir="rtl"] .choices__list--single { + padding-right: 4px; + padding-left: 16px; +} + +.choices__list--single .choices__item { + width: 100%; +} + +.choices__list--multiple { + display: inline; +} + +.choices__list--multiple .choices__item { + display: inline-block; + vertical-align: middle; + /* border-radius: 20px; */ + padding: 4px 6px; + font-size: 16px; + height: 40px; + /* font-size: 12px; */ + /* font-weight: 500; */ + margin-right: 3.75px; + /* margin-bottom: 3.75px; */ + background-color: #607d8b; + border: 1px solid #607d8b; + color: #FFFFFF; + /* font-weightfont-weight: bold; */ + word-break: break-all; +} + +.choices__list--multiple .choices__item[data-deletable] { + padding-right: 5px; +} + +[dir="rtl"] .choices__list--multiple .choices__item { + margin-right: 0; + margin-left: 3.75px; +} + +.choices__list--multiple .choices__item.is-highlighted { + background-color: #00a5bb; + border: 1px solid #008fa1; +} + +.is-disabled .choices__list--multiple .choices__item { + background-color: #aaaaaa; + border: 1px solid #919191; +} + +.choices__list--dropdown { + display: none; + z-index: 1; + position: absolute; + width: 100%; + background-color: #FFFFFF; + border: 1px solid #DDDDDD; + top: 100%; + margin-top: -1px; + /* border-bottom-left-radius: 2.5px; */ + /* border-bottom-right-radius: 2.5px; */ + overflow: hidden; + word-break: break-all; +} + +.choices__list--dropdown.is-active { + display: block; +} + +.is-open .choices__list--dropdown { + border-color: #b7b7b7; +} + +.is-flipped .choices__list--dropdown { + top: auto; + bottom: 100%; + margin-top: 0; + margin-bottom: -1px; + /* border-radius: .25rem .25rem 0 0; */ +} + +.choices__list--dropdown .choices__list { + position: relative; + max-height: 300px; + overflow: auto; + -webkit-overflow-scrolling: touch; + will-change: scroll-position; +} + +.choices__list--dropdown .choices__item { + position: relative; + padding: 10px; + font-size: 14px; +} + +[dir="rtl"] .choices__list--dropdown .choices__item { + text-align: right; +} + +@media (min-width: 640px) { + .choices__list--dropdown .choices__item--selectable { + padding-right: 100px; + } + .choices__list--dropdown .choices__item--selectable:after { + content: attr(data-select-text); + font-size: 12px; + opacity: 0; + position: absolute; + right: 10px; + top: 50%; + transform: translateY(-50%); + } + [dir="rtl"] .choices__list--dropdown .choices__item--selectable { + text-align: right; + padding-left: 100px; + padding-right: 10px; + } + [dir="rtl"] .choices__list--dropdown .choices__item--selectable:after { + right: auto; + left: 10px; + } +} + +.choices__list--dropdown .choices__item--selectable.is-highlighted { + background-color: #f2f2f2; +} + +.choices__list--dropdown .choices__item--selectable.is-highlighted:after { + opacity: .5; +} + +.choices__item { + cursor: default; +} + +.choices__item--selectable { + cursor: pointer; +} + +.choices__item--disabled { + cursor: not-allowed; + user-select: none; + opacity: .5; +} + +.choices__heading { + /* font-weight: 600; */ + font-size: 12px; + padding: 10px; + border-bottom: 1px solid #f7f7f7; + color: gray; +} + +.choices__button { + text-indent: -9999px; + -webkit-appearance: none; + appearance: none; + border: 0; + background-color: transparent; + background-repeat: no-repeat; + background-position: center; + cursor: pointer; +} + +.choices__button:focus { + outline: none; +} + +.choices__input { + display: inline-block; + vertical-align: baseline; + background-color: #f9f9f9; + font-size: 14px; + margin-bottom: 5px; + border: 0; + border-radius: 0; + max-width: 100%; + padding: 4px 0 4px 2px; +} + +.choices__input:focus { + outline: 0; +} + +[dir="rtl"] .choices__input { + padding-right: 2px; + padding-left: 0; +} + +.choices__placeholder { + opacity: .5; +} + +.choices__input.is-hidden, +.choices[data-type*="select-one"] .choices__input.is-hidden, +.choices[data-type*="select-multiple"] .choices__input.is-hidden { + display: none; +} + +/*===== End of Choices ======*/ diff --git a/htdocs/vendor/choices/choices.js b/htdocs/vendor/choices/choices.js new file mode 100755 index 0000000..93e8b4e --- /dev/null +++ b/htdocs/vendor/choices/choices.js @@ -0,0 +1,6787 @@ +(function webpackUniversalModuleDefinition(root, factory) { + //CommonJS2 + if(typeof exports === 'object' && typeof module === 'object') + module.exports = factory(); + //AMD + else if(typeof define === 'function' && define.amd) + define([], factory); + //CommonJS + else if(typeof exports === 'object') + exports["Choices"] = factory(); + //Window + else + root["Choices"] = factory(); +})(window, function() { +return /******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) { +/******/ return installedModules[moduleId].exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ i: moduleId, +/******/ l: false, +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.l = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; +/******/ +/******/ // define getter function for harmony exports +/******/ __webpack_require__.d = function(exports, name, getter) { +/******/ if(!__webpack_require__.o(exports, name)) { +/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); +/******/ } +/******/ }; +/******/ +/******/ // define __esModule on exports +/******/ __webpack_require__.r = function(exports) { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ +/******/ // create a fake namespace object +/******/ // mode & 1: value is a module id, require it +/******/ // mode & 2: merge all properties of value into the ns +/******/ // mode & 4: return value when already ns object +/******/ // mode & 8|1: behave like require +/******/ __webpack_require__.t = function(value, mode) { +/******/ if(mode & 1) value = __webpack_require__(value); +/******/ if(mode & 8) return value; +/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; +/******/ var ns = Object.create(null); +/******/ __webpack_require__.r(ns); +/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); +/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); +/******/ return ns; +/******/ }; +/******/ +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = function(module) { +/******/ var getter = module && module.__esModule ? +/******/ function getDefault() { return module['default']; } : +/******/ function getModuleExports() { return module; }; +/******/ __webpack_require__.d(getter, 'a', getter); +/******/ return getter; +/******/ }; +/******/ +/******/ // Object.prototype.hasOwnProperty.call +/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; +/******/ +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = "/public/assets/scripts/"; +/******/ +/******/ +/******/ // Load entry module and return exports +/******/ return __webpack_require__(__webpack_require__.s = 9); +/******/ }) +/************************************************************************/ +/******/ ([ +/* 0 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.diff = exports.cloneObject = exports.existsInArray = exports.isIE11 = exports.fetchFromObject = exports.getWindowHeight = exports.dispatchEvent = exports.sortByScore = exports.sortByAlpha = exports.calcWidthOfInput = exports.strToEl = exports.sanitise = exports.isScrolledIntoView = exports.getAdjacentEl = exports.findAncestorByAttrName = exports.wrap = exports.isElement = exports.isType = exports.getType = exports.generateId = exports.generateChars = exports.getRandomNumber = void 0; + +var _this = void 0; + +var getRandomNumber = function getRandomNumber(min, max) { + return Math.floor(Math.random() * (max - min) + min); +}; + +exports.getRandomNumber = getRandomNumber; + +var generateChars = function generateChars(length) { + var chars = ''; + + for (var i = 0; i < length; i++) { + var randomChar = getRandomNumber(0, 36); + chars += randomChar.toString(36); + } + + return chars; +}; + +exports.generateChars = generateChars; + +var generateId = function generateId(element, prefix) { + var id = element.id || element.name && "".concat(element.name, "-").concat(generateChars(2)) || generateChars(4); + id = id.replace(/(:|\.|\[|\]|,)/g, ''); + id = "".concat(prefix, "-").concat(id); + return id; +}; + +exports.generateId = generateId; + +var getType = function getType(obj) { + return Object.prototype.toString.call(obj).slice(8, -1); +}; + +exports.getType = getType; + +var isType = function isType(type, obj) { + return obj !== undefined && obj !== null && getType(obj) === type; +}; + +exports.isType = isType; + +var isElement = function isElement(element) { + return element instanceof Element; +}; + +exports.isElement = isElement; + +var wrap = function wrap(element) { + var wrapper = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : document.createElement('div'); + + if (element.nextSibling) { + element.parentNode.insertBefore(wrapper, element.nextSibling); + } else { + element.parentNode.appendChild(wrapper); + } + + return wrapper.appendChild(element); +}; + +exports.wrap = wrap; + +var findAncestorByAttrName = function findAncestorByAttrName(el, attr) { + var target = el; + + while (target) { + if (target.hasAttribute(attr)) { + return target; + } + + target = target.parentElement; + } + + return null; +}; + +exports.findAncestorByAttrName = findAncestorByAttrName; + +var getAdjacentEl = function getAdjacentEl(startEl, className) { + var direction = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1; + + if (!startEl || !className) { + return; + } + + var parent = startEl.parentNode.parentNode; + var children = Array.from(parent.querySelectorAll(className)); + var startPos = children.indexOf(startEl); + var operatorDirection = direction > 0 ? 1 : -1; + return children[startPos + operatorDirection]; +}; + +exports.getAdjacentEl = getAdjacentEl; + +var isScrolledIntoView = function isScrolledIntoView(el, parent) { + var direction = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1; + + if (!el) { + return; + } + + var isVisible; + + if (direction > 0) { + // In view from bottom + isVisible = parent.scrollTop + parent.offsetHeight >= el.offsetTop + el.offsetHeight; + } else { + // In view from top + isVisible = el.offsetTop >= parent.scrollTop; + } + + return isVisible; +}; + +exports.isScrolledIntoView = isScrolledIntoView; + +var sanitise = function sanitise(value) { + if (!isType('String', value)) { + return value; + } + + return value.replace(/&/g, '&').replace(/>/g, '&rt;').replace(/".concat(sanitise(value), "")); + testEl.style.position = 'absolute'; + testEl.style.padding = '0'; + testEl.style.top = '-9999px'; + testEl.style.left = '-9999px'; + testEl.style.width = 'auto'; + testEl.style.whiteSpace = 'pre'; + + if (document.body.contains(input) && window.getComputedStyle) { + var inputStyle = window.getComputedStyle(input); + + if (inputStyle) { + testEl.style.fontSize = inputStyle.fontSize; + testEl.style.fontFamily = inputStyle.fontFamily; + testEl.style.fontWeight = inputStyle.fontWeight; + testEl.style.fontStyle = inputStyle.fontStyle; + testEl.style.letterSpacing = inputStyle.letterSpacing; + testEl.style.textTransform = inputStyle.textTransform; + testEl.style.padding = inputStyle.padding; + } + } + + document.body.appendChild(testEl); + requestAnimationFrame(function () { + if (value && testEl.offsetWidth !== input.offsetWidth) { + width = testEl.offsetWidth + 4; + } + + document.body.removeChild(testEl); + callback.call(_this, "".concat(width, "px")); + }); + } else { + callback.call(_this, "".concat(width, "px")); + } +}; + +exports.calcWidthOfInput = calcWidthOfInput; + +var sortByAlpha = function sortByAlpha(a, b) { + var labelA = "".concat(a.label || a.value).toLowerCase(); + var labelB = "".concat(b.label || b.value).toLowerCase(); + + if (labelA < labelB) { + return -1; + } + + if (labelA > labelB) { + return 1; + } + + return 0; +}; + +exports.sortByAlpha = sortByAlpha; + +var sortByScore = function sortByScore(a, b) { + return a.score - b.score; +}; + +exports.sortByScore = sortByScore; + +var dispatchEvent = function dispatchEvent(element, type) { + var customArgs = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null; + var event = new CustomEvent(type, { + detail: customArgs, + bubbles: true, + cancelable: true + }); + return element.dispatchEvent(event); +}; + +exports.dispatchEvent = dispatchEvent; + +var getWindowHeight = function getWindowHeight() { + var body = document.body; + var html = document.documentElement; + return Math.max(body.scrollHeight, body.offsetHeight, html.clientHeight, html.scrollHeight, html.offsetHeight); +}; + +exports.getWindowHeight = getWindowHeight; + +var fetchFromObject = function fetchFromObject(object, path) { + var index = path.indexOf('.'); + + if (index > -1) { + return fetchFromObject(object[path.substring(0, index)], path.substr(index + 1)); + } + + return object[path]; +}; + +exports.fetchFromObject = fetchFromObject; + +var isIE11 = function isIE11() { + return !!(navigator.userAgent.match(/Trident/) && navigator.userAgent.match(/rv[ :]11/)); +}; + +exports.isIE11 = isIE11; + +var existsInArray = function existsInArray(array, value) { + var key = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'value'; + return array.some(function (item) { + if (isType('String', value)) { + return item[key] === value.trim(); + } + + return item[key] === value; + }); +}; + +exports.existsInArray = existsInArray; + +var cloneObject = function cloneObject(obj) { + return JSON.parse(JSON.stringify(obj)); +}; + +exports.cloneObject = cloneObject; + +var diff = function diff(a, b) { + var aKeys = Object.keys(a).sort(); + var bKeys = Object.keys(b).sort(); + return aKeys.filter(function (i) { + return bKeys.indexOf(i) < 0; + }); +}; + +exports.diff = diff; + +/***/ }), +/* 1 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.SCROLLING_SPEED = exports.KEY_CODES = exports.ACTION_TYPES = exports.EVENTS = exports.DEFAULT_CONFIG = exports.DEFAULT_CLASSNAMES = void 0; + +var _utils = __webpack_require__(0); + +var DEFAULT_CLASSNAMES = { + containerOuter: 'choices', + containerInner: 'choices__inner', + input: 'choices__input', + inputCloned: 'choices__input--cloned', + list: 'choices__list', + listItems: 'choices__list--multiple', + listSingle: 'choices__list--single', + listDropdown: 'choices__list--dropdown', + item: 'choices__item', + itemSelectable: 'choices__item--selectable', + itemDisabled: 'choices__item--disabled', + itemChoice: 'choices__item--choice', + placeholder: 'choices__placeholder', + group: 'choices__group', + groupHeading: 'choices__heading', + button: 'choices__button', + activeState: 'is-active', + focusState: 'is-focused', + openState: 'is-open', + disabledState: 'is-disabled', + highlightedState: 'is-highlighted', + hiddenState: 'is-hidden', + flippedState: 'is-flipped', + loadingState: 'is-loading', + noResults: 'has-no-results', + noChoices: 'has-no-choices' +}; +exports.DEFAULT_CLASSNAMES = DEFAULT_CLASSNAMES; +var DEFAULT_CONFIG = { + items: [], + choices: [], + silent: false, + renderChoiceLimit: -1, + maxItemCount: -1, + addItems: true, + addItemFilterFn: null, + removeItems: true, + removeItemButton: false, + editItems: false, + duplicateItemsAllowed: true, + delimiter: ',', + paste: true, + searchEnabled: true, + searchChoices: true, + searchFloor: 1, + searchResultLimit: 4, + searchFields: ['label', 'value'], + position: 'auto', + resetScrollPosition: true, + shouldSort: true, + shouldSortItems: false, + sortFn: _utils.sortByAlpha, + placeholder: true, + placeholderValue: null, + searchPlaceholderValue: null, + prependValue: null, + appendValue: null, + renderSelectedChoices: 'auto', + loadingText: 'Loading...', + noResultsText: 'No results found', + noChoicesText: 'No choices to choose from', + itemSelectText: 'Press to select', + uniqueItemText: 'Only unique values can be added', + customAddItemText: 'Only values matching specific conditions can be added', + addItemText: function addItemText(value) { + return "Press Enter to add \"".concat((0, _utils.sanitise)(value), "\""); + }, + maxItemText: function maxItemText(maxItemCount) { + return "Only ".concat(maxItemCount, " values can be added"); + }, + itemComparer: function itemComparer(choice, item) { + return choice === item; + }, + fuseOptions: { + includeScore: true + }, + callbackOnInit: null, + callbackOnCreateTemplates: null, + classNames: DEFAULT_CLASSNAMES +}; +exports.DEFAULT_CONFIG = DEFAULT_CONFIG; +var EVENTS = { + showDropdown: 'showDropdown', + hideDropdown: 'hideDropdown', + change: 'change', + choice: 'choice', + search: 'search', + addItem: 'addItem', + removeItem: 'removeItem', + highlightItem: 'highlightItem', + highlightChoice: 'highlightChoice' +}; +exports.EVENTS = EVENTS; +var ACTION_TYPES = { + ADD_CHOICE: 'ADD_CHOICE', + FILTER_CHOICES: 'FILTER_CHOICES', + ACTIVATE_CHOICES: 'ACTIVATE_CHOICES', + CLEAR_CHOICES: 'CLEAR_CHOICES', + ADD_GROUP: 'ADD_GROUP', + ADD_ITEM: 'ADD_ITEM', + REMOVE_ITEM: 'REMOVE_ITEM', + HIGHLIGHT_ITEM: 'HIGHLIGHT_ITEM', + CLEAR_ALL: 'CLEAR_ALL' +}; +exports.ACTION_TYPES = ACTION_TYPES; +var KEY_CODES = { + BACK_KEY: 46, + DELETE_KEY: 8, + ENTER_KEY: 13, + A_KEY: 65, + ESC_KEY: 27, + UP_KEY: 38, + DOWN_KEY: 40, + PAGE_UP_KEY: 33, + PAGE_DOWN_KEY: 34 +}; +exports.KEY_CODES = KEY_CODES; +var SCROLLING_SPEED = 4; +exports.SCROLLING_SPEED = SCROLLING_SPEED; + +/***/ }), +/* 2 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +/* WEBPACK VAR INJECTION */(function(global, module) {/* harmony import */ var _ponyfill_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(7); +/* global window */ + + +var root; + +if (typeof self !== 'undefined') { + root = self; +} else if (typeof window !== 'undefined') { + root = window; +} else if (typeof global !== 'undefined') { + root = global; +} else if (true) { + root = module; +} else {} + +var result = Object(_ponyfill_js__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])(root); +/* harmony default export */ __webpack_exports__["a"] = (result); + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(3), __webpack_require__(14)(module))) + +/***/ }), +/* 3 */ +/***/ (function(module, exports) { + +var g; + +// This works in non-strict mode +g = (function() { + return this; +})(); + +try { + // This works if eval is allowed (see CSP) + g = g || new Function("return this")(); +} catch (e) { + // This works if the window reference is available + if (typeof window === "object") g = window; +} + +// g can still be undefined, but nothing to do about it... +// We return undefined, instead of nothing here, so it's +// easier to handle this case. if(!global) { ...} + +module.exports = g; + + +/***/ }), +/* 4 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _utils = __webpack_require__(0); + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + +var WrappedElement = +/*#__PURE__*/ +function () { + function WrappedElement(_ref) { + var element = _ref.element, + classNames = _ref.classNames; + + _classCallCheck(this, WrappedElement); + + Object.assign(this, { + element: element, + classNames: classNames + }); + + if (!(0, _utils.isElement)(element)) { + throw new TypeError('Invalid element passed'); + } + + this.isDisabled = false; + } + + _createClass(WrappedElement, [{ + key: "conceal", + value: function conceal() { + // Hide passed input + this.element.classList.add(this.classNames.input); + this.element.classList.add(this.classNames.hiddenState); // Remove element from tab index + + this.element.tabIndex = '-1'; // Backup original styles if any + + var origStyle = this.element.getAttribute('style'); + + if (origStyle) { + this.element.setAttribute('data-choice-orig-style', origStyle); + } + + this.element.setAttribute('aria-hidden', 'true'); + this.element.setAttribute('data-choice', 'active'); + } + }, { + key: "reveal", + value: function reveal() { + // Reinstate passed element + this.element.classList.remove(this.classNames.input); + this.element.classList.remove(this.classNames.hiddenState); + this.element.removeAttribute('tabindex'); // Recover original styles if any + + var origStyle = this.element.getAttribute('data-choice-orig-style'); + + if (origStyle) { + this.element.removeAttribute('data-choice-orig-style'); + this.element.setAttribute('style', origStyle); + } else { + this.element.removeAttribute('style'); + } + + this.element.removeAttribute('aria-hidden'); + this.element.removeAttribute('data-choice'); // Re-assign values - this is weird, I know + + this.element.value = this.element.value; + } + }, { + key: "enable", + value: function enable() { + this.element.removeAttribute('disabled'); + this.element.disabled = false; + this.isDisabled = false; + } + }, { + key: "disable", + value: function disable() { + this.element.setAttribute('disabled', ''); + this.element.disabled = true; + this.isDisabled = true; + } + }, { + key: "triggerEvent", + value: function triggerEvent(eventType, data) { + (0, _utils.dispatchEvent)(this.element, eventType, data); + } + }, { + key: "value", + get: function get() { + return this.element.value; + } + }]); + + return WrappedElement; +}(); + +exports.default = WrappedElement; + +/***/ }), +/* 5 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = exports.TEMPLATES = void 0; + +var _classnames = _interopRequireDefault(__webpack_require__(27)); + +var _utils = __webpack_require__(0); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var TEMPLATES = { + containerOuter: function containerOuter(globalClasses, direction, isSelectElement, isSelectOneElement, searchEnabled, passedElementType) { + var tabIndex = isSelectOneElement ? 'tabindex="0"' : ''; + var role = isSelectElement ? 'role="listbox"' : ''; + var ariaAutoComplete = ''; + + if (isSelectElement && searchEnabled) { + role = 'role="combobox"'; + ariaAutoComplete = 'aria-autocomplete="list"'; + } + + return (0, _utils.strToEl)("\n \n \n ")); + }, + containerInner: function containerInner(globalClasses) { + return (0, _utils.strToEl)("\n
\n ")); + }, + itemList: function itemList(globalClasses, isSelectOneElement) { + var _classNames; + + var localClasses = (0, _classnames.default)(globalClasses.list, (_classNames = {}, _defineProperty(_classNames, globalClasses.listSingle, isSelectOneElement), _defineProperty(_classNames, globalClasses.listItems, !isSelectOneElement), _classNames)); + return (0, _utils.strToEl)("\n
\n ")); + }, + placeholder: function placeholder(globalClasses, value) { + return (0, _utils.strToEl)("\n
\n ").concat(value, "\n
\n ")); + }, + item: function item(globalClasses, data, removeItemButton) { + var _classNames2; + + var ariaSelected = data.active ? 'aria-selected="true"' : ''; + var ariaDisabled = data.disabled ? 'aria-disabled="true"' : ''; + var localClasses = (0, _classnames.default)(globalClasses.item, (_classNames2 = {}, _defineProperty(_classNames2, globalClasses.highlightedState, data.highlighted), _defineProperty(_classNames2, globalClasses.itemSelectable, !data.highlighted), _defineProperty(_classNames2, globalClasses.placeholder, data.placeholder), _classNames2)); + + if (removeItemButton) { + var _classNames3; + + localClasses = (0, _classnames.default)(globalClasses.item, (_classNames3 = {}, _defineProperty(_classNames3, globalClasses.highlightedState, data.highlighted), _defineProperty(_classNames3, globalClasses.itemSelectable, !data.disabled), _defineProperty(_classNames3, globalClasses.placeholder, data.placeholder), _classNames3)); + return (0, _utils.strToEl)("\n \n ").concat(data.label, "\n Remove item\n \n \n ")); + } + + return (0, _utils.strToEl)("\n \n ").concat(data.label, "\n \n ")); + }, + choiceList: function choiceList(globalClasses, isSelectOneElement) { + var ariaMultiSelectable = !isSelectOneElement ? 'aria-multiselectable="true"' : ''; + return (0, _utils.strToEl)("\n \n \n ")); + }, + choiceGroup: function choiceGroup(globalClasses, data) { + var ariaDisabled = data.disabled ? 'aria-disabled="true"' : ''; + var localClasses = (0, _classnames.default)(globalClasses.group, _defineProperty({}, globalClasses.itemDisabled, data.disabled)); + return (0, _utils.strToEl)("\n \n
").concat(data.value, "
\n \n ")); + }, + choice: function choice(globalClasses, data, itemSelectText) { + var _classNames5; + + var role = data.groupId > 0 ? 'role="treeitem"' : 'role="option"'; + var localClasses = (0, _classnames.default)(globalClasses.item, globalClasses.itemChoice, (_classNames5 = {}, _defineProperty(_classNames5, globalClasses.itemDisabled, data.disabled), _defineProperty(_classNames5, globalClasses.itemSelectable, !data.disabled), _defineProperty(_classNames5, globalClasses.placeholder, data.placeholder), _classNames5)); + return (0, _utils.strToEl)("\n \n ").concat(data.label, "\n \n ")); + }, + input: function input(globalClasses) { + var localClasses = (0, _classnames.default)(globalClasses.input, globalClasses.inputCloned); + return (0, _utils.strToEl)("\n \n ")); + }, + dropdown: function dropdown(globalClasses) { + var localClasses = (0, _classnames.default)(globalClasses.list, globalClasses.listDropdown); + return (0, _utils.strToEl)("\n \n \n ")); + }, + notice: function notice(globalClasses, label) { + var _classNames6; + + var type = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ''; + var localClasses = (0, _classnames.default)(globalClasses.item, globalClasses.itemChoice, (_classNames6 = {}, _defineProperty(_classNames6, globalClasses.noResults, type === 'no-results'), _defineProperty(_classNames6, globalClasses.noChoices, type === 'no-choices'), _classNames6)); + return (0, _utils.strToEl)("\n
\n ").concat(label, "\n
\n ")); + }, + option: function option(data) { + return (0, _utils.strToEl)("\n \n ")); + } +}; +exports.TEMPLATES = TEMPLATES; +var _default = TEMPLATES; +exports.default = _default; + +/***/ }), +/* 6 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); + +// EXTERNAL MODULE: ./node_modules/lodash-es/_freeGlobal.js +var _freeGlobal = __webpack_require__(8); + +// CONCATENATED MODULE: ./node_modules/lodash-es/_root.js + + +/** Detect free variable `self`. */ +var freeSelf = typeof self == 'object' && self && self.Object === Object && self; + +/** Used as a reference to the global object. */ +var root = _freeGlobal["a" /* default */] || freeSelf || Function('return this')(); + +/* harmony default export */ var _root = (root); + +// CONCATENATED MODULE: ./node_modules/lodash-es/_Symbol.js + + +/** Built-in value references. */ +var Symbol = _root.Symbol; + +/* harmony default export */ var _Symbol = (Symbol); + +// CONCATENATED MODULE: ./node_modules/lodash-es/_getRawTag.js + + +/** Used for built-in method references. */ +var objectProto = Object.prototype; + +/** Used to check objects for own properties. */ +var _getRawTag_hasOwnProperty = objectProto.hasOwnProperty; + +/** + * Used to resolve the + * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) + * of values. + */ +var nativeObjectToString = objectProto.toString; + +/** Built-in value references. */ +var symToStringTag = _Symbol ? _Symbol.toStringTag : undefined; + +/** + * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values. + * + * @private + * @param {*} value The value to query. + * @returns {string} Returns the raw `toStringTag`. + */ +function getRawTag(value) { + var isOwn = _getRawTag_hasOwnProperty.call(value, symToStringTag), + tag = value[symToStringTag]; + + try { + value[symToStringTag] = undefined; + var unmasked = true; + } catch (e) {} + + var result = nativeObjectToString.call(value); + if (unmasked) { + if (isOwn) { + value[symToStringTag] = tag; + } else { + delete value[symToStringTag]; + } + } + return result; +} + +/* harmony default export */ var _getRawTag = (getRawTag); + +// CONCATENATED MODULE: ./node_modules/lodash-es/_objectToString.js +/** Used for built-in method references. */ +var _objectToString_objectProto = Object.prototype; + +/** + * Used to resolve the + * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) + * of values. + */ +var _objectToString_nativeObjectToString = _objectToString_objectProto.toString; + +/** + * Converts `value` to a string using `Object.prototype.toString`. + * + * @private + * @param {*} value The value to convert. + * @returns {string} Returns the converted string. + */ +function objectToString(value) { + return _objectToString_nativeObjectToString.call(value); +} + +/* harmony default export */ var _objectToString = (objectToString); + +// CONCATENATED MODULE: ./node_modules/lodash-es/_baseGetTag.js + + + + +/** `Object#toString` result references. */ +var nullTag = '[object Null]', + undefinedTag = '[object Undefined]'; + +/** Built-in value references. */ +var _baseGetTag_symToStringTag = _Symbol ? _Symbol.toStringTag : undefined; + +/** + * The base implementation of `getTag` without fallbacks for buggy environments. + * + * @private + * @param {*} value The value to query. + * @returns {string} Returns the `toStringTag`. + */ +function baseGetTag(value) { + if (value == null) { + return value === undefined ? undefinedTag : nullTag; + } + return (_baseGetTag_symToStringTag && _baseGetTag_symToStringTag in Object(value)) + ? _getRawTag(value) + : _objectToString(value); +} + +/* harmony default export */ var _baseGetTag = (baseGetTag); + +// CONCATENATED MODULE: ./node_modules/lodash-es/_overArg.js +/** + * Creates a unary function that invokes `func` with its argument transformed. + * + * @private + * @param {Function} func The function to wrap. + * @param {Function} transform The argument transform. + * @returns {Function} Returns the new function. + */ +function overArg(func, transform) { + return function(arg) { + return func(transform(arg)); + }; +} + +/* harmony default export */ var _overArg = (overArg); + +// CONCATENATED MODULE: ./node_modules/lodash-es/_getPrototype.js + + +/** Built-in value references. */ +var getPrototype = _overArg(Object.getPrototypeOf, Object); + +/* harmony default export */ var _getPrototype = (getPrototype); + +// CONCATENATED MODULE: ./node_modules/lodash-es/isObjectLike.js +/** + * Checks if `value` is object-like. A value is object-like if it's not `null` + * and has a `typeof` result of "object". + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is object-like, else `false`. + * @example + * + * _.isObjectLike({}); + * // => true + * + * _.isObjectLike([1, 2, 3]); + * // => true + * + * _.isObjectLike(_.noop); + * // => false + * + * _.isObjectLike(null); + * // => false + */ +function isObjectLike(value) { + return value != null && typeof value == 'object'; +} + +/* harmony default export */ var lodash_es_isObjectLike = (isObjectLike); + +// CONCATENATED MODULE: ./node_modules/lodash-es/isPlainObject.js + + + + +/** `Object#toString` result references. */ +var objectTag = '[object Object]'; + +/** Used for built-in method references. */ +var funcProto = Function.prototype, + isPlainObject_objectProto = Object.prototype; + +/** Used to resolve the decompiled source of functions. */ +var funcToString = funcProto.toString; + +/** Used to check objects for own properties. */ +var isPlainObject_hasOwnProperty = isPlainObject_objectProto.hasOwnProperty; + +/** Used to infer the `Object` constructor. */ +var objectCtorString = funcToString.call(Object); + +/** + * Checks if `value` is a plain object, that is, an object created by the + * `Object` constructor or one with a `[[Prototype]]` of `null`. + * + * @static + * @memberOf _ + * @since 0.8.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a plain object, else `false`. + * @example + * + * function Foo() { + * this.a = 1; + * } + * + * _.isPlainObject(new Foo); + * // => false + * + * _.isPlainObject([1, 2, 3]); + * // => false + * + * _.isPlainObject({ 'x': 0, 'y': 0 }); + * // => true + * + * _.isPlainObject(Object.create(null)); + * // => true + */ +function isPlainObject(value) { + if (!lodash_es_isObjectLike(value) || _baseGetTag(value) != objectTag) { + return false; + } + var proto = _getPrototype(value); + if (proto === null) { + return true; + } + var Ctor = isPlainObject_hasOwnProperty.call(proto, 'constructor') && proto.constructor; + return typeof Ctor == 'function' && Ctor instanceof Ctor && + funcToString.call(Ctor) == objectCtorString; +} + +/* harmony default export */ var lodash_es_isPlainObject = (isPlainObject); + +// EXTERNAL MODULE: ./node_modules/symbol-observable/es/index.js +var es = __webpack_require__(2); + +// CONCATENATED MODULE: ./node_modules/redux/es/createStore.js + + + +/** + * These are private action types reserved by Redux. + * For any unknown actions, you must return the current state. + * If the current state is undefined, you must return the initial state. + * Do not reference these action types directly in your code. + */ +var ActionTypes = { + INIT: '@@redux/INIT' + + /** + * Creates a Redux store that holds the state tree. + * The only way to change the data in the store is to call `dispatch()` on it. + * + * There should only be a single store in your app. To specify how different + * parts of the state tree respond to actions, you may combine several reducers + * into a single reducer function by using `combineReducers`. + * + * @param {Function} reducer A function that returns the next state tree, given + * the current state tree and the action to handle. + * + * @param {any} [preloadedState] The initial state. You may optionally specify it + * to hydrate the state from the server in universal apps, or to restore a + * previously serialized user session. + * If you use `combineReducers` to produce the root reducer function, this must be + * an object with the same shape as `combineReducers` keys. + * + * @param {Function} [enhancer] The store enhancer. You may optionally specify it + * to enhance the store with third-party capabilities such as middleware, + * time travel, persistence, etc. The only store enhancer that ships with Redux + * is `applyMiddleware()`. + * + * @returns {Store} A Redux store that lets you read the state, dispatch actions + * and subscribe to changes. + */ +};function createStore_createStore(reducer, preloadedState, enhancer) { + var _ref2; + + if (typeof preloadedState === 'function' && typeof enhancer === 'undefined') { + enhancer = preloadedState; + preloadedState = undefined; + } + + if (typeof enhancer !== 'undefined') { + if (typeof enhancer !== 'function') { + throw new Error('Expected the enhancer to be a function.'); + } + + return enhancer(createStore_createStore)(reducer, preloadedState); + } + + if (typeof reducer !== 'function') { + throw new Error('Expected the reducer to be a function.'); + } + + var currentReducer = reducer; + var currentState = preloadedState; + var currentListeners = []; + var nextListeners = currentListeners; + var isDispatching = false; + + function ensureCanMutateNextListeners() { + if (nextListeners === currentListeners) { + nextListeners = currentListeners.slice(); + } + } + + /** + * Reads the state tree managed by the store. + * + * @returns {any} The current state tree of your application. + */ + function getState() { + return currentState; + } + + /** + * Adds a change listener. It will be called any time an action is dispatched, + * and some part of the state tree may potentially have changed. You may then + * call `getState()` to read the current state tree inside the callback. + * + * You may call `dispatch()` from a change listener, with the following + * caveats: + * + * 1. The subscriptions are snapshotted just before every `dispatch()` call. + * If you subscribe or unsubscribe while the listeners are being invoked, this + * will not have any effect on the `dispatch()` that is currently in progress. + * However, the next `dispatch()` call, whether nested or not, will use a more + * recent snapshot of the subscription list. + * + * 2. The listener should not expect to see all state changes, as the state + * might have been updated multiple times during a nested `dispatch()` before + * the listener is called. It is, however, guaranteed that all subscribers + * registered before the `dispatch()` started will be called with the latest + * state by the time it exits. + * + * @param {Function} listener A callback to be invoked on every dispatch. + * @returns {Function} A function to remove this change listener. + */ + function subscribe(listener) { + if (typeof listener !== 'function') { + throw new Error('Expected listener to be a function.'); + } + + var isSubscribed = true; + + ensureCanMutateNextListeners(); + nextListeners.push(listener); + + return function unsubscribe() { + if (!isSubscribed) { + return; + } + + isSubscribed = false; + + ensureCanMutateNextListeners(); + var index = nextListeners.indexOf(listener); + nextListeners.splice(index, 1); + }; + } + + /** + * Dispatches an action. It is the only way to trigger a state change. + * + * The `reducer` function, used to create the store, will be called with the + * current state tree and the given `action`. Its return value will + * be considered the **next** state of the tree, and the change listeners + * will be notified. + * + * The base implementation only supports plain object actions. If you want to + * dispatch a Promise, an Observable, a thunk, or something else, you need to + * wrap your store creating function into the corresponding middleware. For + * example, see the documentation for the `redux-thunk` package. Even the + * middleware will eventually dispatch plain object actions using this method. + * + * @param {Object} action A plain object representing “what changed”. It is + * a good idea to keep actions serializable so you can record and replay user + * sessions, or use the time travelling `redux-devtools`. An action must have + * a `type` property which may not be `undefined`. It is a good idea to use + * string constants for action types. + * + * @returns {Object} For convenience, the same action object you dispatched. + * + * Note that, if you use a custom middleware, it may wrap `dispatch()` to + * return something else (for example, a Promise you can await). + */ + function dispatch(action) { + if (!lodash_es_isPlainObject(action)) { + throw new Error('Actions must be plain objects. ' + 'Use custom middleware for async actions.'); + } + + if (typeof action.type === 'undefined') { + throw new Error('Actions may not have an undefined "type" property. ' + 'Have you misspelled a constant?'); + } + + if (isDispatching) { + throw new Error('Reducers may not dispatch actions.'); + } + + try { + isDispatching = true; + currentState = currentReducer(currentState, action); + } finally { + isDispatching = false; + } + + var listeners = currentListeners = nextListeners; + for (var i = 0; i < listeners.length; i++) { + var listener = listeners[i]; + listener(); + } + + return action; + } + + /** + * Replaces the reducer currently used by the store to calculate the state. + * + * You might need this if your app implements code splitting and you want to + * load some of the reducers dynamically. You might also need this if you + * implement a hot reloading mechanism for Redux. + * + * @param {Function} nextReducer The reducer for the store to use instead. + * @returns {void} + */ + function replaceReducer(nextReducer) { + if (typeof nextReducer !== 'function') { + throw new Error('Expected the nextReducer to be a function.'); + } + + currentReducer = nextReducer; + dispatch({ type: ActionTypes.INIT }); + } + + /** + * Interoperability point for observable/reactive libraries. + * @returns {observable} A minimal observable of state changes. + * For more information, see the observable proposal: + * https://github.com/tc39/proposal-observable + */ + function observable() { + var _ref; + + var outerSubscribe = subscribe; + return _ref = { + /** + * The minimal observable subscription method. + * @param {Object} observer Any object that can be used as an observer. + * The observer object should have a `next` method. + * @returns {subscription} An object with an `unsubscribe` method that can + * be used to unsubscribe the observable from the store, and prevent further + * emission of values from the observable. + */ + subscribe: function subscribe(observer) { + if (typeof observer !== 'object') { + throw new TypeError('Expected the observer to be an object.'); + } + + function observeState() { + if (observer.next) { + observer.next(getState()); + } + } + + observeState(); + var unsubscribe = outerSubscribe(observeState); + return { unsubscribe: unsubscribe }; + } + }, _ref[es["a" /* default */]] = function () { + return this; + }, _ref; + } + + // When a store is created, an "INIT" action is dispatched so that every + // reducer returns their initial state. This effectively populates + // the initial state tree. + dispatch({ type: ActionTypes.INIT }); + + return _ref2 = { + dispatch: dispatch, + subscribe: subscribe, + getState: getState, + replaceReducer: replaceReducer + }, _ref2[es["a" /* default */]] = observable, _ref2; +} +// CONCATENATED MODULE: ./node_modules/redux/es/utils/warning.js +/** + * Prints a warning in the console if it exists. + * + * @param {String} message The warning message. + * @returns {void} + */ +function warning(message) { + /* eslint-disable no-console */ + if (typeof console !== 'undefined' && typeof console.error === 'function') { + console.error(message); + } + /* eslint-enable no-console */ + try { + // This error was thrown as a convenience so that if you enable + // "break on all exceptions" in your console, + // it would pause the execution at this line. + throw new Error(message); + /* eslint-disable no-empty */ + } catch (e) {} + /* eslint-enable no-empty */ +} +// CONCATENATED MODULE: ./node_modules/redux/es/combineReducers.js + + + + +function getUndefinedStateErrorMessage(key, action) { + var actionType = action && action.type; + var actionName = actionType && '"' + actionType.toString() + '"' || 'an action'; + + return 'Given action ' + actionName + ', reducer "' + key + '" returned undefined. ' + 'To ignore an action, you must explicitly return the previous state. ' + 'If you want this reducer to hold no value, you can return null instead of undefined.'; +} + +function getUnexpectedStateShapeWarningMessage(inputState, reducers, action, unexpectedKeyCache) { + var reducerKeys = Object.keys(reducers); + var argumentName = action && action.type === ActionTypes.INIT ? 'preloadedState argument passed to createStore' : 'previous state received by the reducer'; + + if (reducerKeys.length === 0) { + return 'Store does not have a valid reducer. Make sure the argument passed ' + 'to combineReducers is an object whose values are reducers.'; + } + + if (!lodash_es_isPlainObject(inputState)) { + return 'The ' + argumentName + ' has unexpected type of "' + {}.toString.call(inputState).match(/\s([a-z|A-Z]+)/)[1] + '". Expected argument to be an object with the following ' + ('keys: "' + reducerKeys.join('", "') + '"'); + } + + var unexpectedKeys = Object.keys(inputState).filter(function (key) { + return !reducers.hasOwnProperty(key) && !unexpectedKeyCache[key]; + }); + + unexpectedKeys.forEach(function (key) { + unexpectedKeyCache[key] = true; + }); + + if (unexpectedKeys.length > 0) { + return 'Unexpected ' + (unexpectedKeys.length > 1 ? 'keys' : 'key') + ' ' + ('"' + unexpectedKeys.join('", "') + '" found in ' + argumentName + '. ') + 'Expected to find one of the known reducer keys instead: ' + ('"' + reducerKeys.join('", "') + '". Unexpected keys will be ignored.'); + } +} + +function assertReducerShape(reducers) { + Object.keys(reducers).forEach(function (key) { + var reducer = reducers[key]; + var initialState = reducer(undefined, { type: ActionTypes.INIT }); + + if (typeof initialState === 'undefined') { + throw new Error('Reducer "' + key + '" returned undefined during initialization. ' + 'If the state passed to the reducer is undefined, you must ' + 'explicitly return the initial state. The initial state may ' + 'not be undefined. If you don\'t want to set a value for this reducer, ' + 'you can use null instead of undefined.'); + } + + var type = '@@redux/PROBE_UNKNOWN_ACTION_' + Math.random().toString(36).substring(7).split('').join('.'); + if (typeof reducer(undefined, { type: type }) === 'undefined') { + throw new Error('Reducer "' + key + '" returned undefined when probed with a random type. ' + ('Don\'t try to handle ' + ActionTypes.INIT + ' or other actions in "redux/*" ') + 'namespace. They are considered private. Instead, you must return the ' + 'current state for any unknown actions, unless it is undefined, ' + 'in which case you must return the initial state, regardless of the ' + 'action type. The initial state may not be undefined, but can be null.'); + } + }); +} + +/** + * Turns an object whose values are different reducer functions, into a single + * reducer function. It will call every child reducer, and gather their results + * into a single state object, whose keys correspond to the keys of the passed + * reducer functions. + * + * @param {Object} reducers An object whose values correspond to different + * reducer functions that need to be combined into one. One handy way to obtain + * it is to use ES6 `import * as reducers` syntax. The reducers may never return + * undefined for any action. Instead, they should return their initial state + * if the state passed to them was undefined, and the current state for any + * unrecognized action. + * + * @returns {Function} A reducer function that invokes every reducer inside the + * passed object, and builds a state object with the same shape. + */ +function combineReducers(reducers) { + var reducerKeys = Object.keys(reducers); + var finalReducers = {}; + for (var i = 0; i < reducerKeys.length; i++) { + var key = reducerKeys[i]; + + if (false) {} + + if (typeof reducers[key] === 'function') { + finalReducers[key] = reducers[key]; + } + } + var finalReducerKeys = Object.keys(finalReducers); + + var unexpectedKeyCache = void 0; + if (false) {} + + var shapeAssertionError = void 0; + try { + assertReducerShape(finalReducers); + } catch (e) { + shapeAssertionError = e; + } + + return function combination() { + var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + var action = arguments[1]; + + if (shapeAssertionError) { + throw shapeAssertionError; + } + + if (false) { var warningMessage; } + + var hasChanged = false; + var nextState = {}; + for (var _i = 0; _i < finalReducerKeys.length; _i++) { + var _key = finalReducerKeys[_i]; + var reducer = finalReducers[_key]; + var previousStateForKey = state[_key]; + var nextStateForKey = reducer(previousStateForKey, action); + if (typeof nextStateForKey === 'undefined') { + var errorMessage = getUndefinedStateErrorMessage(_key, action); + throw new Error(errorMessage); + } + nextState[_key] = nextStateForKey; + hasChanged = hasChanged || nextStateForKey !== previousStateForKey; + } + return hasChanged ? nextState : state; + }; +} +// CONCATENATED MODULE: ./node_modules/redux/es/bindActionCreators.js +function bindActionCreator(actionCreator, dispatch) { + return function () { + return dispatch(actionCreator.apply(undefined, arguments)); + }; +} + +/** + * Turns an object whose values are action creators, into an object with the + * same keys, but with every function wrapped into a `dispatch` call so they + * may be invoked directly. This is just a convenience method, as you can call + * `store.dispatch(MyActionCreators.doSomething())` yourself just fine. + * + * For convenience, you can also pass a single function as the first argument, + * and get a function in return. + * + * @param {Function|Object} actionCreators An object whose values are action + * creator functions. One handy way to obtain it is to use ES6 `import * as` + * syntax. You may also pass a single function. + * + * @param {Function} dispatch The `dispatch` function available on your Redux + * store. + * + * @returns {Function|Object} The object mimicking the original object, but with + * every action creator wrapped into the `dispatch` call. If you passed a + * function as `actionCreators`, the return value will also be a single + * function. + */ +function bindActionCreators(actionCreators, dispatch) { + if (typeof actionCreators === 'function') { + return bindActionCreator(actionCreators, dispatch); + } + + if (typeof actionCreators !== 'object' || actionCreators === null) { + throw new Error('bindActionCreators expected an object or a function, instead received ' + (actionCreators === null ? 'null' : typeof actionCreators) + '. ' + 'Did you write "import ActionCreators from" instead of "import * as ActionCreators from"?'); + } + + var keys = Object.keys(actionCreators); + var boundActionCreators = {}; + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + var actionCreator = actionCreators[key]; + if (typeof actionCreator === 'function') { + boundActionCreators[key] = bindActionCreator(actionCreator, dispatch); + } + } + return boundActionCreators; +} +// CONCATENATED MODULE: ./node_modules/redux/es/compose.js +/** + * Composes single-argument functions from right to left. The rightmost + * function can take multiple arguments as it provides the signature for + * the resulting composite function. + * + * @param {...Function} funcs The functions to compose. + * @returns {Function} A function obtained by composing the argument functions + * from right to left. For example, compose(f, g, h) is identical to doing + * (...args) => f(g(h(...args))). + */ + +function compose() { + for (var _len = arguments.length, funcs = Array(_len), _key = 0; _key < _len; _key++) { + funcs[_key] = arguments[_key]; + } + + if (funcs.length === 0) { + return function (arg) { + return arg; + }; + } + + if (funcs.length === 1) { + return funcs[0]; + } + + return funcs.reduce(function (a, b) { + return function () { + return a(b.apply(undefined, arguments)); + }; + }); +} +// CONCATENATED MODULE: ./node_modules/redux/es/applyMiddleware.js +var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; + + + +/** + * Creates a store enhancer that applies middleware to the dispatch method + * of the Redux store. This is handy for a variety of tasks, such as expressing + * asynchronous actions in a concise manner, or logging every action payload. + * + * See `redux-thunk` package as an example of the Redux middleware. + * + * Because middleware is potentially asynchronous, this should be the first + * store enhancer in the composition chain. + * + * Note that each middleware will be given the `dispatch` and `getState` functions + * as named arguments. + * + * @param {...Function} middlewares The middleware chain to be applied. + * @returns {Function} A store enhancer applying the middleware. + */ +function applyMiddleware() { + for (var _len = arguments.length, middlewares = Array(_len), _key = 0; _key < _len; _key++) { + middlewares[_key] = arguments[_key]; + } + + return function (createStore) { + return function (reducer, preloadedState, enhancer) { + var store = createStore(reducer, preloadedState, enhancer); + var _dispatch = store.dispatch; + var chain = []; + + var middlewareAPI = { + getState: store.getState, + dispatch: function dispatch(action) { + return _dispatch(action); + } + }; + chain = middlewares.map(function (middleware) { + return middleware(middlewareAPI); + }); + _dispatch = compose.apply(undefined, chain)(store.dispatch); + + return _extends({}, store, { + dispatch: _dispatch + }); + }; + }; +} +// CONCATENATED MODULE: ./node_modules/redux/es/index.js +/* concated harmony reexport createStore */__webpack_require__.d(__webpack_exports__, "createStore", function() { return createStore_createStore; }); +/* concated harmony reexport combineReducers */__webpack_require__.d(__webpack_exports__, "combineReducers", function() { return combineReducers; }); +/* concated harmony reexport bindActionCreators */__webpack_require__.d(__webpack_exports__, "bindActionCreators", function() { return bindActionCreators; }); +/* concated harmony reexport applyMiddleware */__webpack_require__.d(__webpack_exports__, "applyMiddleware", function() { return applyMiddleware; }); +/* concated harmony reexport compose */__webpack_require__.d(__webpack_exports__, "compose", function() { return compose; }); + + + + + + + +/* +* This is a dummy function to check if the function name has been altered by minification. +* If the function has been minified and NODE_ENV !== 'production', warn the user. +*/ +function isCrushed() {} + +if (false) {} + + + +/***/ }), +/* 7 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return symbolObservablePonyfill; }); +function symbolObservablePonyfill(root) { + var result; + var Symbol = root.Symbol; + + if (typeof Symbol === 'function') { + if (Symbol.observable) { + result = Symbol.observable; + } else { + result = Symbol('observable'); + Symbol.observable = result; + } + } else { + result = '@@observable'; + } + + return result; +}; + + +/***/ }), +/* 8 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +/* WEBPACK VAR INJECTION */(function(global) {/** Detect free variable `global` from Node.js. */ +var freeGlobal = typeof global == 'object' && global && global.Object === Object && global; + +/* harmony default export */ __webpack_exports__["a"] = (freeGlobal); + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(3))) + +/***/ }), +/* 9 */ +/***/ (function(module, exports, __webpack_require__) { + +module.exports = __webpack_require__(10); + + +/***/ }), +/* 10 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _fuse = _interopRequireDefault(__webpack_require__(11)); + +var _deepmerge = _interopRequireDefault(__webpack_require__(12)); + +var _store = _interopRequireDefault(__webpack_require__(13)); + +var _components = __webpack_require__(20); + +var _constants = __webpack_require__(1); + +var _templates = __webpack_require__(5); + +var _choices = __webpack_require__(28); + +var _items = __webpack_require__(29); + +var _groups = __webpack_require__(30); + +var _misc = __webpack_require__(31); + +var _general = __webpack_require__(32); + +var _utils = __webpack_require__(0); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + +/** + * Choices + * @author Josh Johnson + */ +var Choices = +/*#__PURE__*/ +function () { + function Choices() { + var element = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '[data-choice]'; + var userConfig = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + + _classCallCheck(this, Choices); + + if ((0, _utils.isType)('String', element)) { + var elements = Array.from(document.querySelectorAll(element)); // If there are multiple elements, create a new instance + // for each element besides the first one (as that already has an instance) + + if (elements.length > 1) { + return this._generateInstances(elements, userConfig); + } + } + + this.config = _deepmerge.default.all([_constants.DEFAULT_CONFIG, Choices.userDefaults, userConfig], // When merging array configs, replace with a copy of the userConfig array, + // instead of concatenating with the default array + { + arrayMerge: function arrayMerge(destinationArray, sourceArray) { + return [].concat(sourceArray); + } + }); + var invalidConfigOptions = (0, _utils.diff)(this.config, _constants.DEFAULT_CONFIG); + + if (invalidConfigOptions.length) { + console.warn('Unknown config option(s) passed', invalidConfigOptions.join(', ')); + } + + if (!['auto', 'always'].includes(this.config.renderSelectedChoices)) { + this.config.renderSelectedChoices = 'auto'; + } // Retrieve triggering element (i.e. element with 'data-choice' trigger) + + + var passedElement = (0, _utils.isType)('String', element) ? document.querySelector(element) : element; + + if (!passedElement) { + return console.error('Could not find passed element or passed element was of an invalid type'); + } + + this._isTextElement = passedElement.type === 'text'; + this._isSelectOneElement = passedElement.type === 'select-one'; + this._isSelectMultipleElement = passedElement.type === 'select-multiple'; + this._isSelectElement = this._isSelectOneElement || this._isSelectMultipleElement; + + if (this._isTextElement) { + this.passedElement = new _components.WrappedInput({ + element: passedElement, + classNames: this.config.classNames, + delimiter: this.config.delimiter + }); + } else if (this._isSelectElement) { + this.passedElement = new _components.WrappedSelect({ + element: passedElement, + classNames: this.config.classNames + }); + } + + if (!this.passedElement) { + return console.error('Passed element was of an invalid type'); + } + + if (this.config.shouldSortItems === true && this._isSelectOneElement && !this.config.silent) { + console.warn("shouldSortElements: Type of passed element is 'select-one', falling back to false."); + } + + this.initialised = false; + this._store = new _store.default(this.render); + this._initialState = {}; + this._currentState = {}; + this._prevState = {}; + this._currentValue = ''; + this._canSearch = this.config.searchEnabled; + this._isScrollingOnIe = false; + this._highlightPosition = 0; + this._wasTap = true; + this._placeholderValue = this._generatePlaceholderValue(); + this._baseId = (0, _utils.generateId)(this.passedElement.element, 'choices-'); + this._direction = this.passedElement.element.getAttribute('dir') || 'ltr'; + this._idNames = { + itemChoice: 'item-choice' + }; // Assign preset choices from passed object + + this._presetChoices = this.config.choices; // Assign preset items from passed object first + + this._presetItems = this.config.items; // Then add any values passed from attribute + + if (this.passedElement.value) { + this._presetItems = this._presetItems.concat(this.passedElement.value.split(this.config.delimiter)); + } + + this._render = this._render.bind(this); + this._onFocus = this._onFocus.bind(this); + this._onBlur = this._onBlur.bind(this); + this._onKeyUp = this._onKeyUp.bind(this); + this._onKeyDown = this._onKeyDown.bind(this); + this._onClick = this._onClick.bind(this); + this._onTouchMove = this._onTouchMove.bind(this); + this._onTouchEnd = this._onTouchEnd.bind(this); + this._onMouseDown = this._onMouseDown.bind(this); + this._onMouseOver = this._onMouseOver.bind(this); + this._onFormReset = this._onFormReset.bind(this); + this._onAKey = this._onAKey.bind(this); + this._onEnterKey = this._onEnterKey.bind(this); + this._onEscapeKey = this._onEscapeKey.bind(this); + this._onDirectionKey = this._onDirectionKey.bind(this); + this._onDeleteKey = this._onDeleteKey.bind(this); // If element has already been initialised with Choices, fail silently + + if (this.passedElement.element.getAttribute('data-choice') === 'active') { + console.warn('Trying to initialise Choices on element already initialised'); + } // Let's go + + + this.init(); + } + /* ======================================== + = Public functions = + ======================================== */ + + + _createClass(Choices, [{ + key: "init", + value: function init() { + if (this.initialised) { + return; + } + + this._createTemplates(); + + this._createElements(); + + this._createStructure(); // Set initial state (We need to clone the state because some reducers + // modify the inner objects properties in the state) 🤢 + + + this._initialState = (0, _utils.cloneObject)(this._store.state); + + this._store.subscribe(this._render); + + this._render(); + + this._addEventListeners(); + + var shouldDisable = !this.config.addItems || this.passedElement.element.hasAttribute('disabled'); + + if (shouldDisable) { + this.disable(); + } + + this.initialised = true; + var callbackOnInit = this.config.callbackOnInit; // Run callback if it is a function + + if (callbackOnInit && (0, _utils.isType)('Function', callbackOnInit)) { + callbackOnInit.call(this); + } + } + }, { + key: "destroy", + value: function destroy() { + if (!this.initialised) { + return; + } + + this._removeEventListeners(); + + this.passedElement.reveal(); + this.containerOuter.unwrap(this.passedElement.element); + + if (this._isSelectElement) { + this.passedElement.options = this._presetChoices; + } + + this.clearStore(); + this.config.templates = null; + this.initialised = false; + } + }, { + key: "enable", + value: function enable() { + if (this.passedElement.isDisabled) { + this.passedElement.enable(); + } + + if (this.containerOuter.isDisabled) { + this._addEventListeners(); + + this.input.enable(); + this.containerOuter.enable(); + } + + return this; + } + }, { + key: "disable", + value: function disable() { + if (!this.passedElement.isDisabled) { + this.passedElement.disable(); + } + + if (!this.containerOuter.isDisabled) { + this._removeEventListeners(); + + this.input.disable(); + this.containerOuter.disable(); + } + + return this; + } + }, { + key: "highlightItem", + value: function highlightItem(item) { + var runEvent = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; + + if (!item) { + return this; + } + + var id = item.id, + _item$groupId = item.groupId, + groupId = _item$groupId === void 0 ? -1 : _item$groupId, + _item$value = item.value, + value = _item$value === void 0 ? '' : _item$value, + _item$label = item.label, + label = _item$label === void 0 ? '' : _item$label; + var group = groupId >= 0 ? this._store.getGroupById(groupId) : null; + + this._store.dispatch((0, _items.highlightItem)(id, true)); + + if (runEvent) { + this.passedElement.triggerEvent(_constants.EVENTS.highlightItem, { + id: id, + value: value, + label: label, + groupValue: group && group.value ? group.value : null + }); + } + + return this; + } + }, { + key: "unhighlightItem", + value: function unhighlightItem(item) { + if (!item) { + return this; + } + + var id = item.id, + _item$groupId2 = item.groupId, + groupId = _item$groupId2 === void 0 ? -1 : _item$groupId2, + _item$value2 = item.value, + value = _item$value2 === void 0 ? '' : _item$value2, + _item$label2 = item.label, + label = _item$label2 === void 0 ? '' : _item$label2; + var group = groupId >= 0 ? this._store.getGroupById(groupId) : null; + + this._store.dispatch((0, _items.highlightItem)(id, false)); + + this.passedElement.triggerEvent(_constants.EVENTS.highlightItem, { + id: id, + value: value, + label: label, + groupValue: group && group.value ? group.value : null + }); + return this; + } + }, { + key: "highlightAll", + value: function highlightAll() { + var _this = this; + + this._store.items.forEach(function (item) { + return _this.highlightItem(item); + }); + + return this; + } + }, { + key: "unhighlightAll", + value: function unhighlightAll() { + var _this2 = this; + + this._store.items.forEach(function (item) { + return _this2.unhighlightItem(item); + }); + + return this; + } + }, { + key: "removeActiveItemsByValue", + value: function removeActiveItemsByValue(value) { + var _this3 = this; + + this._store.activeItems.filter(function (item) { + return item.value === value; + }).forEach(function (item) { + return _this3._removeItem(item); + }); + + return this; + } + }, { + key: "removeActiveItems", + value: function removeActiveItems(excludedId) { + var _this4 = this; + + this._store.activeItems.filter(function (_ref) { + var id = _ref.id; + return id !== excludedId; + }).forEach(function (item) { + return _this4._removeItem(item); + }); + + return this; + } + }, { + key: "removeHighlightedItems", + value: function removeHighlightedItems() { + var _this5 = this; + + var runEvent = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + + this._store.highlightedActiveItems.forEach(function (item) { + _this5._removeItem(item); // If this action was performed by the user + // trigger the event + + + if (runEvent) { + _this5._triggerChange(item.value); + } + }); + + return this; + } + }, { + key: "showDropdown", + value: function showDropdown(preventInputFocus) { + var _this6 = this; + + if (this.dropdown.isActive) { + return this; + } + + requestAnimationFrame(function () { + _this6.dropdown.show(); + + _this6.containerOuter.open(_this6.dropdown.distanceFromTopWindow()); + + if (!preventInputFocus && _this6._canSearch) { + _this6.input.focus(); + } + + _this6.passedElement.triggerEvent(_constants.EVENTS.showDropdown, {}); + }); + return this; + } + }, { + key: "hideDropdown", + value: function hideDropdown(preventInputBlur) { + var _this7 = this; + + if (!this.dropdown.isActive) { + return this; + } + + requestAnimationFrame(function () { + _this7.dropdown.hide(); + + _this7.containerOuter.close(); + + if (!preventInputBlur && _this7._canSearch) { + _this7.input.removeActiveDescendant(); + + _this7.input.blur(); + } + + _this7.passedElement.triggerEvent(_constants.EVENTS.hideDropdown, {}); + }); + return this; + } + }, { + key: "getValue", + value: function getValue() { + var valueOnly = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + + var values = this._store.activeItems.reduce(function (selectedItems, item) { + var itemValue = valueOnly ? item.value : item; + selectedItems.push(itemValue); + return selectedItems; + }, []); + + return this._isSelectOneElement ? values[0] : values; + } + }, { + key: "setValue", + value: function setValue(args) { + var _this8 = this; + + if (!this.initialised) { + return this; + } + + [].concat(args).forEach(function (value) { + return _this8._setChoiceOrItem(value); + }); + return this; + } + }, { + key: "setChoiceByValue", + value: function setChoiceByValue(value) { + var _this9 = this; + + if (!this.initialised || this._isTextElement) { + return this; + } // If only one value has been passed, convert to array + + + var choiceValue = (0, _utils.isType)('Array', value) ? value : [value]; // Loop through each value and + + choiceValue.forEach(function (val) { + return _this9._findAndSelectChoiceByValue(val); + }); + return this; + } + }, { + key: "setChoices", + value: function setChoices() { + var _this10 = this; + + var choices = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; + var value = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; + var label = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ''; + var replaceChoices = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false; + + if (!this._isSelectElement || !value) { + return this; + } // Clear choices if needed + + + if (replaceChoices) { + this.clearChoices(); + } + + this.containerOuter.removeLoadingState(); + + var addGroupsAndChoices = function addGroupsAndChoices(groupOrChoice) { + if (groupOrChoice.choices) { + _this10._addGroup({ + group: groupOrChoice, + id: groupOrChoice.id || null, + valueKey: value, + labelKey: label + }); + } else { + _this10._addChoice({ + value: groupOrChoice[value], + label: groupOrChoice[label], + isSelected: groupOrChoice.selected, + isDisabled: groupOrChoice.disabled, + customProperties: groupOrChoice.customProperties, + placeholder: groupOrChoice.placeholder + }); + } + }; + + this._setLoading(true); + + choices.forEach(addGroupsAndChoices); + + this._setLoading(false); + + return this; + } + }, { + key: "clearChoices", + value: function clearChoices() { + this._store.dispatch((0, _choices.clearChoices)()); + } + }, { + key: "clearStore", + value: function clearStore() { + this._store.dispatch((0, _misc.clearAll)()); + + return this; + } + }, { + key: "clearInput", + value: function clearInput() { + var shouldSetInputWidth = !this._isSelectOneElement; + this.input.clear(shouldSetInputWidth); + + if (!this._isTextElement && this._canSearch) { + this._isSearching = false; + + this._store.dispatch((0, _choices.activateChoices)(true)); + } + + return this; + } + }, { + key: "ajax", + value: function ajax(fn) { + var _this11 = this; + + if (!this.initialised || !this._isSelectElement || !fn) { + return this; + } + + requestAnimationFrame(function () { + return _this11._handleLoadingState(true); + }); + fn(this._ajaxCallback()); + return this; + } + /* ===== End of Public functions ====== */ + + /* ============================================= + = Private functions = + ============================================= */ + + }, { + key: "_render", + value: function _render() { + if (this._store.isLoading()) { + return; + } + + this._currentState = this._store.state; + var stateChanged = this._currentState.choices !== this._prevState.choices || this._currentState.groups !== this._prevState.groups || this._currentState.items !== this._prevState.items; + var shouldRenderChoices = this._isSelectElement; + var shouldRenderItems = this._currentState.items !== this._prevState.items; + + if (!stateChanged) { + return; + } + + if (shouldRenderChoices) { + this._renderChoices(); + } + + if (shouldRenderItems) { + this._renderItems(); + } + + this._prevState = this._currentState; + } + }, { + key: "_renderChoices", + value: function _renderChoices() { + var _this12 = this; + + var _this$_store = this._store, + activeGroups = _this$_store.activeGroups, + activeChoices = _this$_store.activeChoices; + var choiceListFragment = document.createDocumentFragment(); + this.choiceList.clear(); + + if (this.config.resetScrollPosition) { + requestAnimationFrame(function () { + return _this12.choiceList.scrollToTop(); + }); + } // If we have grouped options + + + if (activeGroups.length >= 1 && !this._isSearching) { + // If we have a placeholder choice along with groups + var activePlaceholders = activeChoices.filter(function (activeChoice) { + return activeChoice.placeholder === true && activeChoice.groupId === -1; + }); + + if (activePlaceholders.length >= 1) { + choiceListFragment = this._createChoicesFragment(activePlaceholders, choiceListFragment); + } + + choiceListFragment = this._createGroupsFragment(activeGroups, activeChoices, choiceListFragment); + } else if (activeChoices.length >= 1) { + choiceListFragment = this._createChoicesFragment(activeChoices, choiceListFragment); + } // If we have choices to show + + + if (choiceListFragment.childNodes && choiceListFragment.childNodes.length > 0) { + var activeItems = this._store.activeItems; + + var canAddItem = this._canAddItem(activeItems, this.input.value); // ...and we can select them + + + if (canAddItem.response) { + // ...append them and highlight the first choice + this.choiceList.append(choiceListFragment); + + this._highlightChoice(); + } else { + // ...otherwise show a notice + this.choiceList.append(this._getTemplate('notice', canAddItem.notice)); + } + } else { + // Otherwise show a notice + var dropdownItem; + var notice; + + if (this._isSearching) { + notice = (0, _utils.isType)('Function', this.config.noResultsText) ? this.config.noResultsText() : this.config.noResultsText; + dropdownItem = this._getTemplate('notice', notice, 'no-results'); + } else { + notice = (0, _utils.isType)('Function', this.config.noChoicesText) ? this.config.noChoicesText() : this.config.noChoicesText; + dropdownItem = this._getTemplate('notice', notice, 'no-choices'); + } + + this.choiceList.append(dropdownItem); + } + } + }, { + key: "_renderItems", + value: function _renderItems() { + var activeItems = this._store.activeItems || []; + this.itemList.clear(); // Create a fragment to store our list items + // (so we don't have to update the DOM for each item) + + var itemListFragment = this._createItemsFragment(activeItems); // If we have items to add, append them + + + if (itemListFragment.childNodes) { + this.itemList.append(itemListFragment); + } + } + }, { + key: "_createGroupsFragment", + value: function _createGroupsFragment(groups, choices, fragment) { + var _this13 = this; + + var groupFragment = fragment || document.createDocumentFragment(); + + var getGroupChoices = function getGroupChoices(group) { + return choices.filter(function (choice) { + if (_this13._isSelectOneElement) { + return choice.groupId === group.id; + } + + return choice.groupId === group.id && (_this13.config.renderSelectedChoices === 'always' || !choice.selected); + }); + }; // If sorting is enabled, filter groups + + + if (this.config.shouldSort) { + groups.sort(this.config.sortFn); + } + + groups.forEach(function (group) { + var groupChoices = getGroupChoices(group); + + if (groupChoices.length >= 1) { + var dropdownGroup = _this13._getTemplate('choiceGroup', group); + + groupFragment.appendChild(dropdownGroup); + + _this13._createChoicesFragment(groupChoices, groupFragment, true); + } + }); + return groupFragment; + } + }, { + key: "_createChoicesFragment", + value: function _createChoicesFragment(choices, fragment) { + var _this14 = this; + + var withinGroup = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + // Create a fragment to store our list items (so we don't have to update the DOM for each item) + var choicesFragment = fragment || document.createDocumentFragment(); + var _this$config = this.config, + renderSelectedChoices = _this$config.renderSelectedChoices, + searchResultLimit = _this$config.searchResultLimit, + renderChoiceLimit = _this$config.renderChoiceLimit; + var filter = this._isSearching ? _utils.sortByScore : this.config.sortFn; + + var appendChoice = function appendChoice(choice) { + var shouldRender = renderSelectedChoices === 'auto' ? _this14._isSelectOneElement || !choice.selected : true; + + if (shouldRender) { + var dropdownItem = _this14._getTemplate('choice', choice, _this14.config.itemSelectText); + + choicesFragment.appendChild(dropdownItem); + } + }; + + var rendererableChoices = choices; + + if (renderSelectedChoices === 'auto' && !this._isSelectOneElement) { + rendererableChoices = choices.filter(function (choice) { + return !choice.selected; + }); + } // Split array into placeholders and "normal" choices + + + var _rendererableChoices$ = rendererableChoices.reduce(function (acc, choice) { + if (choice.placeholder) { + acc.placeholderChoices.push(choice); + } else { + acc.normalChoices.push(choice); + } + + return acc; + }, { + placeholderChoices: [], + normalChoices: [] + }), + placeholderChoices = _rendererableChoices$.placeholderChoices, + normalChoices = _rendererableChoices$.normalChoices; // If sorting is enabled or the user is searching, filter choices + + + if (this.config.shouldSort || this._isSearching) { + normalChoices.sort(filter); + } + + var choiceLimit = rendererableChoices.length; // Prepend placeholeder + + var sortedChoices = [].concat(placeholderChoices, normalChoices); + + if (this._isSearching) { + choiceLimit = searchResultLimit; + } else if (renderChoiceLimit > 0 && !withinGroup) { + choiceLimit = renderChoiceLimit; + } // Add each choice to dropdown within range + + + for (var i = 0; i < choiceLimit; i += 1) { + if (sortedChoices[i]) { + appendChoice(sortedChoices[i]); + } + } + + return choicesFragment; + } + }, { + key: "_createItemsFragment", + value: function _createItemsFragment(items) { + var _this15 = this; + + var fragment = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; + // Create fragment to add elements to + var _this$config2 = this.config, + shouldSortItems = _this$config2.shouldSortItems, + sortFn = _this$config2.sortFn, + removeItemButton = _this$config2.removeItemButton; + var itemListFragment = fragment || document.createDocumentFragment(); // If sorting is enabled, filter items + + if (shouldSortItems && !this._isSelectOneElement) { + items.sort(sortFn); + } + + if (this._isTextElement) { + // Update the value of the hidden input + this.passedElement.value = items; + } else { + // Update the options of the hidden input + this.passedElement.options = items; + } + + var addItemToFragment = function addItemToFragment(item) { + // Create new list element + var listItem = _this15._getTemplate('item', item, removeItemButton); // Append it to list + + + itemListFragment.appendChild(listItem); + }; // Add each list item to list + + + items.forEach(function (item) { + return addItemToFragment(item); + }); + return itemListFragment; + } + }, { + key: "_triggerChange", + value: function _triggerChange(value) { + if (value === undefined || value === null) { + return; + } + + this.passedElement.triggerEvent(_constants.EVENTS.change, { + value: value + }); + } + }, { + key: "_selectPlaceholderChoice", + value: function _selectPlaceholderChoice() { + var placeholderChoice = this._store.placeholderChoice; + + if (placeholderChoice) { + this._addItem({ + value: placeholderChoice.value, + label: placeholderChoice.label, + choiceId: placeholderChoice.id, + groupId: placeholderChoice.groupId, + placeholder: placeholderChoice.placeholder + }); + + this._triggerChange(placeholderChoice.value); + } + } + }, { + key: "_handleButtonAction", + value: function _handleButtonAction(activeItems, element) { + if (!activeItems || !element || !this.config.removeItems || !this.config.removeItemButton) { + return; + } + + var itemId = element.parentNode.getAttribute('data-id'); + var itemToRemove = activeItems.find(function (item) { + return item.id === parseInt(itemId, 10); + }); // Remove item associated with button + + this._removeItem(itemToRemove); + + this._triggerChange(itemToRemove.value); + + if (this._isSelectOneElement) { + this._selectPlaceholderChoice(); + } + } + }, { + key: "_handleItemAction", + value: function _handleItemAction(activeItems, element) { + var _this16 = this; + + var hasShiftKey = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + + if (!activeItems || !element || !this.config.removeItems || this._isSelectOneElement) { + return; + } + + var passedId = element.getAttribute('data-id'); // We only want to select one item with a click + // so we deselect any items that aren't the target + // unless shift is being pressed + + activeItems.forEach(function (item) { + if (item.id === parseInt(passedId, 10) && !item.highlighted) { + _this16.highlightItem(item); + } else if (!hasShiftKey && item.highlighted) { + _this16.unhighlightItem(item); + } + }); // Focus input as without focus, a user cannot do anything with a + // highlighted item + + this.input.focus(); + } + }, { + key: "_handleChoiceAction", + value: function _handleChoiceAction(activeItems, element) { + if (!activeItems || !element) { + return; + } // If we are clicking on an option + + + var id = element.getAttribute('data-id'); + + var choice = this._store.getChoiceById(id); + + var passedKeyCode = activeItems[0] && activeItems[0].keyCode ? activeItems[0].keyCode : null; + var hasActiveDropdown = this.dropdown.isActive; // Update choice keyCode + + choice.keyCode = passedKeyCode; + this.passedElement.triggerEvent(_constants.EVENTS.choice, { + choice: choice + }); + + if (choice && !choice.selected && !choice.disabled) { + var canAddItem = this._canAddItem(activeItems, choice.value); + + if (canAddItem.response) { + this._addItem({ + value: choice.value, + label: choice.label, + choiceId: choice.id, + groupId: choice.groupId, + customProperties: choice.customProperties, + placeholder: choice.placeholder, + keyCode: choice.keyCode + }); + + this._triggerChange(choice.value); + } + } + + this.clearInput(); // We wont to close the dropdown if we are dealing with a single select box + + if (hasActiveDropdown && this._isSelectOneElement) { + this.hideDropdown(true); + this.containerOuter.focus(); + } + } + }, { + key: "_handleBackspace", + value: function _handleBackspace(activeItems) { + if (!this.config.removeItems || !activeItems) { + return; + } + + var lastItem = activeItems[activeItems.length - 1]; + var hasHighlightedItems = activeItems.some(function (item) { + return item.highlighted; + }); // If editing the last item is allowed and there are not other selected items, + // we can edit the item value. Otherwise if we can remove items, remove all selected items + + if (this.config.editItems && !hasHighlightedItems && lastItem) { + this.input.value = lastItem.value; + this.input.setWidth(); + + this._removeItem(lastItem); + + this._triggerChange(lastItem.value); + } else { + if (!hasHighlightedItems) { + // Highlight last item if none already highlighted + this.highlightItem(lastItem, false); + } + + this.removeHighlightedItems(true); + } + } + }, { + key: "_setLoading", + value: function _setLoading(isLoading) { + this._store.dispatch((0, _general.setIsLoading)(isLoading)); + } + }, { + key: "_handleLoadingState", + value: function _handleLoadingState() { + var setLoading = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; + var placeholderItem = this.itemList.getChild(".".concat(this.config.classNames.placeholder)); + + if (setLoading) { + this.disable(); + this.containerOuter.addLoadingState(); + + if (this._isSelectOneElement) { + if (!placeholderItem) { + placeholderItem = this._getTemplate('placeholder', this.config.loadingText); + this.itemList.append(placeholderItem); + } else { + placeholderItem.innerHTML = this.config.loadingText; + } + } else { + this.input.placeholder = this.config.loadingText; + } + } else { + this.enable(); + this.containerOuter.removeLoadingState(); + + if (this._isSelectOneElement) { + placeholderItem.innerHTML = this._placeholderValue || ''; + } else { + this.input.placeholder = this._placeholderValue || ''; + } + } + } + }, { + key: "_handleSearch", + value: function _handleSearch(value) { + if (!value || !this.input.isFocussed) { + return; + } + + var choices = this._store.choices; + var _this$config3 = this.config, + searchFloor = _this$config3.searchFloor, + searchChoices = _this$config3.searchChoices; + var hasUnactiveChoices = choices.some(function (option) { + return !option.active; + }); // Check that we have a value to search and the input was an alphanumeric character + + if (value && value.length >= searchFloor) { + var resultCount = searchChoices ? this._searchChoices(value) : 0; // Trigger search event + + this.passedElement.triggerEvent(_constants.EVENTS.search, { + value: value, + resultCount: resultCount + }); + } else if (hasUnactiveChoices) { + // Otherwise reset choices to active + this._isSearching = false; + + this._store.dispatch((0, _choices.activateChoices)(true)); + } + } + }, { + key: "_canAddItem", + value: function _canAddItem(activeItems, value) { + var canAddItem = true; + var notice = (0, _utils.isType)('Function', this.config.addItemText) ? this.config.addItemText(value) : this.config.addItemText; + + if (!this._isSelectOneElement) { + var isDuplicateValue = (0, _utils.existsInArray)(activeItems, value); + + if (this.config.maxItemCount > 0 && this.config.maxItemCount <= activeItems.length) { + // If there is a max entry limit and we have reached that limit + // don't update + canAddItem = false; + notice = (0, _utils.isType)('Function', this.config.maxItemText) ? this.config.maxItemText(this.config.maxItemCount) : this.config.maxItemText; + } + + if (!this.config.duplicateItemsAllowed && isDuplicateValue && canAddItem) { + canAddItem = false; + notice = (0, _utils.isType)('Function', this.config.uniqueItemText) ? this.config.uniqueItemText(value) : this.config.uniqueItemText; + } + + if (this._isTextElement && this.config.addItems && canAddItem && (0, _utils.isType)('Function', this.config.addItemFilterFn) && !this.config.addItemFilterFn(value)) { + canAddItem = false; + notice = (0, _utils.isType)('Function', this.config.customAddItemText) ? this.config.customAddItemText(value) : this.config.customAddItemText; + } + } + + return { + response: canAddItem, + notice: notice + }; + } + }, { + key: "_ajaxCallback", + value: function _ajaxCallback() { + var _this17 = this; + + return function (results, value, label) { + if (!results || !value) { + return; + } + + var parsedResults = (0, _utils.isType)('Object', results) ? [results] : results; + + if (parsedResults && (0, _utils.isType)('Array', parsedResults) && parsedResults.length) { + // Remove loading states/text + _this17._handleLoadingState(false); + + _this17._setLoading(true); // Add each result as a choice + + + parsedResults.forEach(function (result) { + if (result.choices) { + _this17._addGroup({ + group: result, + id: result.id || null, + valueKey: value, + labelKey: label + }); + } else { + _this17._addChoice({ + value: (0, _utils.fetchFromObject)(result, value), + label: (0, _utils.fetchFromObject)(result, label), + isSelected: result.selected, + isDisabled: result.disabled, + customProperties: result.customProperties, + placeholder: result.placeholder + }); + } + }); + + _this17._setLoading(false); + + if (_this17._isSelectOneElement) { + _this17._selectPlaceholderChoice(); + } + } else { + // No results, remove loading state + _this17._handleLoadingState(false); + } + }; + } + }, { + key: "_searchChoices", + value: function _searchChoices(value) { + var newValue = (0, _utils.isType)('String', value) ? value.trim() : value; + var currentValue = (0, _utils.isType)('String', this._currentValue) ? this._currentValue.trim() : this._currentValue; + + if (newValue.length < 1 && newValue === "".concat(currentValue, " ")) { + return 0; + } // If new value matches the desired length and is not the same as the current value with a space + + + var haystack = this._store.searchableChoices; + var needle = newValue; + var keys = [].concat(this.config.searchFields); + var options = Object.assign(this.config.fuseOptions, { + keys: keys + }); + var fuse = new _fuse.default(haystack, options); + var results = fuse.search(needle); + this._currentValue = newValue; + this._highlightPosition = 0; + this._isSearching = true; + + this._store.dispatch((0, _choices.filterChoices)(results)); + + return results.length; + } + }, { + key: "_addEventListeners", + value: function _addEventListeners() { + document.addEventListener('keyup', this._onKeyUp); + document.addEventListener('keydown', this._onKeyDown); + document.addEventListener('click', this._onClick); + document.addEventListener('touchmove', this._onTouchMove); + document.addEventListener('touchend', this._onTouchEnd); + document.addEventListener('mousedown', this._onMouseDown); + document.addEventListener('mouseover', this._onMouseOver); + + if (this._isSelectOneElement) { + this.containerOuter.element.addEventListener('focus', this._onFocus); + this.containerOuter.element.addEventListener('blur', this._onBlur); + } + + this.input.element.addEventListener('focus', this._onFocus); + this.input.element.addEventListener('blur', this._onBlur); + + if (this.input.element.form) { + this.input.element.form.addEventListener('reset', this._onFormReset); + } + + this.input.addEventListeners(); + } + }, { + key: "_removeEventListeners", + value: function _removeEventListeners() { + document.removeEventListener('keyup', this._onKeyUp); + document.removeEventListener('keydown', this._onKeyDown); + document.removeEventListener('click', this._onClick); + document.removeEventListener('touchmove', this._onTouchMove); + document.removeEventListener('touchend', this._onTouchEnd); + document.removeEventListener('mousedown', this._onMouseDown); + document.removeEventListener('mouseover', this._onMouseOver); + + if (this._isSelectOneElement) { + this.containerOuter.element.removeEventListener('focus', this._onFocus); + this.containerOuter.element.removeEventListener('blur', this._onBlur); + } + + this.input.element.removeEventListener('focus', this._onFocus); + this.input.element.removeEventListener('blur', this._onBlur); + + if (this.input.element.form) { + this.input.element.form.removeEventListener('reset', this._onFormReset); + } + + this.input.removeEventListeners(); + } + }, { + key: "_onKeyDown", + value: function _onKeyDown(event) { + var _keyDownActions; + + var target = event.target, + keyCode = event.keyCode, + ctrlKey = event.ctrlKey, + metaKey = event.metaKey; + + if (target !== this.input.element && !this.containerOuter.element.contains(target)) { + return; + } + + var activeItems = this._store.activeItems; + var hasFocusedInput = this.input.isFocussed; + var hasActiveDropdown = this.dropdown.isActive; + var hasItems = this.itemList.hasChildren; + var keyString = String.fromCharCode(keyCode); + var BACK_KEY = _constants.KEY_CODES.BACK_KEY, + DELETE_KEY = _constants.KEY_CODES.DELETE_KEY, + ENTER_KEY = _constants.KEY_CODES.ENTER_KEY, + A_KEY = _constants.KEY_CODES.A_KEY, + ESC_KEY = _constants.KEY_CODES.ESC_KEY, + UP_KEY = _constants.KEY_CODES.UP_KEY, + DOWN_KEY = _constants.KEY_CODES.DOWN_KEY, + PAGE_UP_KEY = _constants.KEY_CODES.PAGE_UP_KEY, + PAGE_DOWN_KEY = _constants.KEY_CODES.PAGE_DOWN_KEY; + var hasCtrlDownKeyPressed = ctrlKey || metaKey; // If a user is typing and the dropdown is not active + + if (!this._isTextElement && /[a-zA-Z0-9-_ ]/.test(keyString)) { + this.showDropdown(); + } // Map keys to key actions + + + var keyDownActions = (_keyDownActions = {}, _defineProperty(_keyDownActions, A_KEY, this._onAKey), _defineProperty(_keyDownActions, ENTER_KEY, this._onEnterKey), _defineProperty(_keyDownActions, ESC_KEY, this._onEscapeKey), _defineProperty(_keyDownActions, UP_KEY, this._onDirectionKey), _defineProperty(_keyDownActions, PAGE_UP_KEY, this._onDirectionKey), _defineProperty(_keyDownActions, DOWN_KEY, this._onDirectionKey), _defineProperty(_keyDownActions, PAGE_DOWN_KEY, this._onDirectionKey), _defineProperty(_keyDownActions, DELETE_KEY, this._onDeleteKey), _defineProperty(_keyDownActions, BACK_KEY, this._onDeleteKey), _keyDownActions); // If keycode has a function, run it + + if (keyDownActions[keyCode]) { + keyDownActions[keyCode]({ + event: event, + target: target, + keyCode: keyCode, + metaKey: metaKey, + activeItems: activeItems, + hasFocusedInput: hasFocusedInput, + hasActiveDropdown: hasActiveDropdown, + hasItems: hasItems, + hasCtrlDownKeyPressed: hasCtrlDownKeyPressed + }); + } + } + }, { + key: "_onKeyUp", + value: function _onKeyUp(_ref2) { + var target = _ref2.target, + keyCode = _ref2.keyCode; + + if (target !== this.input.element) { + return; + } + + var value = this.input.value; + var activeItems = this._store.activeItems; + + var canAddItem = this._canAddItem(activeItems, value); + + var backKey = _constants.KEY_CODES.BACK_KEY, + deleteKey = _constants.KEY_CODES.DELETE_KEY; // We are typing into a text input and have a value, we want to show a dropdown + // notice. Otherwise hide the dropdown + + if (this._isTextElement) { + var canShowDropdownNotice = canAddItem.notice && value; + + if (canShowDropdownNotice) { + var dropdownItem = this._getTemplate('notice', canAddItem.notice); + + this.dropdown.element.innerHTML = dropdownItem.outerHTML; + this.showDropdown(true); + } else { + this.hideDropdown(true); + } + } else { + var userHasRemovedValue = (keyCode === backKey || keyCode === deleteKey) && !target.value; + var canReactivateChoices = !this._isTextElement && this._isSearching; + var canSearch = this._canSearch && canAddItem.response; + + if (userHasRemovedValue && canReactivateChoices) { + this._isSearching = false; + + this._store.dispatch((0, _choices.activateChoices)(true)); + } else if (canSearch) { + this._handleSearch(this.input.value); + } + } + + this._canSearch = this.config.searchEnabled; + } + }, { + key: "_onAKey", + value: function _onAKey(_ref3) { + var hasItems = _ref3.hasItems, + hasCtrlDownKeyPressed = _ref3.hasCtrlDownKeyPressed; + + // If CTRL + A or CMD + A have been pressed and there are items to select + if (hasCtrlDownKeyPressed && hasItems) { + this._canSearch = false; + var shouldHightlightAll = this.config.removeItems && !this.input.value && this.input.element === document.activeElement; + + if (shouldHightlightAll) { + this.highlightAll(); + } + } + } + }, { + key: "_onEnterKey", + value: function _onEnterKey(_ref4) { + var event = _ref4.event, + target = _ref4.target, + activeItems = _ref4.activeItems, + hasActiveDropdown = _ref4.hasActiveDropdown; + var enterKey = _constants.KEY_CODES.ENTER_KEY; + var targetWasButton = target.hasAttribute('data-button'); + + if (this._isTextElement && target.value) { + var value = this.input.value; + + var canAddItem = this._canAddItem(activeItems, value); + + if (canAddItem.response) { + this.hideDropdown(true); + + this._addItem({ + value: value + }); + + this._triggerChange(value); + + this.clearInput(); + } + } + + if (targetWasButton) { + this._handleButtonAction(activeItems, target); + + event.preventDefault(); + } + + if (hasActiveDropdown) { + var highlightedChoice = this.dropdown.getChild(".".concat(this.config.classNames.highlightedState)); + + if (highlightedChoice) { + // add enter keyCode value + if (activeItems[0]) { + activeItems[0].keyCode = enterKey; // eslint-disable-line no-param-reassign + } + + this._handleChoiceAction(activeItems, highlightedChoice); + } + + event.preventDefault(); + } else if (this._isSelectOneElement) { + this.showDropdown(); + event.preventDefault(); + } + } + }, { + key: "_onEscapeKey", + value: function _onEscapeKey(_ref5) { + var hasActiveDropdown = _ref5.hasActiveDropdown; + + if (hasActiveDropdown) { + this.hideDropdown(true); + this.containerOuter.focus(); + } + } + }, { + key: "_onDirectionKey", + value: function _onDirectionKey(_ref6) { + var event = _ref6.event, + hasActiveDropdown = _ref6.hasActiveDropdown, + keyCode = _ref6.keyCode, + metaKey = _ref6.metaKey; + var downKey = _constants.KEY_CODES.DOWN_KEY, + pageUpKey = _constants.KEY_CODES.PAGE_UP_KEY, + pageDownKey = _constants.KEY_CODES.PAGE_DOWN_KEY; // If up or down key is pressed, traverse through options + + if (hasActiveDropdown || this._isSelectOneElement) { + this.showDropdown(); + this._canSearch = false; + var directionInt = keyCode === downKey || keyCode === pageDownKey ? 1 : -1; + var skipKey = metaKey || keyCode === pageDownKey || keyCode === pageUpKey; + var selectableChoiceIdentifier = '[data-choice-selectable]'; + var nextEl; + + if (skipKey) { + if (directionInt > 0) { + nextEl = Array.from(this.dropdown.element.querySelectorAll(selectableChoiceIdentifier)).pop(); + } else { + nextEl = this.dropdown.element.querySelector(selectableChoiceIdentifier); + } + } else { + var currentEl = this.dropdown.element.querySelector(".".concat(this.config.classNames.highlightedState)); + + if (currentEl) { + nextEl = (0, _utils.getAdjacentEl)(currentEl, selectableChoiceIdentifier, directionInt); + } else { + nextEl = this.dropdown.element.querySelector(selectableChoiceIdentifier); + } + } + + if (nextEl) { + // We prevent default to stop the cursor moving + // when pressing the arrow + if (!(0, _utils.isScrolledIntoView)(nextEl, this.choiceList.element, directionInt)) { + this.choiceList.scrollToChoice(nextEl, directionInt); + } + + this._highlightChoice(nextEl); + } // Prevent default to maintain cursor position whilst + // traversing dropdown options + + + event.preventDefault(); + } + } + }, { + key: "_onDeleteKey", + value: function _onDeleteKey(_ref7) { + var event = _ref7.event, + target = _ref7.target, + hasFocusedInput = _ref7.hasFocusedInput, + activeItems = _ref7.activeItems; + + // If backspace or delete key is pressed and the input has no value + if (hasFocusedInput && !target.value && !this._isSelectOneElement) { + this._handleBackspace(activeItems); + + event.preventDefault(); + } + } + }, { + key: "_onTouchMove", + value: function _onTouchMove() { + if (this._wasTap) { + this._wasTap = false; + } + } + }, { + key: "_onTouchEnd", + value: function _onTouchEnd(event) { + var _ref8 = event || event.touches[0], + target = _ref8.target; + + var touchWasWithinContainer = this._wasTap && this.containerOuter.element.contains(target); + + if (touchWasWithinContainer) { + var containerWasExactTarget = target === this.containerOuter.element || target === this.containerInner.element; + + if (containerWasExactTarget) { + if (this._isTextElement) { + this.input.focus(); + } else if (this._isSelectMultipleElement) { + this.showDropdown(); + } + } // Prevents focus event firing + + + event.stopPropagation(); + } + + this._wasTap = true; + } + }, { + key: "_onMouseDown", + value: function _onMouseDown(event) { + var target = event.target, + shiftKey = event.shiftKey; // If we have our mouse down on the scrollbar and are on IE11... + + if (this.choiceList.element.contains(target) && (0, _utils.isIE11)()) { + this._isScrollingOnIe = true; + } + + if (!this.containerOuter.element.contains(target) || target === this.input.element) { + return; + } + + var activeItems = this._store.activeItems; + var hasShiftKey = shiftKey; + var buttonTarget = (0, _utils.findAncestorByAttrName)(target, 'data-button'); + var itemTarget = (0, _utils.findAncestorByAttrName)(target, 'data-item'); + var choiceTarget = (0, _utils.findAncestorByAttrName)(target, 'data-choice'); + + if (buttonTarget) { + this._handleButtonAction(activeItems, buttonTarget); + } else if (itemTarget) { + this._handleItemAction(activeItems, itemTarget, hasShiftKey); + } else if (choiceTarget) { + this._handleChoiceAction(activeItems, choiceTarget); + } + + event.preventDefault(); + } + }, { + key: "_onMouseOver", + value: function _onMouseOver(_ref9) { + var target = _ref9.target; + var targetWithinDropdown = target === this.dropdown || this.dropdown.element.contains(target); + var shouldHighlightChoice = targetWithinDropdown && target.hasAttribute('data-choice'); + + if (shouldHighlightChoice) { + this._highlightChoice(target); + } + } + }, { + key: "_onClick", + value: function _onClick(_ref10) { + var target = _ref10.target; + var clickWasWithinContainer = this.containerOuter.element.contains(target); + + if (clickWasWithinContainer) { + if (!this.dropdown.isActive && !this.containerOuter.isDisabled) { + if (this._isTextElement) { + if (document.activeElement !== this.input.element) { + this.input.focus(); + } + } else { + this.showDropdown(); + this.containerOuter.focus(); + } + } else if (this._isSelectOneElement && target !== this.input.element && !this.dropdown.element.contains(target)) { + this.hideDropdown(); + } + } else { + var hasHighlightedItems = this._store.highlightedActiveItems; + + if (hasHighlightedItems) { + this.unhighlightAll(); + } + + this.containerOuter.removeFocusState(); + this.hideDropdown(true); + } + } + }, { + key: "_onFocus", + value: function _onFocus(_ref11) { + var _this18 = this; + + var target = _ref11.target; + var focusWasWithinContainer = this.containerOuter.element.contains(target); + + if (!focusWasWithinContainer) { + return; + } + + var focusActions = { + text: function text() { + if (target === _this18.input.element) { + _this18.containerOuter.addFocusState(); + } + }, + 'select-one': function selectOne() { + _this18.containerOuter.addFocusState(); + + if (target === _this18.input.element) { + _this18.showDropdown(true); + } + }, + 'select-multiple': function selectMultiple() { + if (target === _this18.input.element) { + _this18.showDropdown(true); // If element is a select box, the focused element is the container and the dropdown + // isn't already open, focus and show dropdown + + + _this18.containerOuter.addFocusState(); + } + } + }; + focusActions[this.passedElement.element.type](); + } + }, { + key: "_onBlur", + value: function _onBlur(_ref12) { + var _this19 = this; + + var target = _ref12.target; + var blurWasWithinContainer = this.containerOuter.element.contains(target); + + if (blurWasWithinContainer && !this._isScrollingOnIe) { + var activeItems = this._store.activeItems; + var hasHighlightedItems = activeItems.some(function (item) { + return item.highlighted; + }); + var blurActions = { + text: function text() { + if (target === _this19.input.element) { + _this19.containerOuter.removeFocusState(); + + if (hasHighlightedItems) { + _this19.unhighlightAll(); + } + + _this19.hideDropdown(true); + } + }, + 'select-one': function selectOne() { + _this19.containerOuter.removeFocusState(); + + if (target === _this19.input.element || target === _this19.containerOuter.element && !_this19._canSearch) { + _this19.hideDropdown(true); + } + }, + 'select-multiple': function selectMultiple() { + if (target === _this19.input.element) { + _this19.containerOuter.removeFocusState(); + + _this19.hideDropdown(true); + + if (hasHighlightedItems) { + _this19.unhighlightAll(); + } + } + } + }; + blurActions[this.passedElement.element.type](); + } else { + // On IE11, clicking the scollbar blurs our input and thus + // closes the dropdown. To stop this, we refocus our input + // if we know we are on IE *and* are scrolling. + this._isScrollingOnIe = false; + this.input.element.focus(); + } + } + }, { + key: "_onFormReset", + value: function _onFormReset() { + this._store.dispatch((0, _misc.resetTo)(this._initialState)); + } + }, { + key: "_highlightChoice", + value: function _highlightChoice() { + var _this20 = this; + + var el = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; + var choices = Array.from(this.dropdown.element.querySelectorAll('[data-choice-selectable]')); + + if (!choices.length) { + return; + } + + var passedEl = el; + var highlightedChoices = Array.from(this.dropdown.element.querySelectorAll(".".concat(this.config.classNames.highlightedState))); // Remove any highlighted choices + + highlightedChoices.forEach(function (choice) { + choice.classList.remove(_this20.config.classNames.highlightedState); + choice.setAttribute('aria-selected', 'false'); + }); + + if (passedEl) { + this._highlightPosition = choices.indexOf(passedEl); + } else { + // Highlight choice based on last known highlight location + if (choices.length > this._highlightPosition) { + // If we have an option to highlight + passedEl = choices[this._highlightPosition]; + } else { + // Otherwise highlight the option before + passedEl = choices[choices.length - 1]; + } + + if (!passedEl) { + passedEl = choices[0]; + } + } + + passedEl.classList.add(this.config.classNames.highlightedState); + passedEl.setAttribute('aria-selected', 'true'); + this.passedElement.triggerEvent(_constants.EVENTS.highlightChoice, { + el: passedEl + }); + + if (this.dropdown.isActive) { + // IE11 ignores aria-label and blocks virtual keyboard + // if aria-activedescendant is set without a dropdown + this.input.setActiveDescendant(passedEl.id); + this.containerOuter.setActiveDescendant(passedEl.id); + } + } + }, { + key: "_addItem", + value: function _addItem(_ref13) { + var value = _ref13.value, + _ref13$label = _ref13.label, + label = _ref13$label === void 0 ? null : _ref13$label, + _ref13$choiceId = _ref13.choiceId, + choiceId = _ref13$choiceId === void 0 ? -1 : _ref13$choiceId, + _ref13$groupId = _ref13.groupId, + groupId = _ref13$groupId === void 0 ? -1 : _ref13$groupId, + _ref13$customProperti = _ref13.customProperties, + customProperties = _ref13$customProperti === void 0 ? null : _ref13$customProperti, + _ref13$placeholder = _ref13.placeholder, + placeholder = _ref13$placeholder === void 0 ? false : _ref13$placeholder, + _ref13$keyCode = _ref13.keyCode, + keyCode = _ref13$keyCode === void 0 ? null : _ref13$keyCode; + var passedValue = (0, _utils.isType)('String', value) ? value.trim() : value; + var passedKeyCode = keyCode; + var passedCustomProperties = customProperties; + var items = this._store.items; + var passedLabel = label || passedValue; + var passedOptionId = parseInt(choiceId, 10) || -1; + var group = groupId >= 0 ? this._store.getGroupById(groupId) : null; + var id = items ? items.length + 1 : 1; // If a prepended value has been passed, prepend it + + if (this.config.prependValue) { + passedValue = this.config.prependValue + passedValue.toString(); + } // If an appended value has been passed, append it + + + if (this.config.appendValue) { + passedValue += this.config.appendValue.toString(); + } + + this._store.dispatch((0, _items.addItem)({ + value: passedValue, + label: passedLabel, + id: id, + choiceId: passedOptionId, + groupId: groupId, + customProperties: customProperties, + placeholder: placeholder, + keyCode: passedKeyCode + })); + + if (this._isSelectOneElement) { + this.removeActiveItems(id); + } // Trigger change event + + + this.passedElement.triggerEvent(_constants.EVENTS.addItem, { + id: id, + value: passedValue, + label: passedLabel, + customProperties: passedCustomProperties, + groupValue: group && group.value ? group.value : undefined, + keyCode: passedKeyCode + }); + return this; + } + }, { + key: "_removeItem", + value: function _removeItem(item) { + if (!item || !(0, _utils.isType)('Object', item)) { + return this; + } + + var id = item.id, + value = item.value, + label = item.label, + choiceId = item.choiceId, + groupId = item.groupId; + var group = groupId >= 0 ? this._store.getGroupById(groupId) : null; + + this._store.dispatch((0, _items.removeItem)(id, choiceId)); + + if (group && group.value) { + this.passedElement.triggerEvent(_constants.EVENTS.removeItem, { + id: id, + value: value, + label: label, + groupValue: group.value + }); + } else { + this.passedElement.triggerEvent(_constants.EVENTS.removeItem, { + id: id, + value: value, + label: label + }); + } + + return this; + } + }, { + key: "_addChoice", + value: function _addChoice(_ref14) { + var value = _ref14.value, + _ref14$label = _ref14.label, + label = _ref14$label === void 0 ? null : _ref14$label, + _ref14$isSelected = _ref14.isSelected, + isSelected = _ref14$isSelected === void 0 ? false : _ref14$isSelected, + _ref14$isDisabled = _ref14.isDisabled, + isDisabled = _ref14$isDisabled === void 0 ? false : _ref14$isDisabled, + _ref14$groupId = _ref14.groupId, + groupId = _ref14$groupId === void 0 ? -1 : _ref14$groupId, + _ref14$customProperti = _ref14.customProperties, + customProperties = _ref14$customProperti === void 0 ? null : _ref14$customProperti, + _ref14$placeholder = _ref14.placeholder, + placeholder = _ref14$placeholder === void 0 ? false : _ref14$placeholder, + _ref14$keyCode = _ref14.keyCode, + keyCode = _ref14$keyCode === void 0 ? null : _ref14$keyCode; + + if (typeof value === 'undefined' || value === null) { + return; + } // Generate unique id + + + var choices = this._store.choices; + var choiceLabel = label || value; + var choiceId = choices ? choices.length + 1 : 1; + var choiceElementId = "".concat(this._baseId, "-").concat(this._idNames.itemChoice, "-").concat(choiceId); + + this._store.dispatch((0, _choices.addChoice)({ + value: value, + label: choiceLabel, + id: choiceId, + groupId: groupId, + disabled: isDisabled, + elementId: choiceElementId, + customProperties: customProperties, + placeholder: placeholder, + keyCode: keyCode + })); + + if (isSelected) { + this._addItem({ + value: value, + label: choiceLabel, + choiceId: choiceId, + customProperties: customProperties, + placeholder: placeholder, + keyCode: keyCode + }); + } + } + }, { + key: "_addGroup", + value: function _addGroup(_ref15) { + var _this21 = this; + + var group = _ref15.group, + id = _ref15.id, + _ref15$valueKey = _ref15.valueKey, + valueKey = _ref15$valueKey === void 0 ? 'value' : _ref15$valueKey, + _ref15$labelKey = _ref15.labelKey, + labelKey = _ref15$labelKey === void 0 ? 'label' : _ref15$labelKey; + var groupChoices = (0, _utils.isType)('Object', group) ? group.choices : Array.from(group.getElementsByTagName('OPTION')); + var groupId = id || Math.floor(new Date().valueOf() * Math.random()); + var isDisabled = group.disabled ? group.disabled : false; + + if (groupChoices) { + this._store.dispatch((0, _groups.addGroup)(group.label, groupId, true, isDisabled)); + + var addGroupChoices = function addGroupChoices(choice) { + var isOptDisabled = choice.disabled || choice.parentNode && choice.parentNode.disabled; + + _this21._addChoice({ + value: choice[valueKey], + label: (0, _utils.isType)('Object', choice) ? choice[labelKey] : choice.innerHTML, + isSelected: choice.selected, + isDisabled: isOptDisabled, + groupId: groupId, + customProperties: choice.customProperties, + placeholder: choice.placeholder + }); + }; + + groupChoices.forEach(addGroupChoices); + } else { + this._store.dispatch((0, _groups.addGroup)(group.label, group.id, false, group.disabled)); + } + } + }, { + key: "_getTemplate", + value: function _getTemplate(template) { + var _templates$template; + + if (!template) { + return null; + } + + var _this$config4 = this.config, + templates = _this$config4.templates, + classNames = _this$config4.classNames; + + for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + + return (_templates$template = templates[template]).call.apply(_templates$template, [this, classNames].concat(args)); + } + }, { + key: "_createTemplates", + value: function _createTemplates() { + var callbackOnCreateTemplates = this.config.callbackOnCreateTemplates; + var userTemplates = {}; + + if (callbackOnCreateTemplates && (0, _utils.isType)('Function', callbackOnCreateTemplates)) { + userTemplates = callbackOnCreateTemplates.call(this, _utils.strToEl); + } + + this.config.templates = (0, _deepmerge.default)(_templates.TEMPLATES, userTemplates); + } + }, { + key: "_createElements", + value: function _createElements() { + this.containerOuter = new _components.Container({ + element: this._getTemplate('containerOuter', this._direction, this._isSelectElement, this._isSelectOneElement, this.config.searchEnabled, this.passedElement.element.type), + classNames: this.config.classNames, + type: this.passedElement.element.type, + position: this.config.position + }); + this.containerInner = new _components.Container({ + element: this._getTemplate('containerInner'), + classNames: this.config.classNames, + type: this.passedElement.element.type, + position: this.config.position + }); + this.input = new _components.Input({ + element: this._getTemplate('input'), + classNames: this.config.classNames, + type: this.passedElement.element.type + }); + this.choiceList = new _components.List({ + element: this._getTemplate('choiceList', this._isSelectOneElement) + }); + this.itemList = new _components.List({ + element: this._getTemplate('itemList', this._isSelectOneElement) + }); + this.dropdown = new _components.Dropdown({ + element: this._getTemplate('dropdown'), + classNames: this.config.classNames, + type: this.passedElement.element.type + }); + } + }, { + key: "_createStructure", + value: function _createStructure() { + // Hide original element + this.passedElement.conceal(); // Wrap input in container preserving DOM ordering + + this.containerInner.wrap(this.passedElement.element); // Wrapper inner container with outer container + + this.containerOuter.wrap(this.containerInner.element); + + if (this._isSelectOneElement) { + this.input.placeholder = this.config.searchPlaceholderValue || ''; + } else if (this._placeholderValue) { + this.input.placeholder = this._placeholderValue; + this.input.setWidth(true); + } + + this.containerOuter.element.appendChild(this.containerInner.element); + this.containerOuter.element.appendChild(this.dropdown.element); + this.containerInner.element.appendChild(this.itemList.element); + + if (!this._isTextElement) { + this.dropdown.element.appendChild(this.choiceList.element); + } + + if (!this._isSelectOneElement) { + this.containerInner.element.appendChild(this.input.element); + } else if (this.config.searchEnabled) { + this.dropdown.element.insertBefore(this.input.element, this.dropdown.element.firstChild); + } + + if (this._isSelectElement) { + this._addPredefinedChoices(); + } else if (this._isTextElement) { + this._addPredefinedItems(); + } + } + }, { + key: "_addPredefinedChoices", + value: function _addPredefinedChoices() { + var _this22 = this; + + var passedGroups = this.passedElement.optionGroups; + this._highlightPosition = 0; + this._isSearching = false; + + this._setLoading(true); + + if (passedGroups && passedGroups.length) { + // If we have a placeholder option + var placeholderChoice = this.passedElement.placeholderOption; + + if (placeholderChoice && placeholderChoice.parentNode.tagName === 'SELECT') { + this._addChoice({ + value: placeholderChoice.value, + label: placeholderChoice.innerHTML, + isSelected: placeholderChoice.selected, + isDisabled: placeholderChoice.disabled, + placeholder: true + }); + } + + passedGroups.forEach(function (group) { + return _this22._addGroup({ + group: group, + id: group.id || null + }); + }); + } else { + var passedOptions = this.passedElement.options; + var filter = this.config.sortFn; + var allChoices = this._presetChoices; // Create array of options from option elements + + passedOptions.forEach(function (o) { + allChoices.push({ + value: o.value, + label: o.innerHTML, + selected: o.selected, + disabled: o.disabled || o.parentNode.disabled, + placeholder: o.hasAttribute('placeholder'), + customProperties: o.getAttribute('data-custom-properties') + }); + }); // If sorting is enabled or the user is searching, filter choices + + if (this.config.shouldSort) allChoices.sort(filter); // Determine whether there is a selected choice + + var hasSelectedChoice = allChoices.some(function (choice) { + return choice.selected; + }); + + var handleChoice = function handleChoice(choice, index) { + var value = choice.value, + label = choice.label, + customProperties = choice.customProperties, + placeholder = choice.placeholder; + + if (_this22._isSelectElement) { + // If the choice is actually a group + if (choice.choices) { + _this22._addGroup({ + group: choice, + id: choice.id || null + }); + } else { + // If there is a selected choice already or the choice is not + // the first in the array, add each choice normally + // Otherwise pre-select the first choice in the array if it's a single select + var shouldPreselect = _this22._isSelectOneElement && !hasSelectedChoice && index === 0; + var isSelected = shouldPreselect ? true : choice.selected; + var isDisabled = shouldPreselect ? false : choice.disabled; + + _this22._addChoice({ + value: value, + label: label, + isSelected: isSelected, + isDisabled: isDisabled, + customProperties: customProperties, + placeholder: placeholder + }); + } + } else { + _this22._addChoice({ + value: value, + label: label, + isSelected: choice.selected, + isDisabled: choice.disabled, + customProperties: customProperties, + placeholder: placeholder + }); + } + }; // Add each choice + + + allChoices.forEach(function (choice, index) { + return handleChoice(choice, index); + }); + } + + this._setLoading(false); + } + }, { + key: "_addPredefinedItems", + value: function _addPredefinedItems() { + var _this23 = this; + + var handlePresetItem = function handlePresetItem(item) { + var itemType = (0, _utils.getType)(item); + + if (itemType === 'Object' && item.value) { + _this23._addItem({ + value: item.value, + label: item.label, + choiceId: item.id, + customProperties: item.customProperties, + placeholder: item.placeholder + }); + } else if (itemType === 'String') { + _this23._addItem({ + value: item + }); + } + }; + + this._presetItems.forEach(function (item) { + return handlePresetItem(item); + }); + } + }, { + key: "_setChoiceOrItem", + value: function _setChoiceOrItem(item) { + var _this24 = this; + + var itemType = (0, _utils.getType)(item).toLowerCase(); + var handleType = { + object: function object() { + if (!item.value) { + return; + } // If we are dealing with a select input, we need to create an option first + // that is then selected. For text inputs we can just add items normally. + + + if (!_this24._isTextElement) { + _this24._addChoice({ + value: item.value, + label: item.label, + isSelected: true, + isDisabled: false, + customProperties: item.customProperties, + placeholder: item.placeholder + }); + } else { + _this24._addItem({ + value: item.value, + label: item.label, + choiceId: item.id, + customProperties: item.customProperties, + placeholder: item.placeholder + }); + } + }, + string: function string() { + if (!_this24._isTextElement) { + _this24._addChoice({ + value: item, + label: item, + isSelected: true, + isDisabled: false + }); + } else { + _this24._addItem({ + value: item + }); + } + } + }; + handleType[itemType](); + } + }, { + key: "_findAndSelectChoiceByValue", + value: function _findAndSelectChoiceByValue(val) { + var _this25 = this; + + var choices = this._store.choices; // Check 'value' property exists and the choice isn't already selected + + var foundChoice = choices.find(function (choice) { + return _this25.config.itemComparer(choice.value, val); + }); + + if (foundChoice && !foundChoice.selected) { + this._addItem({ + value: foundChoice.value, + label: foundChoice.label, + choiceId: foundChoice.id, + groupId: foundChoice.groupId, + customProperties: foundChoice.customProperties, + placeholder: foundChoice.placeholder, + keyCode: foundChoice.keyCode + }); + } + } + }, { + key: "_generateInstances", + value: function _generateInstances(elements, config) { + return elements.reduce(function (instances, element) { + instances.push(new Choices(element, config)); + return instances; + }, [this]); + } + }, { + key: "_generatePlaceholderValue", + value: function _generatePlaceholderValue() { + if (this._isSelectOneElement) { + return false; + } + + return this.config.placeholder ? this.config.placeholderValue || this.passedElement.element.getAttribute('placeholder') : false; + } + /* ===== End of Private functions ====== */ + + }]); + + return Choices; +}(); + +Choices.userDefaults = {}; // We cannot export default here due to Webpack: https://github.com/webpack/webpack/issues/3929 + +module.exports = Choices; + +/***/ }), +/* 11 */ +/***/ (function(module, exports, __webpack_require__) { + +/*! + * Fuse.js v3.4.2 - Lightweight fuzzy-search (http://fusejs.io) + * + * Copyright (c) 2012-2017 Kirollos Risk (http://kiro.me) + * All Rights Reserved. Apache Software License 2.0 + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ +(function webpackUniversalModuleDefinition(root, factory) { + if(true) + module.exports = factory(); + else {} +})(this, function() { +return /******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) { +/******/ return installedModules[moduleId].exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ i: moduleId, +/******/ l: false, +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.l = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; +/******/ +/******/ // define getter function for harmony exports +/******/ __webpack_require__.d = function(exports, name, getter) { +/******/ if(!__webpack_require__.o(exports, name)) { +/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); +/******/ } +/******/ }; +/******/ +/******/ // define __esModule on exports +/******/ __webpack_require__.r = function(exports) { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ +/******/ // create a fake namespace object +/******/ // mode & 1: value is a module id, require it +/******/ // mode & 2: merge all properties of value into the ns +/******/ // mode & 4: return value when already ns object +/******/ // mode & 8|1: behave like require +/******/ __webpack_require__.t = function(value, mode) { +/******/ if(mode & 1) value = __webpack_require__(value); +/******/ if(mode & 8) return value; +/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; +/******/ var ns = Object.create(null); +/******/ __webpack_require__.r(ns); +/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); +/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); +/******/ return ns; +/******/ }; +/******/ +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = function(module) { +/******/ var getter = module && module.__esModule ? +/******/ function getDefault() { return module['default']; } : +/******/ function getModuleExports() { return module; }; +/******/ __webpack_require__.d(getter, 'a', getter); +/******/ return getter; +/******/ }; +/******/ +/******/ // Object.prototype.hasOwnProperty.call +/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; +/******/ +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; +/******/ +/******/ +/******/ // Load entry module and return exports +/******/ return __webpack_require__(__webpack_require__.s = "./src/index.js"); +/******/ }) +/************************************************************************/ +/******/ ({ + +/***/ "./src/bitap/bitap_matched_indices.js": +/*!********************************************!*\ + !*** ./src/bitap/bitap_matched_indices.js ***! + \********************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = function () { + var matchmask = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; + var minMatchCharLength = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1; + var matchedIndices = []; + var start = -1; + var end = -1; + var i = 0; + + for (var len = matchmask.length; i < len; i += 1) { + var match = matchmask[i]; + + if (match && start === -1) { + start = i; + } else if (!match && start !== -1) { + end = i - 1; + + if (end - start + 1 >= minMatchCharLength) { + matchedIndices.push([start, end]); + } + + start = -1; + } + } // (i-1 - start) + 1 => i - start + + + if (matchmask[i - 1] && i - start >= minMatchCharLength) { + matchedIndices.push([start, i - 1]); + } + + return matchedIndices; +}; + +/***/ }), + +/***/ "./src/bitap/bitap_pattern_alphabet.js": +/*!*********************************************!*\ + !*** ./src/bitap/bitap_pattern_alphabet.js ***! + \*********************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = function (pattern) { + var mask = {}; + var len = pattern.length; + + for (var i = 0; i < len; i += 1) { + mask[pattern.charAt(i)] = 0; + } + + for (var _i = 0; _i < len; _i += 1) { + mask[pattern.charAt(_i)] |= 1 << len - _i - 1; + } + + return mask; +}; + +/***/ }), + +/***/ "./src/bitap/bitap_regex_search.js": +/*!*****************************************!*\ + !*** ./src/bitap/bitap_regex_search.js ***! + \*****************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +var SPECIAL_CHARS_REGEX = /[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g; + +module.exports = function (text, pattern) { + var tokenSeparator = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : / +/g; + var regex = new RegExp(pattern.replace(SPECIAL_CHARS_REGEX, '\\$&').replace(tokenSeparator, '|')); + var matches = text.match(regex); + var isMatch = !!matches; + var matchedIndices = []; + + if (isMatch) { + for (var i = 0, matchesLen = matches.length; i < matchesLen; i += 1) { + var match = matches[i]; + matchedIndices.push([text.indexOf(match), match.length - 1]); + } + } + + return { + // TODO: revisit this score + score: isMatch ? 0.5 : 1, + isMatch: isMatch, + matchedIndices: matchedIndices + }; +}; + +/***/ }), + +/***/ "./src/bitap/bitap_score.js": +/*!**********************************!*\ + !*** ./src/bitap/bitap_score.js ***! + \**********************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = function (pattern, _ref) { + var _ref$errors = _ref.errors, + errors = _ref$errors === void 0 ? 0 : _ref$errors, + _ref$currentLocation = _ref.currentLocation, + currentLocation = _ref$currentLocation === void 0 ? 0 : _ref$currentLocation, + _ref$expectedLocation = _ref.expectedLocation, + expectedLocation = _ref$expectedLocation === void 0 ? 0 : _ref$expectedLocation, + _ref$distance = _ref.distance, + distance = _ref$distance === void 0 ? 100 : _ref$distance; + var accuracy = errors / pattern.length; + var proximity = Math.abs(expectedLocation - currentLocation); + + if (!distance) { + // Dodge divide by zero error. + return proximity ? 1.0 : accuracy; + } + + return accuracy + proximity / distance; +}; + +/***/ }), + +/***/ "./src/bitap/bitap_search.js": +/*!***********************************!*\ + !*** ./src/bitap/bitap_search.js ***! + \***********************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var bitapScore = __webpack_require__(/*! ./bitap_score */ "./src/bitap/bitap_score.js"); + +var matchedIndices = __webpack_require__(/*! ./bitap_matched_indices */ "./src/bitap/bitap_matched_indices.js"); + +module.exports = function (text, pattern, patternAlphabet, _ref) { + var _ref$location = _ref.location, + location = _ref$location === void 0 ? 0 : _ref$location, + _ref$distance = _ref.distance, + distance = _ref$distance === void 0 ? 100 : _ref$distance, + _ref$threshold = _ref.threshold, + threshold = _ref$threshold === void 0 ? 0.6 : _ref$threshold, + _ref$findAllMatches = _ref.findAllMatches, + findAllMatches = _ref$findAllMatches === void 0 ? false : _ref$findAllMatches, + _ref$minMatchCharLeng = _ref.minMatchCharLength, + minMatchCharLength = _ref$minMatchCharLeng === void 0 ? 1 : _ref$minMatchCharLeng; + var expectedLocation = location; // Set starting location at beginning text and initialize the alphabet. + + var textLen = text.length; // Highest score beyond which we give up. + + var currentThreshold = threshold; // Is there a nearby exact match? (speedup) + + var bestLocation = text.indexOf(pattern, expectedLocation); + var patternLen = pattern.length; // a mask of the matches + + var matchMask = []; + + for (var i = 0; i < textLen; i += 1) { + matchMask[i] = 0; + } + + if (bestLocation !== -1) { + var score = bitapScore(pattern, { + errors: 0, + currentLocation: bestLocation, + expectedLocation: expectedLocation, + distance: distance + }); + currentThreshold = Math.min(score, currentThreshold); // What about in the other direction? (speed up) + + bestLocation = text.lastIndexOf(pattern, expectedLocation + patternLen); + + if (bestLocation !== -1) { + var _score = bitapScore(pattern, { + errors: 0, + currentLocation: bestLocation, + expectedLocation: expectedLocation, + distance: distance + }); + + currentThreshold = Math.min(_score, currentThreshold); + } + } // Reset the best location + + + bestLocation = -1; + var lastBitArr = []; + var finalScore = 1; + var binMax = patternLen + textLen; + var mask = 1 << patternLen - 1; + + for (var _i = 0; _i < patternLen; _i += 1) { + // Scan for the best match; each iteration allows for one more error. + // Run a binary search to determine how far from the match location we can stray + // at this error level. + var binMin = 0; + var binMid = binMax; + + while (binMin < binMid) { + var _score3 = bitapScore(pattern, { + errors: _i, + currentLocation: expectedLocation + binMid, + expectedLocation: expectedLocation, + distance: distance + }); + + if (_score3 <= currentThreshold) { + binMin = binMid; + } else { + binMax = binMid; + } + + binMid = Math.floor((binMax - binMin) / 2 + binMin); + } // Use the result from this iteration as the maximum for the next. + + + binMax = binMid; + var start = Math.max(1, expectedLocation - binMid + 1); + var finish = findAllMatches ? textLen : Math.min(expectedLocation + binMid, textLen) + patternLen; // Initialize the bit array + + var bitArr = Array(finish + 2); + bitArr[finish + 1] = (1 << _i) - 1; + + for (var j = finish; j >= start; j -= 1) { + var currentLocation = j - 1; + var charMatch = patternAlphabet[text.charAt(currentLocation)]; + + if (charMatch) { + matchMask[currentLocation] = 1; + } // First pass: exact match + + + bitArr[j] = (bitArr[j + 1] << 1 | 1) & charMatch; // Subsequent passes: fuzzy match + + if (_i !== 0) { + bitArr[j] |= (lastBitArr[j + 1] | lastBitArr[j]) << 1 | 1 | lastBitArr[j + 1]; + } + + if (bitArr[j] & mask) { + finalScore = bitapScore(pattern, { + errors: _i, + currentLocation: currentLocation, + expectedLocation: expectedLocation, + distance: distance + }); // This match will almost certainly be better than any existing match. + // But check anyway. + + if (finalScore <= currentThreshold) { + // Indeed it is + currentThreshold = finalScore; + bestLocation = currentLocation; // Already passed `loc`, downhill from here on in. + + if (bestLocation <= expectedLocation) { + break; + } // When passing `bestLocation`, don't exceed our current distance from `expectedLocation`. + + + start = Math.max(1, 2 * expectedLocation - bestLocation); + } + } + } // No hope for a (better) match at greater error levels. + + + var _score2 = bitapScore(pattern, { + errors: _i + 1, + currentLocation: expectedLocation, + expectedLocation: expectedLocation, + distance: distance + }); // console.log('score', score, finalScore) + + + if (_score2 > currentThreshold) { + break; + } + + lastBitArr = bitArr; + } // console.log('FINAL SCORE', finalScore) + // Count exact matches (those with a score of 0) to be "almost" exact + + + return { + isMatch: bestLocation >= 0, + score: finalScore === 0 ? 0.001 : finalScore, + matchedIndices: matchedIndices(matchMask, minMatchCharLength) + }; +}; + +/***/ }), + +/***/ "./src/bitap/index.js": +/*!****************************!*\ + !*** ./src/bitap/index.js ***! + \****************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + +var bitapRegexSearch = __webpack_require__(/*! ./bitap_regex_search */ "./src/bitap/bitap_regex_search.js"); + +var bitapSearch = __webpack_require__(/*! ./bitap_search */ "./src/bitap/bitap_search.js"); + +var patternAlphabet = __webpack_require__(/*! ./bitap_pattern_alphabet */ "./src/bitap/bitap_pattern_alphabet.js"); + +var Bitap = +/*#__PURE__*/ +function () { + function Bitap(pattern, _ref) { + var _ref$location = _ref.location, + location = _ref$location === void 0 ? 0 : _ref$location, + _ref$distance = _ref.distance, + distance = _ref$distance === void 0 ? 100 : _ref$distance, + _ref$threshold = _ref.threshold, + threshold = _ref$threshold === void 0 ? 0.6 : _ref$threshold, + _ref$maxPatternLength = _ref.maxPatternLength, + maxPatternLength = _ref$maxPatternLength === void 0 ? 32 : _ref$maxPatternLength, + _ref$isCaseSensitive = _ref.isCaseSensitive, + isCaseSensitive = _ref$isCaseSensitive === void 0 ? false : _ref$isCaseSensitive, + _ref$tokenSeparator = _ref.tokenSeparator, + tokenSeparator = _ref$tokenSeparator === void 0 ? / +/g : _ref$tokenSeparator, + _ref$findAllMatches = _ref.findAllMatches, + findAllMatches = _ref$findAllMatches === void 0 ? false : _ref$findAllMatches, + _ref$minMatchCharLeng = _ref.minMatchCharLength, + minMatchCharLength = _ref$minMatchCharLeng === void 0 ? 1 : _ref$minMatchCharLeng; + + _classCallCheck(this, Bitap); + + this.options = { + location: location, + distance: distance, + threshold: threshold, + maxPatternLength: maxPatternLength, + isCaseSensitive: isCaseSensitive, + tokenSeparator: tokenSeparator, + findAllMatches: findAllMatches, + minMatchCharLength: minMatchCharLength + }; + this.pattern = this.options.isCaseSensitive ? pattern : pattern.toLowerCase(); + + if (this.pattern.length <= maxPatternLength) { + this.patternAlphabet = patternAlphabet(this.pattern); + } + } + + _createClass(Bitap, [{ + key: "search", + value: function search(text) { + if (!this.options.isCaseSensitive) { + text = text.toLowerCase(); + } // Exact match + + + if (this.pattern === text) { + return { + isMatch: true, + score: 0, + matchedIndices: [[0, text.length - 1]] + }; + } // When pattern length is greater than the machine word length, just do a a regex comparison + + + var _this$options = this.options, + maxPatternLength = _this$options.maxPatternLength, + tokenSeparator = _this$options.tokenSeparator; + + if (this.pattern.length > maxPatternLength) { + return bitapRegexSearch(text, this.pattern, tokenSeparator); + } // Otherwise, use Bitap algorithm + + + var _this$options2 = this.options, + location = _this$options2.location, + distance = _this$options2.distance, + threshold = _this$options2.threshold, + findAllMatches = _this$options2.findAllMatches, + minMatchCharLength = _this$options2.minMatchCharLength; + return bitapSearch(text, this.pattern, this.patternAlphabet, { + location: location, + distance: distance, + threshold: threshold, + findAllMatches: findAllMatches, + minMatchCharLength: minMatchCharLength + }); + } + }]); + + return Bitap; +}(); // let x = new Bitap("od mn war", {}) +// let result = x.search("Old Man's War") +// console.log(result) + + +module.exports = Bitap; + +/***/ }), + +/***/ "./src/helpers/deep_value.js": +/*!***********************************!*\ + !*** ./src/helpers/deep_value.js ***! + \***********************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var isArray = __webpack_require__(/*! ./is_array */ "./src/helpers/is_array.js"); + +var deepValue = function deepValue(obj, path, list) { + if (!path) { + // If there's no path left, we've gotten to the object we care about. + list.push(obj); + } else { + var dotIndex = path.indexOf('.'); + var firstSegment = path; + var remaining = null; + + if (dotIndex !== -1) { + firstSegment = path.slice(0, dotIndex); + remaining = path.slice(dotIndex + 1); + } + + var value = obj[firstSegment]; + + if (value !== null && value !== undefined) { + if (!remaining && (typeof value === 'string' || typeof value === 'number')) { + list.push(value.toString()); + } else if (isArray(value)) { + // Search each item in the array. + for (var i = 0, len = value.length; i < len; i += 1) { + deepValue(value[i], remaining, list); + } + } else if (remaining) { + // An object. Recurse further. + deepValue(value, remaining, list); + } + } + } + + return list; +}; + +module.exports = function (obj, path) { + return deepValue(obj, path, []); +}; + +/***/ }), + +/***/ "./src/helpers/is_array.js": +/*!*********************************!*\ + !*** ./src/helpers/is_array.js ***! + \*********************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = function (obj) { + return !Array.isArray ? Object.prototype.toString.call(obj) === '[object Array]' : Array.isArray(obj); +}; + +/***/ }), + +/***/ "./src/index.js": +/*!**********************!*\ + !*** ./src/index.js ***! + \**********************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + +var Bitap = __webpack_require__(/*! ./bitap */ "./src/bitap/index.js"); + +var deepValue = __webpack_require__(/*! ./helpers/deep_value */ "./src/helpers/deep_value.js"); + +var isArray = __webpack_require__(/*! ./helpers/is_array */ "./src/helpers/is_array.js"); + +var Fuse = +/*#__PURE__*/ +function () { + function Fuse(list, _ref) { + var _ref$location = _ref.location, + location = _ref$location === void 0 ? 0 : _ref$location, + _ref$distance = _ref.distance, + distance = _ref$distance === void 0 ? 100 : _ref$distance, + _ref$threshold = _ref.threshold, + threshold = _ref$threshold === void 0 ? 0.6 : _ref$threshold, + _ref$maxPatternLength = _ref.maxPatternLength, + maxPatternLength = _ref$maxPatternLength === void 0 ? 32 : _ref$maxPatternLength, + _ref$caseSensitive = _ref.caseSensitive, + caseSensitive = _ref$caseSensitive === void 0 ? false : _ref$caseSensitive, + _ref$tokenSeparator = _ref.tokenSeparator, + tokenSeparator = _ref$tokenSeparator === void 0 ? / +/g : _ref$tokenSeparator, + _ref$findAllMatches = _ref.findAllMatches, + findAllMatches = _ref$findAllMatches === void 0 ? false : _ref$findAllMatches, + _ref$minMatchCharLeng = _ref.minMatchCharLength, + minMatchCharLength = _ref$minMatchCharLeng === void 0 ? 1 : _ref$minMatchCharLeng, + _ref$id = _ref.id, + id = _ref$id === void 0 ? null : _ref$id, + _ref$keys = _ref.keys, + keys = _ref$keys === void 0 ? [] : _ref$keys, + _ref$shouldSort = _ref.shouldSort, + shouldSort = _ref$shouldSort === void 0 ? true : _ref$shouldSort, + _ref$getFn = _ref.getFn, + getFn = _ref$getFn === void 0 ? deepValue : _ref$getFn, + _ref$sortFn = _ref.sortFn, + sortFn = _ref$sortFn === void 0 ? function (a, b) { + return a.score - b.score; + } : _ref$sortFn, + _ref$tokenize = _ref.tokenize, + tokenize = _ref$tokenize === void 0 ? false : _ref$tokenize, + _ref$matchAllTokens = _ref.matchAllTokens, + matchAllTokens = _ref$matchAllTokens === void 0 ? false : _ref$matchAllTokens, + _ref$includeMatches = _ref.includeMatches, + includeMatches = _ref$includeMatches === void 0 ? false : _ref$includeMatches, + _ref$includeScore = _ref.includeScore, + includeScore = _ref$includeScore === void 0 ? false : _ref$includeScore, + _ref$verbose = _ref.verbose, + verbose = _ref$verbose === void 0 ? false : _ref$verbose; + + _classCallCheck(this, Fuse); + + this.options = { + location: location, + distance: distance, + threshold: threshold, + maxPatternLength: maxPatternLength, + isCaseSensitive: caseSensitive, + tokenSeparator: tokenSeparator, + findAllMatches: findAllMatches, + minMatchCharLength: minMatchCharLength, + id: id, + keys: keys, + includeMatches: includeMatches, + includeScore: includeScore, + shouldSort: shouldSort, + getFn: getFn, + sortFn: sortFn, + verbose: verbose, + tokenize: tokenize, + matchAllTokens: matchAllTokens + }; + this.setCollection(list); + } + + _createClass(Fuse, [{ + key: "setCollection", + value: function setCollection(list) { + this.list = list; + return list; + } + }, { + key: "search", + value: function search(pattern) { + var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : { + limit: false + }; + + this._log("---------\nSearch pattern: \"".concat(pattern, "\"")); + + var _this$_prepareSearche = this._prepareSearchers(pattern), + tokenSearchers = _this$_prepareSearche.tokenSearchers, + fullSearcher = _this$_prepareSearche.fullSearcher; + + var _this$_search = this._search(tokenSearchers, fullSearcher), + weights = _this$_search.weights, + results = _this$_search.results; + + this._computeScore(weights, results); + + if (this.options.shouldSort) { + this._sort(results); + } + + if (opts.limit && typeof opts.limit === 'number') { + results = results.slice(0, opts.limit); + } + + return this._format(results); + } + }, { + key: "_prepareSearchers", + value: function _prepareSearchers() { + var pattern = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ''; + var tokenSearchers = []; + + if (this.options.tokenize) { + // Tokenize on the separator + var tokens = pattern.split(this.options.tokenSeparator); + + for (var i = 0, len = tokens.length; i < len; i += 1) { + tokenSearchers.push(new Bitap(tokens[i], this.options)); + } + } + + var fullSearcher = new Bitap(pattern, this.options); + return { + tokenSearchers: tokenSearchers, + fullSearcher: fullSearcher + }; + } + }, { + key: "_search", + value: function _search() { + var tokenSearchers = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; + var fullSearcher = arguments.length > 1 ? arguments[1] : undefined; + var list = this.list; + var resultMap = {}; + var results = []; // Check the first item in the list, if it's a string, then we assume + // that every item in the list is also a string, and thus it's a flattened array. + + if (typeof list[0] === 'string') { + // Iterate over every item + for (var i = 0, len = list.length; i < len; i += 1) { + this._analyze({ + key: '', + value: list[i], + record: i, + index: i + }, { + resultMap: resultMap, + results: results, + tokenSearchers: tokenSearchers, + fullSearcher: fullSearcher + }); + } + + return { + weights: null, + results: results + }; + } // Otherwise, the first item is an Object (hopefully), and thus the searching + // is done on the values of the keys of each item. + + + var weights = {}; + + for (var _i = 0, _len = list.length; _i < _len; _i += 1) { + var item = list[_i]; // Iterate over every key + + for (var j = 0, keysLen = this.options.keys.length; j < keysLen; j += 1) { + var key = this.options.keys[j]; + + if (typeof key !== 'string') { + weights[key.name] = { + weight: 1 - key.weight || 1 + }; + + if (key.weight <= 0 || key.weight > 1) { + throw new Error('Key weight has to be > 0 and <= 1'); + } + + key = key.name; + } else { + weights[key] = { + weight: 1 + }; + } + + this._analyze({ + key: key, + value: this.options.getFn(item, key), + record: item, + index: _i + }, { + resultMap: resultMap, + results: results, + tokenSearchers: tokenSearchers, + fullSearcher: fullSearcher + }); + } + } + + return { + weights: weights, + results: results + }; + } + }, { + key: "_analyze", + value: function _analyze(_ref2, _ref3) { + var key = _ref2.key, + _ref2$arrayIndex = _ref2.arrayIndex, + arrayIndex = _ref2$arrayIndex === void 0 ? -1 : _ref2$arrayIndex, + value = _ref2.value, + record = _ref2.record, + index = _ref2.index; + var _ref3$tokenSearchers = _ref3.tokenSearchers, + tokenSearchers = _ref3$tokenSearchers === void 0 ? [] : _ref3$tokenSearchers, + _ref3$fullSearcher = _ref3.fullSearcher, + fullSearcher = _ref3$fullSearcher === void 0 ? [] : _ref3$fullSearcher, + _ref3$resultMap = _ref3.resultMap, + resultMap = _ref3$resultMap === void 0 ? {} : _ref3$resultMap, + _ref3$results = _ref3.results, + results = _ref3$results === void 0 ? [] : _ref3$results; + + // Check if the texvaluet can be searched + if (value === undefined || value === null) { + return; + } + + var exists = false; + var averageScore = -1; + var numTextMatches = 0; + + if (typeof value === 'string') { + this._log("\nKey: ".concat(key === '' ? '-' : key)); + + var mainSearchResult = fullSearcher.search(value); + + this._log("Full text: \"".concat(value, "\", score: ").concat(mainSearchResult.score)); + + if (this.options.tokenize) { + var words = value.split(this.options.tokenSeparator); + var scores = []; + + for (var i = 0; i < tokenSearchers.length; i += 1) { + var tokenSearcher = tokenSearchers[i]; + + this._log("\nPattern: \"".concat(tokenSearcher.pattern, "\"")); // let tokenScores = [] + + + var hasMatchInText = false; + + for (var j = 0; j < words.length; j += 1) { + var word = words[j]; + var tokenSearchResult = tokenSearcher.search(word); + var obj = {}; + + if (tokenSearchResult.isMatch) { + obj[word] = tokenSearchResult.score; + exists = true; + hasMatchInText = true; + scores.push(tokenSearchResult.score); + } else { + obj[word] = 1; + + if (!this.options.matchAllTokens) { + scores.push(1); + } + } + + this._log("Token: \"".concat(word, "\", score: ").concat(obj[word])); // tokenScores.push(obj) + + } + + if (hasMatchInText) { + numTextMatches += 1; + } + } + + averageScore = scores[0]; + var scoresLen = scores.length; + + for (var _i2 = 1; _i2 < scoresLen; _i2 += 1) { + averageScore += scores[_i2]; + } + + averageScore = averageScore / scoresLen; + + this._log('Token score average:', averageScore); + } + + var finalScore = mainSearchResult.score; + + if (averageScore > -1) { + finalScore = (finalScore + averageScore) / 2; + } + + this._log('Score average:', finalScore); + + var checkTextMatches = this.options.tokenize && this.options.matchAllTokens ? numTextMatches >= tokenSearchers.length : true; + + this._log("\nCheck Matches: ".concat(checkTextMatches)); // If a match is found, add the item to , including its score + + + if ((exists || mainSearchResult.isMatch) && checkTextMatches) { + // Check if the item already exists in our results + var existingResult = resultMap[index]; + + if (existingResult) { + // Use the lowest score + // existingResult.score, bitapResult.score + existingResult.output.push({ + key: key, + arrayIndex: arrayIndex, + value: value, + score: finalScore, + matchedIndices: mainSearchResult.matchedIndices + }); + } else { + // Add it to the raw result list + resultMap[index] = { + item: record, + output: [{ + key: key, + arrayIndex: arrayIndex, + value: value, + score: finalScore, + matchedIndices: mainSearchResult.matchedIndices + }] + }; + results.push(resultMap[index]); + } + } + } else if (isArray(value)) { + for (var _i3 = 0, len = value.length; _i3 < len; _i3 += 1) { + this._analyze({ + key: key, + arrayIndex: _i3, + value: value[_i3], + record: record, + index: index + }, { + resultMap: resultMap, + results: results, + tokenSearchers: tokenSearchers, + fullSearcher: fullSearcher + }); + } + } + } + }, { + key: "_computeScore", + value: function _computeScore(weights, results) { + this._log('\n\nComputing score:\n'); + + for (var i = 0, len = results.length; i < len; i += 1) { + var output = results[i].output; + var scoreLen = output.length; + var currScore = 1; + var bestScore = 1; + + for (var j = 0; j < scoreLen; j += 1) { + var weight = weights ? weights[output[j].key].weight : 1; + var score = weight === 1 ? output[j].score : output[j].score || 0.001; + var nScore = score * weight; + + if (weight !== 1) { + bestScore = Math.min(bestScore, nScore); + } else { + output[j].nScore = nScore; + currScore *= nScore; + } + } + + results[i].score = bestScore === 1 ? currScore : bestScore; + + this._log(results[i]); + } + } + }, { + key: "_sort", + value: function _sort(results) { + this._log('\n\nSorting....'); + + results.sort(this.options.sortFn); + } + }, { + key: "_format", + value: function _format(results) { + var finalOutput = []; + + if (this.options.verbose) { + var cache = []; + + this._log('\n\nOutput:\n\n', JSON.stringify(results, function (key, value) { + if (_typeof(value) === 'object' && value !== null) { + if (cache.indexOf(value) !== -1) { + // Circular reference found, discard key + return; + } // Store value in our collection + + + cache.push(value); + } + + return value; + })); + + cache = null; + } + + var transformers = []; + + if (this.options.includeMatches) { + transformers.push(function (result, data) { + var output = result.output; + data.matches = []; + + for (var i = 0, len = output.length; i < len; i += 1) { + var item = output[i]; + + if (item.matchedIndices.length === 0) { + continue; + } + + var obj = { + indices: item.matchedIndices, + value: item.value + }; + + if (item.key) { + obj.key = item.key; + } + + if (item.hasOwnProperty('arrayIndex') && item.arrayIndex > -1) { + obj.arrayIndex = item.arrayIndex; + } + + data.matches.push(obj); + } + }); + } + + if (this.options.includeScore) { + transformers.push(function (result, data) { + data.score = result.score; + }); + } + + for (var i = 0, len = results.length; i < len; i += 1) { + var result = results[i]; + + if (this.options.id) { + result.item = this.options.getFn(result.item, this.options.id)[0]; + } + + if (!transformers.length) { + finalOutput.push(result.item); + continue; + } + + var data = { + item: result.item + }; + + for (var j = 0, _len2 = transformers.length; j < _len2; j += 1) { + transformers[j](result, data); + } + + finalOutput.push(data); + } + + return finalOutput; + } + }, { + key: "_log", + value: function _log() { + if (this.options.verbose) { + var _console; + + (_console = console).log.apply(_console, arguments); + } + } + }]); + + return Fuse; +}(); + +module.exports = Fuse; + +/***/ }) + +/******/ }); +}); + +/***/ }), +/* 12 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +var isMergeableObject = function isMergeableObject(value) { + return isNonNullObject(value) + && !isSpecial(value) +}; + +function isNonNullObject(value) { + return !!value && typeof value === 'object' +} + +function isSpecial(value) { + var stringValue = Object.prototype.toString.call(value); + + return stringValue === '[object RegExp]' + || stringValue === '[object Date]' + || isReactElement(value) +} + +// see https://github.com/facebook/react/blob/b5ac963fb791d1298e7f396236383bc955f916c1/src/isomorphic/classic/element/ReactElement.js#L21-L25 +var canUseSymbol = typeof Symbol === 'function' && Symbol.for; +var REACT_ELEMENT_TYPE = canUseSymbol ? Symbol.for('react.element') : 0xeac7; + +function isReactElement(value) { + return value.$$typeof === REACT_ELEMENT_TYPE +} + +function emptyTarget(val) { + return Array.isArray(val) ? [] : {} +} + +function cloneUnlessOtherwiseSpecified(value, options) { + return (options.clone !== false && options.isMergeableObject(value)) + ? deepmerge(emptyTarget(value), value, options) + : value +} + +function defaultArrayMerge(target, source, options) { + return target.concat(source).map(function(element) { + return cloneUnlessOtherwiseSpecified(element, options) + }) +} + +function mergeObject(target, source, options) { + var destination = {}; + if (options.isMergeableObject(target)) { + Object.keys(target).forEach(function(key) { + destination[key] = cloneUnlessOtherwiseSpecified(target[key], options); + }); + } + Object.keys(source).forEach(function(key) { + if (!options.isMergeableObject(source[key]) || !target[key]) { + destination[key] = cloneUnlessOtherwiseSpecified(source[key], options); + } else { + destination[key] = deepmerge(target[key], source[key], options); + } + }); + return destination +} + +function deepmerge(target, source, options) { + options = options || {}; + options.arrayMerge = options.arrayMerge || defaultArrayMerge; + options.isMergeableObject = options.isMergeableObject || isMergeableObject; + + var sourceIsArray = Array.isArray(source); + var targetIsArray = Array.isArray(target); + var sourceAndTargetTypesMatch = sourceIsArray === targetIsArray; + + if (!sourceAndTargetTypesMatch) { + return cloneUnlessOtherwiseSpecified(source, options) + } else if (sourceIsArray) { + return options.arrayMerge(target, source, options) + } else { + return mergeObject(target, source, options) + } +} + +deepmerge.all = function deepmergeAll(array, options) { + if (!Array.isArray(array)) { + throw new Error('first argument should be an array') + } + + return array.reduce(function(prev, next) { + return deepmerge(prev, next, options) + }, {}) +}; + +var deepmerge_1 = deepmerge; + +/* harmony default export */ __webpack_exports__["default"] = (deepmerge_1); + + +/***/ }), +/* 13 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _redux = __webpack_require__(6); + +var _index = _interopRequireDefault(__webpack_require__(15)); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + +var Store = +/*#__PURE__*/ +function () { + function Store() { + _classCallCheck(this, Store); + + this._store = (0, _redux.createStore)(_index.default, window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__()); + } + /** + * Subscribe store to function call (wrapped Redux method) + * @param {Function} onChange Function to trigger when state changes + * @return + */ + + + _createClass(Store, [{ + key: "subscribe", + value: function subscribe(onChange) { + this._store.subscribe(onChange); + } + /** + * Dispatch event to store (wrapped Redux method) + * @param {Function} action Action function to trigger + * @return + */ + + }, { + key: "dispatch", + value: function dispatch(action) { + this._store.dispatch(action); + } + /** + * Get store object (wrapping Redux method) + * @return {Object} State + */ + + }, { + key: "isLoading", + + /** + * Get loading state from store + * @return {Boolean} Loading State + */ + value: function isLoading() { + return this.state.general.loading; + } + /** + * Get single choice by it's ID + * @return {Object} Found choice + */ + + }, { + key: "getChoiceById", + value: function getChoiceById(id) { + if (id) { + var choices = this.activeChoices; + var foundChoice = choices.find(function (choice) { + return choice.id === parseInt(id, 10); + }); + return foundChoice; + } + + return false; + } + /** + * Get group by group id + * @param {Number} id Group ID + * @return {Object} Group data + */ + + }, { + key: "getGroupById", + value: function getGroupById(id) { + return this.groups.find(function (group) { + return group.id === parseInt(id, 10); + }); + } + }, { + key: "state", + get: function get() { + return this._store.getState(); + } + /** + * Get items from store + * @return {Array} Item objects + */ + + }, { + key: "items", + get: function get() { + return this.state.items; + } + /** + * Get active items from store + * @return {Array} Item objects + */ + + }, { + key: "activeItems", + get: function get() { + return this.items.filter(function (item) { + return item.active === true; + }); + } + /** + * Get highlighted items from store + * @return {Array} Item objects + */ + + }, { + key: "highlightedActiveItems", + get: function get() { + return this.items.filter(function (item) { + return item.active && item.highlighted; + }); + } + /** + * Get choices from store + * @return {Array} Option objects + */ + + }, { + key: "choices", + get: function get() { + return this.state.choices; + } + /** + * Get active choices from store + * @return {Array} Option objects + */ + + }, { + key: "activeChoices", + get: function get() { + var choices = this.choices; + var values = choices.filter(function (choice) { + return choice.active === true; + }); + return values; + } + /** + * Get selectable choices from store + * @return {Array} Option objects + */ + + }, { + key: "selectableChoices", + get: function get() { + return this.choices.filter(function (choice) { + return choice.disabled !== true; + }); + } + /** + * Get choices that can be searched (excluding placeholders) + * @return {Array} Option objects + */ + + }, { + key: "searchableChoices", + get: function get() { + return this.selectableChoices.filter(function (choice) { + return choice.placeholder !== true; + }); + } + /** + * Get placeholder choice from store + * @return {Object} Found placeholder + */ + + }, { + key: "placeholderChoice", + get: function get() { + return [].concat(this.choices).reverse().find(function (choice) { + return choice.placeholder === true; + }); + } + /** + * Get groups from store + * @return {Array} Group objects + */ + + }, { + key: "groups", + get: function get() { + return this.state.groups; + } + /** + * Get active groups from store + * @return {Array} Group objects + */ + + }, { + key: "activeGroups", + get: function get() { + var groups = this.groups; + var choices = this.choices; + return groups.filter(function (group) { + var isActive = group.active === true && group.disabled === false; + var hasActiveOptions = choices.some(function (choice) { + return choice.active === true && choice.disabled === false; + }); + return isActive && hasActiveOptions; + }, []); + } + }]); + + return Store; +}(); + +exports.default = Store; + +/***/ }), +/* 14 */ +/***/ (function(module, exports) { + +module.exports = function(originalModule) { + if (!originalModule.webpackPolyfill) { + var module = Object.create(originalModule); + // module.parent = undefined by default + if (!module.children) module.children = []; + Object.defineProperty(module, "loaded", { + enumerable: true, + get: function() { + return module.l; + } + }); + Object.defineProperty(module, "id", { + enumerable: true, + get: function() { + return module.i; + } + }); + Object.defineProperty(module, "exports", { + enumerable: true + }); + module.webpackPolyfill = 1; + } + return module; +}; + + +/***/ }), +/* 15 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _redux = __webpack_require__(6); + +var _items = _interopRequireDefault(__webpack_require__(16)); + +var _groups = _interopRequireDefault(__webpack_require__(17)); + +var _choices = _interopRequireDefault(__webpack_require__(18)); + +var _general = _interopRequireDefault(__webpack_require__(19)); + +var _utils = __webpack_require__(0); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +var appReducer = (0, _redux.combineReducers)({ + items: _items.default, + groups: _groups.default, + choices: _choices.default, + general: _general.default +}); + +var rootReducer = function rootReducer(passedState, action) { + var state = passedState; // If we are clearing all items, groups and options we reassign + // state and then pass that state to our proper reducer. This isn't + // mutating our actual state + // See: http://stackoverflow.com/a/35641992 + + if (action.type === 'CLEAR_ALL') { + state = undefined; + } else if (action.type === 'RESET_TO') { + return (0, _utils.cloneObject)(action.state); + } + + return appReducer(state, action); +}; + +var _default = rootReducer; +exports.default = _default; + +/***/ }), +/* 16 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = items; +exports.defaultState = void 0; +var defaultState = []; +exports.defaultState = defaultState; + +function items() { + var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : defaultState; + var action = arguments.length > 1 ? arguments[1] : undefined; + + switch (action.type) { + case 'ADD_ITEM': + { + // Add object to items array + var newState = [].concat(state, [{ + id: action.id, + choiceId: action.choiceId, + groupId: action.groupId, + value: action.value, + label: action.label, + active: true, + highlighted: false, + customProperties: action.customProperties, + placeholder: action.placeholder || false, + keyCode: null + }]); + return newState.map(function (obj) { + var item = obj; + item.highlighted = false; + return item; + }); + } + + case 'REMOVE_ITEM': + { + // Set item to inactive + return state.map(function (obj) { + var item = obj; + + if (item.id === action.id) { + item.active = false; + } + + return item; + }); + } + + case 'HIGHLIGHT_ITEM': + { + return state.map(function (obj) { + var item = obj; + + if (item.id === action.id) { + item.highlighted = action.highlighted; + } + + return item; + }); + } + + default: + { + return state; + } + } +} + +/***/ }), +/* 17 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = groups; +exports.defaultState = void 0; +var defaultState = []; +exports.defaultState = defaultState; + +function groups() { + var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : defaultState; + var action = arguments.length > 1 ? arguments[1] : undefined; + + switch (action.type) { + case 'ADD_GROUP': + { + return [].concat(state, [{ + id: action.id, + value: action.value, + active: action.active, + disabled: action.disabled + }]); + } + + case 'CLEAR_CHOICES': + { + return []; + } + + default: + { + return state; + } + } +} + +/***/ }), +/* 18 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = choices; +exports.defaultState = void 0; +var defaultState = []; +exports.defaultState = defaultState; + +function choices() { + var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : defaultState; + var action = arguments.length > 1 ? arguments[1] : undefined; + + switch (action.type) { + case 'ADD_CHOICE': + { + /* + A disabled choice appears in the choice dropdown but cannot be selected + A selected choice has been added to the passed input's value (added as an item) + An active choice appears within the choice dropdown + */ + return [].concat(state, [{ + id: action.id, + elementId: action.elementId, + groupId: action.groupId, + value: action.value, + label: action.label || action.value, + disabled: action.disabled || false, + selected: false, + active: true, + score: 9999, + customProperties: action.customProperties, + placeholder: action.placeholder || false, + keyCode: null + }]); + } + + case 'ADD_ITEM': + { + // If all choices need to be activated + if (action.activateOptions) { + return state.map(function (obj) { + var choice = obj; + choice.active = action.active; + return choice; + }); + } // When an item is added and it has an associated choice, + // we want to disable it so it can't be chosen again + + + if (action.choiceId > -1) { + return state.map(function (obj) { + var choice = obj; + + if (choice.id === parseInt(action.choiceId, 10)) { + choice.selected = true; + } + + return choice; + }); + } + + return state; + } + + case 'REMOVE_ITEM': + { + // When an item is removed and it has an associated choice, + // we want to re-enable it so it can be chosen again + if (action.choiceId > -1) { + return state.map(function (obj) { + var choice = obj; + + if (choice.id === parseInt(action.choiceId, 10)) { + choice.selected = false; + } + + return choice; + }); + } + + return state; + } + + case 'FILTER_CHOICES': + { + return state.map(function (obj) { + var choice = obj; // Set active state based on whether choice is + // within filtered results + + choice.active = action.results.some(function (_ref) { + var item = _ref.item, + score = _ref.score; + + if (item.id === choice.id) { + choice.score = score; + return true; + } + + return false; + }); + return choice; + }); + } + + case 'ACTIVATE_CHOICES': + { + return state.map(function (obj) { + var choice = obj; + choice.active = action.active; + return choice; + }); + } + + case 'CLEAR_CHOICES': + { + return defaultState; + } + + default: + { + return state; + } + } +} + +/***/ }), +/* 19 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = exports.defaultState = void 0; +var defaultState = { + loading: false +}; +exports.defaultState = defaultState; + +var general = function general() { + var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : defaultState; + var action = arguments.length > 1 ? arguments[1] : undefined; + + switch (action.type) { + case 'SET_IS_LOADING': + { + return { + loading: action.isLoading + }; + } + + default: + { + return state; + } + } +}; + +var _default = general; +exports.default = _default; + +/***/ }), +/* 20 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +Object.defineProperty(exports, "Dropdown", { + enumerable: true, + get: function get() { + return _dropdown.default; + } +}); +Object.defineProperty(exports, "Container", { + enumerable: true, + get: function get() { + return _container.default; + } +}); +Object.defineProperty(exports, "Input", { + enumerable: true, + get: function get() { + return _input.default; + } +}); +Object.defineProperty(exports, "List", { + enumerable: true, + get: function get() { + return _list.default; + } +}); +Object.defineProperty(exports, "WrappedInput", { + enumerable: true, + get: function get() { + return _wrappedInput.default; + } +}); +Object.defineProperty(exports, "WrappedSelect", { + enumerable: true, + get: function get() { + return _wrappedSelect.default; + } +}); + +var _dropdown = _interopRequireDefault(__webpack_require__(21)); + +var _container = _interopRequireDefault(__webpack_require__(22)); + +var _input = _interopRequireDefault(__webpack_require__(23)); + +var _list = _interopRequireDefault(__webpack_require__(24)); + +var _wrappedInput = _interopRequireDefault(__webpack_require__(25)); + +var _wrappedSelect = _interopRequireDefault(__webpack_require__(26)); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/***/ }), +/* 21 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + +var Dropdown = +/*#__PURE__*/ +function () { + function Dropdown(_ref) { + var element = _ref.element, + type = _ref.type, + classNames = _ref.classNames; + + _classCallCheck(this, Dropdown); + + Object.assign(this, { + element: element, + type: type, + classNames: classNames + }); + this.isActive = false; + } + /** + * Determine how far the top of our element is from + * the top of the window + * @return {Number} Vertical position + */ + + + _createClass(Dropdown, [{ + key: "distanceFromTopWindow", + value: function distanceFromTopWindow() { + this.dimensions = this.element.getBoundingClientRect(); + this.position = Math.ceil(this.dimensions.top + window.pageYOffset + this.element.offsetHeight); + return this.position; + } + /** + * Find element that matches passed selector + * @return {HTMLElement} + */ + + }, { + key: "getChild", + value: function getChild(selector) { + return this.element.querySelector(selector); + } + /** + * Show dropdown to user by adding active state class + * @return {Object} Class instance + * @public + */ + + }, { + key: "show", + value: function show() { + this.element.classList.add(this.classNames.activeState); + this.element.setAttribute('aria-expanded', 'true'); + this.isActive = true; + return this; + } + /** + * Hide dropdown from user + * @return {Object} Class instance + * @public + */ + + }, { + key: "hide", + value: function hide() { + this.element.classList.remove(this.classNames.activeState); + this.element.setAttribute('aria-expanded', 'false'); + this.isActive = false; + return this; + } + }]); + + return Dropdown; +}(); + +exports.default = Dropdown; + +/***/ }), +/* 22 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _utils = __webpack_require__(0); + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + +var Container = +/*#__PURE__*/ +function () { + function Container(_ref) { + var element = _ref.element, + type = _ref.type, + classNames = _ref.classNames, + position = _ref.position; + + _classCallCheck(this, Container); + + Object.assign(this, { + element: element, + classNames: classNames, + type: type, + position: position + }); + this.isOpen = false; + this.isFlipped = false; + this.isFocussed = false; + this.isDisabled = false; + this.isLoading = false; + this._onFocus = this._onFocus.bind(this); + this._onBlur = this._onBlur.bind(this); + } + /** + * Add event listeners + */ + + + _createClass(Container, [{ + key: "addEventListeners", + value: function addEventListeners() { + this.element.addEventListener('focus', this._onFocus); + this.element.addEventListener('blur', this._onBlur); + } + /** + * Remove event listeners + */ + + /** */ + + }, { + key: "removeEventListeners", + value: function removeEventListeners() { + this.element.removeEventListener('focus', this._onFocus); + this.element.removeEventListener('blur', this._onBlur); + } + /** + * Determine whether container should be flipped + * based on passed dropdown position + * @param {Number} dropdownPos + * @returns + */ + + }, { + key: "shouldFlip", + value: function shouldFlip(dropdownPos) { + var windowHeight = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : (0, _utils.getWindowHeight)(); + + if (dropdownPos === undefined) { + return false; + } // If flip is enabled and the dropdown bottom position is + // greater than the window height flip the dropdown. + + + var shouldFlip = false; + + if (this.position === 'auto') { + shouldFlip = dropdownPos >= windowHeight; + } else if (this.position === 'top') { + shouldFlip = true; + } + + return shouldFlip; + } + /** + * Set active descendant attribute + * @param {Number} activeDescendant ID of active descendant + */ + + }, { + key: "setActiveDescendant", + value: function setActiveDescendant(activeDescendantID) { + this.element.setAttribute('aria-activedescendant', activeDescendantID); + } + /** + * Remove active descendant attribute + */ + + }, { + key: "removeActiveDescendant", + value: function removeActiveDescendant() { + this.element.removeAttribute('aria-activedescendant'); + } + }, { + key: "open", + value: function open(dropdownPos) { + this.element.classList.add(this.classNames.openState); + this.element.setAttribute('aria-expanded', 'true'); + this.isOpen = true; + + if (this.shouldFlip(dropdownPos)) { + this.element.classList.add(this.classNames.flippedState); + this.isFlipped = true; + } + } + }, { + key: "close", + value: function close() { + this.element.classList.remove(this.classNames.openState); + this.element.setAttribute('aria-expanded', 'false'); + this.removeActiveDescendant(); + this.isOpen = false; // A dropdown flips if it does not have space within the page + + if (this.isFlipped) { + this.element.classList.remove(this.classNames.flippedState); + this.isFlipped = false; + } + } + }, { + key: "focus", + value: function focus() { + if (!this.isFocussed) { + this.element.focus(); + } + } + }, { + key: "addFocusState", + value: function addFocusState() { + this.element.classList.add(this.classNames.focusState); + } + }, { + key: "removeFocusState", + value: function removeFocusState() { + this.element.classList.remove(this.classNames.focusState); + } + /** + * Remove disabled state + */ + + }, { + key: "enable", + value: function enable() { + this.element.classList.remove(this.classNames.disabledState); + this.element.removeAttribute('aria-disabled'); + + if (this.type === 'select-one') { + this.element.setAttribute('tabindex', '0'); + } + + this.isDisabled = false; + } + /** + * Set disabled state + */ + + }, { + key: "disable", + value: function disable() { + this.element.classList.add(this.classNames.disabledState); + this.element.setAttribute('aria-disabled', 'true'); + + if (this.type === 'select-one') { + this.element.setAttribute('tabindex', '-1'); + } + + this.isDisabled = true; + } + }, { + key: "wrap", + value: function wrap(element) { + (0, _utils.wrap)(element, this.element); + } + }, { + key: "unwrap", + value: function unwrap(element) { + // Move passed element outside this element + this.element.parentNode.insertBefore(element, this.element); // Remove this element + + this.element.parentNode.removeChild(this.element); + } + /** + * Add loading state to element + */ + + }, { + key: "addLoadingState", + value: function addLoadingState() { + this.element.classList.add(this.classNames.loadingState); + this.element.setAttribute('aria-busy', 'true'); + this.isLoading = true; + } + /** + * Remove loading state from element + */ + + }, { + key: "removeLoadingState", + value: function removeLoadingState() { + this.element.classList.remove(this.classNames.loadingState); + this.element.removeAttribute('aria-busy'); + this.isLoading = false; + } + /** + * Set focussed state + */ + + }, { + key: "_onFocus", + value: function _onFocus() { + this.isFocussed = true; + } + /** + * Remove blurred state + */ + + }, { + key: "_onBlur", + value: function _onBlur() { + this.isFocussed = false; + } + }]); + + return Container; +}(); + +exports.default = Container; + +/***/ }), +/* 23 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _utils = __webpack_require__(0); + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + +var Input = +/*#__PURE__*/ +function () { + function Input(_ref) { + var element = _ref.element, + type = _ref.type, + classNames = _ref.classNames, + placeholderValue = _ref.placeholderValue; + + _classCallCheck(this, Input); + + Object.assign(this, { + element: element, + type: type, + classNames: classNames, + placeholderValue: placeholderValue + }); + this.element = element; + this.classNames = classNames; + this.isFocussed = this.element === document.activeElement; + this.isDisabled = false; + this._onPaste = this._onPaste.bind(this); + this._onInput = this._onInput.bind(this); + this._onFocus = this._onFocus.bind(this); + this._onBlur = this._onBlur.bind(this); + } + + _createClass(Input, [{ + key: "addEventListeners", + value: function addEventListeners() { + this.element.addEventListener('input', this._onInput); + this.element.addEventListener('paste', this._onPaste); + this.element.addEventListener('focus', this._onFocus); + this.element.addEventListener('blur', this._onBlur); + + if (this.element.form) { + this.element.form.addEventListener('reset', this._onFormReset); + } + } + }, { + key: "removeEventListeners", + value: function removeEventListeners() { + this.element.removeEventListener('input', this._onInput); + this.element.removeEventListener('paste', this._onPaste); + this.element.removeEventListener('focus', this._onFocus); + this.element.removeEventListener('blur', this._onBlur); + + if (this.element.form) { + this.element.form.removeEventListener('reset', this._onFormReset); + } + } + }, { + key: "enable", + value: function enable() { + this.element.removeAttribute('disabled'); + this.isDisabled = false; + } + }, { + key: "disable", + value: function disable() { + this.element.setAttribute('disabled', ''); + this.isDisabled = true; + } + }, { + key: "focus", + value: function focus() { + if (!this.isFocussed) { + this.element.focus(); + } + } + }, { + key: "blur", + value: function blur() { + if (this.isFocussed) { + this.element.blur(); + } + } + /** + * Set value of input to blank + * @return {Object} Class instance + * @public + */ + + }, { + key: "clear", + value: function clear() { + var setWidth = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; + + if (this.element.value) { + this.element.value = ''; + } + + if (setWidth) { + this.setWidth(); + } + + return this; + } + /** + * Set the correct input width based on placeholder + * value or input value + * @return + */ + + }, { + key: "setWidth", + value: function setWidth(enforceWidth) { + var _this = this; + + var callback = function callback(width) { + _this.element.style.width = width; + }; + + if (this._placeholderValue) { + // If there is a placeholder, we only want to set the width of the input when it is a greater + // length than 75% of the placeholder. This stops the input jumping around. + var valueHasDesiredLength = this.element.value.length >= this._placeholderValue.length / 1.25; + + if (this.element.value && valueHasDesiredLength || enforceWidth) { + this.calcWidth(callback); + } + } else { + // If there is no placeholder, resize input to contents + this.calcWidth(callback); + } + } + }, { + key: "calcWidth", + value: function calcWidth(callback) { + return (0, _utils.calcWidthOfInput)(this.element, callback); + } + }, { + key: "setActiveDescendant", + value: function setActiveDescendant(activeDescendantID) { + this.element.setAttribute('aria-activedescendant', activeDescendantID); + } + }, { + key: "removeActiveDescendant", + value: function removeActiveDescendant() { + this.element.removeAttribute('aria-activedescendant'); + } + }, { + key: "_onInput", + value: function _onInput() { + if (this.type !== 'select-one') { + this.setWidth(); + } + } + }, { + key: "_onPaste", + value: function _onPaste(event) { + var target = event.target; + + if (target === this.element && this.preventPaste) { + event.preventDefault(); + } + } + }, { + key: "_onFocus", + value: function _onFocus() { + this.isFocussed = true; + } + }, { + key: "_onBlur", + value: function _onBlur() { + this.isFocussed = false; + } + }, { + key: "placeholder", + set: function set(placeholder) { + this.element.placeholder = placeholder; + } + }, { + key: "value", + set: function set(value) { + this.element.value = value; + }, + get: function get() { + return (0, _utils.sanitise)(this.element.value); + } + }]); + + return Input; +}(); + +exports.default = Input; + +/***/ }), +/* 24 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _constants = __webpack_require__(1); + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + +var List = +/*#__PURE__*/ +function () { + function List(_ref) { + var element = _ref.element; + + _classCallCheck(this, List); + + Object.assign(this, { + element: element + }); + this.scrollPos = this.element.scrollTop; + this.height = this.element.offsetHeight; + this.hasChildren = !!this.element.children; + } + + _createClass(List, [{ + key: "clear", + value: function clear() { + this.element.innerHTML = ''; + } + }, { + key: "append", + value: function append(node) { + this.element.appendChild(node); + } + }, { + key: "getChild", + value: function getChild(selector) { + return this.element.querySelector(selector); + } + }, { + key: "scrollToTop", + value: function scrollToTop() { + this.element.scrollTop = 0; + } + }, { + key: "scrollToChoice", + value: function scrollToChoice(choice, direction) { + var _this = this; + + if (!choice) { + return; + } + + var dropdownHeight = this.element.offsetHeight; + var choiceHeight = choice.offsetHeight; // Distance from bottom of element to top of parent + + var choicePos = choice.offsetTop + choiceHeight; // Scroll position of dropdown + + var containerScrollPos = this.element.scrollTop + dropdownHeight; // Difference between the choice and scroll position + + var endpoint = direction > 0 ? this.element.scrollTop + choicePos - containerScrollPos : choice.offsetTop; + requestAnimationFrame(function (time) { + _this._animateScroll(time, endpoint, direction); + }); + } + }, { + key: "_scrollDown", + value: function _scrollDown(scrollPos, strength, endpoint) { + var easing = (endpoint - scrollPos) / strength; + var distance = easing > 1 ? easing : 1; + this.element.scrollTop = scrollPos + distance; + } + }, { + key: "_scrollUp", + value: function _scrollUp(scrollPos, strength, endpoint) { + var easing = (scrollPos - endpoint) / strength; + var distance = easing > 1 ? easing : 1; + this.element.scrollTop = scrollPos - distance; + } + }, { + key: "_animateScroll", + value: function _animateScroll(time, endpoint, direction) { + var _this2 = this; + + var strength = _constants.SCROLLING_SPEED; + var choiceListScrollTop = this.element.scrollTop; + var continueAnimation = false; + + if (direction > 0) { + this._scrollDown(choiceListScrollTop, strength, endpoint); + + if (choiceListScrollTop < endpoint) { + continueAnimation = true; + } + } else { + this._scrollUp(choiceListScrollTop, strength, endpoint); + + if (choiceListScrollTop > endpoint) { + continueAnimation = true; + } + } + + if (continueAnimation) { + requestAnimationFrame(function () { + _this2._animateScroll(time, endpoint, direction); + }); + } + } + }]); + + return List; +}(); + +exports.default = List; + +/***/ }), +/* 25 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _wrappedElement = _interopRequireDefault(__webpack_require__(4)); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + +function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } + +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function _get(target, property, receiver) { if (typeof Reflect !== "undefined" && Reflect.get) { _get = Reflect.get; } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(receiver); } return desc.value; }; } return _get(target, property, receiver || target); } + +function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; } + +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } + +function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } + +var WrappedInput = +/*#__PURE__*/ +function (_WrappedElement) { + _inherits(WrappedInput, _WrappedElement); + + function WrappedInput(_ref) { + var _this; + + var element = _ref.element, + classNames = _ref.classNames, + delimiter = _ref.delimiter; + + _classCallCheck(this, WrappedInput); + + _this = _possibleConstructorReturn(this, _getPrototypeOf(WrappedInput).call(this, { + element: element, + classNames: classNames + })); + _this.delimiter = delimiter; + return _this; + } + + _createClass(WrappedInput, [{ + key: "value", + set: function set(items) { + var itemValues = items.map(function (_ref2) { + var value = _ref2.value; + return value; + }); + var joinedValues = itemValues.join(this.delimiter); + this.element.setAttribute('value', joinedValues); + this.element.value = joinedValues; + } // @todo figure out why we need this? Perhaps a babel issue + , + get: function get() { + return _get(_getPrototypeOf(WrappedInput.prototype), "value", this); + } + }]); + + return WrappedInput; +}(_wrappedElement.default); + +exports.default = WrappedInput; + +/***/ }), +/* 26 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _wrappedElement = _interopRequireDefault(__webpack_require__(4)); + +var _templates = _interopRequireDefault(__webpack_require__(5)); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + +function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } + +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } + +function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } + +var WrappedSelect = +/*#__PURE__*/ +function (_WrappedElement) { + _inherits(WrappedSelect, _WrappedElement); + + function WrappedSelect(_ref) { + var element = _ref.element, + classNames = _ref.classNames; + + _classCallCheck(this, WrappedSelect); + + return _possibleConstructorReturn(this, _getPrototypeOf(WrappedSelect).call(this, { + element: element, + classNames: classNames + })); + } + + _createClass(WrappedSelect, [{ + key: "appendDocFragment", + value: function appendDocFragment(fragment) { + this.element.innerHTML = ''; + this.element.appendChild(fragment); + } + }, { + key: "placeholderOption", + get: function get() { + return this.element.querySelector('option[placeholder]'); + } + }, { + key: "optionGroups", + get: function get() { + return Array.from(this.element.getElementsByTagName('OPTGROUP')); + } + }, { + key: "options", + get: function get() { + return Array.from(this.element.options); + }, + set: function set(options) { + var fragment = document.createDocumentFragment(); + + var addOptionToFragment = function addOptionToFragment(data) { + // Create a standard select option + var template = _templates.default.option(data); // Append it to fragment + + + fragment.appendChild(template); + }; // Add each list item to list + + + options.forEach(function (optionData) { + return addOptionToFragment(optionData); + }); + this.appendDocFragment(fragment); + } + }]); + + return WrappedSelect; +}(_wrappedElement.default); + +exports.default = WrappedSelect; + +/***/ }), +/* 27 */ +/***/ (function(module, exports, __webpack_require__) { + +var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*! + Copyright (c) 2017 Jed Watson. + Licensed under the MIT License (MIT), see + http://jedwatson.github.io/classnames +*/ +/* global define */ + +(function () { + 'use strict'; + + var hasOwn = {}.hasOwnProperty; + + function classNames () { + var classes = []; + + for (var i = 0; i < arguments.length; i++) { + var arg = arguments[i]; + if (!arg) continue; + + var argType = typeof arg; + + if (argType === 'string' || argType === 'number') { + classes.push(arg); + } else if (Array.isArray(arg) && arg.length) { + var inner = classNames.apply(null, arg); + if (inner) { + classes.push(inner); + } + } else if (argType === 'object') { + for (var key in arg) { + if (hasOwn.call(arg, key) && arg[key]) { + classes.push(key); + } + } + } + } + + return classes.join(' '); + } + + if ( true && module.exports) { + classNames.default = classNames; + module.exports = classNames; + } else if (true) { + // register as 'classnames', consistent with npm package name + !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = (function () { + return classNames; + }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), + __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); + } else {} +}()); + + +/***/ }), +/* 28 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.clearChoices = exports.activateChoices = exports.filterChoices = exports.addChoice = void 0; + +var _constants = __webpack_require__(1); + +var addChoice = function addChoice(_ref) { + var value = _ref.value, + label = _ref.label, + id = _ref.id, + groupId = _ref.groupId, + disabled = _ref.disabled, + elementId = _ref.elementId, + customProperties = _ref.customProperties, + placeholder = _ref.placeholder, + keyCode = _ref.keyCode; + return { + type: _constants.ACTION_TYPES.ADD_CHOICE, + value: value, + label: label, + id: id, + groupId: groupId, + disabled: disabled, + elementId: elementId, + customProperties: customProperties, + placeholder: placeholder, + keyCode: keyCode + }; +}; + +exports.addChoice = addChoice; + +var filterChoices = function filterChoices(results) { + return { + type: _constants.ACTION_TYPES.FILTER_CHOICES, + results: results + }; +}; + +exports.filterChoices = filterChoices; + +var activateChoices = function activateChoices() { + var active = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; + return { + type: _constants.ACTION_TYPES.ACTIVATE_CHOICES, + active: active + }; +}; + +exports.activateChoices = activateChoices; + +var clearChoices = function clearChoices() { + return { + type: _constants.ACTION_TYPES.CLEAR_CHOICES + }; +}; + +exports.clearChoices = clearChoices; + +/***/ }), +/* 29 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.highlightItem = exports.removeItem = exports.addItem = void 0; + +var _constants = __webpack_require__(1); + +var addItem = function addItem(_ref) { + var value = _ref.value, + label = _ref.label, + id = _ref.id, + choiceId = _ref.choiceId, + groupId = _ref.groupId, + customProperties = _ref.customProperties, + placeholder = _ref.placeholder, + keyCode = _ref.keyCode; + return { + type: _constants.ACTION_TYPES.ADD_ITEM, + value: value, + label: label, + id: id, + choiceId: choiceId, + groupId: groupId, + customProperties: customProperties, + placeholder: placeholder, + keyCode: keyCode + }; +}; + +exports.addItem = addItem; + +var removeItem = function removeItem(id, choiceId) { + return { + type: _constants.ACTION_TYPES.REMOVE_ITEM, + id: id, + choiceId: choiceId + }; +}; + +exports.removeItem = removeItem; + +var highlightItem = function highlightItem(id, highlighted) { + return { + type: _constants.ACTION_TYPES.HIGHLIGHT_ITEM, + id: id, + highlighted: highlighted + }; +}; + +exports.highlightItem = highlightItem; + +/***/ }), +/* 30 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.addGroup = void 0; + +var _constants = __webpack_require__(1); + +/* eslint-disable import/prefer-default-export */ +var addGroup = function addGroup(value, id, active, disabled) { + return { + type: _constants.ACTION_TYPES.ADD_GROUP, + value: value, + id: id, + active: active, + disabled: disabled + }; +}; + +exports.addGroup = addGroup; + +/***/ }), +/* 31 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.resetTo = exports.clearAll = void 0; + +var clearAll = function clearAll() { + return { + type: 'CLEAR_ALL' + }; +}; + +exports.clearAll = clearAll; + +var resetTo = function resetTo(state) { + return { + type: 'RESET_TO', + state: state + }; +}; + +exports.resetTo = resetTo; + +/***/ }), +/* 32 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.setIsLoading = void 0; + +/* eslint-disable import/prefer-default-export */ +var setIsLoading = function setIsLoading(isLoading) { + return { + type: 'SET_IS_LOADING', + isLoading: isLoading + }; +}; + +exports.setIsLoading = setIsLoading; + +/***/ }) +/******/ ]); +}); \ No newline at end of file diff --git a/htdocs/vendor/choices/choices.min.css b/htdocs/vendor/choices/choices.min.css new file mode 100755 index 0000000..d4268fb --- /dev/null +++ b/htdocs/vendor/choices/choices.min.css @@ -0,0 +1 @@ +.choices{position:relative;margin-bottom:24px;font-size:16px}.choices:focus{outline:none}.choices:last-child{margin-bottom:0}.choices.is-disabled .choices__inner,.choices.is-disabled .choices__input{background-color:#eaeaea;cursor:not-allowed;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.choices.is-disabled .choices__item{cursor:not-allowed}.choices[data-type*=select-one]{cursor:pointer}.choices[data-type*=select-one] .choices__inner{padding-bottom:7.5px}.choices[data-type*=select-one] .choices__input{display:block;width:100%;padding:10px;border-bottom:1px solid #ddd;background-color:#fff;margin:0}.choices[data-type*=select-one] .choices__button{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjEiIGhlaWdodD0iMjEiIHZpZXdCb3g9IjAgMCAyMSAyMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48ZyBmaWxsPSIjMDAwIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPjxwYXRoIGQ9Ik0yLjU5Mi4wNDRsMTguMzY0IDE4LjM2NC0yLjU0OCAyLjU0OEwuMDQ0IDIuNTkyeiIvPjxwYXRoIGQ9Ik0wIDE4LjM2NEwxOC4zNjQgMGwyLjU0OCAyLjU0OEwyLjU0OCAyMC45MTJ6Ii8+PC9nPjwvc3ZnPg==);padding:0;background-size:8px;position:absolute;top:50%;right:0;margin-top:-10px;margin-right:25px;height:20px;width:20px;border-radius:10em;opacity:.5}.choices[data-type*=select-one] .choices__button:focus,.choices[data-type*=select-one] .choices__button:hover{opacity:1}.choices[data-type*=select-one] .choices__button:focus{box-shadow:0 0 0 2px #00bcd4}.choices[data-type*=select-one]:after{content:"";height:0;width:0;border-style:solid;border-color:#333 transparent transparent transparent;border-width:5px;position:absolute;right:11.5px;top:50%;margin-top:-2.5px;pointer-events:none}.choices[data-type*=select-one].is-open:after{border-color:transparent transparent #333 transparent;margin-top:-7.5px}.choices[data-type*=select-one][dir=rtl]:after{left:11.5px;right:auto}.choices[data-type*=select-one][dir=rtl] .choices__button{right:auto;left:0;margin-left:25px;margin-right:0}.choices[data-type*=select-multiple] .choices__inner,.choices[data-type*=text] .choices__inner{cursor:text}.choices[data-type*=select-multiple] .choices__button,.choices[data-type*=text] .choices__button{position:relative;display:inline-block;margin:0 -4px 0 8px;padding-left:16px;border-left:1px solid #008fa1;background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjEiIGhlaWdodD0iMjEiIHZpZXdCb3g9IjAgMCAyMSAyMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48ZyBmaWxsPSIjRkZGIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPjxwYXRoIGQ9Ik0yLjU5Mi4wNDRsMTguMzY0IDE4LjM2NC0yLjU0OCAyLjU0OEwuMDQ0IDIuNTkyeiIvPjxwYXRoIGQ9Ik0wIDE4LjM2NEwxOC4zNjQgMGwyLjU0OCAyLjU0OEwyLjU0OCAyMC45MTJ6Ii8+PC9nPjwvc3ZnPg==);background-size:8px;width:8px;line-height:1;opacity:.75;border-radius:0}.choices[data-type*=select-multiple] .choices__button:focus,.choices[data-type*=select-multiple] .choices__button:hover,.choices[data-type*=text] .choices__button:focus,.choices[data-type*=text] .choices__button:hover{opacity:1}.choices__inner{display:inline-block;vertical-align:top;width:100%;background-color:#f9f9f9;padding:7.5px 7.5px 3.75px;border:1px solid #ddd;border-radius:2.5px;font-size:14px;min-height:44px;overflow:hidden}.is-focused .choices__inner,.is-open .choices__inner{border-color:#b7b7b7}.is-open .choices__inner{border-radius:2.5px 2.5px 0 0}.is-flipped.is-open .choices__inner{border-radius:0 0 2.5px 2.5px}.choices__list{margin:0;padding-left:0;list-style:none}.choices__list--single{display:inline-block;padding:4px 16px 4px 4px;width:100%}[dir=rtl] .choices__list--single{padding-right:4px;padding-left:16px}.choices__list--single .choices__item{width:100%}.choices__list--multiple{display:inline}.choices__list--multiple .choices__item{display:inline-block;vertical-align:middle;border-radius:20px;padding:4px 10px;font-size:12px;font-weight:500;margin-right:3.75px;margin-bottom:3.75px;background-color:#00bcd4;border:1px solid #00a5bb;color:#fff;word-break:break-all}.choices__list--multiple .choices__item[data-deletable]{padding-right:5px}[dir=rtl] .choices__list--multiple .choices__item{margin-right:0;margin-left:3.75px}.choices__list--multiple .choices__item.is-highlighted{background-color:#00a5bb;border:1px solid #008fa1}.is-disabled .choices__list--multiple .choices__item{background-color:#aaa;border:1px solid #919191}.choices__list--dropdown{display:none;z-index:1;position:absolute;width:100%;background-color:#fff;border:1px solid #ddd;top:100%;margin-top:-1px;border-bottom-left-radius:2.5px;border-bottom-right-radius:2.5px;overflow:hidden;word-break:break-all}.choices__list--dropdown.is-active{display:block}.is-open .choices__list--dropdown{border-color:#b7b7b7}.is-flipped .choices__list--dropdown{top:auto;bottom:100%;margin-top:0;margin-bottom:-1px;border-radius:.25rem .25rem 0 0}.choices__list--dropdown .choices__list{position:relative;max-height:300px;overflow:auto;-webkit-overflow-scrolling:touch;will-change:scroll-position}.choices__list--dropdown .choices__item{position:relative;padding:10px;font-size:14px}[dir=rtl] .choices__list--dropdown .choices__item{text-align:right}@media (min-width:640px){.choices__list--dropdown .choices__item--selectable{padding-right:100px}.choices__list--dropdown .choices__item--selectable:after{content:attr(data-select-text);font-size:12px;opacity:0;position:absolute;right:10px;top:50%;transform:translateY(-50%)}[dir=rtl] .choices__list--dropdown .choices__item--selectable{text-align:right;padding-left:100px;padding-right:10px}[dir=rtl] .choices__list--dropdown .choices__item--selectable:after{right:auto;left:10px}}.choices__list--dropdown .choices__item--selectable.is-highlighted{background-color:#f2f2f2}.choices__list--dropdown .choices__item--selectable.is-highlighted:after{opacity:.5}.choices__item{cursor:default}.choices__item--selectable{cursor:pointer}.choices__item--disabled{cursor:not-allowed;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;opacity:.5}.choices__heading{font-weight:600;font-size:12px;padding:10px;border-bottom:1px solid #f7f7f7;color:gray}.choices__button{text-indent:-9999px;-webkit-appearance:none;-moz-appearance:none;appearance:none;border:0;background-color:transparent;background-repeat:no-repeat;background-position:center;cursor:pointer}.choices__button:focus{outline:none}.choices__input{display:inline-block;vertical-align:baseline;background-color:#f9f9f9;font-size:14px;margin-bottom:5px;border:0;border-radius:0;max-width:100%;padding:4px 0 4px 2px}.choices__input:focus{outline:0}[dir=rtl] .choices__input{padding-right:2px;padding-left:0}.choices__placeholder{opacity:.5}.choices[data-type*=select-multiple] .choices__input.is-hidden,.choices[data-type*=select-one] .choices__input.is-hidden,.choices__input.is-hidden{display:none} \ No newline at end of file diff --git a/htdocs/vendor/choices/choices.min.js b/htdocs/vendor/choices/choices.min.js new file mode 100755 index 0000000..5d105dc --- /dev/null +++ b/htdocs/vendor/choices/choices.min.js @@ -0,0 +1,58 @@ +/*! choices.js v7.0.0 | (c) 2019 Josh Johnson | https://github.com/jshjohnson/Choices#readme */ +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.Choices=t():e.Choices=t()}(window,function(){return function(e){var t={};function i(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,i),o.l=!0,o.exports}return i.m=e,i.c=t,i.d=function(e,t,n){i.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},i.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.t=function(e,t){if(1&t&&(e=i(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(i.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)i.d(n,o,function(t){return e[t]}.bind(null,o));return n},i.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return i.d(t,"a",t),t},i.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},i.p="/public/assets/scripts/",i(i.s=9)}([function(e,t,i){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.diff=t.cloneObject=t.existsInArray=t.isIE11=t.fetchFromObject=t.getWindowHeight=t.dispatchEvent=t.sortByScore=t.sortByAlpha=t.calcWidthOfInput=t.strToEl=t.sanitise=t.isScrolledIntoView=t.getAdjacentEl=t.findAncestorByAttrName=t.wrap=t.isElement=t.isType=t.getType=t.generateId=t.generateChars=t.getRandomNumber=void 0;var n=function(e,t){return Math.floor(Math.random()*(t-e)+e)};t.getRandomNumber=n;var o=function(e){for(var t="",i=0;i1&&void 0!==arguments[1]?arguments[1]:document.createElement("div");return e.nextSibling?e.parentNode.insertBefore(t,e.nextSibling):e.parentNode.appendChild(t),t.appendChild(e)};t.findAncestorByAttrName=function(e,t){for(var i=e;i;){if(i.hasAttribute(t))return i;i=i.parentElement}return null};t.getAdjacentEl=function(e,t){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:1;if(e&&t){var n=e.parentNode.parentNode,o=Array.from(n.querySelectorAll(t)),r=o.indexOf(e);return o[r+(i>0?1:-1)]}};t.isScrolledIntoView=function(e,t){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:1;if(e)return i>0?t.scrollTop+t.offsetHeight>=e.offsetTop+e.offsetHeight:e.offsetTop>=t.scrollTop};var a=function(e){return s("String",e)?e.replace(/&/g,"&").replace(/>/g,"&rt;").replace(/".concat(a(i),""));if(o.style.position="absolute",o.style.padding="0",o.style.top="-9999px",o.style.left="-9999px",o.style.width="auto",o.style.whiteSpace="pre",document.body.contains(e)&&window.getComputedStyle){var r=window.getComputedStyle(e);r&&(o.style.fontSize=r.fontSize,o.style.fontFamily=r.fontFamily,o.style.fontWeight=r.fontWeight,o.style.fontStyle=r.fontStyle,o.style.letterSpacing=r.letterSpacing,o.style.textTransform=r.textTransform,o.style.padding=r.padding)}document.body.appendChild(o),requestAnimationFrame(function(){i&&o.offsetWidth!==e.offsetWidth&&(n=o.offsetWidth+4),document.body.removeChild(o),t.call(void 0,"".concat(n,"px"))})}else t.call(void 0,"".concat(n,"px"))};t.sortByAlpha=function(e,t){var i="".concat(e.label||e.value).toLowerCase(),n="".concat(t.label||t.value).toLowerCase();return in?1:0};t.sortByScore=function(e,t){return e.score-t.score};t.dispatchEvent=function(e,t){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,n=new CustomEvent(t,{detail:i,bubbles:!0,cancelable:!0});return e.dispatchEvent(n)};t.getWindowHeight=function(){var e=document.body,t=document.documentElement;return Math.max(e.scrollHeight,e.offsetHeight,t.clientHeight,t.scrollHeight,t.offsetHeight)};t.fetchFromObject=function e(t,i){var n=i.indexOf(".");return n>-1?e(t[i.substring(0,n)],i.substr(n+1)):t[i]};t.isIE11=function(){return!(!navigator.userAgent.match(/Trident/)||!navigator.userAgent.match(/rv[ :]11/))};t.existsInArray=function(e,t){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"value";return e.some(function(e){return s("String",t)?e[i]===t.trim():e[i]===t})};t.cloneObject=function(e){return JSON.parse(JSON.stringify(e))};t.diff=function(e,t){var i=Object.keys(e).sort(),n=Object.keys(t).sort();return i.filter(function(e){return n.indexOf(e)<0})}},function(e,t,i){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.SCROLLING_SPEED=t.KEY_CODES=t.ACTION_TYPES=t.EVENTS=t.DEFAULT_CONFIG=t.DEFAULT_CLASSNAMES=void 0;var n=i(0),o={containerOuter:"choices",containerInner:"choices__inner",input:"choices__input",inputCloned:"choices__input--cloned",list:"choices__list",listItems:"choices__list--multiple",listSingle:"choices__list--single",listDropdown:"choices__list--dropdown",item:"choices__item",itemSelectable:"choices__item--selectable",itemDisabled:"choices__item--disabled",itemChoice:"choices__item--choice",placeholder:"choices__placeholder",group:"choices__group",groupHeading:"choices__heading",button:"choices__button",activeState:"is-active",focusState:"is-focused",openState:"is-open",disabledState:"is-disabled",highlightedState:"is-highlighted",hiddenState:"is-hidden",flippedState:"is-flipped",loadingState:"is-loading",noResults:"has-no-results",noChoices:"has-no-choices"};t.DEFAULT_CLASSNAMES=o;var r={items:[],choices:[],silent:!1,renderChoiceLimit:-1,maxItemCount:-1,addItems:!0,addItemFilterFn:null,removeItems:!0,removeItemButton:!1,editItems:!1,duplicateItemsAllowed:!0,delimiter:",",paste:!0,searchEnabled:!0,searchChoices:!0,searchFloor:1,searchResultLimit:4,searchFields:["label","value"],position:"auto",resetScrollPosition:!0,shouldSort:!0,shouldSortItems:!1,sortFn:n.sortByAlpha,placeholder:!0,placeholderValue:null,searchPlaceholderValue:null,prependValue:null,appendValue:null,renderSelectedChoices:"auto",loadingText:"Loading...",noResultsText:"No results found",noChoicesText:"No choices to choose from",itemSelectText:"Press to select",uniqueItemText:"Only unique values can be added",customAddItemText:"Only values matching specific conditions can be added",addItemText:function(e){return'Press Enter to add "'.concat((0,n.sanitise)(e),'"')},maxItemText:function(e){return"Only ".concat(e," values can be added")},itemComparer:function(e,t){return e===t},fuseOptions:{includeScore:!0},callbackOnInit:null,callbackOnCreateTemplates:null,classNames:o};t.DEFAULT_CONFIG=r;t.EVENTS={showDropdown:"showDropdown",hideDropdown:"hideDropdown",change:"change",choice:"choice",search:"search",addItem:"addItem",removeItem:"removeItem",highlightItem:"highlightItem",highlightChoice:"highlightChoice"};t.ACTION_TYPES={ADD_CHOICE:"ADD_CHOICE",FILTER_CHOICES:"FILTER_CHOICES",ACTIVATE_CHOICES:"ACTIVATE_CHOICES",CLEAR_CHOICES:"CLEAR_CHOICES",ADD_GROUP:"ADD_GROUP",ADD_ITEM:"ADD_ITEM",REMOVE_ITEM:"REMOVE_ITEM",HIGHLIGHT_ITEM:"HIGHLIGHT_ITEM",CLEAR_ALL:"CLEAR_ALL"};t.KEY_CODES={BACK_KEY:46,DELETE_KEY:8,ENTER_KEY:13,A_KEY:65,ESC_KEY:27,UP_KEY:38,DOWN_KEY:40,PAGE_UP_KEY:33,PAGE_DOWN_KEY:34};t.SCROLLING_SPEED=4},function(e,t,i){"use strict";(function(e,n){var o,r=i(7);o="undefined"!=typeof self?self:"undefined"!=typeof window?window:void 0!==e?e:n;var s=Object(r.a)(o);t.a=s}).call(this,i(3),i(14)(e))},function(e,t){var i;i=function(){return this}();try{i=i||new Function("return this")()}catch(e){"object"==typeof window&&(i=window)}e.exports=i},function(e,t,i){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var n=i(0);function o(e,t){for(var i=0;i